diff --git a/mine-your-first-block/src/main.rs b/mine-your-first-block/src/main.rs index 362b773..fe69c12 100644 --- a/mine-your-first-block/src/main.rs +++ b/mine-your-first-block/src/main.rs @@ -345,7 +345,7 @@ fn serialize_tx(transaction: &Transaction) -> String { serialized_tx.push_str(&lock_hex); if transaction.sighash.is_some() { - serialized_tx.push_str(& as Clone>::clone(&transaction.sighash).unwrap()); + serialized_tx.push_str(& as Clone>::clone(&transaction.sighash).unwrap()); } serialized_tx @@ -835,15 +835,8 @@ fn process_mempool(mempool_path: &str) -> io::Result bool { } fn calculate_transaction_weight(tx: &Transaction) -> u64 { - + // Serialized tx size without witness let base_size = serialize_tx(tx).len() as u64; - // Don't need yet because i've only verified p2pkh tx's - let total_size = serialize_tx(tx).len() as u64; + let total_size = base_size; // Need to update once i include more tx types // Calculate weight of the transaction let tx_weight = base_size * 3 + total_size; @@ -903,13 +895,14 @@ fn main() { // Initializing block weight let mut block_txs: Vec = Vec::new(); let mut total_weight = 0u64; + let max_block_weight = 4000000u64; let mut total_fees = 0u64; let valid_tx_clone = valid_tx.clone(); for tx in valid_tx_clone { let tx_weight = calculate_transaction_weight(&tx.transaction); - if total_weight + tx_weight > 2000000 { + if total_weight + tx_weight > max_block_weight { // If the block weight exceeds the limit, break the loop break; } @@ -957,23 +950,18 @@ fn main() { // Clear the output file fs::write("../output.txt", "").unwrap(); - // Clear test file - fs::write("../test.txt", "").unwrap(); - // Write the block header, coinbase tx, and txids to the output file append_to_file("../output.txt", &hex::encode(serialized_block_header)).unwrap(); append_to_file("../output.txt", &serialized_cb_tx).unwrap(); // to test block weight - let half_txid = sorted_txids.len() /2; + // let half_txid = sorted_txids.len() /2; // Add the txids to the block - for txid in &sorted_txids[0..half_txid] { + for txid in &sorted_txids { append_to_file("../output.txt", txid).unwrap(); } println!("Success, the block met the target difficulty!"); - - break; } else { nonce += 1; diff --git a/test.txt b/test.txt deleted file mode 100644 index 7c60978..0000000 --- a/test.txt +++ /dev/null @@ -1,317 +0,0 @@ -6f96b667bdfd9e185e700618fcdc1e03846b3d01ce6adf8329b8ce692b007a58 -6b3e45f62edd25f245d226382cbb81961fd0e44db9d1c9ad80816006f17a7a15 -58f61eba28d0069309cdce0d73764e58da4fff43ac9c7144460d791b5e6d60c5 -3b04a42abb9be8a958304ae018f204d01011dfbbced607a3aa380c89c4310bc7 -f5535bc5eb4d16ad11bca6227a926219274cd7160b2e6df432a21993bf1fe3f6 -8e99d670512ef5ef33093291dcebc8db9bdb72d670dba516d92242eb084256c0 -b4f7300cfdcb1b2e9d09108e436280e7cb5786f1c335de6f2f8315542cd7a231 -3daf9872a781041f8759a86e537d45f29c31ec7ab8e24c2ebfca4957e192eb8e -169b99e1f6b5a3f345cf1a9cfe1344a4821283539e136cf3c99b19845d470513 -37aa914c6ac5fc6ab1589125c934a826c8e68ab9ba6a01b9db15eaf3d58b260c -b35694023d0709ef597921f539a143a55961f137f7e54223925a475ac7b29717 -57ed382d7a36c79dcc368dc037f3afc55fc4b3a1e10681713756cba3747ca8e6 -53d7c21d778a3371d6f2afc9062fda7e8f2cfe212342b010fe173e786a77460f -ade952f18db2913afeb60eec1b8d1cf7f37a162620dab247858c9220c2fa1b4e -77fc41368e7b716048ac51bef8dab63555a2a128cd92c161b4d08a0e9726ccba -74b2b192715b7593df4a00d31ac3f2b9a1ac0950cd13a858058847cd4f297c70 -d6165ffa7b094fd11ea6335ebb16d582257ebaf3aed7a0928fa98810c1963440 -48abd0f5259a1df062c7d7ce79c7eec8ba6b75e2953f199a0982ee5546706ec1 -f23848d91be3df163828f60f4777ca6cb15c2dd64fab751be3670613c3e1d603 -00ac630e47e748ca11d321ed30072f014823b67b262ffdb21e9190e158435118 -9f15352d8598f951d5399631ff3e39709bf64631c375c98f84e0e0abe2206562 -915e8bf69e5e007d6eef2ed21cc34e102035c594c66f6a8417e04e86532f9ccf -1c767efc6913be2cdca3472a2b529b18368b0de9d857049f2754ef2893efa229 -33155bd2b03578a0f37182c5a85426d3b2b6e35e8d1234fb84835ee6b3f50a7f -c4ebb2bc406f01352581a434fea68efac3c377851ec24e2e520c843bd1752730 -62d0866f0a0ab25ff896bb6882a446cd04ae4b22cfbc03bf062f86eeab7c4f63 -7933e2f8f56016d7c609080bf8dc0c6eec38ecaef108085f0b1286a6d186da6d -8937962e0a8114448e068d1c78e7c64af4104013a0afb6be773159c45edfc3ef -0a9e466a67e9f7195b3bada774046673e0402bfe6ed63308f60821f819f8f9e6 -b09cce2a150ab4a3417a5b63a2adc057c76d496b5bd469402db95ab994783e05 -a7f46756c7598d5a57fa2ad1351f5a97f7a3d9385b092c46c4a9ebbcccf65689 -102ca2f020567b705d13a01faea87e0ff64b3358d4c58fd049a820b442418dc7 -7db135a52ce42d0fa8fe232a102b570fc537ffc222c606fcf998663e190b6ac0 -99fbbd10ee90e9317f8194ba5790ce7689022efe926993a92cb6907b994c2552 -9118ecbb0a25777eec3e855b0a4f7f2bb1cf2b24e9caa8d8ae46ceeeefca4596 -edfd0109105b07b1f414b9475085999d651386964655fc4eba86ecbb625ad9c1 -7e3a5a4364264d5a2ec4307c327208e198380dd23764bc7603b070bb911a7b27 -4658ffea0bd21299dd868716b2ce4dbf83a32ac232dace098acbc2737725ca51 -f17cb7cdfc57ad92698c2a2863787d81b6905dd82cfe86a1558d286dfa42fb49 -af0af5d7a476f0c2992234a4e0634fd2f7da3093eec988f3e865315635a60aa0 -248a14c4ee65f0327b26cb888d8a0f0ba202ae9e2b6c6868730d805eaf06ab61 -11a0fc2246f61c557f5f348e6e52070e4828cfe8265bc2c51c93db1681ef92df -ca4915e2249867134647a3c59fdb291f2aae9bc2125b6d9b0dc8020e6b955b21 -e01bd43ef020b0b4159201873ea0e84ba9624b219f51b1e7d8699878dc4571f7 -82c60fcefbed37b656c9843e8084afff02d8c5c3878a5c1d39c13740d2743c4f -4e50ea00048a58b764715112f262a0767b9314edc1ec36ab814a4d9a4c469020 -f88c8a1e08962c66f269814045254e0f5d8583a0accb8b956bd01dffe258a07e -2f1dcfc8949f4f7e84261895bbb08599071ec31cac9221c87994be22d1cc6f09 -6028b099e7c1cf7835caf9f9b29e95fd0dfaaef56aaf915226a4511e84d49d09 -7134a8ca8c6316da1dbbea4262b530a642a9c624d48df4e7b25c30773a0117e5 -46bb255d0dd0a1dc26c81b7d488374be1a8b88b7d0a7e7996ab67cad7f728f41 -b3584aa1fbe681175dec2091a447224061b77dc4cea60c7342fc37747d0a3049 -8846503adea55cf0e6d182e6867e419648f295bcd0baf51ba1ed3bad2e9a6b7e -9f35912277b3c565c9eced1da76e4ccc47904cb5348a93f26b8e97a748b1f086 -eb518200c9567b260834d7e26a6f42c77dac28a3479b8194133d9f35519e832a -bf9b5e6bb86be716ac161da03cffff63c8c594b741d895f47c78af4b6c0cc697 -f42a35b16f13e886daf54e65fdfc2fc8f5a117d1e14debbb520ad672fc72d1f3 -fdea05a809252d7af73689903dc3d73ad2387330d74bf338fee6da246b973d8f -58c85b9ae52cfc93509a70ba8b341b0f085a97a4eff63a60cd20bddbd1df5f08 -f36f38731123312d7965ef544d291743f260875bde9f045b94ee7a66c2923126 -4466a68c9091d94b579ba539fc33624e8740975733db3aefd5fd18ebbc7d59ea -3abf629640f0346af36bf5e4d791297efa597c2d9c10a2bd11da5a75bcd08434 -876c369998bf50d7c8487f65a995a6166bf1f0e170c4bd22ad085a178fcca3db -149e0532618ed27d5ae85216502c1f43f799a814ccfff62901b17107202ebaee -f746e8e14e53b7d87a39ca55af4db6d2db139f4a59177061d22d6e764b646591 -f086c556b564eaf8ca04fdf13d189cc8e21d503dafce1d60ac3ed114566a7beb -1b2a4a487ca765c5e8d6cbba5c2826031c9018a3b05c3d2f92ee12a3d0afed8e -d4140d9f04c2b760e53bc8a43d1feb4d48677822a4ad2f5e04388862558f33c4 -25120c864ae4c160a0d9efe3a8d03774d380f9136bac5b116ba1088bc9dabdee -1513b6b4d2ece0f436d0d901ba4c827309f23b52fb66fe4cd2e9a9e040664449 -06cf47d323ec189df4aed5e68edf0bb7391457b96ab1b79b5ade37d534d92c34 -dfeca418e542d53faa6bc99ea2133205530c3e403a9ce62dcb655f66f5ee4a4a -8b3bf57d196f965031abc1c619fa1860730e8156eebc5911ea0578f111056594 -4d01eb0185cc5ccb0fb23e563856e9c5e554d0e86287cce11d58dde2615e6670 -92aafa78c7142b721edbfb08ed7857ec77f4c16a79f09b5545ae960545d42069 -91a089fad19723002b2f9b77c11b31b8ed18af1b0e32634ca0d65084dfb27ee5 -552eff9b2f1b0a0ab6b6752b6c0ee34994baece06e7053a275fff7d41cd0645e -d33f5eeb551daa6449364378b374e96ddf1037d66557712a55d38851053406a5 -97ef6053617bc5d44fa581d0f362d45a7427eb2ebc485b0b1f30c8816821c73d -8c93fa8617056bb971fe0c5cf8293436c23cc59a44169c703f6de9a5c30f0a4a -54eaa968617f9d98e81747023d8902e90e511edefab41e410d363c3a454bb92e -bff28e70b9b9a1b90bcd685ffbc25911660536e25db97c2b69afe0ce6340be32 -d8793457d4b72fbcfa4e9e6d9cccfe28d35737bbbb9ed89f6430e299c4e65e80 -bbc3ee3a0c2369433e6e6a91a5d23660b43081b5367333ac2e526bd57440a0d2 -27361d5bc3001868cb47b7294509e7c4cba1872a9b5b58a7fdfbba453420f813 -4ff7d212c48b81b208a4e44f345eb3f6a7c2043ba09dc66c42fc6c9346bf7dbc -444f43109e65dc758c54f42c3141e31a433880bc6ff7bde23a4a0bf9b6b3c685 -e77db4399022adca269b9f8fb2929261a6efbbc91d8df7f7a6da2196e7a1753d -c6d84f9d08b7910b9a0e567ac36fee10fa5a04e40c94d5e538dfc75bda16fad1 -02ffe9127875654b9d4483dd7019da656d0e1391e7fd87442d7c49da2efcc3fa -ffeface0672bf397d88bc5889e5f16d115660dfd07cd5bb1d02b6263429706ef -42b6fa501db42a3e06eeed390d09c068bf5495ab66521f822dc92dfb1f22b039 -c624caef5c8b03e5a5769cacec11aa5feeacdf512bcd246c9c93ec7331a4acad -ac1767b0ee10c570fd9b2270d814925a8208b2ec6d8b28d1f29608bf1641076c -83bbcb5dcda453f4161c26958f406bd579485e087094c0d1b643c8ab278695da -4f7190468b962ba168805c1828e4ac2affc4ecb1f40e522b1eff8aaaa29c6abe -1edc08c710b30e61f878b5d8f97fa5bd94ffb0eacc4120411b96337657dad1df -f889b689641fc98767b7d8c6fcb902569b06a56fc2cd47cedd8b747d00eccdf5 -746d96122286d50c659e5d68ff5e903c2156ce9ca000d3b62b8fac8647df59bc -6ee75641f8e6cb89438224554f55f8db0af0af2ecde747b880701353572b4862 -ba670f12509daec14e0cc2481980056ae35ff17dc3b7537523120c2d5744baf4 -b4929fb7307383f6208152e63c215fada3acab7a4f1d9450398c793ed772cc4b -1ba2ad61c4b2f72268bac51476a2ed2e301f831ae1cb2b5d53e1920fdd563dbd -115a06f4dd84da8095adc1e2983cde19eada7931d7c2f8344298c39695e10318 -5c19c1c6c99bcacaebf7b55d72b21e9cb491b26359a05cca8f82272d0418ac05 -afc35d8dd937cda8bb7ab2efd8853d7dd0949574291fba8f679af57304d717f1 -213fc12aab844e605933b131d3038ddbd7985cf38c379bc98fb768eb665619b2 -a35601c741e478714ab2103bf2ec50d50750cfc26f5e4c561a17520a9871e825 -062866b39381325034552999565c87defbef69d9299a1f5e11ad6c9a8089c540 -d0d99bca1ae24edf689ed690979d3909915463da1cff244eaf1654b61cb12a0c -be8e1679753c95f6e8bfb5c9733671c31696701b526842ab8446e9bf6d6295f4 -b1ecdf6037a2a96258858d18749167b79e8b0ef91124618ef9ed51525db6fafa -f4cb2e3e614ff99bebe18406146cec40b6ba3f03f5d3a64ba4243c41d006eca4 -e21e29cdd03d77b77430babd03a79518e3ccda2791c1aece114675f3999b9023 -50ea0f26ff240e7c96e334a7d7433990a39394988ce5ad853b6407b1b459b4f8 -4afb51100bbc19dc2fddb6ed5ecad9b423238f659e886a340d61c2a2c7bfe5a6 -9872229015b26af94a894f426be90e53241f76c0dc17ac37ec0acedcdc927017 -e8d71f4133deb812bc37eecb555e0288aad36f556caa1f9687e00a0a6fe269da -e74799c47d651afb75690899220c01b97660c2e0deda2157409e3701d42071eb -32ad38b7f03d64427fcc1e73451f928025bf5d1d79bf421d0f1aa2c95338713b -3652a68a7a318664f6fbfeb6df20c13b395471e945d4844ff9193522b3e3530b -d2f2204a3a9ddaef8fa8a80720133e3fa563615dab825bc15f8c1ec4821b5dee -8b4cbba1574638ff4d920836cfe8ed1acfe38a9d31140a121a3baecc34ff91d7 -c74ecdd368dc7a18af53a9675bf2289796293a0b0da59d879fab74a578b68021 -c581fe5c00b003c4ee9dfe4ffe281a623fd67a5939ccef57b0211d4982894e59 -b88821f2dedc6d0e38f6eef3658beab9c2e3d3149ef976578f6c1d3cd7f5b334 -210b463c14d19c380c947667816e0e14af56193f0e8045c69ca034440f803a43 -a9542a76dc6a92522a13c344b2ce024f3257a84a568fc4a22f9499effab3214f -d42f4471335b053265de345430fe66715f94cc86c37c4b5989815a3f11ee9bef -0678ef9278275111588cffbd5ac958f36222f6013e4c0152ce335363981529fe -4d7e4d106cf0b3d71524b9cc2e5100c971f5fa23ec2824fa2d7e4885a40758df -2af505b144f67e29af8975c600a95a7eaee39760274dcc03c3cf603720b65121 -3ba9a76226667d5124e6afb51435fa5d98f1ce88ba739374567fa1fbb993007f -0039661485f691462bf3b796a235aa436bc8ce43c317a4a6ad6aeba195162f01 -f501d6bdc92307219080de44fe302a5ac3c1fd579229f628035596460321fb5f -7c2593c519eac4beaf1b650a265c5356f93af7fdee000c6597442c51596276d5 -1441abdfa3d11293f0bd6b9eae9f3e99e2ef6a41651c4fbc7ffa5aa370cb4c2d -16bce7a69d1b586804aec5b170ee8abda2f13ae0469ee364a0340ec28c2a289c -6db1414501c8c114cea810cbf51587c6dd763e093726fb99056301bfb1c7aefb -076fe4535321ead08d8c8fbc02cffd2305eab6d8a4c46a92263dff94dbf50a03 -5e8d6c99573b8b81ef651923aab5aa21cbf265cb3dc970c5c435d174d997d89b -79af1efc6026b943309d4fee589762439997da84acd207c78e79b5e59db593e6 -07f58c15bbdede6d22f1b9db0f4162c9f257e9ed37d944a53afb5d54ba3106bf -b4bee4efdc5efd22b6b9059f5a05bd4b798a8dce84cf9770d156276dea5a81f1 -9eca72bb2e95d3b9ea7a5f9840a71993ae2bdd6f720d3a4370a99681843b5a11 -05ca12899b752badbca5fa0a7e902f43abe25fc98069e69ae4ee36c647a7bb38 -78f9a5b4443ef8f8968ee2f0d866a67248112985d02465324432433ef0cbef94 -bbd0270db91c9754c26d7444e3598d1d5ecd726e4b7b4c03d6cbf27961dac653 -38c88641dafc82e725ae4a5e862d5fe0a89dcb182109a16c7bfdbb3b2650f1db -40e8e3cdc81a2152ce33eb436a7e090a15e55c9204c98549466f3678ba164f1a -c9c53cbae6fdeb5e422f1f4bca81db2dfdfc36201f84059dfaf81f588d54228a -b8357f202905a1dc02743beef37268fd0a4b69577c23be03111cddb3fce5efc0 -741bdae970813240341b219143263d20d15d9f16b457d4a2b15ce41b11e6ad39 -5bc715699195ef5e16dd74a8d047a794b88765753708a0ca886477f6d3d0cf82 -0a845bffa251b71c63e3b596f0a6fa2719056a14b54cfc320655324ae09ab165 -6951638ba138dd2da368a48d4ed4d05b0b022e2d96d19a781955d680e0c590b4 -27c42196db4150f5a28f8f0cc31edf5a0f27ba28506ae30f4f7bd9fbcdd8165b -dad7f18436e1591711329fe069c2bfe3a462db409b10ac500159f93ae349d4c7 -a589490417de5e934067fe2e060be39fee55755669ad59091a1ff9a4238e6ad3 -46c2fa3f2899fe04b5a9fb0d4cecec7e3dc701db96b1ba2df353a4f90f1624e4 -12dbeefdbe0d1db2774542f070b786328774ef793d4d7cd2f1cbec8ae2217a24 -0c272ebc7765069e1b118ec25158baedd49bba70388b2344d031d97b0089a82c -96f80a932a0dfaea504959fda016d6e38cb4c4512b5cbd68f3ff66208d7a7066 -b513d76f4c1923b9965e157c1e35798b4f7ba8794a57bcd96f285bcae1470c44 -1f9e647a3fb9c14a08a4b6edd7d4a46cddb61f9eaf9f17061a372e5a8dbe5f31 -23763bc763a668f0198686a93af202fbbbbe66a48196f8da9d25a282fab5442c -e02deb2848aeddc6ff7a89bf5ffb1fa8cc29f8216c9b70c6420f10f6f32cec14 -3abe778dc29baef8c497c9caea82a71d94f0788d4b4106e36050c06ff4a7c24d -e6ae965eb63f17a7126d66b9ac047fbdb4e08c9d767b11648ad43e998c7fb6a2 -202eee031aa63a1bc673ad2585d46d1d966f42e1c7851eb550ff49df9465eb73 -b4e5dc47b91d0a16dde6f872862e41c3ffdc4aed317ea26f7b5e9182191acba8 -7fb7b6767707af8a182b8261ebc0c04de8e3620b937a8564c371c99ce4ba4126 -cc79dfe20e97d9699c4fa208c8401592b89cb800bcfd34d4eac97d564e615fea -37b920328bc1bd8c47946caaa1b3499a5a8b7cc485720c9d8927f41e3c450ded -bd68599eaa9517ef9975fcda046466083b87e527272bc338dfccaf922c5c3683 -5cf8365b3f3a14c2cfa49e671e222f44c5cdf593cfa88337f4b6f058c2615ee7 -5be85472b32231e33890d8eaafb6ac8b02b501c0fb46a6a53e39e42f99d92721 -6907222d73f32b1de67bc7c2994c3aa8ebde874c9397053231b15f1b821578bf -3104778634d0f8fbfede37d854819552fe81f347a46501b512a5f10f39487351 -ba644267194e95c248ffb7c728a38f3a9c7ba8b9d777ff601839b1c1f530b2bc -ed8fbf9b830c14779564b8d7715be890b42b10402bfd325a42b2e01ddbbbb03c -bc528a2f07f6201c646900d1b5e87489ba66b7b8d206faf16d901206eb659909 -7e65bcad23d0b7d55838bd3ca3fee992480f178aa7fe17a5dafdc9935c54432a -06ceafb74207754aaa4e1cf4baa828822f18c0d785a3767076d350a47f996c45 -88a023a599c9c1202100c97444a1ad2ae5b567ca9321884f8228d11436b73738 -c7b939276fc1be951c2174f3809993c73828010c081a0745a86cba016b5153c2 -aeb93e891b096a2c81aa2b2b17de1f35ddbc1c4bf121c7b104d81f2b652f0b52 -9dd946273aa7bc85efcb2e502aaea8b7ee86b08e8813def637d9384f92b3bfc1 -c976ee1cdfef06634e378698426199cde7b38469f8a5b2c7904c971d727d787c -ff07887be122a81a5ba37e04ca3f1a60c7c509ffed695226b36433c83c8a9f65 -b054128b67086fbe40248b1ec00f801efa546be6f46307123fe3c97bdf907b55 -f155cd8aa1de948607325f2c21290809dcc5667e9d9d250799b5ce9fe857e448 -85fee8c89528e91bd56c1fae121d72dc7587d00d253082c29610fc0376b7d45b -ce60e80ec5b7bc4c34f03ebdc477d22b40106bef164c5d48e48a4d5e2260631a -a340ec3d77d9120f88f33411d51269d8efa30f2ea3c6d2e2136052d5c51a0648 -3260a1cb426b7f6d3b6c1925f22fff91c71563082070c74d225571df4c96d2c4 -d6f384836d1245c4c8896f78ef942b67af8887efdd0448471aa86c8b14a20c16 -3856607e535ba1592a21d39dc2d8d7ce0c68aa1b78820c3559f61b65c1d074d3 -7b525fc24cf7d7d4272a28d289d919463799f2d51356468d1225cb92e46072af -a83ec6034293daa9db36954b2d612dc5d7f4a7660ef8a7d8fe95ffc0b8e555b6 -4f7d5bd07df2568f9e8bf336b8665af3361a15c3bca770aaf3b1ce7754717f9a -c6801ff88e2528caeaae90e1aa47b47606afe2f22a43a5c7763aac282b7753ab -1405b427bd4d3805ab043d0739de57d9d49ae0c8319464b8f7d61bee8e646974 -ed7b2265eafc942237ec5c81dd81003ad373922ef8be33fcec38224f5d31db14 -fab2b9b747b79cbc4179721a5d7a233da24f034c3ad1dfbc5a0b5598c3902fa0 -15eb59d06208ca1f81e74278390b66d43296429d05240f4bcf80fda638dc3a10 -a8e65eaed4b157961f7ddde2db6134cad2757b30d31f8efa585675b55f5d539c -a4df625cae7c0080aa2854aea285c50107abff0fd9269bd0a9832e2ef08c5809 -fff302297c329c6f5577dff224a69e9a11fd2c59ad55840fc76800521233518e -7b607b900541f73a99c13f9279ead6524795c3818027dbaa6d64d8eb73210e74 -71c7523a93743a68570335e33e469fe0354885401dd6f114159d568203936688 -5b6abbf362d899cfcf5c3a2b422d850be4f13481cf30e7d934a488fad892187c -bdf6b58bb479aaaf13891ff848c87f802935755296874921d71174b7f10b4934 -bdaa53d2af6c3c0f2e3614d60f38796dbc89982e4708568e4ff16c20f77a4f98 -3e803a49c703e8ef4c10e186ef60a9387c662238e011066377e1a26cf3f9b050 -2a51391b4803b79e69f602ac79189e102c824386d3bd629de8d1cf973c7f42f6 -d998335271b404f70bc4b335e3b4d67030de3ce4ccdd750352516f089da4678a -549122fc36462f4c9bb5d1e4861da1b0a8743bbda5afe1d33a1f038cceea5631 -71a86f30e10328c3122a24d38b41614f87e51b9bb326bd86fc0a49481d5ef1b1 -72d74260294bdf8d826f625e6795b0403be3275aa516c45f5919c6c770a019a0 -e267e06d3f1d467daa7d394ee42d8cc9aa405478f70392ac060eb91b28d10b9e -dbe2257e23c9d3df41eadb554a05799680c1044a56235cd491a559d21fb1148c -cccd29f709065ecbe75764d1f75b06a2a912b8cb2aecc8ece20bd8cf2ba460b7 -6f1ea95cdcb503a40ba30559b14feb898bd109035c11ce75add0f338e85ad6fd -23cab672516e22289c5c7772c47d491a29c7f8fa400b1b5696e820ec3b8c1e2d -1dd6dca5160588b5e02e12d7cf8618832cccc7edcf512dad1df42482be8c70c5 -cd256d35c9556691e1f17b15b214a443a4184311c7b913a9e3f7935871dd669e -4106d6b78ee1c7b105cccb3d826b2577fef3117c86adcc12a0eb6ad0981c0b5b -6acff62c3e8c029436469f1ef598fa0c69226519ac4fbe500e862e1d3e256592 -3c3acf3c6e6f0bb7ba5c123c4f23d1cb52d1616676c6f18f061976eca4288d9a -177f17b7fefae7413d85f8304385f04e9902aa127d694e53e7a16f8ae6298766 -ca1df03eab520464a2b5dd56289a4153a7b04761d9a4cac695eed9b59df53c58 -bddd65d1a6c3f23cc11d378acfa043a7248bebf0fbe58f042f3e4ff5d938a998 -7d4c7c4df763c1dfd7a53ca8c80797a684f358bc342810a3ec338f3a7e710dd1 -c38a44a83d603d639b3d43053924eb45fa4867b04e4a1260d3ca29debd14fa1d -d6509ec22d8338d8c9eae9760f9ac2598ec4a4db217b2c84cdf870c13f46af08 -a2f4137c3dd3bfc6b31582a9533cc07dc0b06b595d8982b60d6dbbd9accc5675 -9d10e8485b9ea5ffe06142343824adcab90a455322432eec1a2520ad7c48d7d1 -8b7530744e0fb4779c5ea54daedb93c67911801b8b937fa3efa16cfbbceb2526 -cb0039284a00a3191b3edd343980d75ce1b1fb381ba393d9f5935956ef79a522 -cb8cee2a1b89d72c0a2e6615ca8ec127c9b367262db75cfc986ddeaf00eec37f -b240a1c724d3765669f8ee8265f59cebc2137982cb48956ff4f306722454ac7f -a7d4022a4d3511615a602abb53fcc256ef71e81b707ad3bffd728e0bd5bb8935 -fc4647ee8a2ab689ef75687cb7952725f97536a4ead88246fdd2a6b8cc951ade -08165eff1d300455e2c9ab5c0539ad81adba80523343115735db9d3b332d00e8 -778a22fa4e268448bbf156d7d67283954b50bbaba8760e942b8bff6a87526220 -4d9d800a753554c10c2d8aaac46dad91125422622708891c5ca79205871d96f0 -a18f40501bd0d019db908dfaf0d6b39d0327c125574868aa749fb0f6f13dd794 -0e65d4664856cdaeef58773921816fadafbe009f320009fe3af8e46326adcfa2 -764900eab5bcbfe9f36bdd86e62473ec00f3de6c2f4167a4e5d6d062fa9d53cc -ca673120b5554dbec8ee012a95609c23f63d267655171c343f9e6a0023b36cc0 -5dedc0cf28504efafb4b29db4cc32cd160c8ae2919346afe3e2a0e770df67484 -7f8295c23efe11e40a3b5867e38c04747c023621e52e35421111003915f2614a -3403101381eaae549fd67e6f62528d0b1599f5332fbe7c03d65bad80a2fc20b1 -19630008f3117c0b453e9a7afe30d954c24a0736f056596a79dc021e7f73701a -fc76ccd4d6cb286a266ba9ac40b7385f31408d6e18b1104938754dd5b061edcd -b55c104b6e1ab70d18e890828c2db9ed7293950c77fb60494447c2e77e446299 -4ff4278c4b8bca7ccf432c8a805e8f3d70cefc71b2e30b621906b4379b0de1fb -7fdfc95871796bfbb5129c0c2c6f3b7f5b3835cc128c6967be1801940af1af6f -d4ddace1733a1633cad7dc8ef3c506bd82886096b932f3b446a31bd6f54f0236 -95d2713a0f434ddabb77b93bfca8a161ae3383fae7584536dc2a244aedbecd0b -f0aba11ff558c48458df91740d2e7e074edd908d03024d640839e8393b7a7af0 -a5d78881ae293fa89f4ea2a3d18a5a6a2c72e77bec4a3eea8b19a3501c77f1b4 -1854ee7f6f6b0e115da825a556fed04d2027def08fd9a3b8a4db9403d425b14f -47bffa0b23f7ae74834562d8cea1117ef4935caa2fd3b28a8283a8bbb7379293 -edc6782002b962065404e5021bcb9fcf99c9b518fdb32361f86a1a8a501ab1fc -9242f429066310257ab68a9ead920d6ada82d980a4f5648327882831d8d68ab6 -384eba54fad7f04b17ca8af796ccd7edd329cd0ce3db800f89643bd446bef829 -58797a8a43dedac7ef7e390534983a13db4e66f77359fe8871642de66a47e20a -1880603e2ec50b6664660d1774709049dc67f79dd5e776915814724472b4c427 -25e8104d103c6e0ec33454cc060b0caf06e20dc6c5b6446187137cd09eae74c5 -6a640fb49a3c3160cd1b597933fd08a7c2cc3b3d859a932ca33ef4c4d2106baa -d7c1c2dc0f200adb7ae92fc741a99e517a7a3640fc139347908c070f98b7da12 -469439eca818805743f7f04be7d980987f08232d84d89e6c2f711d69b414c362 -ab15fcb774c10c93a0db7d99da3939f984d03b852dc6434d3fa12b24cce88000 -a8131a0a93835d3bb9f9ff926e23e7315d23bbaabbd1b4940641ad379114946d -5f76123e585f70335116e9dad87ccf05e863348bfbb17ab229e52a067c51ceca -16464695c19c060723240847a9dced529d1022782c93d7b2c7e5141618a0a53d -671afdc5c83911b0b6e0ead987731d3567027af22a2264fdd55eb7235e7437d5 -ada513b0193bbe03ca24e897f3cdfa54af51507a82626bbe6363b53875d6fa48 -ee289cb21dc3996cb92b4d50036e9edbb6906b5f2204c2c3b3857d538f38a932 -57670a35dc8838556b44db9650a2c015e74cbae1582ad41f6df4234b9d098183 -5b57a5342e0ee617fac1869fc1ebdfe8b308681028a432961a107ac288305a7f -490dac84f2954e55474ae37d4087ba327d8f939d50be0188da0cded68f5a60b3 -1dec28ce6bdcbc7ec449ea6ee358546f567f4b504ad31b5e0c7d0cafda7ccb14 -65a9c6cdaa90292df7931860050a46323c9d75eb1c2ca5d5540fa2cda3d5e035 -f19c5f68575c60fb08c29105edc3c4f5e25962e24e4a7d38531b837616a2831f -f9be85a940508073d8d794a2c2c45d8d1def3953fb135bbdfc447d0b868cc592 -9553166cd48489818a610947ed6aca930cfccfc28bb96df2baf20921d8d506c6 -78118e911b6e90966ed7f44b0531c1bc89c5dd505296c58f42579472fc97bc4c -6f3275b5a4a2b06a291c37f5c6c2b915b3450f9a9dfe2c062567d5c3187e2fd2 -fb5b25d01545d48043d88e32f737142eb8c6835b852c94a1a8974fedd2189f85 -3f55a8e2e2c83d5fdbc76a2fd344ff2ade26251a228c2e3a140bcb5766132b82 -a85507af088170241564fd24f0b937e77960fa1a279ad669a13a72c305b00770 -e0205add47f70b1099bc0ad76fa1279b77888717e3860ffe3dcad39345ed489e -a995fec82dfe2cab08958b868d2ec14eeb2a1908a62515d0fad344458dc644f5 -8d5aff75b50545e1e9845a44153fac58b2c1b76788372a91574842851dd3c23b -cddef0ffdf7798058942fc509af70c3e825265b52670d064912e5158d2c3a828 -01d3d2974eaa1e9e701faf12bc8739fba7ba18d892920097a6880933c2a44369 -b9ef553d2f12ae996c55f251ef9119ec5cca037188bbafd612270d095f74aaad -2db8f18b4d5a8aa6637d5246e84ec02b64019f165b3fad228b1fc08fef6fcc75 -ecc707866892bc5231d7bde7417791f88a6a89f15328eefa638c2b2c4925b8e8 -512381e252b9f89ac679d4fc7e496245b3d010f02c3f6060a73f51582af63690 -9a79a0240d46c07e7d5d5c0bba44379f096b0ea69f045a12cca177fa890006c8 -fb6174ed261b3170fb59bcf498317e3aea8b3fab457a567361aab83927107007 -997b5782b9faa4c380ef1f8e9c052bc14fea5bb0e62344ba546bb42c0563712d -5cfc897c7f007c859a2788bd3f1c5d8039561442fd3bba5056a8e89d3436513c -53a0a5b7efc01a3ae288af0d92877914f4eca8d005848b7031ca78fb424fac1e -ea5d75d653ce3d4903607f0fc5f5df59fb5ca4a61cb26cbc12dafe37810c5aab -edc0db999fb85a7b8a7901f4ff1b9f50d9422a6474decaf6fcefd7d6191b2361 -861aff19aac67e85d66f027ef4e012c06d4ed199672c9ff1d4acacb42b180602 -6ff597f841f38cf0644a8a8251e2cb981af623b3122559a31265f9dd79337b15 -6f40d64a3ed143ce58ecebfacab9fa96491c8fb5e95cb3dbdd991635d1cd977c -7c032271e983efc418091582d91ffc6ca690b26d3d8aea920495725db52fd264 -3b98141346f06b21481c549102b34ca54167e9345244ea8ab4608283eb9f8adc -bd73115d27ec0c7f6201e9e04d0ac332e7d9168e397eba877dad556a45670143 -7e34fb3349451c7693883ccf845521c8daba098313fb7361dc4edc8ec4bce56a