diff --git a/.zuul.yml b/.zuul.yml
deleted file mode 100644
index c56d3e2f4..000000000
--- a/.zuul.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-ui: mocha-bdd
-browsers:
- - name: chrome
- version: 30..latest
- - name: firefox
- version: 30..latest
- - name: ie
- version: latest
- - name: safari
- version: latest
-browserify:
- - transform: brfs
diff --git a/benchmark/block-357238.json b/benchmark/block-357238.json
deleted file mode 100644
index 03ef8838c..000000000
--- a/benchmark/block-357238.json
+++ /dev/null
@@ -1 +0,0 @@
-"02000000dff776908b8cbfc363cd421dc8d233b8340c9c82aa295d07000000000000000094c8470331881af67ede892bfaec01a0dc238b1f49a8db49ec974151451dc9952a405c55f58616180b6ea042fd710101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5603767305e4b883e5bda9e7a59ee4bb99e9b1bcfabe6d6de8af9d3e87efcf95d1d9283083ad9494e78a00a6266fb905219cf46ba59d8de61000000000000000005d2e5331aa00004d696e656420627920646171696e67ffffffff015f1f5195000000001976a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac000000000100000001d73d5c90f4012a4692c16044e7218f1cd4ae88c5634e50b5a9e3edb77d2a6007010000006a473044022065fb9235816b88ca8b9935a209b19eb9920166a9be5ec3ec98f0cc4f1eb8e92602206221445c268ba8f25d7d0719baba48decbeefd7bed81c738e76a9f77bc444b4d012102181125824b6752a7a4b6a68f7eb2a0338196e26835b5026688fb27c440d140ebffffffff0228785a00000000001976a9141c14fd16948896b3d531c85d1f6b5cb5e9803f5788ac365d8fca060000001976a9142abc00cdaeb6816a644781b16dd3764859e8c79d88ac000000000100000003b61ddddc724c813d3524e0e938ee427486ffe33199cf3030fbcfd6f24f2e9d3f000000006a473044022075eabe38ca7e42312b8acfb3dec8c52ee6533e9699cae15ddec429a195cde4820220714c6540104eb7bb8584385cc627641801782553161f74c0841cfd0f87dcbd09012102388cf4f63763792c8bc31b7f9fb7810f3d76252924afa03fa5b8df2c4b7f23f5feffffff9aa1906b76dfcb4ac3915d2bbc4993df20a7173e4f4283db7d0199ca215965a0000000006a4730440220588c4b23155144874d2ed8c6e094fe273394b608869059d7a337384ab45b75550220444451f80495b5b2e3db450cd3a658c6f59b493e6b26a52080eef37c3f6846b50121032805bca89441dc0c0204deed677e5c70e5122ff46d7e689133b30ece1c402941feffffffb07c99d494e170a86dfed9c26d7c6978c3bf09c2e11ba0a2d111f6e84a2640a9010000006b483045022100933195eee1e8746eebb945ea587d950c5b4abb6aaeb5041788a9d36c3c6f2c87022062e971cff6354d0ef3ec4a2e42ada3937b239a6426fc13aae52c41084ad3fc89012102069711114026b14654b41a6a48a1d6f584c54140de4a7e5559ab46489e973cbffeffffff0229ef0f00000000001976a9141707adc467eaa4063e4cebebadb1ecd64455c94c88ac5a341400000000001976a9141717df2106312e23d0a0c81aacc02e93c5b59bd788ac6b7305000100000001b27f317f3ebd36213a96eb82b855ff984bdb29af1116eca61f5afdb6dec9b2aa080000008b483045022100a26df8e4f840886125f054563a0eae422317911f8a05aae6083ed4a897b1eb4a022045bd1756aa7a67d0b39590c2b77d045177860ce2a882770f87c261c5b078e0220141041749d8bc9b9f26c8bc5f04c53bc5250569743d5c795a948e52119669c30150167ce3bf2f68f92b3ee2208fbece7b7a9aa2daae0f79f20ecfdc2f96ef13cbfc38ffffffff022b14fc00000000001976a9141874412f8ca28449b9ab69b87692de600527425788ac55709301000000001976a914cceecc96ed84b1ffc64bdf9f9dd6f46a0f2f244e88ac0000000001000000059ea012fe00771c442c3aa7cebcec1d07c75803667fe12b26d8bbc22d8dd747e9080000008a473044022025597889ad3087e3c1e259a327e953544c0d7a60466cf847fe89eb1a23f6a5220220509c3e72e5ad746a6d9f4ac3d2c812cd05cfd9b7bef95bf85c5090aced05490201410485b97e1e968ca47d47bb8723fc36de98349c806b6ca794936117424ec4a1e174f6c8bc5114dd27a2847abfacd0d8f316153d466d5eb9ea98740b881b9d0d5967feffffff220486e4b6aa0e718e0391e04229dfc8dfc4b9cc1b11f81c9988d82ba6538c3d000000008a47304402203b7bae428655e1d0c4d2e7f90b6147d374eba0fc3c3bc002ceac8631f66a8a90022031fe25627248f705c22278e18e911482f2aed5432dc8f3d8b70d3a38410f947b014104bbd70f82b340784bd90d4c0ad4faedc05d764f6234cccd74801e5650a1079f21a9bca7327e5e82a344e8f4d36280adaef4f0fbf7912a17e917d30d725cf158affeffffff7e70a6981c26db7d0a6243fd2d4f106add6210944a9d912af9c4dd954acfc945000000008b4830450221009aeb94b4af07479057378173e4b125c2211c05eaaacc2693807eb3ceb2b69d7c0220072e0db6467d3c5dee524579472cf441f558d9fd4d8d4c7bf654a19789892e360141044e56e73f29b830a47958db52d734860bc413da97d421e6f1ff57e7b37d5343c8e306bc745046db45330a5261e64d632c3db94e5712a35a35a79262656cdce0a2feffffff6aeb7f37c2e6cc6d984955394476a593c928833c16602feed012480560249abe000000008a473044022072be600922a3a8cb88a35cc93892af506c1ac050a27491f52f58821ffc35b86e0220535d0f805e3f6f2b9f54064dd50ca93ed0f2129616fd2525b704fa7550f7cf7a014104fe16d056a085da2529a8ab7531e0fe9cc99750002a9fda24d9b3df24154958694d1b7ad0eb0c94e25f6d2a26f26e86525c2028953bab857fb4e73ff2aa4b5237feffffff49693c7ed8a00ff3d22fd0c04fa0c4f3033afbb3c825bcf7eec22f05e2ae071d000000008b483045022100fa82ee5db88e98ceeb91ab290cf38e467881f7c910fa5d0f618aaa8f2266c8d902203f06c66ee3c6d460e722893101c9cb491d6fcc40963a9bf0eb885b23f20c1886014104df183cd9f0ad9355730e3031a63d6077efc548984d971bb545f16bbe3b96e21839bc3356c187e67a493d357df82310d897c75bb0d118c2ed706eae446407d02cfeffffff02b9480f00000000001976a9144d187819caa754acd6a09791883326f4079be92d88ac80e7bd02000000001976a914b638d0a971d6fa5100690da506e998130264ed0d88ac6b7305000100000002066059d1f44d002dae496f2987b0e9e9a51c11cce9d03d5f110804cddf275c64010000004a00483045022100e71e1ff0cf80067f41cb4005b5228c7fa79d8a276883581ebbda463b4fc5f3e60220531d433eb6309117b82c6905e59c2f7db6b89367f7e51d3245ffae5aed78267001ffffffff066059d1f44d002dae496f2987b0e9e9a51c11cce9d03d5f110804cddf275c64020000006a473044022020d376d82b42597793509bb86a4c7c36861bc6d1c1560dd1b5f6475abbc2ffc3022059b50b86387b42bccb7362a5dad5e09e19e3b8e2f157c6f4d320e7d7463538e10121030a359f43e33acce58ba94cb68997f2ea32efb149998bb88f2426b5d6ec056726ffffffff031027000000000000695121025442303030310006a01f6291a39f2e81131821638dee132f0003000000000000210254423030303100070000000000000000637573742e75736400000000000061a82103c098d6eae67f30e46302e8bd1698a13edaaade40a2fb2c45b9ca1ac04a03962153ae10270000000000004751210254423030303100020000000000000000637573742e7573640000000002d6b32821030a359f43e33acce58ba94cb68997f2ea32efb149998bb88f2426b5d6ec05672652ae80a90300000000001976a914a9278558b535733ed21754b2fe90ed09de3ecbe988ac0000000001000000035550506d8843676f474773dd9ba50bf1757ea2af25bab9d041dd10286698fcb5010000006b483045022100c638fea092793fa904bb9465e765d01cbf35bb0c0d34b347440d94ea8c36a66f022006d27bf81a03e8cdf5a78c48f633e7a3a066b70844a92beb040c43c16efb5f00012103c7770fda634ec274372d37f03dda791043a25cfaf6b1108e92fe238ddd9f2a17ffffffffa4e9d670eb433c9c02c0e97e4d2992da6d9ed763fcd402fa35411c2f5b9bf2f0000000006a473044022043d79e0bbfd38e5164c3f4ce8de7e4184e60092ae3b723594c5e443f6588f43b02200660dc73584ce6d288cadb17b8f4c3b46449639cf0aef18e35df1876bbc192ec012102b93a5b43e830b9a533ae89a16c1bed754dd3b81210a7b1e6e1849acda3d87298ffffffff6862c6767d037a0c51d50e56e41ad93fcb32c79d0050418ba25bcef571e729c7000000006b483045022100bddd7ca5db2943f491aeb08cc01093ed8a47326729d6524c7dbe3c102c7250d302201cad58c85bdee56cde6cc007b3b009ac77ff011cd6f8e94d9f38455a1caf23d60121029b0fd27f90f65cb7806452c47be95b0d47473d4456d85a67d1394812b8444d0affffffff0278d1b302000000001976a91492369f23908d091f783d32d4ff6c1c8fa0e6124188ace0ed3700000000001976a914f00d8406e59a45ab7e97c0b04db7f9429ebb301d88ac0000000001000000010a8ffd8997b353519fe987cbaf280f25018293006c9336e98199ad2258543095010000008b483045022022a60231f49b02fca872298eb7077455c00d42f029dd85af9eafd64eeaf9f496022100e2f14a6c7dcf7c937350e10fac083cfa5b545e31d8a8632d1474269a2a12ecf80141049968d5053be466e3c398f5d6045fb88576d9dfc6a48a3f93caf63f5182d2ddce8dc394ad4abd419ce50a03842f35d824a24d0f9224ff9e424c27635afe821516ffffffff01d0667c01000000001976a914ddfc115356a8aee78c3dff41b67623b34c8ed71488ac000000000100000001aa39ce07f91292d5e50e6940aa4e847ff36b14ddd22e32bb818ba8313a1d441b010000006a473044022010a6400966914282d27e1c5319ed69ce661024f2e2a3657212d7cc06f36a7f0702203fcc022b9432a7786479903bd871e13373a8fdb9ca655a7d1ffd5f1015ca3a090121030bf390e50be47f35271f7ff784c8a31ee6d728a05f020ebd2956eff637e4d628ffffffff0250ffc70f000000001976a9142a13790951513e0eacfcf5c787e53c8ff6789b5088aca0f33f04000000001976a9148065a535e5f61d63a781ddfaa0b1f3ef481f928088ac000000000100000008dcf8dfdd94afee9459fc4066350d77d8893fe107c28fd805bdef42d7e2e91546010000006a47304402207e263870a5026d5532ca29b9f2df0d3f129ecd2c0e103bad7ebf9b5d78e4930902204a1f136297a6115269deca648879f81531872cd99ff0c5c608f1116762c02f950121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff9a6b13557c83e7556651a9749cf2ca255b92f612508f302416552fc4bc0e5341010000006a47304402205a15be4b0ae1f4ed7b34d14d7e369e7c247fb11ff802f2fe9be7c50e8dfe498a02207e4e4fc474350634497da2e8e6a248d8808bd311daf698932a30ddca564071bf0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff2cd87672f92ae36bcba7ca9a5e5bd8c7cc667d4a966cd5021dc935c35801eef9020000006b483045022100e722da39a270ae8b81a8782ffad5f14532102d6409c3818b577a82c382a71211022011c6a1562dc522a7eab518dd27669e25ca450c7509a709618a9286a1bb3b81570121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffffaae392c7bb3f4bc25358b69d577cd91bdf8e3ace571cd9cd45bffe9c3c07d128010000006b483045022100de95f6337ce508cc9b89aaccf040c7ac3456226cf9063a39ef53c687c9847b8d02203fdaaab93e6845820dca867ba086cb86ec33954ee25c40792ea9294b52e979680121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff268704b94df7e0ab522419ab4420eb56d80014a60adca1da14dfa393afefdd0c000000006b4830450221008e7909240bae3249436ef51f933fd845540823f2fe6abb23469ca79dda693d4502207b51aa110ba4ecfb05cf1ccbe877c666e946df19fe9343255885d10e672adb0a0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7fffffffff5448c167bdf10e5c2bf7bd6c3cd8f0044b22220e8a3e7579db27630003e9c05020000006a4730440220126f27403eb28cd1a4582286b8b4674782744a70d6eb5f52f9c52b1a9161b1b402205089b41f8f59d9166c3ba462610da8b4c1c38258aa254fe662f768f29bd3cdc70121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff946aab125b0812821ec07e95b019713bca11ebaa3c0ac99ec8b4d367b43d3775010000006b4830450221008f87cc69e2bc92cf9f5264599e324bfd26586d11383854e450e013645d7ccd5e0220079d5cfd2129bc5a317aa030d03cbc75aaf19309b3540eb4e1b6c178db6a0b0c0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffffe9e8d2d09ad4a1be40fadba8f13ae05046d723675c583d83aacdcfa5fe18877e010000006b4830450221008617630a622685c89f3bd6ed0696001b103f568070b70de9cc49fdf9f13627e9022062a657b65ce16e3cd39fcaf41c5aad0907144b51b38424863f01c30539c4898c0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff01fd04e375000000001976a91431184ddc851e36a6f39918b2960a191d91b6c76388ac00000000010000000176e5da424a4be62cc19ff3c5ff3a8d3271329277b92816b9b139b11dbd730a80000000008a473044022070441fb3ceb2aafede66a9934984fee9904f1aecb31297132a46553ac50fe59502203008dad3ce7b48aea41e7737a23f03585988498c12c9a07862a3c87384c9d9bc01410453c2594391811f5f77fca5187fe7284e0e5778dddc8448c67aa81cc9b0c8b010aedd726aa87d1737abd22dbd423f7325e271fcb6d6867f6e257d8bcf50000614ffffffff02ec822c00000000001976a914b3900a7d5dcf83b7fc8d7e3154b07b776f239ba788ac04e72300000000001976a91479b7d1d2b783f73ab61ec88fbae2e56c0eee7bee88ac0000000001000000010b1049a52126fa02eb3798bb4b43578b2d03513a7b40f78168a9378419ff5ed2000000008b48304502205bf4997ccaf0314628c05868717823f89979e41bee8f4a512bb3b728c256f649022100a590d50b0cca5ef5f82beb074b924554cde69edfa2624fd0e0b2de933959c92a014104584f01f019c00a70c69941696dab6515d15c8875038b259175061abe07ad4e4ec981c94d4a23ca1e70dc13adec0a10da2cd22aa2fa5b21a24155854ce66eaf99ffffffff02e4217428000000001976a91435a9b1485261ebc0ac0bf36708fa5c06175452dd88acfc157f00000000001976a914309778abfb8ed9bbe624994ea3ab6d9f911c788988ac0000000001000000018f4f289e2e6fb064c10bd35a699b5426d542e495f7ac8a1b876653c45db3c82c000000008b483045022100e6e9eb3fffd196f29300fd8f62c39564dbaa09fab37cd45cde98c49c300ae8c4022028fe6a183ba5124798139be76ef443cd8c863bb2dcb2ef9b2900ef52084a83c1014104eede7afbb8b7d2cf67155e6f872acfa3361aa5d4e73bf0d2598d298799315a6405bc3ea85712f43a8ea74353cde4b03e0b03b33f5f86602d4e4a79be5988a025ffffffff0214741800000000001976a91430695e87c91a00a3b9c203c076c970a2704476fa88ac84e28301000000001976a9143188ef666dccf271d14ee73cc7e7a849b65a146a88ac0000000001000000011f734d81d4d6d72c8885d87b70895442891ff91bbd7db304fa4d112c20387e86010000008b483045022100cf9e45ab28ce16fe46fc0ef7f6684891518b7026d4a89cdd6e0b46374033625d02204b47035352d30560493e09e8447780ad9229d077ea7a02eb4cb8110a0113cb1f014104eede7afbb8b7d2cf67155e6f872acfa3361aa5d4e73bf0d2598d298799315a6405bc3ea85712f43a8ea74353cde4b03e0b03b33f5f86602d4e4a79be5988a025ffffffff0164948301000000001976a914ec8d47c394ebc7edd23558d502799478b03511f588ac0000000001000000012d8705543251d4263493d3123b143f913cfa2b0d019249ecbc95d5f894348a9b000000008b483045022100ef90a7342fe63bcaf326648b927f0c7ade7ff00a92a18f1292783eb87456c8c502205ea535de93b38adaeac5d31c541ce83a674d5fa1381d20a88f6597c154194c080141047514c08fe46c28a8aeef978ab6c80f44412d4e45adb23ebf369410e1db24fc67fc5e0c3d19988cfa00fedb3104c4359c7a1070bb394f3fb0f989a60b1fe52711ffffffff02eaf70900000000001976a91430695e87c91a00a3b9c203c076c970a2704476fa88acf2f3a000000000001976a91475f42e19ab22f181ae659bb8b57654cdcb163bb588ac0000000001000000018a1fc3fd495edc6d8c5d08fc55376bdffe7576c7ce8d6cc7d3bc6b65743d05f8010000008b4830450221009757e45377fcd1b5d311f1c1c5b67d5613c9e9d7dd262d5337c693d2fd04803f022025a1e5e32c24610620fb54e0a7bb39d1bb7c74c8281a64ed2089bbc599b3627e0141047514c08fe46c28a8aeef978ab6c80f44412d4e45adb23ebf369410e1db24fc67fc5e0c3d19988cfa00fedb3104c4359c7a1070bb394f3fb0f989a60b1fe52711ffffffff01d2a5a000000000001976a914ec8d47c394ebc7edd23558d502799478b03511f588ac000000000100000001221799b04a17495c1bafb4f01a3bce188f4cb5b39cace85404ddd986e5957214000000008b483045022100da765331c7458305fe67ffd713de3804f1990b42a3c564e0abf31bf6d8104ef10220355e331b523d3cc62ed30d11bdcc8aea53fd95ab336b336a325cd8f14390847a014104e316955a7f6dbeea88e45b93e8712ff10ca6adf068cfee4210c32d01a52a91795c7d837955bcea694634138531c1cb66c23abdb02209f78bd064ca1f4c160f9effffffff02eaf70900000000001976a91430695e87c91a00a3b9c203c076c970a2704476fa88acf2f3a000000000001976a914d285ead84a0011c2f201d67c3ec9ab605825cf0f88ac000000000100000001aa84edba72c80ba383ae1593d29501b4b18c1e3e5477ea3eff06453d4f0bec02010000008a47304402203b81f67235807523b55a48a1d1de8ba8abab91e04ae4aecfdc11ec6ecd9b2a47022049ea8336c6d818788716b38209db872451837125b941057883b04d8d1b1b86dd014104e316955a7f6dbeea88e45b93e8712ff10ca6adf068cfee4210c32d01a52a91795c7d837955bcea694634138531c1cb66c23abdb02209f78bd064ca1f4c160f9effffffff01d2a5a000000000001976a914ec8d47c394ebc7edd23558d502799478b03511f588ac000000000100000003076b09cb06578ad8db6b4ab14d2845918dd93e52d56fb8dd9a7aefe687d32a6d010000006b483045022100f0e2a31a98e77e12437ff9262c80fa24c9bf4e5707d941f9ea436b08281aa92f022065df85db32cb5845318737342320ad83a406447545a2c144d667ca4c2b4bd3d10121035b82476987874fb36d6ec3c51900f2685eb32ea0af26dbcaf4e352936c658885fefffffff535a7ff4141bb5e19c89929921f4c369e301568a262faa4e52034ed44aa258c000000006a47304402207f87020f51c87f271cb5aaa401f4e300011840905099c17083a6faab462e020702204e83206144d58061c6d4a9404ed5fe93fc670f88b670742363bbff1f9491cdad01210374ffda4d0d05f42725faf60c40b207a5fa130b2733cc8788cebc4edf83df00a0feffffff9ff39c885d0b21400d64ae86c9738c098ca5ca0bcac26623fde6c02178fb7cd4000000006b483045022100d023e89bbb4146f9b19e655da83e99d67ed3a0b20ee83a9d1aa653542fadc14b02207c9b7ecbdaab342b9c2ae72e0db11e6c21f6400ad976da1e4233c61995ab58f6012103e3146c787eb374e6743d76647b18335f51fe1bda826a81053f8c4da609a2d403feffffff0220bf0200000000001976a9146139abbba94f0511f01bae46d03984bf3328eddc88ac33770f00000000001976a9142579a29c3d7beb7d727a8b7efbcd9ccc090f773188ac6b7305000100000003c760b315c2037109790e51cb1f139e6c84b8b12f039a2acde53ae9bc0544711e020000006b483045022100d521334b3b5983a3a7fa029324a9c841963ae3ede8cc8b7eec42944eb565f6f502203709644e9745d212d570ca311893f277313eb1a80bb98632dcaec35be647e8d4012103634e6959e745804a48abe16a2ddeb610602cd118a34755bcdc90560840435e34ffffffff78acca93811a4d6b153070c3c31ec0232546b3f810c7fa8f9b3e7790eb590877010000006b483045022100bc1660c7604bd06c165df612685ab230d3532dac54b7021f90db367a3b6f7e8602206d43599b28fad0ac19126588b5c516f90a03e3c2f738b8089751bc801fc591a6012103dacce46f47ad6a668eabce3e9d1b0d11ba8f04c8237f4e0b44dc23dcf0b29ea8ffffffffbfeef9e9c1c8bd197212dcddc177508b5e203b8f3540e6b2e73c4e8916b3954f000000006a473044022052245545f80fe9f8a65fa72998a241dba23ec296ad274a5547055fc418632402022013f5a6189281e133f48e326d11055e1ac88ce50f041db490320f626a220f951401210289dfc24b6ccdee409259a7d851cedddcfbcf3be172440b883988497253049307ffffffff0157e25d03000000001976a91447901cb32b5c682580450753bc56f5959cea56be88ac00000000010000000104a098b36afe0e2a9684bd74d0cce542fa46e88583b15a049b7d2422e202d297000000006a4730440220474f4b189cb566228922a9986730e3b65141b3e0dfff6104ea987f9e6a9c21ce02204df177c1f4834ee63bfb4658839c6ce4ae93c3f08e45bb86bf9b6bbde9cc09d2012103ec4215d376c572beaf1c48ad4ff69162bd4a1efe8948ca578bbeb99fd1ab80c2ffffffff0280880000000000001976a9141d3f3e7811def0f11c19edb862d4e0eda2d31b5a88ac204e00000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87000000000100000001551cbb8a6aeacbd2b969e1dc4b4cc5b5f252b9a10b14f80d87eccfeb1facb591000000006b48304502210081aa4fa55d12a533389978c908395e9461b87afd861c214bcc96fb603914059102204df77a93c685827e750e69b950c5542488c982cc354dfa4fe62511635cfc85ba012102f9b024cc53a145393bd7db45095cbe0867f1c46f608f78dc6a4219f97899711cffffffff06d75900000000000017a91440a755a63fbc5772cdf08dd13d09eb3f53c4314587979e4500000000001976a9148be16414db228a6e4d9ddef614816e2e9bc7cd9988ac845800000000000017a914177b27b818d55fac1fd75c429024b1b8bd473c3887b45500000000000017a914ebd2d9d3ab30583c9dce846538f85e3e92436d5787d45800000000000017a9146302519cf2a23afdb1c403245fb6447caf75fe8887286e00000000000017a91419b2df584562bd1bf9f05a6b91f219b912e8aae487000000000100000001b891f1aede1bfb556dead6da9679084feaab2a443ac0348262bd292e2e119b47000000006a4730440220798d20631fa10067cd789b78fb2e414d0a37201794fab59589433952a4a7a55e02201079016582b69b2ffc2a7979e06d2a4a04286b329fc8f9e47a16d203a8dce3d0012103753d2bc5dd476a428cdbf408f3a18cf64bff8d3e0c0d3e66412062092faa6daaffffffff02e5a87939000000001976a91452ec7c0f46079166be2913f2a56c484757b79f7388ac00c2eb0b000000001976a914542d1fa1fd285d2b8ecdae3052cf5b5e0dbc479e88ac00000000010000000149a27000a23b2c8372329a5d91d9d716c1b7bff5978b07f5c3fa2e917e0cfa6e010000006b483045022100fe0304b42ccaefa198c8c8fb79e5dc9ee90264c91f0660f3066014c3dd7f4a9c022072fb076b956763ddc5bce425537add720497fac9f4fbb116a16e767ea118d36f01210387bfc30f41630ba2369fca54448ffb65d2a2e1e2b6a29d3a1592967d6fc1f6e3feffffff02da61bf01000000001976a91433655fcb7c93ec46c9ffca277e9a921d177c5eba88acc8418600000000001976a914408446ef75571b162aad83464a370909d5ef30c088ac6b730500010000000121fd41243d2d8a41e82cb1688dd9a69b0bb44063add5bca960c3c77b1edbe55a010000006a47304402206e1c5625bd11694f1e9d24ba01753500d635d01524c3e17c2188f3499c71b642022044edfe0dc089c661a5d1e59117f60093a97bd481f5e0329e438b79b268730ddc012103b392197b7c8aa33e913d11abe47aacbaff0f82573d73b4017e3c469d6faf7e4cfeffffff0294702020000000001976a914370618eec9462bdb84041cd9efda5dd8678d413f88ac4accee00000000001976a9149f74449dc90fbceb3a01bd122f2d94053014e19988ac6b730500010000000130025f9c35a6fcdaa596b94a41a9c679e66b2c8d8059633f85f27496dd533346000000008a47304402205da0fc5e4a4d179bfd6a074e6250944b2d2967f2fab12e0951633cb45190900602203117dfa17feaffb3c9323b58ae488e233daadbf48fa83a1b1851b1b9dd72c3230141045df6979005f1c6aa18c3c584a6f2eb497dea8063666b501af64ff704796cd00c89a76fd880852fd7d4a39e7990225f63bfae738ec8260dedf3aab4b69e4ed8c9feffffff02e5a4c71a000000001976a9140a2744a882cff0ee83a607bc9543df6f59966d4e88ac005a6202000000001976a914f41e218ba91329c8589d528e8d5127f58629ce2988ac6b7305000100000001f948a63540ac888b7787904ceb2d18051bdf45d9b988481d4589271d9fcea686010000008a473044022075d631b4ced8dd0eb5e8ca55641b06ba720e3fcab383734c5e42103434b0051902206fb3a1ed0fc63021000ad911f6a37f128498579e75789a0d06fc37a4fdca8ab0014104cee97d83b2217a920617452d2ab704fc6f67c624378710d440c6aef7905346fab8cf7d2b22853012d32d4a2791e02e3727abb5cb2edfd1f89b57e9333e07f815feffffff0210d64b00000000001976a914e375e3edba517501576a696121748de6b0728d1d88ac27691f14000000001976a914df8783d628d4c9ba82499e6c2e6a770752249cf188ac6b73050001000000017de77a4c0886ce3525583c5ba530e1afac84e2c974fab78ea39ac2cb1847a422000000008a473044022001a93308ee78cc06f6c1f64e009946f08dcf8298fe4285bce7ac8d6acb398ab1022023bbe8892445cbd71bced8f3f6d78cf4687808ce9b0c5ea053e977e80f8840690141047057ea524f27f1be6a3fdf2175ae107e62e4d006c1714f0e767a204ae1224a0555bcdb46700249132633727be8333625bdb8e1ab11f223edac848a0d85c2fc42feffffff023d7b881c000000001976a9142d18177007b598bb5f5f88f2c7b25df41caac9ea88ace0de3001000000001976a9147c8c335356fcd6895a2296bae552480a4aa8352388ac6b730500010000000145abc36bb9687459ff4de1894b127d974630fb1a3d73ade474eaf7109ddb9659000000008a47304402200fc913fbdb56af117cfb97d2bd50b35094d9e44b7d802819edf2b74ac26c13b90220675082e79bb392a428ddda8683061afc260ec6bfeabda35d834790f0587d6c8e014104b367f3f19344c38fa5435d0d12c9146f8fd49119cee2d498f8a96797f5165ddf6cd2b6b66f5b21d5993d7f02e6de5e2d39b2eaa420e2393736ba862365fa758dfeffffff027dca1005000000001976a9145909af5dab4516664210f686958efc1fa8ee062b88acc0f35e01000000001976a914d409ae9abf2892e3b23b7e411cc4af5bbba4c03888ac6b7305000100000001d94c39526b098947b973163d9511da14926a1af4fbf2355c4446b2a59dde3137010000008a4730440220739c85353049baf5a8a498df6fca8b2631eefb28c67bac4495fce3c1530bdf4e022062ecc477af768ee743b82fcfd4b5664392c5d2f20475bec1bae567a3168eb5b4014104da7dde0a4f252f9987cc301e7c6560bdd8bb85a908ba1a6936bc96a2f871ce0385bd4558fa5b1d2939554a47394de736c41be002935c19e9022f0e0f91c20275feffffff025d2beb02000000001976a914ede1723bfcd10f72b1633c21d3299ad474ca01a788ac804cce00000000001976a9147ce7695c6069847d2e50b3ca0eb5382434fea9d088ac6b73050001000000040c23a4ea2254b76a21da06bd2229e91693f6d3e58cab4acc1a56020ee2ff1e1a000000008a473044022004afe613bbc70b82f276ed2e1fe9999df600491f8f99d6b716cd145c46c7d30202207c1e2909d890a0776d5f89386c12f80c8a52f2714991dc2737d722a1d5ca66090141043fabd43be8e1baad3318d58fd0835e207255208c2c310c32f378bb6f2ce5531eba206b5b576c4c450e4e7b2736c2a8c2be1dbe02b88079e770ed86fd12e7fdc9fefffffffee118e884774fe56f2048a42fc875cc5d53226142feb1b0f3b8ea1d424d8aa3010000008a4730440220385623b0f3b16d7c34770e45351c270c9749482527c1e5d6162f51bd844d721a022065da6b9f444cf3fab285eedec5e41d098a1a59b90144c2de51c4f8c31adeda7f014104860b649d2244e5862598372cf98f3111d1e039d1bdd0fa6658bcb35e90aa526c0059120c44ea4d53829e43949aa7c9f86ef3d1a37dc31e67616b8e5b00f6a719feffffffdff8238a2350a9ce5bc8a627e76be82a725d5f8705b249fe885126ee7db249a8000000008a473044022048c31419046b29f68e14c57078615fa79c682061cd435bf56fd916ef62e6948302201e1f0f736f3773062aeff6b20c481356706a947970feb305e319764eb61d8cf80141046c407066b6745238601c096c40838c3b63c7c38eb840490b64f0d3f63421aaa566f65269e94b26ff93ea2f8bef5cb12a1e491c2f0f1c529376ebc8186c5f6a49feffffffea002a1c875b4358518c6c6c00e6a679ade13e7fc98ec466e6b93ce4a6ef68f0030000008b483045022100fee134e87fd8a4070c32a410fb29eabdd9c95316688c9d4166131c96f683b11302206cb684a07e70e380d076458c0d8791bc174aab6f316a3e892aca48a24cb8c32e014104de2e5df0d8f8c4a3758996b407a33aaa9a7545d11403eeada17145c1f9c539c67a47b6369d3bcafbd3de483b4e9615a783696542803315a92407be89f3c08a50feffffff028014ef03000000001976a914da53c3330fb2a9510ed3f10d217ac675eaac812688ac691d1000000000001976a9141d25595e1e77e4074c5c215835568a09520942b488ac6b7305000100000002a4f921e8751b3e85f874b6517898fab5e67ab89d6425e99d7d30bd21f91a361c000000008a47304402207486b729088ff9da6cdbd14d2474622723ed5a7b4e596d6a7b8b00d2836e6e560220571640262fc47edc85f0862ad98da17888f9a655f2c08589062ce5b089660a5c014104534c91d1033679ebef054d26f83926c0d635b434a8252791246338fc6749a2b217720369d33c8c9162ef9311cede8e994aba718ccd5a0feef2e93ea47fd24c44feffffff4e274a32f9135cc711c71a5f9b468230055d0711d5c7d3c3211ae8fe2a1053f2010000008a47304402201c10e9c402aacea7ade976a5c79da7bf59af6a4e66c28492636d2e3dcca772c9022060c5b3061e48bea5ff2fec5baebc9efe88bfa6d23f51ac0d7490b7d3bf037752014104751fca4ddadb7e29d9290c4c7fe20232cbdae2cddb3f201e9999716a9007f7f6d063c0667d0122e12b0e5c2d69a9afc0862e95772722f949296d2374541e95c0feffffff02dca7d601000000001976a914679073654786942f18aa47ba13bccde8b27ef7f488ac90ecfe06000000001976a9148a078a671cb1e43fe6a9b3273eccfb806764c23b88ac6b7305000100000001e90cd5e374dc13316f0bef529ee06e98724fa7c313347b14c023df8a2f8009d3000000008a47304402205dc25bd364bad5b94c61f2543598846e2d19e57a473365412df342da47efc8f102201b369031cdfb44960c3648c35828e931236c7aa6ae2bf3c9728a7fb032bc93c0014104696bbf8b348769de91da3c154f7bf5d4541a217d278154dc65df2688c6e402e4983ea21a9dbace4c7b829dc29a901dbf0707975134c3174d2ee8b3e4ec88649cfeffffff02c0d8a700000000001976a914c1ec36cd5aac57fb267152c58374b4acf68eaac388ac599a2e01000000001976a9146cbbb26e733385908ab9a22d68fa5433b95e5e4788ac6b73050001000000026cbcfaa83de070785187262936e2e2648ae25c5e33f802dfc323b5e7ee2ae117010000008a47304402205aac00fccee79a44d03c1d8ac6646820d66efc424eca5b262b30183c865a4912022015cede804a0730aa93c085bdfd9cf0d62959cb272ca6cf09eff7a56c77891b010141042443eb65532c904cac2a2dd110c37e1f2394ba662f99f46e031a7d4de3822c2a60597f9b112caf44bb4a3e2b039c9734c0b3ce6d4d9cf69052158452aeaaf048feffffff033d639996f7201f09f117d4adb0af9b801d547c25df536f24eff47175f9a8de000000008a473044022010307b9a3e13d5e3930d518501d8c052c5063eb6959854acf0b19397f551b2ce022026acedec8fe4e626adb769443b329eaccc34eaf5a47224e7edb70fc85185db5001410493d25b6077915bbb772c179706bb03dcaa78ba11db625fbb8f30534a966552cad23620cb913092756568202bedf9ca61bec1bcb6c084840121de70c848dead7ffeffffff02a0d88803000000001976a914456edc10750cb6196e10d363f2b7354c1ad5c4b988acb7939000000000001976a914aeda8b4c43d5165d0771aa5e0c4606cc8771813288ac6b7305000100000001b3b3057c8edc25c22ff8dd196220082eb6f55621b3e4789b0b98d4a1bf12f9fb000000006a47304402203b167f7aa049e3aa2d48eaff085af956712474d64901085b999d7010a9fc4dac022034c575f3c086ce6846bbea39ffda73548ae18d5931985dda6c8d9fd5aab054d501210375921ce0dafde0ab7995f1c5aab9e8f28343e92d02bf9d58eac51e2600cc6405ffffffff01727eb404000000001976a91482d1d4412c2960cd904f65b406b14bca8e0faabb88ac000000000100000001aedd6713608438f0ee6073216310f920902e0cb6ff56e2318e5d62f180801c34010000006a473044022069db66dbeb9efcad4b948ffaa6decd2f580fbf451386f01f0e65e33c14555e4f0220470eb90605b3a36868e6ab4984007f06c61dd0704f5d9c8b32b14fe0e2639127012103731e2873fda2698091a86f570270524829f2a20a2c5f0e17757fc94a892d86a7ffffffff012aa20700000000001976a9143de2754334cbb32e7e2044f2c4229ed5924f9e8e88ac0000000001000000015493140afbc0836a488b29de5b6189e5448f79d8e3050c5ce0477f67e89fdb2e000000006a473044022076adee2de46059e5c125f803452836418087da88ef376e5f6d1ea7690203433f022073506f56beb64f4b4ae2aacdd7db300ea0e96aac477e34a4ac08d5a048e0de55012103b813445c8b7ae98e723b2c3b13312cc2c11bbe83ed3e2d6bec020bd38d5ad988ffffffff019dcd4100000000001976a914848b666af00163fe665f77f9b7e6ba86b2d94c0088ac00000000010000000145ed0168be77593d04e6db69c957b0105e371830cf675830d51d22bb3643d7b9000000006a47304402204203e188586200e71e869a73f84629cb748cb6669fdf2cab1abfda714d0e76de02202ad66d75c74f3e30493ba35b8684bb46e1a7df8d67c0e023a239b7279cba6f08012102166db204432130284ccde5074e74233207bd2f0ffbd745cd068976639802817affffffff0291dddb15000000001976a914c590f4636c2d7f5b45546be2da07afef841f99a088acdc025201000000001976a914117f63c79e3b58d356788d9584cbe80005d928b888ac000000000100000006610dfe252fdedb1920b61858a745c83ce5cf4db5283c9b102feff74922258f3e010000008b483045022100f92436c9c6420dc996bb2a5ce82b0c698607ce27fc3cd459cd043daf33a9ca8102204f29f1fe8edd4e686b1558a440d5dcc9573005da781aa3faf016d25467de59850141048a004149964fc211baae2ccfea29d7192c4eaf0a51068efc066a41eef141a40bdb995dd371c139533477775e92634bf395139de6e8caf7df2c6fa77a2205f841feffffffee61d526328eb371fc8c3c9a539eec7b97a6a5475cf62a359c12f046222bf986000000008b483045022100b122a8cad3a80789d3386210dd6ccac3814d4bdc0f127e4fef7d5d9554feac4c022012e0c063edf8115d6add1c5bd798d8d73d6022d7f596e74f6ae979586c8c39cf014104c91b6aabaea166cca6a275dc6932d1cd9d545131b7a15ce3e69b37220a4f47d5f6cd339880c8bf20828d8945144d3a658e38f727ab811f5c451f075aaf372cc4feffffff70d0879d60be54cafbfb7ab79a2e67360f89e8b20afdfc586630ac93d5d4f877010000008a4730440220526c3835a9290eedcc3829e6c91e18499eef468b208d489c01b347d7da6854630220682a7796f20ea84a1bd68e9e8ddd6a2cc72569e4f7f6575cd07113123214e4d1014104fda8f815f0d2f530d4b13f2e0460697604ab82e69e1ca84ff65769d63d986cdbbf4c6659b2e7c7b086d234ad555a5401d3a9f5f4a94b03e4c1e8137fbae85aa6feffffff05359e9ae9f441177b477464e6be92faf2744d34ec85391d2d75d5584cba8db5000000008a47304402201d23ccb337a9732380afebdc8bd1e57ef9cc5b672c946680d7faa3e7e1b9ea6d022058a589ded9c21f85dcc96d5997b593f57f501509ec3d4a6946acae844acbfc9001410411bc365a73dee2acfc89ebd0c4b98d0bf740626fa52f8d9534b2176424b4dab7daf9f7addb9a404dd36709f930c34a10f24764b472013c27ff457a3db4ad65e6fefffffff744ea1f97990b0d8cd54e77b4f8f9177ed7ea791e948249b9fec10073467291000000008b483045022100ef9eb6938f9689f4bed8cf9a83911164bbb2f08a72eeaf1aa124ff4b755da62102202e3ea13b3702a2e45a2a7a5790a92f237350ae6d06139fb5a5c26e5e78bc12080141048a2702d356d7d2bee2c3baf46c421d1d426f3f3c460bfc02009c483d342e6c76646590a64e3d87cf074853dabbb19e6dc207695dc03bb26d2da8ac65ad600e63feffffff59473f3dc1d6afe2e1023d1aa047a9338a981a914e12598e2a6cb31f5f573219000000008b483045022100c62e5c66109a1b2d0456b4f27ea71fc80df1434937da0899cfc14eca05062ac902207340b92d4d34b8029a931a27736c80528d5317f44a8cc6c151406803de1acf49014104bb47210b16ae138bb48ffce9f04e6032cb4869aaf54650fc6e3e7f504bd7567bb92a3437ac4d46cbd4f943325494b2a7339763bd30b5af7ac01bab8d527199f2feffffff02b1e60f00000000001976a9146d09b3fa268fc0cc66722d4ad5ce9047f618f50788ac00db8b02000000001976a914c89f4ee52654e96c2e49e1cd5518c76bfd8b1bf088ac6b730500010000000341bde9420f1947fe26a5321431933e02029cfb4655039aac619c777d9511c929000000008a47304402204717c65789985b004da6064e1b5758ae60fb37db6d21e951a8d5cf8e979776a3022024cac8ae919f1db1cda91c2ab6b9b00a3003d0fa787979ba8ab57504f8aeeca6014104165b26b96a1526054a44ea0b574938b58d3b3fdac9de2a9e52b267ffb0d3f29282ccd79a852803941e8cc6797f6b5b0d00cbe2d91c2af3e7787b84cbd378e132feffffffd42a867326a342cc49b0cc2509b850ebbae5ce9757462742ad292efc234bbd02000000008a47304402202050811786e74604f2eb6f8444a5b7e8f0891f0f4279838bb9520d369e3f23ef022006b867cff1eb9c1571c9886e2247c3a89f06c2ddc86a818933135fd1ff3d2426014104d5e1eefd037caade75730e666ac55f7a175dcb935191fbfdd67b7be017c4ba69c12e7e0f51c729bb65739d924c1559e84b3714f69996ac6059ff2d057dd006b9feffffffe70146022e637cef27928db264f92702dd9dd97326b8812f758f902817cc33c8000000008b483045022100da0a9a2ade7c8cd4e12293f13bd5e69b19a80d77bd55ae4b71c9bc5389786f3c0220759328ecc71e61ed39b94005d526014fab53f9544bc592253371e628cf665d8a014104c831c670a810276f0fb7c9074d2380bc57e563bc2eecbd478f0d7e8b15632548478f412a7e184bfff6a5021998e8aeadd23cba1cf95c573187d432fa247284a4feffffff020e361100000000001976a9143b6c0030bcd515f6dc1d3c4b90e4d101320895b188acc0912100000000001976a9141121fe40bf0c2ba887f017abc77aaa9636eb5f6d88ac6b73050001000000016b52db9467e7eccaca9910c1af55487b4213157be30567aef44fb17c93af2428000000008a47304402205b149a8cfb61f25cace003fcc5de8a399fb0ef088d6c839ac6c218a69219e0a0022050839b133ee1c8d6513f74edff189250b78eaa268c5a520fdfb9defd46b49d970141042d87142ad4b5ae0bd28dcce8d181b1200ac0616c103409006fdae7fe610e46cd2e7ca41dfee001aade71c5d3a8ddc273588efee76b87431a83fac2b1da4bc9f3feffffff0270347504000000001976a91432edf00751e493cebff40cab55b4f6715a59f36e88ac7e619b00000000001976a91419dbe37486144fca422f694e04cf02d644510c9f88ac6b7305000100000001b8657b7c750ab42ab8048879a2a497a523b83330b622e982e5625fb96ee2a675000000006b483045022100ace90903d97d6e2e7e1ca1baf76c93ce7adaf141a137875d9ae1e26bd3fd0dfa022005701048795d94c9a2fe9ee482fa18ee3eede0e42f11d10ffe42ab2dcbd78dc101210323060c72f72a1a3d02c793be6e2b5a4a8995cd80fe668ab4d2d58a09dbe9f389feffffff02a8290e00000000001976a91488608ac2495bfeb6681936e88ce7942e703930bb88ac60ea0000000000001976a914175e1bdefe0cb110e409c17ce2d6231d492ad1f488ac6b73050001000000015fc96fce2130f646d0ee5bacfa54d4b428aebc88f514116cf5c452db718535cd000000006a47304402204b06d0f802cd776ea8b5a8989bf8faba2926af803b61e3724074758a7a087f530220364f1c939524db16f3181d27a3074f76aee277ff33cb3801293ddd824575eddd012102eb1745b8425b7c5ed2b661066efc20de22c031b21dcddb2d4a21c05f365045cbfeffffff02a0860100000000001976a914183a6e66d6712399d05a30524fdf803ec46a292488acd0740c00000000001976a91480f963dac9713df08b073502334583c44f59678588ac6b73050001000000017acf3524e1174c8c5ad40944e16053c5722ad5900a81080323d74f4230b2dd8e010000006b483045022100e6ca75c970a2e3218af9218423928f1e5c6b54a8b3433833866b4b9e74243e2102201cbce06c5feba87dafb7335dd2f924eb1115c352c983687aabb0f5e1cca61085012102cc2f4b82847c2f28ebff5560707448cfbfe2f21ddf69b9eceae6d33e5ae006a5ffffffff030d3fd50b000000001976a9141b38c9937288abf8410f0c82972138e85e4610db88ac80c8b308000000001976a9148ac6f52a27b8fc9ac103ec037f27f6e01d27213388acf0ea7900000000001976a914298f787d25a8c918be3ac8d3dae97de97dbd069388ac000000000100000001de07de55556fd20dbe5375b0617fa01d240e328c2a119cceedb81d42c30f0fa6000000008b483045022100eee004b9b83a38cfcbe9086a0f10ee9eb01a6955e67842dfb725fd763c51aca202205d73fe1bac26da07bc0140d7ae92cd366fc52dfdd3ee29e951913df4dfd6376b0141047433d45fc5e77af3b9889ad48bb2bea24da92ca1f0a64b224574a74933353ebc53ef51bbbcf2d4b2ef5d94e4bdb8e17754356ced2d73b4c9188d0569d93cbf3ffeffffff022d13b83c000000001976a914a395bdcd72f987c4da56c18800adea46e7da1b1888ac90503c01000000001976a914e3c9b9f555dda8faf46f169b6302157edb9d6c2788ac6b7305000100000001c9023028bd3b3f8142803863148ae5e0919c49a43e15e04358eee99e907e9336010000008b483045022100a2f48a5b39e31122f343b9c34c0a195450f48137230b5cdc2e9cb5c0f8a7bbab022053073a152460cd42f531e3b9fd8be8627e5f68430e1eb3a100722bebd9f0348d01410421851578f99ed2fd7af9bc1681e5f1b6edd792048cde66f8c34ceb1340d41d0b1e26fee296aec7b0be574723fe2f8f585aeb4cc603a30b13e291387d37b6e0bbfeffffff0240660301000000001976a914eb375f88e164b33f783f4e6650705c327acc579b88acfdc9c91c000000001976a914861cb5c02ff83c3c5c563ce28f1ed545b23da2de88ac6b730500010000000157620c2a1e2a025f7c73578866322be0aaff625c7a2348cf6ee97580ff970f89010000008b4830450221009844b8eb6b80fca13cd040533c9786b977c35d09a3a98678438257a2bf1d119802205ac37a60f46827dd2615fce3801142706f91845f3ff0a298cf41047b5dbedb1f0141043218bbf6141c254d72790cdb8723c0fa04d7f019a76b0623731d2f464e8e715fcc0a96928db30651fb237fc24d59d10513267fd87cff6ad0f3460ac9a5b23e47feffffff02e21db331000000001976a91402d8d43546593a4d647d6c09a7713e30792f18c588ac30037e03000000001976a914cb190f1afdaece24ecbae350c156f4c249a5fb5388ac6b730500010000000133b33b7096c96de09dc439443a95398fe650f7e7c9c616a039ee587d5388af28000000008b4830450221009ecc310cfd0ad0fd5bce987567d3fc10d1728da6d4ea0e021583b278cf3b8cde022011bb565d522ef37cbafa28ae087d57bd6b481264ccc86505a86f9ef5d3679fa0014104467f1a98656db1a4792432c9d6051ea43a54d8c2778cb4a8c9459b91d39c75a2c66fa899de2edd9ba63f590646567573f5eba34fa1b535ad8916a3384a770083feffffff0220496900000000001976a914f706c28a02e4b701076052fb99a993f9a9fa374188ac3e6c400e000000001976a914cfca16725d1d20df7d60218916777b42f87e604d88ac6b73050001000000019c9cc5bf058fb24846f164138504a41f28a9576921558ec3d252e28b0f6d86d4010000008b483045022100a933f5b127b7c40a8afd56c820aa40c9d0f5175b0a76b052fdc971255aae6917022001679d0d7bfb21f353445af9cf3db6723aefd2388dacf5a3df17031fef429165014104f4401ae1622c3169496d4f1223a74ed2b5dcb50ce11813a03a57f1c41138c704b575abc06c2d12240389a6ce69427a8246ad92221c47132410353f7793c3f473feffffff0200c0d401000000001976a9148e68d87aac458c7256454137aa2dea428f72b1a588acfa79f100000000001976a9142c5bdd2bf3f8ea7b679e4d7fa28c37f9303452c388ac6b73050001000000025f89c72f52e4d08218cb6796ebb814d6facbbb0588ca3185291257830b343a09010000008b483045022100fdaaf572cc21d1d6adcb6717bfdde0f12ab65b2be8eb5a602721911762469091022024f7cf367df50f43f5ee257179a3eb43d09f80474170322b60bdd3544a65d5910141049f260ccaa1954846be9e2ef1f1a81aa9a30737ccbefca1ea6443a9cfbd54beb394eb2901d850d6bce273c874e79bae792c618c6ce8fd17ab245ad769300d0057feffffff30f5fe248019bebf7ccd132b27e4c6f876810b9c05ca58195afc358621a467d1010000008a47304402200ea388bae9083e12fe39dc2806f850b4653a4b32e2c7c087127d80a079ffbd5402206d7e76fc04ec7caad42ca69be9066030dc90825b008096da5ad09bd6ac346d550141044cd82067bac6a6f2206e2a108d396816ff682e387ab2c88d9ea8a1d8fe42558cf3bf764bc70acc726f6000d729f0c583dde0c81b2ca519cdd7b270bf65599bfcfeffffff02941f1d00000000001976a914c647c50f3310e9539916e8ba328eb18e5e8e760588ac701ee400000000001976a9140ad39e1ad57aa9a34c8d5bab5462680b2fc25ca188ac6b7305000100000001d36f1a82dbbcd2eef8efc72dee6e66a5594a321d19c3d2a116923244db68f468030000008b483045022100aa0b63cadafd41b8a3e75bdabbb6b15791afe957c7566ce28882840402e9dc230220674b9874299ec5d0932b35689f17dafcd246c4151f3862568087981c394e48fa014104fd8e0212b9791b849093e00a3a31e690668fcee5dc783e8f7cb7b6fd4e64b51be178fc405296ec84679242c92a12793ceefc7fcf7f426a9f8b448944ff97ed97feffffff021db36d01000000001976a914d0e03fbf6fd1e15a00a7d7f59e3a625eb2d7b70088aca0db5b00000000001976a9142e77e0441faa4c821cb3bf77743b977102c9d7a888ac6b7305000100000001dafafb4f9b45091f51f2f7cee2d8b320a2661ca3385df81fd6e83608d7d9d373010000008b4830450221009514f2fe8551684dc38ab56baf257abca51f36a6901ba0ddb08c0872d91ad873022061c9e52baad12fee89de0f34b49f6ea4d8f2ae44858b6d70fe5b2acaec9bfbdd014104cdefaec12941b5891a7a8202055815030a55f6ce6dc9702f530bf3db5b57fb75416a64ce61260869040b56916d13a5f0f0c571c6b37ef50863e7ac7d882dcda2feffffff020bb8bc03000000001976a914c333d3c2b76c7132479f06c647d20faa0403001688ac707f830a000000001976a914bbae59fb403f55a5918f70fa17ec6438067c9bc788ac6b7305000100000001ef695ae4b8c20736aa574effb0de418b5007f4dc1b8affb36b52f9e0b74563ff000000008b483045022100e7c02e1011d15ee0596fa9b686cc50f343c3151ab3bd83f477b01eb670615bb7022074656abea3417d3637d81dbd80e8dec82ad78bf5f1c70f01df19b7d94852320401410447c2079139a9050bb4809b136fb3d048e1fbe7b537ec158d5f35a4326e2b1bcaf623f6ef5083d88a68cd15309bcb28e3287aa4861b7660b08a98666a7a4617f0feffffff025a513c00000000001976a914c71633be4de58db9923af76b24f88b905c69104488ac002d3101000000001976a9141871c16fb15e1eb9f4367305bffc6a31c13ac10188ac6b7305000100000001f50e91d4768000b15f8204a2ae110b0508c630f1e602ec1f83a4f75764f03c92010000006a47304402205bd7bfd57af89afafca54c2e6eeed18ca349b5a47b2fae933d88afb9e5b620e20220781804fbeabbb7195eaddb911adce854821c0d78a3fbeeaa51e9a2074b449154012103cf543a431e6e171fcbcf7456d86e8e5c0aca24aa523503a56460aee346ce5255ffffffff0291b7bf0a000000001976a9147b3aff0a6ee9aa274cf07bb60ad9bc8c506b3de788ac87ed9400000000001976a914e1c4314ee223e0040ee91ef220aebe801fed329188ac000000000100000001d4bfe3e3f38c7f75d3007094722e705464c6dcd09349281704bb38ea88ef21f3000000006b483045022100c1d64929797ccdd2a8f530f0f4a660b5eee666852e28fa46dcc0eb792fd4e23302201922e32927d2468791ca45a09bcd28969d2448cc59daada5359bae23805a0977012102a6b1d256e9d3b3019ae0d522ae848486887f10bd07eacedc61b739d87f860f49ffffffff01600b2204000000001976a9146b06f7f3e67f8b9cba3781db44a063001be9e7c088ac0000000001000000015460642b3baa14d6d10b56660e02a9ace786bb3924790e009081ac4a5453d552000000006b483045022100c99623df8a153ed0ad016ded0ba1847fb67d3ff57021f45605f620548b518b2f02207bf879d144c65dd7a0106d8f57868e3c9e58ad46decf6b78d2faca9269f73569012103e47e7ff7db1ee7acf41031bc6fd58e41a4720e5f8a664bce4ef73f197c3a045effffffff0170811201000000001976a914c92a19ef9b1870d667118390a63f056206a7938a88ac000000000100000001f950333ebe505f50497016fd4cb80679ce0735ebaab59c1380f087ac6091bc7f000000006b483045022100f253ea00a6e27eef23f361715d5b81df7aade17cc0baa4b1d0f902ceddc93a60022017a9788dfd0f40a5e86e0bcc005b62bbeb8dd78aea49edf1b814a63d673188310121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0170811201000000001976a91438860090779c6df12ea41cbe472359b62957527188ac000000000100000001e58219f400c731b2794ca848366d2a05fc8706bb766f88c5e1a9987775181494010000006c493046022100d9bc2415b6cfb90fd7382cc0e1ba6873c01248d13e801e45b7b4b9c70da72e4a022100cc86d1d7fe3fc32161da40d86364d03025c35f1d12dd6d44672903c28a8196ea0121039297a3d6ae6c39a4e9d10d0914a614f7ff33c30359e3339e317eca435a0a5fb8ffffffff01f030d30b000000001976a914052512987b42c82119e245d2dd1ac13f25040a4d88ac00000000010000000298904d7aeea69c514e72e66549b1f97555378dd3339ab318e140db5fadc0de13000000006b4830450220265dc454e58151236c78a7d360a3257e82056fd83e1fe147c7343ad75ff464b4022100c6e345d212e1f74ec669fb2878c72ae75ce85088a044c436e8a2a4856130c29f0121025ccf220fe3c13ce73a9e36fa833d24c6dfa97147581b417c100919b351509babffffffff5ba80c2ba44030e650e70e208eae263d4737508dba8e9c7e811b55727e1fafe0010000006a4730440220607c2eb9f30ec6919e1f1381041c26619f25624d3f10704c04ab0c7df49c01d402207efc403c0dd8d4227adebadffe37ba49b6186eda788c928d2344200957217ba80121037a6c265394aabf6d0c57e054a9e92dbd292abfc2c4495fedeb461b5bababdfedffffffff0250218603000000001976a9146abd8fdc78dafb3a46b4e115f61d5ef70718303888ac012986d3000000001976a914c19197d5169d11ee09705dec0002ba6130bcc5c188ac000000000100000002cd3572a1d88b138aaaecef543fbc5a6af7940b35d482e7f7a143477035d5fbb80e0000006a473044022056cf51b44cee2229d52e6b0588e72f230a34bdfb84659614f35097248018db6f02207d78567138e5a5bbcdb45c45be5daefc859ccb02871d540439bbe51dc7691ba50121037f12513fccd7c0d368a04c89a472b3b22bf51dc7219d51f5c87ecc3ac090a767fffffffff82e3f69930615e41b427db43a0bf0a7ea3baea9cba77694e67c301744813717010000006a47304402202a898a464e428feaaaf0030cedbd3c3e0f5ec632b8cf74f4aabc958a8eaa338f02204fb47fce736a50515d817e758ac82f2e25f2efb764751b298de9649abf7954b9012102548bab906b6f8d5ac3b3c94cb9bbe79318565b249b2901d2b4e0d45d3a322825ffffffff02001c4e0e000000001976a9146ecbf14333b99e4042b38848b3b8adc36ecc7acf88ac98db3f1a000000001976a9141327420594ab0f81a890e8311f1f5eeb8f7e65a188ac000000000100000002bb3a28418ab13c835f602cc2a3ab6447c2858a927963aa9c1fe60fd5d0fa4e51000000006b48304502210091c01607215fbb5a212627fdbeb485e8b69166e4e33a46b772cf64caa338f8f402203e417ff27737309d805657e1625617c1c3639a5c38fa1003e4a641e936802932012102d005ee5b656ac952e27ce8f186faee480fa3fd507636867ce076c826c7699684ffffffffeb37be1c1c8652d7f8b5cdff8a37082516927a87feece972198e95de1668931b000000006a473044022021e8cf072339dc39a632f9b752b4ac17ca40bf3dfe679e85d8a27d2a444d4e0d0220029ef93c89e13ff59906a2d0ca02024d777fb976e121c14f098fb21fb727c25c012102d005ee5b656ac952e27ce8f186faee480fa3fd507636867ce076c826c7699684ffffffff0225020000000000001976a914442aaa24540db8d5a75a1fa0f3df1f849617a9aa88ac3dfe1901000000001976a91460c605067547b894ae69751e42f278e1a3b9978f88ac0000000001000000011c9b76e5f99fc2373386947ded583c9238138d9f9644d6977e5b7014aa69edae010000006a473044022045e9c42729550d006916fad78e27a27191ec0126605fe9ff040d1318ac388fd102200c8cff5632d7d11b9d5033824a1e0e8a90f92cfcdddb216f19c9bfdebec999dd012102b0020cee4ae5bbf61a3e01a1bb7be71a650e376abf06d046e03046af3e153e7bffffffff017030f400000000001976a914b463f3587148bf61adf493f88f9820fbcd9f546b88ac000000000100000001f035478b37c96960c7b200fc9c07396204b4147c36f4d7d34ccb14f4188fed21010000006a4730440220433c465abd410cae3857ce91c4dbc243596f7ea65c9c769e6fd244c6b4c971a50220090d5bd0454d11fcb84af75a5a20f60bf9ce38eca94913fdb58a78f28513e4690121036d02cf2a2326f8ee6a075d5bec1b6e76fd11a9046d4614fa308fd20f4434d44bffffffff021c081d05000000001976a914ed070abae54b9fe467b1d901f2c319a2fb7c5ec688acc08dce06000000001976a91417975a867a8a0286f9f03054281fdc6c7ecf75ff88ac000000000100000001daced51e62369b85a9ca05e0b0e2d02ec7bac174a38e59ad4f95be5367f747c1000000006a47304402206b39a550f3c1a474ff0271604a96ac1cc89daa6a99968f3b80e649f8ab63af9602201958d2abee567d8c71f1fa6a1f18f99aa707c8a46296691df11cd2c1593c7be90121034fa53fa85a67c202eb55dbf18d282eb48ac46c54de11edbd79c587dfd2e5a1b0ffffffff0266020700000000001976a91493c0009675bfbd7748d63ddfbed031353119715188ace0db561a000000001976a9149737060a06b1f7e67d57a2a9dbf63767f444c8b688ac000000000100000001686f4713594e23b45043cf2c851680fa972cab149379e00edd0f3a4fafce0ecf010000006b48304502206889193c966dba19ab9d37c0297da7dadf69d91569dfb345f14dee4ab6644618022100e9aa1b9eb6e594d5c631b7801b65b91daa8d356fb8349d99843f2c6ee28063b2012103ada9c5d634f80e9fa7095a6633b3cebb955e283c3d180efcc483ed48d27dc2b1ffffffff02b0d1b90a000000001976a91499e4249f2fa24ce8c0f6f9da1a5aae0bad8e1bb588ac971d5914000000001976a9149d52c32a7d2354a31992324e48ce26dbb53ce8fb88ac000000000100000005f035478b37c96960c7b200fc9c07396204b4147c36f4d7d34ccb14f4188fed21040000006b483045022100863d98bdc250d306034dde69e31b231a53fa09ee9dc991ee68aba7641baee76902205c7d2ed72a4a1c84c9963f367934f3460be07ccbf4ba927c4e425b066c6979a2012102a28bf1d0d112866a3c531a197a134c87e82f93dac4cf1232fff2de992ec6bf58fffffffff035478b37c96960c7b200fc9c07396204b4147c36f4d7d34ccb14f4188fed21060000006a47304402205f15d4b2a264d4e78c03b7262031d69b58f3579c6a28e255dfa6ad15fab78716022061122ec9557b4325a728b61bbfb19ab8b6add3bb0120d338068f69b13ac615d201210320b6d857052191ad758a998a0cd0f4d2b6e14ccc1c427b999b6c5115c9ccf46dffffffffb240b7f3208f85ec69d85b1a9449d68336af167493a0645dbf2c841968d3b8be010000006a473044022013b20d7f822f045fb7e584c0c162a9ac71d5ec9620f104fe9c0074ab89ac5dd7022022b5f7212e2c1e3cc2ed4e0adea5320c81e01fb00ce682ba47ca58b0e0dc0231012103877977df995439e715b8aed07f612cc9ef601856b45943e8f915f076e21e023bffffffffce034905869dd0145887f68c25c13561ff60b142110f63bc6b84241b0d62aa74010000006a47304402202b285a25c46e5bb8fcf8c9fa90a7405f3cc56a1095d6a0c2de4aff207113291502201e881504c541b3e6932a7e9b05a3eb0f72838d0d14ea10b256b3d995d96849ca012102c7a111393b8ad5c041c05097aa01f8aaf53c154ed608a3ff9fcb410ca6101fdcfffffffffd801ffda59fdf92d4663e57708596f271100e81b9bbb255e723c7222d66fd3a020000006a47304402207987cbf3d58f50cb712f5fec3c87c6e9a92ccc25a081c67b34207273c703c17a02207c4360bd96d0f3b3e1949890ccbcd5923437f6b88f2b7098e6f8811862a2fc070121032467db06b1d3465eb0075265ee062c60f0f8f7c0805b257356cf83b7fd9ae7d6ffffffff0e00dd6d000000000017a914206d262bda8ca8acaea3116d97ed3bc4330a695787e0673500000000001976a9140685a05466905721f6292fa5d173682da801c5c488aca0f01900000000001976a914b1969f7c94b88ce424593494cbd4bff08fedc98388ac80b92a00000000001976a914147b7bfe27567b9ba74145b949046924a426dc5788ac60f6f201000000001976a914b6857240f83fc4f3f264497419aabbc939da4caf88acb0f2ca00000000001976a9145e226c737a56cd3d23e40b7dfd375f40f51676ec88ac81801700000000001976a914ff130497dd1cb702517bde96efe5a96874efec8988aca0a1b800000000001976a91417931c824938b76b66de6794a9e8c4eb600465a988ace5d44900000000001976a914f7c5c870369fc85af88126d3d4d12f41bb3751da88acc0a4fd01000000001976a914a1d3109f5f68aad2b646d7d7c4641e7d6ad1622288ac00623d01000000001976a914d5ddc75a81b4b6a5996da2ce5eb05150ae99b0ec88ac20674605000000001976a914164a7664be790b361f169ac06df076519eaf166a88ac0055ad07000000001976a9148ada333317eb164d11345bc04f1b389a6df2129a88ac40ea7000000000001976a914ac1fa5ecc3762eacb28ad2c55447fd4234a8065788ac0000000001000000025436fac399a17e71ed1d10de0d6e6b3e491c726d7c308fe56379b2c8ba696086000000006c493046022100a5c0b9f4b35481def597be00f3866b11bfa9e3edfccccd996e99e656c007b9f4022100a8787fec943004001877b86b0bfb06de65874d91aa72cd8ae0e22dcb55ffdde5012103e1df4782705418bcc5e8960c4d1d858ccf6c7debb99b5b248f9938e1c758f259ffffffff20a38d8e1c9a5b059387c271afc44cab0a9872e3de9ed82d2bb358e6e29c893b000000006a473044022022df251ae2c8c7a91ac640b96bc858e4eedab6c6e9234e1ac72339a9bafc91e50220689a4a2dae3f1c8fdcbed1f464b337e1937384c6863781ba78cb7bb59878354a012102a84c452675a19866c291f00ab096266fdab5cb465ae5e9d6232b0782518c6574ffffffff02c3c9a900000000001976a914604861784894334f267439e3ace8e537a7786f8188ac408af701000000001976a91431f249f7394248e96d227319c1c18b8a2d92e47c88ac000000000100000001f6d3f6f1ab3121d60d0a4273d5b5b8cefa0c8eae30603573e48f1913d47c1960010000006b4830450221009749f213e3d199fdea8939b5e69a601d6ba5a98c7412fb2c5042492fbc635adc022039fdeda61422b518a468e3fcec4e589a0eb0897591c25bdab8b321591e29f7860121034a106051bb1c0a530bed24543f6848f233357aa1ec5dc5ca4eaed30240b01b57ffffffff02fc0d1504000000001976a9149f87f831cedbf181d64e1a9313e48b1f23cc0caf88ace0a6e001000000001976a914270c46e4a9fbacbabf19265eae0dc7d4868ea44688ac000000000100000001e881fbf0dc4797661bc8f46087a1cfb1430ba7be5ad31ef2e4dde325f5ebf668000000006b4830450221008ca2d41cc60a147467530d455498351c472e577ffda79e2aaf6770b63ef86132022074e93028dfdb359a550d006abb2fc9edcece8d48e616572043f43546d1ea661d01210361ccc6e695f4e09a8fbdd2c002618e4d7c9404de586f92016acd8e15bc904584ffffffff0200032604000000001976a914bf1edc00580977eae6c766e9b1a64808f1c2df9c88ac3ce6da00000000001976a9144ef0db89f4a9f0a1a757cd5bbd5367bf580e5c1e88ac00000000010000000113e2d56f92cf0d7499fa57ff4013b231adb6119b1d70f6f2e56367dc6d6beff6020000006a47304402200a134c15a0faf8bbb0e3b65ed5646f6ad942bfa36e86eb3505cde3542f771787022071e8a9bb03028372c84d5b2740ff7c530fcd7296782c013ea4ba69d9dc2dbe910121021a13cdbc83063aa3e2bb9721b101e12d46c2514ebc8d9a60881c22ed452f4664ffffffff0200b6a602000000001976a914e86d1ea9cf0ed6e5aa26b2157292ca0b938f96e488ac32f7ab00000000001976a914adaf165ab79032028c19773885cba02bc5308b6f88ac000000000100000001b0a00d8c8fcd8b44a7997b0b938037d287b5d6713588638a728ace51e6159456010000006b483045022100a2bcd9da822feff103de077453d055887e21a7af9d2d4e91972a4ca827f23283022077fae8ff2e8301a4f98abb3f0307afacc45687282f824659173b96151c472af70121025f7227076ed1cb30dfb74040dd5dc7d6bdc5d1cd9a979286b93b86eeb027ee82ffffffff0210dda602000000001976a914e86d1ea9cf0ed6e5aa26b2157292ca0b938f96e488acd958ac00000000001976a9142ad7bcff321748f1d4d7a04f9c400791f9818e1b88ac000000000100000007b6739977b899bf717218463d8f013e79fad7f4a17377cdd953f744563c164a01000000006a47304402204f3bfc5a7245e4363d9b03c7f72323b7808b09423b171868b00d75f275415cfa02207bbcd6177ad9469c276150e87dac25c26ad538de7311174c9f214b59339d5b2a012103bd2115990c8029a06d88a0660e87e34443f9c03dff67ed5ef30a13b348c3bb1cffffffffc4b6d472a8cdd9b6066932444013d72318709dfaef63c29dc1ea149225d9d103000000006b483045022100f5a1a55c2bd3f92ee8ca8e2f71b751a4f3be187fd4166253eeb863a2f50e23d702205a7a12b3230c27ce430519f1757d9b8ef2c1d0b4e3b4c6539990feee18a768e5012103ce6a4efcc536db89e2a2b9d7ef5e4be3ab5b9f57639f741330a3af340f84c157ffffffffc7facfe9d347a3c87a2576a7aa3d15ef9694640ecf0ebed18efccc3a5a481212000000006a47304402204413a7dcfae659c8d4de5740816d70c9e77278c65df6510c01d1ff89fc1a528602207009594ab6b68135ebe48cb5af4f011ae804b048886c24b8c605070686bec1b40121035da3723617cdb641c505ddc53f12659e1f5f89bc5dae221e5eb8085402043d77fffffffffae13171659fbdbebd0558bfdc0605ac772bba1ebce19209bbc63bc955ba2f3c000000006a47304402202d91a97a4d4153b0b0624839ceb38ae342b2e14ef6e38e7e7d23418a8db92d5a0220555f2dd270841313dc6f205e1e646f842bd258dba22238125f65251cf592e375012102d6cf9acc074949b4dae46b698b2da8cf54efda29d5bd24eb9fe48b1bce5b68baffffffffbfbd8945fbd6452b812b7d9add7f5246a276bf5ef910d4380dcb6506248c3061000000006a47304402200a9e72958f167eed09087a33cbf62f14ca5f0fae6a30ded5639daf0a1c6d8649022064d30b49eaeaef920346e412e556c4388d0e055fdc2e76295a1e234d23792f13012102469cffb446b2885dc9308089687b033bdc2ac0b401ecc3a7be8b5f6a211ecdb2ffffffff2b1664836242d7b6c75a8bb9235e5da18296f7bd522e2c039e81c8acff9d9a6c000000006a4730440220157076892744793141722f4339dd615c851ceb486db01e63afec78543845e23d0220361efbdf36a60a16f91b06b6bf5853d65758d18cc24880d9be6adabb32601f11012102bb57e1c76158de4ade57bf2cc89c6b5451cf1c9988900b666703eb73ababc5f9fffffffffdcbb349cd3f53801960eb0cd19dfcc55a6039e719b8ef1839081a2a7cbd956e700000006b4830450221008ce0ecb57e5e5e4c3471999d352c94c4594f1fbf124683f8fd9d33776b188ef302204c64edde37c44e6dda9f2bb228f66976cd7168877c7b413dd9b4a71dc7be2662012102cff65727866c72600b2837515684af4d1d21e8fb2a5a4d1f57f92805bb3aa16bffffffff0255104a1a000000001976a914c0d9681f12ab9c0d7823eddd5c31feebf67b7a1888ac23b8563d000000001976a9148f67b4acb6e5b5b6a3adbd95397e389cdabcc1a588ac000000000100000003533deb01f1635c1b6b97903dd2a8b4b252d716065dd525d418d57b10b32c1850010000006a4730440220646c5f95c64ad3c84c1e92b2e013efcc05585bd84d3b3f883e3a377a46cc8274022020480be5d2a536ed70bae2215cfe3626e3d9a56e47bd0a659ad4ac21936689e6012102eb8a333277a3b0989f90b46e3dde2d5ee8be661e7b000a5b015b055455efb8c0ffffffffb77bd9b048b9c22f25fd3593dca9e72b94a449421b947606b4ea89da70a7294e010000006a47304402201166807473c28696f313fd19bd369a4f4e7cd52652c472180f69e7b6c6135fdb022050a64cd511055d1e59e1bcab6eeaae4f42cad177e132bfe73628274cb9fb7cbf01210226b0f87dd45d32630338c668019f90d2006c305060b3ea846ea3f192a70a5bcfffffffffb590e512b02047e0887863072b720d8cf11ff709044ddf8e0afcbc4ab1fb5936000000006b4830450221009017920b62ab9d6103a4ee4a04616e23b9b1b92adc4d19ffa30de7a0a35f7fcc022010ebef675d7129e7e2c0cf1f08c06ea66345afdba1d9ba4ebe7991101144002b012102eb8a333277a3b0989f90b46e3dde2d5ee8be661e7b000a5b015b055455efb8c0ffffffff024e420100000000001976a9142a97aa43d00fc34ba42ee44613f0e7e64c45748388ac8f4a0f00000000001976a914d6035e17ed7a53366f0cdd77037331dcc23ff5d088ac0000000001000000012f927d00d1741ce17d7642648254832ee69d9fdb86f71500c35a88e1797259f2010000006a47304402201c657ed2f84e2cde028f1ced92aa1826ea3fd12462403d56794a91dc2ec8a01d022006fc1afe0c6ec81e43b7d203cd0f371cce183d497819d3517f613728e7ad7170012103296adeac3061ba2fa10f47240d3badf08a1c83d55e86d27489805b182526e738ffffffff0270cb67c9010000001976a9146c923862cb18f19ac30c8d24785cd3fcc3405da988ac805d6e130000000017a914428ba6f2fc0ed4c313d010303d19bfa179e3b8b987000000000100000001dd1037e1f607d45e4c8f8bca9f40958a86a8ba7b1b467fbc4b82d19d3692ea13010000006a473044022044e2a97c7060b1f6f7f3469cc35129af02db6d8ff7a94c3e24f5ede2d761287702202faeef6c09291342a664fce4c561f50b59f1b68c5c1f6268987a851c294cbeb5012103fdafd4b07cdedf69f07732f05e45a5bcd79eb08830a34519d798bf2ac9e10bceffffffff02365600000000000017a91479aa08475896a09a7fb124b6f73fc3c9dbaedf12879286fe00000000001976a9147e22cbdd42a94d6c9a558588b14de09b6df0292888ac000000000100000001f33161c044eb91072091031d90ea5789ea01f9403ee85b54f83d6e57c82186ff010000006a47304402207660901e581bf919559d55117bcdbeb0713c3af117eb18a6112a55dec6245a03022018f72c4a31f833fbdd3133c14cf2462020bf19b1871f66bc9163bdfba2c19be5012102a4cc9d15b730f4861c50400a4363c1d358708db4a042811488664cebf93953bbffffffff03408cf73d000000001976a914c4e81ca6a0ba38fe24b529c1e08231b3233b4e9688aca0816a00000000001976a9142b9b4b6f710e79079fe7576a52859d9be2526d5f88ac4027151f000000001976a914ae0c82ceb5e399509851fbf0724ce4194f9789e588ac000000000100000001ecc01846859532133d89ba619bb364321ba782d4e16c91ddc6965d96e802bc65020000006a47304402205e595626bf18345df99228920d18978abe955db7d2b93917b3e068755b9ff2f80220704f9f2eb7054c75ed6ce5678a55abd7297007dda79b595b865cc20fca11354401210363b17d5e1405d4460021e22239ee676d5881ecc8af35dd92891084d876009eb1ffffffff065072644c000000001976a91403f961740caab8ba0e4a2f871ad835b83bb07a7b88ac007a8b1d000000001976a914055291e21c7da5de004c41cb3334e2a40134eea188aca437ff00000000001976a914aa7dbbb6d9dbca6771aa9b11ea7f5493c12f1c7f88aca0816a00000000001976a9145051b8371ca176fefc114dfcf3c596a7b3cdc9a588ac0be55f00000000001976a914e648be52aac41926387e3c1497e81268f341825f88acc0cf6a00000000001976a914d089ccd5458d5e9488be3f6b8b886618bab71a4388ac000000000100000001600172346cb7116931c0f12d5c60dc7495a25c2e6b90f6ee018bc66f7b21940f000000006a47304402205bbdb0b1aa90758a6fbf4e65e896a865b3803917fd408c21d25ed20109bfce2a02205d36a3e3c5ca25daeef7452bee29da5cd7f733abf43a520d1433fe0db8ea0316012102f1f2e93521144418cfd3840fcb2c9680918151c3cbba47fa7441b6eca98a6b00ffffffff02ca862000000000001976a9141c14fe354a7fc559bc69dab05c67cde74e63eb9f88acda44fbc0010000001976a914337ce63eeee2d829265f491a30e2d0945a80274d88ac000000000100000001172a0fd3f5210c3a2f0e96c14e14a09cef8193ada464337c9a4719e0c5143e7c010000006a4730440220505c23e40804c4ea35b02216ce7526e343cafdefb4ec49719c8d6bb6d17ca2be02202d9094f266d469c3455bd75db07026cc8ba914cdfb90bbd0f698af07dd105d8f0121029b0907aa5b983785ef89d2deb4318042091bcd8bc97135eab444372debbca92dffffffff02ff97910b000000001976a914bb10be30d4dbdd497a5dbdc7775ac7f2f23d0c3e88acc6f05e01000000001976a9147ab62b816aa234edee820bd7fad92b94ef9a2b5a88ac00000000010000000173859d7ae919e5fb528fb1317506ed2e09d789c6b926d0ee5a35cae73963e7c6060000006a473044022050ecfb5a97a47962172e97f7cab9c4e0b73adc6a508b179d0c4b96bfd39a1dfd022041b8c847594f0d84734c9f42ed05f142a32cfc396e42b9e6d2df0e3df39ce66f0121020c2d3031307852ca879aca17f08550466ea1f594d8d1137c4e92a4ee7742a520ffffffff0212191100000000001976a914145f53d9f2ab804960ae6893d08d1393026bae9188acf0e29e01000000001976a9144623c7b4656bf2e3531c70eeac96937c884c750988ac0000000001000000011e9a8e27282be8ca6ca99231c848ef7b25373eff4a8301362e549b7d3a35112c020000006a4730440220710e75d5ada73ed0de64f216b7eec053c5dfaea9a9b477511ef22792ec152113022076b71c00963b5441f18a73e19101b5a45a266e854d961f5654473a4927c0da100121039a14a147c9209b4515236f957656d5ad3d9562acd4147b0c51f2acf0d8049ebaffffffff0254380703000000001976a9149bcc7a05b648f444daa6cea8ce613c9fb03f6dd188accc086903000000001976a91437817c8296734d1ca790d766537c8fc33149877788ac000000000100000001e7dbd20af0cc96a3b78f9593792674acf51576e2c83b344167cea14261690cf9000000006a47304402203ff0abd794b935bbfdc361cd1b77de5977c133416e5d7cba26894ff97ef9426202202eea3db1eda9cd90bb475da73e89216dffb99ad065f58471d5095256fb0f40ff012102d99155da2326b14dd62b99d4231b417331ead6fb41790cdc2ae4cb491b54dc16ffffffff0280c3c901000000001976a914a1defaad8caa4e2fa1b022ea586bebfa1f042e9d88ac402ead02000000001976a914e3c072ebac22762e5fe1d9059e1608c8656a46b588ac000000000100000001268cff48075bc3dd287337c6853b9f31da2751f65767069d0906ab4db1620021010000006a473044022034f602ac2f67f936f47c0d554b4d2a848950cfb2d7a83fa2c127ebcae0b2e20a0220272ad4d1b1f5121188b4bdb95f542c58bc27ce20076bbcdfb7349ab12c79adc0012102abca151efa734d6de039f7c92423049579ffc164da53ecb8dbe79f06f5330a92ffffffff0280c00d16000000001976a914ee78446417d60f2c63acab44dc171a1ade844ad888ac3079cd38000000001976a9141e1254b8c796ac7b29f832eea2dce57619f6e3bf88ac000000000100000001a8bcff39488c1d07debf6c345b2846db0b054b779566b8b204a10bd198eeabaf000000006a473044022025bc60bb44147d364dbcc5622d62fbb07acdde68456adf6c5c6897b3ceaea4da02203e61f11d0f149eb478dad4684517735e4bd7f618c354c9565cb5db708e62e2cb012103550ca9231cfc8ea7ac94f75ecfd45c1e20acb3424e3d4cc1561d1aff020d0ebcffffffff02406bed07000000001976a9146fcf36ebfbbb15407f0eb1e70f617d6cf8188e1b88acb0f9983f000000001976a914bf1560e2eb0800abf1825e9fadba7b44ac644be988ac0000000001000000014f0edd25a951e4fe2fb3c4bf3e0936c0076af967e0795b6a0f0e6e2245dc91a4000000006a473044022025dfe7f1880286ced455f9c51d2c0cac4659e16c5a3ac4be839c1d1258c689aa022077f3b550dd6e2632a41c9053b69edb76d84fd366bf12314d29ff19a1e94aad6601210363a7712f839be58c122ce47afe1979e9bdfa5ea36a59bcbd313faef8930caa7bffffffff021e052700000000001976a9143b49e53329acbd43011365b1b1ab83697574e08588ac1d5de4d3000000001976a9144d97037920024e0b4086c5a9f8343685a0aed8ab88ac000000000100000001bdd99be7cbe86d0fbd686b516329326a54a3421b669674fa7843e892e61974f7000000006a47304402203cf3ad7d19daa355156a0e771f6b6ea542144bc80e644b5162fdb7cb51bda730022018849d4ac21c28fa9dc253fafd5e01baa670e5ddf8682766772b9651a28c7a29012102a1dc260c319af08d5780a8d73760f989cea6d9fa7e50647461b58a69f195108cffffffff02a0860100000000001976a914346cfcfba55206fbb4898ae03348e36b1ff04a5c88acf2344119000000001976a914c1315156575d1e12c249043780c3df7d71eba64488ac000000000100000001c474e8c61aa9ee9c241173827df56d271dcc6e5fab8f19dcf322651a48bdce4d010000006a4730440220764ffdda26897c3010bc0ae2450ed1dd154f01b7713e2206fc0b7a8d4d4ec165022009ffeb5a8b104a7902e0a1bd12370c86a0ba178a60743a6e3ca0c17c25bb7bc601210341b9a1465688683a83d646393419664348d3f0464ac57fc7a5829f2be04fde5cffffffff022f381b00000000001976a914f12ef58f0c46989fa50d4a92e454e16e3ab9574188acb5af823a000000001976a9143203927fd4f2d34aebe400bd1957208cec9fa4e588ac000000000100000001d8a2dbd0b2609085422a8e4a05ebc33d43c2edc0079437d3f948e031a14d8d25010000006a47304402206e488d1fd407c0c382b76421cdb6380ba28710528cbd5958d27a972fc7d683820220636c1141662442de7c8cf865fb1f6113a98ce1c1cf9e91b1f3afd533fb7c5f2701210287b8b0cf019c487f28159351d89cdcafb26994a5f0de9b45afe8f6809147d257ffffffff0210c4a530000000001976a914f310b6a018336b9c0c7120b51c6af7335ea6c7fe88ac407ab206000000001976a91443fd228ba52205f992fec33fab72853e16b7e8f688ac000000000100000001f6f96c9c9e1bd3fca35514d0315a7d5b1c49cedd99b3489e575e4c7f6f126553010000006a4730440220085550e4f74661d6a867e3c594df89a852ef32edfc057f80b2773fd3f77aca0f02206d295379e96af9af15ce8e761dd31090c96adae5a95ca2cef37215711fdf96e001210222490b49851f66e6c4a62496e832ddb49bb3506e8a71f636523774723c829416ffffffff028140c301000000001976a914b1349556da0674c556575f4681ae6333b027c67b88ac28a8a39b000000001976a914e7bc21d19b61066ba8c0ebc88a47e01fa21430ea88ac000000000100000001bd2c1e9a8459f7cc7f97efab94dadcb6b2f940e56c23651c5b8455c1344f87b9010000006a47304402202f428ef438319b178d3ea23f1adce1865540c316506d6e31ff517237a6bfef350220575c71994be1e1293fe42bb8a6b5e0f3d127b264e2f138bf98939714ffea6d3601210307f62272d70e21ad691326b961c854e45dbbde084b41463c9024f7cd419267d6ffffffff02de727c0f000000001976a914776ae69e64e7c9841906c362a4c5581ebb25a0cb88ac408af701000000001976a9142bac77792cce38af44b6fc2044f054ee8a48766588ac000000000100000001c1474b48ce5362b74a05475263e200f7f14f57938caa7c81bce5fb1fbfcefefa020000006a473044022016a7f5c39dddcb26b68927842f62550185684220b693f3c913cbf125764abd7302200b97e55b12ba537c081693bafd4e0e45b39d5a36d90ac9d394f15b0a6ca7f9c301210369e68c095e7b0f1a3e5840152d941548c5182020ac3d7e94ab712eda51a9c53affffffff02a2861f03000000001976a914ade49952a30aa11abda207766d2605116fb0c84788ac26679500000000001976a91462e5daa3e792bcc5e2050ce859853f77cf38246b88ac0000000001000000019b7a429419b08d214d61862b87c7acc449c3c9d1551b5fad3a9eadf5adc8412b010000006a47304402206afcec4a46b06c7aefda5fcd0be016551342c3824f24fb2aa481323e78e7e6220220564599e20fe7a0df1c89047c3912eb2e18788e2fe60d07de78c3b19144147fb101210326e4afc2dd2be8d8fd497ee4dc29eea50d340691f236eee88a627713e94c33ebffffffff02689b264e000000001976a914ff168c1462780481767570a4bf7260f7a9f646c488ac60763d00000000001976a914ce632cf6a6791083bc7f0a3ec454ade18f52cbea88ac0000000001000000017d8eba89b990c452ebf342c7242a9faa5ab222a8880ee0f13f895ddf692cb3b6010000006a473044022048facbf0b846a98086847d99895afd0f5382c311828061c2ef97766de1d15f9302203bc9028e285353285665db27f6d5e80be791e88c6f1e49ec6be29b6bed79e2ef012103f41df08e73d97acabb7681b6b617b724461aca0c45c6ac80586e9ab5bb4d2beaffffffff02eb2deb03000000001976a914132a85db508b1b85235b35f8c50dd6d94d28785388acd0754100000000001976a914f351d4e82b77b86d4ba4a9a6d32a3631de4a74b388ac0000000001000000019bc5a9e9eca88aa8756388382a1b5c6bb507be7c219f212d13532dd24fe83e35000000006a47304402204b3bbb0943d41d79a73c5af14e38347599f2759c097d0716b13f46c457f9a8a9022067623d72d9d8d34b31e4d0e8da433cb39881ccfdab2316ff810ac9a3b187b4410121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a914c7969f71e653d9ac71e5618623862001edfda92788ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000012bf18cfc97b9eb520cd9282b83add722ab367fba775c23c8ac66a1537f775197010000006a47304402202642d8a26e3990cad6648965e34160409050a37f4baf3cf5f005ce6c890994a902204b3b1383c87c231bd5b97dfb7bb4f5a6198264998bf44df2fb76a847e4ac9d5f0121034b8be16a12ca3b7995eee693dba26f1b66b4682f045797b9644a930b0b2cd03affffffff02f2b71801000000001976a91460892e91b53df6927f026ff9118cecd6c3fb111f88ac2ed33f00000000001976a914508ce255d7dcce4b5316d3fa7917006045ca40da88ac0000000001000000010e629ad4d8b55ac1dfeda549aa9fc10fca2c20b74a25fdef2119ad1b78f4b9a9000000006a47304402206393fe3fec01c86015f21de5b519ab97f001051abbc90b51b9bb6a40b129e40b02205dbfaf6d7b82783f07dfeb989b2f5901125d577b65d22755523a8846e9e844c80121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a91418d14c15d19b4cd947536b6ff2c5b295b68b900288ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000159d649c73b4fdc4fdf75502f60207092873dba8135c1d664fdedfb1d0b07b2e5000000006a473044022006b542a18cd3e9443c0c3c0ac1e72433cb7ebb61de722adb1ce6882796e018ef0220193daa9d82962ba0a99e9167a33d17ada190fdec34795f6e1177167bccf3d26f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace007bc01000000001976a9142c75415ec4c990144ec683999d30f449c7ead26788ac000000000100000001bdd24cae38a46dc2cdcdb4caa60cd96b1f6d17152c277701ff8b54097d84b8b3010000006a47304402200623a026e414f5e7587f3a9657c2eac4ef25bafff77dfb757a646db2c266a8e402201a02388a94f6020209ac9f1772355024634725bb1d192dd7d5a8e75bf6b4023e012103ed3a071e9d29b17f9d1ca30f71759fcecafc06800107275aa42856da7305a4f6ffffffff02688a5f0a000000001976a914734c04d3938cdc702699fecd7b0cd02eaef34c6688ac7898d701000000001976a914a78fad23bc7dca26a52a1f6c3df19f44b1b6e4de88ac0000000001000000015483e6e5cc987968c691e299cf20ff9e169fb2d4eb2991d1b3fcf5f642840358000000006a473044022053b9bce93ce18742255e26af0bc35fdfb4dd34d783a9314aaa820c85054025a402202fdb1be78695260fb4abde315107dd2b5621f0ae56d0dbabb696750d4664ae900121032a2a46bb68b9ec89d3aa2ebeb303099ca5a7bdc3e8b6587f304c72c0f06cadc9ffffffff0248c54100000000001976a91409d271ebb449ec549c328d38a3ac25fb0d5cda5b88ac80d85100000000001976a914eb57d58d8ebb8f69d784cbaa6be5f777c89cc0c488ac0000000001000000016df5b6d7ffe94b95ac90046167b0f59c85aae44ecbd7bf4e391ba679a286ef69010000006a4730440220536dbb2013115ec451ff553fddf21de28ccf74dbacbcf890a89c65fb34afddc102206a1e7fab4fe41370fcd1f7afc601b176518c99c0c190735703408b60b2d860d1012102e528bbd538db3859864da7eac8fe342a4aeb40a5c0d8a46079f354f653bc6910ffffffff0278cd0019000000001976a9144fd2c7ef794523552e2395103e5bf34ef98b8ed188aca8721200000000001976a9144d4f41f12799bc0206df13e3a1a22b472ab97e3688ac000000000100000001ffb3896752b1ff6fb41f913711f7e2d5957feaedba0d9fb1d7ff7a4203f9dfbb010000006a47304402202610313b5cb6cb531d45c693b9207aa766d1d690e1c2771966517ee1ff7af4dc022068d4380ff8528654304b85dd7523c37d8cbe51b8a5b519e247dc779f108e381e0121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff026f060300000000001976a914120a5a881c997a6249a68639436d0182f3c6663f88ac4f988416000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001400591e679a2b9eef96eee67533dee3bf8edc1c26527f3cbafa02c1676f4e0bf000000006a473044022071764f8da2428518faccae6d169393854d986f8496006e8f011fd446ddb45f9d022056a2d4c51b720046726bbdedc9c8b2b09e95951ce864d9765d7ff9e1822e1ecd01210387c90a8faed32ed93d01e44a12e05d3bc15d529df77d3976ef305bbdb741a7c2ffffffff0286453901000000001976a91471873b8851687d8a5577ee0c473654dd93764ebb88ac499a4c01000000001976a914c1bc06eb3e5138529652d9d18b8412f5b6c6309c88ac000000000100000001ce939184b6d82e6b47c29eec0ada85d3450f235fe3824c1263eda0b9ed37d433010000006a47304402201297086229c9e90cd1e8770bdf51e94907c58cbef28fa225a1b2c35a1b79d03f02200c070389b12634f4057762423d68ee53a7dd48385c31109c5703f7d027de274e012102a21dda9f8d3937714ad760e3d20fad0bc0352efdf4f16e9985d5c82a01fc3b50ffffffff0288626613000000001976a914058df15fe881545c3bbf129f69e617faf759e27288ac60b31e00000000001976a914c8c4d8ca374f8e910a006b23e374ac0c5363376988ac0000000001000000012a432728bd16824f14967b49e37e87e662b5fb6413f6d90f51f11e11a1b93ba6010000006a47304402204d057825ea89037ba64fe4fcd0ce3b226681e0e122ba12e537496272d02a03b3022075eb1c3835940fbeca5cf584a33259fbaf467cdd0db9c091d14f25becfd7ddfc012102f6c8e6e4a8e169bb26f36cbf9c067ac0f1aedbc36a15d583a9c74872fce36dcbffffffff02db280000000000001976a91473ae6f70c95540738bed2e365719294f1582a06588ac62993101000000001976a9145d70813a21a27353b2d3db03a23987e7db23b2c988ac0000000001000000011b639963b1be1cab59fed358de5ee2a53d13044e474c7e2df71ae8399e80c452000000006a473044022007663db5627a975be28023e248e5b6bba9d32c41c4f671193061babd0cd2895002202a32b336ad7b7ed9c00b2bad21b3be306f7911db33247e94e8d99230b7d6b055012102fc059e7568b8f252823697c42754e37405633ed011a6945840d3df69e444cad4ffffffff0240420f00000000001976a914deedd99ceafa42f18a9efabe36b199741d6553ff88ac50bc1600000000001976a91439aac2d847449bb2886dff1801d105fa66aebe4e88ac0000000001000000018975ca60293156e174e184f5ea111e303e7f07e8c4e37564a60289d2471eaab5010000006a47304402207df7daa34ac7d4b350f31955998b66ef497cab7c7e6a82b44da8cc667cd9f299022044bbfc697c96d0773a93f85f1212e3581a281637ad46462253ce61f32ab40d68012102cfb36bbc29543de60f5904507705d73446ead91022c09e6f0c1f5aa44b5e31ccffffffff02002d3101000000001976a914c888e10324b193c191fed2bc5c25688bc44a168a88acf0601300000000001976a9141c4e344c2fe0f18ad8daa061254f7b9030e0393c88ac0000000001000000010ca82b63cc68cbe2f608b3c56b7d1c447b6a6f50ce6e4bb53d79fb6ced8059d2000000006a47304402200d182a7218d0059b5298446f34aedbfdaf6b7181f0065f2c269b29d14b9e4767022063d56c9c31cde707be4f6ff1e0cf2ccaed26cd06473d3c26c5a6472166a614ab01210323bec18eefbc5adeb1ae4c51720d1ab4fd3fa992ce69cca8905ba999f19ca0f0ffffffff0280969800000000001976a9146a9658b449893f34a8bc34f6794a11eb3d46a4e488acb1e92c00000000001976a914883b8c4f8db39d9a9ed0bdb9f331546a2193f5fb88ac000000000100000001b4d9712aa48cc284b40d8457bc68697d84133337dccaacce760e2213e634b87a000000006a473044022032696aa4cac783a9bc41457845b7c3a85107d3176f9820e4983e5dbe6e3072f3022056a58b2b5c2b60656477703429bfbec87ba724b20c2789f9b862becb6feb81820121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02a0aaf500000000001976a9144f98b9ea451a395a264ccba82468344645c8476088ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000013839bc9441a29efe7edf619dd8a97e412313bbd7aab568815e6b5da913762f94000000006a473044022001bdb0d0f44ffe961f8d9d97bf8579f14ed6f8e97eda6aa07ab4c95553ae82db02203d05135ed0acae03db89d3e2a57015d4d3f637c6c9e91d9d02dec7ca64715f700121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02b014d600000000001976a91438860090779c6df12ea41cbe472359b62957527188ac40e81d00000000001976a91464c84d28f1405de2b2287fd01154be54cabb2db288ac0000000001000000017de98d18f4c76ba8d889b9e5af999214fcfb828d2dc4d7a556d8934a0a4b5f45010000006a47304402206bb249232db0cd70373f18184d8a4c1ef5e426dea8bb33aba5f17d21001321b5022037deb19f8436b80d5e40aeaf5012bbc7c85dfe9337d8befa4839e3e9a6986ceb012103a84de722cf09dc208c9d4c6455125122ac8017d70f91642b24b2d0afddb404c5ffffffff02409c0000000000001976a9141b0cc0c376c49c75492a926f7c69a9103d17f24388acc8a81600000000001976a914da187fdb76af936933c75effddc08c5b9b8666ce88ac000000000100000001d6245ec41222161bdbc30a25b30ae84ec5c35e876e38c5ce0d9ab0aedbe30310010000006a473044022018357533e3983a84585fc82808c32ecb527512540dc9459ef74351d9211a45590220676f99e37ce755d8d4aee44c643dfe9613c206a023c59098fdca7f3498328285012103895bb384d5fa15aac61d77ca5c9c904e2778e73f798db89cbd7ae3d00a69324cffffffff0270010100000000001976a9148c129a277c19e5d934a48addb29f21897688960088ac7c506304000000001976a9143b31bd659ae233c28d55d7c2495132eed1fea69a88ac000000000100000001a9c29209863a5e1458f837b47ca4f7dc429e7d3d44239458ff36c464ed3e8a44000000006a47304402205d88bfc2ec466f24d80849ccc5be52daffbe70b0f21e3c97a174f539df4a290c02205429188f6b44dddc51b63bff1424c20333b38a49656c5e0be1dc57090337fd6f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02a0987b00000000001976a9140147d2002454dd300ea73fdfed4d42176645411688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000019c878725d330387c59cfee07d19a83adbbdec3c0ac557418046f7b083c32a24e000000006a47304402207c90d62431c5d075899594fb233f37b975cd122343c58c2229a665d4e960d03e02203ff2470126ba49114f65a2391548b8aa8bea9f51ba8006353932fa4f83886f5c0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e0da8a00000000001976a914d0df323103ac934ebf7325487d7819e0536be9ab88ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001a3dfa355beb11b68807159070020dfdbe7c951239c37d1674bc0cf9d61d51b8e000000006a473044022001f43a46e6ed87ed912d7d95461f12cba02319f6836a30be2e2ce3a9bfe2e78502200417e8ed522a355698053ba02660b055ad9df67081a5fa87ab182861f498d15a0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00127a00000000001976a91415225e873956bc71bf5bcbb758df50cf85f901c988ac000000000100000001362f60bfae5164401c0c75dd4fb42a95619c4ea6158af253daf8cb9617bc9730010000006a47304402204eb3023798ac6334ec59e807024a6286e93cd1e2317defa9c1b9bc913008365202202bff125a6a17124740c08eb8e3ccb4ccd9c3f17a8c10e698c1a8f12560129b6e01210226453444f4579d247f45701d28d344402d8493d960cbb8246d174de477dd6e2cffffffff0260160200000000001976a914c3a39075c2ef4847b676461e1807c606fc5072ba88acdc2e1000000000001976a9147ce6a0c88631d90e62873b07d5c9b35091eb09a388ac0000000001000000013ec41a0c5145806690113271c5d864c89f27c6bc96321545f5bfe72e0f9f798f010000006a4730440220508b9db7de0854c0557a3a7d9ad4371205195d07eab20add03a9418c014f706302205c0f3a80626edc3a7f3c7b976c7067bd7635d341fa23586019a111c7bf2a066401210347b44d162f2bdf68d9c5ebdcd905be8d6910758ba538d390bd05183bf33afbedffffffff02f0ef1000000000001976a9147a663e6eb9c7488d79898887281b77182e253a8d88ac95610f00000000001976a914169a70ed2484128636e107b10ef320cff9b9721788ac000000000100000001f47ac73f4d0e63d7189fd293e0949d5dd021f85b9c4d1ab0b844ada945ebd0b9010000006a4730440220040cd499e0a44d2d2df0335bb53a1f7e9e4061178bd905c2b30ff1926a45e86302204d542bb9ca988688f5970406aa32b90e467070dcd5ced8d495bc6fa745d1b6c701210348c1d88e355f243e8594a45f0b919f68858bcb7820684eca7497326c5eab216bffffffff0208970100000000001976a91473cbf98c252aff15695e4f9d42f9d9e4df2552e588ace5a12800000000001976a914f5d9ad5823925f82c103d0ba90417fe7451a235988ac0000000001000000015939d2c533142ee4b1dc8e5be6bf7b3e6bef078909701c4f69597dbb32b00448010000006a4730440220799c687e0a25d58aad1eae8949990ae778b830fdc35e27bfce7e22f41f3c04930220178029bf598a71184e60f2df8d1ee032da112d022bc9ea7eefa2143ccf69a525012103b9ab447400f3509c5b19d220416671591acd01d955beac7b68d8607abcdcd953ffffffff0230fc2800000000001976a9148361a238c19e141dacab43c755f73512f952df2688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001b9b94b28b5fb79f09264a39c7a44cdfc36dbf66997fc1b5b9dc16a8b16f83f6a010000006a47304402207769e6f97c548f78ab11cd88b0a80235c660e56813c178896190f66c390c5197022070966fb3e84af80d917983bdf3251e539f9480a87e893a1b55c1aa1f8984a57b012103e88effbe55fb6ae6802367134ace6d88d9c9edf74277fea5c246e6b196a95059ffffffff0210757000000000001976a914c56a564bb34ae3b1b139116bd8ce6dde4dd0852a88acb4092100000000001976a91418e3c34da41da9833bd3d98756601d9719d4877c88ac000000000100000001e24ea0c000344039d5832a926a21f4f2c11cd0855f1f10f84345edcbc3a3be3c010000006a4730440220373ee04a6a4823a5a1310e01c8a677d477930540e582bdb20a4d7c60ce135d04022052d408278a5620b2eeb2af8950073e67d130fbc45014df30f7becdb75b7c32b4012103256a446e496bfd4b389685925049bab1987d285c94616b785eac65de38bf023bffffffff0254150000000000001976a914ed3e6bfade38f2743206a5cd8a10a5b6a9aab8b388ac849b0d00000000001976a9140737a6f9db3eaeee1ea900c783a9c8003a07751788ac0000000001000000018244d39664243eeb4d6e0e222e0e41011952a03b145e82a5a3243a7f2f3ab557010000006a47304402206bead8684510673fb8af96075c48bef4824405ad79f5670b524f64710d361e3a0220331692e74e98bf320602e04d7664d11d2e5583b40ff184f7b2267c1464e4fc2c01210314be789166ab5dfe23996cbae5afdb20a9641c630415686d4192a2c7855ad37dffffffff021fc70000000000001976a9144b479154b27fbb1ef2c2cd62d07725f62ef8bc1788ac42a21000000000001976a9141edf6e1e94346438616aac1a247a6bdf5f69f2fd88ac000000000100000001eec6b28b200b51f215fb1d64cadfe895c69238796d24e57c76f802db42053f5e010000006a473044022033594913ec763fb844e4e792957177fe31f0a5e64f87871e6e3810fdf2e3e97502203927013dfef64ee8dc773f3101c7de9587419a14bdf714a67f7f8cf42343d7d70121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff0263290000000000001976a914eb032b6fc0e86583f2165ff512c90601a8bce9e788acdc478416000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac0000000001000000044fe8bf1e8abf974e5cd797d674f11b69848e9be31eeb7be1a8990ae61748d7d7020000006b483045022100d5b385f31fbd97f9c365fddf691c652ba96315b25770daeb91a8fd33f4b9775802202225839d1838c8cca303bc680a702d33214ed8a0490f471b08758aea4a75dff2012103867e97da711bc1734a0e098e7ad607cf94c13627f36bdc999a9e66120cc9cb25ffffffffc543f1458ed2889e533b2aca47e4c1ad9152aa983101a7c6a4012bf29d20c065000000006a473044022060e67eec74744e2055216d3b0209d79416efd97fb3fe7145c9b3f2f779cf541f02205c0b8453e8e896a69e7d348ebbf9a07dd018451162fda398c2d6bf4817400dc7012103aacc2a727bd32959c735b7210af2fb12e4ba94fafc00f5b45a62ddc77e654043ffffffff259b894599246285c1e8cf5cd6af0bf1539e731b0032255795362bc5426ffb36000000006a47304402205c73640d083a736f58be23224891e4a120450b0e3e3ec64e297d05c45695e8440220396a489021d907e58be7ddc66deeddaf187d4c02a42ca1830198078ca7ff054b01210354f060757385d078664eff03a823eec88d786ef00c10b1ed2a87f1187093661bffffffff1cc772e46376125f106d2e57c018472e045b9c670f7f00987ccdc644b632da6e020000006b483045022100b22a66c0f290779c6eb0c3bbf93b5385a6e5995b8e5abb3077d700f907bc9e9e022002f7606d75782c5d5c2d72a761974681686128fc387bda5c9a05b3cb4d99ed66012103ba3e4d086d7a16c7384b68bbe6a5007973cf59314a4771e03a5c024aa8914156ffffffff088058840c000000001976a9148c17987ef8515a763b0fc5c8d18ab2a1fe240ea588aca0816a00000000001976a9147616896872b564c34fe7a615655474a719d5b00d88ac455a1a00000000001976a914eb3c2e6382ce0bf46bbfe9cee4853c032a8ac43388ac004e5205000000001976a91426f91fc06f0a97a94d87fa1769918d60ce2e060288ac10270000000000001976a91459d429605481ea5991bf64e665ede1894eedc65388ac802a9e02000000001976a914807ee6a16a9f9ffe7ec8f15a379989a2c26e16f088ac10270000000000001976a9144b892fa751fbf50feb8b65d568eab6868fe2a06188acff4e1e04000000001976a914912d1b4cf6938c6b663988762803fccd2256615488ac000000000100000001575c50e90197bec6e376cbfe74f95d9bc655ab861a46326c53eee10e38bb90df000000006a47304402206b62be2b9154747c463d06fdd01b1080be4b10e2f8dfef0c9c7d6b608c93f5c202205422b784b504b9c36613454503c08dc53c40411f7b35dee5b5f3f436e74a38f501210280add675bced763b91412fa73707f003528ec352ce8a0baceee49f0e8bfddd55ffffffff02006e4100000000001976a914e5b7f2a12bde034be7ee3a811863aa203979790388acdef59600000000001976a914a8dd9ece2be8a73f7b9ac8056e201c375add437788ac000000000100000001cd923dfe733f48fca05b7dc7d95a0edaf584a2124c3f6f9fc6325e6f52f5b519000000006b483045022100c28e9177d8bb4acab41def1318ce9d1f9a7370c15f428ccde9a40b9c26ec11f5022064148a6c05070be527d06ef598eb0cd7eeb2d8308d08dc9bc2dd5fa2df59aa0c01210301f8eb0b8fbf04e2042d1f9a67c217393ddd8e0a5786ab0799f69b85cd8e2ba3ffffffff02e8d4e002000000001976a914e5926a8340f621120187c5a120085f095af0fbbd88ac58bd6200000000001976a91412fa3c68f2114a946422dd60685a6eeff43301a788ac000000000100000001b809a5ec6b5635153b29abdf017856854e0579d8bbcf125fa7d1e3b2a1bcd40c010000006b483045022100a834c3e8b6367a16b423f7b0ddeaed033b8ac2b70075bbdb9505ba44b320eeda022059469dcaced2c69749f0e1c595d6ae7edef6394eacb9af7dfdd7c3ee78f8a860012102b1c6e7995cd1c951ed0715c45fa3bb2eff38818080e22818ec6797aa554f0542ffffffff02a0860100000000001976a9141f2bd67e8c7351d50b295ea0cbf2a93f4f7e312888ac60770805000000001976a914c00798e35a36828798f4936f269d34cb2fc538d488ac00000000010000000101031bd6a5c638968027f32485b49b16e164dba791b15b553bfb86e8c4022139010000006b48304502200d4ee27a2948015075964e9a2ac05c8f1696e306870a93d9accde31cac168b66022100c6c26358e4735fe64d69a94a919d01eb90582500550ef905a321b73bd8b9a809012103ed69e2a9d65f882c51ffacbc0b8b0c39c81f284e48ead9b9364f88c5378017d5ffffffff022c058a26000000001976a9149efb51d09cc05d61903bfaf672aef133b1eb502f88acd6398332000000001976a9149ecbba239023d289a75704c11d5e17cfc161c5c288ac0000000001000000017c591b324f18f0851e22081aa8af96f5f98e3cdbe740cb04b031c45367b5a49b000000006b483045022100d1bd33b4a02b17fb028b842106c35162d15eaaeed2b34e1ebad311231eae616102201fb9aa2ee23dd9c91a649479a054e19ea9c059ae9623a8d403607383923c3a1d01210245abccdb5ef077dc76f8662ff22c2068404c34b9c3dadaabd79eb886d0548303ffffffff02f03047f80d0000001976a914bd331e6e30a99525ef117b616ed49cfae24aff3388ac00902f50090000001976a91444d7af16f54b777e4f8215b6e2c15cd5a88b794e88ac0000000001000000015d72cb9ac0d2cfecb1c1d09f47aecf4e73ba9bfde1800ac89700cb3643e5a966010000006b483045022100ecada075f466137d7186ef68dae62baa4318e70fad19855b1beeb8468921bcab02201d6cd4aedc7372d8c364f2cea0479f681b4dcb7d669e32d77b3a6ebffceb48d20121037fffd97103ec85c3210e9f5616c7f271bdab30511f7cd0f789934406a1d96724ffffffff020a844500000000001976a91458f58831463e2831e462cc19fcd6006d5e9bcd7888ace6c58009000000001976a914ae0d4f86906d8b0301cf0f2d92c637437d07fbe488ac00000000010000000115d1c8c6bd8c4065c7b3522c7afd9970833f7a4ad2155cea7ee419735c2740ef010000006b483045022100a7e0db03ed3ea89ddfa62e22a3cd58c9709f8fb16f2f7c04c511cf0a2cffe2a202201e6aa49c8c0ccebb26e5471a0cb8fcc1dd6f8801b21ae31fc31f82d4b096a2fd012103c6eaf702e2e6d75d1d676ab3d6f2df2b150e35519d64769a7aa9530e633a8903ffffffff02b075570f000000001976a91482c2ccfe28d36fda7ffc36020147550fd87cf8ed88ac404bfff1000000001976a9149a7b8ef5eed97ce984ab24e41cc0cce19a815a2688ac0000000001000000012113593294a2f1617c3d13b364dc9cb315eb587d54b4ce89857634be280f0c59010000006b483045022100ec0446d7bc2fb778d9af8a8597565f605864dd8d8334f03b8a3bc0d59fe3b64502202cd77f88496713313b4980008317bd63425e3a0fa2414e791648eb1253853a200121020b2d562037611d73cf237e004391a5305d1e22d297d2d4a722cd40cf7f8bc7aaffffffff02c32d41d0070000001976a91426305778e2957a6b800e74d558d784b96632ef9288ac00e1f505000000001976a9144c9b0263d9daf901e3ee7266f915a162727f9bf488ac0000000001000000019bc0cef1556621342322257bcc2bafcef8bcd39d90f43f117fed7088363f0c3e000000006b483045022100e87c21d2fc85642df3d642edcff3c9a0c6998b0ef985d2eb3b5b7e10dcc67798022050f03c35fb34554e717bad389a5b34d6874913e14079d6b99f862dd57a684e500121020e8399ca26be2a407e62a69bbf0ff32024e3a50c9c636d8104f86b36d3a9fc48ffffffff020046c323000000001976a914f7cbb7d3d192b34daffe6cea712534b901efbe7e88acf093eea0000000001976a914f59902ae46f9447c3822af49a9171a2df185982988ac000000000100000001aee41558e3a87c47329a37987025961b205638ef711fd6a914ebe81a241e244f000000006b4830450221008ed0ec8ac6cad0feccf30caa49dd990d89b0a1f570df56dd8085f7048b3ccfd702200964997b99e83acc8d3c9a45a2666df964987177ae6099006e1d2fd116516bdf0121028a6afc749e14ba582650c93727d4fe611d7015413178fefb3a506b1e2cd8896fffffffff0280841e00000000001976a91410ca7e902937e42cb7ef6e95bbfcdea18048286d88ac7102dc96000000001976a91412bad820a3b1e87dae90d4e7b1128fd02beacbc788ac0000000001000000018ee61f2711348d857733082fbc396a8a8cb06669d0de985f8709162bae798ee7010000006b483045022100a2935121c07bd5a967e0ba188d553662c79ac64e1302e482a6232ca7d586b52802202c4af7cec1aae7362f214a9f5222d5193650191eea8cb7b5c0e6dd2201e9329301210229cc5cad1c5c362008962dff2ae1843d80f4f80d046f73fab00b19d0b2a24bc0ffffffff02625ba1c8010000001976a914d05e54da9bc1d4087335466051d7baa16e12a66588acf78d1f00000000001976a9148abc4f2a097717044df73f65f89b43793185788888ac000000000100000001c7a0655d3faac9d3d4baf72c4c3fb40f20271b5405a303955e79933a4a0a5d5f010000006b483045022100fc1435ab892792e0ef0deb7085722b3a7af71384e46d469da09090bb4904d59c02201312a97096741fd043f62bbf84be13b18383ba1972eb039e56596ee33ae04c36012102db976aa25a148ebee43a9b894cacd78bf6be9a916d9297f06adeb56fe2d2f115ffffffff0256296301000000001976a914f82eeca14644c53055d956bb00a1dbe8509f05e488ac8a6c8004000000001976a914ac8b57bab2e186dd81fef9b2b488ef8433d41e6188ac000000000100000001eb4ce207aa6fc891e2d5ba5c37ff47dd43829446eb29cc012ec4645263bd6b84010000006b4830450221008d796aa5d4d05a90948fb1dfc5e92d44d845e313f3bfc09f211f6bb969a804ba0220584c5a8917cba5f3e0bd12a7d9a394f8fc4b93ba79c45621c93ed938c58ab9090121038bb694bb23990394c01386ec22754308856275eae55078eb04347cec36a31f00ffffffff024d94f002000000001976a9148417f90bbe6ba0d5c30d52b3e164035a32c207db88ac0e16652c000000001976a914cf4193d4cd88947e75f87748e09e8c336e4fe6fb88ac0000000001000000011f391a5423820d78a12b159dfbc90f4f994852c4dfee9378b127ed4055e27173010000006b483045022100fee3bebc0d0725023cc42fb409ef7460d29c3deff52027848fb3726c1a2726d202204f3a9bae84ddd00a7c323ab81b490f6762914ac115f962b3d3e1b5bc19cd49510121030a8db54c488a62b3f3c0d9d69aa47267c3b9d002678dc334452df65828aae731ffffffff02749e0509000000001976a91471fd325d962517343bb871b4cf4478e8e2675b3d88ac2dd72115000000001976a914241517c84e278f88b0776ca2b6b7b849a506ce2288ac000000000100000001af05edfaf5b92d20d3559620c76f10499d8e8affa88ecfa4302924150f7662a4010000006b483045022100b8fd166f0eddee447e70dce6744f2839e5eb1c0d338c741bf48de559805465b20220273b0a0ba1941f0bfc1b421f7a53795a1f687d978603c265c0d8f1857b865c37012102e8663cb69e4570ab028182511e04444d175f3f2e3987e74fa8cdc3356ee69c9bffffffff0280b14f01000000001976a9146d6cd0ed8776c867aed1209a7b6d7515f7aa55a088ac60361e00000000001976a9140a0a386267ada33fa306c1ff068c6efc37355e8f88ac0000000001000000019a6779c9e474b79c2c34133d114eb061d05b14304e5105e1f414d808c5f880ee010000006b4830450221008b5a2aa0de2f3c2de37514e29299c577fbeb745acdb5b6228cf2a4ccbe40960f0220146cde08499995ae7d0918b43749e725af75d7b0d5ca6aa9a4da3518710c12b90121024a154aa3e9da28830f8977e3b8cdd16f105eac7d9ca5e1729e8072dad0db1b3affffffff02af6b0637000000001976a914607e63d78290810266f9f0d4aa5e8ca21491150888ac3ba4ce13000000001976a914ac3e63be0413dd2b7645fb95147666df6ec39d1288ac00000000010000000166468f20bfdfc74b6a41422cc2805556d17e9167170e2ded718044d6d6fd80d2000000006b483045022100d863c33c43f8a3a856305c21478ab1c3d5f109dbb11e2ff76c91f07080cb393f022014797e90bb0e0ad833239fd4bf95dcb06a6317b2e29006f9cea1e23da42ac48c0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a914972c4144930ae77bb164ce37ae7510353405c69388ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001d101b087484390ba48ee8b2d755f70eaed58e308b70fba155b5f38defd0a48ce010000006b483045022100c9aca125b1e83bf8299f6ab156c16bc8bb40716f6d7b20757c465e997367007a02200cefd62d68abcacf0be673d0a386befe69f7e094583e5fbe1152f7fac44de0b90121033f0e0230910892dc13665f6988785cab141579dfc9fea685bd2376e60d59ab1dffffffff02a0860100000000001976a9147d91e2a66f6a67b69847a1c819dadf79d1f520e388ac106a5d00000000001976a9145f7ae8efc124fcb5971b0cf3c1c13736c6411ac588ac000000000100000001999fb095b9ada6d16cfc5cebc2d846573472272535ce5df4d45a069a4f9ae52d010000006b483045022100f9a1956b9165a873b323b896f1664ef5a011e6c6cae6d362ba015298ac405df80220558d3d5c3603a32111beb8c09325a8740f76d848320ea24a06b34b7a69231d720121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02f0d20000000000001976a9148af0f7b34c79191af3c1e3d403369af8379792e788ace6535229000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001b5987727f4f1faac50127c3cd6faa8ec5cef04802221a3df376c5497a5dcf97a010000006a473044022021f367a4af1ec7b20b4afd4f9bb568be1820b37f248438e38b4db9281ca0e34802205c8aa4be2d3b3c603633b37c9e7cd3b74698a1677557736dc27a1a9ca81a6c760121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02e81601000000000017a914916a8b61fb7ea250a068c48c39b54025fc283d9187ee155129000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001c7d3f93e6064bb4e9730058a4ae9ac64d6f3cc700da0d9291a7e1e6c6f2ace4a000000006b483045022100fa0a36cd452bf8e4d081ad7caf99e3892ed01c77fe1b4ca12d6a464e00f806e5022007211515644ed8536a3072b60c613da64d671bc45af19270cd63d2921be12b8b0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a914401c3d5df57db5895b4e9f5d4909bdda3c19702688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000149a6d1c09d28bbfdfa44f85dbb23a645d2ffa14f6e35f29568fc8e6bf31f754e000000006b483045022100a91fa6dbb0aad004d982abb7d18e015691cf6c2becbe048db0840648ba4f9f130220288b20b9d211912b58552c3ede7217b594decdedaf584dfbc1f043486517ccee012102600f5c7debb32fd61dc607fbfd2bb91438076f2f1e2371421656e7700fbf596bffffffff0250bc1600000000001976a9140bfbd90393953d94e2febe64be3346851fa03fc988ac7c321700000000001976a91465adfcf6df67bc04aeca17daf55abe22d963dd2488ac000000000100000001ad3463882aa18cda75cf581bdd9467dc4c0f8403e358e8e9f70d1740ae65e5cf010000006b483045022100ed0163bc41db8d569027aa198b16007ffc54ef590fbaaefc1213c805deda023e022044bdf2db968844b7809a9577fefe3239ba5a1dc29454d30282a802801c755bce012103d039e3add28083f402c3c643bf09d34af2c48ebba585c878a810860a53e8ee8affffffff0214700500000000001976a914bf33c5bbe3e714eb8b16bfa4604e77c2e19ba81888ac890a8b01000000001976a9145e7f4db40e540034f471b263613a76fe1eb59db788ac0000000001000000017bdb499287c0efa7c96fd17ac4736b2ad3dba4ff61b3f16c4461c70aac5e9290010000006b4830450221009c9c07067b82128a244d42fbd00b6dc5265897d5479f8fd53ffc32aaf154c117022076cd5d5eef590591711e4232b93c86e70d3bcafa4f1d3964fa682cca69da12a1012102b1b0169d96986fe9fed4cc7cea8ba0085d9cce8f22988f3db17b4b209dc38a30ffffffff0281030000000000001976a9148cd38391986e6109944bda6279909483c628cd8e88acd7635501000000001976a914d0de9b4bb9eba5e72e3655431657f3ae4d438bc188ac000000000100000001c88284648378a48a69954a1973952cb753efb7569f31ff221549a8c8d6fc5ee6010000006b483045022100b75fc3429a5e1ed1073b8a4e8132742b445e175d3de32dde8f17ab1311e9f17302202440cda157673a519b1e3596e203644774258ac4945aac266eb99890c890ebbf012103b739f933520ce207c4840b59614627de4eb493296e3ba5aeff33c3738dac33dcffffffff0280518800000000001976a914adc01a9efd60ebbf30c7e6bc2d2bdaf27b5fcd2a88ac80052500000000001976a914cd9f90fe5b4a0003d0c55b56a73a015647e15a5c88ac00000000010000000169a2c6acfcf811ad5d11fc77df1202c53309d09c6120979d90d3534249d46563010000006b483045022100b6679d434f227c1f05567e0cabede2c198bcec5ac780fdc366696585339fbdd102203701843468bfa9e6e5a1593e06c3d218cca9d7d9e95a29bcf14bc45bc4b87c270121029907af798eec9e9421b60634190a0c4e9e2259fd48c45852fefed5d3ed5f3558ffffffff029fd45f00000000001976a91497c5026d2a8f79d11b285e717743168b88f3c0eb88ac0d74cf00000000001976a914433dcec802a46aa475acd7156d960b105547261988ac00000000010000000145860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4030000006b483045022100e2dfe807849295fbcbdd637bc21d3ae6fb5c54e522dc0bd29926126d4fd3dc46022010ab51482b93e066ad7946bf4c9bef340600aa8b108c19c410554e3edc351278012103da29f6e2cc099bf603c50305613d27529d6e2a8a0c7757dc5b148fe8001c1f7effffffff02701df301000000001976a91467c87b8159f81cdc289edf19cab8f3b80a26ded188ac809c0204000000001976a914e09df74c9e44a71868d090ee25ad347c01de3ee388ac000000000100000001a937214679c8aa6b79e385a2f722e0b3b1046286ed28100660ab1bfc3f1a01db020000006b483045022100f2805fb32fce0304763b9a7394dd87c86a21862771665e356aaa3bfc658b203b02200b3a948f51bd115225b5cbd69fbeaa6635316d97a2103f78f1da6245a5968846012102e637ec08527bf402a7356e01b54880e7ee04caa3a683a40d98151c59be945541ffffffff02890b7d00000000001976a914bf7dfb385abf4af5ee8a2f998c04e4a8974f745088ac92f60500000000001976a914ae79e277ea067a9b2e14aac28489fbd5a6e39a5188ac0000000001000000010c9a471a31f6119cdea16b9191f781443f0b27842dd89515444b08033215c138010000006b483045022100d56655deb3e8bcf8cf208679372edfdf5f8d399dfcb2b3e4fcb7143f3abc9bd40220267821c57cbc752ef3844ff5a46c76ceb952024a15a240ceae61bc7c4dd297f0012103c123132d3d4c34c32bde4c26a2189639fbf7a1ba2e670cd1fe393a053c3f6528ffffffff0258bb0100000000001976a91410d74808df150bd217834ecc14b486c55834120788ac82baf600000000001976a914653621945c2fe1aabcaf0ff6a78cc815d877f9f488ac00000000010000000140ff2efd341fdc43c8c5e88a45e2a3f28234f2560c2497d8b0f87b5469df7ad6000000006b483045022100ce7e10fc5fdb0714659e2ed0ced29fde4e9a4a42ceb5257919d3a87665ecf39a0220624524f12539c5f4f4c97cff2df7d67b68d3ad3f0077e3db6602133fa14e4dee012102f808415e680de0148c07c4db4d2a2226968799cdfc4c9d2decb20c67aca351bbffffffff0240420f00000000001976a914d55ee9a20a19bbbf0f8697a51f40f19b869a036e88ac8bcc1800000000001976a914d0eb5c01dbfa363f9750774c5b4f10185e16283e88ac0000000001000000010a94d4de728b23dc9c2d996eb1f272c048125cffc5f70c13f76aec0203816c8f000000006b483045022100fdff65ff849b67e0906fad9246bf8432c0a82d947246241134a192e6256f6afc0220693e5bfcf2eeb1d0c95e5a89dc1c4ad0533404e14c50bc10e4af4d778998c44a0121024bb96b97b76402ca4eb828d41a5da5f25d6b60a70af62c87f52f0139a0247e46ffffffff02307ca20b000000001976a914f0119d3b5391517b8781066872a06aa3050801b788ac60b31e00000000001976a914dc7e4de11b932d81a4425c796da2e81149d252fd88ac00000000010000000170bb356bc6f582587960b82b5cca5a522a04763265fd823c5b28d0ac708ff091000000006b483045022100ba49cc3f1ade7351e1b53d3cda164c7eb671517aaad968feaee36531121d6f7e022014d021d2c34827623a8b963b6277d07e6459fc6f4b12fa983656647dc0d5485a0121029d9eba916f8c3d91587a7cbd42dc4fa3e0f04c9af02c733a64973c89b387534bffffffff028396a800000000001976a914dd5bed484d1b593e8e5340b3b066815b042f70af88acf24de002000000001976a9142aba685cf139e6cd00fbfd919e390a4e7df1ea6088ac0000000001000000018a2665aa6e0927a151efbda6d01c937ba54f09c26e6c319cdfe18770493dd48b000000006b483045022100f39120f6b631d770f8d95a19343700356bdf12524519fa8095ec188e3da95af5022057dcf5d7cda9a332f8b753bce89cb6e9eb30429676d090310ff8fd0a5ff112410121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02d0de6801000000001976a914f0a2f1c67ef4222ae52a14877e8503264d6b387588ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000019f8f6f46f26a924dffbfa7dd7aec6eceff93457610e2b1ed688c95d878ea7a77010000006b483045022100fe8dcd386a7d084022faa5be4c5b927eec4b88e9bdfb8c4d8532bba02bbf594b0220526bf62b738ab326a01a221ffd4a20be0cc88199f7b460188bde33fbf24608fc012103bca51dcc46680e44bd07fd5173d8a794b8af1d6487d504d33880c4a0ac19b48dffffffff024aef0600000000001976a91480cc9eac1269f098ef3cff22cefe9edfd768b01e88ace3c18400000000001976a914304b7a9d53cb13eca39e5f690b0cedad07bae9a688ac000000000100000001776771b211f636b2b11d64c885cbc8dd2f8a70d008f0d44591a9ce65877e132b000000006b483045022100afa3ca2977bbe453982832bad4d306231870f46d8739f7b754f358b63ea1808a02202b66c10a698dc1c659051bb94d30655f58088ef622afb5971dcdd76d6ec697700121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0da8a00000000001976a914204fb49a7fc7ebf05deb1b7f0d556c026f4e47a888ac0000000001000000010e255176480ec25a43687568a2c3649c5c66899e0087005cf57d187dc1eaecd1000000006b483045022100ba76236d62f2f67b84bcee6b8c7e14eb1599c47db0179ea0352504261ce339cb0220415985b1c41c794cea7b4045d6310dc7d5f26eab8c015bf534ad26aec2c922740121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290657d00000000001976a9142ccf5d8ad65fe734d5d99a7cf308d2155caf7f2588ace0091b00000000001976a91438860090779c6df12ea41cbe472359b62957527188ac00000000010000000177f2464e93eb488326437572a0b56fc9d30324c537262d66fdec9cd9e290adc6000000006b483045022100888fcf82556583eb229f627deb78fbd639da3c2697fed0d00fdd3fe7256f2ce902205c2fcc1e91fdaa59a7eaf00215a8fd2c6a7f2fbd91e2ee98fa75cc2ae580f6000121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02201d9a00000000001976a91489def75a8fb788a679f22dfa5345c9f133ea574888ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000018151a8ff35ab872067c2eec721a82e5aabaed5945273d23d8a8a2d333b929eed000000006b4830450221009cd3a7b001a4d2855e4f36b16b4f868bb76bab7e6e1c59c8c15bd232c98ed2d002203b4196bc9f7ab29e7645f9cc1a07ff20f574c45f981ee42ba3eeffe1f64aa8a90121029a53ad741219c815f012e960f4405d18f3a1961f7d649ae81a063a2487c22d6effffffff0280841e00000000001976a914d5abb8ac00c6959c378feb148323b98bd49541e988ac18c34704000000001976a9145b549868035856dee5145b75d27beaedb3edf24f88ac000000000100000001cbbc4e573d773a6165be372ecff34dde39d9e2f7deb7715a2ab3faaa2f8df8d6010000006a47304402205c3a1bfebeef5bff09e9c63327faf69eee827fec5c77a1506f352e57d130dea90220354e4c761042fb2f8f36fa10ada2a7348ea05be39bdf7d99591d94c4e85fa6b4012102c57c3b0a8d3bbb77cc99e148fd32310f5528395126965fec8862679c8bd327efffffffff0280841e00000000001976a914ff74a935d6f5bf9c149f10efd201b7fb9983729b88ac88172904000000001976a914b07c5b35c954c7fd3b2b39daba0df3ef46c7c34188ac0000000001000000014861b3b6a2737b62efb2d5a572921fba6f065f27ec8b74c3b02582c6e5c8290c010000006a4730440220070a23849da7f0f58eb77c025e32ea5ebcfd5c33bf90bf97f479cd49aca3167e0220225d2211eb93914ca0e484dbc9f502e8eb4b93a4ad638d865a97d6308f8afaf6012103e86ddb6fe3df077d839e235730c3818c34125e22b4933ea0dee3561b96533c19ffffffff0280841e00000000001976a9141c41a87d9f581de62a1e7e0dba682bda0383a71d88acf86b0a04000000001976a9147e087cee0c1b74ec718e1418a4a5a5d18c1e08d188ac00000000010000000146da060e9d8586b8b46c684ac68e38a9e37bfcfda8867259b970a424719b2688010000006a473044022032290d6078896c1e58bfeca1f9eaac6cbadb6ef7f9237e21ed9509bb77c67b7e0220669429afe7508b927ed0d31b58740f5e7291ab9aaee5a36534eaf9fb0296af54012102dde2e50ad9e2c5b07fed6b356b76eaeadfd7dc8cde2d868d4c548bef8112aaa3ffffffff0268c0eb03000000001976a914f819c43121750389b394011167a2282a2796398288ac80841e00000000001976a914160f442aafc9e12afe54885c177def530b765e0e88ac000000000100000001cd24089021d9b6261c2052df521fb512adbeff83b7771d6c20176e6967a204d4000000006b483045022100ac02d3ca2301104437335700fc7cb32cdd3b859c9313e6b5ae33f8de89c5c8b402205e60660f2222b09f1727581031391c5dae59412bc46bcfea62459119db9e15ab0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0200127a00000000001976a914cf09ea4634b5bb96c82c06cb97365b5c5f84d22588ac301b0f00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000018ef0a3ebd97f4d897eb643b27e4cbc17233a441c1e0a649b54295438ca18e529000000006b483045022100ab29fd58ee92015b6f80419cc54b879084a32463092b6d6ba5c924e26b26914b0220479ccbe3cca1cef5b86b4cf0443f0a4fcf7b7e50965070991bc9d606efed928b0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0da8a00000000001976a914771a7d1ec15ab698ff58a98eb2fe173c926b22f188ac00000000010000000155eb18e2320fd5a1721b90ea70871bb5eb82a7359fc8acc56e6a73919648771a000000006b483045022100986fa3c5318f63d4a852826112b0bea467d882215e38ad30aff53abc8e40e10e02205bb2442f4f0f2b88b86b2ed181fe0c61ad1510f3df91e7305b594f2262485b6f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0210df8800000000001976a91449bca11e088295c20333dea7c5e8a70b3063c11188ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001816a8822c544a2771ec30dc0425e82a7fb7bf4548f15be7a74ff6b0545836cc4010000006b483045022100cd04d829ff95186c10514ef6fe6723a2a758fbd9539de877814404920f4a810002205327fc7c8e9d07d2671255f985d99457ce9998e9724b9841d6d8a4605664d6b1012103eb20647ad0700e4a20da7674bb7170e4a8b5b3405ff0fcd7a413e42fd6206871ffffffff02b0bae400000000001976a91401f891811089303fb4e907cf55f5b73c49c6caf788ac60ae0a00000000001976a91447fe5849bc4370a754e94cbe4e926ba407b0ab3988ac000000000100000001e8a910fd3f05638d439d1f09338a1df10844a8c305d3de5b2518222c5227eb43010000006b48304502210088c7f1417ba7af6987323610b0c2e922383fc571c03c88e995931165183eff72022056f781eb850970adb80dccf36f3814157a5957738052ac543260f97107a7763801210287b7cf0dd2765905d7e5dc4b30474d21837e8a1ee462dd12b5e16cf75d319127ffffffff029bcefc00000000001976a9147c443d62b0cbbcd3969538dda04e56f9860d0dbe88aca51d5001000000001976a9146e85c2704efeb3ec5064285d9b2406f70fea90fa88ac000000000100000001fb913c3a335f8253c20c149947fbc3dda67cad293b91580b16005b7d164bc403000000006b48304502210082b5bab93f1a35d265c6c6cbaa620810e1cee2437e37a1afc2735aec9249b2bd0220790bc112a0b4d0e9da60ff7f5bc645f15aebe0edbd630ffbc393b8f762a9082c0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02a08f3e00000000001976a914da81d3fa9fd322983ec7e43bb46eda0b0f1f5edd88ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000139da200b400ab66126d8dce55898b8c290c44c797e40597f2dc737a65456c3c3010000006b48304502204a48960591c0472787fafb0ede188ada633b3b70c08f60f25528f6ca915b0ada0221009c9b7cb24a7a0683816c0fb42bbfa4878320b628228573dcc7a58a3820528aa0012102ef66fc53d127bb10e6571c8881a18271c10d039b380fc99e16097353f9236630ffffffff0241b5f900000000001976a914dd20a8903341d9efabf7df4f7e8bfdca05c133c188acba808e00000000001976a91482dad6ae232c1b977ac6416e4acf758d29480be088ac000000000100000001a57af39bab4187ea4c528911c92115f4a297d42057a1c8e569481f8604c85567000000006b483045022100fe9987ed4c19b6e5db66bb1be8ebaead78e0624756b637433333043e985dfd2c02200366453469ddf0db4913b74925e2af60eb718b05cfbac34b303b4316e34294a40121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0c81000000000001976a91451c5d817051928f8ab1330918cc13eb3231fb40c88ac000000000100000001e6da3293d3d761d12f1df1d2efc66ec77be0b37a18a2f0f239104db5b9e1ede7010000006b483045022100fdcdc80ac4adf4f40e1a4bb5817678852a08cbb8c1518b02852ad742d94bd186022066f67b49e6c2ae974551022836c44066e16458231214ed87e6d7786bc23943d9012103895bb384d5fa15aac61d77ca5c9c904e2778e73f798db89cbd7ae3d00a69324cffffffff0239550000000000001976a91443c2498401e674923e0e82e5edcec99dc824077088ac33d46204000000001976a9143b31bd659ae233c28d55d7c2495132eed1fea69a88ac000000000100000001b68f38680e7ea29b7c1c52d032f2b91b99c7d77373019f9653431ec99bb58cd2010000006b483045022100e0d7ab075d1767e38745cb16d357bc3ef140f07e40297f0660b57b277909140a02205f8143a000f2c31ce47dcb2b36ab8490e2505243a1781d8a4bb40d44435cac350121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02c0270900000000001976a914efa8e9a2e71650dd9816a775274908ba460502a688ac0cf97a16000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001aa2b9ff72f22db58e5c45b13c26846b0d864862b4e448c6fdc37e26235000d83010000006a473044022004aaaaba2b6f5b0d763656d8480f835169f28f3020ea52f728074f99d1fc7baa02205e310d11f338eef22f0d8965c5a1a6e3c3e48f8685d4d0330b169512d2da02710121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02409c0000000000001976a914134b26e10583070eff5f3164bbf3bb570fb9dfd088acbc357a16000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001027664cf2072f891cd97627185786e5094b598261a2826846dab1e0d9d2f07a7010000006b483045022100b3c87e3dc58c8439dc8ac8c46da9da2802ec9b2810c281707e0306cd738d915602203a9e6746df994e9666208d98804f95d17c4a2ab1a402a903c4c1960b863049570121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff0220a10700000000001976a9143bb9cdc3ece1474b65eec2bc03397cf8fd987b7388acbe4d4929000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac0000000001000000012478e42e89096f434077404683aba5006ef39a6e7cacbea9e6edbd5b61d7eca3010000006b483045022100af1bd66374bf00976a040a0b0de28786759a3e5a12f8bd689e0fec6fcd032c4a02205903134193bda1b4db186ce3c8201dfea3ad07f8da0db3e79c2e8d44496b47d00121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff0267e50000000000001976a9142f303f7bf98a4dee67e27349122f4fb722282ed688ac47414829000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac0000000001000000015c192b5b837ed9030503bb869c8e277a706f93027d05dbe31794cbd24357081e010000006b483045022100d28312155f33af5157cb2ad7b045679a6b5c4d1e70e83e56ea4bee40681824a902203722d7f4b948c02bb5416cbecfb5d08a9e58e2456a83953363b8b8955e297b450121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff029e472200000000001976a914643e406ad6b41600d727d7763877a7de2a4d937188ac99d22529000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000002352e9e691b3c14e6a50eeb598eac65bd80b6a6ba41259e342af1d3a27217c1dc000000006b483045022100ab046930a42b7b1765feef18445a85a43a64236e55f9840308b3cc1cb96b142a022061a6e5982159b449069240c37bae804cc2a41e5d2c8057cabc0ca6384a25f79e012102e898373018aa6062bec933518f4f7bd6f71b1e21cd7aed6158b544a6af28fe3dffffffffd3395db02ac6e4f02ee89313a7e2da1a97afe48add0a4e234b8bb1723a4aa511000000006b483045022100b94395a3594e5653f7e84302ed01eb3e37ccced20415220f93481ef94453c98d02200c3974d68ab587a902c6794d2206374bd847f95b95be270adb2a07bbe8acc22d012103a9374fe2eb93dc73e63c29d46493341bb5b64ff89c44e196b95ba5ad599028ecffffffff029d9a0f00000000001976a914e71eff250b0630d79ca4e263630e2c61dcb6f48c88acfc4832010000000017a91471acd974894d1f213668016a59f73882392a16038700000000010000000190a7b1919973937bdeba4b3ded04ac1f4a586672cf13c41abca5b317f22f1e8900000000894630430220383461015d8a61997644125f8aa32f6a47b7f1883a26ccc87a5aefa60581c974021f3641c9be6ea61d349466e5581e95fb7687455f8fda3f54a3dbcf693d50ddf60141041bc774d6ec28fa00003f7994d75b16b4e0c3fd6a375ff316ea22f138ba965529fcebf727e6ab36a67c09e69e6c16508ca0c7dd056773f45df9d54c2a12f9b4cfffffffff0200dd6d00000000001976a914e89db39ab753c6d07da5d5992b1105941cbb038188acd2ca5300000000001976a914aecdf57a5136ff9b91e780b35aa36e683203ca5588ac00000000010000000163ba2dc09b3662d6920e6e44675d3623987b7de9a7674f6255ac95c86ee24131010000008946304302200a720d6f3238ffe04fae0de67406525fcc4da257299edf8f037ee912873d9197021f59fa66fa8769a8ff042177ecb8b7776dc5d415a997543901a91c2f6c3716d601410474235a4e0b3a44ad26e46885a8825b943d603f4d28f33abee31b7983245b97627848daacbdb979429921a1788a84d154c64dbe071fcdab4b28b355c04dc2519dffffffff0274be1300000000001976a914e2678d43a48793d5838e2664356d2529f3e5b53d88aca5684100000000001976a9147da1b8948e7c8ee47b5e8689f7ba3c55da0ed6f588ac0000000001000000017ea8f3cddc248338f29e4124c64c337108cea33cbc8503255df96b29339a59eb000000008a473044022069dff4843a106ef0f9349cccc5ac214ec78295b57ec315967c65a13532155a6c02207c06a3aeff15b4dbdaec2cb317080443f30d23acb0be112223e1efe2c7d5592e014104c3b032a654919bbadac9e22c3ac28c6fe5aa332e1f4611cc74614c3ef9eb766e358db4166687d57853ded01a7123cdf6bc17194ae6ff33b4d2034143ffdfaba7ffffffff02809dce1d000000001976a9149521b4960ce31e5f6010ac07a6e98778ceedf81488ac80d1f008000000001976a914e9e8b70f42f21748503da5163cef3bd20ed85dbc88ac0000000001000000019976607afeace5a527f482470379f258c7f2b3769ff202a6705aab381460dc16010000008a47304402201bec49ff689c3644e6260039ecc1f45911cea3d53a1da1a312688bcce97f1e8102206e04074ce7b747feaad9a2f8b2b4eaaf65400115afb73a333632bcc399a379c301410437f693a9a0b48248fe108dd4453a247657d58489e20efc07dd8e1175a3cf8e5dd7d62b61d4030a46c43b077d47629e6bbb0cef82a13fe64632752551885d9dcfffffffff0200b42d00000000001976a914a20c5773dd11c6138cdda12cab6339888aa8eda288acfbe45902000000001976a91489b36f026ab4672b2bb81811a8ed5b56d8bbbd7588ac000000000100000001175aab3689286f34a4bd0679ad47a3823ddedf4c3e24fb8ee670a1914bf38ede010000008a47304402207ffd0790c6979f3eaa3af0168f69af5c62206028093ce32373e460481e087cd002206c3e48c43766af4db76032ed71fac5370af4d894645ebf0540544b3c577e70060141041a1e02b6552ea8edc143580df651dc8c63c7bb5f712bc40c2b74a9cca8385bd7ddcd1d4f1bca9246837ae83e9e65351b1451c55298b5306382fc99f0785bcfebffffffff0260e47801000000001976a914a93411db6c196477f9874feef0ff040f2a396d7088ac30e76401000000001976a9144ce1bad2cd7a8f26576247f20e6470c7a449749588ac0000000001000000012ecee018ad8606d304b68093a93d6ce29f2ff72e7b0123148ba365e8f50de214010000008a47304402200c024e29325beeeb051afbfd8997822eea0e847e28f87aac7e87d4821c33f152022023801fb4b03256ffa58382390484b758599424df370beb1e0c06eefd6ef20ba20141043cced1a91f53030e27cc77bb5b4d09074046503eb6b0b421e8d0fe962d02d20f22a3af5a0021e58548306a2a14ad8bd8875154ae25dcfc3f05a894a0b312af95ffffffff0267b9ff03000000001976a91489f54e6f4834e6e9af1133e99e894b75ce92b8f888ac8e212f02000000001976a914e880d0c75ec4e0b1706d77c95a2861d8cd58941d88ac0000000001000000017cbc8ed7364ca984459cccef1064a1539a87f08077e68161fe3edcc83fdd334c010000008a4730440220184e1493750e12c0424b8a24cc5484861e2ecb5082e4d01f10100b15cb7bf4a102201a8f90350e74fc6b89fa09b990639b30c996810b3638cf4aa6d5cb387fcfcd80014104d7cca46db4d019050091efca2ddb22f84db422ddd3e5412f5047d5f164a03fe4a5f4921b117daeee43b579ad45599e7c9f6a0f3868ba3c14ac3425dc777aa446ffffffff0280c3c901000000001976a9140f435479fdd5915f30d0ec53956bd8f9df561f2588acda968e01000000001976a9144f4c3c6c608695d000ada658741b2c74657a992d88ac00000000010000000161f13dc990094509e7b42f6547bd85a5627e94cd25518dccaaffd04742719141010000008a4730440220190df8b356f2f818201efb0adce267a8983071307ec072e86a1b32b029b50f08022060696d8a18681b6b03ff32f7441f4c57464c7ea69396c41c6e7e1439d0807cf0014104a47a6d2cf0b0ea4378cf6bcb220e5a1e6540cc79d7aa8159944b951bb50de16b694e9fff7de2f82607498b6fdf49637b27897e75ed9fa9b37383853dc9fd2f6fffffffff025acb9c01000000001976a914c6e272e758974b3e62f255fe720d3433acf625e388acd0c5a30b000000001976a914c1181de3d914815f73488beb833ada384df9bde588ac000000000100000001915d175b7b4c984fff3fa34903f49269e70ccf53756469b770e8d089a2ae38fc010000008a473044022047ba8cf3423dccf745dc2d3ad232825d55142366c128a19eef05337d57f9a4670220588914eabdbd27390ea3efc2c1d3930a1c779f272a6ef5d741c71617181dc7be014104662d123f77c12b85cd810b293a8feedc85d0bae17fd7b2828116f83d74ee7949f874319ccf04d555f39b4eb39bcf06f0a9aa8e0c8f9d6a6d00e3f8de141fdb09ffffffff025e762700000000001976a914d95fdf3e2923a6e03d575d60874e141c2b095ab288ac99ee5b00000000001976a91418ad971c9a4b43a3d9b64f04d95857243b9200b888ac000000000100000001435fda4275f5eed149f1583d9b8fc8c241fc3901049f85323a909b47c7fa718a030000008a47304402202b98cabbd0390519633a6b98bcfa65d7e39a4fa667ad8f8ad41c65cf2b44ca1f02203fc590c6861273b7b6851a4c03c5ec6fdfc1b3667f4b1db3a3928fd9996871980141043bff7b473684842a592c4e3a525f4fa6adf4dc9283d6133ac1dfb9d5faa83605ae3a7fcc9ca4e18652b2fcf30ef8e6abad8dbe11433f3b0405bb8710583281aaffffffff026cda4801000000001976a914d86d62ad5f079e0b2df59f3d6a8a9791e401e7cb88ac044f2b00000000001976a914c75b5885ab89d1e965b212c18af6056681b96b1188ac000000000100000001b99b1f9130a9ec8654a4563a44861352356982be96e640c62d2f92659ace8258000000008a47304402200abe8bf1e5b8f2fc9dfcb567d1883bb31fed5ec039320f5eabac6edd4dfea5c302202ce1d344d5bcc038d833dd915004027aaa12180f7dfd90f733a2b89b63103b50014104ceb6a6735d2c1bbf8cb98ac86a913ee6b8c52f176c686032dc6e6cc4051561976962673e5749d123f10f10e0196e4088bf73c8bf6764ffba4920cc138ae3f75cffffffff0298bc0a00000000001976a914339b675e1964b342792e70dd90990fe3f161a15288ac58492601000000001976a9140925d3e6304ec2f4020b36915b0edf3928152a8e88ac000000000100000001c60743a3990c2b422bba35bac463bc362795ddb9e5e1aedf751932fe9e91732d000000008c493046022100c623b5e8b182433eb417e51c4c4c73ff693e59d4cb4cc5f9804abc7921119eb20221008b4bf3ee24a105537afcb4eab724af89632e1f8d7e90d8c2036b0dd69dbaf66d01410458aa045e796693592ad1c0f9787d384db12d01ac21f83eb2dbc01ac2867bad3d9c3079633919ac0929405d555c779945016f7326735590ee7c549f7484a55260ffffffff02905f01000000000017a91459c97c71e18d10dd6c8bece399fad89e51b429718780fc0a00000000001976a9141099aaf36b519918cb910590df0d3deb40a2a6a488ac0000000001000000017962982a879a0d77578c61961181ac576425d9275b281c70f272af6a50cf947d010000008a47304402201a548265fa9ec6d7b5315f2d2044075855a4687fc7daced6e4f3ddea102749720220489a6e9b47307e12d05ab21db9cf72e30f1723c1a197ff51afadf5332fc73b07014104f59e40aa5f1e7cff9a48652e5b956393cbb720ad6014798d852681779b021135df449dcb85f96630931abac99a2b0562c02cbb38403d804a8660a55adda93ef2ffffffff02528e0100000000001976a9145cd816f1abfa4340ed1dbfef0fee040eda04ab4f88ac1a3a0100000000001976a9147b0d09d785f0d04257fdd9079339fd8c3c51267a88ac0000000001000000014109001bfef7efd778d4ac0cf20907d810067984b496bcad2d2b4c4422a5254b010000008a47304402201e205fca551a11a846ecb95bb762165a52668938ff8c804b903a0e82535ead5902204e7cc481397ecf2e77c37ad9332a48b525f9b7f4b8d4927e1259b584e863aa5e014104a97b6a922622daeb24383bbe3b3262a7093a625c6097e9d1d8ac125878df8aa1e7ed8fa7b56436978d0cd8c31d5f04bc4500cfe588e7bfc091457f9683d434a1ffffffff02839c0100000000001976a9144a6d24d0657c150cdffa3e19f5b9ca3fab85581c88acb5c4b000000000001976a9148cbf5be921cb1ae293908ecd329f4f9024b7f2c488ac000000000100000001075ecf21d75905e38fa74492558092853922b95f138e7be73f694a82e6823e4a000000008a47304402204e7a831eb8431dd1c54d0f162138c467eaa10efa5b0af977f54796277aa1223b02202b77d26a497b080bb7e3d62eabe07e5faf8366d30313e1b4b688c0da0aaacc7a014104107c6cae014ad7d97003ad83e0f34c5f63fe6e1669086473e5d4395ad0fc041b39ba269fa2efd33c1014333c7aac3c2943a2aff044b226ee79f57d1f06debda1ffffffff02a0860100000000001976a914aa663ac6d9c21282193b9148192dadf7455e9a2688ac70fc4200000000001976a9141c2ab40b32a5d3094b922fbd8acff705bdf9e68b88ac000000000100000001c03b0a21bf7013368b0e93c4fe6beea937981fabc1a1a3d06c2a634e0a5924fe010000008b483045022100ff3acfc24961fe3dd9e5c462ea4ed7deb84a6a012fadf535e65860568099b079022042fc355b9f02271c053a7a84045927448d6d9c50fbdd4f87e009632b4dfda74501410414c4f2d625ec8b16ba51fea09976170055185de9315bf8ba3469b32e158559801462a08c3b39748084a8e6c87db67aa92115105b32e925f4cfea8e1fb86f482cffffffff02c6219202000000001976a914e5585e30519eb7f088b21c0dfb3a6fbd158f632b88acb96dee35000000001976a91422c5526fdbc3b8a9144703b785a72d5782c3367c88ac000000000100000001deb5fc9c75012001f61afb1ae7e5a9360a4f4b1fbe4f2002b8e2befc8d251c64010000008b483045022100f9557ff4c04207b5699d039d9cf249b2a82364cc3868cccf31eb54770304a6c302201d00fe262591cee5bff049ee86bde08e187913c4c00ade7bdec64815b45b9e61014104aab5e25e3e5bb152fcc112002e5fe132b8bccf215ae9da0316b4c592fb4db306e3db3806da59ace6e3a5475b42416a043123a271841f2b490a9cf2586ce6b853ffffffff02b07f5002000000001976a914db74dc5d8d5f06fd3c26f8bc0db2b47121205ba988acdf7d7507000000001976a9148360d0189eaf67f0b24ea7b289ec61475f7501a288ac000000000100000001ddc5f30f030e6b3e83780b2ba15fbd6f62f21522c1bf9c62492407036b3be487010000008b483045022100d218846dc5e0e9c9437ef012efd838adf342db2adc2e64185d5554b12e790e5a022024d308eb601e047faaa19ce35899d197e13ab2f8b12ac40c28bbeeb8b17957d20141044ea5ed048e7a56f3a4bb0c3dfd303617ef481369e9304e1c3c0ef5740d70da456c84032046b50b44e64f509f41b5db52c360fbaccceed86196710b9a1991ead6ffffffff025e762700000000001976a914cb926601139fd310f000165f492060abcf640cc988ac42a93601000000001976a91454e3685c8893b6d283fcc4b186c0d669c8ce112888ac000000000100000001afadaa57ff0b061f1da58d648ca7e02c63a7bc4df818512d17d053a45f8825f5000000008b483045022100dafe77e266223dd7a8b96940d0dd41a299823dbaded4488f2a1321730d4da8c7022065d1486566e9bd53c7c2a4c223d0c751e127624699858781b303b6f856bc3a7e01410461e6ce37992f76ea9312a79dd9e6694c950508f524abc56fc3bcacfdf8cea4da3837522b8bff5675a732ac04bec84905d09eb7e519f207fd20d72893f6299cdaffffffff02903c6f00000000001976a91448bf8f4b1d3fd7119827e12622fbdf38c55a6f3288ac6f801300000000001976a914da25a9fdae68aa9d8d0a8ebb44aa5892c306f3b888ac00000000010000000188f6595dd9f4c10e7081373170660a6b7eb92ffdbca19bd5b9044e6fdab903ac020000008b483045022100c82e72fdbef0c9bb00454500476141aed10aaa0aab3de4d5bb9896407d4f6db7022028a82c5ae5ae52216a0ec6d05f681b244552a2b5f3e890693799380bf184c91d014104d19d36a81409b86c777d2a2f4e709c7197fd738a5fc33d5c0ccde0eb8721d0597d28713711dca7c26d673180963e471d97a54795bc8e41dcdb17759d89a78ab8ffffffff029019dd00000000001976a9148f289a7eb1181236c68208765ed86ad2673cdee688acac624d21000000001976a914443f12eacc14df374acd393118503e7fc4c79a5688ac0000000001000000014526ac41de8ac46faf8fdb15e0b47d10c0f3279dbc77c392b2e7cd05ad00a456020000008b483045022100feba0ff52dcf44a53b653f5eac3fcf610e16753127f15d5949ca7ee501cbb86c022005a7615da7dc679e4f47937e60cd8da9d31ca199d14187f3e10c1a7c2aa5759f014104d27e2aa497c10a4b9c59cac083219fbd8e71c0b1eaaf77691b63f371d310ae6515069292ae84d3751f63f20c5a84e931fc82a3b21e10e7a04e80a54648da24f6ffffffff0274499b01000000001976a9141cc08e71e20b330a92a570fa6f2f35222e421a5288accd5c2101000000001976a914c818a6b3e990634aa93008edc9d0e86c199081b388ac000000000100000001fe5da73b657fc9c315ec7436c908129947c0bb377da4988d9992695f5fcec4fa010000008b483045022100db639d9166ed6565363e4c4c626817b2a8bec9cf9f391116eb395516c2ebbb3c02202ecc39553a61c63d24a0e285a972b0d85624883415cb50aa8cdbc47e8ee830340141045ecd59c94a3324ae6dca5d2f273429ace957fa5098480c0af23ccd2bb0009fa9e047a5e9e72e5d7fc8a7126850633c75807bb6ef9205b26ee55e77b8261f0e83ffffffff02b0692305000000001976a914231d1428aca537e7181fc5c48912ae661bfd9fe988aca1993400000000001976a9145597e8062c77ca2ac43896e2ac87396d6918287188ac00000000010000000161f13dc990094509e7b42f6547bd85a5627e94cd25518dccaaffd04742719141000000008b483045022100d8bf1a90527235e3d85447c08fdb8c6c1ce11e98f0f8509c2da68d1dfcc4092e022054de3b12a7b572628f23b019ce656f8ee28baf91e5f930906672f05d535d22ff014104401b445c1d3009dfddc7e4090418530f87ff99fa7ae34bae465b8342d2e08fcb2fda7a332ecb3403a362977e132e772bab5cb54da13c0cfcbb8744eea46eaeecffffffff0236155c00000000001976a914b7ccfe33ca650d3dca6d4d042715c3829b695ef688ac8a242700000000001976a914cf65d27fad09c4b45e75bac6dfe3509d04392f8c88ac0000000001000000015600d15ab7b25a10b4390a8bcfd1768bd7f588c71cff0713a3edc8626ebc6d9b010000008b483045022100a5f33d09ce93c6b464865e783d0461393ece97b682a83fd8edfd8e5425f4b1be02201866e91dcf85dcdb7b0562f9d08f31239b197236ddce35dc930d9c58c38d991f0141047aafcdf886aa17dbcb9387abba7d997de1c978130d4fccbdc51f89a84e8520ab2d7a1fed6506b9774fccae068390043181b43109f73502a6f2d05358e5407e40ffffffff02f0490200000000001976a91408a9c60df3b9a9058affd6d796eba2b580b7f9ea88ac6cb41100000000001976a914f8d5af3a7522f923652974bd34bfdec8fab01a5788ac000000000100000001c3fe3630216ea082103792d8783f391a9bad8ad5712d830f07e17e421258d67f010000008b483045022100b32a1074985ffb185409569e571f126c8194d0bd5fc3a964e362e4ee1d9702e60220451bd887ab0292a6dfb0e990bb037ba07e6ce504e1ea11f24b7ecd354ee62fde014104107c6cae014ad7d97003ad83e0f34c5f63fe6e1669086473e5d4395ad0fc041b39ba269fa2efd33c1014333c7aac3c2943a2aff044b226ee79f57d1f06debda1ffffffff02f0490200000000001976a914aa663ac6d9c21282193b9148192dadf7455e9a2688ac708b4000000000001976a9141c2ab40b32a5d3094b922fbd8acff705bdf9e68b88ac0000000001000000015b647a206ebf675a3d4ff2793786f5a1e6bf75f595ef58bc2211f0e7d8cd3225010000008b483045022100ad81f129f600edca3437208140c4b4ba388dae9a36ff75e00a4bf5b74513de5402206b88458d48551eb3ed8eaf652d7b5365aafd2475fbf79124a58e747d14f2ebe2014104aab5e25e3e5bb152fcc112002e5fe132b8bccf215ae9da0316b4c592fb4db306e3db3806da59ace6e3a5475b42416a043123a271841f2b490a9cf2586ce6b853ffffffff02b07f5002000000001976a914db74dc5d8d5f06fd3c26f8bc0db2b47121205ba988ac1fd72405000000001976a9148360d0189eaf67f0b24ea7b289ec61475f7501a288ac0000000001000000016941a70b4b3898d9ee26c15069a741b61d807978093af79eb809e9b4831d35e5000000006a47304402205aafe6ca6b3ea108456bea0f235c3128c293f76d280d749a16c23204b72f64e10220715bebaf7c9561146f9becfa9e7afeb203b13b1b1a44984328e3adfb784effa2012103dc76f390898c21bb9b8b7e53a6c861e03355d6ae56f790121d789bfa44440834ffffffff0310bf3a00000000001976a914d4a2681e7db09391f987d5a0c9c1958a6164571388ac90e00c05000000001976a914105d20612c4f3624386204598176cfb13a48fa4d88ace6b49a1b050000001976a914b28a53f439b972f2db9c9680a005d640e830359088ac000000000100000001e8bd6b9f7e08e9149c1a387c42ba8d19c8e989b3f5cb7ba0c7ae32124f8dfa42010000008a47304402201fc8942e2833e8b2566106eda56eae3d8a9d64338abab46d84b2a0c8af70716c022031ca1ad6c2f6608cfc6a156f80181597a18a47d98f10e67755c096631ff594ad014104551b1e0003bcef0db4819d8191b672392cef24a6d13ca5c8f5f6207693e587e913e287b3bb42c91b3e81a154e8eeda4fa21c410d18c90dae8d3062de82acf13cffffffff022fbb1300000000001976a9143f351045f778e91e337226aab7ab2b2f2135c3e488ac51fef804000000001976a914105d20612c4f3624386204598176cfb13a48fa4d88ac00000000010000000120bddaccb167d5061090abc1f59c8d179d5587f96ff9ef9689a186052a9409fa010000008b4830450221008e60a35ecf2f531c0d55187867fa499193780380ba5976fdc85ca08f3297d8db02201d9e4e25cf8cfa26a4ae760ffc3c3fbb20554e0cbbbd4b187e849f0a4e8fbd65014104551b1e0003bcef0db4819d8191b672392cef24a6d13ca5c8f5f6207693e587e913e287b3bb42c91b3e81a154e8eeda4fa21c410d18c90dae8d3062de82acf13cffffffff027c0b7700000000001976a91441a8dad1e784e4fa4c40a84755843b2586a543fd88acc5cb8104000000001976a914105d20612c4f3624386204598176cfb13a48fa4d88ac00000000010000000337ee96ba2dc1edbb65af690e7ab66ad2518ab2da5c6d5e571126ab32cbb2372e010000006b4830450221009de1d03ae4bfbaed4d5b171eb934525898d7cde7af7a665e7b46588d116573c402207bd3c04993ebc884e41d69798d4fa02db143573b15ab75d1bf9b5a4d6694613f012103a76be126c9d08432406d6e6fbfb5cc03324d9bde8eae7b72b4e71586d4489c21ffffffff31e35daab606346045b3cbdda2ffc435e84f8b8dbae6e34d971433b19febe920000000006a473044022045ace32620bc395d4187175e46f934905b491b178542d554727a33b23a1ae8c002203e1b769f070df327e4f26cb1d9374e1817493f82e7fcaf21c12edd009a433b6401210295db9944bd20a9d78d59f5199ae55b91742ba8ffd555425e97f8f17e98bf1187ffffffff66dc651f87a912b50b5d45110a1eb75bff64c6489584cb262674685092f0ea4d0100000069463043021f1f1418db2a9ab04a62ba8ae948ba94610ce3789e738536f9360f56e473d587022033468ed082ab76ce5fa55cfca0686b67622cdd05a5a994a64018563911c9724e012103a6eede2a81d823f67ee5610256e857182f49ed4444ef8773bb738203425eb89cffffffff0280841e00000000001976a914fac2ad0a0ccd563abd2d15a7a280b4a2f7e2495788ac5a5b0f00000000001976a914ab9b9df8a28ad1fbdb8575130909b9822dd31e4c88ac000000000100000003ed2029a0f24227cc8836c4c730a5924cbe728ccfa0a0e7fdac89385c56a7d510000000006a473044022054e48b01ada692ad9fb5a510c46afe65170ce9f4ed1709cdaa9b82dc625659ef022074ebaf1af4e56f36821dbc1739205b1db7eb2f53d9fac05339fa870160c24172012103d01ccbe0948b2a008db994a68428191812fd5016d78b09fc21d0becce89cb465ffffffffe569f3581f316d7db9106ecb97e39e36afef2c1cf6d235d6e86339296be2c02d000000006b483045022100a3acfc0475693884b34612caa53d04dbd7488db176d7236b490fdce2fc8c276f02205bb5e24576d312433a4f8cb286aebe9f44bc0bbaa348ecc1372994a2509502d6012103fffcc7f657d2a2368b8f58c143276928adcb949d00171befcc07a59f1de911a0ffffffff2cad593a889de9aa8bf6167d5aa0eb2a4da53a4a7d0f8038d7ad876ba5e8fd37000000006a47304402206ae0aaf1b341da94c60715e31abccd20e44d64583f6fafb0e4f6862c6b6ea86c0220745ef223262638626dcca5fb718fd680720889b9cff6c58ce21acd69a853ec990121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0250690f00000000001976a914ee3e38b648a77abfc4ce550042a6f5c3a7dc484888ac9055d300000000001976a91438860090779c6df12ea41cbe472359b62957527188ac0000000001000000024c4052a792a3f325d045eb3ea86b80be5ddd3247e8a7934d6e1db875669bc437010000008a47304402200dcaea399a77c0f2940063de262544ba0e639d4f5b64c06cf79c2c694279279f02204dbdcbb7499871b5c23648f6c12117f3674cec21d3a765a173f2f55f76e8436301410461e6ce37992f76ea9312a79dd9e6694c950508f524abc56fc3bcacfdf8cea4da3837522b8bff5675a732ac04bec84905d09eb7e519f207fd20d72893f6299cdaffffffff07ad7f5112dab5756d77a10500dbac92c24cb1e3dbbc7a4b21997833d18d6c0c010000008a473044022014b1054e1f7733dbba7185fccb58d48e6340692dd26b5fb83bc49043712101e8022044630fdd84e8bc10f109ece092a6c5336ce39497ae30ede2a7d6ecf4640022b701410461e6ce37992f76ea9312a79dd9e6694c950508f524abc56fc3bcacfdf8cea4da3837522b8bff5675a732ac04bec84905d09eb7e519f207fd20d72893f6299cdaffffffff0174be1300000000001976a9146af9d4719dbaed66a164325abe7a1b6db65617ea88ac0000000001000000025947b3b66be0c45300b39acf14af7025cd18340a6910e9586384c42ad7de0781010000006c493046022100b39b66139906089dc1a4fb49aaded039982f0c893c10d2a025a08db9ae37c0da022100eb4179eb57cb7b5fc7d39462d1fdc484262743514807ba9e1cd37dfc485b8493012102b789891a23a8de0661acad50624e6e3a5314b000577380f5d5ff5edd2522d539ffffffff6ade298009d733860c652b3840540a3ee8a2c205e4b0b1c993218902eb7895d3020000006b483045022032b236023b52a0fc261dc0767948df8353c12c2fa75fca5e43082436514d6e86022100a6caf7fe36e17c704adc839450c2f67a54272af36fdfd6232def1e751301eaad012102a50a033b80aa01b6c16ac800cf1b4e03dd3a46e3a959a012e448a39208060a8dffffffff02a0860100000000001976a914e114fb9450ebe9038a9cec050153658ee3e29cab88acc6620100000000001976a91434eae7ac67373d3905b8f1abd159296ef26e226a88ac0000000001000000021a3137d7d9054588e2d67d3edc4d600c5bc37c877a71467f4cd03a17dcc7188a010000006b48304502207bf7d38f7f53e9a256634fa9d938c0e0853b71d2431bd34c1c7eb45e6b31465d02210091855589296a8f2813bdaf58aa8a100c6d59a8b152fc59279b884f8e515aa3aa01210326068aa063bb790ca797aedc32f43ece8c5588a73a1305ff20a482cbee4e3a14ffffffff0d83615355af80421ad4c8162625f5fd381369f8458f610b37d856f92972581e020000006b48304502203d73b2bf889473891d727992dbc525ffadf57440d6a287b4af73ae3b39662df1022100bc8a062f9f551f8b5ac0b5a8d5025e6b3b60fd61a0c779ac5ade876d4116cef60121038655e8043898e5bbae44f1278b17b341feba7218adc38fac030fba60cdb6358cffffffff02a0860100000000001976a91403d8ef00d00bbfa82ff626c8e6af138c705427a988aca6140100000000001976a914708ba668f692ac73f15c0c1734fba66182e47be588ac0000000001000000018a3f9428030026477dfdadb750972ed82529db564302a96bcdc512ec6d5262e8020000006b483045022100b2cbc57df97e6475c459aabe40ea1c463dbe91434369b7582c7b87a7ce4c832b02204bea2c5b4eb7ecb9d1466c5c2b8e1cc72bc74973570e0d6d67d8ad9a465fde01012102850a43a38842d86dc50d4f39c9e7a7dffcf6b718b2bb6f750a0e39fd5c19a048ffffffff0442180000000000001976a914fbb6b2921838002eb814cc6c2e18523d92f1721388acd4170000000000001976a9148e957d54c8bae87d142300e8986f012591a23f1e88ac263b0000000000001976a9148bd11463c7ba02f6db23168eeff16c0a5338500d88ac1ab67d02000000001976a91499a41aa79409d33659cd5358b911d986eda1af7588ac000000000100000002f6dfb10cf8c9b69b32fab43baac1d7e424fd084c104794d01e5e87dadaa7a1f4f60000008b483045022100b798c4a046465ea9ad4c360021f83f5d3fd5630aa3aa1335c034208be1a3114d02201c54e1e30eab1e040708dfc14f890911211f0a3623b7cd22484143eaa0119c8501410420e4e2aef02306e37260cdac1325978a229aa465652a5231c8e906e97c73b2d5303980a7181129044b12d37f288ce5d3d22df314383674b1b78d3e0b4632e9fdffffffffc95e6aa046359353b03bde2e09b17b2b1632c8d52f1d94180a11836ed5b6b0f7020000006a473044022020fcb3dbcfebb2f493c23ad51bd5d49a3bc4671b9999aae7533479994e1f966b0220197860e87aa60bb5f54bbfbc226edf7ffa29d58f10d846e50d16b9b2cba748ad01210386c14ccc47de096a807a20a0df9b0f8c995957351c571f7c36a9a7cdad0c5aaaffffffff0210270000000000001976a914d93e05069aa9afa0a814a9565a1f8696e2d04b7e88ac86c60000000000001976a9140aa91889346e17d2c0d45851f1e0490608fcfe7388ac000000000100000001e47f6bfc50d96edaeb5acd6db4eb08b543a702f909f2e276584b629bdcbd358200000000db00483045022100bc18b609c8979390ba1f111ce54e537c375eb5c22e469e95f8f171c0d4ea59bb022040952b09ababa2bb5816a9e92f7a40bdaa68ecca07c800a81d010efeaa94898101483045022100cafcafdc258dc9a19116cc0106248e23f7904ab1f4197c30cc85a194a61a586f02203727c8bd1f4f5da5e58074cd197b34c112eefba1b37162334d95ae75a510c48c0147522102c65bbf3337d3efdb65bd9a85d848fa1a1b236643a3d18cda669f7f116983d7f92102661b085665768560effe2b1db80ad5084921c0ea2302b509676fb4e9a158afce52aeffffffff0180380100000000001976a914a6bc1a7327cc28126d5e466e10c840399ecb90f688ac000000000100000001a9a767bd57763eee57711b9c5e54bdd8c959ce62d2b6300ec8c2953173045fce000000006b483045022100a0a225429054416e5d19498588e3bafb34e221e3a1623e256e2fc273a7b735d60220759884ff416e165f7b675429054ce914d479b2abc1067c49f3772e88f2fd19a6012103e6a5de49eca7eeec9be818ada1c3c626e5545980bd50b9404ef330514eaaf9e2ffffffff056e055000000000001976a914b46d1b1e3af916966c0f45fe34ca590d6c14d3ed88ac705d1e00000000001976a914ffc9681e51871224ee19ea5874bd15d9095af34788ac56830300000000001976a914989ace22eb7388602a3604d92a367dd26991fb9088accbf22300000000001976a914ab5997673bb1be55088b1b987eb29a0625e3641c88ac71960200000000001976a91474fd1e583cdaa9dec2a60d8ced1d814af57d245088ac000000000100000002a5dd0be69757f1d9abea82a18e0eb45d8dcb441aba0138a17fa9cccf9a9e180fa30100006a47304402204b03c45e342f1bd7e61a0bcccf5ca2b6393e2a2c6b3c112853173c08265c86dc02206de8e374501cab42de1d44f97d8d10a1084c28b4d044d0e8ebfedad1a3958b4f01210320978cbfcccf1d33171b4d19a8c202a045291991e2222c4b52bcfcfddfba26f7ffffffffe34e5377be6c836291255ed6748a32310ee9618339d94a4d351fbe3d46a9b8a7240000006a47304402207869711ec81d0eefe323712a1476b1b4693c7d9a8b461e13a3aaf79103d9c863022070ec86da57388c58db58fac1232631a430c89874c2e6ac6002066dfe28d0497d01210320978cbfcccf1d33171b4d19a8c202a045291991e2222c4b52bcfcfddfba26f7ffffffff01ea460000000000001976a9145aac80abff85a2302e23b5e628462632610cc3d988ac000000000100000002bd08f232639c69327bd52e57157cf4d20dc79259f88a19436a849b930e673a34000000006a47304402206e66a604091a8f95fab67b90280b853f1713a1636cfe9c112c3b040749a75c1e02203a6d2f92f6b53143f2af3993dc27a0ddb1e2b19d97ea20a93f3f991bd616dcc70121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffffe5588461e1ba296ea74342d47439d85c59a4fa0592154b73d97fa5552d5cd337000000006b483045022100c0d835302ddffcaff990cd898a95236099a70297f7f462dab053f9a84169664c02205d88a50f8736af0262704db67c066352c26352663d79178530ff1a1144195c40012102e356f1652142ae4df9cc29b7d4016db02af34b93e455c334e103a904c63a8467ffffffff01f0292502000000001976a91438860090779c6df12ea41cbe472359b62957527188ac0000000001000000020afdc709516ff038a4447555b8af227c77fe44628470ace25cd16bdea0d60f50010000006a47304402202c1ecf1d4d11d8ea117e8f47801488dc5de01c05293b279f3ce3194ba9ce81ae022027de83f9d3b9c02525158bc4f1e65b013d0fa5c5f116392d4fa2b4f9870df8e3012102235535cb00b18c233f241d5a0a6cb4deeb087f02576e221c53a217d8010ea97fffffffff987ea93417c0ebf535d5e480ccd3cb3c0a6eca0d017d459b25ed07fee646e960010000006b4830450221009756cb3972dd8d6d33533cf827d502d673ba8f99cde70cfaf3610cfcbdf0005102203aef8baf2ff0a09e01c63ec489f2a9e539d80ad3b47c430c5c1263277383b03b012102235535cb00b18c233f241d5a0a6cb4deeb087f02576e221c53a217d8010ea97fffffffff01d0be8b03000000001976a9140ea72fefe95f5474aa6d43205933795a2f79af7f88ac00000000010000000289922ae032065dc92995e660d1f5dc1af6b8642ed6551f904593a019eb3d11e8010000006b483045022100f60330abcaf984d54a7d0c5940ee473c829d594eb04889fd52729a36060b57ad02202eea09a906b324e87ea8d4d50b157c5a44dbf5775f27b0014124e5fc0f4610fe0121031b96c5a33ae4c2290567acfbb469c2e38aa3a507e022b0ce131d741d09df22a5ffffffff57bbbe36e1d7f2a732fab127f301fe88e612bd2f43d97a331da8934044225400de0000006b483045022100f49947fdb502027befea1fb7991cd78962d11ff98d1449f75d3f0c50d90c4aa0022002008170bf0c4d7930f7427d72ef9ed4040dd93c6c216adf240f19bafca3d15e0121031b96c5a33ae4c2290567acfbb469c2e38aa3a507e022b0ce131d741d09df22a5ffffffff01c4d80000000000001976a914bbeed08fe2fe55824799e41e6e5a7ffa0d98426d88ac00000000010000000222505cadf7b0a12bcd84e95bdf3777d810a9b89fe38e46e347d664a515694e2e010000006b4830450220719fece6d4d3d4646ca03d3f63430892701c3d11e88d0ab0a27379ad4fae36de022100fa91f3237b10f1ab3eade0447cdbafeb4832b15db21499506f9d9f58d7741513012103a77939530e843c87bcceb6b608a4c7c0a558e937a2314495f96cb8455defc54affffffffd05b32e2dc3637e96da536a3486c2ceb83c7d363abec21c667b3faf19eec1847020000006c493046022100911f64abd7fd115e62123641ac9f3a2b2b925d341b43d9c5ec3dbcf87cdf9d5b02210085bbf80c569f5b999987dd9b25db756725a6e0f5ba921320bb9e6755e2613da5012102abf9fde715d4a2c83287493bd8d808729e1f77287839cdb40a305041fb2b61cdffffffff02a0860100000000001976a914829e03ccb7954c79587ba0434ace2e61323e889188ac96ed0000000000001976a91405d6ebc3a496d89057d0be98c3d11d97a8dd415188ac0000000001000000013d951d254ba757ab945f21db507b26e7a43a877e296c71dcbfc90214da1856f901000000fc0047304402202b41b4478fe1f38657468fe969c0b2aebb12c8fcf41f69ea5e3393c66266f3f8022065c3c2cd9b9a375fb386d1271a010f4d5cce424ce1879fb6b5800fbf43a20a9f01473044022041ab844b1e92ab2a041e5500e7db748edbfdb2603d9675ec70bc03676416529502200be7d9bfca6e7dc8d8aeda6aaa1c811444f61d77b36ddd3891df0e5b018eb2dd014c695221028c1bfe6b1779f9e043658dc3ef94b47ce10c9c43ae8ffc6dd292995b9f21e7f621035119cc8b661d8f13f24781790a6eec7aa7896067f94586b4fd5b072f1e702f7a2103b7f64fe1a246f77042a171a853981b17c1c22c6f25964cd6b9e8c8dcb4c40f9853aeffffffff0280b2e60e000000001976a914f12f309f1d1ab37279230b1db249f2a073666fe888acb0ef61030000000017a914f6283121c52db1bb66f6381be58d28e6100ef286870000000001000000024631f3efb79df631a513996adfffd0c34fb7666fa83f30b76b1740869bd48d79000000006b483045022100a66c749a6bea70574ab3db5b28d97842e0b91227b5be3986a682b1c83b46c0600220449a917b95568f6c831e307250f3833b74bf4d2ca3f32343448ed248b50912340121031b74bd84c16c86ced1b103f4ae1e1023b3709499c6bbbfb7acff3836a5665632fffffffffde7b880ed7d3f7fa952f2b5d48824892ee693374144b59fd0e02e700b9c6f13010000006a4730440220432507729a0b5e2af354fe240bca298b17cedb21cadb4044e6e5f0b59717a7fd02207954ad4d568b3f80599cb573518378c5f53ed33fac1bd90fb43b2e9ea16a61c90121025475829222b5cd426277b01198aee63f19ae0439e2bb303f752354d5d5652729ffffffff0210d830740100000017a91458d3420652b3720ae27303dce44706ebe3dd25b88798921716000000001976a914cce77bd089a3289860e9817c187a7ac9cd80005f88ac000000000100000002489a809f96724f9286b07f6b0b4ea9232eca8fa58b2283cd44f2807d623249ac010000006b4830450220743420fd9fb0e5ff0265a6dfe9e274bb690437cb4be2484c718465ed21bda34b022100afc04b82d5addd799a0cab232ab68955b04e5979678cac924ef7f65c792a4ce2012102666b6dacac68a56b273ec31c7c3fa857aea722fad37cb2ce0e5637ca141b3f7affffffffff1588af29301db29574d1d5f2bdb971c790b90ac435afc1f33f72d40e700984020000006c493046022100f2f8fb7c6baabd98129022443748033a45f7322c48facfa1f70e49fe0352e03c022100b51b50d684faaf8b504ef0fac95a7d1a9bae97a60e3325642c274984c4ea8a9d012103f5d02db24dbc4a2ce2c255c0fa3bebd32dcc7fbb5336a85d0522a692b1532e22ffffffff02e6e9a900000000001976a9149528c07a318ad273d20ffcf705eed7303c83923888ac769f0000000000001976a9144e2013d48eadfdbeb2a791904b828591c04258a588ac00000000010000000208a56e9be90b64b77621aa1c4e2bb0f271f3946cad545bc8a36830ceb8b98af8000000006a4730440220032219f59b9a8c78617acb123f2e239ed0f9b3271f97f33b661084aef32a082002203e2e4556ae18b2b4755396e2576028c252385388d2e3a371c21a4aaca1827feb0121034f26f542b29fa004d08cb1ea2f8ea98a0b582109890275ecb40d22c5b8a2d199ffffffffaa24cf56435160fc4e390cd6919b4490a8dd703db2dae6cbd56a9ba223ac113e010000006a4730440220490fba9edfad3ac78209f5429fda119eab9db939ae64bc078c74c80a0247453b022027444516a1a116f5b2394e20ff262df0076ee4353547d5523cdf0a525f6a9c7b012103f4fc9295bd72824a72d0f8d51a44a0e3cc04292b835c6457e408fd8511ce0864ffffffff0234800700000000001976a914d390a4f6393b4b176b89c02ebfe2ccb4805ab19588ac53291000000000001976a9141ba4320e2b1baa190b5761ab47a0b3d2fd1e0e2988ac000000000100000002f4a75777085a23edd592a10daf63d58b754400462354b191b558bda6019bb48e290000006a473044022048c238e0e59b70b8f960f0fc7ad76206022686c38f18165704dd4af537aac497022034e942bb06f5fa6d908d11a91f916371cc7995404b7e9dede1f5c42603f97227012102951cf786f0db0eceb979fc5789c7c54495d375c6e0e1d9c0bf8e6ae6cc47d231ffffffffee023bdae2d56662505af8b07d5ceae93dc83a34e0ec4589119da10930784e1b010000006a47304402202fca6154229fff0903f2aa2b48f2f798e4cf3c06cbfef76bf2cc7ebae571c488022055a457d245453a084c604ccf984e81d6ff6087692339bd6aece05a38f89d3bee012103edf00c2a29c28eb371ac6f8167534123fc6a86c3f4102ca71983b4584a1f65c3ffffffff02404b4c00000000001976a914a7158ae172d699b5371a94fb8e0abce2edb526e888ac8eeb0a00000000001976a914bc42e27fc16681080bf5af3740d28b7c654f8c8388ac00000000010000000290fbbbf11d7b4060e284f372c0466e5e864f88d94f0bcb32d472e876e65b89b0000000006a47304402206cd4db6a62644271f8640d3552f38c12719871973f699567ac61d08641d75ab1022024a305f5234436fe3adc13fedbe1520d9bbd1898f9189ea75c9e2a508f6dbf10012103639b8126560f13b8da35398ccbd55acdc24d1fb87117f93d42d7b85bfb2d563cffffffff2ec3bcb3ad3959732467d09484d539879c022c819579b82b352ed745eb1cc288010000006a473044022021549792134a8fff5a8c09ccade3438ac886448228842c926c477e55e243af25022050c4a696322ddf585b31035f57b6dbce4d1de7f71874df90445d07eb9963da340121031d6af92bbfc36faa0c952b1005096195b1d3a0c7b6397cd5c8c037c5d3d0cc40ffffffff020741ff03000000001976a914d0b58c0e87e788d353a552cd187094df10c3e63d88ac142a9c01000000001976a9140385408b7cb3adac53978a672acfa2072c0f8a9388ac00000000010000000200d408d2b11c3e1caf274292d694cd5b662bfdb13a7e6a0ac9e945ad935738a8030000006a47304402202a544dceb60a23a85d628227ebf5be3b19441c3c191c4595872774c911b9ac4202203de707d553536f9b1b7c319e797a4e7bce8ad11c8c9d6ada96d781929f9992660121025f7c9ec13572b539352461678c4991763bd5b4754ff8449fd5ce6e5f1dc2fb88ffffffffbf0e16744a314d1916be7a6befcf7024c020f7a8850e83478b611f4f6ff2c692010000006a4730440220104f2814bd61208be32edeedada23ca94740ac394b325892afd86407c4f978c702203b25efb7e95861e1edde129fa4406f72800c46027e690819255cb96dc9da2007012103088398729490255637f591f97b6b91f7b547bd45e63fda780f892a21b4cb3417ffffffff02a0816a00000000001976a91485de29739a33321d8ff0f6eec6c9b30757265a8888aca0430305000000001976a914a5dfca68bbd4fd74ed9924a7453b1d6ff911882c88ac0000000001000000027ebb43e0aa15227e479b0a5d54eea697abd121083c636f4cc962d61eb92c61b3010000006a47304402203ac8fc5b0d72d33e3d1e1714a7cba03ade031d3a098a6cabbf7ac6a8cac370a40220578f556b148ca3f057791f75616c64cee20bf54aeb1ccfdcff3908ccd85839e30121027d48000a57d26f4e621da01dbbe7ce5a6629d1cf0f96970529110ef910b1dac6ffffffff3989d117ebc2a322e7ab68973a879b4ea2510a59be6d10a85985b0832b2358bb000000006a47304402206308feca2d139b85cab359b7e2d5a4700de320dbcccb2d1b913a2b24113a26a002203a47c037a1339595efb03d401d538158107fd824c344a10477efcb0ac41e9ff5012103caf3f19af08da1a9d94c7b307b06c63c6aa275534800fa38c86d6136d1e242e3ffffffff02404a1600000000001976a9149a9eb69cb72d1c95f9cbbfd838d2b3f76e9a3ab288ac30269f00000000001976a91438860090779c6df12ea41cbe472359b62957527188ac0000000001000000026d31d5e7cbe5acda85cd701654d1d2a3aa30a2713dca6557d83c7950ae98c481010000006a47304402202f93e93bf3120c824131d35742c87b4677faae6450ee70da56871342c4ac763002200888fa3f30a9c59a92945acc6fdc511321c8c555f344f9bb58c389014539a491012103e4df69393ca79a2ceba9500445b4d9860db79da899dd3ae703700048a1a13ea8fffffffff0d4d4a17d352c6a493cdef378fb75f614bf5a51282a9964c4ffd0f7815affbd010000006a4730440220527aa56d31729b4aa1c466fcec333e59c71f3e401d33569120c18d9cf27bb644022070d9a0fba7f8159c9755e8fd87111c564d0aec92be08d578c82952ad94f9d5bc012103e4df69393ca79a2ceba9500445b4d9860db79da899dd3ae703700048a1a13ea8ffffffff025cc92000000000001976a9140f8aa8dce27556bfbd1a1e5572cf7bb0657a6f0688ac2a160c00000000001976a914bbd06bfd2978564e890411801b39b5de7186c7d988ac000000000100000002b24759369fb552e01e5076903ec8026b269fa57673157118d19ecf568ca774c1000000006a47304402203351ea83d1b236148987cb2292d6a3c416d58efcde81cf4835a26a1d8d28b6cc02201c4f1542fdca71e9d2cdbeca7ca86bd1721f27d4233a854dc733a7824473eb850121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffff2d2bdb7eb198934401e6f318725fa29cb74fcdb9b0e5e0a7c495f177d3f026cc000000006a47304402206daac33e5a846b9a8498d1941722f49fc018c8c50dd595ffdab85f3cfbf41f2302204fce78c73f1236c11ef75925e2144786b195784b99832d2111c24bf8b7370569012102aff6c2e9136f2fc2791136f91585cb43fb2f96aa455860386fab889c0bb78972ffffffff02c0ca1000000000001976a9142f2060ea8db4d560130f62bf83402e27a3f7c9b688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000296698c9f06b619f94088b486d8f35942e029eceee6107d0f513dd7b3bd57d1bb000000006a47304402202b85df2d5b0ef50ab9129bde72be90cb315a4e8b0d1b5e6eb6f798a2cb7ed001022008966ab8afdee05611dd7be0bc402f7fbe14651fcad5f3b4cca7adebcd422aee0121039fa9957e14aedd82d02d21adf17ef522fc748dd11a45c4558e7df491b31a6bcdffffffffe08b59012caaba42a7087f6866bab135121185c97222c610b355a0c23bc06b6d000000006a4730440220048b2d68e78c543b3683cec1c87a20ee9073ff6a50c3d857111635b0744a8bf102205d41105f11c75fb892a251db34c04c1e4ba8f862ed579c7cbfc521f08cd2a9370121035950ed2e52d1085c1f6b9cf1cfd13371d74e901b5bb7b8560c18e511cac5bc09ffffffff0238981000000000001976a914d0544a6427f839bb4b42fd180afd28ea567ffb2f88ac0d180000000000001976a91420b171f0d7f967e9a72a6c32ebb51df2fc45f00788ac000000000100000002d13320947a66e316d81f15639bab21cc9d797972466796cd331230f5999e713b010000006a4730440220446645355022bc878e165b821ae0f01199351543bc496a5e6d2d27cbbcec3aac0220283e0bd177ac458b68a127191d2cb1af911edef5ceb5aa155af83055fceec5e4012102b9fca07337c837fdf3e900271977c381f185ae9aae62629795a3a7291280d42affffffff3e3e80e5da402e01c5d465befffa928cc58a1a70b712aa8ccf2dc9405b401d58010000006a47304402202a99bf5ecf91d31cef6f7dbea58043d5716b72a0c535a3a405b5f9ceeadecbf202203cc37fec809eedef5e97ebec5397dd55cb76c72142e99f2b9b8754abfb71c421012102b9fca07337c837fdf3e900271977c381f185ae9aae62629795a3a7291280d42affffffff0220a10700000000001976a914b4902236a624916556f8b8aceaa1caaddc998f4088acd0fb0100000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000021ab6e95e6a1658e51626cf2d4cbcb16f7df5a1dba50c5ac5c0b4065c9abee5b7010000006b48304502210085109ff73bae0ce8f3a2be6bc8992c9b6d559cbbc874a83a816a3a9ec562510502202a1899ade00dd6d7ab8b398e2de06966c4a323c6982705be05aa4c535ba6765b0121029022c68dde6664ac8f62a20dbe069d8aae3df03747f7d741ea707b48aec52ffcffffffff364091daa03ce94a4826d05aaad417daa23e4459c7b2f96d051b5d309fbc702c020000006a473044022011010d1d6f13f555e48bbccc20000c99cb2a524cf74d132c45deee0630509edc02201b2e88a2e97220548828fd20ae8560bbb20fdebf88041126df87f7bd9baa9c2d012103d12b1ac47406c8fed02142bbc917749cc9a07d6696f557dd84c1bc86e0922a11ffffffff02a0860100000000001976a914ffea4609d672600057d53c594e205f42c7bad3cb88ac769f0000000000001976a91456d3c8d2d631fca0ddc9a7632b8cb856d967459188ac000000000100000001eb28ae30c5d3f8e0820b7af855b0788a4c5e0d67578073e2293441b687fdb42601000000fdfe000047304402203732a3b0cf66f11ea45e6c9c782be3ed256e4ab5e9c412f6c6648824977e652a022061566450bf04075a33effb56b8090e7ca384e1680a67623a5dc3132a362241af01493046022100c5b057da5191b5e58209c7a03449dd2f10c38b4b13810bebc73055f79e0e19b0022100dc35efeeb294c0fe4778d6c4061b2609a6486372ec2a259238e184d2a25eb4fd014c69522102a6d927876e8e045054ff9d69014de5c350463ab5335299244a74814ec19f85cc21037d8ae2373cea0a4093c00b16d6788dea4616140bf6198402c1a1c21ea77537c52103348ef123f0ddc55db1416780fdf7653db685b24dad28cd9baaa5ad5ed70e2cd053aeffffffff029eb50100000000001976a9145241b4b88c21c3d1e0b2d11462ab5f6a2fce697688ac82078f260100000017a91453943fab41e0c272fc20dd5fc9ae05f08dd5e48787000000000100000002637cbe1e202b0635e450116264be9139b3f7077e2cbcd398413cb3ae746e9416010000006b4830450221009d02a4c8cc99e765a67a7ac9f075f00d1e7240c244138544c773195be12ae348022069a230786289fc89ba17c31cef8730b8f7263d005346e08ffc0907b85671d008012102a60b79d1af03076b056d8ff81f597b811890b24729eef9825615c9d087590a27ffffffff895acc69dc1c74e5d780397ecd233e7b7216955c2511214afbb40048158cf2f2000000006a473044022024a11bb637b4353b14a691767154e311a51dfa9e91b96f1626e198a03119e6c202207986bdb2624dc16eddfe8694e71f640e741c58e3f63f3c052c04b476f9f11a6d0121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffff0290f73b00000000001976a9149c1a709ce2cb75befae335201e42fab6345c12da88ac607d8605000000001976a91438860090779c6df12ea41cbe472359b62957527188ac000000000100000002604f5211c6d9b73f9836e6f36b97f40d4e35c05866e4ff4eba0e43373b72dad9000000006b483045022100ee0a4adc8489e387fac04ed6d0b2c9dd4933f0714ec96913947c68563d34fd6c02203e8c37d835dacfbde9ec5b2be65d5fb2d981b1f8d65d49441bfb8c908aac56b40121025dcd75054f6fd7924430a1ac2aabf221680d84d2c9ed106bd256755b763742c2ffffffff43c255b5b256ca32b881cca5995568d9ee5f49b982533c01fa838b34c3f57970010000006a4730440220232746e1a57cdb50a3ad047464b1a8aa0dca3a1da74762fdc0e6cd1986fbd242022000896d77dac2c645832b84b219cb99f4b3812536fed6091b5b0e4db5e89688060121025dcd75054f6fd7924430a1ac2aabf221680d84d2c9ed106bd256755b763742c2ffffffff0270de4700000000001976a914d5a1708c5ac5aeecddbdf733629ae8051c1dd22588ac605e2904000000001976a9147aefb9b659e52564d4a1952b8c19cade45c11ef988ac00000000010000000207ad7f5112dab5756d77a10500dbac92c24cb1e3dbbc7a4b21997833d18d6c0c000000006a47304402201dacc46ce8be71ea9f05d2ae0750ac002cde84fd268bf1f44e545f84e7cde4a8022057ff9c6fcceadae2c06e1937791945946ca48401120bb0b85833b301f27b6fa401210268520284167fd9cbec6418bfeaa69a6b95263ab6caf50de90bf66233531d065fffffffff1479b5550e244ed919e744422523d5a9c0c22617eccbf098431e7083f4ee67df010000006b483045022100bfa5e22048082957c0047f8b5cb54cc2c7b4a7628b3b787c3b26fc518fc77d0e02205ab51b87dc05d94570bd25bf80642ecd38b79b9444e7d5c8f1a2284b90f818ff0121024e7bed30964a816cc009240f419b452f2fa607f7817b0348ebf7839985d08adcffffffff02903c6f00000000001976a9146cfe792c3a0a0c98efd61f7b434e376faccc364f88acc034e516000000001976a914865cc3bd72f03ffe627e9afe34975f930cedc64188ac000000000100000002d733ef83497065f78e9e4be34e35712af59b3abfc0ab4b02a930290e246d99cb000000006a4730440220573df34812e951f576d181404668f9e51484f8429911ce2e4dbb9b3e01deafc6022024ee33c19718047fad973a5fc7fea69f31df876a0968c7d7aad5f86abf45243b012103ae10b9d6b42375e41d2a46a96024a8fbb06426ba9eac74ad96a52d44b23fe030ffffffff118054709c07a6f1470f0a0dff5e9a3e5cd08bc52e3587c23d9b14d082e5f3c4010000006a47304402204c835b72f876a9f6da1e43edb9374eb8a3d35c61be57c8affa7d4be0bbeb683e02203580f6995722102615a6382bd54ae037b6687eb9414201c7475c7144b781e3510121021db1104763e993b67d631fd8a32972986c469de4bc93e79abbbd5f8385fb42fbffffffff02a0816a00000000001976a91488b3202b82ea6bb8a6ce4ab731044baa6106283a88acb00de516000000001976a9149040b2841c344df3ff623d0eaaf4e52e2ade4f1488ac0000000001000000020aa4255cc5eab10cf63f33448fc15df8d9255cbaacd3e6743ed9b2864eeefef4000000006a4730440220168f76f37c6064bea3632d2d8d9efaee37e8fa596625bddd5d21b45021d4ce5202202ac5b211ad435f7e57f3ed47f4cef0d469a6316608e6174c80bd4514915e667a012103b9d88c1ecb240d015a2ccfcda0d2014961bcdfe03c4baed97f8dd0cfb48d2c6dffffffff22b6ad6133eaef65e9a7ba1491103bd92d45536dfc6cbed40789ea081b05a813010000006a47304402204681205dbb4bbcec817e6de0592d924736c08a31f9fe129ef3c241cf8443a7a802200cc2bc386d5dd0456a21aa8ac5afbb232859f5f6f1ada92f8521b20e1fd4eb5d0121020b1e3c88e6f3d59bd1261b90a7ea4cc6f2a4d1745578ae5f4e89f438fa117365ffffffff02a0816a00000000001976a91417165c22935f0bada6eea263fc2947b65f455a1088aca0e6e416000000001976a914061ec210d7eba807380593791f612537cb04408c88ac0000000001000000020fdcef2f39ed39d6e504b3e76ab3ddf1cae5ef357fc953b34e447fae76ab3cde010000006b48304502210080b4c0833662ff57e079876972c44bf51fb48837b39f09ed558ddd6e1a239f910220792801ff71a42eb8f52e248ad4c5d122930fe2ab80b09ce420eaf09cfaba768e012103e9ed96cb0e760f741bb000694e0290ebecd0bc840c7f335d781661c7dcd2a531ffffffff0b8703942b0d3f00d5181916f975d7d6b5a7332b921178422aa8b80032926651000000006a4730440220350cffdbebf231ba8d782f588929fcea2cd29c5828a86120d8c285925114f87002207847c151ef0eb77de8de6f2883c15299723f02316eb1bc65a85968cd5d8117ab012103e9ed96cb0e760f741bb000694e0290ebecd0bc840c7f335d781661c7dcd2a531ffffffff02d9100e00000000001976a91447c91ffb08cd7b928d747bc562360d3896bd769e88ac89d61500000000001976a9142f27cce7583b5c71d868acb03ac73a4ed8d0499088ac00000000010000000275c5b1d893cb0966184544f8f78f4d049800ef3d51ba6fba4c9b5531b17d0d09010000006a4730440220194a8228db0005cbd9946a483be56773919ca3e68723e0f152c5872861fd0da502201a800ec1e3cb712fbf92c3954047070076a6326def11a012ce6cb3b4cd4fee3201210217b98fc6ca373b5044a68c67b14f403eae104d374615ae7164aca72b8f3d31ceffffffffc1adcfe198c4f7a3d5e2d27861c75cb03ea586f3e1014a2f091a3f80acad1528000000006b483045022100b029f35c727e428829dfbe03fb4048ca42ed32b20a10971a51459169e5f7f2af022038b04d249cbde59f980291e8ba525147cc6f388c77f6ff48209c8380be65d9aa01210217b98fc6ca373b5044a68c67b14f403eae104d374615ae7164aca72b8f3d31ceffffffff0240951600000000001976a914d603e99c11a792ccd42d1390a790860f244b8d4788acc4090000000000001976a9147f99d0aca72e6e6273bb0fb5c73a4fcce97e09b788ac0000000001000000025e6c78b8f667c245c64fb1d0474478e0ccc9248e058a49a065f07aeb1845f6cb000000006a47304402203b349a7cf8eacfd777028e24dcdf7f0532a3590450d6a7c6cc198fdd1f7479b502205a5dfc5a7b28b71f6bc3abd918f77b9b51dc06274b551c61ffcee5d97956d6d6012102f2d6427219459a7f3d80f0701327ed1d46cbac18b492c71191d2dc5a0c4852e3ffffffff968effa108251b148ecebe8cc04ee2ab4ca1bbd14eafb5167db64966aa79a7f8000000006b483045022100e08bcebc8593e2e18ee8c90a72d76ac87faefa240f76c012466186d4c0229115022042fadd9c42d9b47f6a570c91aec8f442edc1d71bca13fcb3f6d791f08909f2920121029b3b1928d93d6647910cede207862966d9cbf3e9202dd3be7f33193b96a62848ffffffff02fe523500000000001976a9148526c6ae31dad6a30a2baf08a719108edebda61288ac58b9b100000000001976a91481acdcaf941addbc6598e550510bac80f1595fa888ac00000000010000000200d408d2b11c3e1caf274292d694cd5b662bfdb13a7e6a0ac9e945ad935738a8020000006b483045022100a3a364dede88d9417eb8be28826837bba4f735c78cccf6c7bc07ca9f47ae48e40220011c08383ed535177c748b72220bb4bb87566292114b996740865c18b6a2a42d012102cd982182218cc8483e81a9b0b97c5b5536a14701933153c203f44385585e0864ffffffffef11c6489fde3c8f26e38f8f701a732b188e63f3c785bc4e94922228939784c8010000006a47304402201e743d809fdde4adfeea9bf58c60edc46477cfb897ffe4ce288a52af9ed8723d0220604b7ec70bb3638c7a5cee8e0364465e8ba82c0ec62b25b685942ecc29a8bb6f012103e61a738968e9bfdba1baa2f60df937f08bdd35648386176646a1b84e60cc27a8ffffffff02a437ff00000000001976a9141d056a8219412baef83f66761f7b5a731efb7db088ac3055f90a000000001976a914144087efc23b69e22f8567b68f97085407c5e65c88ac00000000010000000288f6595dd9f4c10e7081373170660a6b7eb92ffdbca19bd5b9044e6fdab903ac010000006a47304402202d4ef2154a92724b4d88d92ed00bfc80b8b3968a02823ae073205cb9656ec1b5022005682d3ba3617f0ffd618fbcaf88eb092341972c27f085d36fc95a984cb58e7d012103480afd63e1776625a34e6e3725374f2d02f907cefaeac49a99d1d52c0e88fadefffffffff5a3809c204b01f7e8d35c385c8e0fb6816eaac3a0c664b58678773c4bdf4ec0010000006b483045022100c6658f4be327f7063e36d27fb3abf1beda3ad29753cb1a1a985d24f0e7ecd4ab02203cb27100074d4204e215acaffe7fc57e200181e541ce4e65d3abfb269af980e1012103695cd4d4cda0ecffc1fb02d6ef30e938fc547fe6aaf03bb71498023deb189098ffffffff020fd73401000000001976a914815fc57b3d7c354ad62167184b4887e5b022ecff88ac207c0405000000001976a9144a85bbcc358084671e19235231f8613af17b5b5a88ac000000000100000002979a4650eee45fbf65378519f4818366e7bbf7b36708ec477005f0b1b1f4d84b000000006a47304402203721acc3a0f80429505a77f019b5de4cfa48c0ec759e12e84e1d82c8972572420220193f92fb6fb174274a626f9172a4afa09e8c747012d9c5c529936ec2c0f1c6ff012102ab2338236898ab69a5286e8fe5c3ca1a3cdc283fe7d584c38bdb4acd3ce6f807ffffffff5bab42c2d23a54011c2a5b176c928a9524f9d5cc2e928abd17f28b30a6ec41b4010000006b4830450221009998ebc0850bcb1a6f3bb1d1c0ef323bf65325725eb5c83986e0cba666e6c1560220055d005a99e2035682014153c2065ed2805419802589cb3b82256ef69aaa67230121033e3e6e1457fb491ef9caea05dc9a07186a18ff54cdba199cfa191263ab79fca7ffffffff02a0816a00000000001976a914386ef9c107bee1e89d0e65e64b43ce66d744a65988acd0b80305000000001976a914e7a044d4be95e77616cc886ff8421a1f1d72efd288ac0000000001000000027f508c366baf8d4f6659cef470a7d53d3935ebc37854e44f25ee13962943ae19010000006b48304502210086226e67d0fa4adbe7fff6d10abf8a2eca0441958987eb297a53bc95b9e2837202200ef802e4bfc760f9dac9a3fefb9f86ce91bec76e3c3c6dc768d3a97d02fb9e44012103e124716d7ae92d6fdce83c6a9e09fa856e4cf1031a7fbfc8dd8df944c04133d3ffffffff828079d5d035e89f34f21f34b24c91358bb0e5c9c6bf7992ee27e9c3e55ccf6e010000006a47304402204b3a1f66349edd45858b5b5492dfb994aee2c7f8da3b01247fea886af648e4a202204f8996089afbdc5a2627445ec9e523aba10d3bc8fdd1dbc55baf8ee3504b831e012102b36d4cc56a1b60ce6e83179a7d6ccf766a08905abae4b468552439d62c3b47efffffffff02a0816a00000000001976a914f010927111dc57c36e0bad15103ff902f201270888ac207c0405000000001976a91428b859d550b60f738f63cd7683e20e4fccbc238588ac0000000001000000024d8e075f01d385010fa29db044c4d076eb81cee9f3edfea95107f30733943b75000000006a47304402202dceccb2ca0b0c827beeb8ab9a8a6e11336bdc485f8285b0032267d176c5b06002206df2c6c513ff8bdc2f4c95560dbdc707af4bb3c0d4b12b968663b448a07428b201210272cf64a12745a5f667f0dc6b9683935d904b82a2b87ad30bba9d889af41e33b8ffffffff6c8d26dbc1df66c9e89bc2f1e693ef9357b1a2c1c8718ab3ed95b67e6fc8e487010000006b4830450221008c69fe277bde53d4c58454ce79988dda6ab84a5166e982293f82b01b82cb1aea0220613d28378cd0fca023273413bef399df6ba4494bf114e369f83d505932e58a20012102a355c0f9ca1c4bd85b311e7022ae3dec8778a996aa59cb84024c8676d1b27d9fffffffff024e420100000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88acb06a0305000000001976a914f837b82d64e980f2ee90aa4a396813f3f384701b88ac0000000001000000026e8856e41cb25a7f83d9f0e80e9647eafff5734271a6f33034ffe582e7e9d67b000000006a47304402202ce7ab548ed6fd311f97e077ca5040bafb76613dcae65a0e7b4eb20ae78fd39b022015f3e1f02e76e2705945f1eccc3bc786d8e7767dabbd7984003373acf1b409eb0121038f699ad28531a2f289a047109887e7ca54eaf2a1145807691d3865f19149afebffffffffff780999a6c037a53b11036014f11413e47a121311e6d1b708e41b25046d941d010000006a4730440220178edaffdece00939f2ef53770b22ada9a80b6a85c3db70a06fdd30375821ffa02202c588b53297652c2977947760a18fb093edfd30f839f67c0a40890da08bdfc7a012102bcbeb1bd8ecf16341c125dc8cef22ce279cb2f7aa3a6962d3317bcab0df415d3ffffffff02a0816a00000000001976a914f1b982d0edbf0fe2800984b4072dbfa7ba1e456688aca0430305000000001976a914cc2a6c4456efa8a406b31f8fb176767f5008010288ac0000000001000000021999caae7cff20a3999d239c2ac37b33c691fe388093b486cfe60cbcdf2c14bf010000006a47304402200228be2c367747e4d10542951ddff0107a63eb75a4bfdde11ff1cd4187f43a4002203702c888fcd43092133c4251bef8217070431a2000547d0b2c29697468bf6cfa012103a7b1cfc17047b784204cebdad75a74830afbb93d7c93fea710b570f7b7700d1affffffff504896177154a66d9b0f14953e9723eb5de6243af2b04c302b80f1c15fe71a64010000006b483045022100ece38b3847607489b46b130939ffff67316e1df0746ceb217be1d880fc96c43b022039bf5bb9c97e31c994e3415fcee405a1a7e2897c1c3dd10d00a42485b05e067f012102006401aee16b4deead58f198578bd4362400781aa1373410fc3ae2814e698a70ffffffff02e85b1b00000000001976a91439d5fb440dcadbd39a8067d9143b1869491f182988ac40e72e00000000001976a914477971fc8627c655129474bf6a92f0de6dedc0c388ac0000000001000000026b7b73021876fa16c092979df237c2ec45d2661e29d9e864a39df89127f99828000000006b483045022100f2d64cf66df56887c66d17ddcb8e7aacbc99254d51bb4450c5874d666bf628b4022009650c243a6d9ed5aba09ad4ca68b3a61e8b2d7cc3f12e7180c3d115c3d57ea30121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffff7dc4f21e738303c1c6bbf25e6fc07d554ade3c6fbcfee00111168553636a7459010000006a47304402206f486f7208afd1709a459eb5126491bf278d61a673bcfeda8eb8a87fa33075ab02206d91ad84b46e7ba8c256681d16fcaab20e9b229973dc0df6b0c5a7df7e9790800121031f775a457c3c420076a89a5bd58cf366d5f3078fc644356a46556ed707c5506effffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0c81000000000001976a914070ce73eb5b4238e7b3b75209e8903e2939973de88ac00000000010000000215988968ca5719bf744b642e8c524e0a3a4f128d2bf714a3ce69625b3d297e91000000006b483045022100c7d36e911e058977d4be5cf015194552b4ba0ce9b863d1bea755e250f760f2d402207ad8b1764fec18f4a0607904d565d6eff4743486768acad8eff31803d48d22df01210257f88cb0517870c1e55fcc3fa3e838867b1993b05c709b77813e856e3bb2181dfffffffff7613a242d4438cde80f0572337f058d89f9183df8bdc836081fc0e860b58e35010000006a4730440220428d125e9aac377530f332076c3505d548d8bad5cbb2d3300860002914c36e0402200de8b7172bb8dcbd64d896b706acdb75590d807b8a426c907ad45d447294d09b0121036ebc66d5aff1bfe99d9d03f1ca6ebc3e11189ba59033864172f7164041be7146ffffffff02a0816a00000000001976a91499c25bd194f0af99428fe390efd75a70dc38d7a588ac901c0305000000001976a914cb1219ed2c9f0c9a11b6709464a7ff32cac341e888ac000000000100000002b8509867370121d55ffd736c50ceaa4c19d12e95c007eed3db780ed06e1f75f7000000006a47304402204c5b48803b31edeeb5a2e89ffae3d49181ff5bc73da8f1ae315f98d00b4e259c02205e883051380c2185a6aa6f924f78bf271cf601a48e835a64b6036fcb7ea4f7d00121025b85c48f26ac5a19106c39d42e5979ecc66b31f102c48164ef3b84f7c3705d0dffffffff5080e1c8984e0208ca230a2c988b55512a899716178e34476b2e46774a9168d2010000006b483045022100dbc83beb38dac4d38b17abdb0080e741c160f0c6fd160840e4a887ac48a8f4d3022032200ee96c3538ec7343c16b098dcf24b622b0ce9838abb713d1b7d3967a11cc0121025ca57721b3498c782a8e10fe710d1bae2363cd4f802517eaae7316287335ba75ffffffff02a0816a00000000001976a914b41a83642bc3e0867722845009e045c0dad348a388ac202ef90a000000001976a91408bdfa92a6b7bcac61aaa43dbc49b76ef2be6e9f88ac000000000100000002b2f9560c47088f7174e0b94109a8646eb081886c1891ee4a5da1651029db759e000000006a47304402207d90047769423320a9a9595fedbc393f228aeb6147bdc12e8d0039fc96975ce502202af9bd606390b348afb757353cf3d293990b40e65f06f505c88e8d2e7f412490012102808f90269d17ecf4b9f44ab9306b1e594313abc75acc140725a32efba68ff979ffffffff7b5051cf1a7d59cd01e62e87a58c36b61319d2561565a68c211e18da2ad5a28c010000006b483045022100ee9bbc8372ee3f9e8576c455e447cd9564d2812e72595fba27300e388597d16e022032a779876485b2bf7a7d6ba149f80a8969bc6e4889c2425fdb8bedde844f1f3901210377c79f19e84e55475478f64bfe44fe849a16f71068d48536623281193f6501a7ffffffff02a0816a00000000001976a9140911f01392b31961af6dac6512a4a05447c547a888ac10550405000000001976a914148e47bf8fc40f7edf7a0f0a44f7e1a0b12e4f1888ac0000000001000000024271213ff55fd77d67f7ee0c7f9f975faa1d16c0b58df83dcd57a9db119a799b000000006a47304402200d8282ce1530b784f1260e859571a76828a6af7372f0b30ba7acc317d3b6564302202db4f4cfa4c47d0a013b8806c6663ee0375763f77dfe6e5c4d513c1cfc98520a012103866c2e2eddd89b9aeceb4cfce10b88b7a84799e1d65201e93383b4f3efdec5dcffffffff1f00ca1a8c6f2dc6510d63caac6bfffa661b165c1930b90ea5f998a7e493fa0f010000006b4830450220621d408c90b76618125924633dcfc4dc1668b7212fb43c6f2576f48f2e4a829b022100aa1872ad30f3aec0a8f0351f23ec4b07f6be8d92e44433f2c8d9ff54e8f97ddc0121027a577398f02f9f81cd79da218558570345fdaca3e0074eb5e1b6b45cb5188ea6ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088aca6140100000000001976a914e2c0a3998b12953bdf922f542ff4f43c7c9e0fb588ac000000000100000002c786075c5f31d7dd157defab97c577e5fcac791f2df79559d5dd13c9e851d3fe000000006a47304402200e1a652c53f1d8ab61f49efdeee94e2822e86dec02185afa5118397c99e09c50022070f21249760941cdc8e31ed48e5cd9a42b256f501bc6c410f74f0273e09da4e801210395b1e41d8fa1b78df22731b1f0f3fc471039584c0319c10cd5465f1d680bd4adffffffffe7dec6f027c5e60367b60c3dfc33dbc99ab31c0f08ba81db440b8f33f7ff5909020000006b48304502202fe70686fcee4e678d044b50ead1a58bc337551f6759bdd8ddba7744c621dd4702210099905778f2170084f6009a7324d016ec018b33a0db0c642464f03a8526b816ae012103e717b57f5fcd4a29dac75ce9d145e18da81b9b35794a554e4c4dcd8003d2cdb4ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088ac96ed0000000000001976a914344b23758ec64f844f02d3297d0514367d5a153888ac0000000001000000021a20714c27a7080858c0c5b5278a319235c42f4a383e95e363c2d902c7c4fbed000000006a4730440220611e4183e76dac7c4739e0a7cc68de7cb10bb4a3fb78f660886d4c3ba8c9b33802205efa15378cb3b9acd7ce2bc9dc7c1e90b2add78a3dde5b328346de9406c1116e012102ef3227458812b2bd2dd7f246f692be260ebd9ff2e5ad9f53cb79275aa5909910ffffffff05cd21215c05383cc01a3815b0988accb0b8d2cbcdb28561195c52fb98044aed020000006b483045022100f967f1758f3e4818d440467aa69cc37689c0579f9dc91b7f8b5ca01623edc8ac02204e727e700afd846258ca527f8f58898933c7caa9a81cfe98c8282fb18f5b976301210237e44cddcebe1a2eec07da0c4347bff5b0e418d172c1bb32f2a7f9d097da0209ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088ac83c60000000000001976a9149f4fbf3e3470e2fec2aa0ce6a1dee99440e3c41888ac000000000100000002d5cfa6db371dd89d41a07121d3abee951ebf6ed82800176cbf8d38d30d54f9bf000000006a4730440220413588ad17f2a1845d8ab29969f58015900edfdc087b556391ba84884e770da6022069f0a17cabad9ced0e0475085f95c8be78ff802a811387beab40fa3f0f0dd9d80121036964a9afc936bbd8d8ec62aa2f73ac111081e16e4c3aedcc124f814dbe5ba416ffffffffa9b0d8bc1234251f9289098566ee8c4b1f4bc0db80e606328e255ecb4f7c27fc010000006b483045022100d3cc6e4a31517497eab1e7d95d7a66869756e64c42d8648ee8de8d70ebf7fd0902205234226cd13824e40e8f7b58e4d9f6bc58ba638a548a57a5344c0b4a48b06597012103991b102b99ddf9c35ae1c15e9ef6f5764a616b544aafa8bd3d2f11f7e48449a2ffffffff02e0930400000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac10550405000000001976a9148137e8e362940fd5f0710a68018f96928ba8f6de88ac000000000100000002f46b732f4e448e6a19542ed0989d0772af8d72e8152e890b41a26ae1b0768a9e000000006a47304402203a2ab1246963313096df21d67564b9314d966ebdca7cf378b9f1c267c2254b65022023405fcf93530461af685e254783af5a9c47865c583616122085eb1c283cb8b8012102fea54ebe4aa11752f8ce702935bbeb94fc996624f9943b3bc97c99b5499fe5c1ffffffff03f6dafec083f45ae24c61d6b2b3349011a2b3ba7cd497fd408fcb29f44eafe0010000006b483045022100ec97d31ab3e71a785e0a424d2c91f7dc3415a8dce7b4b90cb78dff41884ee0910220329521b70398d1237a680c842c4db020dc4881c6b38ef9841eab4765abdd5cb301210322a797a52a8434dac1e0b400d3f29f21eec6bcbfe412baee2b39e3376d6c60f5ffffffff0280f0fa02000000001976a9145e973386efc0d41c2c14bae325f9e9b886ef465288ac002e0405000000001976a91406bd0618011c3ef1ec53fe3705579a134d4f717288ac000000000100000002c11b26274cd760b83f078755e1244b018edb4cdf07a484aec1ab07b2969ce39d000000006a47304402206c2ca65f6119ede86e24248e5d8198c4a74438affbcf9b7ad70c89333687ddce02203099f65e40684dad3a19576678b699afd0f87160c3a13b78fcc45f96ede38fcf0121029954ff4f448fad13b12b0ad579777849bdde42c2c9d1aa499f49da758b6b42d3ffffffff931e2dcc39c17027bd1dd8df5696df286f0845a01a1a7a74a98a34d73597c080010000006b4830450221008fbb32d4b16d18484ad20dde26ac310b0fb17d346463d58dfc4427b627d8eb3a02202b6ee992dc071bf9f335e6bdf736eefa25157a6d36d1834b8f883ffba7f67947012103d63a701ad1713a661966b434b17beca4f3c36f71744ce7bc2c585d39f60f506fffffffff024d94f002000000001976a9141a7be74c540d63af1cfa80ce51cf6793f00f625988ac1007f90a000000001976a91495303a5fbe53d9cc04c652fa05e62ac63707281388ac0000000001000000023085d1889da0651ff783e9e3ab4f85b72428c44ce599412d37d607707860bf41000000006b483045022100825e098d80742ef274047684f8b19fa6a41ef01d2c60635747060a34f90b0c7d02203bce2f02ddf6cf395b4cfc91ef27cfb4e5ccf80c8ba997543e5eccd9a925dd3e012103bad7d82b3b363dfa1f67d87b985bc6075698fe153e418265535acf7a7af28d22ffffffffe2138af8e35b213719076b01080dae538edd67e0171647f45aac25f8ec8591db010000006b483045022100a057c10d003d3e967fbda3094d008675a56882659c16d429d7fff649b947345a02206655261a08ee60f73fdaff9230028bedfcb07c0617e067fc4bde0ffe6829d9430121029c35ae2c0bb79c9da6261fd7548dbcc3d6144c10bea220cd14615adc868a0a2affffffff02a0816a00000000001976a914002ceeb17ee0df36623388087e681927fe70d9d188acc0910305000000001976a914c7547fa4574ef283c6d6f76298ae7f3e57e286cc88ac0000000001000000021e8357e879c792b2aaa13a45ac57415108cd81324c8c80e7b6f534775973eee2000000006a473044022053a162a420d30dc306b83e86b269f54f78a0439813ead2905c8eeeaf9600b2d2022050277e466d0bcca7e48f455cc1f23fb2722d108e67c47d4fdd6a2c1ec6a5aa5801210349a65d62102fb61e3a09e4d276e7f92144248a98eada25dd7bf3fa16bd05460cffffffff3a46056158443ee52b73ae3d84fecc3c1c8e64f9dfee5afeb3d42f9455afed83010000006a4730440220102900046fc27d1f57039674e6ed19d40c0ef6cc084cf699419bac07437cb6f7022073bed864c3a1e60b8acc8c1b4839d3e1f6d55a27ea9d01083058f45574b16680012103743e51e12e68bb309137ecee2a08506b7e404b42081ff0a4ba13a34a3f5cb6a0ffffffff0253957100000000001976a9143587d3d05411cd98d1786ce378331f58f97a7f7d88acb06a0305000000001976a914a7ba90f8826c8d6435773e42e0803e5820d046ea88ac000000000100000002c482a3f7e2d7f11d1c4aeb42ee682b174e68c94be6c39a19c8ab559f6a4a91d7010000006b483045022100ba3b33077db92a48f2fbfa90fde65eef5ac53dcfd741f6c5b3a2e37159e02d72022004edb88cc6a29e3a085a208aa26cfe2658d87ad0daa6b41f4d7a96aa8d38eda40121035847609306643963d2e2d844f5cfc0f9b76cb69fb9ffe5b4339d73bed2cedff1ffffffff2629c89243ed386ff1cf72db5f0338c6bafc9cd1d70b7c9d53ed46b227dc7cfb010000006b48304502210082abda1148da80864d5094c7dbdc35310765fba74f02b27b1887888411a9be59022077409db3cecf065570534e85e2d38f8dc7b35db27220c9f752175efd722cbe1c012103dbf00eaba88e27f17d9189a8e14052f3429b9761fc5d957330d202d97025057fffffffff0241fc1500000000001976a914f0d429e6d8d8d36c0165673d33b67e4e2f913f4c88ac749b8100000000001976a914df3fbd4149c7b6afeb53a67c7a90f162c6ca7c1888ac000000000100000002e3c3506f3e67cc88f93b58ea46c2fbb0edd096a8de6db87e44eb028c23036104010000006b483045022100ea6c8d0c8e3621b6b30395f81932e5af1542a3226491452e6f5f622cdacc60a60220728dd86f9e8516a97dc07cce71aa2f7acbe8d1f8a4b81b370c624b81138fcf390121024215b3589e7480ccd8629d5c713f283625b47e5aea4c6c841deea8d6e6df40ccffffffffd91d4ee8d48e1c30c31d83b0ab3cfd0f6e00548a225331eeb9092a359c996c08010000006b48304502210091d0e2339949706ecd24fc4b808349840456231463b5d5b13ad23891aa96ab4a02200d744f8de39e6428f729f1836c7b829f24eefa1634b9207ab3bd3a785a9f1be5012103681fc5f02e66cab042fb435cdfec50161bd8515face56daaefd17f2da2c11e71ffffffff02ba5e1400000000001976a91409aa254bb4657e3b21ec7d69f9fa247fa4cda6d788ac08305900000000001976a91419fa36dc4b0acbe1748b49f107a59381d3a978ca88ac0000000001000000027914a7327070ab80e4110e07f60e5d5e66956e720af978c93d1af3f9f82e591f010000006b483045022100bfc1a7e7691dcd7cce99629a5fab4545b74905f448208cfa0e5759f427ee8bc702207ffb0c5db35677a09a0e1017963a9d7494deee271f956fdbfdfed4540dcce54b01210385196dd616ca2f58f560a8bb45af8ce1e1bbecc208210d276ba4d7a8b52d6e8cffffffff6d3ad0129eb6b24cbf5da6a99096bdd8ebbe74b6f76869d80e571543430d405e010000006b483045022100c837d1c1ca9ffb8dfd0dd3fb0702d32049c9823a9ab4b16bc6da30036959f6d40220378ba55837e0c5dc61f21c904228696cdf00f8833faed12bc0a6e9f03c5de4ec01210385196dd616ca2f58f560a8bb45af8ce1e1bbecc208210d276ba4d7a8b52d6e8cffffffff02400d0300000000001976a914a8da469a68ea3583d96096477f64c39708faf98188ac916d1300000000001976a914f0c52aadbfa7f5762fa25cc52cfb51e85e93aa3788ac000000000100000002d1bd66fed81d7ab4cd76f7e78018e0a49858740a7de0082e3360b3bf8056527e010000006b483045022100c04d07e3a1fefbaf109b3d2623339c2ecabde6339343e417f2f2bc861e5bea8c022071f3a9bdec10f0d4198f3d55fa6ded000894f0eff5a880abb63cb731b0059df5012102e486b0256ecea008d8a08f12ca3bc4ec4405bbf094928996c06b23f8f6f22f7bffffffffb887239742339607f1545452bdfd77831dac89f28301578f63047ddfc2613118010000006b483045022100b0119f80160be6146de4248b5b8e84fff06a3f2ee2f0ffa7a342224938235a3d02207be2b03bc292fafa44b7a23a6635be7a32a63ce7c010d93df8652dd2bf88241c0121023eed42e6dcdc67c3fd705f550e52b46b3c3a28996070b32810d89b5ccdd2c825ffffffff02a0816a00000000001976a914d34efeae030a6205ca0ac732265135cb2e81276088ac80f50205000000001976a91464e1ac56c528361df4311a3a8b5a85435af76d8588ac000000000100000002bc56cccc848fb8d36da5137c0651dc76344524238105168203c4c77c451e348a000000006b48304502206fb16f4d7120b21b91fd5e764eeadb111dc38ec7679445b101190f231ea585ec022100f8f7708734757d7061420fe44fe817b00444047cb374e8841b9cbc3679362e330121023ebbee01e320256f627472e0ced6eb286c81b91d8d04c85946d7d94ef129c944ffffffff46c00e2c125416f55a3f80970e4c25ed1cacc38c962e7d47f30313917d3cf54b010000006c493046022100d80a9f80adde5743df3c434bf942c9398239618789afb4a441b0bae966fdb1dc02210081715bdc4e9281e745655792cd2c0df92b7fa3634ed7abfca60000e8527e6a040121031afefdb3aea29c87aea6715db312ec24e121c25869db8a63e73fc101f9618ae8ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088aca6140100000000001976a914d430b47b98608a0fd19b464141b3af901d2b12a388ac000000000100000001f8b80894ba7af99d6b17f16e34db171dcf84581da6b063376f9f6f54f0cdab24000000008b483045022100b93832b4c2d5e7d1262b21f850e76cef0866da3198d640d00a98334f671627e5022027fd034f97df2a81a61d80a9cf0853d11266ba3a4696604b482cd825919d98bf0141049e49d2bfecd21605de70bc503564344ca1ee45afc8adfb28656cd4e3325ae5b960a8241946734287de5215c62db9c3a4bbcffca3c7dae450a292142c119839c4ffffffff06ac840100000000001976a91412f4419859dcddb5d4d62d5f923ad6bda4c9db9f88ac6b040100000000001976a91415f3df88eaeba96ef97dd032645eafce0fefddf688acf0490200000000001976a9149c6bf207cd1ee30d1563b3b92d7523047c9ea32b88acc4fed403000000001976a91462686d5293c035838bb66dc0e04d380986e50c4d88ac15160500000000001976a9146fbc4ddbc9ae0d03465d9080785a029c74f93a2788acc0e1e400000000001976a914634b70f3c673e77a0febdf225ed1b0dfdfdc922188ac00000000010000000289a0948a1159e49be2991810a3181c0e76f104e991a2ba8c169cdce977410819010000006b4830450220152d2229317d63df460dd75a3b57962ae4448c48c1f912ca6833cc23a4df888a022100c1e4d403c743855b52d66f934ac6e0c096fafddb118d02f4dee160b07e8c91010121036fa2b565e6e89ae7be49c13a262c78090ce175e34c83137e5406acccd3fa55ddffffffff2685e93c245e6f9d01395241a09649da17edd20fc6c57895cefa03366db954df020000006a473044022059eeff76a500422300d4f72d9344f620fb9146f0d7929e166e60fadab849195602201fd1fbae2bd93b431f7b5b98c279a399f31f9d878427c1b32073e6d1ca5204960121035f936caf2cbd4621258c91648eb6670456039dcae2a63af9b6b074c0b259d301ffffffff0330ea8901000000001976a9145eae8b4267bb430c9ba061ff057c64ec041a707488aceebb2600000000001976a91494a0509f4e6d51c188e272acdeb792a5005f007788ac8bed0000000000001976a914ce8b25fae65ab92e27f2c4241e1d347398fabdcc88ac0000000001000000022d23d6a723e3265bd9d29237a2b3dd5614b4a047c298559f5b86603896cae947000000006b483045022100d7fbf5a9b6aa624a016e1ec3a97ab0f049d59128375a7255a6f65cc135608ce60220599bea73688398b6d8c19bcd28b7caa355fdad1d63c0ddb84d53c10c948446fc012103be40978a2d67087a9661fbddb819710e9eb9ed9fdf8755dcadbf96ec9c378d78ffffffff83c4107f884b5c6caeb2aa68d6e3ff77a664229ada5522908d9e14039a8959fc010000006a473044021f4d0c8a634d4d2002c372d00eb8752016a353aeed989da810a0fa0b75d04b01022100cc26aeee7821e7c61d4be101dd42731154e14abded80d34ce760675e4ab2c286012103b8c7ba97104cb235a36a128f6af372ab10b7ebab8dd9ee2c6286ef18275a2ea8ffffffff0230ea8901000000001976a914b74f3f01b5de6ac1f936191cc8d671dc0a8676c888ac8c3b0100000000001976a9142744ef1ac889dd840155b6eec2e3bf7974b1053288ac000000000100000002182c844d3f7aefa3f82e1d45971d707355b2c4e5f4c08939cc049bd792996cc6000000006a47304402206535935bd34578bc65ece5c3a73d0e345eae633b194f5c60dc0b3226e7309cae022045877a292a3f8ceb3152004cc5fd38df8646d011d8d8546c9b6a62c68d386198012102ce098a635247d8defff83a9e9979d33e142be12f16b3f3a582f76b0a67b6fe15ffffffff552478ed8a603ed609950e8a9ac513f153fb98b941732807e5583fcf1defe686020000006b483045022100af56fc68bea0514216f32507de5374f2ab1af386799b642044036007f295d3e602204a5ce213ee36499b62682282c20907f2b11d8dd0a5dcb328952e9aa34061258b012103a594e622dccdac09d20809d8d948c4110edbdd93ea640c3ff49a0bf5ad77c094ffffffff0390d4a900000000001976a914a04d2bd01bbb08b85b832ab10b6221e1b62eeb8388ac56150000000000001976a91495fa0f5cf5e377281a8e3909f0065abb33db77f988acc6620100000000001976a9143c8e7d9e535dfb641ae29f8647936b42ad03f2c688ac00000000010000000541312cb01869e8eee96368c1125b7d91535e17bb06798ad98f34a3e386e0f220950000006b483045022100c4c1b7c729500d73ab248632ca9b4819251d14386dd55ef1f61751103e158d5102206b09d5782e820aac90ee919fba9c17c2e9092581eb264d74b71d9a86ab274c090121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff5d0232ab5d44235c6efb2d9ae6394f4a49ced3ab40cf097d4a372dacde0ac00c0d0000006a473044022079beea33f9b1fb4e64eca165942cc4c323ab0356813a70a61ff4228d7d3ec974022047cd16c6655fe09cf3bd2ef680aadef6a1ffa9a32e0a48fcbc4764382f8cf0a30121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff6883c7480f7b8f160c362af655d21aa5c3b05da17db3ee50e2c45ead64b487586a0100006b483045022100a9cb3791411f06ef1db4dfff71575c4c67bbd4c896de608be61d731cf7289dd6022048a074e209192190e8343aa712457ef2cd7095888ed7a566b8e8a6e1d66ea9b60121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff38aebb7fe315aafa5998c30ec4c87adc3cb7f5ed9914f28329a69f5868acf7fe140000006a4730440220209d45e2c5af58540ce3b3da6c78153009b305b045663a155fd57edc39d0553e022052f92b778f2f5b5effe156b6283ac2518fc1ec566a4035bc15a45f9294579a200121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff78778be44551b3a9c75a7f34e09c2835e20b18b7482d1746eb192a1fc957205ddb0000006a47304402207fc9bc2725f54dbd085d88e61d5922576a4ac6c2095ef53178d5a0b4e2ce715e02202e6ac78aea942ed9c21e14046f44397c38e8e0c103531cd080fd481b6146006d0121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff0250c30000000000001976a914e3e823e34f1abd9338dcc023f79fc830355b500388ac50470000000000001976a914b9f7064fc7bd10524f315e71956e0f99e5fa090588ac000000000100000002ed1dfdfc257a05eee55d7833522ff33b6afb3335f84ecda989ccf4e9e8cf10b7000000006a4730440220023f200081863df828758661b23750057954f8314f82315bf47e974412c3aa170220171df25777edfb4901ac766b2e8d7b249fa5ba7fea7d77ee5e87391ff6a57b940121037e90215017d835bbf982db3ec66e374b15524b5bc6bab254f36be25a9326fd3dffffffff0391cdb7a8718230ecdd8ada5b1138b65c29e0d64d1284a4eb1fe1c2a22f6a0b010000006c493046022100a354dc0132a6fbead889d9215c4c562791f6a733ea30c843b2c044506ab20ad8022100b51d8a757747be847f63baa551f0b3aa040dfddebf933f949faedf3efa23e32f0121022783ed97ace50a02111e2d687867c806bc723c22e5eb03b9c161b4fab3f9a863ffffffff0300c2eb0b000000001976a9143e6b6a70acd10259138599f7472f8fc97977899888ac95d43706000000001976a9143e54344264265a455002cbe159b0787cea39ac2188acb63b0100000000001976a914c6485a95e9f650fafa3111e412aa7f9a6ff76cb588ac0000000001000000022e25734283e4d31883f6568d4759ad8b59584869bcb84c755738a81e323a6667000000006b483045022100b33fb32e83d7e617d54ea2651ffc8b9009369daed5f09e676fc94dd4f55f77a80220141ed28bc68bcf41458dd166658137b6c9fa8b0cd8d1972b9d4bae124fcf5ff70121039f2a6031c9424202f7cef8b7b12988dc2c56b38f6daac9fcf780c97b619ea3e3ffffffffb13723bbf42ae5561cf3f466bcb4c0df37dccc32e672c7f86a8840017d009a1e010000006b483045022013e112f87bf5fc5445fe79b7f3bfdaf38a383bedd98f9bd56b4df984b71310e8022100b5133b073a783a9276cb3a896e4538bb38b1a82dfc6e141f4227d76c5039f48e012103ef5b44ef71910d7d33fa65e10a064190d79131d3a7526fa2fb18d370266e6c44ffffffff03f8b35d05000000001976a914e2950025e72cd9ff7a739daf8c63fa3c077e4eed88ac082d9800000000001976a914c905ed076ab36f9222d98f1293a9b5710554f0d388ac8bed0000000000001976a9141772488b619b5d385f559c160085f666da76d64288ac000000000100000002c93112ecb46b1b6edd7e7c21c1068a613027914337e434d3db9999dabd4eac16000000006a47304402203c6fe4d398bef623766173066a0dad9e32c43074c70d23f95974619c42789e0d0220355b4d9f94501f08827c6d34ebe1d7afadd55f7c12dc9112ed8eab395495898d0121027626b22d756246bc29cdecd6ec403b7bc05da3e428240e73101c1b1fd7f21056ffffffffbc518d87579634c9f199a6f3c9b052292e81cb9e2202b77938a518851f482c81020000006a47304402206e6d278d280580ce09e2c23c935d78fead2196bb5e5c3c0f4b2b7c22d00057c0022040c304d64bef92012bbd26c1981c03f5107d58c24e4b10a3bdb36501133efc460121026b177e551d34e63cbc7475f445ceb2734d3f608c9587e95862080c1931a98613ffffffff02f8b35d05000000001976a9142889eb319b1fbe0ec4827e4011a9bfecc89775eb88ac432a0000000000001976a914d8db6fc311acfdf22cb92a92a4b968f93d44571d88ac000000000100000002b732ab5d0ea01c1b58ed88fdb61b256ceeba317c073a74adfb58c21b91c06c02010000006b48304502203fd1b5563646d4a89241754a2ab181f982cf66019fbb5477d726424ea80a390a022100d9340ddc563e5882ea42d8816022afeb62caa59f3850a996d698d21de20e50b90121031a8eeff4fe549081d5381028ea9f2531e968932c730df9398527d9b8d1ddc26bffffffff13e16b0440de0e61f5b152f309a6f55b8639abc052020ef4fd9d3397b659d1b5020000006c493046022100e438f42104ff6d659c74de1a53e06eb63d6dc45bc0dad5ebcd8004f414c90e7e022100cca046e3de284a12f94431fb05c74b221043696627e1aaf8a16e087f3d03b29a012103b901443996926e27e51250587739796217b17b48cda392719a058c51e6dfde74ffffffff03ce9e5d01000000001976a91467a8ad6e235f23dedcf6cbaa465e817199e8d1ef88ac1aad0d00000000001976a9141ee89acb1fcf1a9f3363eab6d9624182da5b275c88ac1b4d0200000000001976a91473fb74c6e86395a5a4ad8cd1d257e36b7764e69788ac00000000010000000279d499e9fd2a66b61011031bd603897c8fae13ed3bfc65e86b53ced1e5f80ceb000000006b4830450220412846d13ac134ec893861c3eb454addefc5ed5e966544e47fb527d01ab3d34a022100c09bf4a7bfccb52b5b8551a4971b9b0774fac34523e590a5a70667942c539ae30121025f525f29817a6dd70a81994a34994a4d520cbf4007da8b14bb9a92a6f406a67bffffffff9a52481194ef1c2543ceb1d67cf490a29950b6663b110a5fcc8b0cdc7cf3cfad010000006b4830450220715b7fede9cf2c4d01cf5f3eae17a749200774706340df0fe8ffd169cd5566cd022100a2a8dff19c862d49f9a2626b8722b5fc10bcda792f64bd6e92db579af0fbabe701210340a6adb52fb0954c2bdebc47e3abbc857a83c7764c2b3faa557d9fcaa8957f1cffffffff03cc665801000000001976a914ff4b571a127127f8f544b7fda7caeec36aa78a4e88ac02380500000000001976a91499a32ce2a252df40f33914f3f7864b0aaa0814c688aca6140100000000001976a914ee922dd6e8b1d2d8a574dfbb489ca5b5b9982f1888ac000000000100000002c388b60d014270443e0a494c1877fdb61a75cb1e7376e03de8dd5418314640c4010000006c493046022100e6cc7e6298315f5cc86038c6c898bee65dab860d040b4dc7b2b0949781084f8f022100dace8e79689b2dc6965792f6a46a8cc91a7835e7ed438675e20a33cbfa7598f70121037fdeca29d7c527a18592af21ab5359290d4a808cc7e1ee31d7ec44949a4a2077ffffffffa68f29883331b94eb04cc601f7790e1fb4672333496cf750cd120494708b4459020000006a47304402200e6846a95544618e4d586efc9759589a7191ecaaeb66fc02d3178337bea6df9e022022a054431e43409698f9e1bf262cef80f59ec4c164d0b93e448f9fe91b3b4b520121032eb22df3cb89640b05afc6c480c6fabde5075fa7769ebf703258082d604afb7affffffff03886b0200000000001976a914ff4b571a127127f8f544b7fda7caeec36aa78a4e88ac7acc0200000000001976a91499ac65489e64a3f34e1057310be80856ad7d8ae588ac769f0000000000001976a914faca4ebcceaac4cfd42241d1858a2d80dce2b03a88ac000000000100000002c54d185ad1537b5f762acb43d0603b884aae69b99b884fa60c3da61f4f119343010000006c493046022100ddef0735487298b2976ef6b46b12fd658f61e378a45b7a2514610f9a026b93e10221009315e2b254cba47b4848d61d9cf34a4f623811bac6f637e73a8e1bb60cc21315012102e16b6bb2b9eaabc707918a5196e6a4fee5cc8ff71886c68e45de67e5ba2d062effffffff3c84944cca1481c0a2f707df70e402a12700f15baa6eff71b8dd757270e429b7010000006b483045022100ba90e20a78f9262587930e586eec1cfec6944d6754d1442645081feca5ed67e802204b942722f773d7bc6bfb552b03a6a709b3e0a469a2b32e4afa0acf40c6f8c9460121035eed887a2bd672f9c366e6f8b0b2f6193dc071f1a54d19b558da1bde2917073fffffffff0320a10700000000001976a9149c6a61169c66570f84bf1158ab25d1c3973d831b88ac74a81000000000001976a91469fa4c102148983da4c6e2edb95df8b5183b37dd88acb63b0100000000001976a91442fdcc754031590d4ee0d0641c5533af44fb07d788ac000000000100000002a47a706bc98ca88ca0028299e0fce33b7c81ac35b6dc7245be65e11cd004ae87000000008a473044022016db594c313dbeb1a0325fa8fe5093b9e6d23e1da227d6925c1e4661ed531935022063d7d7d738409da527c58e1c42461938a90ca8ce85c9f53c56fb249e84b2af2d014104f3e5ff8ede92ddfb66a0551624533d483617c54620eb3c34099d6cf34ca900d6e53b591adf84d3cd03491ed6102e960decb897fefb10e4f2dda3bcdd5ea8a3aaffffffff8d1cef0b8201973a09a4ac2af7080d804c2fbf45dbe05d64e655b116c96c6f7b010000008b483045022100e2b518a467153d3da730c34fafaa14322860cfa01f96a6d69cad6d61307285d902202f6400f04589aac6d031f30fb1c52fb62fe0ca50f2f14658c00479e5ad6aeffe014104104abb084087992bdea1607869e025713d3a6d0e3fb3df18a644cb65962f42a770ba3fd78103e1ae95daef4a316fca53ddbf32cd3fe25dbeda1746ab5219d7a7ffffffff02c0d8a700000000001976a914a081c3442ee3ea6308bc63e09a2e0035cf674a5e88ac8d259400000000001976a91412c83b0b7e8c4c0e29083c75051f17cace3e4dcc88ac0000000001000000024df7caa06951c89acf1eec8ba4d341db54317f332fc69bed968031d46edf9a80010000008b483045022100bb88f9a03e3773a1d77426cf034232a04a2c9585307a8a9ac6b9607a9e5c39f402202129924ea267e7a1835f04917fe24aea3045f2366cd65202247e6ddd32ca3e7501410403a90d2402ae72ca6054e35867909be4d819585d1643440b19f0244f3168513cdf3965397de743c4e5d522ffbdd83715f3741a8261f26a83c9574aadc36ead5bffffffffe00a39ef50d6d125850161a6c9e4da6f9a9a8bad8499ffea3da8e4a6da2972c0000000008a47304402200a9cab29dd338232390f1ccbb8ef4596f125bfc04cc3f6655c50e92608963ac0022072f167e796c76ab83df88de4ba42df4931b2f50d5bdd52e4383dbfa14593650d01410403a90d2402ae72ca6054e35867909be4d819585d1643440b19f0244f3168513cdf3965397de743c4e5d522ffbdd83715f3741a8261f26a83c9574aadc36ead5bffffffff0200a24a04000000001976a91450ef40a87ad99ea74722d88994dcac51f2ec26ed88acc4c80800000000001976a91436e71badefc6a8be535d4edbc452e884a431c3c688ac0000000001000000026af5b7e13e61c964a1a591ce415ae8e1b5456d9b8b8d1aab7ca70de94ea0be14010000008a47304402201e3bb5670f7cb52e783fe9fb3776353596ce875fef0a7df386477aba37bad0b80220129ae0a003375eb2995e3c1a155af199186017b0b0e858c0c6558914096bd3f90141042e173326aa9b7c4213256b6872a00bfb73de07691b7df66b368e52ed770168da2d02f6aff2ee18d9ff981308e207d45b40aa361d61328e2a074a78eedc734043ffffffff0915901c15946ce6a7feb1aa2bf733e768ab478c203cd93b8b0d7788122326ee010000008b483045022100f1f0b11f96a0e11f43cdc756bec353f3287e56c76a8ccc4c105224e6fc41a34e02204e8d20e5381f1f330e67f6a4e6b1e4595239bae32cb63dfb097885c795fedb200141042e173326aa9b7c4213256b6872a00bfb73de07691b7df66b368e52ed770168da2d02f6aff2ee18d9ff981308e207d45b40aa361d61328e2a074a78eedc734043ffffffff0230300b00000000001976a9148fef7e2d9c96c18533a3d2a86dbde87fed28272388ac88210700000000001976a914dfe4eb687a1c6e608faf810c76e63766640eb51188ac0000000001000000022c67382f2c18b7e34d504ba1af4e297a700b1f133f56251d0ace9900bcceecff010000008b483045022100dfcb00149cc1a5129ec85843df14b88754a40f0074a46344bafd6722cd33b68a022040f0d75c62d9c54fd95febc368b93b904bd123b3820c842b0804b780ccf67e2101410456f93e174a31f1057aba0d55dcc048a27379d4fbd340bc11e1f068f06dca0b515ae1816eeb1b5356ec865d6ff128eb1fc894ad9ef3e19ac7f6dc8bb0ac850800ffffffffcee4fbe04086954b39c47b10e859c586f6d56136bbd97bfb3b45d531ee0f5ba4010000008b48304502200d63d542e7f5678428ad6470a5c5d2a383edca12cd24c26cc0dc9d122cd5f9b20221009908750817c40d0483fb80548f51420849b0312a950a8b69ebe2772bccccd19c01410439bc6f1ce847b4372a9a542db9f9b750d1d98dcfd34bbfa8cb55370142d2c6433cf1742a66a1e3eee630a3f38a01e2acaf35e672acacf5dac147860becfc50e3ffffffff0200e1f505000000001976a91403dc89d6b8ba0d84bd68454367d0e6a71236141688ac04dde61e000000001976a914d8e14814f57c99df2a4b628164e88f67dbee8b4888ac00000000010000000277199154804960888e8d0745d43d50a937c82a1ae5e52ef70ec675fbdabe4856010000008b483045022100d709923a67c0ef12c61b70f02d3742367359d6ed1fdaaf9d134c4d6383a0793f02205b18fa9906e34b8a8f6374782b81b8614ef4e39d131551dba13c591702968363014104d2ba077618648729173247b68aaa2b6c7522eff5c7d012c1281a3405555d1cb7e0d15295c4b1c690e685ebe7a8bc4a1a1f0abe435a3e15f6136d241ff901ecb1ffffffff0e98d330867b214019556062ace520160707b8835e5b45620d2f447f6ebd78e8000000008b4830450221009571e578dc1e28217731a943e6becc3ed1c907f0cd21b3966978605c06127783022000d8835f8e8f1ed6750acf4d3fe5aee5e97ab915af9649ebf7bdb4cea0892679014104d2ba077618648729173247b68aaa2b6c7522eff5c7d012c1281a3405555d1cb7e0d15295c4b1c690e685ebe7a8bc4a1a1f0abe435a3e15f6136d241ff901ecb1ffffffff0248c54100000000001976a91405f3f88de8ec806b630f616744782b4a556ca30188acb32b0000000000001976a91438ce5195fc77c5f5eca8d8d7968c4d1da01c8b4288ac000000000100000002acaa643ce3062f048dfd839746485db87d32e1e7c804fd985692237a5d030170010000008b483045022100893c99955c92f890dcc8385db3679b9b0871e79530abc66c933b0efdf3a7737a02200da09a1163431589ae7d40c0c8a5250b6d57a6e233688242a6e47b116264c4200141044203a4ef6caa1d5aae410c11ca406a3a18acf331327ac6f3a606b64c77c7c8b8d406660da0bbd1265b1eda02deb55910df5d65f9f46bb28bbca8692e7f3e8192ffffffffd9035b8d84b5ceb2130066d4ebdeda0b280ce38e83069cbf5c04c2b248f4dc1d000000008c493046022100c40f81219ac0f9de2be602e0a3bd6892ae53d0696720765b0144d0056947af6202210083face63ed17861540dbf4030b56f4d900d604d24eb0015585e37e855b0f5f0a0141044203a4ef6caa1d5aae410c11ca406a3a18acf331327ac6f3a606b64c77c7c8b8d406660da0bbd1265b1eda02deb55910df5d65f9f46bb28bbca8692e7f3e8192ffffffff0219d82a05000000001976a914bf745065a9a0d079436846960b8cf63ae7fc8beb88ac327f0100000000001976a9143a08ee7ae37b004e305a60fad7b2125afca3568d88ac000000000100000002ac91491a902c0a1a0dee54f16cbc6a757c5bcf458a92d0f41ad7d3daa73671a2000000006a47304402203070471f2db07ac6013acf38a2227eeed5c360f1a5cc80b8aec5fc102e303c5202203586ef14b54d57fb4f4d823237382daba3ba7dc16cb807a082fbca85b1a74126012103aacbad6bba5541978ae6762f9f35bec99b7069252da2cb83e39ea869d1e7baf3ffffffff96b1bbb7818961ba558e102ae105ba242cc0685b53c7260808f5baefd21c42b6010000006a47304402207148afe56b6fe514e53a1e52f71b98df072b805b7589848f8e9058c90fd462fc0220750712d55b346370fedc740f012237506dca6af02e2b7e5d3fedc4c0a903e2cd01210217f2de125f68abf4c168633925bf4d599e080e944cc03fe905016911b39c5550ffffffff0219d82a05000000001976a91483505b3621e64bf2f68984c64ed2a263daf2455b88ac30a30405000000001976a9141b5ededc1e4da4a5ef8a9a1a9652680e4f77fca788ac000000000100000002bb70d71ca81c490dcebd3e2ba78f6ea60e0fca361785389550c1814cc9f91ee5010000006b483045022100d23f26b30eee4c6ebfcbf9cc1f73d85f799b2ec737bbbee3b6133284ec51f4e202206c2a7e0991a7af5d9d4b1fbb5f50501f0aeb7dbdc38a333a18d712e679ba65d501210316d8155b51902f2a243a23eaeafaca1f879ebfd965d80e720bf469b798a2cc51ffffffff7c51a9bcda17c518c84a037c2e2bbebf08ea27188b8208216acc89f9fb6ca1fe010000006b483045022100f5d77555277ce7edcf7135f2240c77e1797d3967899dc93d7fc4416aecf7bb7c02205e619acfae53f2c24b5d16bdbd3810df2ce04e4811e323426712d8f903ec0db50121027c4bfcfc08e84364f54b3233bd6f33a824b0e526e4dc06bec3d52636658d4909ffffffff02705d1e00000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac207c0405000000001976a914d54f583f742ae3f4665fbdcd343861ecc389ad4f88ac00000000010000000236eeee31d64e20665dcf7c1e5b8dc3dd009f93118eebfb61fd6d6cfe20084c94010000008b48304502210096cf1bc0e5900b9812eef425679ea848a89a2e86f0bd71fe7c34ada6b211b9e90220129288c4b262eec85d82dcc714c9222724eb76ddc07eb884fbec3b8b12c833910141044b000a8af1c4a99aecc87965e3ae299b55e036b012f1bbfc380f90d57d82d3a9d367ecf5357660f43dcd601617ffbf2fb8c313087c93a33900811ffdfc8bbb7bffffffff83b9e69214e8e0940c771f7eb1998f05d7bc51b7aee75e38c3453a9410c3f275010000008c493046022100cbd9478c0584c10dbb9246e8d81f1c3d5f05131f9707dbda5912457693d9dad3022100b996bb5ebdcd5654e7b1d9680e256bf62ed99afdae382ec5bb7f7ff7e387bbb60141044b000a8af1c4a99aecc87965e3ae299b55e036b012f1bbfc380f90d57d82d3a9d367ecf5357660f43dcd601617ffbf2fb8c313087c93a33900811ffdfc8bbb7bffffffff0210150701000000001976a914a73e3b8e8256278f2d8849663c82fb571effc6af88ac18b40200000000001976a9145103443c6b76d35b66504057b7ae71cebaa4bd7e88ac000000000100000002a81ba12bf435b8cbc67e5629269c894c0659cbb29f49aa7fd4027bef6e6b1202000000008b4830450221009992fe21779b49f357b3cac97d39fd530e296f131bc6cb93235f1f421ad4989c022045b3f00a979f846c7c8db129a979f0178a4086e167e2bfceb94b829814f4c809014104e4e089924d649c94b25c415b2a288bd9b5abeff856cf8462737a7226756479c78f790b28612567b1f9526079a8cb0a6ff1b6e4a6a205b48238c667ac7fa35405ffffffffd662930550d92a37b1264266c9cea93358a3170431817b47d9810834e61de7ec010000006c493046022100e1ab448ebae82e8b72f4cde8d1b5ff4a97c34df1d2e5c0dd7b4ea866f5a834ff022100e58a0a797456a0fb8ac5d7af5502a8b75af866ba1640460ebe143bc10737dcb90121038176eacd904c105210653546803131ae128921f9ba1a33f0b6756a630b0284dbffffffff038c3c0000000000001976a914ff1c46e1a76a389b44be4eb1d08c000579e728a288ac283c0000000000001976a914175cf0809e205420f2bc59cd682d94a0a1bc03e988ac56c20200000000001976a9141fd5f14f0f756d55ceb13be1a44085215e27aaf588ac000000000100000003b29dee04333b67229c0730193aa3f6986dda63f746c8279cb30acc089c843ca3010000006a473044022077225ce0ad0329759b64aa73685703d9c2c53aa3c54f9bfe9ab3283fd8848e8602200237202672a7ea33dfcf93bc706c4dbfa38532e89c1a2e4e2b8a84281f68225e012102d10cc4a5effd1aa9bf4cac4fa57497fbe93b1c64586074ee56e638eba392d4d6ffffffff4d5e6749ca3c442f9f6ecbbf7d1bef0136716635d5d150fb1828556c0de5d4b10a0000006a473044022069123f16f674d9a6f7d1757985ec74a1d8ac333e1c363d4eab5bd6d0d09cf511022019df6b5702c3e6f15a548dbcfaf3a8ca81f0bde3e1563a94aaee71fec31b62dc012103201dd5c598880b4b45b7c005c742ffa3ec57649c75b34c96d39de1d0c3233c58ffffffffb29dee04333b67229c0730193aa3f6986dda63f746c8279cb30acc089c843ca3000000006a473044022019ff9c54b810c609438be4c52dfe936a44b818cdb34cda41fed5b865e49190d70220527efe1f261c23ef43a00864c6e77fadd5124c4a9dc2a0f6854547e5e6ffe096012102d10cc4a5effd1aa9bf4cac4fa57497fbe93b1c64586074ee56e638eba392d4d6ffffffff0180969800000000001976a9149d1a13901e7d967b3f8c77a40ac2f6a1db595d3d88ac000000000100000006a99a07a35701952744a8583f663c0d55e96650aa2109a32f7bc573d62255b9a3010000006b483045022100a0c4a1a2d5104c91a6b674cb68bbe09fca0595186c7ca32af8d759cb2e75d029022005ae1c955fa981ebe0b465591166e37a1ccfa444dc34c613f73a4b5f4415366c0121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff5bf9ef1d5e584d69616277d4ea37e1fbe7b8f8f373a85ee00e75d9068a2454ca340000006a4730440220209398d7fb0b095fc54dcd774170ea34ed87957f4897ade5511c1fa1bea8e48c02202d50f6d113e18171f516fb400478078e3ec4325a6145149e6cd5ae8e1a0a66c90121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffffa4524c5a1a27594262b0de5d44d13c34e3ad1c5c3a68e9f5fa18e29bf00818bc000000006b483045022100a95c50704d459acc37e28410b5536aa6da1bc82caf1c0f14105bafd82a649ad402200cc2c0dfcb4b24797084c4133fafbb60580f66ee3fb12e0ccfc74b14b024ea940121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffffd4f85f26b98234a99c2242833269b5808eebe4ba1b237d15b1986a0d82396684c30000006b483045022100da4be6a3afa6de3f105247deb4249250001578e722e0fd46f05ddfd88b5bac3c022072683ef1f199c4f784caffaec29c1d13ea115a35de5c8706c32538bc9d2eed600121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff6785ef6efa54daa712defd19cd5d39a4e57af4fe7354ea0edf20a3e100faaad9000000006a4730440220629e9b29a3713e63ec2abaa9a2f350a75ab402865df60c4508dfee766ab956090220557ca5cb0bb4573a27b228ac2769ab141993e4aa20d0cb985ae7ec9bfa1df74b0121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff1d519546b9c39ca8f41b5d6f8f0b8f2a79bda7149563d082dd3be69153f39e0c000000006b483045022100cb0db43d5366fd0418a5f53604d70f7def70d062416d6bd3a0f8f54fb3ab045e02206a27d82e0ab0bfa885390a3ea8c54e0971888f517fce5439238dcde1da60462e0121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff01af170b00000000001976a9149587412cd6911f96a12865f1a4396b0b62cb37f288ac00000000010000000663b16748841f9ef7b86598199150d5ac79cda90226f6c2dfdaea5e1b37cc3b00000000006a47304402202939591bf677eeca1b0ae63322e77337446c6d0e02f054b6bdf4b26e320442a802204999f98aed007d1b01ca57bdfb9d5ceb174c16507fcb9d4465a94f8ee74e7edf0121023540aaa8026fa0f7db76ca1ac015b5fa97f2a933fe9d540ab46ac9036c54f5f8ffffffffb550c94e07aeae5646260a221bafe2fbd904260d0e193525bbd128d6a8d0d61d000000006b483045022100f117fdbe47c4a0f9e01a43f13971b57afcdc9735b46e3c2c0198ba760a05365502205872ec7682f8f108e75f212b21f79ceb01525b7abbfda0d40d56d1085e14f2b5012102bba8c28be56fad0b5fb7c9f3b66d3a8a3619d77b3896828a33a1175a479f1d2dffffffffdb598fc5c0a7b7301f186390670bc083a7efc5fa63ef738fe9386143bee41379010000006a47304402203dab5224d352de4a7afa0beb5299be6a9cfb77838743eded85f15cd9e02a23890220662e9e7d38a4d05c08a60552930425cc452cf7c3d5a61040b560948a532b37f801210396db7fc8829c256bd13aa646cddf3461bb79be25c52fbe67aa5d621cc1cb4326ffffffff5ee4346a40cc81387b37b3dab0e3ac7b73ed6f1be4d727451999681def9de5d3000000006a4730440220349f5fe9c032ab83ff17ec1cf198265411c948fd4b87f004d5b9185abe4cf9db02202babf60dc764aeb325aa04363bb5aee5d760693861a664338100433ddd09817001210281f473477d4b68e275166585aa74d201b84e398df5b2d2c5f169916a97cb771affffffff7413aaf36abbfc6ee9fe0e1073280d59f553af654320cb5ef61dbf24c0aa034b000000006b483045022100a50a03b753b72d2e1ddac9ce706465664120e6c49bdfe7d1eb21e365d371b8b2022067ce749580d51fc7987e40a09a20b1a83e2d10a258f092219ebf3b5e36ce0782012102365120c36c776b272b804fc44c70f2ccfca798109826d441d4ba2efe8da86ed4ffffffffcf7c43f22ed1de5d18d007c8f3a97a174c123f100616ebee1497517192c9a8ac010000006b483045022100833f808782de884c23134f4972f95d16c1c3359a58c241a5d5099badd4d87ff50220631f990cac53db8ed36e0b07bef80ed70685a104f9c50e7407ca1f47d497d35101210365660e62b048addb7aaddf3eaf487325f861ce1d51f793e46f7562bddf0d1635ffffffff02c8ebf000000000001976a91432d2725907fcf628c50868be1c911af2f7b0ca4488ac30322000000000001976a91472eacecd72014b53974227675ab6aecbdc821af388ac0000000001000000039c26d06d8ee95c66d59933a0d1eac8e0d98133ee37a07ca67247ae50097cd3ce010000006a473044022022eba58401cac10a4346321920a61e42ba53e980c282e5a9f460855e969fb71c022076cdeae244327ddb9d758879bf033ba9edc18afd60d611f5dc5a551c095d63690121020bd9e909f2f57062be729adab091e3f86699a84408e54a46f68b0008036f04b9ffffffff391c1955f30330c9ee0a7706d7c7a26f8ecca6d0c735caee17639eb0ff07c3d9000000006b483045022100d1bb384fa2c6d94a440b366c99fd3f9786fff40ef11bdec5b9be15884f78294a022064532a11a6eef165d7f1ca06f6a1d04c34934f5d103160d712b9986f81d94d4e0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffffbf2985938d3e69a41629107bc065d7929f70b7d0a073a66070f592fc75e5246d000000006a473044022060223dd5520b2bcf09373d64b919eb7c223761272502207c0ba1309d8a87f35d0220696de16125e07bc6fe234354df72237d7e24ea29126636dc0df80ed18cead5de0121024b4bac1049d3f0d887c08497ac6eb5bc17c3229b86b1381e2ad575b748a7a1b6ffffffff0170c73600000000001976a91438860090779c6df12ea41cbe472359b62957527188ac000000000100000005a22c8cb1f11503fd8799b800522f743523740b948e823cc6c789cbe962890903010000008a473044022013d9564b5a4a159f5898829128694e963fa402b204f598ca9e188b21dd8b99fd0220627935a445894b7d918087d7ba8ea154770cada4e6993f20ef3f51a8bba7a67101410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4affffffffff179ba6e1e2c43272ff0f47aa5d5d3714ef1362322a27d319ca56e8268145827010000008a47304402201d4e83e0072eac84a1e9749d52cbd6d0ac58249bba2e1d3a7bed43dc4daaa4fc02207516be9f58ff0b2834898aa43edd5700e0a66b22bf1a7ccfdf22d3433ba0b5b601410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff4a11da012eaadaf2f5d65e04678add7f9e08093ad444d50eab674368a427b451000000008a4730440220572b06f069a56cab4429110a6437627df3f8ea6218cd2b2b5ca179843521007c02205dd2d04a02c92d478d56bc3d6eb1be4d4d99cad1e0e5eb4013b126b3ec45bc0601410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff6622cd902f4779046dc4994ea0afaaf219e34e10f1a2e16b00421780288100c8010000008b4830450221009e60eb5388ce0ea8d20058bccbff7a158687d8cc5a9953f7b20d8026700d95ac022041db0edf480de6be92ec727fd954d9fb18cefddd9f0aeeea6618eec9373dd35c01410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff235679db494fe7e8297838820c8e04ba9f12c5a9958860557752a52b72245573000000008a473044022024cb7a5660654bd422ce2b343bf085e501f4d2b51e8653d4ca1657dc883ef9eb0220117befde0ab3a20e2352accf99acde63204be51d1c70eac0aeb871b4f99fb0f101410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff0280f0fa02000000001976a9144b0c84aa7192c91a247fb42aad33ed1e49651ede88ac14b71000000000001976a914a1691fe52de67c74b80b8844880311626fd9661f88ac0000000001000000036d4f3472421e15e7d4b7d5a115bd1bb8bc7824fd2052faa2e0f353c07fe2425b000000006b483045022100c628b1bd9bfce037e1602d491fe7daddda5d861bb36c20074069468f1cfe26fd022076a364b4ce5d1d342214e169477f3f5e992a31b37a29c3881c6a4c6d346141aa0121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffffe5effde11753ef6985ee79fd39fecd350ed4d8ae3615b9c248624cf70c0bb8a6000000006b483045022100c62baeebe98330a4440f3cdde01fc671bc1d0593753023eb6e179ff306a1f79602205122bcc4772eac50cde34c9c113519ddce4795391e4546af8175ba8eef6c60dd0121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffffb26f95c807c66aa3aa12a893ad9fdcc3bbc49a241c6b593a5a4db51130f180ca000000006a47304402204fcb3f31b3bd448fad68c2adde9387f7d64ae718ea3c730037371d26a78d618f02203f8a270f1c7732582270519057bed7c8762bb65e4d7b5af98b9f64ca2f0feb100121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0190940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000003480f9580767106b10593c5c926a562b4b25d421c17c26fd0dd4a7ac0b00a2efb030000006a473044022004803c784d93137a1af11c471495773df13b4338b1de2831a0c0b088e2a0be2802206b0af739445eb8b67ef6c059fc89c4201fcc7d69372f75ff66f45f447c0bbaeb012102ee99ba735c181f6e89048c1e5e71827c9d0ad1c5fe4cd12dffc58040be4a3cdcffffffff2d7b4e4be44ffd952fe9b6c27ef75232cd0c183d42b80b963689f6f7a6d315d6000000006a4730440220422e528721789726034ff4804139460530782868df8ce686a965e0852dc4b72f0220429ee182cc59dba72198aa8ff8f5ad55f2cc910e43a89be1de37125f2c7cad74012102de3009e749c52ece318d6a42800bb256009cc85c779f4391c5b8c302b5289ec8ffffffff7f927998c5bac3f22dd9e9cf1ff60e4e9251d9ece0ed9615c9b5ee45bc724fa0010000006a47304402205f8c5b4f4db53d9f217dfcfdbb560f28581474dcf3ad81dd3ffe9bb3b33186d00220490135e47b5c2b94aaa038cf8efd37fbfed23a07c5bf102d80eee111a0a3f0b8012102dd0a67c2bcc4aa524c3d16c60a445165bb648de7f46a3b4fbbdacdb2b219a0faffffffff02906a0203000000001976a914dbd819f454012f9827139d5e6351a724c1e34e5388ac67362400000000001976a914ef85d20dd64d07ad3c9b40f8e7568c433ad37ae288ac0000000001000000031fed4f6f004b01aa4eeef2054d6632e86c3dfa0df05e409e80daccd0cdcc28fd000000006a473044022064ea02e9b6bb7489da4b6523910f5791eabb47701e34ca7dad20c61a0d93093c02207b54431c6c38dd5b7433f12779b942bbb553d31e43f0a10d4061a7f7f1550cf20121021fd10f89dc34565c18f2607b1565806092e483a829650960c9b69b00f2bd349dffffffff1ae4decc82ac597a2585bcb2ced28b2ea928bcfb6dbcd67739cb4ae7b633bc6f010000006a473044022029551e0856d72f28a8d2991361b935ba636f3466e0430e52215325d78f479b80022078f8704ef47b0c1e487def5d8b09a8914db39ac71fd384811e677f9319ebdf4e0121039390f8c35481e981ba3a35b55798632246a0bf140761f1a35d2c133a13ec1a34ffffffffb7fd2f52710f8f1d8e484ac0d72b7385730aef8a25365035fa5e61d29482a41d000000006a4730440220678c06f2170d3f18850270eabf6c410b318e3162494e39df9fabdecfcebd65a402200936bbc8649f0a6ab30e007eefdca143c5b37593dc7671161c7e0b12c40bf357012102af041cd4a6aafbe45282b620ada2a7a839a7344ee6d031f7845fc71facb61fbcffffffff02135bf300000000001976a91439787b312215d9ecc0cde51d60b81be51d372ef288ac577a1700000000001976a9147ea20ecec4742638782db565d48dcf7d55aa08aa88ac00000000010000000313b5efff1f4bf814094b6303870dce81bfd9468f03190cfa4ecd1219247f9c44010000006a47304402205b40da0b0e9cc61f0a1b1b48f660b2836d2962296222d60b87d97b4975af2c6202205ebaf2e77178fea6366669bccca73b79ba8acb8279c2d93e494dc44f6f1046c30121034f05cf7723cbcf3156eb297fa67a960322d4a2b3feda496c419c383b6df8206ffffffffff87aaf665d01c21633fb9d44902793bc84ec7434c3dfaa71fd438c139d766ffd000000006b483045022100cd16d6fa1039f56ccc547bbd3479bad948fb8e1664d865ef504da410f44bde9d02204cf17d312af69d62bac696595981ef2009ae011139bbce3f638002a77385989b012103507ae1bbbb5ec41ce9de7193419f296a01300237a41211eca23717cc02cc2779fffffffff87aaf665d01c21633fb9d44902793bc84ec7434c3dfaa71fd438c139d766ffd010000006a47304402203a3a357ad9007d2c1f1aa08d91900cf6b1154ba0d68e44a1731590b6278b8cd50220407c7c99cc5e5e39de1204c3d65d408936bde817e6f657fbcbcbb1b943290887012103502c85b05b25e0a79a689b65cde8aea35987b6e52a45c03619a1563a4909ee28ffffffff0210508b00000000001976a91470d71a3bf5bd2712ee5353cecf474dea5a7102f888ac6c07cf03000000001976a914619235f0cbc6dd6f770f5d76dc0f9a87bc5dcaf988ac0000000001000000037ea53eda6fc6f67399c1497da23f90e3f8c3998d576199a74c885e5367fef906000000006a473044022048746b724dcbd94308cf78dbdc520913af40741309f90fbf49620aa42a944ca202201b45c0589cf9ec320d0d54ccae85f1629422a7fd2c3d7ac5cbda6364979b6894012103f67aac6a5e05d86ff2f8818d170b19198d5755d14e7533bcdb6bc6955ef1a486ffffffff0167efc2fe2f4391b532b967be73d5a48f122a8a146c10ae582b64ddbb503ff6000000006a473044022031675371ade0681540e605e9cf6ec46f0dce12e94b2c10951ef3a28d0264e71b02205f427a75ee9b2303ec4d5b3edde305a28d3626f45b95280da68536b6e27277210121029e48abbc9546bbc1d121bdcf9b4584c3d762a2d7e46f1f462f1a437436648bddffffffff07eb618b4182ac91e7353205798488b22a2e4baab153c73973adbd207ebba5b9000000006b483045022100c2e9e62255830f521c44894f970276ae571eb3e441dcc194135b00a5c3a2153f022028001128702a347d51e3ef18b45f9d31922ad1e8ec35073134e2cca1b33f8b4a0121020d935423da23c95e8e790f821f5a6d55d77e6b1cf31a2f80465341dc2ef16a96ffffffff0298690f00000000001976a914d0bd0400bcdc79be736e058939fc6bcf733ec10b88acbe140300000000001976a914f4dd33b30c9019ef8453e107a176b08c370d187388ac000000000100000005c162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b00000000fd9d0447304402206e26153aeb854f53493b5103254cb8f5b51b14da752b65e57d670abed3d2791502206a8fdaafe4b4f58a0603895d750678ad3c525873426bdb04e0e4d780ddcb9009024dfa01002020202020202020202020202020202020202020002d2d2d2d2d424547494e20504750205349474e4544204d4553534147452d2d2d2d2d00486173683a2053484132353620202020202020200020202020202020202020202020202020202020200054686973206973206d79207374616e6461726420636f6e73756c74696e672061677265656d656e742c20647261667465642062792041646469736f6e2043616d65726f6e2d48756666003c61646469736f6e4063616d65726f6e687566662e636f6d3e204665656c206672656520746f207573652f64697374726962757465207468697320617320796f7520736565206669742e00202020202020202020202020202020202020202000202020202020202020202020202020202020202000436f6e73756c74696e672041677265656d656e74003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020005061727469657320202020202020202020202020003d3d3d3d3d3d3d2020202020202020202020202000202020202020202020202020202020202020202000546865207061727469657320746f20746869732061677265656d656e7420617265203c4649584d453e2028e2809c436c69656e74e2809d2920616e64203c4649584d453e0028e2809c436f6e74726163746f72e2809d292e20004dfd01002020202020202020202020202020202020202020002020202020202020202020202020202020202020005365727669636573202020202020202020202020003d3d3d3d3d3d3d3d20202020202020202020202000202020202020202020202020202020202020202000436f6e74726163746f722077696c6c2070726f76696465207468652073657276696365732064657363726962656420696e205363686564756c65203120287469746c656420e2809c536572766963657300746f2062652050726f7669646564e2809d292e20002020202020202020202020202020202020202020002020202020202020202020202020202020202020005061796d656e7420202020202020202020202020003d3d3d3d3d3d3d2020202020202020202020202000202020202020202020202020202020202020202000436f6e74726163746f722077696c6c2062652070616964206163636f7264696e6720746f205363686564756c65203220287469746c656420e2809c436f6d70656e736174696f6ee2809d292e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004c6963656e73652026204f776e657273686970206f6620576f726b003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020004c56a914718a00c73b3a1f6c268a337970005a053c68880688a9147c42474686e1dda1f88fdf59b30fd6faab1c9e018821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad0075740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b04000000fd9004473044022072de0b15a31fb1f48288e5b96e6f3ddd088f564a09cce34a8347cabcee835d2202201193def75abcee8098a070132f8727d272069d658db5493865ba20d15c9e71f3024de60100436c69656e7420697320686572656279206772616e7465642061206e6f6e2d6578636c75736976652c20776f726c6477696465206c6963656e736520746f207573652c20646973747269627574652c00726570726f6475636520616e64206d6f646966792074686520636f70797269676874656420776f726b732070726f6475636564207075727375616e7420746f207468697320636f6e74726163742e0054686973206c6963656e7365206d61792062652061737369676e6564206f72207375622d6c6963656e73656420627920436c69656e742e00202020202020202020202020202020202020202000436c69656e7420616772656573207468617420436f6e74726163746f722077696c6c206f776e20616c6c206f662074686520696e74656c6c65637475616c2070726f7065727479202876697a2e00636f7079726967687429206372656174656420696e207468652070726f63657373206f66206361727279696e67206f757420746869732061677265656d656e742e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004e6f20436f6e666964656e7469616c6974792020003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2020002020202020202020202020202020202020202020004d040200436c69656e7420616772656573207468617420436f6e74726163746f722028616e642069747320656d706c6f796565732c206f6666696365727320616e64206469726563746f7273292068617665006e6f206f626c69676174696f6e7320726567617264696e672074686520636f6e666964656e7469616c697479206f6620696e666f726d6174696f6e20646973636c6f7365642062792c206f7200776f726b20646f6e6520666f722c20436c69656e742e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004e6f20506174656e7420436f76656e616e742020003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d202000202020202020202020202020202020202020202000436f6e74726163746f72207374726f6e676c792062656c6965766573207468617420736f6674776172652073686f756c64206e6f7420746f20626520706174656e7465642e20436c69656e7400616772656573206e6f7420746f20706174656e7420616e7920696e76656e74696f6e207468617420696e636c7564657320776f726b206f7220696465617320737570706c69656420627900436f6e74726163746f722e20436c69656e7420667572746865722061677265657320746f20706179202432352c303030206966206974206272656163686573207468697320636f76656e616e742e004c56a91431f24aff099ddcc9a66d4f3569e69d7b544284c488a9148c047e59f93890e9be3945ce2652453bcbdbc38a8821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5175740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b03000000fd69044830450221008ed4fce6cc5ffe978433b88328f01842f62bf20df59c7f816c35847549df5e9e02207425d2c00c76eaa8258540161a196cc3b7b0fd52a24637c0541c2ce52a0db8cc024d00020053696d696c61726c792c20436f6e74726163746f7220616772656573206e6f7420746f207365656b20706174656e742070726f74656374696f6e20666f7220616e7920696e76656e74696f6e73007468617420656d616e6174652066726f6d207468697320636f6e74726163742e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004c696d69746174696f6e206f66204c696162696c697479003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d00202020202020202020202020202020202020202000436f6e74726163746f72e2809973206c696162696c69747920666f7220616e7920616374206f72206f6d697373696f6e2072656c6174656420746f20746869732061677265656d656e74207368616c6c006265206c696d6974656420746f20746865206c6573736572206f66202435303030206f722074686520616d6f756e742062696c6c656420627920436f6e74726163746f7220696e2074686520736978006d6f6e746820706572696f6420707265636564696e6720746865206e6f74696365206f6620636c61696d2e00202020202020202020202020202020202020202000202020202020202020202020202020202020202000496e64656d6e6974792020202020202020202020003d3d3d3d3d3d3d3d3d2020202020202020202020004dc20100202020202020202020202020202020202020202000436c69656e742061677265657320746f20696e64656d6e69667920436f6e74726163746f722028616e642069747320656d706c6f796565732c206469726563746f727320616e64006f666669636572732920616761696e737420616e7920746869726420706172747920616374696f6e7320746861742072656c61746520746f20746869732061677265656d656e742028616e6400776f726b20706572666f726d6564207075727375616e7420746f2069742920616e6420636f76657220616e79206c6567616c206665657320696e63757272656420646566656e64696e6700616761696e7374207375636820616374696f6e732e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005465726d696e6174696f6e202620537572766976616c003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020005468697320636f6e7472616374206d6179206265207465726d696e61746564206279206569746865722070617274792075706f6e2031352064617973206e6f746963652e20546865004c56a914522ae24fc4f0c34fb602e354a976fe1f6de98c0988a914fc8cf080f742a8bfede168005c55195520be50108821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5275740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b02000000fd8d04483045022100991c46c63c05d74a7231dbdb7232e8ceb47a3fdeba8bbbda6ec7f7acfc53e5b50220400a43b0094272e01d5976c4ef08e735a5c3f903ef7c05eda22dc3342e55e487024deb0100636c6175736573207469746c656420e2809c4e6f20436f6e666964656e7469616c697479e2809d2c20e2809c4e6f20506174656e7420436f76656e616e74e2809d2c20e2809c4c696d69746174696f6e206f66004c696162696c697479e2809d20616e6420e2809c496e64656d6e697479e2809d2061726520696e74656e64656420746f20737572766976652073756368207465726d696e6174696f6e2e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005761697665722020202020202020202020202020003d3d3d3d3d3d202020202020202020202020202000202020202020202020202020202020202020202000416e7920707572706f7274656420776169766572207368616c6c206f6e6c792062652065666665637469766520696620696e2077726974696e6720616e64207369676e656420627920626f746800706172746965732e2020202020202020202020200020202020202020202020202020202020202020200020202020202020202020202020202020202020200043686f696365206f6620466f72756d202620476f7665726e696e67204c6177003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020004dfb0100436c69656e742061677265657320746861742074686520666f72756d20666f7220616e792064697370757465207368616c6c20626520656974686572204d69737369737361756761206f7200546f726f6e746f20284f6e746172696f2c2043616e616461292e205468652070617274696573206167726565207468617420746865206c617773206f66204f6e746172696f2c2043616e616461007368616c6c206265207573656420746f207265736f6c766520616e7920646973707574652e00202020202020202020202020202020202020202000202020202020202020202020202020202020202000456e746972652041677265656d656e7420202020003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2020202000202020202020202020202020202020202020202000546869732061677265656d656e742069732074686520656e746972652061677265656d656e74206265747765656e2074686520706172746965732077697468207265737065637420746f2074686500736572766963657320746f2062652072656e64657265642062792074686520436f6e74726163746f7220616e64207375706572736564657320616e79206f7468657200756e6465727374616e64696e67732e2020202020002020202020202020202020202020202020202020002020202020202020202020202020202020202020004c56a9148bcf4b78d0400c6367c82122b9ab3714695195ae88a91429fd392f74766b0079e4bc94153473c53e80124d8821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5375740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b05000000fda10547304402204c73c5fd27e000141df68e07a638d7787595581db61880aa1055bd65b261d40802202ecdc75f67947b34e9e20e366231bfb9dc8b0aad1287d32f6da234a94a77dd10024de901005369676e61747572657320202020202020202020003d3d3d3d3d3d3d3d3d3d2020202020202020202000202020202020202020202020202020202020202000546869732061677265656d656e74206d6179206265207369676e656420656c656374726f6e6963616c6c792e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005363686564756c6520313a20536572766963657320746f2062652050726f7669646564003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d00202020202020202020202020202020202020202000436f6e74726163746f72207368616c6c2070726f7669646520636f6d70757465722070726f6772616d6d696e6720616e6420616e616c797369732073657276696365732e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005363686564756c6520323a20436f6d70656e736174696f6e003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d00202020202020202020202020202020202020202000436f6e74726163746f72207368616c6c206265207061696420244649584d452070657220686f75722e002020202020202020202020202020202020202020004dee01005061796d656e74206973206475652075706f6e20696e766f6963696e672e002020202020202020202020202020202020202020002d2d2d2d2d424547494e20504750205349474e41545552452d2d2d2d2d0020202020202020202020202020202020202020200069514772424145424341435642514a565271385858685341414141414142554151474a7362324e726147467a614542696158526a62326c754c6d39795a7a4177004d4441774d4441774d4441774d4441774d4441775a5463354f44426859574935597a41354e6d4d304e6d55335a6a4d30597a517a595459324d574d3159324979005a5745334d5455794e575669596a68685a6a6376464941414141414146514152634774684c57466b5a484a6c63334e415a3235316347637562334a6e63475630005a5542775a58526c636e52765a433576636d634143676b5177495879484f6630756479716851662f566b50586241715163386f4b42416e69683636374f61467100555a485662665456687a517a67766f46704c522b3377732f4d492b562f4f376c6b53324272754a75387138472b75644c546c324a324579583979324d2b59457000332f6b71616c66545579497356545a4c75474650536150524e52574d4159435534794e637363784739377875694a634e4c47344130554e496e322f696c474441004d0a0100793648335632502f34332b65446c79537a4d6d6247695078765a622b3073566561384c7563754b316c64764539385232646e64747331776467464d474e4f332f006f573471502f333477633631476673786f4672774138576437563942666d4f6f63684b796c4f62305178494b4b4d53624741764e682f417a776b66396852557a0047586e32374b397556377558626e32724d394f774a507557637172487243752f30567144392f2f70352f614d77332b7237685966534a2f30524f795967513d3d003d79566a66202020202020202020202020202020002d2d2d2d2d454e4420504750205349474e41545552452d2d2d2d2d002020202020202020202020202020202020202020004c6da914eedc07cdb32f755b5e696becaa148dbe2ca6620488a914e54ab11c7ae71772cbb72562871415147173c10f88a9143e8b1fae20e81def8b2c9261f20e01c6c765ed8d8821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5475740087ffffffff01580200000000000017a91492a04bc86e23f169691bd6926d11853cc61e185287000000000100000007b5b1cbf32900be294db355096411105d0e1aaf6efb971a5b76e88c25f605518b050000006a47304402200ce58e5322b5c648c43a9138a66b4635a2ff11d6ee1ac14be502eaa2b4121a2c02202da6979c0920d2e1708e59efe85736e9054d68d68161e13ee2f012556afa8e9c0121024efc0404fa65339ef61c3a00701d02533f6b7256ce2897fae9c6ee16b74abc55ffffffffdd7139e8604d13a5b09787feef3e91bba6898c685c2f0e9b5ae949cabeb6b9e8120000006b483045022100de75e20caf5c16a46f75ca4e9f2c5635a10948097fcf0259f1147076307acd2e0220486742a379f40a45a6afdb30de3066d1cd991f92525998fc44e2a625d80aeb0301210251d7934af2658d0fcb89127ca187e1689a88d042c2690052b9490e0816e41046ffffffffa458174a9364e52b1774c8807ec89d269532abf935d81c684cd75c0dd11cd4f0070000006a4730440220727d65aee66d0471b66cb7c8247346942742f8a0cf573974c8a1a635c6c63fde02202b1320a0d65606044bf9592d8f9ca4dba9875201d68d2840e2536e283498d6b80121021eaccb8e2b73b9157f0e5eb63ebb02a514b1ba92a9d78d6cfeab171a1200f14affffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080d0000006a4730440220039774b92b0cd4e619e5fd486322baeee5db0a038e61cc0a348b5d1acf6288f102201776789db07000556f3fc466db36b49e9d6f9627d3ab14a3cade3d5d59c0d7700121020f6d08c3f950736cc861bc1c69e2002114055af3d915a15ab81bb738381bbde9ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208100000006b483045022100b817c339af5bf24599ad2ff80cc169d97281cf64d21a7a85cde1693859cae7fd02205eb534104411ab3d3607535dde1aa037ae93f832e0cd5564a843bac50d7c0161012102a0b69be867857efa76e9397d6bfd27e8e02c2292fbede9e68c0ae47d8f35dc29ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208110000006b483045022100d74923de574e4ae945357572b4ee68dfa81faffc5cbe4ab9701ae1bfdde5f1400220599584f41cbfcb80bce42ed683aae21dc1d3a8c2750875f837e3c4cff7c30c01012103fc32046a7c1f15d9ea1e382124780ee87bb6e4d3168a3ac2f5a92ad56c572dc4ffffffff3954c64d9e1984231962fb009faa6ef2eb70eee67c1e58579d904eb2415209de010000006b48304502210090b2474ed32792c5ee2061259237a4d910e21c3468e8d0668215ebc3d77071540220487538464fe334052a95bfdfebd7d3943601f06b533feabfdf5472f558f55bbd012103648a769f6830e65d76a251491e9ad5e069d81680c8b00b84b939d26a535c2b5fffffffff0200199222000000001976a914c0d16bd11bfb9494330102680a8b2c91ac8327c188ac00b5e60d000000001976a914078b3a6fec6f9ef9fce8351d55c5236b7d3885a488ac000000000100000003d9529bf62c1dc819a5cda32fec38692ee55ffd5e82a9377803198818298ec0c2010000006a47304402206a95f121058b1d20e16ae32f63a5780cacc8f129e87b14c1333c90171cced50802205d4b27c541580c6f8b5bc886a00738cb11643d8547805c0595e7d7396661268e012103cc8e6abdab3a6977115ff2aa9274632c29d58554f34f9959662cd3e0198d4731ffffffff66b2840ff7ea26d398ccbc852bc5423e5dde868603a86ad0268a1d0762ea90f8000000006b483045022100afef8abdf6c3b1a4b68d5c3e2fbd4bf58902752c7a4339374565dd194cd7e17d02206bda9723c738301abd0692bcfec7dcd15c4de855646372f0dcf2cbe9c3ae4da901210258681365e701d0d8a6f58cfc40d1adb7dca89e928708134631728850032161aaffffffff271adf8900251fb0c8d87c763ca5aa947053da90390311a755d3ae7449910fa8020000006c493046022100831f6cbcd74073725580911208fd7114b9153e156cb60e34f86844da7e6f991c022100ac09948def2e923c0b67660dccbb0d7890390b838218ab629a207e8a65b206b4012102a3b1052e6dae6c683240e13d47f8f9949192c0cf4e8df90f3487c8961b347a2cffffffff0300c2eb0b000000001976a914571f2391d85d2b7b7e5933b9f72359413c92c7a188acc42b0b00000000001976a914c17c7208c4a1672163959f47eb409149c6f343b488ac66780000000000001976a9144c6bd90537bddb79545f3a6657b7e0086349db5e88ac000000000100000006a60b72c5ba619dc04c46564050179c898df80137e696e0760e1dc482fe8f24832f0300008b4830450221009212620754803048486f486a84061ea6b1fcddbc2e1800136f780278f91b2f0c022028cbd928b226d1610d5db835613dc61980a08b954963122c344e5a7838a8d1cb014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffffffec031f2dce18945a4099eca56db0bba4ea1bb35f0f13c8aa05ea8eac759c70000000008b483045022100869ce088fd35341a39109ff10f1c14853b2cda68cffac898889d985fdf0b5594022074955afb9757aaf2205e4837036c573f52dcc5647c6fffe6791a9f5d9b8f34c4014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffffc4a1e6a87213cbba608214a8fe93171d7cf35d5d0803b801f17918852b2afa21000000008a4730440220193c616e7bd61b858a9eef497b17ce23aba39b715507bcfa6f24117fca6c2a38022062b12a5ba58e8def33ccab924644deab99eb1c6e3d10f1f77911db8c4cd9c502014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffff1989729a465d8e6935d3f81fd9eea74f551c3e74381d7437ee591c16489de379000000008b483045022100b84cdfd300a6023908bb6b5fa8a658583815199afff4eab95587a83b6066774702205d74a9d04c1a56440acdc4c6722f9bbd9049f22ef3b53dde1d01dfb9fdda884d014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffff94879440f59a23bd1ebb7f2a520d3e776b2ea834a3c28ec9208c37ea7e36e55d000000008a4730440220349c2a2021dc0658533d48aee864c7c7e714d665e49bde78b2753fdcc1461b56022010d92d73f8a3a33dd26de79c1ae3e8beecb237f8ce356ba60249d2ea4ca158fb014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9fffffffff0b6a05b5ed1c631a1a158234946e347f1a25a5d0079a07ad908265ae35cab70010000008b4830450221009c2c8ea7a23c400b456b4b497aac9867beca32fd1d4e9195bca0132d585805dc022017f7d68dff73f32bbf223e5965bdc0864f2933e21cfacdd7bad20a0c723d077d014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffff0109f21f00000000001976a9141980502c78e8531c104c87353dcc82be07c0718588ac000000000100000006860da7c7d926eb9c735a7defdd689e3d98845e7bd6bffc439ec12ec374eccd32000000008b48304502210081f58f8ba3ba634946c7e28652736008d877ff90a629cea2208799fa2610eee8022070587ccc7fec40d9134a581a6a508ba2205b6ddd80c055d2b66f61651be46006014104f16e78a14b71c4995c36bdbd1a2be43e403a234e52874b0bc0813829866cfbeaf046b8669f8d0edd6555925e2d7ada37825d40fe57d3a537e261af57752a169fffffffff7d05334943bec488e842875172d516e27d6b095009559981ed0aede0a7a0d7c0010000008c493046022100bff2bbb56e756c8e0686115bd168a0d4f24f7ae9d7b465c48f988a5b3ac2c5e4022100f002d64ab94f5020964e3584b72ac9cc0161fd369a6a27f7d0c4ec624a5563e10141045d20352b47e7d91bf999e74ab9529cf5ca8385ee873355aaf87388cac6ac735fed75c8b9c947346a8cd43789c8e9cac4c5a2480c744f3c4f5e2e66e51832aa87ffffffff5e5c9f229f30a7604dd695b43529c18b5d1166cc69b60a961d4bce2c2f5977fa010000008c493046022100c7ad9617447585bd44f1370bbfa3e64e89e61731eaf1bc002ccdebc1d3151cb8022100b5fcbd1b95b38a802ed6ed277bda87843d92893070025b69f58e16f1d4adfd01014104f16e78a14b71c4995c36bdbd1a2be43e403a234e52874b0bc0813829866cfbeaf046b8669f8d0edd6555925e2d7ada37825d40fe57d3a537e261af57752a169fffffffff334d4de2a37da92b9758d2dc3aa22e3134523288b88f9aad798bb9d69b01068a010000008b4830450221008b145ae3a15ab6d7a8d860526370563501a57f63217c5e1bb13076ad41a48b0e022065b998b2f203b477bbe92e43559b18335ab6368c64cbfda9ea9cd7e195f3d1a30141048b6a00dba1a492db5035d9b801e706cecb6377076e17f8a57f28acb56c26401d6cca08ad4341ff93ea0f74e6dedc205b33cf1dbd5537f87436994fdbad482062fffffffff1ac394465ba5312cf97ffb70f467c345a44111444989a1ebcc7c6a962a9abb9010000008c493046022100c98cde5f315d964b1a106be00e75b7c16ba0ec0c4722677b55ba640b56bf61840221008646a722858ca5460742611db2a4de4f7c17a7a3c083355d2a69227aa638ab5f0141045d20352b47e7d91bf999e74ab9529cf5ca8385ee873355aaf87388cac6ac735fed75c8b9c947346a8cd43789c8e9cac4c5a2480c744f3c4f5e2e66e51832aa87ffffffff2e6fd288f4912f5a440a923d1d0d9aeba335b7197533f69fdc24f60773fa61b8010000008a473044022063ad90e01b52062bea1a0fba40c5f513ac94cb237c329b7a115be485eda035b702207dc36be9ccd2c34991a29fb245fba5111f631293bba29d4c74126c2de08f90f70141045d20352b47e7d91bf999e74ab9529cf5ca8385ee873355aaf87388cac6ac735fed75c8b9c947346a8cd43789c8e9cac4c5a2480c744f3c4f5e2e66e51832aa87ffffffff02c0448403000000001976a914b29ecadf735743ea23a01a6790d29c0189e0500788acd8960900000000001976a9142998e8a9049867b923fa5f496399096fda0d9eb088ac0000000001000000156af95cd11ab5d3350138d40a648f09b4149a518c4cdf8ec840005de0adddbba2000000006b483045022100e314784fd1a5498192968a3c6a6f9d1e3472d72185bd0be73154edaf33ab6c9502204823de1ed2101cd49edb937b5b7411575ed5840b74a9314228ccf89040ddbd5e01210238b5afd035d5435468014cc3731d3d1ec128c201650b7614036fd57b1c7f92fdffffffffa17f1c953b371b196f14faf73404bb8a02166a803f3e229eb6d04da40d7da46e0f0000006a47304402201cd361c2b7b8a7fc883e2cbc6796fafffbfa814c53a97e9df6c533ae473011240220345db857fa58c52ec4d8e80faed06a846cb7385203c08c6cdbf4855be1fafba1012103ff5d8c9b0adea5e08d0b9dae8559c5b91d807c834b5018639eb1b98affe0f36dffffffff49a663e78cdb672ef346f2019e674174ca28b864ff7d2bfa05defebd2b5084a3000000006b4830450221009d55a0214334a3a59f1bf3c87d49e9422911b6dac2045455fa9e85b680974d6a02205c24c2d9f943d54bdfd0af50501edc328a4a7bf8441470b8daa2d6ff42265de3012102a35c3171ae31a762209d6d628350c3d28e7124da414cf1d44e15d2f615280bf0ffffffffa17f1c953b371b196f14faf73404bb8a02166a803f3e229eb6d04da40d7da46e190000006b483045022100d4f3cc2cf8e36f9286135e67f401486f6a4680b8cb3055fab7c9557a8e424eca022026277ab8b47647c8d9916305ad1b08e8615ae451170d470703d97a56dd51d84b012103fea9280369228824ccf30dff697a70280d91035cdc0a271faa0683cf0b8776aeffffffffc2be9e4ca9438e9a995bbe90cada7dbe0d7aabfd681fe7a760e860a037abcf5a000000006b483045022100a6311b5347814a7d6707ffbfced261b1e93dea471eaa1b80c1847e77f12c72c90220468b9dcd03c46b4c158d300d68ed13598e8cdcbde5899a8602ae752b1e30e3ba0121030cce664e0c7a4b416a02b9fe8ff76a68214e958cbc1af661ae42c0d7364e5091ffffffffa17f1c953b371b196f14faf73404bb8a02166a803f3e229eb6d04da40d7da46e3d0000006a473044022027ecd9c0087bf313fd43fb0590994efc8a90b600c63768ae98fe4dc7f17bbb9902200aa2847a21667a8c559959c1959657512c63a18e8eb10ca84eb0a5345e68cb3b01210350adefc65a86e370fd4fdd0151a7ecbbc2a8dcdfc084cc075e83d197e4014a3effffffff45c46d6a6720124705c25ab9777ac5dfc7c53c6a6c4c387f6edd2110393524be090000006b483045022100876f0a162e66be4209413c27e0b08680e76573af7b2f5767bbf60d997cb231720220105a5c4b8ba943cfe987632b786f4fa9fc03b9b9ee8c7758c37067d550196a7e012102cced0d0ffddbcf0f9194ed107b03b919f0f3074c41b53e7376c753f562e21647ffffffff36a71464956b3f64be91833460cd327af020013bf91d921618115849fc18d4d2000000006a473044022017af06393be23f12a4c9716ed56ccc84df8495fdc51669cecb3aa11e0e73f5d9022036832eba8448f577630234f47f4842e1712605a234d6d5eadd90ae4ab563c98e012103e6f7f28ac5db1f0bcbf18c6f21ebe4b66134d57f437643f795e44d0876305dc5ffffffff8e796a2be4b0813b35b6b3def8c1f6b23b1e6bc489f73a6af0d868a3117ea39a100000006a47304402201c705d82c63689ddb3d0555582d6577c652c6e0eadc7d6caba42af6e0a94328302203139cf082ea8615e60e958dca478aa7ba51750baedad9b1f7cf2e4997f9fc09e01210344aeaa967c6932c397a21cfe46560981638adfe95985818bc1b92195ee00b93cffffffff45c46d6a6720124705c25ab9777ac5dfc7c53c6a6c4c387f6edd2110393524be0b0000006b4830450221009f831750452301cf2123d01ad490904a3a4583664577632df2fad18231bf179502204c245e238846019388c6a5789969a8a5834dcc6464f715f178545d1884ea6b8801210321e1e777b76571abc953f9138b4ebfe4d378a59bdc9b88f393546ea0a65d09ffffffffffd41087f77c0ff528b6131f1c96ad766829c0975ce55ef6e13bf82ff096aa3cee000000006b483045022100fdb3b6d0b3184439d0058aafc13f2463b69f7694e253c74cb515de78d2e2732b02206069f42cd8597aa32b82e1f245e2b8f0ec35374083a305f8fda6c91c17b1933a012102a35c3171ae31a762209d6d628350c3d28e7124da414cf1d44e15d2f615280bf0fffffffff1e3424b51cd6caac82571686f9f0df2a405ca9f45e9933f8efbcdc20da2569c060000006a473044022042568266070d02d014cb87d639521410d1b5e22f5709f32a41391327188dd2e402200550094be1358440b88e13ec5b868871958c3e6ad8adc238a51852db74d77f79012102a35c3171ae31a762209d6d628350c3d28e7124da414cf1d44e15d2f615280bf0ffffffff71dedaaa720485b6fd2886ec321fb60470312fd76fe41fcb25d2e8c32b5ff3d0000000006b483045022100a745f36bdf8baaf2118dcb0407d187cf4192f6bad13a37caf11e4a3eef382faf02204681f42a4ea5cd80144c10b7011dd4f343b79324a7222e62dc98bc4183e41a8801210345e2010b62d56cf5e79282d74deac6f9c2f1d9cf6746a1e960ca0cb18fb79f8dffffffffac3777e88e55e9cb150af0dfbea3f0f4ae11d7b39bad41fbdb47ed4a9c891948000000006b483045022100d5dd247e08cd72cfac6c3aa76995138465d9246225681c6045057ed4941933cb0220609502ccde406ef54241ecdf0edb49cee2272d6fc68f9957d5bd3d87d960e2df0121021a97caab63debfdb156e4ed5f6c68219c3f1eb95de3032b1f57ad1f123c1d858ffffffff9c9dd4b1906f8db5735fe94f2dbfec65fb2551951b3b448a6f38a24742c41de6000000006b483045022100a14979aa9be076fac6e448252f9895984d02e554cafbe8c89d10e1cd3bb805a1022034fcd2c77eff453ec3804ae410803841990a0c4119e1835e60c5296ef137080d01210345e2010b62d56cf5e79282d74deac6f9c2f1d9cf6746a1e960ca0cb18fb79f8dffffffffe5e4216f0619f1d8fbb94aad7f23dc091adf2e8afbf00b67744861cd1d4d0a15000000006a47304402207442a698da8ea7ee3f7808eb2dbd32196430d36ea319346e543e7e7fa600169f02207513c917c998f731435d80ccde038c6fafa89b17f4ad1af382cfdbeb8d7f6f78012103682a1ee1ee449924f96199b3b7d6bc5887a36af073014f69c6d09b7ceea09e04ffffffff3ac1fbabb025810b3d2d1a71138b6f8ac8717336e586c9e6468e9c16fe4c20d0010000006b48304502210089e7591fe30bb8531698f86b6686c14757115ca94549704ef63bf3898a5f164e02205acb550842243013fe211d2481a587965ec6e15871a8de167b74d90b883440270121022110aca8e9a8d8073613f2bb6679e1adb27f30bd8b4478233ac2bc3209e3ce55ffffffffc638e55a19331f8056658aaf80710876bd989d15edbe6dd506daff3a8b319555010000006a473044022019ee7ffebe9aa9051ec341e174004969b37f68e9445ff0163b2d40d1f105f24a022063bcfdb705266930b59b58780b77184c7a460affb065fd5da3bbfb4f914db6ac0121022110aca8e9a8d8073613f2bb6679e1adb27f30bd8b4478233ac2bc3209e3ce55ffffffff4b93253465059f3e3d071b82b5a804f193cf53e9c57bffb94c7fea061745206d000000006b483045022100e4aa6b909a1b570f65de2ffedb43d5f9605347e24439ef30daefb1516d1a49f002203fa103a695a0318a49163c32a69d047e3f5cbf3c8bd8d630fb446209042a03d901210235598827e3268015e559e00679829021014342335233fbc5719f7d7ebc0b2344ffffffffa3c12d507bbd3ba48918034ed31ca6205937c9cf260f4d7622103d744798b79c000000006a473044022056d26108c3b18a4d0bda657c06954c2a88cd51862bc006541ed494f11d9b7c5d022000d2b50fec1f342d862ebd7691f4860127947a4458d9083e06e901e0006a43ff01210224bb22b33b20d8cbbb2a0522d8f9c6d0e78965006e443ce843c305ec9ddab0eaffffffff346e1b8a8e10e1734fdc461b6ce153c0200ca2ecb6dc9b0ffe97c4c0e384e94f000000006a473044022005336469496a9c2d03499518470486ed9ea83bdee636cb1d8b6c258679644ba5022013bdc19bfe4fef05884c9ff947d149730b207bb365552e13dcdeb30c66ec260001210224bb22b33b20d8cbbb2a0522d8f9c6d0e78965006e443ce843c305ec9ddab0eaffffffff01cd55f102000000001976a914c7fe9f2b47bac34feac4442a91176b6707aa48b088ac00000000010000000385dc4f9bd841629c2549cb798c74b2fbd2135aa81cd178b74b4bd7beec4d990b010000008b483045022100c027692a70392a9c050ac7419f9d83a4310706b96e3f385b1fc10d2e225bce7c022003c81c085c37912236b31380f6b2b81fc73dd51d6a1742c381ee7923b8fdb671014104fa98199bbb646800133c89bf55756d1074b176869efbcdc1920dddcc67a4a37e571aa4bc6e47cd1de23b6c31f5c4881023a92fb9451236144996f74be03da328ffffffff6b6202ec1180d19c2fefc33c99d1f15ba5eb49d0190501bd32f7bf8834d93960000000008a473044022025199a900727c424bf5356820823907e39b649b3622cadf4eb889ef9f98690ec022055ca1d5a82f7911fbc78e82a9e208b554c76fcf2d664f94f183fdf5a550680b8014104fa98199bbb646800133c89bf55756d1074b176869efbcdc1920dddcc67a4a37e571aa4bc6e47cd1de23b6c31f5c4881023a92fb9451236144996f74be03da328ffffffff197953fd522666bd49d7a24d57dff1631f495877639ec2d3e78f2f8f49d8ae5e000000008a473044022023ae134a9243751aa229cb8c8071ae29dec5f1d895e17806886cacfcb5f55fcc0220751a2d0a05bf544381cbbbdd55acba79f593e714dc36b08629310ce199bad8e2014104fa98199bbb646800133c89bf55756d1074b176869efbcdc1920dddcc67a4a37e571aa4bc6e47cd1de23b6c31f5c4881023a92fb9451236144996f74be03da328ffffffff022dd04100000000001976a914c18ec0550cafcd1661b88e958d14031ecb4d0b5b88ac8f841700000000001976a914d20942f56282a083959b82ffa4c50f10a63962a088ac00000000010000000307440005094baffd6474d24fa7fb48199495f0acee6fa0ed3ef92709a7574cad010000008b483045022100a19620e7a1ac74fce8eef44c62d84efecaecfadda8b34872cdfd32b26f9904070220590c588c670bbff128e2dca9d4dcd6065f90c4c1f0c15c778fff1483d88278ec0141043eac9a482884575fe2e1134ffa08d2e0cefaf66cc69522a73b95ae97c118f39b1cc6ed985c16cbc87f255bcafa39f56e612c775ba08085b157533711988f62e5ffffffffd77b0a669cbb463a132bffa0d049778c440207602c1462a23e055baa83c92f7f000000008b483045022100eb06c4c624e3714836a93aea91791d0a1af9e01cd008fd478524566d2d0f1b49022029643a7fb1df2e81c72c4a6a14e0827eefe6f8d35b000ff50607623e0355c1ab0141043eac9a482884575fe2e1134ffa08d2e0cefaf66cc69522a73b95ae97c118f39b1cc6ed985c16cbc87f255bcafa39f56e612c775ba08085b157533711988f62e5ffffffff54cd089d6f8e6c2da46157228f60381144214039daaafcb7e60fe8c5f93db656010000008a473044022069fdedb0962f635a1e5d54d7a2234031ab849949b7d4738755fe0992be58f89f0220757dfe6e93edd3ca5710d78bd351023adcf4089ddbc7a8ff2abc60d93dd442920141043eac9a482884575fe2e1134ffa08d2e0cefaf66cc69522a73b95ae97c118f39b1cc6ed985c16cbc87f255bcafa39f56e612c775ba08085b157533711988f62e5ffffffff02b5400701000000001976a91497beda08251d956d1980fe405a279efceede7fd788ac58eb0100000000001976a914ba6a7f681e57d26f1552f70db941e24b8f1ab8b188ac0000000001000000150eedd54621891ad92feaee4c468687bf67d7193c9d811207285d3b7460808921010000006a47304402207b88c2d304048943bea1312de0839bbfa143256993b3aedee941eda03a9f64e30220769016ee38f38742c68341cdcb24d215420bfdfbace3cfee18c7b758e9431b5401210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff02afbb3a433b9d188a22f52f480cdc45c77f255672c554dcaa831c8ceb4ac3ba000000006a47304402202dff316b95f35609f95589739fe228037700c6e836fc9f9f99f5da8eeca9c8fe02204789cdcb64e945ac4931c5b2d983530791b5d96ea5b8bec87c0d022ffab150b401210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff7b5b7fd0925ac938f1392bb7713720dda0e6b7157102c0aa5ede80c27223f0e7000000006a47304402202c47a78f7b8884593e1639a8179d8dd5e752f8f4edf39484a5d01782ac5ea50c022041fa721de6c0c6ab76de8b00906fed2585473152cf141bcd7f8e8697bbc23c8d01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffcfe9cdc298dd823043bdeae08b2a77dde165e7a1029ea59697c26d6670694c03010000006a4730440220225a95dcb69a5be677246464266f3400a2ffef4247ef835ad4f901acacb1e5d8022042556522af5ac96cf824c56d5961c289a6036bf99466835ef37e868b7bf569aa01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297ffffffffff75d01e9762648cfdb7f0260bc1121e1231194bc27394cafb2cc9b8e448fefcd000000006a4730440220088cf2d9d37c0fa86ed25b3149508b3897a8be8ed3ed734a8f3903a132ca5618022041daea99c62b965a8c4a9db436c5e9c4dfc3fea2b0f39b5f1f0b96b34d7761bb01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff797e2f85ceacd5f3977c81a74517b2182644b73e1b7464a9436c782b3f9b4bbf000000006a47304402206c392031f451252e477e179470b34ff79c6d48cf15e4f1fe92b83d877bbc5abf0220541b0b9898925c9fdf7f2ea99d8561f9aa87e79f3493c92e8ec4a3f7f09f513e01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffd84fbddeb99ff93cf060bbe4af957a64e2e04727e24bcb70160ab8a3ac83675e010000006b4830450221009a39f1e1bcb9ab5287b72edaf03a6036565f51f1b825f01bdac34558a5fdb69502206c4521a1aa007fcec81967f1d02900269f924080e29812a99095de720c111b9201210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffb7885dfbd3f500f70bf97ade65a99bd1c4b10b6472e8c4854dfa3f2ed3ed7eca010000006a47304402203feb717ebbc9a5cf34a3916c859d29642f192dabc3a807921fb20a43b951d2740220170b8a2a59aaee95ed2ce827639e1951d7d04b9d68631003393d8ce5bbbeb7c901210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff33c7bfc2a09acd285ffc99b2c1c538da6ed91fbb23dd0ba7c1c0cc175ef8500e000000006a473044022042bdec211b828b4fb35ab1e963f3c75f800fe5bace1124e9a3b79c347f85ffb6022058759a71b31c7e535a7cd2a5eacbdc54d1a7dc06d89a29d524c155688d07327501210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff37eeadbb03b8ca49ea492ae875dee9a3404b4ee228efc659dc8f650a5b2f1a7b010000006b483045022100d8fe0e0d8e720822c606fde1a7bedee01630152e8ba5129a55e347e57afb4a4802201cac9c33715ae981192b40e499437a41832dfcb4027d301e27290690e8d56b2001210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff083f33a77c8c0b09f991fd388e3c1aa3fdc02720c0fc48d7e9b05453f1c6f21b000000006a473044022042ace20a648f25e079d0cf1ecdf9ad74e562a7018bc7ff53b94bba4f8cae9e850220192e04b9c43d27153faa5fca60b1e06fc3cddfcd76855642e928e8a6f664ec8301210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff5a8725e516a928f28bdfa797f9b5b4a91c5e4a4508a3df7b3464974b28d1305f000000006a4730440220559a4d1f3954f6b4fff71309430465e763f5e6d6ceb08e5a8ace8c0748b011f5022073456ef435d190262bacf6ac9457ce62128c457aa24b1f5aca2ab6f1b361a06901210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff3e423119b68bad2292d499c961635be354e6034c2a6153cbc9a1485b739afa87000000006b483045022100d7c4117dee84e7e76f676c4498365bd375629289894043cd610086aa374ae21e022052aded807dd2ccd92e177caa5d08db7958d5f0b52a55e03d36caeebbc9c82cc701210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff941f1736686e63d810ce0252f1331346493376336b03704d2ddac3ead9afe863000000006a47304402206d4f16732e9ead1a3a89c43b44c24200273e989a428547d3322f9c8b844aec6e0220197b836473145bb8c1f7ab957522f6497c9be7a7fd250aecca8f736562772c1001210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff42ed61bdb2892be9b71023ae7cbd3d90b0e44813a040f2a60a0e99ad23d3d566000000006b483045022100f154cd7a6ed77ee70e1b8cf3bfa2c66ad874a5b0410427f720c2b64035f3d27102200529948c63c3ed4535e76ac57eeee5d5abd4999e406b6ed899624d9c9b8cb2db01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffff0bea498798c3d19ab17df6df9668b3aeee2e7dab6fed11e71781ae101e3658010000006b483045022100d749f1b9cf784ad11b5bb671eb944ab80301f0ff06a9f1b97b3251d953790fb002203b0d633b6e67c74cf055c395d96746bcbd9d8f303d8db91a24b02150dac29cca01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffce51322b39beb0f2cf12e48116f0f71c1995d955f7d71a79f6a601d6086bdf40010000006b483045022100cfeb04a2e44f6cc6537e7f494b529cbef1ade4f962a6a1bd91b8a2b7def03ed9022075c21a8f6809580c638aeaa28f518464f72e706cce327d627c56c89c3a24403e01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff7470bc83cf4651168def54f7e0caed83deb07ebc9799d1b34b10783983d65ed4000000006b483045022100bb8164b1ee21ab3dab377a357c87182e97eb093ed85142f7f144b09a884f3ae002204272632ecae7c02381ab2d338ec0eaf175a2c5a8d96588424f2f49581a341ec501210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff82884510e0f02eb232b590f0787f5847c893a8defc86b26af5e3cd921b9a1844000000006b483045022100bb66b2f7783c2013d603906ae09daba23d35c30986418fcaed1c3a16026868b40220285e53dc57ddfff8b493446519f6b559ac08dc36925434f0ca6868e61293776401210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff9f086f236860ac3222d043070c5a91a518be797f36429a9e79fb911e62521ff9010000006b483045022100ab794c98373b7b244d4321457b7674039d309fedfefa8a4659c8cd6b8195879e02206d8a6e913db5f7cab8372b81fb9d0c12068ac0bd08763ba390f31d424c1c66ef01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff83950d4f7573ca6888f2fb28b84c33affa02873c4681ea410735bfcd2edc2b38010000006a4730440220716a57a77ca12743b5d7b9623de2ea8014e5c528bd5adbb713ec5260f168cc4702206b58bb0599c80ae059b6e66352e40b9dd20ecf4c175e58eabf28e8f1495924f801210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff0240420f00000000001976a914aa6d73b74d2308700d1706d374b1c781eaa0eb2688ac2f8c0600000000001976a914397052deb932aee90755dd067d8bda82f6c5653888ac000000000100000008819eefc91324f7c59824140102d16cab155074d3c0e6c30799aad00b7b015d0b010000006b483045022100a8b51bdd1c041fb88fee8957ac9d31d41de594676269b298ae5a70652b8215ed02203050b1568f2f21aec6c1a48bbcc71fda0979a426a7d03d7b212666b9473d8fc10121038a67981e039f40b34b6293102a508a5591ee119e1b66ac37dc9e4a0399138081ffffffff987ea93417c0ebf535d5e480ccd3cb3c0a6eca0d017d459b25ed07fee646e960000000006a47304402203603dd25abe3af32c228158158cc9a721bef053da3a41a65fab8d6787003384d02203dc49c4ccb2a0bb7897ef8c4bf354cd0bedfe09e2c4f0ce98a78150ce522a726012103176e1a4f9910e4a76bf4a472e2383fc2709f7e0d3bd788320dc5971a91224120ffffffff0afdc709516ff038a4447555b8af227c77fe44628470ace25cd16bdea0d60f50000000006a473044022059d131f21d082791c3e6a8ca3dbe1f72c7c843b170293e463eed11451db42dfb022026e72d4755e3e2138f472cd311574139eb1e4401d8457e4667cd5200ad170b4501210237e1e8eb9d04ba5e6607d8b2d252dc9bb6cfe4b2e63972bdb456853a597faaeeffffffff91fbfa5aa15c2d73967f15996c12679a182b6b3d41a78ca7c51c4efacce8be62000000006a473044022075a867cae15103357adc16737fa35b7b6b0e48754dd9688cf1a47ec69e1a2755022030fa16e42fe268a983302786504efcc7d930e6d22b8825145118436c70c889600121021d27865370d508559487fe37a9769852a8f13ddcc991b45c4d60df94e2b2ecbdffffffff9d3f91bdf173a66bf08409a3d6776b33d0aeee3222fda32e2800bca08efd93f5350000006b4830450221009ff69b9ea160997d978ac8cba7aef5c42d1004d9f295ec72fcc873d061a27882022008ae5242175a2d781dac8eb68b3657ea025231beb8ea9ed5d827e2e6d685e156012103630d5d09a52aafade1a0d67ef94d1ec8fe036866c9a82cf1a2f71161a1721be4ffffffff9d3f91bdf173a66bf08409a3d6776b33d0aeee3222fda32e2800bca08efd93f5780000006b483045022100ba72b7c49f41d76b96087e6842ebec0f741d0b5e2c6638deae6b4b0854ffae84022056ad077a81045366d8a5624277b30e65ad4a58e2944e20ac5e381a9b67747c90012103b69a2b64ddf7df334dfe4f682d646d27db6f85392e002c3014334e2e75cb447bffffffffbd3e33cf249fa8b9155c9ec2e92fc27abf9a0f9167e3975d466a4a6b4bce803a010000006a4730440220013c9cd0fa7ec8129b55dd083ef3ae5897bb22929259354ed4757195a061521e02202d51f2d1b23ab92037139818d3704db268c5e1f512511e89dea770e6172a0634012102203d41c4ef66496d4cc2116e63dc5d1652c52793c15d69fb03d4e4df80dfb330ffffffff0991589b0f4ef4cafe6eff660bf245059c997dd97c1b08f76520a3d50b298f2e010000006b483045022100b6e571b595ba04dd47035ad43c8d1849eea92bda67112ad92c392feec5574a37022012de75047eefa4de5f0136e33fed8c3d000f4489b2ff6f9b5b51af1db2bad080012102490b994a22bbb1e4cfdc374ffc89a482a1ee327483e9ba674617471b9e3f5cdaffffffff0311620f00000000001976a91498b68ac8c1b4f6be5ed097094ebd99df8b73989988acc09ee605000000001976a9143ea27cb55ca64e3672cb0bfc5500cf881a4fe85d88acc0d45407000000001976a914f87e8dff7e529699bff8e621acb7738b15ef0bd388ac0000000001000000024ce5339ba62ac895696f36436d97bf4e014d425121107e159429d806c436432601000000fc0047304402202ed540b1a1de820ee3a9bd5c51b864c3e80fe1db0169ac7c25efc3daf8e1b47c0220508dd345d5582bcf00a862463c502aea752dabfa41254487633c3dcde03f5ea301473044022037edee8fa4447e5b036a2a0480dbf8d1d5e622406ccc59fa7e357b973eb9220c02206f96603ed379bbaaf1550569653464cd92ba6ebbfd9ef5a4a2c42ca1e22827ea014c695221029e4109cc1472143ac35d17d08d6f23fe95c24b5a9c360b16063b23ecf6e7f7242102bbf21f7d822c684224fc2b86ab9564be7288a3e28e473a5a63bac2dedb29e1fa210358ad8427e4a13647f0b97341a005b936333247de7f5740216c5578f1e3e5e7ba53aeffffffff88611fc3c1368c2b8c42992ac6b17d8bff53ffe371ebc48f895534b46b791a3803000000fc00473044022038d5cb150f634d53516f660c89053a0ca37da9b956afcf815bf167375a0b7a100220392d823fcc331f783aa934ff173b9b3fdca16c17726686dabf86518299a44e6b014730440220046f01c9ebdda922b12900b0060a1dd1a4392cb68f046ac011d7dbd59a897ae802200797854853844761b9ece265904efdc805f97db7ed42f23f7e42f22bcbed23f9014c69522102a995fb65c2cf5fbf92064447b9d1c215fc92f05355e30f7b52ebd91e15bcadbe21028fa5722254d3e8917ba54710c0cc427d8a1bbe4e89e399e555fa633c65cbaa85210286aa0a6003d61f7040799f08b30f089b2049081de19af7cc6861cd8eb977ff8f53aeffffffff02dfd695000000000017a9143ad3245fa0d8c4a9314a65f325356f7a60dd85978764d24100000000001976a914857acf0e97e5c52b370fdabe2a3872e188d2955088ac000000000100000004a9808d72e1fb42366be1dd5a9a849438b4a3d35435c484e79e2c6001d767a6d3010000006a473044022017d281968d4da62840e5c4efb2734752fc1b78296272abbfe97ab76cc2af03b0022038697aedb4b5a81b19ea05e17ae678e3035728f4e53adf762bd712efd35977de012103360baebd37277e4879282f1f1445145d7238eb7da0ad6cdee36f7b22f69b76acffffffffa9808d72e1fb42366be1dd5a9a849438b4a3d35435c484e79e2c6001d767a6d3020000006a47304402207237b7946d79f65ab032fee607be84be3b992b4ca8b4907cbfe0f30b85f942130220446f740dffa39156d9456beac476f825d56cb0868df6350446fcaa77f9cfe225012102992c388ddeaf6764013956c6ec5f33bb431307657033fecf332495a7fb32dd76ffffffff6eb389b5739d777abd643047ac6b950f70cb45f76be05c75180d7b0e390e5504000000006a4730440220357eb3025a9a0837c8fe303c75833ea49c357b20cca0d67e081f6d9e094d53b202200fd16e60d8fd2ebed24e7db7719f74cef80e380b14d2c5e87f27486a3dde3d85012102456b9254fe15ba0bf29261cfbe2b00841e4d7c5fb62aa35f01d3f74c4f3200d2ffffffff6eb389b5739d777abd643047ac6b950f70cb45f76be05c75180d7b0e390e5504010000006a47304402202b1e82c6aa5005038db66bf95b17bb3c82f3c560395e942a0bb677e2c28ffdd40220354658cc698727e7d3e3047b6dbc1b10f480ec8902f7e7f9a134106cc201e77e01210291950e0069791a1f322d6e6473b10a86f725e89c18e155b3160fcbf3b733134affffffff0200374105000000001976a91406966b3f4bce3e79188f97c6cb3a84612535624d88ac4025c309000000001976a9148b147bd57edd9ba2c9e8e232550357292707507c88ac0000000001000000042f69d910e0a58b18ebd7563c4cad735b154354b216a84670e4650d1097f9058c010000006a473044022026b54d47527544ef8470cfc09fe335d5de83b939ea14a1a543abafe5897d865902202ec5eed1d3c3ee8685077500988b591c90e5ead92a257d8fd83fdfe97625c7fb012103921c3e7f6d8a26271aa669c9241ffed0431fecba2009b225a05345bd4b922802ffffffffc1474b48ce5362b74a05475263e200f7f14f57938caa7c81bce5fb1fbfcefefa010000006b48304502210090c270be6b78f1de566f9a44daebc9d4167d1fcc25f30c66d4519b48bc252472022073eefdb9a758ae4f285976261582dce6dbbf6baf6bc739d2602076e12974c73a012103d42441bb555ca6e389ac2623c291ee3f2980d9ef365b5531011bc955c46e2e28ffffffff2f69d910e0a58b18ebd7563c4cad735b154354b216a84670e4650d1097f9058c000000006a473044022015dc0ee31f5664058620fe1ed142549947d16ecdd3548727b472387a332f43f1022075ff617cdc0e75ffa9a8a88638e0c6417ea15dd428fa16a41f0e4172bc05296e012103667504a3bc7405cb4089d11284e99aa2d6c85b95cbd2bc7b45839241309790e3ffffffff21584474d6b0b4bc8c53c9cc4b09534265fcc103e9d27a4a8f89c2e39d41b310010000006a473044022016ac7f38d01eb11cc0111c06cb4b1033b2c709fa895391921c61dc0f957a058f02206611b4a1aa8422c9444c2b16bd669f8db9c823969dd9d32be405fb05f6cc169b01210225326486858039f7de923689da08567de6b59220b5c94c75fa7806ab7ae16d02ffffffff02e87ee30f000000001976a9141cfe17bcc5282df694a3adbad05b33e86cd04ac288ac58ea9112000000001976a914c3f482774ab14e68fbbcc9b9b6005e7412aa5dab88ac000000000100000004d86d31a392e340db1849f153f4ead374dd69a98d280a21cf413ea31dd2507e22010000006b483045022100fad3eed203cf675e387c13070f12a62985d195dd0e98ff14663192c37f69f5dc02206a7d4b7251e4cc0edddeb8f527a981fde93868ece07eff6781d2e44716e7035f0121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4ceffffffff4aac8cdeab369a8bf5ca943709aa1f5d0a0d1796c80c0840e775c19fcd956283000000006b4830450221009d28de08114d2863032c1b8485618b296bc353fe82610e18fe0bc47c2817741a02203eca8b045a772baaab987253e7c12ce9ffc1b4afb6b3c00dd945f2aa10297da70121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4ceffffffff5a4acd796bfc7ae82a621d423944763de029b621d6c64bff2332ff265a293675010000006a47304402204f874e721b0642d46406d4d542dd42550f7976f763edea22be776857674091e8022016985b0c857aed4b51d9089a8a9d19bd0b37b5ca85ce77545899a049eb9ea4770121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4cefffffffff44b23bc15d7e2d7360f75d0c6055a1054d5eaafa80bbbb8e41c7ff72314e459010000006a4730440220526d0c617a3eee31d7073768e921c10d45b1404f9d0353d36f25bcbd8fae829402200f9998d6013731e6ac9b4a72c207e0f7ca662cc7b2ed2a8e1019358eca3c9d530121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4ceffffffff02002f6859000000001976a914872166765f45d3125a6e7b464c6adb42b44b80ed88ac76671511000000001976a914187381f0dc68434d35a2acf06b763ae25bb658b588ac0000000001000000046f86122af2abc36cd18b9017f5e218d0aeb0d48cd8d678ded1f3b7220a416fa3000000006b483045022100cfa0f801e12e7f9e2996fd57c51b3e0964cc2ec77cc871b2b20669af6027fd7e02201596d6e2cc05c85c1f1b15e3cc233bb1212ac6a1f578e8e37ba522399e9c1691012102e17409d4791004d9a3b385f38488f4b23733b25786512cd93a8010cc9a2aa9ecffffffff04581122477ae8acebbd7478151f823889d65df1ba47f1da0121cca34da0d36d010000006a473044022079e1496a985d36b491a422b172c24f5759411972b23f576b1413c6616890f16102203cd56961761bd5195e0800a3e6533cd88ba7077e849756ed1cc170105b6bc8f9012103fc048737cb94121174f58a314ea6c1a0005916fef76caddf0dfdafee83d17c2affffffff8f353e7d36e3fb1c11fc9f7e3b2dd50e86609646c0bc01f729946dec6687db33000000006b4830450221009c656ef4c7adecc1e10ed57f0ec7a6e9239bc7be2b09eb947396da37646e08790220142a96f0b572b72f91feb6fececb876eacfc3214c0b953b790db3fdbaf4a38be012103247e0e71ee443bb9b1de408b97d87649fe5754d80a3242175720c1b3092221c8ffffffff49f6541e700d9a821791dada89ad66e5b5e214486ba4d60caa30b2428370b9e1000000006a473044022020369771d94f1a424c67c4bbaab02bb4b23d36e25963ef32876b1b5d6ffce60d0220486ef8e02ae9e7bd2a07510aea84c9ffa517cc33cd85421683359959af9d046d012103b2bfd7dd05d860c989b3e2036a13d7ded1ef9ea7371e6c0ba9a49919d3bc718dffffffff023c481900000000001976a914df9dc0d20149390c51d0db0be76c24d1cdbac56388ac85d71b00000000001976a9149132e50950edf4e22b0913e20cf268dc328c484288ac000000000100000004c091f9d6b044a1fd252868ec88a925f68c97e3890aed180c3624fffeb62e6bb0000000006b483045022100af59c0874ecdf4c86306d7b4290ecb2efa7aab34df95f11a62ce9e1e5be38748022078df0c8dd9a39d44afddc9cabf4a7b649c6e2cc729584fc28a1153d89ac4429c012103b215067780dc087cf64bf86e3bef6458a4702e24d8a1a64786912ed6a8f04cb2ffffffff09b0aa0461429865d6bd65788ea7c3ca723877bd45826d7ac3c9aeb681b04f5c070000006b483045022100a760218c4c33cf40e8be1eb8e642a976e6f46b2fa0fc136a74a9b237711426a002200cb66f03fa88897f825f788e4a78ccf5f993f788bf0c912b5e4213802ff92879012102ec7e292405b2d9650af62312ce38f3d224a735ede955a7b62a67f0a487dc20e6ffffffffd45f83dfd49dcadf02ac6716c39d5d7b79cf2915466e2bb2347d14d353a2b49d050000006b483045022100858917399df867452d179347950d966b5964ddfa136cda7f51bf0002bf908e9e02203b07ecac7ae839da535e3113a7a792c71fffca257a1576f651838330587378ab0121030d842fdef76774c27c0219b891fd7aa0648ca647f009853caead84b2c822d2fbffffffff04eada01f1cf34f211ac22a7323629043b9852a6e3c157fef26a2df9229d206c000000006a4730440220280f97135e20900536bc6ec1809ab907efb81c1c5f2cbd741cf2b0051a5378f90220699754cf3eed6da597ea4b4cd964522f42ad39f0319a95a5dea0e0a53aa74e9b012102e36500ea9b9af4cf1f7b70461614bc427a72443190ecf032ccb53ae19f0e53c0ffffffff025d450f00000000001976a9143704bb5562051db89b7ffaf94ace4d49ad5b11c488ac01199404000000001976a91473f4cfee8d7f66ca82f82baca6c54fe8603c8c0488ac000000000100000004a76b969761615a5671cedba45a67f8051faa3be672aa0e2ab765d3e1e9406669000000006b483045022100e36e9a28711c767300434f3be36e98b7fe248e146091b1469e50f6b48959a02d022018b8e9f724853c59ba686b887d01488c22e11c84986a25fc09defd51ff7fd0310121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffffe6cfaac578c5caebda5aee698466583532b262bcc5d3c51e5da93054dca6111c000000006b48304502210094b8d219a82efe1be7a9d842859dd23ce195e7aad99bca186bf9539a7eb8da610220784353a960e29bd8d0d51d8d1887f968a4b5abd53ef2d70442aa97a45fcc866f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff53ec47319ef2c9daf1f34164d5174fa9f1b5104544598e3e2de1b2bbcc2eda44000000006b483045022100dd4533718b05d90121fbc6d1115d1932b325ce9936f8f667359af3d180c0aa4c02206f2d9fc7dc8b2b5e98134755baaa8637782eea74f9f32d5a4c12974f552256f90121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff5ce0040a695fcb46a324f93ebdc0bc171c3820e082e42aa09976ab4ee561737a010000006a473044022072977b3c4c552ef0f59b516f755006615513ce68fd0a43f6820a9cec9835cb9602201e7f77d450981e2646de2e382af3847bc597cda3a5add10310b727404717804c012102715cb8c7ebeb081b2126092171aaad613a0ecf61cfb6b454e1a9f3a4d1e25022ffffffff02a0261100000000001976a914004a0481479b06d262a066121ec8d1423a04f3e988ac70d23703000000001976a91438860090779c6df12ea41cbe472359b62957527188ac00000000010000000b81bc3de513c67613d87cb7a9f2a1724fae68d31398f3a14816d695311e4c45bd000000006b483045022100ac4fd58a8fbd2313e5ac0e43309ba7f5094d1589a241ab83e945f3962065befd02202c6bccf44c87ce7ed94844c0157a4e75e2663388e7fa6c26843043c14d0153ac01210370bda3953f887ea377fcaedbbe70b1fb3bb8f1706e33890fc19762191ae975f0ffffffff81bc3de513c67613d87cb7a9f2a1724fae68d31398f3a14816d695311e4c45bd030000006a47304402206b1f047b474de8f6019292930e0a83e24249fce870c9d82f7560cf7dd5ac496a022044366d8e639f0d5704e5aaff6c2f2a90fb45ddc3567f8c1df62d2f70757e4fef0121037306a3293f071ff9f2bf11cd6cee6f8ae1fb37e1b2f40397eb403e2e6c0afb38ffffffff81bc3de513c67613d87cb7a9f2a1724fae68d31398f3a14816d695311e4c45bd070000006b483045022100b47d46a53028b8958be5533d2ecc992adf47576071e823e3bc72dcf0f0542c1602206e928913281dc8ec19931ffa50f5451363a0ab9e719664173a67215517e8d0a50121024a512e398d4809589bf61bc9d883f5a7b261d16d3f7ac0b51f345a090c53a372ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4000000006b483045022100eb88e519991237c788d25251031cde1660177031bd7256e900f9ef81578c437d022071abad8e8339346471acd4e7afbb2f9fd673d81b962484dd0e6789bdc4a51d25012103ced4017b04a849c4ce47340953c50d4d8e98420db4f7ec5a0299c3b331456517ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4020000006a473044022028d7cacf11e28566264a33f11dce836cdee5f25792a5c18817eec64f4eeea049022006a61c77e5e91ce6c0e84dd38fa8948b3076c9a6b2f197fd57c12146e3c873ab0121032725d4e881be5db8a2e4b409b2b541d4a3c2831434277be38958ecf46a720074ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4040000006b483045022100d12e475e9bb6600d7c0fa72196b2965302b03684141bc6468d11c4a423bf44f4022075ca23aaf7d00882d6d952629428ad7d42a1d78d8cdb116f71b6735b0e5f4b040121033b20a6374c5c9b28c286037e482c06a6987994606dc6cd0f8600522ddcdb8857ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4050000006a47304402203a2202058f683d5030499ef64f84dcb699d4bc271fc9c066faf20113a4458a4f022045326903e2249910abfe1fb6172cf6255c8bff7edd4893f36a8e694b20f5e89d0121031c6c03f8be7fa1d02a5c08a6917ab587fe575c76bf1ef9e18978def130bb57d5ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4060000006b4830450221008eb76c20bc8cec96c2ea68d2cb6d41579b7f2832ae8af062a97df207af5ad1fa02205622b0c7f6a8cbe82e7b28e749b306af3ea272e4b63c6f3a891e7d2e79c67b63012102e143780bc5aacf49eb2f6a7dee340d7e36fd392558dc6b485e66da6ec8e61e5affffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4080000006a4730440220169d51188e8bcedd2f8117724324450d27cfec90e4a9142ad62ccffd83a51418022016b46a2a7fe1270dfb729da7d6b21c2f4efcaa0e9a033fd3a914f01c4cc9564c0121034d5b5b22be51662a7bf43194e8a818e7a6338775dd4ec9f70c9133982f71f3a9ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4090000006b483045022100fe880738419f23d538debd15e9a6f2bc54f8adb66e6016097eaed63aa1f5c0e1022019237739ea8932041f4cea6c0a7d66ece41197b4edb3a1a8d4288276595be5ff012102dade633be2b53b6bb33d1216fcd839f37079af8c0d27b37dad1d23da2a724534ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e40a0000006b483045022100a443e547efd6ca3bfed49af73ba1da0b1dfcf573df61c4b4bc2b743c3bcfeb1902201927fef3938aa0ba247baadf065eabf46624965ed705819c9c30131b4297f77a0121022d4aef0b943ff10a5db9cee175d6b677a0279bf740b85a3bffb38956b95fc9d0ffffffff0b00e1f505000000001976a9144f34965f7cf7468b1c5cb931ec0dac228450c7ba88ac00e1f505000000001976a914d0b0b7b3bc6e40cea4244ed4cfd98792e06731b088aca7a91000000000001976a914fb5621da951819e6c8e197dbeccd39dcc12034a388ac00e1f505000000001976a9146ed40a32dbea9cdb31a53ed36dfdbbde073adbaa88ac00e1f505000000001976a914dd8fb366dc97c7d61dc387d1cc5b31403dac35b088ac00e1f505000000001976a914b0c89352d5a4e9d55d4630b927b759addae6587988ac00e1f505000000001976a914d8bd8f30b4afa83d35d51ad07d7bfdfce5f3421088ac00e1f505000000001976a9143377aefeb352fbefc7ff051e33b417806fd5772788ac00e1f505000000001976a9142383aefb128b96b8fa51388017531d852de839c588ac00e1f505000000001976a914a3081442f2531f62d4dd7c2ce3b04cb63a15874e88ac00e1f505000000001976a914af5f1ff37d57c8c6031cb8a3c3a0e8e69b72bb9788ac0000000001000000043048434b55617a71edbc0aad8fb45486c69043e4df6c920ccc8e3d834dca046c450000006a473044022054a9c5d67f961ec7af89680e72ab3343c9d3de734e824c69b4fa77956e10f8610220217a0b1bb8f9ac186a6859df1925ef682675da504657b4beeb6f89ca34e2791101210229b0a6c102bf5c905d4bcf7b6724221fd978ab4ad42dc50d6b7a4e29e4abf168ffffffff43d6b66beb75fab0b69bc0e9eba35bc83ec51cde13fc0e93400241324f695e9bff0000006c493046022100cb228150748d3b22354c004961e7c4adc8dc84b1df48017f866664c20ca52e9f022100d76507a0865d54b4ef85d7dba59d02a5162e5ba2de1871962e37b96f142a71a801210229b0a6c102bf5c905d4bcf7b6724221fd978ab4ad42dc50d6b7a4e29e4abf168ffffffff65e8ab5e443bd8fb64f149d726113cb638dd18e5d9eebaee321d61d05f4e56f11b0000006c493046022100af628ae05abd1a15796dcc70e6f3f5d18f2f47542425811e1ebd28d4cd70fed7022100b50c02835fa510ae42a1769458c67e8b7a3a7c16c3b3552c061670681306f87701210229b0a6c102bf5c905d4bcf7b6724221fd978ab4ad42dc50d6b7a4e29e4abf168ffffffff023b06deeb2a5ab76b49efb698a6595de7f4924a6cb286601e0907e4e4d955a9020000006a473044022049c0677bae6785795e4e73c036a8051e5973c6b161623cee67aa7165d71f221402204d5172511f479dc80f8f89b069c1b6c6c92eff4f78f7ff3a315279506f5d48c301210261106ecb8cf50532bd50c9189f1ee971e4869fcda56e2f1193e7d4def7eed785ffffffff02b3bc0100000000001976a914e2b94a36ed7c4abee24f8ac390940cf1645882cb88ac6ced0000000000001976a9144f45d231b5f69d9cbfdf4124a864ac0d8ad64d4188ac000000000100000002eddec1fc14de1645a7b534ae4b8123e5cf48c252382a16665b32dc72d9ff9323000000006b483045022100ca44dfa913702060b34f62f334f89cd582e3e6d4e7d28c2fd74fa531a04a974a022079f51032183f800bfb42693f1264852eff33b74ddd4589385b01aa576b18d79601210314f9b7d67d523a169e179faf44aa1ec37f80ca767573f742b7bd1f8046eeae60ffffffff4fe25062aac5f1784d173aabba656ce8f0542dfe6fae4e603dfb38eece1e493b010000006b483045022100f8ca99a3270f16366ba150ff3d67b8cde689e48d6af9d14a4263e34462157488022020c9469553fc50866484a639ec6550f44b666f7bf47d5891e0732f08b6b750b50121024239c436650505a685179c4465c43480b2dcf5ccf09cf8e5c9b987f83bf016c2ffffffff02b3bc0100000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88acc0910305000000001976a914abdab17d18308bfeb8470a846f9916514f96ed6988ac00000000010000000e1eccbdb45c491935639c9b66b72bf16d8c5576e17bb65d8efe5b1d3b2b2b2b3a000000006b4830450221008944db7ca3b10067425b511372322e8c00a62fbb86648215b1ce550ba19cfe7d0220761b2e6eb8b368eca17965df25b6962eda141434b6b875c5e5779f0c06826f09012102f5c481ef4d22a7e34821c8895713c7767a0d488b762073af1e9149e133616c70ffffffff832f06b1e87d12646afa819ac8d9726d7922e7b77f9a118090604c5ef84749d9000000006a47304402206427c7770555138d853f0a80dec5aa2a3e1af2a7bfff121624eab92ad86738da02204d6715086e2abc3ed1d9c01992f9cc1bab995ccaf241c28048603c5a7f7486f3012102512e8f9d11e85db35c25cebef218b145823401b1f1953d7b735671179c1996c5ffffffffcda6e2b0b4bbb3e2d7b1aaae693c638ab79ebfd9eb320724e2ec942c2c712530000000006a473044022035bb82942bec739e7053bf027d9a131d9ff4e418575b8664483f8a2c1d83ba4b02207cbc9ceeff08261da12867f61943cf1bda5ca68740e71b9dca8a6fa4d4e53b1d012103bc1ad40a3dff2ef9b20463e77f1f21fe84274ee72b032ca51fa96b7e572d2011ffffffff37c1202665c58da251423c09919ebf8846d25a729e5ad6f6e0189d6fe703ee66000000006b483045022100e60258b2ede8aff281f74bd61faecb34a700dfa1c365e7f28d13b070078e1833022052826be3a2754cb48febcdcdb30cea20421a4b0e2316456472c0ede41718886d01210322294cbfc1e382a5b679448d7f955c986a2563087fecebd456eb1d0a8e3fc39effffffffe42550ad7f4dcd3091efaf87b590be523c0f789acad0e8e455a211086173d40b010000006a473044022011fc06c473a9b01bb50026913f3ec993f4e113d97dacba2d8919bebe19968eb902204b5989c935c2cde6291dc9434f44380d1943a7d20ed5f11c716906b091f492e2012103198553c2ed54d3c000cec7c48fe330ffc81cd74166ee6d14d818f7d31d7da607ffffffff17903c7e53fdc3bb3a887a44449cb8f84d4e8192a23e0d68c3e2b3c40faecf41040000006a47304402205135b64bd95574ce423ef65d492f342f4f0b89974df1f80c8fa8e2ec734b303302201cbf925be716f2fbb4ca9373093caf751a8052c958579811bd6a70e59f4dd9c601210353597b12daf4531de465ced64d9e66f5659ab81507d6072d26758274f6d3bf17ffffffff256a0d2cf29b1e14b2e0cac4dcc34fc00989c1df6256da96921267ad19406178000000006b4830450221008c8096e7d8bfe717a6e5ade9f6ee80de545b4ea150a3eef7163bfb43af8213010220415dbffe504bf47a52f0ebca4a8273467aa1c726f193a57d6bbdc5a94a5d8023012102fa223797977099b1d2fe22fcff8fe0f22b8e3f0a31545fff8f6b15ad64ef1e92ffffffff0f493c25fada0542ef3678339f9efd24c318945e87e97667b165df02e90cc4d6000000006a47304402200cf194e8e45a11360a4fde3d7e5f8e8c145d87419a69c67f11a62ff8ed650031022046a6528f085db791a9d5681d3e73e8e737855c522f0ff83ee82ca6b19c23e172012102a210cf6f57f17cf4cfd379aa649f5977515472ba77d5fc23517d8746c8c6c48dffffffff9a6779c9e474b79c2c34133d114eb061d05b14304e5105e1f414d808c5f880ee000000006a47304402207b81d12d834f77b22353d68c6a7b300e6a5a8d9e5428c37f28d0e9f597e6d02302201d512bbefb2350ce0701400f308f3016eb5d70f2d3e7b8dbd39b9b2e776caddc012103e611396508c8648cfc348ac1167a227dcb08e2067448236b6288806558e2a9f4ffffffffceb2ff8d229274cabf76baf43d685ac4de2cf560e2adfcb99826cdcdbeefb66d000000006b483045022100dd151c8327b5c385f4ee572f5149383900118c099a19c2b1ed83263089b50d2e02207e58e74ba95fcf57618d3aebc109f46bac5f46d6005b234831c4c2c684d081b9012103bb7e4e7f87f3ec1e69d47042636bd60cc8fde3e2cfddc70ab5a58ea9902ecebfffffffff6941a70b4b3898d9ee26c15069a741b61d807978093af79eb809e9b4831d35e5020000006b4830450221009c066cf80849f8b4a0a3dce862c4647bdd5c0aba87ffe3c86fa3777f06457d8a022022dd2948a53402c8ee9148346b897281509e14594b3621820d6092d2567d739e012102a62b9da8d00a065563c4875b20c8d8626274fc9a0e098e7441aa9f30e3f07be6ffffffff741df0ace0c9848d676c21014fb7a64bc972dc5c1b9d09882e2dd05be0713a76000000006b483045022100fa07ce177cf69430978f858c248356f9f338a61e92e0b44cc7ad2ffd757621c3022063dd40b3d6a10ed7fd8424d589d3dde8b32ddc7b1f0285e4b21c80b3160ce938012103198553c2ed54d3c000cec7c48fe330ffc81cd74166ee6d14d818f7d31d7da607ffffffffdb65bbe6477accd63f09c9eae81dd849561f53f8d5347cb1cca63fbc54462918010000006b483045022100c307d054758453bb0d00d7351a3339fb0ddfaf9530e3e57d2325154002574757022009cd09bb5607c48b64453f1b1f1e548792c49c10d7df87566cf2ab154b06f0080121029c5139c0bd06ba5cd961d60bdfe0295735d45d0f261d2dc128577d94247d1892ffffffff91a1361ce520453c78aaed3edeebd7af223c67f99dfd7e4a75ecaf9bbcba3fc7000000006a4730440220370e0dfd3241f2aa1b0e6422cdb997e7cd5a0a18daa3fa5405f2835483538456022069608fde2084135ed7764fe3a775df9f79b4781c6475f822d6012522a7941cce0121025c94a0fa16542482cfad7cdefe74e2781be72b43a12ec543cbbba2a6a23627a8ffffffff020358f660000000001976a91421d9a838ced609f2f42528a2af4391854ee764c188acc4800f00000000001976a9143a2e1595324d2dbd05287d72a0f4cf0014b0f18388ac0000000001000000072e1539e1086947ea5fa180cb1b768acb9798033038c0c7e1f85abfeeee9524ac000000006a473044022040eaad587504e3dc05399500554fc7523617301ef4029090bee0be0c3429a22902202fca55961740c7c2227c774a6aef1e4ade5334788616d7ca3444db504d94411a01210233823b7b56598284786ba6d8cfd9ed418e09a87574be33059887c54e78f15449ffffffff93c715685f2aa2ac0deedd01d514c6f2cff438bfcaaad42f6590d5245115b861000000006b48304502210084db57a857b5130ea477d3dcf65b85a8b1f4d118edd27c257ddc1934bed0c788022051204153c48fda2998d35e88957d4c7f696e018d5f9e81095a3fea80fccdbf90012102667b9161b3a987d1ae75d08bd3caeb037bc05859ce4080c799b920e7de34152fffffffff59f28de28df36e4a65c1afe2d008824536332bd4156ef9a722391bb8dc93e6093f0000006a47304402202985d68865c240f401f1a5206293354df79016989370368ecd9d6bd6ad67437002205f55a7f97ceb235640cf677aa4bca049c2728e3896915317f7c15ae7f1f3139501210285a3bedbe36f3c54516684fb3ffad1421356654240d5a6ddf5b20ab971863762ffffffffead3e0d9e44369ffce58cd281c49d5ad8f39c49cb65fee366461a2f5c982cf4a000000006b4830450221008037a38815035343b71b44ee691bb026e087baefcaf8495c9762994b0a57c7a902207544797040e8bcf73a7328f53a77e823a482e2a8c902e3cfb9f73c0dff1fde6f0121038b6540428c0796c6a5328f114ea7edcf360e38ed893d14041de1bd57d917d19affffffffa76b5e0b1c7d5fbc43e2f698ba995d56865198e8439e7227b7bd0672091cf6e2000000006a47304402204eddf8d81b97845ca655bd7ae1a6e29275f17b4b1c301a20db0d420e3f9395980220527b2563153cfe48dfbd2671c294ca0af86a4a1083f6f4810fdf1499f1221cac012102f70467569a29375dae92d35c007d496de6733e930ea38ea29d47299793f2bc81ffffffff1dfa5428ad8c6047ca78d63f2f04a129059cde969076d65b38e47ca9e0e4cc88010000006a473044022010ebacba7832aeaa70b0874b61051de864f26e83630722fc8100e259953af149022052b707fdf8ce506690c0d0029afabc41fcff292b805966b25ca8e679289ddb7d01210282b42dc8fc746b376c1641f33cf7c64d222a703aff32455afe75e9176713d0a1ffffffff2948a2530101a4ed00167fec66d3b477d8348c421873f65d6f7507bc77055ede010000006b483045022100e007623f44b6a33322438aae23e4de3f256db3e69f3511e30f48bc644143c81c02202edf2d8401af6585d56ac30c7a83efd88a443834f7fa36c1f524a97c60652663012103c8487b70c2340b52542918815ffcaaa2623bd1b4d83ca0e3ade700e4dc9a6944ffffffff02f718601b000000001976a9146704f88d046d59c86d9deb2e29d237b9cc7e8ccf88acf1440f00000000001976a914260cfbf537d5401e5fe60c6ef9fa72348100d6c488ac0000000001000000196123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df0a0000006b4830450221008525ee1d88c93e9b2e0d4997a0a5e986aed404def89984f7650e27d8cf07e5790220359777703be7bf01ffbadb124a5728863641746c7da6cb5c3b5bbab2f8930c04012103e4ee7b5391ef723aca40ab8240f4d9b58cb0f6936c84a450368b8b1baae29a0dffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae7120000006b483045022100b77485adad1a5c364b48558f71425ae7a9a9e82fca0ad8faeac3967e26ce335d02205f362010c8c73e95a8d5e2e31e36b699ec67ea1e8659b4266b15384f73136d7a01210393e146a26868c645ee396844e37de0f935e1424123f5c0f56219b67cd7452fd3ffffffff11b2347e7261132e65c45a5a7b13536e8a64e7045bb3806846056ecdd3b97258110000006a47304402200d65120d022fc8d01e67014adeed2c7be47ef48c84606d04f58de1894505cc78022023ba7e93bccce8952c12c9168679ff9b0f3fbbce87180ccf025d45ef6c0372f10121035b987d0b0680a2dc3a6df57d4ab197b4f2346063f5056a866074b1547c90ca22ffffffff2547aecb2059ec30030e576e24505973f603b082b9f4613ee307ce0d45475fa9010000006b483045022100b8f8eacc70ed3e59d9dcfeb4b9752f2cf4649aca6096e14e954da4b84996b0d002202070968f771031476348fe7a0ebb07c9a334d95b3316953f00a887043afab4940121036f6cd5857ed89ebe2dfc5bcbda078f7cb586499acbbab4e310ddd1ad0dc8273effffffff800b9d1efefcbd90c435e63deaad265211c412877caeb786ced3c4f8f9d8a53f130000006b483045022100aff9cd832df2b974a8b06dc80455ca1f59557e3f23e22f1293e1bf0753b9a3d5022004155ab666c1b25502c793e1a66945d583364771c0ce15d2e366867ce6c2964c0121023fc53cb8fa5b23ccf95a8a8d16766cd754a256623820778b49d3bd808814c8d7ffffffff4c285e9e25b6799c9e19a65d5afd90e5a85a339ac29d1250c8d31535503049de0f0000006b483045022100db6779bfd8c15a29d5cc2d878b6cddcd71ee2cc5c6084f6e5db884d78e94d70502206f66be54472e08bf32b96333492938c089dbd7f8e6a1f441feda20d868dae59901210358afad1e50576f953d83c0a672dbf62623fef593cac3173eae5677e3451b090affffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208140000006a4730440220295be96d97a453e202805097a455ad0503b3fb62061cbe60ebe8e08f319834d402203bad741829ee78d9a858329f229118572f3c174ba37b3e9926018dd98d224475012102cbe176d942189550647429e6c092b135e7d257a45c32ea06686f158803c3d3edffffffff6b07d42eb24afac92e9f07f8937ae84e081394c110803dc8fa8f94e761aae3cd080000006b483045022100e2bf09bc5b67b1064dddfea96c56115b6a3a578e388fb6d9439abeb7f87228620220382e5794469975f626b09cc25520ddf0182e7cb0a58ab6804617273ac47b69e5012103c1b32a9d55335c7b5147c5bb80d1565845fea48c066583c912f60ea440c49b52fffffffff103049e0f0c7733038df7ac3cc3ee0ff18dae2e189283e0054f4b6611e3f6b9000000006b4830450221008f5d11da1b3ef7a0ac5e86e05ca503fddd8c4b2d86fa5e7416e569c7285a2a720220601af3499931e59a003e8069f2e04a01e8fbf8dc492fd5b5eda0b3d2f07c71d101210340f7a7827df5cdac10dc173d2f103a806a17496dbccd8a001e52d76f03050c80ffffffff6b07d42eb24afac92e9f07f8937ae84e081394c110803dc8fa8f94e761aae3cd0b0000006b483045022100f1156c6847ab6bc1a05b97c8b6d7e11c237c20e52155ca72632acdeeb19371a20220441d0a6fbabf83e0eda37e05b3b0a529f0d6235940b213ce6dcd60a576e3ed7c0121032c6c3eba03ac9b09130388468f07f4c03b2736cb73e8f8e870f8562f09350c0bffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208130000006b483045022100b9a5641cd8438395d311571d80eca4c16b9bc2cbda733f1e3dc83002325456e802205987bfc3c8c88c559ad07c568732ff899f93754f43a1291e2aa1cb83ef4502b4012103cdec1777bb145b9345df1875f15403070f408b9f69e40e4df4e9a7812a7a1374ffffffff8645c70310ba0f150c831ba92431cdba992b32348331b29f4b4e42151d674821110000006a473044022039c5649e2040b08134ebd78498fbe05c9dd5a3b7d9788fa84485a96f50533b40022021b96c3991d95b47585816c5914249d8e76f7237d0944c20586c35042ef1d9bb012102e0019fbdabc94eaa2323509f10feb15ef48a24a512b421fc0d27f74ff777a7f4ffffffff33de68e5fdf1302b3ecfc6e79b4da0f50810d4d98dcfec43e58913698555ea70090000006b483045022100f4cdb6558c11abb0da8ae21f6a7516f82a4b36c1af71fe8e93f41036d3d57e510220646477acbefbe10e679d0c8eba8a479bec25873a16f1d4022e34eb3922a4d2940121037f756d9be788b7d1d37472c890f2b9b6e7c73a897de7e2c4eebcd171b5d1b244ffffffff0652e525b82637a1838e85b889abb62d30c895b5642755147066f2a3e81af979040000006b48304502210085024477c17dad2e22fb55d2dace00dd2f2f028e14a38b47cc71e1ce0be018550220705dbd7e8b64baf8388d69a4cf0b516ff924d57dc8f9dad4d8b8e485f102d751012103da22982eface5c52469fab0b15ae7850369f892ff030e0223e4a90a4e296fa68ffffffff1f2ebf44f950419ff2498c15ee0c7e1be2c15374a2c8422d7476414852d56480010000006b4830450221009b07a4b6963fcc66c2118463225b52a75bec9fdf3863c4774ca836a5a5564eec0220239327d0df97b7e56d1cb2d401b12bf3185293c3dd10ea637410d21bf60b267b012103b0cdde22301f2a0ef9f23f435a52e989a244306440eb15c712d5e373a809fa8bffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae70e0000006a4730440220339e2bca1ecd2250b0657d8f6b8b2d353d35343f56abc231357dd44f6bb0839e022071b9a535803569e9ac5a490b6aca3f9492354892dcd0090bfbf98c3d58e8c049012103a02544af63026bcded0b7cb4195372cb5821ac34a55bebc3de5c83e8c2b930aaffffffff1646b1d8fe71e508a0a85b82858195a82176ec104b2b6505304de91bbd8faf93010000006a47304402203ab05e63ed3c88bd1157f6727b928c7f3ff0779dd16d87d37b840a310996db3102205f69015dca42744841cdd10878049a79d71759137f0a344bfce6a844ec48f8d1012103068056870eee1c8b00579edd794a2279282e8cafcd3b174ac0c593d0b80e86ffffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae70f0000006b483045022100afeea65ca40aeadb0adeaba2c959319d4ef6b2dc138629ebbb65b9908800ab16022077b98c4ed7de26c12c1262c89233a217979a8f878c7a42377ac4dbee253f0c660121030d93148f664dc156bb8b63152d319d5b4efbc77e3b843651d2208e4a488fa9abffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df0c0000006b483045022100f5ac603c8795ca69bbb54d51f17b7123ccaed647245ed82b1392fa16d0741cb1022017cc07628f3442ade369442ed5152727ccb7bf506382c87afc5547d3ae8dec5301210384eaec7cc1826b5d8d6b5e44d2e72811813e87a34ff4ce4bb8b8fe3aef9b2ff6ffffffff4b641e8ebc9112552ddade99cf5c4b8816fc702be843eeb4a74b45c0fbd5f38a010000006b483045022100d0822f15f80058943608f832bbad476cfe74e836c7dc348ba0a9b38b37720f66022053dd5d7d14ae4171453a52e3966964cad0bde8912a28296145786356a856dde1012103eeaf93693efb47aaff34cc68976deef62e72561a86854ae18716619f66f29eedffffffff4b641e8ebc9112552ddade99cf5c4b8816fc702be843eeb4a74b45c0fbd5f38a000000006b483045022100a823704d9a2b4f0c51c21418cc111e739a3b90f011b6416d7dac4fb6c9097efa02205d860b0efd53518f62b85d284b550f4c422179a8d219f085d467305b5678d295012102c3f644ad5286b43c6a09b42c5435e87d760d4acf1ca2b1da9e0ce6daa08680f4ffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae7000000006a47304402204059941c017d85f8b47cfdc80021b1c23840065269c635c368390812e66bd5ee022057903722d7b25a3b69e13dda6c7aa04bb13b68b21499cb1279325489151df61e0121020cfd19b00cea2d696cd2602dbd8af999b997180ada23cb529103950426d31911ffffffff4dae1e41262cb398aa5fc8ec9aef959717a6630ff9ec4136c41f17882e22b8ea000000006a473044022016d06fa7ac16419210fa2bf31c208f7fda12a0d0dadc400b656f33f8189ba0ce02200831908cac90e133232ebf4794374a45a24ca6ca8b8acf9c16074bd784802a9f0121033ddf9500db250a5fcee739dec8a400d8b9b1c12ee89db3ebadfac4d9ca2224bcffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208090000006a47304402201f3db7a9bd47d98b402a4fd13e71bf9c9bec523d46c40dfe559399c9b61773a2022067c20c6de6e08b1d91cc867609983b537a05b081b9747760a2080036966e91c60121022e7b8f0cbaef47ab2c4718ef64608e61a842dfa0a8d81d3ad09db1ade341c03effffffff480cff04343adf2cb53f8eb28cd1fdf66ccdee8f1d0c856d7e248aace0cf1eba040000006b4830450221008930e7d678df725dc0af6e1f93713ea6f47250cfdd94a144f28ee8a10f4e102f02207c824df7bbb00c70007c4c40c70be7b79b92388ffeeef7decd4f1276d6e606950121021e46410e1f9aec2d74a6c41ed052820892c97962c918a306be72e1bfcfe3cdb9ffffffff1360566c00000000001976a9144ce1d946f1363e56cad54c08892cc9813a71785188aceeac0a00000000001976a914b3960cbeb5b40d62b92c90d8b8595df75ca6f32588ac90a38cda000000001976a9145f1708b2309af60159093043612e712c7187f6b388acc09a5e00000000001976a9149f12cbdf26ada0ec436edfb6aaaafd57f7a3989788acf0771195000000001976a914619975a78c21d3861c5ed1c0ce07653734aba4fa88ace03b6600000000001976a914016279a75b692e2894e2f526c955333695c2c7dd88ac00e6e849000000001976a914cd98fdd77ed0a1d2135291ac70920e35054ae56088ac40b56400000000001976a91486211625adfc6701c5af9143e0a0ac6d63916fdf88ac18ca0700000000001976a914d61c32ded3cdd773f06e109afb501ba4e6b18c7688ac50bc1600000000001976a914cd4a396eab9e4bc08829c94bda8466541682431388ac10270000000000001976a914b41bc220da5ecf631e50acbfdffdcf87fe493a9488ac10270000000000001976a914c0d16bd11bfb9494330102680a8b2c91ac8327c188acc0b6f394000000001976a914af647292f4c4d2e72e85a247450ad178db0c704688ac20f1ca00000000001976a914d380fd4164562b1be77cd9537f52c37f41e7f50388acb02e052a010000001976a91403d1cd2e83d105b05afca9e994072f54bc810c6688acb0481ce0000000001976a9143f32c0c9c9acb07a1476f0facf0b3cb38fc1c61588ac208b784f000000001976a914f65d9def92b48dc39df611f6dcdcebcbcad709bb88ac6e5c0100000000001976a9147e2a6256be6e638678577eea4621da469f02b83888acfed30a00000000001976a914cb1672c8495b4ece3a9de72d1def0ea2471eaa0688ac000000000100000011159fcc9cd142529d7e2460e835563ac6b801e07a16e18041ee8cc216fb323b35010000006a47304402207213ff7c207a465802e89f71b0b245d32702b16c03680a705183ac8809c648b802202dfc1850d5c7b0005482bd7b824dbf41c169d5830842f37b2991dc8bb831ace6012103ef3aa7c1538d0a3632ba9463af6c080129cadf4f6819117d962fc0e2b3fd2a33fffffffff511bfc106d4b4b6606d1f7e4c9aaa107073283b5f526fdf42cb10fb3ae67b38000000006b483045022100a3126f15b8c8e239c8537e2ff9327001cb56e6e742f40aaddb8ce4c1abc4d5dd0220510f953c1373daa6626daad1c51bf3d507e410ea85ce24361d6da1385c86f0be01210261d83898b6610809fbc2d5897dcd645acf86704e61a1acddeb5fe4b98dc4aa35ffffffffab864c168689d5fb2ccf5dc242573950f34e988ea89352c6563cc8153fde8a95020000006a4730440220292175f6371216e9bfb50fa8d0bf15cf2bd0be920fdf4cc2f25c01fb89ab90ba02202311fdef458a1fd2bbd9a3bebb86391d105e9e2d7f662bb64a32eecb6ab0b0160121039e177e244afca3dbbc5f4b60d7c16aa2ddbd7b68db94848a83c5eb809c4f64b8ffffffffaf638db891c1e05bd132981ee829ad71a73f3f0dd62e65b95d50d365acc865af010000006a47304402200992df12208525a173ba7c1a82e20874c38e1c575f80a330fd6ad0edc8bf4a4602204618fc927948d6f63b5fb9d069466be2c32761d8dc318e99e1c15c19a9739c5401210343863977b70823235cdbcc671c47a0a5472050e716b6b3571b4af1d28a204ba7ffffffffaf638db891c1e05bd132981ee829ad71a73f3f0dd62e65b95d50d365acc865af000000006b483045022100c701b4b5f9d63423d7ba4dd0dd29ffdc45ee76a351e79603acbcbc4bcbb756d30220746316af1b4474ab1f81652f1b8dbf5b18d79b5b3b2c01b40fc17333033dc3060121037590a1fc8f5f24bdb772aec49046f0d83e9a428b1d919189334114251c6c15fdffffffffdd7139e8604d13a5b09787feef3e91bba6898c685c2f0e9b5ae949cabeb6b9e8060000006b483045022100e6ad6cf7732a1785d12b3c5702f18cc0efca1568b909cf4ec1e6256655ad6729022005d85ef35540a9a91f2e0550f57c110efe0f10aee1465990f8d3fe0048fe5c3101210336568f57547fa9f47a7cb75f0c167546e5f87f0bf3f749c4ff43b487d6ce38c5fffffffffbd78550e1c457c6f0326981ce521da3dd8fddb73661945d82bd2c0a76e85c47000000006a473044022031fde10873a191e5c31952b5d871ad9be7f1764f2cae14cde2df85e5297e22df022038b9f6ccae01e0956cd0eab2ec30208e4c0d857b1b3a156b7856495d7cb59efd01210261d83898b6610809fbc2d5897dcd645acf86704e61a1acddeb5fe4b98dc4aa35ffffffff0173d0c9738b32500bf14042e397825aed73d2ee3efc32142a00820d2f3748b5000000008b483045022100b186a7af6046364e753085532f867d1f7cd0d9f06561eec99b8c2847629b5c6d02202d1de5c096b1717090f9d1c62a9ff8220303fc9bf62d9e419836c0bb02dcaec50141040739d353e3a1aa48c1bf99147ba24b05d6007e36af91480837db45d8614c993169a8a763919cb73cf98a46baad0c8828e95b11f5a433baa84113c52df576365affffffffb7402b75a9b8ac0d486ce49d8a1cd9c5434ada499d261035c56bd93ed29b01cc080000006b483045022100ada6870f2b7825b138ebbfb97d80bece1c945d50be48d02ddd9c6bcd88094f9302200b7d4ece236cca2f8c92f7fea7ed187e456a3b3093bc578cba57efb3e2b62733012102359edfb963073a606c50b6985e486895744595d90377c147a50f7e063759084effffffff6fd4e89c8fdbf8d056b596f26f96ae5c6d22a14c13d5364f8514636974e4d3bc000000006b483045022100c8ce1e4a696b8284aa2e446007533bfb66fe6b6c4508055e0294089fb3152229022026d3555980816100088a0cbf2e2ef05a71d80cb2bad3a5f18076206a94a35dda01210261d83898b6610809fbc2d5897dcd645acf86704e61a1acddeb5fe4b98dc4aa35ffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c5560f0000006a47304402203edb601dd4b39abf32e2f36b5463345516114c258a7dfd774d3eeab7ae3e81c9022036cbae6b6813b337d61338b8b97bc06e6ea6ce6782c484bac028fa5d882347a5012103aa1c2538031f06639873d817ab23fd9dbc1223894608c3c13254a71e4c5510aaffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208040000006b483045022100bd53ffbd35bd144fbfb7965c6f8656611ca588033872020265462cbcd8a3503d02205d1f1b7a388956af5d7cc8e0de801ef697fd3bd1abcd6c24a98e8190b534a2c901210303f59916f0be19488d3ac301bcfa744ddce0812347d29dcc47902f43d8450c82ffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556100000006b483045022100870e70389c9a63bd99121620234bd0d68c637c68d0a5419a261416af4d8c34960220713183add423b4cea9e6a94b4a588267d304b4c8f571e7b44b3a254c7e3f42310121038dcf7ec05cb0fe0b91e5617204639e764cdcab308ed15e8a6a03db3bb445046fffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556060000006b48304502210087af1dbe1db5161b520f8414cb1319045d747cc4a60f9046432e5c8816dfd4bc0220042f9f631f200bfe80f99a6e2d209a96e11bac5a861d3cf4645fd79fa5c68bab0121033f8c96493d58cedba0c1838728f979444026646f945fb5cb7750d1488a756d2fffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556020000006b483045022100b5b61010e05a69ac54c2a2a82ac4b503d952c4f1f84dffdaa6b064b8204ae87b0220070035871d0ca364d093cea20473199b24beb0220fa2347f99508901da3a39a60121021606f24625933fc17f25d3e24b87dddbe4c39cb1034a2d0ef98a825075a1346fffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080c0000006b483045022100b7fa2509a3083a5f78ac64073773b8c350071f4c1a21577a0197036c017af731022014867803d154b64d12a3685b6bfe07cc4567d389bd6ad45b3fb89ba828256999012102fdb27b100ce472ad2b2ef5e7cb7207c1aa5949248de526b147521ec8e1c6f2c6fffffffff40075ca48b9cfd9ff4dce9061c276bfc0851827e30c2688bd91154859dff9ac000000006b483045022100847f2cea2af12f96d813b35f66758e28d8e348e81ae8782867d7737f3f5a237f0220225541c76d8dfffa4e486b6698fe673a1cd7ecc1f6cc6f2fef7d503c03b90ec5012102d041c9b36e325edee8b5f2e8ccc2434b5c06cca9d5ff57f4247eaa185c60996fffffffff15a0d0c415000000001976a914be591e385dc9f5eea2fbc5fa898cc78d2398bff588acbaa3aeba000000001976a91460922d3958fe3d511e342df6ba4f20e703393afc88aca05be01e000000001976a91451786aef809e61cd5fd7c6eec677042e98f4534388ac006cdc02000000001976a914977dca296be32635c286dca23145dd54de7abbf188acc0fb6e0c000000001976a914e3bfd71e5b3c3f96b9a252987119a2ed1d66719d88ac0a2dd0c4000000001976a914e30066fb1c581d782831443d931b8fe7ed22a66c88ac8096240b000000001976a914bd443ab8fa36b8c1971217cdd329faee33bfb6fc88acf887c6c4000000001976a914a4cb7ab932995ce96d95820ee2e4573c96608f3e88ac808e0488000000001976a91477f71e0fc266998e4fd3fb202f6bc1773238d90988ac12a50900000000001976a9141232fb0ee6be3ba74eb4de6a8c8c96dd16f23d7d88ac3abadd53010000001976a9149017b9d8f59fbce9681622844a8987a7fe2cb2ec88ac10270000000000001976a91461b4701eb5c9ae7f1cc18041ad766fa74085d18688aca0a34300000000001976a91442952a77acb97e1f6a3945826cf49d6667c114a688ace0c9fa14000000001976a91407c25af50e249708f991413c0e8b216530919b5488ac400e426f000000001976a914a8284f3e648d13806b4d9a5597dc00590c642c5c88ac1e290000000000001976a914bd7e1e8d8dc505d9e5986ac3d922fce3c7b1d4bb88ac00d9b57f000000001976a914a35920f11d17efa28aa4d3d3afaa40f2e3312a7588acaee8ce11000000001976a914c2cc8c71c9afda85f3f0a46de108d89846f2959d88ac80406a11000000001976a9144195947a8d3de0f6479e8f099fe3720c7fa1276b88ace0dba237000000001976a9141bd2d025f0ba34be5c7dc140c2f862364b70ab9588ac5089210a000000001976a914e3ed8f3da0a1349db32a5b903de080aeb3f443d188ac000000000100000001196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020a0000006b483045022100d528c6703f778821cee367954b598f59f6c0dd7afed0d69af38498e522c8e2df02201d153b00319ede8c490a39ff48a3c82fd8f1ff7bbc8cc14e0302ba19e06470360121024674d01fd4f992437a4c3b25b70b5d30f718c2e9b2d2d7fa7de15accb80b1b7dffffffff028010b7c1000000001976a91412ebbb91991f7cf074644b7facbdf3a3f258497788acaa822692000000001976a9146e0a608f332ea137fdfe196909d71a5db3575e4388ac00000000010000000261d3b58d2f72ac91dbc4cf130e7d006546cb5424e629ea3a5a66bf4465bfbdad070000006b48304502210090c513a153e1732f824ea6591c3776d2610dae1f226d9fa97f4c82b0cb87273f02200a59ea54836e83ebc214a9c05778b2278be2b2edd93e27ede5e122dd09f27dfd01210318f9bbae99cdafafacd43a1fb7053905d86fa0d9331785b2644c239be32a513effffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020f0000006a47304402204b18245af5eeaf73cbc9debecd005c34a1d61360c321df82797e6f16140213e8022022baf5f7959854c2b40eba3cfc704ce4a59212bd30397d16a577c855c50704b301210228d6fbe6eb9ee532657f26d7d4886fc8b1464c4a278ad0787861f9c5b2daafd8ffffffff02401e6e06000000001976a914f42ec64c30075fdb6d28a0c34bb23c0172d0fd0188accef57512000000001976a914275dc816f05859350316dd11bd9bf06b38b051e188ac00000000010000000453f6f8495dd2d734c6856266fd06418191ff932d9bed41fc5c9debe2957d77a3010000006b483045022100be33eae64aa4735ce3fe3290c9d18deb0924ce5a89fc7330f5a15ba004830d71022069e53dbfad425b50cdf99b97f3d466feac8bef8ca37dc03b0dede9797ee0c4770121033b4266a54404d639d92949ef264192c1c7906c16119dd64012e599c7187345cbffffffffb3cfec85a3d2881481fa2a80054572c5da7dbbf895c1538dd50b771d85daff070f0000006b483045022100e3e4a09081661260222f5e399adc3f18601a976f6325b75122d7bcb28bb0fc0102200d4af4843c7267276d685695c1d65501f2880ae26187c1f29baa14ad1081cd850121033b4266a54404d639d92949ef264192c1c7906c16119dd64012e599c7187345cbffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c5560a0000006a473044022046b0b1b5590459eab1677aeb7696d49bc8e6508e81579975d7d466edbb24dafd022038ad02e7fb4e667435d9843534253383291b553d3e23fc20551ce7f99deec3150121030bb2a4448d624c5771d96cc9d0c2ee999ab627cae68305fab4c08c89ed5a631effffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556110000006a4730440220263ca3494b2af85ca670cf548706e316c4f2f65cb7b1ea3c202ea9a3d7bd8a01022051fc5a7c630bb4a0d8440348117290d1fdf122659d9c1cef8ba08a83f5c8e5c401210325236271e33936ac53e9ffbbe5936fb72c2aeaf2d7040c8b28c441216a1be651ffffffff02c0b8ca02000000001976a914a9586e1c4c45829520e5a27dbeb60b51583738e788acdbbb9e07000000001976a91481e2a8e9af62b241a44f17dfe98c193958577aa388ac0000000001000000042bb47ebd6b506484636a5357187ac605516fcacf5e7b6dbf0d507921e53a2e18000000006b483045022100f74f94e31670a6116a572fc31a88e8b51ba3a9169cbcf7afe6f897b9be2bf00a02207238d89ebf3b3f3e19dd8b3cd467b5fbc384e9ad331763688a96f35b8896f6eb0121028afea3428f046a9629145509aab0be079575b0e6df42af608cf64f389cc9552bffffffff511537ef31ac0c52a7ba90c9b06a817cc43deec5c0533d15fa38f1ace51319f4080000006b48304502210081adbdc31df598742d0cb14b851300fd534a05b55df5824b4c76e1bc614ef35202204486e4a27cd64960c05f641f4633dce85cd9ee244497b136e7044f71ea70b1ac012102c33652cc18460c06898033a799ac2a7cdefd586928b35e711eda1c89a9a7dbfbffffffff7744bf7f5baf9a77d223cb2b641b973b4f978d4e95e5bab7369b93786cc6c0f0000000006b483045022100fd5b6831792302921a4bc21d31f644076f10dcecfe3c3b1862376156a218fe1902204f28da53d2836dc0e27ca3d1b85b8575cf41f614ba8de36936a255d9a925385801210212632d26f7c14e8e4b76f56b97e96fd5c7885ee6ede953262cdd69b97ea6d141ffffffffd1c8536658e4c700506235e3120a1232922a5d4fcbee31d4fdd3bb58d977769f030000006b483045022100aae7dc2ab378ce8382c8def8f0192c5a99cbeb41c0824c3f2812496e9129d5b502205030c26396bd32ed4ef255b85ac093ec82475a6e8fb029427792af10f36fadf30121023b5e03659088648cfa6b5a86377b7f97fd9e9eb2bdaf10fcab2adb23ef0a1bfeffffffff04a22d0101000000001976a9144469cc59b6d244a84cf028cd5e84222dd5a1c4de88ac1db61501000000001976a91498143ade2f196f84c17cd53baac81de70a0c930f88acd6080901000000001976a91459540cf29593397272588224062065f1b61a269988ac5c961800000000001976a9149f5389b6b68fe426bd75b80b405afe075d91a3dd88ac000000000100000010a42d47160add4e5180e30a492ae63495b545350ef53e8f7a6f263e3d88145965010000008b483045022100bbaec976ab11a836eb3222c2ae969b837d3a233582519ef160a2d7c3dd3dd61102206cb2c61263d989b2950a29613227fb83d8a8138ed3aa9e39c6321602e3ed029801410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffc369ed547521e6c9e6dedb8035016ba96131e5e3978135d7c749feefa68c0e34840600008b4830450220277fc9a3f5762d90154ab4d3af14fb73720f2a505ea6cd73e86f09b2ac1240fb022100ad1fb225af50e04eae91232d855c1613658f6c76e0f5f7aef8ed367f10ef09c001410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff85a86ba9739fce0f1ba95c89c636172374ed15d3425585da84fcb06f0cb7419bb70300008b483045022038c5129e7856d664604d4f2087d74d0112c592e45b148253d2e4f1c28f5dbad00221008bc1920a86b282ee349fe518a0a4a5dc19c0bde79818d68a7ba9a50cc269d1db01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff7b487a69e552a2d0d29fb8ee80b3dfee1b8ad9972e605342d81e623ab6735bd8920100008b483045022100dfcdae4b798566aa48cf0920013c2eb4b42531c1e3a6fad07da5bac85f03739002206b6b5207005e327d670462adf94886030be441bc7449836ce143f33298e84cd301410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff08fc0ac6732ce3dcb5dcc8784c8a4c7a4d2fa16b45de34fdbe34a068d1a99dcd2f0100008b48304502205c749ec9b1f8c7b81e1957681168a709ca74a71613006f41c5cc58eae50a2a80022100ee1a0f72b012d8398f11205bc8d446a947cd7c0ad621d1a7100a742e3e95e45201410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff3b44fcd72757c7453f154d1ef8c99d502e85a139ce05384c763ebd5279fbd9d8f40400008b483045022100a9b8674960b9cfb4e6aa576770e069bd3a0a2ada4015aa523bb38ed38be2701d022007b8a143e3aa1db3d9137a94224348c85c2005c5ff2dce1624516c08143333de01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824fffffffffe1021e1d9fa4d5b1da75792dda91bd66bc082265cc8dd8ec12748f2bb48001dfd0600008a47304402201c57b44cf1ad6e60dcb1bbde0fff9c070fdabd71ff0759f5799b34a67c80b5d10220570748c630f60a6273f04ac9422224c2c11debfc5884b3769c34a5a372f3abad01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff2e1097d43f83789a11d90b5084f0e8b5dfe3fbd0e745288051e67859958dc20b470600008c493046022100ef948770e2f4d2ff979473d6b3d740b4299ccb83abeaeaaed5ddd20ee18098ee022100fc48e8c64dcdf6e7634dbe8a708ef7b5f8ea402509e0373af4f8d8f746b30c1b01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff81e4563040aafdcba8ac842f4a7f4f4b2d478e6b691e33b9675ef909f11c57084c0400008a473044022042585b74fecc3d94bdc0525b64b8ef4094cd816b8843a9af62841ecdc046254b022007eff2f74e46853ec050ac797975718e488034db5954495e6060f620e8a14b2501410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff138910ddc7c84ff22d827b186659f4f9d4f121a8f82959c32b5e7b301e16829fc30600008b4830450220290cf13a19df2d9891edd8bae9028491db307691db4789353c753d39f533051e0221009896e8920a41c5073ffaa2ae07fb65705622c0395f7e516933609a7672209f0801410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824fffffffff74b0c51664c0bb93fa25d96a0877b4767cea1b001301d8e415392bbb41f44880c0700008b48304502200db653502756f9283ac5d8619a50795381b001a1c2b569afc722fb2a07f109f0022100be6d044cb142fd253005754274249879d7cada9796ac8ece60629b461ffab1c601410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffdb7243c0b91485d5fb45408b7398cca2f5d028f47aa7a60d311360bccb437ffa860600008a47304402205deba9a6c9aed1cdeee86c7f9a1c3098d1e4da3d062983d95025fa8474a429c202207d118d05685b797767ebecc73a8483970d5fa28508fb26144afa9895350ccdd501410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffdfaf3b90b8c08586d857403af4cd02d19dfa55008fae329acedf3c7ea75bc9592a0600008b48304502200af54262d748efceb2cffe1d35937b3fbe41b5469a93690b3992d8148a6d77da022100fe25ec2f7c5a9e8b0e74f7fabcec589408c19e8146719776847e8fbf361805c301410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff3a9eb364ad691f850f5523caef4739678e88cdd517e9b42f3e57f51d452b24d9e00700008b48304502204d37efa7b14e962c5f640af48025122c989d14aa4fca230e277010ee33dbaca8022100b6464198588eddbbbbb9b495e96f88268b2119120c29e822df753a59a58f886301410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff983c484c85c726b0a2d35181f831a46f646fee746cb4825ae8681c7c353a94237e0500008b483045022100b3e5381f2e05b601790bc71c5f022ad96fca46428ec8d7a83a945ecdc365ea7902200b37fa13806d818c1d842dde6d24dfdc8cd2a8f90dd360e850d3ec3ef0324bd501410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffe509bdb4964bd03131a06c5cf08520bd793b3b13af63357895c39f887d67abb6eb0200008a4730440220127387645bf44276e056688394034bc6b4a3a125d3f837a31ff8cc724b221e8e02201cf59e74b666583d41825f3db3cf2e312fb77815e9e28df0685324de1c1c4a6b01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff0274beea09000000001976a9149371ae178d4cd94ea8ac9fb7ee3da27e945e836c88ac27e90100000000001976a91403faeac00abed33f4e4b7f0e8e7e46363190da1588ac000000000100000015d5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556120000006a473044022055527222c3d03f7d31b0aa01f12d0a1560367a16c2957d605247313d6dcb5260022015b564e00a6e4fe0bb7aa30619c74c55caa3ade1b4236795bdf4e027400d8d22012102696d455a5d549e8eb04c9160cbe0ad192d081d62906ca0984a82e7d95fd110baffffffff61d3b58d2f72ac91dbc4cf130e7d006546cb5424e629ea3a5a66bf4465bfbdad080000006b483045022100f406a488d5f8a7fa43296ff348817f1a8eaaf8b1f8b9904edc876e119bab38a502203b13ba0de55be416b9a6999e51992820cdb3fbb938255540e93135832c8935df0121020706bf6d443b5b9ce106712c32252197708bd2aff10dbec0a64b517a6edc27fdffffffff3e675f53b4720d6b3434f5a664ed66e3b71bdab439dd56a4c99eb32ccf2f23f5010000006b483045022100e19f7ee9b6b46ec64492d8592247802c3f1808464c25e4b8be1692ca9451b23102206aee962bbeca8b7388cc2d5ae344311e4487804ba693f51211c0a14792fedeae01210200fbbbbd3661c9f621dd117bc62cecef2a6f07ac8cd9554802693bf972d7d70dfffffffff1b216386fe5995be32653b6255ef6ec1102196c73e2b596463460844127c2e3120000006a473044022025ad8f77e2b650a225aa516da4dc7fba167ff098c6ef680f2f6bba8baec583970220236abd17debf16466708fdeb14fd3f0c688832f3e32fbe674003486cf8dd8502012103082ab1c07f7a20efb7faeaefb8c74ce33f84d0e9b17dcdd7275a241cddcef1daffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556040000006a47304402202012509a75015b807ff16cce877e8d669ce4e5ea7c0e5c5880ef20bcb175b80f022073333cd7bf17d58ac14f165499afaea1876ec2bfba84f5bd1d94ae0926bb4769012102f1f5ef25f20ab67d457cc2c939b7fa1988bfd1e70c05436cf07d6cfad2cefdeaffffffffb9323943cc113451f065def62bd723a5129743859fec8ddc644d2113432c62ab110000006b483045022100f5ba42fa52f3325c16e2ec9c0e877b32561cfcf095efb8f0ff3c4c8fc76ae3c00220689c70e76bafb1f4e401c457f01c3fcd8f6f57327534a59d8abcf39c912b989801210251e9bca2568e05b5615f54f1be129987c3cc941bf3e672043ad63a0f57503f45ffffffff3987423bb0a754a7d9008553dda307662c9e210b7128cc6bdeed9da98c90846e0a0000006a473044022007f5547c01af6865c708526ffb3cbe04f7f88bd450b00ffdbff82053784132d002200532cb72cbe992b8f57a7e3e72f92e8722105f668f673658bc5d3ec0e017830f01210270b514740d3754933ee16837c664ece8f964f9329e4c8fc4d538050b7a7404fdffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602120000006b483045022100f4379b9094a063955696f3980e68fb8a1cc0abfe49d411c5eeaa53dcb9a7d37a022013de51ee3f0d74b98ceeb7f80efe070f3d2e926307bcc88f7daf9cd562dded3d012102f86a7a2d4580c251ed840c0422663acbd329c394eee835e176a5e1fab1540fb3ffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c5560c0000006b483045022100e7348632d08e00356f9b999327dad941beab204836ba48bba79f520d490f429e022008e3d6b84ae4080112cd1e3df265ef270758ddcaf323c9387e46fd040451773701210354133c35d16bce2b7cc755c78a5cf3134e26c417b6c43b5be72d5dc37b69e961ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208000000006946304302200498407b92b9fe009a496879085f302ec00a5a7ad8d83931c29b953a348f5ed4021f5aea5801ac737cb112e679140a3f0defeeac91f7521f1c75befd704b5d5d930121023bf53ced02dd2b96c19a8919c71f49ea964318b2dfb8c31f3c940b46bd623d48ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080f0000006b483045022100b364e98a8990a5ab253258397b9289b5e1de9e7e8b9ac9399985399c2f2e0600022061b68c56bd8a594f2c1aa8bc301a0c548e193a3e13633191a7b2099fbfa974050121026be3eaed514e069fa1dec551431eb4fe45bff8b5197787f3ba1210c0dd4a8478fffffffff1b216386fe5995be32653b6255ef6ec1102196c73e2b596463460844127c2e3110000006a4730440220767f4a43c86f4c67b07f143cca929696531ad08e4a541a15b2a925ffe666baa4022048ccf00356894d551b23b632fba94cd760e9caa77b8026ee17b9b2e944f535360121024abc39893dc9c91f5997575887f5780ec59ef69b20199907070054da82c3aa98ffffffff3d13a301b7ca19f195c7ad6b4fdd74df486ad51ca2a47707daf72da705fbf82f010000006b4830450221009c4852a09c8eae6835fd2545730719e79627d13579414ca5995a9049a5f5f75002202e1e4ce6521992f6f0cbf658c5bc28c89d238ba0243d1dc712b03744c35f3b0f012102c3d05cc6723c449e0541f5944dfa147e43cac660a711655bde25e6e1e48d851effffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208010000006a47304402200301abcd9da18372fc347db50d5b6950786a8d66a36cb066a6f495531d5bde6602205c70f3b0c8d15dba3c1a8e78de9824f0481de64831429d41678f67635d0cb8080121023884ad5407fcd6310bc4b7fc1b934ccdd7c07688580bf8b7f3f7984667b03d53ffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602100000006b483045022100970ea3f8e2a262b49964627c4e31c78a2f8f0566c68a79d003685afa6029a3b702207f1778c1aa11b2f9c87ac640d064d7c0586ff3d96a9a43d8c5fa22cd89d79f9e0121023ca6e7584d8fdf9776732f364f4a43d18886266cdddd7ca1880fe2008b604873ffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602000000006a47304402203204ecbf2ec2eb7fcba47a7c92e19ef609c7c7c6e1ff191d8a98ee7f0dd1a427022073682115c5698d5f6134eb751b0f31bf3dc6e88bb6578f0496ad9e9376d6013c0121028795f8b0a67a234e928da8fe2e738b85939f1ea31009a4e41355db54e14fc31dffffffff5487c26443f36492c9fcb740c917a70d5a978a457186382d52d93517b581b80c010000006a473044022062bf9c431e9a9774eaeb851ddabf71ee03552cc7ffb422c1873d0a1a4eb53cdc02205233c417ddf3d88b8f72f79c24f96d6119d284fb5b1b4c1e6e918c3b21750b920121033e070f6f281e381234477b5865377789ea442bf180b6b76d79fbc0357fcbb10effffffff6a5cb595037a940569804bc04f6d16a240c338152f6934dea8d5abe91b98abfd140000006a4730440220166b0a721753780f4751693afece8568beb11535ae93b233fc253d795fc7b02d0220330fd61224b22d05b9d60138d3b5aa6f7c22db58d237f843c6be5028ee18783601210210aacf8f2a034243784bd2e7f2e5b9295d508651c6a7555fa6a01e4b65e897abffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df0e0000006b483045022100eb9164606afeed8a0b4a6a341a95ebc08d4cae9abc9014c5890e5ad4d3bd3ecc0220456aafb5e920c64f0501d53de835c1a34941a32ac2114cd0c00005fceb51cbd60121034ba7be1ceba4fd6f8839ea76ff3094c61b586287dfe7fd1992b690a73bce36b9ffffffffb9323943cc113451f065def62bd723a5129743859fec8ddc644d2113432c62ab080000006a4730440220077ed68fe2192a933927df527acafd1af4c14d634c9f34f72df20a253bed3a8e02207499149f3c1968cf62b4f4bb6d859f9fb540ce046f0f515261d16a3df049e46c0121027e2d446f8e1bf0b3a03fa50b4af747d6714064a8a6bf656f3689d50928262447ffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df090000006b483045022100feabb57b36c3e6c541a620b8877a65bc8443e942e08bf560cf81bdcd522a837b02207cf277b4f433b3701a0f7e2ce43165abba5d1109d857497333314830df475a6b01210352ea39bad8cd7cef30a53049d60c366a4207e38ff8a3a4124fbf93c6dace85aeffffffff1556419da2000000001976a9143fcc1dcfbd3ae129deffbcf43b7d8b54027d627f88acb55d5600000000001976a914bb029d13dd17bd65787e88a9a12f07faa1270b6f88ac00daf89a000000001976a9146d3b6a80dbc5f918414e435cbb01c212cbfc5d0d88aca064ae6f000000001976a914e483d88548aff5069ca801bf2afff0fd5db0ff0388ac61410a00000000001976a9143836172bbb30d91db07a04a0ad4e62c57d5b0bbf88ac30cba059000000001976a91412d467cea7979ce5702394ec175395ec153e916a88acba814704000000001976a914ce4dd0989021d139aabc67e502c1d891ba870b1f88ac40ca2200000000001976a914e46151c672010e8f83f2056c785cc1eb086fe5a988ac19370000000000001976a914b4becba2cdf870d86ba464fdc16cae49fbc9587a88aced340000000000001976a91450430b77ba31f95b10d07f9a7b582f61b4a2ac6f88acd0300e00000000001976a9145ece69ca06ef02e6f111d04431aa6ee09a6542d788acb0fec526000000001976a91455769bb290f85c6cec681c16a4f5a09d0c766ae488ac00430738000000001976a91413c505de2c016067bc87ccc3d4e6f85e70ebe22188ac1080dd6e000000001976a9148267ce7be08c2f1fbab2e5011d645bdeaa9cbac688ac60c41e80000000001976a9149f7dcb4f09f9753a355ec8bc83a0cb1018463c9088ace0f7434d000000001976a91412d467cea7979ce5702394ec175395ec153e916a88ac705e3637000000001976a9142463099825b1a94f26cffcb1b7893a945f3be9dd88ac480a0a00000000001976a914be924a5ad4357d2c3a418936cab8c78ee0e71b0f88acfd676000000000001976a9149ee44d6b20b5e06fabae95c5d4a3fe8261d9aef588ac88260400000000001976a9143e86b64bc1fc0cd73728e10d0e516781a9db80da88ac10e9eb0b000000001976a91448365ca2314942de6755fa6a4fd04ab1a3a38b3688ac0000000001000000036a5cb595037a940569804bc04f6d16a240c338152f6934dea8d5abe91b98abfd070000006b483045022100b92188ccc613f9eeccc11eba2fed593f6de319f44cff7f64dbe1cdd92caa7b25022005afcf4948b3e417f1bf229009365c978f48da11213acd2d1274c8d70b3ce840012102fddabf9b7c31b0f0ea36ce87b5fd39f9cca9c1eebfad949ae15f3597a67d8476ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd090000006a47304402201bb1a024ca3526491d6b3ec1e36ea5d77c1a5633293f84c47fff43b1d2a07a6602203ed4f4828a6aa65b91d3398f8255e0ec10ac2d64e6977405599cc7c3dfa1fb4c0121032809bdf7a3f15310e00b9fd24b7be34837d015ed3cc80b5a5561431bd7849e3bffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd130000006b4830450221009cc8ac07fa6e79a40155b578b085ebdbb5adc8e3bd684486ce442e75661342fa0220024a38c68cb437514a6a409dd033af89ced7f22fe127ff6d745778b88fb68a2b012102fabd1e46d5d2914e756c5cb19a160b061b2bf3aa560223de5fe689b279165b27ffffffff02c0f7e606000000001976a914d23a2cf87ff6bd7a0ca40c10d2ab110b64f5b73a88ac82691d05000000001976a91487b8d4df1fdf28e513f4cff0f1aba8b181a31f3b88ac0000000001000000171cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208030000006a4730440220182ed15b2c60770966e3b591595c5abdc6c1a02e4e05d0a4d9c35762f99d78f4022005cc0f71bacaa80b95f8380d2c6aa7bc618f4a14854a5780f6045a7eff6c85e801210203fda9e9fc2b5e757cabf5c28d5d93f73e49f478210dfc957b2d748d21a03bd7ffffffff35a7757973597042d66eee05991cabdabee55adc1183f2e89fbba83d9810ae65100000006b4830450221008a7309a6b2011810fd33b2009141cde1a8f28f07f8c8b8391a834d88ed448214022024c384fe0a8e0ad22d0420c0dca04a172bb4fde430bde57aaaa5306ca919ed1001210243d0b7d728a50462129f1a31a2fc5a192ed1d80ff1638ef2d36e1c635171e517ffffffffb9323943cc113451f065def62bd723a5129743859fec8ddc644d2113432c62ab050000006a473044022067641f19adb9e037a332991366c4ff34ebc9e162abfe1ce5a6f74666cae3f5ee0220313efce26ca919da3b3638db9d40faa48987e28ab913fd7147e9ee1f9e081fe5012103f056cfce34c8b3ce4656b2786822101f9a5694d3bec22cc5a04afdd6c51f1bcdffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df050000006b483045022100e60e70379382b43251a29b1790ad95634fd1a5dc9e25091f32eac3b3c9aeca130220559e64017bcfc9198eaa2fafc0772ee7de0dcf87f2ae26e7637188ad90a40293012102e72e3b819ef681e4697997c9982285876052b4906d9912e45165026cd9319bfaffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd000000006a47304402203a42356a06791a6cb962c0105298f5e71a41f7e40eb76b687f64b726db9287a802204ec9dc91f045eb3cbc26e6dd791c2e1490380af478407190302ed0477faf593e012103d4246309fc4f0db7a8527a62f27c6e2ed033bd520d0efcf18104a8e8b578f163ffffffffa6a58b662a6b7481726f9839957e8418fa9d2e18cda74f10a6a6a743d08471d0010000006a473044022025bc554dc15d8b6d669bfe712b3a128d7f9505fb5d253a8e27c6d85bbfb9847e022053421243065cd4ccccbaf39e3bf4961ef547fa90a87e08ae9e5bda9cde93515b01210249a2868c9b12afb3d87eece548992c266f37649a867543eecfa83d41bf180c43ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd060000006a47304402205f968c81133b8702f1cf2619b1e6bd53adc3c3d6e995eb5235afb3374450769802200e056f6476ddc0080aa42316d684ee8956bb35e77ed46848601e9347b35819140121027d24279e61d59ec0efb17171e17d6787dd06c62bc68ff3ca7e8f7e0eaa5b453cffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020c0000006a47304402204da0b624703f3992428906ac7e0e764869c06a142ffcbc902068d7a77a76ff4b02202785f0bccb028ce169dc4a136d92f5b0cd20eb36597a2b8c25ee78b25f9beb5c0121039620fda21814b9bec58509ecf2e0671ef8e4e90edf361a027f01d50aef85f881ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd0d0000006b483045022100dce92f4a8f69ba2c989481c2bf33f85cf2f307efc038755d5fe9eeccb27e87be02203901e83c1a62b59814ea94d5edf16d145810ad8effe4a609fa8015a09c527523012103327d0fd0b9399bd4564dae81d01741f810ead31a168ce54b1264868b39e1ffdaffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602040000006b4830450221009431dc64514749a36b7b67e9fbf851f2e6160d3bd141fdde078952d21076b20e02205718be1ab1e3c5b35f3aaf6351de7991c72a38015ba060333b714b769a9ae2ea0121039d89fd34f339dad849035222a67c4d5961ba766fb3aebf05e0bc8b213ba0ae3cffffffff3a564554adf1793768e523aa57d4e9b4d3fb37864f5320a4f14df16f329dcfc1120000006a47304402200c1891117a641d2291c21ef306c60e9b747497fe67b7b27491479ed7a7be0e6902202266b5893d7b8291c470d096cb452080622f5495459ea838502bc6659fb1ebb6012102f80a7615ee49d42e9ce266cc3a16325aa93619f217b928ebccdd41ed87e5538bffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602080000006b483045022100b68bfa78ee84127a5929f604be85583b2f016407d994b3ff6a9db6989150738a02203ef0ccdc8781b828d8b940f1f50ab3fc329e20b2257413270c897344d030b37701210238450249b3fdf982d101124ee25d40718d3321024a8b3bd70465d6f594fd1ac3ffffffff9ef24927dc0b45471c13d95e35d140947a459d178d4e38e8a0f7c6f8f23318ca120000006a4730440220086526a21f7a86fa27bf8cbb6083c01b9daf8f6896a66671fd79e5da6a10bc01022078b3e5ae6174a849b0f7258b65361397daf2c3af879b9e47b736c56a3f2987f901210264d3bbe9047f260e3bafd6f7e769a63ae561d4be4278b059d94000144e24c34cffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602060000006a4730440220044deab5b46098ebf75887e59ba9345491b76508a27ea7d2eb65c2be2f10bb9402204f77b7760479fabb44db3b485ed4c4dfb7b5466bfc4bcdeb8a5a5181441a80b50121030cb211edf8301bc606c1640e1da8e40ea37412d0da6da3fc3d4b0d4531a73c84ffffffff1ca763343454481b2bc5cc77e88856b2b252dc07d76f6c970536a9738fac8dc30b0000006a47304402205a96e391d935fb7ea5cbbfac9114158f2c6a3989c15f2c10fdf8eabd9ecce395022010596e364a1b50b6445789739875919e54a561a2a0ff7f23a1e0928a0c9b860a0121023a4a866282519a6f6da167b1f2b0b3b80a9157a568159fdb981ac49f78110458ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd050000006b483045022100f218d987dd989b734624c78dae685fe7dc2daaa55db8779e049e0e6517010192022004c6d5f51f752b3c2a6bf0633cb80219d2480c0563b956f56e16668868c68b62012102cf98fe221e19da2643d92fe81c745ef15b824940309329691ca1a080d0ffb920ffffffffdbadb003e6588a84c2cafe8df3b6459bad2144f2a1f52620a64ad29376c68246010000006b4830450221009e323e2cd40e88f577eadd323cdd9f59eaa96ee0790c4bc51856da5ce7b370570220726897aa35eb4ae378c9a23e6fd1596aae76467cccf8cd3aa8f14fdecc43d2ad012102eb92f296d3bf0cb0827898c751be9095c2c3d5db500d85b90be9cb4fc606854affffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020e0000006b483045022100862c47528784f3d41a0596585981efc88f1f91029db1c4384e8c58e6425df7ee02205fae4d97e2fee870e23430d1ca0df17f95b46c25d834fea043f43799dec4f9b3012102ecf996d191a23bf0c52257f8028a2d621d0fcd2a6f9d0f1b1fa07d0b031cf294ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080e0000006a47304402201f59511cdf3f5e6565dc37db31d687e29dbe3d087bdc196fa74162e9640e0f5f022017448fbdc3191181ce661f29f93695152b251ac8cb223f32397921247cd3ec81012103c52ab347ef0ece04162229e289e921a5b56bfd6561d383bd472bcf9c5e10a75fffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd030000006b483045022100999b30cf0a7bd33c06b46b5a943ecd6a9f229e72328ac57887a0bc5d8ef864fb02200434b5f5cbbbf04b5f0c18892b6f25bb647312c9375363b3396b6c7af0590080012103fb2f9957eb14bea00bc39ddf21a1100103fb58581a631974ecbaf2b1dc8359f4ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd0f0000006b48304502210081ad51cab316bd6806880ebfe9d372689de04583daeee8571878ee6a5e4c4a3a0220094e21d4b90e52ad6b041d7e676a5d04190232b0062b0856f8915eac4ed99027012102cf98fe221e19da2643d92fe81c745ef15b824940309329691ca1a080d0ffb920ffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df060000006b483045022100e9d7858635d653b26ec84f61b623f60881f2d5716055c160694e8c403aeebb370220722dd07b062480d383ff79aa880e165f7c67a9f480d38e97682a502dc0e5a708012103cb220107fa56482467c1e0bfcffd92a2ab81d68f9339271d5145e1ad0c32c694ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd0e0000006a47304402207208d061701a9fc0a27da57d106998b611374e16675decf24cb0e1e6876686e602207662a73e87480296b887262422a86eb82c3f7fa5dc6b37b941b9e55ef1f4851a01210326bae26746b04b59d4c2f368f2e2f9aca584135ffc70ddcd134cef283365b241ffffffff1570e5660c000000001976a91440bc6e1a8c783876fb3d5681ee558673cb144cc188ac00fbf266000000001976a914824bfea00b8e9a4fb8ba22007e620aea04486e2188ac90bb090a000000001976a914ff3c8edd6318bbdab3ce9c4d6888fa937e7a058e88ac308d0d8f000000001976a914c2efcb06863b9bda55f950f75d63918b7df9081b88ac103f0d8f000000001976a914bbda1df35de1f79ddac2120ac0ad00501f2e6df888acb0d03477000000001976a9144965470d6bb4ddd2f536bd65b10871ce9c91fa3e88ac52c6418f000000001976a914a554efd037d02f59397f55653b21fbd137e4e58588ac204e0000000000001976a91483682422c004420ac3092329b817fee37aca6df288ac00a1f13f000000001976a91415c233d56db6ffb15e2cd536f5ded14e688fa0f188ac60ea0000000000001976a91487f4a5d17b83f5976b5894519e8dda182db0c50288ac9896fc01000000001976a9149829c407361d459569e41a5ee43214290e6838d888ac22393400000000001976a9145c5a2175663072f3808672b11f473baa1e7b1bb588ac009ce4a6000000001976a914f941fbd07ed397a005a1c361628ffe4de5dbd65988ac0027b929000000001976a9144965470d6bb4ddd2f536bd65b10871ce9c91fa3e88ac3843c574000000001976a914e6f64e5fdc6b53426393c6c18e9d579827ed9e5b88ac3878da15000000001976a914ef97246ff380ad79ae38909f203da9379d99fd8d88ace05d4206010000001976a914fe67816b10fa61850e78faab1f047f86cbb9128288acd0a20c8f000000001976a91470c6be9b64b456af6342d7032df006ea6750017788ac6029700b000000001976a914dcc17a6e42f3992123dc814782b6fc23634bfa9e88ac00752b7d000000001976a9141417099b92d195f94cbe737de835a72497cbc9a988ac4053cd0d000000001976a914bb8f0bad61f57f95add4c751f279354105bc8cc188ac00000000010000000311b2347e7261132e65c45a5a7b13536e8a64e7045bb3806846056ecdd3b97258100000006a47304402201cecfe79d9b0cc374b0a24ec9791ce17548b138ebe60dce3b8d549f65d57eb2f02202d7acb1398c18758a37a6dbeb9c0f6669fb0042d2f2b7906cce3e4d48bd7eecd0121029dfe974cbd2aa008ca27ba75731c9b123cb4d700c77a3404a6c5e2c8e9b0144cffffffff2968a2c9bc7cb619ead292ad82849a4a8c4937204b4619a0ff4b80c24d49248a070000006b483045022100f6362087c730d5f60673fe95c549e4a8e45a6a65ab70f3ba9887cb5ccf88273d0220456b6a74721d19c8c3a83762167f29488de46d1edb0cc49dc0cd46f1ce1f8a3c0121039d40dbdaa76507b2708e9a8ce913db793a1ca3e940680f8a01b1a4311bf8f2b6ffffffff2968a2c9bc7cb619ead292ad82849a4a8c4937204b4619a0ff4b80c24d49248a090000006a473044022028522917d00d8258206e6802389ae294f085b910618a3292d10fece0ee60d41d0220262fee75950ae2f20990c2c8832b9b13fa5e12f46d64d657570884daa31c102d012102c05d260ec1d5352e9e1a8bbecb472875746c68b92ae7a81a47f2537961fb3408ffffffff0280539a05000000001976a91436167803060f96816e5b4801dd82c84afb7887ec88acd0162a03000000001976a914403c67cedfa93e96b129a44ec1ba294b7b7513aa88ac0000000001000000019d3f91bdf173a66bf08409a3d6776b33d0aeee3222fda32e2800bca08efd93f5590000006a47304402200b551118b1c49df27dcd1c311c6d2e7a15f6db8d6f5b7e2ddf7b9a33e2058c960220246d6c6b249162e3101a771dce401c37f58da9ee3d4f0ba90853cc4f964aed6901210220950a44f5914cf0f4b2d43319eb96746562631e2e37d9777d3a993a04876101ffffffff57ff4a0f00000000001976a914c5b908bf2a82ecaff706c6588d61cf38161f717c88ac68981000000000001976a91483c71fb414c4fe7fb4b2c60f2ca6da5e0d6dbdb188acced70f00000000001976a9147d5e20ef7c195f563d1c64a67d05f06042293f6888acb0e21100000000001976a91477fb74114ae32777d00c8996a91daacc532f91cd88acf12c1000000000001976a914cee365810cd648028db83879749a2f9659bbc4dc88ac75ed0f00000000001976a914dafe8e206bb0245609134f0af5cd91f4a8dd12c588ac0bb11000000000001976a914d6ca59283f3f75991bcd2999955f230403865e6788acfac70f00000000001976a914080da666a7dbe111800ae96b0363e36192bb2a9888aca06f1200000000001976a914ea0b0d92986786ec4f29d3aba16b9332389eeedf88ac76d90f00000000001976a9145a6b298a688d3f5161184b844b06a1c2890bf05e88ac81a40100000000001976a91438c0375abdb4a582a61ef118ee2f214d83d75e2e88ac38500800000000001976a914a87d1cc11088e265aa7f79d916070a4e7297d08e88ac7efc0f00000000001976a91457f0e34300102f853bac1026438ca0ae58d8ecf688ac784e1100000000001976a914009a8d0112472fc8f28e477b38b0f07fd842f69f88acf1c80f00000000001976a9149370d4104dba14039b200e35404608198acc643a88ace0851200000000001976a9145701e33aa1c99e01f7426db9c019d8ef0375c95688ac932f0600000000001976a914b6fca6329db8420dab864a6f6d0cd91c86d90e7f88ac8e441000000000001976a9143ffc0d1f05d70eeef246802356c96ca551fee96088ac71aa0f00000000001976a914e774e1d68e05c61381f4f32a031df02dbb0be90488ace7011200000000001976a914bb7a7a0a2d705fa4e1b1d4bf384488429fd3250788ac83b51000000000001976a9149296a3c11775574233a17e8573e4fa5b809564dc88ac08bd1100000000001976a9146e9701b919ce65399ae4a5f9d4486f63cb8f813f88ac55661000000000001976a9148c13682c8088bdbdcfb574a4fbf5aef991a7343388acf6510f00000000001976a914b25417729ebac02bac2c5d5a571b174a2ee4a91888ac2e761000000000001976a914355c50f7f0ac7fb7d03b4d2de550e47b93e2798488ac834b1000000000001976a914b1dd01301bf16e8193740b1023098672e6213b6888acf8600400000000001976a9145475e1e068a752fa593e582dea9b523a7d0830be88ac12060200000000001976a91495ff891da6a97890108e6351d6d51015745c572888acb27f1000000000001976a9149131197746a52a2644e3d435cb3e2b9233527f3b88acb1de0f00000000001976a91461ecde31b0e4b8d5d40eb750c4857ffa313544f488ac7a430f00000000001976a9145d62f3ab440fa05382ba6c2f8b41e5c581d59abd88ac15371100000000001976a914eb3acbe499a1b8dd677cab9b279980de7ec1af7188acac7a0f00000000001976a9140846706a5256647c7383835f8d0185bd100a644188ac46011000000000001976a9147133a0f8ed9e2f3ab1dd43bfb7b0fc6c9fbab3b788ac89071100000000001976a9141b724277cf253bd484d21e3762ed1369e6578beb88acca4f1000000000001976a9141002b3a4cc8ff543f56975807835bea13526773b88acb8760f00000000001976a914b2b4fe2e91bae0f1d25cd740121466aba92bef8c88ac3cf21000000000001976a9143a6b13ccc1b766dd328c8b2b21a4b1facc53324888acaf7c1000000000001976a914e802928f7deb0ecf14e136f2029f85dd37c47b3a88ac418e0100000000001976a9142e174ed3ce191fd677120a0f14954f87821c534488ac684f1000000000001976a9149df60a6a89ba26284bc6ceeaed91779ac0f5b73088ac9b4b0f00000000001976a91401e5108d31929536cd3e59aedca73e200dbde3f688ac8df00f00000000001976a914811d8e097532db812fbfeb55656570ed6934477a88aceb3f1000000000001976a9141b1033f49b5398fd4a272af587f01fe0c7fbe07d88ac80f90f00000000001976a914717e49778a282ef6f7ae1aa425b3235ef314937988ac1b9a0100000000001976a9149cb9289d2d84db42171192629573d7e11b04e88088acbe530500000000001976a914667195a90706ff1cf49db560c9328c0f7ee9a51f88ac38671000000000001976a914ed24323d37742f822bd868552e5457fda9eb16f588accc821000000000001976a914ad44ad6d308934c556624b04f2da1c6b17b3b3a688ace8c10400000000001976a9147cbfdc950f7665207739d6ee9a0c313567ece27188ac44191200000000001976a9142b788153d9c91906113556b82d900cd81bdcdf4d88ac4d6f1000000000001976a914162b08eafb95e52d4bc71950f8f89c87a7784b3788acb4441000000000001976a914972794904dee236a678290034372a9f44ca21d1488ac28201000000000001976a9145f11bd6e5f62767dcbb1990864aad76a3d784c0c88ac0f1c1200000000001976a914326e825f5543710e1821f96d58bd996f5e8d8f4488ac88da0f00000000001976a914263b3f8ce0ad4a94c53ce77fb9d21ded8d1888ca88ac6e121100000000001976a9143d0b76c0a34511ed7b0f4379f608a91b3cbf228188ace0e20f00000000001976a91412b47187fdd828786d5ddf4124a614f16cf73ac388ac17730f00000000001976a9149efa185002f574bb5b1937cc9e3eb33e5d6f2b2a88acfa231100000000001976a914ebbd2c93fb4e0b32905f6a568db5d7ee1d4971b788ac22f10f00000000001976a9145d11b003b644c089f3c50c0dc0fb418778a6063688ac04241000000000001976a914ce32ea2d498c5a50e27631cf9450fe87cd5a08a288ac35081000000000001976a914d3502d00f42effe23e657e2658f04b6b25392af988ac9ef7e20e000000001976a9145514abb9f4cc3efd544d5f173044d25097a2d55c88ac36570300000000001976a914312f8f38d306561b1a7256a365a3e8df7e57836288ac5d3c1000000000001976a914a79e020b93c1ccccb6c894cf4361231704e8d1e888ac77fc0f00000000001976a914ab82ee544de32dc687726a992e214dc75f93361b88ac23b90f00000000001976a9147e2ec5b862777b628398dce201bc3c87e7a2a02d88acb5641000000000001976a914915d8f0aa522c5920f952f8b2f22ddd4fd60deec88ac00e00f00000000001976a914007a43b3d3b29c2b969aa2e42dcc79b27ce5c24088ac5dc80f00000000001976a914c83075f09d11f6e394fba404f8611283a14277f788ac65711000000000001976a914f26568a062cbfa2906ec9b97c5108766c55b892488ac1e641000000000001976a914557c1757cdda933721b0ab81b69369bb325922bf88ace7361000000000001976a914f92d61409ad8ca5e091f316bbbd0be90deb42d4c88ac0cbe0100000000001976a914598e3a315ef75e202ae09fc73e6a136e6cce65e988acef9d1100000000001976a914778070286a15342220a3308ac2f82d9cbb0dd6a088ac35f81100000000001976a9145bac8321860e12b037dfc1ce087591e82a4295b288ac95db0f00000000001976a9145cd2e1b93aceff18bb4b9247497f8bccd05970d088acc1eb0100000000001976a9140df21fbcd42da47d3018c116b8e6b391264c854f88ac377d1100000000001976a914a96e24094aa4da3acd691f89ca3f9224e6065e4b88ac1c700100000000001976a9141320e82084d5eafd170f9576bb5990bb6c034ca588ac0eeb0f00000000001976a91420d380d2dca0e0affa20168e41b0f7edb1e97f8d88ac3bcf1100000000001976a91400a0867abd4d9c5e84c39201bf3332362ab8ab1e88acfa8e0200000000001976a91424a15128c2087af9d7bd7a37301e0a2dd3364dfd88ac8c990f00000000001976a914507a7bf03ea16ee39fafb6d3c81c01a540e86d7f88ac6e751000000000001976a914c71888a0686a338673aa1c47d16d0433afe63cc388acb6b509000000000017a914e50a8f125e38a5260cfb3f9819972fdca7e96ac387000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f1b0000006a4730440220111d5ebb0be209937173acd331d298e3600b09a15eab51c755ae993ef3badbc602200cc34f15462a82e70238dd958e093fa2a14320c6ce40cff1bfac6333693ac2a00121029a290b6fbfb9414bab29b007c8aad2eb1d7ca098a97a10f9586f6807af7dd008ffffffffdbb62663e81fc3fde6933d0f9d0dcfc08ce032f9f2de8cb22662075f078057a4010000006a473044022049b7823caa94ea4dd62f5e5dbecfeb6b79101f0c0c342325068b2dcc682e5d5e02201e2def50ccffa73758f9e51ed53d987340e67549703c648edf7433a4d53b71aa012102a9c8c1afb8da8e9ce9880ea1ed70462679555fe063f41730f38f8a2e1a8f3b1dffffffff0212060200000000001976a91422d73e3a4dc40e7e909c753b96e76e679526b0fa88acb06a0305000000001976a91499e78cd9b82e26d047b92805cb96d95c11587b7e88ac000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f210000006a47304402207363ff904c9842518b9da96a83ea873e450dd573753899c2abd44fe5a83227c102204de198c5c623c048ae3a61a7631d2dff1673a34cca5d9f4b540eea4afec9bbcf01210370c8fd1fa0f37ed6c1418c94eef2a69887dc6ab1e061a1ccd058e32dfb3cdf8cffffffffe440f7def507c98522f47ee2b47223009dbf5ad209ac7d0a277edfa5b74a3314010000006a47304402205700f2da6cba47a54e595d8befcde7d92be724e4c285f62c516a89796ca7ecd90220622bb6795bf31dd43aa6cb107da0dcf65d5c47ae9fd920b2ee5b8ad7a6681a52012102a8e1a6d3ab64d0103d20d051b76738300f794eaadb3b90399bdc02f04b2dcd96ffffffff0246011000000000001976a914bc3c30530853cbcec3999001088a8663fc116da288acf0060405000000001976a914066e7b9247218848c5d203e907f2e41cbd3c69de88ac000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f060000006a473044022059e9fd3120d800e66a9a9ac00e8d7eaf9be0328dcf3e42804bbe8f7cd2bda752022035ba1a10d7bc10ab45fe0b4771c78c2c4e51d36b055289a187ebbe6f1ccefcab01210202d6ba64ed62c421bba9836d169554f383cf23eba1daa8cd4ad02471a0cfb390ffffffffebfc2fe00dca265fd211846740acf1c63797dbbf9a7d823991c19536b21a7a13010000006b483045022100ea17b04b5db96f87b499274155d5fc083cc56904141046cd6b960f468f2f5e700220710399104c8c8114870cddbb6efc85bc388bdb638a3e8c90ff6f8589a4ed8fea012102eab0f911ccae4a076d5c0f16ec633868beba34564a6a7e9410fcad5943fae6b4ffffffff020bb11000000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac901c0305000000001976a914d933d5d611a97ef8d34e0220e60b937cea94f24888ac000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f510000006b48304502210098fb23e5d8112613e1f6143f53a5c988b645c7c28286181de2e89452b0bcef1602204eb8522cff6072538f18eb1ee5c6eb0717f8686e13bc96a4037f11ca06b6195901210368605aedcec34cf7e5aea3f6458ba21de9d819b1fcb409567bafb475b4d1d429ffffffffcd4be262d8ad5d0b8f49b2bad259cb9dbf6e0493992b2070454b1e430f42860f010000006b48304502210087e9d0bde6a96af3067f9fc243e7a0853263ff734d2f32f0a35779a40ea08d83022019fb8ec5bbb7e83e38dbff1953f8379548ce92c75d714a81f21e58e6bf67edd401210226ff151c3782c26cf2bd31995bb8f225476fa8f1e718be39d0072efa3faef52cffffffff020eeb0f00000000001976a914dfba28dc856c9a949fb67a55b234adb957416dfe88aca0430305000000001976a91498e005108ac83b88c57814828b81885ce770033f88ac00000000010000000563c52f2ae296e4a64fee3604b977cc7cdf9e56b9620a2f0fbac4415e7ae1ea3a010000006a47304402207120444ffd7e32a273ba1835bbc589f9e8ed4a90ee7ac19b040358e684a8c8d4022052c5c99d4e9be2ed07030d59d2fc3a4beec243a3917d6836c58d14e9cdddb8e80121020cad537a9923a96698dd84bba715bfaf57a04ff9f62f69a686928d2eb72e2202ffffffff00d887065ecc8e6db1059195e6cf0eeb674cfe916deee4bc675056b5588676ec000000006a473044022008213bb62d98f5bc20346b549d280eb60bf79fa0087cc47f4c1c000431e1014b022064dad16c1f598a859c50dda7429630ee4c8609b848fc3a79b35a7094d45d9570012103e6f979cac9a74ec369bf59b72f0ae4f82021eec9230c3275c7aae0f66834c5c2ffffffff057b18acaeacea1bda074703ad2042ef816e8c1836a104d2cba48d590505220a010000006b483045022100a5e0be71a8debe197a4c39edf2f4cbd20bf81c98342e71b0199c6a940c26719f022003a0e06035b695e61372930510961b0407139a23961aaa4576027e3c9046ed880121039db960f5446d22aba6ecec890103d321ba5df44a59f0fe5fa3277142c57bfc73ffffffff4d0d424837c04a1f3b77755d311e39c68814595f7243e8f67d585ce3cb720538010000006b483045022100a1499eac399283e757938ce653c203ca09c3886f4a5e7c1d9f8a59a92ec20f18022078557b7b254ea244075d874f215a12bf712969dbfa504899529cb06838967aa50121039edfe608de4cb9d8615bf15ab1e2c37bd778382048e06f5d048f1f80f9eb28f2ffffffff4a7b5c25f8967c0713dab7bc37e57e0e703f47389e7ca185c5bcf8b9941ae3b8010000006b483045022100e9d2d6983f55b6268d18a857d7bc47c70bfa6bb0aee203e25a11c623c0e18cdd02204604b79c39ac2ec2ab5482ca6c01c94fa1d2d5a4f135ffb2c224eaff49bfdc1e012103a735d0a91a643d5cf3d8b78f967ebce7c88a76408db2e91e6c7aa774114677ccffffffff028f450f00000000001976a914d0207df1a478b8132ac27e909bc8a94c05fd091388ac00093d00000000001976a914069532d8f9ea4e62c38badbbeb6ad322cc461c8088ac0000000001000000041836afc3bd897a5e9110ee2680877cc7bfe1ec49c7dbf7d24ae7c8dae881900e010000008a4730440220118085f424c6287a23305274af5363cc383ee13ee4714744853891f929a344db0220567f5f0f233706df1f3e8efffb6132461bd1052eb28315e5e8604825090c563e014104b0b15e43c301e02efe8b47b80fd73df20b59e358068f1b9147cce08102c411036fae6f3a91bd8cd4c55ebec209564e3b597d1df2a75aae96150268721ce8099fffffffffb26e3f19c15c5cfe62bcacd3f8bcc36dfa93f83c7ab16f743d28863fbfb773c9000000008b483045022100a79fa38ad490ef4c66b4909df46c6e3b2d5c5566d2f857a479ff6e3610ac8d26022070b0c1d6f49476b4de6c10d0873b20c78777f7c183b003909d8e6070f47ac7e4014104b0b15e43c301e02efe8b47b80fd73df20b59e358068f1b9147cce08102c411036fae6f3a91bd8cd4c55ebec209564e3b597d1df2a75aae96150268721ce8099fffffffff71da3cb3976ca72914dea699207f3ac0cedbdf85d8872961c8c6c688e00b1486000000008b483045022100f8661d875117f4c50a740c54f88b8e2645fe367a7c8613d3b2bf2c3ba786e87d02206af59e8b5b9edee9ff8f8a02a3f2d680791ae8853bbfc68eedee09fd39bad3860141041d9932917299896a4bf5b9a43fc32b6244f400e501c040e0cd2d70c54cd825e2be6a1cf05a207e2a6c24f775d52afadca19261a2d24f7547b8c836a8f17ea273ffffffff6fb8be31aa34f410fb774d44f91ef4343f8e1197e4876c413cc8a8b871558e2b000000008b483045022100ee847e8f78459be5b481ac4469a7dd9ce8b49b7cbe21bff226decf84d79993ad02203ae25c6fafbfefd1d5d9d8b885593fbb2d7aefe6087d882b262c2b7ec2b39910014104a7d5318cd8f19594b6dd73f92183d027690d33e493a84c83c810c9c12635c92ac4369483977e1b0f48388228a98c29b64ef12a9f82b8e301e386ede502cbf44bffffffff0228230000000000001976a9140fdb0d62928786f5da514606cfc6ab6591e9392388ac14e5e700000000001976a91406c06f6d928000ecbd88ea99bcde72a0d4f3f84488ac000000000100000005873a8d859656054744c2849c6c50d99af8918858ff20ab34f796171765817296000000006c493046022100d68e7cff4a4abd48f8522ababaa641508253f2a81d7a4d9146a59218a36fe8a402210081cf67880201d87993a5a29ca77cb81705d1325079fe2dfde29e945bc2e5170d01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffffc00497ea0f6f8cdf4cf4d32b645a9f46b5ef9c0203c356c9d595ba61d98a62d8000000006c493046022100a51360e426c349fc030440566b7a3b7e9d7b4e35639d01c938a51e00f7d485580221009b0c30355deb50b0aff712669125c76bbf590c12dfbaccd8bae3f7bdca46e75801210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff2ce93cf131c43ab3b3fff0061738a3b4408c42e8eda4d66ff7db3bf38a201e5e010000006c493046022100e608c5ff0400d5fa819f51a1a4c25b4c7552318c55c96d83a00c7b9e76e80f3a0221008b3506d761936395ea6ac056464cf2e7bb2827b7914978cb108655eb2d0ce6cc01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff5fffb1fd69558844613a293ec6cb11a1f596791384b240c10da64eea8e2fff47000000006b4830450221008e5432d1ab36164724d7843f0bec50a8849add49e6722c54790a5a681864f37b02202d4433cd44518504237039931241cd50ee03cc3115046719bc7022f23229b73401210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff5484a335a10546235aa49ddfc3b3f4aad96348b43971d4c31358be6e4611b987000000006a473044022035ef90c1f3877a9c1b73782fdae1c1d515b1fa93b946a6ee11810a16f5daa861022040a421d967895be33d9c2178f5c3c6f335d96efb7c60679cc5bdab460af9cc3101210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff0220a107000000000017a91456fd2018804b730294decb2c5b64db5e649631dc8750c30000000000001976a9144c213cee459ba9be77a63a6338fea991f08be96488ac000000000100000005a089e69367c2df1534fd17afe75a1251990f35d1ae1e2ead27f19e213b49d1f5000000006b483045022100debddb6630716323de8f628d51dc36e7308fb60a0d0506c9118b2bc0ad30b34102202501fb4454960a00d4dd2b51665f110b84da2c4e241e92ca8a9767d457cc31bf01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff1a6bbcd6050250b37bcf2227492a2d6e1407bfb8207227ea02ab7894bf826f5a000000006b48304502203d39f463850662a467434667f68334ab2ef130b054f3b948b47cd44a6c00c031022100dac823101bfd4cc1917b4d63f764b645033091f7175d1a4382eb086a8e0f60fe01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffffeff72ec61c005796befa6e068fedf6f838c5d84574c692725284582f822735ee000000006c4930460221009ba6735e7152039b85386460687923f60571a7dd11fd6099509a202a00e873a2022100c276f6c9988470344b0fb8c6085b0c67389da5200ab09e438c8050ffd132ed8c01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff74e6ae82dbad0c37363c7426e1436722d310e3e66af768117cee01f2f334009d000000006c493046022100ae3ac8a3face719e12a029a9b4e812b60ab4fdf7fc428248559571dfc8ad79ae022100bf4388b1592955c5bfa4f27c304f9a998bb399dbb0e9302210f69a94eaf0e50a01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff8292084e5eea655c4a3b37b5a6e2ee36e6a53c613fad2ded1335dae61b405f0e000000006c493046022100a1f0a2eff1ede0316ca1f1512cd6806c5f887b51a4c6abed7c7d0f4dcc103cea022100bf21eee08790836793ae45fcc93c103e6e7cd3d75e1e976d89d3088f30fae6a001210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff0220a107000000000017a91456fd2018804b730294decb2c5b64db5e649631dc87409c0000000000001976a9144c213cee459ba9be77a63a6338fea991f08be96488ac000000000100000007e58a911331f08ae1cb927ea9c2d55b073df111a31fb6cf456b44a7c29a13d981000000006a473044022078aad7c89fd30cd64ff7e4ae9862f6aa77e8cc5dd54dc7c819136823d19ab0520220397e8d1d41373c751b340ae36e5c755e12b3cd68ca1a880baf5a2c50beb93d2701210364318b9ad30aa93993a384db556966d2031f6f43e4842f3844bd1f65cd93ea9affffffffd912d419a7be246de1561d60b706a7d48f4346c4bde68d2c5da29bac515a50da010000006b48304502210091239c56c1b9fa16230e8da619b95c1e470d8b123c5d83e093be0c092a271f34022027ce7534139e0ca79bf1c95c0bdb94108d25895c7613d505fff6c56e245f8c7101210309048983e59de145c997fdbd9f5e05178171f992461bc29b61c6afbbe1ea416fffffffff158165f24cadd51043e21359f651937367fcb2e272a318bf745a02e1f6eb0f6c010000006b483045022100c085c9c78f51a1aa5c740a144144facc000168eadb69095aa0cb3d7075f2967d022064f6ce76354b92c33673d1e9339d688b294c6288902cbee5c1224f34143f27ea0121020cb417901a74c8accbb4539e9fbc015d841033a642a471b471a14bebe887f61affffffffc49e44882b4080297f86029b9cec0c3f1780a8aa129e0f969499ef16ed5c8109000000006b483045022100c0c17e4f731b1a53bbff8db0b4434ca58d462a7454468a4af73a6b7ad11cbd34022003b1ae1195713498b35ec996dfa9066e2f9a5b97b2f7197a18f494bd45a23ce3012103d4d363f33a55d239c53fb6fc05595b447f824f81d43496583965a1f5caf62695ffffffffb2aea8e0e4bf56e8229ebbbe4c00b33cc7674b1377ce04b2ac609c9b092f9e6e000000006a473044022061a09de0675efea1cc30ad1934df41679137373bf7a03bea5214422e723f443802202429de8d117f281f7a45c952157ff240c84abb06e515a49fbd2d22a99f94211e0121022b7d7106aa8e4169257a0b2deeb30e2419e2ccfb47d549fdb8938100a692b4beffffffff6b848ee947b03a8b6b8e37a284d79f5f02676feb34e693908e94a5028b9c1e63000000006b483045022100f07781b77dc1981078c7079d9a2a1b572d7468eb638de086ab4629e05f4e3f920220744c472e67311caf0b34984021524c4aea7d35bcc78dda6c45dc56e357f1d941012103dbe1c3932db00f29bb2a9fead1d616c52cd98b22fe97b8781592353c4851d92affffffff8fb585d2cfa36e1c2bb7b8d81072523b486bd6f0e0cb0dae81eb7824180b9d0e000000006b483045022100cb07224583b986f28c2b9608b6dabeabd8be68ab66a1f5a3185e8bcc166c893c02201a097f691966d5cb2cc2298c4ffd9700493ba3862a73e78564f58dc0dc521dc4012103d90039f7c825894480c88e0ff25b159d57839288d1af7dc03a74e1a8e3da0daaffffffff0d8d4b7508000000001976a9145798b1c2d9ad862e3f13230c73f8d3a45ba5d47d88acd3de0100000000001976a91490c5bca58fc058ae95cecf9cec3857ec038cb47588acb8e6c300000000001976a91485433c070225a28134942c30bb9aaa729d45cbce88ac2b7df901000000001976a914c10e37a8cd55d9ae65567d832a8d85a56714093088ac1b97e100000000001976a914ac4f0f5d94c6fa68101dd5ba7af0bd30bdfa6c6388aca8394701000000001976a91432a9d57674772ca22e8df9437ef435a175289ead88ace2843e09000000001976a9149cfb1ea1359dc239c324e14ec92f53ec6f266a9388ac5b420f00000000001976a914e518b376cad97add0337b7694304c0895c4424c088ac20d7aa0d000000001976a9149343f22e38dd0748df30e0676bf7e8f5bfe3689588ac40d2df03000000001976a914670ba66102010a8dbb4b834d2a536484b91d4c7c88ac70048f01000000001976a914013cfd5b16b326295a8c60bd4d9ba2b75264696d88acc0687804000000001976a914653cf6f017b060cc46ab3796f411ffa0bb095c1888acb9b55d06000000001976a9144556b5c73621dc38edf5ae67e7e6c1add6e8244788ac000000000100000004a25919b2d9ba5834827dc6e52790c9cfcf6a637484008b611aa9ca3af38336ea000000006a4730440220496b1f109dc487301c3bae236ca6f8efe691d6e09c8eec3d8d5f97719760375b02201fa6cc5ad6baacd8ed34815c37b57a5564e1a7fc6e8e8353194184ba92b42a1f012102bf07874177e347f83c839c66c1c52a7254d091878922e646dc50ce37fd841487ffffffffd3485a41cf92dac3a6c6fede35a8f7e7ee030d4874d47fc18172bdf56715dcae000000006b483045022100fcb4ce877306181168540a2fa68e451cbf0c201912396b807b9995e97a31b23d02206b8eaf5fb58bf5e74e43b8301bee6e8c5d10082412778bfc62cc017d8c0d7088012103729edb8599da8f125923e9a8207e5e7cd2c7027ed9a0212775a64ce1d600f0aaffffffffde100c0b556a7dfd90575b1fbaf37a1578ea39385403d79c2700d0ef367e0525000000006a47304402204f439a89da1f48711ecb229b0d429aaf7f6a9e8292594e183e9abf8c9342f4d302200ac2691f836dbe91a1dedc92118eb497e4f0462d530919046b12b05f186cb0bf012102b8924f3067c38fed22445d5371dd4ec67cc5c038aa2824a5f3c6b787082b86b3ffffffff76fdc1bbcd8cee9da6ec41cd7fab35ee604e5f108d0a5724d32197fd430faca8000000006a473044022022cdd1980a09779852623a041b8500ea95a27aa3ba7772fa435c7a2a0f7f7d310220222167e6ce5ed1ff8c45eaaaf95931c24b404987f04c5233c8b29e1ab0d960d00121028dd4ad13065e7cfe7b706f733ee6067e879497be5f595b6c2eb28c4bed31db3fffffffff07ce122000000000001976a9142467e249b29cb00598b2d0425f8135fedc7ed2e588acacfd0100000000001976a914b46d1b1e3af916966c0f45fe34ca590d6c14d3ed88ac20394200000000001976a9140202fddbb2435f742e4230d604af24815d797be188ac60900f00000000001976a9140d8884a248b37ee8a2312ef14c14e0654fab7b8688ac26250200000000001976a9148716b034aef06ecc5d98ce391c869a70db303a9188ac20d61300000000001976a914680ea70e06b0169c9756bf38c7736d0adf191aa288ac084e0000000000001976a9147d490fb2b7d9edcafe5dceb95abdf63b8a255c7188ac0000000001000000087609408a14b30aa7fed7c91485edd9fb19a0ff0b8e7655674bc0923cded59a0728000000fdfe00004730440220702d110a384922ba8687a7447bbf91373627b30be4481a12ff7a01690fe3bdaa02204958f9ae0bdd9b0b03641646989afb1b3712c20a5bccd841e0cbdbce008df60001493046022100f1365246bbbdeb9616e3a1581702c26d6323b34048f9508eb7ef45505b9df804022100cec9322439432f3ae6b5e7bbcc474c4b4e5b2fe52b7e21c2d70f89b48219fad8014c69522102f097ad5490aee78ca0fb0286d59c94d2ad258607cd68a1d2257182dccc69a1bd21032f732aa3f330907065589cfef2cc40fe288050c31d8956271f2d827a5f3d365d2103e0cb6f950544c56be8664abe8e7c9d32f37b33496480180a4f696425e4516b4453aeffffffff465db37737567a3e32b67d71fddd204996a294f87f3f5ae17395790c0da68c2255000000fdfd0000473044022060e2a023fd886a816704c473e5f2377bab62787ccefae0e357dbe77afb9bdce702200888336da996eb3af0fdab56d77192899c7019ad4edb361af404b409960eb7b0014830450220113163876c77e4e08eb0194000f0487481463699fe8b7a2ae69869830d7d543e022100fb321053d245b801a8c6c266836a83be89f1c6de0e59a3f834a602512c6625fc014c6952210317ed21dd6e3ef90c3aa1a6385ac7eff20b8d2ea574e8caac8fc2d2b05c9a3c88210380d8387ff569a9fe2f97d0c3c300dcc001abf283acbad5120b615d313a0ad74821036164c92b13ad43a1b58bd0f12ddded8e1b6981d44594ef9250701927f7b29e9053aeffffffff8d1b077ed5cf09d127814e2aeed3d07239ae203b3bf7ea7800d550c6a0b2f89102000000fdfd0000473044022006107410b6bded858373116de669203ec066c382e23ff3763f060b90718efaf002201f61dc47d0df192bbd8f2e871ad4bca5983bb700c3b95301552e4d2edf0cc38701483045022100b2b592ee57979e602cc2367fd7f1abf0a042c56d10ae0afbde60004f753a10db022058ef20df40d8de780723f289541ec2b924317d541617dce4d23e7ad4bc9d1e48014c69522102e12b9e6609d9104fa65e7af8ee70b7512b660268c39f797a14cacb5bd25f804721034a472f1ba414665eecce4ecde2e340cdf8da2cadd92b9cf1a89ef3e4a032c8c7210206cc704a962679606f44ad9d80be136ab49ab796125f80fdf28ed1a38a9cb07453aeffffffff8d1b077ed5cf09d127814e2aeed3d07239ae203b3bf7ea7800d550c6a0b2f89152000000fdff0000483045022100ab320f61862eb78a5eb324a70e6abd01f21ca2b735b2a669d8b2f3b1d2badbd702206de7796daa82262e78e2d8a8bdb655d9670e944017d881d5d0caad43de34d48f014930460221008deebbd859fa8d540cd68177eb40864a03b98fb78396a3c0162bcdb0e506c3ce0221008ab2718f51fee27f0ddaf53f96a3f24c54f2dad350523005e68dde6b36d3dd67014c69522103482d14cb45b034286818848616a4fc4b1bbba4a3af12c630421b87382f8f22e721034242b5a5492b8e89cde074e4a2ed873429acf40071748654dd8c6f8ce3e7d13e21023ee1e8c8e0731340babc372c9b516ef3993594abc7e87364cd5c56536227b9d553aefffffffffc7db1d32f29e6ecab3c94e7cc018b93974921a50faf4b8f93c0e68caf4f281d01000000fdfd000047304402206f02ed2f5c6f712a2fea9a3c57492784386b2a9cc7118459edbc15d29aa5a45102203911ef850036c24684ba0cbe4bb3d83136ded6c59d42651904c9cd0e647f6b0d0148304502201a3c03558809a02bf44fd2789ee7dc6f17313614f3af62148c9c5f5654b9744e022100e5f96611a3de5f76bcdf33db833e8edfc83c4c287d923abe8fae8c53f9253914014c695221022c32817fb3a4e32d6bfade84ab4b485029f68678e3fc3a6b4b7126e5d44e844021033315ab2973621dfc637d86d1fe36245df50d0a271078c1e1b51f5e094eeaeb2e2103d1cca2a83edf5a7d0cb9e9422af530e9916d3bd2f293b75419dc7cfc8e9a20da53aeffffffffe192f2a83d78167fb3e79617abc7ef1c62e0308cdeaaebb111a490a9804bc91338000000fdfe0000483045022100b3d66a272ca6b77fbc4f59c046d8c68f77daa524f9800b198185096bf2610ac302207758ece29b70a60344f178a600955a8a3105bd3a53f9309ab15e8731945b16950148304502207bb172374e02fb68acaad2f1d8b15ded9d70c3e0d6cc91e9aff973fe2b03a965022100a888842a2306c323319695e0513f705a6c58546dff95bfc7a439a55c5eea59cf014c695221022e24e284889f6a962522f74a872048ab9a49f6a45b4df1be46922af3294000bf2102808c2976f2fc730f43f9adb1e22ebfd96bf9363236a945ed69eaa4c9f399eaf52103604e127ffc4630e490fe4bbedbe69f10eb5d51725ee5b68ad0013e2e0b8337c753aeffffffff465db37737567a3e32b67d71fddd204996a294f87f3f5ae17395790c0da68c2227000000fdfe000047304402202888e7de5436dde7957d846dd1ef365ef736dbcda72dd21033552a16ce1c9528022001e840b5752d077b6600fd8af51496ae78744acfc85a2bdcfa82836c1267df170149304602210099ddfdae142cb42a0bfc19c2ff78cdf0fadf774891e9e5de2cfa7635bc7edab0022100ee594c99c814f61b1a1d516bc90e0f0da1d7c1829c8c3ff4c9b5a67de8a0cb57014c695221020dc3d127c2eddb411ff6eb7071d6e9a8c11208e47c95f899d35367a0fc3610f7210378d81d7721a8a9498db4612a5a5736834e4cdecdda2767b93e02820f176a77762103e957ff4984dd3e4c750e71a4b150b92b218d58cf045f2073788aa2055184170953aeffffffff5e023dde4f10a46a67094f66c4fef8dc3236b7e8590ea18f8824fbb68cc6067901000000fdfd00004730440220175fa15bdf400c7d5a6b031073ac16f1f30435420279802fcad283e13c982a0b02203ddb5127ae8399f3abdbc60c407c47bd981b98463a45177b49d9596495d5b08f01483045022044066221aac5ef641fd2ee53a0a8cad2f470a0cd9b19c395abd463284c0bc7d10221009ec719628246c7fe0762dc3781d9925ac4ddc99c3e64de78a0c3bd9507c15fce014c69522102eb42161ad73027321bc3e0334d2f657b74682af68821d024d4daa8b0bf7502d321032e7823d9adc9eece9f6a8a7cd71f1c619fc76e984df0c8588001d22585644c2a2103d0698947f0b5e38c96b3c5a801035f09c8de463e9dbb3ca238de42c309c4c2e553aeffffffff0436506800000000001976a914b5de8d287e058ac2967e1823016101a7cc700cf388ac409c7102000000001976a914174efcb83831aea5de5e489a1473f617481e628788ac8fddc5020000000017a91437d153e81c48278b77a099c09411d38362751846871b488315000000001976a9144bdb0b7712726c2684461cd4e5b08934def0187c88ac0000000001000000013f980a803270dd6a6786edfe545baa6a02299d5a05a593f15cae49a083e6288201000000020151ffffffff01384a0000000000001976a9140659ea0f166aecb428e51a9414992bf28cc0c9eb88ac00000000010000000121badea07dede0c45c6aa69d2579ebe56387f91e354c36079a33251ce4a860cd450000006a473044022006b63c164063d59ff707186a2ed039c6d5185edd96f264fc43d4376b884fce5202207498575f55a87cb4ae2bfe56072bac74438a8f4b29e3d488bb007307d206fa90012103ad488d5ba48f949825bce6b92439d788027f9cbc787951f7198c170a4b681a94ffffffff17701c0000000000001976a9142956227d413b490b989b552a4ab69be35fbc451c88ac5b1b0000000000001976a9142bd6d10e6740b2c5ebc0b85450ff2c69dd4529f788ac301b0000000000001976a9148ba8418e16e35622f665c481956d821f340a111188ace01a0000000000001976a9143eecb7f092221721da151281b7ce2e720bcacac088acb31a0000000000001976a9142b2545d96815677cd040c4692b8857057be9872388ac901a0000000000001976a914db2ae9e13aa7320a4bb3846dbe96d021009bd3d088ac181a0000000000001976a914b3e73a8cbabe69e4a170c438dd9c0cddea3455ad88ace8190000000000001976a914f559f58817c8c0db2c10178eff2277de1353491d88ace0190000000000001976a914f84505347756776975caac6ef0cbb6c654fc8d0c88acd8190000000000001976a91458b007ee9bba66cf9a2d8f2ef11188c0f3e2f85388aca8190000000000001976a914118bd8c9b9e021128943a0fb737fbcc55176d65688ac70190000000000001976a914cb503359f07ac61b140394b3a3a73719b2716c7288ac60190000000000001976a9149a005e082df0dce421a6402d9df949d7d30ffac188ac701c0000000000001976a914b8bb935415182eb63a99822116de4269398a23eb88ac00190000000000001976a914c0d99470ea82e172492dc65b4ad4f70d1c6ba85a88acc6180000000000001976a914e2ca06d3717aede4a1758d6fd26623beb18c155a88ac91180000000000001976a914ae0e6a316462c96ed3d9357c6026860dad06ea2188ac10180000000000001976a914ac670f702c391ecff364bf5482493352eece69e688ace0170000000000001976a91471ae8a29a1fb1b2bd6e8db48de40f576c9c3bb4688acd8170000000000001976a914d2fc79d8e848f4c5e529bdbaf2985fd32654ef4f88acb9c02f00000000001976a91442bd8225289a7abadd9ae3ca03c7728cff703b6188acd6170000000000001976a914ab3e698fca2f209c5062714159703d741001a7a088ac90170000000000001976a914c2f3d984b27f54fb595c3d9360b7b086ecce22df88ac000000000100000001935bda72d8644e92e2d6450cf91bce89e3652955768605179d0a046e74b618ce000000006b483045022100edf973ea0e40be7dad3146ec5149210060891ba2f43085658918dd5df91fe9780220737960ee427a263be22d1d9ec2f6b5d083dbddb399ed96900068b3ca526be3190121029e327a887d04cf47cb5c3c0a98752bc14b91a868b0a7d7354ac2028ecae6cbd3ffffffff01a0b39705000000001976a9147af1bab2645028cd20a491b7929dec96f94d5efc88ac0000000001000000025372c4c57f01eff16fe31289c4efc1d099380a2b67dbad9f55da402495440fab010000006b48304502210094ff5b3023b9f9657408cafba21827ef7fee96f19508515e81dca142316622e102206f44491df30309df6bb38fb459026d0eb2dd3b966506f6d28189ac0fc283bd700121022e1d51adaecfbc0e017738d48235c085906618cba0fc9941f03fddf0d0badc4fffffffffd447c8af81eefb0c2756569872623d364a3c7eeaff53252dff56b982556f83c0000000006a47304402203f67ce31c855e1823f2dd1debca9e4a5f39613b49022926e19cb5457f70624ce0220791cf612ded8a39f3f273e30015d1e6512be8282422b665c4828afb39076b2d60121031f4450d4aa56dd24b29ab792e4e0c7500e2961f197bd2bee6adcd21c3e3389e0ffffffff02c0d0010e000000001976a9141fa4e93cee43ca9aec1daa47b45fd0688a41489c88ac93a8ae20000000001976a9147b9e4573be924d06881b8153d6e5ab7522b000e288ac000000000100000001892b2fb2bc30fc18cc074a694a6ad0f3c7a76b529b422eaba93179960d47a48c000000006b483045022100f2887c5790a946300eec692f25fe951b59043b5f130cbea4055497a136e3f0b602201cdc394f8dcb3dda960469981d77cffd8c3e9e2fdbe8c5b9e4b680c995ac5eb5012103b202980f3554ff2359cca72e34e3a33de23a141848236160bf97b6f69b26f45dffffffff02b8820100000000001976a9144893c1f022614617af0f0217df7fa45f7a498c9e88ac0000000000000000136a11626c6b434954452d756e646566696e6564000000000100000001c7d45151e476d3ef37b8944d9f65b95cf5f9e4438d083764a0f5352de8031673000000006b4830450221008225c2e34e135406d6b6ca68608891a445b7ee804343c72ff044c5d4634b5719022057b87a9686d18434555ebfba15576190f4e34551798a2f2a664e455d7ce5653e0121024be17673c8cffa66ab1ee3969b6f89e0e31db476647d3ae431acbd5d4447b240ffffffff02535101000000000017a914b9bdab29754755bf730da0262a8ec8fbecaa85a68794620100000000001976a91492228f5b257c8cccd31262fd24837a3bda521d0088ac00000000010000000140e3777ba2a8e94ba5bdcc21652532cae692f3cf626817c8d07e8ab7178d782e010000006a47304402207aa519e1a01415cb116d176ee200a6558083c27e2e01fc1833fba8800b35407a022076d6814b9c61a5dc18646633acbadb10ef56c31e2a60b4e534ccb93c4efa3cb0012102ab6efabf8449c9c3f163c26848682c100bebb17f8e0f9ae7074308945b1508edffffffff02c07c7a11000000001976a914112725d290646acce6c36cfd283cad60bd2b621188acf8b95007000000001976a9146e43e09d38b9ca4a1a095a8161842e4803ec7ce888ac000000000100000001e02bbdb6fc8634876bbbb507ba4474407d474d34bc294c935476517527c9d8db010000006a473044022008da34bc1b9255e65b5c232e3f12a15eb766e5706aac5bc571922b9e1ddbedff02204f370c9a614b8d5362e8134709c82d96cd714f631adb96e79c3ab7266f9e1a770121028727951f9e85defc362016f841e8daa97ee6bcc297ff7009714df0389213619fffffffff02205fee05000000001976a9140d938222ff45ab1aa54bcc7f7369d6424f33004e88ac704c0601000000001976a91467fcd2894dbbfb5ce5b85b252bf8a838c2d6a45788ac000000000100000001c61ccdd6da33e60a7090a4373082e97eac451dc227644a09efc8847cc81fd47b010000006a4730440220270762d0afe35bb6b7c79625f691fdbd99e82ff1d6c47a64bd6c8b9bdcf5409f0220721054e9718272c772e4700fbf0ec91f26480c15dcc820403cea33523b26f9230121026d0f25723c8eac6872a367b9b014270f09c077ed371250ac4fa57d5ad381ef43ffffffff02a0860100000000001976a91419fe2c57cc57ba070cbb3d5c69d29e06e6e5adb088aca77e1100000000001976a91460f0c24dd4859f65b504af0394e22eacdc5333c588ac000000000100000001902b3b7bb311a221091be40807205f53ded1599ac1da99a6cbb3289ad384efb6000000006b4830450221008a9cb6210e5d2e478853db30bc86fb7887db9b7cd8f4aebab71274291ee0ab9b02206731912cf306aeed7e4b18c2e45233d0d706c23f51ca14daf75e3596102f70d40121030a7b28ff87f8e0c327296c12fc3e5779daee706969bd029345e04ff38ab25813ffffffff029c8a0600000000001976a914ee3294b4823a5b804c8c316315a8eb00124baf6f88ac7065c500000000001976a914d20dc2429bfdab9b6239a450cb828480ead1047188ac000000000100000001c54acaacadda3b75e3e7183570a7c4a3febda1e962abe68aa5d1ad0052240d91000000006b483045022100f9aed4750c10a0d1e0bbec3755bfefd1c9d628cd4ca1e74652c29e5f22e046ca02204473630d5c959bd0b9898c1d19d367d73fb81790f84b1b3d5786f44915db90d0012103260085357d1f06c1149873a6372a291b144d03890b8761924bf7e9f0010ec628ffffffff02f352bd00000000001976a91457d364528698fcde6f8018a77fd62e90ec16571788ac85ee9600000000001976a9144b28b59197ed1cf8ae58ed8f051c1e72a5fa3de888ac0000000001000000018ea0adf0b93418ae9002dd83ace465d27f8a00d0eea5f2757c8e8652e022b6b9000000006a473044022041db21de2713733f8f4fe78655b7589a488b8e73349b9eaa494adc6a0838d03102200158a7676749591a51fdf5e29bc2cbe0c01db9144ea19e85f287e3d15dfb3436012103b202980f3554ff2359cca72e34e3a33de23a141848236160bf97b6f69b26f45dffffffff02d07e0100000000001976a9144893c1f022614617af0f0217df7fa45f7a498c9e88ac0000000000000000236a21626c6b434954452d6b6a646637363134716173646a66693931383479657279383100000000010000000193bfcae914db1279814dea6726cfc748b755bbcc4a93a273a9c620f2508a78ab030000006a47304402203abaa04cab72480d6a829b6ac1e297d17c0216ea64cce0bdf35f24fca2d2b56c022057b1fa4a6faddfc24e582f53630994df25f93dbd7b6ee887c17526145a58b37801210359ed9fe4b091a14a825283ea157184972e40ee7bf19907f8f55475a7e09b57e3ffffffff02e0834e02000000001976a914466de898febb92569e14fa08f86c4c90ab9d91fe88accc8b0000000000001976a914c670fd303d0eed54dfc1f5510cf65a8d35c4b90388ac0000000001000000023afb3543779eee68de215e33294df8829f50d040d694591c6ecb90289353ff4201000000db00483045022100c0ec3c6093d278fce86c302c5530fbd392053d286b057e50239c8a1c064d3b1502200acb0a998419e0f498ac20e1289edb88481d6b27d25fbbb1b0410221705924e001483045022100b80149d2516873b9a9e1ed907564bd8eef80c0b1920535fd84a3f5b78cf6375d0220522cebee4005c2ed5b5a07f35caf016b519f362d92d762b871a7dceb6ddf5e110147522103fe703028715e95bbdd7ea2b1b1d42b497f1f30cea7f02313060e802b676edbe32102aeb999f6601af13b0f9391f642611e32bf1bb7db593ec1630c9fc6f9bbd1c35c52aeffffffff14254bb015e1c9544d767273680b13fc95a564194a6aa739611f1ded4c31a33d5e010000d90047304402205aea8894da710b14f0661ad722e79b074b6c1384418bdbc400f25bb3b951765402205094028481b583fe34222e78319ce57df25d5fea43d6581266d71439ea6a4daf014730440220582a636c2e9301ed94ed2a693199b3d46498d247823c1afa6691ae2dc8f7713402203bd3ed6421b7eb99c6f11709d7231b3ce1de42ea9ef76b252a40feaf0b17ce2d0147522103fe703028715e95bbdd7ea2b1b1d42b497f1f30cea7f02313060e802b676edbe32102aeb999f6601af13b0f9391f642611e32bf1bb7db593ec1630c9fc6f9bbd1c35c52aeffffffff0210270000000000001976a9147e39d0c3c9f2dd1cb6efff02ea2b3e66f0fed57988ac6c0700000000000017a9148511da076b68f24fc8a506e4688b4c0bca0e81c8870000000001000000019b8630b859bdc779e56cd05445c56f9217d733031fd346cbb886c8cb1ac79932000000006b483045022100b6c292ac096841a29de61a0cf7b555d374d46708452642a67798cdb8f6b30277022009f67af8ed398c382f42c2bc96057ad1fb39e55857ebd649f1691f15d1acf754012103e229ea70ab5ea17031d89e7c1e24e9c77639c847378fb953753d73a5ccd5c4faffffffff01be850100000000001976a9149b95ca317d2d4c255ebd4036410d2ded65ca872988ac000000000100000005cb135d9ee2626ca15b7dfe4d7610d2fa9d22bec1f42927518dc957827d87c58d000000006b483045022100f717c831ad1577900bd4fbbfa35f079c9771757b97688a6a3c88532e5843d9c7022030e31a108bb4e06f79810ce5de828fcba5ad9a20cac8fbf02a9ddb6ac8c7c8a9012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffff218cbb397655ee7aaf4ee7f232545800346a96449546db79a9f9d054d145d891000000006b48304502202e26268ebc8529e41874136c429a9a82a5a59bc41b983574a9d874af9fe54ef1022100cc3c02aeb0c63db3c3e5f8534b03d41f7a28b007ad1dd26c6dff04e887b23a6d012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffffe96533968cd1cfc9a7a49fe56afb0496794f6989c711ed94431c0037ab92e0a4000000006b483045022100b75656bd4cb4119e95f7a74b687d9280d0a295fd7ddb8a06ce64923ae935c6a6022051b35243b48073d99a05862475774b57e59caf57320020e00eae61f411ae304d012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffffd8000b57b08873fdb6bb7e15a0506708cd3c3398be3a5a7f59030615c949a6d1000000006b48304502200203dc41d55f69f64c957592663f015314e145564456906743602246ec7e48f7022100f4416318828ba33e1732af39cdf7d1d6e845b3ee7c5a6315bb5d26668969b921012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffff29c23a479db487a4157b66fb3582c5e8d28e94cfcc34ec2b4454cbac5b5bfcda000000006a47304402207bb2972b1d007357e82f537d3a74de5dfecb404def5f6bd7a794fd93bb9ba87a02204d4452cafd8874eb521e67f215ca60087de9e85d8894b542394301fa77668de9012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffff040e120100000000001976a914a35c87540e251d00bd7c25b8561fd13c8e20621388ac060a0000000000001976a914568e17467b6f1d7a98430f189c4c3d2246f5ddde88ace8030000000000001976a914ac9d08a94f54186101973113614965453044ec5388ac4c330400000000001976a914a6559089e22b9bbc8eb6bb0dd02d341766c820aa88ac000000000100000001a42006a28d5d9b21d08919897c1c20ec84a75df119eb78140547089cc26a760b000000006a4730440220424789281497268eb87b0d9e448e043cd5356059c5bfb0335b0047cbb17084d8022063100c678b0eabc2f42066821ec8dd1c6b6e4b563b8bebb8bf91ad02c079850401210366c2654259c544a8ef1dadeab869b94bcb8b6e4da09f4698dfdde2b0a882b0b9ffffffff0260ff39a1010000001976a91427c82c6e4ce54acb9c2c67f1ab843715d50a3b1688acb9193777000000001976a914459100c6f8143640d5ba2f6f21d95c5557b0987188ac000000000100000001bea0f6596f6547a4a9ce96944f581cda73fe68e3882846fccae1bd9855db04cb000000006a47304402203fcd10fb496241f41465435ac740008018af0a1b9c6becabe3621a269dbd3eb202205f7b4cb0fdecc39baf170b0f6ae2d74b6bfeef593bb9ed0ed4d9dffb3bf5fd2a0121035411432297cdc797ff8e36bd513352e59b21c0cb6dd3bcf13b6a7baf344bafe4ffffffff024a34821e000000001976a91469a81bd81731c19ac60a473113e2ced672c9cc6e88ac43535a46000000001976a914edddf3ac5084f4df1058ad55d72e7d92b0773f5088ac000000000100000001b95bc5738e9c764338ee9afbd78644ea02df709d1a74ff18adb877528347dead000000006a473044022046d9e32c186e0fdec6b3df555c7e726a0b07080ca39aba6cb7cc287c50a60a03022065042320781b2b9403c15e50d05404c63238ffe3664db1186c11531ef01044a901210297b1240283700504758315c27f1958e8649fa5f8fb067f266925352a3a5cee17ffffffff02001c1902000000001976a914dd125f8605acc2cd784cfee8b7d8bff9f65fcb7e88ac32b96802000000001976a9148ab0a5bfca9ea41780a7b83381cc2dcbfc6298b188ac000000000100000001bfa3b6f9e193186e520e6d1bcd2dd42eed0aa3764a330e3922f325f8b8ddbc99010000006b483045022100c7a05b76a91407cadf8eb146b4fe09b7504f2654314325c8d5637c61f613cb6802202281ddad11ed6690609ec6ebb0715cda26621ff0cf4f5b69e47c2e9b4b5550ad0121024b30a1a48f4935058ac79273660a6d79550dafc71650152f14469ab3a9c8aa0cffffffff0203556d0e000000001976a914b4019007cff80b6b987f68191c1433b8d1cf6d6388acc0687804000000001976a91471729c6c03714a4a510299aab5b9030b944dccb388ac000000000100000001d70690b606e7ef96e7ef2e33460718ec7e93e9d5a98025be162e2dce64749db6010000006b483045022100f6562c9d7d2877dbac9a31de1634b3c7cbed91bef26972c9e0249fc4fb56e67e022040483f1c3c81ff807f82593d105ad37b1a0c7ed927c8bdaa1d558a9b4d0676170121022a023d7d15923fd2d3351323fe743dff984a87507dab7694adc75a80e22b6fc0ffffffff0288a3a815000000001976a914d05b8837feb7b1c20ef13ec76d2e3660e03680ab88acd4247c02000000001976a91471207fa6371951b4f6f53ca34213f753b5b4394788ac000000000100000001f231873fd290c03c2d8b13818893cb2fa88a6d7dc7dbbec29647f4f08343460c000000006b483045022100bd677305b3afd3e921f13773f92f5bcbbe732ac95f430665d0ce38f2dd715d84022071f3daaf83461cc15af5d0d2ba8dca0a8614de3a201f504c131f7a14d591a54001210240e251cfc6450738d6368155469814889a1af198adf2b65e226415af3f4b2124ffffffff0241f5e20c000000001976a9141a3265d7d31c2691570d5cb592417324cbfcff3988ac65adc508000000001976a9142d6c51edeaa5c20653638952b95a1282d145d5ff88ac0000000001000000015edf447e00d5ad32259ed93c7dce2191fc6401255f6641dab4a7333f8e8fc316000000006b483045022100abf99da57e19cb3fe61b95225ac22b0cfcd58a77bb885e16d28644371a5b35a802204009685cdbf260860ea34374b63b0f6888990d02a7202f5f7e00f6c88d448946012102319e5ddbbae6d9da7aada698790758a7db0d5424f50ab717c6fae1ecafda614effffffff0276889004000000001976a914a1b0e8d492135c75a1a109e249a8190e1b69ea2988ace96b5208000000001976a91483158b1f9e33ef4657f4e562d0f1f880d08eef4988ac000000000100000001b080e9eb487aa93eaae6df4d1cfc0b6a586f0634445bb856aa7c5cf43d41bcf20000000069463043021f1f87b9fdcbaa0f208283dadcab63c547d3b1cac6d08406f802d42a9c445aa202203b572ad168c39faa8b2ee3ec1761afd7ef2d45cd68b6f7e40783797d2d2837d60121021091eca140c51666414a3bb9d4f077f10f109ebbae632034b408846180a63b81ffffffff02c5a5e902000000001976a91408a07dec5cbc859b0ce62586b13d10e4cd8cdb2388accfe1a601000000001976a9140aa5ac2f732c75058f584c26489489f4ef15e7e688ac00000000"
diff --git a/benchmark/package.json b/benchmark/package.json
deleted file mode 100644
index d9c9fec3a..000000000
--- a/benchmark/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "devDependencies": {
- "bcoin": "0.15.0",
- "bitcoinjs-lib": "^1.5.7",
- "fullnode": "^0.9.0",
- "benchmark": "^1.0.0"
- }
-}
diff --git a/benchmark/script.js b/benchmark/script.js
deleted file mode 100644
index 1ec27f377..000000000
--- a/benchmark/script.js
+++ /dev/null
@@ -1,85 +0,0 @@
-'use strict';
-
-var benchmark = require('benchmark');
-var bitcore = require('..');
-var async = require('async');
-var blockData = require('./block-357238.json');
-
-var maxTime = 10;
-
-console.log('Benchmarking Script');
-console.log('---------------------------------------');
-
-async.series([
- function(next) {
-
- var c = 0;
- var scripts = [];
- var block = bitcore.Block.fromString(blockData);
- for (var i = 0; i < block.transactions.length; i++) {
- var tx = block.transactions[i];
- for (var j = 0; j < tx.inputs.length; j++) {
- var input = tx.inputs[j];
- if (input.script) {
- scripts.push(input.script);
- }
- }
- for (var k = 0; k < tx.outputs.length; k++) {
- var output = tx.outputs[k];
- if (output.script) {
- scripts.push(output.script);
- }
- }
- }
-
- function isPublicKeyOut() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].isPublicKeyOut();
- c++;
- }
-
- function isPublicKeyHashIn() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].isPublicKeyHashIn();
- c++;
- }
-
- function toAddress() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].toAddress();
- c++;
- }
-
- function getAddressInfo() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].getAddressInfo();
- c++;
- }
-
- var suite = new benchmark.Suite();
- suite.add('isPublicKeyHashIn', isPublicKeyHashIn, {maxTime: maxTime});
- suite.add('isPublicKeyOut', isPublicKeyOut, {maxTime: maxTime});
- suite.add('toAddress', toAddress, {maxTime: maxTime});
- suite.add('getAddressInfo', getAddressInfo, {maxTime: maxTime});
- suite
- .on('cycle', function(event) {
- console.log(String(event.target));
- })
- .on('complete', function() {
- console.log('Done');
- console.log('----------------------------------------------------------------------');
- next();
- })
- .run();
- }
-], function(err) {
- console.log('Finished');
-});
diff --git a/benchmark/serialization.js b/benchmark/serialization.js
deleted file mode 100644
index ee948a60e..000000000
--- a/benchmark/serialization.js
+++ /dev/null
@@ -1,122 +0,0 @@
-'use strict';
-
-var benchmark = require('benchmark');
-var bitcore = require('..');
-var bitcoinjs = require('bitcoinjs-lib');
-var bcoin = require('bcoin');
-var async = require('async');
-var fullnode = require('fullnode');
-var blockData = require('./block-357238.json');
-
-var maxTime = 20;
-
-console.log('Benchmarking Block/Transaction Serialization');
-console.log('---------------------------------------');
-
-async.series([
- function(next) {
-
- var buffers = [];
- var hashBuffers = [];
- console.log('Generating Random Test Data...');
- for (var i = 0; i < 100; i++) {
-
- // uint64le
- var br = new bitcore.encoding.BufferWriter();
- var num = Math.round(Math.random() * 10000000000000);
- br.writeUInt64LEBN(new bitcore.crypto.BN(num));
- buffers.push(br.toBuffer());
-
- // hashes
- var data = bitcore.crypto.Hash.sha256sha256(new Buffer(32));
- hashBuffers.push(data);
- }
-
- var c = 0;
- var bn;
-
- function readUInt64LEBN() {
- if (c >= buffers.length) {
- c = 0;
- }
- var buf = buffers[c];
- var br = new bitcore.encoding.BufferReader(buf);
- bn = br.readUInt64LEBN();
- c++;
- }
-
- var reversed;
-
- function readReverse() {
- if (c >= hashBuffers.length) {
- c = 0;
- }
- var buf = hashBuffers[c];
- var br = new bitcore.encoding.BufferReader(buf);
- reversed = br.readReverse();
- c++;
- }
-
- console.log('Starting benchmark...');
-
- var suite = new benchmark.Suite();
- suite.add('bufferReader.readUInt64LEBN()', readUInt64LEBN, {maxTime: maxTime});
- suite.add('bufferReader.readReverse()', readReverse, {maxTime: maxTime});
- suite
- .on('cycle', function(event) {
- console.log(String(event.target));
- })
- .on('complete', function() {
- console.log('Done');
- console.log('----------------------------------------------------------------------');
- next();
- })
- .run();
- },
- function(next) {
-
- var block1;
- var block2;
- var block3;
-
- function bitcoreTest() {
- block1 = bitcore.Block.fromString(blockData);
- }
-
- function bitcoinJSTest() {
- block2 = bitcoinjs.Block.fromHex(blockData);
- }
-
- var parser = new bcoin.protocol.parser();
-
- function bcoinTest() {
- var raw = bcoin.utils.toArray(blockData, 'hex');
- var data = parser.parseBlock(raw);
- block3 = new bcoin.block(data, 'block');
- }
-
- var blockDataMessage = '0000000000000000' + blockData; // add mock leading magic and size
-
- function fullnodeTest() {
- fullnode.Block().fromHex(blockDataMessage);
- }
-
- var suite = new benchmark.Suite();
- suite.add('bitcore', bitcoreTest, {maxTime: maxTime});
- suite.add('bitcoinjs', bitcoinJSTest, {maxTime: maxTime});
- suite.add('bcoin', bcoinTest, {maxTime: maxTime});
- suite.add('fullnode', fullnodeTest, {maxTime: maxTime});
- suite
- .on('cycle', function(event) {
- console.log(String(event.target));
- })
- .on('complete', function() {
- console.log('Fastest is ' + this.filter('fastest').pluck('name'));
- console.log('----------------------------------------------------------------------');
- next();
- })
- .run();
- }
-], function(err) {
- console.log('Finished');
-});
diff --git a/bin/bitcore b/bin/bitcore
new file mode 100755
index 000000000..0da0f5ea8
--- /dev/null
+++ b/bin/bitcore
@@ -0,0 +1,5 @@
+#!/usr/bin/env node
+// vi: ft=javascript -*- mode: JavaScript; -*-
+
+var cli = require('bitcore-cli');
+cli.bitcore();
\ No newline at end of file
diff --git a/bin/bitcored b/bin/bitcored
new file mode 100755
index 000000000..3190530cc
--- /dev/null
+++ b/bin/bitcored
@@ -0,0 +1,5 @@
+#!/usr/bin/env node
+// vi: ft=javascript -*- mode: JavaScript; -*-
+
+var cli = require('bitcore-cli');
+cli.bitcored();
\ No newline at end of file
diff --git a/docs/address.md b/docs/address.md
deleted file mode 100644
index 420eb23a0..000000000
--- a/docs/address.md
+++ /dev/null
@@ -1,74 +0,0 @@
----
-title: Address
-description: A simple interface to generate and validate a bitcoin address.
----
-# Address
-
-## Description
-
-Represents a bitcoin address. Addresses are the most popular way to make bitcoin transactions. See [the official Bitcoin Wiki](https://en.bitcoin.it/wiki/Address) for technical background information.
-
-## Instantiate an Address
-
-To be able to receive bitcoins an address is needed, but in order to spend them a private key is necessary. Please take a look at the [`PrivateKey`](privatekey.md) docs for more information about exporting and saving a key.
-
-```javascript
-var privateKey = new PrivateKey();
-var address = privateKey.toAddress();
-```
-
-You can also instantiate an Address from a String, [PublicKey](publickey.md), or [HDPublicKey](hierarchical.md), in case you are not the owner of the private key.
-
-```javascript
-// from a string
-var address = Address.fromString('mwkXG8NnB2snbqWTcpNiK6qqGHm1LebHDc');
-
-// a default network address from a public key
-var publicKey = PublicKey(privateKey);
-var address = new Address(publicKey);
-// alternative interface
-var address = Address.fromPublicKey(publicKey);
-
-// a testnet address from a public key
-var publicKey = new PublicKey(privateKey);
-var address = new Address(publicKey, Networks.testnet);
-```
-
-A pay-to-script-hash multisignature Address can be instantiated from an array of [PublicKeys](publickey.md).
-
-```javascript
-// a 2-of-3 address from public keys
-var p2shAddress = new Address([publicKey1, publicKey2, publicKey3], 2);
-```
-
-## Validating an Address
-
-The main use that we expect you'll have for the `Address` class in Bitcore is validating that an address is a valid one, what type of address it is (you may be interested on knowing if the address is a simple "pay to public key hash" address or a "pay to script hash" address) and what network does the address belong to.
-
-The code to do these validations looks like this:
-
-```javascript
-// validate an address
-if (Address.isValid(input){
- ...
-}
-
-// validate that an input field is a valid testnet address
-if (Address.isValid(input, Networks.testnet){
- ...
-}
-
-// validate that an input field is a valid livenet pubkeyhash
-if (Address.isValid(input, Networks.livenet, Address.Pay2PubKeyHash){
- ...
-}
-
-// get the specific validation error that can occurred
-var error = Address.getValidationError(input, Networks.testnet);
- if (error) {
- // handle the error
- }
-}
-```
-
-The errors are listed in the generated file in the [errors folder](https://github.com/bitpay/bitcore/tree/master/lib/errors). There's a structure to errors defined in the [spec.js file](https://github.com/bitpay/bitcore/tree/master/lib/errors/spec.js).
diff --git a/docs/block.md b/docs/block.md
deleted file mode 100644
index 73d3a7d69..000000000
--- a/docs/block.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-title: Block
-description: A simple interface to parse and validate a bitcoin blocks.
----
-# Block
-
-## Description
-
-A Block instance represents the information of a block in the bitcoin network. Given a hexadecimal string representation of the serialization of a block with its transactions, you can instantiate a Block instance. Methods are provided to calculate and check the merkle root hash (if enough data is provided), but transactions won't necessarily be valid spends, and this class won't validate them. A binary representation as a `Buffer` instance is also valid input for a Block's constructor.
-
-```javascript
-// instantiate a new block instance
-var block = new Block(hexaEncodedBlock);
-
-// will verify that the corresponding block transactions match the header
-assert(block.validMerkleRoot());
-
-// blocks have several properties
-assert(block.header); // an instance of block header, more info below
-assert(block.transactions); // an array of transactions, more info below
-
-```
-
-For detailed technical information about a block please visit [Blocks](https://en.bitcoin.it/wiki/Blocks#Block_structure) on the Bitcoin Wiki.
-
-## Block Header
-
-Each instance of Block has a BlockHeader *(which can be instantiated separately)*. The header has validation methods, to verify that the block.
-
-```javascript
-// will verify that the nonce demonstrates enough proof of work
-assert(block.header.validProofOfWork());
-
-// will verify that timestamp is not too far in the future
-assert(block.header.validTimestamp());
-
-// each header has the following properties
-assert(block.header.version);
-assert(block.header.prevHash);
-assert(block.header.merkleRoot);
-assert(block.header.time);
-assert(block.header.bits);
-assert(block.header.nonce);
-
-```
-For more information about the specific properties of a block header please visit the [Block hashing algorithm](https://en.bitcoin.it/wiki/Block_hashing_algorithm) page on the Bitcoin Wiki.
-
-## Transactions
-
-The set of transactions in a block is an array of instances of [Transaction](transaction.md) and can be explored by iterating on the block's `transactions` member.
-
-```javascript
-for (var i in block.transactions) {
- var transaction = block.transactions[i];
-}
-```
-
diff --git a/docs/browser.md b/docs/browser.md
deleted file mode 100644
index 775c01b45..000000000
--- a/docs/browser.md
+++ /dev/null
@@ -1,109 +0,0 @@
----
-title: Browser Builds
-description: Guide to using and writing modules and optimizing browser bundles.
----
-
-# Browser Builds
-
-Bitcore and most official submodules work in the browser, thanks to [browserify](http://browserify.org/) (some modules are not fully compatible with web browsers).
-
-The easiest and recommended way to use them, is via [Bower](http://bower.io/), a browser package manager, and get the release bundles.
-For example, when building an app that uses `bitcore` and `bitcore-ecies`, you do:
-
-```sh
-bower install bitcore
-bower install bitcore-ecies
-```
-
-You can also use a `bower.json` file to store the dependencies of your project:
-
-```json
-{
- "name": "Your app name",
- "version": "0.0.1",
- "license": "MIT",
- "dependencies": {
- "bitcore-ecies": "^0.10.0",
- "bitcore": "^0.10.4"
- }
-}
-```
-and run `bower install` to install the dependencies.
-
-After this, you can include the bundled release versions in your HTML file:
-```html
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-## Building Custom Bundles
-
-If you want to use a specific version of a module, instead of a release version (not recommended), you must run browserify yourself.
-You can get a minified browser bundle by running the following on the project root folder.
-```sh
-browserify --require ./index.js:bitcore | uglifyjs > bitcore.min.js
-```
-(for bitcore)
-
-```sh
-browserify --require ./index.js:bitcore-ecies --external bitcore | uglifyjs > bitcore-ecies.min.js
-```
-(for a bitcore module, `bitcore-ecies` in the example)
-
-
-## Development of Modules
-
-*Note:* You probably don't want to use this method, but `bitcore-build`, as explained above. This is left here as documentation on what happens under the hood with `bitcore-build`.
-
-When developing a module that will depend on Bitcore, it's recommended to exclude Bitcore in the distributed browser bundle when using browserify and to use the `--external bitcore` parameter. It will produce a smaller browser bundle, as it will only include the JavaScript that is nessessary, and will depend on the Bitcore browser build which is better for distribution.
-
-### Building the Bundle Manually
-
-**Step 1**: Require Bitcore
-
-Here we require Bitcore and define the namespace (`index.js`):
-
-```javascript
-var bitcore = require('bitcore');
-var PrivateKey = bitcore.PrivateKey;
-var PublicKey = bitcore.PublicKey;
-var Address = bitcore.Address;
-```
-
-See the [main file](https://github.com/bitpay/bitcore/blob/master/index.js) for bitcore for a complete list, as well as the [Bitcore Documentation](index.md).
-
-**Step 2**: Browserifying
-
-Next we will generate a browser bundle using [browserify](https://www.npmjs.com/package/browserify) by running the command:
-
-```bash
-browserify index.js:module-name --external bitcore -o module-name.js
-```
-
-This will output a file `module-name.js` with only the code loaded from `index.js` (bitcore.js will need to be loaded beforehand, which is around 145KB gzipped)
-
-**Step 3**: Uglifying
-
-This can be further optimized by using [uglifyjs](https://www.npmjs.com/package/uglify-js), and running the command:
-
-```bash
-uglifyjs module-name.js --compress --mangle -o module-name.min.js
-```
diff --git a/docs/crypto.md b/docs/crypto.md
deleted file mode 100644
index 9e872efa4..000000000
--- a/docs/crypto.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: Crypto
-description: Primitives and tools to deal with bitcoin cryptography.
----
-# Crypto
-
-## Description
-
-The cryptographic primitives (ECDSA and HMAC) implementations in this package have been reviewed by the BitPay engineering team. More audits and reviews are welcomed.
-
-## Random
-
-The `bitcore.crypto.Random` namespace contains a single function, named `getRandomBuffer(size)` that returns a `Buffer` instance with random bytes. It may not work depending on the engine that bitcore is running on (doesn't work with IE versions lesser than 11).
-
-## BN
-
-The `bitcore.Crypto.BN` class contains a wrapper around [bn.js](https://github.com/indutny/bn.js), the bignum library used internally in bitcore.
-
-## Point
-
-The `bitcore.Crypto.Point` class contains a wrapper around the class Point of [elliptic.js](https://github.com/indutny/elliptic), the elliptic curve library used internally in bitcore.
-
-## Hash
-
-The `bitcore.Crypto.Hash` namespace contains a set of hashes and utilities. These are either the native `crypto` hash functions from `node.js` or their respective browser shims as provided by the `browserify` library.
-
-## ECDSA
-
-`bitcore.Crypto.ECDSA` contains a pure JavaScript implementation of the elliptic curve DSA signature scheme based on [elliptic.js](https://github.com/indutny/elliptic).
diff --git a/docs/encoding.md b/docs/encoding.md
deleted file mode 100644
index e58ff0129..000000000
--- a/docs/encoding.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Encoding
-description: Utilities for encoding information in bitcoin standard formats.
----
-# Encoding
-
-## Description
-
-The `bitcore.Encoding` namespace contains utilities for encoding information in common formats in the bitcoin ecosystem.
-
-## Base58 & Base58Check
-
-Two classes are provided: `Base58` and `Base58Check`. The first one merely encodes/decodes a set of bytes in base58 format. The second one will also take the double `sha256` hash of the information and append the last 4 bytes of the hash as a checksum when encoding, and check this checksum when decoding.
-
-## BufferReader & BufferWriter
-
-These classes are used internally to write information in buffers.
diff --git a/docs/examples.md b/docs/examples.md
deleted file mode 100644
index 962736f42..000000000
--- a/docs/examples.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# Bitcore examples
-
-## Generate a random address
-```javascript
-var privateKey = new bitcore.PrivateKey();
-
-var address = privateKey.toAddress();
-```
-
-## Generate a address from a SHA256 hash
-```javascript
-var value = new Buffer('correct horse battery staple');
-var hash = bitcore.crypto.Hash.sha256(value);
-var bn = bitcore.crypto.BN.fromBuffer(hash);
-
-var address = new bitcore.PrivateKey(bn).toAddress();
-```
-
-## Import an address via WIF
-```javascript
-var wif = 'Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct';
-
-var address = new bitcore.PrivateKey(wif).toAddress();
-```
-
-## Create a Transaction
-```javascript
-var privateKey = new bitcore.PrivateKey('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
-var utxo = {
- "txId" : "115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986",
- "outputIndex" : 0,
- "address" : "17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV",
- "script" : "76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac",
- "satoshis" : 50000
-};
-
-var transaction = new bitcore.Transaction()
- .from(utxo)
- .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 15000)
- .sign(privateKey);
-```
-
-## Sign a Bitcoin message
-```javascript
-var Message = require('bitcore-message');
-
-var privateKey = new bitcore.PrivateKey('L23PpjkBQqpAF4vbMHNfTZAb3KFPBSawQ7KinFTzz7dxq6TZX8UA');
-var message = new Message('This is an example of a signed message.');
-
-var signature = message.sign(privateKey);
-```
-
-## Verify a Bitcoin message
-```javascript
-var Message = require('bitcore-message');
-
-var address = '13Js7D3q4KvfSqgKN8LpNq57gcahrVc5JZ';
-var signature = 'IBOvIfsAs/da1e36W8kw1cQOPqPVXCW5zJgNQ5kI8m57FycZXdeFmeyoIqJSREzE4W7vfDmdmPk0HokuJPvgPPE=';
-
-var verified = new Message('This is an example of a signed message.').verify(address, signature);
- ```
-
-## Create an OP RETURN transaction
-```javascript
-var privateKey = new bitcore.PrivateKey('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
-var utxo = {
- "txId" : "115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986",
- "outputIndex" : 0,
- "address" : "17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV",
- "script" : "76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac",
- "satoshis" : 50000
-};
-
-var transaction = new bitcore.Transaction()
- .from(utxo)
- .addData('bitcore rocks') // Add OP_RETURN data
- .sign(privateKey);
-```
-
-## Create a 2-of-3 multisig P2SH address
-```javascript
-var publicKeys = [
- '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01',
- '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9',
- '03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9'
-];
-var requiredSignatures = 2;
-
-var address = new bitcore.Address(publicKeys, requiredSignatures);
-```
-
-## Spend from a 2-of-2 multisig P2SH address
-```javascript
-var privateKeys = [
- new bitcore.PrivateKey('91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx'),
- new bitcore.PrivateKey('91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT')
-];
-var publicKeys = privateKeys.map(bitcore.PublicKey);
-var address = new bitcore.Address(publicKeys, 2); // 2 of 2
-
-var utxo = {
- "txId" : "153068cdd81b73ec9d8dcce27f2c77ddda12dee3db424bff5cafdbe9f01c1756",
- "outputIndex" : 0,
- "address" : address.toString(),
- "script" : new bitcore.Script(address).toHex(),
- "satoshis" : 20000
-};
-
-var transaction = new bitcore.Transaction()
- .from(utxo, publicKeys, 2)
- .to('mtoKs9V381UAhUia3d7Vb9GNak8Qvmcsme', 20000)
- .sign(privateKeys);
-```
diff --git a/docs/hierarchical.md b/docs/hierarchical.md
deleted file mode 100644
index 8988a72b2..000000000
--- a/docs/hierarchical.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-title: HDKeys
-description: Lets you create and derive extended public and private keys according to the BIP32 standard for Hierarchical Deterministic (HD) keys.
----
-# HDKeys
-
-## Hierarchically Derived Keys
-
-Bitcore provides full support for [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki), allowing for many key management schemas that benefit from this property. Please be sure to read and understand the basic concepts and the warnings on that BIP before using these classes.
-
-## HDPrivateKey
-
-An instance of a [PrivateKey](privatekey.md) that also contains information required to derive child keys.
-
-Sample usage:
-
-```javascript
-var bitcore = require('bitcore');
-var HDPrivateKey = bitcore.HDPrivateKey;
-
-var hdPrivateKey = new HDPrivateKey();
-var retrieved = new HDPrivateKey('xpriv...');
-var derived = hdPrivateKey.derive("m/0'");
-var derivedByNumber = hdPrivateKey.derive(1).derive(2, true);
-var derivedByArgument = hdPrivateKey.derive("m/1/2'");
-assert(derivedByNumber.xprivkey === derivedByArgument.xprivkey);
-
-var address = derived.privateKey.toAddress();
-
-// obtain HDPublicKey
-var hdPublicKey = hdPrivateKey.hdPublicKey;
-
-```
-
-## HDPublicKey
-
-An instance of a PublicKey that can be derived to build extended public keys. Note that hardened paths are not available when deriving an HDPublicKey.
-
-```javascript
-var hdPrivateKey = new HDPrivateKey();
-var hdPublicKey = hdPrivateKey.hdPublicKey;
-try {
- new HDPublicKey();
-} catch(e) {
- console.log("Can't generate a public key without a private key");
-}
-
-var address = new Address(hdPublicKey.publicKey, Networks.livenet);
-var derivedAddress = new Address(hdPublicKey.derive(100).publicKey, Networks.testnet);
-```
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index e87787c86..000000000
--- a/docs/index.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# Bitcore v0.13
-
-## Principles
-
-Bitcoin is a powerful new peer-to-peer platform for the next generation of financial technology. The decentralized nature of the Bitcoin network allows for highly resilient bitcoin infrastructure, and the developer community needs reliable, open-source tools to implement bitcoin apps and services. Bitcore provides a reliable API for JavaScript apps that need to interface with Bitcoin.
-
-To get started, just `npm install bitcore` or `bower install bitcore`.
-
-# Documentation Index
-
-## Addresses and Key Management
-
-* [Addresses](address.md)
-* [Using Different Networks](networks.md)
-* [Private Keys](privatekey.md) and [Public Keys](publickey.md)
-* [Hierarchically-derived Private and Public Keys](hierarchical.md)
-
-## Payment Handling
-* [Using Different Units](unit.md)
-* [Acknowledging and Requesting Payments: Bitcoin URIs](uri.md)
-* [The Transaction Class](transaction.md)
-
-## Bitcoin Internals
-* [Scripts](script.md)
-* [Block](block.md)
-
-## Extra
-* [Crypto](crypto.md)
-* [Encoding](encoding.md)
-
-## Module Development
-* [Browser Builds](browser.md)
-
-## Modules
-
-Some functionality is implemented as a module that can be installed separately:
-
-* [Payment Protocol Support](https://github.com/bitpay/bitcore-payment-protocol)
-* [Peer to Peer Networking](https://github.com/bitpay/bitcore-p2p)
-* [Bitcoin Core JSON-RPC](https://github.com/bitpay/bitcoind-rpc)
-* [Payment Channels](https://github.com/bitpay/bitcore-channel)
-* [Mnemonics](https://github.com/bitpay/bitcore-mnemonic)
-* [Elliptical Curve Integrated Encryption Scheme](https://github.com/bitpay/bitcore-ecies)
-* [Blockchain Explorers](https://github.com/bitpay/bitcore-explorers)
-* [Signed Messages](https://github.com/bitpay/bitcore-message)
-
-# Examples
-
-## Create and Save a Private Key
-
-```javascript
-var privateKey = new bitcore.PrivateKey();
-
-var exported = privateKey.toWIF();
-// e.g. L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m
-var imported = bitcore.PrivateKey.fromWIF(exported);
-var hexa = privateKey.toString();
-// e.g. 'b9de6e778fe92aa7edb69395556f843f1dce0448350112e14906efc2a80fa61a'
-```
-
-## Create an Address
-
-```javascript
-var address = privateKey.toAddress();
-```
-
-## Create a Multisig Address
-
-```javascript
-// Build a 2-of-3 address from public keys
-var p2shAddress = new bitcore.Address([publicKey1, publicKey2, publicKey3], 2);
-```
-
-## Request a Payment
-
-```javascript
-var paymentInfo = {
- address: '1DNtTk4PUCGAdiNETAzQFWZiy2fCHtGnPx',
- amount: 120000 //satoshis
-};
-var uri = new bitcore.URI(paymentInfo).toString();
-```
-
-## Create a Transaction
-
-```javascript
-var transaction = new Transaction()
- .from(utxos) // Feed information about what unspent outputs one can use
- .to(address, amount) // Add an output with the given amount of satoshis
- .change(address) // Sets up a change address where the rest of the funds will go
- .sign(privkeySet) // Signs all the inputs it can
-```
-
-## Connect to the Network
-
-```javascript
-var peer = new Peer('5.9.85.34');
-
-peer.on('inv', function(message) {
- // new inventory
-});
-
-peer.connect();
-```
diff --git a/docs/networks.md b/docs/networks.md
deleted file mode 100644
index bada23c37..000000000
--- a/docs/networks.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-title: Networks
-description: A simple interface to handle livenet and testnet bitcoin networks.
----
-# Networks
-
-## Description
-
-Bitcore provides support for the main bitcoin network as well as for `testnet3`, the current test blockchain. We encourage the use of `Networks.livenet` and `Networks.testnet` as constants. Note that the library sometimes may check for equality against this object. Please avoid creating a deep copy of this object.
-
-The `Network` namespace has a function, `get(...)` that returns an instance of a `Network` or `undefined`. The only argument to this function is some kind of identifier of the network: either its name, a reference to a Network object, or a number used as a magic constant to identify the network (for example, the value `0` that gives bitcoin addresses the distinctive `'1'` at its beginning on livenet, is a `0x6F` for testnet).
-
-## Setting the Default Network
-
-Most projects will only need to work with one of the networks. The value of `Networks.defaultNetwork` can be set to `Networks.testnet` if the project will need to only to work on testnet (the default is `Networks.livenet`).
-
-## Network constants
-
-The functionality of testnet and livenet is mostly similar (except for some relaxed block validation rules on testnet). They differ in the constants being used for human representation of base58 encoded strings. These are sometimes referred to as "version" constants.
-
-Take a look at this modified snippet from [networks.js](https://github.com/bitpay/bitcore/blob/master/lib/networks.js)
-```javascript
-var livenet = new Network();
-_.extend(livenet, {
- name: 'livenet',
- alias: 'mainnet',
- pubkeyhash: 0x00,
- privatekey: 0x80,
- scripthash: 0x05,
- xpubkey: 0x0488b21e,
- xprivkey: 0x0488ade4,
- port: 8333
-});
-
-var testnet = new Network();
-_.extend(testnet, {
- name: 'testnet',
- alias: 'testnet',
- pubkeyhash: 0x6f,
- privatekey: 0xef,
- scripthash: 0xc4,
- xpubkey: 0x043587cf,
- xprivkey: 0x04358394,
- port: 18333
-});
-```
diff --git a/docs/privatekey.md b/docs/privatekey.md
deleted file mode 100644
index 3b52b0e24..000000000
--- a/docs/privatekey.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-title: Private Key
-description: A simple interface to generate, import and handle private keys.
----
-# Private Key
-
-## Description
-
-Represents a bitcoin private key and is needed to be able to spend bitcoin and sign transactions. See the official [Bitcoin Wiki](https://en.bitcoin.it/wiki/Private_key) for more information about private keys. A PrivateKey in Bitcore is an immutable object that has methods to import and export into a variety of formats including [Wallet Import Format](https://en.bitcoin.it/wiki/Wallet_import_format).
-
-## Instantiate a Private Key
-
-Here is how to create a new private key. It will generate a new random number using `window.crypto` or the Node.js `crypto` library.
-
-```javascript
-var privateKey = new PrivateKey();
-
-// Creates a private key from a hexa encoded number
-var privateKey2 = new PrivateKey('b221d9dbb083a7f33428d7c2a3c3198ae925614d70210e28716ccaa7cd4ddb79');
-```
-
-To export and import a private key, you can do the following:
-
-```javascript
-// encode into wallet export format
-var exported = privateKey.toWIF();
-
-// instantiate from the exported (and saved) private key
-var imported = PrivateKey.fromWIF('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
-```
-
-Note: The WIF (Wallet Import Format) includes information about the network and if the associated public key is compressed or uncompressed (thus the same bitcoin address will be generated by using this format).
-
-To generate an Address or PublicKey from a PrivateKey:
-
-```javascript
-var publicKey = privateKey.toPublicKey();
-var address = publicKey.toAddress(Networks.livenet);
-```
-
-## Validating a Private Key
-
-The code to do these validations looks like this:
-
-```javascript
-// validate an address
-if (PrivateKey.isValid(input)){
- ...
-}
-
-// get the specific validation error that can occurred
-var error = PrivateKey.getValidationError(input, Networks.livenet);
-if (error) {
- // handle the error
-}
-```
diff --git a/docs/publickey.md b/docs/publickey.md
deleted file mode 100644
index 39b332fac..000000000
--- a/docs/publickey.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-title: Public Key
-description: A simple interface for handling private keys.
----
-# Public Key
-
-## Description
-
-Represents a bitcoin public key and is needed to be able to receive bitcoin, as is usually represented as a bitcoin [Address](address.md).
-See the official [Bitcoin Wiki](https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses).
-
-A PublicKey in Bitcore is an immutable object and can be instantiated from a [Point](crypto.md), string, [PrivateKey](privatekey.md), Buffer or a [BN](crypto.md).
-
-## Instantiate a Public Key
-
-Here is how to instantiate a public key:
-
-```javascript
-
-var privateKey = new PrivateKey();
-
-// from a private key
-var publicKey = new PublicKey(privateKey);
-
-// from a der hex encoded string
-var publicKey2 = new PublicKey('02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc');
-
-```
-
-## Validating a Public Key
-
-A public key point should be on the [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) curve, instantiating a new PublicKey will validate this and will throw an error if it's invalid. To check that a public key is valid:
-
-```javascript
-if (PublicKey.isValid('02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc')){
- // valid public key
-}
-```
-
-## Compressed vs Uncompressed
-
-It's important to note that there are two possible ways to represent a public key.
-The standard is *compressed* and includes the X value and parity (as represented above in the documentation).
-There is also a longer version that is *uncompressed* which includes both X and Y values. Using this encoding will generate a different bitcoin address, so be careful when selecting the encoding.
-Uncompressed public keys start with 0x04; compressed public keys begin with 0x03 or 0x02 depending on whether they're greater or less than the midpoint of the curve. These prefix bytes are all used in official secp256k1 documentation.
-
-Example:
-```javascript
-> var bitcore = require('bitcore');
-
-// compressed public key starting with 0x03 (greater than midpoint of curve)
-> var compressedPK = bitcore.PublicKey('030589ee559348bd6a7325994f9c8eff12bd'+
- '5d73cc683142bd0dd1a17abc99b0dc');
-> compressedPK.compressed;
-true
-> compressedPK.toAddress().toString();
-'1KbUJ4x8epz6QqxkmZbTc4f79JbWWz6g37'
-// compressed public key starting with 0x02 (smaller than midpoint of curve)
-> var compressedPK2 = new bitcore.PublicKey('02a1633cafcc01ebfb6d78e39f687a1f'+
- '0995c62fc95f51ead10a02ee0be551b5dc');
-> compressedPK2.compressed;
-true
-> compressedPK.toAddress().toString();
-'1KbUJ4x8epz6QqxkmZbTc4f79JbWWz6g37'
-// uncompressed public key, starting with 0x04. Contains both X and Y encoded
-> var uncompressed = bitcore.PublicKey('0479BE667EF9DCBBAC55A06295CE870B07029'+
- 'BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68'+
- '554199C47D08FFB10D4B8');
-> uncompressed.compressed
-false
-> uncompressed.toAddress().toString()
-'1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm'
-```
diff --git a/docs/script.md b/docs/script.md
deleted file mode 100644
index c7929c1b3..000000000
--- a/docs/script.md
+++ /dev/null
@@ -1,151 +0,0 @@
----
-title: Script
-description: A powerful interface to create, parse and validate bitcoin scripts.
----
-# Script
-
-## Description
-
-All bitcoin transactions have scripts embedded into its inputs and outputs. The scripts use a very simple programming language, which is evaluated from left to right using a stack. The language is designed such that it guarantees all scripts will execute in a limited amount of time (it is not Turing-Complete).
-
-When a transaction is validated, the input scripts are concatenated with the output scripts and evaluated. To be valid, all transaction scripts must evaluate to true. A good analogy for how this works is that the output scripts are puzzles that specify in which conditions can those bitcoins be spent. The input scripts provide the correct data to make those output scripts evaluate to true.
-
-
-For more detailed information about the bitcoin scripting language, check the online reference [on bitcoin's wiki](https://en.bitcoin.it/wiki/Script).
-
-The `Script` object provides an interface to construct, parse, and identify bitcoin scripts. It also gives simple interfaces to create most common script types. This class is useful if you want to create custom input or output scripts. In other case, you should probably use `Transaction`.
-
-## Script creation
-
-Here's how to use `Script` to create the five most common script types:
-
-### Pay to Public Key Hash (p2pkh)
-
-This is the most commonly used transaction output script. It's used to pay to a bitcoin address (a bitcoin address is a public key hash encoded in base58check)
-
-```javascript
-// create a new p2pkh paying to a specific address
-var address = Address.fromString('1NaTVwXDDUJaXDQajoa9MqHhz4uTxtgK14');
-var script = Script.buildPublicKeyHashOut(address);
-assert(script.toString() === 'OP_DUP OP_HASH160 20 0xecae7d092947b7ee4998e254aa48900d26d2ce1d OP_EQUALVERIFY OP_CHECKSIG');
-```
-### Pay to Public Key (p2pk)
-
-Pay to public key scripts are a simplified form of the p2pkh, but aren’t commonly used in new transactions anymore, because p2pkh scripts are more secure (the public key is not revealed until the output is spent).
-
-```javascript
-// create a new p2pk paying to a specific public key
-var pubkey = new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da');
-var script = Script.buildPublicKeyOut(pubkey);
-assert(script.toString() === '33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da OP_CHECKSIG');
-```
-
-### Pay to Multisig (p2ms)
-
-Multisig outputs allow to share control of bitcoins between several keys. When creating the script, one specifies the public keys that control the funds, and how many of those keys are required to sign off spending transactions to be valid. An output with N public keys of which M are required is called an m-of-n output (For example, 2-of-3, 3-of-5, 4-of-4, etc.)
-
-Note that regular multisig outputs are rarely used nowadays. The best practice is to use a p2sh multisig output (See Script#toScriptHashOut()).
-
-```javascript
-// create a new 2-of-3 multisig output from 3 given public keys
-var pubkeys = [
- new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da'),
- new PublicKey('03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9'),
- new PublicKey('021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18'),
-];
-var threshold = 2;
-var script = Script.buildMultisigOut(pubkeys, threshold);
-assert(script.toString() === 'OP_2 33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da'
- + ' 33 0x03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9'
- + ' 33 0x021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18 OP_3 OP_CHECKMULTISIG');
-```
-
-### Pay to Script Hash (p2sh)
-
-Pay to script hash outputs are scripts that contain the hash of another script, called `redeemScript`. To spend bitcoins sent in a p2sh output, the spending transaction must provide a script matching the script hash and data which makes the script evaluate to true. This allows to defer revealing the spending conditions to the moment of spending. It also makes it possible for the receiver to set the conditions to spend those bitcoins.
-
-Most multisig transactions today use p2sh outputs where the `redeemScript` is a multisig output.
-
-```javascript
-// create a p2sh multisig output
-var pubkeys = [
- new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da'),
- new PublicKey('03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9'),
- new PublicKey('021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18'),
-];
-var redeemScript = Script.buildMultisigOut(pubkeys, 2);
-var script = redeemScript.toScriptHashOut();
-assert(script.toString() === 'OP_HASH160 20 0x620a6eeaf538ec9eb89b6ae83f2ed8ef98566a03 OP_EQUAL');
-```
-### Data output
-
-Data outputs are used to push data into the blockchain. Up to 40 bytes can be pushed in a standard way, but more data can be used, if a miner decides to accept the transaction.
-
-```javascript
-var data = 'hello world!!!';
-var script = Script.buildDataOut(data);
-assert(script.toString() === 'OP_RETURN 14 0x68656c6c6f20776f726c64212121'
-```
-
-### Custom Scripts
-
-To create a custom `Script` instance, you must rely on the lower-level methods `add` and `prepend`. Both methods accept the same parameter types, and insert an opcode or data at the beginning (`prepend`) or end (`add`) of the `Script`.
-
-```
-var script = Script()
- .add('OP_IF') // add an opcode by name
- .prepend(114) // add OP_2SWAP by code
- .add(Opcode.OP_NOT) // add an opcode object
- .add(new Buffer('bacacafe', 'hex')) // add a data buffer (will append the size of the push operation first)
-
-assert(script.toString() === 'OP_2SWAP OP_IF OP_NOT 4 0xbacacafe');
-```
-
-## Script Parsing and Identification
-
-`Script` has an easy interface to parse raw scripts from the network or bitcoind, and to extract useful information. An illustrative example (for more options check the API reference)
-
-```javascript
-var raw_script = new Buffer('5221022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da2103e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e921021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc1853ae', 'hex');
-var s = new Script(raw_script);
-console.log(s.toString());
-// 'OP_2 33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da 33 0x03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9 33 0x021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18 OP_3 OP_CHECKMULTISIG'
-
-s.isPublicKeyHashOut() // false
-s.isScriptHashOut() // false
-s.isMultisigOut() // true
-```
-
-## Script Interpreting and Validation
-
-To validate a transaction, the bitcoin network validates all of its inputs and outputs. To validate an input, the input's script is concatenated with the referenced output script, and the result is executed. If at the end of execution the stack contains a 'true' value, then the transaction is valid.
-You can do this in `bitcore` by using the `Interpreter` class. The entry point (and probably the only interface you'll need for most applications) is the method `Interpreter#verify()`.
-
-You can use it like this:
-
-```
-var inputScript = Script('OP_1');
-var outputScript = Script('OP_15 OP_ADD OP_16 OP_EQUAL');
-
-var verified = Interpreter().verify(inputScript, outputScript);
-// verified will be true
-```
-
-Note that `verify` expects two scripts: one is the input script (scriptSig) and the other is the output script (scriptPubkey). This is because different conditions are checked for each.
-
-It also accepts some optional parameters, assuming defaults if not provided:
-```
-// first we create a transaction
-var tx = new Transaction()
- .from(utxo)
- .to(toAddress, 100000)
- .sign(privateKey);
-
-// we then extract the signature from the first input
-var inputIndex = 0;
-var signature = tx.getSignatures(privateKey)[inputIndex].signature;
-
-var scriptSig = Script.buildPublicKeyHashIn(publicKey, signature);
-var flags = Interpreter.SCRIPT_VERIFY_P2SH | Interpreter.SCRIPT_VERIFY_STRICTENC;
-var verified = Interpreter().verify(scriptSig, scriptPubkey, tx, inputIndex, flags);
-```
diff --git a/docs/transaction.md b/docs/transaction.md
deleted file mode 100644
index 4432349c8..000000000
--- a/docs/transaction.md
+++ /dev/null
@@ -1,204 +0,0 @@
----
-title: Transaction
-description: A robust interface to create, parse and validate bitcoin transactions.
----
-# Transaction
-
-## Description
-
-Bitcore provides a very simple API for creating transactions. We expect this API to be accessible for developers without knowing the working internals of bitcoin in deep detail. What follows is a small introduction to transactions with some basic knowledge required to use this API.
-
-A Transaction contains a set of inputs and a set of outputs. Each input contains a reference to another transaction's output, and a signature that allows the value referenced in that output to be used in this transaction.
-
-Note also that an output can be used only once. That's why there's a concept of "change address" in the bitcoin ecosystem: if an output of 10 BTC is available for me to spend, but I only need to transmit 1 BTC, I'll create a transaction with two outputs, one with 1 BTC that I want to spend, and the other with 9 BTC to a change address, so I can spend this 9 BTC with another private key that I own.
-
-So, in order to transmit a valid transaction, you must know what other transactions on the network store outputs that have not been spent and that are available for you to spend (meaning that you have the set of keys that can validate you own those funds). The unspent outputs are usually referred to as "utxo"s.
-
-Let's take a look at some very simple transactions:
-
-```javascript
-var transaction = new Transaction()
- .from(utxos) // Feed information about what unspent outputs one can use
- .to(address, amount) // Add an output with the given amount of satoshis
- .change(address) // Sets up a change address where the rest of the funds will go
- .sign(privkeySet) // Signs all the inputs it can
-```
-
-You can obtain the input and output total amounts of the transaction in satoshis by accessing the fields `inputAmount` and `outputAmount`.
-
-Now, this could just be serialized to hexadecimal ASCII values (`transaction.serialize()`) and sent over to the bitcoind reference client.
-
-```bash
-bitcoin-cli sendrawtransaction
-```
-
-You can also override the fee estimation with another amount, specified in satoshis:
-```javascript
-var transaction = new Transaction().fee(5430); // Minimum non-dust amount
-var transaction = new Transaction().fee(1e8); // Generous fee of 1 BTC
-```
-
-## Multisig Transactions
-
-To send a transaction to a multisig address, the API is the same as in the above example. To spend outputs that require multiple signatures, the process needs extra information: the public keys of the signers that can unlock that output.
-
-```javascript
-var multiSigTx = new Transaction()
- .from(utxo, publicKeys, threshold)
- .change(address)
- .sign(myKeys);
-
-var serialized = multiSigTx.toObject();
-```
-
-This can be serialized and sent to another party, to complete with the needed signatures:
-
-```javascript
-var multiSigTx = new Transaction(serialized)
- .sign(anotherSetOfKeys);
-
-assert(multiSigTx.isFullySigned());
-```
-
-Also, you can just send over the signature for your private key:
-
-```javascript
-var multiSigTx = new Transaction()
- .from(utxo, publicKeys, threshold)
- .change(address);
-
-var signature = multiSigTx.getSignatures(privateKey)[0];
-console.log(JSON.stringify(signature));
-console.log(signature.toObject());
-console.log(signature.signature.toString()); // Outputs a DER signature
-console.log(signature.sigtype);
-```
-
-Transfer that over the wire, and on the other side, apply it to a transaction:
-
-```javascript
-assert(transaction.isValidSignature(receivedSig));
-transaction.applySignature(receivedSig);
-```
-
-## Adding inputs
-
-Transaction inputs are instances of either [Input](https://github.com/bitpay/bitcore/tree/master/lib/transaction/input) or its subclasses. `Input` has some abstract methods, as there is no actual concept of a "signed input" in the bitcoin scripting system (just valid signatures for OP_CHECKSIG and similar opcodes). They are stored in the `input` property of `Transaction` instances.
-
-Bitcore contains two implementations of `Input`, one for spending *Pay to Public Key Hash* outputs (called `PublicKeyHashInput`) and another to spend *Pay to Script Hash* outputs for which the redeem script is a Multisig script (called `MultisigScriptHashInput`).
-
-All inputs have the following five properties:
-
-* `prevTxId`: a `Buffer` with the id of the transaction with the output this input is spending
-* `outputIndex`: a `number` the index of the output in the previous transaction
-* `sequenceNumber`: a `number`, the sequence number, see [bitcoin's developer guide on nLockTime and the sequence number](https://bitcoin.org/en/developer-guide#locktime-and-sequence-number).
-* `script`: the `Script` instance for this input. Usually called `scriptSig` in the bitcoin community.
-* `output`: if available, a `Output` instance of the output associated with this input.
-
-Both `PublicKeyHashInput` and `MultisigScriptHashInput` cache the information about signatures, even though this information could somehow be encoded in the script. Both need to have the `output` property set in order to calculate the `sighash` so signatures can be created.
-
-Some methods related to adding inputs are:
-
-* `from`: A high level interface to add an input from a UTXO. It has a series of variants:
- - `from(utxo)`: add an input from an [Unspent Transaction Output](http://bitcore.io/guide/unspentoutput.html). Currently, only P2PKH outputs are supported.
- - `from(utxos)`: same as above, but passing in an array of Unspent Outputs.
- - `from(utxo, publicKeys, threshold)`: add an input that spends a UTXO with a P2SH output for a Multisig script. The `publicKeys` argument is an array of public keys, and `threshold` is the number of required signatures in the Multisig script.
-* `addInput`: Performs a series of checks on an input and appends it to the end of the `input` vector and updates the amount of incoming bitcoins of the transaction.
-* `uncheckedAddInput`: adds an input to the end of the `input` vector and updates the `inputAmount` without performing any checks.
-
-### PublicKeyHashInput
-
-This input uses the `script` property to mark the input as unsigned if the script is empty.
-
-### MultisigScriptHashInput
-
-This input contains a set of signatures in a `signatures` property, and each time a signature is added, a potentially partial and/or invalid script is created. The `isFullySigned` method will only return true if all needed signatures are already added and valid. If `addSignature` is added after all need signatures are already set, an exception will be thrown.
-
-## Signing a Transaction
-
-The following methods are used to manage signatures for a transaction:
-
-* `getSignatures`: takes an array of `PrivateKey` or strings from which a `PrivateKey` can be instantiated; the transaction to be signed; the kind of [signature hash to use](https://bitcoin.org/en/developer-guide#signature-hash-types). Returns an array of objects with the following properties:
- - `signature`: an instance of [Signature](https://github.com/bitpay/bitcore/blob/master/lib/crypto/signature.js)
- - `prevTxId`: this input's `prevTxId`,
- - `outputIndex`: this input's `outputIndex`,
- - `inputIndex`: this input's index in the transaction
- - `sigtype`: the "sighash", the type of transaction hash used to calculate the signature
- - `publicKey`: a `PublicKey` of the `PrivateKey` used to create the signature
-* `addSignature`: takes an element outputed by `getSignatures` and applies the signature to this input (modifies the script to include the new signature).
-* `clearSignatures`: removes all signatures for this input
-* `isFullySigned`: returns true if the input is fully signed
-
-## Handling Outputs
-
-Outputs can be added by:
-
-* The `addOutput(output)` method, which pushes an `Output` to the end of the `outputs` property and updates the `outputAmount` field. It also clears signatures (as the hash of the transaction may have changed) and updates the change output.
-* The `to(address, amount)` method, that adds an output with the script that corresponds to the given address. Builds an output and calls the `addOutput` method.
-* Specifying a [change address](#Fee_calculation)
-
-To remove all outputs, you can use `clearOutputs()`, which preserves change output configuration.
-
-## Serialization
-
-There are a series of methods used for serialization:
-
-* `toObject`: Returns a plain JavaScript object with no methods and enough information to fully restore the state of this transaction. Using other serialization methods (except for `toJSON`) will cause a some information to be lost.
-* `toJSON`: Will be called when using `JSON.stringify` to return JSON-encoded string using the output from `toObject`.
-* `toString` or `uncheckedSerialize`: Returns an hexadecimal serialization of the transaction, in the [serialization format for bitcoin](https://bitcoin.org/en/developer-reference#raw-transaction-format).
-* `serialize`: Does a series of checks before serializing the transaction
-* `inspect`: Returns a string with some information about the transaction (currently a string formated as ``, that only shows the serialized value of the transaction.
-* `toBuffer`: Serializes the transaction for sending over the wire in the bitcoin network
-* `toBufferWriter`: Uses an already existing BufferWriter to copy over the serialized transaction
-
-## Serialization Checks
-
-When serializing, the bitcore library performs a series of checks. These can be disabled by providing an object to the `serialize` method with the checks that you'll like to skip.
-
-* `disableLargeFees` avoids checking that the fee is no more than `Transaction.FEE_PER_KB * Transaction.FEE_SECURITY_MARGIN * size_in_kb`.
-* `disableSmallFees` avoids checking that the fee is less than `Transaction.FEE_PER_KB * size_in_kb / Transaction.FEE_SECURITY_MARGIN`.
-* `disableIsFullySigned` does not check if all inputs are fully signed
-* `disableDustOutputs` does not check for dust outputs being generated
-* `disableMoreOutputThanInput` avoids checking that the sum of the output amounts is less than or equal to the sum of the amounts for the outputs being spent in the transaction
-
-These are the current default values in the bitcore library involved on these checks:
-
-* `Transaction.FEE_PER_KB`: `10000` (satoshis per kilobyte)
-* `Transaction.FEE_SECURITY_MARGIN`: `15`
-* `Transaction.DUST_AMOUNT`: `546` (satoshis)
-
-## Fee calculation
-
-When outputs' value don't sum up to the same amount that inputs, the difference in bitcoins goes to the miner of the block that includes this transaction. The concept of a "change address" usually is associated with this: an output with an address that can be spent by the creator of the transaction.
-
-For this reason, some methods in the Transaction class are provided:
-
-* `change(address)`: Set up the change address. This will set an internal `_changeScript` property that will store the change script associated with that address.
-* `fee(amount)`: Sets up the exact amount of fee to pay. If no change address is provided, this will raise an exception.
-* `getFee()`: returns the estimated fee amount to be paid, based on the size of the transaction, but disregarding the priority of the outputs.
-
-Internally, a `_changeIndex` property stores the index of the change output (so it can get updated when a new input or output is added).
-
-## Time-Locking transaction
-All bitcoin transactions contain a locktime field.
-The locktime indicates the earliest time a transaction can be added to the blockchain.
-Locktime allows signers to create time-locked transactions which will only become valid in the future, giving the signers a chance to change their minds.
-Locktime can be set in the form of a bitcoin block height (the transaction can only be included in a block with a higher height than specified) or a linux timestamp (transaction can only be confirmed after that time).
-For more information see [bitcoin's development guide section on locktime](https://bitcoin.org/en/developer-guide#locktime-and-sequence-number).
-
-In bitcore, you can set a `Transaction`'s locktime by using the methods `Transaction#lockUntilDate` and `Transaction#lockUntilBlockHeight`. You can also get a friendly version of the locktime field via `Transaction#getLockTime`;
-
-For example:
-```javascript
-var future = new Date(2025,10,30); // Sun Nov 30 2025
-var transaction = new Transaction()
- .lockUntilDate(future);
-console.log(transaction.getLockTime());
-// output similar to: Sun Nov 30 2025 00:00:00 GMT-0300 (ART)
-```
-
-
-
-## Upcoming changes
-
-We're debating an API for Merge Avoidance, CoinJoin, Smart contracts, CoinSwap, and Stealth Addresses. We're expecting to have all of them by some time in 2015. Payment channel creation is avaliable in the [bitcore-channel](https://github.com/bitpay/bitcore-channel) module.
diff --git a/docs/unit.md b/docs/unit.md
deleted file mode 100644
index 7d3db82cc..000000000
--- a/docs/unit.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-title: Bitcoin Units
-description: Utility to easily convert between bitcoin units.
----
-# Unit
-
-## Description
-
-Unit is a utility for handling and converting bitcoin units. We strongly recommend to always use satoshis to represent amount inside your application and only convert them to other units in the front-end.
-
-To understand the need of using the `Unit` class when dealing with unit conversions, see this example:
-```
-> 81.99 * 100000 // wrong
-8198999.999999999
-> var bitcore = require('bitcore');
-> var Unit = bitcore.Unit;
-> Unit.fromMilis(81.99).toSatoshis() // correct
-8199000
-```
-
-## Supported units
-
-The supported units are BTC, mBTC, bits (micro BTCs, uBTC) and satoshis. The codes for each unit can be found as members of the Unit class.
-
-```javascript
-var btcCode = Unit.BTC;
-var mbtcCode = Unit.mBTC;
-var ubtcCode = Unit.uBTC;
-var bitsCode = Unit.bits;
-var satsCode = Unit.satoshis;
-```
-
-## Creating units
-
-There are two ways for creating a unit instance. You can instantiate the class using a value and a unit code; alternatively if the unit it's fixed you could you some of the static methods. Check some examples below:
-
-```javascript
-var unit;
-var amount = 100;
-
-// using a unit code
-var unitPreference = Unit.BTC;
-unit = new Unit(amount, unitPreference);
-
-// using a known unit
-unit = Unit.fromBTC(amount);
-unit = Unit.fromMilis(amount);
-unit = Unit.fromBits(amount);
-unit = Unit.fromSatoshis(amount);
-```
-
-## Conversion
-
-Once you have a unit instance, you can check its representation in all the available units. For your convenience the classes expose three ways to accomplish this. Using the `.to(unitCode)` method, using a fixed unit like `.toSatoshis()` or by using the accessors.
-
-```javascript
-var unit;
-
-// using a unit code
-var unitPreference = Unit.BTC;
-value = Unit.fromSatoshis(amount).to(unitPreference);
-
-// using a known unit
-value = Unit.fromBTC(amount).toBTC();
-value = Unit.fromBTC(amount).toMilis();
-value = Unit.fromBTC(amount).toBits();
-value = Unit.fromBTC(amount).toSatoshis();
-
-// using accessors
-value = Unit.fromBTC(amount).BTC;
-value = Unit.fromBTC(amount).mBTC;
-value = Unit.fromBTC(amount).bits;
-value = Unit.fromBTC(amount).satoshis;
-```
-
-## Using a fiat currency
-
-The unit class also provides a convenient alternative to create an instance from a fiat amount and the corresponding BTC/fiat exchange rate. Any unit instance can be converted to a fiat amount by providing the current exchange rate. Check the example below:
-
-```javascript
-var unit, fiat;
-var amount = 100;
-var exchangeRate = 350;
-
-unit = new Unit(amount, exchangeRate);
-unit = Unit.fromFiat(amount, exchangeRate);
-
-fiat = Unit.fromBits(amount).atRate(exchangeRate);
-fiat = Unit.fromBits(amount).to(exchangeRate);
-```
diff --git a/docs/unspentoutput.md b/docs/unspentoutput.md
deleted file mode 100644
index ec605d159..000000000
--- a/docs/unspentoutput.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: UnspentOutput
-description: A stateless model to represent an unspent output and associated information.
----
-# UnspentOutput
-
-## Description
-
-`bitcore.Transaction.UnspentOutput` is a class with stateless instances that provides information about an unspent output:
-- Transaction ID and output index
-- The "scriptPubKey", the script included in the output
-- Amount of satoshis associated
-- Address, if available
-
-## Parameters
-
-The constructor is quite permissive with the input arguments. It can take outputs straight out of bitcoind's getunspent RPC call. Some of the names are not very informative for new users, so the UnspentOutput constructor also understands these aliases:
-- `scriptPubKey`: just `script` is also accepted
-- `amount`: expected value in BTC. If the `satoshis` alias is used, make sure to use satoshis instead of BTC.
-- `vout`: this is the index of the output in the transaction, renamed to `outputIndex`
-- `txid`: `txId`
-
-## Example
-
-```javascript
-var utxo = new UnspentOutput({
- "txid" : "a0a08e397203df68392ee95b3f08b0b3b3e2401410a38d46ae0874f74846f2e9",
- "vout" : 0,
- "address" : "mgJT8iegL4f9NCgQFeFyfvnSw1Yj4M5Woi",
- "scriptPubKey" : "76a914089acaba6af8b2b4fb4bed3b747ab1e4e60b496588ac",
- "amount" : 0.00070000
-});
-var utxo = new UnspentOutput({
- "txId" : "a0a08e397203df68392ee95b3f08b0b3b3e2401410a38d46ae0874f74846f2e9",
- "outputIndex" : 0,
- "address" : "mgJT8iegL4f9NCgQFeFyfvnSw1Yj4M5Woi",
- "script" : "76a914089acaba6af8b2b4fb4bed3b747ab1e4e60b496588ac",
- "satoshis" : 70000
-});
-```
diff --git a/docs/uri.md b/docs/uri.md
deleted file mode 100644
index 5b9d57bc9..000000000
--- a/docs/uri.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-title: Bitcoin URIs
-description: Utility to parse and create standard bitcoin URIs.
----
-# URI
-
-## Description
-
-Represents a bitcoin payment URI. Bitcoin URI strings became the most popular way to share payment request, sometimes as a bitcoin link and others using a QR code.
-
-URI Examples:
-```
-bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu
-bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu?amount=1.2
-bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu?amount=1.2&message=Payment&label=Satoshi&extra=other-param
-```
-
-## URI Validation
-
-The main use that we expect you'll have for the `URI` class in bitcore is validating and parsing bitcoin URIs. A `URI` instance exposes the address as a bitcore `Address` object and the amount in Satoshis, if present.
-
-The code for validating URIs looks like this:
-```javascript
-var uriString = 'bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu?amount=1.2';
-var valid = URI.isValid(uriString);
-var uri = new URI(uriString);
-console.log(uri.address.network, uri.amount); // 'livenet', 120000000
-```
-
-## URI Parameters
-All standard parameters can be found as members of the `URI` instance. However a bitcoin URI may contain other non-standard parameters, all those can be found under the `extra` namespace.
-
-See [the official BIP21 spec](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki) for more information.
-
-## Create URI
-
-Another important use case for the `URI` class is creating a bitcoin URI for sharing a payment request. That can be accomplished by using a dictionary to create an instance of URI.
-
-The code for creating an URI from an Object looks like this:
-```javascript
-var uriString = new URI({
- address: '12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu',
- amount : 10000, // in satoshis
- message: 'My payment request'
-});
-var uriString = uri.toString();
-```
diff --git a/index.js b/index.js
index dd0b97b2a..c5f05c5e9 100644
--- a/index.js
+++ b/index.js
@@ -1,70 +1,5 @@
'use strict';
-var bitcore = module.exports;
+var bitcore = require('bitcore-lib');
-// module information
-bitcore.version = 'v' + require('./package.json').version;
-bitcore.versionGuard = function(version) {
- if (version !== undefined) {
- var message = 'More than one instance of bitcore found with versions: ' + bitcore.version +
- ' and ' + version + '. Please make sure to require bitcore and check that submodules do' +
- ' not also include their own bitcore dependency.';
- throw new Error(message);
- }
-};
-bitcore.versionGuard(global._bitcore);
-global._bitcore = bitcore.version;
-
-// crypto
-bitcore.crypto = {};
-bitcore.crypto.BN = require('./lib/crypto/bn');
-bitcore.crypto.ECDSA = require('./lib/crypto/ecdsa');
-bitcore.crypto.Hash = require('./lib/crypto/hash');
-bitcore.crypto.Random = require('./lib/crypto/random');
-bitcore.crypto.Point = require('./lib/crypto/point');
-bitcore.crypto.Signature = require('./lib/crypto/signature');
-
-// encoding
-bitcore.encoding = {};
-bitcore.encoding.Base58 = require('./lib/encoding/base58');
-bitcore.encoding.Base58Check = require('./lib/encoding/base58check');
-bitcore.encoding.BufferReader = require('./lib/encoding/bufferreader');
-bitcore.encoding.BufferWriter = require('./lib/encoding/bufferwriter');
-bitcore.encoding.Varint = require('./lib/encoding/varint');
-
-// utilities
-bitcore.util = {};
-bitcore.util.buffer = require('./lib/util/buffer');
-bitcore.util.js = require('./lib/util/js');
-bitcore.util.preconditions = require('./lib/util/preconditions');
-
-// errors thrown by the library
-bitcore.errors = require('./lib/errors');
-
-// main bitcoin library
-bitcore.Address = require('./lib/address');
-bitcore.Block = require('./lib/block');
-bitcore.MerkleBlock = require('./lib/block/merkleblock');
-bitcore.BlockHeader = require('./lib/block/blockheader');
-bitcore.HDPrivateKey = require('./lib/hdprivatekey.js');
-bitcore.HDPublicKey = require('./lib/hdpublickey.js');
-bitcore.Networks = require('./lib/networks');
-bitcore.Opcode = require('./lib/opcode');
-bitcore.PrivateKey = require('./lib/privatekey');
-bitcore.PublicKey = require('./lib/publickey');
-bitcore.Script = require('./lib/script');
-bitcore.Transaction = require('./lib/transaction');
-bitcore.URI = require('./lib/uri');
-bitcore.Unit = require('./lib/unit');
-
-// dependencies, subject to change
-bitcore.deps = {};
-bitcore.deps.bnjs = require('bn.js');
-bitcore.deps.bs58 = require('bs58');
-bitcore.deps.Buffer = Buffer;
-bitcore.deps.elliptic = require('elliptic');
-bitcore.deps._ = require('lodash');
-
-// Internal usage, exposed for testing/advanced tweaking
-bitcore._HDKeyCache = require('./lib/hdkeycache');
-bitcore.Transaction.sighash = require('./lib/transaction/sighash');
+module.exports = bitcore;
diff --git a/lib/address.js b/lib/address.js
deleted file mode 100644
index b017bc7f4..000000000
--- a/lib/address.js
+++ /dev/null
@@ -1,498 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var $ = require('./util/preconditions');
-var errors = require('./errors');
-var Base58Check = require('./encoding/base58check');
-var Networks = require('./networks');
-var Hash = require('./crypto/hash');
-var JSUtil = require('./util/js');
-var PublicKey = require('./publickey');
-
-/**
- * Instantiate an address from an address String or Buffer, a public key or script hash Buffer,
- * or an instance of {@link PublicKey} or {@link Script}.
- *
- * This is an immutable class, and if the first parameter provided to this constructor is an
- * `Address` instance, the same argument will be returned.
- *
- * An address has two key properties: `network` and `type`. The type is either
- * `Address.PayToPublicKeyHash` (value is the `'pubkeyhash'` string)
- * or `Address.PayToScriptHash` (the string `'scripthash'`). The network is an instance of {@link Network}.
- * You can quickly check whether an address is of a given kind by using the methods
- * `isPayToPublicKeyHash` and `isPayToScriptHash`
- *
- * @example
- * ```javascript
- * // validate that an input field is valid
- * var error = Address.getValidationError(input, 'testnet');
- * if (!error) {
- * var address = Address(input, 'testnet');
- * } else {
- * // invalid network or checksum (typo?)
- * var message = error.messsage;
- * }
- *
- * // get an address from a public key
- * var address = Address(publicKey, 'testnet').toString();
- * ```
- *
- * @param {*} data - The encoded data in various formats
- * @param {Network|String|number=} network - The network: 'livenet' or 'testnet'
- * @param {string=} type - The type of address: 'script' or 'pubkey'
- * @returns {Address} A new valid and frozen instance of an Address
- * @constructor
- */
-function Address(data, network, type) {
- /* jshint maxcomplexity: 12 */
- /* jshint maxstatements: 20 */
-
- if (!(this instanceof Address)) {
- return new Address(data, network, type);
- }
-
- if (_.isArray(data) && _.isNumber(network)) {
- return Address.createMultisig(data, network, type);
- }
-
- if (data instanceof Address) {
- // Immutable instance
- return data;
- }
-
- $.checkArgument(data, 'First argument is required, please include address data.', 'guide/address.html');
-
- if (network && !Networks.get(network)) {
- throw new TypeError('Second argument must be "livenet" or "testnet".');
- }
-
- if (type && (type !== Address.PayToPublicKeyHash && type !== Address.PayToScriptHash)) {
- throw new TypeError('Third argument must be "pubkeyhash" or "scripthash".');
- }
-
- var info = this._classifyArguments(data, network, type);
-
- // set defaults if not set
- info.network = info.network || Networks.get(network) || Networks.defaultNetwork;
- info.type = info.type || type || Address.PayToPublicKeyHash;
-
- JSUtil.defineImmutable(this, {
- hashBuffer: info.hashBuffer,
- network: info.network,
- type: info.type
- });
-
- return this;
-}
-
-/**
- * Internal function used to split different kinds of arguments of the constructor
- * @param {*} data - The encoded data in various formats
- * @param {Network|String|number=} network - The network: 'livenet' or 'testnet'
- * @param {string=} type - The type of address: 'script' or 'pubkey'
- * @returns {Object} An "info" object with "type", "network", and "hashBuffer"
- */
-Address.prototype._classifyArguments = function(data, network, type) {
- /* jshint maxcomplexity: 10 */
- // transform and validate input data
- if ((data instanceof Buffer || data instanceof Uint8Array) && data.length === 20) {
- return Address._transformHash(data);
- } else if ((data instanceof Buffer || data instanceof Uint8Array) && data.length === 21) {
- return Address._transformBuffer(data, network, type);
- } else if (data instanceof PublicKey) {
- return Address._transformPublicKey(data);
- } else if (data instanceof Script) {
- return Address._transformScript(data, network);
- } else if (typeof(data) === 'string') {
- return Address._transformString(data, network, type);
- } else if (_.isObject(data)) {
- return Address._transformObject(data);
- } else {
- throw new TypeError('First argument is an unrecognized data format.');
- }
-};
-
-/** @static */
-Address.PayToPublicKeyHash = 'pubkeyhash';
-/** @static */
-Address.PayToScriptHash = 'scripthash';
-
-/**
- * @param {Buffer} hash - An instance of a hash Buffer
- * @returns {Object} An object with keys: hashBuffer
- * @private
- */
-Address._transformHash = function(hash) {
- var info = {};
- if (!(hash instanceof Buffer) && !(hash instanceof Uint8Array)) {
- throw new TypeError('Address supplied is not a buffer.');
- }
- if (hash.length !== 20) {
- throw new TypeError('Address hashbuffers must be exactly 20 bytes.');
- }
- info.hashBuffer = hash;
- return info;
-};
-
-/**
- * Deserializes an address serialized through `Address#toObject()`
- * @param {Object} data
- * @param {string} data.hash - the hash that this address encodes
- * @param {string} data.type - either 'pubkeyhash' or 'scripthash'
- * @param {Network=} data.network - the name of the network associated
- * @return {Address}
- */
-Address._transformObject = function(data) {
- $.checkArgument(data.hash || data.hashBuffer, 'Must provide a `hash` or `hashBuffer` property');
- $.checkArgument(data.type, 'Must provide a `type` property');
- return {
- hashBuffer: data.hash ? new Buffer(data.hash, 'hex') : data.hashBuffer,
- network: Networks.get(data.network) || Networks.defaultNetwork,
- type: data.type
- };
-};
-
-/**
- * Internal function to discover the network and type based on the first data byte
- *
- * @param {Buffer} buffer - An instance of a hex encoded address Buffer
- * @returns {Object} An object with keys: network and type
- * @private
- */
-Address._classifyFromVersion = function(buffer) {
- var version = {};
-
- var pubkeyhashNetwork = Networks.get(buffer[0], 'pubkeyhash');
- var scripthashNetwork = Networks.get(buffer[0], 'scripthash');
-
- if (pubkeyhashNetwork) {
- version.network = pubkeyhashNetwork;
- version.type = Address.PayToPublicKeyHash;
- } else if (scripthashNetwork) {
- version.network = scripthashNetwork;
- version.type = Address.PayToScriptHash;
- }
-
- return version;
-};
-
-/**
- * Internal function to transform a bitcoin address buffer
- *
- * @param {Buffer} buffer - An instance of a hex encoded address Buffer
- * @param {string=} network - The network: 'livenet' or 'testnet'
- * @param {string=} type - The type: 'pubkeyhash' or 'scripthash'
- * @returns {Object} An object with keys: hashBuffer, network and type
- * @private
- */
-Address._transformBuffer = function(buffer, network, type) {
- /* jshint maxcomplexity: 9 */
- var info = {};
- if (!(buffer instanceof Buffer) && !(buffer instanceof Uint8Array)) {
- throw new TypeError('Address supplied is not a buffer.');
- }
- if (buffer.length !== 1 + 20) {
- throw new TypeError('Address buffers must be exactly 21 bytes.');
- }
-
- network = Networks.get(network);
- var bufferVersion = Address._classifyFromVersion(buffer);
-
- if (!bufferVersion.network || (network && network !== bufferVersion.network)) {
- throw new TypeError('Address has mismatched network type.');
- }
-
- if (!bufferVersion.type || (type && type !== bufferVersion.type)) {
- throw new TypeError('Address has mismatched type.');
- }
-
- info.hashBuffer = buffer.slice(1);
- info.network = bufferVersion.network;
- info.type = bufferVersion.type;
- return info;
-};
-
-/**
- * Internal function to transform a {@link PublicKey}
- *
- * @param {PublicKey} pubkey - An instance of PublicKey
- * @returns {Object} An object with keys: hashBuffer, type
- * @private
- */
-Address._transformPublicKey = function(pubkey) {
- var info = {};
- if (!(pubkey instanceof PublicKey)) {
- throw new TypeError('Address must be an instance of PublicKey.');
- }
- info.hashBuffer = Hash.sha256ripemd160(pubkey.toBuffer());
- info.type = Address.PayToPublicKeyHash;
- return info;
-};
-
-/**
- * Internal function to transform a {@link Script} into a `info` object.
- *
- * @param {Script} script - An instance of Script
- * @returns {Object} An object with keys: hashBuffer, type
- * @private
- */
-Address._transformScript = function(script, network) {
- $.checkArgument(script instanceof Script, 'script must be a Script instance');
- var info = script.getAddressInfo(network);
- if (!info) {
- throw new errors.Script.CantDeriveAddress(script);
- }
- return info;
-};
-
-/**
- * Creates a P2SH address from a set of public keys and a threshold.
- *
- * The addresses will be sorted lexicographically, as that is the trend in bitcoin.
- * To create an address from unsorted public keys, use the {@link Script#buildMultisigOut}
- * interface.
- *
- * @param {Array} publicKeys - a set of public keys to create an address
- * @param {number} threshold - the number of signatures needed to release the funds
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @return {Address}
- */
-Address.createMultisig = function(publicKeys, threshold, network) {
- network = network || publicKeys[0].network || Networks.defaultNetwork;
- return Address.payingTo(Script.buildMultisigOut(publicKeys, threshold), network);
-};
-
-/**
- * Internal function to transform a bitcoin address string
- *
- * @param {string} data
- * @param {String|Network=} network - either a Network instance, 'livenet', or 'testnet'
- * @param {string=} type - The type: 'pubkeyhash' or 'scripthash'
- * @returns {Object} An object with keys: hashBuffer, network and type
- * @private
- */
-Address._transformString = function(data, network, type) {
- if (typeof(data) !== 'string') {
- throw new TypeError('data parameter supplied is not a string.');
- }
- data = data.trim();
- var addressBuffer = Base58Check.decode(data);
- var info = Address._transformBuffer(addressBuffer, network, type);
- return info;
-};
-
-/**
- * Instantiate an address from a PublicKey instance
- *
- * @param {PublicKey} data
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @returns {Address} A new valid and frozen instance of an Address
- */
-Address.fromPublicKey = function(data, network) {
- var info = Address._transformPublicKey(data);
- network = network || Networks.defaultNetwork;
- return new Address(info.hashBuffer, network, info.type);
-};
-
-/**
- * Instantiate an address from a ripemd160 public key hash
- *
- * @param {Buffer} hash - An instance of buffer of the hash
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @returns {Address} A new valid and frozen instance of an Address
- */
-Address.fromPublicKeyHash = function(hash, network) {
- var info = Address._transformHash(hash);
- return new Address(info.hashBuffer, network, Address.PayToPublicKeyHash);
-};
-
-/**
- * Instantiate an address from a ripemd160 script hash
- *
- * @param {Buffer} hash - An instance of buffer of the hash
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @returns {Address} A new valid and frozen instance of an Address
- */
-Address.fromScriptHash = function(hash, network) {
- $.checkArgument(hash, 'hash parameter is required');
- var info = Address._transformHash(hash);
- return new Address(info.hashBuffer, network, Address.PayToScriptHash);
-};
-
-/**
- * Builds a p2sh address paying to script. This will hash the script and
- * use that to create the address.
- * If you want to extract an address associated with a script instead,
- * see {{Address#fromScript}}
- *
- * @param {Script} script - An instance of Script
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @returns {Address} A new valid and frozen instance of an Address
- */
-Address.payingTo = function(script, network) {
- $.checkArgument(script, 'script is required');
- $.checkArgument(script instanceof Script, 'script must be instance of Script');
-
- return Address.fromScriptHash(Hash.sha256ripemd160(script.toBuffer()), network);
-};
-
-/**
- * Extract address from a Script. The script must be of one
- * of the following types: p2pkh input, p2pkh output, p2sh input
- * or p2sh output.
- * This will analyze the script and extract address information from it.
- * If you want to transform any script to a p2sh Address paying
- * to that script's hash instead, use {{Address#payingTo}}
- *
- * @param {Script} script - An instance of Script
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @returns {Address} A new valid and frozen instance of an Address
- */
-Address.fromScript = function(script, network) {
- $.checkArgument(script instanceof Script, 'script must be a Script instance');
- var info = Address._transformScript(script, network);
- return new Address(info.hashBuffer, network, info.type);
-};
-
-/**
- * Instantiate an address from a buffer of the address
- *
- * @param {Buffer} buffer - An instance of buffer of the address
- * @param {String|Network=} network - either a Network instance, 'livenet', or 'testnet'
- * @param {string=} type - The type of address: 'script' or 'pubkey'
- * @returns {Address} A new valid and frozen instance of an Address
- */
-Address.fromBuffer = function(buffer, network, type) {
- var info = Address._transformBuffer(buffer, network, type);
- return new Address(info.hashBuffer, info.network, info.type);
-};
-
-/**
- * Instantiate an address from an address string
- *
- * @param {string} str - An string of the bitcoin address
- * @param {String|Network=} network - either a Network instance, 'livenet', or 'testnet'
- * @param {string=} type - The type of address: 'script' or 'pubkey'
- * @returns {Address} A new valid and frozen instance of an Address
- */
-Address.fromString = function(str, network, type) {
- var info = Address._transformString(str, network, type);
- return new Address(info.hashBuffer, info.network, info.type);
-};
-
-/**
- * Instantiate an address from an Object
- *
- * @param {string} json - An JSON string or Object with keys: hash, network and type
- * @returns {Address} A new valid instance of an Address
- */
-Address.fromObject = function fromObject(obj) {
- $.checkState(
- JSUtil.isHexa(obj.hash),
- 'Unexpected hash property, "' + obj.hash + '", expected to be hex.'
- );
- var hashBuffer = new Buffer(obj.hash, 'hex');
- return new Address(hashBuffer, obj.network, obj.type);
-};
-
-/**
- * Will return a validation error if exists
- *
- * @example
- * ```javascript
- * // a network mismatch error
- * var error = Address.getValidationError('15vkcKf7gB23wLAnZLmbVuMiiVDc1Nm4a2', 'testnet');
- * ```
- *
- * @param {string} data - The encoded data
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @param {string} type - The type of address: 'script' or 'pubkey'
- * @returns {null|Error} The corresponding error message
- */
-Address.getValidationError = function(data, network, type) {
- var error;
- try {
- /* jshint nonew: false */
- new Address(data, network, type);
- } catch (e) {
- error = e;
- }
- return error;
-};
-
-/**
- * Will return a boolean if an address is valid
- *
- * @example
- * ```javascript
- * assert(Address.isValid('15vkcKf7gB23wLAnZLmbVuMiiVDc1Nm4a2', 'livenet'));
- * ```
- *
- * @param {string} data - The encoded data
- * @param {String|Network} network - either a Network instance, 'livenet', or 'testnet'
- * @param {string} type - The type of address: 'script' or 'pubkey'
- * @returns {boolean} The corresponding error message
- */
-Address.isValid = function(data, network, type) {
- return !Address.getValidationError(data, network, type);
-};
-
-/**
- * Returns true if an address is of pay to public key hash type
- * @return boolean
- */
-Address.prototype.isPayToPublicKeyHash = function() {
- return this.type === Address.PayToPublicKeyHash;
-};
-
-/**
- * Returns true if an address is of pay to script hash type
- * @return boolean
- */
-Address.prototype.isPayToScriptHash = function() {
- return this.type === Address.PayToScriptHash;
-};
-
-/**
- * Will return a buffer representation of the address
- *
- * @returns {Buffer} Bitcoin address buffer
- */
-Address.prototype.toBuffer = function() {
- var version = new Buffer([this.network[this.type]]);
- var buf = Buffer.concat([version, this.hashBuffer]);
- return buf;
-};
-
-/**
- * @returns {Object} A plain object with the address information
- */
-Address.prototype.toObject = Address.prototype.toJSON = function toObject() {
- return {
- hash: this.hashBuffer.toString('hex'),
- type: this.type,
- network: this.network.toString()
- };
-};
-
-/**
- * Will return a the string representation of the address
- *
- * @returns {string} Bitcoin address
- */
-Address.prototype.toString = function() {
- return Base58Check.encode(this.toBuffer());
-};
-
-/**
- * Will return a string formatted for the console
- *
- * @returns {string} Bitcoin address
- */
-Address.prototype.inspect = function() {
- return '';
-};
-
-module.exports = Address;
-
-var Script = require('./script');
diff --git a/lib/block/block.js b/lib/block/block.js
deleted file mode 100644
index 6d83619f6..000000000
--- a/lib/block/block.js
+++ /dev/null
@@ -1,281 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var BlockHeader = require('./blockheader');
-var BN = require('../crypto/bn');
-var BufferUtil = require('../util/buffer');
-var BufferReader = require('../encoding/bufferreader');
-var BufferWriter = require('../encoding/bufferwriter');
-var Hash = require('../crypto/hash');
-var Transaction = require('../transaction');
-var $ = require('../util/preconditions');
-
-/**
- * Instantiate a Block from a Buffer, JSON object, or Object with
- * the properties of the Block
- *
- * @param {*} - A Buffer, JSON string, or Object
- * @returns {Block}
- * @constructor
- */
-function Block(arg) {
- if (!(this instanceof Block)) {
- return new Block(arg);
- }
- _.extend(this, Block._from(arg));
- return this;
-}
-
-// https://github.com/bitcoin/bitcoin/blob/b5fa132329f0377d787a4a21c1686609c2bfaece/src/primitives/block.h#L14
-Block.MAX_BLOCK_SIZE = 1000000;
-
-/**
- * @param {*} - A Buffer, JSON string or Object
- * @returns {Object} - An object representing block data
- * @throws {TypeError} - If the argument was not recognized
- * @private
- */
-Block._from = function _from(arg) {
- var info = {};
- if (BufferUtil.isBuffer(arg)) {
- info = Block._fromBufferReader(BufferReader(arg));
- } else if (_.isObject(arg)) {
- info = Block._fromObject(arg);
- } else {
- throw new TypeError('Unrecognized argument for Block');
- }
- return info;
-};
-
-/**
- * @param {Object} - A plain JavaScript object
- * @returns {Object} - An object representing block data
- * @private
- */
-Block._fromObject = function _fromObject(data) {
- var transactions = [];
- data.transactions.forEach(function(tx) {
- if (tx instanceof Transaction) {
- transactions.push(tx);
- } else {
- transactions.push(Transaction().fromObject(tx));
- }
- });
- var info = {
- header: BlockHeader.fromObject(data.header),
- transactions: transactions
- };
- return info;
-};
-
-/**
- * @param {Object} - A plain JavaScript object
- * @returns {Block} - An instance of block
- */
-Block.fromObject = function fromObject(obj) {
- var info = Block._fromObject(obj);
- return new Block(info);
-};
-
-/**
- * @param {BufferReader} - Block data
- * @returns {Object} - An object representing the block data
- * @private
- */
-Block._fromBufferReader = function _fromBufferReader(br) {
- var info = {};
- $.checkState(!br.finished(), 'No block data received');
- info.header = BlockHeader.fromBufferReader(br);
- var transactions = br.readVarintNum();
- info.transactions = [];
- for (var i = 0; i < transactions; i++) {
- info.transactions.push(Transaction().fromBufferReader(br));
- }
- return info;
-};
-
-/**
- * @param {BufferReader} - A buffer reader of the block
- * @returns {Block} - An instance of block
- */
-Block.fromBufferReader = function fromBufferReader(br) {
- $.checkArgument(br, 'br is required');
- var info = Block._fromBufferReader(br);
- return new Block(info);
-};
-
-/**
- * @param {Buffer} - A buffer of the block
- * @returns {Block} - An instance of block
- */
-Block.fromBuffer = function fromBuffer(buf) {
- return Block.fromBufferReader(new BufferReader(buf));
-};
-
-/**
- * @param {string} - str - A hex encoded string of the block
- * @returns {Block} - A hex encoded string of the block
- */
-Block.fromString = function fromString(str) {
- var buf = new Buffer(str, 'hex');
- return Block.fromBuffer(buf);
-};
-
-/**
- * @param {Binary} - Raw block binary data or buffer
- * @returns {Block} - An instance of block
- */
-Block.fromRawBlock = function fromRawBlock(data) {
- if (!BufferUtil.isBuffer(data)) {
- data = new Buffer(data, 'binary');
- }
- var br = BufferReader(data);
- br.pos = Block.Values.START_OF_BLOCK;
- var info = Block._fromBufferReader(br);
- return new Block(info);
-};
-
-/**
- * @returns {Object} - A plain object with the block properties
- */
-Block.prototype.toObject = Block.prototype.toJSON = function toObject() {
- var transactions = [];
- this.transactions.forEach(function(tx) {
- transactions.push(tx.toObject());
- });
- return {
- header: this.header.toObject(),
- transactions: transactions
- };
-};
-
-/**
- * @returns {Buffer} - A buffer of the block
- */
-Block.prototype.toBuffer = function toBuffer() {
- return this.toBufferWriter().concat();
-};
-
-/**
- * @returns {string} - A hex encoded string of the block
- */
-Block.prototype.toString = function toString() {
- return this.toBuffer().toString('hex');
-};
-
-/**
- * @param {BufferWriter} - An existing instance of BufferWriter
- * @returns {BufferWriter} - An instance of BufferWriter representation of the Block
- */
-Block.prototype.toBufferWriter = function toBufferWriter(bw) {
- if (!bw) {
- bw = new BufferWriter();
- }
- bw.write(this.header.toBuffer());
- bw.writeVarintNum(this.transactions.length);
- for (var i = 0; i < this.transactions.length; i++) {
- this.transactions[i].toBufferWriter(bw);
- }
- return bw;
-};
-
-/**
- * Will iterate through each transaction and return an array of hashes
- * @returns {Array} - An array with transaction hashes
- */
-Block.prototype.getTransactionHashes = function getTransactionHashes() {
- var hashes = [];
- if (this.transactions.length === 0) {
- return [Block.Values.NULL_HASH];
- }
- for (var t = 0; t < this.transactions.length; t++) {
- hashes.push(this.transactions[t]._getHash());
- }
- return hashes;
-};
-
-/**
- * Will build a merkle tree of all the transactions, ultimately arriving at
- * a single point, the merkle root.
- * @link https://en.bitcoin.it/wiki/Protocol_specification#Merkle_Trees
- * @returns {Array} - An array with each level of the tree after the other.
- */
-Block.prototype.getMerkleTree = function getMerkleTree() {
-
- var tree = this.getTransactionHashes();
-
- var j = 0;
- for (var size = this.transactions.length; size > 1; size = Math.floor((size + 1) / 2)) {
- for (var i = 0; i < size; i += 2) {
- var i2 = Math.min(i + 1, size - 1);
- var buf = Buffer.concat([tree[j + i], tree[j + i2]]);
- tree.push(Hash.sha256sha256(buf));
- }
- j += size;
- }
-
- return tree;
-};
-
-/**
- * Calculates the merkleRoot from the transactions.
- * @returns {Buffer} - A buffer of the merkle root hash
- */
-Block.prototype.getMerkleRoot = function getMerkleRoot() {
- var tree = this.getMerkleTree();
- return tree[tree.length - 1];
-};
-
-/**
- * Verifies that the transactions in the block match the header merkle root
- * @returns {Boolean} - If the merkle roots match
- */
-Block.prototype.validMerkleRoot = function validMerkleRoot() {
-
- var h = new BN(this.header.merkleRoot.toString('hex'), 'hex');
- var c = new BN(this.getMerkleRoot().toString('hex'), 'hex');
-
- if (h.cmp(c) !== 0) {
- return false;
- }
-
- return true;
-};
-
-/**
- * @returns {Buffer} - The little endian hash buffer of the header
- */
-Block.prototype._getHash = function() {
- return this.header._getHash();
-};
-
-var idProperty = {
- configurable: false,
- enumerable: true,
- /**
- * @returns {string} - The big endian hash buffer of the header
- */
- get: function() {
- if (!this._id) {
- this._id = this.header.id;
- }
- return this._id;
- },
- set: _.noop
-};
-Object.defineProperty(Block.prototype, 'id', idProperty);
-Object.defineProperty(Block.prototype, 'hash', idProperty);
-
-/**
- * @returns {string} - A string formatted for the console
- */
-Block.prototype.inspect = function inspect() {
- return '';
-};
-
-Block.Values = {
- START_OF_BLOCK: 8, // Start of block in raw block data
- NULL_HASH: new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
-};
-
-module.exports = Block;
diff --git a/lib/block/blockheader.js b/lib/block/blockheader.js
deleted file mode 100644
index 2683ad1e3..000000000
--- a/lib/block/blockheader.js
+++ /dev/null
@@ -1,296 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var BN = require('../crypto/bn');
-var BufferUtil = require('../util/buffer');
-var BufferReader = require('../encoding/bufferreader');
-var BufferWriter = require('../encoding/bufferwriter');
-var Hash = require('../crypto/hash');
-var JSUtil = require('../util/js');
-var $ = require('../util/preconditions');
-
-var GENESIS_BITS = 0x1d00ffff;
-
-/**
- * Instantiate a BlockHeader from a Buffer, JSON object, or Object with
- * the properties of the BlockHeader
- *
- * @param {*} - A Buffer, JSON string, or Object
- * @returns {BlockHeader} - An instance of block header
- * @constructor
- */
-var BlockHeader = function BlockHeader(arg) {
- if (!(this instanceof BlockHeader)) {
- return new BlockHeader(arg);
- }
- var info = BlockHeader._from(arg);
- this.version = info.version;
- this.prevHash = info.prevHash;
- this.merkleRoot = info.merkleRoot;
- this.time = info.time;
- this.timestamp = info.time;
- this.bits = info.bits;
- this.nonce = info.nonce;
-
- if (info.hash) {
- $.checkState(
- this.hash === info.hash,
- 'Argument object hash property does not match block hash.'
- );
- }
-
- return this;
-};
-
-/**
- * @param {*} - A Buffer, JSON string or Object
- * @returns {Object} - An object representing block header data
- * @throws {TypeError} - If the argument was not recognized
- * @private
- */
-BlockHeader._from = function _from(arg) {
- var info = {};
- if (BufferUtil.isBuffer(arg)) {
- info = BlockHeader._fromBufferReader(BufferReader(arg));
- } else if (_.isObject(arg)) {
- info = BlockHeader._fromObject(arg);
- } else {
- throw new TypeError('Unrecognized argument for BlockHeader');
- }
- return info;
-};
-
-/**
- * @param {Object} - A JSON string
- * @returns {Object} - An object representing block header data
- * @private
- */
-BlockHeader._fromObject = function _fromObject(data) {
- $.checkArgument(data, 'data is required');
- var prevHash = data.prevHash;
- var merkleRoot = data.merkleRoot;
- if (_.isString(data.prevHash)) {
- prevHash = BufferUtil.reverse(new Buffer(data.prevHash, 'hex'));
- }
- if (_.isString(data.merkleRoot)) {
- merkleRoot = BufferUtil.reverse(new Buffer(data.merkleRoot, 'hex'));
- }
- var info = {
- hash: data.hash,
- version: data.version,
- prevHash: prevHash,
- merkleRoot: merkleRoot,
- time: data.time,
- timestamp: data.time,
- bits: data.bits,
- nonce: data.nonce
- };
- return info;
-};
-
-/**
- * @param {Object} - A plain JavaScript object
- * @returns {BlockHeader} - An instance of block header
- */
-BlockHeader.fromObject = function fromObject(obj) {
- var info = BlockHeader._fromObject(obj);
- return new BlockHeader(info);
-};
-
-/**
- * @param {Binary} - Raw block binary data or buffer
- * @returns {BlockHeader} - An instance of block header
- */
-BlockHeader.fromRawBlock = function fromRawBlock(data) {
- if (!BufferUtil.isBuffer(data)) {
- data = new Buffer(data, 'binary');
- }
- var br = BufferReader(data);
- br.pos = BlockHeader.Constants.START_OF_HEADER;
- var info = BlockHeader._fromBufferReader(br);
- return new BlockHeader(info);
-};
-
-/**
- * @param {Buffer} - A buffer of the block header
- * @returns {BlockHeader} - An instance of block header
- */
-BlockHeader.fromBuffer = function fromBuffer(buf) {
- var info = BlockHeader._fromBufferReader(BufferReader(buf));
- return new BlockHeader(info);
-};
-
-/**
- * @param {string} - A hex encoded buffer of the block header
- * @returns {BlockHeader} - An instance of block header
- */
-BlockHeader.fromString = function fromString(str) {
- var buf = new Buffer(str, 'hex');
- return BlockHeader.fromBuffer(buf);
-};
-
-/**
- * @param {BufferReader} - A BufferReader of the block header
- * @returns {Object} - An object representing block header data
- * @private
- */
-BlockHeader._fromBufferReader = function _fromBufferReader(br) {
- var info = {};
- info.version = br.readUInt32LE();
- info.prevHash = br.read(32);
- info.merkleRoot = br.read(32);
- info.time = br.readUInt32LE();
- info.bits = br.readUInt32LE();
- info.nonce = br.readUInt32LE();
- return info;
-};
-
-/**
- * @param {BufferReader} - A BufferReader of the block header
- * @returns {BlockHeader} - An instance of block header
- */
-BlockHeader.fromBufferReader = function fromBufferReader(br) {
- var info = BlockHeader._fromBufferReader(br);
- return new BlockHeader(info);
-};
-
-/**
- * @returns {Object} - A plain object of the BlockHeader
- */
-BlockHeader.prototype.toObject = BlockHeader.prototype.toJSON = function toObject() {
- return {
- hash: this.hash,
- version: this.version,
- prevHash: BufferUtil.reverse(this.prevHash).toString('hex'),
- merkleRoot: BufferUtil.reverse(this.merkleRoot).toString('hex'),
- time: this.time,
- bits: this.bits,
- nonce: this.nonce
- };
-};
-
-/**
- * @returns {Buffer} - A Buffer of the BlockHeader
- */
-BlockHeader.prototype.toBuffer = function toBuffer() {
- return this.toBufferWriter().concat();
-};
-
-/**
- * @returns {string} - A hex encoded string of the BlockHeader
- */
-BlockHeader.prototype.toString = function toString() {
- return this.toBuffer().toString('hex');
-};
-
-/**
- * @param {BufferWriter} - An existing instance BufferWriter
- * @returns {BufferWriter} - An instance of BufferWriter representation of the BlockHeader
- */
-BlockHeader.prototype.toBufferWriter = function toBufferWriter(bw) {
- if (!bw) {
- bw = new BufferWriter();
- }
- bw.writeUInt32LE(this.version);
- bw.write(this.prevHash);
- bw.write(this.merkleRoot);
- bw.writeUInt32LE(this.time);
- bw.writeUInt32LE(this.bits);
- bw.writeUInt32LE(this.nonce);
- return bw;
-};
-
-/**
- * Returns the target difficulty for this block
- * @param {Number} bits
- * @returns {BN} An instance of BN with the decoded difficulty bits
- */
-BlockHeader.prototype.getTargetDifficulty = function getTargetDifficulty(bits) {
- bits = bits || this.bits;
-
- var target = new BN(bits & 0xffffff);
- var mov = 8 * ((bits >>> 24) - 3);
- while (mov-- > 0) {
- target = target.mul(new BN(2));
- }
- return target;
-};
-
-/**
- * @link https://en.bitcoin.it/wiki/Difficulty
- * @return {Number}
- */
-BlockHeader.prototype.getDifficulty = function getDifficulty() {
- var difficulty1TargetBN = this.getTargetDifficulty(GENESIS_BITS).mul(new BN(Math.pow(10, 8)));
- var currentTargetBN = this.getTargetDifficulty();
-
- var difficultyString = difficulty1TargetBN.div(currentTargetBN).toString(10);
- var decimalPos = difficultyString.length - 8;
- difficultyString = difficultyString.slice(0, decimalPos) + '.' + difficultyString.slice(decimalPos);
-
- return parseFloat(difficultyString);
-};
-
-/**
- * @returns {Buffer} - The little endian hash buffer of the header
- */
-BlockHeader.prototype._getHash = function hash() {
- var buf = this.toBuffer();
- return Hash.sha256sha256(buf);
-};
-
-var idProperty = {
- configurable: false,
- enumerable: true,
- /**
- * @returns {string} - The big endian hash buffer of the header
- */
- get: function() {
- if (!this._id) {
- this._id = BufferReader(this._getHash()).readReverse().toString('hex');
- }
- return this._id;
- },
- set: _.noop
-};
-Object.defineProperty(BlockHeader.prototype, 'id', idProperty);
-Object.defineProperty(BlockHeader.prototype, 'hash', idProperty);
-
-/**
- * @returns {Boolean} - If timestamp is not too far in the future
- */
-BlockHeader.prototype.validTimestamp = function validTimestamp() {
- var currentTime = Math.round(new Date().getTime() / 1000);
- if (this.time > currentTime + BlockHeader.Constants.MAX_TIME_OFFSET) {
- return false;
- }
- return true;
-};
-
-/**
- * @returns {Boolean} - If the proof-of-work hash satisfies the target difficulty
- */
-BlockHeader.prototype.validProofOfWork = function validProofOfWork() {
- var pow = new BN(this.id, 'hex');
- var target = this.getTargetDifficulty();
-
- if (pow.cmp(target) > 0) {
- return false;
- }
- return true;
-};
-
-/**
- * @returns {string} - A string formated for the console
- */
-BlockHeader.prototype.inspect = function inspect() {
- return '';
-};
-
-BlockHeader.Constants = {
- START_OF_HEADER: 8, // Start buffer position in raw block data
- MAX_TIME_OFFSET: 2 * 60 * 60, // The max a timestamp can be in the future
- LARGEST_HASH: new BN('10000000000000000000000000000000000000000000000000000000000000000', 'hex')
-};
-
-module.exports = BlockHeader;
diff --git a/lib/block/index.js b/lib/block/index.js
deleted file mode 100644
index d519131a1..000000000
--- a/lib/block/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = require('./block');
-
-module.exports.BlockHeader = require('./blockheader');
-module.exports.MerkleBlock = require('./merkleblock');
diff --git a/lib/block/merkleblock.js b/lib/block/merkleblock.js
deleted file mode 100644
index 3ff541ee1..000000000
--- a/lib/block/merkleblock.js
+++ /dev/null
@@ -1,272 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var BlockHeader = require('./blockheader');
-var BufferUtil = require('../util/buffer');
-var BufferReader = require('../encoding/bufferreader');
-var BufferWriter = require('../encoding/bufferwriter');
-var Hash = require('../crypto/hash');
-var JSUtil = require('../util/js');
-var Transaction = require('../transaction');
-var $ = require('../util/preconditions');
-
-/**
- * Instantiate a MerkleBlock from a Buffer, JSON object, or Object with
- * the properties of the Block
- *
- * @param {*} - A Buffer, JSON string, or Object representing a MerkleBlock
- * @returns {MerkleBlock}
- * @constructor
- */
-function MerkleBlock(arg) {
- /* jshint maxstatements: 18 */
-
- if (!(this instanceof MerkleBlock)) {
- return new MerkleBlock(arg);
- }
-
- var info = {};
- if (BufferUtil.isBuffer(arg)) {
- info = MerkleBlock._fromBufferReader(BufferReader(arg));
- } else if (_.isObject(arg)) {
- var header;
- if(arg.header instanceof BlockHeader) {
- header = arg.header;
- } else {
- header = BlockHeader.fromObject(arg.header);
- }
- info = {
- /**
- * @name MerkleBlock#header
- * @type {BlockHeader}
- */
- header: header,
- /**
- * @name MerkleBlock#numTransactions
- * @type {Number}
- */
- numTransactions: arg.numTransactions,
- /**
- * @name MerkleBlock#hashes
- * @type {String[]}
- */
- hashes: arg.hashes,
- /**
- * @name MerkleBlock#flags
- * @type {Number[]}
- */
- flags: arg.flags
- };
- } else {
- throw new TypeError('Unrecognized argument for MerkleBlock');
- }
- _.extend(this,info);
- this._flagBitsUsed = 0;
- this._hashesUsed = 0;
- return this;
-}
-
-/**
- * @param {Buffer} - MerkleBlock data in a Buffer object
- * @returns {MerkleBlock} - A MerkleBlock object
- */
-MerkleBlock.fromBuffer = function fromBuffer(buf) {
- return MerkleBlock.fromBufferReader(BufferReader(buf));
-};
-
-/**
- * @param {BufferReader} - MerkleBlock data in a BufferReader object
- * @returns {MerkleBlock} - A MerkleBlock object
- */
-MerkleBlock.fromBufferReader = function fromBufferReader(br) {
- return new MerkleBlock(MerkleBlock._fromBufferReader(br));
-};
-
-/**
- * @returns {Buffer} - A buffer of the block
- */
-MerkleBlock.prototype.toBuffer = function toBuffer() {
- return this.toBufferWriter().concat();
-};
-
-/**
- * @param {BufferWriter} - An existing instance of BufferWriter
- * @returns {BufferWriter} - An instance of BufferWriter representation of the MerkleBlock
- */
-MerkleBlock.prototype.toBufferWriter = function toBufferWriter(bw) {
- if (!bw) {
- bw = new BufferWriter();
- }
- bw.write(this.header.toBuffer());
- bw.writeUInt32LE(this.numTransactions);
- bw.writeVarintNum(this.hashes.length);
- for (var i = 0; i < this.hashes.length; i++) {
- bw.write(new Buffer(this.hashes[i], 'hex'));
- }
- bw.writeVarintNum(this.flags.length);
- for (i = 0; i < this.flags.length; i++) {
- bw.writeUInt8(this.flags[i]);
- }
- return bw;
-};
-
-/**
- * @returns {Object} - A plain object with the MerkleBlock properties
- */
-MerkleBlock.prototype.toObject = MerkleBlock.prototype.toJSON = function toObject() {
- return {
- header: this.header.toObject(),
- numTransactions: this.numTransactions,
- hashes: this.hashes,
- flags: this.flags
- };
-};
-
-/**
- * Verify that the MerkleBlock is valid
- * @returns {Boolean} - True/False whether this MerkleBlock is Valid
- */
-MerkleBlock.prototype.validMerkleTree = function validMerkleTree() {
- $.checkState(_.isArray(this.flags), 'MerkleBlock flags is not an array');
- $.checkState(_.isArray(this.hashes), 'MerkleBlock hashes is not an array');
-
- // Can't have more hashes than numTransactions
- if(this.hashes.length > this.numTransactions) {
- return false;
- }
-
- // Can't have more flag bits than num hashes
- if(this.flags.length * 8 < this.hashes.length) {
- return false;
- }
-
- var height = this._calcTreeHeight();
- var opts = { hashesUsed: 0, flagBitsUsed: 0 };
- var root = this._traverseMerkleTree(height, 0, opts);
- if(opts.hashesUsed !== this.hashes.length) {
- return false;
- }
- return BufferUtil.equals(root, this.header.merkleRoot);
-};
-
-/**
- * Traverse a the tree in this MerkleBlock, validating it along the way
- * Modeled after Bitcoin Core merkleblock.cpp TraverseAndExtract()
- * @param {Number} - depth - Current height
- * @param {Number} - pos - Current position in the tree
- * @param {Object} - opts - Object with values that need to be mutated throughout the traversal
- * @param {Number} - opts.flagBitsUsed - Number of flag bits used, should start at 0
- * @param {Number} - opts.hashesUsed - Number of hashes used, should start at 0
- * @param {Array} - opts.txs - Will finish populated by transactions found during traversal
- * @returns {Buffer|null} - Buffer containing the Merkle Hash for that height
- * @private
- */
-MerkleBlock.prototype._traverseMerkleTree = function traverseMerkleTree(depth, pos, opts) {
- /* jshint maxcomplexity: 12*/
- /* jshint maxstatements: 20 */
-
- opts = opts || {};
- opts.txs = opts.txs || [];
- opts.flagBitsUsed = opts.flagBitsUsed || 0;
- opts.hashesUsed = opts.hashesUsed || 0;
-
- if(opts.flagBitsUsed > this.flags.length * 8) {
- return null;
- }
- var isParentOfMatch = (this.flags[opts.flagBitsUsed >> 3] >>> (opts.flagBitsUsed++ & 7)) & 1;
- if(depth === 0 || !isParentOfMatch) {
- if(opts.hashesUsed >= this.hashes.length) {
- return null;
- }
- var hash = this.hashes[opts.hashesUsed++];
- if(depth === 0 && isParentOfMatch) {
- opts.txs.push(hash);
- }
- return new Buffer(hash, 'hex');
- } else {
- var left = this._traverseMerkleTree(depth-1, pos*2, opts);
- var right = left;
- if(pos*2+1 < this._calcTreeWidth(depth-1)) {
- right = this._traverseMerkleTree(depth-1, pos*2+1, opts);
- }
- return Hash.sha256sha256(new Buffer.concat([left, right]));
- }
-};
-
-/** Calculates the width of a merkle tree at a given height.
- * Modeled after Bitcoin Core merkleblock.h CalcTreeWidth()
- * @param {Number} - Height at which we want the tree width
- * @returns {Number} - Width of the tree at a given height
- * @private
- */
-MerkleBlock.prototype._calcTreeWidth = function calcTreeWidth(height) {
- return (this.numTransactions + (1 << height) - 1) >> height;
-};
-
-/** Calculates the height of the merkle tree in this MerkleBlock
- * @param {Number} - Height at which we want the tree width
- * @returns {Number} - Height of the merkle tree in this MerkleBlock
- * @private
- */
-MerkleBlock.prototype._calcTreeHeight = function calcTreeHeight() {
- var height = 0;
- while (this._calcTreeWidth(height) > 1) {
- height++;
- }
- return height;
-};
-
-/**
- * @param {Transaction|String} - Transaction or Transaction ID Hash
- * @returns {Boolean} - return true/false if this MerkleBlock has the TX or not
- * @private
- */
-MerkleBlock.prototype.hasTransaction = function hasTransaction(tx) {
- $.checkArgument(!_.isUndefined(tx), 'tx cannot be undefined');
- $.checkArgument(tx instanceof Transaction || typeof tx === 'string',
- 'Invalid tx given, tx must be a "string" or "Transaction"');
-
- var hash = tx;
- if(tx instanceof Transaction) {
- // We need to reverse the id hash for the lookup
- hash = BufferUtil.reverse(new Buffer(tx.id, 'hex')).toString('hex');
- }
-
- var txs = [];
- var height = this._calcTreeHeight();
- this._traverseMerkleTree(height, 0, { txs: txs });
- return txs.indexOf(hash) !== -1;
-};
-
-/**
- * @param {Buffer} - MerkleBlock data
- * @returns {Object} - An Object representing merkleblock data
- * @private
- */
-MerkleBlock._fromBufferReader = function _fromBufferReader(br) {
- $.checkState(!br.finished(), 'No merkleblock data received');
- var info = {};
- info.header = BlockHeader.fromBufferReader(br);
- info.numTransactions = br.readUInt32LE();
- var numHashes = br.readVarintNum();
- info.hashes = [];
- for (var i = 0; i < numHashes; i++) {
- info.hashes.push(br.read(32).toString('hex'));
- }
- var numFlags = br.readVarintNum();
- info.flags = [];
- for (i = 0; i < numFlags; i++) {
- info.flags.push(br.readUInt8());
- }
- return info;
-};
-
-/**
- * @param {Object} - A plain JavaScript object
- * @returns {Block} - An instance of block
- */
-MerkleBlock.fromObject = function fromObject(obj) {
- return new MerkleBlock(obj);
-};
-
-module.exports = MerkleBlock;
diff --git a/lib/crypto/bn.js b/lib/crypto/bn.js
deleted file mode 100644
index e88c6da43..000000000
--- a/lib/crypto/bn.js
+++ /dev/null
@@ -1,202 +0,0 @@
-'use strict';
-
-var BN = require('bn.js');
-var $ = require('../util/preconditions');
-var _ = require('lodash');
-
-var reversebuf = function(buf) {
- var buf2 = new Buffer(buf.length);
- for (var i = 0; i < buf.length; i++) {
- buf2[i] = buf[buf.length - 1 - i];
- }
- return buf2;
-};
-
-BN.Zero = new BN(0);
-BN.One = new BN(1);
-BN.Minus1 = new BN(-1);
-
-BN.fromNumber = function(n) {
- $.checkArgument(_.isNumber(n));
- return new BN(n);
-};
-
-BN.fromString = function(str, base) {
- $.checkArgument(_.isString(str));
- return new BN(str, base);
-};
-
-BN.fromBuffer = function(buf, opts) {
- if (typeof opts !== 'undefined' && opts.endian === 'little') {
- buf = reversebuf(buf);
- }
- var hex = buf.toString('hex');
- var bn = new BN(hex, 16);
- return bn;
-};
-
-/**
- * Instantiate a BigNumber from a "signed magnitude buffer"
- * (a buffer where the most significant bit represents the sign (0 = positive, -1 = negative))
- */
-BN.fromSM = function(buf, opts) {
- var ret;
- if (buf.length === 0) {
- return BN.fromBuffer(new Buffer([0]));
- }
-
- var endian = 'big';
- if (opts) {
- endian = opts.endian;
- }
- if (endian === 'little') {
- buf = reversebuf(buf);
- }
-
- if (buf[0] & 0x80) {
- buf[0] = buf[0] & 0x7f;
- ret = BN.fromBuffer(buf);
- ret.neg().copy(ret);
- } else {
- ret = BN.fromBuffer(buf);
- }
- return ret;
-};
-
-
-BN.prototype.toNumber = function() {
- return parseInt(this.toString(10), 10);
-};
-
-BN.prototype.toBuffer = function(opts) {
- var buf, hex;
- if (opts && opts.size) {
- hex = this.toString(16, 2);
- var natlen = hex.length / 2;
- buf = new Buffer(hex, 'hex');
-
- if (natlen === opts.size) {
- buf = buf;
- } else if (natlen > opts.size) {
- buf = BN.trim(buf, natlen);
- } else if (natlen < opts.size) {
- buf = BN.pad(buf, natlen, opts.size);
- }
- } else {
- hex = this.toString(16, 2);
- buf = new Buffer(hex, 'hex');
- }
-
- if (typeof opts !== 'undefined' && opts.endian === 'little') {
- buf = reversebuf(buf);
- }
-
- return buf;
-};
-
-BN.prototype.toSMBigEndian = function() {
- var buf;
- if (this.cmp(BN.Zero) === -1) {
- buf = this.neg().toBuffer();
- if (buf[0] & 0x80) {
- buf = Buffer.concat([new Buffer([0x80]), buf]);
- } else {
- buf[0] = buf[0] | 0x80;
- }
- } else {
- buf = this.toBuffer();
- if (buf[0] & 0x80) {
- buf = Buffer.concat([new Buffer([0x00]), buf]);
- }
- }
-
- if (buf.length === 1 & buf[0] === 0) {
- buf = new Buffer([]);
- }
- return buf;
-};
-
-BN.prototype.toSM = function(opts) {
- var endian = opts ? opts.endian : 'big';
- var buf = this.toSMBigEndian();
-
- if (endian === 'little') {
- buf = reversebuf(buf);
- }
- return buf;
-};
-
-/**
- * Create a BN from a "ScriptNum":
- * This is analogous to the constructor for CScriptNum in bitcoind. Many ops in
- * bitcoind's script interpreter use CScriptNum, which is not really a proper
- * bignum. Instead, an error is thrown if trying to input a number bigger than
- * 4 bytes. We copy that behavior here. A third argument, `size`, is provided to
- * extend the hard limit of 4 bytes, as some usages require more than 4 bytes.
- */
-BN.fromScriptNumBuffer = function(buf, fRequireMinimal, size) {
- var nMaxNumSize = size || 4;
- $.checkArgument(buf.length <= nMaxNumSize, new Error('script number overflow'));
- if (fRequireMinimal && buf.length > 0) {
- // Check that the number is encoded with the minimum possible
- // number of bytes.
- //
- // If the most-significant-byte - excluding the sign bit - is zero
- // then we're not minimal. Note how this test also rejects the
- // negative-zero encoding, 0x80.
- if ((buf[buf.length - 1] & 0x7f) === 0) {
- // One exception: if there's more than one byte and the most
- // significant bit of the second-most-significant-byte is set
- // it would conflict with the sign bit. An example of this case
- // is +-255, which encode to 0xff00 and 0xff80 respectively.
- // (big-endian).
- if (buf.length <= 1 || (buf[buf.length - 2] & 0x80) === 0) {
- throw new Error('non-minimally encoded script number');
- }
- }
- }
- return BN.fromSM(buf, {
- endian: 'little'
- });
-};
-
-/**
- * The corollary to the above, with the notable exception that we do not throw
- * an error if the output is larger than four bytes. (Which can happen if
- * performing a numerical operation that results in an overflow to more than 4
- * bytes).
- */
-BN.prototype.toScriptNumBuffer = function() {
- return this.toSM({
- endian: 'little'
- });
-};
-
-BN.prototype.gt = function(b) {
- return this.cmp(b) > 0;
-};
-
-BN.prototype.gte = function(b) {
- return this.cmp(b) >= 0;
-};
-
-BN.prototype.lt = function(b) {
- return this.cmp(b) < 0;
-};
-
-BN.trim = function(buf, natlen) {
- return buf.slice(natlen - buf.length, buf.length);
-};
-
-BN.pad = function(buf, natlen, size) {
- var rbuf = new Buffer(size);
- for (var i = 0; i < buf.length; i++) {
- rbuf[rbuf.length - 1 - i] = buf[buf.length - 1 - i];
- }
- for (i = 0; i < size - natlen; i++) {
- rbuf[i] = 0;
- }
- return rbuf;
-};
-
-module.exports = BN;
diff --git a/lib/crypto/ecdsa.js b/lib/crypto/ecdsa.js
deleted file mode 100644
index 5f2c207d2..000000000
--- a/lib/crypto/ecdsa.js
+++ /dev/null
@@ -1,295 +0,0 @@
-'use strict';
-
-var BN = require('./bn');
-var Point = require('./point');
-var Signature = require('./signature');
-var PublicKey = require('../publickey');
-var Random = require('./random');
-var Hash = require('./hash');
-var BufferUtil = require('../util/buffer');
-var _ = require('lodash');
-var $ = require('../util/preconditions');
-
-var ECDSA = function ECDSA(obj) {
- if (!(this instanceof ECDSA)) {
- return new ECDSA(obj);
- }
- if (obj) {
- this.set(obj);
- }
-};
-
-/* jshint maxcomplexity: 9 */
-ECDSA.prototype.set = function(obj) {
- this.hashbuf = obj.hashbuf || this.hashbuf;
- this.endian = obj.endian || this.endian; //the endianness of hashbuf
- this.privkey = obj.privkey || this.privkey;
- this.pubkey = obj.pubkey || (this.privkey ? this.privkey.publicKey : this.pubkey);
- this.sig = obj.sig || this.sig;
- this.k = obj.k || this.k;
- this.verified = obj.verified || this.verified;
- return this;
-};
-
-ECDSA.prototype.privkey2pubkey = function() {
- this.pubkey = this.privkey.toPublicKey();
-};
-
-ECDSA.prototype.calci = function() {
- for (var i = 0; i < 4; i++) {
- this.sig.i = i;
- var Qprime;
- try {
- Qprime = this.toPublicKey();
- } catch (e) {
- console.error(e);
- continue;
- }
-
- if (Qprime.point.eq(this.pubkey.point)) {
- this.sig.compressed = this.pubkey.compressed;
- return this;
- }
- }
-
- this.sig.i = undefined;
- throw new Error('Unable to find valid recovery factor');
-};
-
-ECDSA.fromString = function(str) {
- var obj = JSON.parse(str);
- return new ECDSA(obj);
-};
-
-ECDSA.prototype.randomK = function() {
- var N = Point.getN();
- var k;
- do {
- k = BN.fromBuffer(Random.getRandomBuffer(32));
- } while (!(k.lt(N) && k.gt(BN.Zero)));
- this.k = k;
- return this;
-};
-
-
-// https://tools.ietf.org/html/rfc6979#section-3.2
-ECDSA.prototype.deterministicK = function(badrs) {
- /* jshint maxstatements: 25 */
- // if r or s were invalid when this function was used in signing,
- // we do not want to actually compute r, s here for efficiency, so,
- // we can increment badrs. explained at end of RFC 6979 section 3.2
- if (_.isUndefined(badrs)) {
- badrs = 0;
- }
- var v = new Buffer(32);
- v.fill(0x01);
- var k = new Buffer(32);
- k.fill(0x00);
- var x = this.privkey.bn.toBuffer({
- size: 32
- });
- k = Hash.sha256hmac(Buffer.concat([v, new Buffer([0x00]), x, this.hashbuf]), k);
- v = Hash.sha256hmac(v, k);
- k = Hash.sha256hmac(Buffer.concat([v, new Buffer([0x01]), x, this.hashbuf]), k);
- v = Hash.sha256hmac(v, k);
- v = Hash.sha256hmac(v, k);
- var T = BN.fromBuffer(v);
- var N = Point.getN();
-
- // also explained in 3.2, we must ensure T is in the proper range (0, N)
- for (var i = 0; i < badrs || !(T.lt(N) && T.gt(BN.Zero)); i++) {
- k = Hash.sha256hmac(Buffer.concat([v, new Buffer([0x00])]), k);
- v = Hash.sha256hmac(v, k);
- v = Hash.sha256hmac(v, k);
- T = BN.fromBuffer(v);
- }
-
- this.k = T;
- return this;
-};
-
-// Information about public key recovery:
-// https://bitcointalk.org/index.php?topic=6430.0
-// http://stackoverflow.com/questions/19665491/how-do-i-get-an-ecdsa-public-key-from-just-a-bitcoin-signature-sec1-4-1-6-k
-ECDSA.prototype.toPublicKey = function() {
- /* jshint maxstatements: 25 */
- var i = this.sig.i;
- $.checkArgument(i === 0 || i === 1 || i === 2 || i === 3, new Error('i must be equal to 0, 1, 2, or 3'));
-
- var e = BN.fromBuffer(this.hashbuf);
- var r = this.sig.r;
- var s = this.sig.s;
-
- // A set LSB signifies that the y-coordinate is odd
- var isYOdd = i & 1;
-
- // The more significant bit specifies whether we should use the
- // first or second candidate key.
- var isSecondKey = i >> 1;
-
- var n = Point.getN();
- var G = Point.getG();
-
- // 1.1 Let x = r + jn
- var x = isSecondKey ? r.add(n) : r;
- var R = Point.fromX(isYOdd, x);
-
- // 1.4 Check that nR is at infinity
- var nR = R.mul(n);
-
- if (!nR.isInfinity()) {
- throw new Error('nR is not a valid curve point');
- }
-
- // Compute -e from e
- var eNeg = e.neg().mod(n);
-
- // 1.6.1 Compute Q = r^-1 (sR - eG)
- // Q = r^-1 (sR + -eG)
- var rInv = r.invm(n);
-
- //var Q = R.multiplyTwo(s, G, eNeg).mul(rInv);
- var Q = R.mul(s).add(G.mul(eNeg)).mul(rInv);
-
- var pubkey = PublicKey.fromPoint(Q, this.sig.compressed);
-
- return pubkey;
-};
-
-ECDSA.prototype.sigError = function() {
- /* jshint maxstatements: 25 */
- if (!BufferUtil.isBuffer(this.hashbuf) || this.hashbuf.length !== 32) {
- return 'hashbuf must be a 32 byte buffer';
- }
-
- var r = this.sig.r;
- var s = this.sig.s;
- if (!(r.gt(BN.Zero) && r.lt(Point.getN())) || !(s.gt(BN.Zero) && s.lt(Point.getN()))) {
- return 'r and s not in range';
- }
-
- var e = BN.fromBuffer(this.hashbuf, this.endian ? {
- endian: this.endian
- } : undefined);
- var n = Point.getN();
- var sinv = s.invm(n);
- var u1 = sinv.mul(e).mod(n);
- var u2 = sinv.mul(r).mod(n);
-
- var p = Point.getG().mulAdd(u1, this.pubkey.point, u2);
- if (p.isInfinity()) {
- return 'p is infinity';
- }
-
- if (p.getX().mod(n).cmp(r) !== 0) {
- return 'Invalid signature';
- } else {
- return false;
- }
-};
-
-ECDSA.toLowS = function(s) {
- //enforce low s
- //see BIP 62, "low S values in signatures"
- if (s.gt(BN.fromBuffer(new Buffer('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0', 'hex')))) {
- s = Point.getN().sub(s);
- }
- return s;
-};
-
-ECDSA.prototype._findSignature = function(d, e) {
- var N = Point.getN();
- var G = Point.getG();
- // try different values of k until r, s are valid
- var badrs = 0;
- var k, Q, r, s;
- do {
- if (!this.k || badrs > 0) {
- this.deterministicK(badrs);
- }
- badrs++;
- k = this.k;
- Q = G.mul(k);
- r = Q.x.mod(N);
- s = k.invm(N).mul(e.add(d.mul(r))).mod(N);
- } while (r.cmp(BN.Zero) <= 0 || s.cmp(BN.Zero) <= 0);
-
- s = ECDSA.toLowS(s);
- return {
- s: s,
- r: r
- };
-
-};
-
-ECDSA.prototype.sign = function() {
- var hashbuf = this.hashbuf;
- var privkey = this.privkey;
- var d = privkey.bn;
-
- $.checkState(hashbuf && privkey && d, new Error('invalid parameters'));
- $.checkState(BufferUtil.isBuffer(hashbuf) && hashbuf.length === 32, new Error('hashbuf must be a 32 byte buffer'));
-
- var e = BN.fromBuffer(hashbuf, this.endian ? {
- endian: this.endian
- } : undefined);
-
- var obj = this._findSignature(d, e);
- obj.compressed = this.pubkey.compressed;
-
- this.sig = new Signature(obj);
- return this;
-};
-
-ECDSA.prototype.signRandomK = function() {
- this.randomK();
- return this.sign();
-};
-
-ECDSA.prototype.toString = function() {
- var obj = {};
- if (this.hashbuf) {
- obj.hashbuf = this.hashbuf.toString('hex');
- }
- if (this.privkey) {
- obj.privkey = this.privkey.toString();
- }
- if (this.pubkey) {
- obj.pubkey = this.pubkey.toString();
- }
- if (this.sig) {
- obj.sig = this.sig.toString();
- }
- if (this.k) {
- obj.k = this.k.toString();
- }
- return JSON.stringify(obj);
-};
-
-ECDSA.prototype.verify = function() {
- if (!this.sigError()) {
- this.verified = true;
- } else {
- this.verified = false;
- }
- return this;
-};
-
-ECDSA.sign = function(hashbuf, privkey, endian) {
- return ECDSA().set({
- hashbuf: hashbuf,
- endian: endian,
- privkey: privkey
- }).sign().sig;
-};
-
-ECDSA.verify = function(hashbuf, sig, pubkey, endian) {
- return ECDSA().set({
- hashbuf: hashbuf,
- endian: endian,
- sig: sig,
- pubkey: pubkey
- }).verify().verified;
-};
-
-module.exports = ECDSA;
diff --git a/lib/crypto/hash.js b/lib/crypto/hash.js
deleted file mode 100644
index 730a79865..000000000
--- a/lib/crypto/hash.js
+++ /dev/null
@@ -1,98 +0,0 @@
-'use strict';
-
-var hashjs = require('hash.js');
-var sha512 = require('sha512');
-var crypto = require('crypto');
-var BufferUtil = require('../util/buffer');
-var $ = require('../util/preconditions');
-
-var Hash = module.exports;
-
-Hash.sha1 = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf));
- return crypto.createHash('sha1').update(buf).digest();
-};
-
-Hash.sha1.blocksize = 512;
-
-Hash.sha256 = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf));
- return crypto.createHash('sha256').update(buf).digest();
-};
-
-Hash.sha256.blocksize = 512;
-
-Hash.sha256sha256 = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf));
- return Hash.sha256(Hash.sha256(buf));
-};
-
-Hash.ripemd160 = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf));
- return crypto.createHash('ripemd160').update(buf).digest();
-};
-
-// Node.js crypto ripemd160 hashes are not supported in a browser
-// We'll replace with a (slower) version that does.
-if (process.browser) {
- Hash.ripemd160 = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf));
- var hash = (new hashjs.ripemd160()).update(buf).digest();
- return new Buffer(hash);
- };
-}
-
-Hash.sha256ripemd160 = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf));
- return Hash.ripemd160(Hash.sha256(buf));
-};
-
-Hash.sha512 = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf));
- var hash = sha512(buf);
- return new Buffer(hash);
-};
-
-Hash.sha512.blocksize = 1024;
-
-Hash.hmac = function(hashf, data, key) {
- //http://en.wikipedia.org/wiki/Hash-based_message_authentication_code
- //http://tools.ietf.org/html/rfc4868#section-2
- $.checkArgument(BufferUtil.isBuffer(data));
- $.checkArgument(BufferUtil.isBuffer(key));
- $.checkArgument(hashf.blocksize);
-
- var blocksize = hashf.blocksize / 8;
-
- if (key.length > blocksize) {
- key = hashf(key);
- } else if (key < blocksize) {
- var fill = new Buffer(blocksize);
- fill.fill(0);
- key.copy(fill);
- key = fill;
- }
-
- var o_key = new Buffer(blocksize);
- o_key.fill(0x5c);
-
- var i_key = new Buffer(blocksize);
- i_key.fill(0x36);
-
- var o_key_pad = new Buffer(blocksize);
- var i_key_pad = new Buffer(blocksize);
- for (var i = 0; i < blocksize; i++) {
- o_key_pad[i] = o_key[i] ^ key[i];
- i_key_pad[i] = i_key[i] ^ key[i];
- }
-
- return hashf(Buffer.concat([o_key_pad, hashf(Buffer.concat([i_key_pad, data]))]));
-};
-
-Hash.sha256hmac = function(data, key) {
- return Hash.hmac(Hash.sha256, data, key);
-};
-
-Hash.sha512hmac = function(data, key) {
- return Hash.hmac(Hash.sha512, data, key);
-};
diff --git a/lib/crypto/point.js b/lib/crypto/point.js
deleted file mode 100644
index b4155c3e3..000000000
--- a/lib/crypto/point.js
+++ /dev/null
@@ -1,145 +0,0 @@
-'use strict';
-
-var BN = require('./bn');
-var BufferUtil = require('../util/buffer');
-var ec = require('elliptic').curves.secp256k1;
-var ecPoint = ec.curve.point.bind(ec.curve);
-var ecPointFromX = ec.curve.pointFromX.bind(ec.curve);
-
-/**
- *
- * Instantiate a valid secp256k1 Point from the X and Y coordinates.
- *
- * @param {BN|String} x - The X coordinate
- * @param {BN|String} y - The Y coordinate
- * @link https://github.com/indutny/elliptic
- * @augments elliptic.curve.point
- * @throws {Error} A validation error if exists
- * @returns {Point} An instance of Point
- * @constructor
- */
-var Point = function Point(x, y, isRed) {
- var point = ecPoint(x, y, isRed);
- point.validate();
- return point;
-};
-
-Point.prototype = Object.getPrototypeOf(ec.curve.point());
-
-/**
- *
- * Instantiate a valid secp256k1 Point from only the X coordinate
- *
- * @param {boolean} odd - If the Y coordinate is odd
- * @param {BN|String} x - The X coordinate
- * @throws {Error} A validation error if exists
- * @returns {Point} An instance of Point
- */
-Point.fromX = function fromX(odd, x){
- var point = ecPointFromX(odd, x);
- point.validate();
- return point;
-};
-
-/**
- *
- * Will return a secp256k1 ECDSA base point.
- *
- * @link https://en.bitcoin.it/wiki/Secp256k1
- * @returns {Point} An instance of the base point.
- */
-Point.getG = function getG() {
- return ec.curve.g;
-};
-
-/**
- *
- * Will return the max of range of valid private keys as governed by the secp256k1 ECDSA standard.
- *
- * @link https://en.bitcoin.it/wiki/Private_key#Range_of_valid_ECDSA_private_keys
- * @returns {BN} A BN instance of the number of points on the curve
- */
-Point.getN = function getN() {
- return new BN(ec.curve.n.toArray());
-};
-
-Point.prototype._getX = Point.prototype.getX;
-
-/**
- *
- * Will return the X coordinate of the Point
- *
- * @returns {BN} A BN instance of the X coordinate
- */
-Point.prototype.getX = function getX() {
- return new BN(this._getX().toArray());
-};
-
-Point.prototype._getY = Point.prototype.getY;
-
-/**
- *
- * Will return the Y coordinate of the Point
- *
- * @returns {BN} A BN instance of the Y coordinate
- */
-Point.prototype.getY = function getY() {
- return new BN(this._getY().toArray());
-};
-
-/**
- *
- * Will determine if the point is valid
- *
- * @link https://www.iacr.org/archive/pkc2003/25670211/25670211.pdf
- * @param {Point} An instance of Point
- * @throws {Error} A validation error if exists
- * @returns {Point} An instance of the same Point
- */
-Point.prototype.validate = function validate() {
-
- if (this.isInfinity()){
- throw new Error('Point cannot be equal to Infinity');
- }
-
- if (this.getX().cmp(BN.Zero) === 0 || this.getY().cmp(BN.Zero) === 0){
- throw new Error('Invalid x,y value for curve, cannot equal 0.');
- }
-
- var p2 = ecPointFromX(this.getY().isOdd(), this.getX());
-
- if (p2.y.cmp(this.y) !== 0) {
- throw new Error('Invalid y value for curve.');
- }
-
- var xValidRange = (this.getX().gt(BN.Minus1) && this.getX().lt(Point.getN()));
- var yValidRange = (this.getY().gt(BN.Minus1) && this.getY().lt(Point.getN()));
-
- if ( !xValidRange || !yValidRange ) {
- throw new Error('Point does not lie on the curve');
- }
-
- //todo: needs test case
- if (!(this.mul(Point.getN()).isInfinity())) {
- throw new Error('Point times N must be infinity');
- }
-
- return this;
-
-};
-
-Point.pointToCompressed = function pointToCompressed(point) {
- var xbuf = point.getX().toBuffer({size: 32});
- var ybuf = point.getY().toBuffer({size: 32});
-
- var prefix;
- var odd = ybuf[ybuf.length - 1] % 2;
- if (odd) {
- prefix = new Buffer([0x03]);
- } else {
- prefix = new Buffer([0x02]);
- }
- return BufferUtil.concat([prefix, xbuf]);
-};
-
-module.exports = Point;
diff --git a/lib/crypto/random.js b/lib/crypto/random.js
deleted file mode 100644
index f36968559..000000000
--- a/lib/crypto/random.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict';
-
-function Random() {
-}
-
-/* secure random bytes that sometimes throws an error due to lack of entropy */
-Random.getRandomBuffer = function(size) {
- if (process.browser)
- return Random.getRandomBufferBrowser(size);
- else
- return Random.getRandomBufferNode(size);
-};
-
-Random.getRandomBufferNode = function(size) {
- var crypto = require('crypto');
- return crypto.randomBytes(size);
-};
-
-Random.getRandomBufferBrowser = function(size) {
- if (!window.crypto && !window.msCrypto)
- throw new Error('window.crypto not available');
-
- if (window.crypto && window.crypto.getRandomValues)
- var crypto = window.crypto;
- else if (window.msCrypto && window.msCrypto.getRandomValues) //internet explorer
- var crypto = window.msCrypto;
- else
- throw new Error('window.crypto.getRandomValues not available');
-
- var bbuf = new Uint8Array(size);
- crypto.getRandomValues(bbuf);
- var buf = new Buffer(bbuf);
-
- return buf;
-};
-
-/* insecure random bytes, but it never fails */
-Random.getPseudoRandomBuffer = function(size) {
- var b32 = 0x100000000;
- var b = new Buffer(size);
- var r;
-
- for (var i = 0; i <= size; i++) {
- var j = Math.floor(i / 4);
- var k = i - j * 4;
- if (k === 0) {
- r = Math.random() * b32;
- b[i] = r & 0xff;
- } else {
- b[i] = (r = r >>> 8) & 0xff;
- }
- }
-
- return b;
-};
-
-module.exports = Random;
diff --git a/lib/crypto/signature.js b/lib/crypto/signature.js
deleted file mode 100644
index cf9b897c2..000000000
--- a/lib/crypto/signature.js
+++ /dev/null
@@ -1,312 +0,0 @@
-'use strict';
-
-var BN = require('./bn');
-var _ = require('lodash');
-var $ = require('../util/preconditions');
-var BufferUtil = require('../util/buffer');
-var JSUtil = require('../util/js');
-
-var Signature = function Signature(r, s) {
- if (!(this instanceof Signature)) {
- return new Signature(r, s);
- }
- if (r instanceof BN) {
- this.set({
- r: r,
- s: s
- });
- } else if (r) {
- var obj = r;
- this.set(obj);
- }
-};
-
-/* jshint maxcomplexity: 7 */
-Signature.prototype.set = function(obj) {
- this.r = obj.r || this.r || undefined;
- this.s = obj.s || this.s || undefined;
- this.i = typeof obj.i !== 'undefined' ? obj.i : this.i; //public key recovery parameter in range [0, 3]
- this.compressed = typeof obj.compressed !== 'undefined' ?
- obj.compressed : this.compressed; //whether the recovered pubkey is compressed
- this.nhashtype = obj.nhashtype || this.nhashtype || undefined;
- return this;
-};
-
-Signature.fromCompact = function(buf) {
- $.checkArgument(BufferUtil.isBuffer(buf), 'Argument is expected to be a Buffer');
-
- var sig = new Signature();
-
- var compressed = true;
- var i = buf.slice(0, 1)[0] - 27 - 4;
- if (i < 0) {
- compressed = false;
- i = i + 4;
- }
-
- var b2 = buf.slice(1, 33);
- var b3 = buf.slice(33, 65);
-
- $.checkArgument(i === 0 || i === 1 || i === 2 || i === 3, new Error('i must be 0, 1, 2, or 3'));
- $.checkArgument(b2.length === 32, new Error('r must be 32 bytes'));
- $.checkArgument(b3.length === 32, new Error('s must be 32 bytes'));
-
- sig.compressed = compressed;
- sig.i = i;
- sig.r = BN.fromBuffer(b2);
- sig.s = BN.fromBuffer(b3);
-
- return sig;
-};
-
-Signature.fromDER = Signature.fromBuffer = function(buf, strict) {
- var obj = Signature.parseDER(buf, strict);
- var sig = new Signature();
-
- sig.r = obj.r;
- sig.s = obj.s;
-
- return sig;
-};
-
-// The format used in a tx
-Signature.fromTxFormat = function(buf) {
- var nhashtype = buf.readUInt8(buf.length - 1);
- var derbuf = buf.slice(0, buf.length - 1);
- var sig = new Signature.fromDER(derbuf, false);
- sig.nhashtype = nhashtype;
- return sig;
-};
-
-Signature.fromString = function(str) {
- var buf = new Buffer(str, 'hex');
- return Signature.fromDER(buf);
-};
-
-
-/**
- * In order to mimic the non-strict DER encoding of OpenSSL, set strict = false.
- */
-Signature.parseDER = function(buf, strict) {
- $.checkArgument(BufferUtil.isBuffer(buf), new Error('DER formatted signature should be a buffer'));
- if (_.isUndefined(strict)) {
- strict = true;
- }
-
- var header = buf[0];
- $.checkArgument(header === 0x30, new Error('Header byte should be 0x30'));
-
- var length = buf[1];
- var buflength = buf.slice(2).length;
- $.checkArgument(!strict || length === buflength, new Error('Length byte should length of what follows'));
-
- length = length < buflength ? length : buflength;
-
- var rheader = buf[2 + 0];
- $.checkArgument(rheader === 0x02, new Error('Integer byte for r should be 0x02'));
-
- var rlength = buf[2 + 1];
- var rbuf = buf.slice(2 + 2, 2 + 2 + rlength);
- var r = BN.fromBuffer(rbuf);
- var rneg = buf[2 + 1 + 1] === 0x00 ? true : false;
- $.checkArgument(rlength === rbuf.length, new Error('Length of r incorrect'));
-
- var sheader = buf[2 + 2 + rlength + 0];
- $.checkArgument(sheader === 0x02, new Error('Integer byte for s should be 0x02'));
-
- var slength = buf[2 + 2 + rlength + 1];
- var sbuf = buf.slice(2 + 2 + rlength + 2, 2 + 2 + rlength + 2 + slength);
- var s = BN.fromBuffer(sbuf);
- var sneg = buf[2 + 2 + rlength + 2 + 2] === 0x00 ? true : false;
- $.checkArgument(slength === sbuf.length, new Error('Length of s incorrect'));
-
- var sumlength = 2 + 2 + rlength + 2 + slength;
- $.checkArgument(length === sumlength - 2, new Error('Length of signature incorrect'));
-
- var obj = {
- header: header,
- length: length,
- rheader: rheader,
- rlength: rlength,
- rneg: rneg,
- rbuf: rbuf,
- r: r,
- sheader: sheader,
- slength: slength,
- sneg: sneg,
- sbuf: sbuf,
- s: s
- };
-
- return obj;
-};
-
-
-Signature.prototype.toCompact = function(i, compressed) {
- i = typeof i === 'number' ? i : this.i;
- compressed = typeof compressed === 'boolean' ? compressed : this.compressed;
-
- if (!(i === 0 || i === 1 || i === 2 || i === 3)) {
- throw new Error('i must be equal to 0, 1, 2, or 3');
- }
-
- var val = i + 27 + 4;
- if (compressed === false) {
- val = val - 4;
- }
- var b1 = new Buffer([val]);
- var b2 = this.r.toBuffer({
- size: 32
- });
- var b3 = this.s.toBuffer({
- size: 32
- });
- return Buffer.concat([b1, b2, b3]);
-};
-
-Signature.prototype.toBuffer = Signature.prototype.toDER = function() {
- var rnbuf = this.r.toBuffer();
- var snbuf = this.s.toBuffer();
-
- var rneg = rnbuf[0] & 0x80 ? true : false;
- var sneg = snbuf[0] & 0x80 ? true : false;
-
- var rbuf = rneg ? Buffer.concat([new Buffer([0x00]), rnbuf]) : rnbuf;
- var sbuf = sneg ? Buffer.concat([new Buffer([0x00]), snbuf]) : snbuf;
-
- var rlength = rbuf.length;
- var slength = sbuf.length;
- var length = 2 + rlength + 2 + slength;
- var rheader = 0x02;
- var sheader = 0x02;
- var header = 0x30;
-
- var der = Buffer.concat([new Buffer([header, length, rheader, rlength]), rbuf, new Buffer([sheader, slength]), sbuf]);
- return der;
-};
-
-Signature.prototype.toString = function() {
- var buf = this.toDER();
- return buf.toString('hex');
-};
-
-/**
- * This function is translated from bitcoind's IsDERSignature and is used in
- * the script interpreter. This "DER" format actually includes an extra byte,
- * the nhashtype, at the end. It is really the tx format, not DER format.
- *
- * A canonical signature exists of: [30] [total len] [02] [len R] [R] [02] [len S] [S] [hashtype]
- * Where R and S are not negative (their first byte has its highest bit not set), and not
- * excessively padded (do not start with a 0 byte, unless an otherwise negative number follows,
- * in which case a single 0 byte is necessary and even required).
- *
- * See https://bitcointalk.org/index.php?topic=8392.msg127623#msg127623
- */
-Signature.isTxDER = function(buf) {
- if (buf.length < 9) {
- // Non-canonical signature: too short
- return false;
- }
- if (buf.length > 73) {
- // Non-canonical signature: too long
- return false;
- }
- if (buf[0] !== 0x30) {
- // Non-canonical signature: wrong type
- return false;
- }
- if (buf[1] !== buf.length - 3) {
- // Non-canonical signature: wrong length marker
- return false;
- }
- var nLenR = buf[3];
- if (5 + nLenR >= buf.length) {
- // Non-canonical signature: S length misplaced
- return false;
- }
- var nLenS = buf[5 + nLenR];
- if ((nLenR + nLenS + 7) !== buf.length) {
- // Non-canonical signature: R+S length mismatch
- return false;
- }
-
- var R = buf.slice(4);
- if (buf[4 - 2] !== 0x02) {
- // Non-canonical signature: R value type mismatch
- return false;
- }
- if (nLenR === 0) {
- // Non-canonical signature: R length is zero
- return false;
- }
- if (R[0] & 0x80) {
- // Non-canonical signature: R value negative
- return false;
- }
- if (nLenR > 1 && (R[0] === 0x00) && !(R[1] & 0x80)) {
- // Non-canonical signature: R value excessively padded
- return false;
- }
-
- var S = buf.slice(6 + nLenR);
- if (buf[6 + nLenR - 2] !== 0x02) {
- // Non-canonical signature: S value type mismatch
- return false;
- }
- if (nLenS === 0) {
- // Non-canonical signature: S length is zero
- return false;
- }
- if (S[0] & 0x80) {
- // Non-canonical signature: S value negative
- return false;
- }
- if (nLenS > 1 && (S[0] === 0x00) && !(S[1] & 0x80)) {
- // Non-canonical signature: S value excessively padded
- return false;
- }
- return true;
-};
-
-/**
- * Compares to bitcoind's IsLowDERSignature
- * See also ECDSA signature algorithm which enforces this.
- * See also BIP 62, "low S values in signatures"
- */
-Signature.prototype.hasLowS = function() {
- if (this.s.lt(new BN(1)) ||
- this.s.gt(new BN('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0'))) {
- return false;
- }
- return true;
-};
-
-/**
- * @returns true if the nhashtype is exactly equal to one of the standard options or combinations thereof.
- * Translated from bitcoind's IsDefinedHashtypeSignature
- */
-Signature.prototype.hasDefinedHashtype = function() {
- if (!JSUtil.isNaturalNumber(this.nhashtype)) {
- return false;
- }
- // accept with or without Signature.SIGHASH_ANYONECANPAY by ignoring the bit
- var temp = this.nhashtype & ~Signature.SIGHASH_ANYONECANPAY;
- if (temp < Signature.SIGHASH_ALL || temp > Signature.SIGHASH_SINGLE) {
- return false;
- }
- return true;
-};
-
-Signature.prototype.toTxFormat = function() {
- var derbuf = this.toDER();
- var buf = new Buffer(1);
- buf.writeUInt8(this.nhashtype, 0);
- return Buffer.concat([derbuf, buf]);
-};
-
-Signature.SIGHASH_ALL = 0x01;
-Signature.SIGHASH_NONE = 0x02;
-Signature.SIGHASH_SINGLE = 0x03;
-Signature.SIGHASH_ANYONECANPAY = 0x80;
-
-module.exports = Signature;
diff --git a/lib/encoding/base58.js b/lib/encoding/base58.js
deleted file mode 100644
index 6b869ec55..000000000
--- a/lib/encoding/base58.js
+++ /dev/null
@@ -1,70 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var bs58 = require('bs58');
-var buffer = require('buffer');
-
-var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'.split('');
-
-var Base58 = function Base58(obj) {
- /* jshint maxcomplexity: 8 */
- if (!(this instanceof Base58)) {
- return new Base58(obj);
- }
- if (Buffer.isBuffer(obj)) {
- var buf = obj;
- this.fromBuffer(buf);
- } else if (typeof obj === 'string') {
- var str = obj;
- this.fromString(str);
- } else if (obj) {
- this.set(obj);
- }
-};
-
-Base58.validCharacters = function validCharacters(chars) {
- if (buffer.Buffer.isBuffer(chars)) {
- chars = chars.toString();
- }
- return _.all(_.map(chars, function(char) { return _.contains(ALPHABET, char); }));
-};
-
-Base58.prototype.set = function(obj) {
- this.buf = obj.buf || this.buf || undefined;
- return this;
-};
-
-Base58.encode = function(buf) {
- if (!buffer.Buffer.isBuffer(buf)) {
- throw new Error('Input should be a buffer');
- }
- return bs58.encode(buf);
-};
-
-Base58.decode = function(str) {
- if (typeof str !== 'string') {
- throw new Error('Input should be a string');
- }
- return new Buffer(bs58.decode(str));
-};
-
-Base58.prototype.fromBuffer = function(buf) {
- this.buf = buf;
- return this;
-};
-
-Base58.prototype.fromString = function(str) {
- var buf = Base58.decode(str);
- this.buf = buf;
- return this;
-};
-
-Base58.prototype.toBuffer = function() {
- return this.buf;
-};
-
-Base58.prototype.toString = function() {
- return Base58.encode(this.buf);
-};
-
-module.exports = Base58;
diff --git a/lib/encoding/base58check.js b/lib/encoding/base58check.js
deleted file mode 100644
index 333f3503f..000000000
--- a/lib/encoding/base58check.js
+++ /dev/null
@@ -1,95 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var Base58 = require('./base58');
-var buffer = require('buffer');
-var sha256sha256 = require('../crypto/hash').sha256sha256;
-
-var Base58Check = function Base58Check(obj) {
- if (!(this instanceof Base58Check))
- return new Base58Check(obj);
- if (Buffer.isBuffer(obj)) {
- var buf = obj;
- this.fromBuffer(buf);
- } else if (typeof obj === 'string') {
- var str = obj;
- this.fromString(str);
- } else if (obj) {
- this.set(obj);
- }
-};
-
-Base58Check.prototype.set = function(obj) {
- this.buf = obj.buf || this.buf || undefined;
- return this;
-};
-
-Base58Check.validChecksum = function validChecksum(data, checksum) {
- if (_.isString(data)) {
- data = new buffer.Buffer(Base58.decode(data));
- }
- if (_.isString(checksum)) {
- checksum = new buffer.Buffer(Base58.decode(checksum));
- }
- if (!checksum) {
- checksum = data.slice(-4);
- data = data.slice(0, -4);
- }
- return Base58Check.checksum(data).toString('hex') === checksum.toString('hex');
-};
-
-Base58Check.decode = function(s) {
- if (typeof s !== 'string')
- throw new Error('Input must be a string');
-
- var buf = new Buffer(Base58.decode(s));
-
- if (buf.length < 4)
- throw new Error("Input string too short");
-
- var data = buf.slice(0, -4);
- var csum = buf.slice(-4);
-
- var hash = sha256sha256(data);
- var hash4 = hash.slice(0, 4);
-
- if (csum.toString('hex') !== hash4.toString('hex'))
- throw new Error("Checksum mismatch");
-
- return data;
-};
-
-Base58Check.checksum = function(buffer) {
- return sha256sha256(buffer).slice(0, 4);
-};
-
-Base58Check.encode = function(buf) {
- if (!Buffer.isBuffer(buf))
- throw new Error('Input must be a buffer');
- var checkedBuf = new Buffer(buf.length + 4);
- var hash = Base58Check.checksum(buf);
- buf.copy(checkedBuf);
- hash.copy(checkedBuf, buf.length);
- return Base58.encode(checkedBuf);
-};
-
-Base58Check.prototype.fromBuffer = function(buf) {
- this.buf = buf;
- return this;
-};
-
-Base58Check.prototype.fromString = function(str) {
- var buf = Base58Check.decode(str);
- this.buf = buf;
- return this;
-};
-
-Base58Check.prototype.toBuffer = function() {
- return this.buf;
-};
-
-Base58Check.prototype.toString = function() {
- return Base58Check.encode(this.buf);
-};
-
-module.exports = Base58Check;
diff --git a/lib/encoding/bufferreader.js b/lib/encoding/bufferreader.js
deleted file mode 100644
index d7ca1575c..000000000
--- a/lib/encoding/bufferreader.js
+++ /dev/null
@@ -1,192 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var $ = require('../util/preconditions');
-var BufferUtil = require('../util/buffer');
-var BN = require('../crypto/bn');
-
-var BufferReader = function BufferReader(buf) {
- if (!(this instanceof BufferReader)) {
- return new BufferReader(buf);
- }
- if (_.isUndefined(buf)) {
- return;
- }
- if (Buffer.isBuffer(buf)) {
- this.set({
- buf: buf
- });
- } else if (_.isString(buf)) {
- this.set({
- buf: new Buffer(buf, 'hex'),
- });
- } else if (_.isObject(buf)) {
- var obj = buf;
- this.set(obj);
- } else {
- throw new TypeError('Unrecognized argument for BufferReader');
- }
-};
-
-BufferReader.prototype.set = function(obj) {
- this.buf = obj.buf || this.buf || undefined;
- this.pos = obj.pos || this.pos || 0;
- return this;
-};
-
-BufferReader.prototype.eof = function() {
- return this.pos >= this.buf.length;
-};
-
-BufferReader.prototype.finished = BufferReader.prototype.eof;
-
-BufferReader.prototype.read = function(len) {
- $.checkArgument(!_.isUndefined(len), 'Must specify a length');
- var buf = this.buf.slice(this.pos, this.pos + len);
- this.pos = this.pos + len;
- return buf;
-};
-
-BufferReader.prototype.readAll = function() {
- var buf = this.buf.slice(this.pos, this.buf.length);
- this.pos = this.buf.length;
- return buf;
-};
-
-BufferReader.prototype.readUInt8 = function() {
- var val = this.buf.readUInt8(this.pos);
- this.pos = this.pos + 1;
- return val;
-};
-
-BufferReader.prototype.readUInt16BE = function() {
- var val = this.buf.readUInt16BE(this.pos);
- this.pos = this.pos + 2;
- return val;
-};
-
-BufferReader.prototype.readUInt16LE = function() {
- var val = this.buf.readUInt16LE(this.pos);
- this.pos = this.pos + 2;
- return val;
-};
-
-BufferReader.prototype.readUInt32BE = function() {
- var val = this.buf.readUInt32BE(this.pos);
- this.pos = this.pos + 4;
- return val;
-};
-
-BufferReader.prototype.readUInt32LE = function() {
- var val = this.buf.readUInt32LE(this.pos);
- this.pos = this.pos + 4;
- return val;
-};
-
-BufferReader.prototype.readUInt64BEBN = function() {
- var buf = this.buf.slice(this.pos, this.pos + 8);
- var bn = BN.fromBuffer(buf);
- this.pos = this.pos + 8;
- return bn;
-};
-
-BufferReader.prototype.readUInt64LEBN = function() {
- var second = this.buf.readUInt32LE(this.pos);
- var first = this.buf.readUInt32LE(this.pos + 4);
- var combined = (first * 0x100000000) + second;
- // Instantiating an instance of BN with a number is faster than with an
- // array or string. However, the maximum safe number for a double precision
- // floating point is 2 ^ 52 - 1 (0x1fffffffffffff), thus we can safely use
- // non-floating point numbers less than this amount (52 bits). And in the case
- // that the number is larger, we can instatiate an instance of BN by passing
- // an array from the buffer (slower) and specifying the endianness.
- var bn;
- if (combined <= 0x1fffffffffffff) {
- bn = new BN(combined);
- } else {
- var data = Array.prototype.slice.call(this.buf, this.pos, this.pos + 8);
- bn = new BN(data, 10, 'le');
- }
- this.pos = this.pos + 8;
- return bn;
-};
-
-BufferReader.prototype.readVarintNum = function() {
- var first = this.readUInt8();
- switch (first) {
- case 0xFD:
- return this.readUInt16LE();
- case 0xFE:
- return this.readUInt32LE();
- case 0xFF:
- var bn = this.readUInt64LEBN();
- var n = bn.toNumber();
- if (n <= Math.pow(2, 53)) {
- return n;
- } else {
- throw new Error('number too large to retain precision - use readVarintBN');
- }
- break;
- default:
- return first;
- }
-};
-
-/**
- * reads a length prepended buffer
- */
-BufferReader.prototype.readVarLengthBuffer = function() {
- var len = this.readVarintNum();
- var buf = this.read(len);
- $.checkState(buf.length === len, 'Invalid length while reading varlength buffer. ' +
- 'Expected to read: ' + len + ' and read ' + buf.length);
- return buf;
-};
-
-BufferReader.prototype.readVarintBuf = function() {
- var first = this.buf.readUInt8(this.pos);
- switch (first) {
- case 0xFD:
- return this.read(1 + 2);
- case 0xFE:
- return this.read(1 + 4);
- case 0xFF:
- return this.read(1 + 8);
- default:
- return this.read(1);
- }
-};
-
-BufferReader.prototype.readVarintBN = function() {
- var first = this.readUInt8();
- switch (first) {
- case 0xFD:
- return new BN(this.readUInt16LE());
- case 0xFE:
- return new BN(this.readUInt32LE());
- case 0xFF:
- return this.readUInt64LEBN();
- default:
- return new BN(first);
- }
-};
-
-BufferReader.prototype.reverse = function() {
- var buf = new Buffer(this.buf.length);
- for (var i = 0; i < buf.length; i++) {
- buf[i] = this.buf[this.buf.length - 1 - i];
- }
- this.buf = buf;
- return this;
-};
-
-BufferReader.prototype.readReverse = function(len) {
- if (_.isUndefined(len)) {
- len = this.buf.length;
- }
- var buf = this.buf.slice(this.pos, this.pos + len);
- this.pos = this.pos + len;
- return BufferUtil.reverse(buf);
-};
-
-module.exports = BufferReader;
diff --git a/lib/encoding/bufferwriter.js b/lib/encoding/bufferwriter.js
deleted file mode 100644
index 5a8638e2a..000000000
--- a/lib/encoding/bufferwriter.js
+++ /dev/null
@@ -1,152 +0,0 @@
-'use strict';
-
-var bufferUtil = require('../util/buffer');
-var assert = require('assert');
-
-var BufferWriter = function BufferWriter(obj) {
- if (!(this instanceof BufferWriter))
- return new BufferWriter(obj);
- if (obj)
- this.set(obj);
- else
- this.bufs = [];
-};
-
-BufferWriter.prototype.set = function(obj) {
- this.bufs = obj.bufs || this.bufs || [];
- return this;
-};
-
-BufferWriter.prototype.toBuffer = function() {
- return this.concat();
-};
-
-BufferWriter.prototype.concat = function() {
- return Buffer.concat(this.bufs);
-};
-
-BufferWriter.prototype.write = function(buf) {
- assert(bufferUtil.isBuffer(buf));
- this.bufs.push(buf);
- return this;
-};
-
-BufferWriter.prototype.writeReverse = function(buf) {
- assert(bufferUtil.isBuffer(buf));
- this.bufs.push(bufferUtil.reverse(buf));
- return this;
-};
-
-BufferWriter.prototype.writeUInt8 = function(n) {
- var buf = new Buffer(1);
- buf.writeUInt8(n, 0);
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeUInt16BE = function(n) {
- var buf = new Buffer(2);
- buf.writeUInt16BE(n, 0);
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeUInt16LE = function(n) {
- var buf = new Buffer(2);
- buf.writeUInt16LE(n, 0);
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeUInt32BE = function(n) {
- var buf = new Buffer(4);
- buf.writeUInt32BE(n, 0);
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeInt32LE = function(n) {
- var buf = new Buffer(4);
- buf.writeInt32LE(n, 0);
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeUInt32LE = function(n) {
- var buf = new Buffer(4);
- buf.writeUInt32LE(n, 0);
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeUInt64BEBN = function(bn) {
- var buf = bn.toBuffer({size: 8});
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeUInt64LEBN = function(bn) {
- var buf = bn.toBuffer({size: 8});
- var reversebuf = new Buffer(Array.apply(new Array(), buf).reverse());
- this.write(reversebuf);
- return this;
-};
-
-BufferWriter.prototype.writeVarintNum = function(n) {
- var buf = BufferWriter.varintBufNum(n);
- this.write(buf);
- return this;
-};
-
-BufferWriter.prototype.writeVarintBN = function(bn) {
- var buf = BufferWriter.varintBufBN(bn);
- this.write(buf);
- return this;
-};
-
-BufferWriter.varintBufNum = function(n) {
- var buf = undefined;
- if (n < 253) {
- buf = new Buffer(1);
- buf.writeUInt8(n, 0);
- } else if (n < 0x10000) {
- buf = new Buffer(1 + 2);
- buf.writeUInt8(253, 0);
- buf.writeUInt16LE(n, 1);
- } else if (n < 0x100000000) {
- buf = new Buffer(1 + 4);
- buf.writeUInt8(254, 0);
- buf.writeUInt32LE(n, 1);
- } else {
- buf = new Buffer(1 + 8);
- buf.writeUInt8(255, 0);
- buf.writeInt32LE(n & -1, 1);
- buf.writeUInt32LE(Math.floor(n / 0x100000000), 5);
- }
- return buf;
-};
-
-BufferWriter.varintBufBN = function(bn) {
- var buf = undefined;
- var n = bn.toNumber();
- if (n < 253) {
- buf = new Buffer(1);
- buf.writeUInt8(n, 0);
- } else if (n < 0x10000) {
- buf = new Buffer(1 + 2);
- buf.writeUInt8(253, 0);
- buf.writeUInt16LE(n, 1);
- } else if (n < 0x100000000) {
- buf = new Buffer(1 + 4);
- buf.writeUInt8(254, 0);
- buf.writeUInt32LE(n, 1);
- } else {
- var bw = new BufferWriter();
- bw.writeUInt8(255);
- bw.writeUInt64LEBN(bn);
- var buf = bw.concat();
- }
- return buf;
-};
-
-module.exports = BufferWriter;
diff --git a/lib/encoding/varint.js b/lib/encoding/varint.js
deleted file mode 100644
index c434f4dff..000000000
--- a/lib/encoding/varint.js
+++ /dev/null
@@ -1,72 +0,0 @@
-'use strict';
-
-var BufferWriter = require('./bufferwriter');
-var BufferReader = require('./bufferreader');
-var BN = require('../crypto/bn');
-
-var Varint = function Varint(buf) {
- if (!(this instanceof Varint))
- return new Varint(buf);
- if (Buffer.isBuffer(buf)) {
- this.buf = buf;
- } else if (typeof buf === 'number') {
- var num = buf;
- this.fromNumber(num);
- } else if (buf instanceof BN) {
- var bn = buf;
- this.fromBN(bn);
- } else if (buf) {
- var obj = buf;
- this.set(obj);
- }
-};
-
-Varint.prototype.set = function(obj) {
- this.buf = obj.buf || this.buf;
- return this;
-};
-
-Varint.prototype.fromString = function(str) {
- this.set({
- buf: new Buffer(str, 'hex')
- });
- return this;
-};
-
-Varint.prototype.toString = function() {
- return this.buf.toString('hex');
-};
-
-Varint.prototype.fromBuffer = function(buf) {
- this.buf = buf;
- return this;
-};
-
-Varint.prototype.fromBufferReader = function(br) {
- this.buf = br.readVarintBuf();
- return this;
-};
-
-Varint.prototype.fromBN = function(bn) {
- this.buf = BufferWriter().writeVarintBN(bn).concat();
- return this;
-};
-
-Varint.prototype.fromNumber = function(num) {
- this.buf = BufferWriter().writeVarintNum(num).concat();
- return this;
-};
-
-Varint.prototype.toBuffer = function() {
- return this.buf;
-};
-
-Varint.prototype.toBN = function() {
- return BufferReader(this.buf).readVarintBN();
-};
-
-Varint.prototype.toNumber = function() {
- return BufferReader(this.buf).readVarintNum();
-};
-
-module.exports = Varint;
diff --git a/lib/errors/index.js b/lib/errors/index.js
deleted file mode 100644
index de6f7311e..000000000
--- a/lib/errors/index.js
+++ /dev/null
@@ -1,61 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-
-function format(message, args) {
- return message
- .replace('{0}', args[0])
- .replace('{1}', args[1])
- .replace('{2}', args[2]);
-}
-var traverseNode = function(parent, errorDefinition) {
- var NodeError = function() {
- if (_.isString(errorDefinition.message)) {
- this.message = format(errorDefinition.message, arguments);
- } else if (_.isFunction(errorDefinition.message)) {
- this.message = errorDefinition.message.apply(null, arguments);
- } else {
- throw new Error('Invalid error definition for ' + errorDefinition.name);
- }
- this.stack = this.message + '\n' + (new Error()).stack;
- };
- NodeError.prototype = Object.create(parent.prototype);
- NodeError.prototype.name = parent.prototype.name + errorDefinition.name;
- parent[errorDefinition.name] = NodeError;
- if (errorDefinition.errors) {
- childDefinitions(NodeError, errorDefinition.errors);
- }
- return NodeError;
-};
-
-/* jshint latedef: false */
-var childDefinitions = function(parent, childDefinitions) {
- _.each(childDefinitions, function(childDefinition) {
- traverseNode(parent, childDefinition);
- });
-};
-/* jshint latedef: true */
-
-var traverseRoot = function(parent, errorsDefinition) {
- childDefinitions(parent, errorsDefinition);
- return parent;
-};
-
-
-var bitcore = {};
-bitcore.Error = function() {
- this.message = 'Internal error';
- this.stack = this.message + '\n' + (new Error()).stack;
-};
-bitcore.Error.prototype = Object.create(Error.prototype);
-bitcore.Error.prototype.name = 'bitcore.Error';
-
-
-var data = require('./spec');
-traverseRoot(bitcore.Error, data);
-
-module.exports = bitcore.Error;
-
-module.exports.extend = function(spec) {
- return traverseNode(bitcore.Error, spec);
-};
diff --git a/lib/errors/spec.js b/lib/errors/spec.js
deleted file mode 100644
index 9279f81b5..000000000
--- a/lib/errors/spec.js
+++ /dev/null
@@ -1,177 +0,0 @@
-'use strict';
-
-var docsURL = 'http://bitcore.io/';
-
-module.exports = [{
- name: 'InvalidB58Char',
- message: 'Invalid Base58 character: {0} in {1}'
-}, {
- name: 'InvalidB58Checksum',
- message: 'Invalid Base58 checksum for {0}'
-}, {
- name: 'InvalidNetwork',
- message: 'Invalid version for network: got {0}'
-}, {
- name: 'InvalidState',
- message: 'Invalid state: {0}'
-}, {
- name: 'NotImplemented',
- message: 'Function {0} was not implemented yet'
-}, {
- name: 'InvalidNetworkArgument',
- message: 'Invalid network: must be "livenet" or "testnet", got {0}'
-}, {
- name: 'InvalidArgument',
- message: function() {
- return 'Invalid Argument' + (arguments[0] ? (': ' + arguments[0]) : '') +
- (arguments[1] ? (' Documentation: ' + docsURL + arguments[1]) : '');
- }
-}, {
- name: 'AbstractMethodInvoked',
- message: 'Abstract Method Invocation: {0}'
-}, {
- name: 'InvalidArgumentType',
- message: function() {
- return 'Invalid Argument for ' + arguments[2] + ', expected ' + arguments[1] + ' but got ' + typeof arguments[0];
- }
-}, {
- name: 'Unit',
- message: 'Internal Error on Unit {0}',
- errors: [{
- 'name': 'UnknownCode',
- 'message': 'Unrecognized unit code: {0}'
- }, {
- 'name': 'InvalidRate',
- 'message': 'Invalid exchange rate: {0}'
- }]
-}, {
- name: 'Transaction',
- message: 'Internal Error on Transaction {0}',
- errors: [{
- name: 'Input',
- message: 'Internal Error on Input {0}',
- errors: [{
- name: 'MissingScript',
- message: 'Need a script to create an input'
- }, {
- name: 'UnsupportedScript',
- message: 'Unsupported input script type: {0}'
- }, {
- name: 'MissingPreviousOutput',
- message: 'No previous output information.'
- }]
- }, {
- name: 'NeedMoreInfo',
- message: '{0}'
- }, {
- name: 'InvalidSorting',
- message: 'The sorting function provided did not return the change output as one of the array elements'
- }, {
- name: 'InvalidOutputAmountSum',
- message: '{0}'
- }, {
- name: 'MissingSignatures',
- message: 'Some inputs have not been fully signed'
- }, {
- name: 'InvalidIndex',
- message: 'Invalid index: {0} is not between 0, {1}'
- }, {
- name: 'UnableToVerifySignature',
- message: 'Unable to verify signature: {0}'
- }, {
- name: 'DustOutputs',
- message: 'Dust amount detected in one output'
- }, {
- name: 'InvalidSatoshis',
- message: 'Output satoshis are invalid',
- }, {
- name: 'FeeError',
- message: 'Internal Error on Fee {0}',
- errors: [{
- name: 'TooSmall',
- message: 'Fee is too small: {0}',
- }, {
- name: 'TooLarge',
- message: 'Fee is too large: {0}',
- }, {
- name: 'Different',
- message: 'Unspent value is different from specified fee: {0}',
- }]
- }, {
- name: 'ChangeAddressMissing',
- message: 'Change address is missing'
- }, {
- name: 'BlockHeightTooHigh',
- message: 'Block Height can be at most 2^32 -1'
- }, {
- name: 'NLockTimeOutOfRange',
- message: 'Block Height can only be between 0 and 499 999 999'
- }, {
- name: 'LockTimeTooEarly',
- message: 'Lock Time can\'t be earlier than UNIX date 500 000 000'
- }]
-}, {
- name: 'Script',
- message: 'Internal Error on Script {0}',
- errors: [{
- name: 'UnrecognizedAddress',
- message: 'Expected argument {0} to be an address'
- }, {
- name: 'CantDeriveAddress',
- message: 'Can\'t derive address associated with script {0}, needs to be p2pkh in, p2pkh out, p2sh in, or p2sh out.'
- }, {
- name: 'InvalidBuffer',
- message: 'Invalid script buffer: can\'t parse valid script from given buffer {0}'
- }]
-}, {
- name: 'HDPrivateKey',
- message: 'Internal Error on HDPrivateKey {0}',
- errors: [{
- name: 'InvalidDerivationArgument',
- message: 'Invalid derivation argument {0}, expected string, or number and boolean'
- }, {
- name: 'InvalidEntropyArgument',
- message: 'Invalid entropy: must be an hexa string or binary buffer, got {0}',
- errors: [{
- name: 'TooMuchEntropy',
- message: 'Invalid entropy: more than 512 bits is non standard, got "{0}"'
- }, {
- name: 'NotEnoughEntropy',
- message: 'Invalid entropy: at least 128 bits needed, got "{0}"'
- }]
- }, {
- name: 'InvalidLength',
- message: 'Invalid length for xprivkey string in {0}'
- }, {
- name: 'InvalidPath',
- message: 'Invalid derivation path: {0}'
- }, {
- name: 'UnrecognizedArgument',
- message: 'Invalid argument: creating a HDPrivateKey requires a string, buffer, json or object, got "{0}"'
- }]
-}, {
- name: 'HDPublicKey',
- message: 'Internal Error on HDPublicKey {0}',
- errors: [{
- name: 'ArgumentIsPrivateExtended',
- message: 'Argument is an extended private key: {0}'
- }, {
- name: 'InvalidDerivationArgument',
- message: 'Invalid derivation argument: got {0}'
- }, {
- name: 'InvalidLength',
- message: 'Invalid length for xpubkey: got "{0}"'
- }, {
- name: 'InvalidPath',
- message: 'Invalid derivation path, it should look like: "m/1/100", got "{0}"'
- }, {
- name: 'InvalidIndexCantDeriveHardened',
- message: 'Invalid argument: creating a hardened path requires an HDPrivateKey'
- }, {
- name: 'MustSupplyArgument',
- message: 'Must supply an argument to create a HDPublicKey'
- }, {
- name: 'UnrecognizedArgument',
- message: 'Invalid argument for creation, must be string, json, buffer, or object'
- }]
-}];
diff --git a/lib/hdkeycache.js b/lib/hdkeycache.js
deleted file mode 100644
index 721d9da48..000000000
--- a/lib/hdkeycache.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-
-module.exports = {
- _cache: {},
- _count: 0,
- _eraseIndex: 0,
- _usedList: {},
- _usedIndex: {},
- _CACHE_SIZE: 5000,
-
- get: function(xkey, number, hardened) {
- hardened = !!hardened;
- var key = xkey + '/' + number + '/' + hardened;
- if (this._cache[key]) {
- this._cacheHit(key);
- return this._cache[key];
- }
- },
- set: function(xkey, number, hardened, derived) {
- hardened = !!hardened;
- var key = xkey + '/' + number + '/' + hardened;
- this._cache[key] = derived;
- this._cacheHit(key);
- },
- _cacheHit: function(key) {
- if (this._usedIndex[key]) {
- delete this._usedList[this._usedIndex[key]];
- }
- this._usedList[this._count] = key;
- this._usedIndex[key] = this._count;
- this._count++;
- this._cacheRemove();
- },
- _cacheRemove: function() {
- while (this._eraseIndex < this._count - this._CACHE_SIZE) {
- if (this._usedList[this._eraseIndex]) {
- var removeKey = this._usedList[this._eraseIndex];
- delete this._usedIndex[removeKey];
- delete this._cache[removeKey];
- }
- delete this._usedList[this._eraseIndex];
- this._eraseIndex++;
- }
- }
-};
diff --git a/lib/hdprivatekey.js b/lib/hdprivatekey.js
deleted file mode 100644
index 6f95211d0..000000000
--- a/lib/hdprivatekey.js
+++ /dev/null
@@ -1,577 +0,0 @@
-'use strict';
-
-
-var assert = require('assert');
-var buffer = require('buffer');
-var _ = require('lodash');
-var $ = require('./util/preconditions');
-
-var BN = require('./crypto/bn');
-var Base58 = require('./encoding/base58');
-var Base58Check = require('./encoding/base58check');
-var Hash = require('./crypto/hash');
-var Network = require('./networks');
-var HDKeyCache = require('./hdkeycache');
-var Point = require('./crypto/point');
-var PrivateKey = require('./privatekey');
-var Random = require('./crypto/random');
-
-var errors = require('./errors');
-var hdErrors = errors.HDPrivateKey;
-var BufferUtil = require('./util/buffer');
-var JSUtil = require('./util/js');
-
-var MINIMUM_ENTROPY_BITS = 128;
-var BITS_TO_BYTES = 1 / 8;
-var MAXIMUM_ENTROPY_BITS = 512;
-
-
-/**
- * Represents an instance of an hierarchically derived private key.
- *
- * More info on https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
- *
- * @constructor
- * @param {string|Buffer|Object} arg
- */
-function HDPrivateKey(arg) {
- /* jshint maxcomplexity: 10 */
- if (arg instanceof HDPrivateKey) {
- return arg;
- }
- if (!(this instanceof HDPrivateKey)) {
- return new HDPrivateKey(arg);
- }
- if (!arg) {
- return this._generateRandomly();
- }
-
- if (Network.get(arg)) {
- return this._generateRandomly(arg);
- } else if (_.isString(arg) || BufferUtil.isBuffer(arg)) {
- if (HDPrivateKey.isValidSerialized(arg)) {
- this._buildFromSerialized(arg);
- } else if (JSUtil.isValidJSON(arg)) {
- this._buildFromJSON(arg);
- } else if (BufferUtil.isBuffer(arg) && HDPrivateKey.isValidSerialized(arg.toString())) {
- this._buildFromSerialized(arg.toString());
- } else {
- throw HDPrivateKey.getSerializedError(arg);
- }
- } else if (_.isObject(arg)) {
- this._buildFromObject(arg);
- } else {
- throw new hdErrors.UnrecognizedArgument(arg);
- }
-}
-
-/**
- * Verifies that a given path is valid.
- *
- * @param {string|number} arg
- * @param {boolean?} hardened
- * @return {boolean}
- */
-HDPrivateKey.isValidPath = function(arg, hardened) {
- if (_.isString(arg)) {
- var indexes = HDPrivateKey._getDerivationIndexes(arg);
- return indexes !== null && _.all(indexes, HDPrivateKey.isValidPath);
- }
-
- if (_.isNumber(arg)) {
- if (arg < HDPrivateKey.Hardened && hardened === true) {
- arg += HDPrivateKey.Hardened;
- }
- return arg >= 0 && arg < HDPrivateKey.MaxIndex;
- }
-
- return false;
-};
-
-/**
- * Internal function that splits a string path into a derivation index array.
- * It will return null if the string path is malformed.
- * It does not validate if indexes are in bounds.
- *
- * @param {string} path
- * @return {Array}
- */
-HDPrivateKey._getDerivationIndexes = function(path) {
- var steps = path.split('/');
-
- // Special cases:
- if (_.contains(HDPrivateKey.RootElementAlias, path)) {
- return [];
- }
-
- if (!_.contains(HDPrivateKey.RootElementAlias, steps[0])) {
- return null;
- }
-
- var indexes = steps.slice(1).map(function(step) {
- var isHardened = step.slice(-1) === '\'';
- if (isHardened) {
- step = step.slice(0, -1);
- }
- if (!step || step[0] === '-') {
- return NaN;
- }
- var index = +step; // cast to number
- if (isHardened) {
- index += HDPrivateKey.Hardened;
- }
-
- return index;
- });
-
- return _.any(indexes, isNaN) ? null : indexes;
-};
-
-/**
- * Get a derivated child based on a string or number.
- *
- * If the first argument is a string, it's parsed as the full path of
- * derivation. Valid values for this argument include "m" (which returns the
- * same private key), "m/0/1/40/2'/1000", where the ' quote means a hardened
- * derivation.
- *
- * If the first argument is a number, the child with that index will be
- * derived. If the second argument is truthy, the hardened version will be
- * derived. See the example usage for clarification.
- *
- * @example
- * ```javascript
- * var parent = new HDPrivateKey('xprv...');
- * var child_0_1_2h = parent.derive(0).derive(1).derive(2, true);
- * var copy_of_child_0_1_2h = parent.derive("m/0/1/2'");
- * assert(child_0_1_2h.xprivkey === copy_of_child_0_1_2h);
- * ```
- *
- * @param {string|number} arg
- * @param {boolean?} hardened
- */
-HDPrivateKey.prototype.derive = function(arg, hardened) {
- if (_.isNumber(arg)) {
- return this._deriveWithNumber(arg, hardened);
- } else if (_.isString(arg)) {
- return this._deriveFromString(arg);
- } else {
- throw new hdErrors.InvalidDerivationArgument(arg);
- }
-};
-
-HDPrivateKey.prototype._deriveWithNumber = function(index, hardened) {
- /* jshint maxstatements: 20 */
- /* jshint maxcomplexity: 10 */
- if (!HDPrivateKey.isValidPath(index, hardened)) {
- throw new hdErrors.InvalidPath(index);
- }
-
- hardened = index >= HDPrivateKey.Hardened ? true : hardened;
- if (index < HDPrivateKey.Hardened && hardened === true) {
- index += HDPrivateKey.Hardened;
- }
-
- var cached = HDKeyCache.get(this.xprivkey, index, hardened);
- if (cached) {
- return cached;
- }
-
- var indexBuffer = BufferUtil.integerAsBuffer(index);
- var data;
- if (hardened) {
- data = BufferUtil.concat([new buffer.Buffer([0]), this.privateKey.toBuffer(), indexBuffer]);
- } else {
- data = BufferUtil.concat([this.publicKey.toBuffer(), indexBuffer]);
- }
- var hash = Hash.sha512hmac(data, this._buffers.chainCode);
- var leftPart = BN.fromBuffer(hash.slice(0, 32), {
- size: 32
- });
- var chainCode = hash.slice(32, 64);
-
- var privateKey = leftPart.add(this.privateKey.toBigNumber()).mod(Point.getN()).toBuffer({
- size: 32
- });
-
- var derived = new HDPrivateKey({
- network: this.network,
- depth: this.depth + 1,
- parentFingerPrint: this.fingerPrint,
- childIndex: index,
- chainCode: chainCode,
- privateKey: privateKey
- });
- HDKeyCache.set(this.xprivkey, index, hardened, derived);
- return derived;
-};
-
-HDPrivateKey.prototype._deriveFromString = function(path) {
- if (!HDPrivateKey.isValidPath(path)) {
- throw new hdErrors.InvalidPath(path);
- }
-
- var indexes = HDPrivateKey._getDerivationIndexes(path);
- var derived = indexes.reduce(function(prev, index) {
- return prev._deriveWithNumber(index);
- }, this);
-
- return derived;
-};
-
-/**
- * Verifies that a given serialized private key in base58 with checksum format
- * is valid.
- *
- * @param {string|Buffer} data - the serialized private key
- * @param {string|Network=} network - optional, if present, checks that the
- * network provided matches the network serialized.
- * @return {boolean}
- */
-HDPrivateKey.isValidSerialized = function(data, network) {
- return !HDPrivateKey.getSerializedError(data, network);
-};
-
-/**
- * Checks what's the error that causes the validation of a serialized private key
- * in base58 with checksum to fail.
- *
- * @param {string|Buffer} data - the serialized private key
- * @param {string|Network=} network - optional, if present, checks that the
- * network provided matches the network serialized.
- * @return {errors.InvalidArgument|null}
- */
-HDPrivateKey.getSerializedError = function(data, network) {
- /* jshint maxcomplexity: 10 */
- if (!(_.isString(data) || BufferUtil.isBuffer(data))) {
- return new hdErrors.UnrecognizedArgument('Expected string or buffer');
- }
- if (!Base58.validCharacters(data)) {
- return new errors.InvalidB58Char('(unknown)', data);
- }
- try {
- data = Base58Check.decode(data);
- } catch (e) {
- return new errors.InvalidB58Checksum(data);
- }
- if (data.length !== HDPrivateKey.DataLength) {
- return new hdErrors.InvalidLength(data);
- }
- if (!_.isUndefined(network)) {
- var error = HDPrivateKey._validateNetwork(data, network);
- if (error) {
- return error;
- }
- }
- return null;
-};
-
-HDPrivateKey._validateNetwork = function(data, networkArg) {
- var network = Network.get(networkArg);
- if (!network) {
- return new errors.InvalidNetworkArgument(networkArg);
- }
- var version = data.slice(0, 4);
- if (BufferUtil.integerFromBuffer(version) !== network.xprivkey) {
- return new errors.InvalidNetwork(version);
- }
- return null;
-};
-
-HDPrivateKey.fromString = function(arg) {
- $.checkArgument(_.isString(arg), 'No valid string was provided');
- return new HDPrivateKey(arg);
-};
-
-HDPrivateKey.fromObject = function(arg) {
- $.checkArgument(_.isObject(arg), 'No valid argument was provided');
- return new HDPrivateKey(arg);
-};
-
-HDPrivateKey.prototype._buildFromJSON = function(arg) {
- return this._buildFromObject(JSON.parse(arg));
-};
-
-HDPrivateKey.prototype._buildFromObject = function(arg) {
- /* jshint maxcomplexity: 12 */
- // TODO: Type validation
- var buffers = {
- version: arg.network ? BufferUtil.integerAsBuffer(Network.get(arg.network).xprivkey) : arg.version,
- depth: _.isNumber(arg.depth) ? BufferUtil.integerAsSingleByteBuffer(arg.depth) : arg.depth,
- parentFingerPrint: _.isNumber(arg.parentFingerPrint) ? BufferUtil.integerAsBuffer(arg.parentFingerPrint) : arg.parentFingerPrint,
- childIndex: _.isNumber(arg.childIndex) ? BufferUtil.integerAsBuffer(arg.childIndex) : arg.childIndex,
- chainCode: _.isString(arg.chainCode) ? BufferUtil.hexToBuffer(arg.chainCode) : arg.chainCode,
- privateKey: (_.isString(arg.privateKey) && JSUtil.isHexa(arg.privateKey)) ? BufferUtil.hexToBuffer(arg.privateKey) : arg.privateKey,
- checksum: arg.checksum ? (arg.checksum.length ? arg.checksum : BufferUtil.integerAsBuffer(arg.checksum)) : undefined
- };
- return this._buildFromBuffers(buffers);
-};
-
-HDPrivateKey.prototype._buildFromSerialized = function(arg) {
- var decoded = Base58Check.decode(arg);
- var buffers = {
- version: decoded.slice(HDPrivateKey.VersionStart, HDPrivateKey.VersionEnd),
- depth: decoded.slice(HDPrivateKey.DepthStart, HDPrivateKey.DepthEnd),
- parentFingerPrint: decoded.slice(HDPrivateKey.ParentFingerPrintStart,
- HDPrivateKey.ParentFingerPrintEnd),
- childIndex: decoded.slice(HDPrivateKey.ChildIndexStart, HDPrivateKey.ChildIndexEnd),
- chainCode: decoded.slice(HDPrivateKey.ChainCodeStart, HDPrivateKey.ChainCodeEnd),
- privateKey: decoded.slice(HDPrivateKey.PrivateKeyStart, HDPrivateKey.PrivateKeyEnd),
- checksum: decoded.slice(HDPrivateKey.ChecksumStart, HDPrivateKey.ChecksumEnd),
- xprivkey: arg
- };
- return this._buildFromBuffers(buffers);
-};
-
-HDPrivateKey.prototype._generateRandomly = function(network) {
- return HDPrivateKey.fromSeed(Random.getRandomBuffer(64), network);
-};
-
-/**
- * Generate a private key from a seed, as described in BIP32
- *
- * @param {string|Buffer} hexa
- * @param {*} network
- * @return HDPrivateKey
- */
-HDPrivateKey.fromSeed = function(hexa, network) {
- /* jshint maxcomplexity: 8 */
- if (JSUtil.isHexaString(hexa)) {
- hexa = BufferUtil.hexToBuffer(hexa);
- }
- if (!Buffer.isBuffer(hexa)) {
- throw new hdErrors.InvalidEntropyArgument(hexa);
- }
- if (hexa.length < MINIMUM_ENTROPY_BITS * BITS_TO_BYTES) {
- throw new hdErrors.InvalidEntropyArgument.NotEnoughEntropy(hexa);
- }
- if (hexa.length > MAXIMUM_ENTROPY_BITS * BITS_TO_BYTES) {
- throw new hdErrors.InvalidEntropyArgument.TooMuchEntropy(hexa);
- }
- var hash = Hash.sha512hmac(hexa, new buffer.Buffer('Bitcoin seed'));
-
- return new HDPrivateKey({
- network: Network.get(network) || Network.defaultNetwork,
- depth: 0,
- parentFingerPrint: 0,
- childIndex: 0,
- privateKey: hash.slice(0, 32),
- chainCode: hash.slice(32, 64)
- });
-};
-
-
-
-HDPrivateKey.prototype._calcHDPublicKey = function() {
- if (!this._hdPublicKey) {
- var HDPublicKey = require('./hdpublickey');
- this._hdPublicKey = new HDPublicKey(this);
- }
-};
-
-/**
- * Receives a object with buffers in all the properties and populates the
- * internal structure
- *
- * @param {Object} arg
- * @param {buffer.Buffer} arg.version
- * @param {buffer.Buffer} arg.depth
- * @param {buffer.Buffer} arg.parentFingerPrint
- * @param {buffer.Buffer} arg.childIndex
- * @param {buffer.Buffer} arg.chainCode
- * @param {buffer.Buffer} arg.privateKey
- * @param {buffer.Buffer} arg.checksum
- * @param {string=} arg.xprivkey - if set, don't recalculate the base58
- * representation
- * @return {HDPrivateKey} this
- */
-HDPrivateKey.prototype._buildFromBuffers = function(arg) {
- /* jshint maxcomplexity: 8 */
- /* jshint maxstatements: 20 */
-
- HDPrivateKey._validateBufferArguments(arg);
-
- JSUtil.defineImmutable(this, {
- _buffers: arg
- });
-
- var sequence = [
- arg.version, arg.depth, arg.parentFingerPrint, arg.childIndex, arg.chainCode,
- BufferUtil.emptyBuffer(1), arg.privateKey
- ];
- var concat = buffer.Buffer.concat(sequence);
- if (!arg.checksum || !arg.checksum.length) {
- arg.checksum = Base58Check.checksum(concat);
- } else {
- if (arg.checksum.toString() !== Base58Check.checksum(concat).toString()) {
- throw new errors.InvalidB58Checksum(concat);
- }
- }
-
- var network = Network.get(BufferUtil.integerFromBuffer(arg.version));
- var xprivkey;
- xprivkey = Base58Check.encode(buffer.Buffer.concat(sequence));
- arg.xprivkey = new Buffer(xprivkey);
-
- var privateKey = new PrivateKey(BN.fromBuffer(arg.privateKey), network);
- var publicKey = privateKey.toPublicKey();
- var size = HDPrivateKey.ParentFingerPrintSize;
- var fingerPrint = Hash.sha256ripemd160(publicKey.toBuffer()).slice(0, size);
-
- JSUtil.defineImmutable(this, {
- xprivkey: xprivkey,
- network: network,
- depth: BufferUtil.integerFromSingleByteBuffer(arg.depth),
- privateKey: privateKey,
- publicKey: publicKey,
- fingerPrint: fingerPrint
- });
-
- this._hdPublicKey = null;
-
- Object.defineProperty(this, 'hdPublicKey', {
- configurable: false,
- enumerable: true,
- get: function() {
- this._calcHDPublicKey();
- return this._hdPublicKey;
- }
- });
- Object.defineProperty(this, 'xpubkey', {
- configurable: false,
- enumerable: true,
- get: function() {
- this._calcHDPublicKey();
- return this._hdPublicKey.xpubkey;
- }
- });
- return this;
-};
-
-HDPrivateKey._validateBufferArguments = function(arg) {
- var checkBuffer = function(name, size) {
- var buff = arg[name];
- assert(BufferUtil.isBuffer(buff), name + ' argument is not a buffer');
- assert(
- buff.length === size,
- name + ' has not the expected size: found ' + buff.length + ', expected ' + size
- );
- };
- checkBuffer('version', HDPrivateKey.VersionSize);
- checkBuffer('depth', HDPrivateKey.DepthSize);
- checkBuffer('parentFingerPrint', HDPrivateKey.ParentFingerPrintSize);
- checkBuffer('childIndex', HDPrivateKey.ChildIndexSize);
- checkBuffer('chainCode', HDPrivateKey.ChainCodeSize);
- checkBuffer('privateKey', HDPrivateKey.PrivateKeySize);
- if (arg.checksum && arg.checksum.length) {
- checkBuffer('checksum', HDPrivateKey.CheckSumSize);
- }
-};
-
-/**
- * Returns the string representation of this private key (a string starting
- * with "xprv..."
- *
- * @return string
- */
-HDPrivateKey.prototype.toString = function() {
- return this.xprivkey;
-};
-
-/**
- * Returns the console representation of this extended private key.
- * @return string
- */
-HDPrivateKey.prototype.inspect = function() {
- return '';
-};
-
-/**
- * Returns a plain object with a representation of this private key.
- *
- * Fields include:
- *
network: either 'livenet' or 'testnet'
- *
depth: a number ranging from 0 to 255
- *
fingerPrint: a number ranging from 0 to 2^32-1, taken from the hash of the
- *
associated public key
- *
parentFingerPrint: a number ranging from 0 to 2^32-1, taken from the hash
- *
of this parent's associated public key or zero.
- *
childIndex: the index from which this child was derived (or zero)
- *
chainCode: an hexa string representing a number used in the derivation
- *
privateKey: the private key associated, in hexa representation
- *
xprivkey: the representation of this extended private key in checksum
- *
base58 format
- *
checksum: the base58 checksum of xprivkey
- *
- * @return {Object}
- */
-HDPrivateKey.prototype.toObject = HDPrivateKey.prototype.toJSON = function toObject() {
- return {
- network: Network.get(BufferUtil.integerFromBuffer(this._buffers.version), 'xprivkey').name,
- depth: BufferUtil.integerFromSingleByteBuffer(this._buffers.depth),
- fingerPrint: BufferUtil.integerFromBuffer(this.fingerPrint),
- parentFingerPrint: BufferUtil.integerFromBuffer(this._buffers.parentFingerPrint),
- childIndex: BufferUtil.integerFromBuffer(this._buffers.childIndex),
- chainCode: BufferUtil.bufferToHex(this._buffers.chainCode),
- privateKey: this.privateKey.toBuffer().toString('hex'),
- checksum: BufferUtil.integerFromBuffer(this._buffers.checksum),
- xprivkey: this.xprivkey
- };
-};
-
-/**
- * Build a HDPrivateKey from a buffer
- *
- * @param {Buffer} arg
- * @return {HDPrivateKey}
- */
-HDPrivateKey.fromBuffer = function(arg) {
- return new HDPrivateKey(arg.toString());
-};
-
-/**
- * Returns a buffer representation of the HDPrivateKey
- *
- * @return {string}
- */
-HDPrivateKey.prototype.toBuffer = function() {
- return BufferUtil.copy(this._buffers.xprivkey);
-};
-
-HDPrivateKey.DefaultDepth = 0;
-HDPrivateKey.DefaultFingerprint = 0;
-HDPrivateKey.DefaultChildIndex = 0;
-HDPrivateKey.Hardened = 0x80000000;
-HDPrivateKey.MaxIndex = 2 * HDPrivateKey.Hardened;
-
-HDPrivateKey.RootElementAlias = ['m', 'M', 'm\'', 'M\''];
-
-HDPrivateKey.VersionSize = 4;
-HDPrivateKey.DepthSize = 1;
-HDPrivateKey.ParentFingerPrintSize = 4;
-HDPrivateKey.ChildIndexSize = 4;
-HDPrivateKey.ChainCodeSize = 32;
-HDPrivateKey.PrivateKeySize = 32;
-HDPrivateKey.CheckSumSize = 4;
-
-HDPrivateKey.DataLength = 78;
-HDPrivateKey.SerializedByteSize = 82;
-
-HDPrivateKey.VersionStart = 0;
-HDPrivateKey.VersionEnd = HDPrivateKey.VersionStart + HDPrivateKey.VersionSize;
-HDPrivateKey.DepthStart = HDPrivateKey.VersionEnd;
-HDPrivateKey.DepthEnd = HDPrivateKey.DepthStart + HDPrivateKey.DepthSize;
-HDPrivateKey.ParentFingerPrintStart = HDPrivateKey.DepthEnd;
-HDPrivateKey.ParentFingerPrintEnd = HDPrivateKey.ParentFingerPrintStart + HDPrivateKey.ParentFingerPrintSize;
-HDPrivateKey.ChildIndexStart = HDPrivateKey.ParentFingerPrintEnd;
-HDPrivateKey.ChildIndexEnd = HDPrivateKey.ChildIndexStart + HDPrivateKey.ChildIndexSize;
-HDPrivateKey.ChainCodeStart = HDPrivateKey.ChildIndexEnd;
-HDPrivateKey.ChainCodeEnd = HDPrivateKey.ChainCodeStart + HDPrivateKey.ChainCodeSize;
-HDPrivateKey.PrivateKeyStart = HDPrivateKey.ChainCodeEnd + 1;
-HDPrivateKey.PrivateKeyEnd = HDPrivateKey.PrivateKeyStart + HDPrivateKey.PrivateKeySize;
-HDPrivateKey.ChecksumStart = HDPrivateKey.PrivateKeyEnd;
-HDPrivateKey.ChecksumEnd = HDPrivateKey.ChecksumStart + HDPrivateKey.CheckSumSize;
-
-assert(HDPrivateKey.ChecksumEnd === HDPrivateKey.SerializedByteSize);
-
-module.exports = HDPrivateKey;
diff --git a/lib/hdpublickey.js b/lib/hdpublickey.js
deleted file mode 100644
index 198947d06..000000000
--- a/lib/hdpublickey.js
+++ /dev/null
@@ -1,464 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var $ = require('./util/preconditions');
-
-var BN = require('./crypto/bn');
-var Base58 = require('./encoding/base58');
-var Base58Check = require('./encoding/base58check');
-var Hash = require('./crypto/hash');
-var HDPrivateKey = require('./hdprivatekey');
-var HDKeyCache = require('./hdkeycache');
-var Network = require('./networks');
-var Point = require('./crypto/point');
-var PublicKey = require('./publickey');
-
-var bitcoreErrors = require('./errors');
-var errors = bitcoreErrors;
-var hdErrors = bitcoreErrors.HDPublicKey;
-var assert = require('assert');
-
-var JSUtil = require('./util/js');
-var BufferUtil = require('./util/buffer');
-
-/**
- * The representation of an hierarchically derived public key.
- *
- * See https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
- *
- * @constructor
- * @param {Object|string|Buffer} arg
- */
-function HDPublicKey(arg) {
- /* jshint maxcomplexity: 12 */
- /* jshint maxstatements: 20 */
- if (arg instanceof HDPublicKey) {
- return arg;
- }
- if (!(this instanceof HDPublicKey)) {
- return new HDPublicKey(arg);
- }
- if (arg) {
- if (_.isString(arg) || BufferUtil.isBuffer(arg)) {
- var error = HDPublicKey.getSerializedError(arg);
- if (!error) {
- return this._buildFromSerialized(arg);
- } else if (BufferUtil.isBuffer(arg) && !HDPublicKey.getSerializedError(arg.toString())) {
- return this._buildFromSerialized(arg.toString());
- } else {
- if (error instanceof hdErrors.ArgumentIsPrivateExtended) {
- return new HDPrivateKey(arg).hdPublicKey;
- }
- throw error;
- }
- } else {
- if (_.isObject(arg)) {
- if (arg instanceof HDPrivateKey) {
- return this._buildFromPrivate(arg);
- } else {
- return this._buildFromObject(arg);
- }
- } else {
- throw new hdErrors.UnrecognizedArgument(arg);
- }
- }
- } else {
- throw new hdErrors.MustSupplyArgument();
- }
-}
-
-/**
- * Verifies that a given path is valid.
- *
- * @param {string|number} arg
- * @return {boolean}
- */
-HDPublicKey.isValidPath = function(arg) {
- if (_.isString(arg)) {
- var indexes = HDPrivateKey._getDerivationIndexes(arg);
- return indexes !== null && _.all(indexes, HDPublicKey.isValidPath);
- }
-
- if (_.isNumber(arg)) {
- return arg >= 0 && arg < HDPublicKey.Hardened;
- }
-
- return false;
-};
-
-/**
- * Get a derivated child based on a string or number.
- *
- * If the first argument is a string, it's parsed as the full path of
- * derivation. Valid values for this argument include "m" (which returns the
- * same public key), "m/0/1/40/2/1000".
- *
- * Note that hardened keys can't be derived from a public extended key.
- *
- * If the first argument is a number, the child with that index will be
- * derived. See the example usage for clarification.
- *
- * @example
- * ```javascript
- * var parent = new HDPublicKey('xpub...');
- * var child_0_1_2 = parent.derive(0).derive(1).derive(2);
- * var copy_of_child_0_1_2 = parent.derive("m/0/1/2");
- * assert(child_0_1_2.xprivkey === copy_of_child_0_1_2);
- * ```
- *
- * @param {string|number} arg
- */
-HDPublicKey.prototype.derive = function(arg, hardened) {
- if (_.isNumber(arg)) {
- return this._deriveWithNumber(arg, hardened);
- } else if (_.isString(arg)) {
- return this._deriveFromString(arg);
- } else {
- throw new hdErrors.InvalidDerivationArgument(arg);
- }
-};
-
-HDPublicKey.prototype._deriveWithNumber = function(index, hardened) {
- if (index >= HDPublicKey.Hardened || hardened) {
- throw new hdErrors.InvalidIndexCantDeriveHardened();
- }
- if (index < 0) {
- throw new hdErrors.InvalidPath(index);
- }
- var cached = HDKeyCache.get(this.xpubkey, index, false);
- if (cached) {
- return cached;
- }
-
- var indexBuffer = BufferUtil.integerAsBuffer(index);
- var data = BufferUtil.concat([this.publicKey.toBuffer(), indexBuffer]);
- var hash = Hash.sha512hmac(data, this._buffers.chainCode);
- var leftPart = BN.fromBuffer(hash.slice(0, 32), {size: 32});
- var chainCode = hash.slice(32, 64);
-
- var publicKey = PublicKey.fromPoint(Point.getG().mul(leftPart).add(this.publicKey.point));
-
- var derived = new HDPublicKey({
- network: this.network,
- depth: this.depth + 1,
- parentFingerPrint: this.fingerPrint,
- childIndex: index,
- chainCode: chainCode,
- publicKey: publicKey
- });
- HDKeyCache.set(this.xpubkey, index, false, derived);
- return derived;
-};
-
-HDPublicKey.prototype._deriveFromString = function(path) {
- /* jshint maxcomplexity: 8 */
- if (_.contains(path, "'")) {
- throw new hdErrors.InvalidIndexCantDeriveHardened();
- } else if (!HDPublicKey.isValidPath(path)) {
- throw new hdErrors.InvalidPath(path);
- }
-
- var indexes = HDPrivateKey._getDerivationIndexes(path);
- var derived = indexes.reduce(function(prev, index) {
- return prev._deriveWithNumber(index);
- }, this);
-
- return derived;
-};
-
-/**
- * Verifies that a given serialized public key in base58 with checksum format
- * is valid.
- *
- * @param {string|Buffer} data - the serialized public key
- * @param {string|Network=} network - optional, if present, checks that the
- * network provided matches the network serialized.
- * @return {boolean}
- */
-HDPublicKey.isValidSerialized = function(data, network) {
- return _.isNull(HDPublicKey.getSerializedError(data, network));
-};
-
-/**
- * Checks what's the error that causes the validation of a serialized public key
- * in base58 with checksum to fail.
- *
- * @param {string|Buffer} data - the serialized public key
- * @param {string|Network=} network - optional, if present, checks that the
- * network provided matches the network serialized.
- * @return {errors|null}
- */
-HDPublicKey.getSerializedError = function(data, network) {
- /* jshint maxcomplexity: 10 */
- /* jshint maxstatements: 20 */
- if (!(_.isString(data) || BufferUtil.isBuffer(data))) {
- return new hdErrors.UnrecognizedArgument('expected buffer or string');
- }
- if (!Base58.validCharacters(data)) {
- return new errors.InvalidB58Char('(unknown)', data);
- }
- try {
- data = Base58Check.decode(data);
- } catch (e) {
- return new errors.InvalidB58Checksum(data);
- }
- if (data.length !== HDPublicKey.DataSize) {
- return new hdErrors.InvalidLength(data);
- }
- if (!_.isUndefined(network)) {
- var error = HDPublicKey._validateNetwork(data, network);
- if (error) {
- return error;
- }
- }
- var version = BufferUtil.integerFromBuffer(data.slice(0, 4));
- if (version === Network.livenet.xprivkey || version === Network.testnet.xprivkey ) {
- return new hdErrors.ArgumentIsPrivateExtended();
- }
- return null;
-};
-
-HDPublicKey._validateNetwork = function(data, networkArg) {
- var network = Network.get(networkArg);
- if (!network) {
- return new errors.InvalidNetworkArgument(networkArg);
- }
- var version = data.slice(HDPublicKey.VersionStart, HDPublicKey.VersionEnd);
- if (BufferUtil.integerFromBuffer(version) !== network.xpubkey) {
- return new errors.InvalidNetwork(version);
- }
- return null;
-};
-
-HDPublicKey.prototype._buildFromPrivate = function (arg) {
- var args = _.clone(arg._buffers);
- var point = Point.getG().mul(BN.fromBuffer(args.privateKey));
- args.publicKey = Point.pointToCompressed(point);
- args.version = BufferUtil.integerAsBuffer(Network.get(BufferUtil.integerFromBuffer(args.version)).xpubkey);
- args.privateKey = undefined;
- args.checksum = undefined;
- args.xprivkey = undefined;
- return this._buildFromBuffers(args);
-};
-
-HDPublicKey.prototype._buildFromObject = function(arg) {
- /* jshint maxcomplexity: 10 */
- // TODO: Type validation
- var buffers = {
- version: arg.network ? BufferUtil.integerAsBuffer(Network.get(arg.network).xpubkey) : arg.version,
- depth: _.isNumber(arg.depth) ? BufferUtil.integerAsSingleByteBuffer(arg.depth) : arg.depth,
- parentFingerPrint: _.isNumber(arg.parentFingerPrint) ? BufferUtil.integerAsBuffer(arg.parentFingerPrint) : arg.parentFingerPrint,
- childIndex: _.isNumber(arg.childIndex) ? BufferUtil.integerAsBuffer(arg.childIndex) : arg.childIndex,
- chainCode: _.isString(arg.chainCode) ? BufferUtil.hexToBuffer(arg.chainCode) : arg.chainCode,
- publicKey: _.isString(arg.publicKey) ? BufferUtil.hexToBuffer(arg.publicKey) :
- BufferUtil.isBuffer(arg.publicKey) ? arg.publicKey : arg.publicKey.toBuffer(),
- checksum: _.isNumber(arg.checksum) ? BufferUtil.integerAsBuffer(arg.checksum) : arg.checksum
- };
- return this._buildFromBuffers(buffers);
-};
-
-HDPublicKey.prototype._buildFromSerialized = function(arg) {
- var decoded = Base58Check.decode(arg);
- var buffers = {
- version: decoded.slice(HDPublicKey.VersionStart, HDPublicKey.VersionEnd),
- depth: decoded.slice(HDPublicKey.DepthStart, HDPublicKey.DepthEnd),
- parentFingerPrint: decoded.slice(HDPublicKey.ParentFingerPrintStart,
- HDPublicKey.ParentFingerPrintEnd),
- childIndex: decoded.slice(HDPublicKey.ChildIndexStart, HDPublicKey.ChildIndexEnd),
- chainCode: decoded.slice(HDPublicKey.ChainCodeStart, HDPublicKey.ChainCodeEnd),
- publicKey: decoded.slice(HDPublicKey.PublicKeyStart, HDPublicKey.PublicKeyEnd),
- checksum: decoded.slice(HDPublicKey.ChecksumStart, HDPublicKey.ChecksumEnd),
- xpubkey: arg
- };
- return this._buildFromBuffers(buffers);
-};
-
-/**
- * Receives a object with buffers in all the properties and populates the
- * internal structure
- *
- * @param {Object} arg
- * @param {buffer.Buffer} arg.version
- * @param {buffer.Buffer} arg.depth
- * @param {buffer.Buffer} arg.parentFingerPrint
- * @param {buffer.Buffer} arg.childIndex
- * @param {buffer.Buffer} arg.chainCode
- * @param {buffer.Buffer} arg.publicKey
- * @param {buffer.Buffer} arg.checksum
- * @param {string=} arg.xpubkey - if set, don't recalculate the base58
- * representation
- * @return {HDPublicKey} this
- */
-HDPublicKey.prototype._buildFromBuffers = function(arg) {
- /* jshint maxcomplexity: 8 */
- /* jshint maxstatements: 20 */
-
- HDPublicKey._validateBufferArguments(arg);
-
- JSUtil.defineImmutable(this, {
- _buffers: arg
- });
-
- var sequence = [
- arg.version, arg.depth, arg.parentFingerPrint, arg.childIndex, arg.chainCode,
- arg.publicKey
- ];
- var concat = BufferUtil.concat(sequence);
- var checksum = Base58Check.checksum(concat);
- if (!arg.checksum || !arg.checksum.length) {
- arg.checksum = checksum;
- } else {
- if (arg.checksum.toString('hex') !== checksum.toString('hex')) {
- throw new errors.InvalidB58Checksum(concat, checksum);
- }
- }
- var network = Network.get(BufferUtil.integerFromBuffer(arg.version));
-
- var xpubkey;
- xpubkey = Base58Check.encode(BufferUtil.concat(sequence));
- arg.xpubkey = new Buffer(xpubkey);
-
- var publicKey = new PublicKey(arg.publicKey, {network: network});
- var size = HDPublicKey.ParentFingerPrintSize;
- var fingerPrint = Hash.sha256ripemd160(publicKey.toBuffer()).slice(0, size);
-
- JSUtil.defineImmutable(this, {
- xpubkey: xpubkey,
- network: network,
- depth: BufferUtil.integerFromSingleByteBuffer(arg.depth),
- publicKey: publicKey,
- fingerPrint: fingerPrint
- });
-
- return this;
-};
-
-HDPublicKey._validateBufferArguments = function(arg) {
- var checkBuffer = function(name, size) {
- var buff = arg[name];
- assert(BufferUtil.isBuffer(buff), name + ' argument is not a buffer, it\'s ' + typeof buff);
- assert(
- buff.length === size,
- name + ' has not the expected size: found ' + buff.length + ', expected ' + size
- );
- };
- checkBuffer('version', HDPublicKey.VersionSize);
- checkBuffer('depth', HDPublicKey.DepthSize);
- checkBuffer('parentFingerPrint', HDPublicKey.ParentFingerPrintSize);
- checkBuffer('childIndex', HDPublicKey.ChildIndexSize);
- checkBuffer('chainCode', HDPublicKey.ChainCodeSize);
- checkBuffer('publicKey', HDPublicKey.PublicKeySize);
- if (arg.checksum && arg.checksum.length) {
- checkBuffer('checksum', HDPublicKey.CheckSumSize);
- }
-};
-
-HDPublicKey.fromString = function(arg) {
- $.checkArgument(_.isString(arg), 'No valid string was provided');
- return new HDPublicKey(arg);
-};
-
-HDPublicKey.fromObject = function(arg) {
- $.checkArgument(_.isObject(arg), 'No valid argument was provided');
- return new HDPublicKey(arg);
-};
-
-/**
- * Returns the base58 checked representation of the public key
- * @return {string} a string starting with "xpub..." in livenet
- */
-HDPublicKey.prototype.toString = function() {
- return this.xpubkey;
-};
-
-/**
- * Returns the console representation of this extended public key.
- * @return string
- */
-HDPublicKey.prototype.inspect = function() {
- return '';
-};
-
-/**
- * Returns a plain JavaScript object with information to reconstruct a key.
- *
- * Fields are:
- *
network: 'livenet' or 'testnet'
- *
depth: a number from 0 to 255, the depth to the master extended key
- *
fingerPrint: a number of 32 bits taken from the hash of the public key
- *
fingerPrint: a number of 32 bits taken from the hash of this key's
- *
parent's public key
- *
childIndex: index with which this key was derived
- *
chainCode: string in hexa encoding used for derivation
- *
publicKey: string, hexa encoded, in compressed key format
- *