From a30134d00d53c747ac853bbf360794cd69758e99 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Mon, 14 Oct 2019 16:43:02 +0700 Subject: [PATCH 01/19] add testnet seeds --- contrib/seeds/nodes_main.txt | 1269 +-------------------------------- contrib/seeds/nodes_test.txt | 12 +- src/chainparamsseeds.h | 1280 +--------------------------------- 3 files changed, 9 insertions(+), 2552 deletions(-) diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt index c0b5b299bd..8b13789179 100644 --- a/contrib/seeds/nodes_main.txt +++ b/contrib/seeds/nodes_main.txt @@ -1,1268 +1 @@ -2.132.100.47:8333 -5.1.97.4:8333 -5.39.174.116:8333 -5.45.79.14:8333 -5.53.16.133:8333 -5.101.139.166:8333 -5.178.78.139:8333 -5.189.176.17:8333 -5.228.64.71:8333 -8.18.38.122:8333 -13.115.96.63:8333 -14.2.124.84:8333 -14.3.170.1:8333 -23.94.28.250:8333 -23.111.172.106:8333 -23.125.224.84:8333 -23.152.0.108:8333 -23.175.0.222:8333 -23.229.16.234:8333 -23.233.6.70:8333 -24.142.34.253:8333 -24.171.203.87:8333 -24.188.200.170:8333 -24.216.65.41:8333 -24.227.69.146:8333 -27.33.11.193:8333 -31.24.11.139:8333 -31.28.10.13:8333 -31.165.17.164:8333 -31.179.204.142:8333 -31.186.96.186:8333 -31.210.172.21:8333 -31.211.102.129:62734 -34.217.122.178:8333 -35.230.64.29:8333 -35.231.225.42:8333 -36.3.172.13:8333 -36.251.163.42:8333 -37.136.97.246:8333 -37.153.1.150:8333 -37.153.1.157:8333 -37.228.92.110:8333 -37.252.14.22:8333 -38.27.101.224:8333 -38.102.134.85:8333 -38.104.225.30:8333 -43.229.76.38:8333 -45.40.132.57:8333 -45.45.34.122:8333 -45.48.177.222:8333 -46.19.34.236:8333 -46.28.66.196:8333 -46.28.204.21:8333 -46.28.205.161:8333 -46.30.42.144:8333 -46.138.139.195:8333 -46.165.245.221:8333 -46.166.129.155:8333 -46.166.160.52:8333 -46.166.160.56:8333 -46.188.44.82:8333 -46.188.126.74:8333 -46.229.165.145:8333 -46.229.168.201:8333 -46.229.238.187:8333 -47.54.204.246:8333 -47.74.128.138:8333 -47.94.224.99:8333 -47.97.96.198:8333 -47.187.36.48:8333 -47.218.16.81:8333 -47.223.66.222:8333 -47.254.128.15:8333 -50.31.170.53:8333 -50.35.67.146:8333 -50.76.96.230:8333 -50.82.177.142:8333 -51.15.3.46:8333 -51.175.141.243:8333 -52.144.47.153:8333 -52.232.38.122:8333 -54.38.192.164:8333 -54.85.65.6:8333 -54.91.227.188:8333 -58.180.36.14:8333 -59.106.208.68:8333 -60.70.73.26:8333 -61.160.234.57:8333 -62.43.198.56:8333 -62.45.0.15:8333 -62.107.200.30:8333 -62.133.194.2:8333 -62.138.3.224:8333 -62.146.70.216:8333 -64.78.163.10:8333 -64.120.110.2:8333 -64.131.160.31:8333 -66.18.172.16:8333 -66.85.74.242:8333 -66.110.132.10:8333 -66.114.33.90:8333 -66.180.64.95:8333 -66.222.164.188:8333 -67.11.139.67:8333 -67.43.191.118:8333 -67.61.137.157:8333 -67.193.184.12:8333 -67.210.228.203:8333 -67.215.12.43:8333 -67.253.72.119:8333 -68.201.228.6:8333 -68.202.128.19:8333 -69.30.218.226:8333 -69.61.35.175:8333 -69.61.171.22:8333 -69.125.194.25:8333 -70.35.98.12:8333 -70.103.171.66:8333 -70.172.252.29:8333 -71.34.96.135:8333 -71.68.48.149:8333 -71.93.161.162:8333 -71.162.192.5:8333 -72.11.174.71:8333 -72.50.240.124:8333 -72.70.32.215:8333 -72.211.196.232:8333 -72.234.112.22:8333 -72.253.237.0:8333 -73.241.192.40:8333 -74.15.230.112:8333 -74.83.79.52:8333 -74.126.14.27:8333 -75.76.137.164:8333 -76.64.166.230:8333 -76.191.79.98:8333 -77.37.170.106:8333 -77.70.107.83:8333 -77.95.226.194:8333 -77.111.172.134:8333 -77.163.136.136:8333 -77.203.13.57:8333 -77.239.37.12:8333 -77.240.168.19:8333 -77.244.219.164:8333 -78.31.67.156:8333 -78.34.2.126:8333 -78.108.187.246:8333 -78.109.163.153:8333 -79.28.205.145:8333 -79.66.70.89:8333 -79.132.230.144:8333 -80.209.224.79:8333 -80.211.252.104:8333 -80.229.28.60:8333 -81.7.13.84:8333 -81.7.16.182:8333 -81.18.224.62:8333 -81.171.27.138:8333 -81.187.80.221:8333 -81.217.112.225:8333 -81.245.141.6:8333 -82.43.171.91:8333 -82.102.10.251:8333 -82.118.234.178:8333 -82.144.197.93:8333 -82.161.109.190:8333 -82.193.102.228:8333 -82.193.109.199:8333 -82.199.102.10:8333 -82.212.130.94:8333 -82.213.208.16:8333 -82.217.67.17:8333 -82.221.108.27:8333 -82.221.133.174:8333 -83.55.130.30:8333 -83.77.39.46:8333 -83.137.41.10:8333 -83.149.70.48:8333 -83.151.233.218:8333 -83.162.43.154:8333 -83.164.131.243:8333 -83.221.11.7:8333 -83.243.128.13:8333 -84.16.38.218:8333 -84.38.3.249:8333 -84.75.26.172:8333 -84.200.106.128:8333 -84.212.250.219:8333 -84.215.134.195:8333 -84.245.27.209:8333 -84.254.40.152:8333 -84.255.193.28:8333 -85.10.112.194:8333 -85.93.2.76:54382 -85.94.172.33:8333 -85.129.0.126:8333 -85.145.168.159:8333 -85.170.238.26:8333 -85.195.232.197:8333 -85.214.68.122:8333 -85.214.235.137:8333 -85.218.48.146:8333 -85.220.165.205:8333 -85.229.134.98:8333 -85.241.49.242:8333 -86.25.32.77:8333 -86.41.89.170:8333 -86.50.143.43:8333 -86.61.67.183:8333 -86.137.26.210:8333 -86.177.194.215:8333 -87.157.177.58:8333 -87.224.163.66:8333 -87.236.196.169:8333 -87.246.46.132:8333 -88.99.64.76:8333 -89.1.100.49:8333 -89.10.155.88:8333 -89.27.59.246:8333 -89.163.132.73:8333 -89.179.240.131:8333 -89.205.81.5:8333 -89.212.75.6:8333 -89.217.130.147:8333 -89.230.96.42:8333 -89.248.172.10:8333 -90.46.57.17:8333 -90.110.11.101:8333 -90.240.37.163:8333 -91.65.4.21:8333 -91.65.192.159:8333 -91.83.237.185:8333 -91.110.125.26:8333 -91.121.160.59:8333 -91.135.0.187:8333 -91.143.109.68:8333 -91.195.42.134:8333 -91.221.70.137:8333 -92.35.132.5:8333 -92.42.37.141:8333 -92.54.16.144:8333 -92.62.34.184:8333 -92.186.231.240:8333 -93.123.80.47:8333 -93.170.13.15:8333 -93.171.201.68:8333 -93.179.197.152:8333 -93.190.206.151:8333 -93.191.131.177:8333 -93.208.132.214:8333 -94.104.97.247:8333 -94.156.35.8:8333 -94.199.173.113:8333 -95.42.2.113:8333 -95.94.225.61:8333 -95.154.237.24:8333 -95.158.39.64:8333 -95.163.71.126:8333 -95.163.106.139:8333 -95.208.163.214:8333 -95.213.143.13:8333 -95.226.77.108:8333 -96.3.74.66:8333 -96.23.128.65:8333 -96.27.8.242:8333 -96.27.129.94:8333 -96.126.100.148:8333 -97.74.6.105:8333 -97.116.160.102:8333 -98.7.64.249:8333 -98.10.106.49:8333 -98.25.197.125:8333 -98.29.7.103:8333 -98.127.130.17:8333 -99.224.192.201:8333 -101.190.172.209:8333 -103.35.151.76:8334 -103.74.193.127:8333 -103.80.133.191:8333 -103.80.168.57:8333 -103.99.168.102:8333 -103.194.42.10:8333 -104.168.101.207:8333 -104.200.67.162:8333 -104.207.132.42:8333 -104.237.4.202:8333 -107.155.72.108:8333 -107.183.37.162:8333 -108.175.3.18:8333 -108.220.192.57:8333 -109.61.102.5:8333 -109.206.177.21:8333 -109.237.111.156:8333 -115.68.47.82:8333 -116.88.75.110:8333 -118.67.201.40:8333 -119.28.4.230:8333 -119.28.130.210:8333 -120.31.143.167:8333 -120.220.14.92:8333 -120.220.14.93:8333 -124.18.133.220:8333 -126.207.39.22:8333 -128.77.37.214:8333 -128.125.100.2:8333 -129.158.74.237:8333 -129.213.32.176:8333 -131.113.41.119:8333 -131.113.41.125:8333 -131.114.10.233:8333 -131.188.40.191:8333 -131.188.42.36:8333 -134.0.112.92:8333 -134.3.26.190:8333 -135.23.196.24:8333 -135.84.207.4:8333 -136.59.129.125:8333 -136.61.239.7:8333 -137.117.164.18:8333 -139.130.41.82:8333 -141.134.71.188:8333 -141.213.6.57:8333 -141.223.82.139:8333 -142.0.130.49:8333 -142.0.130.53:8333 -144.118.141.232:8333 -148.66.58.146:8333 -150.95.130.17:8333 -150.187.36.233:8333 -150.249.76.102:8333 -153.125.129.187:8333 -153.125.224.107:8333 -154.48.236.250:8887 -154.66.207.126:8333 -155.143.140.186:8333 -157.131.142.164:8333 -158.64.79.182:8333 -158.85.93.163:8333 -158.140.128.239:8333 -158.174.131.171:8333 -159.8.4.19:8333 -159.217.144.68:8333 -159.217.144.252:8333 -159.253.47.202:8333 -162.155.64.226:8333 -162.222.100.118:8333 -162.255.168.27:8333 -162.255.168.30:8333 -163.158.228.125:8333 -165.227.96.38:8333 -169.229.238.17:8333 -171.25.165.145:8333 -171.33.177.9:8333 -172.72.228.93:8333 -172.96.161.244:8333 -172.102.228.150:8333 -172.118.136.98:8333 -173.46.65.8:8333 -173.212.193.35:8333 -173.239.33.85:8333 -173.243.64.48:8333 -174.115.129.37:8333 -176.12.6.59:8333 -176.107.184.29:8333 -176.123.10.192:8333 -176.126.167.10:8333 -176.185.235.163:8333 -176.223.130.254:8333 -178.0.71.136:8333 -178.12.32.39:8333 -178.85.64.212:8333 -178.124.162.209:8333 -178.128.192.21:8333 -178.151.133.56:8333 -178.193.96.201:8333 -178.248.200.126:8333 -178.254.7.88:8333 -180.233.106.171:8333 -181.166.168.210:8333 -183.66.227.70:12060 -183.111.108.56:8333 -184.70.33.190:8333 -184.105.70.100:8333 -184.105.70.101:8333 -185.12.7.38:8333 -185.21.216.134:8333 -185.25.48.184:8333 -185.25.48.217:8333 -185.25.60.199:8333 -185.28.76.179:8333 -185.35.139.54:8333 -185.44.78.208:8333 -185.47.132.55:8333 -185.51.128.27:8333 -185.59.100.107:8333 -185.67.175.75:8333 -185.67.204.76:8333 -185.67.204.80:8333 -185.70.105.74:8339 -185.85.3.140:8333 -185.86.15.23:8333 -185.86.15.25:8333 -185.102.71.6:8333 -185.117.74.21:8333 -185.121.173.223:8333 -185.128.40.122:8333 -185.145.131.218:8333 -185.147.237.169:8333 -185.162.128.83:8333 -185.165.76.220:8333 -185.172.165.130:8333 -185.177.5.4:8333 -185.183.131.75:8333 -185.186.208.208:8333 -185.215.224.22:8333 -185.224.80.108:8333 -185.225.16.4:8333 -185.243.112.214:8333 -185.244.193.18:8333 -185.248.160.66:8333 -186.19.136.144:8333 -188.68.38.243:8333 -188.68.240.89:8333 -188.134.6.84:8333 -188.134.77.121:8333 -188.138.1.43:8333 -188.217.9.168:8333 -190.2.133.91:8333 -190.184.198.34:8333 -190.211.204.68:8333 -192.139.35.143:8333 -192.162.100.156:8333 -192.162.101.250:8333 -192.206.202.6:8333 -192.207.12.244:8333 -192.207.12.245:8333 -192.228.101.157:8333 -193.112.192.73:8333 -193.170.166.12:8333 -194.15.231.236:8333 -194.165.16.33:8333 -194.181.80.77:8333 -194.186.160.253:8333 -194.247.13.7:8333 -194.247.13.32:8333 -195.0.203.21:8333 -195.38.168.114:8333 -195.43.141.28:8333 -195.95.225.248:8333 -195.123.224.7:8333 -195.154.235.79:8333 -195.169.99.82:8333 -195.201.0.81:8333 -197.155.6.43:8333 -198.44.231.160:6333 -198.58.102.35:8333 -198.137.202.175:8333 -199.127.224.50:8333 -199.182.129.26:8333 -199.188.204.102:8333 -199.188.204.155:8333 -199.244.49.224:8333 -199.249.230.37:15738 -200.83.123.46:8333 -200.109.67.71:8333 -200.122.128.185:8333 -202.153.199.182:8333 -202.159.136.54:8333 -202.168.16.232:8333 -203.11.71.1:8333 -203.162.80.219:8333 -203.178.143.13:8333 -204.15.11.4:8333 -206.125.169.162:8333 -206.174.55.164:8333 -207.182.146.18:8333 -208.93.66.198:8333 -208.98.196.249:8333 -208.107.224.202:8333 -208.110.65.114:8333 -208.118.235.190:8333 -209.122.208.131:8333 -209.126.110.198:8333 -209.131.238.80:8333 -212.56.108.81:8333 -212.73.150.132:8333 -212.77.224.145:8333 -212.85.90.194:8333 -212.92.101.30:8333 -212.112.133.92:8333 -212.227.132.167:8333 -213.10.100.182:8333 -213.57.240.69:8333 -213.91.205.134:8333 -213.125.67.108:8333 -213.152.161.170:45893 -213.155.3.216:8333 -213.180.70.138:8333 -213.185.226.225:8333 -216.71.203.79:8333 -216.194.164.211:8333 -216.240.168.226:8333 -217.20.130.72:8333 -217.23.9.180:8333 -217.64.47.138:8333 -217.169.14.90:8333 -218.245.1.205:8333 -220.130.128.58:8333 -220.133.39.61:8333 -222.239.193.116:8333 -222.239.193.120:8333 -[2001:0:4137:9e76:1cbd:3bc0:ade7:bf44]:8333 -[2001:0:4137:9e76:2046:150d:8d65:de4]:8333 -[2001:0:4137:9e76:2c99:3f36:d003:f47a]:8333 -[2001:0:4137:9e76:34b6:3910:a3dc:7bfa]:8333 -[2001:0:4137:9e76:3cec:2b5:525b:fb3c]:8333 -[2001:0:53aa:64c:c5:235d:a10d:e0]:8333 -[2001:0:53aa:64c:cbc:5ace:a625:39d1]:8333 -[2001:0:5ef5:79fb:38e5:36c1:d0ee:5d98]:8333 -[2001:0:5ef5:79fb:3c5c:c6c:39cf:69d3]:8333 -[2001:0:5ef5:79fb:896:ef4:ba63:8d15]:8333 -[2001:0:9d38:6ab8:106a:2112:e06b:b881]:8333 -[2001:0:9d38:6ab8:1c99:1655:e782:9340]:8333 -[2001:0:9d38:6ab8:20cd:1cd9:54e6:5a6e]:8333 -[2001:0:9d38:6ab8:245e:2b3:a300:317e]:8333 -[2001:0:9d38:6ab8:2814:215c:88e3:4ee0]:8333 -[2001:0:9d38:6ab8:30ac:3a51:b2da:712d]:8333 -[2001:0:9d38:6ab8:34a6:eeb:c3ed:5be7]:8333 -[2001:0:9d38:6ab8:c2f:16d5:525a:107e]:8333 -[2001:0:9d38:6ab8:cb1:2557:431c:f3e1]:8333 -[2001:0:9d38:6abd:1056:290d:a671:3d90]:8333 -[2001:0:9d38:6abd:1865:14fe:d0a7:1f72]:8333 -[2001:0:9d38:6abd:2c3c:3006:a486:93c3]:8333 -[2001:0:9d38:6abd:2c73:3313:f21a:96da]:8333 -[2001:0:9d38:6abd:3050:fbff:a250:3386]:8333 -[2001:0:9d38:6abd:3828:494:fdaa:56cd]:8333 -[2001:0:9d38:6abd:454:187d:3e75:b00b]:8333 -[2001:0:9d38:78cf:c2c:1dcc:fa42:41a3]:8333 -[2001:0:9d38:90d7:1c4a:20d4:4daa:eb5a]:8333 -[2001:0:9d38:90d7:1ca7:1612:9a18:31e5]:8333 -[2001:0:9d38:90d7:24c8:3a0a:a68d:f799]:8333 -[2001:0:9d38:90d7:2837:324e:d0cb:9f45]:22475 -[2001:0:9d38:90d7:28c1:361e:a69c:b099]:8333 -[2001:0:9d38:90d7:30fe:1c89:d0b4:4d18]:8333 -[2001:0:9d38:90d7:3474:1df1:e732:e5e3]:8333 -[2001:0:9d38:90d7:34a8:fb1:88e3:fb19]:8333 -[2001:0:9d38:90d7:3c19:3d23:d0b4:f831]:18652 -[2001:0:9d38:90d7:3c45:2342:d0cb:d6ca]:8333 -[2001:0:9d38:90d7:3c5f:3105:d0b4:60b6]:8333 -[2001:0:9d38:90d7:8a1:2fb:d0cb:1e8f]:8333 -[2001:0:9d38:90d7:a3:36e0:e020:53fa]:8333 -[2001:0:9d38:90d7:eb:3b30:d0a4:aa5]:8333 -[2001:0:9d38:953c:104e:8af:b3aa:f300]:8333 -[2001:0:9d38:953c:1434:71f:b850:bab1]:8333 -[2001:0:9d38:953c:144a:36e8:519a:bb69]:8333 -[2001:0:9d38:953c:20fc:26ef:ed26:c737]:8333 -[2001:0:9d38:953c:454:120:88e8:2fb]:8333 -[2001:0:9d38:953c:801:1620:bc22:95bc]:8333 -[2001:0:9d38:953c:8a0:1fdb:ab00:bc2]:8333 -[2001:0:9d38:953c:cf6:3d48:4386:4937]:8333 -[2001:13d8:1c01:1000::8]:8333 -[2001:1620:923:0:75be:ed92:1a01:641]:8333 -[2001:1680:101:8c::1]:8333 -[2001:1970:5ae2:2b00:30bd:7910:c84:7a8f]:8333 -[2001:1970:5d56:aa01:1e75:8ff:fead:da48]:8333 -[2001:19f0:300:1045:225:90ff:fec9:29b3]:8333 -[2001:19f0:5:1f93:5400:1ff:fe7a:c65a]:8333 -[2001:19f0:6c01:4bd:5400:1ff:fe76:4db6]:8333 -[2001:19f0:ac01:2fb:5400:ff:fe5b:c3ff]:8333 -[2001:1a48:7:af1a:75f8:2c47:3285:d50e]:8333 -[2001:1af8:4010:a094:3333::8c38]:8333 -[2001:1af8:4070:a016:3333::5afb]:8333 -[2001:1af8:4700:a071:4444::e26e]:8333 -[2001:200:0:8801:5054:ff:fef2:1d0]:8333 -[2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333 -[2001:41d0:1000:1f98::]:8333 -[2001:41d0:1004:18c7::]:8333 -[2001:41d0:1004:19dc::]:18555 -[2001:41d0:1004:1f7c::]:8333 -[2001:41d0:1008:2bed::]:8333 -[2001:41d0:1:45d8::1]:8333 -[2001:41d0:1:5395::1]:8333 -[2001:41d0:1:85d3::1]:8333 -[2001:41d0:1:8649::1]:8333 -[2001:41d0:1:8b26::1]:8333 -[2001:41d0:1:a5b8::1]:8333 -[2001:41d0:1:ab6b::1]:8333 -[2001:41d0:1:d227::]:8333 -[2001:41d0:1:f897::1]:8333 -[2001:41d0:1:f932::1]:8333 -[2001:41d0:2:34b7::1]:8333 -[2001:41d0:2:4975::]:8333 -[2001:41d0:2:5c22::]:8333 -[2001:41d0:2:84d4::1]:8333 -[2001:41d0:2:ab38::]:8333 -[2001:41d0:2:c33c::]:8333 -[2001:41d0:303:193b::]:8333 -[2001:41d0:303:2505::1a]:8333 -[2001:41d0:303:41db::]:58333 -[2001:41d0:303:4c68::]:8333 -[2001:41d0:303:508::]:8333 -[2001:41d0:303:6767::]:8333 -[2001:41d0:303:68cd::]:8333 -[2001:41d0:602:17a4::]:8333 -[2001:41d0:602:1842::]:8333 -[2001:41d0:602:3b7::]:8333 -[2001:41d0:602:898::]:8333 -[2001:41d0:602:b1a::]:8333 -[2001:41d0:800:135::]:8333 -[2001:41d0:800:3d3::]:8333 -[2001:41d0:8:101d::1]:8333 -[2001:41d0:8:1b29::]:8333 -[2001:41d0:8:3f74::1]:8333 -[2001:41d0:8:43a0::]:8333 -[2001:41d0:8:bb32::1]:8333 -[2001:41d0:8:bed3::]:8333 -[2001:41d0:8:c67c::]:8333 -[2001:41d0:8:ca2d::]:8333 -[2001:41d0:8:d444::1]:8333 -[2001:41d0:8:ddb::1]:8333 -[2001:41d0:8:ea86::1]:8333 -[2001:41d0:a:1220::1]:8333 -[2001:41d0:a:27ed::1]:8333 -[2001:41d0:a:296c::]:8139 -[2001:41d0:a:2b18::1]:8333 -[2001:41d0:a:405c::]:8333 -[2001:41d0:a:42df::]:8312 -[2001:41d0:a:4c49::aca:7929]:8333 -[2001:41d0:a:6927::1]:8333 -[2001:41d0:a:69a2::1]:8333 -[2001:41d0:a:6a87::1]:8333 -[2001:41d0:a:6c29::1]:8333 -[2001:41d0:a:6c7d::1]:8333 -[2001:41d0:a:f243::1]:8333 -[2001:41d0:a:f9cd::1]:8333 -[2001:41d0:d:dc9::]:8333 -[2001:41d0:e:1146::1]:8333 -[2001:41d0:e:126::1]:8333 -[2001:41d0:e:12aa::1]:8333 -[2001:41d0:e:1388::1]:8333 -[2001:41d0:e:ec5::1]:8333 -[2001:41f0:0:4:62:6974:636f:696e]:8333 -[2001:470:18:be4::2]:8333 -[2001:470:1c62:b170:bbff:53f1:edbf:99df]:42434 -[2001:470:1f06:15b4::2]:8333 -[2001:470:1f06:cea::2]:8333 -[2001:470:1f07:803:20c:29ff:fe2d:5879]:8333 -[2001:470:1f08:3cc::2]:8333 -[2001:470:1f0a:18dd::2]:8333 -[2001:470:1f15:11f8::10]:8333 -[2001:470:1f15:cf7::14]:8333 -[2001:470:1f17:b5::10]:8333 -[2001:470:1f1a:172::2]:8333 -[2001:470:1f1b:5a6:216:3eff:fe24:1162]:8333 -[2001:470:28:365::7]:8333 -[2001:470:41:6::2]:8333 -[2001:470:6c80:101::1]:8333 -[2001:470:6c80:3::1]:8333 -[2001:470:7:63e::2]:8333 -[2001:470:7:b74::2]:8333 -[2001:470:8:bd3:4d25:ca57:a5b7:c6c4]:8333 -[2001:470:a:c13::2]:8333 -[2001:470:c144:cafe::23]:8333 -[2001:470:c3c4:100:100::202]:8333 -[2001:470:e696::1]:8333 -[2001:48f8:1003::3ba]:8333 -[2001:48f8:9015:1422:3dc0:fcf2:772f:57bc]:8333 -[2001:4ba0:babe:832::]:8333 -[2001:628:22a0:9::12]:8333 -[2001:638:a000:4140::ffff:191]:8333 -[2001:638:a000:4142::ff10:bed6]:8333 -[2001:67c:21ec:1000::a]:8333 -[2001:8d8:90b:c000::21:2fc0]:8333 -[2001:8d8:91c:9200::5c:d425]:8333 -[2001:980:231b:1:8e89:a5ff:fee3:f8be]:8333 -[2001:980:ade8:1:14fc:fd6d:608c:f669]:8333 -[2001:981:bdbd:1:c506:7d38:4b47:da15]:8333 -[2001:982:27f2:1:7271:bcff:fe94:d5bb]:8333 -[2001:984:26b5::1]:8333 -[2001:984:aec7:1:dcb7:29a:7eda:b9a2]:8333 -[2001:985:79af:20::35]:8333 -[2001:985:cb69:0:20c:29ff:feaf:dd5e]:8333 -[2001:b011:300d:1870:9c87:d4ff:fe9c:2d0f]:8333 -[2001:b030:2422::208d]:8333 -[2001:bc8:31d7:100::1]:8333 -[2001:bc8:323c:100::]:8333 -[2001:bc8:33ac:19ff::26]:8333 -[2001:bc8:399f:f000::1]:8333 -[2001:bc8:3dc1:100::142]:8333 -[2001:bc8:4400:2000::463b]:8333 -[2001:bc8:4400:2400::1b35]:8333 -[2001:bc8:4700:2000::5823]:8333 -[2001:da8:8001:2303:1cf4:4466:3f1a:7edb]:8333 -[2001:da8:d800:741:652d:52db:5713:4515]:8333 -[2002:17e5:10ea::17e5:10ea]:8333 -[2002:1f2b:8cbe::1f2b:8cbe]:8333 -[2002:2f59:30f3::2f59:30f3]:8333 -[2002:2f5a:562a::2f5a:562a]:8333 -[2002:3e92:46d8::3e92:46d8]:8333 -[2002:3f62:e6bb::3f62:e6bb]:8333 -[2002:404e:a30a::404e:a30a]:8333 -[2002:43db:9616::43db:9616]:8333 -[2002:43e5:a1fa::43e5:a1fa]:8333 -[2002:5266:afb::5266:afb]:8333 -[2002:5dbd:91a9::5dbd:91a9]:8333 -[2002:627e:333d::627e:333d]:8333 -[2002:6b9b:486c::6b9b:486c]:8333 -[2002:6dcb:7cba::6dcb:7cba]:8333 -[2002:7cf8:e33e::7cf8:e33e]:8333 -[2002:8e00:8231::8e00:8231]:8333 -[2002:8e00:8233::8e00:8233]:8333 -[2002:b07e:a70a::b07e:a70a]:8333 -[2002:b2c9:e6fc:10:3d5c:e3ad:813:9c46]:8333 -[2002:b4b2:3612::b4b2:3612]:8333 -[2002:b610:1ca2::b610:1ca2]:8333 -[2002:b610:1ca3::b610:1ca3]:8333 -[2002:b845:3322::1]:8333 -[2002:b946:694a::b946:694a]:8339 -[2002:b960:5e18::b960:5e18]:8333 -[2002:c23f:8fc5::c23f:8fc5]:8333 -[2002:c2a5:1021::c2a5:1021]:8333 -[2002:c62c:e7a0::c62c:e7a0]:6333 -[2002:ca99:c7b6::ca99:c7b6]:8333 -[2002:d035:2734::d035:2734]:8333 -[2002:d06e:5d1a::d06e:5d1a]:8333 -[2002:d8da:b949::d8da:b949]:8333 -[2400:2410:a960:4800:18be:d624:7018:cd2f]:8333 -[2400:6180:0:d0::3e1:b001]:8333 -[2400:6180:0:d0::5cd2:a001]:8333 -[2400:6180:0:d1::4c6:8001]:8333 -[2400:6180:100:d0::797:a001]:8333 -[2400:8500:1302:817:150:95:130:17]:8333 -[2401:1800:7800:106:be76:4eff:fe1c:1879]:8333 -[2401:3900:2:1::2]:8333 -[2401:a400:3200:5600:3c16:2deb:abce:70cd]:8333 -[2401:b140::43:100]:8333 -[2401:b140::43:102]:8333 -[2402:1f00:8100:21c::]:8333 -[2403:bd80:c000:1:103:202:216:182]:8333 -[2405:6580:c5c0:1700:6cd2:b72e:740e:4311]:8333 -[2405:800:1000:1:1000::2001]:8333 -[2405:9800:b560:96d:630:c28e:a79a:a182]:8333 -[2405:aa00:2::40]:8333 -[2409:10:ca20:1df0:224:e8ff:fe1f:60d9]:8333 -[2600:1f16:625:e00:269a:3452:2edf:1011]:8333 -[2600:1f16:625:e00:7bc:5879:4463:15dd]:8333 -[2600:1f16:625:e00:a28b:5a16:849c:fe41]:8333 -[2600:1f16:625:e00:a70f:e728:e8e1:2c2e]:8333 -[2600:3c00::f03c:91ff:fe0c:4d74]:8333 -[2600:3c00::f03c:91ff:fe2b:bf38]:8333 -[2600:3c00::f03c:91ff:fe91:3e49]:8333 -[2600:3c00::f03c:91ff:feb6:19f2]:8333 -[2600:3c01::f03c:91ff:fe91:6a29]:8333 -[2600:3c01::f03c:91ff:fed8:85a2]:8333 -[2600:3c01::f03c:91ff:fed8:db38]:8333 -[2600:3c03::f03c:91ff:fe28:1445]:8333 -[2601:147:4300:e61::30c]:8333 -[2601:147:4300:e61::f91]:8333 -[2601:186:c100:6bcd:16bd:cea1:235d:1c19]:8333 -[2601:18d:4600:5f32:20e7:b3ff:fecf:a99]:8333 -[2601:240:4601:ecee:309a:f9de:b64d:87df]:8333 -[2601:240:8100:256b:20c:29ff:fe5e:d707]:8333 -[2601:646:c202:5301:101b:a096:efba:c10a]:8333 -[2601:807:8000:9508:9993:d2b3:1a:8225]:8333 -[2601:c8:4100:770:c37:807b:98cc:bd7e]:8333 -[2602:100:6154:d6e3:2c91:d0de:b032:b0a4]:8333 -[2602:100:6154:d6e3::60]:8333 -[2602:61:786c:2c00::1]:8333 -[2602:ff83:fff:fffe::75]:8333 -[2602:ff83:fff:fffe::76]:8333 -[2603:3005:3000:5000:bc5a:72ac:36e9:175e]:8333 -[2604:0:c1:100:6bc1:f98a:97f9:3845]:8333 -[2604:2d80:c808:857b:8d6:9e1c:7131:4bea]:8333 -[2604:4080:1008:0:96de:80ff:fe62:e650]:8333 -[2604:4300:a:104:b699:baff:feaa:5109]:8333 -[2604:5500:c226:7f00:2d96:ed64:ce45:9a6]:8333 -[2604:8d80:100::adf3:4030]:8333 -[2604:a880:2:d0::22f8:e001]:8333 -[2604:a880:2:d0::22f8:f001]:8333 -[2604:a880:2:d0::22f9:1]:8333 -[2604:a880:2:d0::22f9:1001]:8333 -[2604:a880:2:d0::22f9:c001]:8333 -[2604:a880:2:d0::22f9:d001]:8333 -[2604:a880:2:d0::22f9:e001]:8333 -[2604:a880:2:d0::22fa:1001]:8333 -[2604:a880:2:d0::22fa:2001]:8333 -[2604:a880:2:d0::22fa:3001]:8333 -[2604:a880:2:d0::38:f001]:8333 -[2604:a880:2:d0::662:c001]:8333 -[2604:a880:400:d0::1ac4:b001]:8333 -[2604:a880:400:d0::2004:4001]:8333 -[2604:a880:400:d0::2004:5001]:8333 -[2604:a880:400:d0::2004:6001]:8333 -[2604:a880:400:d0::2004:d001]:8333 -[2604:a880:400:d0::2004:e001]:8333 -[2604:a880:400:d0::2005:1]:8333 -[2604:a880:400:d0::2005:2001]:8333 -[2604:a880:400:d0::2005:3001]:8333 -[2604:a880:400:d0::cd7:4001]:8333 -[2604:a880:400:d1::729:b001]:8333 -[2604:a880:800:a1::11a9:8001]:8333 -[2604:a880:800:a1::59:9001]:8333 -[2604:a880:800:a1::cbb:f001]:8333 -[2604:a880:800:a1::ee8:e001]:8333 -[2604:a880:cad:d0::370:f001]:8333 -[2604:a880:cad:d0::a52:6001]:8333 -[2605:4d00::50]:8333 -[2605:9880:0:1cf:225:90ff:fec9:29b3]:8333 -[2605:9880:0:3::8333]:8333 -[2605:9880:201:17::4b7c]:8333 -[2605:a000:4a87:9501:d613:fbf8:1e82:8d3c]:8333 -[2605:a000:f343:b700:5054:ff:fea7:131]:8333 -[2605:a601:a41:1a00:a00:27ff:fefc:4759]:8333 -[2605:ae00:203::203]:8333 -[2605:c000:2a0a:1::102]:8333 -[2605:e000:1c00:80e8:984e:a697:97a3:50ed]:8333 -[2605:e000:1c0d:437b:5054:ff:fe1b:2913]:8333 -[2605:e000:9093:a700:9853:4464:5f78:c484]:8333 -[2605:f700:100:400::104e:43bd]:8333 -[2605:f700:100:400::131:5b54]:8333 -[2605:f700:100:c10:5575:8e73:b07c:bf5a]:8333 -[2606:6000:c149:8830:5054:ff:fe78:66ff]:8333 -[2607:1c00:a:6:3c1c:1b0d:ba4:8ea9]:8333 -[2607:1c00:a:6::1000]:8333 -[2607:5300:120:a04::]:8333 -[2607:5300:203:2fac::]:8333 -[2607:5300:203:408::]:8333 -[2607:5300:203:6bc::]:18333 -[2607:5300:203:8d::]:8333 -[2607:5300:60:10aa::1]:8333 -[2607:5300:60:122a::1]:8333 -[2607:5300:60:13bb::1]:8333 -[2607:5300:60:3ddf::]:8333 -[2607:5300:60:5735::]:8333 -[2607:5300:60:714::1]:8333 -[2607:5300:60:981::1]:8333 -[2607:5300:60:cff1::]:28633 -[2607:9280:b:73b:250:56ff:fe21:bf32]:8333 -[2607:f178:0:8::106]:8333 -[2607:f1c0:823:af00::35:bbd1]:8333 -[2607:f2c0:f00e:300:201:2eff:fe67:9130]:8333 -[2607:fa18:0:beef::c012]:8333 -[2607:ff28:1:7::176e:c4a5]:8333 -[2607:ff28:1:7::65af:9afb]:8333 -[2620:71:4000:0:192:30:120:110]:8333 -[2801:84:0:1034:76d4:35ff:fe7f:5033]:8333 -[2803:1500:1200:c487::1]:8333 -[2804:14c:6582:60f0::1]:8333 -[2804:14d:baa6:962c:486:47f6:c161:a79d]:8333 -[2a00:13a0:3015:1:85:14:79:26]:8333 -[2a00:16d8:c::5b6a:c261]:8333 -[2a00:1768:2001:24::148:218]:8333 -[2a00:1838:36:2c::ed85]:8333 -[2a00:1a28:1157:2f8::946a]:8333 -[2a00:1c48:6:203:a60:6eff:fe44:8086]:8333 -[2a00:1f40:2::1126]:8333 -[2a00:7c80:0:5d::1d0e]:8333 -[2a00:8a60:e012:a00::21]:8333 -[2a00:ab00:603:84::3]:8333 -[2a00:bbe0:cc:0:6651:6ff:fe0e:9418]:8333 -[2a00:ca8:a1f:3025:4121:5ca1:3b:4469]:8333 -[2a00:ca8:a1f:9091:945e:80a3:830a:78cf]:8333 -[2a01:238:433c:5300:7a61:3e1a:27f4:9dc2]:8333 -[2a01:4240:a21:983b::c0a8:32]:8333 -[2a01:488:66:1000:53a9:21b8:0:1]:8333 -[2a01:4d60:3:1:5::1]:8333 -[2a01:4f8:10a:3524::2]:8333 -[2a01:4f8:10b:362::2]:8333 -[2a01:4f8:10b:d50::2]:8333 -[2a01:4f8:10b:f44::2]:8333 -[2a01:4f8:120:1391::2]:8333 -[2a01:4f8:120:70a3::2]:8333 -[2a01:4f8:120:93f8::2]:8333 -[2a01:4f8:121:2385::2]:8333 -[2a01:4f8:130:71d2::2]:8333 -[2a01:4f8:130:7422::2]:8333 -[2a01:4f8:13a:124f::2]:8333 -[2a01:4f8:13a:1dcb::2]:8333 -[2a01:4f8:13a:708::2]:21775 -[2a01:4f8:13a:723::2]:8333 -[2a01:4f8:13b:109e::2]:8333 -[2a01:4f8:13b:1a9e::201]:8333 -[2a01:4f8:13b:271c::2]:10731 -[2a01:4f8:13b:2d42::2]:8333 -[2a01:4f8:13b:2d94::2]:8333 -[2a01:4f8:13b:3810::2]:8333 -[2a01:4f8:13b:3da8::2]:8333 -[2a01:4f8:13b:41e6::2]:8333 -[2a01:4f8:13b:4281::2]:8333 -[2a01:4f8:13b:5c7::2]:8333 -[2a01:4f8:13b:81::2]:8333 -[2a01:4f8:140:236a:cafe::5]:8333 -[2a01:4f8:140:324e::2]:8333 -[2a01:4f8:140:5329::102]:8333 -[2a01:4f8:140:5329::50:109]:8333 -[2a01:4f8:140:931a::2]:8333 -[2a01:4f8:140:93b0::2]:8333 -[2a01:4f8:141:47::2]:8333 -[2a01:4f8:150:53a4::4]:8333 -[2a01:4f8:150:72ee::4202]:8333 -[2a01:4f8:160:41f0::1:33]:8333 -[2a01:4f8:160:4443::2]:8333 -[2a01:4f8:160:6092:d7bd:a39:3e52:b65d]:8333 -[2a01:4f8:160:60aa::2]:8333 -[2a01:4f8:160:636e::2]:8333 -[2a01:4f8:161:6091::2]:8333 -[2a01:4f8:161:6111::2]:8333 -[2a01:4f8:161:812e::2]:8333 -[2a01:4f8:162:2c6::2]:8333 -[2a01:4f8:162:33ac::2]:8333 -[2a01:4f8:171:1c3::2]:8333 -[2a01:4f8:171:2bdc::2]:8333 -[2a01:4f8:171:3248::2]:8333 -[2a01:4f8:171:4dc::2]:8333 -[2a01:4f8:171:d09::2]:8333 -[2a01:4f8:171:d4a::2]:8333 -[2a01:4f8:171:e0d::2]:8333 -[2a01:4f8:171:ecd::2]:8333 -[2a01:4f8:172:1823::2]:8333 -[2a01:4f8:173:1622::2]:8333 -[2a01:4f8:190:50b6::2]:8333 -[2a01:4f8:190:5176::123]:8333 -[2a01:4f8:191:268::2]:8333 -[2a01:4f8:192:216c::2]:8333 -[2a01:4f8:192:628a::83]:8333 -[2a01:4f8:1c0c:77af::1]:8333 -[2a01:4f8:200:1012::2]:8333 -[2a01:4f8:200:442d::2]:8333 -[2a01:4f8:201:1113::2]:8333 -[2a01:4f8:201:4f0::2]:8333 -[2a01:4f8:201:53cc::2]:8333 -[2a01:4f8:201:8026::1337]:8333 -[2a01:4f8:201:8026::2]:8333 -[2a01:4f8:202:32c6::2]:8333 -[2a01:4f8:211:309::2]:8333 -[2a01:4f8:211:f08::2]:8333 -[2a01:4f8:212:1e16::2]:8333 -[2a01:4f8:221:1808::2]:15000 -[2a01:4f8:221:2e18::2]:8333 -[2a01:4f8:221:2fcf::2]:8333 -[2a01:4f8:221:3441::2]:8333 -[2a01:4f8:221:3452::2]:8333 -[2a01:4f8:221:39c1::2]:8335 -[2a01:4f8:221:3c82::2]:8333 -[2a01:4f8:221:3c82:fea1::666]:8333 -[2a01:4f8:221:6cd::2]:8333 -[2a01:4f8:221:801::2]:8333 -[2a01:4f8:221:f59::2]:8333 -[2a01:4f8:a0:6147::2]:8333 -[2a01:4f8:c0c:4268::2]:8333 -[2a01:4f8:c0c:56a5::2]:8333 -[2a01:4f8:c17:e00::2]:8333 -[2a01:4f9:2a:10d4::2]:8333 -[2a01:4f9:2a:1827::2]:8333 -[2a01:4f9:2a:192c::2]:8333 -[2a01:4f9:2a:1c87::2]:8333 -[2a01:4f9:2a:2510::2]:8333 -[2a01:4f9:2a:2518::2]:8333 -[2a01:4f9:2a:2585::2]:8333 -[2a01:4f9:2a:2698::2]:8333 -[2a01:4f9:2a:2d0a::2]:8333 -[2a01:4f9:2a:2d17::2]:8333 -[2a01:4f9:2a:347::2]:8333 -[2a01:4f9:2a:650::2]:8333 -[2a01:4f9:2a:d54::2]:8333 -[2a01:4f9:c010:12e7::1]:8333 -[2a01:4f9:c010:1736::1]:8333 -[2a01:5d00:1:4b6:d2bf:9cff:fe45:b834]:8333 -[2a01:79c:cebe:70cc:1a03:73ff:fe48:e691]:8333 -[2a01:7a0:2:1374::7]:8333 -[2a01:7a7:2:1218:ec4:7aff:fe83:83c4]:8333 -[2a01:7a7:2:1288:ea39:35ff:fef0:c429]:8333 -[2a01:7c8:aaba:18:5054:ff:fe2b:df20]:8333 -[2a01:7c8:fffa:50e:3035:741b:be02:b5de]:8333 -[2a01:be00:10:201:0:80:cece:1]:8333 -[2a01:cb00:5be:d500:227:eff:fe28:c565]:8333 -[2a01:cb00:b3:d300:9276:8a8c:74bf:2a88]:8333 -[2a01:cb14:b8:a500:dd9d:80f5:d305:68f9]:8333 -[2a01:e0a:20:9120:7c3f:5643:9978:1825]:8333 -[2a01:e0a:d:6ea0:56:deab:1b2f:300b]:8333 -[2a01:e34:ec16:93f0:725d:d8d2:bb90:eabf]:8333 -[2a01:e34:ee33:1640:c418:3c3a:8ff6:3eab]:8333 -[2a01:e34:eed7:6670:28c0:183c:7783:7dc3]:8333 -[2a01:e35:2f7d:a0b0:59c2:3c8a:95a2:c4d1]:8333 -[2a01:e35:87ba:d0c0:75a2:9f39:efcb:f59f]:8333 -[2a02:120b:c3c5:cef0:ec82:a43d:4d6:dc2]:8333 -[2a02:120b:c3d1:f2d0:eea8:6bff:fefc:2265]:8333 -[2a02:168:404c:0:eea8:6bff:fef3:7d5c]:8333 -[2a02:180:1:1::517:10b6]:8333 -[2a02:180:1:1::5b8f:538c]:8333 -[2a02:1b8:10:147::2]:8333 -[2a02:2168:d05:2c00:216:3eff:fef7:a099]:8333 -[2a02:2528:503:2::14]:8333 -[2a02:2528:fa:1400::1]:8333 -[2a02:2770:17:0:21a:4aff:fe7b:175f]:8333 -[2a02:2770:5:0:21a:4aff:fe44:8370]:8333 -[2a02:2808:5401:0:225:90ff:fe4e:ee42]:8333 -[2a02:390:9000:0:218:7dff:fe10:be33]:8333 -[2a02:750:7:c11:5054:ff:fe43:eb81]:8333 -[2a02:7aa0:1619::590:eba2]:8333 -[2a02:7b40:3e4d:9ed9::1]:8333 -[2a02:7b40:50d1:e04f::1]:8333 -[2a02:7b40:5928:f9e::1]:8333 -[2a02:7b40:592f:a590::1]:8333 -[2a02:7b40:b0df:82fe::1]:8333 -[2a02:7b40:b0df:8925::1]:8333 -[2a02:7b40:b0df:8b41::1]:8333 -[2a02:7b40:b0df:8d57::1]:8333 -[2a02:7b40:d418:6fcd::1]:8333 -[2a02:8108:2340:1c18:7a:231e:1430:7f12]:8333 -[2a02:8108:9c3f:dd18:922b:34ff:fe30:ac42]:8333 -[2a02:810d:8a40:36f8:9af2:b3ff:fee8:6d7a]:8333 -[2a02:8388:e301:7180:201:2eff:fe82:b3cc]:8333 -[2a02:908:213:54a0:39bf:d4aa:60b2:d9c3]:8333 -[2a02:908:4f0:7e1c:5054:ff:feb7:ce4b]:8333 -[2a02:930:1:0:250:56ff:fe8e:2819]:8333 -[2a02:a80:0:2052::2]:8333 -[2a02:c205:0:5145::1]:8333 -[2a02:c205:2008:272::1]:8333 -[2a02:c205:2010:6230::1]:8333 -[2a02:c205:2016:4327::1]:8333 -[2a02:c205:2017:2116::1]:8333 -[2a02:c205:2018:1754::1]:8333 -[2a02:c205:2018:8229::1]:8333 -[2a02:c205:3002:2787::1]:8333 -[2a02:c205:3002:6525::1]:8333 -[2a02:c207:0:3829::1]:8333 -[2a02:c207:2007:4699::1]:8333 -[2a02:c207:2009:213::1]:8333 -[2a02:c207:2010:7751::1]:8333 -[2a02:c207:2012:4826::1]:8333 -[2a02:c207:2014:4199::1]:8333 -[2a02:c207:2014:5639::1]:8333 -[2a02:c207:2014:9913::1]:18333 -[2a02:c207:2015:3799::1]:8333 -[2a02:c207:2015:3926::1]:8333 -[2a02:c207:2015:5919::1]:8333 -[2a02:c207:2015:6681::1]:8333 -[2a02:c207:2016:2394::1]:8333 -[2a02:c207:2016:9375::1]:8333 -[2a02:c207:2017:1988::1]:8333 -[2a02:c207:2017:3720::1]:8333 -[2a02:c207:2017:4486::1]:8333 -[2a02:c207:2017:4708::1]:8333 -[2a02:c207:2017:5828::1]:8333 -[2a02:c207:2017:7320::1]:8333 -[2a02:c207:2017:8175::1]:8333 -[2a02:c207:2017:8998::1]:8333 -[2a02:c207:2018:1462::1]:8333 -[2a02:c207:2018:3094::1]:8333 -[2a02:c207:2018:3275::1]:8333 -[2a02:c207:2018:3710::1]:8333 -[2a02:c207:2018:4790::1]:8333 -[2a02:c207:2018:7407::1]:8333 -[2a02:c207:2019:1067::1]:8333 -[2a02:c207:2019:1425::1]:8333 -[2a02:c207:2019:2041::1]:8333 -[2a02:c207:2019:248::1]:8333 -[2a02:c207:2019:3592::1]:8333 -[2a02:c207:3001:9320::1]:8333 -[2a02:c207:3002:1287::1]:8333 -[2a02:c207:3002:4187::1]:8333 -[2a02:c207:3002:5642::1]:8333 -[2a02:c207:3002:7150::1]:8333 -[2a02:c207:3002:7222::1]:8333 -[2a02:c207:3002:7610::1]:8333 -[2a02:c207:3002:8456::1]:8333 -[2a02:ce80:0:20::1]:8333 -[2a02:e00:fff0:1b9::1]:8333 -[2a02:e00:fff0:1b9::a]:8333 -[2a02:e00:fff0:1e2::1]:8333 -[2a03:b0c0:1:d0::69:3001]:8333 -[2a03:b0c0:2:d0::3ba:b001]:8333 -[2a03:b0c0:2:d0::8ce:4001]:8333 -[2a03:b0c0:3:d0::116:5001]:8333 -[2a03:b0c0:3:d0::12a:1]:8333 -[2a03:b0c0:3:d0::23fb:6001]:8333 -[2a03:b0c0:3:d0::409:1001]:8333 -[2a03:b0c0:3:d0::44b8:9001]:8333 -[2a03:b0c0:3:d0::44b8:a001]:8333 -[2a03:b0c0:3:d0::44b8:e001]:8333 -[2a03:b0c0:3:d0::44b8:f001]:8333 -[2a03:b0c0:3:d0::44b9:1]:8333 -[2a03:b0c0:3:d0::44b9:1001]:8333 -[2a03:b0c0:3:d0::44b9:2001]:8333 -[2a03:b0c0:3:d0::44b9:4001]:8333 -[2a03:b0c0:3:d0::5e48:d001]:8333 -[2a03:ee40:0:294:250:56ff:fe8d:4ad7]:8333 -[2a04:2180:1:c:f000::15]:8333 -[2a07:440:2000:20::ca0:1817]:8333 -[2a0a:c800:1:1::4]:8333 -226eupdnaouu4h2v.onion:8333 -23wdfqkzttmenvki.onion:8333 -2bfsxzluysybysnr.onion:8333 -2f4xg7m3g6vtxqcd.onion:8333 -2i5i6kvxoggngz67.onion:8333 -336lqgffb4tg5gpm.onion:8333 -342ouaetvqzgepjx.onion:8333 -3mutzniftca5w7ou.onion:8333 -3qpbpt4gkp3dxn2r.onion:8333 -3r44ddzjitznyahw.onion:8333 -3xucqntxp5ddoaz5.onion:8333 -44walnmvlhcqa3c2.onion:8333 -4ehtdyvvzhbbo6c5.onion:8333 -4jekbh7cdlfda3ve.onion:8333 -4mewwo2bfxk6lg3f.onion:8333 -53tsjt6zq3iasv5q.onion:8333 -546esc6botbjfbxb.onion:8333 -55zzzsk7iqv6p3ew.onion:8333 -56stijc6kcgw6flk.onion:8333 -5elzwcg4xysogalo.onion:8333 -5f4ysqk4eed4jcvj.onion:8333 -5k3oxus2laabmyip.onion:8333 -5ptuzplawb3svsos.onion:8333 -5rmpsrrdb3vpfgzh.onion:8333 -5wnkqzjzjehmq7hn.onion:8333 -5xxsqhppii22pges.onion:8333 -5ygszbkbbauzjx7m.onion:8333 -5z2she4d6fvrdnme.onion:8333 -64qrhyxglyjjhkne.onion:8333 -6kn76kajckqg22ao.onion:8333 -6m2iqgnqjxh7ulyk.onion:8333 -6wcfnbb3vmaw6cwa.onion:8333 -6zynxbbupfmnvc3g.onion:8333 -7sns7raurpmllybi.onion:8333 -7whaszg22pdkvfck.onion:8333 -a3a6plzycomx5gqw.onion:8333 -acs7hylaadjkt7mk.onion:8333 -agpwcvixadbinyet.onion:8333 -ajqvsylg5xd5vs3y.onion:8333 -aktfeaqkbnk52bfx.onion:8333 -albsennsmbsgxls3.onion:8333 -alruzrdz7xcek67f.onion:8333 -am6aq3dluz3njcnt.onion:8333 -aoefyxgnpgaiw2xg.onion:8333 -ap2frg2maqxpmkkd.onion:8333 -ap4zz4imxbdl6plr.onion:8333 -apbbvhk32myudnyy.onion:8333 -arlocvowxtnlbpo3.onion:8333 -b5d6etfljm2lje5y.onion:8333 -bdwvcwafzpssqckj.onion:8333 -brwqezn6le54w2bb.onion:8333 -bxxvkb7czrxtvz2c.onion:8333 -c2tpqkaz4ihjzwgb.onion:8333 -cgcv32rbbbjyyzow.onion:8333 -ckkqplgkzof45h2y.onion:8333 -cpyfqbs4fs3vnbpf.onion:8333 -ctzuzxnvla5xvb7z.onion:8333 -cw4iqvcdy67b5tpw.onion:8333 -cyvpgt25274i5b7c.onion:8333 -dmudsr7x7edvyglt.onion:8333 -dsbn53f2dwphv5mx.onion:8333 -dssqdj6pxnzkth6i.onion:8333 -e3zbephvcqmzcqkr.onion:8333 -e63i7c7qazbdtjma.onion:8333 -eiuaj2qjvbn737ph.onion:8333 -ep2mjzox3kvb6ax4.onion:8333 -eyvfxeefr4eokefr.onion:8333 -f3nfioh27j2xlfe5.onion:8333 -f5ezxphghknfbrtg.onion:8333 -faewczjuzs4wfxhv.onion:8333 -fefisckqu5raqe3c.onion:8333 -fgbss353vsvandn7.onion:8333 -fnlkrowsyrfeub6s.onion:8333 -fno4aakpl6sg6y47.onion:8333 -fnpnjdk24pzgcplx.onion:8333 -foe4ymjz4hjhowud.onion:8333 -fql436nz7qdis3nk.onion:8333 -frhfucww5vghf7cv.onion:8333 -frrxefv5dir5hm7l.onion:8333 -fuckerolyuv7ebla.onion:8333 -fz6nsij6jiyuwlsc.onion:8333 -g4qfwcu5wm7ze5lg.onion:8333 -gb5ypqt63du3wfhn.onion:8333 -gcydj5id3jcxybzr.onion:8333 -gfvnnnwcddfzosav.onion:8333 -golevvyaydsduuw2.onion:8333 -gq4su6stjnosqu67.onion:8333 -hb4oreglor5x3xoa.onion:8333 -hbuair37dxnblurw.onion:8333 -hda7fvzq3voh7mu6.onion:8333 -hnvk3pgvieyixyc2.onion:8333 -ifwxwunja4pgwydg.onion:8333 -ijmbmziunbszzxtj.onion:8333 -in7r5ieo7ogkxbne.onion:8333 -inysvhakrulg6lts.onion:8333 -iwrwbwss7lfalfg4.onion:8333 -ja7dmgkri7fi47xk.onion:8333 -jtksnokusbzms7wl.onion:8333 -jwxyqhp42cmwhqf3.onion:8333 -jxrfatqtcevzwywz.onion:8333 -jy6mvzb2ntutiye6.onion:8333 -jydquxzliej6dm24.onion:8333 -k2gdzvryrx7v6ksw.onion:8333 -kkdas3qebkosygu5.onion:8333 -kswfyurnglm65u7b.onion:8333 -l2pruzr3mnhieuug.onion:8333 -lgkgcd4brjmhrqna.onion:8333 -lgkvbvro67jomosw.onion:8333 -llljnatksfgtlhko.onion:8333 -mdpt6w5sjwcnxtwy.onion:8333 -mhjcepzc4gyadw2w.onion:8333 -mn744hbioayn3ojs.onion:8333 -mpakpgzu7umgu3ze.onion:8333 -mvomwfdddqfqg3lq.onion:8333 -mx5kdfxwowc3ymzg.onion:8333 -n4m32zcp5hvomkt4.onion:8333 -n73steqcmjz5hwni.onion:8333 -nc2bgkhqohrmwbxr.onion:8333 -nc6zlswwqqg7c5yz.onion:8333 -nrrfwdmrm3imuebn.onion:8333 -nrrmkgmulpgsbwlt.onion:8333 -o2tku2dbsd6iumch.onion:8333 -o72zyzrv77ea2bwu.onion:8333 -ohgwa5y65z4eem7b.onion:8333 -olvdu57g7rxwpcr4.onion:8333 -onlzo775ogdpjn5x.onion:8333 -otshttbd6v2k3jlz.onion:8333 -owr5tm7ygw62z4vl.onion:8333 -pcfhsdqzs6q63ryu.onion:8333 -pffwqxvuldeq55zc.onion:8333 -pgnz7kwc36rcucpu.onion:8333 -ph4g7b4jsyuntvr4.onion:8333 -pjghcivzkoersesd.onion:8333 -pu7w3jfyrzp7sxsi.onion:8333 -pxvkjp6sfb2f7foe.onion:8333 -qaxm5spmx5d2k3up.onion:8333 -qepth54daysmpy5y.onion:8333 -qj6irqn2i73edff5.onion:8333 -qjpejfzlwqqnzsol.onion:8333 -qxe3bqjmrcepxpx4.onion:8333 -rlonjm7ui6fdyz4h.onion:8333 -rs635ss24ymwyqkw.onion:8333 -sgiitogeoqslvkjv.onion:8333 -spidernetimmmkth.onion:8333 -tb7qlicrt6rdzxzd.onion:8333 -thbjka62axzuwtnt.onion:8333 -toguvy5upyuctudx.onion:8333 -u7mpvxotmnqntyn5.onion:8333 -uccmw67l4kgl646y.onion:8333 -ueo6royc3775ioq7.onion:8333 -ujsb2qcjk4t6234z.onion:8333 -uub43p3artmornv5.onion:8333 -uvb55mwvuy22mgm2.onion:8333 -uzzyjgqlf47ackbr.onion:8333 -v5fgr3fnz3nw663t.onion:8333 -v5zs2sgjyr3glh6c.onion:8333 -vk3qjdehyy4dwcxw.onion:8333 -voy6xbvejox4xbax.onion:8333 -vuiw75kgpcqke4mv.onion:8333 -w3q47ucyajtfic76.onion:8333 -wg6vwmbrzyyzapun.onion:8333 -wgpfwxgy2dowienn.onion:8333 -wjtmvsznvdclncau.onion:8333 -xab45bpmmrl5g3by.onion:8333 -xdlu3ujzieheouo7.onion:8333 -xgykmaa2jjay7cfu.onion:8333 -xnlu3tvakngy7tkp.onion:8333 -xsn5icce45gs3qy7.onion:8333 -ydonogjpjd3me45v.onion:8333 -ykn7vof37bavxetd.onion:8333 -yl525dwhvqis7ryc.onion:8333 -yrbaccpbyge6xaba.onion:8333 -yyuxafli7fqdizhq.onion:8333 -z33nukt7ngik3cpe.onion:8333 -zon2bbc2q2ihqt4c.onion:8333 -zqjvtxskxonu4kzv.onion:8333 + diff --git a/contrib/seeds/nodes_test.txt b/contrib/seeds/nodes_test.txt index 98365ee505..1a33b1aab2 100644 --- a/contrib/seeds/nodes_test.txt +++ b/contrib/seeds/nodes_test.txt @@ -1,11 +1,5 @@ -# List of fixed seed nodes for testnet +13.250.126.204:18323 +13.229.219.199:18323 +54.169.219.91:18323 -# Onion nodes -thfsmmn2jbitcoin.onion -it2pj4f7657g3rhi.onion -nkf5e6b7pl4jfd4a.onion -4zhkir2ofl7orfom.onion -t6xj6wilh4ytvcs7.onion -i6y6ivorwakd7nw3.onion -ubqj4rsu3nqtxmtp.onion diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index 4b982a4715..1df08840c5 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -8,1283 +8,13 @@ * IPv4 as well as onion addresses are wrapped inside an IPv6 address accordingly. */ static SeedSpec6 pnSeed6_main[] = { - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x02,0x84,0x64,0x2f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x01,0x61,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x27,0xae,0x74}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x2d,0x4f,0x0e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x35,0x10,0x85}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x65,0x8b,0xa6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xb2,0x4e,0x8b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xb0,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe4,0x40,0x47}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x08,0x12,0x26,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x73,0x60,0x3f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x02,0x7c,0x54}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x03,0xaa,0x01}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5e,0x1c,0xfa}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x6f,0xac,0x6a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x7d,0xe0,0x54}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x98,0x00,0x6c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xaf,0x00,0xde}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe5,0x10,0xea}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe9,0x06,0x46}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x8e,0x22,0xfd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xab,0xcb,0x57}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xbc,0xc8,0xaa}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd8,0x41,0x29}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe3,0x45,0x92}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0x21,0x0b,0xc1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x18,0x0b,0x8b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x1c,0x0a,0x0d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xa5,0x11,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb3,0xcc,0x8e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xba,0x60,0xba}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xd2,0xac,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xd3,0x66,0x81}, 62734}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd9,0x7a,0xb2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xe6,0x40,0x1d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xe7,0xe1,0x2a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x24,0x03,0xac,0x0d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x24,0xfb,0xa3,0x2a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x88,0x61,0xf6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x99,0x01,0x96}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x99,0x01,0x9d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xe4,0x5c,0x6e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xfc,0x0e,0x16}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x1b,0x65,0xe0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x66,0x86,0x55}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x68,0xe1,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2b,0xe5,0x4c,0x26}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x28,0x84,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x2d,0x22,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x30,0xb1,0xde}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x13,0x22,0xec}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0x42,0xc4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcc,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcd,0xa1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1e,0x2a,0x90}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x8a,0x8b,0xc3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa5,0xf5,0xdd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0x81,0x9b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa0,0x34}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa0,0x38}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xbc,0x2c,0x52}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xbc,0x7e,0x4a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa5,0x91}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa8,0xc9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xee,0xbb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x36,0xcc,0xf6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x4a,0x80,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0xe0,0x63}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x61,0x60,0xc6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xbb,0x24,0x30}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xda,0x10,0x51}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xdf,0x42,0xde}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xfe,0x80,0x0f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x1f,0xaa,0x35}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x23,0x43,0x92}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x4c,0x60,0xe6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x52,0xb1,0x8e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0x03,0x2e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xaf,0x8d,0xf3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x90,0x2f,0x99}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xe8,0x26,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x26,0xc0,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x55,0x41,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x5b,0xe3,0xbc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xb4,0x24,0x0e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0x6a,0xd0,0x44}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0x46,0x49,0x1a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0xa0,0xea,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x2b,0xc6,0x38}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x2d,0x00,0x0f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6b,0xc8,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x85,0xc2,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x8a,0x03,0xe0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x92,0x46,0xd8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x4e,0xa3,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x78,0x6e,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x83,0xa0,0x1f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x12,0xac,0x10}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x55,0x4a,0xf2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x6e,0x84,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x72,0x21,0x5a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xb4,0x40,0x5f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xde,0xa4,0xbc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x0b,0x8b,0x43}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x2b,0xbf,0x76}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x3d,0x89,0x9d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xc1,0xb8,0x0c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xd2,0xe4,0xcb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xd7,0x0c,0x2b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xfd,0x48,0x77}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0xc9,0xe4,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0xca,0x80,0x13}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x1e,0xda,0xe2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x3d,0x23,0xaf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x3d,0xab,0x16}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x7d,0xc2,0x19}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x23,0x62,0x0c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x67,0xab,0x42}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0xac,0xfc,0x1d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x22,0x60,0x87}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x44,0x30,0x95}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x5d,0xa1,0xa2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xa2,0xc0,0x05}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x0b,0xae,0x47}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x32,0xf0,0x7c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x46,0x20,0xd7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xd3,0xc4,0xe8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xea,0x70,0x16}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xfd,0xed,0x00}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xf1,0xc0,0x28}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x0f,0xe6,0x70}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x53,0x4f,0x34}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x7e,0x0e,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x4c,0x89,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x40,0xa6,0xe6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xbf,0x4f,0x62}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x25,0xaa,0x6a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x46,0x6b,0x53}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x5f,0xe2,0xc2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x6f,0xac,0x86}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xa3,0x88,0x88}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xcb,0x0d,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xef,0x25,0x0c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf0,0xa8,0x13}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf4,0xdb,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x1f,0x43,0x9c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x22,0x02,0x7e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x6c,0xbb,0xf6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x6d,0xa3,0x99}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x1c,0xcd,0x91}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x42,0x46,0x59}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x84,0xe6,0x90}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xd1,0xe0,0x4f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xd3,0xfc,0x68}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xe5,0x1c,0x3c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x0d,0x54}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x10,0xb6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x12,0xe0,0x3e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xab,0x1b,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xbb,0x50,0xdd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xd9,0x70,0xe1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xf5,0x8d,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x2b,0xab,0x5b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x66,0x0a,0xfb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x76,0xea,0xb2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x90,0xc5,0x5d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xa1,0x6d,0xbe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc1,0x66,0xe4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc1,0x6d,0xc7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc7,0x66,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd4,0x82,0x5e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd5,0xd0,0x10}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd9,0x43,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6c,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x85,0xae}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x37,0x82,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x4d,0x27,0x2e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x89,0x29,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x95,0x46,0x30}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x97,0xe9,0xda}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0x2b,0x9a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa4,0x83,0xf3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xdd,0x0b,0x07}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xf3,0x80,0x0d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x10,0x26,0xda}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x26,0x03,0xf9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x4b,0x1a,0xac}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xc8,0x6a,0x80}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd4,0xfa,0xdb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd7,0x86,0xc3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xf5,0x1b,0xd1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xfe,0x28,0x98}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xff,0xc1,0x1c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x0a,0x70,0xc2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5d,0x02,0x4c}, 54382}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5e,0xac,0x21}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x81,0x00,0x7e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x91,0xa8,0x9f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xaa,0xee,0x1a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xc3,0xe8,0xc5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x44,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0xeb,0x89}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xda,0x30,0x92}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xdc,0xa5,0xcd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xe5,0x86,0x62}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xf1,0x31,0xf2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x19,0x20,0x4d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x29,0x59,0xaa}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x32,0x8f,0x2b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x3d,0x43,0xb7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x89,0x1a,0xd2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xb1,0xc2,0xd7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x9d,0xb1,0x3a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xe0,0xa3,0x42}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc4,0xa9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xf6,0x2e,0x84}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0x40,0x4c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x01,0x64,0x31}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x0a,0x9b,0x58}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x1b,0x3b,0xf6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0x84,0x49}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xb3,0xf0,0x83}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xcd,0x51,0x05}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd4,0x4b,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd9,0x82,0x93}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xe6,0x60,0x2a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xf8,0xac,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x2e,0x39,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x6e,0x0b,0x65}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xf0,0x25,0xa3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x41,0x04,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x41,0xc0,0x9f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x53,0xed,0xb9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x6e,0x7d,0x1a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x79,0xa0,0x3b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x87,0x00,0xbb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x8f,0x6d,0x44}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc3,0x2a,0x86}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xdd,0x46,0x89}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x23,0x84,0x05}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x2a,0x25,0x8d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x36,0x10,0x90}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x3e,0x22,0xb8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xba,0xe7,0xf0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x7b,0x50,0x2f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xaa,0x0d,0x0f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xab,0xc9,0x44}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xb3,0xc5,0x98}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbe,0xce,0x97}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbf,0x83,0xb1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xd0,0x84,0xd6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x68,0x61,0xf7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x9c,0x23,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xc7,0xad,0x71}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x2a,0x02,0x71}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x5e,0xe1,0x3d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x9a,0xed,0x18}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x9e,0x27,0x40}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xa3,0x47,0x7e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xa3,0x6a,0x8b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd0,0xa3,0xd6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0x8f,0x0d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xe2,0x4d,0x6c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x03,0x4a,0x42}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x17,0x80,0x41}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x1b,0x08,0xf2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x1b,0x81,0x5e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7e,0x64,0x94}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x4a,0x06,0x69}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x74,0xa0,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x07,0x40,0xf9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x0a,0x6a,0x31}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x19,0xc5,0x7d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x1d,0x07,0x67}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x7f,0x82,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xe0,0xc0,0xc9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xbe,0xac,0xd1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x23,0x97,0x4c}, 8334}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x4a,0xc1,0x7f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x50,0x85,0xbf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x50,0xa8,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x63,0xa8,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xc2,0x2a,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xa8,0x65,0xcf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc8,0x43,0xa2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xcf,0x84,0x2a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xed,0x04,0xca}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x9b,0x48,0x6c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xb7,0x25,0xa2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xaf,0x03,0x12}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xdc,0xc0,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x3d,0x66,0x05}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xce,0xb1,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xed,0x6f,0x9c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x44,0x2f,0x52}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x58,0x4b,0x6e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x43,0xc9,0x28}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x04,0xe6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x82,0xd2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x1f,0x8f,0xa7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0xdc,0x0e,0x5c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0xdc,0x0e,0x5d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0x12,0x85,0xdc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7e,0xcf,0x27,0x16}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x4d,0x25,0xd6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x7d,0x64,0x02}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x81,0x9e,0x4a,0xed}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x81,0xd5,0x20,0xb0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0x71,0x29,0x77}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0x71,0x29,0x7d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0x72,0x0a,0xe9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0xbc,0x28,0xbf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0xbc,0x2a,0x24}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0x00,0x70,0x5c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0x03,0x1a,0xbe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x87,0x17,0xc4,0x18}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x87,0x54,0xcf,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x3b,0x81,0x7d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x3d,0xef,0x07}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x75,0xa4,0x12}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x82,0x29,0x52}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0x86,0x47,0xbc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xd5,0x06,0x39}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xdf,0x52,0x8b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0x00,0x82,0x31}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0x00,0x82,0x35}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x76,0x8d,0xe8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x42,0x3a,0x92}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x5f,0x82,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0xbb,0x24,0xe9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0xf9,0x4c,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x99,0x7d,0x81,0xbb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x99,0x7d,0xe0,0x6b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9a,0x30,0xec,0xfa}, 8887}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9a,0x42,0xcf,0x7e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9b,0x8f,0x8c,0xba}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9d,0x83,0x8e,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x40,0x4f,0xb6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x55,0x5d,0xa3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x8c,0x80,0xef}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0xae,0x83,0xab}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0x08,0x04,0x13}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xd9,0x90,0x44}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xd9,0x90,0xfc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xfd,0x2f,0xca}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0x9b,0x40,0xe2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xde,0x64,0x76}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xff,0xa8,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xff,0xa8,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x9e,0xe4,0x7d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x60,0x26}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0xe5,0xee,0x11}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xab,0x19,0xa5,0x91}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xab,0x21,0xb1,0x09}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x48,0xe4,0x5d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x60,0xa1,0xf4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x66,0xe4,0x96}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x76,0x88,0x62}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x2e,0x41,0x08}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd4,0xc1,0x23}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xef,0x21,0x55}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xf3,0x40,0x30}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x73,0x81,0x25}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x0c,0x06,0x3b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x6b,0xb8,0x1d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x7b,0x0a,0xc0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x7e,0xa7,0x0a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0xb9,0xeb,0xa3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0xdf,0x82,0xfe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x00,0x47,0x88}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x0c,0x20,0x27}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x55,0x40,0xd4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x7c,0xa2,0xd1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x80,0xc0,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x97,0x85,0x38}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xc1,0x60,0xc9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xf8,0xc8,0x7e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x07,0x58}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xe9,0x6a,0xab}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb5,0xa6,0xa8,0xd2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb7,0x42,0xe3,0x46}, 12060}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb7,0x6f,0x6c,0x38}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x46,0x21,0xbe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x69,0x46,0x64}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x69,0x46,0x65}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x0c,0x07,0x26}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x15,0xd8,0x86}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x19,0x30,0xb8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x19,0x30,0xd9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x19,0x3c,0xc7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1c,0x4c,0xb3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x23,0x8b,0x36}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x2c,0x4e,0xd0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x2f,0x84,0x37}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x33,0x80,0x1b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x3b,0x64,0x6b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x43,0xaf,0x4b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x43,0xcc,0x4c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x43,0xcc,0x50}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x46,0x69,0x4a}, 8339}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x55,0x03,0x8c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x56,0x0f,0x17}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x56,0x0f,0x19}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x66,0x47,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x75,0x4a,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x79,0xad,0xdf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x80,0x28,0x7a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x91,0x83,0xda}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x93,0xed,0xa9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xa2,0x80,0x53}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xa5,0x4c,0xdc}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xac,0xa5,0x82}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xb1,0x05,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xb7,0x83,0x4b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xba,0xd0,0xd0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xd7,0xe0,0x16}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xe0,0x50,0x6c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xe1,0x10,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xf3,0x70,0xd6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xf4,0xc1,0x12}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xf8,0xa0,0x42}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xba,0x13,0x88,0x90}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x44,0x26,0xf3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x44,0xf0,0x59}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x86,0x06,0x54}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x86,0x4d,0x79}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x8a,0x01,0x2b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xd9,0x09,0xa8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x02,0x85,0x5b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0xb8,0xc6,0x22}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0xd3,0xcc,0x44}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x8b,0x23,0x8f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa2,0x64,0x9c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa2,0x65,0xfa}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xce,0xca,0x06}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xcf,0x0c,0xf4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xcf,0x0c,0xf5}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xe4,0x65,0x9d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x70,0xc0,0x49}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xaa,0xa6,0x0c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x0f,0xe7,0xec}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xa5,0x10,0x21}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xb5,0x50,0x4d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xba,0xa0,0xfd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xf7,0x0d,0x07}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xf7,0x0d,0x20}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x00,0xcb,0x15}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x26,0xa8,0x72}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x2b,0x8d,0x1c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x5f,0xe1,0xf8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x7b,0xe0,0x07}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x9a,0xeb,0x4f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xa9,0x63,0x52}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xc9,0x00,0x51}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc5,0x9b,0x06,0x2b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x2c,0xe7,0xa0}, 6333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x3a,0x66,0x23}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x89,0xca,0xaf}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x7f,0xe0,0x32}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xb6,0x81,0x1a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xbc,0xcc,0x66}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xbc,0xcc,0x9b}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xf4,0x31,0xe0}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xf9,0xe6,0x25}, 15738}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x53,0x7b,0x2e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x6d,0x43,0x47}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x7a,0x80,0xb9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x99,0xc7,0xb6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x9f,0x88,0x36}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0xa8,0x10,0xe8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x0b,0x47,0x01}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0xa2,0x50,0xdb}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0xb2,0x8f,0x0d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x0f,0x0b,0x04}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xce,0x7d,0xa9,0xa2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xce,0xae,0x37,0xa4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xb6,0x92,0x12}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x5d,0x42,0xc6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x62,0xc4,0xf9}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6b,0xe0,0xca}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6e,0x41,0x72}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x76,0xeb,0xbe}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7a,0xd0,0x83}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x6e,0xc6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x83,0xee,0x50}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x38,0x6c,0x51}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x49,0x96,0x84}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x4d,0xe0,0x91}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x55,0x5a,0xc2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x5c,0x65,0x1e}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x70,0x85,0x5c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0xe3,0x84,0xa7}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x0a,0x64,0xb6}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x39,0xf0,0x45}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x5b,0xcd,0x86}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x7d,0x43,0x6c}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x98,0xa1,0xaa}, 45893}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x03,0xd8}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xb4,0x46,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xb9,0xe2,0xe1}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x47,0xcb,0x4f}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xc2,0xa4,0xd3}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf0,0xa8,0xe2}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x14,0x82,0x48}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x09,0xb4}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x40,0x2f,0x8a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xa9,0x0e,0x5a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0xf5,0x01,0xcd}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0x82,0x80,0x3a}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0x85,0x27,0x3d}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xde,0xef,0xc1,0x74}, 8333}, - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xde,0xef,0xc1,0x78}, 8333}, - {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x1c,0xbd,0x3b,0xc0,0xad,0xe7,0xbf,0x44}, 8333}, - {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x20,0x46,0x15,0x0d,0x8d,0x65,0x0d,0xe4}, 8333}, - {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x2c,0x99,0x3f,0x36,0xd0,0x03,0xf4,0x7a}, 8333}, - {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x34,0xb6,0x39,0x10,0xa3,0xdc,0x7b,0xfa}, 8333}, - {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x3c,0xec,0x02,0xb5,0x52,0x5b,0xfb,0x3c}, 8333}, - {{0x20,0x01,0x00,0x00,0x53,0xaa,0x06,0x4c,0x00,0xc5,0x23,0x5d,0xa1,0x0d,0x00,0xe0}, 8333}, - {{0x20,0x01,0x00,0x00,0x53,0xaa,0x06,0x4c,0x0c,0xbc,0x5a,0xce,0xa6,0x25,0x39,0xd1}, 8333}, - {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x38,0xe5,0x36,0xc1,0xd0,0xee,0x5d,0x98}, 8333}, - {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x3c,0x5c,0x0c,0x6c,0x39,0xcf,0x69,0xd3}, 8333}, - {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x08,0x96,0x0e,0xf4,0xba,0x63,0x8d,0x15}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x10,0x6a,0x21,0x12,0xe0,0x6b,0xb8,0x81}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x1c,0x99,0x16,0x55,0xe7,0x82,0x93,0x40}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x20,0xcd,0x1c,0xd9,0x54,0xe6,0x5a,0x6e}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x24,0x5e,0x02,0xb3,0xa3,0x00,0x31,0x7e}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x28,0x14,0x21,0x5c,0x88,0xe3,0x4e,0xe0}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x30,0xac,0x3a,0x51,0xb2,0xda,0x71,0x2d}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x34,0xa6,0x0e,0xeb,0xc3,0xed,0x5b,0xe7}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x0c,0x2f,0x16,0xd5,0x52,0x5a,0x10,0x7e}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x0c,0xb1,0x25,0x57,0x43,0x1c,0xf3,0xe1}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x10,0x56,0x29,0x0d,0xa6,0x71,0x3d,0x90}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x18,0x65,0x14,0xfe,0xd0,0xa7,0x1f,0x72}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x2c,0x3c,0x30,0x06,0xa4,0x86,0x93,0xc3}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x2c,0x73,0x33,0x13,0xf2,0x1a,0x96,0xda}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x30,0x50,0xfb,0xff,0xa2,0x50,0x33,0x86}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x38,0x28,0x04,0x94,0xfd,0xaa,0x56,0xcd}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x04,0x54,0x18,0x7d,0x3e,0x75,0xb0,0x0b}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x0c,0x2c,0x1d,0xcc,0xfa,0x42,0x41,0xa3}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x1c,0x4a,0x20,0xd4,0x4d,0xaa,0xeb,0x5a}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x1c,0xa7,0x16,0x12,0x9a,0x18,0x31,0xe5}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x24,0xc8,0x3a,0x0a,0xa6,0x8d,0xf7,0x99}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x28,0x37,0x32,0x4e,0xd0,0xcb,0x9f,0x45}, 22475}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x28,0xc1,0x36,0x1e,0xa6,0x9c,0xb0,0x99}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x30,0xfe,0x1c,0x89,0xd0,0xb4,0x4d,0x18}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x34,0x74,0x1d,0xf1,0xe7,0x32,0xe5,0xe3}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x34,0xa8,0x0f,0xb1,0x88,0xe3,0xfb,0x19}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x3c,0x19,0x3d,0x23,0xd0,0xb4,0xf8,0x31}, 18652}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x3c,0x45,0x23,0x42,0xd0,0xcb,0xd6,0xca}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x3c,0x5f,0x31,0x05,0xd0,0xb4,0x60,0xb6}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x08,0xa1,0x02,0xfb,0xd0,0xcb,0x1e,0x8f}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x00,0xa3,0x36,0xe0,0xe0,0x20,0x53,0xfa}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x00,0xeb,0x3b,0x30,0xd0,0xa4,0x0a,0xa5}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x10,0x4e,0x08,0xaf,0xb3,0xaa,0xf3,0x00}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x14,0x34,0x07,0x1f,0xb8,0x50,0xba,0xb1}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x14,0x4a,0x36,0xe8,0x51,0x9a,0xbb,0x69}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x20,0xfc,0x26,0xef,0xed,0x26,0xc7,0x37}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x04,0x54,0x01,0x20,0x88,0xe8,0x02,0xfb}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x08,0x01,0x16,0x20,0xbc,0x22,0x95,0xbc}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x08,0xa0,0x1f,0xdb,0xab,0x00,0x0b,0xc2}, 8333}, - {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x0c,0xf6,0x3d,0x48,0x43,0x86,0x49,0x37}, 8333}, - {{0x20,0x01,0x13,0xd8,0x1c,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08}, 8333}, - {{0x20,0x01,0x16,0x20,0x09,0x23,0x00,0x00,0x75,0xbe,0xed,0x92,0x1a,0x01,0x06,0x41}, 8333}, - {{0x20,0x01,0x16,0x80,0x01,0x01,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x19,0x70,0x5a,0xe2,0x2b,0x00,0x30,0xbd,0x79,0x10,0x0c,0x84,0x7a,0x8f}, 8333}, - {{0x20,0x01,0x19,0x70,0x5d,0x56,0xaa,0x01,0x1e,0x75,0x08,0xff,0xfe,0xad,0xda,0x48}, 8333}, - {{0x20,0x01,0x19,0xf0,0x03,0x00,0x10,0x45,0x02,0x25,0x90,0xff,0xfe,0xc9,0x29,0xb3}, 8333}, - {{0x20,0x01,0x19,0xf0,0x00,0x05,0x1f,0x93,0x54,0x00,0x01,0xff,0xfe,0x7a,0xc6,0x5a}, 8333}, - {{0x20,0x01,0x19,0xf0,0x6c,0x01,0x04,0xbd,0x54,0x00,0x01,0xff,0xfe,0x76,0x4d,0xb6}, 8333}, - {{0x20,0x01,0x19,0xf0,0xac,0x01,0x02,0xfb,0x54,0x00,0x00,0xff,0xfe,0x5b,0xc3,0xff}, 8333}, - {{0x20,0x01,0x1a,0x48,0x00,0x07,0xaf,0x1a,0x75,0xf8,0x2c,0x47,0x32,0x85,0xd5,0x0e}, 8333}, - {{0x20,0x01,0x1a,0xf8,0x40,0x10,0xa0,0x94,0x33,0x33,0x00,0x00,0x00,0x00,0x8c,0x38}, 8333}, - {{0x20,0x01,0x1a,0xf8,0x40,0x70,0xa0,0x16,0x33,0x33,0x00,0x00,0x00,0x00,0x5a,0xfb}, 8333}, - {{0x20,0x01,0x1a,0xf8,0x47,0x00,0xa0,0x71,0x44,0x44,0x00,0x00,0x00,0x00,0xe2,0x6e}, 8333}, - {{0x20,0x01,0x02,0x00,0x00,0x00,0x88,0x01,0x50,0x54,0x00,0xff,0xfe,0xf2,0x01,0xd0}, 8333}, - {{0x20,0x01,0x41,0x28,0x61,0x35,0x20,0x10,0x02,0x1e,0x0b,0xff,0xfe,0xe8,0xa3,0xc0}, 8333}, - {{0x20,0x01,0x41,0xd0,0x10,0x00,0x1f,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x10,0x04,0x18,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x10,0x04,0x19,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 18555}, - {{0x20,0x01,0x41,0xd0,0x10,0x04,0x1f,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x10,0x08,0x2b,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x45,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x53,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x85,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x86,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0x8b,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xa5,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xab,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xd2,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xf8,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x01,0xf9,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x34,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x49,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x5c,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0x84,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xab,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x02,0xc3,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x03,0x03,0x19,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x03,0x03,0x25,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a}, 8333}, - {{0x20,0x01,0x41,0xd0,0x03,0x03,0x41,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 58333}, - {{0x20,0x01,0x41,0xd0,0x03,0x03,0x4c,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x03,0x03,0x05,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x03,0x03,0x67,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x03,0x03,0x68,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x06,0x02,0x17,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x06,0x02,0x18,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x06,0x02,0x03,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x06,0x02,0x08,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x06,0x02,0x0b,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x08,0x00,0x01,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x08,0x00,0x03,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x10,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x1b,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x3f,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x43,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbb,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbe,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xc6,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xca,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xd4,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0x0d,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x08,0xea,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x27,0xed,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x29,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8139}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x2b,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x40,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x42,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8312}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x4c,0x49,0x00,0x00,0x00,0x00,0x0a,0xca,0x79,0x29}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x69,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x69,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6a,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6c,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6c,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0xf2,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0a,0xf9,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0d,0x0d,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x11,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x01,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x12,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x13,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x0e,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x41,0xf0,0x00,0x00,0x00,0x04,0x00,0x62,0x69,0x74,0x63,0x6f,0x69,0x6e}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x18,0x0b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x1c,0x62,0xb1,0x70,0xbb,0xff,0x53,0xf1,0xed,0xbf,0x99,0xdf}, 42434}, - {{0x20,0x01,0x04,0x70,0x1f,0x06,0x15,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x06,0x0c,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x07,0x08,0x03,0x02,0x0c,0x29,0xff,0xfe,0x2d,0x58,0x79}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x08,0x03,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x0a,0x18,0xdd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x15,0x11,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x15,0x0c,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x17,0x00,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x1a,0x01,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x1f,0x1b,0x05,0xa6,0x02,0x16,0x3e,0xff,0xfe,0x24,0x11,0x62}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x28,0x03,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x41,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x6c,0x80,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x04,0x70,0x6c,0x80,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x07,0x06,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x07,0x0b,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x08,0x0b,0xd3,0x4d,0x25,0xca,0x57,0xa5,0xb7,0xc6,0xc4}, 8333}, - {{0x20,0x01,0x04,0x70,0x00,0x0a,0x0c,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0xc1,0x44,0xca,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23}, 8333}, - {{0x20,0x01,0x04,0x70,0xc3,0xc4,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x02}, 8333}, - {{0x20,0x01,0x04,0x70,0xe6,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x48,0xf8,0x10,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xba}, 8333}, - {{0x20,0x01,0x48,0xf8,0x90,0x15,0x14,0x22,0x3d,0xc0,0xfc,0xf2,0x77,0x2f,0x57,0xbc}, 8333}, - {{0x20,0x01,0x4b,0xa0,0xba,0xbe,0x08,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x06,0x28,0x22,0xa0,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12}, 8333}, - {{0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x91}, 8333}, - {{0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x42,0x00,0x00,0x00,0x00,0xff,0x10,0xbe,0xd6}, 8333}, - {{0x20,0x01,0x06,0x7c,0x21,0xec,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a}, 8333}, - {{0x20,0x01,0x08,0xd8,0x09,0x0b,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x2f,0xc0}, 8333}, - {{0x20,0x01,0x08,0xd8,0x09,0x1c,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0xd4,0x25}, 8333}, - {{0x20,0x01,0x09,0x80,0x23,0x1b,0x00,0x01,0x8e,0x89,0xa5,0xff,0xfe,0xe3,0xf8,0xbe}, 8333}, - {{0x20,0x01,0x09,0x80,0xad,0xe8,0x00,0x01,0x14,0xfc,0xfd,0x6d,0x60,0x8c,0xf6,0x69}, 8333}, - {{0x20,0x01,0x09,0x81,0xbd,0xbd,0x00,0x01,0xc5,0x06,0x7d,0x38,0x4b,0x47,0xda,0x15}, 8333}, - {{0x20,0x01,0x09,0x82,0x27,0xf2,0x00,0x01,0x72,0x71,0xbc,0xff,0xfe,0x94,0xd5,0xbb}, 8333}, - {{0x20,0x01,0x09,0x84,0x26,0xb5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x09,0x84,0xae,0xc7,0x00,0x01,0xdc,0xb7,0x02,0x9a,0x7e,0xda,0xb9,0xa2}, 8333}, - {{0x20,0x01,0x09,0x85,0x79,0xaf,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35}, 8333}, - {{0x20,0x01,0x09,0x85,0xcb,0x69,0x00,0x00,0x02,0x0c,0x29,0xff,0xfe,0xaf,0xdd,0x5e}, 8333}, - {{0x20,0x01,0xb0,0x11,0x30,0x0d,0x18,0x70,0x9c,0x87,0xd4,0xff,0xfe,0x9c,0x2d,0x0f}, 8333}, - {{0x20,0x01,0xb0,0x30,0x24,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x31,0xd7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x32,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x33,0xac,0x19,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x39,0x9f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x3d,0xc1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x42}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x44,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x3b}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x44,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x35}, 8333}, - {{0x20,0x01,0x0b,0xc8,0x47,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x23}, 8333}, - {{0x20,0x01,0x0d,0xa8,0x80,0x01,0x23,0x03,0x1c,0xf4,0x44,0x66,0x3f,0x1a,0x7e,0xdb}, 8333}, - {{0x20,0x01,0x0d,0xa8,0xd8,0x00,0x07,0x41,0x65,0x2d,0x52,0xdb,0x57,0x13,0x45,0x15}, 8333}, - {{0x20,0x02,0x17,0xe5,0x10,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xe5,0x10,0xea}, 8333}, - {{0x20,0x02,0x1f,0x2b,0x8c,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x2b,0x8c,0xbe}, 8333}, - {{0x20,0x02,0x2f,0x59,0x30,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x59,0x30,0xf3}, 8333}, - {{0x20,0x02,0x2f,0x5a,0x56,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x5a,0x56,0x2a}, 8333}, - {{0x20,0x02,0x3e,0x92,0x46,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x92,0x46,0xd8}, 8333}, - {{0x20,0x02,0x3f,0x62,0xe6,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x62,0xe6,0xbb}, 8333}, - {{0x20,0x02,0x40,0x4e,0xa3,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x4e,0xa3,0x0a}, 8333}, - {{0x20,0x02,0x43,0xdb,0x96,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0xdb,0x96,0x16}, 8333}, - {{0x20,0x02,0x43,0xe5,0xa1,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0xe5,0xa1,0xfa}, 8333}, - {{0x20,0x02,0x52,0x66,0x0a,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x66,0x0a,0xfb}, 8333}, - {{0x20,0x02,0x5d,0xbd,0x91,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0xbd,0x91,0xa9}, 8333}, - {{0x20,0x02,0x62,0x7e,0x33,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x7e,0x33,0x3d}, 8333}, - {{0x20,0x02,0x6b,0x9b,0x48,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x9b,0x48,0x6c}, 8333}, - {{0x20,0x02,0x6d,0xcb,0x7c,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xcb,0x7c,0xba}, 8333}, - {{0x20,0x02,0x7c,0xf8,0xe3,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xf8,0xe3,0x3e}, 8333}, - {{0x20,0x02,0x8e,0x00,0x82,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x82,0x31}, 8333}, - {{0x20,0x02,0x8e,0x00,0x82,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x8e,0x00,0x82,0x33}, 8333}, - {{0x20,0x02,0xb0,0x7e,0xa7,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x7e,0xa7,0x0a}, 8333}, - {{0x20,0x02,0xb2,0xc9,0xe6,0xfc,0x00,0x10,0x3d,0x5c,0xe3,0xad,0x08,0x13,0x9c,0x46}, 8333}, - {{0x20,0x02,0xb4,0xb2,0x36,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xb2,0x36,0x12}, 8333}, - {{0x20,0x02,0xb6,0x10,0x1c,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x10,0x1c,0xa2}, 8333}, - {{0x20,0x02,0xb6,0x10,0x1c,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x10,0x1c,0xa3}, 8333}, - {{0x20,0x02,0xb8,0x45,0x33,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x20,0x02,0xb9,0x46,0x69,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x46,0x69,0x4a}, 8339}, - {{0x20,0x02,0xb9,0x60,0x5e,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x60,0x5e,0x18}, 8333}, - {{0x20,0x02,0xc2,0x3f,0x8f,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x3f,0x8f,0xc5}, 8333}, - {{0x20,0x02,0xc2,0xa5,0x10,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0xa5,0x10,0x21}, 8333}, - {{0x20,0x02,0xc6,0x2c,0xe7,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x2c,0xe7,0xa0}, 6333}, - {{0x20,0x02,0xca,0x99,0xc7,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x99,0xc7,0xb6}, 8333}, - {{0x20,0x02,0xd0,0x35,0x27,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x35,0x27,0x34}, 8333}, - {{0x20,0x02,0xd0,0x6e,0x5d,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x6e,0x5d,0x1a}, 8333}, - {{0x20,0x02,0xd8,0xda,0xb9,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0xda,0xb9,0x49}, 8333}, - {{0x24,0x00,0x24,0x10,0xa9,0x60,0x48,0x00,0x18,0xbe,0xd6,0x24,0x70,0x18,0xcd,0x2f}, 8333}, - {{0x24,0x00,0x61,0x80,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x03,0xe1,0xb0,0x01}, 8333}, - {{0x24,0x00,0x61,0x80,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x5c,0xd2,0xa0,0x01}, 8333}, - {{0x24,0x00,0x61,0x80,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x04,0xc6,0x80,0x01}, 8333}, - {{0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x07,0x97,0xa0,0x01}, 8333}, - {{0x24,0x00,0x85,0x00,0x13,0x02,0x08,0x17,0x01,0x50,0x00,0x95,0x01,0x30,0x00,0x17}, 8333}, - {{0x24,0x01,0x18,0x00,0x78,0x00,0x01,0x06,0xbe,0x76,0x4e,0xff,0xfe,0x1c,0x18,0x79}, 8333}, - {{0x24,0x01,0x39,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x24,0x01,0xa4,0x00,0x32,0x00,0x56,0x00,0x3c,0x16,0x2d,0xeb,0xab,0xce,0x70,0xcd}, 8333}, - {{0x24,0x01,0xb1,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x00}, 8333}, - {{0x24,0x01,0xb1,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x01,0x02}, 8333}, - {{0x24,0x02,0x1f,0x00,0x81,0x00,0x02,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x24,0x03,0xbd,0x80,0xc0,0x00,0x00,0x01,0x01,0x03,0x02,0x02,0x02,0x16,0x01,0x82}, 8333}, - {{0x24,0x05,0x65,0x80,0xc5,0xc0,0x17,0x00,0x6c,0xd2,0xb7,0x2e,0x74,0x0e,0x43,0x11}, 8333}, - {{0x24,0x05,0x08,0x00,0x10,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x20,0x01}, 8333}, - {{0x24,0x05,0x98,0x00,0xb5,0x60,0x09,0x6d,0x06,0x30,0xc2,0x8e,0xa7,0x9a,0xa1,0x82}, 8333}, - {{0x24,0x05,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40}, 8333}, - {{0x24,0x09,0x00,0x10,0xca,0x20,0x1d,0xf0,0x02,0x24,0xe8,0xff,0xfe,0x1f,0x60,0xd9}, 8333}, - {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x26,0x9a,0x34,0x52,0x2e,0xdf,0x10,0x11}, 8333}, - {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x07,0xbc,0x58,0x79,0x44,0x63,0x15,0xdd}, 8333}, - {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xa2,0x8b,0x5a,0x16,0x84,0x9c,0xfe,0x41}, 8333}, - {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xa7,0x0f,0xe7,0x28,0xe8,0xe1,0x2c,0x2e}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x0c,0x4d,0x74}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x2b,0xbf,0x38}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x91,0x3e,0x49}, 8333}, - {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xb6,0x19,0xf2}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x91,0x6a,0x29}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xd8,0x85,0xa2}, 8333}, - {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xd8,0xdb,0x38}, 8333}, - {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x28,0x14,0x45}, 8333}, - {{0x26,0x01,0x01,0x47,0x43,0x00,0x0e,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0c}, 8333}, - {{0x26,0x01,0x01,0x47,0x43,0x00,0x0e,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x91}, 8333}, - {{0x26,0x01,0x01,0x86,0xc1,0x00,0x6b,0xcd,0x16,0xbd,0xce,0xa1,0x23,0x5d,0x1c,0x19}, 8333}, - {{0x26,0x01,0x01,0x8d,0x46,0x00,0x5f,0x32,0x20,0xe7,0xb3,0xff,0xfe,0xcf,0x0a,0x99}, 8333}, - {{0x26,0x01,0x02,0x40,0x46,0x01,0xec,0xee,0x30,0x9a,0xf9,0xde,0xb6,0x4d,0x87,0xdf}, 8333}, - {{0x26,0x01,0x02,0x40,0x81,0x00,0x25,0x6b,0x02,0x0c,0x29,0xff,0xfe,0x5e,0xd7,0x07}, 8333}, - {{0x26,0x01,0x06,0x46,0xc2,0x02,0x53,0x01,0x10,0x1b,0xa0,0x96,0xef,0xba,0xc1,0x0a}, 8333}, - {{0x26,0x01,0x08,0x07,0x80,0x00,0x95,0x08,0x99,0x93,0xd2,0xb3,0x00,0x1a,0x82,0x25}, 8333}, - {{0x26,0x01,0x00,0xc8,0x41,0x00,0x07,0x70,0x0c,0x37,0x80,0x7b,0x98,0xcc,0xbd,0x7e}, 8333}, - {{0x26,0x02,0x01,0x00,0x61,0x54,0xd6,0xe3,0x2c,0x91,0xd0,0xde,0xb0,0x32,0xb0,0xa4}, 8333}, - {{0x26,0x02,0x01,0x00,0x61,0x54,0xd6,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60}, 8333}, - {{0x26,0x02,0x00,0x61,0x78,0x6c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x02,0xff,0x83,0x0f,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75}, 8333}, - {{0x26,0x02,0xff,0x83,0x0f,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76}, 8333}, - {{0x26,0x03,0x30,0x05,0x30,0x00,0x50,0x00,0xbc,0x5a,0x72,0xac,0x36,0xe9,0x17,0x5e}, 8333}, - {{0x26,0x04,0x00,0x00,0x00,0xc1,0x01,0x00,0x6b,0xc1,0xf9,0x8a,0x97,0xf9,0x38,0x45}, 8333}, - {{0x26,0x04,0x2d,0x80,0xc8,0x08,0x85,0x7b,0x08,0xd6,0x9e,0x1c,0x71,0x31,0x4b,0xea}, 8333}, - {{0x26,0x04,0x40,0x80,0x10,0x08,0x00,0x00,0x96,0xde,0x80,0xff,0xfe,0x62,0xe6,0x50}, 8333}, - {{0x26,0x04,0x43,0x00,0x00,0x0a,0x01,0x04,0xb6,0x99,0xba,0xff,0xfe,0xaa,0x51,0x09}, 8333}, - {{0x26,0x04,0x55,0x00,0xc2,0x26,0x7f,0x00,0x2d,0x96,0xed,0x64,0xce,0x45,0x09,0xa6}, 8333}, - {{0x26,0x04,0x8d,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0xf3,0x40,0x30}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf8,0xe0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf8,0xf0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0x00,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0x10,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0xc0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0xd0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0xe0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xfa,0x10,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xfa,0x20,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xfa,0x30,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x38,0xf0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x06,0x62,0xc0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1a,0xc4,0xb0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0x40,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0x50,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0x60,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0xd0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0xe0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x05,0x00,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x05,0x20,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x05,0x30,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0c,0xd7,0x40,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd1,0x00,0x00,0x00,0x00,0x07,0x29,0xb0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x08,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x11,0xa9,0x80,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x08,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x59,0x90,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x08,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x0c,0xbb,0xf0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x08,0x00,0x00,0xa1,0x00,0x00,0x00,0x00,0x0e,0xe8,0xe0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x0c,0xad,0x00,0xd0,0x00,0x00,0x00,0x00,0x03,0x70,0xf0,0x01}, 8333}, - {{0x26,0x04,0xa8,0x80,0x0c,0xad,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x52,0x60,0x01}, 8333}, - {{0x26,0x05,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50}, 8333}, - {{0x26,0x05,0x98,0x80,0x00,0x00,0x01,0xcf,0x02,0x25,0x90,0xff,0xfe,0xc9,0x29,0xb3}, 8333}, - {{0x26,0x05,0x98,0x80,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x33}, 8333}, - {{0x26,0x05,0x98,0x80,0x02,0x01,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x7c}, 8333}, - {{0x26,0x05,0xa0,0x00,0x4a,0x87,0x95,0x01,0xd6,0x13,0xfb,0xf8,0x1e,0x82,0x8d,0x3c}, 8333}, - {{0x26,0x05,0xa0,0x00,0xf3,0x43,0xb7,0x00,0x50,0x54,0x00,0xff,0xfe,0xa7,0x01,0x31}, 8333}, - {{0x26,0x05,0xa6,0x01,0x0a,0x41,0x1a,0x00,0x0a,0x00,0x27,0xff,0xfe,0xfc,0x47,0x59}, 8333}, - {{0x26,0x05,0xae,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03}, 8333}, - {{0x26,0x05,0xc0,0x00,0x2a,0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02}, 8333}, - {{0x26,0x05,0xe0,0x00,0x1c,0x00,0x80,0xe8,0x98,0x4e,0xa6,0x97,0x97,0xa3,0x50,0xed}, 8333}, - {{0x26,0x05,0xe0,0x00,0x1c,0x0d,0x43,0x7b,0x50,0x54,0x00,0xff,0xfe,0x1b,0x29,0x13}, 8333}, - {{0x26,0x05,0xe0,0x00,0x90,0x93,0xa7,0x00,0x98,0x53,0x44,0x64,0x5f,0x78,0xc4,0x84}, 8333}, - {{0x26,0x05,0xf7,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x10,0x4e,0x43,0xbd}, 8333}, - {{0x26,0x05,0xf7,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x31,0x5b,0x54}, 8333}, - {{0x26,0x05,0xf7,0x00,0x01,0x00,0x0c,0x10,0x55,0x75,0x8e,0x73,0xb0,0x7c,0xbf,0x5a}, 8333}, - {{0x26,0x06,0x60,0x00,0xc1,0x49,0x88,0x30,0x50,0x54,0x00,0xff,0xfe,0x78,0x66,0xff}, 8333}, - {{0x26,0x07,0x1c,0x00,0x00,0x0a,0x00,0x06,0x3c,0x1c,0x1b,0x0d,0x0b,0xa4,0x8e,0xa9}, 8333}, - {{0x26,0x07,0x1c,0x00,0x00,0x0a,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x01,0x20,0x0a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x02,0x03,0x2f,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x02,0x03,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x02,0x03,0x06,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 18333}, - {{0x26,0x07,0x53,0x00,0x02,0x03,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x10,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x12,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x13,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x3d,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x57,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0x09,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x26,0x07,0x53,0x00,0x00,0x60,0xcf,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 28633}, - {{0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x21,0xbf,0x32}, 8333}, - {{0x26,0x07,0xf1,0x78,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06}, 8333}, - {{0x26,0x07,0xf1,0xc0,0x08,0x23,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0xbb,0xd1}, 8333}, - {{0x26,0x07,0xf2,0xc0,0xf0,0x0e,0x03,0x00,0x02,0x01,0x2e,0xff,0xfe,0x67,0x91,0x30}, 8333}, - {{0x26,0x07,0xfa,0x18,0x00,0x00,0xbe,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x12}, 8333}, - {{0x26,0x07,0xff,0x28,0x00,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x17,0x6e,0xc4,0xa5}, 8333}, - {{0x26,0x07,0xff,0x28,0x00,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x65,0xaf,0x9a,0xfb}, 8333}, - {{0x26,0x20,0x00,0x71,0x40,0x00,0x00,0x00,0x01,0x92,0x00,0x30,0x01,0x20,0x01,0x10}, 8333}, - {{0x28,0x01,0x00,0x84,0x00,0x00,0x10,0x34,0x76,0xd4,0x35,0xff,0xfe,0x7f,0x50,0x33}, 8333}, - {{0x28,0x03,0x15,0x00,0x12,0x00,0xc4,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x28,0x04,0x01,0x4c,0x65,0x82,0x60,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x28,0x04,0x01,0x4d,0xba,0xa6,0x96,0x2c,0x04,0x86,0x47,0xf6,0xc1,0x61,0xa7,0x9d}, 8333}, - {{0x2a,0x00,0x13,0xa0,0x30,0x15,0x00,0x01,0x00,0x85,0x00,0x14,0x00,0x79,0x00,0x26}, 8333}, - {{0x2a,0x00,0x16,0xd8,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x6a,0xc2,0x61}, 8333}, - {{0x2a,0x00,0x17,0x68,0x20,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x01,0x48,0x02,0x18}, 8333}, - {{0x2a,0x00,0x18,0x38,0x00,0x36,0x00,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x85}, 8333}, - {{0x2a,0x00,0x1a,0x28,0x11,0x57,0x02,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x6a}, 8333}, - {{0x2a,0x00,0x1c,0x48,0x00,0x06,0x02,0x03,0x0a,0x60,0x6e,0xff,0xfe,0x44,0x80,0x86}, 8333}, - {{0x2a,0x00,0x1f,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x26}, 8333}, - {{0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0e}, 8333}, - {{0x2a,0x00,0x8a,0x60,0xe0,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21}, 8333}, - {{0x2a,0x00,0xab,0x00,0x06,0x03,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333}, - {{0x2a,0x00,0xbb,0xe0,0x00,0xcc,0x00,0x00,0x66,0x51,0x06,0xff,0xfe,0x0e,0x94,0x18}, 8333}, - {{0x2a,0x00,0x0c,0xa8,0x0a,0x1f,0x30,0x25,0x41,0x21,0x5c,0xa1,0x00,0x3b,0x44,0x69}, 8333}, - {{0x2a,0x00,0x0c,0xa8,0x0a,0x1f,0x90,0x91,0x94,0x5e,0x80,0xa3,0x83,0x0a,0x78,0xcf}, 8333}, - {{0x2a,0x01,0x02,0x38,0x43,0x3c,0x53,0x00,0x7a,0x61,0x3e,0x1a,0x27,0xf4,0x9d,0xc2}, 8333}, - {{0x2a,0x01,0x42,0x40,0x0a,0x21,0x98,0x3b,0x00,0x00,0x00,0x00,0xc0,0xa8,0x00,0x32}, 8333}, - {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0x53,0xa9,0x21,0xb8,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x4d,0x60,0x00,0x03,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x35,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x0b,0x03,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x0b,0x0d,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x0b,0x0f,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x13,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x70,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x93,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x21,0x23,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x71,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x74,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3a,0x12,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3a,0x1d,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3a,0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 21775}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3a,0x07,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x10,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x1a,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x27,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 10731}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x2d,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x2d,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x3d,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x41,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x42,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x05,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x3b,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x23,0x6a,0xca,0xfe,0x00,0x00,0x00,0x00,0x00,0x05}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x32,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x53,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x53,0x29,0x00,0x00,0x00,0x00,0x00,0x50,0x01,0x09}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x00,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x53,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x72,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x41,0xf0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x33}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x44,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x60,0x92,0xd7,0xbd,0x0a,0x39,0x3e,0x52,0xb6,0x5d}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x60,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x63,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x60,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x61,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x81,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x02,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x33,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x01,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x2b,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x32,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x04,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0d,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0e,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0e,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x72,0x18,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x73,0x16,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x50,0xb6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x51,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x23}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x02,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x21,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x62,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x1c,0x0c,0x77,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x10,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x44,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x04,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x53,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x80,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x37}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x80,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x32,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x03,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x0f,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x12,0x1e,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 15000}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x2e,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x2f,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x34,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x34,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x39,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8335}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x3c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x3c,0x82,0xfe,0xa1,0x00,0x00,0x00,0x00,0x06,0x66}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x06,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x0f,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x61,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x42,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x56,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x10,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x18,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x19,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x1c,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x25,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x25,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x25,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x26,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x2d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x2d,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x03,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x06,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0x00,0x2a,0x0d,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x01,0x04,0xf9,0xc0,0x10,0x12,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x04,0xf9,0xc0,0x10,0x17,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x01,0x5d,0x00,0x00,0x01,0x04,0xb6,0xd2,0xbf,0x9c,0xff,0xfe,0x45,0xb8,0x34}, 8333}, - {{0x2a,0x01,0x07,0x9c,0xce,0xbe,0x70,0xcc,0x1a,0x03,0x73,0xff,0xfe,0x48,0xe6,0x91}, 8333}, - {{0x2a,0x01,0x07,0xa0,0x00,0x02,0x13,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333}, - {{0x2a,0x01,0x07,0xa7,0x00,0x02,0x12,0x18,0x0e,0xc4,0x7a,0xff,0xfe,0x83,0x83,0xc4}, 8333}, - {{0x2a,0x01,0x07,0xa7,0x00,0x02,0x12,0x88,0xea,0x39,0x35,0xff,0xfe,0xf0,0xc4,0x29}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xaa,0xba,0x00,0x18,0x50,0x54,0x00,0xff,0xfe,0x2b,0xdf,0x20}, 8333}, - {{0x2a,0x01,0x07,0xc8,0xff,0xfa,0x05,0x0e,0x30,0x35,0x74,0x1b,0xbe,0x02,0xb5,0xde}, 8333}, - {{0x2a,0x01,0xbe,0x00,0x00,0x10,0x02,0x01,0x00,0x00,0x00,0x80,0xce,0xce,0x00,0x01}, 8333}, - {{0x2a,0x01,0xcb,0x00,0x05,0xbe,0xd5,0x00,0x02,0x27,0x0e,0xff,0xfe,0x28,0xc5,0x65}, 8333}, - {{0x2a,0x01,0xcb,0x00,0x00,0xb3,0xd3,0x00,0x92,0x76,0x8a,0x8c,0x74,0xbf,0x2a,0x88}, 8333}, - {{0x2a,0x01,0xcb,0x14,0x00,0xb8,0xa5,0x00,0xdd,0x9d,0x80,0xf5,0xd3,0x05,0x68,0xf9}, 8333}, - {{0x2a,0x01,0x0e,0x0a,0x00,0x20,0x91,0x20,0x7c,0x3f,0x56,0x43,0x99,0x78,0x18,0x25}, 8333}, - {{0x2a,0x01,0x0e,0x0a,0x00,0x0d,0x6e,0xa0,0x00,0x56,0xde,0xab,0x1b,0x2f,0x30,0x0b}, 8333}, - {{0x2a,0x01,0x0e,0x34,0xec,0x16,0x93,0xf0,0x72,0x5d,0xd8,0xd2,0xbb,0x90,0xea,0xbf}, 8333}, - {{0x2a,0x01,0x0e,0x34,0xee,0x33,0x16,0x40,0xc4,0x18,0x3c,0x3a,0x8f,0xf6,0x3e,0xab}, 8333}, - {{0x2a,0x01,0x0e,0x34,0xee,0xd7,0x66,0x70,0x28,0xc0,0x18,0x3c,0x77,0x83,0x7d,0xc3}, 8333}, - {{0x2a,0x01,0x0e,0x35,0x2f,0x7d,0xa0,0xb0,0x59,0xc2,0x3c,0x8a,0x95,0xa2,0xc4,0xd1}, 8333}, - {{0x2a,0x01,0x0e,0x35,0x87,0xba,0xd0,0xc0,0x75,0xa2,0x9f,0x39,0xef,0xcb,0xf5,0x9f}, 8333}, - {{0x2a,0x02,0x12,0x0b,0xc3,0xc5,0xce,0xf0,0xec,0x82,0xa4,0x3d,0x04,0xd6,0x0d,0xc2}, 8333}, - {{0x2a,0x02,0x12,0x0b,0xc3,0xd1,0xf2,0xd0,0xee,0xa8,0x6b,0xff,0xfe,0xfc,0x22,0x65}, 8333}, - {{0x2a,0x02,0x01,0x68,0x40,0x4c,0x00,0x00,0xee,0xa8,0x6b,0xff,0xfe,0xf3,0x7d,0x5c}, 8333}, - {{0x2a,0x02,0x01,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x17,0x10,0xb6}, 8333}, - {{0x2a,0x02,0x01,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x8f,0x53,0x8c}, 8333}, - {{0x2a,0x02,0x01,0xb8,0x00,0x10,0x01,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x02,0x21,0x68,0x0d,0x05,0x2c,0x00,0x02,0x16,0x3e,0xff,0xfe,0xf7,0xa0,0x99}, 8333}, - {{0x2a,0x02,0x25,0x28,0x05,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14}, 8333}, - {{0x2a,0x02,0x25,0x28,0x00,0xfa,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x27,0x70,0x00,0x17,0x00,0x00,0x02,0x1a,0x4a,0xff,0xfe,0x7b,0x17,0x5f}, 8333}, - {{0x2a,0x02,0x27,0x70,0x00,0x05,0x00,0x00,0x02,0x1a,0x4a,0xff,0xfe,0x44,0x83,0x70}, 8333}, - {{0x2a,0x02,0x28,0x08,0x54,0x01,0x00,0x00,0x02,0x25,0x90,0xff,0xfe,0x4e,0xee,0x42}, 8333}, - {{0x2a,0x02,0x03,0x90,0x90,0x00,0x00,0x00,0x02,0x18,0x7d,0xff,0xfe,0x10,0xbe,0x33}, 8333}, - {{0x2a,0x02,0x07,0x50,0x00,0x07,0x0c,0x11,0x50,0x54,0x00,0xff,0xfe,0x43,0xeb,0x81}, 8333}, - {{0x2a,0x02,0x7a,0xa0,0x16,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x90,0xeb,0xa2}, 8333}, - {{0x2a,0x02,0x7b,0x40,0x3e,0x4d,0x9e,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0x50,0xd1,0xe0,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0x59,0x28,0x0f,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0x59,0x2f,0xa5,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0xb0,0xdf,0x82,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0xb0,0xdf,0x89,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0xb0,0xdf,0x8b,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0xb0,0xdf,0x8d,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x7b,0x40,0xd4,0x18,0x6f,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x81,0x08,0x23,0x40,0x1c,0x18,0x00,0x7a,0x23,0x1e,0x14,0x30,0x7f,0x12}, 8333}, - {{0x2a,0x02,0x81,0x08,0x9c,0x3f,0xdd,0x18,0x92,0x2b,0x34,0xff,0xfe,0x30,0xac,0x42}, 8333}, - {{0x2a,0x02,0x81,0x0d,0x8a,0x40,0x36,0xf8,0x9a,0xf2,0xb3,0xff,0xfe,0xe8,0x6d,0x7a}, 8333}, - {{0x2a,0x02,0x83,0x88,0xe3,0x01,0x71,0x80,0x02,0x01,0x2e,0xff,0xfe,0x82,0xb3,0xcc}, 8333}, - {{0x2a,0x02,0x09,0x08,0x02,0x13,0x54,0xa0,0x39,0xbf,0xd4,0xaa,0x60,0xb2,0xd9,0xc3}, 8333}, - {{0x2a,0x02,0x09,0x08,0x04,0xf0,0x7e,0x1c,0x50,0x54,0x00,0xff,0xfe,0xb7,0xce,0x4b}, 8333}, - {{0x2a,0x02,0x09,0x30,0x00,0x01,0x00,0x00,0x02,0x50,0x56,0xff,0xfe,0x8e,0x28,0x19}, 8333}, - {{0x2a,0x02,0x0a,0x80,0x00,0x00,0x20,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x00,0x00,0x51,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x20,0x08,0x02,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x20,0x10,0x62,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x20,0x16,0x43,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x20,0x17,0x21,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x20,0x18,0x17,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x20,0x18,0x82,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x30,0x02,0x27,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x05,0x30,0x02,0x65,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x00,0x00,0x38,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x07,0x46,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x09,0x02,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x10,0x77,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x12,0x48,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x14,0x41,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x14,0x56,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x14,0x99,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 18333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x15,0x37,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x15,0x39,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x15,0x59,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x15,0x66,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x16,0x23,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x16,0x93,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x19,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x37,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x44,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x47,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x58,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x73,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x81,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x17,0x89,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x18,0x14,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x18,0x30,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x18,0x32,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x18,0x37,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x18,0x47,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x18,0x74,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x19,0x10,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x19,0x14,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x19,0x20,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x19,0x02,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x20,0x19,0x35,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x01,0x93,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x12,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x41,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x56,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x71,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x72,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x76,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x84,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0xce,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x0e,0x00,0xff,0xf0,0x01,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x02,0x0e,0x00,0xff,0xf0,0x01,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a}, 8333}, - {{0x2a,0x02,0x0e,0x00,0xff,0xf0,0x01,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x69,0x30,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x03,0xba,0xb0,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x08,0xce,0x40,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x01,0x16,0x50,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x01,0x2a,0x00,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xfb,0x60,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x04,0x09,0x10,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb8,0x90,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb8,0xa0,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb8,0xe0,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb8,0xf0,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x00,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x10,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x20,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x40,0x01}, 8333}, - {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x5e,0x48,0xd0,0x01}, 8333}, - {{0x2a,0x03,0xee,0x40,0x00,0x00,0x02,0x94,0x02,0x50,0x56,0xff,0xfe,0x8d,0x4a,0xd7}, 8333}, - {{0x2a,0x04,0x21,0x80,0x00,0x01,0x00,0x0c,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x15}, 8333}, - {{0x2a,0x07,0x04,0x40,0x20,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x0c,0xa0,0x18,0x17}, 8333}, - {{0x2a,0x0a,0xc8,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd6,0xbc,0x4a,0x3c,0x6d,0x03,0xa9,0x4e,0x1f,0x55}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd6,0xec,0x32,0xc1,0x59,0x9c,0xd8,0x46,0xd5,0x48}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd0,0x4b,0x2b,0xe5,0x74,0xc4,0xb0,0x1c,0x49,0xb1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd1,0x79,0x73,0x7d,0x9b,0x37,0xab,0x3b,0xc0,0x43}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd2,0x3a,0x8f,0x2a,0xb7,0x71,0x8c,0xd3,0x67,0xdf}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xde,0xfc,0xb8,0x18,0xa5,0x0f,0x26,0x6e,0x99,0xec}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdf,0x34,0xea,0x00,0x93,0xac,0x32,0x62,0x3d,0x37}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdb,0x29,0x3c,0xb5,0x05,0x98,0x81,0xdb,0x7d,0xd4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdc,0x1e,0x17,0xcf,0x86,0x53,0xf6,0x3b,0xb7,0x51}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdc,0x79,0xc1,0x8f,0x29,0x44,0xf2,0xdc,0x00,0xf6}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdd,0xe8,0x28,0x36,0x77,0x7f,0x46,0x37,0x03,0x3d}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe7,0x2c,0x05,0xb5,0x95,0x59,0xc5,0x00,0x6c,0x5a}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe1,0x0f,0x31,0xe2,0xb5,0xc9,0xc2,0x17,0x78,0x5d}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe2,0x48,0xa0,0x9f,0xe2,0x1a,0xca,0x30,0x6e,0xa4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe3,0x09,0x6b,0x3b,0x41,0x2d,0xd5,0xe5,0x9b,0x65}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xee,0xe7,0x24,0xcf,0xd9,0x86,0xd0,0x09,0x57,0xb0}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xef,0x3c,0x49,0x0b,0xc1,0x74,0xc2,0x92,0x86,0xe1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xef,0x73,0x9c,0xc9,0x5f,0x44,0x2b,0xe7,0xec,0x96}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xef,0xa5,0x34,0x24,0x5e,0x50,0x8d,0x6f,0x15,0x6a}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe9,0x17,0x9b,0x08,0xdc,0xbe,0x24,0xe3,0x01,0x6e}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe9,0x79,0x89,0x41,0x5c,0x21,0x07,0xc4,0x8a,0xa9}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xea,0xb6,0xeb,0xd2,0x5a,0x58,0x00,0x16,0x61,0x0f}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xeb,0xe7,0x4c,0xbd,0x60,0xb0,0x77,0x2a,0xc9,0xd2}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xec,0x58,0xf9,0x46,0x23,0x0e,0xea,0xf2,0x9b,0x27}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xed,0x9a,0xa8,0x65,0x39,0x49,0x0e,0xc8,0x7c,0xed}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xed,0xef,0x28,0x1d,0xef,0x42,0x35,0xa7,0x98,0x92}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xee,0x0d,0x2c,0x85,0x41,0x08,0x29,0x94,0xdf,0xec}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xee,0x75,0x23,0x93,0x83,0xf1,0x6b,0x11,0xb5,0x84}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf7,0x21,0x13,0xe2,0xe6,0x5e,0x12,0x93,0xa9,0xa4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf2,0x9b,0xff,0x28,0x09,0x12,0xa0,0x6d,0x68,0x0e}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf3,0x34,0x88,0x19,0xb0,0x4d,0xcf,0xfa,0x2f,0x0a}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf5,0x84,0x56,0x84,0x3b,0xab,0x01,0x6f,0x0a,0xc0}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf6,0x70,0xdb,0x84,0x34,0x79,0x58,0xda,0x8b,0x66}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xfc,0x9b,0x2f,0xc4,0x14,0x8b,0xd8,0xb5,0xe0,0x28}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xfd,0x8e,0x09,0x64,0xda,0xd3,0xc6,0xaa,0x94,0x4a}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x06,0xc1,0xe7,0xaf,0x38,0x13,0x99,0x7e,0x9a,0x16}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x00,0xa5,0xf3,0xe1,0x60,0x00,0xd2,0xa9,0xfd,0x8a}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x01,0x9f,0x61,0x55,0x17,0x00,0xc2,0x86,0xe0,0x93}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x02,0x61,0x59,0x61,0x66,0xed,0xc7,0xda,0xcb,0x78}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x02,0xa6,0x52,0x02,0x0a,0x0b,0x55,0xdd,0x04,0xb7}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x02,0xc3,0x22,0x35,0xb2,0x60,0x64,0x6b,0xae,0x5b}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x02,0xe3,0x4c,0xc4,0x79,0xfd,0xc4,0x45,0x7b,0xe5}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0x3c,0x08,0x6c,0x6b,0xa6,0x76,0xd4,0x89,0xb3}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0x88,0x5c,0x5c,0xcd,0x79,0x80,0x8b,0x6a,0xe6}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0xf4,0x58,0x9b,0x4c,0x04,0x2e,0xf6,0x29,0x43}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0xf9,0x9c,0xf1,0x0c,0xb8,0x46,0xbf,0x3d,0x71}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0xc2,0x1a,0x9d,0x5b,0xd3,0x31,0x41,0xb7,0x18}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x04,0x56,0xe1,0x55,0xd6,0xbc,0xda,0xb0,0xbd,0xdb}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0f,0x47,0xe2,0x4c,0xab,0x4b,0x34,0xb4,0x93,0xb8}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x08,0xed,0x51,0x58,0x05,0xcb,0xe5,0x28,0x09,0x49}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0c,0x6d,0x02,0x65,0xbe,0x59,0x3b,0xcb,0x68,0x21}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0d,0xef,0x55,0x07,0xe2,0xcc,0x6f,0x3a,0xe7,0x42}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x16,0xa6,0xf8,0x28,0x19,0xe2,0x0e,0x9c,0xd8,0xc1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x11,0x85,0x5d,0xea,0x21,0x08,0x53,0x8c,0x65,0xd6}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x12,0x95,0x07,0xac,0xca,0xcb,0x8b,0xce,0x9f,0x58}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x13,0xf0,0x58,0x06,0x5c,0x2c,0xb7,0x56,0x85,0xe5}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x14,0xf3,0x4c,0xdd,0xb5,0x58,0x3b,0x7a,0x87,0xf9}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x15,0xb8,0x88,0x54,0x43,0xc7,0xbe,0x1e,0xcd,0xf6}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x16,0x2a,0xf3,0x4f,0x5d,0xd7,0xf8,0x8e,0x87,0xe2}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1b,0x28,0x39,0x47,0xf7,0xf9,0x07,0x5c,0x19,0x73}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1c,0x82,0xde,0xec,0xba,0x1d,0x9e,0x7a,0xf5,0x97}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1c,0xa5,0x01,0xa7,0xcf,0xbb,0x72,0xa9,0x9f,0xc8}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x26,0xf2,0x12,0x3c,0xf5,0x14,0x19,0x91,0x41,0x51}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x27,0xb6,0x8f,0x8b,0xf0,0x06,0x42,0x39,0xa5,0x80}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x22,0x28,0x04,0xea,0x09,0xa8,0x5b,0xfd,0xfd,0xe7}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x23,0xf4,0xc4,0xe5,0xd7,0xda,0xaa,0x1f,0x02,0xfc}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x26,0x2a,0x5b,0x90,0x85,0x8f,0x08,0xe5,0x10,0xb1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2e,0xda,0x54,0x38,0xfa,0xfa,0x75,0x75,0x94,0x9d}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2f,0x49,0x9b,0xbc,0xe6,0x3a,0x9a,0x50,0xc6,0x66}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x28,0x09,0x61,0x65,0x34,0xcc,0xb9,0x62,0xdc,0xf5}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x29,0x0a,0x89,0x09,0x50,0xa7,0x62,0x08,0x13,0x62}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x29,0x83,0x29,0x6f,0xbb,0xac,0xaa,0x06,0x8d,0xbf}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2b,0x56,0xa8,0xba,0xd2,0xc4,0x4a,0x4a,0x07,0xd2}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2b,0x5d,0xc0,0x01,0x4f,0x5f,0xa4,0x6f,0x63,0x9f}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2b,0x5e,0xd4,0x8d,0x5a,0xe3,0xf2,0x61,0x3d,0x77}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2b,0x89,0xcc,0x31,0x39,0xe1,0xd2,0x77,0x5a,0x83}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2c,0x17,0xcd,0xf9,0xb9,0xfc,0x06,0x89,0x6d,0xaa}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2c,0x4e,0x5a,0x0a,0xd6,0xed,0x4c,0x72,0xfc,0x55}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2c,0x63,0x72,0x16,0xbd,0x1a,0x23,0xd3,0xb3,0xeb}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2d,0x04,0xa2,0x45,0xcb,0xc5,0x2b,0xf2,0x05,0x60}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2e,0x7c,0xd9,0x21,0x3e,0x4a,0x31,0x4b,0x2e,0x42}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x37,0x20,0x5b,0x0a,0x9d,0xb3,0x3f,0x92,0x75,0x66}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x30,0x7b,0x87,0xc2,0x7e,0xd8,0xe9,0xbb,0x14,0xed}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x30,0xb0,0x34,0xf5,0x03,0xda,0x45,0x7c,0x07,0x31}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x31,0x6a,0xd6,0xb6,0xc2,0x18,0xcb,0x97,0x48,0x15}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x33,0x96,0x4a,0xd7,0x00,0xc0,0xe4,0x3a,0x52,0xda}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x34,0x39,0x2a,0x7a,0x53,0x4b,0x5d,0x28,0x53,0xdf}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x38,0x78,0xe8,0x90,0xcb,0x74,0x7b,0x7d,0xdd,0xc0}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x38,0x68,0x04,0x47,0x7f,0x1d,0xda,0x15,0xd2,0x36}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x38,0xc1,0xf2,0xd7,0x30,0xdd,0x5c,0x7f,0xb2,0x9e}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x3b,0x6a,0xad,0xbc,0xd5,0x41,0x30,0x8b,0xe0,0x5a}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x41,0x6d,0x7b,0x51,0xa9,0x07,0x1e,0x6b,0x60,0x66}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x42,0x58,0x16,0x65,0x14,0x68,0x65,0x9c,0xde,0x69}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x43,0x7f,0x1e,0xa0,0x8e,0xfb,0x8c,0xab,0x85,0xa4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x43,0x71,0x2a,0x9c,0x0a,0x8d,0x16,0x6f,0x2e,0x72}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x45,0xa3,0x60,0xda,0x52,0xfa,0xca,0x05,0x94,0xdc}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x48,0x3e,0x36,0x19,0x51,0x47,0xca,0x8e,0x7e,0xea}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x4c,0xd5,0x26,0xb9,0x54,0x90,0x72,0xc9,0x7e,0xcb}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x4d,0xaf,0x88,0x1d,0xfc,0xd0,0x99,0x63,0xc0,0xbb}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x4d,0xe2,0x50,0x4e,0x13,0x11,0x2b,0x9b,0x62,0xd9}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x4e,0x3c,0xca,0xe4,0x3a,0x6c,0xe9,0x34,0x60,0x9e}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x4e,0x07,0x0a,0x5f,0x2b,0x41,0x13,0xe1,0xb3,0x5c}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x56,0x8c,0x3c,0xd6,0x38,0x8d,0xff,0x5f,0x2a,0x56}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x52,0x86,0x09,0x6e,0x04,0x0a,0x9d,0x2c,0x1a,0x9d}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x54,0xac,0x5c,0x52,0x2d,0x32,0xd9,0xee,0xd3,0xe1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x5e,0x9f,0x1a,0x66,0x3b,0x63,0x4e,0x82,0x52,0x86}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x59,0x94,0x61,0x0f,0x81,0x8a,0x58,0x78,0xc1,0xa0}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x59,0x95,0x50,0xd6,0x2e,0xf7,0xd2,0xe6,0x3a,0x56}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x5a,0xd6,0x96,0x82,0x6a,0x91,0x4d,0x35,0x9d,0x4e}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x60,0xdf,0x3f,0x5b,0xb2,0x4d,0x84,0xdb,0xce,0xd8}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x61,0xd2,0x22,0x3f,0x22,0xe1,0xb0,0x01,0xdb,0x56}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x63,0x7f,0xce,0x1c,0x28,0x70,0x30,0xdd,0xb9,0x32}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x63,0xc0,0xa7,0x9b,0x34,0xfd,0x18,0x6a,0x6f,0x24}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x65,0x5c,0xcb,0x14,0x63,0x1c,0x0b,0x03,0x6d,0x70}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x65,0xfa,0xa1,0x96,0xf6,0x75,0x85,0xbc,0x33,0x26}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6f,0x19,0xbd,0x64,0x4f,0xe9,0xea,0xe6,0x2a,0x7c}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6f,0xf7,0x29,0x92,0x02,0x62,0x73,0xd3,0xd9,0xa8}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x68,0xb4,0x13,0x28,0xf0,0x71,0xe2,0xcb,0x06,0xf1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x68,0xbd,0x95,0xca,0xd6,0x84,0x0d,0xf1,0x77,0x19}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6c,0x62,0x5b,0x0d,0x91,0x66,0xd0,0xca,0x10,0x2d}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6c,0x62,0xc5,0x19,0x94,0x5b,0xcd,0x20,0xd9,0x73}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x76,0xa6,0xaa,0x68,0x61,0x90,0xfc,0x8a,0x30,0x47}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x77,0xf5,0x9c,0x66,0x35,0xff,0xc8,0x0d,0x06,0xd4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x71,0xcd,0x60,0x77,0x1e,0xee,0x78,0x42,0x33,0xe1}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x72,0xea,0x3a,0x77,0xe6,0xfc,0x6f,0x67,0x8a,0x3c}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x73,0x57,0x97,0x7f,0xfd,0x71,0x86,0xf4,0xb7,0xb7}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x74,0xe4,0x79,0xcc,0x23,0xf5,0x74,0xad,0xa5,0x79}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x75,0xa3,0xd9,0xb3,0xf8,0x35,0xbd,0xac,0xf2,0xab}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x78,0x8a,0x79,0x0e,0x19,0x97,0xa1,0xed,0xc7,0x14}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x79,0x4b,0x68,0x5e,0xb4,0x58,0xc9,0x0e,0xf7,0x22}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x79,0x9b,0x9f,0xaa,0xc2,0xdf,0xa2,0x2a,0x09,0xf4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x79,0xf8,0x6f,0x87,0x89,0x96,0x28,0xd9,0xd6,0x3c}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7a,0x4c,0x71,0x22,0xb9,0x53,0x89,0x19,0x12,0x43}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7d,0x3f,0x6d,0xa4,0xb8,0x8e,0x5f,0xf9,0x5e,0x48}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7d,0xea,0xa4,0xbf,0xd2,0x28,0x74,0x5f,0x95,0xc4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x80,0x2e,0xce,0xc9,0xec,0xbf,0x47,0xa5,0x6e,0x8f}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x81,0x1f,0x33,0xf7,0x83,0x06,0x24,0xc7,0xe3,0xb8}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x82,0x7c,0x88,0xc1,0xba,0x47,0xf6,0x41,0x94,0xbd}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x82,0x5e,0x44,0x97,0x2b,0xb4,0x20,0xdc,0xc9,0xcb}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x85,0xc9,0xb0,0xc1,0x2c,0x88,0x88,0xfb,0xbe,0xfc}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8a,0xdc,0xd4,0xb3,0xf4,0x47,0x8a,0x3c,0x67,0x87}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8c,0xbd,0xbe,0xca,0x5a,0xe6,0x19,0x6c,0x41,0x56}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x91,0x90,0x89,0xb8,0xc4,0x74,0x24,0xba,0xa9,0x35}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x93,0xd0,0x32,0x45,0xa4,0x9a,0x18,0xc6,0x2a,0x67}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x98,0x7f,0x05,0xa0,0x51,0x9f,0xa2,0x3c,0xdf,0x23}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0xc2,0x95,0x03,0xda,0x05,0xf3,0x4b,0x4d,0xb3}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9b,0x8d,0x4a,0xe3,0xb4,0x7e,0x28,0x29,0xd0,0x77}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa7,0xd8,0xfa,0xdd,0xd3,0x63,0x60,0xd9,0xe1,0xbd}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa0,0x84,0xcb,0x7b,0xeb,0xe2,0x8c,0xbf,0x73,0xd8}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa1,0x1d,0xe8,0xbb,0x02,0xdf,0xff,0xd4,0x3a,0x1f}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa2,0x64,0x1d,0x40,0x49,0x57,0x27,0xed,0x6f,0x99}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa5,0x03,0xcd,0xbf,0x60,0x8c,0xd8,0xe8,0xb6,0xbd}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa5,0x43,0xde,0xb2,0xd5,0xa6,0x35,0xa6,0x19,0x9a}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa6,0x73,0x84,0x9a,0x0b,0x2f,0x3e,0x01,0x28,0x31}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaf,0x4a,0x68,0xec,0xad,0xce,0xdb,0x6f,0x7b,0x73}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaf,0x73,0x2d,0x48,0xc9,0xc4,0x76,0x65,0x9f,0xc2}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaa,0xb7,0x04,0x8c,0x87,0xc6,0x38,0x3b,0x0a,0xf6}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xab,0xb1,0xeb,0x86,0xa4,0x4b,0xaf,0xcb,0x84,0x17}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xad,0x11,0x6f,0xf5,0x46,0x78,0xa0,0xa2,0x71,0x95}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb6,0xe1,0xcf,0xd0,0x58,0x02,0x66,0x54,0x0b,0xfe}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb1,0xbd,0x5b,0x30,0x31,0xce,0x31,0x90,0x3e,0x8d}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb1,0x9e,0x5b,0x5c,0xd8,0xd0,0xdd,0x64,0x11,0xad}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb2,0x66,0xca,0xcb,0x2d,0xa8,0xc4,0xb6,0x88,0x14}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb8,0x03,0xce,0x85,0xec,0x64,0x57,0xd3,0x6c,0x38}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb8,0xd7,0x4d,0xd1,0x39,0x41,0x0e,0x47,0x51,0xdf}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb9,0xb0,0xa6,0x00,0x1a,0x4a,0x41,0x8f,0x88,0xb4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xbb,0x57,0x4d,0xce,0xa0,0x53,0x4d,0x8f,0xcd,0x4f}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xbc,0x9b,0xd4,0x08,0x44,0xe7,0x4d,0x2d,0xc3,0x1f}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc0,0xdc,0xd7,0x19,0x2f,0x48,0xf6,0xc2,0x73,0xb5}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc2,0x9b,0xfa,0xb8,0xbb,0xf8,0x41,0x5b,0x92,0x63}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc2,0xfb,0xae,0x8e,0xc7,0xac,0x11,0x2f,0xc7,0x02}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc4,0x42,0x01,0x09,0xe1,0xc1,0x89,0xeb,0x80,0x20}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc6,0x29,0x70,0x15,0x68,0xf9,0x60,0x34,0x64,0xf0}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xce,0xf6,0xda,0x2a,0x7f,0x69,0x90,0xad,0x89,0xe4}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xcb,0x9b,0xa0,0x84,0x5a,0x86,0x90,0x78,0x4f,0x82}, 8333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xcc,0x13,0x59,0xde,0x4a,0xbb,0x9b,0x4e,0x2b,0x35}, 8333} + }; static SeedSpec6 pnSeed6_test[] = { - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0xcb,0x26,0x31,0xba,0x48,0x51,0x31,0x39,0x0d}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x44,0xf4,0xf4,0xf0,0xbf,0xf7,0x7e,0x6d,0xc4,0xe8}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6a,0x8b,0xd2,0x78,0x3f,0x7a,0xf8,0x92,0x8f,0x80}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe6,0x4e,0xa4,0x47,0x4e,0x2a,0xfe,0xe8,0x95,0xcc}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9f,0xae,0x9f,0x59,0x0b,0x3f,0x31,0x3a,0x8a,0x5f}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x47,0xb1,0xe4,0x55,0xd1,0xb0,0x14,0x3f,0xb6,0xdb}, 18333}, - {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa0,0x60,0x9e,0x46,0x54,0xdb,0x61,0x3b,0xb2,0x6f}, 18333} + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xfa,0x7e,0xcc}, 18323}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0xdb,0xc7}, 18323}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0xdb,0x5b}, 18323} }; + #endif // BITCOIN_CHAINPARAMSSEEDS_H From 48f782443ef8f5ed4ba43a33c2cd5aec0b5b614e Mon Sep 17 00:00:00 2001 From: Integral Team M Date: Mon, 14 Oct 2019 21:15:08 +0700 Subject: [PATCH 02/19] qa fixes only --- test/functional/block_hash.py | 48 +++ test/functional/data/rpc_getblockstats.json | 226 +++++------ test/functional/feature_assumevalid.py | 12 +- test/functional/feature_bip68_sequence.py | 11 +- test/functional/feature_block.py | 18 +- test/functional/feature_csv_activation.py | 7 +- test/functional/feature_maxuploadtarget.py | 8 +- test/functional/feature_notifications.py | 8 +- test/functional/feature_nulldummy.py | 3 +- test/functional/feature_pruning.py | 4 +- test/functional/feature_segwit.py | 5 +- .../functional/feature_versionbits_warning.py | 6 +- test/functional/interface_rest.py | 2 +- test/functional/interface_zmq.py | 7 +- test/functional/mining_basic.py | 35 +- test/functional/p2p_compactblocks.py | 2 +- test/functional/p2p_disconnect_ban.py | 1 + test/functional/p2p_fingerprint.py | 6 +- test/functional/p2p_invalid_block.py | 2 +- test/functional/p2p_invalid_locator.py | 1 + test/functional/p2p_invalid_tx.py | 1 + test/functional/p2p_node_network_limited.py | 5 +- test/functional/p2p_sendheaders.py | 4 +- test/functional/p2p_tx_download.py | 6 +- test/functional/p2p_unrequested_blocks.py | 4 +- test/functional/rpc_blockchain.py | 10 +- test/functional/rpc_getblockstats.py | 2 +- test/functional/rpc_mn_basic.py | 9 +- test/functional/rpc_scantxoutset.py | 1 + test/functional/test_framework/blocktools.py | 3 +- test/functional/test_framework/messages.py | 18 +- .../test_framework/test_framework.py | 40 +- test/functional/test_framework/test_node.py | 36 +- test/functional/test_framework/util.py | 2 +- test/functional/test_runner.py | 369 ++++++------------ test/functional/tool_wallet.py | 8 +- test/functional/wallet_backup.py | 10 + test/functional/wallet_basic.py | 6 +- test/functional/wallet_bumpfee.py | 9 +- test/functional/wallet_create_tx.py | 2 +- test/functional/wallet_disable.py | 3 +- test/functional/wallet_hd.py | 2 + test/functional/wallet_import_rescan.py | 5 +- test/functional/wallet_keypool_topup.py | 3 +- test/functional/wallet_labels.py | 14 +- test/functional/wallet_listsinceblock.py | 16 +- test/functional/wallet_multiwallet.py | 1 + 47 files changed, 494 insertions(+), 507 deletions(-) create mode 100755 test/functional/block_hash.py diff --git a/test/functional/block_hash.py b/test/functional/block_hash.py new file mode 100755 index 0000000000..0523d31d39 --- /dev/null +++ b/test/functional/block_hash.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# Copyright (c) 2014-2019 The Bitcoin Core developers +# Copyright (c) DeFi Foundation +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""Test the masternodes RPC. +""" + +# import time + +# from decimal import Decimal +# import io + +from test_framework.blocktools import add_witness_commitment, create_block, create_coinbase +from test_framework.test_framework import BitcoinTestFramework + +class SimpleHashTest (BitcoinTestFramework): + def set_test_params(self): + self.num_nodes = 1 + self.setup_clean_chain = True + + def run_test(self): + node = self.nodes[0] + + tip = node.getbestblockhash() + height = node.getblockcount() + 1 + block_time = node.getblockheader(tip)["mediantime"] + 1 + block = create_block(int(tip, 16), create_coinbase(height), block_time) + # block.vtx.append(ctx) + block.stakeModifier = 1 + block.nHeight = height + block.nMintedBlocks = 100 + block.rehash() + block.hashMerkleRoot = block.calc_merkle_root() + add_witness_commitment(block) + block.solve() + res = node.submitblock(block.serialize().hex()) + + self.log.info("Python hash: {}".format(block.hash)) + self.log.info("C++ hash: {}".format(node.getbestblockhash())) + # import pprint + # pp = pprint.PrettyPrinter(indent=4) + # pp.pprint (node.getblockheader(node.getbestblockhash())) + assert(block.hash == node.getbestblockhash()) + assert(height == node.getblockcount()) + +if __name__ == '__main__': + SimpleHashTest ().main () diff --git a/test/functional/data/rpc_getblockstats.json b/test/functional/data/rpc_getblockstats.json index 16dbc5fe60..43d459d389 100644 --- a/test/functional/data/rpc_getblockstats.json +++ b/test/functional/data/rpc_getblockstats.json @@ -1,109 +1,109 @@ { "blocks": [ - "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4adae5494dffff7f20020000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000", - "0000002006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f28394022bf44bff30d7399cb5a16e3b94fed67dc174c2e1d77df91bad5a51cb3194ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020e959d05cac787d7f82d1348326a4ca25ead09589befcd4b4513163e5acb5af6612d2f07672102dc6f099c4be308f598e4c4da1a7e0cb462ae14f0444525a13321a4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204401ebd07d42f8f18e80ede81795f728a9eb2a63073274ad92ccb9eda593ff3c5f17ca91704a014c6f68ca623ace6c542950f2e1d2d02ece08fbd440e33af53a1a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03530101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020eab1809c3e750647f588c027df5c9d5735bb8cb2a1a5f182d7b35524b0b8595f9d59f165de689fd9a4b6954b4394d40d7899eef078e6ddb9f7eb036b7b15af2b1b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03540101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020bbe445e86bf69865a0c816690c0e470338bf9d692d388f8186613830afe2f54c07ae38ccc6fd49e7098d6e3149e459a234f30970c6c9a9894df992e3caf97ce31b4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03550101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f5b84b4e3b7e84720a83dae76aad6657c06ec6bbf85d9158c575de09c34631035b263b763b955c4c6d1a97b23e6b4bc5e6ee96d75910845557aaca233fe777fe1b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03560101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002028d52759ccb342b81f2e8d574d8cf116178949f8a595d577098bae70e6969326119c83444b75d63bbe98d8b3a937f0de3a459bda5fdc0fd66c7acd752d19496d1b4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03570101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f461e9c8981911f5180e9a8e28be1d34146460ae4e7583935949f43f6252bb3cb287270caf2d4e735caf0d9888f998b8d7c79443e97933976930919e6dbc0b471c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03580101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d3328d99edb99583b478969aea57e378c2840bfc1df0341963fde16f75636e34a6c85df88c2800c54565eb2e6579b729def99fa9b8ca347ec649b8d4f8db78de1c4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03590101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000206b88980f5b713605233c1c8806639717f753c4aad93617d5e37872a43188af6c8dabd724a42288139a21186c855f23c4fe1d12337ec7b97f87c48389983239651c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002030fd29b0e0e54a5eec463f93dac2fd9d73f383b7467d146a882bee4700f79832a343b1b1867b07ba30134ae555db5816ccd971232b78a9d596e2711d02251c521c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201845eacaca9b23798f32c22414015655035d4918be70e26f56b56e730e195e220bf32e9a8af59ce9264884b0690bb26709616ccf4bfb85812faf87144b2fb8131c4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020353ff17bd0d66a6ee1e784bfbb2497691f49e27c3822aced5125fda6ff09892fe72239d73e75b82916e8eef04a4963e6b500de80a7fdcd89952e23c6d249c5931c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020c6c359d1b891b0a6afa7e0fb685b9c21afe41c8dddd80cd6331ecd856650af3803953a9bf6fc675eb2856718bac5362a12168e7b1baa7dc6b46a4eacd2e8baf61d4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020291a8a183e7ebb538030bc791b0f995a2ac0a766add84d83d3fa9f6fad50075a0857e76b64648e82fd4341931116efccaf147f0bc6e8c107cee68f400530c17d1d4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002081f804c3afb976efbaf9f62d50ca43402fd5a09571cfd93ddaf77d78952ebb3e3db790f598f68da5e0514b03902de787ff0d2457c05a59bfb22547d8ee6f7ed91d4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03600101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204d559298cc1db4c70f422519822a850603ec250f4ab705f51423d67bb2d4a03abfdfd932c91a77b0065183cf1a575e73b9d1322804f869cc640747e7fa36c0531d4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401110101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b49a26625c5d5210a3dbd1aeba62718b828a29dab035b6e028073c3679053c02ee7b702c74ece9d04af3aca5f745aad5d4142d6a15ae12d16157c1449b62b1b31d4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401120101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020655a431b076a153aa7d9d3731b42b4213995f92299a56e6270860be4005d584d33b5d4b94367acd8ef20e10678a75de3c02e143a3f9bb0b0f0c31ed0396454c31d4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401130101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a96f9ad3e058c097d63488627158e074f759a73ae3292b8d8e3e979edcb4e33f0ccd7e3208e9cf08375f36a34f3d71da039e6a33cb8621a67bb484cedc5fb4f31e4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401140101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202ec3fddee36cdcfa564d29eafe073ba79120ecdf8740f62600293b0aad6039419047bdc522883061665549cacc029b05713ad4ae24281eeaf0a041cec3c7d0d31e4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401150101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d2985cee6e78b525c61ad111b0e9a6ad8c222ca793eff2121c23cf06462fd930bfe97d3f071f45d95467db4f5d31d8b7966c26789be3d5c1a5d53c903230abe61e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401160101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020e799bf0166a1e3e7b94d6709fa0edd5feeadac19ddb271ce8e8a6144fd52c23b1699dad3820cb2ba528c13e37550cd32a900ca14f307db9b735daddb523b1d511e4ae75affff7f200a00000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401170101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a6e38cccd5f39851e6f1aaab690b3591ce59ed225bc4815b66ed59f9e604da4beadf823c049567a4628d7b06090ac7f51f1a854c46817a8b6fb8f069a098f8941e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401180101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002067dc38dccecab584fccbd21e1fdcaa8ce69155053eaffe082d51fedff22c26299e57f12478cab2077ac63eecad4a342082c9976addd08ea58896ab334ddf5e6d1e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401190101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200b71cba7f1d43034d1584c309e04bff61a7814896b3fd170f69d8757a81b114b4769be83a7993e5214c7cbb5053a142840cc180e23366cc1d52cd2ace2347a1b1f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002044d38910c5362c279ee6e183c56bb2379f0d053bceea9f2c00f99adaf1a70067de8615ddd58387b2847d215fde3633242c278ef9b18ab9c70963c9060b4a3f101f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b063fc1b09b6f9cd8207b0f9ca9f1549ce2b1de07b7f937275d96461ecacb26a3abf0a5d24c68c0b3df1a58b6128039eca6452810a374a306ac0cb96bd462df61f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002023334826cbee5a6679259a50f8e112332db9663c97a1d08d54e64319dabac73331dbae7789d23e1da14d1ee39a9dea43581ddd9c09a199253ec0bd6c819514911f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020911e28670d744a0cb23495711db6ac20576273eec7ee442b0377ea2d7564402fcc7db46bd4aa8fdf1209e649b3866f5cb79fe3f2cfaf8aadd39a3d43eb084ce21f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002038d6d41fddd3c9278884c9141096360c538d2491ffb078be006222a88a10c854366b75e0a133e1d3f4db26e1b0e9b9820db50dbfb11988e8bb8739420ce1799c1f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204e501ddc49c462c4ca52283614e99e6379b9c6570c947a822b832804e39aee00b037b85318c2f997bd9edda927e85dc2c83f8aa1952dc67556565d141a246186204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401200101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002040cb0b50f15716374c2dc627d1fa6e3eaae67b1b4f1c90a30914e3c89a74de794a98fd86cc22c32f447477016e297c61a4e48135e658e5b5be84638f3a836ee3204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401210101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f51dd27d82fbb9296330e7f105a69ea307303799ca986abe900f00836f181e59a34210d60eb84f3fe493845aadfe404fb4096e599a26f63453c8120257cfc8c2204ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401220101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b696bc517ca5d36092ca1106fd8d31047552e9453a9de51d92cf9226259a491618e806cd5aa13974beb89d41c5040a48242c24bffa8e65e9fdf3bc35e2a7c1b4204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401230101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020358daeb9eef51c07f280abf17c5321023d8cf8bae26254abf25b9268d89a424fb67a604005cd713a7df2c45fbf5f761da51b9c6f21e86a3d8eb40827bbe2764b204ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401240101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200170975c14ec6544367490c04b06294aa57fe978a1da6e5939ee6051d7602928e3676a94ad350f04f371edfe21281df51430055242082d9704030cf5317d0b81204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401250101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002008d02d23a387a7263f5f3475bcd56b380fde9b742bbe83790dd9751701a7923038bfe35d91a9e4e5f8cc714713acfe2d1e96646e61b29b3dc072e5b182fdb45e214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401260101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000206bd75eab3dabdee5a35c0a64de2aa90fb54f2d12b4f37ee60aa28541b51b493f0e5915bc2be5d87850016a330fc36b62f6e40ad7a6d38e0ed6a4f62056ba22a9214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401270101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a42645a785e5dd28047022b724c1af64d507d372b83f3f23899c82b317168262371693330fe6d94f33a962de50891b2f5811a066830c331a240996310b5c6280214ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401280101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a6626233cfb7d9dd7c97f6db305ca20b6a7fc32d5e8ce9b07e35aeaaa7c0af3975cbe08a458c6fc4cd748a39427e29c2b29180293359623e30e2b5639d2d0417214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401290101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000203a5a408e1a076fdc7bfa08460932fa40aedb0471fe808e268ee5768ce173520af5dc75a6bde31efc2ba81a4ea94fe91d3b1ab1ed99975fc5b1cc725f7f20817b214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204cc70837ef7c3804c04419260a2d65ce21515317991751117fb81596ef32c3161154931edf6dd92bb8a13231190f7c0b21bc527e188384770faa53b54aba04f8214ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002070b6275e92ff0b54df08933d70b7d933c3b534b779026630dfb2f96efb860436581cf56e07b7d7e2a377ba0e698f592e464d1ed84bf464b0dd67cb85cbf69f7a224ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a330af8e1dc93fd74b7479c626b1a77c21dec2d240fe7b7d90249da127aaea50773fe8f12bdce2a65c375082dc3db0414e68aacea57f41504cf901a7858b8cf3224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002052841b806090d1d40d221788025ba6ae3a9bb32f352cb12ce4b165be58846a12ee2ad08be6b3e693e3d53a90abe88a8426b342f19f3b271818e66eed4ed1892f224ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002095b86217b1ebf86fa345f2c605f4251b24d5a647710758cbe08340448250ef015f65e5752628c0a0131fc31fac03ed3a2ab0d2c1407414d4dfdc1680037a3b38224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020757dfdbb6f52e389a0ed997dff15de8682d55f9e241d3b53b254f19fd96b926860d0c537aaa527616248c9e50fd776e801eb5dc5d9ef034251b846359da84bc1224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401300101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204c5ff56d6188016b722ba01c7d3b74bc530820b7dff447efbb8c5e756def2d25bdb8e2a27ead1a99e184a87195f06f858b810add552f6bf0127c0a36ec101a60224ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401310101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002064c6f9651c489cb014e8d5271e1f711b71d20d865ab7561b26bea5c85fe6957b6326b1ba78a33db0f148a07e1d49437ca70ae9d73544c183d2cfdf814fd7ff37234ae75affff7f200700000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401320101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020bc955dccd950bcd6051723e18c87ba5114103eb66c136d4bde1070b99678c12f6192856637c104e86194dc91e1550447d83b7124a230871020c37454f2ec82bf234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401330101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200f4e7a95470e9056dda68e82b62a61cae778e88b6e35a4714bdfa3bff8b6e846c45be9fa19a24d90a3180a562bdd8b8a5b71d4c2e0a9f84b6c55c439ebf2f22a234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401340101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002044388dd29a4f16901222a7beeb49315884c0583a2c31a2f8865536931ff8ec4442553d33ba0273b54c52e589523cde509eb117046f5e63bd5e8a5a96f467c5f1234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401350101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020438366e968619730e26031d71e8208d31ab6cb7c242acb65f3d1769157cb971210b6afd88e0ce95bb14554c6dad04012fa8ce0c88a5932ad71da4d04a15d44c3234ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401360101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020c38296d021842f437d04f8515079f943f0a1c8437d8f2c329499c32c0448ae1d961fb68ada366165b25199757ce8a527f11d0744bbcbaad402815e09623dae04234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401370101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020101cd76ca645831e3a55898707454b2405151a06f8c8cee7822d148ca1251d12fd945975eb3855e5f0cd2afafd20b169a7763bdc73b64d1c2f096425d9c902eb244ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401380101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f7735468f9b54bae6399754a1ba4b5ee620af1dc6a46261f4d8ab4d872818f35507916cc69e748edc3a9feadf7b79d1d19f16140e8f3260d7fbe9d1620e55f26244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401390101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000200bc5d881eeab42717526d45d8475fefb1940bbf03c5726174e64379e5a23bf5cbc75b97dfb5771d55e7bd108bb109705ba34952511ab96646cd2db4539fc3b2b244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002094a466199740a3c77035005e1fe5ae603df04ab18c429abfcc385b93681b75390e0d6b356161c1ccbe486a26b777ff01b1247cd6b4b9d4d5b0f958d2e887caab244ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b5e8aad67d17f4f047da10404862703a89feab21624801f785cfe77af4a71d6b87994452ce4bfdc92a07f49ed16903e68d8d48191e31d9558dad4805718311d5244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b0ed4309ee1541c2dc5480b14092940b88870b9d4ca32ca448e7eaffc1d74978b9c5b6e8c1739811c932cdbecd192ae0bead4068782ca2e98805b8174d40f213244ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000205caa7f7a1817fcf6b454b156301f44edbb71cd19de098d9261305aa5731cf073faa4b4bcef4b3ed44ddf9b2b708397114484aa262a538c81b04103a02d8c033a254ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020c7ec1d68a2b4309b255ebc418cc4c8c1a57892bb3c6360a07d22b526ffba6a38436088fcdbf94cabbacefee23bb69b5ac30e3627f94500746630163249cc5029254ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002014c877261aa37fc58f703b64278f1d611b6faddd582e33cc7f1e7e63ad75df6cbd9d279982bfe391b013160a66675ed11debd83c32a9efa02351eee65ac96d09254ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401400101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202b5cbee48cac714ff220fafa0cd4304f452e5c5b63dc5cd4f27072cc4ba7e9376f1f5aac2480c10e93e13f3be00b38523dc036eb6ae49b93f815140ee2b08a27254ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401410101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020aebd16a2c6cf18789e213338ee08bcca42d89e7c9f9220cf80e803cf9b67205eb58e2687eae141c7bc9656b434bc95900a6935f00db43dc23ac155e380af8e9e254ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401420101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020984d2d236668762da13fcb8f811401c1928a1df9a9896a4cc382912669b0b13642ad8e61dd8e6c702869587acb0d09b3355a1be27cb20ea909f51287f9e1b010254ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401430101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d8ca9b5782f98937be5967d0c34aabdcdddc0201e17b70e4071e320bbb2c06418d020f678641ba278d49d70430385ede2f830c46aa49ff7a3febe99d2a9896a9264ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401440101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002017dad2d355421342e973abef035c18398d83dceccd6372269f6bbe6e844fcd52d9c4bce498d350184aae9af97f0aef0f366356d50b926c59bc1605ff6f41f144264ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401450101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020ab1775daac96add2d038b5046be91c90b597b8ed11038b2b9da32f47537d106556d820e14b52e6f4fd113554754f3a8d65b80e7dfab2c84c5e7bb41a30c39977264ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401460101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204dd398d0716e12f3397c9de79cc644ae3d63c6b90c579f5872d76820dd79260fc5808f07c0d1a3e6a23c9e8dc84d58c12758cd61a2f0e8ec3694a1ac08a89bda264ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401470101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020ed9c915c725956194c078ed08ad2508ec34a6b868c21226d14213904bb3c4c50f385dbbdfd18fa6f8355a89c58370c50a71f59f44e2d2e505fb861960d155705264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401480101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020b2f8525fa7a276f4a078bdad600074c49df4c237aae27cadb60ecf91eb7b8d42c21e035455f17270ff5e2a53c57c8c663f31cdb7a3a929de1499e3117358108f264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401490101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020897b6cc09bd1b7cb5d42c648498199aba4008875614e021898b121e8e751f34cf0b8a1a4c993ffd133335d84b9aba6159bb8129384a253131d1998f28c3d371b274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000206a9836bb25994ab592060389b119cb8f7a19a64acd27f9665eab93b235803170ec6385bd31ab432ed3a13f7a6cdf0a6c87fe50c614372a58a5a3716c34456e83274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000208202cd4938b8eef65707e3b6cbd025780f7220fdfea8bc897e802da008026d29043cd5b1662309701440c7941d61cfb95d0c98e22ff8ff8b5994149e988ab179274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002074eed60562b3fabf1cfbd4efd86acd62a470dc264b81b98c784dce4a57f56614d713809d3b1678f325563577d3b6dd9ae4f1e5b05b70c3b16abd67d7161d9002274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002072677aab7f4bb3af82841c6a7100df3ac5e8b643d9e88bb271b2da39c575222aadfd5417618dde8d0ee9191c4b110d0c76dcb65eb8adfd3f8a32a35ccceee445274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020508ed0a8978dd8a6a4e55bb5bc27dd8edae3838d4ddba461332da10f0fb901080c5a78ea3fb056e326e873cea75009c29c401fb77a415ee64ae4eca44bd617dd274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202004607f94d91d8eca99a860ed208c53a4fd53f38889c77dc35b31a676eef1625ee8e5c95cb2105d0b8268ed13eaac6236eb3405df3099fc52d62169d218fcdf284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401500101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204374d19a51a307de1344af36d893991965f58779adbc4b1c1045d5d8e14d6d0b034e10cf7e5158f62fe2674c89e8fc4ee94d2da62d81c0ffc8a237e8dfcb3e21284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401510101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002037320af6c9cc617be33ba517458ae4607b1c0e3e007268669cf5c799e93ebe67f182660cef31f84c0c6b384f084b243a77e2c271be610ac958124076306d9170284ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401520101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201ea13062078bd8f70060208d6973bd55789cbf2f221e8690f1a78254a597a1434a16aa13a90a872e0dd3046458114dc745e37d2928bd9ff306ce7adb2567efb3284ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401530101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002052fe4aa74774077ea9a1c27fea59dfa12b75f7ad46746f8458eb67acaeb9803921a47de6874e6c2359af86d72abdee12b27bcebe0f1ce48751055005813d3f42284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401540101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000208ee41caa2f3076233035157fde7c5c2795a81b85d5e27ce7898e301679e91c4d2d38f595981a444c7d868166ae50e371d83b5f59802bebfed056b93aad1b971e284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401550101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201a0eea032f4abd74aa1bf1151e2966433175ecdf2d68b750b509305bc5663e3641f55e2175bc1d50b4d8a83f167091059a2a6e7d1a24d8223f50ca41313eef1b294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401560101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000207403c2bca2c06351f16746d3360a1a7dceb5194d57879caee03a8316ec774a608a5d44cb75516291cdf62cd51a1a9c71fd3d4879737d88216c6c4c6bffb0784a294ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401570101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f2be7a9ba2c914d5ee97c819cb096aa9d2c715d2f74e9dcf8a12cc83ac48475e4e332a45285f3fff16e8c5cf79107ee110dc2a2f84456205f43d8f4e237a10da294ae75affff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401580101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000205fc71ff65dd07485e26129b765937f514315487b27f0e431c5da7de97b397a4f1d984f86e81bd2c9db53c3515b6e3d6a28187b50adffb87df25608b738190bcf294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401590101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020d7befb40f244eb69f02a3253bcc9b14f5c2697261e158288e7d0b48eab34f12eeac43d0751178d2574aa20506d1b91af13af688a8dfcdf1a48806f63e53b3245294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015a0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000204a0082f8508319d99c86cc074cfedcf26fb98f2e6d0c27d602a9d6ed6d04db042163e10278a5cc75003c52739df112f1ea4fe0ed250ace8e544ecde713f47bfe294ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015b0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000203de23751fef24f5d30565808862dd364e209fc0f7bf83874ebcc8f155e65574acda81243c6a438daeb547e1b36c9a5441e6556bf16bb9bfb839628c39a3785162a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015c0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002045addce76c20d564ac3ff6b955e8ecf2185a5aa355a0d3ac7fd29448dcfb9c1ed184bdf283ba671c76c99173e4ec87e45dd97331c9000070edc81093bc4c7c872a4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015d0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020a7e8079eccbca3b4a4a0136ef27478b45352270f2f8947ab83eea09b06cc826ab29d7b37989b6570510e368a20f4fee2ca0142044f96a027830abdf438ddf7592a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015e0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000201f28203982fc7c2fc155361d00ef7e69ac9fa9c35ff3d10e8fd1a0004e9b10528488982a149b5ac96bef6be131e0b2f0ad9269ba66c9b4216901c0b81523123e2a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015f0101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020435d68020c01c6088e4013cb4f349009e65c28ffa0630baf5dde1676df55481513a48742e06190847a40cabbda6d48f715802bdb3cbab7ad7a2e5c345d557b082a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401600101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020e525dd596c4b9ca78d964ef7997063d35af98665f62e9da62ed9c7fb38c9f57f5abfb8140edec21a383e1e3e31288ee0130a86564e5c3da9764594d8365134652a4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401610101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000203d4144c4bd71aa7f71af930a98087d3786e697335fc1eb11177bedcdae72a61549aa4519391183deb58058f99a6abb7638fe81f079b31c4e090d486c49e047ac2b4ae75affff7f200500000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401620101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "00000020f44e7a48b9f221af95f3295c8dcefc5358934a68dc79e2933dc0794b350cad0a90fad2cd50b41d4ef45e76c2a456b98c180632bb4b44e0cd18ce90679fe54e552b4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401630101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "0000002087454276cce83f4d19e0120f6e9728ac5905f7adaf6b27e3f5bbe43ab823f85db7d1f44666531483df3d67c15f2c231718ad93b63b851dce5ff4c4a67f524ffa2b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401640101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000202cdc3e99f07a80252dd6097faa0eddf3f2dde5ae390610e0bca94ecc25931551d31fceb8fe0a682f6017ca3dbb582f3a2f06e5d99ec99c42c8a744dd4c9216b82b4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401650101ffffffff0200f2052a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", - "000000209b3ace9bd510918d20e87518c0cf5976cab3e28cc7af41259a89c6dd7668a32922808b8a082be71bcd6152cb8fd223650b5579a41344ba749e4d17b9bf211a9e2b4ae75affff7f200000000002020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff026c03062a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9edb85d8f3c122c43a72f1e0dd122c8f7af040aa0b0a46001621110fb37818021510120000000000000000000000000000000000000000000000000000000000000000000000000020000000128394022bf44bff30d7399cb5a16e3b94fed67dc174c2e1d77df91bad5a51cb3000000006a47304402201c16d06a5c4353168b3881071aea7d1eb4d88eedfea53a9d6af9abb56da9060002205abf3ae535f1f1b5cfe8ba955535c2b20ac003e7d7720c5b7d2640ac2a04d19001210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff0294b89a3b000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac00286bee0000000017a91452bab4f229415d0dc5c6d30b162f93a1a0cac5958765000000", - "000000200fa168b50a79ad24378a6b0f96e4c9f4ccb657a2663320d5fc1efd8ee7caa10ab42a31c444f2153387530a0979d4dc3dcc134b394c821227b8abff930c03c8412b4ae75affff7f200200000004020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401670101ffffffff02e015072a010000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0000000000000000266a24aa21a9ed20376d4bc90f9c689850eec3603cda658ba6295241730473ceb0e970b8d594150120000000000000000000000000000000000000000000000000000000000000000000000000020000000191e549a6cc852bbf1d3f11144b1a34079f64305e6971d2e685d2b40cd386e8a6000000006a47304402200bf62021c0a9a47ced8eba1e0998f5c71b2950763198d83ad284bd791241dbb00220446a05b7c35e7458924de88a8dcccab1ec6a106aa005345e55b482d8eb66337301210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff02acdbf405000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac94d7a4350000000017a914dfa6f0b17d2c64962c94203e744a9d4179ed22c18766000000020000000112d2f07672102dc6f099c4be308f598e4c4da1a7e0cb462ae14f0444525a1332000000006a47304402200a6a2f544f3f9d299608a7c745e2326de176fb1cac03ae3e74943f4250b8896e02205023a5b4faff99865bf91f1263605a502c723628be9240c0b7bec81d2ed106f101210227d85ba011276cf25b51df6a188b75e604b38770a462b2d0e9fb2fc839ef5d3ffeffffff0200ca9a3b000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac94166bee0000000017a914152cc82f7944f5c416de7dbffb052f7081765d7987660000000200000000010191e549a6cc852bbf1d3f11144b1a34079f64305e6971d2e685d2b40cd386e8a601000000171600147cc872ad7350c37fecab9c4c6d9f08aceb53bdb8feffffff02005ed0b20000000017a914aab1c8c53fe62e283a53efa28097709f4f2ed37b87e0bc9a3b000000001976a9142b4569203694fc997e13f2c0a1383b9e16c77a0d88ac0247304402201b4476f238ed5d515bfcd6927d0d008a4993770763eca73e3ee66f69971831d902200f5215a6dfd90391dd63462cfdf69804fe31224c309ec9c38d33a04dce71c0ee0121028c9d2955a95301b699db62e97d54bf0a91feb44e5cd94bbf5b62f1df57fb643966000000" + "010000000000000000000000000000000000000000000000000000000000000000000000524fca596af5e7b52eb7be0c91317097dda19b18ae58a952cfbad3cee4fc3ed4a516694dffff7f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000901000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4e0004ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e547843018857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82900ca9a3b000000001976a914b36814fd26190b321aa985809293a41273cfe15e88ac0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e547843016688df29563f6e8a6227d09322435237453229d900ca9a3b000000001976a9148080dad765cbfd1c38f95e88592e24e43fb6428288ac0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e547843018f765e54f7b309965b6eb6d455de6f04445fe79400ca9a3b000000001976a914c2700426e3b889b602df089a4d53aef05fe6316a88ac0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e54784301de3fa64045e6ef4227e832a3886dfc4a121b38ab00ca9a3b000000001976a914b48ac7f6ba3b966c4c5c81a985cd51416cf52c4488ac0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e54784301d3f2ca03f247b0e6b44d62821a8e11912c10d40500ca9a3b000000001976a9140ecd8fe751e20391dfb8a7f9664d5686db540d9d88ac0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e5478430131fab767bf34cd1e9e856b5d2c5688358666607600ca9a3b000000001976a9149ab96d8f6df07466f5b497153ba69ea73b7a656188ac0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e54784304da58e8b431e692d602cdc3c91f8df9a175fc970900ca9a3b0000000016001420d230f5ae43bc1a66f1c96f196f95b3be2a84660000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff0200e1f505000000001c6a1a4d6e54784304e0dc4bafbea4d48f538ae526d8143a7159a510ee00ca9a3b000000001600142679c28d803f75e91f41132f4397dd4b76d9049d00000000", + "0000002013ac7b4001a344489a2bcee8d0a8331f6b54396398d016d8df0228a4890000002f44c3bde4c6a7b6739ac69ce83463fe658af4d089946c4f5e77dfa48d6d0729194ae75affff7f20bfcf142527f23b7d84dd2cb32efe154b0b65a6989b2d3b3d650023a3af2ed8fd01000000000000000100000000000000411f5385cee57ea003fb34e0afa65f35d9ed54f4167933eb908cfa62edc58e2df39352b5fd23b548d86fdf1541a7982f04c5b3d6ce1fd315b039e53d8c6a280ccb7801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025100ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207b8e6818bf3252f93731615138d8cff4f81a105e971ba86c303cf2e20c56047587862047585a9349551b06a6b45ab35c524b09850a722ea21f46397024bcd7b01a4ae75affff7f204a25f707b7bf25566c0bedd4a82bdb6d42996426ebf01ffca7ec4ccbe3df65cc02000000000000000100000000000000412015ccbbd9bc73482e5d9d22f936dc3885941effaa0e881dba53141f00a86ff570138df1ae97ac9671dfb404f0927deff3ce6ec862387867119a08fdfb1ade6d8f01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208956bea6c1d828c93a7d1ea679f3a6c9458bd08a94d66f332dd39756de6a55c662f81d659b06934de5b7725e50536fa9376a6080282e6eefd30b2f6fe26d92781b4ae75affff7f20e2ffdc39f862aafb9cc47e4b6ff1f824005c4883bf444aed0e3547c03f2a04f1030000000000000001000000000000004120c5fbfb9db5a61c38cf63d5f3ac3c174ae8c7634abd74de618b9061e960be4f2a76000c52ef380579d8dfe4350c78901364f0c251cb9d61d97949a8aabaee6b3301020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025300ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020d94b96e5da5c4071b52c2d8906d173bd82f14e20bd846fea7e8323268a3693ba18fbe5cb942a39075d63312d50ef62fb316b87b8234fce7e9ca801cc282219561c4ae75affff7f2094bcc097b69dd9ed2a9dff3d832ffa2b460cf7e4725dcafe823fca8efd7a43b9040000000000000001000000000000004120144b476328cddf23190062e79cc63b3cc65fb2d9947adaec7581eb093141d3a40d3a0d6ff8f053d1bcb8be007fb9f084900dc601b8190c142e841f57323c6fdb01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025400ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020fd9774321f1327263cd5ea8506efbe12af0ab4946cf7ade851dc21f932ad781e8d95287a9ae379207e95d6a3bf571dae631656615d99ac71dacd16cffde4e33d1d4ae75affff7f20452f20392e841e823c8e4afa2da599e903e6669af7d2acb6907aabdfc8a7cdf0050000000000000001000000000000004120ed279010d6fc7c30dd86be4ce41545c5cdf3f78cb4e26c81d767838567829553274c216995aefad84275dc08226643dd8f1081777b0ac5bd6054df1df36bf5dc01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025500ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020b9846f60cddbeb72fcbef850f9f08e22c41e3dcad6ac2f75056eb14589ebd2b8612b4d9578fd6ee352ee4cc15e11f8e9d238a1b0ccb82511e55b1d694bf3d4941e4ae75affff7f2085a5ab217d74a31a85229705f723c7cddd71987dd5a89f47b30b38221719ef8006000000000000000100000000000000411f7420fa3803c025a82877b1a362b3338efb5c6eeaf1a7beb252d64dafd7453629074e43cdf8858c393935d155ae90145b8ed696e0c473e3afd99df5afbe6afc6201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025600ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020072b32812d921fbac3316e0248da824e74b8694de118c31b92646aeba5330d288e8257b632e4d3a6cc9d08c6670f7d25a70bd31f6ecd83cb89b217f5c3a993981f4ae75affff7f20aac7eda9c268219af794485f1d73ac316f5d9c5b52dbffad85f165a0c6a3d7d907000000000000000100000000000000411fa5e263bbf2bfc73831ad1b181f13d46349b5854b9f046d12d8ba48a755918d465486558cbe8d9f20489c5bbc32c5e3f788d56153d5d3d2bcc3e8eeadee60572501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025700ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002077bc392eb507cd6b2cdae96310f710ad15f0782aac15b5a5ebee4522f75588a5d4b10683a650efcd43c026e6a72a2988c6e29570004f58d907e24d29148f46ca204ae75affff7f2079675bc54a1a0cb3793b488702226de1c678523aa0a1d9b0ff703e7c5c39492f08000000000000000100000000000000412069563d9cad96543da097073bae6a59a8028422f0bea06e482bc7b629e877fce00d20bbeb855d8321b8c558dd6137549f5d15a521765b94efef6e47b4521185b101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025800ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203b296a8ec8dcb895ac67a90c3b2e199ce6fbbd3818f61391d6ef27aa0fb13d3d1186633c56c69c85748ee08e76d530410f391a71eb9631dd3474b5d4485379b3214ae75affff7f207feb1330aae9afeada29c24cf7181eb2899fb65689f70aa8edd95160d324bf2e09000000000000000100000000000000411f0c812b6394fa29518292575e2c12f0c5489b43c275a9d39effd6335439e97256171d8c38fda0bd3ad9f2d14f11f4e76e2c7d0cde11462d4c81825bf6b18027bb01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025900ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000204e4366fca75d4782c3f5fc34369115a04153987eff12aac79db97c5226078450893b36c4f6729cdf42a81466531e81c8423812054b20f2a3ec3ddf105787a935224ae75affff7f2027b155c13a3798c9782c4080b4d4af23232de7f7c72a89bbccf4f0eb182400510a000000000000000100000000000000411fdd34b2d23ad503d8dcb49ffa39c1174c4a2ab798ebfa1cc642d4c02d263bcee427a3ca3d4c47c8960d2642754f3531ca393552d215081fe92ac06317546f09b901020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025a00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002092be5eede051f1533bee3410cd187e2090ffa23dd4a4396c7ac75698adffcd8cd61eb611a05dc2449c7ad09f0887aea56219e34187fa78b4a78dedf663af9be9234ae75affff7f205799460dc807e074259d3398d2d54dc90c27bb41f9bd5143682961e2809c0df70b000000000000000100000000000000411f36523a336afaf102ae2e738d4e49df8f1096edebadb75787148d3891e6e8ecb97e18806797201518e297550e7d76e0f88b1af6d53f6f7bc9904d6d302d00bd3f01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025b00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020304d502e051cb7e8ca3da2a52306f8c556d24ab2ced2bc9dcc4d28dab9de3cac4e8fd6ce02b1760f656baaa854f5554467ba1b9c8b13cb6c57ec56d87d0d2c9c244ae75affff7f208c43ff4e3c265570bc56a15f3c0b5950b758b3c887796eb11f9ee122b08d00ea0c000000000000000100000000000000411f4c24dabc272dd002fc749237c93d374b2de4ae43d7680664420d870c5bc667f915a753d284a1335f68e45a6f38c0e827b7239b440ac43b93158c26bd13e0c1cc01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025c00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020655b54378d13234f48c360531cc0033f512e0fe1061fa62eacbad40cb0d498889cf373bd371de4ea3b044a7940d0982d3cc42094e94826e9d4ff4a11e11a81af254ae75affff7f20979f44a1acab2335d816264dc77c83085cc01fa45be00e4f73a85d35bccb67860d000000000000000100000000000000411f81f75bdc4ebe38f3165dbcd10e23bbc54586a4223fab9f30f5cd2145440f252e0dffa727ee722c0e5530e54e941123f6ce5013d3bf743a788290a67eb2d2815301020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025d00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000200387dcb556b3ac25cb264da51e068266e6a5588994fb43755af2867d57d1d753c83cbd2740c7922839646988e0b1d6b664cc6b081ece36f8f5514d86653133dc264ae75affff7f2066df664c9b945aa914a5c3fabdaab1bb6e0bc19d90d5d84d686176a6b93b2c280e000000000000000100000000000000411f2345b13b718de463cff202833289711d2bbd0f69a54897f04b473d64a2bce3d26c0b9345ba7894b7e6921077f56c4a9b818fbd7014d0461e0e45ee5a02282be001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025e00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002013bb38a37490e5479cd9ee22ff87b15eb6fb2290acd18671ff6df5a25bec8ec8a7e4ea03a5cdbd0e7883a6928a7f510c8177605d450d956a16f75abc5516b6cf274ae75affff7f203ade480f3b743f1678ba325a404a0458900eab3fadceaefe300520b041d802570f0000000000000001000000000000004120aa912ead1b50781c114bad9f7d5e9fdf294bc0e825fb7d81e217f952a5ff1a377adf8a02a40befa1216fa404c2be50c30a3f4c10c2e509ad80645aa6d753744301020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025f00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002003a3e948df125bf685bad5aeb7066a16c4839c58fdf8941df07cc8c802949a018a148393156540860620296e1db2bfe767aa4384dc92c405c5e1c4225896f099284ae75affff7f202e0fb384296971b4a36169348a3f44ea952087351f40ef5949e6b3a85594297310000000000000000100000000000000412069335ea915cc44b2cb687644ff9f557d32bed1c20d66eebc1b9861f16be22ce73edc832090f1c2317b9b1e41b99405dcea089ae699abcd7b66b1ef8db2448d1701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff026000ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206fc287a63662310138f865a4493b68a01ab4f74937d735850ec41806b18a4c7de3f4529256e879f32b458f9fe4dd174baad5d77d2bb880470da948a641969916294ae75affff7f202cb291e675a5592941c774ad9db2945b68f0e647ec68b7414daad71ce94e29b911000000000000000100000000000000411fadea47b3402e9a2f4e465faaa8df8cb38e4745b149d7414fd1073760b8285fb45bec6a5bd07a75a1bf14cf8d91e0b0987bfba8d45be82abd504852bcc5773e3a01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011100ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002052b16e5b470368627faeba35f2f8214e24495eff4eb5f1a06edb3f69533b2871dd0940003e924ef45f8ea18a637fbd395c5678695592afd83b3de4b7c756df272a4ae75affff7f20521d9d4f229b3d6d4bf30a88ce5cadfa0dd6b876ce26570affe47b8f21982ca0120000000000000001000000000000004120ac3b14f029692f44c6b10f372f251101053a45f2b73b004ab211c7c5980fb2b006ed72754c6a26f5108ae56def5500c21f393d42f04d347f3e45c48e0e9fb84901020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011200ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020d81e225b984dc7a0ece810f292c78dffdcfc771b73f6be6cc84424aaca7b9e7c05c34d16d316fb71ea4f242fd1945437ab37e6ef6dcc8ca1ada42adeae2606f22b4ae75affff7f20343f024fbfc2ca6a8a5225cf413244c1bcf96b6bee8fddd8a02ca38f7beb89b913000000000000000100000000000000411fa57f8403824ba21561a99b65430e045120e1582fb6bba46a41a9072d9173b05a13ce83241e4b3981d44c30abaf6484e9622650b2104efdb60f673a93e681cc2101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011300ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206f5144e440b78cc83a4b6dbef1ef3d5fd57c68c10edc9244443bad756cb77e6cf3378187cd16fa50e391ee51c483978033f99faa3f2deba2ef76c4fe21f551b92c4ae75affff7f207fd10ff02f70e1433298c1cb428d32e548d26c0d7140c58352687f383e4308b1140000000000000001000000000000004120ba24dfa5b1332c2f777581df91e047546ce8c74bf9ed605c5ae02597c64756d20454c20bba7411ae8c465ca2262a4cfd8efeae430256e6cbf2618214bab12b7501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011400ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020e09de405bd687d929c0c78d6a74bbf1c7ee7d40064f3d68bd5b1e8204200b41cfd2bc73a8705667e4b5a351e63d96ad8e40d48bab74452e2b5ef4cdfce114bd32d4ae75affff7f20923aa66bb4a234e8e29241637890a52c4e0d80a6126de6ef8cdd1d7ef9d1f7a11500000000000000010000000000000041202a9399dde4679ede8f78677f49b6d3ecce7162583fc10c629e18221b66edf6056e7a2a54bf9a7434fb3ada2f8d6df6210f26ef1afe97b9d0a4a7c7a26fd1aaa101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011500ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020bd161b7155d777e1d98ca5eb84fb4b70c8e120b467483ea53b5289d19ba238a38b725b2953de110d90f2a598d13685e7476ebe3af14c105d05431d5abfbdab372e4ae75affff7f2093356922976726a28cd33872224c565386e7a0db27b67e9af9fbee677af7ae7c16000000000000000100000000000000412096d6f5b11e9b76c071a6ca40b4db28a0b51848e0c47bd11d4d4b77d6f720d9782a3e5efeb980c3cc18cffc32bb0e630ec7328dc8ab5ea9cf4eecc8a4dd03f16d01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011600ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020976fc6e0dd6413e1ce2ace54346bb85a0a74597c8351fc5faa003d2aae52837ddf251a76d471fba561b3828683d8ca42f8058f4a85534eb80c88612164d726b42f4ae75affff7f209016f8e37ba24fe5ad283636410559cc8c7b666a1556d619e43ea4c3608f98ce17000000000000000100000000000000411f950f297dbbff6fc128cfd0c01a9133ab2c38bf243a9ae992af604219232bb327083f6cab40dde501c099b95368dc9bd24b0aa6fc48a568921f74947b7f6f84ce01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011700ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202c325dd126bd2554e7017c5271ad804961b32f13b1bc32685dbe8a64c530f27adfe7024b5cf303c7e191e98b98f00435cf39fe56f55dcba4a4d08613607c89e8304ae75affff7f20f5cb551286642985d01c1f87334f72cb6aaa0d9b381a9c6352b0158de18f267118000000000000000100000000000000411fef70053d6158eacb630a39a8c5fdb7cb61006fc225c40a3272add289c3dd4e5b7739bf34aaee6a14807f1b22c4ce58703af7a424c7c4ea2fc17bf30a4b35dc7f01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011800ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207355c957438e1dcdedd08987c649844275d862b37a2da7fc1ea437708d0e36d32b94bfd26c105ac4adf74117a3f35c3678c3aeeea6f7edb8a869089cdd0d832a314ae75affff7f20b700081877c90f815e13123709f39f6295070392a57c835a3e2b96cbae8f65f119000000000000000100000000000000411f632cde24c673a4b04b1262551c344bc9ee180f5833a71735d720b9b481dd75462e37d899f02e62fdb671b09223200e2e9ecce72e7c9cc9f1c9d4be26ab97103201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011900ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002090dec479d1cbde5a2475eb14b17f842071a0dc4296ef995aa1c416e7b08512893968a53fff8766596088db5af8de4bc3fdcec327fa000fb7bd8989418005d2d5324ae75affff7f20482e7bbd754337396c3878e27ef4b9cdfeb65c6f2bcb902665f8a5f6279229a31a000000000000000100000000000000411f2dc08c55e30ae69ac3b1a30b813885fb6f157b8f65952d3e4d5b5f598c45769b1ed207c041e4ddf75b5a8f29778d0a52bfeef08a6ca0349ca1366e96221c4cd501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011a00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020bc4e35da8055243e18448d5ab9795882942e875d8f4c62b62f8f63187a08e66e65739cd8a015568bc662274acc9f3ee40cb842192a83ab867e544a95be174f4d334ae75affff7f20bad6ea6c212740825699349d3845e2a9f75b9ce3bb80fffca489b6832645b8c21b000000000000000100000000000000411fc7b534d4dbd08444e4cbd6052e1d2fe1221785623e78d14063762d2a094deced0c3df13d17294455c5bcc2ad949cf0eb1b3521d855f3734b40dcf019d8f6e35e01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011b00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020649579bf73c8853bee54f1750ab2555c4ab2b4c972631be81bee2a42503fa57dc6fc8e9eb7005eea2a70cb146a34f6fd366d8ea32957590ea54eb091c58f0145344ae75affff7f209095b28ab3c5ac9f33357aeb78f1d1510620258ec7e36dd8ba6a283320f43c831c000000000000000100000000000000411f6552a8b9c254d0ba687312ff3b6e6b81d6249f688977c34ce559d9b5645c202e49702d8ef2b4a6f8a2f2e6417a3f1308d2cd13d02f9696e4b926c1a34861c5e001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011c00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000205d0be2da7ca674bbeb7cb983fc919e3ffc60e83621067ab47ecf0d3d98d190575088e7e662e3f93220bc21526a2ab9f1018d8cb988908c502cc2171cbc471b00354ae75affff7f20d689f6554a882267a4036cc096e7ee4f5a61c2145d9fd672f19780693bd179071d000000000000000100000000000000412097e0e123857f63a42c476286c0c458b50044b40590a606d40a8d0c69f4da384f7d9d527c07d469fd924c45121b0c0478683fa2813ea2883fdb110e370276a60201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011d00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020e1798a0ce66728db235f1789364b6b013e813a9fc17d98a9047a91694ae9ebc93a8287cb807bc9ae48a6d353f325b406fb7aee07a049f84284481213de553bde364ae75affff7f20e8d6caf54ab9453b9de08d22796f5194cfa0dbe2804749a4154f3670c2e7b1f21e000000000000000100000000000000411fdc30ba0259b8fa0f0333a0f8ea4eda6263f030cc3b1d83bd04a3b4d2aebf7ec8427538c7308d2e02e1f6f0752f3a955b6aaf7f4bd3de96d9588190d0cf4bb44d01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011e00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002044cfe102727bc7a7367378f1f56c9cbda16db05cfc7f8ed9851f6f7fb55ddba6cc4620a9360df40e0ffef28a6c22447e2f5bf30f588003c84d964cbdc3f8db70374ae75affff7f203d6f50df43380dce5a72341018670fe34b25e1ef5870b95c678b0a7cd3379de61f0000000000000001000000000000004120df3dc10c27547b6fadb52d64f70d1fb63c35ec0c31251fad54582e0ff1f200e609029bbfdd192b3728c92e9d2893e7094dce33afe6d212c7605a98b3c121adaf01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03011f00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f336a7e114374c0989be3bc628d4feacd69c8edf976865b6d08b9f040a6ce7291adbe5cacb20a610f17a8c040ba866ab0349d12f6061ac2b3628870b7ea61a50384ae75affff7f20675d54f10879fa68007ba385972c687c7e456e60d0be3c0323701ab2906510fa2000000000000000010000000000000041204c673823f78443f78b172dcc428cc513927f80a1dd16a88b2a73f13166045b7d50694660676467f7eb26e78f7ba59f2e4df57867daa13b02d5dad4641f91000b01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012000ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208abd3b9456591397d2863703840b333605a747f338cde04196c9ba8671582e1875cfb27f6d7445b1510a155d5a7c8f239998daf9f6925a2b1bdb943944542977394ae75affff7f20a7e5507a958c473593dd043a097a10505e0b2f1037dabe786dc013ed841c77c9210000000000000001000000000000004120aa6f670aa37f3e992eef959814ad15630302d8d96598212516c81703ba35ce6d45727b1f3150a14a022b61c7d3716ba90567989280c0f7b2ee534320b382a89401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012100ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202d34ad0cd9fa186c212c55fdf80369a479535e16215f8558424e831fffd542aba4b0326e514104b2ce415a7e557028e4275e65966674fb63dab35aceab5686503a4ae75affff7f205136e2611795bba26c6f6592ccf7b6bc05d2c49505eef9b01248270cba21425122000000000000000100000000000000411f7a1243c21f297460f19fe64f74aceb183db6cbcec19c53b1c372d7ee34bdfac165131b7ddee282cb407f113ad67a6b0b6567fe35b89fb2b8d950f78b1dcbd41701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012200ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020bfd8fdd2939aad0ea2c75aefdbbf109ca2479b554b0391308cd087ee86156419dde855f821e24efc54b2dd0b1bc0b5040d979907dcb9330b7d830316c9e4bcbd3b4ae75affff7f20d4a115302de3e254e32e9964bca46a3744d0dd2f7d337d4070d4e968a222e18f2300000000000000010000000000000041207032d07c707c9150fc33e007ea5ddae08f5cd9da0615a80a346b613baa917e9428131213637ad70da23dab47bf2ae7291c8caab65f7e6d06cf33e6c8da3ce7bf01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012300ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000206a98cb958592fb7635b71214b9d2d3f229d61eae8e41211f048a8ef62bc3bc70980362733c4e4c740627c904d7b3a4ffb4a622cf2afbacb7779f408b7b20d21e3c4ae75affff7f20afc7d6168d810224e334e8edeebe454974408709d1ba4b53d1d1949e2bb4c874240000000000000001000000000000004120da2bfdea53630460cb3abd4953a90aa9073f2dce626d23eef34fa315b3b585221745d8479e5b2d414133dac7250c7fcd184c02bec6b451db0c0e8df221d2c49701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012400ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002081310202657f58785dc0fa18ee8a92ab2eafb991abc600b9c7f6041261ef27ab83194507bfefb104dba3e2aed6807c7aa6cdfc639c43657942b90a5c9a3684983d4ae75affff7f201a71a70d3339c96ff3b463f8e2054a4c5964cd9cd9fe2cea0b1bc9b13f873c6b250000000000000001000000000000004120226e57f5b435f6ac2e09da35d05c5b41a398ee1fe017ae79ba984ddef284584c3c7c3dc65b8b6a567384cffce8581a6133c565a2acfe2aab1a84e5321a81446401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012500ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020dce6b28192860bff9c5ee674d695bd1b25e748fe2c1e1a06d14c81659b37d282744570b39173c5b8dea30e99b7935be2f48f88c69f9734b2ca9a84500421b66b3e4ae75affff7f20d629d9705e7f9378921a3f0549ab1aacf9ccf131721f594744469f2be463728526000000000000000100000000000000411f34f156830e694f9749dfef3033402d45a2953a8fd5c30853761770387cf48d9c72fff2bce113794c8eaa571bcfa59921ee47431f149be5fb4fcb83745968071401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012600ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002094ea9ac317b229bfffc3987c88a7c5a554cbdfb71701d7b8966266706241c1af87a7a68e098a455240925172cf7c7ffc1f4deee91c56f582bec5a48c7cdb25373f4ae75affff7f2095c425b0a2f44c303b66a7607c4c06dba22b783cab3b73ce5335ca498b77c6cd2700000000000000010000000000000041200eb5810dc746157e115130425e5824e3dbe79d4d6fcf240cfb99d477984055443033070d94d2415163fc71295d83ed531abdc8706ef682c2516919d45693874601020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012700ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000204ae92be31da29fecd48e8534539d30d187690ba4365b8a0755c49d0b5407561249562a99c91c05e8bcce5bac8335f5a6c07da60ffccea0abff6f4b267c8776a9404ae75affff7f2000d8b2db9b595e82e09d2d8dc4ffb2229e03b676be458cb66b65cee3909bdde0280000000000000001000000000000004120aeeca0b78dcc5f9cd8529d9c0b117dca5ce32410de02fe406db92a069ba92f2b60bacd3251916cea2235cf60878d83b9f8c0ea7d07eefcb37f0006b1f2f7e0f201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012800ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000209351ba318f27fe8cf97deef362b124647665bcbb8b7c6a84036b0b3fba41cb85569b38981c5d1895af72cf83a42c997e1bfe91785851016dfd702bed25e9bc47414ae75affff7f20611a083769bf6ba0a09be0f063ac97355b882699d7774943da690825cfd5b97e29000000000000000100000000000000411f6fabd45039e98a20b625ce4a8db9ede3f246b61391ecc6a034d0386e3de066780a33427aecd1c0d42aa3945ff12d1c4962c65e8d576148a4b6ff09178f32442201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012900ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020184364a958cd0652f49fa7bff2718fc7adfe559f50b0ba540b6917fd1ef4c31050b7fdaf7f82d26653caf5b119f4f6b59020a37e39894a8987ba0a0631e79506424ae75affff7f2020916e955fdc48b8579b6566448071556b6fb835c4a3192ad637bd0dc336debb2a0000000000000001000000000000004120d19289f0a3d55f8da407712fd109d296815f44cbc6dd4294b6b2459831d94fa1233fd46c3adca98658d59727de70a261cf342cecaf40e3820979a0da40e2727801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012a00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020891b8374cf6a2c356b8d3b02a047bd846526b707fd8f98b969a1fd249fdc65773f7588dedeebdf43247846f4c516574734df301da43e0afd0f0b2fbd27cfbacf434ae75affff7f2045c69528fde6cd6757bb73e21aa532cc34eb8b295cdedc9f3b45b027111a1c152b000000000000000100000000000000411f9f56d4b7b762ab3417a6ba4b972401b41e6802a0a389a0d0002e040b210748aa6bc39f2e0913bf81e420cfd7ed23c733fe977e941de238a861d33931e604ff4a01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012b00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020e718576e32225125e2365cdedd11140cf823c7d880fb98631ae362ebc0a14bd68ae24291deb875fb08b94857ae842dc4e775da10ffed401a5658c8d84ae11b58444ae75affff7f20b21f09d7e795347d9b4b3b81bef747f292eb70bcb369a68b55f0772a9988211f2c00000000000000010000000000000041200f2429a2e9c61a5308c159db7f4f004b437f7a9f5866f6dfc9f09ad24e486ca22f01e4af087839e5ae0643d04a689e5c46522355235e835d3986e60bd624ecdd01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012c00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020c310e97308338acef326337407b6579869942f3760ed54966a13164bd2df7afb3081202692fa23675123b6323cac71bc233adf476a488fe553074bd84fadd34b454ae75affff7f20a307108cb4bb1361923159c8b2335e29d730c2f63a1d78ff389d333c397b38b62d000000000000000100000000000000411fcd63e65c3b60341ad36ab68be5698007044103f7d71c45179d06d4b8f8d4631f2962076c4fff6bc156a64c41d79450cd1fbf03b859bf7c5c2fda8cf3fec37be701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012d00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a2f4fa550fe4fcd2a001fc463494452fed0ae8258a60a49f9cb11372cf1c7e799be4641da2a3f0a371ff763afc43427924d0d74425c1a104f69f5ccdb09d9f78464ae75affff7f20f94632dfe08688b32db5d29390741d9dd8ff05bf7e08b2296b975ae05fa5a93c2e0000000000000001000000000000004120d5005bdcbcf8cf9caff92c51ca904a68eef601806974309628af0d554f0117e928b5f03c3b875b39d5e82e5ad8597144e8a8526ba302b26e8aa1e0a65d2cf79901020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012e00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207eb157560b4feaeeb5b201c0a1bbe89e4f2dcb2b477dea9bd45e94b7e46e55794a6aa75abb4d94fc570b1ce849b6c92901ba952679101575204bbe21759f01fd474ae75affff7f206afb91171d00e982722af7dd793c628140ce61ef0602266fe55390a14ab329c72f0000000000000001000000000000004120cafae9ce183635bb44db9c2df4e0cc48370b956fc6a7ccaec659ee415ac871fd0761b31251c5ec2cfadb9bb3022f5e168b0a70f568fe887b793d5709d84612b101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03012f00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020965fe9798dfeda81d4f45f978e376d19b8a46ec312e4ca74cf18d77ef105da6e2929a3792dd66f380aa4bbf1ec1360b0cb51de179f212c86d355fe3afca8d94e484ae75affff7f20455bf7b35a736634ec15d35b540aecd17248a97a930e8ae8cdea1bb8f4cc6ff430000000000000000100000000000000412098c78dcc53d511c4d68b88111b40da0ef5d9d96bd14f6acaea96d0046e811abe529263f979a0aae6d6d71c71bbf5476efb429d2baa8b064332a881f9d3b7759301020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013000ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020570528d612c2f6898ddb132e756138c9408e6e7f1d5cc76b4c481082742c512b7a3bcc65f5505b13dc83729e1b495fd3cf4cd730fc740cd61585d5bcde0184bb494ae75affff7f206ae0a4de239fa6d45e562aa74d40fbfd9b704d9649ea6782d527c03eb9fd0d6031000000000000000100000000000000412098d8f1f8ca3b410fe72bc5f089effe463bf58dfef77da7ad236a08655ae435dd19958d1382586350321d2cfc44ac4ac7155c2ce58a299359534ae491b077d00b01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013100ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002026e08dd4eca201dee5a4cccea3e8be94504355ac1d17b5b552fd3b05298612cafa7b6d2dfed954ede4043cb2351285248935d161675100999a6ffa42fcb4d2764a4ae75affff7f205b19a24141987b477ad9f4805d7a6551eabd0ed78e3905cf1361f416d244b3ab3200000000000000010000000000000041209efa4597ec10e0ecaf3d560e9777fe11c00fd3537c1680ec4f0e510e836c7a763ae28cdbf851c9b9d255114aeb1bf0e90ec5452aa429082beddf4b184d596d9501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013200ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208b47084120ac9fb572eca91068c248e16d4740b1b8f0bac51fd5c7ce35cfdce3683c323f52a15d4506dda02ce390cf8900cc7c3850cd5e74ff5f99d88a5a80b14b4ae75affff7f20a7c7210b9699cb8033a96c293f7fee6dd59d230cbbfc3a31d7f11dedae65c91c330000000000000001000000000000004120c281ef237ae62cb017391a16065cd19fe2b0b8a7e35acda72e1ce6eb48b3b92f33701433343cf5e553b5fc786f3b00c68a27c5dab7b3dab0cc0aecd02700bf8c01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013300ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020aacf9cd16dab2febdb7ab2325cb91e944d8cd06cf48d3559d907c3a18cf361c65aeaab1db64996c1e069de87687c5fa90a9577f0310c679a61ca3fb6a750fc824c4ae75affff7f201aa411fe62d156e83b9d0aa5a46ba69f48aa4a9bd5c1f24de667ed0d72c39f9c340000000000000001000000000000004120d4aca68416ee96f052b800fd356a003c66e321090e481b4e483dcaf531d8ea804a526ec76ff1c67893168378d72cbcf6b2df202465443771d04a931150be00b401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013400ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020edc21ac2d67decbefee430906b1bce44cb98f031ccb7ab68baff1a6cea844ce13897229412dbfba862d2da5f78588ea8740c12435c00514e89cd0b987f1d57ae4d4ae75affff7f200735a45d24ead0071093edc72ce18b0b59294461a927ed35a6a53c0e1a1f3df735000000000000000100000000000000411ff2f0cdb959ec6888f2568b4e30092fe3d612e1cb4c5ad1b24ed67168ebc4e23b6c74b11f2020147ed14e0941596dfe16732eb7b85f9c8771490d17619ac6148d01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013500ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f5f2d666883b1c0dd101e9c081b32305202471b460844e41b4d3771e86d59dc15dec4a795f2b521b3fa2205649158d65d8cf52304183490d3a22e4961188dbd64e4ae75affff7f200dbaca74b12650cc47ad5c3937af7011a8fbe04f5a0eefa55c99eccdf36d4d6336000000000000000100000000000000411fcd7dd59865b54234060d291cdea023f2fafd6db4cae00ccb90118321143d14976c3293cc99adce3470eb9536d9a753c002312ade53380fc73da16b556d55c3a501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013600ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208fa9646af5587d8341bb3a34cd3fe16ac8aa54cccb03b981ba8492abe463fce719f779c299843d9857510ad49fc407f665020092603432d203ceb71a637b067a4f4ae75affff7f20fbfdb2ea8be53a30aea1ea4d0d6ab9242a775e2273e6e1eab98fc128068f47f237000000000000000100000000000000411fe1721da835b19a9e0ba9c4ee85983b7459a08db8cf19fdaeb281a4074e1b7f684ae9114a9afca2de5451c18ff0bfcbfb1a2472f0dad4b4d1c9b765fd7f7bbeab01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013700ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020eb79cf9dc9314e10a25eb86b51fed00eb2bd17b14f70843425e25c33457fd498997e1ffd50c67cc55d43ce1185b80183257ecb72f41afc03772ae5420f1a34d8504ae75affff7f20c63640e3fcfbf2a588c280688f2ef8afc6928bb8ddc53bc4ee3514f3dd93720c38000000000000000100000000000000412070b945a6eac15713e5f733e675965190fa27bc40f7388938cbde3f800a970ce1786df2d4fb18b13bb4aac749b40933272c73d37870f4a96e8c27c1a1a6c7533f01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013800ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020717774d6d504e6e14b62d5524e80ba00c041ceedd9bb30855b3694d68a427052a7e63ae36fb247fc271dffac5a3897b7c94eb1f3e9409019427eba367d11beff514ae75affff7f202663e725092fca7416547b0b7bfbeff4465a78a7626d124e6845ab124654fa6039000000000000000100000000000000411f933ffbcef848eb4879e394a7f67ceeb53ca53ee1d7f2a618e18d997937fad686143cceb81b71c532a23d41ce1a1a49120a1082a34a0ef344486acbc1ef60ddc101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013900ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020456b79deb9f0143208ac8b78e7f91f38fcac5084be30c3db5722704ecd93a8db2db1d6b43a2913472c671afc0ed3372e567ad96979e6fe18e41983af7e0b5aa2524ae75affff7f208f0ff01bb969a458d35241816254d6d3237a061f9f465f6971d0e7f2281dd1dd3a000000000000000100000000000000411fe586fa5a8cb3e84a741918ad460192559eb9808a517fff85b5ac91129d08d48a595a806ac2336ac4ff48c339546bf8ce3ac6b0f57166cfbf3111505083bbdd5501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013a00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000200a421554dea15f41f61822267eb399824cdcf29ad067cd3666be7c553f6166f62dcd41252a6336a6330cc9e2cbae2f24715e5fcbf8f0680a61b0cfde5f155f19534ae75affff7f20d29283327289029641d26db7e9e184a40f7ae9dd62379884c2009bebf146cf893b0000000000000001000000000000004120065b12ccdbe15c88747f89347c36ed3e549a650401c2a681122a3f9b3005389b7e418ade33c56b1adece554cf4471aa90a139afd086e502441c600d8dea63be001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013b00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000209098de76dd1c757d5949866fa0b5270e0bb28215dfddf14057aa2ffe15dd6552dc841a389fa23fd34bc000d9cf9b4d1bbe6e1f4285749232f160dfe165c6db7d544ae75affff7f20d521b5cf0e5c6874b14dd7a6270596a067bb8722b952e9baba58aed37d4bd10b3c000000000000000100000000000000411f5706f76f5f89a92464dd6a6a2de8553093a68352bc07e218e623df57524e49ec7978c53d60ce0b54930ab7ef09f63e48396c2231a5b861194185f3649c0f591e01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013c00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002014837f5cb42ee2ececcc38bd34d73c8a7952f8313d67a8812e6c773fbfa75c42f57a476572f5f547c8440c1ddcaf2d91b82e0758df0ef1904e3757ebc553f4fb554ae75affff7f20f089dc12ea14bb1727a1a39bdb86fa7c72baf00d59cf300a58ed8edf8a91dc423d000000000000000100000000000000411f7fc2b62f1e12f7b76e083e4a8e601510cc70f923cd880a858479229ac68e79d820a03b383bcd5d960ada832e91ebeec9095a8f30656cc3c8293c7900b3887f6301020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013d00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208b906d0f6b15538aae3454eed8116c2c8cb8217ef2e03e038f4e8e16554886451719c514378bcda145b8225b5def0d874f93be9ef2c337295c20dc1d65662163564ae75affff7f2040a452f02637928475e47557ac3ba678e8f7bc2cfd8e2658b11015e9a8f4d6563e000000000000000100000000000000411f9b3ccedce811a4406bf08e4b77b47b93f2ce8e25878f7098d3f43f4370960f237a05d2f572fd42388f4db084fa43534f1f5157b937e8b663a2bac8217661822501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013e00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020e6417d259d1d5ae9d41eb81f70128da48fc0bec9b545b4a5f78404ab80b06eff67c202866325b2a9f5893def3c42757d58946e6f2a41db7a8e63af19a01bcd2b574ae75affff7f205f155e9963ab6a0ae5ecb7e27fd118f379e8e6a2a186581933035f69f63d1c7b3f00000000000000010000000000000041209e0096b765af59b172273a80e92ab5cb63f4af6354ce7e983a2b24428e0f1d90299b40a2306c8651938f98052f7c1cb62f61570026c1538469d9975eea18f79901020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03013f00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a3291dcf9938795de12ded20ecac2ab3bedaabf18307f1d050e2e357aaa48153c1df7b0e9de973847c7966d941644a94d74eb5517d9e6a88cf1ac2fac9a970fe584ae75affff7f2023c7195da40880026cf207fb0892175aaec1fe2e2cdf597d9485e1f00d6bfe4a400000000000000001000000000000004120d8df52ea15f2a0326c844f74af9e467b26877e9a4cff38b8c8e3a4f431e3c24843d9470a33383ea6699e13d68fc435ad9b7a25b442a97e171ec04255a099ad6f01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014000ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000202a8d040c7e0b8f0b65ea33664ac4c757b9a66915573b6f8f00cbd50869414b1e80ed77d68a23724c0f0fd46471ecb7bcab85f46b09bb51bfca593a15e20f5e89594ae75affff7f20a4b3923c6c285d59820e8c0b2d89acce64dc8f9f33733cbb0d57e8acb1fd4757410000000000000001000000000000004120653c05c8164b49852081e8abda4cfb8ff2e3687258b181f4114f3e6dd6b8a312432477fd4cba3c5cc6a4d4fcc1b1ca3f3bdbc21862ae833107ff61eca65fafe501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014100ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203752274119d99b4b8be2b615d678e968857df63fcba1a61b3e278062f28264b739ec8bf6f1d34465c0905a8e1c94669ed555c74524f4ba17060d271515d91c725a4ae75affff7f20f9fc94871e7eda998ec4d01d077ac7a97d6467d21887a833f03e9dca6936770642000000000000000100000000000000412013ba4e3f07e3ca9bcd3a9b9077433212abfaef174f28139d0e60ae39de3d2f85051224ae45fa013c04994dea613bcb274989645e5ba11359eb0d5b8b8388412601020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014200ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f9ec5ef22e79e208fcf74283e59e740c251e4bdc446195b33b0b4f06fcfc9202b2cf22d70dae39f0f7b6eaf3fdf74afae3edd4a829ffc2a31070219f58ce751c5b4ae75affff7f207978629f78ce822208d56eaf7ee22d4576dcd789b72dd67477932bcef152632e430000000000000001000000000000004120487de8b3f2fbbd118e0b0e364dbc0efab4d81e1a05f8b2799a589643904f3b951a10c7438c10d2414a384e4d3952fab128720561be8336f5dc9513e93d65b32801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014300ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000208c9f5f16dbdd2add07d3a32016b6a38116ae790c452472136d11f205fbeff2bc357b119550237967e0e21c487c266fa6be4c1ff72f11a3e3a0639a39de45bb145c4ae75affff7f20864fbf56c62f4724cb46b03db3a2cabbf22f82e7c58a1fb2eebb910fc3de3a0244000000000000000100000000000000411f2260911b34f433d585b20ac153a12177b03204a6360279bdaf21072a261be1fd7e8aeb5a6871e74d7ebd65e492685824349e77a74641ca27dbf68bf9415e44d601020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014400ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020af5ba9c826aeb942bf54dca32c547a11450d5f3c5ef64088aaaac40617cd2dc2da2541f15def4ffe63a90399dadd97e4ab7338585051f32e9129bc3600b4cb6b5d4ae75affff7f2009d21e7fc90a23109550d9c952cb600c39c214ec85456e5c2b7a3858ba3e754445000000000000000100000000000000411f3e666692afe38d85921a718c21d5bdc94452a99110517f7b09fa7c808e1366d215c1ba486080a54d8b9a05a18101b66d67af99df954bc45618588943b939421001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014500ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020d6dfe2374724d6a564f1fa0f257d9f56e874eba81108b5c0b08b0a335ec749ccea09357c6475570095e27994dcca231ac3e9a8c7cc7121fe8180c785bacdb20a5e4ae75affff7f200e13c459b5564aac0bf1f5a04390f4c121367f8bf6f85e355a0de548734849174600000000000000010000000000000041200439f506102ba92dbb00a3e6bb6f6470fccf5db136b7ac11436836d18b46b9894102779dbe80c892115c97d6b308e43b544570d400dc6e8b911df2afdfe68bc701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014600ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002041c377a941cfb7732cbec17cd67fdc5a8be9b89aedbf5e4433c445326a624c83d2677d6dcfadf85b56b4efac5d9cfb940e0466f777f0874657747d4f6655f4315f4ae75affff7f204d0ba76e8a18cc566182c6a67b3cb59186e165870740950c00b8b00c9c92481347000000000000000100000000000000411f7f912416cc82c845e70d665e20c8faea12eddec380661066871ff9dc4490dfe4676fd2681ca20078c163b1d83e4e528507dd4973b7cb37c72c9bfe27b20883f801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014700ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207345dbf7d755c3114d8da8298b4169860d646e6abbe9455239fdb79cce308d3e5399848dcaba6bcfa8f344c3b19119c1b6e3b01fb496750c1937489f30e3aa68604ae75affff7f20dc4b6af049e525c753c7d2c641a5810723055a85277227cf71d1c97b7a9bec0b48000000000000000100000000000000411fed1f8a2eaebfbe72c762e3a75a66a86fb0d4d3bcb402d60cfc6d85da8d0372305ac330195b1d71b005cc1d9d38559d9e64b8ba3ded91f58e39b63d2ef89fa96801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014800ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002061cace8de714deffc1fa1660c4ecc5ec9fbfe0883a427b6bda4bc95ff9fbf4480e990e3420bfcae12e2a3e2ebb2d56f01852632713e0f914af0a69c07bc15f3a614ae75affff7f20b4ddeae7971cdfd04d174371a66b9ec00e062274c9fc798cc6fd284365db2344490000000000000001000000000000004120ff9d3d544c5f7810d61eeebc9b206be7293379074d3955a3f17299b031efeca73a7dd1fe290fb6c9a1415c94e672e590c1b0c3e39a8ab66bbec4cf9f150c686401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014900ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020cf83365b4cdc691379708a8e59d75053be2d3b3000b8232ed041b5e78a6ad31483bf04a372f3dda99e8fabe6aa21ad126676b90b9bd0d387a395fc5cbabc78d3624ae75affff7f2076082c2120ecb6a7180e54bee84bcfa6c1525ee1a2181de5bde145bac47c66d54a000000000000000100000000000000411fbe155d73491c6b8d760c02d1475164f0f1d6c91b3cdbc73628b0b655ea4b3c881502105f78d3da960d8a7879e09aaeea4993c1ffc60c737575229a42ae8405f701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014a00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020cbe56301a33f67c5cdbe5dc0d9e0f47984768d075febba70a2714171070f880654b12aba71dbfd1060201868b19edb680ea0e0b9ba2e1b056f9a1612bbac2ad6634ae75affff7f209aabb78125f4041aea9cea6acf9ff5d18fbba4e6d660572a3f5a1e880fb3b90f4b000000000000000100000000000000411fdab2ebbf6a18eb6dfd990db92e446032288016334b5e9a5a406a122b56911c6733b4ac5c27fee215c47bfd69e794df065aa4d480c49b83545af4e412ec08b62701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014b00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002081b5b04f8d9ed1c7f1ee9a12f4e57d82ee171e733da3db821c57f1e961c003ea3951334a29465575415f9ee27575842ea3d6bbb169cb6dd1dbd870fd4dd82cc4644ae75affff7f20af059e5e84a018d2a097099ef1b7dd1caa7c88b5ac0eff82504c6f0d828b14314c000000000000000100000000000000411fc1ef70d3a1011aecaa4babcada1ae0e1fa917644679986f98f9be6b9f486fc6f1a298c1f40816e4bdec3a6e5e79cf45d55fe7eef1013d2007d18a656bbd2e57401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014c00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000209bd0d9085719c8cc9dfcd01b57f985e2e7750e10fc81bf2b0c906ecab0b845b729aeef74a93a73644d6e46a5a39f117c962dc716bbc834302af99f052154daf8654ae75affff7f20eb7954248d3f7506fed3e18452a04e6a72b953ed77d6665cfbd6f89701826d404d0000000000000001000000000000004120b2ba83ca490b3a48e98fa3318811f5275fc6bbd15fb0be61fb43ae2e7c68a18857630965dad662d1c1cd7c535620fb3ffe638bf42f1e8614e9f201e84e6398a001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014d00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f20a054b196911c714fe980c09f5b3d191e8368ae392a8dd33fe821b2b1376867f6c1f4b032b3e6dd22ccfba14715e69444f61e642485239268f4a7ab51df12e664ae75affff7f20aebda58511273bfbf653683fb74e542cde74592d1a492935c81ede86c66c41d74e000000000000000100000000000000411f9f552b1b2e7864868549f52447761319ecc8031317ce9cf93d17f8be3cb996920f4c7a01c2d9f89e3d26e404af553a690286f4a015af3f7c34b36e204d09dfc201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014e00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002063fd6a59446671f2207ae3ddde2a0866a842ee1d3a87d083b80f94a323a7f2955d7b1cae85c227abee08a1ba9ad0aac3d6031ce0f18ec920e4f3dee808dfcc68674ae75affff7f20300ee78aa7031bee993595b2ebb186c7544b2cdf98b6edd63049ba1626c43bc44f000000000000000100000000000000411f307e3710886ba8f0b00663be79f67adab69d57c6415d76ee5dff987dd87379256f5a6b27d9569c8da2ce5ad3fd7fd4b32e2d1e170fb4d01930015cdde81c9f3801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03014f00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203e4c15d68cfc82fee76bbf42aaac0d7bf3c8fb39d62a528388d86c775324864878c699e8b5ebe40e208a25067aa02ecaec1080bda2734b1ad11e9a36fa7b0052684ae75affff7f20929260aeb25cbe3840a0f4f0e02b5c15c31e6abee3c9a0aed553f392bb4aa81e50000000000000000100000000000000412014425355c6517df0003c7ad0bc89c29932847e56c890f89595fc6912393f12cc1baaa4017e29cea9e829c854d50d759292cf0f4c4ad49ba23fe3c9bd2b7d347101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015000ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020eb25c9fbf20f98c4f96d62374e774edba6e80a426a0d737c68bdedea8d9a9dc903a44e6ec8ec5e5dea50055032f7ade8365c3e00112b40079e12499d94a1df34694ae75affff7f2044c3f3f6e3bcdd2f32ca969ed0ecefa8c5c3606b5d0b9a8db03876fbca5505ba51000000000000000100000000000000411fac5e45caf952e8e6a9d153d54e69d4311a429199920c57400e95197cd85dcf050f143ac714317a4eb17c9a2af0801d2b37fe2b385c26f5be15bc0811c59c68aa01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015100ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020bc7a465d6b97fdaf1a41339dd1966334e6890607a5f5ab4cf2ce0aac581debcec8e131378f45bd3d6d863ac7e77ed5f440edf6ef4c71ee6659b91e7377ab1cf86a4ae75affff7f2090d240e23fbb206a0e58db6a9770c0e74276d9a2ed2e0eb3fda7be23298dcdae52000000000000000100000000000000411ffdb23c0d9057549775c0437db294f1e54464c345a4ccb2f77f0d0faaf788554e44208467e1d4310524e8d815308403a033473356afa86daec49c6fc3770d750801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015200ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207eebd55abee00b9b6f9c2ee42c751dff67251150ec4a46a0b0d39f38e5b6c3e95d6507438ec7f3b5cbde07915488140f0a9e88af404f26ddb4ce5c051e683df06b4ae75affff7f20017f863bd433d2b3cdfbe394199b33127209ea16276d83d6bfa6e7478dbbf30c5300000000000000010000000000000041209bd496b3cd8fdb7906cab2e39100541cb52dd3475a9f005e1e7fbffa7940732a473cb8c9c509b8620d20ce744fee89c8b404d812059fe5d5427b79858cc609b001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015300ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020d4cd25e2b73fc2bd3da73a213324c16f2db5e8d81194c179ea86227a160d54ede81bdaa1be28ab8e481c2db608bd474165fdec556e1c68ebf51817298f54c0d36c4ae75affff7f205f8dfbdce1f05696a8eb3554b16d4c82dc823c8bf430a81883912475cf4859e5540000000000000001000000000000004120fe7da50a1a89d780c1193b953ad45f322c63a803d9228c2df476fca1acc951923adde48d33cf27d271005a1ad4e10c61219a6f907b79f80fb749075144c1f72f01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015400ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002084cb75e9a42434bd009355c4ed5c25f6af533b0d71897d5b8f8876b8409ad56e6fcb75428570795e1ce0fd6a2364dc803df531f002a69c3baa91a178c16f52a56d4ae75affff7f20d11b4a0fe9e7a27e9d55f03c5f141f6b4f99352cbb50ac907c58f4c3a907ac7f550000000000000001000000000000004120d64ce72efd637f1b36003122ddd9f5f90b43385964cd2e8d7c745ae6a5878ced230b0d702746aadd067976b937f63ee831e5f7702fecad8b191551e7c9a602cd01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015500ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f55f04369ccc716151a6864d396a57b83cdad06606e8dfe0c82b48ec13a727834488f780100e5b47d339e62b4139d6451b5b65a7d52eb62322b863a5f19d17a76e4ae75affff7f207781098bc791dea894f5c7cb6aa330bd4a6685c0c20f262184dd3cdc66612b6e56000000000000000100000000000000411fd479d9425f7dceae9c30f9e0678cb246c01fe7800b2d11125c2ad4e7a54e204d59298707ba46f7c88e60b1ca89156d5cdffc93cfca6d70f20698996d92d4837501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015600ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020dd6ff5b04652157bea0a82ad5fb82fb39ebbb5ea1f59287ca2d93c1a4babeb97fd7ad7c442c6d934e7425b9a37155d5b2454ba058a72ccc82e415d67fca6656c6f4ae75affff7f20ce0c2399926f31a4a163105aab242e99a52655e8b21a25f1b4517b84e2b9c9a257000000000000000100000000000000411f7a8fc8f8079c9dd255698ea84236b0fbd86da5d7dab81ee29e7d9181b688629043141c2183d40fed03a205477e1bfb2e42f33978d8a400fb04d51852ebfca53d01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015700ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002054b097d8eb9e64f08deb5dd1c0762f8a20a7fc091500b20f6fd43b58840ead9164cf8dfe955269b58658b0da0f71f1dd86221b082370f2d89c2050b9e4bc0bd7704ae75affff7f20ff3e13ecb9b7556cfa76e2c8f660d092e9aeb437a9bb4ce1e3039e309a3cf86158000000000000000100000000000000411fd72c0d4dd892694f37853682962f18fac63ae89f3e600d2a75c753f97ab214481374d51625a7148ed9a3bb1339d22369a5f86a5f16c23bd3323986a8b370c41401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015800ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000204a96180ac99ac5e71558252876dce99a08e218dba35a360bb1e0af1904f9deb29f9ed26042dd144ecaf78ec3702fd359aef66ca2e1fc75bfd4dba5ddd9cfc221714ae75affff7f204a503cb77711c395281b99cc1fbeab3413683e81f2630031f78533397d9d53a059000000000000000100000000000000411f06ca6c2850d90775d0549f22323fcab2a4ef2a6a358b0e69a0ae914e229429cb706b995e6e6c6fb687a69a55b88b08a1ebdb1d7faf8ee4d4be2c2da3ad6f29ce01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015900ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020cadd142e3f858dd1bd7aa8455fc0db87a50f9c017830196770b549cae3562eeaf79c33406802d51247548209ecd75c68ea31214b4c26520ebbe950421d42960b724ae75affff7f204246cb06c4451b5a8c2f228f1c9980d2dccf0ed03ed4d161be9dca2a6568f3e95a000000000000000100000000000000411fa4a3da631c2a3fd03d6a5981570450ae9f5285935c9c0dbda13cf6877756e399053eee548876c355bd6cd2d82d51edfd56a1dd58fe5a47895098cc4ba753ff7401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015a00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020d9201543b83efd10b5c953515c9b632c3873cebd978966db42a50c23729f408168e35e5d90540e27191b7eb0565fd33146c4b65b567d0dd6164a4b4b284c9b70734ae75affff7f2030b4a9da3620110e53dd329ac4b761b80f99663d1be31e3d5bc4c3395ed46b415b000000000000000100000000000000412054cac6be4a388907197bee2d2ba91c5bcce3a4fc75951323eb4de0e13e1a0cf95949354564f0ecc3b68630991ea8136d47eb3db761b13dcd99d7a38a5cc6031701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015b00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000209c60fb071f861ec8b456ecd5f67dedb97ecb26386536523bdc1ae2a575d7fc540ce42eb720991ea1386bca94441305f598ce6a58f0e833c15a3a1324077b1c34744ae75affff7f20c0935e8795711fb2ad573147e88d8d79e3b4ede5c7592fb1695da1b6f6bb94545c000000000000000100000000000000411f896622907d64c76c266ff790cde3762f6a1f8c39eb334bc6f895d74f1e6d5a62699914077fd975cfa6622ea525f4e7a5f43ada181a1f03905eb872ed1d72bd4501020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015c00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020c65681aa8b9c1bc97c3f70547152c24aa183eeb891e9134bdfba23ba924ee5e0ddc1d4759a84fb8a888249cbd6451384c48cf29c62dc3abdcbf19ea2114c9350754ae75affff7f20693e357d1a5edbc3b624449cdb0a94f16bea4555f16298e325f933927719f8b15d000000000000000100000000000000411fa529d11972ac9e8cdb70cf81c653ad1f0d8ed5ff9837cac75fc1383ca5d5b3df72fa0794e853a2dd3805887f563fd649aa6ffabe84e42227f3c9a352247413a701020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015d00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f8cea7ba16700f7057cedb54bcbb2f36d8a882839ce5ee2267e1a4ee53133f06897b2d47daa1450daafa36a5c9c3c8e1d60c77d3ad153505f9b8ccffe83d718a764ae75affff7f20ef9dc4cc79cc579505ec316d3f4ee8ee71bce7bbfa7fd116e24b0da9b43051465e00000000000000010000000000000041205cc274c4e5c1dec5f28b781e6bb822be1d52c1b1c04c73a014e7a7bbb87d02cc7c2997895893b6d608579c92389fec9b3c9277ee1b9fce11bb9973bebb07b86901020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015e00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020a0b88f43ea8ac556c92a557975f8c396ecfdf02bf12144bea3521f39e5d46dc56c9e53c239bb7e973252bca619ba01e59bf720a64fc144431fe6329c42d8fab1774ae75affff7f208901667d5f30d2f974356fa1b4713432e2e7476dca74c71ffa0830b686510e605f0000000000000001000000000000004120c8bea22684bfab5fb7d4ada91acc216ad5a1c087bfdbd134e4e7560ebde5351923b57090b98cb5dd73e9f84bd6575830c5e3694ee0a734bf565290fd04b9bc2401020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03015f00ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020e3beb993bcf1cc00cd1883bc1530c9b9f3236be0a0a7aef2c22f33ff699cc1a24667891582e43d0e3a4b850048dbddaaad0849f115e1c14741d4e919a5b310d0784ae75affff7f20127c20b839e0474e0824f3ec5994cf8e09a544dca2c610ecf7684842f23e368f60000000000000000100000000000000411f05d275045056b0c95f376ae9b99afa13405fbdaddd39ab8b9453206a9289e15a2668cd99999fa6fea4656efb8304b6505b2f1db536059cc81e0d44a30edd7ce901020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016000ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f8d4f2ec6b885e1cc7f6f038f5db0cc1149e7c34e54ce0467675152f43c8974307e7ab0befb5f198ac2ae1d17913c76a841c14e5f58421eaf21946dc3645ed92794ae75affff7f20fa2c9fb1800501e6baa78733b5efe841a8ca69ad266f5ed644b7628c69f794ca61000000000000000100000000000000411f62f19175c318df274388b6bd5b6144bfd65390d9879c754ee05f4874c7ab85d35662f601e2c2d5b3b5a8de6c45f8e963ef7e4ede3e68934288c05f99dab9bcdb01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016100ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020fe405fe1ea546767b79f79557a901c81abf671a2d9d56b6421d478d886897870df2ceb7cb3f3e9adeac0cc05f29608faf3b97c9fce5ce84885f303af708cbdd87a4ae75affff7f208f90906b45c4e0a2ebc66099cf4a54a64dd4e59a8fd59f38a3ea981d91c26d3d6200000000000000010000000000000041206f1a8bcb2770b9cafd25b0cff66100baa8887735ebd38a86e68fc5447369122c5fc1bde290438accd53d914cbc2c5786d33c8da2981b3befac440515df1e0f9801020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016200ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000203daecbb09247060e437d348f8ef47bcce08b31c4dfcdcb834e0dd62a6dca2b018114a4ccf8b4d67f1edc001ba7433e998f8262ec07cdadc6abfa6822dfc4b7eb7b4ae75affff7f20308981554354a5608fed346641b62879e2fc2bc60084fc450247d756613ade8663000000000000000100000000000000411f0f7cf57ed359aaa5a217d852b43bdbd7d65fed64969ae713ff4e5e02b31c6a8334b97634ccde1bc3ab8b824131439fe0328cfdafef76227b792fa83a89f7350201020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016300ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "000000207888a63f41bac5f272ece665fae38019521225888e1adfd4fad4f852a91a1e198bba06ee1b0917b94391eb878527f370fd7fa7c1b7cdca1ca1d644cbac7e10a67c4ae75affff7f20bf648a873adbb59e401cad1b8f27acc6cca6c0f17482997cc3771555907785bc64000000000000000100000000000000411f26d5a0d8761f139ba50fc14f267b35229b1882d32db8421a863cc67165a2ff121fdb311ca66fb49365b0fa0203a40f180c21d62c5ba0e8e3212736cf62278d8a01020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016400ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "0000002058420c86c1529cde897888d3a900d94021cac6c7d839e4a70864a25e56d13760ae18178b0bb8b5b1970ec6feed1f1e30d4bf826cf998fa96857f8bcd6bb3420c7d4ae75affff7f2011488efd631ef52c1c0d1257055d401c578e307d083694e88087830883a9618b650000000000000001000000000000004120694f00bded334dc2d1df7bfb8071bf1d3d91fee80e6637be5938d322d87822f055357337bce3c46bcfcfbb47285a875d4e8e26e6d7488e9299e884e80f69890101020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016500ffffffff0200f2052a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000", + "00000020f84a9ea184f79e6bb9ed02ebef9a75eef6db5081a5435f2d521f39c4efef211430174cf169e466663c06a3171f1e507bb38433bad83d13385b7d70e0bfcfa92f7e4ae75affff7f20f7e59f7b7b99b6f15be8e07d4bb079aca24edd6cb4b6816ee1f52068133f740d660000000000000001000000000000004120977fe45eda7939edc0b1ba1c3276364359f2878c7c90f62839d808f1db105f1174d1a246835a2bd2c703e3be7d983310d0ab71d51b3ffe3bbfb53aea30a6c71f02020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016600ffffffff026c03062a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9ed7425b640f0d41f634c6ef20bfe4491993db7afaca0bf2b3530790d0635d7761b012000000000000000000000000000000000000000000000000000000000000000000000000002000000012f44c3bde4c6a7b6739ac69ce83463fe658af4d089946c4f5e77dfa48d6d0729000000006a47304402200d4bcf0f29cb8d71d904028a9d0562df8d7d6956ca93d2f034154a32d0fdfce0022034f67d8764ca4515fd35d9ef189fe86d2c9aafd5de6153e1feee45725595fab2012102e7a9f881964d6febf2dd8221a1009d40a0b1b6d4e7a1c6189cbc3e512837e1abfeffffff0200286bee0000000017a914afeb546910e0b39851acdb401c45b979ffad4cd38794b89a3b000000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac42000000", + "0000002014926dc2c96c87c5fb6f6014a55da10817202448628540c9142e2927708d3289e17f2ed4ca2027f1d8d1bb62386527888cb6147c9f13310dcb24ed2d4decf96d7f4ae75affff7f20d18f5ba32ccf371ae09e9d9f4a796841d2b2ee05ad9011c4da6da6f11a456e6867000000000000000100000000000000411f772cc2f04c6e198b48c7ba727005b69fd15aa0cfeaa8df1d49cd90656ac02e484cd8fe5d6e070594c3ee53960ae1b6cc25202cfe5e04b82f5d010d18d55b3c4a04020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03016700ffffffff02e015072a010000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac0000000000000000266a24aa21a9edbe8d5b996cbca63b9d3bfbd5b57f53083ab79e4c092c10fee546fa4d5a935a97012000000000000000000000000000000000000000000000000000000000000000000000000002000000014f436c45a1dfddc66f4122779adf850deeb2ae94310daf0301269be9a52a6365010000006a4730440220569329722646afbb3d78337cf8793cc90690585761a056bd149be9c1f1320bb2022025255807277503eb63585ac909d02bea25518033967331988a3515ef6296f878012102e7a9f881964d6febf2dd8221a1009d40a0b1b6d4e7a1c6189cbc3e512837e1abfeffffff02acdbf405000000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac94d7a4350000000017a9145d310dcc314789d7482dce245cc565d59e527bf68766000000020000000001014f436c45a1dfddc66f4122779adf850deeb2ae94310daf0301269be9a52a6365000000001716001461162c374e97e062e2c653fc962a1dc9ca4433e3feffffff02005ed0b20000000017a91429675f2675fc132f4bae1fccbcfa6fd22e9087d787e0bc9a3b000000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac02473044022048789046e6ecc60421c5970ff730e012f30a3d7440ee4cf5568078b6d912c786022052dfd3f8b3a4a466565268864493932f41ebc395fa00d91fd5af027b1a4f339f012102b047684a6f1933df55412f0d2789248fd83580b60a1486d198e9e4780fab4d1666000000020000000187862047585a9349551b06a6b45ab35c524b09850a722ea21f46397024bcd7b0000000006a47304402204ac34f3de60f6abd47ee2dd85a16dff8ced974cfb91f09b65ffdd8e8db6e05820220380b4793fe236d6f04d988ef6c2f4697974e3f121d74145e7ed2c23f4b0cceb1012102e7a9f881964d6febf2dd8221a1009d40a0b1b6d4e7a1c6189cbc3e512837e1abfeffffff0200ca9a3b000000001976a9148857c8c3ce618fe7ae5f8ee11ecc8ea421a1d82988ac94166bee0000000017a9148dbc186145ef6eb4a05a187229e696a4d79c5a9a8766000000" ], "mocktime": 1525107225, "stats": [ @@ -111,7 +111,7 @@ "avgfee": 0, "avgfeerate": 0, "avgtxsize": 0, - "blockhash": "29a36876ddc6899a2541afc78ce2b3ca7659cfc01875e8208d9110d59bce3a9b", + "blockhash": "1421efefc4391f522d5f43a58150dbf6ee759aefeb02edb96b9ef784a19e4af8", "feerate_percentiles": [ 0, 0, @@ -125,7 +125,7 @@ "maxfeerate": 0, "maxtxsize": 0, "medianfee": 0, - "mediantime": 1525107242, + "mediantime": 1525107320, "mediantxsize": 0, "minfee": 0, "minfeerate": 0, @@ -135,7 +135,7 @@ "swtotal_size": 0, "swtotal_weight": 0, "swtxs": 0, - "time": 1525107243, + "time": 1525107325, "total_out": 0, "total_size": 0, "total_weight": 0, @@ -148,7 +148,7 @@ "avgfee": 4460, "avgfeerate": 20, "avgtxsize": 223, - "blockhash": "0aa1cae78efd1efcd5203366a257b6ccf4c9e4960f6b8a3724ad790ab568a10f", + "blockhash": "89328d7027292e14c94085624824201708a15da514606ffbc5876cc9c26d9214", "feerate_percentiles": [ 20, 20, @@ -162,7 +162,7 @@ "maxfeerate": 20, "maxtxsize": 223, "medianfee": 4460, - "mediantime": 1525107242, + "mediantime": 1525107321, "mediantxsize": 223, "minfee": 4460, "minfeerate": 20, @@ -172,7 +172,7 @@ "swtotal_size": 0, "swtotal_weight": 0, "swtxs": 0, - "time": 1525107243, + "time": 1525107326, "total_out": 4999995540, "total_size": 223, "total_weight": 892, @@ -185,7 +185,7 @@ "avgfee": 24906, "avgfeerate": 121, "avgtxsize": 231, - "blockhash": "53e416e2538bc783c42a7aea566e884321afed893e9e58cf356d6429759dfa46", + "blockhash": "19cd8b81c84d0b4653aa714384741ae6774a8f4600efe78a661575db3e49c077", "feerate_percentiles": [ 20, 20, @@ -199,7 +199,7 @@ "maxfeerate": 300, "maxtxsize": 249, "medianfee": 4460, - "mediantime": 1525107243, + "mediantime": 1525107322, "mediantxsize": 223, "minfee": 3360, "minfeerate": 20, @@ -209,7 +209,7 @@ "swtotal_size": 249, "swtotal_weight": 669, "swtxs": 1, - "time": 1525107243, + "time": 1525107327, "total_out": 9999920820, "total_size": 695, "total_weight": 2453, diff --git a/test/functional/feature_assumevalid.py b/test/functional/feature_assumevalid.py index 478259fcd9..418f0a723c 100755 --- a/test/functional/feature_assumevalid.py +++ b/test/functional/feature_assumevalid.py @@ -79,17 +79,15 @@ def send_blocks_until_disconnected(self, p2p_conn): def assert_blockchain_height(self, node, height): """Wait until the blockchain is no longer advancing and verify it's reached the expected height.""" last_height = node.getblock(node.getbestblockhash())['height'] - print (last_height) timeout = 10 while True: time.sleep(0.25) + timeout -= 0.25 current_height = node.getblock(node.getbestblockhash())['height'] - print ("current_height", current_height) + if timeout < 0: + assert False, "blockchain too short after timeout: %d" % current_height if current_height != last_height: last_height = current_height - if timeout < 0: - assert False, "blockchain too short after timeout: %d" % current_height - timeout -= 0.25 continue elif current_height > height: assert False, "blockchain too long: %d" % current_height @@ -176,16 +174,12 @@ def run_test(self): # Send blocks to node0. Block 102 will be rejected. self.send_blocks_until_disconnected(p2p0) - print('==========') self.assert_blockchain_height(self.nodes[0], 101) - print('==========') # Send all blocks to node1. All blocks will be accepted. for i in range(2202): - print (i) p2p1.send_message(msg_block(self.blocks[i])) # Syncing 2200 blocks can take a while on slow systems. Give it plenty of time to sync. - print('==========') p2p1.sync_with_ping(200) assert_equal(self.nodes[1].getblock(self.nodes[1].getbestblockhash())['height'], 2202) diff --git a/test/functional/feature_bip68_sequence.py b/test/functional/feature_bip68_sequence.py index fe6f9eade1..fc2d4998ee 100755 --- a/test/functional/feature_bip68_sequence.py +++ b/test/functional/feature_bip68_sequence.py @@ -10,6 +10,7 @@ from test_framework.messages import COIN, COutPoint, CTransaction, CTxIn, CTxOut, FromHex, ToHex from test_framework.script import CScript from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_node import TestNode from test_framework.util import ( assert_equal, assert_greater_than, @@ -258,7 +259,8 @@ def test_nonzero_locks(orig_tx, node, relayfee, use_height_lock): self.nodes[0].prioritisetransaction(txid=tx2.hash, fee_delta=int(-self.relayfee*COIN)) cur_time = int(time.time()) for i in range(10): - self.nodes[0].setmocktime(cur_time + 600) + # self.nodes[0].setmocktime(cur_time + 600) + TestNode.Mocktime = cur_time + 600 self.nodes[0].generate(1) cur_time += 600 @@ -271,7 +273,8 @@ def test_nonzero_locks(orig_tx, node, relayfee, use_height_lock): self.nodes[0].prioritisetransaction(txid=tx2.hash, fee_delta=int(self.relayfee*COIN)) # Advance the time on the node so that we can test timelocks - self.nodes[0].setmocktime(cur_time+600) + TestNode.Mocktime = cur_time + 600 + # self.nodes[0].setmocktime(cur_time+600) self.nodes[0].generate(1) assert tx2.hash not in self.nodes[0].getrawmempool() @@ -332,7 +335,7 @@ def test_nonzero_locks(orig_tx, node, relayfee, use_height_lock): assert tx2.hash in mempool # Reset the chain and get rid of the mocktimed-blocks - self.nodes[0].setmocktime(0) + # self.nodes[0].setmocktime(0) # commented cause will be no generation otherwise self.nodes[0].invalidateblock(self.nodes[0].getblockhash(cur_height+1)) self.nodes[0].generate(10) @@ -373,7 +376,7 @@ def test_bip68_not_consensus(self): # make a block that violates bip68; ensure that the tip updates tip = int(self.nodes[0].getbestblockhash(), 16) - block = create_block(tip, create_coinbase(self.nodes[0].getblockcount()+1)) + block = create_block(tip, create_coinbase(self.nodes[0].getblockcount()+1), TestNode.Mocktime) block.nVersion = 3 block.vtx.extend([tx1, tx2, tx3]) block.hashMerkleRoot = block.calc_merkle_root() diff --git a/test/functional/feature_block.py b/test/functional/feature_block.py index 12a52935ef..1b1cc719da 100755 --- a/test/functional/feature_block.py +++ b/test/functional/feature_block.py @@ -159,6 +159,7 @@ def run_test(self): self.sign_tx(badtx, attempt_spend_tx) badtx.rehash() badblock = self.update_block(blockname, [badtx]) + self.send_blocks( [badblock], success=False, reject_reason=(template.block_reject_reason or template.reject_reason), @@ -628,14 +629,15 @@ def run_test(self): self.blocks[46] = b46 self.send_blocks([b46], success=False, reject_reason='bad-blk-length', reconnect=True) - self.log.info("Reject a block with invalid work") - self.move_tip(44) - b47 = self.next_block(47, solve=False) - target = uint256_from_compact(b47.nBits) - while b47.sha256 < target: - b47.nNonce += 1 - b47.rehash() - self.send_blocks([b47], False, force_send=True, reject_reason='high-hash', reconnect=True) + # Disabled due to POS complexity emulation + # self.log.info("Reject a block with invalid work") + # self.move_tip(44) + # b47 = self.next_block(47, solve=False) + # target = uint256_from_compact(b47.nBits) + # while b47.sha256 < target: + # b47.stakeModifier += 1 + # b47.rehash() + # self.send_blocks([b47], False, force_send=True, reject_reason='high-hash', reconnect=True) self.log.info("Reject a block with a timestamp >2 hours in the future") self.move_tip(44) diff --git a/test/functional/feature_csv_activation.py b/test/functional/feature_csv_activation.py index 6bd321992a..f99b2e67a3 100755 --- a/test/functional/feature_csv_activation.py +++ b/test/functional/feature_csv_activation.py @@ -50,6 +50,7 @@ OP_DROP, ) from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_node import TestNode from test_framework.util import ( assert_equal, hex_str_to_bytes, @@ -173,7 +174,8 @@ def run_test(self): self.log.info("Generate blocks in the past for coinbase outputs.") long_past_time = int(time.time()) - 600 * 1000 # enough to build up to 1000 blocks 10 minutes apart without worrying about getting into the future - self.nodes[0].setmocktime(long_past_time - 100) # enough so that the generated blocks will still all be before long_past_time + # self.nodes[0].setmocktime(long_past_time - 100) # enough so that the generated blocks will still all be before long_past_time + TestNode.Mocktime = long_past_time - 100 self.coinbase_blocks = self.nodes[0].generate(1 + 16 + 2 * 32 + 1) # 82 blocks generated for inputs self.nodes[0].setmocktime(0) # set time back to present so yielded blocks aren't in the future as we advance last_block_time self.tipheight = 82 # height of the next block to build @@ -217,7 +219,8 @@ def run_test(self): # 1 normal input bip113input = send_generic_input_tx(self.nodes[0], self.coinbase_blocks, self.nodeaddress) - self.nodes[0].setmocktime(self.last_block_time + 600) + TestNode.Mocktime = self.last_block_time + 600 + # self.nodes[0].setmocktime(self.last_block_time + 600) inputblockhash = self.nodes[0].generate(1)[0] # 1 block generated for inputs to be in chain at height 431 self.nodes[0].setmocktime(0) self.tip = int(inputblockhash, 16) diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py index 180ea0e51d..7c17be7fdf 100755 --- a/test/functional/feature_maxuploadtarget.py +++ b/test/functional/feature_maxuploadtarget.py @@ -47,8 +47,9 @@ def run_test(self): # Before we connect anything, we first set the time on the node # to be in the past, otherwise things break because the CNode # time counters can't be reset backward after initialization - old_time = int(time.time() - 2*60*60*24*7) - self.nodes[0].setmocktime(old_time) + from test_framework.test_node import TestNode + # TestNode.Mocktime is required now for successful 'generate' + TestNode.Mocktime = int(time.time() - 2*60*60*24*7) # Generate some old blocks self.nodes[0].generate(130) @@ -70,7 +71,7 @@ def run_test(self): big_old_block = int(big_old_block, 16) # Advance to two days ago - self.nodes[0].setmocktime(int(time.time()) - 2*60*60*24) + TestNode.Mocktime = int(time.time()) - 2*60*60*24 # Mine one more block, so that the prior block looks old mine_large_block(self.nodes[0], self.utxo_cache) @@ -129,6 +130,7 @@ def run_test(self): # If we advance the time by 24 hours, then the counters should reset, # and p2p_conns[2] should be able to retrieve the old block. + # 'setmocktime' here (instead of TestNode.Mocktime) due to no 'generate' after it self.nodes[0].setmocktime(int(time.time())) p2p_conns[2].sync_with_ping() p2p_conns[2].send_message(getdata_request) diff --git a/test/functional/feature_notifications.py b/test/functional/feature_notifications.py index 0b8420f915..2753fb2e7a 100755 --- a/test/functional/feature_notifications.py +++ b/test/functional/feature_notifications.py @@ -46,10 +46,10 @@ def run_test(self): if self.is_wallet_compiled(): self.log.info("test -walletnotify") # wait at most 10 seconds for expected number of files before reading the content - wait_until(lambda: len(os.listdir(self.walletnotify_dir)) == block_count, timeout=10) + wait_until(lambda: len(os.listdir(self.walletnotify_dir)) == block_count+1, timeout=10) # block_count+1 due to +1 genesis mn tx # directory content should equal the generated transaction hashes - txids_rpc = list(map(lambda t: t['txid'], self.nodes[1].listtransactions("*", block_count))) + txids_rpc = list(map(lambda t: t['txid'], self.nodes[1].listtransactions("*", block_count+1))) assert_equal(sorted(txids_rpc), sorted(os.listdir(self.walletnotify_dir))) self.stop_node(1) for tx_file in os.listdir(self.walletnotify_dir): @@ -60,10 +60,10 @@ def run_test(self): self.start_node(1) connect_nodes_bi(self.nodes, 0, 1) - wait_until(lambda: len(os.listdir(self.walletnotify_dir)) == block_count, timeout=10) + wait_until(lambda: len(os.listdir(self.walletnotify_dir)) == block_count+1, timeout=10) # directory content should equal the generated transaction hashes - txids_rpc = list(map(lambda t: t['txid'], self.nodes[1].listtransactions("*", block_count))) + txids_rpc = list(map(lambda t: t['txid'], self.nodes[1].listtransactions("*", block_count+1))) assert_equal(sorted(txids_rpc), sorted(os.listdir(self.walletnotify_dir))) # TODO: add test for `-alertnotify` large fork notifications diff --git a/test/functional/feature_nulldummy.py b/test/functional/feature_nulldummy.py index 250dee1528..15f70ca4f8 100755 --- a/test/functional/feature_nulldummy.py +++ b/test/functional/feature_nulldummy.py @@ -60,7 +60,8 @@ def run_test(self): self.lastblockhash = self.nodes[0].getbestblockhash() self.tip = int("0x" + self.lastblockhash, 0) self.lastblockheight = 429 - self.lastblocktime = int(time.time()) + 429 + # self.lastblocktime = int(time.time()) + 429 + self.lastblocktime = self.nodes[0].getblockheader(self.lastblockhash)["time"] self.log.info("Test 1: NULLDUMMY compliant base transactions should be accepted to mempool and mined before activation [430]") test1txs = [create_transaction(self.nodes[0], coinbase_txid[0], self.ms_address, amount=49)] diff --git a/test/functional/feature_pruning.py b/test/functional/feature_pruning.py index a706e4385c..1f333a4caf 100755 --- a/test/functional/feature_pruning.py +++ b/test/functional/feature_pruning.py @@ -59,7 +59,6 @@ def mine_large_blocks(node, n): block.hashPrevBlock = previousblockhash block.nTime = mine_large_blocks.nTime block.nBits = int('207fffff', 16) - # block.nNonce = 0 block.vtx = [coinbase_tx] block.hashMerkleRoot = block.calc_merkle_root() block.solve() @@ -112,7 +111,7 @@ def setup_nodes(self): self.add_nodes(self.num_nodes, self.extra_args) self.start_nodes() for n in self.nodes: - n.importprivkey(privkey=n.get_genesis_keys().key, label='coinbase', rescan=False) + n.importprivkey(privkey=n.get_genesis_keys().operatorPrivKey, label='coinbase', rescan=False) def create_big_chain(self): # Start by creating some coinbases we can spend later @@ -191,6 +190,7 @@ def reorg_test(self): disconnect_nodes(self.nodes[1], 2) self.log.info("Generating new longer chain of 300 more blocks") + self.nodes[1].pullup_mocktime() # Pull mocktime to last block due to previous manual block submitting self.nodes[1].generate(300) self.log.info("Reconnect nodes") diff --git a/test/functional/feature_segwit.py b/test/functional/feature_segwit.py index 309ce347aa..9d93397149 100755 --- a/test/functional/feature_segwit.py +++ b/test/functional/feature_segwit.py @@ -102,8 +102,6 @@ def run_test(self): self.log.info("Verify sigops are counted in GBT with pre-BIP141 rules before the fork") txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1) tmpl = self.nodes[0].getblocktemplate({'rules': ['segwit']}) - print ("tmpl:", tmpl) - print ("txid:", txid) assert tmpl['sizelimit'] == 1000000 assert 'weightlimit' not in tmpl assert tmpl['sigoplimit'] == 20000 @@ -142,7 +140,8 @@ def run_test(self): p2sh_ids[n][v].append(send_to_witness(v, self.nodes[0], find_spendable_utxo(self.nodes[0], 50), self.pubkey[n], True, Decimal("49.999"))) self.nodes[0].generate(1) # block 163 - self.sync_blocks() + # self.sync_blocks() + self.sync_all() # Make sure all nodes recognize the transactions as theirs assert_equal(self.nodes[0].getbalance(), balance_presetup - 60 * 50 + 20 * Decimal("49.999") + 50) diff --git a/test/functional/feature_versionbits_warning.py b/test/functional/feature_versionbits_warning.py index aec2bd9670..92edee589a 100755 --- a/test/functional/feature_versionbits_warning.py +++ b/test/functional/feature_versionbits_warning.py @@ -70,14 +70,16 @@ def run_test(self): self.log.info("Check that there is no warning if previous VB_BLOCKS have =VB_THRESHOLD blocks with unknown versionbits version.") @@ -94,7 +96,7 @@ def run_test(self): # Generating one more block will be enough to generate an error. node.generate(1) # Check that get*info() shows the versionbits unknown rules warning - assert WARN_UNKNOWN_RULES_ACTIVE in node.getmininginfo()["warnings"] + # assert WARN_UNKNOWN_RULES_ACTIVE in node.getmininginfo()["warnings"] assert WARN_UNKNOWN_RULES_ACTIVE in node.getnetworkinfo()["warnings"] # Check that the alert file shows the versionbits unknown rules warning wait_until(lambda: self.versionbits_in_alert_file(), timeout=60) diff --git a/test/functional/interface_rest.py b/test/functional/interface_rest.py index fafaca80f4..f98d10b714 100755 --- a/test/functional/interface_rest.py +++ b/test/functional/interface_rest.py @@ -271,7 +271,7 @@ def run_test(self): # Compare with normal RPC block response rpc_block_json = self.nodes[0].getblock(bb_hash) - for key in ['hash', 'confirmations', 'height', 'version', 'merkleroot', 'time', 'nonce', 'bits', 'difficulty', 'chainwork', 'previousblockhash']: + for key in ['hash', 'confirmations', 'height', 'version', 'merkleroot', 'time', 'bits', 'difficulty', 'chainwork', 'previousblockhash']: assert_equal(json_obj[0][key], rpc_block_json[key]) # See if we can get 5 headers in one response diff --git a/test/functional/interface_zmq.py b/test/functional/interface_zmq.py index b19ae8f648..f1df2168e8 100755 --- a/test/functional/interface_zmq.py +++ b/test/functional/interface_zmq.py @@ -7,7 +7,7 @@ from test_framework.address import ADDRESS_BCRT1_UNSPENDABLE from test_framework.test_framework import BitcoinTestFramework -from test_framework.messages import CTransaction, hash256 +from test_framework.messages import CTransaction, hash256, BLOCK_HEADER_SIZE from test_framework.util import assert_equal, connect_nodes from io import BytesIO from time import sleep @@ -78,7 +78,8 @@ def test_basic(self): num_blocks = 5 self.log.info("Generate %(n)d blocks (and %(n)d coinbase txes)" % {"n": num_blocks}) genhashes = self.nodes[0].generate(nblocks=num_blocks, address=ADDRESS_BCRT1_UNSPENDABLE) - + from test_framework.util import set_node_times + # set_node_times(self.nodes, 0) self.sync_all() for x in range(num_blocks): @@ -100,7 +101,7 @@ def test_basic(self): # Should receive the generated raw block. block = rawblock.receive() - assert_equal(genhashes[x], hash256_reversed(block[:80]).hex()) + assert_equal(genhashes[x], hash256_reversed(block[:BLOCK_HEADER_SIZE]).hex()) if self.is_wallet_compiled(): self.log.info("Wait for tx from second node") diff --git a/test/functional/mining_basic.py b/test/functional/mining_basic.py index 21ef7d0b43..295392de01 100755 --- a/test/functional/mining_basic.py +++ b/test/functional/mining_basic.py @@ -46,13 +46,16 @@ def set_test_params(self): def mine_chain(self): self.log.info('Create some old blocks') - for t in range(TIME_GENESIS_BLOCK, TIME_GENESIS_BLOCK + 200 * 600, 600): + address = self.nodes[0].get_genesis_keys().operatorAuthAddress + for t in range(TIME_GENESIS_BLOCK+1, TIME_GENESIS_BLOCK + 200 * 600 +1, 600): self.nodes[0].setmocktime(t) - self.nodes[0].generate(1) - mining_info = self.nodes[0].getmininginfo() - assert_equal(mining_info['blocks'], 200) - assert_equal(mining_info['currentblocktx'], 0) - assert_equal(mining_info['currentblockweight'], 4000) + self.nodes[0].generatetoaddress(1, address) + + # We have no RPC 'getmininginfo'! + # mining_info = self.nodes[0].getmininginfo() + # assert_equal(mining_info['blocks'], 200) + # assert_equal(mining_info['currentblocktx'], 0) + # assert_equal(mining_info['currentblockweight'], 4000) self.restart_node(0) connect_nodes_bi(self.nodes, 0, 1) @@ -66,15 +69,16 @@ def assert_submitblock(block, result_str_1, result_str_2=None): assert_equal(result_str_1, node.submitblock(hexdata=block.serialize().hex())) assert_equal(result_str_2, node.submitblock(hexdata=block.serialize().hex())) - self.log.info('getmininginfo') - mining_info = node.getmininginfo() - assert_equal(mining_info['blocks'], 200) - assert_equal(mining_info['chain'], 'regtest') - assert 'currentblocktx' not in mining_info - assert 'currentblockweight' not in mining_info - assert_equal(mining_info['difficulty'], Decimal('4.656542373906925E-10')) - assert_equal(mining_info['networkhashps'], Decimal('0.003333333333333334')) - assert_equal(mining_info['pooledtx'], 0) + # We have no RPC 'getmininginfo'! + # self.log.info('getmininginfo') + # mining_info = node.getmininginfo() + # assert_equal(mining_info['blocks'], 200) + # assert_equal(mining_info['chain'], 'regtest') + # assert 'currentblocktx' not in mining_info + # assert 'currentblockweight' not in mining_info + # assert_equal(mining_info['difficulty'], Decimal('4.656542373906925E-10')) + # assert_equal(mining_info['networkhashps'], Decimal('0.003333333333333334')) + # assert_equal(mining_info['pooledtx'], 0) # Mine a block to leave initial block download node.generate(1) @@ -101,7 +105,6 @@ def assert_submitblock(block, result_str_1, result_str_2=None): block.hashPrevBlock = int(tmpl["previousblockhash"], 16) block.nTime = tmpl["curtime"] block.nBits = int(tmpl["bits"], 16) - # block.nNonce = 0 block.vtx = [coinbase_tx] self.log.info("getblocktemplate: segwit rule must be set") diff --git a/test/functional/p2p_compactblocks.py b/test/functional/p2p_compactblocks.py index 030cc415cb..898c774703 100755 --- a/test/functional/p2p_compactblocks.py +++ b/test/functional/p2p_compactblocks.py @@ -96,7 +96,7 @@ def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 1 self.extra_args = [[ - "-acceptnonstdtxn=1", + "-acceptnonstdtxn=1", "-dummypos=1" ]] self.utxos = [] diff --git a/test/functional/p2p_disconnect_ban.py b/test/functional/p2p_disconnect_ban.py index 1b11a2a294..2e17825203 100755 --- a/test/functional/p2p_disconnect_ban.py +++ b/test/functional/p2p_disconnect_ban.py @@ -16,6 +16,7 @@ class DisconnectBanTest(BitcoinTestFramework): def set_test_params(self): self.num_nodes = 2 + self.extra_args = [['-dummypos=1'], ['-dummypos=1']] def run_test(self): self.log.info("Test setban and listbanned RPCs") diff --git a/test/functional/p2p_fingerprint.py b/test/functional/p2p_fingerprint.py index c7f316cc1c..667832d924 100755 --- a/test/functional/p2p_fingerprint.py +++ b/test/functional/p2p_fingerprint.py @@ -77,7 +77,8 @@ def run_test(self): node0 = self.nodes[0].add_p2p_connection(P2PInterface()) # Set node time to 60 days ago - self.nodes[0].setmocktime(int(time.time()) - 60 * 24 * 60 * 60) + # self.nodes[0].setmocktime(int(time.time()) - 60 * 24 * 60 * 60) + self.nodes[0].set_mocktime(int(time.time()) - 60 * 24 * 60 * 60) # Generating a chain of 10 blocks block_hashes = self.nodes[0].generate(10) @@ -110,7 +111,8 @@ def run_test(self): wait_until(test_function, timeout=3) # Longest chain is extended so stale is much older than chain tip - self.nodes[0].setmocktime(0) + # self.nodes[0].setmocktime(0) + self.nodes[0].set_mocktime(int(time.time())) # NOT 0 NOR None, but current time tip = self.nodes[0].generate(1)[0] assert_equal(self.nodes[0].getblockcount(), 14) diff --git a/test/functional/p2p_invalid_block.py b/test/functional/p2p_invalid_block.py index 276f99e047..d24ebeb9f5 100755 --- a/test/functional/p2p_invalid_block.py +++ b/test/functional/p2p_invalid_block.py @@ -22,7 +22,7 @@ class InvalidBlockRequestTest(BitcoinTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = True - self.extra_args = [["-whitelist=127.0.0.1"]] + self.extra_args = [["-whitelist=127.0.0.1", "-dummypos=1"]] def run_test(self): # Add p2p connection to node0 diff --git a/test/functional/p2p_invalid_locator.py b/test/functional/p2p_invalid_locator.py index ceb3d3a8bc..af5e4c1131 100755 --- a/test/functional/p2p_invalid_locator.py +++ b/test/functional/p2p_invalid_locator.py @@ -14,6 +14,7 @@ class InvalidLocatorTest(BitcoinTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = False + self.extra_args = [["-dummypos=1"]] def run_test(self): node = self.nodes[0] # convenience reference to the node diff --git a/test/functional/p2p_invalid_tx.py b/test/functional/p2p_invalid_tx.py index 79415d46f2..e5c9c6f718 100755 --- a/test/functional/p2p_invalid_tx.py +++ b/test/functional/p2p_invalid_tx.py @@ -27,6 +27,7 @@ def set_test_params(self): self.num_nodes = 1 self.extra_args = [[ "-acceptnonstdtxn=1", + "-dummypos=1", ]] self.setup_clean_chain = True diff --git a/test/functional/p2p_node_network_limited.py b/test/functional/p2p_node_network_limited.py index d94bac37a1..87a7b18adb 100755 --- a/test/functional/p2p_node_network_limited.py +++ b/test/functional/p2p_node_network_limited.py @@ -11,11 +11,13 @@ from test_framework.messages import CInv, msg_getdata, msg_verack, NODE_NETWORK_LIMITED, NODE_WITNESS from test_framework.mininode import P2PInterface, mininode_lock from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_node import TestNode from test_framework.util import ( assert_equal, disconnect_nodes, connect_nodes_bi, wait_until, + set_node_times, ) @@ -38,7 +40,7 @@ class NodeNetworkLimitedTest(BitcoinTestFramework): def set_test_params(self): self.setup_clean_chain = True self.num_nodes = 3 - self.extra_args = [['-prune=550', '-addrmantest'], [], []] + self.extra_args = [['-prune=550', '-addrmantest', '-dummypos=1'], ['-dummypos=1'], ['-dummypos=1']] def disconnect_all(self): disconnect_nodes(self.nodes[0], 1) @@ -67,6 +69,7 @@ def run_test(self): self.log.info("Mine enough blocks to reach the NODE_NETWORK_LIMITED range.") connect_nodes_bi(self.nodes, 0, 1) blocks = self.nodes[1].generate(292) + set_node_times(self.nodes, TestNode.Mocktime) self.sync_blocks([self.nodes[0], self.nodes[1]]) self.log.info("Make sure we can max retrieve block at tip-288.") diff --git a/test/functional/p2p_sendheaders.py b/test/functional/p2p_sendheaders.py index dc0e65d5f2..35098604da 100755 --- a/test/functional/p2p_sendheaders.py +++ b/test/functional/p2p_sendheaders.py @@ -212,6 +212,7 @@ def mine_blocks(self, count): # Clear out block announcements from each p2p listener [x.clear_block_announcements() for x in self.nodes[0].p2ps] + self.nodes[0].pullup_mocktime() # Need to! Cause 'generate' interleaved with manual block's creation/sending self.nodes[0].generate(count) return int(self.nodes[0].getbestblockhash(), 16) @@ -322,14 +323,13 @@ def test_nonnull_locators(self, test_node, inv_node): prev_tip = int(self.nodes[0].getbestblockhash(), 16) test_node.send_get_headers(locator=[prev_tip], hashstop=0) test_node.sync_with_ping() - # Now that we've synced headers, headers announcements should work tip = self.mine_blocks(1) inv_node.check_last_inv_announcement(inv=[tip]) test_node.check_last_headers_announcement(headers=[tip]) height = self.nodes[0].getblockcount() + 1 - block_time += 10 # Advance far enough ahead + block_time += 10 # Advance far enough ahead (in fact, `block_time` isn't consistent here. it'll be better to get last block time in the case of 'generate()' interleaving 'create_block()' ) for i in range(10): self.log.debug("Part 2.{}: starting...".format(i)) # Mine i blocks, and alternate announcing either via diff --git a/test/functional/p2p_tx_download.py b/test/functional/p2p_tx_download.py index f1c29bb7f8..776fecc70d 100755 --- a/test/functional/p2p_tx_download.py +++ b/test/functional/p2p_tx_download.py @@ -98,7 +98,7 @@ def test_inv_block(self): ) tx = self.nodes[0].signrawtransactionwithkey( hexstring=tx, - privkeys=[self.nodes[0].get_genesis_keys().key], + privkeys=[self.nodes[0].get_genesis_keys().operatorPrivKey], )['hex'] ctx = FromHex(CTransaction(), tx) txid = int(ctx.rehash(), 16) @@ -127,6 +127,10 @@ def test_inv_block(self): self.sync_mempools(timeout=timeout) def test_in_flight_max(self): + # need cause mocktime set in start_node() (if not None), and in setup_nodes() + # TODO: refactor mocktime logic + self.nodes[0].setmocktime(0) + self.log.info("Test that we don't request more than {} transactions from any peer, every {} minutes".format( MAX_GETDATA_IN_FLIGHT, TX_EXPIRY_INTERVAL / 60)) txids = [i for i in range(MAX_GETDATA_IN_FLIGHT + 2)] diff --git a/test/functional/p2p_unrequested_blocks.py b/test/functional/p2p_unrequested_blocks.py index e9abe4c000..09231c0544 100755 --- a/test/functional/p2p_unrequested_blocks.py +++ b/test/functional/p2p_unrequested_blocks.py @@ -57,6 +57,7 @@ from test_framework.messages import CBlockHeader, CInv, msg_block, msg_headers, msg_inv from test_framework.mininode import mininode_lock, P2PInterface from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_node import TestNode from test_framework.util import ( assert_equal, assert_raises_rpc_error, @@ -86,7 +87,8 @@ def run_test(self): min_work_node = self.nodes[1].add_p2p_connection(P2PInterface()) # 1. Have nodes mine a block (leave IBD) - [n.generate(1) for n in self.nodes] + # [n.generate(1) for n in self.nodes] # not `generate` here!!! cant understand the logic, but if we touch mocktime here, everything fails!! + [n.generatetoaddress(1, n.get_genesis_keys().operatorAuthAddress) for n in self.nodes] tips = [int("0x" + n.getbestblockhash(), 0) for n in self.nodes] # 2. Send one block that builds on each tip. diff --git a/test/functional/rpc_blockchain.py b/test/functional/rpc_blockchain.py index f3f950ab3d..6946aec1b4 100755 --- a/test/functional/rpc_blockchain.py +++ b/test/functional/rpc_blockchain.py @@ -67,7 +67,7 @@ def run_test(self): def mine_chain(self): self.log.info('Create some old blocks') address = self.nodes[0].get_genesis_keys().operatorAuthAddress - for t in range(TIME_GENESIS_BLOCK, TIME_GENESIS_BLOCK + 200 * 600, 600): + for t in range(TIME_GENESIS_BLOCK+1, TIME_GENESIS_BLOCK + 200 * 600 +1, 600): # ten-minute steps from genesis block time self.nodes[0].setmocktime(t) self.nodes[0].generatetoaddress(1, address) @@ -171,7 +171,7 @@ def _test_getchaintxstats(self): chaintxstats = self.nodes[0].getchaintxstats(nblocks=1) # 200 txs plus genesis tx - assert_equal(chaintxstats['txcount'], 201) + assert_equal(chaintxstats['txcount'], 201 +8) # +8 due to genesis mn txs # tx rate should be 1 per 10 minutes, or 1/600 # we have to round because of binary math assert_equal(round(chaintxstats['txrate'] * 600, 10), Decimal(1)) @@ -184,7 +184,7 @@ def _test_getchaintxstats(self): chaintxstats = self.nodes[0].getchaintxstats() assert_equal(chaintxstats['time'], b200['time']) - assert_equal(chaintxstats['txcount'], 201) + assert_equal(chaintxstats['txcount'], 201 +8) # +8 due to genesis mn txs assert_equal(chaintxstats['window_final_block_hash'], b200_hash) assert_equal(chaintxstats['window_final_block_height'], 200) assert_equal(chaintxstats['window_block_count'], 199) @@ -194,7 +194,7 @@ def _test_getchaintxstats(self): chaintxstats = self.nodes[0].getchaintxstats(blockhash=b1_hash) assert_equal(chaintxstats['time'], b1['time']) - assert_equal(chaintxstats['txcount'], 2) + assert_equal(chaintxstats['txcount'], 2 +8) # +8 due to genesis mn txs assert_equal(chaintxstats['window_final_block_hash'], b1_hash) assert_equal(chaintxstats['window_final_block_height'], 1) assert_equal(chaintxstats['window_block_count'], 0) @@ -263,7 +263,7 @@ def _test_getblockheader(self): assert_is_hash_string(header['bits'], length=None) assert isinstance(header['time'], int) assert isinstance(header['mediantime'], int) - assert isinstance(header['nonce'], int) + # assert isinstance(header['nonce'], int) # no 'nonce'! assert isinstance(header['version'], int) assert isinstance(int(header['versionHex'], 16), int) assert isinstance(header['difficulty'], Decimal) diff --git a/test/functional/rpc_getblockstats.py b/test/functional/rpc_getblockstats.py index b287af7f86..a9c8180aef 100755 --- a/test/functional/rpc_getblockstats.py +++ b/test/functional/rpc_getblockstats.py @@ -42,7 +42,7 @@ def generate_test_data(self, filename): self.nodes[0].setmocktime(mocktime) self.nodes[0].generate(101) - address = self.nodes[0].get_genesis_keys().address + address = self.nodes[0].get_genesis_keys().operatorAuthAddress self.nodes[0].sendtoaddress(address=address, amount=10, subtractfeefromamount=True) self.nodes[0].generate(1) self.sync_all() diff --git a/test/functional/rpc_mn_basic.py b/test/functional/rpc_mn_basic.py index 71bd85b2ec..201ad800fe 100755 --- a/test/functional/rpc_mn_basic.py +++ b/test/functional/rpc_mn_basic.py @@ -23,12 +23,11 @@ def set_test_params(self): self.setup_clean_chain = True def run_test(self): - pprint.PrettyPrinter(indent=4) + pp = pprint.PrettyPrinter(indent=4) - assert_equal(len(self.nodes[0].mn_list()), 4) + assert_equal(len(self.nodes[0].mn_list()), 8) self.nodes[0].generate(100) - time.sleep(2) - self.sync_blocks() + self.sync_all() # Stop node #2 for future revert self.stop_node(2) @@ -144,7 +143,7 @@ def run_test(self): self.nodes[2].generate(25) connect_nodes_bi(self.nodes, 0, 2) self.sync_blocks(self.nodes[0:3]) - assert_equal(len(self.nodes[0].mn_list()), 4) + assert_equal(len(self.nodes[0].mn_list()), 8) assert_equal(self.nodes[0].getrawmempool(), [idnode0, fundingTx, resignTx]) if __name__ == '__main__': diff --git a/test/functional/rpc_scantxoutset.py b/test/functional/rpc_scantxoutset.py index a1cd33ad54..52db8fe6d5 100755 --- a/test/functional/rpc_scantxoutset.py +++ b/test/functional/rpc_scantxoutset.py @@ -56,6 +56,7 @@ def run_test(self): self.stop_node(0) shutil.rmtree(os.path.join(self.nodes[0].datadir, "regtest", 'wallets')) self.start_node(0) + self.import_deterministic_coinbase_privkeys() self.nodes[0].generate(110) self.restart_node(0, ['-nowallet']) diff --git a/test/functional/test_framework/blocktools.py b/test/functional/test_framework/blocktools.py index d741b00ba0..632eb298d5 100644 --- a/test/functional/test_framework/blocktools.py +++ b/test/functional/test_framework/blocktools.py @@ -44,7 +44,7 @@ MAX_BLOCK_SIGOPS = 20000 # Genesis block time (regtest) -TIME_GENESIS_BLOCK = 1296688602 +TIME_GENESIS_BLOCK = 1298732709 # From BIP141 WITNESS_COMMITMENT_HEADER = b"\xaa\x21\xa9\xed" @@ -60,6 +60,7 @@ def create_block(hashprev, coinbase, ntime=None, *, version=1): else: block.nTime = ntime block.hashPrevBlock = hashprev + block.nBits = 0x207fffff # difficulty retargeting is disabled in REGTEST chainparams block.vtx.append(coinbase) block.hashMerkleRoot = block.calc_merkle_root() diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py index 8771fb0c11..c9fe13c0b7 100755 --- a/test/functional/test_framework/messages.py +++ b/test/functional/test_framework/messages.py @@ -550,11 +550,11 @@ def set_null(self): self.hashMerkleRoot = 0 self.nTime = 0 self.nBits = 0 - # self.nNonce = 0 + self.stakeModifier = 0 self.nHeight = 0 self.nMintedBlocks = 0 - self.sig = b"" + self.sig = b"0" * 65 # dummy sig to make header fixed length self.sha256 = None self.hash = None @@ -565,7 +565,6 @@ def deserialize(self, f): self.hashMerkleRoot = deser_uint256(f) self.nTime = struct.unpack(" target: - # self.nNonce += 1 + # # increment stakeModifier here (instead of nTime) due to very complex control of nTime + # self.stakeModifier += 1 # self.rehash() def __repr__(self): diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index ec14cfafff..66d738fa59 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -296,9 +296,7 @@ def setup_nodes(self): self.start_nodes() self.import_deterministic_coinbase_privkeys() - - self.mocktime = self.nodes[0].getblockheader(self.nodes[0].getbestblockhash())["time"] + 1 - set_node_times(self.nodes, self.mocktime) + # TestNode.Mocktime = int(time.time()) if not self.setup_clean_chain: for n in self.nodes: @@ -307,6 +305,7 @@ def setup_nodes(self): # must have a timestamp not too old (see IsInitialBlockDownload()). self.log.debug('Generate a block with current time') # block_hash = self.nodes[0].generate(1)[0] + # TestNode.Mocktime = int(time.time()) self.nodes[0].generate(1) block_hash = self.nodes[0].getbestblockhash() @@ -326,24 +325,8 @@ def import_deterministic_coinbase_privkeys(self): assert str(e).startswith('Method not found') continue - n.importprivkey(privkey=n.get_genesis_keys().ownerPrivKey, label='coinbase') - n.importprivkey(privkey=n.get_genesis_keys().operatorPrivKey, label='coinbase') - - # def gen_mt(self, count=1, node_id=0, address=None): - # if address is None: - # address = self.nodes[node_id].get_genesis_keys().operatorAuthAddress - - # minted = 0 - # while minted < count: - # # minted += node.mint(1, 1) - # self.nodes[node_id].setmocktime(self.mocktime) - - # minted += self.nodes[node_id].generatetoaddress(1, address) - # self.mocktime += 2 # 2s per try - - # # set time only for one node!!! - # self.nodes[node_id].setmocktime(self.mocktime) - # # set_node_times(self.nodes, self.mocktime) + n.importprivkey(privkey=n.get_genesis_keys().ownerPrivKey, label='coinbase', rescan=True) + n.importprivkey(privkey=n.get_genesis_keys().operatorPrivKey, label='coinbase', rescan=True) def run_test(self): """Tests must override this method to define test logic""" @@ -392,6 +375,9 @@ def start_node(self, i, *args, **kwargs): node.start(*args, **kwargs) node.wait_for_rpc_connection() + if not TestNode.Mocktime is None: + node.setmocktime(TestNode.Mocktime) + if self.options.coveragedir is not None: coverage.write_all_rpc_commands(self.options.coveragedir, node.rpc) @@ -454,10 +440,19 @@ def join_network(self): connect_nodes_bi(self.nodes, 1, 2) self.sync_all() + def sync_mocktimes(self, nodes): + for node in nodes: + if node.running and not TestNode.Mocktime is None: + node.setmocktime(TestNode.Mocktime) + def sync_blocks(self, nodes=None, **kwargs): + # self.sync_mocktimes(nodes or self.nodes) + # [ node.setmocktime(0) for node in (nodes or self.nodes) ] sync_blocks(nodes or self.nodes, **kwargs) def sync_mempools(self, nodes=None, **kwargs): + # self.sync_mocktimes(nodes or self.nodes) + # [ node.setmocktime(0) for node in (nodes or self.nodes) ] sync_mempools(nodes or self.nodes, **kwargs) def sync_all(self, nodes=None, **kwargs): @@ -504,12 +499,11 @@ def _initialize_chain(self): cache_node_dir = get_datadir_path(self.options.cachedir, CACHE_NODE_ID) assert self.num_nodes <= MAX_NODES - print (cache_node_dir) + self.log.info("This test uses premined chain") if not os.path.isdir(cache_node_dir): self.log.debug("Creating cache directory {}".format(cache_node_dir)) initialize_datadir(self.options.cachedir, CACHE_NODE_ID, self.chain) - print (len(self.nodes)) self.nodes.append( TestNode( CACHE_NODE_ID, diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index 605b57d156..33abc93830 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -96,6 +96,7 @@ def __init__(self, i, datadir, *, chain, rpchost, timewait, bitcoind, bitcoin_cl "-debugexclude=leveldb", "-uacomment=testnode%d" % i, "-masternode_operator="+self.get_genesis_keys().operatorAuthAddress, + "-dummypos=1", ] self.cli = TestNodeCLI(bitcoin_cli, self.datadir) @@ -115,12 +116,19 @@ def __init__(self, i, datadir, *, chain, rpchost, timewait, bitcoind, bitcoin_cl self.p2ps = [] MnKeys = collections.namedtuple('MnKeys', ['ownerAuthAddress', 'ownerPrivKey', 'operatorAuthAddress', 'operatorPrivKey']) - PRIV_KEYS = [ - MnKeys("bcrt1qyrfrpadwgw7p5eh3e9h3jmu4kwlz4prx73cqny", "cR4qgUdPhANDVF3bprcp5N9PNW2zyogDx6DGu2wHh2qtJB1L1vQj", "bcrt1qmfvw3dp3u6fdvqkdc0y3lr0e596le9cf22vtsv", "cVsa2wQvCjZZ54jGteQ8qiQbQLJQmZSBWriYUYyXbcaqUJFqK5HR"), + PRIV_KEYS = [ # at least node0&1 operator should be non-witness!!! (feature_bip68_sequence.py,interface_zmq,rpc_psbt fails) + # legacy: MnKeys("mwsZw8nF7pKxWH8eoKL9tPxTpaFkz7QeLU", "cRiRQ9cHmy5evDqNDdEV8f6zfbK6epi9Fpz4CRZsmLEmkwy54dWz", "mswsMVsyGMj1FzDMbbxw2QW3KvQAv2FKiy", "cPGEaz8AGiM71NGMRybbCqFNRcuUhg3uGvyY4TFE1BZC26EW2PkC"), - MnKeys("bcrt1qyeuu9rvq8a67j86pzvh5897afdmdjpyankp4mu", "cUX8AEUZYsZxNUh5fTS7ZGnF6SPQuTeTDTABGrp5dbPftCga2zcp", "bcrt1qurwyhta75n2g75u2u5nds9p6w9v62y8wr40d2r", "cUp5EVEjuAGpemSuejP36TWWuFKzuCbUJ4QAKJTiSSB2vXzDLsJW"), MnKeys("msER9bmJjyEemRpQoS8YYVL21VyZZrSgQ7", "cSCmN1tjcR2yR1eaQo9WmjTMR85SjEoNPqMPWGAApQiTLJH8JF7W", "mps7BdmwEF2vQ9DREDyNPibqsuSRZ8LuwQ", "cVNTRYV43guugJoDgaiPZESvNtnfnUW19YEjhybihwDbLKjyrZNV"), + MnKeys("myF3aHuxtEuqqTw44EurtVs6mjyc1QnGUS", "cSXiqwTiYzECugcvCT4PyPKz2yKaTST8HowFVBBjccZCPkX6wsE9", "mtbWisYQmw9wcaecvmExeuixG7rYGqKEU4", "cPh5YaousYQ92tNd9FkiiS26THjSVBDHUMHZzUiBFbtGNS4Uw9AD"), + MnKeys("mwyaBGGE7ka58F7aavH5hjMVdJENP9ZEVz", "cVA52y8ABsUYNuXVJ17d44N1wuSmeyPtke9urw4LchTyKsaGDMbY", "n1n6Z5Zdoku4oUnrXeQ2feLz3t7jmVLG9t", "cV9tJBgAnSfFmPaC6fWWvA9StLKkU3DKV7eXJHjWMUENQ8cKJDkL"), + MnKeys("mgsE1SqrcfUhvuYuRjqy6rQCKmcCVKNhMu", "cRJyBuQPuUhYzN5F2Uf35958oK9AzZ5UscRfVmaRr8ktWq6Ac23u", "mzqdipBJcKX9rXXxcxw2kTHC3Xjzd3siKg", "cQYJ87qk39i3uFsXBZ2EkwdX1h72q1RQcX9V8X7PPydFPgujxrCy"), + MnKeys("mud4VMfbBqXNpbt8ur33KHKx8pk3npSq8c", "cPjeCNka7omVbKKfywPVQyBig9eopBHy6eJqLzrdJqMP4DXApkcb", "mk5DkY4qcV6CUpuxDVyD3AHzRq5XK9kbRN", "cV6Hjhutf11RvFHaERkp52QNynm2ifNmtUfP8EwRRMg6NaaQsHTe"), + # bech32: + MnKeys("bcrt1qyrfrpadwgw7p5eh3e9h3jmu4kwlz4prx73cqny", "cR4qgUdPhANDVF3bprcp5N9PNW2zyogDx6DGu2wHh2qtJB1L1vQj", "bcrt1qmfvw3dp3u6fdvqkdc0y3lr0e596le9cf22vtsv", "cVsa2wQvCjZZ54jGteQ8qiQbQLJQmZSBWriYUYyXbcaqUJFqK5HR"), + MnKeys("bcrt1qyeuu9rvq8a67j86pzvh5897afdmdjpyankp4mu", "cUX8AEUZYsZxNUh5fTS7ZGnF6SPQuTeTDTABGrp5dbPftCga2zcp", "bcrt1qurwyhta75n2g75u2u5nds9p6w9v62y8wr40d2r", "cUp5EVEjuAGpemSuejP36TWWuFKzuCbUJ4QAKJTiSSB2vXzDLsJW"), ] + Mocktime = None # AddressKeyPair = collections.namedtuple('AddressKeyPair', ['address', 'key']) # PRIV_KEYS = [ @@ -144,20 +152,36 @@ def get_genesis_keys(self): assert len(self.PRIV_KEYS) == MAX_NODES return self.PRIV_KEYS[self.index] + def pullup_mocktime(self): + TestNode.Mocktime = self.getblockheader(self.getbestblockhash())["time"] + + def set_mocktime(self, time): + TestNode.Mocktime = time + + def reset_mocktime(self): + TestNode.Mocktime = None + def generate(self, nblocks, maxtries=1000000, address=None): if address is None: address = self.get_genesis_keys().operatorAuthAddress - self.mocktime = self.getblockheader(self.getbestblockhash())["time"] + 1 + # if TestNode.Mocktime is None: + # TestNode.Mocktime = self.getblockheader(self.getbestblockhash())["time"] + 1 + # TestNode.Mocktime = int(time.time()) + height = self.getblockcount() minted = 0 mintedHashes = [] while minted < nblocks: - self.setmocktime(self.mocktime) + if not TestNode.Mocktime is None: + self.setmocktime(TestNode.Mocktime + 1) + # self.setmocktime(self.mocktime) res = self.generatetoaddress(nblocks=1, address=address, maxtries=maxtries) if res == 1: minted += 1 - self.mocktime += 2 # 2s per block + self.pullup_mocktime() + # TestNode.Mocktime = self.getblockheader(self.getbestblockhash())["time"] + 1 # 2s per block + # self.mocktime += 2 # 2s per block mintedHashes.append(self.getblockhash(height+minted)) return mintedHashes diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py index a33bf04817..d367f96c50 100644 --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -222,7 +222,7 @@ def wait_until(predicate, *, attempts=float('inf'), timeout=float('inf'), lock=N ############################################ # The maximum number of nodes a single test can spawn -MAX_NODES = 4 +MAX_NODES = 8 # Don't assign rpc or p2p ports lower than this PORT_MIN = 11000 # The number of ports to "reserve" for p2p and rpc, each diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 347ff85e70..acffc1bc8a 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -71,274 +71,147 @@ # Longest test should go first, to favor running tests in parallel 'feature_pruning.py', 'feature_dbcrash.py', - 'rpc_mn_basic.py', +] + +BASE_SCRIPTS = [ + # Scripts that are run by default. + # Longest test should go first, to favor running tests in parallel + 'wallet_hd.py', 'wallet_backup.py', - 'rpc_txoutproof.py', - 'feature_dersig.py', - 'feature_assumevalid.py', + # vv Tests less than 5m vv + 'mining_getblocktemplate_longpoll.py', + 'feature_maxuploadtarget.py', + 'feature_block.py', + 'rpc_fundrawtransaction.py', + 'p2p_compactblocks.py', + 'feature_segwit.py', + # vv Tests less than 2m vv + 'wallet_basic.py', + 'wallet_labels.py', 'p2p_segwit.py', - 'mempool_accept.py', - 'mining_basic.py', - 'feature_config_args.py', - 'wallet_avoidreuse.py', - 'rpc_createmultisig.py', - 'feature_minchainwork.py', - 'feature_notifications.py', - 'p2p_invalid_tx.py', - 'feature_nulldummy.py', - 'interface_rest.py', + 'p2p_timeouts.py', + 'p2p_tx_download.py', + 'wallet_dump.py', + 'wallet_listtransactions.py', + # vv Tests less than 60s vv + 'p2p_sendheaders.py', + 'wallet_zapwallettxes.py', + 'wallet_importmulti.py', + 'mempool_limit.py', + 'rpc_txoutproof.py', + 'wallet_listreceivedby.py', + 'wallet_abandonconflict.py', 'feature_csv_activation.py', - 'mempool_reorg.py', + 'rpc_rawtransaction.py', + 'wallet_address_types.py', # nodes = 6 'feature_bip68_sequence.py', - 'wallet_basic.py', - 'wallet_bumpfee.py', - 'tool_wallet.py', - 'wallet_import_rescan.py', - 'p2p_invalid_block.py', - 'wallet_balance.py', - 'mempool_packages.py', - 'feature_block.py', - 'wallet_address_types.py', - 'mempool_spend_coinbase.py', - 'p2p_sendheaders.py', - 'rpc_blockchain.py', - 'wallet_multiwallet.py', - 'rpc_setban.py', - 'wallet_resendwallettransactions.py', - 'p2p_blocksonly.py', + 'p2p_feefilter.py', + 'feature_reindex.py', + 'feature_abortnode.py', + # vv Tests less than 30s vv 'wallet_keypool_topup.py', 'feature_fee_estimation.py', - 'wallet_txn_clone.py', - 'p2p_unrequested_blocks.py', - 'wallet_listsinceblock.py', - 'feature_versionbits_warning.py', 'interface_zmq.py', - 'wallet_groups.py', - 'wallet_txn_doublespend.py', - 'mining_prioritisetransaction.py', - 'example_test.py', - 'wallet_disable.py', - 'wallet_encryption.py', - 'mempool_package_onemore.py', - 'wallet_create_tx.py', - 'p2p_disconnect_ban.py', - 'rpc_bind.py', - 'mempool_limit.py', - 'rpc_getblockstats.py', - 'feature_maxuploadtarget.py', - 'p2p_compactblocks.py', - 'wallet_labels.py', + 'interface_bitcoin_cli.py', 'mempool_resurrect.py', - 'p2p_node_network_limited.py', + 'wallet_txn_doublespend.py --mineblock', + 'tool_wallet.py', + 'wallet_txn_clone.py', + 'wallet_txn_clone.py --segwit', + 'rpc_getchaintips.py', + 'rpc_misc.py', + 'rpc_mn_basic.py' + 'interface_rest.py', + 'mempool_spend_coinbase.py', + 'wallet_avoidreuse.py', + 'mempool_reorg.py', 'mempool_persist.py', - 'p2p_tx_download.py', - 'feature_segwit.py', - 'rpc_fundrawtransaction.py', - 'p2p_invalid_locator.py', - 'wallet_hd.py', - 'rpc_scantxoutset.py', - 'feature_cltv.py', - 'wallet_importprunedfunds.py', - 'rpc_net.py', - 'p2p_fingerprint.py', - 'feature_includeconf.py', - 'p2p_permissions.py', - 'feature_logging.py', + 'wallet_multiwallet.py', + 'wallet_multiwallet.py --usecli', + 'wallet_createwallet.py', + 'wallet_createwallet.py --usecli', + 'wallet_watchonly.py', + 'wallet_watchonly.py --usecli', + 'interface_http.py', + 'interface_rpc.py', + 'rpc_psbt.py', + 'rpc_users.py', 'feature_proxy.py', - 'feature_rbf.py', - 'feature_reindex.py', - 'feature_shutdown.py', - 'feature_uacomment.py', - + 'rpc_signrawtransaction.py', + 'wallet_groups.py', + 'p2p_disconnect_ban.py', 'rpc_decodescript.py', + 'rpc_blockchain.py', 'rpc_deprecated.py', - 'rpc_deriveaddresses.py', + 'wallet_disable.py', + 'rpc_net.py', + 'wallet_keypool.py', + 'p2p_mempool.py', + 'rpc_setban.py', + 'p2p_blocksonly.py', + 'mining_prioritisetransaction.py', + 'p2p_invalid_locator.py', + 'p2p_invalid_block.py', + 'p2p_invalid_messages.py', + 'p2p_invalid_tx.py', + 'feature_assumevalid.py', + 'example_test.py', + 'wallet_txn_doublespend.py', + 'wallet_txn_clone.py --mineblock', + 'feature_notifications.py', 'rpc_getblockfilter.py', - 'rpc_getchaintips.py', - 'rpc_help.py', 'rpc_invalidateblock.py', - 'rpc_misc.py', - 'rpc_mn_basic.py', - 'rpc_named_arguments.py', + 'feature_rbf.py', + 'mempool_packages.py', + 'mempool_package_onemore.py', + 'rpc_createmultisig.py', + 'feature_versionbits_warning.py', 'rpc_preciousblock.py', - 'rpc_psbt.py', - 'rpc_rawtransaction.py', + 'wallet_importprunedfunds.py', + 'p2p_leak_tx.py', 'rpc_signmessage.py', - 'rpc_signrawtransaction.py', - 'rpc_uptime.py', - 'rpc_users.py', - - 'wallet_abandonconflict.py', + 'wallet_balance.py', + 'feature_nulldummy.py', + 'mempool_accept.py', +# 'wallet_import_rescan.py', NODES! + 'wallet_import_with_label.py', + 'rpc_bind.py --ipv4', + 'rpc_bind.py --ipv6', + 'rpc_bind.py --nonloopback', + 'mining_basic.py', + 'wallet_bumpfee.py', 'wallet_bumpfee_totalfee_deprecation.py', - 'wallet_coinbase_category.py', - 'wallet_createwallet.py', - 'wallet_dump.py', + 'rpc_named_arguments.py', + 'wallet_listsinceblock.py', + 'p2p_leak.py', + 'wallet_encryption.py', + 'feature_dersig.py', + 'feature_cltv.py', + 'rpc_uptime.py', + 'wallet_resendwallettransactions.py', 'wallet_fallbackfee.py', - 'wallet_importmulti.py', - 'wallet_import_with_label.py', - 'wallet_keypool.py', - 'wallet_listreceivedby.py', - 'wallet_listtransactions.py', - 'wallet_watchonly.py', - 'wallet_zapwallettxes.py', -] - -BASE_SCRIPTS = [ - # Scripts that are run by default. - # Longest test should go first, to favor running tests in parallel - 'feature_abortnode.py', - 'feature_blocksdir.py', + 'feature_minchainwork.py', + 'rpc_getblockstats.py', + 'wallet_create_tx.py', + 'p2p_fingerprint.py', + 'feature_uacomment.py', + 'wallet_coinbase_category.py', 'feature_filelock.py', + 'p2p_unrequested_blocks.py', + 'feature_includeconf.py', + 'rpc_deriveaddresses.py', + 'rpc_deriveaddresses.py --usecli', + 'rpc_scantxoutset.py', + 'feature_logging.py', + 'p2p_node_network_limited.py', + 'p2p_permissions.py', + 'feature_blocksdir.py', + 'feature_config_args.py', + 'rpc_help.py', 'feature_help.py', - - 'interface_bitcoin_cli.py', - 'interface_http.py', - 'interface_rpc.py', - - 'mining_getblocktemplate_longpoll.py', - - 'p2p_feefilter.py', - 'p2p_invalid_messages.py', - 'p2p_leak.py', - 'p2p_leak_tx.py', - 'p2p_mempool.py', - 'p2p_timeouts.py', - - # 'wallet_hd.py', - # 'wallet_backup.py', - # # vv Tests less than 5m vv - # 'mining_getblocktemplate_longpoll.py', - # 'feature_maxuploadtarget.py', - # 'feature_block.py', - # 'rpc_fundrawtransaction.py', - # 'p2p_compactblocks.py', - # 'feature_segwit.py', - # # vv Tests less than 2m vv - # 'wallet_basic.py', - # 'wallet_labels.py', - # 'p2p_segwit.py', - # 'p2p_timeouts.py', - # 'p2p_tx_download.py', - # 'wallet_dump.py', - # 'wallet_listtransactions.py', - # # vv Tests less than 60s vv - # 'p2p_sendheaders.py', - # 'wallet_zapwallettxes.py', - # 'wallet_importmulti.py', - # 'mempool_limit.py', - # 'rpc_txoutproof.py', - # 'wallet_listreceivedby.py', - # 'wallet_abandonconflict.py', - # 'feature_csv_activation.py', - # 'rpc_rawtransaction.py', - # 'wallet_address_types.py', - # 'feature_bip68_sequence.py', - # 'p2p_feefilter.py', - # 'feature_reindex.py', - # 'feature_abortnode.py', - # # vv Tests less than 30s vv - # 'wallet_keypool_topup.py', - # 'feature_fee_estimation.py', - # 'interface_zmq.py', - # 'interface_bitcoin_cli.py', - # 'mempool_resurrect.py', - # 'wallet_txn_doublespend.py --mineblock', - # 'tool_wallet.py', - # 'wallet_txn_clone.py', - # 'wallet_txn_clone.py --segwit', - # 'rpc_getchaintips.py', - # 'rpc_misc.py', - # 'interface_rest.py', - # 'mempool_spend_coinbase.py', - # 'wallet_avoidreuse.py', - # 'mempool_reorg.py', - # 'mempool_persist.py', - # 'wallet_multiwallet.py', - # 'wallet_multiwallet.py --usecli', - # 'wallet_createwallet.py', - # 'wallet_createwallet.py --usecli', - # 'wallet_watchonly.py', - # 'wallet_watchonly.py --usecli', - # 'interface_http.py', - # 'interface_rpc.py', - # 'rpc_psbt.py', - # 'rpc_users.py', - # 'feature_proxy.py', - # 'rpc_signrawtransaction.py', - # 'wallet_groups.py', - # 'p2p_disconnect_ban.py', - # 'rpc_decodescript.py', - # 'rpc_blockchain.py', - # 'rpc_deprecated.py', - # 'wallet_disable.py', - # 'rpc_net.py', - # 'wallet_keypool.py', - # 'p2p_mempool.py', - # 'rpc_setban.py', - # 'p2p_blocksonly.py', - # 'mining_prioritisetransaction.py', - # 'p2p_invalid_locator.py', - # 'p2p_invalid_block.py', - # 'p2p_invalid_messages.py', - # 'p2p_invalid_tx.py', - # 'feature_assumevalid.py', - # 'example_test.py', - # 'wallet_txn_doublespend.py', - # 'wallet_txn_clone.py --mineblock', - # 'feature_notifications.py', - # 'rpc_getblockfilter.py', - # 'rpc_invalidateblock.py', - # 'feature_rbf.py', - # 'mempool_packages.py', - # 'mempool_package_onemore.py', - # 'rpc_createmultisig.py', - # 'feature_versionbits_warning.py', - # 'rpc_preciousblock.py', - # 'wallet_importprunedfunds.py', - # 'p2p_leak_tx.py', - # 'rpc_signmessage.py', - # 'wallet_balance.py', - # 'feature_nulldummy.py', - # 'mempool_accept.py', - # 'wallet_import_rescan.py', - # 'wallet_import_with_label.py', - # 'rpc_bind.py --ipv4', - # 'rpc_bind.py --ipv6', - # 'rpc_bind.py --nonloopback', - # 'mining_basic.py', - # 'wallet_bumpfee.py', - # 'wallet_bumpfee_totalfee_deprecation.py', - # 'rpc_named_arguments.py', - # 'wallet_listsinceblock.py', - # 'p2p_leak.py', - # 'wallet_encryption.py', - # 'feature_dersig.py', - # 'feature_cltv.py', - # 'rpc_uptime.py', - # 'wallet_resendwallettransactions.py', - # 'wallet_fallbackfee.py', - # 'feature_minchainwork.py', - # 'rpc_getblockstats.py', - # 'wallet_create_tx.py', - # 'p2p_fingerprint.py', - # 'feature_uacomment.py', - # 'wallet_coinbase_category.py', - # 'feature_filelock.py', - # 'p2p_unrequested_blocks.py', - # 'feature_includeconf.py', - # 'rpc_deriveaddresses.py', - # 'rpc_deriveaddresses.py --usecli', - # 'rpc_scantxoutset.py', - # 'feature_logging.py', - # 'p2p_node_network_limited.py', - # 'p2p_permissions.py', - # 'feature_blocksdir.py', - # 'feature_config_args.py', - # 'rpc_help.py', - # 'feature_help.py', - # 'feature_shutdown.py', - # # Don't append tests at the end to avoid merge conflicts - # # Put them in a random line within the section that fits their approximate run-time + 'feature_shutdown.py', + # Don't append tests at the end to avoid merge conflicts + # Put them in a random line within the section that fits their approximate run-time ] # Place EXTENDED_SCRIPTS first since it has the 3 longest running tests diff --git a/test/functional/tool_wallet.py b/test/functional/tool_wallet.py index 28a65f7823..a5a20fbb1b 100755 --- a/test/functional/tool_wallet.py +++ b/test/functional/tool_wallet.py @@ -92,8 +92,8 @@ def test_tool_wallet_info(self): Encrypted: no HD (hd seed available): yes Keypool Size: 2 - Transactions: 0 - Address Book: 3 + Transactions: 1 + Address Book: 6 ''') self.assert_tool_output(out, '-wallet=wallet.dat', 'info') timestamp_after = self.wallet_timestamp() @@ -131,8 +131,8 @@ def test_tool_wallet_info_after_transaction(self): Encrypted: no HD (hd seed available): yes Keypool Size: 2 - Transactions: 1 - Address Book: 3 + Transactions: 2 + Address Book: 6 ''') self.assert_tool_output(out, '-wallet=wallet.dat', 'info') shasum_after = self.wallet_shasum() diff --git a/test/functional/wallet_backup.py b/test/functional/wallet_backup.py index 55c517e92f..9b692d6496 100755 --- a/test/functional/wallet_backup.py +++ b/test/functional/wallet_backup.py @@ -36,10 +36,12 @@ import shutil from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_node import TestNode from test_framework.util import ( assert_equal, assert_raises_rpc_error, connect_nodes, + set_node_times, ) @@ -60,6 +62,9 @@ def setup_network(self): connect_nodes(self.nodes[2], 3) connect_nodes(self.nodes[2], 0) self.sync_all() + # TestNode.Mocktime = int(time.time()) + # TestNode.Mocktime = self.nodes[0].getblockheader(self.nodes[0].getbestblockhash())["time"] + 1 + # set_node_times(self.nodes, TestNode.Mocktime) def one_send(self, from_node, to_address): if (randint(1,2) == 1): @@ -80,7 +85,10 @@ def do_one_round(self): # Have the miner (node3) mine a block. # Must sync mempools before mining. + print ("bef mempool", TestNode.Mocktime) + set_node_times(self.nodes, 0) self.sync_mempools() + print (TestNode.Mocktime) self.nodes[3].generate(1) self.sync_blocks() @@ -162,6 +170,7 @@ def run_test(self): # Start node2 with no chain shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'blocks')) shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'chainstate')) + shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'masternodes')) # Restore wallets from backup shutil.copyfile(os.path.join(self.nodes[0].datadir, 'wallet.bak'), os.path.join(self.nodes[0].datadir, 'regtest', 'wallets', 'wallet.dat')) @@ -183,6 +192,7 @@ def run_test(self): #start node2 with no chain shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'blocks')) shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'chainstate')) + shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'masternodes')) self.start_three() diff --git a/test/functional/wallet_basic.py b/test/functional/wallet_basic.py index 62822351ed..a1c128b3cd 100755 --- a/test/functional/wallet_basic.py +++ b/test/functional/wallet_basic.py @@ -218,9 +218,6 @@ def run_test(self): node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), node_0_bal + Decimal('10'), fee_per_byte, self.get_vsize(self.nodes[2].gettransaction(txid)['hex'])) self.start_node(3) - print (self.nodes[0].getblockcount()) - print (self.nodes[3].getblockcount()) - input ("Pause...") connect_nodes_bi(self.nodes, 0, 3) self.sync_all() @@ -314,7 +311,8 @@ def run_test(self): assert_raises_rpc_error(-3, "Invalid amount", self.nodes[0].sendtoaddress, self.nodes[2].getnewaddress(), "1f-4") # This will raise an exception since generate does not accept a string - assert_raises_rpc_error(-1, "not an integer", self.nodes[0].generate, "2") + # we have no more "generate" rpc + # assert_raises_rpc_error(-1, "not an integer", self.nodes[0].generate, "2") # This will raise an exception for the invalid private key format assert_raises_rpc_error(-5, "Invalid private key encoding", self.nodes[0].importprivkey, "invalid") diff --git a/test/functional/wallet_bumpfee.py b/test/functional/wallet_bumpfee.py index 6d5207876b..1cd8806337 100755 --- a/test/functional/wallet_bumpfee.py +++ b/test/functional/wallet_bumpfee.py @@ -19,12 +19,14 @@ from test_framework.blocktools import add_witness_commitment, create_block, create_coinbase, send_to_witness from test_framework.messages import BIP125_SEQUENCE_NUMBER, CTransaction from test_framework.test_framework import BitcoinTestFramework +from test_framework.test_node import TestNode from test_framework.util import ( assert_equal, assert_greater_than, assert_raises_rpc_error, connect_nodes_bi, hex_str_to_bytes, + set_node_times, ) WALLET_PASSPHRASE = "test" @@ -60,6 +62,9 @@ def run_test(self): self.sync_all() for i in range(25): peer_node.sendtoaddress(rbf_node_address, 0.001) + + # we need to move time to sync + set_node_times([rbf_node], TestNode.Mocktime) self.sync_all() peer_node.generate(1) self.sync_all() @@ -293,9 +298,11 @@ def test_unconfirmed_not_spendable(rbf_node, rbf_node_address): # This makes it possible to check whether the rbf tx outputs are # spendable before the rbf tx is confirmed. block = submit_block_with_tx(rbf_node, rbftx) + # Can not abandon conflicted tx assert_raises_rpc_error(-5, 'Transaction not eligible for abandonment', lambda: rbf_node.abandontransaction(txid=bumpid)) rbf_node.invalidateblock(block.hash) + # Call abandon to make sure the wallet doesn't attempt to resubmit # the bump tx and hope the wallet does not rebroadcast before we call. rbf_node.abandontransaction(bumpid) @@ -373,7 +380,7 @@ def submit_block_with_tx(node, tx): block.hashMerkleRoot = block.calc_merkle_root() add_witness_commitment(block) block.solve() - node.submitblock(block.serialize().hex()) + res = node.submitblock(block.serialize().hex()) return block def test_no_more_inputs_fails(rbf_node, dest_address): diff --git a/test/functional/wallet_create_tx.py b/test/functional/wallet_create_tx.py index 330de8b0fc..13f9fe66f5 100755 --- a/test/functional/wallet_create_tx.py +++ b/test/functional/wallet_create_tx.py @@ -23,7 +23,7 @@ def skip_test_if_missing_module(self): def run_test(self): self.log.info('Create some old blocks') - self.nodes[0].setmocktime(TIME_GENESIS_BLOCK) + self.nodes[0].setmocktime(TIME_GENESIS_BLOCK+1) self.nodes[0].generate(200) self.nodes[0].setmocktime(0) diff --git a/test/functional/wallet_disable.py b/test/functional/wallet_disable.py index 7c2ec56b5a..f4b4adc70c 100755 --- a/test/functional/wallet_disable.py +++ b/test/functional/wallet_disable.py @@ -27,7 +27,8 @@ def run_test (self): # Checking mining to an address without a wallet. Generating to a valid address should succeed # but generating to an invalid address will fail. - self.nodes[0].generatetoaddress(1, 'mneYUmWYsuk7kySiURxCi3AGxrAqZxLgPZ') + # NO! we can't mine w/o a wallet! + # self.nodes[0].generatetoaddress(1, 'mneYUmWYsuk7kySiURxCi3AGxrAqZxLgPZ') assert_raises_rpc_error(-5, "Invalid address", self.nodes[0].generatetoaddress, 1, '3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy') if __name__ == '__main__': diff --git a/test/functional/wallet_hd.py b/test/functional/wallet_hd.py index 97172d8b82..ceb3f613d4 100755 --- a/test/functional/wallet_hd.py +++ b/test/functional/wallet_hd.py @@ -71,6 +71,7 @@ def run_test(self): # otherwise node1 would auto-recover all funds in flag the keypool keys as used shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "blocks")) shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "chainstate")) + shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "masternodes")) shutil.copyfile(os.path.join(self.nodes[1].datadir, "hd.bak"), os.path.join(self.nodes[1].datadir, "regtest", "wallets", "wallet.dat")) self.start_node(1) @@ -94,6 +95,7 @@ def run_test(self): self.stop_node(1) shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "blocks")) shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "chainstate")) + shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "masternodes")) shutil.copyfile(os.path.join(self.nodes[1].datadir, "hd.bak"), os.path.join(self.nodes[1].datadir, "regtest", "wallets", "wallet.dat")) self.start_node(1, extra_args=self.extra_args[1]) connect_nodes_bi(self.nodes, 0, 1) diff --git a/test/functional/wallet_import_rescan.py b/test/functional/wallet_import_rescan.py index c499b1c120..6b1b2f8512 100755 --- a/test/functional/wallet_import_rescan.py +++ b/test/functional/wallet_import_rescan.py @@ -144,7 +144,7 @@ def get_rand_amount(): class ImportRescanTest(BitcoinTestFramework): def set_test_params(self): - self.num_nodes = 2 + len(IMPORT_NODES) + self.num_nodes = 2 + len(IMPORT_NODES) # 6 def skip_test_if_missing_module(self): self.skip_if_no_wallet() @@ -160,7 +160,7 @@ def setup_network(self): # Import keys with pruning disabled self.start_nodes(extra_args=[[]] * self.num_nodes) for n in self.nodes: - n.importprivkey(privkey=n.get_genesis_keys().key, label='coinbase') + n.importprivkey(privkey=n.get_genesis_keys().operatorPrivKey, label='coinbase') self.stop_nodes() self.start_nodes() @@ -189,6 +189,7 @@ def run_test(self): self.nodes, self.nodes[0].getblockheader(self.nodes[0].getbestblockhash())["time"] + TIMESTAMP_WINDOW + 1, ) + self.nodes[0].reset_mocktime() # reset generate's inner Mocktime to mint with those from set_node_times() self.nodes[0].generate(1) self.sync_all() diff --git a/test/functional/wallet_keypool_topup.py b/test/functional/wallet_keypool_topup.py index 0014555ade..93069a3d2c 100755 --- a/test/functional/wallet_keypool_topup.py +++ b/test/functional/wallet_keypool_topup.py @@ -77,7 +77,8 @@ def run_test(self): self.log.info("Verify keypool is restored and balance is correct") assert_equal(self.nodes[idx].getbalance(), 15) - assert_equal(self.nodes[idx].listtransactions()[0]['category'], "receive") + assert_equal(self.nodes[idx].listtransactions()[1]['category'], "receive") # cause [0] is genesis mn tx + assert_equal(self.nodes[idx].listtransactions()[2]['category'], "receive") # Check that we have marked all keys up to the used keypool key as used assert_equal(self.nodes[idx].getaddressinfo(self.nodes[idx].getnewaddress())['hdkeypath'], "m/0'/0'/110'") diff --git a/test/functional/wallet_labels.py b/test/functional/wallet_labels.py index b57cdc9dad..b5e1984639 100755 --- a/test/functional/wallet_labels.py +++ b/test/functional/wallet_labels.py @@ -35,12 +35,12 @@ def run_test(self): # there should be 2 address groups # each with 1 address with a balance of 50 Bitcoins - address_groups = node.listaddressgroupings() - assert_equal(len(address_groups), 2) + address_groups = node.listaddressgroupings() # TODO: may be remove genesis (or all) mn_creation txs from listaddressgroupings? + assert_equal(len(address_groups), 3) # +1 mn genesis # the addresses aren't linked now, but will be after we send to the # common address linked_addresses = set() - for address_group in address_groups: + for address_group in address_groups[1:]: assert_equal(len(address_group), 1) assert_equal(len(address_group[0]), 3) assert_equal(address_group[0][1], 50) @@ -57,10 +57,10 @@ def run_test(self): # there should be 1 address group, with the previously # unlinked addresses now linked (they both have 0 balance) address_groups = node.listaddressgroupings() - assert_equal(len(address_groups), 1) - assert_equal(len(address_groups[0]), 2) - assert_equal(set([a[0] for a in address_groups[0]]), linked_addresses) - assert_equal([a[1] for a in address_groups[0]], [0, 0]) + assert_equal(len(address_groups), 1+1) + assert_equal(len(address_groups[0+1]), 2) + assert_equal(set([a[0] for a in address_groups[0+1]]), linked_addresses) + assert_equal([a[1] for a in address_groups[0+1]], [0, 0]) node.generate(1) diff --git a/test/functional/wallet_listsinceblock.py b/test/functional/wallet_listsinceblock.py index 021a29d4ac..6b8d548d8f 100755 --- a/test/functional/wallet_listsinceblock.py +++ b/test/functional/wallet_listsinceblock.py @@ -5,7 +5,8 @@ """Test the listsincelast RPC.""" from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import assert_equal, assert_array_result, assert_raises_rpc_error +from test_framework.test_node import TestNode +from test_framework.util import assert_equal, assert_array_result, assert_raises_rpc_error, set_node_times class ListSinceBlockTest (BitcoinTestFramework): def set_test_params(self): @@ -17,6 +18,7 @@ def skip_test_if_missing_module(self): def run_test(self): self.nodes[2].generate(101) + # set_node_times(self.nodes, TestNode.Mocktime) self.sync_all() self.test_no_blockhash() @@ -38,15 +40,15 @@ def test_no_blockhash(self): "confirmations": 1, }) assert_equal( - self.nodes[0].listsinceblock(), - {"lastblock": blockhash, + sorted(self.nodes[0].listsinceblock()), + sorted({"lastblock": blockhash, "removed": [], - "transactions": txs}) + "transactions": txs})) assert_equal( - self.nodes[0].listsinceblock(""), - {"lastblock": blockhash, + sorted(self.nodes[0].listsinceblock("")), + sorted({"lastblock": blockhash, "removed": [], - "transactions": txs}) + "transactions": txs})) def test_invalid_blockhash(self): assert_raises_rpc_error(-5, "Block not found", self.nodes[0].listsinceblock, diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py index c9d2694680..2018e921d2 100755 --- a/test/functional/wallet_multiwallet.py +++ b/test/functional/wallet_multiwallet.py @@ -126,6 +126,7 @@ def wallet_file(name): self.start_node(0, ['-wallet=w4', '-wallet=w5']) assert_equal(set(node.listwallets()), {"w4", "w5"}) w5 = wallet("w5") + w5.importprivkey(privkey=node.get_genesis_keys().operatorPrivKey) node.generate(nblocks=1, address=w5.getnewaddress()) # now if wallets/ exists again, but the rootdir is specified as the walletdir, w4 and w5 should still be loaded From 4619dadf64525cbc760deb718f0b03e2407c394e Mon Sep 17 00:00:00 2001 From: Integral Team M Date: Fri, 18 Oct 2019 10:23:43 +0700 Subject: [PATCH 03/19] mn: add genesis MNs into reg chain; mass fixes to solve qa tests --- src/chainparams.cpp | 12 ++++-- src/init.cpp | 3 +- src/interfaces/chain.cpp | 8 +++- src/interfaces/chain.h | 4 +- src/masternodes/masternodes.cpp | 75 ++++++++++++++++++--------------- src/masternodes/masternodes.h | 8 +--- src/pos.cpp | 4 +- src/pos_kernel.cpp | 7 +-- src/txdb.cpp | 4 +- src/txdb.h | 2 +- src/validation.cpp | 23 +++++----- src/validation.h | 3 ++ src/wallet/wallet.cpp | 15 ++++++- src/wallet/walletdb.cpp | 6 ++- 14 files changed, 103 insertions(+), 71 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index eecd7c8a9b..4d08d46092 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -239,7 +239,7 @@ class CTestNetParams : public CChainParams { consensus.pos.diffLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); consensus.pos.nTargetTimespan = 14 * 24 * 60 * 60; // two weeks consensus.pos.nTargetSpacing = 10 * 60; // 10 minutes - consensus.pos.fAllowMinDifficultyBlocks = false; // only for regtest + consensus.pos.fAllowMinDifficultyBlocks = true; consensus.pos.fNoRetargeting = false; // only for regtest consensus.pos.coinstakeMaturity = 100; @@ -393,14 +393,18 @@ class CRegTestParams : public CChainParams { // owner base58, operator base58 vMasternodes.push_back({"mwsZw8nF7pKxWH8eoKL9tPxTpaFkz7QeLU", "mswsMVsyGMj1FzDMbbxw2QW3KvQAv2FKiy"}); vMasternodes.push_back({"msER9bmJjyEemRpQoS8YYVL21VyZZrSgQ7", "mps7BdmwEF2vQ9DREDyNPibqsuSRZ8LuwQ"}); + vMasternodes.push_back({"myF3aHuxtEuqqTw44EurtVs6mjyc1QnGUS", "mtbWisYQmw9wcaecvmExeuixG7rYGqKEU4"}); + vMasternodes.push_back({"mwyaBGGE7ka58F7aavH5hjMVdJENP9ZEVz", "n1n6Z5Zdoku4oUnrXeQ2feLz3t7jmVLG9t"}); + vMasternodes.push_back({"mgsE1SqrcfUhvuYuRjqy6rQCKmcCVKNhMu", "mzqdipBJcKX9rXXxcxw2kTHC3Xjzd3siKg"}); + vMasternodes.push_back({"mud4VMfbBqXNpbt8ur33KHKx8pk3npSq8c", "mk5DkY4qcV6CUpuxDVyD3AHzRq5XK9kbRN"}); vMasternodes.push_back({"bcrt1qyrfrpadwgw7p5eh3e9h3jmu4kwlz4prx73cqny", "bcrt1qmfvw3dp3u6fdvqkdc0y3lr0e596le9cf22vtsv"}); vMasternodes.push_back({"bcrt1qyeuu9rvq8a67j86pzvh5897afdmdjpyankp4mu", "bcrt1qurwyhta75n2g75u2u5nds9p6w9v62y8wr40d2r"}); - genesis = CreateGenesisBlock(1296688602, 0x207fffff, 1, 50 * COIN, CreateGenesisMasternodes()); + genesis = CreateGenesisBlock(1298732709, 0x207fffff, 1, 50 * COIN, CreateGenesisMasternodes()); // old=1296688602 consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x5deed118789bf5acdce79974f15b9a1cffb924875f52e702ca93d926d290b31f")); - assert(genesis.hashMerkleRoot == uint256S("0x955d1c4074ccd34639cae5d1234bbef645b34866bfd18f083dd80928618e80fb")); + assert(consensus.hashGenesisBlock == uint256S("0x00000089a42802dfd816d0986339546b1f33a8d0e8ce2b9a4844a301407bac13")); + assert(genesis.hashMerkleRoot == uint256S("0xd43efce4ced3bacf52a958ae189ba1dd977031910cbeb72eb5e7f56a59ca4f52")); vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds. vSeeds.clear(); //!< Regtest mode doesn't have any DNS seeds. diff --git a/src/init.cpp b/src/init.cpp index fe9401e89e..0a0d9e453b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -435,6 +435,7 @@ void SetupServerArgs() gArgs.AddArg("-torpassword=", "Tor control port password (default: empty)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); gArgs.AddArg("-masternode_owner=
", "Masternode owner address (default: empty)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); gArgs.AddArg("-masternode_operator=
", "Masternode operator address (default: empty)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + gArgs.AddArg("-dummypos", "Flag to skip PoS-related checks (regtest only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS); #ifdef USE_UPNP #if USE_UPNP gArgs.AddArg("-upnp", "Use UPnP to map the listening port (default: 1 when listening and no -proxy)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); @@ -1165,7 +1166,7 @@ bool AppInitParameterInteraction() return InitError("unknown rpcserialversion requested."); nMaxTipAge = gArgs.GetArg("-maxtipage", DEFAULT_MAX_TIP_AGE); - + fIsFakeNet = Params().NetworkIDString() == "regtest" && gArgs.GetArg("-dummypos", false); return true; } diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp index 98444c37a6..d00d0782d3 100644 --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -271,12 +271,18 @@ class ChainImpl : public Chain return true; } void findCoins(std::map& coins) override { return FindCoins(coins); } - bool mnCanSpend(const uint256 & nodeId, int height) override + bool mnCanSpend(const uint256 & nodeId, int height) const override { LOCK(cs_main); return pmasternodesview->CanSpend(nodeId, height); } + CMasternode const * mnExists(const uint256 & nodeId) const override + { + LOCK(cs_main); + return pmasternodesview->ExistMasternode(nodeId); + } + double guessVerificationProgress(const uint256& block_hash) override { LOCK(cs_main); diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h index 7afb0c7718..e2d3a68ed2 100644 --- a/src/interfaces/chain.h +++ b/src/interfaces/chain.h @@ -16,6 +16,7 @@ class CBlock; class CFeeRate; +class CMasternode; class CRPCCommand; class CScheduler; class CValidationState; @@ -145,7 +146,8 @@ class Chain //! populates the values. virtual void findCoins(std::map& coins) = 0; - virtual bool mnCanSpend(const uint256 & nodeId, int height) = 0; + virtual bool mnCanSpend(const uint256 & nodeId, int height) const = 0; + virtual CMasternode const * mnExists(const uint256 & nodeId) const = 0; //! Estimate fraction of total transactions verified if blocks up to //! the specified block hash are verified. diff --git a/src/masternodes/masternodes.cpp b/src/masternodes/masternodes.cpp index e42728f273..23b862e54b 100644 --- a/src/masternodes/masternodes.cpp +++ b/src/masternodes/masternodes.cpp @@ -69,6 +69,11 @@ CMasternode::CMasternode() { } +CMasternode::CMasternode(const CTransaction & tx, int heightIn, const std::vector & metadata) +{ + FromTx(tx, heightIn, metadata); +} + void CMasternode::FromTx(CTransaction const & tx, int heightIn, std::vector const & metadata) { CDataStream ss(metadata, SER_NETWORK, PROTOCOL_VERSION); @@ -457,41 +462,7 @@ void CMasternodesView::Clear() // teams.clear(); } -/* - * Checks if given tx is probably one of 'MasternodeTx', returns tx type and serialized metadata in 'data' -*/ -MasternodesTxType GuessMasternodeTxType(CTransaction const & tx, std::vector & metadata) -{ - if (tx.vout.size() == 0) - { - return MasternodesTxType::None; - } - CScript const & memo = tx.vout[0].scriptPubKey; - CScript::const_iterator pc = memo.begin(); - opcodetype opcode; - if (!memo.GetOp(pc, opcode) || opcode != OP_RETURN) - { - return MasternodesTxType::None; - } - if (!memo.GetOp(pc, opcode, metadata) || - (opcode > OP_PUSHDATA1 && - opcode != OP_PUSHDATA2 && - opcode != OP_PUSHDATA4) || - metadata.size() < MnTxMarker.size() + 1 || // i don't know how much exactly, but at least MnTxSignature + type prefix - memcmp(&metadata[0], &MnTxMarker[0], MnTxMarker.size()) != 0) - { - return MasternodesTxType::None; - } - auto const & it = MasternodesTxTypeToCode.find(metadata[MnTxMarker.size()]); - if (it == MasternodesTxTypeToCode.end()) - { - return MasternodesTxType::None; - } - metadata.erase(metadata.begin(), metadata.begin() + MnTxMarker.size() + 1); - return it->second; -} - -CMasternodesViewHistory& CMasternodesViewHistory::GetState(int targetHeight) +CMasternodesViewHistory & CMasternodesViewHistory::GetState(int targetHeight) { int const topHeight = base->GetLastHeight(); assert(targetHeight >= topHeight - GetMnHistoryFrame() && targetHeight <= topHeight); @@ -535,3 +506,37 @@ CMasternodesViewHistory& CMasternodesViewHistory::GetState(int targetHeight) } return *this; } + +/* + * Checks if given tx is probably one of 'MasternodeTx', returns tx type and serialized metadata in 'data' +*/ +MasternodesTxType GuessMasternodeTxType(CTransaction const & tx, std::vector & metadata) +{ + if (tx.vout.size() == 0) + { + return MasternodesTxType::None; + } + CScript const & memo = tx.vout[0].scriptPubKey; + CScript::const_iterator pc = memo.begin(); + opcodetype opcode; + if (!memo.GetOp(pc, opcode) || opcode != OP_RETURN) + { + return MasternodesTxType::None; + } + if (!memo.GetOp(pc, opcode, metadata) || + (opcode > OP_PUSHDATA1 && + opcode != OP_PUSHDATA2 && + opcode != OP_PUSHDATA4) || + metadata.size() < MnTxMarker.size() + 1 || // i don't know how much exactly, but at least MnTxSignature + type prefix + memcmp(&metadata[0], &MnTxMarker[0], MnTxMarker.size()) != 0) + { + return MasternodesTxType::None; + } + auto const & it = MasternodesTxTypeToCode.find(metadata[MnTxMarker.size()]); + if (it == MasternodesTxTypeToCode.end()) + { + return MasternodesTxType::None; + } + metadata.erase(metadata.begin(), metadata.begin() + MnTxMarker.size() + 1); + return it->second; +} diff --git a/src/masternodes/masternodes.h b/src/masternodes/masternodes.h index 0bb5535287..24bfd6ee03 100644 --- a/src/masternodes/masternodes.h +++ b/src/masternodes/masternodes.h @@ -76,16 +76,12 @@ class CMasternode //! empty constructor CMasternode(); + //! construct a CMasternode from a CTransaction, at a given height + CMasternode(CTransaction const & tx, int heightIn, std::vector const & metadata); //! constructor helper, runs without any checks void FromTx(CTransaction const & tx, int heightIn, std::vector const & metadata); - //! construct a CMasternode from a CTransaction, at a given height - CMasternode(CTransaction const & tx, int heightIn, std::vector const & metadata) - { - FromTx(tx, heightIn, metadata); - } - bool IsActive() const; bool IsActive(int h) const; diff --git a/src/pos.cpp b/src/pos.cpp index f2e1c5ad92..8bb3abe0a2 100644 --- a/src/pos.cpp +++ b/src/pos.cpp @@ -47,7 +47,6 @@ bool CheckHeaderSignature(const CBlockHeader& blockHeader) { } bool ContextualCheckProofOfStake(const CBlockHeader& blockHeader, const Consensus::Params& params, CMasternodesView* mnView) { - /// @todo @maxb may be this is tooooo optimistic? need more validation? if (blockHeader.height == 0 && blockHeader.GetHash() == params.hashGenesisBlock) { return true; @@ -129,6 +128,9 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params::PoS& params) { assert(pindexLast != nullptr); + if (params.fNoRetargeting) + return pindexLast->nBits; + unsigned int nProofOfWorkLimit = UintToArith256(params.diffLimit).GetCompact(); // Only change once per difficulty adjustment interval diff --git a/src/pos_kernel.cpp b/src/pos_kernel.cpp index e2f8fa5030..4480046077 100644 --- a/src/pos_kernel.cpp +++ b/src/pos_kernel.cpp @@ -4,12 +4,10 @@ #include namespace pos { - const uint64_t COINSTAKE_AMOUNT = 1000 * COIN; - uint256 CalcKernelHash(uint256 stakeModifier, int64_t coinstakeTime, uint256 masternodeID, const Consensus::Params& params) { // Calculate hash CDataStream ss(SER_GETHASH, 0); - ss << stakeModifier << coinstakeTime << COINSTAKE_AMOUNT << masternodeID; + ss << stakeModifier << coinstakeTime << GetMnCollateralAmount() << masternodeID; return Hash(ss.begin(), ss.end()); } @@ -19,12 +17,11 @@ namespace pos { arith_uint256 targetProofOfStake; targetProofOfStake.SetCompact(nBits); -// uint256 masternodeID = uint256S("0"); // TODO: (SS) change to masternode activation tx hash const arith_uint256 hashProofOfStake = UintToArith256( CalcKernelHash(stakeModifier, coinstakeTime, masternodeID, params)); // Now check if proof-of-stake hash meets target protocol - if ((hashProofOfStake / (uint64_t) COINSTAKE_AMOUNT) > targetProofOfStake) { + if ((hashProofOfStake / (uint64_t) GetMnCollateralAmount()) > targetProofOfStake) { return {false, hashProofOfStake}; } diff --git a/src/txdb.cpp b/src/txdb.cpp index 0ef609bf4c..22d720baad 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -245,7 +245,7 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) { return true; } -bool CBlockTreeDB::LoadBlockIndexGuts(const Consensus::Params& consensusParams, std::function insertBlockIndex) +bool CBlockTreeDB::LoadBlockIndexGuts(const Consensus::Params& consensusParams, std::function insertBlockIndex, bool skipSigCheck) { std::unique_ptr pcursor(NewIterator()); @@ -278,7 +278,7 @@ bool CBlockTreeDB::LoadBlockIndexGuts(const Consensus::Params& consensusParams, pindexNew->height = diskindex.height; pindexNew->mintedBlocks = diskindex.mintedBlocks; pindexNew->sig = diskindex.sig; - if (pindexNew->nHeight) { + if (pindexNew->nHeight && !skipSigCheck) { CPubKey recoveredPubKey{}; if (!recoveredPubKey.RecoverCompact(pindexNew->GetBlockHeader().GetHashToSign(), pindexNew->sig)) { return error("%s: The block index #%d (%s) wasn't saved on disk correctly. Index content: %s", __func__, pindexNew->nHeight, pindexNew->GetBlockHash().ToString(), pindexNew->ToString()); diff --git a/src/txdb.h b/src/txdb.h index 140ce2c7ff..1bcdc4f1dd 100644 --- a/src/txdb.h +++ b/src/txdb.h @@ -100,7 +100,7 @@ class CBlockTreeDB : public CDBWrapper void ReadReindexing(bool &fReindexing); bool WriteFlag(const std::string &name, bool fValue); bool ReadFlag(const std::string &name, bool &fValue); - bool LoadBlockIndexGuts(const Consensus::Params& consensusParams, std::function insertBlockIndex); + bool LoadBlockIndexGuts(const Consensus::Params& consensusParams, std::function insertBlockIndex, bool skipSigCheck); }; #endif // BITCOIN_TXDB_H diff --git a/src/validation.cpp b/src/validation.cpp index dede4e4e91..80e3f0ed31 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -121,6 +121,7 @@ bool fCheckBlockIndex = false; bool fCheckpointsEnabled = DEFAULT_CHECKPOINTS_ENABLED; size_t nCoinCacheUsage = 5000 * 300; uint64_t nPruneTarget = 0; +bool fIsFakeNet = false; int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE; uint256 hashAssumeValid; @@ -1572,7 +1573,9 @@ DisconnectResult CChainState::DisconnectBlock(const CBlock& block, const CBlockI // move best block pointer to prevout block view.SetBestBlock(pindex->pprev->GetBlockHash()); - mnview.DecrementMintedBy(pindex->minter); + if (!fIsFakeNet) { + mnview.DecrementMintedBy(pindex->minter); + } mnview.SetLastHeight(pindex->pprev->nHeight); return fClean ? DISCONNECT_OK : DISCONNECT_UNCLEAN; @@ -1789,8 +1792,7 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl } // We are forced not to check this due to the block wasn't signed yet if called by TestBlockValidity() - if (!fJustCheck) - { + if (!fJustCheck && !fIsFakeNet) { // Check only that mintedBlocks counter is correct (MN existence and activation was partially checked before in CheckBlock()->ContextualCheckProofOfStake(), but not in the case of fJustCheck) auto it = mnview.ExistMasternode(CMasternodesView::AuthIndex::ByOperator, pindex->minter); assert(it); @@ -2057,7 +2059,9 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl // add this block to the view's block chain view.SetBestBlock(pindex->GetBlockHash()); - mnview.IncrementMintedBy(pindex->minter); // pindex->minter was extracted before + if (!fIsFakeNet) { + mnview.IncrementMintedBy(pindex->minter); // pindex->minter was extracted before + } mnview.SetLastHeight(pindex->nHeight); int64_t nTime5 = GetTimeMicros(); nTimeIndex += nTime5 - nTime4; @@ -3083,8 +3087,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, const Consensus::P // Check that the header is valid (particularly PoW). This is mostly // redundant with the call in AcceptBlockHeader. - - if (fCheckPOS && !pos::ContextualCheckProofOfStake(block, consensusParams, pmasternodesview.get())) + if (!fIsFakeNet && fCheckPOS && !pos::ContextualCheckProofOfStake(block, consensusParams, pmasternodesview.get())) return state.Invalid(ValidationInvalidReason::BLOCK_INVALID_HEADER, false, REJECT_INVALID, "high-hash", "proof of stake failed"); // Check the merkle root. @@ -3377,7 +3380,7 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, CValidationState return true; } - if (!pos::ContextualCheckProofOfStake(block, chainparams.GetConsensus(), pmasternodesview.get())) { + if (!fIsFakeNet && !pos::ContextualCheckProofOfStake(block, chainparams.GetConsensus(), pmasternodesview.get())) { return state.Invalid(ValidationInvalidReason::BLOCK_INVALID_HEADER, error("%s: Consensus::ContextualCheckProofOfStake: block %s: bad-pos-header (MN not exist or can't stake)", __func__, hash.ToString()), REJECT_INVALID, "bad-pos-header"); } // Get prev block index @@ -3392,7 +3395,7 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, CValidationState return error("%s: Consensus::ContextualCheckBlockHeader: %s, %s", __func__, hash.ToString(), FormatStateMessage(state)); // Now with pindexPrev we can check stake modifier - if (!pos::CheckStakeModifier(pindexPrev, block)) { + if (!fIsFakeNet && !pos::CheckStakeModifier(pindexPrev, block)) { return state.Invalid(ValidationInvalidReason::BLOCK_INVALID_HEADER, error("%s: block %s: bad PoS stake modifier", __func__, hash.ToString()), REJECT_INVALID, "bad-stakemodifier"); } @@ -3853,8 +3856,8 @@ bool BlockManager::LoadBlockIndex( CBlockTreeDB& blocktree, std::set& block_index_candidates) { - if (!blocktree.LoadBlockIndexGuts(consensus_params, [this](const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return this->InsertBlockIndex(hash); })) - return false; + if (!blocktree.LoadBlockIndexGuts(consensus_params, [this](const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return this->InsertBlockIndex(hash); }, fIsFakeNet)) + return false; // Calculate nChainWork std::vector > vSortedByHeight; diff --git a/src/validation.h b/src/validation.h index 4cc6561457..716cab60f8 100644 --- a/src/validation.h +++ b/src/validation.h @@ -177,6 +177,9 @@ extern bool fHavePruned; extern bool fPruneMode; /** Number of MiB of block files that we're trying to stay below. */ extern uint64_t nPruneTarget; +/** Flag to skip PoS-related checks (regtest only) */ +extern bool fIsFakeNet; + /** Block files containing a block-height within MIN_BLOCKS_TO_KEEP of ::ChainActive().Tip() will not be pruned. */ static const unsigned int MIN_BLOCKS_TO_KEEP = 288; /** Minimum blocks required to signal NODE_NETWORK_LIMITED */ diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 21bde4b75f..f361d06699 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2230,7 +2230,7 @@ CAmount CWalletTx::GetCredit(interfaces::Chain::Lock& locked_chain, const ismine CAmount CWalletTx::GetImmatureCredit(interfaces::Chain::Lock& locked_chain, bool fUseCache) const { - if (IsImmatureCoinBase(locked_chain) && IsInMainChain(locked_chain)) { + if (IsImmatureCoinBase(locked_chain) && IsInMainChain(locked_chain) &&!pwallet->chain().mnExists(GetHash())) { return GetCachableAmount(IMMATURE_CREDIT, ISMINE_SPENDABLE, !fUseCache); } @@ -2256,8 +2256,16 @@ CAmount CWalletTx::GetAvailableCredit(interfaces::Chain::Lock& locked_chain, boo bool allow_used_addresses = (filter & ISMINE_USED) || !pwallet->IsWalletFlagSet(WALLET_FLAG_AVOID_REUSE); CAmount nCredit = 0; uint256 hashTx = GetHash(); + + auto optHeight = locked_chain.getHeight(); + bool const lockedCollateral = optHeight && !pwallet->chain().mnCanSpend(hashTx, *optHeight); + for (unsigned int i = 0; i < tx->vout.size(); i++) { + if (i == 1 && lockedCollateral) { + continue; + } + if (!pwallet->IsSpent(locked_chain, hashTx, i) && (allow_used_addresses || !pwallet->IsUsedDestination(hashTx, i))) { const CTxOut &txout = tx->vout[i]; nCredit += pwallet->GetCredit(txout, filter); @@ -2521,6 +2529,9 @@ void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector< continue; } + auto optHeight = locked_chain.getHeight(); + bool const lockedCollateral = optHeight && !chain().mnCanSpend(wtx.tx->GetHash(), *optHeight); + for (unsigned int i = 0; i < wtx.tx->vout.size(); i++) { if (wtx.tx->vout[i].nValue < nMinimumAmount || wtx.tx->vout[i].nValue > nMaximumAmount) continue; @@ -2544,7 +2555,7 @@ void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector< continue; } - if (i == 1 && locked_chain.getHeight() && !chain().mnCanSpend(wtx.tx->GetHash(), *locked_chain.getHeight())) { + if (i == 1 && lockedCollateral) { continue; } diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index 635997afc9..ce848da8cc 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -219,8 +219,10 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, CWalletTx wtx(nullptr /* pwallet */, MakeTransactionRef()); ssValue >> wtx; CValidationState state; - if (!(CheckTransaction(*wtx.tx, state) && (wtx.GetHash() == hash) && state.IsValid())) - return false; + /// @todo @maxb temporary disabled due to genesis mn txs. RESOLVE! + /// we can't get genesis hash at wallet's load time +// if (!(CheckTransaction(*wtx.tx, state) && (wtx.GetHash() == hash) && state.IsValid())) +// return false; // Undo serialize changes in 31600 if (31404 <= wtx.fTimeReceivedIsTxTime && wtx.fTimeReceivedIsTxTime <= 31703) From 7aa82dca9767666bee6fb73fbfc8e37f8faedf88 Mon Sep 17 00:00:00 2001 From: Integral Team M Date: Fri, 18 Oct 2019 14:06:55 +0700 Subject: [PATCH 04/19] merge fixes --- src/masternodes/mn_rpc.cpp | 12 +++++++++++- src/pos_kernel.cpp | 2 ++ src/rpc/client.cpp | 3 ++- test/functional/rpc_mn_basic.py | 1 - test/functional/test_framework/messages.py | 2 +- test/functional/test_runner.py | 4 ++-- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/masternodes/mn_rpc.cpp b/src/masternodes/mn_rpc.cpp index 1232cd0bc9..1ee8ed1d5a 100644 --- a/src/masternodes/mn_rpc.cpp +++ b/src/masternodes/mn_rpc.cpp @@ -281,6 +281,16 @@ UniValue mn_resign(const JSONRPCRequest& request) "The first optional argument (may be empty array) is an array of specific UTXOs to spend. One of UTXO's must belong to the MN's owner (collateral) address" + HelpRequiringPassphrase(pwallet) + "\n", { + {"inputs", RPCArg::Type::ARR, RPCArg::Optional::OMITTED_NAMED_ARG, "A json array of json objects. Provide it if you want to spent specific UTXOs", + { + {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "", + { + {"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"}, + {"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"}, + }, + }, + }, + }, {"mn_id", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The Masternode's ID"}, }, RPCResult{ @@ -441,7 +451,7 @@ static const CRPCCommand commands[] = // ----------------- ------------------------ ----------------------- ---------- // { "masternodes", "mn_estimateannouncementfee", &mn_estimateannouncementfee, {} }, { "masternodes", "mn_create", &mn_create, { "inputs", "metadata" } }, - { "masternodes", "mn_resign", &mn_resign, { "mn_id" } }, + { "masternodes", "mn_resign", &mn_resign, { "inputs", "mn_id" } }, { "masternodes", "mn_list", &mn_list, { "list", "verbose" } }, diff --git a/src/pos_kernel.cpp b/src/pos_kernel.cpp index 4480046077..d7fe20207c 100644 --- a/src/pos_kernel.cpp +++ b/src/pos_kernel.cpp @@ -3,6 +3,8 @@ #include #include +extern CAmount GetMnCollateralAmount(); // from masternodes.h + namespace pos { uint256 CalcKernelHash(uint256 stakeModifier, int64_t coinstakeTime, uint256 masternodeID, const Consensus::Params& params) { // Calculate hash diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index 71ebfa4dfe..16651fb6a2 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -171,7 +171,8 @@ static const CRPCConvertParam vRPCConvertParams[] = { "stop", 0, "wait" }, { "mn_create", 0, "inputs" }, { "mn_create", 1, "metadata" }, - { "mn_resign", 0, "mn_id" }, + { "mn_resign", 0, "inputs" }, + { "mn_resign", 1, "mn_id" }, { "mn_list", 0, "list" }, { "mn_list", 1, "verbose" }, }; diff --git a/test/functional/rpc_mn_basic.py b/test/functional/rpc_mn_basic.py index 201ad800fe..6367f965a8 100755 --- a/test/functional/rpc_mn_basic.py +++ b/test/functional/rpc_mn_basic.py @@ -84,7 +84,6 @@ def run_test(self): # RESIGNING: #======================== - # Fail to resign: Forget to place params in config try: self.nodes[0].mn_resign([], idnode0) diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py index c9fe13c0b7..935722dfe9 100755 --- a/test/functional/test_framework/messages.py +++ b/test/functional/test_framework/messages.py @@ -28,7 +28,7 @@ import time from test_framework.siphash import siphash256 -from test_framework.util import hex_str_to_bytes, assert_greater_than +from test_framework.util import hex_str_to_bytes, assert_equal MIN_VERSION_SUPPORTED = 60001 MY_VERSION = 70014 # past bip-31 for ping/pong diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index acffc1bc8a..981b8de2ab 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -120,7 +120,7 @@ 'wallet_txn_clone.py --segwit', 'rpc_getchaintips.py', 'rpc_misc.py', - 'rpc_mn_basic.py' + 'rpc_mn_basic.py', 'interface_rest.py', 'mempool_spend_coinbase.py', 'wallet_avoidreuse.py', @@ -173,7 +173,7 @@ 'wallet_balance.py', 'feature_nulldummy.py', 'mempool_accept.py', -# 'wallet_import_rescan.py', NODES! + 'wallet_import_rescan.py', # nodes = 6 'wallet_import_with_label.py', 'rpc_bind.py --ipv4', 'rpc_bind.py --ipv6', From ea1149b71ed6a4afce6ca5065090778dc8c79295 Mon Sep 17 00:00:00 2001 From: Integral Team M Date: Fri, 18 Oct 2019 16:41:17 +0700 Subject: [PATCH 05/19] fix linter complaints --- test/functional/block_hash.py | 11 ++----- test/functional/feature_block.py | 2 +- test/functional/feature_nulldummy.py | 3 -- test/functional/interface_zmq.py | 2 -- test/functional/mining_basic.py | 5 ++-- test/functional/p2p_fingerprint.py | 2 -- test/functional/p2p_unrequested_blocks.py | 1 - test/functional/rpc_mn_basic.py | 5 ---- test/functional/test_framework/blocktools.py | 2 +- test/functional/test_framework/messages.py | 8 ++--- .../test_framework/test_framework.py | 17 +---------- test/functional/test_framework/test_node.py | 30 +------------------ test/functional/wallet_basic.py | 2 +- test/functional/wallet_bumpfee.py | 2 +- test/functional/wallet_keypool_topup.py | 2 +- test/functional/wallet_listsinceblock.py | 4 +-- 16 files changed, 17 insertions(+), 81 deletions(-) diff --git a/test/functional/block_hash.py b/test/functional/block_hash.py index 0523d31d39..00385fbb95 100755 --- a/test/functional/block_hash.py +++ b/test/functional/block_hash.py @@ -6,12 +6,7 @@ """Test the masternodes RPC. """ -# import time - -# from decimal import Decimal -# import io - -from test_framework.blocktools import add_witness_commitment, create_block, create_coinbase +from test_framework.blocktools import add_witness_commitment, create_block, create_coinbase from test_framework.test_framework import BitcoinTestFramework class SimpleHashTest (BitcoinTestFramework): @@ -29,12 +24,12 @@ def run_test(self): # block.vtx.append(ctx) block.stakeModifier = 1 block.nHeight = height - block.nMintedBlocks = 100 + block.nMintedBlocks = 100 block.rehash() block.hashMerkleRoot = block.calc_merkle_root() add_witness_commitment(block) block.solve() - res = node.submitblock(block.serialize().hex()) + node.submitblock(block.serialize().hex()) self.log.info("Python hash: {}".format(block.hash)) self.log.info("C++ hash: {}".format(node.getbestblockhash())) diff --git a/test/functional/feature_block.py b/test/functional/feature_block.py index 1b1cc719da..064a138a53 100755 --- a/test/functional/feature_block.py +++ b/test/functional/feature_block.py @@ -23,7 +23,7 @@ CTxIn, CTxOut, MAX_BLOCK_BASE_SIZE, - uint256_from_compact, + # uint256_from_compact, uint256_from_str, ) from test_framework.mininode import P2PDataStore diff --git a/test/functional/feature_nulldummy.py b/test/functional/feature_nulldummy.py index 15f70ca4f8..f1508cc1e3 100755 --- a/test/functional/feature_nulldummy.py +++ b/test/functional/feature_nulldummy.py @@ -12,8 +12,6 @@ [Consensus] Check that the new NULLDUMMY rules are not enforced on the 431st block. [Policy/Consensus] Check that the new NULLDUMMY rules are enforced on the 432nd block. """ -import time - from test_framework.blocktools import create_coinbase, create_block, create_transaction, add_witness_commitment from test_framework.messages import CTransaction from test_framework.script import CScript @@ -60,7 +58,6 @@ def run_test(self): self.lastblockhash = self.nodes[0].getbestblockhash() self.tip = int("0x" + self.lastblockhash, 0) self.lastblockheight = 429 - # self.lastblocktime = int(time.time()) + 429 self.lastblocktime = self.nodes[0].getblockheader(self.lastblockhash)["time"] self.log.info("Test 1: NULLDUMMY compliant base transactions should be accepted to mempool and mined before activation [430]") diff --git a/test/functional/interface_zmq.py b/test/functional/interface_zmq.py index f1df2168e8..2a14d67e94 100755 --- a/test/functional/interface_zmq.py +++ b/test/functional/interface_zmq.py @@ -78,8 +78,6 @@ def test_basic(self): num_blocks = 5 self.log.info("Generate %(n)d blocks (and %(n)d coinbase txes)" % {"n": num_blocks}) genhashes = self.nodes[0].generate(nblocks=num_blocks, address=ADDRESS_BCRT1_UNSPENDABLE) - from test_framework.util import set_node_times - # set_node_times(self.nodes, 0) self.sync_all() for x in range(num_blocks): diff --git a/test/functional/mining_basic.py b/test/functional/mining_basic.py index 295392de01..44c8bf8981 100755 --- a/test/functional/mining_basic.py +++ b/test/functional/mining_basic.py @@ -9,7 +9,6 @@ - submitblock""" import copy -from decimal import Decimal from test_framework.blocktools import ( create_coinbase, @@ -51,7 +50,7 @@ def mine_chain(self): self.nodes[0].setmocktime(t) self.nodes[0].generatetoaddress(1, address) - # We have no RPC 'getmininginfo'! + # We have no RPC 'getmininginfo'! # mining_info = self.nodes[0].getmininginfo() # assert_equal(mining_info['blocks'], 200) # assert_equal(mining_info['currentblocktx'], 0) @@ -69,7 +68,7 @@ def assert_submitblock(block, result_str_1, result_str_2=None): assert_equal(result_str_1, node.submitblock(hexdata=block.serialize().hex())) assert_equal(result_str_2, node.submitblock(hexdata=block.serialize().hex())) - # We have no RPC 'getmininginfo'! + # We have no RPC 'getmininginfo'! # self.log.info('getmininginfo') # mining_info = node.getmininginfo() # assert_equal(mining_info['blocks'], 200) diff --git a/test/functional/p2p_fingerprint.py b/test/functional/p2p_fingerprint.py index 667832d924..eb48e39786 100755 --- a/test/functional/p2p_fingerprint.py +++ b/test/functional/p2p_fingerprint.py @@ -77,7 +77,6 @@ def run_test(self): node0 = self.nodes[0].add_p2p_connection(P2PInterface()) # Set node time to 60 days ago - # self.nodes[0].setmocktime(int(time.time()) - 60 * 24 * 60 * 60) self.nodes[0].set_mocktime(int(time.time()) - 60 * 24 * 60 * 60) # Generating a chain of 10 blocks @@ -111,7 +110,6 @@ def run_test(self): wait_until(test_function, timeout=3) # Longest chain is extended so stale is much older than chain tip - # self.nodes[0].setmocktime(0) self.nodes[0].set_mocktime(int(time.time())) # NOT 0 NOR None, but current time tip = self.nodes[0].generate(1)[0] assert_equal(self.nodes[0].getblockcount(), 14) diff --git a/test/functional/p2p_unrequested_blocks.py b/test/functional/p2p_unrequested_blocks.py index 09231c0544..eb573111db 100755 --- a/test/functional/p2p_unrequested_blocks.py +++ b/test/functional/p2p_unrequested_blocks.py @@ -57,7 +57,6 @@ from test_framework.messages import CBlockHeader, CInv, msg_block, msg_headers, msg_inv from test_framework.mininode import mininode_lock, P2PInterface from test_framework.test_framework import BitcoinTestFramework -from test_framework.test_node import TestNode from test_framework.util import ( assert_equal, assert_raises_rpc_error, diff --git a/test/functional/rpc_mn_basic.py b/test/functional/rpc_mn_basic.py index 6367f965a8..de831c31d3 100755 --- a/test/functional/rpc_mn_basic.py +++ b/test/functional/rpc_mn_basic.py @@ -14,17 +14,12 @@ from test_framework.util import assert_equal, \ connect_nodes_bi -import pprint -import time - class MasternodesRpcBasicTest (BitcoinTestFramework): def set_test_params(self): self.num_nodes = 3 self.setup_clean_chain = True def run_test(self): - pp = pprint.PrettyPrinter(indent=4) - assert_equal(len(self.nodes[0].mn_list()), 8) self.nodes[0].generate(100) self.sync_all() diff --git a/test/functional/test_framework/blocktools.py b/test/functional/test_framework/blocktools.py index 632eb298d5..7e08e431fb 100644 --- a/test/functional/test_framework/blocktools.py +++ b/test/functional/test_framework/blocktools.py @@ -60,7 +60,7 @@ def create_block(hashprev, coinbase, ntime=None, *, version=1): else: block.nTime = ntime block.hashPrevBlock = hashprev - + block.nBits = 0x207fffff # difficulty retargeting is disabled in REGTEST chainparams block.vtx.append(coinbase) block.hashMerkleRoot = block.calc_merkle_root() diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py index 935722dfe9..eafe7d3e32 100755 --- a/test/functional/test_framework/messages.py +++ b/test/functional/test_framework/messages.py @@ -617,7 +617,7 @@ def __repr__(self): time.ctime(self.nTime), self.nBits, self.stakeModifier, self.nHeight, self.nMintedBlocks, "0x".join("{:02x}".format(c) for c in self.sig)) BLOCK_HEADER_SIZE = len(CBlockHeader().serialize()) -assert_equal(BLOCK_HEADER_SIZE, 190) +assert_equal(BLOCK_HEADER_SIZE, 190) class CBlock(CBlockHeader): __slots__ = ("vtx",) @@ -683,10 +683,10 @@ def is_valid(self): def solve(self): self.rehash() # Commented out due to PoS - target = uint256_from_compact(self.nBits) + # target = uint256_from_compact(self.nBits) # while self.sha256 > target: - # # increment stakeModifier here (instead of nTime) due to very complex control of nTime - # self.stakeModifier += 1 + # # increment stakeModifier here (instead of nTime) due to very complex control of nTime + # self.stakeModifier += 1 # self.rehash() def __repr__(self): diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index 66d738fa59..f6205bfe09 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -31,7 +31,6 @@ initialize_datadir, sync_blocks, sync_mempools, - set_node_times, ) @@ -100,7 +99,6 @@ def __init__(self): self.supports_cli = False self.bind_to_localhost_only = True self.set_test_params() - self.mocktime = 0 assert hasattr(self, "num_nodes"), "Test must set self.num_nodes in set_test_params()" @@ -375,7 +373,7 @@ def start_node(self, i, *args, **kwargs): node.start(*args, **kwargs) node.wait_for_rpc_connection() - if not TestNode.Mocktime is None: + if TestNode.Mocktime is not None: node.setmocktime(TestNode.Mocktime) if self.options.coveragedir is not None: @@ -440,19 +438,10 @@ def join_network(self): connect_nodes_bi(self.nodes, 1, 2) self.sync_all() - def sync_mocktimes(self, nodes): - for node in nodes: - if node.running and not TestNode.Mocktime is None: - node.setmocktime(TestNode.Mocktime) - def sync_blocks(self, nodes=None, **kwargs): - # self.sync_mocktimes(nodes or self.nodes) - # [ node.setmocktime(0) for node in (nodes or self.nodes) ] sync_blocks(nodes or self.nodes, **kwargs) def sync_mempools(self, nodes=None, **kwargs): - # self.sync_mocktimes(nodes or self.nodes) - # [ node.setmocktime(0) for node in (nodes or self.nodes) ] sync_mempools(nodes or self.nodes, **kwargs) def sync_all(self, nodes=None, **kwargs): @@ -526,9 +515,6 @@ def _initialize_chain(self): self.nodes[CACHE_NODE_ID].importprivkey(privkey=self.nodes[CACHE_NODE_ID].get_genesis_keys().ownerPrivKey, label='coinbase') self.nodes[CACHE_NODE_ID].importprivkey(privkey=self.nodes[CACHE_NODE_ID].get_genesis_keys().operatorPrivKey, label='coinbase') - # self.mocktime = self.nodes[CACHE_NODE_ID].getblockheader(self.nodes[CACHE_NODE_ID].getbestblockhash())["time"] + 1 - # self.nodes[CACHE_NODE_ID].setmocktime(self.mocktime) - # Create a 199-block-long chain; each of the 4 first nodes # gets 25 mature blocks and 25 immature. # The 4th node gets only 24 immature blocks so that the very last @@ -536,7 +522,6 @@ def _initialize_chain(self): # This is needed so that we are out of IBD when the test starts, # see the tip age check in IsInitialBlockDownload(). for i in range(8): - # self.gen_mt(count=25 if i != 7 else 24, node_id=CACHE_NODE_ID, address=TestNode.PRIV_KEYS[i % 4].operatorAuthAddress) self.nodes[CACHE_NODE_ID].generate( nblocks=25 if i != 7 else 24, address=TestNode.PRIV_KEYS[i % 4].operatorAuthAddress, diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index 33abc93830..810346eff5 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -130,23 +130,6 @@ def __init__(self, i, datadir, *, chain, rpchost, timewait, bitcoind, bitcoin_cl ] Mocktime = None - # AddressKeyPair = collections.namedtuple('AddressKeyPair', ['address', 'key']) - # PRIV_KEYS = [ - # # address , privkey - # AddressKeyPair('mjTkW3DjgyZck4KbiRusZsqTgaYTxdSz6z', 'cVpF924EspNh8KjYsfhgY96mmxvT6DgdWiTYMtMjuM74hJaU5psW'), - # AddressKeyPair('msX6jQXvxiNhx3Q62PKeLPrhrqZQdSimTg', 'cUxsWyKyZ9MAQTaAhUQWJmBbSvHMwSmuv59KgxQV7oZQU3PXN3KE'), - # AddressKeyPair('mnonCMyH9TmAsSj3M59DsbH8H63U3RKoFP', 'cTrh7dkEAeJd6b3MRX9bZK8eRmNqVCMH3LSUkE3dSFDyzjU38QxK'), - # AddressKeyPair('mqJupas8Dt2uestQDvV2NH3RU8uZh2dqQR', 'cVuKKa7gbehEQvVq717hYcbE9Dqmq7KEBKqWgWrYBa2CKKrhtRim'), - # AddressKeyPair('msYac7Rvd5ywm6pEmkjyxhbCDKqWsVeYws', 'cQDCBuKcjanpXDpCqacNSjYfxeQj8G6CAtH1Dsk3cXyqLNC4RPuh'), - # AddressKeyPair('n2rnuUnwLgXqf9kk2kjvVm8R5BZK1yxQBi', 'cQakmfPSLSqKHyMFGwAqKHgWUiofJCagVGhiB4KCainaeCSxeyYq'), - # AddressKeyPair('myzuPxRwsf3vvGzEuzPfK9Nf2RfwauwYe6', 'cQMpDLJwA8DBe9NcQbdoSb1BhmFxVjWD5gRyrLZCtpuF9Zi3a9RK'), - # AddressKeyPair('mumwTaMtbxEPUswmLBBN3vM9oGRtGBrys8', 'cSXmRKXVcoouhNNVpcNKFfxsTsToY5pvB9DVsFksF1ENunTzRKsy'), - # AddressKeyPair('mpV7aGShMkJCZgbW7F6iZgrvuPHjZjH9qg', 'cSoXt6tm3pqy43UMabY6eUTmR3eSUYFtB2iNQDGgb3VUnRsQys2k'), - # AddressKeyPair('mq4fBNdckGtvY2mijd9am7DRsbRB4KjUkf', 'cN55daf1HotwBAgAKWVgDcoppmUNDtQSfb7XLutTLeAgVc3u8hik'), - # AddressKeyPair('mpFAHDjX7KregM3rVotdXzQmkbwtbQEnZ6', 'cT7qK7g1wkYEMvKowd2ZrX1E5f6JQ7TM246UfqbCiyF7kZhorpX3'), - # AddressKeyPair('mzRe8QZMfGi58KyWCse2exxEFry2sfF2Y7', 'cPiRWE8KMjTRxH1MWkPerhfoHFn5iHPWVK5aPqjW8NxmdwenFinJ'), - # ] - def get_genesis_keys(self): """Return a deterministic priv key in base58, that only depends on the node's index""" assert len(self.PRIV_KEYS) == MAX_NODES @@ -165,23 +148,16 @@ def generate(self, nblocks, maxtries=1000000, address=None): if address is None: address = self.get_genesis_keys().operatorAuthAddress - # if TestNode.Mocktime is None: - # TestNode.Mocktime = self.getblockheader(self.getbestblockhash())["time"] + 1 - # TestNode.Mocktime = int(time.time()) - height = self.getblockcount() minted = 0 mintedHashes = [] while minted < nblocks: - if not TestNode.Mocktime is None: + if TestNode.Mocktime is not None: self.setmocktime(TestNode.Mocktime + 1) - # self.setmocktime(self.mocktime) res = self.generatetoaddress(nblocks=1, address=address, maxtries=maxtries) if res == 1: minted += 1 self.pullup_mocktime() - # TestNode.Mocktime = self.getblockheader(self.getbestblockhash())["time"] + 1 # 2s per block - # self.mocktime += 2 # 2s per block mintedHashes.append(self.getblockhash(height+minted)) return mintedHashes @@ -296,10 +272,6 @@ def wait_for_rpc_connection(self): time.sleep(1.0 / poll_per_s) self._raise_assertion_error("Unable to connect to bitcoind") - # def generate(self, nblocks, maxtries=1000000): - # self.log.debug("TestNode.generate() dispatches `generate` call to `generatetoaddress`") - # return self.generatetoaddress(nblocks=nblocks, address=self.get_genesis_keys().address, maxtries=maxtries) - def get_wallet_rpc(self, wallet_name): if self.use_cli: return self.cli("-rpcwallet={}".format(wallet_name)) diff --git a/test/functional/wallet_basic.py b/test/functional/wallet_basic.py index a1c128b3cd..438e5874db 100755 --- a/test/functional/wallet_basic.py +++ b/test/functional/wallet_basic.py @@ -312,7 +312,7 @@ def run_test(self): # This will raise an exception since generate does not accept a string # we have no more "generate" rpc - # assert_raises_rpc_error(-1, "not an integer", self.nodes[0].generate, "2") + # assert_raises_rpc_error(-1, "not an integer", self.nodes[0].generate, "2") # This will raise an exception for the invalid private key format assert_raises_rpc_error(-5, "Invalid private key encoding", self.nodes[0].importprivkey, "invalid") diff --git a/test/functional/wallet_bumpfee.py b/test/functional/wallet_bumpfee.py index 1cd8806337..bbb41be913 100755 --- a/test/functional/wallet_bumpfee.py +++ b/test/functional/wallet_bumpfee.py @@ -380,7 +380,7 @@ def submit_block_with_tx(node, tx): block.hashMerkleRoot = block.calc_merkle_root() add_witness_commitment(block) block.solve() - res = node.submitblock(block.serialize().hex()) + node.submitblock(block.serialize().hex()) return block def test_no_more_inputs_fails(rbf_node, dest_address): diff --git a/test/functional/wallet_keypool_topup.py b/test/functional/wallet_keypool_topup.py index 93069a3d2c..46625a7730 100755 --- a/test/functional/wallet_keypool_topup.py +++ b/test/functional/wallet_keypool_topup.py @@ -77,7 +77,7 @@ def run_test(self): self.log.info("Verify keypool is restored and balance is correct") assert_equal(self.nodes[idx].getbalance(), 15) - assert_equal(self.nodes[idx].listtransactions()[1]['category'], "receive") # cause [0] is genesis mn tx + assert_equal(self.nodes[idx].listtransactions()[1]['category'], "receive") # cause [0] is genesis mn tx assert_equal(self.nodes[idx].listtransactions()[2]['category'], "receive") # Check that we have marked all keys up to the used keypool key as used assert_equal(self.nodes[idx].getaddressinfo(self.nodes[idx].getnewaddress())['hdkeypath'], "m/0'/0'/110'") diff --git a/test/functional/wallet_listsinceblock.py b/test/functional/wallet_listsinceblock.py index 6b8d548d8f..a527b6e203 100755 --- a/test/functional/wallet_listsinceblock.py +++ b/test/functional/wallet_listsinceblock.py @@ -5,8 +5,7 @@ """Test the listsincelast RPC.""" from test_framework.test_framework import BitcoinTestFramework -from test_framework.test_node import TestNode -from test_framework.util import assert_equal, assert_array_result, assert_raises_rpc_error, set_node_times +from test_framework.util import assert_equal, assert_array_result, assert_raises_rpc_error class ListSinceBlockTest (BitcoinTestFramework): def set_test_params(self): @@ -18,7 +17,6 @@ def skip_test_if_missing_module(self): def run_test(self): self.nodes[2].generate(101) - # set_node_times(self.nodes, TestNode.Mocktime) self.sync_all() self.test_no_blockhash() From eeb809c3e92b0c53cff97315702036ccbbc3bbbf Mon Sep 17 00:00:00 2001 From: Integral Team M Date: Fri, 18 Oct 2019 16:55:01 +0700 Subject: [PATCH 06/19] cleanup commented code --- src/masternodes/masternodes.cpp | 79 --------------------------------- src/masternodes/masternodes.h | 37 --------------- src/masternodes/mn_rpc.cpp | 52 ++-------------------- src/masternodes/mn_txdb.cpp | 41 ----------------- src/masternodes/mn_txdb.h | 6 --- 5 files changed, 4 insertions(+), 211 deletions(-) diff --git a/src/masternodes/masternodes.cpp b/src/masternodes/masternodes.cpp index 23b862e54b..6ef3d25264 100644 --- a/src/masternodes/masternodes.cpp +++ b/src/masternodes/masternodes.cpp @@ -22,8 +22,6 @@ static const std::map MasternodesTxTypeToCode = {'R', MasternodesTxType::ResignMasternode } }; -//extern CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams); // in main.cpp - int GetMnActivationDelay() { return Params().GetConsensus().mn.activationDelay; @@ -53,8 +51,6 @@ CAmount GetMnCollateralAmount() CAmount GetMnCreationFee(int height) { return Params().GetConsensus().mn.creationFee; - -// CAmount blockSubsidy = GetBlockSubsidy(height, Params().GetConsensus()); } CMasternode::CMasternode() @@ -222,7 +218,6 @@ bool CMasternodesView::OnMasternodeCreate(uint256 const & nodeId, CMasternode co nodesByOwner[node.ownerAuthAddress] = nodeId; nodesByOperator[node.operatorAuthAddress] = nodeId; -// blocksUndo[std::make_pair(node.height, txn)] = std::make_pair(nodeId, MasternodesTxType::CreateMasternode); blocksUndo[node.creationHeight][txn] = std::make_pair(nodeId, MasternodesTxType::CreateMasternode); return true; @@ -241,7 +236,6 @@ bool CMasternodesView::OnMasternodeResign(uint256 const & nodeId, uint256 const allNodes[nodeId].resignTx = txid; allNodes[nodeId].resignHeight = height; -// blocksUndo[std::make_pair(height, txn)] = std::make_pair(nodeId, MasternodesTxType::ResignMasternode); blocksUndo[height][txn] = std::make_pair(nodeId, MasternodesTxType::ResignMasternode); return true; @@ -301,55 +295,6 @@ CMasternodesViewCache CMasternodesView::OnUndoBlock(int height) return backup; // it is new value diff for height+1 } -//bool CMasternodesView::OnConnectBlock(int height, const CKeyID & minter) -//{ -// lastHeight = height; - -// auto nodePtr = ExistMasternode(minter); -// assert(nodePtr); - -// if (nodePtr) -// { -// allNodes[minter] = *nodePtr; // !! cause may be cached! -// ++allNodes[minter].mintedBlocks; - -// return true; -// } -// return false; -//} - - -//bool CMasternodesView::IsTeamMember(int height, CKeyID const & operatorAuth) const -//{ -// CTeam const & team = ReadDposTeam(height); -// for (auto const & member : team) -// { -// if (member.second.operatorAuth == operatorAuth) -// return true; -// } -// return false; -//} - -//CTeam const & CMasternodesView::ReadDposTeam(int height) const -//{ -// static CTeam const Empty{}; - -// auto const it = teams.find(height); -// if (it != teams.end()) -// return it->second; - -// // Nothing to complain here, cause teams not exists before dPoS activation! -//// LogPrintf("MN ERROR: Fail to get team at height %d! May be already pruned!\n", height); -// return Empty; -//} - -//void CMasternodesView::WriteDposTeam(int height, const CTeam & team) -//{ -// assert(height >= 0); -// teams[height] = team; -//} - - /// Call it only for "clear" and "full" (not cached) view void CMasternodesView::PruneOlder(int height) { @@ -376,8 +321,6 @@ void CMasternodesView::PruneOlder(int height) // // erase undo info // blocksUndo.erase(blocksUndo.begin(), blocksUndo.lower_bound(height)); -// // erase old teams info -//// teams.erase(teams.begin(), teams.lower_bound(height)); } boost::optional CMasternodesView::AmI(AuthIndex where) const @@ -410,26 +353,6 @@ boost::optional CMasternodesView::AmIOwner() c return AmI(AuthIndex::ByOwner); } -//boost::optional CMasternodesView::AmIActiveOperator() const -//{ -// auto result = AmI(AuthIndex::ByOperator); -// if (result && ExistMasternode(result->id)->IsActive()) -// { -// return result; -// } -// return {}; -//} - -//boost::optional CMasternodesView::AmIActiveOwner() const -//{ -// auto result = AmI(AuthIndex::ByOwner); -// if (result && ExistMasternode(result->id)->IsActive()) -// { -// return result; -// } -// return {}; -//} - void CMasternodesView::ApplyCache(const CMasternodesView * cache) { lastHeight = cache->lastHeight; @@ -459,7 +382,6 @@ void CMasternodesView::Clear() nodesByOperator.clear(); blocksUndo.clear(); -// teams.clear(); } CMasternodesViewHistory & CMasternodesViewHistory::GetState(int targetHeight) @@ -470,7 +392,6 @@ CMasternodesViewHistory & CMasternodesViewHistory::GetState(int targetHeight) if (lastHeight > targetHeight) { // go backward (undo) - for (; lastHeight > targetHeight; ) { auto it = historyDiff.find(lastHeight); diff --git a/src/masternodes/masternodes.h b/src/masternodes/masternodes.h index 24bfd6ee03..aac3fb077c 100644 --- a/src/masternodes/masternodes.h +++ b/src/masternodes/masternodes.h @@ -111,17 +111,8 @@ class CMasternode }; typedef std::map CMasternodes; // nodeId -> masternode object, -//typedef std::set CActiveMasternodes; // just nodeId's, typedef std::map CMasternodesByAuth; // for two indexes, owner->nodeId, operator->nodeId -//struct TeamData -//{ -// int32_t joinHeight; -// CKeyID operatorAuth; -//}; - -//typedef std::map CTeam; // nodeId -> - masternodes' team - class CMasternodesViewCache; class CMasternodesViewHistory; @@ -137,24 +128,19 @@ class CMasternodesView }; typedef std::map > CMnTxsUndo; // txn, undoRec typedef std::map CMnBlocksUndo; -// typedef std::map CTeams; enum class AuthIndex { ByOwner, ByOperator }; protected: int lastHeight; CMasternodes allNodes; -// CActiveMasternodes activeNodes; CMasternodesByAuth nodesByOwner; CMasternodesByAuth nodesByOperator; CMnBlocksUndo blocksUndo; -// CTeams teams; CMasternodesView() : lastHeight(0) {} -// CMasternodesView(CMasternodesView const & other) = delete; - public: CMasternodesView & operator=(CMasternodesView const & other) = delete; @@ -221,29 +207,16 @@ class CMasternodesView bool OnMasternodeResign(uint256 const & nodeId, uint256 const & txid, int height, int txn); CMasternodesViewCache OnUndoBlock(int height); -// bool OnConnectBlock(int height, CKeyID const & minter); -// bool OnDisconnectBlock(int height, CKeyID const & minter); - void PruneOlder(int height); -// bool IsTeamMember(int height, CKeyID const & operatorAuth) const; -// CTeam CalcNextDposTeam(CActiveMasternodes const & activeNodes, CMasternodes const & allNodes, uint256 const & blockHash, int height); -// virtual CTeam const & ReadDposTeam(int height) const; - - protected: virtual CMnBlocksUndo::mapped_type const & GetBlockUndo(CMnBlocksUndo::key_type key) const; -// virtual void WriteDposTeam(int height, CTeam const & team); - - private: boost::optional AmI(AuthIndex where) const; public: boost::optional AmIOperator() const; boost::optional AmIOwner() const; -// boost::optional AmIActiveOperator() const; -// boost::optional AmIActiveOwner() const; friend class CMasternodesViewCache; friend class CMasternodesViewHistory; @@ -254,7 +227,6 @@ class CMasternodesViewCache : public CMasternodesView { protected: CMasternodesView * base; -// CMasternodesViewCache() {} public: CMasternodesViewCache(CMasternodesView * other) @@ -304,7 +276,6 @@ class CMasternodesViewCache : public CMasternodesView return it == blocksUndo.end() ? base->GetBlockUndo(key) : it->second; } - bool Flush() override { base->ApplyCache(this); @@ -312,14 +283,6 @@ class CMasternodesViewCache : public CMasternodesView return true; } - -// virtual CTeam const & ReadDposTeam(int height) const -// { -// auto const it = teams.find(height); -// // return cached (new) or original value -// return it != teams.end() ? it->second : base->ReadDposTeam(height); -// } -// friend class CMasternodesViewHistory; }; diff --git a/src/masternodes/mn_rpc.cpp b/src/masternodes/mn_rpc.cpp index 1ee8ed1d5a..f3523de9a8 100644 --- a/src/masternodes/mn_rpc.cpp +++ b/src/masternodes/mn_rpc.cpp @@ -6,7 +6,6 @@ #include #include -//#include "../init.h" // pwalletMain #include #include #include @@ -39,33 +38,9 @@ extern UniValue sendrawtransaction(UniValue const & params, bool fHelp); // in r extern UniValue getnewaddress(UniValue const & params, bool fHelp); // in rpcwallet.cpp extern bool EnsureWalletIsAvailable(bool avoidException); // in rpcwallet.cpp extern bool DecodeHexTx(CTransaction & tx, std::string const & strHexTx); // in core_io.h -//extern std::string EncodeHexTx(CTransaction const & tx); extern void ScriptPubKeyToJSON(CScript const & scriptPubKey, UniValue & out, bool fIncludeHex); // in rawtransaction.cpp -//namespace { -//// stolen from rpc_tests.cpp, can't import cause it's in tests module (not linked in main binary) -//UniValue CallRPC(std::string args) -//{ -// std::vector vArgs; -// boost::split(vArgs, args, boost::is_any_of(" \t")); -// std::string strMethod = vArgs[0]; -// vArgs.erase(vArgs.begin()); -// JSONRPCRequest request; -// request.strMethod = strMethod; -// request.params = RPCConvertValues(strMethod, vArgs); -// request.fHelp = false; - -// if (RPCIsInWarmup(nullptr)) SetRPCWarmupFinished(); - -// // nothing to "try/catch" here, will be passed over -// UniValue result = tableRPC.execute(request); -// return result; -//} - -//} // namespace - - extern void FundTransaction(CWallet* const pwallet, CMutableTransaction& tx, CAmount& fee_out, int& change_position, UniValue options); static UniValue fundsignsend(CMutableTransaction & mtx, JSONRPCRequest const & request, CWallet* const pwallet) @@ -108,31 +83,9 @@ CAmount EstimateMnCreationFee() { // Current height + (1 day blocks) to avoid rejection; int targetHeight = ::ChainActive().Height() + 1 + (60 * 60 / Params().GetConsensus().pos.nTargetSpacing); -// size_t targetMnCount = pmasternodesview->GetActiveMasternodes().size() < 4 ? 0 : pmasternodesview->GetActiveMasternodes().size() - 4; return GetMnCreationFee(targetHeight); } -//UniValue mn_estimatemncreationfee(UniValue const & params, bool fHelp) -//{ -// if (fHelp || params.size() != 0) -// throw std::runtime_error( -// "mn_estimateannouncementfee\n" -// "\nEstimates the approximate masternode announcement fee\n" -// "\nResult:\n" -// "n : (numeric) estimated fee\n" -// "\n" -// "\nExample:\n" -// + HelpExampleCli("mn_estimatemncreationfee", "")); - -// LOCK(cs_main); -// return ValueFromAmount(EstimateMnCreationFee()); -//} - -/* - * - * Issued by: any -*/ - void FillInputs(UniValue const & inputs, CMutableTransaction & rawTx) { for (unsigned int idx = 0; idx < inputs.size(); idx++) @@ -163,6 +116,10 @@ CWallet* GetWallet(const JSONRPCRequest& request) return pwallet; } +/* + * + * Issued by: any +*/ UniValue mn_create(const JSONRPCRequest& request) { CWallet* const pwallet = GetWallet(request); @@ -449,7 +406,6 @@ UniValue mn_list(const JSONRPCRequest& request) static const CRPCCommand commands[] = { // category name actor (function) params // ----------------- ------------------------ ----------------------- ---------- -// { "masternodes", "mn_estimateannouncementfee", &mn_estimateannouncementfee, {} }, { "masternodes", "mn_create", &mn_create, { "inputs", "metadata" } }, { "masternodes", "mn_resign", &mn_resign, { "inputs", "mn_id" } }, diff --git a/src/masternodes/mn_txdb.cpp b/src/masternodes/mn_txdb.cpp index f1f1e2fdb1..04345de8f8 100644 --- a/src/masternodes/mn_txdb.cpp +++ b/src/masternodes/mn_txdb.cpp @@ -16,12 +16,9 @@ using namespace std; // Prefixes to the masternodes database (masternodes/) static const char DB_MASTERNODES = 'M'; // main masternodes table static const char DB_MASTERNODESUNDO = 'U'; // undo table -//static const char DB_TEAM = 'T'; -//static const char DB_PRUNEDEAD = 'D'; static const char DB_MN_HEIGHT = 'H'; // single record with last processed chain height static const char DB_PRUNE_HEIGHT = 'P'; // single record with pruned height (for validation of reachable data window) - CMasternodesViewDB::CMasternodesViewDB(size_t nCacheSize, bool fMemory, bool fWipe) : db(new CDBWrapper(GetDataDir() / "masternodes", nCacheSize, fMemory, fWipe)) { @@ -42,14 +39,6 @@ void CMasternodesViewDB::CommitBatch() } } -//void CMasternodesViewDB::DropBatch() -//{ -// if (batch) -// { -// batch.reset(); -// } -//} - bool CMasternodesViewDB::ReadHeight(int & h) { // it's a hack, cause we don't know active chain tip at the loading time @@ -75,16 +64,6 @@ void CMasternodesViewDB::EraseMasternode(uint256 const & txid) BatchErase(make_pair(DB_MASTERNODES, txid)); } -//void CMasternodesViewDB::WriteDeadIndex(int height, uint256 const & txid, char type) -//{ -// BatchWrite(make_pair(make_pair(DB_PRUNEDEAD, static_cast(height)), txid), type); -//} - -//void CMasternodesViewDB::EraseDeadIndex(int height, uint256 const & txid) -//{ -// BatchErase(make_pair(make_pair(DB_PRUNEDEAD, static_cast(height)), txid)); -//} - void CMasternodesViewDB::WriteUndo(int height, CMnTxsUndo const & undo) { BatchWrite(make_pair(DB_MASTERNODESUNDO, static_cast(height)), undo); @@ -95,15 +74,6 @@ void CMasternodesViewDB::EraseUndo(int height) BatchErase(make_pair(DB_MASTERNODESUNDO, static_cast(height))); } -//void CMasternodesViewDB::WriteTeam(int blockHeight, const CTeam & team) -//{ -// // we are sure that we have no spoiled records (all of them are deleted) -// for (CTeam::const_iterator it = team.begin(); it != team.end(); ++it) -// { -// BatchWrite(make_pair(make_pair(DB_TEAM, static_cast(blockHeight)), it->first), make_pair(it->second.joinHeight, it->second.operatorAuth)); -// } -//} - /* * Loads all data from DB, creates indexes */ @@ -120,11 +90,7 @@ bool CMasternodesViewDB::Load() }); result = result && LoadTable(DB_MASTERNODESUNDO, blocksUndo); - // Load teams information -// result = result && LoadTable(DB_TEAM, teams); - if (result) -// LogPrintf("MN: db loaded: last height: %d; masternodes: %d; common undo: %d; teams: %d\n", lastHeight, allNodes.size(), txsUndo.size(), teams.size()); LogPrintf("MN: db loaded: last height: %d; masternodes: %d; common undo: %d\n", lastHeight, allNodes.size(), blocksUndo.size()); else { LogPrintf("MN: fail to load database!\n"); @@ -163,16 +129,9 @@ bool CMasternodesViewDB::Flush() ++it; } } - -// for (auto && it = teams.begin(); it != teams.end(); ++it) -// { -// WriteTeam(it->first, it->second); -// } - WriteHeight(lastHeight); CommitBatch(); -// LogPrintf("MN: db saved: last height: %d; masternodes: %d; common undo: %d; teams: %d\n", lastHeight, nMasternodes, nUndo, teams.size()); LogPrintf("MN: db saved: last height: %d; masternodes: %d; common undo: %d\n", lastHeight, nMasternodes, nUndo); return true; diff --git a/src/masternodes/mn_txdb.h b/src/masternodes/mn_txdb.h index ebcea356a4..04d358de40 100644 --- a/src/masternodes/mn_txdb.h +++ b/src/masternodes/mn_txdb.h @@ -86,7 +86,6 @@ class CMasternodesViewDB : public CMasternodesView protected: void CommitBatch(); -// void DropBatch(); bool ReadHeight(int & h); void WriteHeight(int h); @@ -94,14 +93,9 @@ class CMasternodesViewDB : public CMasternodesView void WriteMasternode(uint256 const & txid, CMasternode const & node); void EraseMasternode(uint256 const & txid); -// void WriteDeadIndex(int height, uint256 const & txid, char type); -// void EraseDeadIndex(int height, uint256 const & txid); - void WriteUndo(int height, CMnTxsUndo const & undo); void EraseUndo(int height); -// void WriteTeam(int blockHeight, CTeam const & team); - public: bool Load() override; bool Flush() override; From 323e7ea91f98e4564e63192277dea9a3467a974c Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Thu, 17 Oct 2019 16:40:38 +0700 Subject: [PATCH 07/19] save blockHeader information to DB --- src/masternodes/masternodes.h | 5 +++ src/masternodes/mn_txdb.cpp | 84 +++++++++++++++++++++++++++++++++++ src/masternodes/mn_txdb.h | 9 ++++ src/validation.cpp | 21 +++++++++ 4 files changed, 119 insertions(+) diff --git a/src/masternodes/masternodes.h b/src/masternodes/masternodes.h index aac3fb077c..9dce223235 100644 --- a/src/masternodes/masternodes.h +++ b/src/masternodes/masternodes.h @@ -19,6 +19,7 @@ #include class CTransaction; +class CBlockHeader; static const std::vector MnTxMarker = {'M', 'n', 'T', 'x'}; // 4d6e5478 @@ -200,6 +201,10 @@ class CMasternodesView virtual CMasternode const * ExistMasternode(uint256 const & id) const; + virtual void WriteMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash, CBlockHeader const & blockHeader) { assert(false); } + virtual bool FindMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, std::map & blockHeaders) { assert(false); } + virtual void EraseMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash) { assert(false); } + bool CanSpend(uint256 const & nodeId, int height) const; bool IsAnchorInvolved(uint256 const & nodeId, int height) const; diff --git a/src/masternodes/mn_txdb.cpp b/src/masternodes/mn_txdb.cpp index 04345de8f8..8e39005123 100644 --- a/src/masternodes/mn_txdb.cpp +++ b/src/masternodes/mn_txdb.cpp @@ -19,6 +19,38 @@ static const char DB_MASTERNODESUNDO = 'U'; // undo table static const char DB_MN_HEIGHT = 'H'; // single record with last processed chain height static const char DB_PRUNE_HEIGHT = 'P'; // single record with pruned height (for validation of reachable data window) +static const char DB_MN_BLOCK_HEADERS = 'h'; + +struct DBMNBlockHeadersSearchKey { + uint256 masternodeID; + uint64_t mintedBlocks; + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) + { + READWRITE(masternodeID); + READWRITE(mintedBlocks); + } +}; + +struct DBMNBlockHeadersKey { + char prefix; + DBMNBlockHeadersSearchKey searchKey; + uint256 blockHash; + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) + { + READWRITE(prefix); + READWRITE(searchKey); + READWRITE(blockHash); + } +}; + CMasternodesViewDB::CMasternodesViewDB(size_t nCacheSize, bool fMemory, bool fWipe) : db(new CDBWrapper(GetDataDir() / "masternodes", nCacheSize, fMemory, fWipe)) { @@ -64,6 +96,58 @@ void CMasternodesViewDB::EraseMasternode(uint256 const & txid) BatchErase(make_pair(DB_MASTERNODES, txid)); } +void CMasternodesViewDB::WriteMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash, CBlockHeader const & blockHeader) +{ + BatchWrite(DBMNBlockHeadersKey{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}, hash}, blockHeader); +} + +bool CMasternodesViewDB::FindMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, std::map & blockHeaders) +{ + if (blockHeaders.size() != 0) { + blockHeaders.clear(); + } + + pair prefix{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}}; + boost::scoped_ptr pcursor(const_cast(&*db)->NewIterator()); + pcursor->Seek(prefix); + + while (pcursor->Valid()) + { + boost::this_thread::interruption_point(); + DBMNBlockHeadersKey key; + if (pcursor->GetKey(key) && + key.prefix == DB_MN_BLOCK_HEADERS && + key.searchKey.masternodeID == txid && + key.searchKey.mintedBlocks == mintedBlocks) { + CBlockHeader blockHeader; + if (pcursor->GetValue(blockHeader)) { + blockHeaders.emplace(key.blockHash, std::move(blockHeader)); + } else { + return error("MNDB::FoundMintedBlockHeader() : unable to read value"); + } + } else { + break; + } + pcursor->Next(); + } + return true; +} + +void CMasternodesViewDB::EraseMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash) +{ + BatchErase(DBMNBlockHeadersKey{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}, hash}); +} + +//void CMasternodesViewDB::WriteDeadIndex(int height, uint256 const & txid, char type) +//{ +// BatchWrite(make_pair(make_pair(DB_PRUNEDEAD, static_cast(height)), txid), type); +//} + +//void CMasternodesViewDB::EraseDeadIndex(int height, uint256 const & txid) +//{ +// BatchErase(make_pair(make_pair(DB_PRUNEDEAD, static_cast(height)), txid)); +//} + void CMasternodesViewDB::WriteUndo(int height, CMnTxsUndo const & undo) { BatchWrite(make_pair(DB_MASTERNODESUNDO, static_cast(height)), undo); diff --git a/src/masternodes/mn_txdb.h b/src/masternodes/mn_txdb.h index 04d358de40..3d2851a575 100644 --- a/src/masternodes/mn_txdb.h +++ b/src/masternodes/mn_txdb.h @@ -17,6 +17,8 @@ #include #include +class CBlockHeader; + /** Access to the masternodes database (masternodes/) */ class CMasternodesViewDB : public CMasternodesView { @@ -93,6 +95,13 @@ class CMasternodesViewDB : public CMasternodesView void WriteMasternode(uint256 const & txid, CMasternode const & node); void EraseMasternode(uint256 const & txid); + void WriteMintedBlockHeader(uint256 const & txid, uint64_t mintedBlocks, uint256 const & hash, CBlockHeader const & blockHeader); + bool FindMintedBlockHeader(uint256 const & txid, uint64_t mintedBlocks, std::map & blockHeaders); + void EraseMintedBlockHeader(uint256 const & txid, uint64_t mintedBlocks, uint256 const & hash); + +// void WriteDeadIndex(int height, uint256 const & txid, char type); +// void EraseDeadIndex(int height, uint256 const & txid); + void WriteUndo(int height, CMnTxsUndo const & undo); void EraseUndo(int height); diff --git a/src/validation.cpp b/src/validation.cpp index 80e3f0ed31..5e2d5b89d6 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3383,6 +3383,27 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, CValidationState if (!fIsFakeNet && !pos::ContextualCheckProofOfStake(block, chainparams.GetConsensus(), pmasternodesview.get())) { return state.Invalid(ValidationInvalidReason::BLOCK_INVALID_HEADER, error("%s: Consensus::ContextualCheckProofOfStake: block %s: bad-pos-header (MN not exist or can't stake)", __func__, hash.ToString()), REJECT_INVALID, "bad-pos-header"); } + + // Add MintedBlockHeader entity to DB + CKeyID mintersKey; + if (!block.ExtractMinterKey(mintersKey)) { + return state.Invalid(ValidationInvalidReason::BLOCK_INVALID_HEADER, error("%s: block %s: minters key for external blockHeader not found", __func__, hash.ToString()), REJECT_INVALID, "bad-pos-header"); + } + auto it = pmasternodesview->ExistMasternode(CMasternodesView::AuthIndex::ByOperator, mintersKey); + if (!it) { + return state.Invalid(ValidationInvalidReason::BLOCK_INVALID_HEADER, error("%s: block %s: active masternode for external blockHeader not found", __func__, hash.ToString()), REJECT_INVALID, " "); + } + auto const & nodeId = (*it)->second; + + std::map blockHeaders{}; + + pmasternodesview->FindMintedBlockHeader(nodeId, block.mintedBlocks, blockHeaders); + + auto existingBlockHeader = blockHeaders.find(hash); + if (existingBlockHeader == blockHeaders.end()) { + pmasternodesview->WriteMintedBlockHeader(nodeId, block.mintedBlocks, hash, block); + } + // Get prev block index CBlockIndex* pindexPrev = nullptr; BlockMap::iterator mi = m_block_index.find(block.hashPrevBlock); From faa5c5016d5977a93f17307b322a495b3415eb6e Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Thu, 17 Oct 2019 19:10:37 +0700 Subject: [PATCH 08/19] add check doublesign proof --- src/masternodes/masternodes.cpp | 19 +++++++++++++++++++ src/masternodes/masternodes.h | 20 ++++++++++++++++++++ src/validation.cpp | 6 ++++++ 3 files changed, 45 insertions(+) diff --git a/src/masternodes/masternodes.cpp b/src/masternodes/masternodes.cpp index 6ef3d25264..12c05eea8c 100644 --- a/src/masternodes/masternodes.cpp +++ b/src/masternodes/masternodes.cpp @@ -323,6 +323,25 @@ void CMasternodesView::PruneOlder(int height) // blocksUndo.erase(blocksUndo.begin(), blocksUndo.lower_bound(height)); } +bool CMasternodesView::CheckDoubleSignProof(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader) +{ + if (fabs(oneHeader.height - twoHeader.height) <= DOUBLE_SIGN_MINIMUM_PROOF_INTERVAL && + oneHeader.GetHash() != twoHeader.GetHash()) { + return false; + } + return true; +} + +void CMasternodesView::MarkMasternodeAsCriminals(uint256 const & id, CBlockHeader const & blockHeader, CBlockHeader const & conflictBlockHeader) +{ + criminals.emplace(std::make_pair(id, std::make_pair(blockHeader, conflictBlockHeader))); +} + +CMasternodesView::CMnCriminals::iterator CMasternodesView::RemoveMasternodeFromCriminals(CMnCriminals::iterator it) +{ + return criminals.erase(it); +} + boost::optional CMasternodesView::AmI(AuthIndex where) const { std::string addressBase58 = (where == AuthIndex::ByOperator) ? gArgs.GetArg("-masternode_operator", "") : gArgs.GetArg("-masternode_owner", ""); diff --git a/src/masternodes/masternodes.h b/src/masternodes/masternodes.h index 9dce223235..f20a1ef252 100644 --- a/src/masternodes/masternodes.h +++ b/src/masternodes/masternodes.h @@ -23,6 +23,9 @@ class CBlockHeader; static const std::vector MnTxMarker = {'M', 'n', 'T', 'x'}; // 4d6e5478 +static const unsigned int DOUBLE_SIGN_MINIMUM_PROOF_INTERVAL = 100; + + enum class MasternodesTxType : unsigned char { None = 0, @@ -129,6 +132,8 @@ class CMasternodesView }; typedef std::map > CMnTxsUndo; // txn, undoRec typedef std::map CMnBlocksUndo; + typedef std::map> CMnCriminals; +// typedef std::map CTeams; enum class AuthIndex { ByOwner, ByOperator }; @@ -138,6 +143,8 @@ class CMasternodesView CMasternodesByAuth nodesByOwner; CMasternodesByAuth nodesByOperator; + CMnCriminals criminals; + CMnBlocksUndo blocksUndo; CMasternodesView() : lastHeight(0) {} @@ -192,6 +199,11 @@ class CMasternodesView return allNodes; } + virtual CMnCriminals GetCriminals() const + { + return criminals; + } + //! Initial load of all data virtual bool Load() { assert(false); } virtual bool Flush() { assert(false); } @@ -214,6 +226,14 @@ class CMasternodesView void PruneOlder(int height); +// bool IsTeamMember(int height, CKeyID const & operatorAuth) const; +// CTeam CalcNextDposTeam(CActiveMasternodes const & activeNodes, CMasternodes const & allNodes, uint256 const & blockHash, int height); +// virtual CTeam const & ReadDposTeam(int height) const; + + bool CheckDoubleSignProof(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader); + void MarkMasternodeAsCriminals(uint256 const & id, CBlockHeader const & blockHeader, CBlockHeader const & conflictBlockHeader); + CMasternodesView::CMnCriminals::iterator RemoveMasternodeFromCriminals(CMnCriminals::iterator it); + protected: virtual CMnBlocksUndo::mapped_type const & GetBlockUndo(CMnBlocksUndo::key_type key) const; diff --git a/src/validation.cpp b/src/validation.cpp index 5e2d5b89d6..5d9d2af866 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3404,6 +3404,12 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, CValidationState pmasternodesview->WriteMintedBlockHeader(nodeId, block.mintedBlocks, hash, block); } + for (std::pair blockHeader : blockHeaders) { + if(!pmasternodesview->CheckDoubleSignProof(block, blockHeader.second)) { + pmasternodesview->MarkMasternodeAsCriminals(blockHeader.first, block, blockHeader.second); + } + } + // Get prev block index CBlockIndex* pindexPrev = nullptr; BlockMap::iterator mi = m_block_index.find(block.hashPrevBlock); From 9ba5976bd77cb5e1fc3492448a5aa59775c597a1 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Mon, 21 Oct 2019 17:37:21 +0700 Subject: [PATCH 09/19] add punishment transaction for doublesign --- src/masternodes/masternodes.cpp | 21 +++++++++++++++++++++ src/masternodes/masternodes.h | 1 + src/miner.cpp | 31 ++++++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/masternodes/masternodes.cpp b/src/masternodes/masternodes.cpp index 12c05eea8c..764201be28 100644 --- a/src/masternodes/masternodes.cpp +++ b/src/masternodes/masternodes.cpp @@ -325,7 +325,28 @@ void CMasternodesView::PruneOlder(int height) bool CMasternodesView::CheckDoubleSignProof(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader) { + CKeyID firstKey, secondKey; + if (!oneHeader.ExtractMinterKey(firstKey)) { + // TODO: (ss) may be throw exception + return false; + } + auto itFirstMN = ExistMasternode(AuthIndex::ByOperator, firstKey); + if (!itFirstMN) { + // TODO: (ss) may be throw exception + return false; + } + if (!twoHeader.ExtractMinterKey(secondKey)) { + // TODO: (ss) may be throw exception + return false; + } + auto itSecondMN = ExistMasternode(AuthIndex::ByOperator, firstKey); + if (!itSecondMN) { + // TODO: (ss) may be throw exception + return false; + } + if (fabs(oneHeader.height - twoHeader.height) <= DOUBLE_SIGN_MINIMUM_PROOF_INTERVAL && + itFirstMN == itSecondMN && oneHeader.GetHash() != twoHeader.GetHash()) { return false; } diff --git a/src/masternodes/masternodes.h b/src/masternodes/masternodes.h index f20a1ef252..907fee3f8c 100644 --- a/src/masternodes/masternodes.h +++ b/src/masternodes/masternodes.h @@ -22,6 +22,7 @@ class CTransaction; class CBlockHeader; static const std::vector MnTxMarker = {'M', 'n', 'T', 'x'}; // 4d6e5478 +static const std::vector MnCriminalTxMarker = {'M', 'n', 'C', 'r'}; static const unsigned int DOUBLE_SIGN_MINIMUM_PROOF_INTERVAL = 100; diff --git a/src/miner.cpp b/src/miner.cpp index 258bff93f9..c22b681b81 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -152,7 +152,32 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc coinbaseTx.vout.resize(1); coinbaseTx.vout[0].scriptPubKey = scriptPubKeyIn; coinbaseTx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus()); - coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0; + + bool baseScript = true; + + if (pmasternodesview->GetCriminals().size() != 0) { + CMasternodesView::CMnCriminals criminals = pmasternodesview->GetCriminals(); + CMasternodesView::CMnCriminals::iterator itCriminalMN = criminals.begin(); + std::pair criminal = itCriminalMN->second; + assert(!pmasternodesview->CheckDoubleSignProof(criminal.first, criminal.second)); + CKeyID key; + if (criminal.first.ExtractMinterKey(key)) { + auto itFirstMN = pmasternodesview->ExistMasternode(CMasternodesView::AuthIndex::ByOperator, key); + if (itFirstMN) { + CDataStream metadata(MnCriminalTxMarker, SER_NETWORK, PROTOCOL_VERSION); + metadata << criminal.first.GetHash() << criminal.second.GetHash() << (*itFirstMN)->second << 0; // 0 - number output for blocking + coinbaseTx.vin[0].scriptSig = CScript() << OP_RETURN << ToByteVector(metadata); + + baseScript = false; + } + } + } + + if (baseScript) { + coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0; + } + + pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx)); pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus()); pblocktemplate->vTxFees[0] = -nFees; @@ -173,6 +198,10 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc } int64_t nTime2 = GetTimeMicros(); + if (pmasternodesview->GetCriminals().size() != 0) { + pmasternodesview->RemoveMasternodeFromCriminals(pmasternodesview->GetCriminals().begin()); + } + LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n", 0.001 * (nTime1 - nTimeStart), nPackagesSelected, nDescendantsUpdated, 0.001 * (nTime2 - nTime1), 0.001 * (nTime2 - nTimeStart)); return std::move(pblocktemplate); From 96e3b10b9dcda795ec5e1531713835eb90cebc45 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Wed, 23 Oct 2019 11:01:18 +0700 Subject: [PATCH 10/19] add parsing punishment transactions --- src/masternodes/masternodes.cpp | 42 ++++++++++++++++++++++++- src/masternodes/masternodes.h | 14 ++++++--- src/masternodes/mn_txdb.cpp | 54 +++++++++++++++++++++++++++++++-- src/masternodes/mn_txdb.h | 4 +++ src/miner.cpp | 4 +-- src/validation.cpp | 7 ++++- 6 files changed, 115 insertions(+), 10 deletions(-) diff --git a/src/masternodes/masternodes.cpp b/src/masternodes/masternodes.cpp index 764201be28..8ce4167bec 100644 --- a/src/masternodes/masternodes.cpp +++ b/src/masternodes/masternodes.cpp @@ -323,7 +323,7 @@ void CMasternodesView::PruneOlder(int height) // blocksUndo.erase(blocksUndo.begin(), blocksUndo.lower_bound(height)); } -bool CMasternodesView::CheckDoubleSignProof(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader) +bool CMasternodesView::CheckDoubleSign(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader) { CKeyID firstKey, secondKey; if (!oneHeader.ExtractMinterKey(firstKey)) { @@ -363,6 +363,46 @@ CMasternodesView::CMnCriminals::iterator CMasternodesView::RemoveMasternodeFromC return criminals.erase(it); } +void CMasternodesView::BlockedCriminalMnCoins(std::vector & metadata) +{ + CDataStream ss(metadata, SER_NETWORK, PROTOCOL_VERSION); + std::pair criminal; + uint256 txid; + uint32_t index; + ss >> criminal.first >> criminal.second >> txid >> index; + + if (!CheckDoubleSign(criminal.first, criminal.second)) { + if (!FindBlockedCriminalCoins(txid, index)) { + WriteBlockedCriminalCoins(txid, index); + } + + // TODO: (SS) may be need add blockheaders to DB ? + } +} + +bool CMasternodesView::ExtractCriminalCoinsFromTx(CTransaction const & tx, std::vector & metadata) +{ + if (tx.vout.size() == 0) { + return false; + } + CScript const & memo = tx.vout[0].scriptPubKey; + CScript::const_iterator pc = memo.begin(); + opcodetype opcode; + if (!memo.GetOp(pc, opcode) || opcode != OP_RETURN) { + return false; + } + if (!memo.GetOp(pc, opcode, metadata) || + (opcode > OP_PUSHDATA1 && + opcode != OP_PUSHDATA2 && + opcode != OP_PUSHDATA4) || + metadata.size() < MnCriminalTxMarker.size() + 1 || + memcmp(&metadata[0], &MnCriminalTxMarker[0], MnCriminalTxMarker.size()) != 0) { + return false; + } + metadata.erase(metadata.begin(), metadata.begin() + MnCriminalTxMarker.size() + 1); + return true; +} + boost::optional CMasternodesView::AmI(AuthIndex where) const { std::string addressBase58 = (where == AuthIndex::ByOperator) ? gArgs.GetArg("-masternode_operator", "") : gArgs.GetArg("-masternode_owner", ""); diff --git a/src/masternodes/masternodes.h b/src/masternodes/masternodes.h index 907fee3f8c..9edb88cfec 100644 --- a/src/masternodes/masternodes.h +++ b/src/masternodes/masternodes.h @@ -214,9 +214,13 @@ class CMasternodesView virtual CMasternode const * ExistMasternode(uint256 const & id) const; - virtual void WriteMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash, CBlockHeader const & blockHeader) { assert(false); } - virtual bool FindMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, std::map & blockHeaders) { assert(false); } - virtual void EraseMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash) { assert(false); } + virtual void WriteMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash, CBlockHeader const & blockHeader) { assert(false); } + virtual bool FindMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, std::map & blockHeaders) { assert(false); } + virtual void EraseMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash) { assert(false); } + + virtual void WriteBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) { assert(false); } + virtual bool FindBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) { assert(false); } + virtual void EraseBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) { assert(false); } bool CanSpend(uint256 const & nodeId, int height) const; bool IsAnchorInvolved(uint256 const & nodeId, int height) const; @@ -231,9 +235,11 @@ class CMasternodesView // CTeam CalcNextDposTeam(CActiveMasternodes const & activeNodes, CMasternodes const & allNodes, uint256 const & blockHash, int height); // virtual CTeam const & ReadDposTeam(int height) const; - bool CheckDoubleSignProof(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader); + bool CheckDoubleSign(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader); void MarkMasternodeAsCriminals(uint256 const & id, CBlockHeader const & blockHeader, CBlockHeader const & conflictBlockHeader); CMasternodesView::CMnCriminals::iterator RemoveMasternodeFromCriminals(CMnCriminals::iterator it); + void BlockedCriminalMnCoins(std::vector & metadata); + static bool ExtractCriminalCoinsFromTx(CTransaction const & tx, std::vector & metadata); protected: virtual CMnBlocksUndo::mapped_type const & GetBlockUndo(CMnBlocksUndo::key_type key) const; diff --git a/src/masternodes/mn_txdb.cpp b/src/masternodes/mn_txdb.cpp index 8e39005123..f256949dd4 100644 --- a/src/masternodes/mn_txdb.cpp +++ b/src/masternodes/mn_txdb.cpp @@ -20,8 +20,10 @@ static const char DB_MN_HEIGHT = 'H'; // single record with last processed static const char DB_PRUNE_HEIGHT = 'P'; // single record with pruned height (for validation of reachable data window) static const char DB_MN_BLOCK_HEADERS = 'h'; +static const char DB_MN_BLOCKED_CRIMINAL_COINS = 'C'; -struct DBMNBlockHeadersSearchKey { +struct DBMNBlockHeadersSearchKey +{ uint256 masternodeID; uint64_t mintedBlocks; @@ -35,7 +37,8 @@ struct DBMNBlockHeadersSearchKey { } }; -struct DBMNBlockHeadersKey { +struct DBMNBlockHeadersKey +{ char prefix; DBMNBlockHeadersSearchKey searchKey; uint256 blockHash; @@ -51,6 +54,23 @@ struct DBMNBlockHeadersKey { } }; +struct DBMNBlockedCriminalCoins +{ + char prefix; + uint256 txid; + uint32_t index; + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) + { + READWRITE(prefix); + READWRITE(txid); + READWRITE(index); + } +}; + CMasternodesViewDB::CMasternodesViewDB(size_t nCacheSize, bool fMemory, bool fWipe) : db(new CDBWrapper(GetDataDir() / "masternodes", nCacheSize, fMemory, fWipe)) { @@ -138,6 +158,36 @@ void CMasternodesViewDB::EraseMintedBlockHeader(uint256 const & txid, uint64_t c BatchErase(DBMNBlockHeadersKey{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}, hash}); } +void CMasternodesViewDB::WriteBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) +{ + BatchWrite(DBMNBlockedCriminalCoins{DB_MN_BLOCKED_CRIMINAL_COINS, txid, index}, true); +} + +bool CMasternodesViewDB::FindBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) +{ + DBMNBlockedCriminalCoins prefix{DB_MN_BLOCKED_CRIMINAL_COINS, txid, index}; + boost::scoped_ptr pcursor(const_cast(&*db)->NewIterator()); + pcursor->Seek(prefix); + + if (pcursor->Valid()){ + DBMNBlockedCriminalCoins key; + if (pcursor->GetKey(key)) { + bool active; + if (pcursor->GetValue(active)) { + return active; + } else { + return error("MNDB::FindBlockedCriminalCoins() : unable to read value"); + } + } + } + return false; +} + +void CMasternodesViewDB::EraseBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) +{ + BatchErase(DBMNBlockedCriminalCoins{DB_MN_BLOCKED_CRIMINAL_COINS, txid}); +} + //void CMasternodesViewDB::WriteDeadIndex(int height, uint256 const & txid, char type) //{ // BatchWrite(make_pair(make_pair(DB_PRUNEDEAD, static_cast(height)), txid), type); diff --git a/src/masternodes/mn_txdb.h b/src/masternodes/mn_txdb.h index 3d2851a575..8f65eda408 100644 --- a/src/masternodes/mn_txdb.h +++ b/src/masternodes/mn_txdb.h @@ -99,6 +99,10 @@ class CMasternodesViewDB : public CMasternodesView bool FindMintedBlockHeader(uint256 const & txid, uint64_t mintedBlocks, std::map & blockHeaders); void EraseMintedBlockHeader(uint256 const & txid, uint64_t mintedBlocks, uint256 const & hash); + void WriteBlockedCriminalCoins(uint256 const & txid, uint32_t const & index); + bool FindBlockedCriminalCoins(uint256 const & txid, uint32_t const & index); + void EraseBlockedCriminalCoins(uint256 const & txid, uint32_t const & index); + // void WriteDeadIndex(int height, uint256 const & txid, char type); // void EraseDeadIndex(int height, uint256 const & txid); diff --git a/src/miner.cpp b/src/miner.cpp index c22b681b81..1d0b83188f 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -159,13 +159,13 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc CMasternodesView::CMnCriminals criminals = pmasternodesview->GetCriminals(); CMasternodesView::CMnCriminals::iterator itCriminalMN = criminals.begin(); std::pair criminal = itCriminalMN->second; - assert(!pmasternodesview->CheckDoubleSignProof(criminal.first, criminal.second)); + assert(!pmasternodesview->CheckDoubleSign(criminal.first, criminal.second)); CKeyID key; if (criminal.first.ExtractMinterKey(key)) { auto itFirstMN = pmasternodesview->ExistMasternode(CMasternodesView::AuthIndex::ByOperator, key); if (itFirstMN) { CDataStream metadata(MnCriminalTxMarker, SER_NETWORK, PROTOCOL_VERSION); - metadata << criminal.first.GetHash() << criminal.second.GetHash() << (*itFirstMN)->second << 0; // 0 - number output for blocking + metadata << criminal.first << criminal.second << (*itFirstMN)->second << 0; // 0 - number output for blocking coinbaseTx.vin[0].scriptSig = CScript() << OP_RETURN << ToByteVector(metadata); baseScript = false; diff --git a/src/validation.cpp b/src/validation.cpp index 5d9d2af866..995e6a5346 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2021,6 +2021,11 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl CheckMasternodeTx(mnview, tx, chainparams.GetConsensus(), pindex->nHeight, i, fJustCheck); control.Add(vChecks); + } else { + std::vector metadata; + if (tx.vout.size() > 0 && CMasternodesView::ExtractCriminalCoinsFromTx(tx, metadata)) { + pmasternodesview->BlockedCriminalMnCoins(metadata); + } } CTxUndo undoDummy; @@ -3405,7 +3410,7 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, CValidationState } for (std::pair blockHeader : blockHeaders) { - if(!pmasternodesview->CheckDoubleSignProof(block, blockHeader.second)) { + if(!pmasternodesview->CheckDoubleSign(block, blockHeader.second)) { pmasternodesview->MarkMasternodeAsCriminals(blockHeader.first, block, blockHeader.second); } } From 53d638f5eb635e25a065c1b976134617e9105119 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Wed, 23 Oct 2019 12:18:50 +0700 Subject: [PATCH 11/19] remove criminal coins from wallet --- src/consensus/tx_verify.cpp | 5 +++++ src/interfaces/chain.cpp | 6 ++++++ src/interfaces/chain.h | 1 + src/wallet/wallet.cpp | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/src/consensus/tx_verify.cpp b/src/consensus/tx_verify.cpp index 3537f791e7..4e4908c77c 100644 --- a/src/consensus/tx_verify.cpp +++ b/src/consensus/tx_verify.cpp @@ -188,6 +188,11 @@ bool Consensus::CheckTxInputs(const CTransaction& tx, CValidationState& state, c return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "mn-collateral-locked", strprintf("tried to spend locked collateral for %s", prevout.hash.ToString())); /// @todo @max may be somehow place the height of unlocking? } + + if (pmasternodesview->FindBlockedCriminalCoins(prevout.hash, prevout.n)) { + return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "mn-using-criminal-coins", + strprintf("tried to spend criminal coins for %s", prevout.hash.ToString())); + } } const CAmount value_out = tx.GetValueOut(); diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp index d00d0782d3..180c88df14 100644 --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -277,6 +277,12 @@ class ChainImpl : public Chain return pmasternodesview->CanSpend(nodeId, height); } + bool mnFindBlockedCriminalCoins(const uint256 & txid, int index) const override + { + LOCK(cs_main); + return pmasternodesview->FindBlockedCriminalCoins(txid, index); + } + CMasternode const * mnExists(const uint256 & nodeId) const override { LOCK(cs_main); diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h index e2d3a68ed2..9089e5d853 100644 --- a/src/interfaces/chain.h +++ b/src/interfaces/chain.h @@ -147,6 +147,7 @@ class Chain virtual void findCoins(std::map& coins) = 0; virtual bool mnCanSpend(const uint256 & nodeId, int height) const = 0; + virtual bool mnFindBlockedCriminalCoins(const uint256 & txid, int index) const = 0; virtual CMasternode const * mnExists(const uint256 & nodeId) const = 0; //! Estimate fraction of total transactions verified if blocks up to diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index f361d06699..a2a523730d 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2266,6 +2266,10 @@ CAmount CWalletTx::GetAvailableCredit(interfaces::Chain::Lock& locked_chain, boo continue; } + if (pwallet->chain().mnFindBlockedCriminalCoins(hashTx ,i)) { + continue; + } + if (!pwallet->IsSpent(locked_chain, hashTx, i) && (allow_used_addresses || !pwallet->IsUsedDestination(hashTx, i))) { const CTxOut &txout = tx->vout[i]; nCredit += pwallet->GetCredit(txout, filter); @@ -2555,6 +2559,10 @@ void CWallet::AvailableCoins(interfaces::Chain::Lock& locked_chain, std::vector< continue; } + if (chain().mnFindBlockedCriminalCoins(wtxid ,i)) { + continue; + } + if (i == 1 && lockedCollateral) { continue; } From b6e754b89416904d25d9550699bd43380b82727c Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Fri, 25 Oct 2019 17:53:38 +0700 Subject: [PATCH 12/19] add double sign tests --- src/Makefile.test.include | 1 + src/consensus/tx_check.cpp | 2 +- src/masternodes/masternodes.cpp | 22 +++-- src/masternodes/masternodes.h | 2 +- src/masternodes/mn_txdb.cpp | 10 +-- src/miner.cpp | 2 +- src/test/double_sign.cpp | 143 ++++++++++++++++++++++++++++++++ src/validation.cpp | 6 +- 8 files changed, 170 insertions(+), 18 deletions(-) create mode 100644 src/test/double_sign.cpp diff --git a/src/Makefile.test.include b/src/Makefile.test.include index d3fe138133..dc67aff528 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -116,6 +116,7 @@ BITCOIN_TESTS =\ test/merkle_tests.cpp \ test/merkleblock_tests.cpp \ test/miner_tests.cpp \ + test/double_sign.cpp \ test/multisig_tests.cpp \ test/net_tests.cpp \ test/netbase_tests.cpp \ diff --git a/src/consensus/tx_check.cpp b/src/consensus/tx_check.cpp index 23ed3ecb53..32f5505276 100644 --- a/src/consensus/tx_check.cpp +++ b/src/consensus/tx_check.cpp @@ -43,7 +43,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, bool fChe if (tx.IsCoinBase()) { - if (tx.vin[0].scriptSig.size() < 2 || tx.vin[0].scriptSig.size() > 100) + if (tx.vin[0].scriptSig.size() < 2) // || tx.vin[0].scriptSig.size() > 100 // TODO: (ss) ! return state.Invalid(ValidationInvalidReason::CONSENSUS, false, REJECT_INVALID, "bad-cb-length"); } else diff --git a/src/masternodes/masternodes.cpp b/src/masternodes/masternodes.cpp index 8ce4167bec..b4eb1b0558 100644 --- a/src/masternodes/masternodes.cpp +++ b/src/masternodes/masternodes.cpp @@ -345,9 +345,14 @@ bool CMasternodesView::CheckDoubleSign(CBlockHeader const & oneHeader, CBlockHea return false; } - if (fabs(oneHeader.height - twoHeader.height) <= DOUBLE_SIGN_MINIMUM_PROOF_INTERVAL && + uint64_t maxHeight = oneHeader.height > twoHeader.height? oneHeader.height : twoHeader.height; + uint64_t minHeight = oneHeader.height > twoHeader.height? twoHeader.height : oneHeader.height; + + if ((maxHeight - minHeight) <= DOUBLE_SIGN_MINIMUM_PROOF_INTERVAL && itFirstMN == itSecondMN && - oneHeader.GetHash() != twoHeader.GetHash()) { + oneHeader.mintedBlocks == twoHeader.mintedBlocks && + oneHeader.GetHash() != twoHeader.GetHash() + ) { return false; } return true; @@ -358,9 +363,12 @@ void CMasternodesView::MarkMasternodeAsCriminals(uint256 const & id, CBlockHeade criminals.emplace(std::make_pair(id, std::make_pair(blockHeader, conflictBlockHeader))); } -CMasternodesView::CMnCriminals::iterator CMasternodesView::RemoveMasternodeFromCriminals(CMnCriminals::iterator it) +void CMasternodesView::RemoveMasternodeFromCriminals(uint256 const &criminalID) { - return criminals.erase(it); + auto it = criminals.find(criminalID); + if (it != criminals.end()) { + criminals.erase(it); + } } void CMasternodesView::BlockedCriminalMnCoins(std::vector & metadata) @@ -382,10 +390,10 @@ void CMasternodesView::BlockedCriminalMnCoins(std::vector & metad bool CMasternodesView::ExtractCriminalCoinsFromTx(CTransaction const & tx, std::vector & metadata) { - if (tx.vout.size() == 0) { + if (tx.vin.size() == 0) { return false; } - CScript const & memo = tx.vout[0].scriptPubKey; + CScript const & memo = tx.vin[0].scriptSig; CScript::const_iterator pc = memo.begin(); opcodetype opcode; if (!memo.GetOp(pc, opcode) || opcode != OP_RETURN) { @@ -399,7 +407,7 @@ bool CMasternodesView::ExtractCriminalCoinsFromTx(CTransaction const & tx, std:: memcmp(&metadata[0], &MnCriminalTxMarker[0], MnCriminalTxMarker.size()) != 0) { return false; } - metadata.erase(metadata.begin(), metadata.begin() + MnCriminalTxMarker.size() + 1); + metadata.erase(metadata.begin(), metadata.begin() + MnCriminalTxMarker.size()); return true; } diff --git a/src/masternodes/masternodes.h b/src/masternodes/masternodes.h index 9edb88cfec..d4988d72a6 100644 --- a/src/masternodes/masternodes.h +++ b/src/masternodes/masternodes.h @@ -237,7 +237,7 @@ class CMasternodesView bool CheckDoubleSign(CBlockHeader const & oneHeader, CBlockHeader const & twoHeader); void MarkMasternodeAsCriminals(uint256 const & id, CBlockHeader const & blockHeader, CBlockHeader const & conflictBlockHeader); - CMasternodesView::CMnCriminals::iterator RemoveMasternodeFromCriminals(CMnCriminals::iterator it); + void RemoveMasternodeFromCriminals(uint256 const &criminalID); void BlockedCriminalMnCoins(std::vector & metadata); static bool ExtractCriminalCoinsFromTx(CTransaction const & tx, std::vector & metadata); diff --git a/src/masternodes/mn_txdb.cpp b/src/masternodes/mn_txdb.cpp index f256949dd4..f146a847d8 100644 --- a/src/masternodes/mn_txdb.cpp +++ b/src/masternodes/mn_txdb.cpp @@ -118,7 +118,7 @@ void CMasternodesViewDB::EraseMasternode(uint256 const & txid) void CMasternodesViewDB::WriteMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash, CBlockHeader const & blockHeader) { - BatchWrite(DBMNBlockHeadersKey{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}, hash}, blockHeader); + db->Write(DBMNBlockHeadersKey{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}, hash}, blockHeader); } bool CMasternodesViewDB::FindMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, std::map & blockHeaders) @@ -155,12 +155,12 @@ bool CMasternodesViewDB::FindMintedBlockHeader(uint256 const & txid, uint64_t co void CMasternodesViewDB::EraseMintedBlockHeader(uint256 const & txid, uint64_t const mintedBlocks, uint256 const & hash) { - BatchErase(DBMNBlockHeadersKey{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}, hash}); + db->Erase(DBMNBlockHeadersKey{DB_MN_BLOCK_HEADERS, DBMNBlockHeadersSearchKey{txid, mintedBlocks}, hash}); } void CMasternodesViewDB::WriteBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) { - BatchWrite(DBMNBlockedCriminalCoins{DB_MN_BLOCKED_CRIMINAL_COINS, txid, index}, true); + db->Write(DBMNBlockedCriminalCoins{DB_MN_BLOCKED_CRIMINAL_COINS, txid, index}, true); } bool CMasternodesViewDB::FindBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) @@ -169,7 +169,7 @@ bool CMasternodesViewDB::FindBlockedCriminalCoins(uint256 const & txid, uint32_t boost::scoped_ptr pcursor(const_cast(&*db)->NewIterator()); pcursor->Seek(prefix); - if (pcursor->Valid()){ + if (pcursor->Valid()) { DBMNBlockedCriminalCoins key; if (pcursor->GetKey(key)) { bool active; @@ -185,7 +185,7 @@ bool CMasternodesViewDB::FindBlockedCriminalCoins(uint256 const & txid, uint32_t void CMasternodesViewDB::EraseBlockedCriminalCoins(uint256 const & txid, uint32_t const & index) { - BatchErase(DBMNBlockedCriminalCoins{DB_MN_BLOCKED_CRIMINAL_COINS, txid}); + db->Erase(DBMNBlockedCriminalCoins{DB_MN_BLOCKED_CRIMINAL_COINS, txid}); } //void CMasternodesViewDB::WriteDeadIndex(int height, uint256 const & txid, char type) diff --git a/src/miner.cpp b/src/miner.cpp index 1d0b83188f..ba61818528 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -199,7 +199,7 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc int64_t nTime2 = GetTimeMicros(); if (pmasternodesview->GetCriminals().size() != 0) { - pmasternodesview->RemoveMasternodeFromCriminals(pmasternodesview->GetCriminals().begin()); + pmasternodesview->RemoveMasternodeFromCriminals(pmasternodesview->GetCriminals().begin()->first); } LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated descendants), validity: %.2fms (total %.2fms)\n", 0.001 * (nTime1 - nTimeStart), nPackagesSelected, nDescendantsUpdated, 0.001 * (nTime2 - nTime1), 0.001 * (nTime2 - nTimeStart)); diff --git a/src/test/double_sign.cpp b/src/test/double_sign.cpp new file mode 100644 index 0000000000..cf0f6ad51d --- /dev/null +++ b/src/test/double_sign.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +static const std::vector V_OP_TRUE{OP_TRUE}; + +struct RegtestingSetup : public TestingSetup { + RegtestingSetup() : TestingSetup(CBaseChainParams::REGTEST) {} +}; +BOOST_FIXTURE_TEST_SUITE(double_sign_tests, RegtestingSetup) + +std::shared_ptr Block( const uint256& prev_hash, const uint64_t& height, const uint64_t& mintedBlocks) +{ + CScript pubKey = CScript() << OP_TRUE; + + auto ptemplate = BlockAssembler(Params()).CreateNewBlock(pubKey); + auto pblock = std::make_shared(ptemplate->block); + pblock->hashPrevBlock = prev_hash; + + pblock->mintedBlocks = mintedBlocks; + pblock->height = height; + + return pblock; +} + +std::shared_ptr FinalizeBlock(std::shared_ptr pblock, const uint256& masternodeID, const CKey& minterKey, const uint256& prevStakeModifier) +{ + LOCK(cs_main); // For LookupBlockIndex + static uint64_t time = Params().GenesisBlock().nTime; + + pblock->stakeModifier = pos::ComputeStakeModifier(prevStakeModifier, minterKey.GetPubKey().GetID()); + + GenerateCoinbaseCommitment(*pblock, LookupBlockIndex(pblock->hashPrevBlock), Params().GetConsensus()); + + pblock->hashMerkleRoot = BlockMerkleRoot(*pblock); + + do { + time++; + pblock->nTime = time; + } while (!pos::CheckKernelHash(pblock->stakeModifier, pblock->nBits, (int64_t) pblock->nTime, Params().GetConsensus(), masternodeID).hashOk); + + BOOST_CHECK(!pos::SignPosBlock(pblock, minterKey)); + + return pblock; +} + +std::vector GenerateTwoCriminalsHeaders(CKey const &minterKey, uint64_t const &mintedBlocks, uint256 const &masternodeID) { + uint64_t time = Params().GenesisBlock().nTime; + uint64_t height = 1; + uint256 prevStakeModifier = Params().GenesisBlock().stakeModifier; + + std::shared_ptr blockOne = FinalizeBlock( + Block(Params().GenesisBlock().GetHash(), height, mintedBlocks), + masternodeID, + minterKey, + prevStakeModifier); + std::shared_ptr blockTwo = FinalizeBlock( + Block(Params().GenesisBlock().GetHash(), height + 1, mintedBlocks), + masternodeID, + minterKey, + prevStakeModifier); + + return {blockOne->GetBlockHeader(), blockTwo->GetBlockHeader()}; +} + +BOOST_AUTO_TEST_CASE(check_doublesign) +{ + uint256 masternodeID = testMasternodeKeys.begin()->first; + std::map::const_iterator pos = testMasternodeKeys.find(masternodeID); + BOOST_CHECK(pos != testMasternodeKeys.end()); + CKey minterKey = pos->second.operatorKey; + uint64_t mintedBlocks = 0; + std::vector criminalsBlockHeaders = GenerateTwoCriminalsHeaders(minterKey, mintedBlocks, masternodeID); + + pmasternodesview->WriteMintedBlockHeader(masternodeID, mintedBlocks, criminalsBlockHeaders[0].GetHash(), criminalsBlockHeaders[0]); + pmasternodesview->WriteMintedBlockHeader(masternodeID, mintedBlocks, criminalsBlockHeaders[1].GetHash(), criminalsBlockHeaders[1]); + BOOST_CHECK(!pmasternodesview->CheckDoubleSign(criminalsBlockHeaders[0], criminalsBlockHeaders[1])); + + std::map blockHeaders; + BOOST_CHECK(pmasternodesview->FindMintedBlockHeader(masternodeID, mintedBlocks, blockHeaders)); + BOOST_CHECK(blockHeaders.size() == 2); +} + +BOOST_AUTO_TEST_CASE(check_criminal_entities) +{ + uint256 masternodeID = testMasternodeKeys.begin()->first; + std::map::const_iterator pos = testMasternodeKeys.find(masternodeID); + BOOST_CHECK(pos != testMasternodeKeys.end()); + CKey minterKey = pos->second.operatorKey; + uint64_t mintedBlocks = 0; + std::vector criminalsBlockHeaders = GenerateTwoCriminalsHeaders(minterKey, mintedBlocks, masternodeID); + + CValidationState state; + + BOOST_CHECK(ProcessNewBlockHeaders(criminalsBlockHeaders, state, Params())); + CMasternodesView::CMnCriminals criminals = pmasternodesview->GetCriminals(); + BOOST_CHECK(criminals.size() == 1); + BOOST_CHECK(criminals.begin()->first == masternodeID); + BOOST_CHECK(criminals[masternodeID].first.GetHash() == criminalsBlockHeaders[0].GetHash() || + criminals[masternodeID].first.GetHash() == criminalsBlockHeaders[1].GetHash()); + BOOST_CHECK(criminals[masternodeID].second.GetHash() == criminalsBlockHeaders[0].GetHash() || + criminals[masternodeID].second.GetHash() == criminalsBlockHeaders[1].GetHash()); + BOOST_CHECK(criminals[masternodeID].second.GetHash() != criminals[masternodeID].first.GetHash()); +} + +BOOST_AUTO_TEST_CASE(check_blocking_criminal_coins) +{ + uint256 masternodeID = testMasternodeKeys.begin()->first; + std::map::const_iterator pos = testMasternodeKeys.find(masternodeID); + BOOST_CHECK(pos != testMasternodeKeys.end()); + CKey minterKey = pos->second.operatorKey; + uint64_t mintedBlocks = 0; + std::vector criminalsBlockHeaders = GenerateTwoCriminalsHeaders(minterKey, mintedBlocks, masternodeID); + + CValidationState state; + + BOOST_CHECK(ProcessNewBlockHeaders(criminalsBlockHeaders, state, Params())); + + CScript p2pk = CScript() << ToByteVector(minterKey.GetPubKey()) << OP_CHECKSIG; + CScript scriptSig = GetScriptForWitness(p2pk); + CScript scriptPubKey = GetScriptForDestination(ScriptHash(scriptSig)); + + std::shared_ptr block = FinalizeBlock( + Block(criminalsBlockHeaders[1].GetHash(), 2, ++mintedBlocks), + masternodeID, + minterKey, + criminalsBlockHeaders[1].stakeModifier); + + BOOST_CHECK(ProcessNewBlockHeaders({block->GetBlockHeader()}, state, Params())); + + BOOST_CHECK(pmasternodesview->FindBlockedCriminalCoins(masternodeID, 0)); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/validation.cpp b/src/validation.cpp index 995e6a5346..d520e410dd 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2023,7 +2023,7 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl control.Add(vChecks); } else { std::vector metadata; - if (tx.vout.size() > 0 && CMasternodesView::ExtractCriminalCoinsFromTx(tx, metadata)) { + if (CMasternodesView::ExtractCriminalCoinsFromTx(tx, metadata)) { pmasternodesview->BlockedCriminalMnCoins(metadata); } } @@ -3405,13 +3405,13 @@ bool BlockManager::AcceptBlockHeader(const CBlockHeader& block, CValidationState pmasternodesview->FindMintedBlockHeader(nodeId, block.mintedBlocks, blockHeaders); auto existingBlockHeader = blockHeaders.find(hash); - if (existingBlockHeader == blockHeaders.end()) { + if (!blockHeaders.size() || existingBlockHeader == blockHeaders.end()) { pmasternodesview->WriteMintedBlockHeader(nodeId, block.mintedBlocks, hash, block); } for (std::pair blockHeader : blockHeaders) { if(!pmasternodesview->CheckDoubleSign(block, blockHeader.second)) { - pmasternodesview->MarkMasternodeAsCriminals(blockHeader.first, block, blockHeader.second); + pmasternodesview->MarkMasternodeAsCriminals(nodeId, block, blockHeader.second); } } From e03aa005a4792c252d912d14a2172f734c595a35 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Mon, 28 Oct 2019 09:43:26 +0700 Subject: [PATCH 13/19] fix test naming --- src/test/double_sign.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/double_sign.cpp b/src/test/double_sign.cpp index cf0f6ad51d..ccfab2700f 100644 --- a/src/test/double_sign.cpp +++ b/src/test/double_sign.cpp @@ -16,7 +16,7 @@ static const std::vector V_OP_TRUE{OP_TRUE}; struct RegtestingSetup : public TestingSetup { RegtestingSetup() : TestingSetup(CBaseChainParams::REGTEST) {} }; -BOOST_FIXTURE_TEST_SUITE(double_sign_tests, RegtestingSetup) +BOOST_FIXTURE_TEST_SUITE(double_sign, RegtestingSetup) std::shared_ptr Block( const uint256& prev_hash, const uint64_t& height, const uint64_t& mintedBlocks) { From e158dabbd7d0fa8f717118cfa4bb90607ca4ef10 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Mon, 28 Oct 2019 11:11:36 +0700 Subject: [PATCH 14/19] disable max size coinbase script test --- src/test/data/tx_invalid.json | 4 ++-- src/test/transaction_tests.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/data/tx_invalid.json b/src/test/data/tx_invalid.json index d22175d660..8dc692691e 100644 --- a/src/test/data/tx_invalid.json +++ b/src/test/data/tx_invalid.json @@ -57,8 +57,8 @@ ["Coinbase of size 101"], ["Note the input is just required to make the tester happy"], -[[["0000000000000000000000000000000000000000000000000000000000000000", -1, "1"]], -"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff655151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151ffffffff010000000000000000015100000000", "P2SH"], +["[[[\"0000000000000000000000000000000000000000000000000000000000000000\", -1, \"1\"]],"], +["\"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff655151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151ffffffff010000000000000000015100000000\", \"P2SH\"],"], ["Null txin, but without being a coinbase (because there are two inputs)"], [[["0000000000000000000000000000000000000000000000000000000000000000", -1, "1"], diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 34192c6b6a..0c184d7b09 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -122,8 +122,8 @@ BOOST_AUTO_TEST_CASE(tx_valid) std::map mapprevOutValues; UniValue inputs = test[0].get_array(); bool fValid = true; - for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) { - const UniValue& input = inputs[inpIdx]; + for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) { + const UniValue& input = inputs[inpIdx]; if (!input.isArray()) { fValid = false; @@ -209,8 +209,8 @@ BOOST_AUTO_TEST_CASE(tx_invalid) std::map mapprevOutValues; UniValue inputs = test[0].get_array(); bool fValid = true; - for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) { - const UniValue& input = inputs[inpIdx]; + for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) { + const UniValue& input = inputs[inpIdx]; if (!input.isArray()) { fValid = false; From c53c43bfe60a4a951546b2a5cfc28606454aa018 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Mon, 28 Oct 2019 12:06:10 +0700 Subject: [PATCH 15/19] add block_hash.py to extended tests --- test/functional/test_runner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 981b8de2ab..4c7d3794ea 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -71,6 +71,7 @@ # Longest test should go first, to favor running tests in parallel 'feature_pruning.py', 'feature_dbcrash.py', + 'block_hash.py', ] BASE_SCRIPTS = [ From fe9d640d3507d75a989f323e69b2a0e31c8002b7 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Mon, 28 Oct 2019 12:52:56 +0700 Subject: [PATCH 16/19] rename test --- test/functional/{block_hash.py => example_block_hash.py} | 0 test/functional/test_runner.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename test/functional/{block_hash.py => example_block_hash.py} (100%) diff --git a/test/functional/block_hash.py b/test/functional/example_block_hash.py similarity index 100% rename from test/functional/block_hash.py rename to test/functional/example_block_hash.py diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 4c7d3794ea..d958d13f1a 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -71,7 +71,7 @@ # Longest test should go first, to favor running tests in parallel 'feature_pruning.py', 'feature_dbcrash.py', - 'block_hash.py', + 'example_block_hash.py', ] BASE_SCRIPTS = [ From 973d2389ca2fbf14ae34e68d7321646b158a1e40 Mon Sep 17 00:00:00 2001 From: IntegralTeam V Date: Tue, 29 Oct 2019 10:14:22 +0700 Subject: [PATCH 17/19] enable fakenet for doublesign --- src/consensus/tx_verify.cpp | 3 ++- src/interfaces/chain.cpp | 2 +- src/masternodes/masternodes.cpp | 4 ++-- src/masternodes/masternodes.h | 8 ++++---- src/masternodes/mn_txdb.cpp | 24 ++++++++++++++++++++---- src/masternodes/mn_txdb.h | 8 ++++---- src/test/double_sign.cpp | 8 ++++---- src/validation.cpp | 4 ++-- 8 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/consensus/tx_verify.cpp b/src/consensus/tx_verify.cpp index 4e4908c77c..0b04abf061 100644 --- a/src/consensus/tx_verify.cpp +++ b/src/consensus/tx_verify.cpp @@ -9,6 +9,7 @@ #include #include