diff --git a/contrib/signet/miner b/contrib/signet/miner index a92529ec8680..d979b5fdfdd4 100755 --- a/contrib/signet/miner +++ b/contrib/signet/miner @@ -93,10 +93,7 @@ def finish_block(block, signet_solution, grind_cmd): block.rehash() return block -def generate_psbt(tmpl, reward_spk, *, blocktime=None, poolid=None): - signet_spk = tmpl["signet_challenge"] - signet_spk_bin = bytes.fromhex(signet_spk) - +def generate_block(tmpl, reward_spk, *, blocktime=None, poolid=None): scriptSig = script_BIP34_coinbase_height(tmpl["height"]) if poolid is not None: scriptSig = CScript(b"" + scriptSig + CScriptOp.encode_op_pushdata(poolid)) @@ -124,7 +121,13 @@ def generate_psbt(tmpl, reward_spk, *, blocktime=None, poolid=None): cbwit.scriptWitness.stack = [ser_uint256(witnonce)] block.vtx[0].wit.vtxinwit = [cbwit] block.vtx[0].vout.append(CTxOut(0, bytes(get_witness_script(witroot, witnonce)))) + return block + +def generate_psbt(tmpl, reward_spk, *, blocktime=None, poolid=None): + block = generate_block(tmpl, reward_spk, blocktime=blocktime, poolid=poolid) + signet_spk = tmpl["signet_challenge"] + signet_spk_bin = bytes.fromhex(signet_spk) signme, spendme = signet_txs(block, signet_spk_bin) psbt = PSBT() @@ -332,6 +335,28 @@ class Generate: return tmpl + def customize(self, bcli, tmpl, reward_spk, poolid, custom): + if custom is None: return True # noop + + if "txs" in custom: + tmpl["transactions"] = [] + for override_tx in custom["txs"]: + # other fields (txid, hash, depends, fee, sigops, weight) aren't needed by us + tmpl["transactions"].append({"data": override_tx}) + # can't easily calculate fees to collect, so just burn them + tmpl["coinbasevalue"] = int(50_0000_0000 >> (tmpl["height"] // 210000)) + + block = generate_block(tmpl, reward_spk, blocktime=self.mine_time, poolid=poolid) + block.vtx[0].rehash() + block.hashMerkleRoot = block.calc_merkle_root() + gbt_req = json.dumps(dict(mode="proposal", data=block.serialize().hex())).encode('utf8') + result = bcli("-stdin", "getblocktemplate", input=gbt_req) + if result is None or result == "": + return True # success + else: + logging.warning(f"Customize failed gbt proposal; result: {result}") + return False + def mine(self, bcli, wallets, grind_cmd, tmpl, reward_spk, poolid): psbt = generate_psbt(tmpl, reward_spk, blocktime=self.mine_time, poolid=poolid) input_stream = os.linesep.join([psbt, "true", "ALL"]).encode('utf8') @@ -352,6 +377,16 @@ class Generate: block, signet_solution = decode_psbt(psbt_signed["psbt"]) return finish_block(block, signet_solution, grind_cmd) +def custom_block_info(args, height): + if args.custom_block_dir is None: return None + p = os.path.join(args.custom_block_dir, f"{height}.json") + if not os.path.exists(p): return None + + try: + return json.load(open(p, "r")) + except: + return None + def do_generate(args): if args.set_block_time is not None: max_blocks = 1 @@ -416,6 +451,7 @@ def do_generate(args): else: prefer_cli = None + poolid = get_poolid(args) prefer_poolid = get_prefer_poolid(args) @@ -449,8 +485,10 @@ def do_generate(args): now = time.time() gen.next_block_time(now, bestheader, (mined_blocks == 0)) + custom = custom_block_info(args, int(bestheader["height"]) + 1) + # ready to go? otherwise sleep and check for new block - if now < gen.action_time: + if custom is None and now < gen.action_time: sleep_for = min(gen.action_time - now, 60) if gen.mine_time < now: # someone else might have mined the block, @@ -469,45 +507,44 @@ def do_generate(args): logging.debug("Mining block delta=%s start=%s mine=%s", seconds_to_hms(gen.mine_time-bestheader["time"]), gen.mine_time, gen.is_mine) mined_blocks += 1 - done = False + + attempts = [] + if custom is not None: + if prefer_cli is not None: + attempts.append(("Preferred custom template", prefer_cli, prefer_poolid, custom)) + else: + attempts.append(("Custom template", args.bcli, poolid, custom)) if prefer_cli is not None: - # try gbt via preferred cli + attempts.append(("Preferred GBT template", prefer_cli, prefer_poolid, None)) + attempts.append(("GBT template", args.bcli, poolid, None)) + + done = False + for (attempt_name, attempt_cli, attempt_poolid, attempt_custom) in attempts: try: - tmpl = gen.gbt(prefer_cli, bci["bestblockhash"], now) + tmpl = gen.gbt(attempt_cli, bci["bestblockhash"], now) except: - logging.warning("Unable to obtain preferred GBT") + logging.warning(f"Unable to obtain {attempt_name}") tmpl = None - if tmpl is not None: - logging.debug("Preferred GBT template: %s", tmpl) - block = gen.mine(args.bcli, wallets, args.grind_cmd, tmpl, reward_spk, poolid=prefer_poolid) - if block is None: - logging.warning("Unable to mine preferred template") - else: - r = args.bcli("-stdin", "submitblock", input=block.serialize().hex().encode('utf8')) - if r is None or r == "": - done = True - else: - logging.warning("Unable to submit preferred block; %r" % (r,)) + if tmpl is None: continue - if not done: - # no preferred GBT or preferred GBT failed - tmpl = gen.gbt(args.bcli, bci["bestblockhash"], now) - if tmpl is None: - logging.warning("Unable to obtain GBT") - continue - - logging.debug("GBT template: %s", tmpl) - block = gen.mine(args.bcli, wallets, args.grind_cmd, tmpl, reward_spk, poolid=poolid) + if not gen.customize(attempt_cli, tmpl, reward_spk, attempt_poolid, attempt_custom): continue + + logging.debug(f"{attempt_name}: {tmpl}") + block = gen.mine(args.bcli, wallets, args.grind_cmd, tmpl, reward_spk, poolid=attempt_poolid) if block is None: - logging.error("Unable to mine template") - return 1 + logging.warning(f"Unable to mine {attempt_name}") + else: + r = args.bcli("-stdin", "submitblock", input=block.serialize().hex().encode('utf8')) + if r is not None and r != "": + logging.warning(f"Unable to submit {attempt_name}; {r}") + else: + done = True + break - # submit block - r = args.bcli("-stdin", "submitblock", input=block.serialize().hex().encode('utf8')) - if r is not None and r != "": - logging.warning("Unable to submit block; %r" % (r,)) - continue - done = True + if not done: + logging.warning("All attempts to mine block failed, sleeping 10s and retrying") + time.sleep(10) + continue # report bstr = "block" if gen.is_mine else "backup block" @@ -595,6 +632,7 @@ def main(): generate.add_argument("--max-interval", default=1800, type=int, help="Maximum interblock interval (seconds)") generate.add_argument("--wallets", default=None, type=str, help="Wallets used for signing, separated by commas") generate.add_argument("--nversion", default=None, type=str, help="Override block nVersion (specify as hex)") + generate.add_argument("--custom-block-dir", default=None, type=str, help="Directory with .json files to override template") calibrate = cmds.add_parser("calibrate", help="Calibrate difficulty") calibrate.set_defaults(fn=do_calibrate) diff --git a/test/functional/tool_signet_miner.py b/test/functional/tool_signet_miner.py index 008415855482..6f4d1df1455a 100755 --- a/test/functional/tool_signet_miner.py +++ b/test/functional/tool_signet_miner.py @@ -4,21 +4,122 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test signet miner tool""" +import json import os.path import subprocess import sys -import time -from test_framework.blocktools import DIFF_1_N_BITS +from test_framework.blocktools import COINBASE_MATURITY, DIFF_1_N_BITS from test_framework.key import ECKey from test_framework.script_util import key_to_p2wpkh_script from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal +from test_framework.wallet import MiniWallet from test_framework.wallet_util import bytes_to_wif CHALLENGE_PRIVATE_KEY = (42).to_bytes(32, 'big') +BLOCKS = [ +"00000020f61eee3b63a380a477a063af32b2bbc97c9ff9f01f2c4225e9739881080000004536770b16f3f4558570c862ab092f24314a93f653be4b9539a7f94268c96d42018f4d5fae77031e7560450001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e51000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022051821f642a35c9e5b563b5915d53af313f139e13475eb2816f362cfcaad0f7a80220130459719c5dd469c9c539bca9903500be1c36119a3462a9aa670fd80cae6ef2012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000000000000", +"00000020c42a9b64542d0993c7fb6a6730ce89db4020c0787b5b9832fbe8041ebe02000052b94ee912a64a24065ff133b03698b711c3dd5e5ff6f5e97a2b2d855cd443e6978f4d5fae77031e5a590d0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e52000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201e04af9eb8dff29e04e9b13e3ce520fcad2b315bf95b64dbb2b7030c7b8e0651022033ff756d923ad6623c035b15a60889850cf9abe97a0731a1baeb380e20f544d1012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000001000000", +"00000020d9ef5dfad12e2cd453eb158909949a8a1fa06964dbc9826f686195c337000000ff0700f9841ce61834c2404d63b815f42cf6b2dd7253d382ebd68f30c2dfb9162d904d5fae77031e8be73b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e53000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402204317310d08b463a6674e354075b701a88fd715b9c56e106aaa684c5af8b7493e02206e8fccce68ba9f412bcca9a6d85578bb9fc0dc1781610695671ed1558d49424c012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000002000000", +"00000020e52667d4804052691d64f3b9dfb48a9701eb789ee09940609d302a3fe2020000c2f977e1566e1fbe8dd119bcdcd4a7656fcae2ca1c552f3cdf9f72417cb41c82c3904d5fae77031e12244e0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e54000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220152df959674f2cc0b81ad0879aa0d01e2f82d50e9b61f0b21407bedb18cf2de902200b5071bdf4141d19ebd1bd50ebc76a7eb9ed2d03a975c179626a6baac0c6f3ab012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000003000000", +"0000002092671be69fee6a3d560cc4cb45cc463265b258614ae2d6e4de6941dd4300000075e98c36dee708863238797e647903bdc463f01e9e3b016176fa289740c2f20059914d5fae77031e3a239d0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e55000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022077229cb4f31c002a86db64e44ff3d31ebafd6e6837f7748f8ac8d5f91617865302206e15d14a505f783280fba4d65361f0eb205ed8de4e6d6d136536543ce05d9644012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000004000000", +"000000206030b37303a92470f48955c9d8e26dbb6d93c1d1e5f5898f413525c894020000b4e118ad53e3a0fdda4046659602285b86cbfda6f276b0283013cb238fcb2a97ef914d5fae77031e83bc6b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e56000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220035ba04f9d57d6ef36b061bc56d4d5609e84c344008c49ddc8dea90510683784022076cb3632b43f3a5a9fe9990bc84513cf2071246039cdb33cd61756c48479ac7a012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000005000000", +"000000200eecec2e397432d68f083e15d889763e22d45d459dde6879cccecac1080000005ac7e55de57fd7ff1e7107e55b418a3bd645b23039a534624258c3b4f7282f4f85924d5fae77031e3c64b30001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e57000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202e9d82d8b3229b23f844999e41a0d4cfbdd6ba0cfb7dd6406b47f9124fa0be6302200df588033d5810381ae8da71229e18f345d052540f1b6f283239a8df631c9e9b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000006000000", +"000000204f8827230a71f77db31dd5e08cd041fe02bc27b29ce1aa26386995bf52020000f02d8106587c208494b33525b160cb1fe5972b38ba724abd9d2c16eeacceae651b934d5fae77031e2692b70001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e58000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022023ea2d454bb9862ba48fd71be902f9ad40a0080f38f0c70c6280ec2c3def8a0602204616a502dcf80bc14d0d53ffa8ff4b14544e65d4ee803b4cdf25415338ce11b5012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000007000000", +"00000020d328b251f025b57b25cf0b1934104d1811fc1f7752638a3ba8e557fa42020000bb1ddc3202911ad6dfb94849f24f8ee9fec1028e798c855992efdae92965665db1934d5fae77031ee868ab0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e59000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220514c27886dece2cf1dfbebff9ac5ec74449e3b66f2379f1dd6143d0343172d250220324071e870e45e819fb8304c8f6bd341120f7de6907453bf967e5bd261ebf293012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000008000000", +"0000002073a9bc5b8816c665137a6e595f69179d0a1202b5b1a9b6bcb1f693720d0300002ec8a7a8163c1f39a6b07e5528e493433b72bd4727027135441cccd1c24479fd47944d5fae77031e8e36320001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e5a000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201611a8d98c3328c6f0378d4c9de0574370597ad9465ac376c0cd87f51757922502205ddbc3bc795b1a128a79f720dc59f737939ed02df7ce6aad6a22e1d069d42fce012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000009000000", +"00000020e686a3d5a2e97f5bd057c9710f27af9b516b045c7844b210803a7867e1000000e11a421ce9c0e01d3c02913b019baf33cd8c00a12c6637f20b497e2aebfbbf40dd944d5fae77031e6ecb530001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e5b000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402205fe845f5ca318223f770330f6513dacbac698d37a982cba0ccfb07b83d1999e202204305300f08e7b057a9e448f96896847218161b14ff2541a12bc2e0bd153318ac012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000000a000000", +"00000020662c85bd6d0a26aa39ea09217573e32e8c342045f22eb57e3e38683158020000accd2e593cd406e39ce26235ba636dd982683d19f8ac2f27211cebd55aa594e873954d5fae77031e26171b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e5c000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022058dcf34dc94bf37e595e5401977118bcba64ec5bd80b05b6a8195362570d36dd02203d82544dc1a1292efb7afc4a19019420b1991dab34418153f9aabea58a8fa0f7012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000000b000000", +"00000020072fb26f6ad518342f07ac3d3df68a63bd8397862f2d9f2306ff2d359e000000aecd19f04dc861550e3033c1052d8990d325c34814e51bf73494ca4e18cf762009964d5fae77031e0c13020001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e5d000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022051bc6a6e8559398002fa56efef118bfc3f4c00eefb326cda165fb968b1c93af9022036c892d6958a1ae07e73b0765508ec50a1497cdc7e43de9e6e3e00cce9051f62012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000000c000000", +"0000002022274623cd501c599762b0b807023878b024f3ec61a285df6858adf14b0300003763c72c24a46d8af84f04008e2aeba15385cd31dc9db0cdac0fd7ef47f82c489f964d5fae77031e093d010001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e5e000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220537e44a7005435bd587ec52de0240e5ea315957cf9f12a43f280cfd32aa356cd02205908754c373205dcf715b6ccf9fd9b66e044558cdcfb9407893719640d36980f012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000000d000000", +"00000020bf8f1925a9e5b7f7609018b937b2da4d1358356e6f3105226945fd165b020000e0dc964c21e2fb7f33f430bdc44573fa89aba561aa6317f149d19759d2b22fc635974d5fae77031eb94f380001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e5f000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202bf167f9b1d5f949fa6b2cbc100854f5c74c3502f3764b71d1b17779a6c60e6802203b6e4bdc67af7d7e05bb3c1ec5ad4cd842b4165bb1fef014ed2edb8e1be5db01012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000000e000000", +"000000205891165faf189cdd7cb3f9fe9c3c3fd4ca4f7bfade372a19dd2708de1203000071bfcc20ac64f5633960863b39b491f1ff9ee10d95da30d2eeddfe81f0fd472acb974d5fae77031e49fe220001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e60000b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402206c0c70062576ca11da8e501ac44762e7fc6bf26bbe0a9b6c87c8d850d1a46c3702205136b812a2e93317262acfa1fc6cf56981c5ba7842e197b28d96f64bda06f81e012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000000f000000", +"00000020a0392125b08eda0498f11a45e4807aefd8eb3f04b375c7f9e5553134b90100000eb4bd3708b76b66a7703ffecb3be83eb95ef818ea5ee0db38d9adf819a5dc4461984d5fae77031e29a29b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01110b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202c260829575eb1d7e088055c4645f185ae4f0bac67cd81c9b670e554dc3e15ca02204cb3c8f7e20bd16c0612976db99964dead033269a258d70b0a1bf80f98fd1609012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000010000000", +"0000002066b9d2dc5e6006a9feaad81b12525b975a6cb5fb2bbbfdccad957079900100001cc52b60894ed66ebfc7102cc60a367d2e0e611a37e963f2c9b859233a82199ff7984d5fae77031ec0f30a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01120b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402204492d01d2849ef096c814b572fd20aa807f6c03908c32e6fbb56140a47e62d3d02207125abce34f7487d5ca9874ccbb8090fd8a342812c37ac3b2956e942f705a274012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000011000000", +"000000204a8c4b85498665a83daac30871267f098b3641e3b1eaef3938f5d2ed46010000ce26e12d03934bfc8725105608cfe54db4092d1480b515672855e8ccb19901cf8d994d5fae77031e329f180001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01130b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220369a459bda6c33c558fb45a97fb1909164d1ab3023ce96c6e78e24928c07bf09022058b984220f216371e6685cd7074fd596b75bf177801057afd5f1d1963486ffb8012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000012000000", +"000000207cddc9e07aa618d58a748b5a33d16b281a0bff90fb2db526b8f58aeb1102000079edae4b0a7518f42f278e3de638151b6a998733ed7ff4f04ebc323461f30cbc239a4d5fae77031e10e1070101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01140b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022023dc35713e321ac053484c9a44416437a6e70a7ea20428158b472ea4832a63f3022035e2a46924d4a92cd24fff931a9deb5132ebdee513ca2022889e3da8025ba560012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000013000000", +"000000209f0b0a93c823229d41b1c6a83228e39a8b5c51e300efaba6f49643fa0f000000b31cec1925730a33fb63180c4e40e285275737831a090c05deaaa9356cac2387b99a4d5fae77031e7adbda0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01150b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402204b95915c58d0547adcf7b4972d96beb2fe14cbf653d1719492f770c17ae1d1d402202158b352dda0af77a95e33c0f16bd92ef9d501587af75300cbf2f2b9d09dbbd9012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000014000000", +"0000002011a6d11fbba8161a43676a2972e7d39791581d7b99a6fa2ab3f91ed123020000d27ea0e478c4e6ff37fde0cfd28c83da3c87cb6d918b973ca74829cc77ae61774f9b4d5fae77031ef955290001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01160b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402206b9217de34462007c39c79f22d37aa594ee0506a8f5762932848f9df866a9d0a0220701c7cb3005baf2dd18f5224929ed2078dbd85a6030a9615c95ff931151f73a4012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000015000000", +"0000002044302638ce8a6c343d05f228dcdae7debf93ba3cd60521a4f80072cea10000001f9d3d6cc325cb5428ddaeadbe552339dfeac53ac89f098a721c084ae98c398be59b4d5fae77031ee523130001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01170b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402205d44a872a513745d053e527010b3c5b81c50e42d1c53906d4a79447ee4aaff0102205501872417dc0b4adc79ef582e794115c3bc5b8d2e4b28e36843e05cdde85e27012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000016000000", +"00000020328e7b117ca50915a7554517ccba207e3eddc53dc8be2be230f089ab2c0200001bf5fa3e5c6880ff6245661189e1cfbc67d401f78e18bc0bc7011ecaca29c0557b9c4d5fae77031eb793500001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01180b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402207c35a0350c363acc4f09445ccd5c96968d2983b923647b0b951b06ff0177e2ce02201858f3b96f9fdf582fd5d9eb07b4f6da5651f6639be51722e5678f13161016ad012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000017000000", +"000000209dd4424eb821492d6772151e5f2ce58dad04a219792ec783ecd55f5462010000567be044846ae4c16066943f2b48853d200a3d639015d1882597964a63d4df1e119d4d5fae77031e00c77f0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01190b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022073ecd20b8f6ce45b51298fa0e3ad14c1f8e4dfe86ee991e99639a66cfa5eaa5f022032ef77d4e47fe40c90c24543f852e9e9b07d4a3fe3e6540d2b59b9212b0f3e66012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000018000000", +"0000002056d688cb222710f170750d89cc5ada3206f381a41a201397b8d37b4ff800000003920777957751039e52b70e9c73e4e42855a01eb9b0e663ea6a5b716c16dc70a79d4d5fae77031eb9a0160001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e011a0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022004f633707770f83d5b74674789af57b0a7b4204583221a751f6198ce065734440220380f4a075473c03edcf47c2999d194a2719545974514fbfeba886d6959af10c5012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000019000000", +"0000002043ff1997f4b62589925ec70c40f89b1f1925201b67d3d50c9abaf0fb05020000f642da8880c60d3e9e5ce1422875210f77b05bfbfd4fae4b0eb784d41cb6f8fc3d9e4d5fae77031e01661a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e011b0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022060bc9ced9dc1fca3ac28fa26cf331affa008cb5f7a1cad55587fe93586dad9440220547f133d8e7fc87b96e2cbbdffa3723906390dd75ecbc0f7b844d625c3731972012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000001a000000", +"0000002019a369c105543c25ef25eb0a7260c486a4c89f11c08c358927c5e9ad710200005a792cc8460d3fa10b8584df3ebaafd5fcb5fdba84abf65592546b067520bde9d39e4d5fae77031efec43f0101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e011c0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402206eedb68ab0fd2ce2972affc21cb6cf7958c66fb3d0b39724735a36ff810a78100220337a5d5c5346168b76fdc52d73f47f771a1916395132996ad0c7af520392354e012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000001b000000", +"00000020e4992754abe02b72e088a006f60d232f9a9aaa77b3c7af2ab702873e2a0000002e8102c80903a5ad2d22dde4b4f71afd5da985e63fad7655da68ee6b648d8203699f4d5fae77031e912f4e0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e011d0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220614403543e13d1a9994e5efdcaab8f23ad8c39cd5e0c0cfd06de0c33baa1c00502206c74f45cda65813f7b32f69c3ef7e37bd57e6ad3f6f8135f3a9a497e4a842b04012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000001c000000", +"00000020e1d8b9d2221c0bd893839d47dea1c952d96963e5ef23389387c32cd08a02000074f763bf88c92744c56a5d307152f629a7916a183717640cf9815b75b2fac9d4ff9f4d5fae77031e4fea530001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e011e0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201dbf3df0b37618bda355f8096c1ccc42a596cafd7b29396af27c92ec04a69e0f02207b740f3161d8082da6dbf766cb38fdf19d930a593024c4228e4a61230aaf8de6012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000001d000000", +"0000002021a14eb8cd14df8915a0228ef64a6941680db2402a53c28b23254f9ac9020000718c991519ce6e4fa6faf06338fabd4737778617bbd73adf187dd9d0f221a1a095a04d5fae77031e5abf370001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e011f0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201fd21f807fe6a62e4d3d058f07e33a4062a2df2a5710d12b3c62c637a9e5db29022023a93f81b231cb0ba304a5c842129f57563162d8a91847d1ba13b1ddef7e86c2012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000001e000000", +"00000020647d0a4a85cc051621cc6017974f405688293e9d7eb058336680e4c7020000007b67924b7a9da00775e9331a63ca95fbfadb5b6797e4b76e2d369f58f4cfb2402ba14d5fae77031e40fb3a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01200b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220282af9389f9fbd3bddf6654bb24616cc10331fcc9f128029c7fd2e75e7d587130220510aa77369700ea304417219df0419b18a291094791fba3e27d5b15293a047a3012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000001f000000", +"000000202927544010b23663cdd561c269f0e60fcc2f9c6dd6311e4385303bd83802000026674cc561c95e892aebde3bd5b7387381d708b9ecc03651dc8cf079ba78e7aac1a14d5fae77031e4f84650001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01210b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220793fc81906c73eb7d0308f0a0236ffc994c9997e05d37e69d62388e6c4c88de5022006da84169f1fb4374bbb0fa466b28d0735904a4456be10101be396bfad0ffa17012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000020000000", +"000000209b0d0bcae7f324a2bb35f40d96addfa8388aa8c6409768a6a72064216e0200001f2b44fdac8735cec0cf5a837192cff57265cce43bfd16b81537103f7d220aca57a24d5fae77031e2215090001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01220b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022068132dd6a753b51ee6dd54d45967ccd6cb80c944f19eca46198d13db6b2229cb02201eeb9dd7de9d43362a2b7abb2aa096892205bd2f30bef5dbabbd3b884e5c0647012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000021000000", +"00000020d26ed1df55b9c6da9c00a72a0ef94e1425b9650b258a8362012ceb166e02000009c7e5becd4b0b93f15b42dfe39121d0994a789749d69f1512dd3ae97e498bc4eda24d5fae77031ec20a0b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01230b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220386168f74f5a0d239561aefcbfe1ece13d5adf624596636649779f04adc11ecd02200bcdc8c6bf39ab6601b6491ca0c53cf0d6ee671777ff353becda2258eb15ef97012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000022000000", +"000000200f959e930915e7694ec71ef58bc003d0d8912f51f4cca53e2c07a448700200000e66c45851a37f4875d975cdd957fac4e424dd9a543b31077a78a4c35b8e123983a34d5fae77031ea3cd480001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01240b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402200c0211f2c1bb98bf3f9ada4c3d1b064d0deb5cdfe515bc6e138c670d1d6f50a70220096b7e57b05a53e1d8eadcdbc9462952b173e7b020d0b32c794b25a778edb33b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000023000000", +"00000020852967ec8d1fc2b7350b473a70033c96fe934e51a6bdcdea39113e0d5c020000d5ba346c7ea94dac0b35473d502bf6cfc9c24c06da0988509187a9c9e0fe741619a44d5fae77031ee6cacf0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01250b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022050fb1aca5cfb77c812c1de0430700234d186ebf39cdcde4991acdf9c85a211fc0220242e271780331f7875f7c0d2d34667f0677cfc3980e22392db3d49d3955a2df1012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000024000000", +"00000020a0e79165bf3954aa52c652731e09c20eb18a60e97071e84182ddb55471010000a129d870ae352787b6890d6932f569f0680c6d7b5e21b3bdc936bc5c1605b270afa44d5fae77031ee6370b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01260b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022066a4e79dbef8a80d57bdac83e5f89ab2064f50c8e9049dbe46fc3bacb60116fa0220433d64ebb17856515d0467bb39fff7fff869e49a4b0e3b991959c9fda915caec012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000025000000", +"000000209b904ca5849ebb73c021eb69d39a173af181874439828ea76ede8cf73100000051a88e0e1409121af3cf0a33a8f05c7d7ffe1941d51f2d2008e203c18d210b2f45a54d5fae77031e0a45030001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01270b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402204593dc638f2b55269aa46423bb32da09938c97645be808b59afef0c2ffd469f2022055648ee41fdf8a266347c5dd15ad2246af873139695df21329598d6806c66601012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000026000000", +"00000020222da5f3be9ba3359eec17d97f2dce7bf3bb5603da2e4173d335a010610000002601fd5c425b882ac07fa29f1160767773f067a8d450af6418577e15900d5a71dba54d5fae77031eb62f1a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01280b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022063cf059d805c66dc5a5cf56300b710df5617328417c3f6887bde2ff2bbca96be02206011b71ef45dc6d72bac7a791c41fc052529c6367bd25aacfc49f819a96552ab012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000027000000", +"000000200bf40a03f0c7059590045b7c2272b4e54e3ad781b9fbca09d5e0947189010000e576f21995fa28e6b80d782f91223f5589a00c3839efdd89a011a0556a20208271a64d5fae77031e1935010001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01290b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201283a920b9eaac80b7c2e5e707794b6803336451dce6d461e1abe8dcccbea6370220091aecc8bea5e1d54d6ad4d4903c9b7979adaf855b29997812d8903360bf0e3f012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000028000000", +"00000020d15bd7eff8ef229035bf9cf96f174792d04e0c61850bcef31d09492df5000000f5a509b72beaab64cc0152236bfacb28ce0efa3f78a8782c9634d1ab55455fb307a74d5fae77031e02b73a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e012a0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402203cfab2b12c7a589602fa12fc7a9ae58f2322412aa829ae7d5506b5d058b2f2f4022047d0e3888486727233761b8a9c2d73d61b2cfa4b51ec2c672094c169fe2cac9a012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000029000000", +"00000020ae682bff8b59bf2eb3057473c9bf34f318f8fe533df5e40a18e6f133600300006b74a4edce5ffce4c785d831c6d79c9501efacbe8d3563691aaf3cead81a6d589da74d5fae77031e0d011e0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e012b0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022062d91c98dad3f6f7ab60e3c38aafc47e68502ff95323d5b8883b5dfe52155ca40220480933a02e98b0f31f00822e468e01aba46d68d51901d25f7507094b4f5c3eec012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000002a000000", +"0000002060e24ef51ebfd78f9fbd4aa069b6110ee3376a7e8605d30ad2be9ff25c010000e79535b1516bd61fea5b4420a98eacc5ab48a2c9b9a01f1ac1f2ffa13c26d0ea33a84d5fae77031e02287c0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e012c0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022022909afaa7aa5411a6f0605e97a2dd53c4b8935ce4d44e89e3f8da71b3915f2102203eb645c558ffb7e8d756d56006c71a9c91e023642159ce2fcda88ba2bf69fc66012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000002b000000", +"0000002094c049e19fedb61aa58098b896f587ea9f04bb2e7abbcb187823192af10200004152be236267de4ae83d22b7e70f1409f1c64a4e6f1ff071d2b37d893a7209eac9a84d5fae77031e82ca310001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e012d0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022048f601e33ccb17991f520a1b33b03d3a45a0937b742a0c11ca69a65ee5be987102206f678d456b88071eae99cdb92e523ddaa9ea944774ff8e2c704dca4e294962a5012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000002c000000", +"000000203a468ea4f40e6e8711b361bff216db1bcdb5820c9101d64abbaf251c21010000b6389844e36812bca20f7853bfd48089d2f765981a38a0c3889a88d77d9185f65fa94d5fae77031ee1ed120001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e012e0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202df6d3b7e43601f508686a190488ccdbbb34139bc7b6221a229055bc536f59c302202ef1f28f3fc3c83a24c37ca2c4e6b2830189600594161bfe4338e64692b24b39012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000002d000000", +"00000020acaf07fd147fbceeed03123e205d889be6c6498e541fb46fcb43a2953f000000ad83c771b0e026dfbb3afd860edb6cb031c0ca27c25103b556458fc2054c054cf5a94d5fae77031ef013930001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e012f0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022007a6053b87d98ac5d701f6a87141258725f184cfe82661891c50774f4fcf74ae02206b4d7812ae50b8fad7bed95a811b4a93beb6ffec65aa820d281b3ba410692b7d012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000002e000000", +"00000020fc7ecc11e283c0bc5a2395f1762f8a696a707d4491b98b40165b6530a001000027995b3dfadb7385b8ae6c2b8a410fca02f61a15280315ddce3c37d2fa8e0ce68baa4d5fae77031e37a5360001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01300b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022044db934817fb02272a4f14b55e9d856dfb757a06652da85c56125afdd24ac7200220344caf973dfdda65e6e66f6252c82794d1abe76489dafc6d293d316d3448815b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000002f000000", +"000000200a6252b6bae14224fbcc347464faf244564e77e7de55daf91c864a94280000009acd4c89f1f14c5fba950672d22da150d58ddad1c521ec1566c50c89c0c6d76621ab4d5fae77031e14f4050001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01310b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220088ade4281c133c66d2dbf898ab73e8dd8cc2d200abbe60f390504af54a5231502203f7d0e5b1b41172477691830647f03e6c35f58079731d3086849e81b5573ddf0012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000030000000", +"00000020d2ba963889377760ab9caeec8011993e97a67d5738fd6ac01ae16b7cb7010000f9605e4d331940c7f6c6e08fbe20d831f4ad8007585082e6499f0b7e70518ea6b7ab4d5fae77031e9b4cea0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01320b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402200906c0a7d5ecee05cec95aa811ca99a176a7fd520ceb0eda01caebd723a57d48022037c96b2872b3edccad88d0faf621f9556ec22a287cdec47de7bca957c5285389012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000031000000", +"000000204aa55234a7e8e680c8de773df0725bc8055876ed642bd2321c2abd6d4802000091bdde72fc1bd8b83c7282e95f7c6781c702249a8bac961eeb5b4261c55cd3604dac4d5fae77031ecf1f030001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01330b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022076c9f9cf29eab19a8e64c2dca7c37ef81cb9827fd20e8fe32087b759f08729540220138072794a50846bd3e81d6904ee2a6a871a505ed3c498636dfa1fbebe0312b7012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000032000000", +"00000020da4f66687895d2b350b71b7e3ccbc693ab32bfb226204e0797841ced73010000924c03f7e0ffa51123dae3c0645bfe7cf9a3b908572a5196dcffb9264f8eb04be3ac4d5fae77031e2d21010001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01340b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402200388c485d431883cddf183541b5322ee8f3c008e50aec58512152a1f0888aa260220498ad4d5b3a64382b96c8892bce629771b20a09eb352bf8db1c95d3beba0d177012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000033000000", +"0000002032aedfe1df3825789dc09193aed47ec3ec5f9ffaa1aed0f5a4afb444eb010000db0f7bdd5e946c2427c0c9a4c035e16a9096dd2b15d3c586d607e7b967b5109c79ad4d5fae77031eb7988a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01350b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022045ea6eb44596d5c50f05e3eb04509fd13d261a8e543e1deff690fe3f468728520220240c4b18eaef58a9a33d559f0744324f256d1f892eb230040b080e2f253cea0b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000034000000", +"0000002085569bf23468bb02564f4ed20c677df825eadc226b0e327029d39ef478000000f845ffa191e84f0ffee555fb482357f4c364c760744bfc6496c04d7adde736630fae4d5fae77031e3093440001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01360b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220562f6ed49d84f863300563ab85356d043c678f89e2e9213fd9bdc5506fa41c3402206056c6f8d085d40718d93957ef86ad90bb0acca80c402da5d72ea1c8d9b11cb5012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000035000000", +"000000203c771dd8055dce582270f604f61175b54e3c18bef5061529a2b72df5e1000000d6b178c734050ce4851836e2c590ce6fa1667eef12f58e3c702a4fbcc449803da5ae4d5fae77031eb11b880001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01370b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220711f601f13f66b5841161708158dd53c1ff0506ef33ce8a5df342de2a5d57c0d02205608f30e01137ea1558cbeb46bdab0bc0686e7069d43a9be15f30f6be0706b51012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000036000000", +"000000206e76af771500e4c85ab9b8bd14b13b582c82ecb3739188fa3d4ec1d328010000dff8a18073e9a1dcdad35bc53926af8940225198beaf377afd2ae1aeb2f4203f3baf4d5fae77031e43d4270001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01380b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022006a6f07d51acaf89005d9e519d1196e24ef9ccf55fde81a33c8228ffbde29c1a02201cd4751a28e818809cf0ad669d9e6d6c588039369132910a0b49d7b59dec33ba012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000037000000", +"000000203024f1ad95afb6cb96496f9555549c70a913b18121507f367a63c1551d0100006fdfc4992c3f47306d5b5279b7bf94163908c51d7aeee420ace4f500a301344cd1af4d5fae77031ef7e5110001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01390b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202313e15e9417caba95c44d4d1f91087b47d62c2a05a5fbfc4e90d8371fa62f7a022043ccd107783a2ce2eb2299e1235f68d736012d0b2653d795fd7ed0e1345328ee012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000038000000", +"00000020bb09bd15f56d5cf11f74bd73523fcebe042d38e1db4e53d17a86ef3b520300000424d3d2d008503092390004bb4afaeb0a04d436fc81067a497cd8a67f7d934167b04d5fae77031e1da8310001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e013a0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202f56cf137ebd65df8abfd7239fe74000eb4cd12d330d3059c3820ee3d44b3e7e0220258e77430c94559c84ca545a7e5673373acc0bf1f62c27b75688d07c1de8760b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000039000000", +"00000020e6d5569b175c1ec6643646e752e0db6000f9418caf135ebff0932e174300000092e4bf57143bbc5cb5747bb2aa04f308e46839de5dbde9b8314f37f02bc46ec4fdb04d5fae77031eec491f0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e013b0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402205110700da6713d364405147a21c7f67ad93864e30310ad41438fa389ef8c183c022009110f9c3cff326a1161d2457111acbd5e8ae3c76784636ec00ee5db2203a98b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000003a000000", +"00000020047e0bd2046916c36fe59b48e90cecb6c81cbad13446420e6712a3658f0100001e3aa6ab5f947fdeeea3c191a32750fbdc69c789dbab4833decbc9e1fbf4f53c93b14d5fae77031e1104730001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e013c0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220096e576545496115b48155d6b6fdafc7c2d327c78b8d32bb78cebf09bf3fbba90220084c554dec3ad3486882c119e05074d9d30ee361a4198c4fc5c25926b25ff20d012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000003b000000", +"00000020a1092eed19004ed3f62bf0d8d17e0471b6435087f2371a3970e1f0a29c000000d5b0fd1b0ffd3a31a2acf2df5c6505798ea47ad066d05eb56cb0883794c1684629b24d5fae77031e459f9e0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e013d0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402205a996c66953f73782de527790e7bb366de5df4114e8825cf557241b6d33fa834022034369acbee6aa90501d2327f7e6e5b853212148e6c2ec760031e40902ba52a04012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000003c000000", +"0000002080d0984db9f555b0ef4a001ebb73c9d9d2c8f9041423498900815f2ae2020000c81fec927b3959bbd826b8477ab2ea59a622b4d93bd4139a33d24c0b9ff58d9abfb24d5fae77031e53cc0d0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e013e0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201779b0b6fa6e34b53e3a914ebf51982ec697a469b39b0e0465817f47c67cb24b02207a06c34d80a07111f1d21705c498954c02b267d9e4151b082d23a34090504f1c012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000003d000000", +"0000002032f591ae5291d6739b4d77d502984baa35dae93584a9a2d64d3673a9c601000030148dec90cae87ba12971bb7294589c60ba97ab3581190758615a88e19b511455b34d5fae77031e5c4a100001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e013f0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402205897005c0bebcacfe912ef1d16179e123cc4dd3a24b9ca7a23975ae389726800022053ede10b5afe7a1e3782b5fc9428e85c4a6e5fbe965689e483a04a9093ce43b6012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000003e000000", +"00000020e45d7a86d72c14e25327aa924ece1261f8f8f2cafd862927a88a28070e0300002906e95fb25b085f0479637f7f012c67a43de5028adc14b1938f1ed4079b1d08ebb34d5fae77031ebb38530001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01400b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022055be5b4d6b465c6a320a3326891519ee3f351633c4dd25084f0fe69839f86fa1022060636177f7d49f7a66d43f60d745eb738cc06f3241281d8db32d4383db2278fc012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000003f000000", +"000000204443a74bc4f7c280fa24ac90baabcca4d314f1dcd92da296b30da0d4650000007970f5ce61311411466dfd9780879ff8297311a2ee325c6c84aa83ba484391e781b44d5fae77031e68fb500001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01410b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220455a3c82879518279108b082e96b3530f8f6906cfdac63455b90171bf9c9183502202f40a4eb5f75fb72f361de6fa3929d4bfd21a394b667ba09252ea014566234f4012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000040000000", +"00000020874c80a23717801da1492d924f7a6bca891d30690b50b74ae2a288b53902000036258b69db1b57851878781c9eb5b67446080b46d2501cb29c2a00f3edbeae4a17b54d5fae77031e47ea570001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01420b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022031cf89491b9e93c7a5a2ccbfd0f47f88733ccb82bf48a90f4000e20610855a1f02207744955dcc524a497771b881bcd0550ae7c9fd330e927b6e5d1e1985639c6fbc012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000041000000", +"00000020dc637de54d14ea63d38a5518b48b536bc58cc6b99f88a51938d850fa96010000de1b3444ee2b6b73cd05ec1e3ec1711e33ff9e866da01b916dfff1a4c2e5f862adb54d5fae77031ea6db280001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01430b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220339186740c3712f69d9a0adb09f9802b3d817bbdd0780f72015c047cdf3c97b802202de643e11081a76e199ec7050dc28035c5202abe8fa39f408094fa96c7c42dee012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000042000000", +"000000200f50bd8775728634ea677e2af9c7f7da800eae5e6f14f6f22eea342179020000309c20e8216fc5ca5a0990ea909eb308605125078f5ba11060e2a0011c037d4043b64d5fae77031ec6390e0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01440b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402207373531cd9696ed3d9251f0cc66a05391652386679a213f78b708d692dccc96f0220193e05c39fd8ae72521e45ca8eb80f5614fc798e3b660d6df70319ca99767f0e012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000043000000", +"00000020aacd26ba7fafb9ceb443f14016fd4a22b1b834c5914f2a8b182966262302000036e204284f942b2ac608526f53205d912a48f38012e6b6dbf144506d6ddea1e1d9b64d5fae77031e91d9060001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01450b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402204e4f8fdc4ffee6c7e7f990667df8fd04ecf47c10e4772f81479dbbea1f9621c402202945107bddbebcf61256c616b56ceb50e59268c0efbab6bcc9fb9f34b7e86ff8012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000044000000", +"0000002065d1dbf2528f5886d824af827275649f1533b1da6ac254192c41c3f2d000000088685350a4bc6c3995e2da8988416c33a4b8fcb35e221fab6d251311a5b462f66fb74d5fae77031e1c644c0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01460b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402203db9557d3eb6f4b1f7eff4ff5b33ea2ec86813c0259145f4dd8b45934a72b6e102207b30371e9909b790d17b265ebd29be21dfa9b2b1a9fa929f3507a404456e2561012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000045000000", +"00000020f837e3b2629a43d4e71f5c7cf6067f5420c0a2325b5be7d12b3c913b19020000d63fa2a506bdd34a2b678ebd409f3e7e63c6914e3886b3f4496ea1b8e0eb847705b84d5fae77031ebeda820001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01470b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402205d0caaaea1374a50795cc8f7e60d86951391100d4544e5bc024cec65dfee530202203df35a6a59dda8f513e5b3201eb3813c540180913b2e223cfbe28dcfbd3bf348012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000046000000", +"000000203988bb0a25778a86088edd345fa39fd5e13559b610743befb815b733fe01000026334bf3327003bcf62fc53ed9d32a6098904f5b9cdf5a7714bae027d49e80459bb84d5fae77031ec453bb0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01480b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220195b49ca5e84dcd6161b8938e68c5dc9aaa59c868d7826e95edb0c827f55956202201bee06fa28d81b1708a8f5da3433071fed7973c4afc0973866d87dd464c44d7f012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000047000000", +"0000002027343376fbe3fe4d860cd75dd2b770d925e525799c2f8869ff6b6a243b020000bb78177aac18398ac864969e8ca2d89d849aa8cccf01c8f3b89eb83b296c139631b94d5fae77031e7a413b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01490b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022049b2d6a3023c0000b3f5573127c70170a95fbf65f961ce9bbe7c2a70a5135ab302205e8a44881391eb6e55d0eb0a57c4ad1f61a7c6da730cd95f4b7c2c9e767078ce012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000048000000", +"00000020719df2521fea87e4cc207168fc82aaae52ca4fd1bf1fc5229ecf6db9910100008f7f70964d5912190fc270203a6ea824c66dc2c81bb75705e8fa6b3de8bbc5fbc7b94d5fae77031eb200400001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e014a0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022029106ff3cc1d88c4d00dc3fec2d3cdd314525fd2405896fec8f54fc5a828168302200b60fdb896dd8ab5e9db9bb935e86e9bbe853ae2c41eed2a65fbd2a73570ff09012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000049000000", +"000000204afa38dab515efb027085060eb2121e810665d39df0cca945b4c9608b5000000d76af3bef0cf5eddf6e3edd7af3790bcf29b94b93b80bab0fc58034379bbfd235dba4d5fae77031ef27c2a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e014b0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022027bf8ad10b124464fc45da06b2a250f65c7438e3ba4eb80aa4d3397921cd831e02206185c6b9eae5af32bafcacb74d7c5a5de77a389fa799e00e829e84d1daf17552012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000004a000000", +"0000002059575072741496b17ada0c785c97bdae70246fc6000a9f53fa3b55b5fc02000055e5f5898e24662de2c92534c36d954e1649436ce7471c30c48de8e66fb024d9f3ba4d5fae77031e0db30f0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e014c0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022062ca3b8b6dd0a6f10f06d33e44433fe4b2b0e0c0143897f03ec1dd8fd39d7d810220682ff6fc57598f9d97b4dd5917dcf939d3634c4f046db5c85aed820085e548ea012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000004b000000", +"000000202e9fbacf463581bd2f0cdb259c2ba943c83db2805f1d43e3f3519fea300100006dbc54d4a8d201ba15fa5f860cc89a1012d07d2d9ea70056d10a2a3d4aee9b8d89bb4d5fae77031e8424010001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e014d0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022050052b205e696700d8cb50192f2f4194c83ea2dd37ba8aecf6c4739c72183c230220222883df803bd2129cc135204e32e4fd2203a43f06053a85937f129f062a81b1012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000004c000000", +"000000200f456b70746c7279793bbe1069481c8d7e0202af09d32cef50d8951dc202000061812f05c88c648b1f5de54fe24cf264f1565ca7d9261759b51b14ea3a9eb3031fbc4d5fae77031eb40b070001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e014e0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220781f2d87041a807050023cef7cbcfed4edf282f43f333f4084b4d18dd84a146302204115a9db620f8755a4c550dd569fd400e5c1cc8225f1f8dc34f7e14c56c2c409012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000004d000000", +"000000202a5f90ab26673a0bbd2e56e4db227455e6006058a4c94685ada3f585f201000022d577cd7fe00f26cec99629405338beb78f07326b73b33c94fc609924a0e428b5bc4d5fae77031e428ceb0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e014f0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022017a939a4e51a208fbb976c13e59a95683a58e164968e95d5443cca691323844a0220509ce9a4487430828c36f323c514f67e3932a62442d75dc9ec39de5dc1e41d0b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000004e000000", +"000000206b44858d8192d55eeba4bf8e76ae0bb84188dd86988d3ade0a85142235020000f88dd0b98e995334bf78c17d9652b1cd2e79073b60daf27ba6b20dfa7abc85704bbd4d5fae77031e2f1a2e0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01500b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022041a143ed6625aa91253614ad1dd26d471ce0d79ef3074e4b27f03ee4242d3b5c022007c9d3d3d3e36f035f1c968ed7ce1329221b99059e8cb7be01bfbfbc3d7e00c0012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000004f000000", +"0000002021a0e42ed90ede2e5a0691cb990a2bb3c30864cc8799c30e818021fa690200008094e94b34b09568d8bb971df78f8ef28856f09939013565e867247bdc177833e1bd4d5fae77031ec1aabf0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01510b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201bf0d9a0816d74653bbf3647ff1b5efaf01bc90f964c4cce0f75750272db1a680220291b63d76daffde6a2a2e08630af5423f2745ee86a919b214317930fc2746fc6012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000050000000", +"0000002014a706a084a314b7202fc8796fe6326e099726a439026165a733e0a6320200009c9dd885f63f358c6a168c082fd5afbb1da91e82458fd0a0ba1d7d860103469a77be4d5fae77031eed69580001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01520b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022070c3f50b013615a82fa5e3b8838b4eac97fafe74aa44b896136fa64173be61b202201d6ae34ac2d600a13d86c6aff63986030d5bc5736f571173965baa514f9ad391012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000051000000", +"00000020db1b8ba701a8a295f3a3f59853bff58bcb4babe41d41c1f94d9e8fae7d010000e61eb6320728dc911379f4d708fe24492ba6d4d622fe2a9443cc4b5f4b4fbc660dbf4d5fae77031e5e6a830001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01530b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202fa5db0c205a78d4eec41b492de72d22b808b3977d426cb0923cfbe45baf1e0c022035444dd96d40c2f17b026a720fdbcef5e66b56d99d432201591231777be94c55012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000052000000", +"0000002084ba3b27fd4997d7bcf5d3b6f6438c7589cefee9ceb68decb6c442bae0000000755a74bb4792f681c5b90037035b1f2041eb91d7fc1488d2426ef65ba5b81b56a3bf4d5fae77031e37f2520001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01540b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220527da6e9c1346d662b2112f82041a56a66d5364564afccfa01a877e3ebe9f30402206ef9d72e1d23d01aec3498518bb90dc6bfde8746cf94456fa9978775e29b132f012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000053000000", +"00000020baac347cf88b75ae5c8992b26f7373debd95381dbb50115410e3bf2f5f02000096d1628430ca081c9287e96509a7afe4ab06db205a7a66189aece2bb6f2d4d7b39c04d5fae77031efda3f40001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01550b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402206b9c81b95aebc2c30f9e499329a05aec9ab2dcd55a2878c776268100790e1a3f022069faac2f2de5512dd97eb79368eb36c05cbb1f5ab1fc0ba987940f0f08fdd309012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000054000000", +"000000206a70a94df8e843c59dec3b02f6f8b6147d049249ff035dc354db74395700000039e187eeac902d4bd856fdc6a8af5f72d5b2de2b7355663c7ccebb7ebbf822dacfc04d5fae77031ee9f8160001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01560b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220213779f64fe78fbbcfeed5bb846089808f2262e62bfe400a743a20fc9d8d8d5a022002f12c94f4649a8735d66db02550b0d249832722c7550d24c95f4b69b7e79725012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000055000000", +"00000020bcf4aa079b18226ed1f4dc9c1664c79b22a84b09d6eaf1bbb449287da1010000c1aaaf5984d1b6e568e2a6b4c6cd470d870b60afe73da33b0f7c7b0d788dac9565c14d5fae77031e32ca470001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01570b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220427688d86ae94b5dc11cb3512717e4e7996b8f831d9d618da77e5c450b50f57c022015b958cc1ac7aec584ccfacac0f43a91c7886ec8e9abcad072a22ac43eec3c34012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000056000000", +"00000020b7cd33f653e37425bc0ba9fe0aab90f7d45dad6c3ba185db08fa11732f0300002a57164653e821b2b7df6c170bb2b103cf44177b1ab4d25bd102346c38b794bffbc14d5fae77031e1f39190001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01580b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201742d85204d607b8ea4dac7a94906fd49e8d4ba3b70057e6f165672b3062d6490220168fc90fddef23b1851f68de0b923493de3d2bb9f43a964555c8583e0891a3c2012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000057000000", +"00000020d1a85ce9e8b54969bda7ed5701ffe1ba6c2a568cbccee7f8f70a690a32030000efde10e45d13e3aef9dd41bbde150c44422b01ea75d576770b1bdcc13d6c6c5091c24d5fae77031ed7b72a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01590b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402203300f8d98c27be28dca149b0050cf657807805793e277c669930b77d9e41fe9b02202bff0369c48e56635dd5cff6ffbcd99e2b137f263c544150dd2e1060a900b7cc012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000058000000", +"00000020c93e1a4277faf551b8e45e1658169553615bab3898a90b3a801c2a4b88010000f3ae523757b97bf175e29fdc9e0eeefd239a0e674530995a76a7ce1b2e6ab0bb27c34d5fae77031eddc51f0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e015a0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402200b95c3e7c5a19c325b152aa849fca15704a1672cadbd05532c4629e6b09e43bc02207c119f30b1c6c8aef1674589797f99219188310b949be3ed1315110490bd2436012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000059000000", +"00000020ea8607ee4ad223ee5c845cba4a8b27eac8ead8fae799ce47ee5989c1cc000000c0e92162715c6f103265a88b240fb73b067e8a80af409e7a7753869be7c78137bdc34d5fae77031eb2a8410001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e015b0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220329b6dae56a5d5d8ae2a731699350f0fc6bd681412357bb770707922cca17e5f02201402508640925b878259631f0e638fa2ea21c14b6c6bfe88f2be18033e2aec43012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000005a000000", +"000000204e41cbe5d3d44520a5b0ab586481bd884ac39f273f5e97f67a50a25ba1020000f1014b779e032021dc9e0d7ef43b17f636b84f568492cc8e5aa7e84ebfd7b81c53c44d5fae77031e6c9f200001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e015c0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022075d2fcacf3c8748098843b44ffb6f7adb29234e979924e9998aa43cebfcfea460220566e16cbd320b66d61da078542b1eed142a81ec039cb664ecf084df1af7b85f4012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000005b000000", +"000000205e14d049c95c614c2fd1e8058a4b8b177108db99c597ed9727e36f0b5903000033cbd0aec2d244addfbbf20be6991e4133af61a43af51915c2b56624acf351a1e9c44d5fae77031ee07c1a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e015d0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022052ff250d02f3a9e358c55f2b63ca4acfa5d2c0dff3ca7b6b54ecead6fe802443022033833ff37fce4e4bc9fd2d3005a68e80a9caece2fd4c246cf625621c1c50822f012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000005c000000", +"000000200b7a1531c18b0342a6a549a377391ee63afeb73c82ea6c398ca0205e280200007fd9b2b891596e38f15027b381b559eb0af64038bc1b0458243f74a56b40e41b7fc54d5fae77031e72994a0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e015e0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa20002473044022064bed7ae4eeaec6c71249c34db4fcdfebec4b23be39605eb4a1a1a457530e2a302201dff76c1dac0f8d80ef87a7089eee4254ab2e14508bd74311270f4cf88452008012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000005d000000", +"00000020219d1716c18171aa4f9ae92c1a7bf177ea0199df77c49ead2ab4a47f6a000000be00c48afbc5cf0d8b4544337dea0000673b4f9351a654eaf110da3f4ed4d49915c64d5fae77031e2f18020001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e015f0b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402204aa01dfa5b29bcb6a38ca8bf81def096c1ad2e5d3204943aeb956d6beea7777b02205fcbee2dc53e440e340fa65d19a7c088878bd5f0013bfbc345d756c6319984bd012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000005e000000", +"0000002045e5cee1669a8c96d9d051cc6325bd9b1860ada6b8128184a281b6d7c001000012cc1f574ef98a73d97bf245b84394c3584b460a71d99e23595fb4ad89f3227eabc64d5fae77031eafd36f0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01600b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402201cc378332ec04c4ac47535c9f400fc1276fca6733de48e75d6e33959612f8a2c0220103be57c6203fb8a4aa6ef564a1308e453cf1b1e843bb9122ffbd0dd44ac2d2f012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af012000000000000000000000000000000000000000000000000000000000000000005f000000", +"00000020dadabf0f4f442b56d7f91703dd232b7de70a0671df481f78495fe5de94000000a23a843f6d97d8fa02d7f2390df4a00488085f30fcbab090a3f7ae269cf8fa4041c74d5fae77031e7a0c020001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01610b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa200024730440220386d37b9eef48be10cb83eb2fd995aee875bddb0ddf56ef6004b0129774099230220023ce685fa546a5f0ec55d0991076a5365861a6b260ccf2c56c72443417a422b012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000060000000", +"00000020f36d2c9855c113ef4adb8696411e45641fe809876c9622edc65b9b4f1f0300001d13e5ade701651d1ab00b944a3af33fa88e5ef9e789ed999d26890b39616ffbd7c74d5fae77031e7aff0b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0e01620b2f7369676e65743a39392ffeffffff0200f2052a010000002251202913b252fe537830f843bfdc5fa7d20ba48639a87c86ff837b92d083c55ad7c10000000000000000986a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c70ecc7daa2000247304402202375fd3de2c3c685f881c5049af39114f5d89415c52aeb9735a46f695bd943260220585398fbf85ee83ded42e44790938ec4da05a332b920d75bffc9ebe3b8de5e89012102fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af0120000000000000000000000000000000000000000000000000000000000000000061000000", +] class SignetMinerTest(BitcoinTestFramework): def add_options(self, parser): @@ -41,26 +142,74 @@ def skip_test_if_missing_module(self): self.skip_if_no_wallet() self.skip_if_no_bitcoin_util() - def run_test(self): - node = self.nodes[0] - # import private key needed for signing block - node.importprivkey(bytes_to_wif(CHALLENGE_PRIVATE_KEY)) - - # generate block with signet miner tool + def mine_blocks(self, node, num_blocks, custom_block_dir=None, block_time=None): + n_blocks = node.getblockcount() base_dir = self.config["environment"]["SRCDIR"] signet_miner_path = os.path.join(base_dir, "contrib", "signet", "miner") + extra_args = [] + if custom_block_dir: + extra_args += [f'--custom-block-dir={custom_block_dir}'] + if block_time is None: + extra_args += [f'--max-blocks={num_blocks}'] + else: + extra_args += [f'--set-block-time={block_time}'] + assert num_blocks == 1 subprocess.run([ sys.executable, signet_miner_path, f'--cli={node.cli.binary} -datadir={node.cli.datadir}', 'generate', - f'--address={node.getnewaddress()}', + f'--address={self.wallet_addr}', f'--grind-cmd={self.options.bitcoinutil} grind', f'--nbits={DIFF_1_N_BITS:08x}', - f'--set-block-time={int(time.time())}', '--poolnum=99', - ], check=True, stderr=subprocess.STDOUT) - assert_equal(node.getblockcount(), 1) + ] + extra_args, check=True, stderr=subprocess.STDOUT) + assert_equal(node.getblockcount(), n_blocks + num_blocks) + + def run_test(self): + node = self.nodes[0] + # import private key needed for signing block + node.importprivkey(bytes_to_wif(CHALLENGE_PRIVATE_KEY)) + + self.log.info("Mine blocks to create spendable UTXOs (mature coinbase outputs)") + self.wallet = MiniWallet(node) + # translate MiniWallet address to Signet (due to different bech32 HRP) + self.wallet_addr = node.decodescript(self.wallet.get_output_script().hex())['address'] + + n_mine = COINBASE_MATURITY + 6 + if not BLOCKS: + self.mine_blocks(node, 1, block_time=0) + n_mine -= 1 + else: + for b in BLOCKS: + node.submitblock(b) + n_mine -= len(BLOCKS) + assert n_mine > 0 + self.mine_blocks(node, n_mine) + self.wallet.rescan_utxos() + assert len(self.wallet.get_utxos(include_immature_coinbase=False, mark_as_spent=False)) > 0 + + self.log.info("Mine block with overridden txs (provided by --custom-block-dir)") + # submit transaction to mempool, should be picked up by the miner + mempool_tx = self.wallet.send_self_transfer(from_node=node) + self.mine_blocks(node, 1) + mined_block = node.getblock(node.getbestblockhash()) + assert_equal(len(mined_block['tx']), 2) # coinbase + miniwallet tx + assert_equal(mined_block['tx'][1], mempool_tx['txid']) + + # submit transaction to mempool, override with some custom (non-standard) txs + mempool_tx = self.wallet.send_self_transfer(from_node=node) + offband_txs = [self.wallet.create_self_transfer(target_vsize=333_000) for _ in range(3)] + custom_txs_file = os.path.join(self.options.tmpdir, "108.json") + with open(custom_txs_file, 'w', encoding='utf8') as f: + f.write(json.dumps({"txs": [t["hex"] for t in offband_txs]})) + self.mine_blocks(node, 1, custom_block_dir=self.options.tmpdir) + mined_block = node.getblock(node.getbestblockhash()) + assert mined_block['size'] > 990_000 + assert_equal(len(mined_block['tx']), 1 + len(offband_txs)) + assert mempool_tx['txid'] not in mined_block['tx'] + for offband_tx in offband_txs: + assert offband_tx['txid'] in mined_block['tx'] if __name__ == "__main__":