From db6030dd397ded69742ac650baa90776e65059bd Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Tue, 6 Oct 2020 10:48:24 +0200 Subject: [PATCH 01/66] Create branch zonemd Add RR Type ZONEMD to RR definitions. --- sldns/rrdef.c | 6 +++++- sldns/rrdef.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sldns/rrdef.c b/sldns/rrdef.c index 0af015f4b..54051313a 100644 --- a/sldns/rrdef.c +++ b/sldns/rrdef.c @@ -150,6 +150,9 @@ static const sldns_rdf_type type_openpgpkey_wireformat[] = { static const sldns_rdf_type type_csync_wireformat[] = { LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC }; +static const sldns_rdf_type type_zonemd_wireformat[] = { + LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX +}; /* nsec3 is some vars, followed by same type of data of nsec */ static const sldns_rdf_type type_nsec3_wireformat[] = { /* LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/ @@ -372,7 +375,8 @@ static sldns_rr_descriptor rdata_field_descriptors[] = { {LDNS_RR_TYPE_OPENPGPKEY, "OPENPGPKEY", 1, 1, type_openpgpkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, /* 62 */ {LDNS_RR_TYPE_CSYNC, "CSYNC", 3, 3, type_csync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{(enum sldns_enum_rr_type)0, "TYPE63", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, + /* 63 */ + {LDNS_RR_TYPE_ZONEMD, "ZONEMD", 4, 4, type_zonemd_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, {(enum sldns_enum_rr_type)0, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, {(enum sldns_enum_rr_type)0, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, {(enum sldns_enum_rr_type)0, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, diff --git a/sldns/rrdef.h b/sldns/rrdef.h index e084f354a..ece632c3c 100644 --- a/sldns/rrdef.h +++ b/sldns/rrdef.h @@ -195,6 +195,7 @@ enum sldns_enum_rr_type LDNS_RR_TYPE_CDNSKEY = 60, /** RFC 7344 */ LDNS_RR_TYPE_OPENPGPKEY = 61, /* RFC 7929 */ LDNS_RR_TYPE_CSYNC = 62, /* RFC 7477 */ + LDNS_RR_TYPE_ZONEMD = 63, /* draft-ietf-dnsop-dns-zone-digest-12 */ LDNS_RR_TYPE_SPF = 99, /* RFC 4408 */ From ca31ea7dc86ebdc59d64e51256ee443fd2f5009f Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Tue, 6 Oct 2020 13:38:21 +0200 Subject: [PATCH 02/66] test rr type parse inputs and print outputs. --- testcode/unitldns.c | 2 +- testdata/test_ldnsrr.5 | 19 +++++++++++++++++++ testdata/test_ldnsrr.c5 | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/testcode/unitldns.c b/testcode/unitldns.c index 22c9ed945..6397f29db 100644 --- a/testcode/unitldns.c +++ b/testcode/unitldns.c @@ -47,7 +47,7 @@ #include "sldns/parseutil.h" /** verbose this unit test */ -static int vbmp = 0; +static int vbmp = 0; /** print buffer to hex into string */ static void diff --git a/testdata/test_ldnsrr.5 b/testdata/test_ldnsrr.5 index d5f4650a7..9be72b4aa 100644 --- a/testdata/test_ldnsrr.5 +++ b/testdata/test_ldnsrr.5 @@ -151,3 +151,22 @@ blabla. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1480585012 300 16 k9mSMs2t5vq5FV2D blabla. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1480523776 300 16 sBfx00GRs+tfRTm4uRCjyQ== 25791 0 0 blabla. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1480585449 300 0 59692 BADSIG 0 blabla. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1480585462 300 16 6wvlG82sEVHyqsTtBLvRQw== 26044 NOERROR 0 + +; Test for ZONEMD +example.org. 86400 IN ZONEMD 5 1 2 c1b8eddf4ef128db88125ede9008d6ff0b33a047b8a8a4d77b00271f7d8e7ae5ccd6c86d8398f64f0de0615bf3121ffba6946a3cd5f32acbc4e8d0649b4a78e6 +; from draft-ietf-dnsop-dns-zone-digest-12#section-2.4 +example.com. 86400 IN ZONEMD 2018031500 1 1 ( FEBE3D4CE2EC2FFA4BA99D46CD69D6D29711E55217057BEE 7EB1A7B641A47BA7FED2DD5B97AE499FAFA4F22C6BD647DE ) +; from draft-ietf-dnsop-dns-zone-digest-12#section-A.1 +example. 86400 IN ZONEMD 2018031900 1 1 ( c68090d90a7aed71 6bc459f9340e3d7c 1370d4d24b7e2fc3 a1ddc0b9a87153b9 a9713b3c9ae5cc27 777f98b8e730044c ) +; from draft-ietf-dnsop-dns-zone-digest-12#section-A.2 +example. 86400 IN ZONEMD 2018031900 1 1 ( 31cefb03814f5062 ad12fa951ba0ef5f 8da6ae354a415767 246f7dc932ceb1e7 42a2108f529db6a3 3a11c01493de358d ) +non-apex.example. 900 IN ZONEMD 2018031900 1 1 ( 616c6c6f77656420 6275742069676e6f 7265642e20616c6c 6f77656420627574 2069676e6f726564 2e20616c6c6f7765 ) +; from draft-ietf-dnsop-dns-zone-digest-12#section-A.3 +example. 86400 IN ZONEMD 2018031900 1 1 ( 62e6cf51b02e54b9 b5f967d547ce4313 6792901f9f88e637 493daaf401c92c27 9dd10f0edb1c56f8 080211f8480ee306 ) +example. 86400 IN ZONEMD 2018031900 1 2 ( 08cfa1115c7b948c 4163a901270395ea 226a930cd2cbcf2f a9a5e6eb85f37c8a 4e114d884e66f176 eab121cb02db7d65 2e0cc4827e7a3204 f166b47e5613fd27 ) +example. 86400 IN ZONEMD 2018031900 1 240 ( e2d523f654b9422a 96c5a8f44607bbee ) +example. 86400 IN ZONEMD 2018031900 241 1 ( e1846540e33a9e41 89792d18d5d131f6 05fc283e ) +; from draft-ietf-dnsop-dns-zone-digest-12#section-A.4 +uri.arpa. 3600 IN ZONEMD 2018100702 1 1 ( 1291b78ddf7669b1a39d014d87626b709b55774c5d7d58fa dc556439889a10eaf6f11d615900a4f996bd46279514e473 ) +; from draft-ietf-dnsop-dns-zone-digest-12#section-A.5 +root-servers.net. 3600000 IN ZONEMD 2018091100 1 1 ( f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a97 8a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79 ) diff --git a/testdata/test_ldnsrr.c5 b/testdata/test_ldnsrr.c5 index 1e292ba64..98c2ed380 100644 --- a/testdata/test_ldnsrr.c5 +++ b/testdata/test_ldnsrr.c5 @@ -188,3 +188,25 @@ blabla. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1480523776 300 16 sBfx00GRs+tfRTm4u blabla. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1480585449 300 0 59692 BADSIG 0 06626C61626C610000FA00FF00000000003A08686D61632D6D6435077369672D616C670372656703696E74000000583FF0F6012C0010EB0BE51BCDAC1151F2AAC4ED04BBD14365BC00000000 blabla. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1480585462 300 16 6wvlG82sEVHyqsTtBLvRQw== 26044 NOERROR 0 +076578616D706C65036F726700003F0001000151800046000000050102C1B8EDDF4EF128DB88125EDE9008D6FF0B33A047B8A8A4D77B00271F7D8E7AE5CCD6C86D8398F64F0DE0615BF3121FFBA6946A3CD5F32ACBC4E8D0649B4A78E6 +example.org. 86400 IN ZONEMD 5 1 2 C1B8EDDF4EF128DB88125EDE9008D6FF0B33A047B8A8A4D77B00271F7D8E7AE5CCD6C86D8398F64F0DE0615BF3121FFBA6946A3CD5F32ACBC4E8D0649B4A78E6 +076578616D706C6503636F6D00003F00010001518000367848B78C0101FEBE3D4CE2EC2FFA4BA99D46CD69D6D29711E55217057BEE7EB1A7B641A47BA7FED2DD5B97AE499FAFA4F22C6BD647DE +example.com. 86400 IN ZONEMD 2018031500 1 1 FEBE3D4CE2EC2FFA4BA99D46CD69D6D29711E55217057BEE7EB1A7B641A47BA7FED2DD5B97AE499FAFA4F22C6BD647DE +076578616D706C6500003F00010001518000367848B91C0101C68090D90A7AED716BC459F9340E3D7C1370D4D24B7E2FC3A1DDC0B9A87153B9A9713B3C9AE5CC27777F98B8E730044C +example. 86400 IN ZONEMD 2018031900 1 1 C68090D90A7AED716BC459F9340E3D7C1370D4D24B7E2FC3A1DDC0B9A87153B9A9713B3C9AE5CC27777F98B8E730044C +076578616D706C6500003F00010001518000367848B91C010131CEFB03814F5062AD12FA951BA0EF5F8DA6AE354A415767246F7DC932CEB1E742A2108F529DB6A33A11C01493DE358D +example. 86400 IN ZONEMD 2018031900 1 1 31CEFB03814F5062AD12FA951BA0EF5F8DA6AE354A415767246F7DC932CEB1E742A2108F529DB6A33A11C01493DE358D +086E6F6E2D61706578076578616D706C6500003F00010000038400367848B91C0101616C6C6F776564206275742069676E6F7265642E20616C6C6F776564206275742069676E6F7265642E20616C6C6F7765 +non-apex.example. 900 IN ZONEMD 2018031900 1 1 616C6C6F776564206275742069676E6F7265642E20616C6C6F776564206275742069676E6F7265642E20616C6C6F7765 +076578616D706C6500003F00010001518000367848B91C010162E6CF51B02E54B9B5F967D547CE43136792901F9F88E637493DAAF401C92C279DD10F0EDB1C56F8080211F8480EE306 +example. 86400 IN ZONEMD 2018031900 1 1 62E6CF51B02E54B9B5F967D547CE43136792901F9F88E637493DAAF401C92C279DD10F0EDB1C56F8080211F8480EE306 +076578616D706C6500003F00010001518000467848B91C010208CFA1115C7B948C4163A901270395EA226A930CD2CBCF2FA9A5E6EB85F37C8A4E114D884E66F176EAB121CB02DB7D652E0CC4827E7A3204F166B47E5613FD27 +example. 86400 IN ZONEMD 2018031900 1 2 08CFA1115C7B948C4163A901270395EA226A930CD2CBCF2FA9A5E6EB85F37C8A4E114D884E66F176EAB121CB02DB7D652E0CC4827E7A3204F166B47E5613FD27 +076578616D706C6500003F00010001518000167848B91C01F0E2D523F654B9422A96C5A8F44607BBEE +example. 86400 IN ZONEMD 2018031900 1 240 E2D523F654B9422A96C5A8F44607BBEE +076578616D706C6500003F000100015180001A7848B91CF101E1846540E33A9E4189792D18D5D131F605FC283E +example. 86400 IN ZONEMD 2018031900 241 1 E1846540E33A9E4189792D18D5D131F605FC283E +03757269046172706100003F000100000E1000367849C5DE01011291B78DDF7669B1A39D014D87626B709B55774C5D7D58FADC556439889A10EAF6F11D615900A4F996BD46279514E473 +uri.arpa. 3600 IN ZONEMD 2018100702 1 1 1291B78DDF7669B1A39D014D87626B709B55774C5D7D58FADC556439889A10EAF6F11D615900A4F996BD46279514E473 +0C726F6F742D73657276657273036E657400003F00010036EE8000367849A05C0101F1CA0CCD91BD5573D9F431C00EE0101B2545C97602BE0A978A3B11DBFC1C776D5B3E86AE3D973D6B5349BA7F04340F79 +root-servers.net. 3600000 IN ZONEMD 2018091100 1 1 F1CA0CCD91BD5573D9F431C00EE0101B2545C97602BE0A978A3B11DBFC1C776D5B3E86AE3D973D6B5349BA7F04340F79 From 3163a93121cae6826484c95db4c2ac8d88d94073 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Tue, 6 Oct 2020 17:07:24 +0200 Subject: [PATCH 03/66] zonemd, loop over zone and canonicalize data, test call in unit test. --- services/authzone.c | 364 ++++++++++++++++++++++++++++++++++ services/authzone.h | 35 ++++ testcode/unitauth.c | 8 +- testcode/unitmain.c | 47 +++++ testdata/zonemd.example1.zone | 4 + validator/val_sigcrypt.c | 53 +++++ validator/val_sigcrypt.h | 12 ++ 7 files changed, 519 insertions(+), 4 deletions(-) create mode 100644 testdata/zonemd.example1.zone diff --git a/services/authzone.c b/services/authzone.c index a26d1003a..b4217bd55 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -68,6 +68,7 @@ #include "sldns/keyraw.h" #include "validator/val_nsec3.h" #include "validator/val_secalgo.h" +#include "validator/val_sigcrypt.h" #include /** bytes to use for NSEC3 hash buffer. 20 for sha1 */ @@ -6965,3 +6966,366 @@ compare_serial(uint32_t a, uint32_t b) return 1; } } + +/** returns true if a zonemd hash algo is supported */ +static int zonemd_hashalgo_supported(int hashalgo) +{ + if(hashalgo == 1) return 1; + if(hashalgo == 2) return 1; + return 0; +} + +/** returns true if a zonemd scheme is supported */ +static int zonemd_scheme_supported(int scheme) +{ + if(scheme == 1) return 1; + return 0; +} + +/** initialize hash for hashing with zonemd hash algo */ +static void* zonemd_digest_init(int hashalgo) +{ + if(hashalgo == 1) { + /* sha384 */ + //return secalgo_digest_start_sha384(); + } else if(hashalgo == 2) { + /* sha512 */ + //return secalgo_digest_start_sha512(); + } + /* unknown hash algo */ + return NULL; +} + +/** add rrsets from node to the list */ +static size_t authdata_rrsets_to_list(struct auth_rrset** array, + size_t arraysize, struct auth_rrset* first) +{ + struct auth_rrset* rrset = first; + size_t num = 0; + while(rrset) { + if(num+1 >= arraysize) + return num; + array[num] = rrset; + num++; + rrset = rrset->next; + } + return num; +} + +/** compare rr list entries */ +static int rrlist_compare(const void* arg1, const void* arg2) +{ + struct auth_rrset* r1 = *(struct auth_rrset**)arg1; + struct auth_rrset* r2 = *(struct auth_rrset**)arg2; + uint16_t t1, t2; + if(r1 == NULL) t1 = LDNS_RR_TYPE_RRSIG; + else t1 = r1->type; + if(r2 == NULL) t2 = LDNS_RR_TYPE_RRSIG; + else t2 = r2->type; + if(t1 < t2) + return -1; + if(t1 > t2) + return 1; + return 0; +} + +/** add type RRSIG to rr list if not one there already, + * this is to perform RRSIG collate processing at that point. */ +static void addrrsigtype_if_needed(struct auth_rrset** array, + size_t arraysize, size_t* rrnum, struct auth_data* node) +{ + if(az_domain_rrset(node, LDNS_RR_TYPE_RRSIG)) + return; /* already one there */ + if((*rrnum)+1 >= arraysize) + return; /* array too small? */ + array[*rrnum] = NULL; /* nothing there, but need entry in list */ + (*rrnum)++; +} + +/** collate the RRs in an RRset using the simple scheme */ +static int zonemd_simple_rrset(struct auth_zone* z, void* hash, + struct auth_data* node, struct auth_rrset* rrset, + struct regional* region, struct sldns_buffer* buf, char** reason) +{ + /* canonicalize */ + struct ub_packed_rrset_key key; + memset(&key, 0, sizeof(key)); + key.entry.key = &key; + key.entry.data = rrset->data; + key.rk.dname = node->name; + key.rk.dname_len = node->namelen; + key.rk.type = htons(rrset->type); + key.rk.rrset_class = htons(z->dclass); + if(!rrset_canonicalize_to_buffer(region, buf, &key)) { + *reason = "out of memory"; + return 0; + } + regional_free_all(region); + + /* hash */ + return 1; +} + +/** count number of RRSIGs in a domain name rrset list */ +static size_t zonemd_simple_count_rrsig(struct auth_rrset* rrset, + struct auth_rrset** rrlist, size_t rrnum, + struct auth_zone* z, struct auth_data* node) +{ + size_t i, count = 0; + if(rrset) { + size_t j; + for(j = 0; jdata->count; j++) { + if(rrsig_rdata_get_type_covered(rrset->data-> + rr_data[j], rrset->data->rr_len[j]) == + LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + count++; + } + } + for(i=0; itype == LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + count += (rrlist[i]?rrlist[i]->data->rrsig_count:0); + } + return count; +} + +/** allocate sparse rrset data for the number of entries in tepm region */ +static int zonemd_simple_rrsig_allocs(struct regional* region, + struct packed_rrset_data* data, size_t count) +{ + data->rr_len = regional_alloc(region, sizeof(*data->rr_len) * count); + if(!data->rr_len) { + return 0; + } + data->rr_ttl = regional_alloc(region, sizeof(*data->rr_ttl) * count); + if(!data->rr_ttl) { + return 0; + } + data->rr_data = regional_alloc(region, sizeof(*data->rr_data) * count); + if(!data->rr_data) { + return 0; + } + return 1; +} + +/** add the RRSIGs from the rrs in the domain into the data */ +static void add_rrlist_rrsigs_into_data(struct packed_rrset_data* data, + size_t* done, struct auth_rrset** rrlist, size_t rrnum, + struct auth_zone* z, struct auth_data* node) +{ + size_t i; + for(i=0; itype == LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + for(j = 0; jdata->rrsig_count; j++) { + data->rr_len[*done] = rrlist[i]->data->rr_len[rrlist[i]->data->count + j]; + data->rr_ttl[*done] = rrlist[i]->data->rr_ttl[rrlist[i]->data->count + j]; + /* reference the rdata in the rrset, no need to + * copy it, it is no longer need at the end of + * the routine */ + data->rr_data[*done] = rrlist[i]->data->rr_data[rrlist[i]->data->count + j]; + (*done)++; + } + } +} + +static void add_rrset_into_data(struct packed_rrset_data* data, + size_t* done, struct auth_rrset* rrset, + struct auth_zone* z, struct auth_data* node) +{ + if(rrset) { + size_t j; + for(j = 0; jdata->count; j++) { + if(rrsig_rdata_get_type_covered(rrset->data-> + rr_data[j], rrset->data->rr_len[j]) == + LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name)==0) { + /* omit RRSIGs over type ZONEMD at apex */ + continue; + } + data->rr_len[*done] = rrset->data->rr_len[j]; + data->rr_ttl[*done] = rrset->data->rr_ttl[j]; + /* reference the rdata in the rrset, no need to + * copy it, it is no longer need at the end of + * the routine */ + data->rr_data[*done] = rrset->data->rr_data[j]; + (*done)++; + } + } +} + +/** collate the RRSIGs using the simple scheme */ +static int zonemd_simple_rrsig(struct auth_zone* z, void* hash, + struct auth_data* node, struct auth_rrset* rrset, + struct auth_rrset** rrlist, size_t rrnum, struct regional* region, + struct sldns_buffer* buf, char** reason) +{ + /* the rrset pointer can be NULL, this means it is type RRSIG and + * there is no ordinary type RRSIG there. The RRSIGs are stored + * with the RRsets in their data. + * + * The RRset pointer can be nonNULL. This happens if there is + * no RR that is covered by the RRSIG for the domain. Then this + * RRSIG RR is stored in an rrset of type RRSIG. The other RRSIGs + * are stored in the rrset entries for the RRs in the rr list for + * the domain node. We need to collate the rrset's data, if any, and + * the rrlist's rrsigs */ + /* if this is the apex, omit RRSIGs that cover type ZONEMD */ + /* build rrsig rrset */ + size_t done = 0; + struct ub_packed_rrset_key key; + struct packed_rrset_data data; + memset(&key, 0, sizeof(key)); + memset(&data, 0, sizeof(data)); + key.entry.key = &key; + key.entry.data = &data; + key.rk.dname = node->name; + key.rk.dname_len = node->namelen; + key.rk.type = htons(rrset->type); + key.rk.rrset_class = htons(z->dclass); + data.count = zonemd_simple_count_rrsig(rrset, rrlist, rrnum, z, node); + if(!zonemd_simple_rrsig_allocs(region, &data, data.count)) { + *reason = "out of memory"; + regional_free_all(region); + return 0; + } + /* all the RRSIGs stored in the other rrsets for this domain node */ + add_rrlist_rrsigs_into_data(&data, &done, rrlist, rrnum, z, node); + /* plus the RRSIGs stored in an rrset of type RRSIG for this node */ + add_rrset_into_data(&data, &done, rrset, z, node); + + /* canonicalize */ + if(!rrset_canonicalize_to_buffer(region, buf, &key)) { + *reason = "out of memory"; + regional_free_all(region); + return 0; + } + regional_free_all(region); + + /* hash */ + return 1; +} + +/** collate a domain's rrsets using the simple scheme */ +static int zonemd_simple_domain(struct auth_zone* z, void* hash, + struct auth_data* node, struct regional* region, + struct sldns_buffer* buf, char** reason) +{ + const size_t rrlistsize = 65536; + struct auth_rrset* rrlist[rrlistsize]; + size_t i, rrnum = 0; + /* see if the domain is out of scope, the zone origin, + * that would be omitted */ + if(!dname_subdomain_c(node->name, z->name)) + return 1; /* continue */ + /* loop over the rrsets in ascending order. */ + rrnum = authdata_rrsets_to_list(rrlist, rrlistsize, node->rrsets); + addrrsigtype_if_needed(rrlist, rrlistsize, &rrnum, node); + qsort(rrlist, rrnum, sizeof(*rrlist), rrlist_compare); + for(i=0; itype == LDNS_RR_TYPE_ZONEMD && + query_dname_compare(z->name, node->name) == 0) { + /* omit type ZONEMD at apex */ + continue; + } + if(rrlist[i] == NULL || rrlist[i]->type == + LDNS_RR_TYPE_RRSIG) { + if(!zonemd_simple_rrsig(z, hash, node, rrlist[i], + rrlist, rrnum, region, buf, reason)) + return 0; + } else if(!zonemd_simple_rrset(z, hash, node, rrlist[i], + region, buf, reason)) { + return 0; + } + } + return 1; +} + +/** collate the zone using the simple scheme */ +static int zonemd_simple_collate(struct auth_zone* z, void* hash, + struct regional* region, struct sldns_buffer* buf, char** reason) +{ + /* our tree is sorted in canonical order, so we can just loop over + * the tree */ + struct auth_data* n; + RBTREE_FOR(n, struct auth_data*, &z->data) { + if(!zonemd_simple_domain(z, hash, n, region, buf, reason)) + return 0; + } + return 1; +} + +int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t hashlen, size_t* resultlen, + struct regional* region, struct sldns_buffer* buf, char** reason) +{ + void* h = zonemd_digest_init(hashalgo); + if(!h) { + *reason = "digest init fail"; + return 0; + } + if(scheme == 1) { + if(!zonemd_simple_collate(z, h, region, buf, reason)) { + if(!*reason) *reason = "scheme simple collate fail"; + return 0; + } + } + /* + if(!zonemd_digest_finish(hashalgo, hash, hashlen, resultlen)) { + *reason = "digest finish fail"; + return 0; + } + */ + return 1; +} + +int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region, + struct sldns_buffer* buf, char** reason) +{ + uint8_t gen[512]; + size_t genlen = 0; + if(!zonemd_hashalgo_supported(hashalgo)) { + *reason = "unsupported algorithm"; + return 0; + } + if(!zonemd_scheme_supported(scheme)) { + *reason = "unsupported scheme"; + return 0; + } + if(hashlen < 12) { + /* the ZONEMD draft requires digests to fail if too small */ + *reason = "digest length too small, less than 12"; + return 0; + } + /* generate digest */ + if(!auth_zone_generate_zonemd_hash(z, scheme, hashalgo, gen, + sizeof(gen), &genlen, region, buf, reason)) { + /* reason filled in by zonemd hash routine */ + return 0; + } + /* check digest length */ + if(hashlen != genlen) { + *reason = "incorrect digest length"; + return 0; + } + /* check digest */ + if(memcmp(hash, gen, genlen) != 0) { + *reason = "incorrect digest"; + return 0; + } + return 1; +} diff --git a/services/authzone.h b/services/authzone.h index 3d94f30d6..813fc0e87 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -685,4 +685,39 @@ void auth_xfer_transfer_lookup_callback(void* arg, int rcode, */ int compare_serial(uint32_t a, uint32_t b); +/** + * Generate ZONEMD digest for the auth zone. + * @param z: the auth zone to digest. + * omits zonemd at apex and its RRSIG from the digest. + * @param scheme: the collation scheme to use. Numbers as defined for ZONEMD. + * @param hashalgo: the hash algo, from the registry defined for ZONEMD type. + * @param hash: the result buffer. + * @param buflen: size of the result buffer, must be large enough. or the + * routine fails. + * @param resultlen: size of the hash in the result buffer of the result. + * @param region: temp region for allocs during canonicalisation. + * @param buf: temp buffer during canonicalisation. + * @param reason: failure reason, returns a string, NULL on success. + * @return false on failure. + */ +int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t buflen, size_t* resultlen, + struct regional* region, struct sldns_buffer* buf, char** reason); + +/** + * Check ZONEMD digest for the auth zone. + * @param z: auth zone to digest. + * @param scheme: zonemd scheme. + * @param hashalgo: zonemd hash algorithm. + * @param hash: the hash to check. + * @param buflen: length of hash buffer. + * @param region: temp region for allocs during canonicalisation. + * @param buf: temp buffer during canonicalisation. + * @param reason: string returned with failure reason. + * @return false on failure. + */ +int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, + int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region, + struct sldns_buffer* buf, char** reason); + #endif /* SERVICES_AUTHZONE_H */ diff --git a/testcode/unitauth.c b/testcode/unitauth.c index 4b3410c9e..184573ab6 100644 --- a/testcode/unitauth.c +++ b/testcode/unitauth.c @@ -517,8 +517,8 @@ del_tmp_file(char* fname) } /** Add zone from file for testing */ -static struct auth_zone* -addzone(struct auth_zones* az, const char* name, char* fname) +struct auth_zone* +authtest_addzone(struct auth_zones* az, const char* name, char* fname) { struct auth_zone* z; size_t nmlen; @@ -593,7 +593,7 @@ check_read_exact(const char* name, const char* zone) az = auth_zones_create(); unit_assert(az); - z = addzone(az, name, fname); + z = authtest_addzone(az, name, fname); unit_assert(z); outf = create_tmp_file(NULL); if(!auth_zone_write_file(z, outf)) { @@ -844,7 +844,7 @@ check_queries(const char* name, const char* zone, struct q_ans* queries) fname = create_tmp_file(zone); az = auth_zones_create(); if(!az) fatal_exit("out of memory"); - z = addzone(az, name, fname); + z = authtest_addzone(az, name, fname); if(!z) fatal_exit("could not read zone for queries test"); del_tmp_file(fname); diff --git a/testcode/unitmain.c b/testcode/unitmain.c index a42be424e..df560a466 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -839,6 +839,52 @@ static void respip_test(void) respip_conf_actions_test(); } +#include "services/authzone.h" +#include "util/data/dname.h" +#include "util/regional.h" +/** Add zone from file for testing */ +struct auth_zone* authtest_addzone(struct auth_zones* az, const char* name, + char* fname); +/** zonemd unit tests */ +static void zonemd_test(void) +{ + uint8_t zonemd_hash[512]; + struct auth_zones* az; + struct auth_zone* z; + int scheme = 1, hashalgo = 2; + size_t hashlen = 0; + int result; + char* reason = NULL; + struct regional* region = NULL; + struct sldns_buffer* buf = NULL; + unit_show_feature("zonemd"); + region = regional_create(); + unit_assert(region); + buf = sldns_buffer_new(65535); + unit_assert(buf); + az = auth_zones_create(); + unit_assert(az); + z = authtest_addzone(az, "example.org", "testdata/zonemd.example1.zone"); + unit_assert(z); + + /* zonemd test on zone */ + result = auth_zone_generate_zonemd_hash(z, scheme, hashalgo, + zonemd_hash, sizeof(zonemd_hash), &hashlen, region, buf, + &reason); + if(reason) printf("zonemd failure reason: %s\n", reason); + unit_assert(result); + if(1) { + char zname[255+1]; + dname_str(z->name, zname); + printf("zonemd generated for %s in %s with scheme=%d, hashalgo=%d\n", zname, z->zonefile, scheme, hashalgo); + log_hex("digest", zonemd_hash, hashlen); + } + + auth_zones_delete(az); + regional_destroy(region); + sldns_buffer_free(buf); +} + void unit_show_func(const char* file, const char* func) { printf("test %s:%s\n", file, func); @@ -889,6 +935,7 @@ main(int argc, char* argv[]) fatal_exit("could not init NSS"); #endif /* HAVE_SSL or HAVE_NSS*/ checklock_start(); + zonemd_test(); authzone_test(); neg_test(); rnd_test(); diff --git a/testdata/zonemd.example1.zone b/testdata/zonemd.example1.zone new file mode 100644 index 000000000..b1a44895f --- /dev/null +++ b/testdata/zonemd.example1.zone @@ -0,0 +1,4 @@ +example.org. IN SOA ns.example.org. hostmaster.example.org. 200154054 28800 7200 604800 3600 +example.org. IN NS ns.example.org. +www.example.org. IN A 127.0.0.1 +ns.example.org. IN A 127.0.0.1 diff --git a/validator/val_sigcrypt.c b/validator/val_sigcrypt.c index de730f681..10cf2caee 100644 --- a/validator/val_sigcrypt.c +++ b/validator/val_sigcrypt.c @@ -1199,6 +1199,59 @@ rrset_canonical(struct regional* region, sldns_buffer* buf, return 1; } +int +rrset_canonicalize_to_buffer(struct regional* region, sldns_buffer* buf, + struct ub_packed_rrset_key* k) +{ + struct rbtree_type* sortree = NULL; + struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data; + uint8_t* can_owner = NULL; + size_t can_owner_len = 0; + struct canon_rr* walk; + struct canon_rr* rrs; + + sortree = (struct rbtree_type*)regional_alloc(region, + sizeof(rbtree_type)); + if(!sortree) + return 0; + if(d->count > RR_COUNT_MAX) + return 0; /* integer overflow protection */ + rrs = regional_alloc(region, sizeof(struct canon_rr)*d->count); + if(!rrs) { + return 0; + } + rbtree_init(sortree, &canonical_tree_compare); + canonical_sort(k, d, sortree, rrs); + + sldns_buffer_clear(buf); + RBTREE_FOR(walk, struct canon_rr*, sortree) { + /* see if there is enough space left in the buffer */ + if(sldns_buffer_remaining(buf) < can_owner_len + 2 + 2 + 4 + + d->rr_len[walk->rr_idx]) { + log_err("verify: failed to canonicalize, " + "rrset too big"); + return 0; + } + /* determine canonical owner name */ + if(can_owner) + sldns_buffer_write(buf, can_owner, can_owner_len); + else { + can_owner = sldns_buffer_current(buf); + sldns_buffer_write(buf, k->rk.dname, k->rk.dname_len); + query_dname_tolower(can_owner); + can_owner_len = k->rk.dname_len; + } + sldns_buffer_write(buf, &k->rk.type, 2); + sldns_buffer_write(buf, &k->rk.rrset_class, 2); + sldns_buffer_write_u32(buf, d->rr_ttl[walk->rr_idx]); + sldns_buffer_write(buf, d->rr_data[walk->rr_idx], + d->rr_len[walk->rr_idx]); + canonicalize_rdata(buf, k, d->rr_len[walk->rr_idx]); + } + sldns_buffer_flip(buf); + return 1; +} + /** pretty print rrsig error with dates */ static void sigdate_error(const char* str, int32_t expi, int32_t incep, int32_t now) diff --git a/validator/val_sigcrypt.h b/validator/val_sigcrypt.h index 755a1d6e1..23ca1d91b 100644 --- a/validator/val_sigcrypt.h +++ b/validator/val_sigcrypt.h @@ -334,4 +334,16 @@ int canonical_tree_compare(const void* k1, const void* k2); int rrset_canonical_equal(struct regional* region, struct ub_packed_rrset_key* k1, struct ub_packed_rrset_key* k2); +/** + * Canonicalize an rrset into the buffer. For an auth zone record, so + * this does not use a signature, or the RRSIG TTL or the wildcard label + * count from the RRSIG. + * @param region: temporary region. + * @param buf: the buffer to use. + * @param k: the rrset to insert. + * @return false on alloc error. + */ +int rrset_canonicalize_to_buffer(struct regional* region, + struct sldns_buffer* buf, struct ub_packed_rrset_key* k); + #endif /* VALIDATOR_VAL_SIGCRYPT_H */ From eb4932a463f594732fd2e91285300b85e97463b1 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 11:19:31 +0200 Subject: [PATCH 04/66] zonemd, digest code calls, secalgo openssl sha384 and sha512. --- services/authzone.c | 128 +++++++++++++++++++++++++++++++--------- validator/val_secalgo.c | 63 ++++++++++++++++++++ validator/val_secalgo.h | 43 ++++++++++++++ 3 files changed, 207 insertions(+), 27 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index b4217bd55..208c0b825 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -6983,19 +6983,79 @@ static int zonemd_scheme_supported(int scheme) } /** initialize hash for hashing with zonemd hash algo */ -static void* zonemd_digest_init(int hashalgo) +static struct secalgo_hash* zonemd_digest_init(int hashalgo, char** reason) { + struct secalgo_hash *h; if(hashalgo == 1) { /* sha384 */ - //return secalgo_digest_start_sha384(); + h = secalgo_hash_create_sha384(); + if(!h) + *reason = "digest sha384 could not be created"; + return h; } else if(hashalgo == 2) { /* sha512 */ - //return secalgo_digest_start_sha512(); + h = secalgo_hash_create_sha512(); + if(!h) + *reason = "digest sha512 could not be created"; + return h; } /* unknown hash algo */ + *reason = "unsupported algorithm"; return NULL; } +/** update the hash for zonemd */ +static int zonemd_digest_update(int hashalgo, struct secalgo_hash* h, + uint8_t* data, size_t len, char** reason) +{ + if(hashalgo == 1) { + if(!secalgo_hash_update(h, data, len)) { + *reason = "digest sha384 failed"; + return 0; + } + return 1; + } else if(hashalgo == 2) { + if(!secalgo_hash_update(h, data, len)) { + *reason = "digest sha512 failed"; + return 0; + } + return 1; + } + /* unknown hash algo */ + *reason = "unsupported algorithm"; + return 0; +} + +/** finish the hash for zonemd */ +static int zonemd_digest_finish(int hashalgo, struct secalgo_hash* h, + uint8_t* result, size_t hashlen, size_t* resultlen, char** reason) +{ + if(hashalgo == 1) { + if(hashlen < 384/8) { + *reason = "digest buffer too small for sha384"; + return 0; + } + if(!secalgo_hash_final(h, result, hashlen, resultlen)) { + *reason = "digest sha384 finish failed"; + return 0; + } + return 1; + } else if(hashalgo == 2) { + if(hashlen < 512/8) { + *reason = "digest buffer too small for sha512"; + return 0; + } + if(!secalgo_hash_final(h, result, hashlen, resultlen)) { + *reason = "digest sha512 finish failed"; + return 0; + } + return 1; + } + /* unknown algo */ + *reason = "unsupported algorithm"; + return 0; +} + /** add rrsets from node to the list */ static size_t authdata_rrsets_to_list(struct auth_rrset** array, size_t arraysize, struct auth_rrset* first) @@ -7043,9 +7103,10 @@ static void addrrsigtype_if_needed(struct auth_rrset** array, } /** collate the RRs in an RRset using the simple scheme */ -static int zonemd_simple_rrset(struct auth_zone* z, void* hash, - struct auth_data* node, struct auth_rrset* rrset, - struct regional* region, struct sldns_buffer* buf, char** reason) +static int zonemd_simple_rrset(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct auth_data* node, + struct auth_rrset* rrset, struct regional* region, + struct sldns_buffer* buf, char** reason) { /* canonicalize */ struct ub_packed_rrset_key key; @@ -7063,6 +7124,10 @@ static int zonemd_simple_rrset(struct auth_zone* z, void* hash, regional_free_all(region); /* hash */ + if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf), + sldns_buffer_limit(buf), reason)) { + return 0; + } return 1; } @@ -7168,10 +7233,10 @@ static void add_rrset_into_data(struct packed_rrset_data* data, } /** collate the RRSIGs using the simple scheme */ -static int zonemd_simple_rrsig(struct auth_zone* z, void* hash, - struct auth_data* node, struct auth_rrset* rrset, - struct auth_rrset** rrlist, size_t rrnum, struct regional* region, - struct sldns_buffer* buf, char** reason) +static int zonemd_simple_rrsig(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct auth_data* node, + struct auth_rrset* rrset, struct auth_rrset** rrlist, size_t rrnum, + struct regional* region, struct sldns_buffer* buf, char** reason) { /* the rrset pointer can be NULL, this means it is type RRSIG and * there is no ordinary type RRSIG there. The RRSIGs are stored @@ -7194,7 +7259,7 @@ static int zonemd_simple_rrsig(struct auth_zone* z, void* hash, key.entry.data = &data; key.rk.dname = node->name; key.rk.dname_len = node->namelen; - key.rk.type = htons(rrset->type); + key.rk.type = htons(LDNS_RR_TYPE_RRSIG); key.rk.rrset_class = htons(z->dclass); data.count = zonemd_simple_count_rrsig(rrset, rrlist, rrnum, z, node); if(!zonemd_simple_rrsig_allocs(region, &data, data.count)) { @@ -7216,13 +7281,17 @@ static int zonemd_simple_rrsig(struct auth_zone* z, void* hash, regional_free_all(region); /* hash */ + if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf), + sldns_buffer_limit(buf), reason)) { + return 0; + } return 1; } /** collate a domain's rrsets using the simple scheme */ -static int zonemd_simple_domain(struct auth_zone* z, void* hash, - struct auth_data* node, struct regional* region, - struct sldns_buffer* buf, char** reason) +static int zonemd_simple_domain(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct auth_data* node, + struct regional* region, struct sldns_buffer* buf, char** reason) { const size_t rrlistsize = 65536; struct auth_rrset* rrlist[rrlistsize]; @@ -7243,11 +7312,11 @@ static int zonemd_simple_domain(struct auth_zone* z, void* hash, } if(rrlist[i] == NULL || rrlist[i]->type == LDNS_RR_TYPE_RRSIG) { - if(!zonemd_simple_rrsig(z, hash, node, rrlist[i], - rrlist, rrnum, region, buf, reason)) + if(!zonemd_simple_rrsig(z, hashalgo, h, node, + rrlist[i], rrlist, rrnum, region, buf, reason)) return 0; - } else if(!zonemd_simple_rrset(z, hash, node, rrlist[i], - region, buf, reason)) { + } else if(!zonemd_simple_rrset(z, hashalgo, h, node, + rrlist[i], region, buf, reason)) { return 0; } } @@ -7255,14 +7324,16 @@ static int zonemd_simple_domain(struct auth_zone* z, void* hash, } /** collate the zone using the simple scheme */ -static int zonemd_simple_collate(struct auth_zone* z, void* hash, - struct regional* region, struct sldns_buffer* buf, char** reason) +static int zonemd_simple_collate(struct auth_zone* z, int hashalgo, + struct secalgo_hash* h, struct regional* region, + struct sldns_buffer* buf, char** reason) { /* our tree is sorted in canonical order, so we can just loop over * the tree */ struct auth_data* n; RBTREE_FOR(n, struct auth_data*, &z->data) { - if(!zonemd_simple_domain(z, hash, n, region, buf, reason)) + if(!zonemd_simple_domain(z, hashalgo, h, n, region, buf, + reason)) return 0; } return 1; @@ -7272,23 +7343,26 @@ int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, int hashalgo, uint8_t* hash, size_t hashlen, size_t* resultlen, struct regional* region, struct sldns_buffer* buf, char** reason) { - void* h = zonemd_digest_init(hashalgo); + struct secalgo_hash* h = zonemd_digest_init(hashalgo, reason); if(!h) { - *reason = "digest init fail"; + if(!*reason) + *reason = "digest init fail"; return 0; } if(scheme == 1) { - if(!zonemd_simple_collate(z, h, region, buf, reason)) { + if(!zonemd_simple_collate(z, hashalgo, h, region, buf, reason)) { if(!*reason) *reason = "scheme simple collate fail"; + secalgo_hash_delete(h); return 0; } } - /* - if(!zonemd_digest_finish(hashalgo, hash, hashlen, resultlen)) { + if(!zonemd_digest_finish(hashalgo, h, hash, hashlen, resultlen, + reason)) { + secalgo_hash_delete(h); *reason = "digest finish fail"; return 0; } - */ + secalgo_hash_delete(h); return 1; } diff --git a/validator/val_secalgo.c b/validator/val_secalgo.c index 65bca8b69..18509ce85 100644 --- a/validator/val_secalgo.c +++ b/validator/val_secalgo.c @@ -141,6 +141,69 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res) #endif } +/** hash structure for keeping track of running hashes */ +struct secalgo_hash { + /** the openssl message digest context */ + EVP_MD_CTX* ctx; +}; + +/** create secalgo hash with hash type */ +static struct secalgo_hash* secalgo_hash_create_md(const EVP_MD* md) +{ + struct secalgo_hash* h; + if(!md) + return NULL; + h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->ctx = EVP_MD_CTX_create(); + if(!h->ctx) { + free(h); + return NULL; + } + if(!EVP_DigestInit_ex(h->ctx, md, NULL)) { + EVP_MD_CTX_destroy(h->ctx); + free(h); + return NULL; + } + return h; +} + +struct secalgo_hash* secalgo_hash_create_sha384(void) +{ + return secalgo_hash_create_md(EVP_sha384()); +} + +struct secalgo_hash* secalgo_hash_create_sha512(void) +{ + return secalgo_hash_create_md(EVP_sha512()); +} + +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len) +{ + return EVP_DigestUpdate(hash->ctx, (unsigned char*)data, + (unsigned int)len); +} + +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen) +{ + if(EVP_MD_CTX_size(hash->ctx) > (int)maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + *resultlen = EVP_MD_CTX_size(hash->ctx); + return EVP_DigestFinal_ex(hash->ctx, result, NULL); +} + +void secalgo_hash_delete(struct secalgo_hash* hash) +{ + if(!hash) return; + EVP_MD_CTX_destroy(hash->ctx); + free(hash); +} + /** * Return size of DS digest according to its hash algorithm. * @param algo: DS digest algo. diff --git a/validator/val_secalgo.h b/validator/val_secalgo.h index 52aaeb9f6..8b6080dc2 100644 --- a/validator/val_secalgo.h +++ b/validator/val_secalgo.h @@ -43,6 +43,7 @@ #ifndef VALIDATOR_VAL_SECALGO_H #define VALIDATOR_VAL_SECALGO_H struct sldns_buffer; +struct secalgo_hash; /** Return size of nsec3 hash algorithm, 0 if not supported */ size_t nsec3_hash_algo_size_supported(int id); @@ -67,6 +68,48 @@ int secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len, */ void secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res); +/** + * Start a hash of type sha384. Allocates structure, then inits it, + * so that a series of updates can be performed, before the final result. + * @return hash structure. NULL on malloc failure or no support. + */ +struct secalgo_hash* secalgo_hash_create_sha384(void); + +/** + * Start a hash of type sha512. Allocates structure, then inits it, + * so that a series of updates can be performed, before the final result. + * @return hash structure. NULL on malloc failure or no support. + */ +struct secalgo_hash* secalgo_hash_create_sha512(void); + +/** + * Update a hash with more information to add to it. + * @param hash: the hash that is updated. + * @param data: data to add. + * @param len: length of data. + * @return false on failure. + */ +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len); + +/** + * Get the final result of the hash. + * @param hash: the hash that has had updates to it. + * @param result: where to store the result. + * @param maxlen: length of the result buffer, eg. size of the allocation. + * If not large enough the routine fails. + * @param resultlen: the length of the result, returned to the caller. + * How much of maxlen is used. + * @return false on failure. + */ +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen); + +/** + * Delete the hash structure. + * @param hash: the hash to delete. + */ +void secalgo_hash_delete(struct secalgo_hash* hash); + /** * Return size of DS digest according to its hash algorithm. * @param algo: DS digest algo. From cdf6544b466a55875ae34a492d458702722caeed Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 12:18:25 +0200 Subject: [PATCH 05/66] zonemd, unit test, succeeds at verifying examples of zonemd draft-12. --- services/authzone.c | 6 +- services/authzone.h | 6 ++ testcode/unitmain.c | 81 +++++++++++++++++--- testdata/zonemd.example_a1.zone | 6 ++ testdata/zonemd.example_a2.zone | 25 +++++++ testdata/zonemd.example_a3.zone | 30 ++++++++ testdata/zonemd.example_a4.zone | 127 ++++++++++++++++++++++++++++++++ testdata/zonemd.example_a5.zone | 48 ++++++++++++ 8 files changed, 313 insertions(+), 16 deletions(-) create mode 100644 testdata/zonemd.example_a1.zone create mode 100644 testdata/zonemd.example_a2.zone create mode 100644 testdata/zonemd.example_a3.zone create mode 100644 testdata/zonemd.example_a4.zone create mode 100644 testdata/zonemd.example_a5.zone diff --git a/services/authzone.c b/services/authzone.c index 208c0b825..7ba273b52 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -6967,16 +6967,14 @@ compare_serial(uint32_t a, uint32_t b) } } -/** returns true if a zonemd hash algo is supported */ -static int zonemd_hashalgo_supported(int hashalgo) +int zonemd_hashalgo_supported(int hashalgo) { if(hashalgo == 1) return 1; if(hashalgo == 2) return 1; return 0; } -/** returns true if a zonemd scheme is supported */ -static int zonemd_scheme_supported(int scheme) +int zonemd_scheme_supported(int scheme) { if(scheme == 1) return 1; return 0; diff --git a/services/authzone.h b/services/authzone.h index 813fc0e87..6dd9c30b3 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -704,6 +704,12 @@ int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, int hashalgo, uint8_t* hash, size_t buflen, size_t* resultlen, struct regional* region, struct sldns_buffer* buf, char** reason); + +/** returns true if a zonemd hash algo is supported */ +int zonemd_hashalgo_supported(int hashalgo); +/** returns true if a zonemd scheme is supported */ +int zonemd_scheme_supported(int scheme); + /** * Check ZONEMD digest for the auth zone. * @param z: auth zone to digest. diff --git a/testcode/unitmain.c b/testcode/unitmain.c index df560a466..8762bc169 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -839,52 +839,109 @@ static void respip_test(void) respip_conf_actions_test(); } +#include #include "services/authzone.h" #include "util/data/dname.h" #include "util/regional.h" /** Add zone from file for testing */ struct auth_zone* authtest_addzone(struct auth_zones* az, const char* name, char* fname); -/** zonemd unit tests */ -static void zonemd_test(void) + +/** zonemd unit test, generate a zonemd digest and check if correct */ +static void zonemd_generate_test(const char* zname, char* zfile, + int scheme, int hashalgo, const char* digest) { uint8_t zonemd_hash[512]; + size_t hashlen = 0; + char output[1024+1]; + size_t i; struct auth_zones* az; struct auth_zone* z; - int scheme = 1, hashalgo = 2; - size_t hashlen = 0; int result; char* reason = NULL; struct regional* region = NULL; struct sldns_buffer* buf = NULL; - unit_show_feature("zonemd"); + char* digestdup; + + if(!zonemd_hashalgo_supported(hashalgo)) + return; /* cannot test unsupported algo */ + + /* setup environment */ + az = auth_zones_create(); + unit_assert(az); region = regional_create(); unit_assert(region); buf = sldns_buffer_new(65535); unit_assert(buf); - az = auth_zones_create(); - unit_assert(az); - z = authtest_addzone(az, "example.org", "testdata/zonemd.example1.zone"); + + /* read file */ + z = authtest_addzone(az, zname, zfile); unit_assert(z); - /* zonemd test on zone */ + /* create zonemd digest */ result = auth_zone_generate_zonemd_hash(z, scheme, hashalgo, zonemd_hash, sizeof(zonemd_hash), &hashlen, region, buf, &reason); if(reason) printf("zonemd failure reason: %s\n", reason); unit_assert(result); - if(1) { + + /* check digest */ + unit_assert(hashlen*2+1 <= sizeof(output)); + for(i=0; i>4]; + output[i*2+1] = hexl[zonemd_hash[i]&0xf]; + } + output[hashlen*2] = 0; + digestdup = strdup(digest); + unit_assert(digestdup); + for(i=0; iname, zname); - printf("zonemd generated for %s in %s with scheme=%d, hashalgo=%d\n", zname, z->zonefile, scheme, hashalgo); - log_hex("digest", zonemd_hash, hashlen); + printf("zonemd generated for %s in %s with " + "scheme=%d hashalgo=%d\n", zname, z->zonefile, + scheme, hashalgo); + printf("digest %s\n", output); + printf("wanted %s\n", digestdup); } + unit_assert(strcmp(output, digestdup) == 0); + /* delete environment */ + free(digestdup); auth_zones_delete(az); regional_destroy(region); sldns_buffer_free(buf); } +/** loop over files and test generated zonemd digest */ +static void zonemd_generate_tests(void) +{ + zonemd_generate_test("example.org", "testdata/zonemd.example1.zone", + 1, 2, "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"); + zonemd_generate_test("example", "testdata/zonemd.example_a1.zone", + 1, 1, "c68090d90a7aed716bc459f9340e3d7c1370d4d24b7e2fc3a1ddc0b9a87153b9a9713b3c9ae5cc27777f98b8e730044c"); + zonemd_generate_test("example", "testdata/zonemd.example_a2.zone", + 1, 1, "31cefb03814f5062ad12fa951ba0ef5f8da6ae354a415767246f7dc932ceb1e742a2108f529db6a33a11c01493de358d"); + zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", + 1, 1, "62e6cf51b02e54b9b5f967d547ce43136792901f9f88e637493daaf401c92c279dd10f0edb1c56f8080211f8480ee306"); + zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", + 1, 2, "08cfa1115c7b948c4163a901270395ea226a930cd2cbcf2fa9a5e6eb85f37c8a4e114d884e66f176eab121cb02db7d652e0cc4827e7a3204f166b47e5613fd27"); + zonemd_generate_test("uri.arpa", "testdata/zonemd.example_a4.zone", + 1, 1, "1291b78ddf7669b1a39d014d87626b709b55774c5d7d58fadc556439889a10eaf6f11d615900a4f996bd46279514e473"); + zonemd_generate_test("root-servers.net", "testdata/zonemd.example_a5.zone", + 1, 1, "f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a978a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79"); +} + +/** zonemd unit tests */ +static void zonemd_test(void) +{ + unit_show_feature("zonemd"); + zonemd_generate_tests(); +} + void unit_show_func(const char* file, const char* func) { printf("test %s:%s\n", file, func); diff --git a/testdata/zonemd.example_a1.zone b/testdata/zonemd.example_a1.zone new file mode 100644 index 000000000..331b45a15 --- /dev/null +++ b/testdata/zonemd.example_a1.zone @@ -0,0 +1,6 @@ +example. 86400 IN SOA ns1 admin 2018031900 ( 1800 900 604800 86400 ) + 86400 IN NS ns1 + 86400 IN NS ns2 + 86400 IN ZONEMD 2018031900 1 1 ( c68090d90a7aed71 6bc459f9340e3d7c 1370d4d24b7e2fc3 a1ddc0b9a87153b9 a9713b3c9ae5cc27 777f98b8e730044c ) +ns1 3600 IN A 203.0.113.63 +ns2 3600 IN AAAA 2001:db8::63 diff --git a/testdata/zonemd.example_a2.zone b/testdata/zonemd.example_a2.zone new file mode 100644 index 000000000..56d06ae06 --- /dev/null +++ b/testdata/zonemd.example_a2.zone @@ -0,0 +1,25 @@ +example. 86400 IN SOA ns1 admin 2018031900 ( + 1800 900 604800 86400 ) + 86400 IN NS ns1 + 86400 IN NS ns2 + 86400 IN ZONEMD 2018031900 1 1 ( + 31cefb03814f5062 + ad12fa951ba0ef5f + 8da6ae354a415767 + 246f7dc932ceb1e7 + 42a2108f529db6a3 + 3a11c01493de358d ) +ns1 3600 IN A 203.0.113.63 +ns2 3600 IN AAAA 2001:db8::63 +occluded.sub 7200 IN TXT "I'm occluded but must be digested" +sub 7200 IN NS ns1 +duplicate 300 IN TXT "I must be digested just once" +duplicate 300 IN TXT "I must be digested just once" +foo.test. 555 IN TXT "out-of-zone data must be excluded" +non-apex 900 IN ZONEMD 2018031900 1 1 ( + 616c6c6f77656420 + 6275742069676e6f + 7265642e20616c6c + 6f77656420627574 + 2069676e6f726564 + 2e20616c6c6f7765 ) diff --git a/testdata/zonemd.example_a3.zone b/testdata/zonemd.example_a3.zone new file mode 100644 index 000000000..45c47ad05 --- /dev/null +++ b/testdata/zonemd.example_a3.zone @@ -0,0 +1,30 @@ +example. 86400 IN SOA ns1 admin 2018031900 ( + 1800 900 604800 86400 ) +example. 86400 IN NS ns1.example. +example. 86400 IN NS ns2.example. +example. 86400 IN ZONEMD 2018031900 1 1 ( + 62e6cf51b02e54b9 + b5f967d547ce4313 + 6792901f9f88e637 + 493daaf401c92c27 + 9dd10f0edb1c56f8 + 080211f8480ee306 ) +example. 86400 IN ZONEMD 2018031900 1 2 ( + 08cfa1115c7b948c + 4163a901270395ea + 226a930cd2cbcf2f + a9a5e6eb85f37c8a + 4e114d884e66f176 + eab121cb02db7d65 + 2e0cc4827e7a3204 + f166b47e5613fd27 ) +example. 86400 IN ZONEMD 2018031900 1 240 ( + e2d523f654b9422a + 96c5a8f44607bbee ) +example. 86400 IN ZONEMD 2018031900 241 1 ( + e1846540e33a9e41 + 89792d18d5d131f6 + 05fc283e ) +ns1.example. 3600 IN A 203.0.113.63 +ns2.example. 86400 IN TXT "This example has multiple digests" +ns2.example. 3600 IN AAAA 2001:db8::63 diff --git a/testdata/zonemd.example_a4.zone b/testdata/zonemd.example_a4.zone new file mode 100644 index 000000000..74b913c89 --- /dev/null +++ b/testdata/zonemd.example_a4.zone @@ -0,0 +1,127 @@ +uri.arpa. 3600 IN SOA sns.dns.icann.org. ( + noc.dns.icann.org. 2018100702 10800 3600 1209600 3600 ) +uri.arpa. 3600 IN RRSIG NSEC 8 2 3600 ( + 20181028142623 20181007205525 47155 uri.arpa. + eEC4w/oXLR1Epwgv4MBiDtSBsXhqrJVvJWUpbX8XpetAvD35bxwNCUTi + /pAJVUXefegWeiriD2rkTgCBCMmn7YQIm3gdR+HjY/+o3BXNQnz97f+e + HAE9EDDzoNVfL1PyV/2fde9tDeUuAGVVwmD399NGq9jWYMRpyri2kysr q/g= ) +uri.arpa. 86400 IN RRSIG NS 8 2 86400 ( + 20181028172020 20181007175821 47155 uri.arpa. + ATyV2A2A8ZoggC+68u4GuP5MOUuR+2rr3eWOkEU55zAHld/7FiBxl4ln + 4byJYy7NudUwlMOEXajqFZE7DVl8PpcvrP3HeeGaVzKqaWj+aus0jbKF + Bsvs2b1qDZemBfkz/IfAhUTJKnto0vSUicJKfItu0GjyYNJCz2CqEuGD Wxc= ) +uri.arpa. 600 IN RRSIG MX 8 2 600 ( + 20181028170556 20181007175821 47155 uri.arpa. + e7/r3KXDohX1lyVavetFFObp8fB8aXT76HnN9KCQDxSnSghNM83UQV0t + lTtD8JVeN1mCvcNFZpagwIgB7XhTtm6Beur/m5ES+4uSnVeS6Q66HBZK + A3mR95IpevuVIZvvJ+GcCAQpBo6KRODYvJ/c/ZG6sfYWkZ7qg/Em5/+3 4UI= ) +uri.arpa. 3600 IN RRSIG DNSKEY 8 2 3600 ( + 20181028152832 20181007175821 15796 uri.arpa. + nzpbnh0OqsgBBP8St28pLvPEQ3wZAUdEBuUwil+rtjjWlYYiqjPxZ286 + XF4Rq1usfV5x71jZz5IqswOaQgia91ylodFpLuXD6FTGs2nXGhNKkg1V + chHgtwj70mXU72GefVgo8TxrFYzxuEFP5ZTP92t97FVWVVyyFd86sbbR + 6DZj3uA2wEvqBVLECgJLrMQ9Yy7MueJl3UA4h4E6zO2JY9Yp0W9woq0B + dqkkwYTwzogyYffPmGAJG91RJ2h6cHtFjEZe2MnaY2glqniZ0WT9vXXd + uFPm0KD9U77Ac+ZtctAF9tsZwSdAoL365E2L1usZbA+K0BnPPqGFJRJk + 5R0A1w== ) +uri.arpa. 3600 IN RRSIG DNSKEY 8 2 3600 ( + 20181028152832 20181007175821 55480 uri.arpa. + lWtQV/5szQjkXmbcD47/+rOW8kJPksRFHlzxxmzt906+DBYyfrH6uq5X + nHvrUlQO6M12uhqDeL+bDFVgqSpNy+42/OaZvaK3J8EzPZVBHPJykKMV + 63T83aAiJrAyHzOaEdmzLCpalqcEE2ImzlLHSafManRfJL8Yuv+JDZFj + 2WDWfEcUuwkmIZWX11zxp+DxwzyUlRl7x4+ok5iKZWIg5UnBAf6B8T75 + WnXzlhCw3F2pXI0a5LYg71L3Tp/xhjN6Yy9jGlIRf5BjB59X2zra3a2R + PkI09SSnuEwHyF1mDaV5BmQrLGRnCjvwXA7ho2m+vv4SP5dUdXf+GTeA + 1HeBfw== ) +uri.arpa. 3600 IN RRSIG SOA 8 2 3600 ( + 20181029114753 20181008222815 47155 uri.arpa. + qn8yBNoHDjGdT79U2Wu9IIahoS0YPOgYP8lG+qwPcrZ1BwGiHywuoUa2 + Mx6BWZlg+HDyaxj2iOmox+IIqoUHhXUbO7IUkJFlgrOKCgAR2twDHrXu + 9BUQHy9SoV16wYm3kBTEPyxW5FFm8vcdnKAF7sxSY8BbaYNpRIEjDx4A JUc= ) +uri.arpa. 3600 IN NSEC ftp.uri.arpa. NS SOA ( + MX RRSIG NSEC DNSKEY ) +uri.arpa. 86400 IN NS a.iana-servers.net. +uri.arpa. 86400 IN NS b.iana-servers.net. +uri.arpa. 86400 IN NS c.iana-servers.net. +uri.arpa. 86400 IN NS ns2.lacnic.net. +uri.arpa. 86400 IN NS sec3.apnic.net. +uri.arpa. 600 IN MX 10 pechora.icann.org. +uri.arpa. 3600 IN DNSKEY 256 3 8 ( + AwEAAcBi7tSart2J599zbYWspMNGN70IBWb4ziqyQYH9MTB/VCz6WyUK + uXunwiJJbbQ3bcLqTLWEw134B6cTMHrZpjTAb5WAwg4XcWUu8mdcPTiL + Bl6qVRlRD0WiFCTzuYUfkwsh1Rbr7rvrxSQhF5rh71zSpwV5jjjp65Wx + SdJjlH0B ) +uri.arpa. 3600 IN DNSKEY 257 3 8 ( + AwEAAbNVv6ulgRdO31MtAehz7j3ALRjwZglWesnzvllQl/+hBRZr9QoY + cO2I+DkO4Q1NKxox4DUIxj8SxPO3GwDuOFR9q2/CFi2O0mZjafbdYtWc + 3zSdBbi3q0cwCIx7GuG9eqlL+pg7mdk9dgdNZfHwB0LnqTD8ebLPsrO/ + Id7kBaiqYOfMlZnh2fp+2h6OOJZHtY0DK1UlssyB5PKsE0tVzo5s6zo9 + iXKe5u+8WTMaGDY49vG80JPAKE7ezMiH/NZcUMiE0PRZ8D3foq2dYuS5 + ym+vA83Z7v8A+Rwh4UGnjxKB8zmr803V0ASAmHz/gwH5Vb0nH+LObwFt + l3wpbp+Wpm8= ) +uri.arpa. 3600 IN DNSKEY 257 3 8 ( + AwEAAbwnFTakCvaUKsXji4mgmxZUJi1IygbnGahbkmFEa0L16J+TchKR + wcgzVfsxUGa2MmeA4hgkAooC3uy+tTmoMsgy8uq/JAj24DjiHzd46LfD + FK/qMidVqFpYSHeq2Vv5ojkuIsx4oe4KsafGWYNOczKZgH5loGjN2aJG + mrIm++XCphOskgCsQYl65MIzuXffzJyxlAuts+ecAIiVeqRaqQfr8LRU + 7wIsLxinXirprtQrbor+EtvlHp9qXE6ARTZDzf4jvsNpKvLFZtmxzFf3 + e/UJz5eHjpwDSiZL7xE8aE1o1nGfPtJx9ZnB3bapltaJ5wY+5XOCKgY0 + xmJVvNQlwdE= ) +ftp.uri.arpa. 3600 IN RRSIG NSEC 8 3 3600 ( + 20181028080856 20181007175821 47155 uri.arpa. + HClGAqPxzkYkAT7Q/QNtQeB6YrkP6EPOef+9Qo5/2zngwAewXEAQiyF9 + jD1USJiroM11QqBS3v3aIdW/LXORs4Ez3hLcKNO1cKHsOuWAqzmE+BPP + Arfh8N95jqh/q6vpaB9UtMkQ53tM2fYU1GszOLN0knxbHgDHAh2axMGH lqM= ) +ftp.uri.arpa. 604800 IN RRSIG NAPTR 8 3 604800 ( + 20181028103644 20181007205525 47155 uri.arpa. + WoLi+vZzkxaoLr2IGZnwkRvcDf6KxiWQd1WZP/U+AWnV+7MiqsWPZaf0 + 9toRErerGoFOiOASNxZjBGJrRgjmavOM9U+LZSconP9zrNFd4dIu6kp5 + YxlQJ0uHOvx1ZHFCj6lAt1ACUIw04ZhMydTmi27c8MzEOMepvn7iH7r7 k7k= ) +ftp.uri.arpa. 3600 IN NSEC http.uri.arpa. NAPTR ( + RRSIG NSEC ) +ftp.uri.arpa. 604800 IN NAPTR 0 0 "" "" ( + "!^ftp://([^:/?#]*).*$!\\1!i" . ) +http.uri.arpa. 3600 IN RRSIG NSEC 8 3 3600 ( + 20181029010647 20181007175821 47155 uri.arpa. + U03NntQ73LHWpfLmUK8nMsqkwVsOGW2KdsyuHYAjqQSZvKbtmbv7HBmE + H1+Ii3Z+wtfdMZBy5aC/6sHdx69BfZJs16xumycMlAy6325DKTQbIMN+ + ift9GrKBC7cgCd2msF/uzSrYxxg4MJQzBPvlkwXnY3b7eJSlIXisBIn7 3b8= ) +http.uri.arpa. 604800 IN RRSIG NAPTR 8 3 604800 ( + 20181029011815 20181007205525 47155 uri.arpa. + T7mRrdag+WSmG+n22mtBSQ/0Y3v+rdDnfQV90LN5Fq32N5K2iYFajF7F + Tp56oOznytfcL4fHrqOE0wRc9NWOCCUec9C7Wa1gJQcllEvgoAM+L6f0 + RsEjWq6+9jvlLKMXQv0xQuMX17338uoD/xiAFQSnDbiQKxwWMqVAimv5 7Zs= ) +http.uri.arpa. 3600 IN NSEC mailto.uri.arpa. NAPTR ( + RRSIG NSEC ) +http.uri.arpa. 604800 IN NAPTR 0 0 "" "" ( + "!^http://([^:/?#]*).*$!\\1!i" . ) +mailto.uri.arpa. 3600 IN RRSIG NSEC 8 3 3600 ( + 20181028110727 20181007175821 47155 uri.arpa. + GvxzVL85rEukwGqtuLxek9ipwjBMfTOFIEyJ7afC8HxVMs6mfFa/nEM/ + IdFvvFg+lcYoJSQYuSAVYFl3xPbgrxVSLK125QutCFMdC/YjuZEnq5cl + fQciMRD7R3+znZfm8d8u/snLV9w4D+lTBZrJJUBe1Efc8vum5vvV7819 ZoY= ) +mailto.uri.arpa. 604800 IN RRSIG NAPTR 8 3 604800 ( + 20181028141825 20181007205525 47155 uri.arpa. + MaADUgc3fc5v++M0YmqjGk3jBdfIA5RuP62hUSlPsFZO4k37erjIGCfF + j+g84yc+QgbSde0PQHszl9fE/+SU5ZXiS9YdcbzSZxp2erFpZOTchrpg + 916T4vx6i59scodjb0l6bDyZ+mtIPrc1w6b4hUyOUTsDQoAJYxdfEuMg Vy4= ) +mailto.uri.arpa. 3600 IN NSEC urn.uri.arpa. NAPTR ( + RRSIG NSEC ) +mailto.uri.arpa. 604800 IN NAPTR 0 0 "" "" ( + "!^mailto:(.*)@(.*)$!\\2!i" . ) +urn.uri.arpa. 3600 IN RRSIG NSEC 8 3 3600 ( + 20181028123243 20181007175821 47155 uri.arpa. + Hgsw4Deops1O8uWyELGe6hpR/OEqCnTHvahlwiQkHhO5CSEQrbhmFAWe + UOkmGAdTEYrSz+skLRQuITRMwzyFf4oUkZihGyhZyzHbcxWfuDc/Pd/9 + DSl56gdeBwy1evn5wBTms8yWQVkNtphbJH395gRqZuaJs3LD/qTyJ5Dp LvA= ) +urn.uri.arpa. 604800 IN RRSIG NAPTR 8 3 604800 ( + 20181029071816 20181007205525 47155 uri.arpa. + ALIZD0vBqAQQt40GQ0Efaj8OCyE9xSRJRdyvyn/H/wZVXFRFKrQYrLAS + D/K7q6CMTOxTRCu2J8yes63WJiaJEdnh+dscXzZkmOg4n5PsgZbkvUSW + BiGtxvz5jNncM0xVbkjbtByrvJQAO1cU1mnlDKe1FmVB1uLpVdA9Ib4J hMU= ) +urn.uri.arpa. 3600 IN NSEC uri.arpa. NAPTR RRSIG ( + NSEC ) +urn.uri.arpa. 604800 IN NAPTR 0 0 "" "" ( + "/urn:([^:]+)/\\1/i" . ) +uri.arpa. 3600 IN SOA sns.dns.icann.org. ( + noc.dns.icann.org. 2018100702 10800 3600 1209600 3600 ) diff --git a/testdata/zonemd.example_a5.zone b/testdata/zonemd.example_a5.zone new file mode 100644 index 000000000..246f5e237 --- /dev/null +++ b/testdata/zonemd.example_a5.zone @@ -0,0 +1,48 @@ +root-servers.net. 3600000 IN SOA a.root-servers.net. ( + nstld.verisign-grs.com. 2018091100 14400 7200 1209600 3600000 ) +root-servers.net. 3600000 IN NS a.root-servers.net. +root-servers.net. 3600000 IN NS b.root-servers.net. +root-servers.net. 3600000 IN NS c.root-servers.net. +root-servers.net. 3600000 IN NS d.root-servers.net. +root-servers.net. 3600000 IN NS e.root-servers.net. +root-servers.net. 3600000 IN NS f.root-servers.net. +root-servers.net. 3600000 IN NS g.root-servers.net. +root-servers.net. 3600000 IN NS h.root-servers.net. +root-servers.net. 3600000 IN NS i.root-servers.net. +root-servers.net. 3600000 IN NS j.root-servers.net. +root-servers.net. 3600000 IN NS k.root-servers.net. +root-servers.net. 3600000 IN NS l.root-servers.net. +root-servers.net. 3600000 IN NS m.root-servers.net. +a.root-servers.net. 3600000 IN AAAA 2001:503:ba3e::2:30 +a.root-servers.net. 3600000 IN A 198.41.0.4 +b.root-servers.net. 3600000 IN MX 20 mail.isi.edu. +b.root-servers.net. 3600000 IN AAAA 2001:500:200::b +b.root-servers.net. 3600000 IN A 199.9.14.201 +c.root-servers.net. 3600000 IN AAAA 2001:500:2::c +c.root-servers.net. 3600000 IN A 192.33.4.12 +d.root-servers.net. 3600000 IN AAAA 2001:500:2d::d +d.root-servers.net. 3600000 IN A 199.7.91.13 +e.root-servers.net. 3600000 IN AAAA 2001:500:a8::e +e.root-servers.net. 3600000 IN A 192.203.230.10 +f.root-servers.net. 3600000 IN AAAA 2001:500:2f::f +f.root-servers.net. 3600000 IN A 192.5.5.241 +g.root-servers.net. 3600000 IN AAAA 2001:500:12::d0d +g.root-servers.net. 3600000 IN A 192.112.36.4 +h.root-servers.net. 3600000 IN AAAA 2001:500:1::53 +h.root-servers.net. 3600000 IN A 198.97.190.53 +i.root-servers.net. 3600000 IN MX 10 mx.i.root-servers.org. +i.root-servers.net. 3600000 IN AAAA 2001:7fe::53 +i.root-servers.net. 3600000 IN A 192.36.148.17 +j.root-servers.net. 3600000 IN AAAA 2001:503:c27::2:30 +j.root-servers.net. 3600000 IN A 192.58.128.30 +k.root-servers.net. 3600000 IN AAAA 2001:7fd::1 +k.root-servers.net. 3600000 IN A 193.0.14.129 +l.root-servers.net. 3600000 IN AAAA 2001:500:9f::42 +l.root-servers.net. 3600000 IN A 199.7.83.42 +m.root-servers.net. 3600000 IN AAAA 2001:dc3::35 +m.root-servers.net. 3600000 IN A 202.12.27.33 +root-servers.net. 3600000 IN SOA a.root-servers.net. ( + nstld.verisign-grs.com. 2018091100 14400 7200 1209600 3600000 ) +root-servers.net. 3600000 IN ZONEMD 2018091100 1 1 ( + f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a97 + 8a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79 ) From 2f7908b6690117ebb1d9dca23fd48733d09b3196 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 12:20:50 +0200 Subject: [PATCH 06/66] zonemd, unit test, note example origins. --- testcode/unitmain.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 8762bc169..35feb6827 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -921,16 +921,34 @@ static void zonemd_generate_tests(void) { zonemd_generate_test("example.org", "testdata/zonemd.example1.zone", 1, 2, "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.1 */ zonemd_generate_test("example", "testdata/zonemd.example_a1.zone", 1, 1, "c68090d90a7aed716bc459f9340e3d7c1370d4d24b7e2fc3a1ddc0b9a87153b9a9713b3c9ae5cc27777f98b8e730044c"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.2 */ zonemd_generate_test("example", "testdata/zonemd.example_a2.zone", 1, 1, "31cefb03814f5062ad12fa951ba0ef5f8da6ae354a415767246f7dc932ceb1e742a2108f529db6a33a11c01493de358d"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.3 SHA384 digest */ zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", 1, 1, "62e6cf51b02e54b9b5f967d547ce43136792901f9f88e637493daaf401c92c279dd10f0edb1c56f8080211f8480ee306"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.3 SHA512 digest*/ zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", 1, 2, "08cfa1115c7b948c4163a901270395ea226a930cd2cbcf2fa9a5e6eb85f37c8a4e114d884e66f176eab121cb02db7d652e0cc4827e7a3204f166b47e5613fd27"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.4 */ zonemd_generate_test("uri.arpa", "testdata/zonemd.example_a4.zone", 1, 1, "1291b78ddf7669b1a39d014d87626b709b55774c5d7d58fadc556439889a10eaf6f11d615900a4f996bd46279514e473"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.5 */ zonemd_generate_test("root-servers.net", "testdata/zonemd.example_a5.zone", 1, 1, "f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a978a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79"); } From 6a8ed4bb15a588aa39f477ed7edddb6dc59c69a6 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 13:59:44 +0200 Subject: [PATCH 07/66] zonemd, unit test, tests the check routine and reason for failure. --- testcode/unitmain.c | 71 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 35feb6827..7bb967b05 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -840,6 +840,7 @@ static void respip_test(void) } #include +#include "sldns/str2wire.h" #include "services/authzone.h" #include "util/data/dname.h" #include "util/regional.h" @@ -858,9 +859,9 @@ static void zonemd_generate_test(const char* zname, char* zfile, struct auth_zones* az; struct auth_zone* z; int result; - char* reason = NULL; struct regional* region = NULL; struct sldns_buffer* buf = NULL; + char* reason = NULL; char* digestdup; if(!zonemd_hashalgo_supported(hashalgo)) @@ -953,11 +954,79 @@ static void zonemd_generate_tests(void) 1, 1, "f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a978a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79"); } +/** test the zonemd check routine */ +static void zonemd_check_test(void) +{ + const char* zname = "example.org"; + char* zfile = "testdata/zonemd.example1.zone"; + int scheme = 1; + int hashalgo = 2; + const char* digest = "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"; + const char* digestwrong = "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D48100"; + uint8_t hash[512], hashwrong[512]; + size_t hashlen = 0, hashwronglen = 0; + struct auth_zones* az; + struct auth_zone* z; + int result; + struct regional* region = NULL; + struct sldns_buffer* buf = NULL; + char* reason = NULL; + + if(!zonemd_hashalgo_supported(hashalgo)) + return; /* cannot test unsupported algo */ + + /* setup environment */ + az = auth_zones_create(); + unit_assert(az); + region = regional_create(); + unit_assert(region); + buf = sldns_buffer_new(65535); + unit_assert(buf); + + /* read file */ + z = authtest_addzone(az, zname, zfile); + unit_assert(z); + hashlen = sizeof(hash); + if(sldns_str2wire_hex_buf(digest, hash, &hashlen) != 0) { + unit_assert(0); /* parse failure */ + } + hashwronglen = sizeof(hashwrong); + if(sldns_str2wire_hex_buf(digestwrong, hashwrong, &hashwronglen) != 0) { + unit_assert(0); /* parse failure */ + } + + /* check return values of the check routine */ + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hash, hashlen, region, buf, &reason); + unit_assert(result && reason == NULL); + result = auth_zone_generate_zonemd_check(z, 241, hashalgo, + hash, hashlen, region, buf, &reason); + unit_assert(!result && strcmp(reason, "unsupported scheme")==0); + result = auth_zone_generate_zonemd_check(z, scheme, 242, + hash, hashlen, region, buf, &reason); + unit_assert(!result && strcmp(reason, "unsupported algorithm")==0); + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hash, 2, region, buf, &reason); + unit_assert(!result && strcmp(reason, "digest length too small, less than 12")==0); + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hashwrong, hashwronglen, region, buf, &reason); + unit_assert(!result && strcmp(reason, "incorrect digest")==0); + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hashwrong, hashwronglen-3, region, buf, &reason); + unit_assert(!result && strcmp(reason, "incorrect digest length")==0); + + /* delete environment */ + auth_zones_delete(az); + regional_destroy(region); + sldns_buffer_free(buf); +} + /** zonemd unit tests */ static void zonemd_test(void) { unit_show_feature("zonemd"); zonemd_generate_tests(); + zonemd_check_test(); } void unit_show_func(const char* file, const char* func) From b20fefb858b3dc65af0933a74bed00eaf577e4c9 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 14:03:13 +0200 Subject: [PATCH 08/66] zonemd, unit test, reorder test order --- testcode/unitmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 7bb967b05..84d850e5f 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -1079,7 +1079,6 @@ main(int argc, char* argv[]) fatal_exit("could not init NSS"); #endif /* HAVE_SSL or HAVE_NSS*/ checklock_start(); - zonemd_test(); authzone_test(); neg_test(); rnd_test(); @@ -1097,6 +1096,7 @@ main(int argc, char* argv[]) slabhash_test(); infra_test(); ldns_test(); + zonemd_test(); msgparse_test(); #ifdef CLIENT_SUBNET ecs_test(); From 6cb0c4c61dfd662c778c7ccce24a117f3381cd21 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 14:30:56 +0200 Subject: [PATCH 09/66] zonemd, libnss implementation and libnettle implementation. Both succeed on unit tests. --- validator/val_secalgo.c | 133 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/validator/val_secalgo.c b/validator/val_secalgo.c index 18509ce85..4f3870d4d 100644 --- a/validator/val_secalgo.c +++ b/validator/val_secalgo.c @@ -886,6 +886,64 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res) (void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len); } +/** the secalgo hash structure */ +struct secalgo_hash { + /** hash context */ + HASHContext* ctx; +}; + +/** create hash struct of type */ +static struct secalgo_hash* secalgo_hash_create_type(HASH_HashType tp) +{ + struct secalgo_hash* h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->ctx = HASH_Create(tp); + if(!h->ctx) { + free(h); + return NULL; + } + return h; +} + +struct secalgo_hash* secalgo_hash_create_sha384(void) +{ + return secalgo_hash_create_type(HASH_AlgSHA384); +} + +struct secalgo_hash* secalgo_hash_create_sha512(void) +{ + return secalgo_hash_create_type(HASH_AlgSHA512); +} + +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len) +{ + HASH_Update(hash->ctx, (unsigned char*)data, (unsigned int)len); + return 1; +} + +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen) +{ + unsigned int reslen = 0; + if(HASH_ResultLenContext(hash->ctx) > (unsigned int)maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + HASH_End(hash->ctx, (unsigned char*)result, &reslen, + (unsigned int)maxlen); + *resultlen = (size_t)reslen; + return 1; +} + +void secalgo_hash_delete(struct secalgo_hash* hash) +{ + if(!hash) return; + HASH_Destroy(hash->ctx); + free(hash); +} + size_t ds_digest_size_supported(int algo) { @@ -1512,6 +1570,81 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res) _digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res); } +/** secalgo hash structure */ +struct secalgo_hash { + /** if it is 384 or 512 */ + int active; + /** context for sha384 */ + struct sha384_ctx ctx384; + /** context for sha512 */ + struct sha512_ctx ctx512; +}; + +struct secalgo_hash* secalgo_hash_create_sha384(void) +{ + struct secalgo_hash* h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->active = 384; + sha384_init(&h->ctx384); + return h; +} + +struct secalgo_hash* secalgo_hash_create_sha512(void) +{ + struct secalgo_hash* h = calloc(1, sizeof(*h)); + if(!h) + return NULL; + h->active = 512; + sha512_init(&h->ctx512); + return h; +} + +int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len) +{ + if(hash->active == 384) { + sha384_update(&hash->ctx384, len, data); + } else if(hash->active == 512) { + sha512_update(&hash->ctx512, len, data); + } else { + return 0; + } + return 1; +} + +int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, + size_t maxlen, size_t* resultlen) +{ + if(hash->active == 384) { + if(SHA384_DIGEST_SIZE > maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + *resultlen = SHA384_DIGEST_SIZE; + sha384_digest(&hash->ctx384, SHA384_DIGEST_SIZE, + (unsigned char*)result); + } else if(hash->active == 512) { + if(SHA512_DIGEST_SIZE > maxlen) { + *resultlen = 0; + log_err("secalgo_hash_final: hash buffer too small"); + return 0; + } + *resultlen = SHA512_DIGEST_SIZE; + sha512_digest(&hash->ctx512, SHA512_DIGEST_SIZE, + (unsigned char*)result); + } else { + return 0; + } + return 1; +} + +void secalgo_hash_delete(struct secalgo_hash* hash) +{ + if(!hash) return; + free(hash); +} + /** * Return size of DS digest according to its hash algorithm. * @param algo: DS digest algo. From 1dc4d7a9f61a225690e35e99b40539d942de0a53 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 14:40:26 +0200 Subject: [PATCH 10/66] zonemd, harden result length for unsupported algo in nettle digest final. --- validator/val_secalgo.c | 1 + 1 file changed, 1 insertion(+) diff --git a/validator/val_secalgo.c b/validator/val_secalgo.c index 908155d6f..a4d020143 100644 --- a/validator/val_secalgo.c +++ b/validator/val_secalgo.c @@ -1636,6 +1636,7 @@ int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result, sha512_digest(&hash->ctx512, SHA512_DIGEST_SIZE, (unsigned char*)result); } else { + *resultlen = 0; return 0; } return 1; From c49a4e60fe2c6d3cbb3da1ac64953f9099a24447 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 15:05:46 +0200 Subject: [PATCH 11/66] zonemd, doxygen comment fix. --- services/authzone.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/authzone.h b/services/authzone.h index 6dd9c30b3..4df8c54c6 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -716,7 +716,7 @@ int zonemd_scheme_supported(int scheme); * @param scheme: zonemd scheme. * @param hashalgo: zonemd hash algorithm. * @param hash: the hash to check. - * @param buflen: length of hash buffer. + * @param hashlen: length of hash buffer. * @param region: temp region for allocs during canonicalisation. * @param buf: temp buffer during canonicalisation. * @param reason: string returned with failure reason. From 0af62aba53234deeb95d0c7e35d81015ea7eebd4 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 15:14:27 +0200 Subject: [PATCH 12/66] zonemd, defines for scheme and algorithm. --- services/authzone.c | 20 ++++++++++---------- services/authzone.h | 7 +++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 7ba273b52..c3c472f06 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -6969,14 +6969,14 @@ compare_serial(uint32_t a, uint32_t b) int zonemd_hashalgo_supported(int hashalgo) { - if(hashalgo == 1) return 1; - if(hashalgo == 2) return 1; + if(hashalgo == ZONEMD_ALGO_SHA384) return 1; + if(hashalgo == ZONEMD_ALGO_SHA512) return 1; return 0; } int zonemd_scheme_supported(int scheme) { - if(scheme == 1) return 1; + if(scheme == ZONEMD_SCHEME_SIMPLE) return 1; return 0; } @@ -6984,13 +6984,13 @@ int zonemd_scheme_supported(int scheme) static struct secalgo_hash* zonemd_digest_init(int hashalgo, char** reason) { struct secalgo_hash *h; - if(hashalgo == 1) { + if(hashalgo == ZONEMD_ALGO_SHA384) { /* sha384 */ h = secalgo_hash_create_sha384(); if(!h) *reason = "digest sha384 could not be created"; return h; - } else if(hashalgo == 2) { + } else if(hashalgo == ZONEMD_ALGO_SHA512) { /* sha512 */ h = secalgo_hash_create_sha512(); if(!h) @@ -7006,13 +7006,13 @@ static struct secalgo_hash* zonemd_digest_init(int hashalgo, char** reason) static int zonemd_digest_update(int hashalgo, struct secalgo_hash* h, uint8_t* data, size_t len, char** reason) { - if(hashalgo == 1) { + if(hashalgo == ZONEMD_ALGO_SHA384) { if(!secalgo_hash_update(h, data, len)) { *reason = "digest sha384 failed"; return 0; } return 1; - } else if(hashalgo == 2) { + } else if(hashalgo == ZONEMD_ALGO_SHA512) { if(!secalgo_hash_update(h, data, len)) { *reason = "digest sha512 failed"; return 0; @@ -7028,7 +7028,7 @@ static int zonemd_digest_update(int hashalgo, struct secalgo_hash* h, static int zonemd_digest_finish(int hashalgo, struct secalgo_hash* h, uint8_t* result, size_t hashlen, size_t* resultlen, char** reason) { - if(hashalgo == 1) { + if(hashalgo == ZONEMD_ALGO_SHA384) { if(hashlen < 384/8) { *reason = "digest buffer too small for sha384"; return 0; @@ -7038,7 +7038,7 @@ static int zonemd_digest_finish(int hashalgo, struct secalgo_hash* h, return 0; } return 1; - } else if(hashalgo == 2) { + } else if(hashalgo == ZONEMD_ALGO_SHA512) { if(hashlen < 512/8) { *reason = "digest buffer too small for sha512"; return 0; @@ -7347,7 +7347,7 @@ int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, *reason = "digest init fail"; return 0; } - if(scheme == 1) { + if(scheme == ZONEMD_SCHEME_SIMPLE) { if(!zonemd_simple_collate(z, hashalgo, h, region, buf, reason)) { if(!*reason) *reason = "scheme simple collate fail"; secalgo_hash_delete(h); diff --git a/services/authzone.h b/services/authzone.h index 4df8c54c6..6a0a79da4 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -704,6 +704,13 @@ int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, int hashalgo, uint8_t* hash, size_t buflen, size_t* resultlen, struct regional* region, struct sldns_buffer* buf, char** reason); +/** ZONEMD scheme definitions */ +#define ZONEMD_SCHEME_SIMPLE 1 + +/** ZONEMD hash algorithm definition for SHA384 */ +#define ZONEMD_ALGO_SHA384 1 +/** ZONEMD hash algorithm definition for SHA512 */ +#define ZONEMD_ALGO_SHA512 2 /** returns true if a zonemd hash algo is supported */ int zonemd_hashalgo_supported(int hashalgo); From 754e6f13497a3613ae5f682c7beeade230cfc1e8 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 16:46:20 +0200 Subject: [PATCH 13/66] zonemd, routine to check zonemd hash if present --- services/authzone.c | 109 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/services/authzone.c b/services/authzone.c index c3c472f06..d58e2a481 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1761,6 +1761,115 @@ auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg) return 1; } +/** fetch the content of a ZONEMD RR from the rdata */ +static int zonemd_fetch_parameters(struct auth_rrset* zonemd_rrset, size_t i, + uint32_t* serial, int* scheme, int* hashalgo, uint8_t** hash, + size_t* hashlen) +{ + size_t rr_len; + uint8_t* rdata; + if(i >= zonemd_rrset->data->count) + return 0; + rr_len = zonemd_rrset->data->rr_len[i]; + if(rr_len < 2+4+1+1) + return 0; /* too short, for rdlen+serial+scheme+algo */ + rdata = zonemd_rrset->data->rr_data[i]; + *serial = sldns_read_uint32(rdata+2); + *scheme = rdata[6]; + *hashalgo = rdata[7]; + *hashlen = rr_len - 8; + if(*hashlen == 0) + *hash = NULL; + else *hash = rdata+8; + return 1; +} + +/** + * Check ZONEMDs if present for the auth zone. Depending on config + * it can warn or fail on that. Checks the hash of the ZONEMD. + * @param z: auth zone to check for. + * caller must hold lock on zone. + * @param cfg: config file options + */ +void auth_zone_zonemd_check_hash(struct auth_zone* z /*, struct config_file* cfg*/) +{ + /* loop over ZONEMDs and see which one is valid. if not print + * failure (depending on config) */ + struct auth_data* apex; + struct auth_rrset* zonemd_rrset; + size_t i; + char* reason = NULL; + struct regional* region = NULL; + struct sldns_buffer* buf = NULL; + char zstr[255+1]; + uint32_t soa_serial = 0; + region = regional_create(); + if(!region) { + return; + } + buf = sldns_buffer_new(65535); + if(!buf) { + regional_destroy(region); + return; + } + if(!auth_zone_get_serial(z, &soa_serial)) { + regional_destroy(region); + sldns_buffer_free(buf); + return; + } + + apex = az_find_name(z, z->name, z->namelen); + if(!apex) { + regional_destroy(region); + sldns_buffer_free(buf); + return; + } + zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD); + if(!zonemd_rrset || zonemd_rrset->data->count==0) { + regional_destroy(region); + sldns_buffer_free(buf); + return; /* no RRset or no RRs in rrset */ + } + + /* we have a ZONEMD, check if it is correct */ + for(i=0; idata->count; i++) { + uint32_t serial = 0; + int scheme = 0, hashalgo = 0; + uint8_t* hash = NULL; + size_t hashlen = 0; + if(!zonemd_fetch_parameters(zonemd_rrset, i, &serial, &scheme, + &hashalgo, &hash, &hashlen)) { + /* malformed RR */ + reason = "ZONEMD rdata malformed"; + continue; + } + if(serial != soa_serial) { + reason = "ZONEMD serial is wrong"; + continue; + } + if(auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hash, hashlen, region, buf, &reason)) { + /* success */ + if(verbosity >= VERB_ALGO) { + dname_str(z->name, zstr); + verbose(VERB_ALGO, "auth-zone %s ZONEMD hash is correct", zstr); + } + regional_destroy(region); + sldns_buffer_free(buf); + return; + } + /* try next one */ + } + /* fail, we may have reason */ + if(!reason) + reason = "no ZONEMD records found"; + dname_str(z->name, zstr); + log_warn("auth-zone %s ZONEMD failed: %s", zstr, reason); + + regional_destroy(region); + sldns_buffer_free(buf); +} + /** find serial number of zone or false if none */ int auth_zone_get_serial(struct auth_zone* z, uint32_t* serial) From efc01c928cdf89ea999ae3e80b4ed338f8dacf6b Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 9 Oct 2020 16:47:49 +0200 Subject: [PATCH 14/66] Formatting. --- services/authzone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/authzone.c b/services/authzone.c index d58e2a481..143350665 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1783,7 +1783,7 @@ static int zonemd_fetch_parameters(struct auth_rrset* zonemd_rrset, size_t i, else *hash = rdata+8; return 1; } - + /** * Check ZONEMDs if present for the auth zone. Depending on config * it can warn or fail on that. Checks the hash of the ZONEMD. From 22e82765f99ccf4060f1c15a1a316d0699df7bbf Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 14 Oct 2020 13:34:50 +0200 Subject: [PATCH 15/66] zonemd, dnssec verification routines. --- services/authzone.c | 555 +++++++++++++++++++++++++++++++++++++++++--- services/authzone.h | 18 ++ util/fptr_wlist.c | 1 + 3 files changed, 541 insertions(+), 33 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 143350665..df77b12a2 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -69,6 +69,8 @@ #include "validator/val_nsec3.h" #include "validator/val_secalgo.h" #include "validator/val_sigcrypt.h" +#include "validator/val_anchor.h" +#include "validator/val_utils.h" #include /** bytes to use for NSEC3 hash buffer. 20 for sha1 */ @@ -1789,46 +1791,39 @@ static int zonemd_fetch_parameters(struct auth_rrset* zonemd_rrset, size_t i, * it can warn or fail on that. Checks the hash of the ZONEMD. * @param z: auth zone to check for. * caller must hold lock on zone. - * @param cfg: config file options + * @param env: module env for temp buffers. + * @param reason: returned on failure. + * @return false on failure, true if hash checks out. */ -void auth_zone_zonemd_check_hash(struct auth_zone* z /*, struct config_file* cfg*/) +static int auth_zone_zonemd_check_hash(struct auth_zone* z, + struct module_env* env, char** reason) { /* loop over ZONEMDs and see which one is valid. if not print * failure (depending on config) */ struct auth_data* apex; struct auth_rrset* zonemd_rrset; size_t i; - char* reason = NULL; struct regional* region = NULL; struct sldns_buffer* buf = NULL; char zstr[255+1]; uint32_t soa_serial = 0; - region = regional_create(); - if(!region) { - return; - } - buf = sldns_buffer_new(65535); - if(!buf) { - regional_destroy(region); - return; - } + region = env->scratch; + regional_free_all(region); + buf = env->scratch_buffer; if(!auth_zone_get_serial(z, &soa_serial)) { - regional_destroy(region); - sldns_buffer_free(buf); - return; + *reason = "zone has no SOA serial"; + return 0; } apex = az_find_name(z, z->name, z->namelen); if(!apex) { - regional_destroy(region); - sldns_buffer_free(buf); - return; + *reason = "zone has no apex"; + return 0; } zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD); if(!zonemd_rrset || zonemd_rrset->data->count==0) { - regional_destroy(region); - sldns_buffer_free(buf); - return; /* no RRset or no RRs in rrset */ + *reason = "zone has no ZONEMD"; + return 0; /* no RRset or no RRs in rrset */ } /* we have a ZONEMD, check if it is correct */ @@ -1840,34 +1835,31 @@ void auth_zone_zonemd_check_hash(struct auth_zone* z /*, struct config_file* cfg if(!zonemd_fetch_parameters(zonemd_rrset, i, &serial, &scheme, &hashalgo, &hash, &hashlen)) { /* malformed RR */ - reason = "ZONEMD rdata malformed"; + *reason = "ZONEMD rdata malformed"; continue; } + regional_free_all(region); if(serial != soa_serial) { - reason = "ZONEMD serial is wrong"; + *reason = "ZONEMD serial is wrong"; continue; } if(auth_zone_generate_zonemd_check(z, scheme, hashalgo, - hash, hashlen, region, buf, &reason)) { + hash, hashlen, region, buf, reason)) { /* success */ if(verbosity >= VERB_ALGO) { dname_str(z->name, zstr); verbose(VERB_ALGO, "auth-zone %s ZONEMD hash is correct", zstr); } - regional_destroy(region); - sldns_buffer_free(buf); - return; + return 1; } /* try next one */ } /* fail, we may have reason */ - if(!reason) - reason = "no ZONEMD records found"; + if(!*reason) + *reason = "no ZONEMD records found"; dname_str(z->name, zstr); - log_warn("auth-zone %s ZONEMD failed: %s", zstr, reason); - - regional_destroy(region); - sldns_buffer_free(buf); + log_warn("auth-zone %s ZONEMD failed: %s", zstr, *reason); + return 0; } /** find serial number of zone or false if none */ @@ -7501,12 +7493,509 @@ int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, /* check digest length */ if(hashlen != genlen) { *reason = "incorrect digest length"; + if(verbosity >= VERB_ALGO) { + verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d", + scheme, hashalgo); + log_hex("ZONEMD should be ", gen, genlen); + log_hex("ZONEMD to check is", hash, hashlen); + } return 0; } /* check digest */ if(memcmp(hash, gen, genlen) != 0) { *reason = "incorrect digest"; + if(verbosity >= VERB_ALGO) { + verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d", + scheme, hashalgo); + log_hex("ZONEMD should be ", gen, genlen); + log_hex("ZONEMD to check is", hash, hashlen); + } return 0; } return 1; } + +/** log auth zone message with zone name in front. */ +static void auth_zone_log(uint8_t* name, enum verbosity_value level, const char* format, ...) ATTR_FORMAT(printf, 3, 4); +static void auth_zone_log(uint8_t* name, enum verbosity_value level, const char* format, ...) +{ + va_list args; + va_start(args, format); + if(verbosity >= level) { + char str[255+1]; + char msg[MAXSYSLOGMSGLEN]; + dname_str(name, str); + vsnprintf(msg, sizeof(msg), format, args); + verbose(level, "auth zone %s %s", str, msg); + } + va_end(args); +} + +/** ZONEMD, dnssec verify the rrset with the dnskey */ +static int zonemd_dnssec_verify(struct auth_zone* z, struct module_env* env, + struct ub_packed_rrset_key* dnskey, struct auth_rrset* rrset) +{ + struct ub_packed_rrset_key pk; + enum sec_status sec; + struct val_env* ve; + int m; + char* why_bogus = NULL; + m = modstack_find(&env->mesh->mods, "validator"); + if(m == -1) { + auth_zone_log(z->name, VERB_ALGO, "zonemd dnssec verify: have " + "trust anchor, but no validator module"); + return 0; + } + ve = (struct val_env*)env->modinfo[m]; + + memset(&pk, 0, sizeof(pk)); + pk.entry.key = &pk; + pk.entry.data = rrset->data; + pk.rk.dname = z->name; + pk.rk.dname_len = z->namelen; + pk.rk.type = htons(rrset->type); + pk.rk.rrset_class = htons(z->dclass); + auth_zone_log(z->name, VERB_ALGO, + "zonemd: verify RRset with DNSKEY"); + /* pass NULL for qstate, it is only used for qtype NSEC to realloc + * a new name in the qstate region */ + sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, NULL, &why_bogus, + LDNS_SECTION_ANSWER, NULL); + regional_free_all(env->scratch); + if(sec == sec_status_secure) { + return 1; + } + if(why_bogus) + auth_zone_log(z->name, VERB_ALGO, "DNSSEC verify was bogus: %s", why_bogus); + return 0; +} + +/** Verify the absence of ZONEMD with DNSSEC by checking NSEC, NSEC3 type flag. + * return false on failure, reason contains description of failure. */ +static int zonemd_check_dnssec_absence(struct auth_zone* z, + struct module_env* env, struct ub_packed_rrset_key* dnskey, + struct auth_data* apex, char** reason) +{ + struct auth_rrset* nsec = NULL; + if(!apex) { + *reason = "zone has no apex domain but ZONEMD missing"; + return 0; + } + nsec = az_domain_rrset(apex, LDNS_RR_TYPE_NSEC); + if(nsec) { + /* dnssec verify the NSEC */ + if(!zonemd_dnssec_verify(z, env, dnskey, nsec)) { + *reason = "DNSSEC verify failed for NSEC RRset"; + return 0; + } + /* check type bitmap */ + } else { + /* NSEC3 perhaps ? */ + int algo; + size_t iter, saltlen; + uint8_t* salt; + struct auth_rrset* nsec3param = az_domain_rrset(apex, + LDNS_RR_TYPE_NSEC3PARAM); + struct auth_data* match; + struct auth_rrset* nsec3; + if(!nsec3param) { + *reason = "zone has no NSEC information but ZONEMD missing"; + return 0; + } + if(!az_nsec3_param(z, &algo, &iter, &salt, &saltlen)) { + *reason = "zone has no NSEC information but ZONEMD missing"; + return 0; + } + /* find the NSEC3 record */ + match = az_nsec3_find_exact(z, z->name, z->namelen, algo, + iter, salt, saltlen); + if(!match) { + *reason = "zone has no NSEC3 domain for the apex but ZONEMD missing"; + return 0; + } + nsec3 = az_domain_rrset(match, LDNS_RR_TYPE_NSEC3); + if(!nsec3) { + *reason = "zone has no NSEC3 RRset for the apex but ZONEMD missing"; + return 0; + } + /* dnssec verify the NSEC3 */ + if(!zonemd_dnssec_verify(z, env, dnskey, nsec3)) { + *reason = "DNSSEC verify failed for NSEC3 RRset"; + return 0; + } + /* check type bitmap */ + } + + return 1; +} + +/** Verify the SOA and ZONEMD DNSSEC signatures. + * return false on failure, reason contains description of failure. */ +static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, + struct module_env* env, struct ub_packed_rrset_key* dnskey, + struct auth_data* apex, struct auth_rrset* zonemd_rrset, + char** reason) +{ + struct auth_rrset* soa; + if(!apex) { + *reason = "zone has no apex domain"; + return 0; + } + soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA); + if(!soa) { + *reason = "zone has no SOA RRset"; + return 0; + } + if(!zonemd_dnssec_verify(z, env, dnskey, soa)) { + *reason = "DNSSEC verify failed for SOA RRset"; + return 0; + } + if(!zonemd_dnssec_verify(z, env, dnskey, zonemd_rrset)) { + *reason = "DNSSEC verify failed for ZONEMD RRset"; + return 0; + } + auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC verification of SOA and ZONEMD RRsets secure"); + return 1; +} + +/** + * Fail the ZONEMD verification. + * @param z: auth zone that fails. + * @param env: environment with config, to ignore failure or not. + * @param reason: failure string description. + */ +static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, + char* reason) +{ + char zstr[255+1]; + /* if fail: log reason, and depending on config also take action + * and drop the zone, eg. it is gone from memory, set zone_expired */ + dname_str(z->name, zstr); + if(!reason) reason = "verification failed"; + log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason); + + /* expired means the zone gives servfail and is not used by + * lookup if fallback_enabled*/ + z->zone_expired = 1; +} + +/** + * Verify the zonemd with DNSSEC and hash check, with given key. + * @param z: auth zone. + * @param env: environment with config and temp buffers. + * @param dnskey: dnskey that we can use, or NULL. If nonnull, the key + * has been verified and is the start of the chain of trust. + * @param is_insecure: if true, the dnskey is not used, the zone is insecure. + * And dnssec is not used. It is DNSSEC secure insecure or not under + * a trust anchor. + */ +static void +auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, + struct ub_packed_rrset_key* dnskey, int is_insecure) +{ + char* reason = NULL; + struct auth_data* apex = NULL; + struct auth_rrset* zonemd_rrset = NULL; + int zonemd_absent = 0; + + /* see if ZONEMD is present or absent. */ + apex = az_find_name(z, z->name, z->namelen); + if(!apex) { + zonemd_absent = 1; + } else { + zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD); + if(!zonemd_rrset || zonemd_rrset->data->count==0) { + zonemd_absent = 1; + zonemd_rrset = NULL; + } + } + + /* if no ZONEMD, and no DNSSEC, done. */ + /* if no ZONEMD, and DNSSEC, use DNSKEY to verify NSEC or NSEC3 for + * zone apex. Check ZONEMD bit is turned off or else fail */ + /* if ZONEMD, and DNSSEC, check DNSSEC signature on SOA and ZONEMD, + * or else fail */ + if(!zonemd_rrset && is_insecure) { + /* success, zonemd is absent */ + } else if(!zonemd_rrset) { + /* fetch, DNSSEC verify, and check NSEC/NSEC3 */ + if(!zonemd_check_dnssec_absence(z, env, dnskey, apex, + &reason)) { + auth_zone_zonemd_fail(z, env, reason); + return; + } + } else if(zonemd_rrset && dnskey) { + /* check DNSSEC verify of SOA and ZONEMD */ + if(!zonemd_check_dnssec_soazonemd(z, env, dnskey, apex, + zonemd_rrset, &reason)) { + auth_zone_zonemd_fail(z, env, reason); + return; + } + } + + /* check ZONEMD checksum and report or else fail. */ + if(!auth_zone_zonemd_check_hash(z, env, &reason)) { + auth_zone_zonemd_fail(z, env, reason); + return; + } + + if(zonemd_absent) + auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config"); + /* success! log the success */ + auth_zone_log(z->name, VERB_ALGO, "ZONEMD verification successful"); +} + +/** + * verify the zone DNSKEY rrset from the trust anchor + * This is possible because the anchor is for the zone itself, and can + * thus apply straight to the zone DNSKEY set. + * @param z: the auth zone. + * @param env: environment with time and temp buffers. + * @param anchor: trust anchor to use + * @param is_insecure: returned, true if the zone is securely insecure. + * @param reason: if the routine fails, returns the failure reason. + * @param keystorage: where to store the ub_packed_rrset_key that is created + * on success. A pointer to it is returned on success. + * @return the dnskey RRset, reference to zone data and keystorage, or + * NULL on failure. + */ +static struct ub_packed_rrset_key* +zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, + struct trust_anchor* anchor, int* is_insecure, char** reason, + struct ub_packed_rrset_key* keystorage) +{ + struct auth_data* apex; + struct auth_rrset* dnskey_rrset; + enum sec_status sec; + struct val_env* ve; + int m; + + apex = az_find_name(z, z->name, z->namelen); + if(!apex) { + *reason = "have trust anchor, but zone has no apex domain for DNSKEY"; + return 0; + } + dnskey_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_DNSKEY); + if(!dnskey_rrset || dnskey_rrset->data->count==0) { + *reason = "have trust anchor, but zone has no DNSKEY"; + return 0; + } + + m = modstack_find(&env->mesh->mods, "validator"); + if(m == -1) { + *reason = "have trust anchor, but no validator module"; + return 0; + } + ve = (struct val_env*)env->modinfo[m]; + + memset(keystorage, 0, sizeof(*keystorage)); + keystorage->entry.key = keystorage; + keystorage->entry.data = dnskey_rrset->data; + keystorage->rk.dname = apex->name; + keystorage->rk.dname_len = apex->namelen; + keystorage->rk.type = htons(LDNS_RR_TYPE_DNSKEY); + keystorage->rk.rrset_class = htons(z->dclass); + auth_zone_log(z->name, VERB_QUERY, + "zonemd: verify DNSKEY RRset with trust anchor"); + /* pass NULL for qstate, it is only used when type NSEC needs a + * name reallocated to get the qstate region for that */ + sec = val_verify_DNSKEY_with_TA(env, ve, keystorage, anchor->ds_rrset, + anchor->dnskey_rrset, NULL, reason, NULL); + regional_free_all(env->scratch); + if(sec == sec_status_secure) { + /* success */ + *is_insecure = 0; + return keystorage; + } else if(sec == sec_status_insecure) { + /* insecure */ + *is_insecure = 1; + } else { + /* bogus */ + *is_insecure = 0; + } + return NULL; +} + +/** callback for ZONEMD lookup of DNSKEY */ +void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, + enum sec_status sec, char* why_bogus, int ATTR_UNUSED(was_ratelimited)) +{ + struct auth_zone* z = (struct auth_zone*)arg; + struct module_env* env; + char* reason = NULL; + struct ub_packed_rrset_key* dnskey = NULL; + int is_insecure = 0; + + lock_rw_wrlock(&z->lock); + env = z->zonemd_callback_env; + /* release the env variable so another worker can pick up the + * ZONEMD verification task if it wants to */ + z->zonemd_callback_env = NULL; + if(!env || env->outnet->want_to_quit) { + lock_rw_unlock(&z->lock); + return; /* stop on quit */ + } + + /* process result */ + if(sec == sec_status_bogus) { + reason = why_bogus; + if(!reason) + reason = "lookup of DNSKEY was bogus"; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was bogus: %s", why_bogus); + } else if(rcode == LDNS_RCODE_NOERROR) { + uint16_t wanted_qtype = LDNS_RR_TYPE_DNSKEY; + struct regional* temp = env->scratch; + struct query_info rq; + struct reply_info* rep; + memset(&rq, 0, sizeof(rq)); + rep = parse_reply_in_temp_region(buf, temp, &rq); + if(rep && rq.qtype == wanted_qtype && + FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR) { + /* parsed successfully */ + struct ub_packed_rrset_key* answer = + reply_find_answer_rrset(&rq, rep); + if(answer && sec == sec_status_secure) { + dnskey = answer; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was secure"); + } else if(sec == sec_status_secure && !answer) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY has no content, but is secure, treat as insecure"); + } else if(sec == sec_status_insecure) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was insecure"); + } else if(sec == sec_status_indeterminate) { + is_insecure = 1; + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY was indeterminate, treat as insecure"); + } else { + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY has nodata"); + reason = "lookup of DNSKEY has nodata"; + } + } else { + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY has no answer"); + reason = "lookup of DNSKEY has no answer"; + } + } else { + auth_zone_log(z->name, VERB_ALGO, + "zonemd lookup of DNSKEY failed"); + reason = "lookup of DNSKEY failed"; + } + + if(reason) { + auth_zone_zonemd_fail(z, env, reason); + lock_rw_unlock(&z->lock); + return; + } + + auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure); + lock_rw_unlock(&z->lock); +} + +/** lookup DNSKEY for ZONEMD verification */ +static int +zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env) +{ + struct query_info qinfo; + uint16_t qflags = BIT_RD; + struct edns_data edns; + sldns_buffer* buf = env->scratch_buffer; + + if(z->zonemd_callback_env) { + /* another worker is already working on the callback + * for the DNSKEY lookup for ZONEMD verification. + * We do not also have to do ZONEMD verification, let that + * worker do it */ + auth_zone_log(z->name, VERB_ALGO, + "zonemd needs lookup of DNSKEY and that already worked on by another worker"); + return 1; + } + + /* use mesh_new_callback to lookup the DNSKEY, + * and then wait for them to be looked up (in cache, or query) */ + qinfo.qname_len = z->namelen; + qinfo.qname = z->name; + qinfo.qclass = z->dclass; + qinfo.qtype = LDNS_RR_TYPE_DNSKEY; + qinfo.local_alias = NULL; + if(verbosity >= VERB_ALGO) { + char buf1[512]; + char buf2[LDNS_MAX_DOMAINLEN+1]; + dname_str(z->name, buf2); + snprintf(buf1, sizeof(buf1), "auth zone %s: lookup DNSKEY " + "for zonemd verification", buf2); + log_query_info(VERB_ALGO, buf1, &qinfo); + } + edns.edns_present = 1; + edns.ext_rcode = 0; + edns.edns_version = 0; + edns.bits = EDNS_DO; + edns.opt_list = NULL; + if(sldns_buffer_capacity(buf) < 65535) + edns.udp_size = (uint16_t)sldns_buffer_capacity(buf); + else edns.udp_size = 65535; + + /* store the worker-specific module env for the callback. + * We can then reference this when the callback executes */ + z->zonemd_callback_env = env; + /* the callback can be called straight away */ + lock_rw_unlock(&z->lock); + if(!mesh_new_callback(env->mesh, &qinfo, qflags, &edns, buf, 0, + &auth_zonemd_dnskey_lookup_callback, z)) { + lock_rw_wrlock(&z->lock); + log_err("out of memory lookup up dnskey for zonemd"); + return 0; + } + lock_rw_wrlock(&z->lock); + return 1; +} + +void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env) +{ + char* reason = NULL; + struct trust_anchor* anchor = NULL; + struct ub_packed_rrset_key* dnskey = NULL; + struct ub_packed_rrset_key keystorage; + int is_insecure = 0; + /* verify the ZONEMD if present. + * If not present check if absence is allowed by DNSSEC */ + + /* if zone is under a trustanchor */ + /* is it equal to trustanchor - get dnskey's verified */ + /* else, find chain of trust by fetching DNSKEYs lookup for zone */ + /* result if that, if insecure, means no DNSSEC for the ZONEMD, + * otherwise we have the zone DNSKEY for the DNSSEC verification. */ + anchor = anchors_lookup(env->anchors, z->name, z->namelen, z->dclass); + if(anchor && query_dname_compare(z->name, anchor->name) == 0) { + /* equal to trustanchor, no need for online lookups */ + dnskey = zonemd_get_dnskey_from_anchor(z, env, anchor, + &is_insecure, &reason, &keystorage); + if(!dnskey && !reason) { + reason = "dnskey verify with anchor failed"; + } + } else if(anchor) { + /* perform online lookups */ + /* setup online lookups, and wait for them */ + if(zonemd_lookup_dnskey(z, env)) { + /* wait for the lookup */ + return; + } + reason = "could not lookup DNSKEY for chain of trust"; + } else { + /* the zone is not under a trust anchor */ + dnskey = NULL; + is_insecure = 1; + } + + if(reason) { + auth_zone_zonemd_fail(z, env, reason); + return; + } + + auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure); +} diff --git a/services/authzone.h b/services/authzone.h index 6a0a79da4..69ec7ed99 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -134,6 +134,11 @@ struct auth_zone { int for_upstream; /** RPZ zones */ struct rpz* rpz; + /** store the env (worker thread specific) for the zonemd callbacks + * from the mesh with the results of the lookup, if nonNULL, some + * worker has already picked up the zonemd verification task and + * this worked does not have to do it as well. */ + struct module_env* zonemd_callback_env; /** zone has been deleted */ int zone_deleted; /** deletelist pointer, unused normally except during delete */ @@ -733,4 +738,17 @@ int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region, struct sldns_buffer* buf, char** reason); +/** + * Perform ZONEMD checks and verification for the auth zone. + * This includes DNSSEC verification if applicable. + * @param z: auth zone to check. Caller holds lock. wrlock. + * @param env: with temp region, buffer and config. + */ +void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env); + +/** mesh callback for zonemd on lookup of dnskey */ +void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, + struct sldns_buffer* buf, enum sec_status sec, char* why_bogus, + int was_ratelimited); + #endif /* SERVICES_AUTHZONE_H */ diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c index 7d15d1075..1469e8213 100644 --- a/util/fptr_wlist.c +++ b/util/fptr_wlist.c @@ -581,6 +581,7 @@ int fptr_whitelist_mesh_cb(mesh_cb_func_type fptr) else if(fptr == &probe_answer_cb) return 1; else if(fptr == &auth_xfer_probe_lookup_callback) return 1; else if(fptr == &auth_xfer_transfer_lookup_callback) return 1; + else if(fptr == &auth_zonemd_dnskey_lookup_callback) return 1; return 0; } From 42d7cdb7d58425456fc6607db89c8a70e8f4d68b Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 14 Oct 2020 14:46:59 +0200 Subject: [PATCH 16/66] zonemd, region freed, and qstate not used when not in a query, and nsec and nsec3 bitmap checks. --- services/authzone.c | 71 ++++++++++++++++++++++++++++++---------- validator/val_sigcrypt.c | 2 +- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index df77b12a2..0507c66ca 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -67,6 +67,7 @@ #include "sldns/parseutil.h" #include "sldns/keyraw.h" #include "validator/val_nsec3.h" +#include "validator/val_nsec.h" #include "validator/val_secalgo.h" #include "validator/val_sigcrypt.h" #include "validator/val_anchor.h" @@ -7516,8 +7517,10 @@ int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, } /** log auth zone message with zone name in front. */ -static void auth_zone_log(uint8_t* name, enum verbosity_value level, const char* format, ...) ATTR_FORMAT(printf, 3, 4); -static void auth_zone_log(uint8_t* name, enum verbosity_value level, const char* format, ...) +static void auth_zone_log(uint8_t* name, enum verbosity_value level, + const char* format, ...) ATTR_FORMAT(printf, 3, 4); +static void auth_zone_log(uint8_t* name, enum verbosity_value level, + const char* format, ...) { va_list args; va_start(args, format); @@ -7532,8 +7535,9 @@ static void auth_zone_log(uint8_t* name, enum verbosity_value level, const char* } /** ZONEMD, dnssec verify the rrset with the dnskey */ -static int zonemd_dnssec_verify(struct auth_zone* z, struct module_env* env, - struct ub_packed_rrset_key* dnskey, struct auth_rrset* rrset) +static int zonemd_dnssec_verify_rrset(struct auth_zone* z, + struct module_env* env, struct ub_packed_rrset_key* dnskey, + struct auth_data* node, struct auth_rrset* rrset) { struct ub_packed_rrset_key pk; enum sec_status sec; @@ -7543,7 +7547,7 @@ static int zonemd_dnssec_verify(struct auth_zone* z, struct module_env* env, m = modstack_find(&env->mesh->mods, "validator"); if(m == -1) { auth_zone_log(z->name, VERB_ALGO, "zonemd dnssec verify: have " - "trust anchor, but no validator module"); + "DNSKEY chain of trust, but no validator module"); return 0; } ve = (struct val_env*)env->modinfo[m]; @@ -7551,17 +7555,14 @@ static int zonemd_dnssec_verify(struct auth_zone* z, struct module_env* env, memset(&pk, 0, sizeof(pk)); pk.entry.key = &pk; pk.entry.data = rrset->data; - pk.rk.dname = z->name; - pk.rk.dname_len = z->namelen; + pk.rk.dname = node->name; + pk.rk.dname_len = node->namelen; pk.rk.type = htons(rrset->type); pk.rk.rrset_class = htons(z->dclass); auth_zone_log(z->name, VERB_ALGO, "zonemd: verify RRset with DNSKEY"); - /* pass NULL for qstate, it is only used for qtype NSEC to realloc - * a new name in the qstate region */ sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, NULL, &why_bogus, LDNS_SECTION_ANSWER, NULL); - regional_free_all(env->scratch); if(sec == sec_status_secure) { return 1; } @@ -7570,6 +7571,30 @@ static int zonemd_dnssec_verify(struct auth_zone* z, struct module_env* env, return 0; } +/** check for nsec3, the RR with params equal, if bitmap has the type */ +static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo, + size_t iter, uint8_t* salt, size_t saltlen, uint16_t rrtype) +{ + size_t i; + struct ub_packed_rrset_key pk; + memset(&pk, 0, sizeof(pk)); + pk.entry.data = nsec3->data; + for(i=0; idata->count; i++) { + int rralgo; + size_t rriter, rrsaltlen; + uint8_t* rrsalt; + if(!nsec3_get_params(&pk, i, &rralgo, &rriter, &rrsalt, + &rrsaltlen)) + continue; /* no parameters, malformed */ + if(rralgo != algo || rriter != iter || rrsaltlen != saltlen || + memcmp(rrsalt, salt, saltlen) != 0) + continue; /* different parameters */ + if(nsec3_has_type(&pk, i, rrtype)) + return 1; + } + return 0; +} + /** Verify the absence of ZONEMD with DNSSEC by checking NSEC, NSEC3 type flag. * return false on failure, reason contains description of failure. */ static int zonemd_check_dnssec_absence(struct auth_zone* z, @@ -7583,12 +7608,19 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, } nsec = az_domain_rrset(apex, LDNS_RR_TYPE_NSEC); if(nsec) { + struct ub_packed_rrset_key pk; /* dnssec verify the NSEC */ - if(!zonemd_dnssec_verify(z, env, dnskey, nsec)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, nsec)) { *reason = "DNSSEC verify failed for NSEC RRset"; return 0; } /* check type bitmap */ + memset(&pk, 0, sizeof(pk)); + pk.entry.data = nsec->data; + if(nsec_has_type(&pk, LDNS_RR_TYPE_ZONEMD)) { + *reason = "DNSSEC NSEC bitmap says type ZONEMD exists"; + return 0; + } } else { /* NSEC3 perhaps ? */ int algo; @@ -7619,11 +7651,16 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, return 0; } /* dnssec verify the NSEC3 */ - if(!zonemd_dnssec_verify(z, env, dnskey, nsec3)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, match, nsec3)) { *reason = "DNSSEC verify failed for NSEC3 RRset"; return 0; } /* check type bitmap */ + if(nsec3_of_param_has_type(nsec3, algo, iter, salt, saltlen, + LDNS_RR_TYPE_ZONEMD)) { + *reason = "DNSSEC NSEC3 bitmap says type ZONEMD exists"; + return 0; + } } return 1; @@ -7646,11 +7683,11 @@ static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, *reason = "zone has no SOA RRset"; return 0; } - if(!zonemd_dnssec_verify(z, env, dnskey, soa)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, soa)) { *reason = "DNSSEC verify failed for SOA RRset"; return 0; } - if(!zonemd_dnssec_verify(z, env, dnskey, zonemd_rrset)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, zonemd_rrset)) { *reason = "DNSSEC verify failed for ZONEMD RRset"; return 0; } @@ -7797,8 +7834,6 @@ zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, keystorage->rk.rrset_class = htons(z->dclass); auth_zone_log(z->name, VERB_QUERY, "zonemd: verify DNSKEY RRset with trust anchor"); - /* pass NULL for qstate, it is only used when type NSEC needs a - * name reallocated to get the qstate region for that */ sec = val_verify_DNSKEY_with_TA(env, ve, keystorage, anchor->ds_rrset, anchor->dnskey_rrset, NULL, reason, NULL); regional_free_all(env->scratch); @@ -7842,7 +7877,7 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, if(!reason) reason = "lookup of DNSKEY was bogus"; auth_zone_log(z->name, VERB_ALGO, - "zonemd lookup of DNSKEY was bogus: %s", why_bogus); + "zonemd lookup of DNSKEY was bogus: %s", reason); } else if(rcode == LDNS_RCODE_NOERROR) { uint16_t wanted_qtype = LDNS_RR_TYPE_DNSKEY; struct regional* temp = env->scratch; @@ -7894,6 +7929,7 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, } auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure); + regional_free_all(env->scratch); lock_rw_unlock(&z->lock); } @@ -7998,4 +8034,5 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env) } auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure); + regional_free_all(env->scratch); } diff --git a/validator/val_sigcrypt.c b/validator/val_sigcrypt.c index 10cf2caee..14e13da06 100644 --- a/validator/val_sigcrypt.c +++ b/validator/val_sigcrypt.c @@ -1187,7 +1187,7 @@ rrset_canonical(struct regional* region, sldns_buffer* buf, * section, to prevent that a wildcard synthesized NSEC can be used in * the non-existence proves. */ if(ntohs(k->rk.type) == LDNS_RR_TYPE_NSEC && - section == LDNS_SECTION_AUTHORITY) { + section == LDNS_SECTION_AUTHORITY && qstate) { k->rk.dname = regional_alloc_init(qstate->region, can_owner, can_owner_len); if(!k->rk.dname) From e35b1dfbd5e36f470859ad16595c821f8e38e4eb Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 14 Oct 2020 14:52:32 +0200 Subject: [PATCH 17/66] zonemd, nsec3 rr iterator is type int, like other nsec3 code. --- services/authzone.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 0507c66ca..98656dfb0 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7575,11 +7575,11 @@ static int zonemd_dnssec_verify_rrset(struct auth_zone* z, static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo, size_t iter, uint8_t* salt, size_t saltlen, uint16_t rrtype) { - size_t i; + int i, count = (int)nsec3->data->count; struct ub_packed_rrset_key pk; memset(&pk, 0, sizeof(pk)); pk.entry.data = nsec3->data; - for(i=0; idata->count; i++) { + for(i=0; i Date: Thu, 15 Oct 2020 09:17:57 +0200 Subject: [PATCH 18/66] zonemd, fix anchor unlock. zonemd, unit test for dnssec verify function test harness. --- services/authzone.c | 2 ++ testcode/unitmain.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/services/authzone.c b/services/authzone.c index 6bbb88a20..7c75441d5 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -8013,10 +8013,12 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env) /* equal to trustanchor, no need for online lookups */ dnskey = zonemd_get_dnskey_from_anchor(z, env, anchor, &is_insecure, &reason, &keystorage); + lock_basic_unlock(&anchor->lock); if(!dnskey && !reason) { reason = "dnskey verify with anchor failed"; } } else if(anchor) { + lock_basic_unlock(&anchor->lock); /* perform online lookups */ /* setup online lookups, and wait for them */ if(zonemd_lookup_dnskey(z, env)) { diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 84d850e5f..b5aa8fe42 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -844,6 +844,7 @@ static void respip_test(void) #include "services/authzone.h" #include "util/data/dname.h" #include "util/regional.h" +#include "validator/val_anchor.h" /** Add zone from file for testing */ struct auth_zone* authtest_addzone(struct auth_zones* az, const char* name, char* fname); @@ -920,6 +921,7 @@ static void zonemd_generate_test(const char* zname, char* zfile, /** loop over files and test generated zonemd digest */ static void zonemd_generate_tests(void) { + unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_hash"); zonemd_generate_test("example.org", "testdata/zonemd.example1.zone", 1, 2, "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"); @@ -974,6 +976,7 @@ static void zonemd_check_test(void) if(!zonemd_hashalgo_supported(hashalgo)) return; /* cannot test unsupported algo */ + unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_check"); /* setup environment */ az = auth_zones_create(); @@ -1021,12 +1024,75 @@ static void zonemd_check_test(void) sldns_buffer_free(buf); } +/** zonemd test verify */ +static void zonemd_verify_test(void) +{ + struct module_stack mods; + struct module_env env; + char* tastr = "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af"; + char* zname = "example.org"; + char* zfile = "testdata/zonemd.example1.zone"; + char* date_override = "20180302005009"; + struct auth_zone* z; + unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); + + /* setup test harness */ + memset(&mods, 0, sizeof(mods)); + memset(&env, 0, sizeof(env)); + env.scratch = regional_create(); + if(!env.scratch) + fatal_exit("out of memory"); + env.scratch_buffer = sldns_buffer_new(65553); + if(!env.scratch_buffer) + fatal_exit("out of memory"); + env.cfg = config_create(); + if(!env.cfg) + fatal_exit("out of memory"); + env.cfg->val_date_override = cfg_convert_timeval(date_override); + if(!env.cfg->val_date_override) + fatal_exit("could not parse datetime %s", date_override); + env.anchors = anchors_create(); + if(!env.anchors) + fatal_exit("out of memory"); + env.auth_zones = auth_zones_create(); + if(!env.auth_zones) + fatal_exit("out of memory"); + modstack_init(&mods); + if(!modstack_config(&mods, "validator iterator")) + fatal_exit("could not init modules"); + env.mesh = mesh_create(&mods, &env); + if(!env.mesh) + fatal_exit("out of memory"); + + /* load data */ + if(!anchor_store_str(env.anchors, env.scratch_buffer, tastr)) + fatal_exit("could not store anchor: %s", tastr); + z = authtest_addzone(env.auth_zones, zname, zfile); + if(!z) + fatal_exit("could not addzone %s %s", zname, zfile); + + /* test */ + lock_rw_wrlock(&z->lock); + auth_zone_verify_zonemd(z, &env); + lock_rw_unlock(&z->lock); + + /* desetup test harness */ + mesh_delete(env.mesh); + modstack_desetup(&mods, &env); + auth_zones_delete(env.auth_zones); + anchors_delete(env.anchors); + config_delete(env.cfg); + regional_destroy(env.scratch); + sldns_buffer_free(env.scratch_buffer); +} + /** zonemd unit tests */ static void zonemd_test(void) { unit_show_feature("zonemd"); zonemd_generate_tests(); zonemd_check_test(); + zonemd_verify_test(); } void unit_show_func(const char* file, const char* func) From 0a238280b9c31850bda9201de8abeb82d9163967 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 15 Oct 2020 12:27:22 +0200 Subject: [PATCH 19/66] zonemd, unit test for dnssec verify, implement test. --- services/authzone.c | 36 ++++++++++++++++++++++++------------ services/authzone.h | 4 +++- testcode/unitmain.c | 22 +++++++++++++++++++++- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 7c75441d5..7ba86c23c 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7702,16 +7702,22 @@ static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, * @param z: auth zone that fails. * @param env: environment with config, to ignore failure or not. * @param reason: failure string description. + * @param result: strdup result in here if not NULL. */ static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, - char* reason) + char* reason, char** result) { char zstr[255+1]; /* if fail: log reason, and depending on config also take action * and drop the zone, eg. it is gone from memory, set zone_expired */ dname_str(z->name, zstr); if(!reason) reason = "verification failed"; - log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason); + if(result) { + *result = strdup(reason); + if(!*result) log_err("out of memory"); + } else { + log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason); + } /* expired means the zone gives servfail and is not used by * lookup if fallback_enabled*/ @@ -7727,10 +7733,11 @@ static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, * @param is_insecure: if true, the dnskey is not used, the zone is insecure. * And dnssec is not used. It is DNSSEC secure insecure or not under * a trust anchor. + * @param result: if not NULL result reason copied here. */ static void auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, - struct ub_packed_rrset_key* dnskey, int is_insecure) + struct ub_packed_rrset_key* dnskey, int is_insecure, char** result) { char* reason = NULL; struct auth_data* apex = NULL; @@ -7760,28 +7767,32 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, /* fetch, DNSSEC verify, and check NSEC/NSEC3 */ if(!zonemd_check_dnssec_absence(z, env, dnskey, apex, &reason)) { - auth_zone_zonemd_fail(z, env, reason); + auth_zone_zonemd_fail(z, env, reason, result); return; } } else if(zonemd_rrset && dnskey) { /* check DNSSEC verify of SOA and ZONEMD */ if(!zonemd_check_dnssec_soazonemd(z, env, dnskey, apex, zonemd_rrset, &reason)) { - auth_zone_zonemd_fail(z, env, reason); + auth_zone_zonemd_fail(z, env, reason, result); return; } } /* check ZONEMD checksum and report or else fail. */ if(!auth_zone_zonemd_check_hash(z, env, &reason)) { - auth_zone_zonemd_fail(z, env, reason); + auth_zone_zonemd_fail(z, env, reason, result); return; } if(zonemd_absent) - auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config"); + auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", result); /* success! log the success */ auth_zone_log(z->name, VERB_ALGO, "ZONEMD verification successful"); + if(result) { + *result = strdup("ZONEMD verification successful"); + if(!*result) log_err("out of memory"); + } } /** @@ -7925,12 +7936,12 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, } if(reason) { - auth_zone_zonemd_fail(z, env, reason); + auth_zone_zonemd_fail(z, env, reason, NULL); lock_rw_unlock(&z->lock); return; } - auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure); + auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure, NULL); regional_free_all(env->scratch); lock_rw_unlock(&z->lock); } @@ -7993,7 +8004,8 @@ zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env) return 1; } -void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env) +void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, + char** result) { char* reason = NULL; struct trust_anchor* anchor = NULL; @@ -8033,10 +8045,10 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env) } if(reason) { - auth_zone_zonemd_fail(z, env, reason); + auth_zone_zonemd_fail(z, env, reason, result); return; } - auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure); + auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure, result); regional_free_all(env->scratch); } diff --git a/services/authzone.h b/services/authzone.h index 69ec7ed99..c00598ad1 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -743,8 +743,10 @@ int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, * This includes DNSSEC verification if applicable. * @param z: auth zone to check. Caller holds lock. wrlock. * @param env: with temp region, buffer and config. + * @param result: if not NULL, result string strdupped in here. */ -void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env); +void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, + char** result); /** mesh callback for zonemd on lookup of dnskey */ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, diff --git a/testcode/unitmain.c b/testcode/unitmain.c index b5aa8fe42..519653064 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -1033,6 +1033,8 @@ static void zonemd_verify_test(void) char* zname = "example.org"; char* zfile = "testdata/zonemd.example1.zone"; char* date_override = "20180302005009"; + char* result = NULL; + char* result_wanted = "have trust anchor, but zone has no DNSKEY"; struct auth_zone* z; unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); @@ -1073,8 +1075,26 @@ static void zonemd_verify_test(void) /* test */ lock_rw_wrlock(&z->lock); - auth_zone_verify_zonemd(z, &env); + auth_zone_verify_zonemd(z, &env, &result); lock_rw_unlock(&z->lock); + if(1) { + printf("auth zone %s: ZONEMD verification %s: %s\n", zname, + (strcmp(result, "ZONEMD verification successful")==0?"successful":"failed"), + result); + } + if(!result) + fatal_exit("out of memory"); + unit_assert(strcmp(result, result_wanted) == 0); + free(result); + if(strcmp(result, "ZONEMD verification successful") == 0) { + lock_rw_rdlock(&z->lock); + unit_assert(!z->zone_expired); + lock_rw_unlock(&z->lock); + } else { + lock_rw_rdlock(&z->lock); + unit_assert(z->zone_expired); + lock_rw_unlock(&z->lock); + } /* desetup test harness */ mesh_delete(env.mesh); From ceb0214b7d4697cb808fe701a1cb046ce37a6eab Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 16 Oct 2020 16:09:13 +0200 Subject: [PATCH 20/66] zonemd, unit tests for dnssec verify --- testcode/unitmain.c | 44 +++++++++++++++++++++++++++-------- testdata/zonemd.example2.zone | 8 +++++++ 2 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 testdata/zonemd.example2.zone diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 519653064..9bfa35ede 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -1025,18 +1025,13 @@ static void zonemd_check_test(void) } /** zonemd test verify */ -static void zonemd_verify_test(void) +static void zonemd_verify_test(char* zname, char* zfile, char* tastr, + char* date_override, char* result_wanted) { struct module_stack mods; struct module_env env; - char* tastr = "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af"; - char* zname = "example.org"; - char* zfile = "testdata/zonemd.example1.zone"; - char* date_override = "20180302005009"; char* result = NULL; - char* result_wanted = "have trust anchor, but zone has no DNSKEY"; struct auth_zone* z; - unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); /* setup test harness */ memset(&mods, 0, sizeof(mods)); @@ -1067,7 +1062,7 @@ static void zonemd_verify_test(void) fatal_exit("out of memory"); /* load data */ - if(!anchor_store_str(env.anchors, env.scratch_buffer, tastr)) + if(tastr && !anchor_store_str(env.anchors, env.scratch_buffer, tastr)) fatal_exit("could not store anchor: %s", tastr); z = authtest_addzone(env.auth_zones, zname, zfile); if(!z) @@ -1085,7 +1080,6 @@ static void zonemd_verify_test(void) if(!result) fatal_exit("out of memory"); unit_assert(strcmp(result, result_wanted) == 0); - free(result); if(strcmp(result, "ZONEMD verification successful") == 0) { lock_rw_rdlock(&z->lock); unit_assert(!z->zone_expired); @@ -1095,6 +1089,7 @@ static void zonemd_verify_test(void) unit_assert(z->zone_expired); lock_rw_unlock(&z->lock); } + free(result); /* desetup test harness */ mesh_delete(env.mesh); @@ -1106,13 +1101,42 @@ static void zonemd_verify_test(void) sldns_buffer_free(env.scratch_buffer); } +/** zonemd test verify suite */ +static void zonemd_verify_tests(void) +{ + unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); + verbosity=4; /* DEBUG */ + zonemd_verify_test("example.org", + "testdata/zonemd.example1.zone", + "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20180302005009", + "have trust anchor, but zone has no DNSKEY"); + zonemd_verify_test("example.org", + "testdata/zonemd.example1.zone", + NULL, + "20180302005009", + "zone has no ZONEMD"); + /* no trust anchor, so it succeeds */ + zonemd_verify_test("example.com", + "testdata/zonemd.example2.zone", + NULL, + "20180302005009", + "ZONEMD verification successful"); + /* trust anchor for another zone, so it is indeterminate */ + zonemd_verify_test("example.com", + "testdata/zonemd.example2.zone", + "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20180302005009", + "ZONEMD verification successful"); +} + /** zonemd unit tests */ static void zonemd_test(void) { unit_show_feature("zonemd"); zonemd_generate_tests(); zonemd_check_test(); - zonemd_verify_test(); + zonemd_verify_tests(); } void unit_show_func(const char* file, const char* func) diff --git a/testdata/zonemd.example2.zone b/testdata/zonemd.example2.zone new file mode 100644 index 000000000..16b631c7b --- /dev/null +++ b/testdata/zonemd.example2.zone @@ -0,0 +1,8 @@ +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 From a5252844214d1cb63195e9b683a86d046c8ad513 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 16 Oct 2020 16:15:35 +0200 Subject: [PATCH 21/66] zonemd, remove debug. --- testcode/unitmain.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 9bfa35ede..a147b13ae 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -1072,7 +1072,7 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, lock_rw_wrlock(&z->lock); auth_zone_verify_zonemd(z, &env, &result); lock_rw_unlock(&z->lock); - if(1) { + if(0) { printf("auth zone %s: ZONEMD verification %s: %s\n", zname, (strcmp(result, "ZONEMD verification successful")==0?"successful":"failed"), result); @@ -1105,7 +1105,6 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, static void zonemd_verify_tests(void) { unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); - verbosity=4; /* DEBUG */ zonemd_verify_test("example.org", "testdata/zonemd.example1.zone", "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", From 89618ff9baf4908ff43a8bd7991a71c3ccc9a440 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Mon, 19 Oct 2020 16:26:22 +0200 Subject: [PATCH 22/66] zonemd, unit test more zones. --- testcode/unitmain.c | 40 +++++++++++++++++++++++++++++++++++ testdata/zonemd.example2.zone | 7 ++++++ testdata/zonemd.example3.zone | 34 +++++++++++++++++++++++++++++ testdata/zonemd.example4.zone | 36 +++++++++++++++++++++++++++++++ testdata/zonemd.example5.zone | 34 +++++++++++++++++++++++++++++ testdata/zonemd.example6.zone | 36 +++++++++++++++++++++++++++++++ 6 files changed, 187 insertions(+) create mode 100644 testdata/zonemd.example3.zone create mode 100644 testdata/zonemd.example4.zone create mode 100644 testdata/zonemd.example5.zone create mode 100644 testdata/zonemd.example6.zone diff --git a/testcode/unitmain.c b/testcode/unitmain.c index a147b13ae..bd68a7161 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -1127,6 +1127,46 @@ static void zonemd_verify_tests(void) "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20180302005009", "ZONEMD verification successful"); + + /* load a DNSSEC signed zone, but no trust anchor */ + zonemd_verify_test("example.com", + "testdata/zonemd.example3.zone", + NULL, + "20180302005009", + "incorrect digest"); + /* load a DNSSEC zone with NSEC3, but no trust anchor */ + zonemd_verify_test("example.com", + "testdata/zonemd.example4.zone", + NULL, + "20180302005009", + "incorrect digest"); + /* valid zonemd, in dnssec signed zone, no trust anchor*/ + zonemd_verify_test("example.com", + "testdata/zonemd.example5.zone", + NULL, + "20180302005009", + "ZONEMD verification successful"); + /* valid zonemd, in dnssec NSEC3 zone, no trust anchor*/ + zonemd_verify_test("example.com", + "testdata/zonemd.example6.zone", + NULL, + "20180302005009", + "ZONEMD verification successful"); + +#if 0 + /* load a DNSSEC signed zone with a trust anchor, valid ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example5.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "ZONEMD verification successful"); + /* load a DNSSEC NSEC3 signed zone with a trust anchor, valid ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example6.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "ZONEMD verification successful"); +#endif } /** zonemd unit tests */ diff --git a/testdata/zonemd.example2.zone b/testdata/zonemd.example2.zone index 16b631c7b..14b7ea689 100644 --- a/testdata/zonemd.example2.zone +++ b/testdata/zonemd.example2.zone @@ -1,6 +1,13 @@ example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 example.com. IN NS ns.example.com. +; the ZONEMD that should be in this file, without DNSSEC example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; incorrect digest in example3 and example4. +;example.com. IN TYPE63 \# 70 0BEE1BC60102EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; correct digest for example 5. +;example.com. IN TYPE63 \# 70 0BEE1BC6010258F7620F93204BBB31B44F795B3409CC4ABD9EF5601DECC15675BD7751213152984EDDCE0626E6062E744B03B3E47711202FBB79E4A2EB8BC5CF46741B5CAE6F +; correct digest for example 6. +;example.com. IN TYPE63 \# 70 0BEE1BC6010246E31506F321C58DB811C934C6446141D651A8574FB21088A2BB6FEEC875FC8B60F50BEAE00E7F6554E2CF3CB048350EF92E2946137443E30079813DB4D1BFBD www.example.com. IN A 127.0.0.1 ns.example.com. IN A 127.0.0.1 bar.example.com. IN A 1.2.3.4 diff --git a/testdata/zonemd.example3.zone b/testdata/zonemd.example3.zone new file mode 100644 index 000000000..12389f3d5 --- /dev/null +++ b/testdata/zonemd.example3.zone @@ -0,0 +1,34 @@ +; signed version of zonemd.example2.zone +; with ldns-signzone -e 20201116135527 -i 20201019135527 zonemd.example2.zone Kexample.com.+008+55566 +; this zonefile has an incorrect ZONEMD digest, with correct DNSSEC signature. + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc60102efaa5b78b38ab1c45de57b8167bcce906451d0e72118e1f5e80b5f0c3cf04bffc65d53c011185528ead439d6f3a02f511961e090e5e4e0dfa013bd276d728b22 +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. RdHiJlugposfoRbog+Mkg2xeJXSzBi/UXxBnyHVF/Usqhp6Z7Acy4XwtRRb8YAbJevP9nBpCh23Fh4b1Vxl4xI0iB8aXWKtHeb98m81rfsflWvnTYbeau3ltfP/OJWqdmFsBy8DOwNxiN8sAMbGwQK8PFDk3lcRCqv8qq/tmow8= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= diff --git a/testdata/zonemd.example4.zone b/testdata/zonemd.example4.zone new file mode 100644 index 000000000..dae0f17c7 --- /dev/null +++ b/testdata/zonemd.example4.zone @@ -0,0 +1,36 @@ +; signed with NSEC3, of zonemd.example.2.zone +; ldns-signzone -n -s 012345 -e 20201116135527 -i 20201019135527 zonemd.example2.zone Kexample.com.+008+55566 +; this zonefile has an incorrect ZONEMD digest, with correct DNSSEC signature. + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN NSEC3PARAM 1 0 1 012345 +example.com. 3600 IN RRSIG NSEC3PARAM 8 2 3600 20201116135527 20201019135527 55566 example.com. CDbcPLDrpVUyk3v7kwQ3LNzzhDHS40e0LDv7IZrzMt2AO/6SJ7xhlG+qByhc7CFBUMvBNaOteO5th0tvotWxk0UrVhqRyyXNCr8SmDdAaPH4SGwJ2p+XPIwn0CTXDpyOcgCrW0Kt2OjubA+4fQwjkGYFuDATY5QOITe6kGJpKpw= +example.com. 3600 IN TYPE63 \# 70 0bee1bc60102efaa5b78b38ab1c45de57b8167bcce906451d0e72118e1f5e80b5f0c3cf04bffc65d53c011185528ead439d6f3a02f511961e090e5e4e0dfa013bd276d728b22 +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. RdHiJlugposfoRbog+Mkg2xeJXSzBi/UXxBnyHVF/Usqhp6Z7Acy4XwtRRb8YAbJevP9nBpCh23Fh4b1Vxl4xI0iB8aXWKtHeb98m81rfsflWvnTYbeau3ltfP/OJWqdmFsBy8DOwNxiN8sAMbGwQK8PFDk3lcRCqv8qq/tmow8= +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN NSEC3 1 0 1 012345 2v43f6ripfocif5h6bbi07glq6849rnj NS SOA RRSIG DNSKEY NSEC3PARAM TYPE63 +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. Yd+g1m2aDKDUuZNv2KpKk4uSNrpB5KLM3QUqypm484VjOpnj5Wy3BjUULH3P8z+S9PG7XbaOf+yUYHK8cI6i5GTcrMhoLKaanAD09i1KbXbTVJujwA9Za7WzlFVZ3o6f1D8CbrSS3YPWNF3Mb2FYaptvZ9so7MlecuLYdEer7DY= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN NSEC3 1 0 1 012345 f0lpjkgefgrobj5pucem78r2ouo53fq8 A RRSIG +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. gTDi/2e/RPeSOwoBr6oqfoFsGXAknLX3J96EHzMmhtRR7W4pEW8uXKsMJ3rr4qgUUX+ZtzoCMYy+UBkiJfjpWvMToGtuADNOzz0rF8BESaW/8k6iDKPmqmwdGyLGMmfGjYPcb4qg3+9egLejA+fF1OSrhHuINeO80ouw++PL0ns= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN NSEC3 1 0 1 012345 v4cknoe1mioduf5bmhgfjjq4dlqet8fm A RRSIG +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. VugivzPyv5+qZhl+x0frrykYyOOdZfcKdmIA13P4OzhtiRNhCRHznhrdTlmfLw/b5Rs5jFX7Iw/hhU80Geg72cYG4KVJwtP6zTyFApDl/8x3rj3vhZOc2nwpYmjjFsyrlb7M2RhcStnS6c/2R4+dBFwwVZXyJBi3fo9NybujI9g= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN NSEC3 1 0 1 012345 r18q2sl76hceldh0keqr7vnqc15db64a A RRSIG +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. zishUbm8GxjaHOOUdbz0ZEut99dm+DQ/zvxhOTeS3kmUnL8t3ISew641JeNvvajAUk/xn6eGHjLBuHfwNG+itF2pSD8Gl6Ppo22Y0C9uO5TyRQalYpjtz1kI/VlIelcd0TyusmIMaRChswtpctPKITbr8Wl+MoZZtPQhJ5NjQlQ= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN NSEC3 1 0 1 012345 91onuasouslv1so1i62id4rf0l763dss A RRSIG +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. d9CluwN3zWfLe20J212CuwNzJVbVsDR4eijuJyLpyHzziSc10CauWtUiuHeQMXCVJNwhPSb5kQTfKtql+Jd44BQlenRt/sHfa6YZEOwClN4O8V0vZ43K4vlwwWbh5kxQbFQ/e+w4vlYb1m4PHwzDLtqocNQ9T4A8SXl3A8paZqI= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN NSEC3 1 0 1 012345 c6ntadrd765diocebcrq6trs8npn83o3 A RRSIG +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. czJf5HkfHLpfGcku2iZnCu9tXnM7VWOYYhGtVAwkYG0M6BO4LzRxGCV3SkUvHLFxoqQY0DZLnafPl2MKg8zsF+tusf3e3xmpcCSR29IfuDYH7GzuVCj3H0ScmXM0lvyQ92JpJ0AMqq2mW1nvKmgjkyugs+EMpxcFVjhibljocLU= diff --git a/testdata/zonemd.example5.zone b/testdata/zonemd.example5.zone new file mode 100644 index 000000000..d88380ade --- /dev/null +++ b/testdata/zonemd.example5.zone @@ -0,0 +1,34 @@ +; signed version of zonemd.example2.zone +; with ldns-signzone -e 20201116135527 -i 20201019135527 zonemd.example2.zone Kexample.com.+008+55566 +; this zonefile has a correct ZONEMD digest, with correct DNSSEC signature. + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= diff --git a/testdata/zonemd.example6.zone b/testdata/zonemd.example6.zone new file mode 100644 index 000000000..0a7b05a8d --- /dev/null +++ b/testdata/zonemd.example6.zone @@ -0,0 +1,36 @@ +; signed with NSEC3, of zonemd.example.2.zone +; ldns-signzone -n -s 012345 -e 20201116135527 -i 20201019135527 zonemd.example2.zone Kexample.com.+008+55566 +; this zonefile has a correct ZONEMD digest, with correct DNSSEC signature. + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN NSEC3PARAM 1 0 1 012345 +example.com. 3600 IN RRSIG NSEC3PARAM 8 2 3600 20201116135527 20201019135527 55566 example.com. CDbcPLDrpVUyk3v7kwQ3LNzzhDHS40e0LDv7IZrzMt2AO/6SJ7xhlG+qByhc7CFBUMvBNaOteO5th0tvotWxk0UrVhqRyyXNCr8SmDdAaPH4SGwJ2p+XPIwn0CTXDpyOcgCrW0Kt2OjubA+4fQwjkGYFuDATY5QOITe6kGJpKpw= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010246e31506f321c58db811c934c6446141d651a8574fb21088a2bb6feec875fc8b60f50beae00e7f6554e2cf3cb048350ef92e2946137443e30079813db4d1bfbd +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. M0f4wkOn6dcYtaQtwvp698QL7HuKEgi+PPjYJawV8d1VNOWbbRTF9L9tHFDK42Ylq238uOxi223ZEk/pq4BP64Sm31dV54K2V95QqdzN9NDD34+sqKEgGyRcmBiE50gm3kZZ4ENqBQKc+GdlbZ2fHSI6gf6X694sSmZ7dfjq+2k= +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN NSEC3 1 0 1 012345 2v43f6ripfocif5h6bbi07glq6849rnj NS SOA RRSIG DNSKEY NSEC3PARAM TYPE63 +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. Yd+g1m2aDKDUuZNv2KpKk4uSNrpB5KLM3QUqypm484VjOpnj5Wy3BjUULH3P8z+S9PG7XbaOf+yUYHK8cI6i5GTcrMhoLKaanAD09i1KbXbTVJujwA9Za7WzlFVZ3o6f1D8CbrSS3YPWNF3Mb2FYaptvZ9so7MlecuLYdEer7DY= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN NSEC3 1 0 1 012345 f0lpjkgefgrobj5pucem78r2ouo53fq8 A RRSIG +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. gTDi/2e/RPeSOwoBr6oqfoFsGXAknLX3J96EHzMmhtRR7W4pEW8uXKsMJ3rr4qgUUX+ZtzoCMYy+UBkiJfjpWvMToGtuADNOzz0rF8BESaW/8k6iDKPmqmwdGyLGMmfGjYPcb4qg3+9egLejA+fF1OSrhHuINeO80ouw++PL0ns= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN NSEC3 1 0 1 012345 v4cknoe1mioduf5bmhgfjjq4dlqet8fm A RRSIG +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. VugivzPyv5+qZhl+x0frrykYyOOdZfcKdmIA13P4OzhtiRNhCRHznhrdTlmfLw/b5Rs5jFX7Iw/hhU80Geg72cYG4KVJwtP6zTyFApDl/8x3rj3vhZOc2nwpYmjjFsyrlb7M2RhcStnS6c/2R4+dBFwwVZXyJBi3fo9NybujI9g= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN NSEC3 1 0 1 012345 r18q2sl76hceldh0keqr7vnqc15db64a A RRSIG +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. zishUbm8GxjaHOOUdbz0ZEut99dm+DQ/zvxhOTeS3kmUnL8t3ISew641JeNvvajAUk/xn6eGHjLBuHfwNG+itF2pSD8Gl6Ppo22Y0C9uO5TyRQalYpjtz1kI/VlIelcd0TyusmIMaRChswtpctPKITbr8Wl+MoZZtPQhJ5NjQlQ= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN NSEC3 1 0 1 012345 91onuasouslv1so1i62id4rf0l763dss A RRSIG +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. d9CluwN3zWfLe20J212CuwNzJVbVsDR4eijuJyLpyHzziSc10CauWtUiuHeQMXCVJNwhPSb5kQTfKtql+Jd44BQlenRt/sHfa6YZEOwClN4O8V0vZ43K4vlwwWbh5kxQbFQ/e+w4vlYb1m4PHwzDLtqocNQ9T4A8SXl3A8paZqI= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN NSEC3 1 0 1 012345 c6ntadrd765diocebcrq6trs8npn83o3 A RRSIG +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. czJf5HkfHLpfGcku2iZnCu9tXnM7VWOYYhGtVAwkYG0M6BO4LzRxGCV3SkUvHLFxoqQY0DZLnafPl2MKg8zsF+tusf3e3xmpcCSR29IfuDYH7GzuVCj3H0ScmXM0lvyQ92JpJ0AMqq2mW1nvKmgjkyugs+EMpxcFVjhibljocLU= From f67507750216f365f0c628415a38797853bf03e3 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Tue, 20 Oct 2020 16:49:49 +0200 Subject: [PATCH 23/66] zonemd, unit test improved debug output and unit test dnssec verify zonemd --- services/authzone.c | 11 ++++++++--- testcode/unitmain.c | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 7ba86c23c..03d41d9c7 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1859,7 +1859,7 @@ static int auth_zone_zonemd_check_hash(struct auth_zone* z, if(!*reason) *reason = "no ZONEMD records found"; dname_str(z->name, zstr); - log_warn("auth-zone %s ZONEMD failed: %s", zstr, *reason); + verbose(VERB_ALGO, "auth-zone %s ZONEMD failed: %s", zstr, *reason); return 0; } @@ -7561,8 +7561,13 @@ static int zonemd_dnssec_verify_rrset(struct auth_zone* z, pk.rk.dname_len = node->namelen; pk.rk.type = htons(rrset->type); pk.rk.rrset_class = htons(z->dclass); - auth_zone_log(z->name, VERB_ALGO, - "zonemd: verify RRset with DNSKEY"); + if(verbosity >= VERB_ALGO) { + char typestr[32]; + typestr[0]=0; + sldns_wire2str_type_buf(rrset->type, typestr, sizeof(typestr)); + auth_zone_log(z->name, VERB_ALGO, + "zonemd: verify %s RRset with DNSKEY", typestr); + } sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, NULL, &why_bogus, LDNS_SECTION_ANSWER, NULL); if(sec == sec_status_secure) { diff --git a/testcode/unitmain.c b/testcode/unitmain.c index bd68a7161..8ed148e6b 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -900,7 +900,7 @@ static void zonemd_generate_test(const char* zname, char* zfile, for(i=0; i= VERB_ALGO) { char zname[255+1]; dname_str(z->name, zname); printf("zonemd generated for %s in %s with " @@ -916,6 +916,10 @@ static void zonemd_generate_test(const char* zname, char* zfile, auth_zones_delete(az); regional_destroy(region); sldns_buffer_free(buf); + + if(verbosity >= VERB_ALGO) { + printf("\n"); + } } /** loop over files and test generated zonemd digest */ @@ -1022,12 +1026,17 @@ static void zonemd_check_test(void) auth_zones_delete(az); regional_destroy(region); sldns_buffer_free(buf); + + if(verbosity >= VERB_ALGO) { + printf("\n"); + } } /** zonemd test verify */ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, char* date_override, char* result_wanted) { + time_t now = 0; struct module_stack mods; struct module_env env; char* result = NULL; @@ -1045,9 +1054,20 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, env.cfg = config_create(); if(!env.cfg) fatal_exit("out of memory"); + env.now = &now; env.cfg->val_date_override = cfg_convert_timeval(date_override); if(!env.cfg->val_date_override) fatal_exit("could not parse datetime %s", date_override); + if(env.cfg->module_conf) + free(env.cfg->module_conf); + env.cfg->module_conf = strdup("validator iterator"); + if(!env.cfg->module_conf) + fatal_exit("out of memory"); + if(tastr) { + if(!cfg_strlist_insert(&env.cfg->trust_anchor_list, + strdup(tastr))) + fatal_exit("out of memory"); + } env.anchors = anchors_create(); if(!env.anchors) fatal_exit("out of memory"); @@ -1055,15 +1075,13 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, if(!env.auth_zones) fatal_exit("out of memory"); modstack_init(&mods); - if(!modstack_config(&mods, "validator iterator")) - fatal_exit("could not init modules"); + if(!modstack_setup(&mods, env.cfg->module_conf, &env)) + fatal_exit("could not modstack_setup"); env.mesh = mesh_create(&mods, &env); if(!env.mesh) fatal_exit("out of memory"); /* load data */ - if(tastr && !anchor_store_str(env.anchors, env.scratch_buffer, tastr)) - fatal_exit("could not store anchor: %s", tastr); z = authtest_addzone(env.auth_zones, zname, zfile); if(!z) fatal_exit("could not addzone %s %s", zname, zfile); @@ -1072,7 +1090,7 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, lock_rw_wrlock(&z->lock); auth_zone_verify_zonemd(z, &env, &result); lock_rw_unlock(&z->lock); - if(0) { + if(verbosity >= VERB_ALGO) { printf("auth zone %s: ZONEMD verification %s: %s\n", zname, (strcmp(result, "ZONEMD verification successful")==0?"successful":"failed"), result); @@ -1099,6 +1117,10 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, config_delete(env.cfg); regional_destroy(env.scratch); sldns_buffer_free(env.scratch_buffer); + + if(verbosity >= VERB_ALGO) { + printf("\n"); + } } /** zonemd test verify suite */ @@ -1153,7 +1175,6 @@ static void zonemd_verify_tests(void) "20180302005009", "ZONEMD verification successful"); -#if 0 /* load a DNSSEC signed zone with a trust anchor, valid ZONEMD */ zonemd_verify_test("example.com", "testdata/zonemd.example5.zone", @@ -1166,7 +1187,6 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", "ZONEMD verification successful"); -#endif } /** zonemd unit tests */ From e8d29f973dd5e5e33042701a31a95d14e6bb7bb4 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 11:51:30 +0200 Subject: [PATCH 24/66] zonemd, fix that dnssec denial does not invalidate zone. zonemd, unit test of nsec and nsec3 denial. --- services/authzone.c | 20 +++++++++++++++++--- testcode/unitmain.c | 16 +++++++++++++++- testdata/zonemd.example7.zone | 31 +++++++++++++++++++++++++++++++ testdata/zonemd.example8.zone | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 testdata/zonemd.example7.zone create mode 100644 testdata/zonemd.example8.zone diff --git a/services/authzone.c b/services/authzone.c index 03d41d9c7..b17fe81c3 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7628,6 +7628,7 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, *reason = "DNSSEC NSEC bitmap says type ZONEMD exists"; return 0; } + auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC verification of absence of ZONEMD secure"); } else { /* NSEC3 perhaps ? */ int algo; @@ -7668,6 +7669,7 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, *reason = "DNSSEC NSEC3 bitmap says type ZONEMD exists"; return 0; } + auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC3 verification of absence of ZONEMD secure"); } return 1; @@ -7747,7 +7749,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, char* reason = NULL; struct auth_data* apex = NULL; struct auth_rrset* zonemd_rrset = NULL; - int zonemd_absent = 0; + int zonemd_absent = 0, zonemd_absence_dnssecok = 0; /* see if ZONEMD is present or absent. */ apex = az_find_name(z, z->name, z->namelen); @@ -7775,6 +7777,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, auth_zone_zonemd_fail(z, env, reason, result); return; } + zonemd_absence_dnssecok = 1; } else if(zonemd_rrset && dnskey) { /* check DNSSEC verify of SOA and ZONEMD */ if(!zonemd_check_dnssec_soazonemd(z, env, dnskey, apex, @@ -7784,14 +7787,25 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, } } + if(zonemd_absent && 0) { + auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", result); + return; + } + if(zonemd_absent && zonemd_absence_dnssecok) { + auth_zone_log(z->name, VERB_ALGO, "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); + if(result) { + *result = strdup("ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); + if(!*result) log_err("out of memory"); + } + return; + } + /* check ZONEMD checksum and report or else fail. */ if(!auth_zone_zonemd_check_hash(z, env, &reason)) { auth_zone_zonemd_fail(z, env, reason, result); return; } - if(zonemd_absent) - auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", result); /* success! log the success */ auth_zone_log(z->name, VERB_ALGO, "ZONEMD verification successful"); if(result) { diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 8ed148e6b..3c198e567 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -1098,7 +1098,8 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, if(!result) fatal_exit("out of memory"); unit_assert(strcmp(result, result_wanted) == 0); - if(strcmp(result, "ZONEMD verification successful") == 0) { + if(strcmp(result, "ZONEMD verification successful") == 0 || + strcmp(result, "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD") == 0) { lock_rw_rdlock(&z->lock); unit_assert(!z->zone_expired); lock_rw_unlock(&z->lock); @@ -1187,6 +1188,19 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", "ZONEMD verification successful"); + + /* load a DNSSEC NSEC zone without ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example7.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); + /* load a DNSSEC NSEC3 zone without ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example8.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); } /** zonemd unit tests */ diff --git a/testdata/zonemd.example7.zone b/testdata/zonemd.example7.zone new file mode 100644 index 000000000..4339bd570 --- /dev/null +++ b/testdata/zonemd.example7.zone @@ -0,0 +1,31 @@ +; DNSSEC NSEC zone without ZONEMD +; created with +; ldns-signzone -e 20201116135527 -i 20201019135527 zonemd.example2.zone Kexample.com.+008+55566 +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ROT+Kh6Y0sEf+L9c2HGPvppLL/DFP5KcX/zSjy7ovM7vXTrrdhEhOedbuccN84tk6VU8udGIixd5Usc+juZ+WsiWwaSNB5rKo6lZ9ceOJlYVzLCmawePzTsl6VAIiIVXwrMxGz/amBd+Ou/1NCuXJiWVThU9PDyJ/lQZbVJEHMA= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= diff --git a/testdata/zonemd.example8.zone b/testdata/zonemd.example8.zone new file mode 100644 index 000000000..2900753c0 --- /dev/null +++ b/testdata/zonemd.example8.zone @@ -0,0 +1,34 @@ +; DNSSEC NSEC3 zone without ZONEMD +; created with +; ldns-signzone -n -s 012345 -e 20201116135527 -i 20201019135527 zonemd.example2.zone Kexample.com.+008+55566 + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN NSEC3PARAM 1 0 1 012345 +example.com. 3600 IN RRSIG NSEC3PARAM 8 2 3600 20201116135527 20201019135527 55566 example.com. CDbcPLDrpVUyk3v7kwQ3LNzzhDHS40e0LDv7IZrzMt2AO/6SJ7xhlG+qByhc7CFBUMvBNaOteO5th0tvotWxk0UrVhqRyyXNCr8SmDdAaPH4SGwJ2p+XPIwn0CTXDpyOcgCrW0Kt2OjubA+4fQwjkGYFuDATY5QOITe6kGJpKpw= +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN NSEC3 1 0 1 012345 2v43f6ripfocif5h6bbi07glq6849rnj NS SOA RRSIG DNSKEY NSEC3PARAM +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. J2LISTGtBe+x2pNESBOYrBHAJjEDVFkmjJf2kj0GSFYisvSuy6ZUvQZZUB9sfLmEX18FpdNTieE8MrR2nbpKWfgVBDdGtcU72x/GOIRRq586A1KNtP2eJ81vcblM5dvqvpht46tF+xy85j9G9BYxpcT1PQRpvmho9yhgCxq2kUQ= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN NSEC3 1 0 1 012345 f0lpjkgefgrobj5pucem78r2ouo53fq8 A RRSIG +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. gTDi/2e/RPeSOwoBr6oqfoFsGXAknLX3J96EHzMmhtRR7W4pEW8uXKsMJ3rr4qgUUX+ZtzoCMYy+UBkiJfjpWvMToGtuADNOzz0rF8BESaW/8k6iDKPmqmwdGyLGMmfGjYPcb4qg3+9egLejA+fF1OSrhHuINeO80ouw++PL0ns= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN NSEC3 1 0 1 012345 v4cknoe1mioduf5bmhgfjjq4dlqet8fm A RRSIG +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. VugivzPyv5+qZhl+x0frrykYyOOdZfcKdmIA13P4OzhtiRNhCRHznhrdTlmfLw/b5Rs5jFX7Iw/hhU80Geg72cYG4KVJwtP6zTyFApDl/8x3rj3vhZOc2nwpYmjjFsyrlb7M2RhcStnS6c/2R4+dBFwwVZXyJBi3fo9NybujI9g= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN NSEC3 1 0 1 012345 r18q2sl76hceldh0keqr7vnqc15db64a A RRSIG +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. zishUbm8GxjaHOOUdbz0ZEut99dm+DQ/zvxhOTeS3kmUnL8t3ISew641JeNvvajAUk/xn6eGHjLBuHfwNG+itF2pSD8Gl6Ppo22Y0C9uO5TyRQalYpjtz1kI/VlIelcd0TyusmIMaRChswtpctPKITbr8Wl+MoZZtPQhJ5NjQlQ= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN NSEC3 1 0 1 012345 91onuasouslv1so1i62id4rf0l763dss A RRSIG +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. d9CluwN3zWfLe20J212CuwNzJVbVsDR4eijuJyLpyHzziSc10CauWtUiuHeQMXCVJNwhPSb5kQTfKtql+Jd44BQlenRt/sHfa6YZEOwClN4O8V0vZ43K4vlwwWbh5kxQbFQ/e+w4vlYb1m4PHwzDLtqocNQ9T4A8SXl3A8paZqI= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN NSEC3 1 0 1 012345 c6ntadrd765diocebcrq6trs8npn83o3 A RRSIG +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. czJf5HkfHLpfGcku2iZnCu9tXnM7VWOYYhGtVAwkYG0M6BO4LzRxGCV3SkUvHLFxoqQY0DZLnafPl2MKg8zsF+tusf3e3xmpcCSR29IfuDYH7GzuVCj3H0ScmXM0lvyQ92JpJ0AMqq2mW1nvKmgjkyugs+EMpxcFVjhibljocLU= From 124545796753139f0cc8e335909584f4fef24e52 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 11:56:41 +0200 Subject: [PATCH 25/66] zonemd, fix that zonemd absence in unsigned zone does not invalidate zone. --- services/authzone.c | 12 ++++++++++-- testcode/unitmain.c | 9 +++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index b17fe81c3..e05a5d81d 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7792,9 +7792,17 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, return; } if(zonemd_absent && zonemd_absence_dnssecok) { - auth_zone_log(z->name, VERB_ALGO, "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); + auth_zone_log(z->name, VERB_ALGO, "DNSSEC verified nonexistence of ZONEMD"); if(result) { - *result = strdup("ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); + *result = strdup("DNSSEC verified nonexistence of ZONEMD"); + if(!*result) log_err("out of memory"); + } + return; + } + if(zonemd_absent) { + auth_zone_log(z->name, VERB_ALGO, "no ZONEMD present"); + if(result) { + *result = strdup("no ZONEMD present"); if(!*result) log_err("out of memory"); } return; diff --git a/testcode/unitmain.c b/testcode/unitmain.c index 3c198e567..ba2d33fc4 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -1099,7 +1099,8 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, fatal_exit("out of memory"); unit_assert(strcmp(result, result_wanted) == 0); if(strcmp(result, "ZONEMD verification successful") == 0 || - strcmp(result, "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD") == 0) { + strcmp(result, "DNSSEC verified nonexistence of ZONEMD") == 0 || + strcmp(result, "no ZONEMD present") == 0) { lock_rw_rdlock(&z->lock); unit_assert(!z->zone_expired); lock_rw_unlock(&z->lock); @@ -1137,7 +1138,7 @@ static void zonemd_verify_tests(void) "testdata/zonemd.example1.zone", NULL, "20180302005009", - "zone has no ZONEMD"); + "no ZONEMD present"); /* no trust anchor, so it succeeds */ zonemd_verify_test("example.com", "testdata/zonemd.example2.zone", @@ -1194,13 +1195,13 @@ static void zonemd_verify_tests(void) "testdata/zonemd.example7.zone", "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); + "DNSSEC verified nonexistence of ZONEMD"); /* load a DNSSEC NSEC3 zone without ZONEMD */ zonemd_verify_test("example.com", "testdata/zonemd.example8.zone", "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "ZONEMD successful, DNSSEC verified nonexistence of ZONEMD"); + "DNSSEC verified nonexistence of ZONEMD"); } /** zonemd unit tests */ From c32c9a0ae24d99771b2f2aab255d7f3d9e7ec73e Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 12:04:53 +0200 Subject: [PATCH 26/66] zonemd, zonemd unit test in own file. --- Makefile.in | 5 +- testcode/unitmain.c | 374 ------------------------------------- testcode/unitmain.h | 2 + testcode/unitzonemd.c | 417 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 422 insertions(+), 376 deletions(-) create mode 100644 testcode/unitzonemd.c diff --git a/Makefile.in b/Makefile.in index d2600e71f..690a757ab 100644 --- a/Makefile.in +++ b/Makefile.in @@ -173,10 +173,10 @@ UNITTEST_SRC=testcode/unitanchor.c testcode/unitdname.c \ testcode/unitlruhash.c testcode/unitmain.c testcode/unitmsgparse.c \ testcode/unitneg.c testcode/unitregional.c testcode/unitslabhash.c \ testcode/unitverify.c testcode/readhex.c testcode/testpkts.c testcode/unitldns.c \ -testcode/unitecs.c testcode/unitauth.c +testcode/unitecs.c testcode/unitauth.c testcode/unitzonemd.c UNITTEST_OBJ=unitanchor.lo unitdname.lo unitlruhash.lo unitmain.lo \ unitmsgparse.lo unitneg.lo unitregional.lo unitslabhash.lo unitverify.lo \ -readhex.lo testpkts.lo unitldns.lo unitecs.lo unitauth.lo +readhex.lo testpkts.lo unitldns.lo unitecs.lo unitauth.lo unitzonemd.lo UNITTEST_OBJ_LINK=$(UNITTEST_OBJ) worker_cb.lo $(COMMON_OBJ) $(SLDNS_OBJ) \ $(COMPAT_OBJ) DAEMON_SRC=daemon/acl_list.c daemon/cachedump.c daemon/daemon.c \ @@ -1217,6 +1217,7 @@ unitldns.lo unitldns.o: $(srcdir)/testcode/unitldns.c config.h $(srcdir)/util/lo $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h \ $(srcdir)/sldns/parseutil.h unitecs.lo unitecs.o: $(srcdir)/testcode/unitecs.c config.h +unitzonemd.lo unitzonemd.o: $(srcdir)/testcode/unitzonemd.c config.h $(srcdir)/services/authzone.h unitauth.lo unitauth.o: $(srcdir)/testcode/unitauth.c config.h $(srcdir)/services/authzone.h \ $(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/services/mesh.h $(srcdir)/util/netevent.h \ $(srcdir)/dnscrypt/dnscrypt.h $(srcdir)/util/data/msgparse.h \ diff --git a/testcode/unitmain.c b/testcode/unitmain.c index ba2d33fc4..6a099b15e 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -839,380 +839,6 @@ static void respip_test(void) respip_conf_actions_test(); } -#include -#include "sldns/str2wire.h" -#include "services/authzone.h" -#include "util/data/dname.h" -#include "util/regional.h" -#include "validator/val_anchor.h" -/** Add zone from file for testing */ -struct auth_zone* authtest_addzone(struct auth_zones* az, const char* name, - char* fname); - -/** zonemd unit test, generate a zonemd digest and check if correct */ -static void zonemd_generate_test(const char* zname, char* zfile, - int scheme, int hashalgo, const char* digest) -{ - uint8_t zonemd_hash[512]; - size_t hashlen = 0; - char output[1024+1]; - size_t i; - struct auth_zones* az; - struct auth_zone* z; - int result; - struct regional* region = NULL; - struct sldns_buffer* buf = NULL; - char* reason = NULL; - char* digestdup; - - if(!zonemd_hashalgo_supported(hashalgo)) - return; /* cannot test unsupported algo */ - - /* setup environment */ - az = auth_zones_create(); - unit_assert(az); - region = regional_create(); - unit_assert(region); - buf = sldns_buffer_new(65535); - unit_assert(buf); - - /* read file */ - z = authtest_addzone(az, zname, zfile); - unit_assert(z); - - /* create zonemd digest */ - result = auth_zone_generate_zonemd_hash(z, scheme, hashalgo, - zonemd_hash, sizeof(zonemd_hash), &hashlen, region, buf, - &reason); - if(reason) printf("zonemd failure reason: %s\n", reason); - unit_assert(result); - - /* check digest */ - unit_assert(hashlen*2+1 <= sizeof(output)); - for(i=0; i>4]; - output[i*2+1] = hexl[zonemd_hash[i]&0xf]; - } - output[hashlen*2] = 0; - digestdup = strdup(digest); - unit_assert(digestdup); - for(i=0; i= VERB_ALGO) { - char zname[255+1]; - dname_str(z->name, zname); - printf("zonemd generated for %s in %s with " - "scheme=%d hashalgo=%d\n", zname, z->zonefile, - scheme, hashalgo); - printf("digest %s\n", output); - printf("wanted %s\n", digestdup); - } - unit_assert(strcmp(output, digestdup) == 0); - - /* delete environment */ - free(digestdup); - auth_zones_delete(az); - regional_destroy(region); - sldns_buffer_free(buf); - - if(verbosity >= VERB_ALGO) { - printf("\n"); - } -} - -/** loop over files and test generated zonemd digest */ -static void zonemd_generate_tests(void) -{ - unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_hash"); - zonemd_generate_test("example.org", "testdata/zonemd.example1.zone", - 1, 2, "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"); - - /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 - * from section A.1 */ - zonemd_generate_test("example", "testdata/zonemd.example_a1.zone", - 1, 1, "c68090d90a7aed716bc459f9340e3d7c1370d4d24b7e2fc3a1ddc0b9a87153b9a9713b3c9ae5cc27777f98b8e730044c"); - - /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 - * from section A.2 */ - zonemd_generate_test("example", "testdata/zonemd.example_a2.zone", - 1, 1, "31cefb03814f5062ad12fa951ba0ef5f8da6ae354a415767246f7dc932ceb1e742a2108f529db6a33a11c01493de358d"); - - /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 - * from section A.3 SHA384 digest */ - zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", - 1, 1, "62e6cf51b02e54b9b5f967d547ce43136792901f9f88e637493daaf401c92c279dd10f0edb1c56f8080211f8480ee306"); - - /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 - * from section A.3 SHA512 digest*/ - zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", - 1, 2, "08cfa1115c7b948c4163a901270395ea226a930cd2cbcf2fa9a5e6eb85f37c8a4e114d884e66f176eab121cb02db7d652e0cc4827e7a3204f166b47e5613fd27"); - - /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 - * from section A.4 */ - zonemd_generate_test("uri.arpa", "testdata/zonemd.example_a4.zone", - 1, 1, "1291b78ddf7669b1a39d014d87626b709b55774c5d7d58fadc556439889a10eaf6f11d615900a4f996bd46279514e473"); - - /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 - * from section A.5 */ - zonemd_generate_test("root-servers.net", "testdata/zonemd.example_a5.zone", - 1, 1, "f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a978a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79"); -} - -/** test the zonemd check routine */ -static void zonemd_check_test(void) -{ - const char* zname = "example.org"; - char* zfile = "testdata/zonemd.example1.zone"; - int scheme = 1; - int hashalgo = 2; - const char* digest = "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"; - const char* digestwrong = "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D48100"; - uint8_t hash[512], hashwrong[512]; - size_t hashlen = 0, hashwronglen = 0; - struct auth_zones* az; - struct auth_zone* z; - int result; - struct regional* region = NULL; - struct sldns_buffer* buf = NULL; - char* reason = NULL; - - if(!zonemd_hashalgo_supported(hashalgo)) - return; /* cannot test unsupported algo */ - unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_check"); - - /* setup environment */ - az = auth_zones_create(); - unit_assert(az); - region = regional_create(); - unit_assert(region); - buf = sldns_buffer_new(65535); - unit_assert(buf); - - /* read file */ - z = authtest_addzone(az, zname, zfile); - unit_assert(z); - hashlen = sizeof(hash); - if(sldns_str2wire_hex_buf(digest, hash, &hashlen) != 0) { - unit_assert(0); /* parse failure */ - } - hashwronglen = sizeof(hashwrong); - if(sldns_str2wire_hex_buf(digestwrong, hashwrong, &hashwronglen) != 0) { - unit_assert(0); /* parse failure */ - } - - /* check return values of the check routine */ - result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, - hash, hashlen, region, buf, &reason); - unit_assert(result && reason == NULL); - result = auth_zone_generate_zonemd_check(z, 241, hashalgo, - hash, hashlen, region, buf, &reason); - unit_assert(!result && strcmp(reason, "unsupported scheme")==0); - result = auth_zone_generate_zonemd_check(z, scheme, 242, - hash, hashlen, region, buf, &reason); - unit_assert(!result && strcmp(reason, "unsupported algorithm")==0); - result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, - hash, 2, region, buf, &reason); - unit_assert(!result && strcmp(reason, "digest length too small, less than 12")==0); - result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, - hashwrong, hashwronglen, region, buf, &reason); - unit_assert(!result && strcmp(reason, "incorrect digest")==0); - result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, - hashwrong, hashwronglen-3, region, buf, &reason); - unit_assert(!result && strcmp(reason, "incorrect digest length")==0); - - /* delete environment */ - auth_zones_delete(az); - regional_destroy(region); - sldns_buffer_free(buf); - - if(verbosity >= VERB_ALGO) { - printf("\n"); - } -} - -/** zonemd test verify */ -static void zonemd_verify_test(char* zname, char* zfile, char* tastr, - char* date_override, char* result_wanted) -{ - time_t now = 0; - struct module_stack mods; - struct module_env env; - char* result = NULL; - struct auth_zone* z; - - /* setup test harness */ - memset(&mods, 0, sizeof(mods)); - memset(&env, 0, sizeof(env)); - env.scratch = regional_create(); - if(!env.scratch) - fatal_exit("out of memory"); - env.scratch_buffer = sldns_buffer_new(65553); - if(!env.scratch_buffer) - fatal_exit("out of memory"); - env.cfg = config_create(); - if(!env.cfg) - fatal_exit("out of memory"); - env.now = &now; - env.cfg->val_date_override = cfg_convert_timeval(date_override); - if(!env.cfg->val_date_override) - fatal_exit("could not parse datetime %s", date_override); - if(env.cfg->module_conf) - free(env.cfg->module_conf); - env.cfg->module_conf = strdup("validator iterator"); - if(!env.cfg->module_conf) - fatal_exit("out of memory"); - if(tastr) { - if(!cfg_strlist_insert(&env.cfg->trust_anchor_list, - strdup(tastr))) - fatal_exit("out of memory"); - } - env.anchors = anchors_create(); - if(!env.anchors) - fatal_exit("out of memory"); - env.auth_zones = auth_zones_create(); - if(!env.auth_zones) - fatal_exit("out of memory"); - modstack_init(&mods); - if(!modstack_setup(&mods, env.cfg->module_conf, &env)) - fatal_exit("could not modstack_setup"); - env.mesh = mesh_create(&mods, &env); - if(!env.mesh) - fatal_exit("out of memory"); - - /* load data */ - z = authtest_addzone(env.auth_zones, zname, zfile); - if(!z) - fatal_exit("could not addzone %s %s", zname, zfile); - - /* test */ - lock_rw_wrlock(&z->lock); - auth_zone_verify_zonemd(z, &env, &result); - lock_rw_unlock(&z->lock); - if(verbosity >= VERB_ALGO) { - printf("auth zone %s: ZONEMD verification %s: %s\n", zname, - (strcmp(result, "ZONEMD verification successful")==0?"successful":"failed"), - result); - } - if(!result) - fatal_exit("out of memory"); - unit_assert(strcmp(result, result_wanted) == 0); - if(strcmp(result, "ZONEMD verification successful") == 0 || - strcmp(result, "DNSSEC verified nonexistence of ZONEMD") == 0 || - strcmp(result, "no ZONEMD present") == 0) { - lock_rw_rdlock(&z->lock); - unit_assert(!z->zone_expired); - lock_rw_unlock(&z->lock); - } else { - lock_rw_rdlock(&z->lock); - unit_assert(z->zone_expired); - lock_rw_unlock(&z->lock); - } - free(result); - - /* desetup test harness */ - mesh_delete(env.mesh); - modstack_desetup(&mods, &env); - auth_zones_delete(env.auth_zones); - anchors_delete(env.anchors); - config_delete(env.cfg); - regional_destroy(env.scratch); - sldns_buffer_free(env.scratch_buffer); - - if(verbosity >= VERB_ALGO) { - printf("\n"); - } -} - -/** zonemd test verify suite */ -static void zonemd_verify_tests(void) -{ - unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); - zonemd_verify_test("example.org", - "testdata/zonemd.example1.zone", - "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", - "20180302005009", - "have trust anchor, but zone has no DNSKEY"); - zonemd_verify_test("example.org", - "testdata/zonemd.example1.zone", - NULL, - "20180302005009", - "no ZONEMD present"); - /* no trust anchor, so it succeeds */ - zonemd_verify_test("example.com", - "testdata/zonemd.example2.zone", - NULL, - "20180302005009", - "ZONEMD verification successful"); - /* trust anchor for another zone, so it is indeterminate */ - zonemd_verify_test("example.com", - "testdata/zonemd.example2.zone", - "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", - "20180302005009", - "ZONEMD verification successful"); - - /* load a DNSSEC signed zone, but no trust anchor */ - zonemd_verify_test("example.com", - "testdata/zonemd.example3.zone", - NULL, - "20180302005009", - "incorrect digest"); - /* load a DNSSEC zone with NSEC3, but no trust anchor */ - zonemd_verify_test("example.com", - "testdata/zonemd.example4.zone", - NULL, - "20180302005009", - "incorrect digest"); - /* valid zonemd, in dnssec signed zone, no trust anchor*/ - zonemd_verify_test("example.com", - "testdata/zonemd.example5.zone", - NULL, - "20180302005009", - "ZONEMD verification successful"); - /* valid zonemd, in dnssec NSEC3 zone, no trust anchor*/ - zonemd_verify_test("example.com", - "testdata/zonemd.example6.zone", - NULL, - "20180302005009", - "ZONEMD verification successful"); - - /* load a DNSSEC signed zone with a trust anchor, valid ZONEMD */ - zonemd_verify_test("example.com", - "testdata/zonemd.example5.zone", - "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", - "20201020135527", - "ZONEMD verification successful"); - /* load a DNSSEC NSEC3 signed zone with a trust anchor, valid ZONEMD */ - zonemd_verify_test("example.com", - "testdata/zonemd.example6.zone", - "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", - "20201020135527", - "ZONEMD verification successful"); - - /* load a DNSSEC NSEC zone without ZONEMD */ - zonemd_verify_test("example.com", - "testdata/zonemd.example7.zone", - "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", - "20201020135527", - "DNSSEC verified nonexistence of ZONEMD"); - /* load a DNSSEC NSEC3 zone without ZONEMD */ - zonemd_verify_test("example.com", - "testdata/zonemd.example8.zone", - "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", - "20201020135527", - "DNSSEC verified nonexistence of ZONEMD"); -} - -/** zonemd unit tests */ -static void zonemd_test(void) -{ - unit_show_feature("zonemd"); - zonemd_generate_tests(); - zonemd_check_test(); - zonemd_verify_tests(); -} - void unit_show_func(const char* file, const char* func) { printf("test %s:%s\n", file, func); diff --git a/testcode/unitmain.h b/testcode/unitmain.h index e5c6109a2..66d1322f2 100644 --- a/testcode/unitmain.h +++ b/testcode/unitmain.h @@ -80,5 +80,7 @@ void ecs_test(void); void ldns_test(void); /** unit test for auth zone functions */ void authzone_test(void); +/** unit test for zonemd functions */ +void zonemd_test(void); #endif /* TESTCODE_UNITMAIN_H */ diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c new file mode 100644 index 000000000..8ba8fedc6 --- /dev/null +++ b/testcode/unitzonemd.c @@ -0,0 +1,417 @@ +/* + * testcode/unitzonemd.c - unit test for zonemd. + * + * Copyright (c) 2020, NLnet Labs. All rights reserved. + * + * This software is open source. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the NLNET LABS nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/** + * \file + * Unit tests for ZONEMD functionality. + */ + +#include "config.h" +#include +#include "util/log.h" +#include "testcode/unitmain.h" +#include "sldns/str2wire.h" +#include "services/authzone.h" +#include "util/data/dname.h" +#include "util/regional.h" +#include "validator/val_anchor.h" + +/** Add zone from file for testing */ +struct auth_zone* authtest_addzone(struct auth_zones* az, const char* name, + char* fname); + +/** zonemd unit test, generate a zonemd digest and check if correct */ +static void zonemd_generate_test(const char* zname, char* zfile, + int scheme, int hashalgo, const char* digest) +{ + uint8_t zonemd_hash[512]; + size_t hashlen = 0; + char output[1024+1]; + size_t i; + struct auth_zones* az; + struct auth_zone* z; + int result; + struct regional* region = NULL; + struct sldns_buffer* buf = NULL; + char* reason = NULL; + char* digestdup; + + if(!zonemd_hashalgo_supported(hashalgo)) + return; /* cannot test unsupported algo */ + + /* setup environment */ + az = auth_zones_create(); + unit_assert(az); + region = regional_create(); + unit_assert(region); + buf = sldns_buffer_new(65535); + unit_assert(buf); + + /* read file */ + z = authtest_addzone(az, zname, zfile); + unit_assert(z); + + /* create zonemd digest */ + result = auth_zone_generate_zonemd_hash(z, scheme, hashalgo, + zonemd_hash, sizeof(zonemd_hash), &hashlen, region, buf, + &reason); + if(reason) printf("zonemd failure reason: %s\n", reason); + unit_assert(result); + + /* check digest */ + unit_assert(hashlen*2+1 <= sizeof(output)); + for(i=0; i>4]; + output[i*2+1] = hexl[zonemd_hash[i]&0xf]; + } + output[hashlen*2] = 0; + digestdup = strdup(digest); + unit_assert(digestdup); + for(i=0; i= VERB_ALGO) { + char zname[255+1]; + dname_str(z->name, zname); + printf("zonemd generated for %s in %s with " + "scheme=%d hashalgo=%d\n", zname, z->zonefile, + scheme, hashalgo); + printf("digest %s\n", output); + printf("wanted %s\n", digestdup); + } + unit_assert(strcmp(output, digestdup) == 0); + + /* delete environment */ + free(digestdup); + auth_zones_delete(az); + regional_destroy(region); + sldns_buffer_free(buf); + + if(verbosity >= VERB_ALGO) { + printf("\n"); + } +} + +/** loop over files and test generated zonemd digest */ +static void zonemd_generate_tests(void) +{ + unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_hash"); + zonemd_generate_test("example.org", "testdata/zonemd.example1.zone", + 1, 2, "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.1 */ + zonemd_generate_test("example", "testdata/zonemd.example_a1.zone", + 1, 1, "c68090d90a7aed716bc459f9340e3d7c1370d4d24b7e2fc3a1ddc0b9a87153b9a9713b3c9ae5cc27777f98b8e730044c"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.2 */ + zonemd_generate_test("example", "testdata/zonemd.example_a2.zone", + 1, 1, "31cefb03814f5062ad12fa951ba0ef5f8da6ae354a415767246f7dc932ceb1e742a2108f529db6a33a11c01493de358d"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.3 SHA384 digest */ + zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", + 1, 1, "62e6cf51b02e54b9b5f967d547ce43136792901f9f88e637493daaf401c92c279dd10f0edb1c56f8080211f8480ee306"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.3 SHA512 digest*/ + zonemd_generate_test("example", "testdata/zonemd.example_a3.zone", + 1, 2, "08cfa1115c7b948c4163a901270395ea226a930cd2cbcf2fa9a5e6eb85f37c8a4e114d884e66f176eab121cb02db7d652e0cc4827e7a3204f166b47e5613fd27"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.4 */ + zonemd_generate_test("uri.arpa", "testdata/zonemd.example_a4.zone", + 1, 1, "1291b78ddf7669b1a39d014d87626b709b55774c5d7d58fadc556439889a10eaf6f11d615900a4f996bd46279514e473"); + + /* https://tools.ietf.org/html/draft-ietf-dnsop-dns-zone-digest-12 + * from section A.5 */ + zonemd_generate_test("root-servers.net", "testdata/zonemd.example_a5.zone", + 1, 1, "f1ca0ccd91bd5573d9f431c00ee0101b2545c97602be0a978a3b11dbfc1c776d5b3e86ae3d973d6b5349ba7f04340f79"); +} + +/** test the zonemd check routine */ +static void zonemd_check_test(void) +{ + const char* zname = "example.org"; + char* zfile = "testdata/zonemd.example1.zone"; + int scheme = 1; + int hashalgo = 2; + const char* digest = "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D481B7"; + const char* digestwrong = "20564D10F50A0CEBEC856C64032B7DFB53D3C449A421A5BC7A21F7627B4ACEA4DF29F2C6FE82ED9C23ADF6F4D420D5DD63EF6E6349D60FDAB910B65DF8D48100"; + uint8_t hash[512], hashwrong[512]; + size_t hashlen = 0, hashwronglen = 0; + struct auth_zones* az; + struct auth_zone* z; + int result; + struct regional* region = NULL; + struct sldns_buffer* buf = NULL; + char* reason = NULL; + + if(!zonemd_hashalgo_supported(hashalgo)) + return; /* cannot test unsupported algo */ + unit_show_func("services/authzone.c", "auth_zone_generate_zonemd_check"); + + /* setup environment */ + az = auth_zones_create(); + unit_assert(az); + region = regional_create(); + unit_assert(region); + buf = sldns_buffer_new(65535); + unit_assert(buf); + + /* read file */ + z = authtest_addzone(az, zname, zfile); + unit_assert(z); + hashlen = sizeof(hash); + if(sldns_str2wire_hex_buf(digest, hash, &hashlen) != 0) { + unit_assert(0); /* parse failure */ + } + hashwronglen = sizeof(hashwrong); + if(sldns_str2wire_hex_buf(digestwrong, hashwrong, &hashwronglen) != 0) { + unit_assert(0); /* parse failure */ + } + + /* check return values of the check routine */ + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hash, hashlen, region, buf, &reason); + unit_assert(result && reason == NULL); + result = auth_zone_generate_zonemd_check(z, 241, hashalgo, + hash, hashlen, region, buf, &reason); + unit_assert(!result && strcmp(reason, "unsupported scheme")==0); + result = auth_zone_generate_zonemd_check(z, scheme, 242, + hash, hashlen, region, buf, &reason); + unit_assert(!result && strcmp(reason, "unsupported algorithm")==0); + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hash, 2, region, buf, &reason); + unit_assert(!result && strcmp(reason, "digest length too small, less than 12")==0); + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hashwrong, hashwronglen, region, buf, &reason); + unit_assert(!result && strcmp(reason, "incorrect digest")==0); + result = auth_zone_generate_zonemd_check(z, scheme, hashalgo, + hashwrong, hashwronglen-3, region, buf, &reason); + unit_assert(!result && strcmp(reason, "incorrect digest length")==0); + + /* delete environment */ + auth_zones_delete(az); + regional_destroy(region); + sldns_buffer_free(buf); + + if(verbosity >= VERB_ALGO) { + printf("\n"); + } +} + +/** zonemd test verify */ +static void zonemd_verify_test(char* zname, char* zfile, char* tastr, + char* date_override, char* result_wanted) +{ + time_t now = 0; + struct module_stack mods; + struct module_env env; + char* result = NULL; + struct auth_zone* z; + + /* setup test harness */ + memset(&mods, 0, sizeof(mods)); + memset(&env, 0, sizeof(env)); + env.scratch = regional_create(); + if(!env.scratch) + fatal_exit("out of memory"); + env.scratch_buffer = sldns_buffer_new(65553); + if(!env.scratch_buffer) + fatal_exit("out of memory"); + env.cfg = config_create(); + if(!env.cfg) + fatal_exit("out of memory"); + env.now = &now; + env.cfg->val_date_override = cfg_convert_timeval(date_override); + if(!env.cfg->val_date_override) + fatal_exit("could not parse datetime %s", date_override); + if(env.cfg->module_conf) + free(env.cfg->module_conf); + env.cfg->module_conf = strdup("validator iterator"); + if(!env.cfg->module_conf) + fatal_exit("out of memory"); + if(tastr) { + if(!cfg_strlist_insert(&env.cfg->trust_anchor_list, + strdup(tastr))) + fatal_exit("out of memory"); + } + env.anchors = anchors_create(); + if(!env.anchors) + fatal_exit("out of memory"); + env.auth_zones = auth_zones_create(); + if(!env.auth_zones) + fatal_exit("out of memory"); + modstack_init(&mods); + if(!modstack_setup(&mods, env.cfg->module_conf, &env)) + fatal_exit("could not modstack_setup"); + env.mesh = mesh_create(&mods, &env); + if(!env.mesh) + fatal_exit("out of memory"); + + /* load data */ + z = authtest_addzone(env.auth_zones, zname, zfile); + if(!z) + fatal_exit("could not addzone %s %s", zname, zfile); + + /* test */ + lock_rw_wrlock(&z->lock); + auth_zone_verify_zonemd(z, &env, &result); + lock_rw_unlock(&z->lock); + if(verbosity >= VERB_ALGO) { + printf("auth zone %s: ZONEMD verification %s: %s\n", zname, + (strcmp(result, "ZONEMD verification successful")==0?"successful":"failed"), + result); + } + if(!result) + fatal_exit("out of memory"); + unit_assert(strcmp(result, result_wanted) == 0); + if(strcmp(result, "ZONEMD verification successful") == 0 || + strcmp(result, "DNSSEC verified nonexistence of ZONEMD") == 0 || + strcmp(result, "no ZONEMD present") == 0) { + lock_rw_rdlock(&z->lock); + unit_assert(!z->zone_expired); + lock_rw_unlock(&z->lock); + } else { + lock_rw_rdlock(&z->lock); + unit_assert(z->zone_expired); + lock_rw_unlock(&z->lock); + } + free(result); + + /* desetup test harness */ + mesh_delete(env.mesh); + modstack_desetup(&mods, &env); + auth_zones_delete(env.auth_zones); + anchors_delete(env.anchors); + config_delete(env.cfg); + regional_destroy(env.scratch); + sldns_buffer_free(env.scratch_buffer); + + if(verbosity >= VERB_ALGO) { + printf("\n"); + } +} + +/** zonemd test verify suite */ +static void zonemd_verify_tests(void) +{ + unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); + zonemd_verify_test("example.org", + "testdata/zonemd.example1.zone", + "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20180302005009", + "have trust anchor, but zone has no DNSKEY"); + zonemd_verify_test("example.org", + "testdata/zonemd.example1.zone", + NULL, + "20180302005009", + "no ZONEMD present"); + /* no trust anchor, so it succeeds */ + zonemd_verify_test("example.com", + "testdata/zonemd.example2.zone", + NULL, + "20180302005009", + "ZONEMD verification successful"); + /* trust anchor for another zone, so it is indeterminate */ + zonemd_verify_test("example.com", + "testdata/zonemd.example2.zone", + "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20180302005009", + "ZONEMD verification successful"); + + /* load a DNSSEC signed zone, but no trust anchor */ + zonemd_verify_test("example.com", + "testdata/zonemd.example3.zone", + NULL, + "20180302005009", + "incorrect digest"); + /* load a DNSSEC zone with NSEC3, but no trust anchor */ + zonemd_verify_test("example.com", + "testdata/zonemd.example4.zone", + NULL, + "20180302005009", + "incorrect digest"); + /* valid zonemd, in dnssec signed zone, no trust anchor*/ + zonemd_verify_test("example.com", + "testdata/zonemd.example5.zone", + NULL, + "20180302005009", + "ZONEMD verification successful"); + /* valid zonemd, in dnssec NSEC3 zone, no trust anchor*/ + zonemd_verify_test("example.com", + "testdata/zonemd.example6.zone", + NULL, + "20180302005009", + "ZONEMD verification successful"); + + /* load a DNSSEC signed zone with a trust anchor, valid ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example5.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "ZONEMD verification successful"); + /* load a DNSSEC NSEC3 signed zone with a trust anchor, valid ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example6.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "ZONEMD verification successful"); + + /* load a DNSSEC NSEC zone without ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example7.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC verified nonexistence of ZONEMD"); + /* load a DNSSEC NSEC3 zone without ZONEMD */ + zonemd_verify_test("example.com", + "testdata/zonemd.example8.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC verified nonexistence of ZONEMD"); +} + +/** zonemd unit tests */ +void zonemd_test(void) +{ + unit_show_feature("zonemd"); + zonemd_generate_tests(); + zonemd_check_test(); + zonemd_verify_tests(); +} From e1d119af7ebd1038024eb7d690422449b2be547f Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 13:17:42 +0200 Subject: [PATCH 27/66] zonemd, unit tests for wrong DNSSEC signatures. --- testcode/unitzonemd.c | 13 +++++++++++++ testdata/zonemd.example10.zone | 35 ++++++++++++++++++++++++++++++++++ testdata/zonemd.example9.zone | 35 ++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 testdata/zonemd.example10.zone create mode 100644 testdata/zonemd.example9.zone diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 8ba8fedc6..f135d21e3 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -405,6 +405,19 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", "DNSSEC verified nonexistence of ZONEMD"); + + /* load DNSSEC zone but RRSIG on ZONEMD is wrong */ + zonemd_verify_test("example.com", + "testdata/zonemd.example9.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC verify failed for ZONEMD RRset"); + /* load DNSSEC zone but RRSIG on SOA is wrong */ + zonemd_verify_test("example.com", + "testdata/zonemd.example10.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC verify failed for SOA RRset"); } /** zonemd unit tests */ diff --git a/testdata/zonemd.example10.zone b/testdata/zonemd.example10.zone new file mode 100644 index 000000000..33ca2828e --- /dev/null +++ b/testdata/zonemd.example10.zone @@ -0,0 +1,35 @@ +; DNSSEC signed but RRSIG on SOA is wrong. + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +; old sig +; example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +; wrong sig +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgeAAAAA= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= diff --git a/testdata/zonemd.example9.zone b/testdata/zonemd.example9.zone new file mode 100644 index 000000000..9c035aa13 --- /dev/null +++ b/testdata/zonemd.example9.zone @@ -0,0 +1,35 @@ +; signed zone but RRSIG on ZONEMD is wrong. + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +; old sig +; example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +; wrong sig +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVAAAAA= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= From 58d91646f1ffd6efb7eab69813ae05dd9770257d Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 14:23:44 +0200 Subject: [PATCH 28/66] zonemd, unit tests for DNSSEC type bitmaps. --- testcode/unitzonemd.c | 13 +++++++++++++ testdata/zonemd.example11.zone | 33 ++++++++++++++++++++++++++++++++ testdata/zonemd.example12.zone | 35 ++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 testdata/zonemd.example11.zone create mode 100644 testdata/zonemd.example12.zone diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index f135d21e3..b297c44e9 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -418,6 +418,19 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", "DNSSEC verify failed for SOA RRset"); + + /* load DNSSEC zone without ZONEMD, but NSEC bitmap says it exists */ + zonemd_verify_test("example.com", + "testdata/zonemd.example11.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC NSEC bitmap says type ZONEMD exists"); + /* load DNSSEC zone without ZONEMD, but NSEC3 bitmap says it exists */ + zonemd_verify_test("example.com", + "testdata/zonemd.example12.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC NSEC3 bitmap says type ZONEMD exists"); } /** zonemd unit tests */ diff --git a/testdata/zonemd.example11.zone b/testdata/zonemd.example11.zone new file mode 100644 index 000000000..7562f7972 --- /dev/null +++ b/testdata/zonemd.example11.zone @@ -0,0 +1,33 @@ +; DNSSEC NSEC zone, but ZONEMD is missing + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +; missing ZONEMD +;example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +;example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= diff --git a/testdata/zonemd.example12.zone b/testdata/zonemd.example12.zone new file mode 100644 index 000000000..4fc04bf88 --- /dev/null +++ b/testdata/zonemd.example12.zone @@ -0,0 +1,35 @@ +; DNSSEC NSEC3 zone, but ZONEMD is missing + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN NSEC3PARAM 1 0 1 012345 +example.com. 3600 IN RRSIG NSEC3PARAM 8 2 3600 20201116135527 20201019135527 55566 example.com. CDbcPLDrpVUyk3v7kwQ3LNzzhDHS40e0LDv7IZrzMt2AO/6SJ7xhlG+qByhc7CFBUMvBNaOteO5th0tvotWxk0UrVhqRyyXNCr8SmDdAaPH4SGwJ2p+XPIwn0CTXDpyOcgCrW0Kt2OjubA+4fQwjkGYFuDATY5QOITe6kGJpKpw= +; missing ZONEMD +;example.com. 3600 IN TYPE63 \# 70 0bee1bc6010246e31506f321c58db811c934c6446141d651a8574fb21088a2bb6feec875fc8b60f50beae00e7f6554e2cf3cb048350ef92e2946137443e30079813db4d1bfbd +;example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. M0f4wkOn6dcYtaQtwvp698QL7HuKEgi+PPjYJawV8d1VNOWbbRTF9L9tHFDK42Ylq238uOxi223ZEk/pq4BP64Sm31dV54K2V95QqdzN9NDD34+sqKEgGyRcmBiE50gm3kZZ4ENqBQKc+GdlbZ2fHSI6gf6X694sSmZ7dfjq+2k= +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN NSEC3 1 0 1 012345 2v43f6ripfocif5h6bbi07glq6849rnj NS SOA RRSIG DNSKEY NSEC3PARAM TYPE63 +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. Yd+g1m2aDKDUuZNv2KpKk4uSNrpB5KLM3QUqypm484VjOpnj5Wy3BjUULH3P8z+S9PG7XbaOf+yUYHK8cI6i5GTcrMhoLKaanAD09i1KbXbTVJujwA9Za7WzlFVZ3o6f1D8CbrSS3YPWNF3Mb2FYaptvZ9so7MlecuLYdEer7DY= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN NSEC3 1 0 1 012345 f0lpjkgefgrobj5pucem78r2ouo53fq8 A RRSIG +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. gTDi/2e/RPeSOwoBr6oqfoFsGXAknLX3J96EHzMmhtRR7W4pEW8uXKsMJ3rr4qgUUX+ZtzoCMYy+UBkiJfjpWvMToGtuADNOzz0rF8BESaW/8k6iDKPmqmwdGyLGMmfGjYPcb4qg3+9egLejA+fF1OSrhHuINeO80ouw++PL0ns= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN NSEC3 1 0 1 012345 v4cknoe1mioduf5bmhgfjjq4dlqet8fm A RRSIG +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. VugivzPyv5+qZhl+x0frrykYyOOdZfcKdmIA13P4OzhtiRNhCRHznhrdTlmfLw/b5Rs5jFX7Iw/hhU80Geg72cYG4KVJwtP6zTyFApDl/8x3rj3vhZOc2nwpYmjjFsyrlb7M2RhcStnS6c/2R4+dBFwwVZXyJBi3fo9NybujI9g= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN NSEC3 1 0 1 012345 r18q2sl76hceldh0keqr7vnqc15db64a A RRSIG +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. zishUbm8GxjaHOOUdbz0ZEut99dm+DQ/zvxhOTeS3kmUnL8t3ISew641JeNvvajAUk/xn6eGHjLBuHfwNG+itF2pSD8Gl6Ppo22Y0C9uO5TyRQalYpjtz1kI/VlIelcd0TyusmIMaRChswtpctPKITbr8Wl+MoZZtPQhJ5NjQlQ= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN NSEC3 1 0 1 012345 91onuasouslv1so1i62id4rf0l763dss A RRSIG +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. d9CluwN3zWfLe20J212CuwNzJVbVsDR4eijuJyLpyHzziSc10CauWtUiuHeQMXCVJNwhPSb5kQTfKtql+Jd44BQlenRt/sHfa6YZEOwClN4O8V0vZ43K4vlwwWbh5kxQbFQ/e+w4vlYb1m4PHwzDLtqocNQ9T4A8SXl3A8paZqI= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN NSEC3 1 0 1 012345 c6ntadrd765diocebcrq6trs8npn83o3 A RRSIG +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. czJf5HkfHLpfGcku2iZnCu9tXnM7VWOYYhGtVAwkYG0M6BO4LzRxGCV3SkUvHLFxoqQY0DZLnafPl2MKg8zsF+tusf3e3xmpcCSR29IfuDYH7GzuVCj3H0ScmXM0lvyQ92JpJ0AMqq2mW1nvKmgjkyugs+EMpxcFVjhibljocLU= From 3c86bf51de4ea36f8350b092df975ba1251c7ae3 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 15:04:06 +0200 Subject: [PATCH 29/66] zonemd, unit tests for wrong NSEC RRSIGs. --- testcode/unitzonemd.c | 13 +++++++++++++ testdata/zonemd.example13.zone | 33 ++++++++++++++++++++++++++++++++ testdata/zonemd.example14.zone | 35 ++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 testdata/zonemd.example13.zone create mode 100644 testdata/zonemd.example14.zone diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index b297c44e9..558c40dd6 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -431,6 +431,19 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", "DNSSEC NSEC3 bitmap says type ZONEMD exists"); + + /* load DNSSEC zone without ZONEMD, but RRSIG on NSEC not okay */ + zonemd_verify_test("example.com", + "testdata/zonemd.example13.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC verify failed for NSEC RRset"); + /* load DNSSEC zone without ZONEMD, but RRSIG on NSEC3 not okay */ + zonemd_verify_test("example.com", + "testdata/zonemd.example14.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DNSSEC verify failed for NSEC3 RRset"); } /** zonemd unit tests */ diff --git a/testdata/zonemd.example13.zone b/testdata/zonemd.example13.zone new file mode 100644 index 000000000..9f311c912 --- /dev/null +++ b/testdata/zonemd.example13.zone @@ -0,0 +1,33 @@ +; DNSSEC NSEC zone without ZONEMD, but NSEC RRSIG is wrong + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY +; old sig +;example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ROT+Kh6Y0sEf+L9c2HGPvppLL/DFP5KcX/zSjy7ovM7vXTrrdhEhOedbuccN84tk6VU8udGIixd5Usc+juZ+WsiWwaSNB5rKo6lZ9ceOJlYVzLCmawePzTsl6VAIiIVXwrMxGz/amBd+Ou/1NCuXJiWVThU9PDyJ/lQZbVJEHMA= +; wrong sig +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ROT+Kh6Y0sEf+L9c2HGPvppLL/DFP5KcX/zSjy7ovM7vXTrrdhEhOedbuccN84tk6VU8udGIixd5Usc+juZ+WsiWwaSNB5rKo6lZ9ceOJlYVzLCmawePzTsl6VAIiIVXwrMxGz/amBd+Ou/1NCuXJiWVThU9PDyJ/lQZbVAAAAA= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= diff --git a/testdata/zonemd.example14.zone b/testdata/zonemd.example14.zone new file mode 100644 index 000000000..bc4cdacdb --- /dev/null +++ b/testdata/zonemd.example14.zone @@ -0,0 +1,35 @@ +; DNSSEC NSEC3 zone without ZONEMD, but NSEC3 RRSIG is wrong + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN NSEC3PARAM 1 0 1 012345 +example.com. 3600 IN RRSIG NSEC3PARAM 8 2 3600 20201116135527 20201019135527 55566 example.com. CDbcPLDrpVUyk3v7kwQ3LNzzhDHS40e0LDv7IZrzMt2AO/6SJ7xhlG+qByhc7CFBUMvBNaOteO5th0tvotWxk0UrVhqRyyXNCr8SmDdAaPH4SGwJ2p+XPIwn0CTXDpyOcgCrW0Kt2OjubA+4fQwjkGYFuDATY5QOITe6kGJpKpw= +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN NSEC3 1 0 1 012345 2v43f6ripfocif5h6bbi07glq6849rnj NS SOA RRSIG DNSKEY NSEC3PARAM +; old sig +;v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. J2LISTGtBe+x2pNESBOYrBHAJjEDVFkmjJf2kj0GSFYisvSuy6ZUvQZZUB9sfLmEX18FpdNTieE8MrR2nbpKWfgVBDdGtcU72x/GOIRRq586A1KNtP2eJ81vcblM5dvqvpht46tF+xy85j9G9BYxpcT1PQRpvmho9yhgCxq2kUQ= +; wrong sig +v4cknoe1mioduf5bmhgfjjq4dlqet8fm.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. J2LISTGtBe+x2pNESBOYrBHAJjEDVFkmjJf2kj0GSFYisvSuy6ZUvQZZUB9sfLmEX18FpdNTieE8MrR2nbpKWfgVBDdGtcU72x/GOIRRq586A1KNtP2eJ81vcblM5dvqvpht46tF+xy85j9G9BYxpcT1PQRpvmho9yhgCxAAAAA= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN NSEC3 1 0 1 012345 f0lpjkgefgrobj5pucem78r2ouo53fq8 A RRSIG +c6ntadrd765diocebcrq6trs8npn83o3.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. gTDi/2e/RPeSOwoBr6oqfoFsGXAknLX3J96EHzMmhtRR7W4pEW8uXKsMJ3rr4qgUUX+ZtzoCMYy+UBkiJfjpWvMToGtuADNOzz0rF8BESaW/8k6iDKPmqmwdGyLGMmfGjYPcb4qg3+9egLejA+fF1OSrhHuINeO80ouw++PL0ns= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN NSEC3 1 0 1 012345 v4cknoe1mioduf5bmhgfjjq4dlqet8fm A RRSIG +r18q2sl76hceldh0keqr7vnqc15db64a.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. VugivzPyv5+qZhl+x0frrykYyOOdZfcKdmIA13P4OzhtiRNhCRHznhrdTlmfLw/b5Rs5jFX7Iw/hhU80Geg72cYG4KVJwtP6zTyFApDl/8x3rj3vhZOc2nwpYmjjFsyrlb7M2RhcStnS6c/2R4+dBFwwVZXyJBi3fo9NybujI9g= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN NSEC3 1 0 1 012345 r18q2sl76hceldh0keqr7vnqc15db64a A RRSIG +f0lpjkgefgrobj5pucem78r2ouo53fq8.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. zishUbm8GxjaHOOUdbz0ZEut99dm+DQ/zvxhOTeS3kmUnL8t3ISew641JeNvvajAUk/xn6eGHjLBuHfwNG+itF2pSD8Gl6Ppo22Y0C9uO5TyRQalYpjtz1kI/VlIelcd0TyusmIMaRChswtpctPKITbr8Wl+MoZZtPQhJ5NjQlQ= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN NSEC3 1 0 1 012345 91onuasouslv1so1i62id4rf0l763dss A RRSIG +2v43f6ripfocif5h6bbi07glq6849rnj.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. d9CluwN3zWfLe20J212CuwNzJVbVsDR4eijuJyLpyHzziSc10CauWtUiuHeQMXCVJNwhPSb5kQTfKtql+Jd44BQlenRt/sHfa6YZEOwClN4O8V0vZ43K4vlwwWbh5kxQbFQ/e+w4vlYb1m4PHwzDLtqocNQ9T4A8SXl3A8paZqI= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN NSEC3 1 0 1 012345 c6ntadrd765diocebcrq6trs8npn83o3 A RRSIG +91onuasouslv1so1i62id4rf0l763dss.example.com. 3600 IN RRSIG NSEC3 8 3 3600 20201116135527 20201019135527 55566 example.com. czJf5HkfHLpfGcku2iZnCu9tXnM7VWOYYhGtVAwkYG0M6BO4LzRxGCV3SkUvHLFxoqQY0DZLnafPl2MKg8zsF+tusf3e3xmpcCSR29IfuDYH7GzuVCj3H0ScmXM0lvyQ92JpJ0AMqq2mW1nvKmgjkyugs+EMpxcFVjhibljocLU= From 7ac4eb229d2fb9687b2d8d2595e2c8a78be685a7 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 15:58:47 +0200 Subject: [PATCH 30/66] zonemd, unit tests for verifying DNSKEY with trust anchor failures. --- services/authzone.c | 2 ++ testcode/unitzonemd.c | 24 +++++++++++++++++++++++ testdata/zonemd.example15.zone | 35 ++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 testdata/zonemd.example15.zone diff --git a/services/authzone.c b/services/authzone.c index e05a5d81d..5fa5408a8 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7887,6 +7887,8 @@ zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, } else { /* bogus */ *is_insecure = 0; + auth_zone_log(z->name, VERB_ALGO, + "zonemd: verify DNSKEY RRset with trust anchor failed: %s", *reason); } return NULL; } diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 558c40dd6..090028af6 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -444,6 +444,30 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", "DNSSEC verify failed for NSEC3 RRset"); + + verbosity=4; + /* load DNSSEC zone, with ZONEMD, but DNSKEY RRSIG is not okay. */ + zonemd_verify_test("example.com", + "testdata/zonemd.example15.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "signature crypto failed"); + /* load DNSSEC zone, but trust anchor mismatches DNSKEY */ + zonemd_verify_test("example.com", + "testdata/zonemd.example5.zone", + /* okay anchor is + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", */ + "example.com. IN DS 55566 8 2 0000000000111111222223333444444dfcf92595148022f2c2fd98e5deee90af", + "20201020135527", + "DS hash mismatches key"); + /* load DNSSEC zone, but trust anchor fails because the zone + * has expired signatures. We set the date for it */ + zonemd_verify_test("example.com", + "testdata/zonemd.example5.zone", + "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", + /* okay date: "20201020135527", */ + "20221020135527", + "signature expired"); } /** zonemd unit tests */ diff --git a/testdata/zonemd.example15.zone b/testdata/zonemd.example15.zone new file mode 100644 index 000000000..8a1068910 --- /dev/null +++ b/testdata/zonemd.example15.zone @@ -0,0 +1,35 @@ +; DNSSEC signed but DNSKEY RRSIG is wrong. + +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +; old sig +;example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +; wrong sig +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2AAAAA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= From 92eb12d26bdffe04a7d93f2d6d0b6e028428a8df Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 15:59:29 +0200 Subject: [PATCH 31/66] zonemd, unit test remove debug. --- testcode/unitzonemd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 090028af6..4f8e7f479 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -445,7 +445,6 @@ static void zonemd_verify_tests(void) "20201020135527", "DNSSEC verify failed for NSEC3 RRset"); - verbosity=4; /* load DNSSEC zone, with ZONEMD, but DNSKEY RRSIG is not okay. */ zonemd_verify_test("example.com", "testdata/zonemd.example15.zone", From 4ba45c34ed71894beb6e23279d1f01a3627563dc Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 21 Oct 2020 16:18:28 +0200 Subject: [PATCH 32/66] zonemd, result of dnssec failures includes rrset and dnssec bogus reason. --- services/authzone.c | 72 ++++++++++++++++++++++++------------------- testcode/unitzonemd.c | 16 +++++----- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 5fa5408a8..727add003 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7539,13 +7539,12 @@ static void auth_zone_log(uint8_t* name, enum verbosity_value level, /** ZONEMD, dnssec verify the rrset with the dnskey */ static int zonemd_dnssec_verify_rrset(struct auth_zone* z, struct module_env* env, struct ub_packed_rrset_key* dnskey, - struct auth_data* node, struct auth_rrset* rrset) + struct auth_data* node, struct auth_rrset* rrset, char** why_bogus) { struct ub_packed_rrset_key pk; enum sec_status sec; struct val_env* ve; int m; - char* why_bogus = NULL; m = modstack_find(&env->mesh->mods, "validator"); if(m == -1) { auth_zone_log(z->name, VERB_ALGO, "zonemd dnssec verify: have " @@ -7568,13 +7567,13 @@ static int zonemd_dnssec_verify_rrset(struct auth_zone* z, auth_zone_log(z->name, VERB_ALGO, "zonemd: verify %s RRset with DNSKEY", typestr); } - sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, NULL, &why_bogus, + sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, NULL, why_bogus, LDNS_SECTION_ANSWER, NULL); if(sec == sec_status_secure) { return 1; } if(why_bogus) - auth_zone_log(z->name, VERB_ALGO, "DNSSEC verify was bogus: %s", why_bogus); + auth_zone_log(z->name, VERB_ALGO, "DNSSEC verify was bogus: %s", *why_bogus); return 0; } @@ -7606,7 +7605,7 @@ static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo, * return false on failure, reason contains description of failure. */ static int zonemd_check_dnssec_absence(struct auth_zone* z, struct module_env* env, struct ub_packed_rrset_key* dnskey, - struct auth_data* apex, char** reason) + struct auth_data* apex, char** reason, char** why_bogus) { struct auth_rrset* nsec = NULL; if(!apex) { @@ -7617,7 +7616,8 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, if(nsec) { struct ub_packed_rrset_key pk; /* dnssec verify the NSEC */ - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, nsec)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, nsec, + why_bogus)) { *reason = "DNSSEC verify failed for NSEC RRset"; return 0; } @@ -7659,7 +7659,8 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, return 0; } /* dnssec verify the NSEC3 */ - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, match, nsec3)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, match, nsec3, + why_bogus)) { *reason = "DNSSEC verify failed for NSEC3 RRset"; return 0; } @@ -7680,7 +7681,7 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, struct module_env* env, struct ub_packed_rrset_key* dnskey, struct auth_data* apex, struct auth_rrset* zonemd_rrset, - char** reason) + char** reason, char** why_bogus) { struct auth_rrset* soa; if(!apex) { @@ -7692,11 +7693,12 @@ static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, *reason = "zone has no SOA RRset"; return 0; } - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, soa)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, soa, why_bogus)) { *reason = "DNSSEC verify failed for SOA RRset"; return 0; } - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, zonemd_rrset)) { + if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, zonemd_rrset, + why_bogus)) { *reason = "DNSSEC verify failed for ZONEMD RRset"; return 0; } @@ -7709,10 +7711,11 @@ static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, * @param z: auth zone that fails. * @param env: environment with config, to ignore failure or not. * @param reason: failure string description. + * @param why_bogus: failure string for DNSSEC verification failure. * @param result: strdup result in here if not NULL. */ static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, - char* reason, char** result) + char* reason, char* why_bogus, char** result) { char zstr[255+1]; /* if fail: log reason, and depending on config also take action @@ -7720,7 +7723,14 @@ static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, dname_str(z->name, zstr); if(!reason) reason = "verification failed"; if(result) { - *result = strdup(reason); + if(why_bogus) { + char res[1024]; + snprintf(res, sizeof(res), "%s: %s", reason, + why_bogus); + *result = strdup(res); + } else { + *result = strdup(reason); + } if(!*result) log_err("out of memory"); } else { log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason); @@ -7746,7 +7756,7 @@ static void auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, struct ub_packed_rrset_key* dnskey, int is_insecure, char** result) { - char* reason = NULL; + char* reason = NULL, *why_bogus = NULL; struct auth_data* apex = NULL; struct auth_rrset* zonemd_rrset = NULL; int zonemd_absent = 0, zonemd_absence_dnssecok = 0; @@ -7773,22 +7783,22 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, } else if(!zonemd_rrset) { /* fetch, DNSSEC verify, and check NSEC/NSEC3 */ if(!zonemd_check_dnssec_absence(z, env, dnskey, apex, - &reason)) { - auth_zone_zonemd_fail(z, env, reason, result); + &reason, &why_bogus)) { + auth_zone_zonemd_fail(z, env, reason, why_bogus, result); return; } zonemd_absence_dnssecok = 1; } else if(zonemd_rrset && dnskey) { /* check DNSSEC verify of SOA and ZONEMD */ if(!zonemd_check_dnssec_soazonemd(z, env, dnskey, apex, - zonemd_rrset, &reason)) { - auth_zone_zonemd_fail(z, env, reason, result); + zonemd_rrset, &reason, &why_bogus)) { + auth_zone_zonemd_fail(z, env, reason, why_bogus, result); return; } } if(zonemd_absent && 0) { - auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", result); + auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", NULL, result); return; } if(zonemd_absent && zonemd_absence_dnssecok) { @@ -7810,7 +7820,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, /* check ZONEMD checksum and report or else fail. */ if(!auth_zone_zonemd_check_hash(z, env, &reason)) { - auth_zone_zonemd_fail(z, env, reason, result); + auth_zone_zonemd_fail(z, env, reason, NULL, result); return; } @@ -7830,7 +7840,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, * @param env: environment with time and temp buffers. * @param anchor: trust anchor to use * @param is_insecure: returned, true if the zone is securely insecure. - * @param reason: if the routine fails, returns the failure reason. + * @param why_bogus: if the routine fails, returns the failure reason. * @param keystorage: where to store the ub_packed_rrset_key that is created * on success. A pointer to it is returned on success. * @return the dnskey RRset, reference to zone data and keystorage, or @@ -7838,7 +7848,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, */ static struct ub_packed_rrset_key* zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, - struct trust_anchor* anchor, int* is_insecure, char** reason, + struct trust_anchor* anchor, int* is_insecure, char** why_bogus, struct ub_packed_rrset_key* keystorage) { struct auth_data* apex; @@ -7849,18 +7859,18 @@ zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, apex = az_find_name(z, z->name, z->namelen); if(!apex) { - *reason = "have trust anchor, but zone has no apex domain for DNSKEY"; + *why_bogus = "have trust anchor, but zone has no apex domain for DNSKEY"; return 0; } dnskey_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_DNSKEY); if(!dnskey_rrset || dnskey_rrset->data->count==0) { - *reason = "have trust anchor, but zone has no DNSKEY"; + *why_bogus = "have trust anchor, but zone has no DNSKEY"; return 0; } m = modstack_find(&env->mesh->mods, "validator"); if(m == -1) { - *reason = "have trust anchor, but no validator module"; + *why_bogus = "have trust anchor, but no validator module"; return 0; } ve = (struct val_env*)env->modinfo[m]; @@ -7875,7 +7885,7 @@ zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, auth_zone_log(z->name, VERB_QUERY, "zonemd: verify DNSKEY RRset with trust anchor"); sec = val_verify_DNSKEY_with_TA(env, ve, keystorage, anchor->ds_rrset, - anchor->dnskey_rrset, NULL, reason, NULL); + anchor->dnskey_rrset, NULL, why_bogus, NULL); regional_free_all(env->scratch); if(sec == sec_status_secure) { /* success */ @@ -7888,7 +7898,7 @@ zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, /* bogus */ *is_insecure = 0; auth_zone_log(z->name, VERB_ALGO, - "zonemd: verify DNSKEY RRset with trust anchor failed: %s", *reason); + "zonemd: verify DNSKEY RRset with trust anchor failed: %s", *why_bogus); } return NULL; } @@ -7965,7 +7975,7 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, } if(reason) { - auth_zone_zonemd_fail(z, env, reason, NULL); + auth_zone_zonemd_fail(z, env, reason, NULL, NULL); lock_rw_unlock(&z->lock); return; } @@ -8036,7 +8046,7 @@ zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env) void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, char** result) { - char* reason = NULL; + char* reason = NULL, *why_bogus = NULL; struct trust_anchor* anchor = NULL; struct ub_packed_rrset_key* dnskey = NULL; struct ub_packed_rrset_key keystorage; @@ -8053,10 +8063,10 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, if(anchor && query_dname_compare(z->name, anchor->name) == 0) { /* equal to trustanchor, no need for online lookups */ dnskey = zonemd_get_dnskey_from_anchor(z, env, anchor, - &is_insecure, &reason, &keystorage); + &is_insecure, &why_bogus, &keystorage); lock_basic_unlock(&anchor->lock); if(!dnskey && !reason) { - reason = "dnskey verify with anchor failed"; + reason = "verify DNSKEY RRset with trust anchor failed"; } } else if(anchor) { lock_basic_unlock(&anchor->lock); @@ -8074,7 +8084,7 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, } if(reason) { - auth_zone_zonemd_fail(z, env, reason, result); + auth_zone_zonemd_fail(z, env, reason, why_bogus, result); return; } diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 4f8e7f479..a20a6b0b2 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -336,7 +336,7 @@ static void zonemd_verify_tests(void) "testdata/zonemd.example1.zone", "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20180302005009", - "have trust anchor, but zone has no DNSKEY"); + "verify DNSKEY RRset with trust anchor failed: have trust anchor, but zone has no DNSKEY"); zonemd_verify_test("example.org", "testdata/zonemd.example1.zone", NULL, @@ -411,13 +411,13 @@ static void zonemd_verify_tests(void) "testdata/zonemd.example9.zone", "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "DNSSEC verify failed for ZONEMD RRset"); + "DNSSEC verify failed for ZONEMD RRset: signature crypto failed"); /* load DNSSEC zone but RRSIG on SOA is wrong */ zonemd_verify_test("example.com", "testdata/zonemd.example10.zone", "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "DNSSEC verify failed for SOA RRset"); + "DNSSEC verify failed for SOA RRset: signature crypto failed"); /* load DNSSEC zone without ZONEMD, but NSEC bitmap says it exists */ zonemd_verify_test("example.com", @@ -437,20 +437,20 @@ static void zonemd_verify_tests(void) "testdata/zonemd.example13.zone", "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "DNSSEC verify failed for NSEC RRset"); + "DNSSEC verify failed for NSEC RRset: signature crypto failed"); /* load DNSSEC zone without ZONEMD, but RRSIG on NSEC3 not okay */ zonemd_verify_test("example.com", "testdata/zonemd.example14.zone", "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "DNSSEC verify failed for NSEC3 RRset"); + "DNSSEC verify failed for NSEC3 RRset: signature crypto failed"); /* load DNSSEC zone, with ZONEMD, but DNSKEY RRSIG is not okay. */ zonemd_verify_test("example.com", "testdata/zonemd.example15.zone", "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "signature crypto failed"); + "verify DNSKEY RRset with trust anchor failed: signature crypto failed"); /* load DNSSEC zone, but trust anchor mismatches DNSKEY */ zonemd_verify_test("example.com", "testdata/zonemd.example5.zone", @@ -458,7 +458,7 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", */ "example.com. IN DS 55566 8 2 0000000000111111222223333444444dfcf92595148022f2c2fd98e5deee90af", "20201020135527", - "DS hash mismatches key"); + "verify DNSKEY RRset with trust anchor failed: DS hash mismatches key"); /* load DNSSEC zone, but trust anchor fails because the zone * has expired signatures. We set the date for it */ zonemd_verify_test("example.com", @@ -466,7 +466,7 @@ static void zonemd_verify_tests(void) "example.com. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", /* okay date: "20201020135527", */ "20221020135527", - "signature expired"); + "verify DNSKEY RRset with trust anchor failed: signature expired"); } /** zonemd unit tests */ From e09873e0c8c167434667a882708cc91298c8f16e Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 22 Oct 2020 12:10:46 +0200 Subject: [PATCH 33/66] zonemd, zonemds are checked at start --- daemon/daemon.c | 10 ++-- daemon/worker.c | 2 + libunbound/context.c | 3 +- services/authzone.c | 91 ++++++++++++++++++++++++++++++++++-- services/authzone.h | 21 ++++++++- smallapp/unbound-checkconf.c | 2 +- testcode/unitzonemd.c | 2 +- 7 files changed, 117 insertions(+), 14 deletions(-) diff --git a/daemon/daemon.c b/daemon/daemon.c index f480c94e6..83a30def7 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -632,19 +632,19 @@ daemon_fork(struct daemon* daemon) fatal_exit("Could not set up per-view response IP sets"); daemon->use_response_ip = !respip_set_is_empty(daemon->respip_set) || have_view_respip_cfg; - + + /* setup modules */ + daemon_setup_modules(daemon); + /* read auth zonefiles */ if(!auth_zones_apply_cfg(daemon->env->auth_zones, daemon->cfg, 1, - &daemon->use_rpz)) + &daemon->use_rpz, daemon->env, &daemon->mods)) fatal_exit("auth_zones could not be setup"); /* Set-up EDNS tags */ if(!edns_tags_apply_cfg(daemon->env->edns_tags, daemon->cfg)) fatal_exit("Could not set up EDNS tags"); - /* setup modules */ - daemon_setup_modules(daemon); - /* response-ip-xxx options don't work as expected without the respip * module. To avoid run-time operational surprise we reject such * configuration. */ diff --git a/daemon/worker.c b/daemon/worker.c index 458afa04e..9e4ad7c75 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -1906,6 +1906,8 @@ worker_init(struct worker* worker, struct config_file *cfg, #endif ) { auth_xfer_pickup_initial(worker->env.auth_zones, &worker->env); + auth_zones_pickup_zonemd_verify(worker->env.auth_zones, + &worker->env); } #ifdef USE_DNSTAP if(worker->daemon->cfg->dnstap diff --git a/libunbound/context.c b/libunbound/context.c index 713259c71..914855470 100644 --- a/libunbound/context.c +++ b/libunbound/context.c @@ -78,7 +78,8 @@ context_finalize(struct ub_ctx* ctx) return UB_NOMEM; if(!local_zones_apply_cfg(ctx->local_zones, cfg)) return UB_INITFAIL; - if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1, &is_rpz)) + if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1, &is_rpz, + ctx->env, &ctx->mods)) return UB_INITFAIL; if(!edns_tags_apply_cfg(ctx->env->edns_tags, cfg)) return UB_INITFAIL; diff --git a/services/authzone.c b/services/authzone.c index 727add003..4adf90c4f 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1745,9 +1745,47 @@ int auth_zone_write_file(struct auth_zone* z, const char* fname) return 1; } +/** offline verify for zonemd, while reading a zone file to immediately + * spot bad hashes in zonefile as they are read. + * Creates temp buffers, but uses anchors and validation environment + * from the module_env. */ +static void +zonemd_offline_verify(struct auth_zone* z, struct module_env* env_for_val, + struct module_stack* mods) +{ + struct module_env env; + struct mesh_area mesh; + time_t now = 0; + env = *env_for_val; + env.scratch_buffer = sldns_buffer_new(env.cfg->msg_buffer_size); + if(!env.scratch_buffer) { + log_err("out of memory"); + goto clean_exit; + } + env.scratch = regional_create(); + memset(&mesh, 0, sizeof(mesh)); + mesh.mods = *mods; + env.mesh = &mesh; + if(!env.now) { + env.now = &now; + now = time(NULL); + } + if(!env.scratch) { + log_err("out of memory"); + goto clean_exit; + } + auth_zone_verify_zonemd(z, &env, NULL, 1, 0); + +clean_exit: + /* clean up and exit */ + sldns_buffer_free(env.scratch_buffer); + regional_destroy(env.scratch); +} + /** read all auth zones from file (if they have) */ static int -auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg) +auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg, + struct module_env* env, struct module_stack* mods) { struct auth_zone* z; lock_rw_wrlock(&az->lock); @@ -1758,6 +1796,8 @@ auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg) lock_rw_unlock(&az->lock); return 0; } + if(z->zonefile && z->zonefile[0]!=0 && env) + zonemd_offline_verify(z, env, mods); lock_rw_unlock(&z->lock); } lock_rw_unlock(&az->lock); @@ -2103,7 +2143,8 @@ az_delete_deleted_zones(struct auth_zones* az) } int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg, - int setup, int* is_rpz) + int setup, int* is_rpz, struct module_env* env, + struct module_stack* mods) { struct config_auth* p; az_setall_deleted(az); @@ -2119,7 +2160,7 @@ int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg, } } az_delete_deleted_zones(az); - if(!auth_zones_read_zones(az, cfg)) + if(!auth_zones_read_zones(az, cfg, env, mods)) return 0; if(setup) { if(!auth_zones_setup_zones(az)) @@ -8044,7 +8085,7 @@ zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env) } void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, - char** result) + char** result, int offline, int only_online) { char* reason = NULL, *why_bogus = NULL; struct trust_anchor* anchor = NULL; @@ -8061,6 +8102,10 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, * otherwise we have the zone DNSKEY for the DNSSEC verification. */ anchor = anchors_lookup(env->anchors, z->name, z->namelen, z->dclass); if(anchor && query_dname_compare(z->name, anchor->name) == 0) { + if(only_online) { + lock_basic_unlock(&anchor->lock); + return; + } /* equal to trustanchor, no need for online lookups */ dnskey = zonemd_get_dnskey_from_anchor(z, env, anchor, &is_insecure, &why_bogus, &keystorage); @@ -8071,6 +8116,8 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, } else if(anchor) { lock_basic_unlock(&anchor->lock); /* perform online lookups */ + if(offline) + return; /* setup online lookups, and wait for them */ if(zonemd_lookup_dnskey(z, env)) { /* wait for the lookup */ @@ -8079,6 +8126,8 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, reason = "could not lookup DNSKEY for chain of trust"; } else { /* the zone is not under a trust anchor */ + if(only_online) + return; dnskey = NULL; is_insecure = 1; } @@ -8091,3 +8140,37 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure, result); regional_free_all(env->scratch); } + +void auth_zones_pickup_zonemd_verify(struct auth_zones* az, + struct module_env* env) +{ + struct auth_zone key; + uint8_t savezname[255+1]; + size_t savezname_len; + struct auth_zone* z; + key.node.key = &key; + lock_rw_rdlock(&az->lock); + RBTREE_FOR(z, struct auth_zone*, &az->ztree) { + lock_rw_wrlock(&z->lock); + key.dclass = z->dclass; + key.namelabs = z->namelabs; + if(z->namelen > sizeof(savezname)) { + lock_rw_unlock(&z->lock); + log_err("auth_zones_pickup_zonemd_verify: zone name too long"); + continue; + } + savezname_len = z->namelen; + memmove(savezname, z->name, z->namelen); + lock_rw_unlock(&az->lock); + auth_zone_verify_zonemd(z, env, NULL, 0, 1); + lock_rw_unlock(&z->lock); + lock_rw_rdlock(&az->lock); + /* find the zone we had before, it is not deleted, + * because we have a flag for that that is processed at + * apply_cfg time */ + key.namelen = savezname_len; + key.name = savezname; + z = (struct auth_zone*)rbtree_search(&az->ztree, &key); + } + lock_rw_unlock(&az->lock); +} diff --git a/services/authzone.h b/services/authzone.h index c00598ad1..9ddc756f9 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -479,10 +479,13 @@ struct auth_zones* auth_zones_create(void); * @param cfg: config to apply. * @param setup: if true, also sets up values in the auth zones structure * @param is_rpz: set to 1 if at least one RPZ zone is configured. + * @param env: environment for offline verification. + * @param mods: modules in environment. * @return false on failure. */ int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg, - int setup, int* is_rpz); + int setup, int* is_rpz, struct module_env* env, + struct module_stack* mods); /** initial pick up of worker timeouts, ties events to worker event loop * @param az: auth zones structure @@ -744,13 +747,27 @@ int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, * @param z: auth zone to check. Caller holds lock. wrlock. * @param env: with temp region, buffer and config. * @param result: if not NULL, result string strdupped in here. + * @param offline: if true, there is no spawned lookup when online is needed. + * Those zones are skipped for ZONEMD checking. + * @param only_online: if true, only for ZONEMD that need online lookup + * of DNSKEY chain of trust are processed. */ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, - char** result); + char** result, int offline, int only_online); /** mesh callback for zonemd on lookup of dnskey */ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, struct sldns_buffer* buf, enum sec_status sec, char* why_bogus, int was_ratelimited); +/** + * Check the ZONEMD records that need online DNSSEC chain lookups, + * for them spawn the lookup process to get it checked out. + * Attaches the lookup process to the worker event base and mesh state. + * @param az: auth zones, every zones is checked. + * @param env: env of the worker where the task is attached. + */ +void auth_zones_pickup_zonemd_verify(struct auth_zones* az, + struct module_env* env); + #endif /* SERVICES_AUTHZONE_H */ diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c index b1b7ae7ef..34a1f5bb4 100644 --- a/smallapp/unbound-checkconf.c +++ b/smallapp/unbound-checkconf.c @@ -851,7 +851,7 @@ check_auth(struct config_file* cfg) { int is_rpz = 0; struct auth_zones* az = auth_zones_create(); - if(!az || !auth_zones_apply_cfg(az, cfg, 0, &is_rpz)) { + if(!az || !auth_zones_apply_cfg(az, cfg, 0, &is_rpz, NULL, NULL)) { fatal_exit("Could not setup authority zones"); } auth_zones_delete(az); diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index a20a6b0b2..10c40c630 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -291,7 +291,7 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, /* test */ lock_rw_wrlock(&z->lock); - auth_zone_verify_zonemd(z, &env, &result); + auth_zone_verify_zonemd(z, &env, &result, 1, 0); lock_rw_unlock(&z->lock); if(verbosity >= VERB_ALGO) { printf("auth zone %s: ZONEMD verification %s: %s\n", zname, From 6ea1ae17f71327ad7ec21a0948d847bb1cc6fe29 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 22 Oct 2020 13:20:00 +0200 Subject: [PATCH 34/66] zonemd, fix to harden against failure in pickup zonemd lookups. --- services/authzone.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/authzone.c b/services/authzone.c index 4adf90c4f..29780e72f 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -8171,6 +8171,8 @@ void auth_zones_pickup_zonemd_verify(struct auth_zones* az, key.namelen = savezname_len; key.name = savezname; z = (struct auth_zone*)rbtree_search(&az->ztree, &key); + if(!z) + break; } lock_rw_unlock(&az->lock); } From 54d8473ec66babaa61e1d54a0d7c3a5e9a4a30be Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 22 Oct 2020 13:31:37 +0200 Subject: [PATCH 35/66] zonemd, pass module stack as function argument. --- services/authzone.c | 64 +++++++++++++++++++++++-------------------- services/authzone.h | 4 ++- testcode/unitzonemd.c | 2 +- 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 29780e72f..861a1ce22 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1754,7 +1754,6 @@ zonemd_offline_verify(struct auth_zone* z, struct module_env* env_for_val, struct module_stack* mods) { struct module_env env; - struct mesh_area mesh; time_t now = 0; env = *env_for_val; env.scratch_buffer = sldns_buffer_new(env.cfg->msg_buffer_size); @@ -1763,9 +1762,6 @@ zonemd_offline_verify(struct auth_zone* z, struct module_env* env_for_val, goto clean_exit; } env.scratch = regional_create(); - memset(&mesh, 0, sizeof(mesh)); - mesh.mods = *mods; - env.mesh = &mesh; if(!env.now) { env.now = &now; now = time(NULL); @@ -1774,7 +1770,7 @@ zonemd_offline_verify(struct auth_zone* z, struct module_env* env_for_val, log_err("out of memory"); goto clean_exit; } - auth_zone_verify_zonemd(z, &env, NULL, 1, 0); + auth_zone_verify_zonemd(z, &env, mods, NULL, 1, 0); clean_exit: /* clean up and exit */ @@ -7579,14 +7575,15 @@ static void auth_zone_log(uint8_t* name, enum verbosity_value level, /** ZONEMD, dnssec verify the rrset with the dnskey */ static int zonemd_dnssec_verify_rrset(struct auth_zone* z, - struct module_env* env, struct ub_packed_rrset_key* dnskey, - struct auth_data* node, struct auth_rrset* rrset, char** why_bogus) + struct module_env* env, struct module_stack* mods, + struct ub_packed_rrset_key* dnskey, struct auth_data* node, + struct auth_rrset* rrset, char** why_bogus) { struct ub_packed_rrset_key pk; enum sec_status sec; struct val_env* ve; int m; - m = modstack_find(&env->mesh->mods, "validator"); + m = modstack_find(mods, "validator"); if(m == -1) { auth_zone_log(z->name, VERB_ALGO, "zonemd dnssec verify: have " "DNSKEY chain of trust, but no validator module"); @@ -7645,8 +7642,9 @@ static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo, /** Verify the absence of ZONEMD with DNSSEC by checking NSEC, NSEC3 type flag. * return false on failure, reason contains description of failure. */ static int zonemd_check_dnssec_absence(struct auth_zone* z, - struct module_env* env, struct ub_packed_rrset_key* dnskey, - struct auth_data* apex, char** reason, char** why_bogus) + struct module_env* env, struct module_stack* mods, + struct ub_packed_rrset_key* dnskey, struct auth_data* apex, + char** reason, char** why_bogus) { struct auth_rrset* nsec = NULL; if(!apex) { @@ -7657,8 +7655,8 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, if(nsec) { struct ub_packed_rrset_key pk; /* dnssec verify the NSEC */ - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, nsec, - why_bogus)) { + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, + nsec, why_bogus)) { *reason = "DNSSEC verify failed for NSEC RRset"; return 0; } @@ -7700,8 +7698,8 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, return 0; } /* dnssec verify the NSEC3 */ - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, match, nsec3, - why_bogus)) { + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, match, + nsec3, why_bogus)) { *reason = "DNSSEC verify failed for NSEC3 RRset"; return 0; } @@ -7720,9 +7718,9 @@ static int zonemd_check_dnssec_absence(struct auth_zone* z, /** Verify the SOA and ZONEMD DNSSEC signatures. * return false on failure, reason contains description of failure. */ static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, - struct module_env* env, struct ub_packed_rrset_key* dnskey, - struct auth_data* apex, struct auth_rrset* zonemd_rrset, - char** reason, char** why_bogus) + struct module_env* env, struct module_stack* mods, + struct ub_packed_rrset_key* dnskey, struct auth_data* apex, + struct auth_rrset* zonemd_rrset, char** reason, char** why_bogus) { struct auth_rrset* soa; if(!apex) { @@ -7734,12 +7732,13 @@ static int zonemd_check_dnssec_soazonemd(struct auth_zone* z, *reason = "zone has no SOA RRset"; return 0; } - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, soa, why_bogus)) { + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, soa, + why_bogus)) { *reason = "DNSSEC verify failed for SOA RRset"; return 0; } - if(!zonemd_dnssec_verify_rrset(z, env, dnskey, apex, zonemd_rrset, - why_bogus)) { + if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, + zonemd_rrset, why_bogus)) { *reason = "DNSSEC verify failed for ZONEMD RRset"; return 0; } @@ -7786,6 +7785,7 @@ static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, * Verify the zonemd with DNSSEC and hash check, with given key. * @param z: auth zone. * @param env: environment with config and temp buffers. + * @param mods: module stack with validator env for verification. * @param dnskey: dnskey that we can use, or NULL. If nonnull, the key * has been verified and is the start of the chain of trust. * @param is_insecure: if true, the dnskey is not used, the zone is insecure. @@ -7795,7 +7795,8 @@ static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, */ static void auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, - struct ub_packed_rrset_key* dnskey, int is_insecure, char** result) + struct module_stack* mods, struct ub_packed_rrset_key* dnskey, + int is_insecure, char** result) { char* reason = NULL, *why_bogus = NULL; struct auth_data* apex = NULL; @@ -7823,7 +7824,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, /* success, zonemd is absent */ } else if(!zonemd_rrset) { /* fetch, DNSSEC verify, and check NSEC/NSEC3 */ - if(!zonemd_check_dnssec_absence(z, env, dnskey, apex, + if(!zonemd_check_dnssec_absence(z, env, mods, dnskey, apex, &reason, &why_bogus)) { auth_zone_zonemd_fail(z, env, reason, why_bogus, result); return; @@ -7831,7 +7832,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, zonemd_absence_dnssecok = 1; } else if(zonemd_rrset && dnskey) { /* check DNSSEC verify of SOA and ZONEMD */ - if(!zonemd_check_dnssec_soazonemd(z, env, dnskey, apex, + if(!zonemd_check_dnssec_soazonemd(z, env, mods, dnskey, apex, zonemd_rrset, &reason, &why_bogus)) { auth_zone_zonemd_fail(z, env, reason, why_bogus, result); return; @@ -7889,7 +7890,8 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, */ static struct ub_packed_rrset_key* zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, - struct trust_anchor* anchor, int* is_insecure, char** why_bogus, + struct module_stack* mods, struct trust_anchor* anchor, + int* is_insecure, char** why_bogus, struct ub_packed_rrset_key* keystorage) { struct auth_data* apex; @@ -7909,7 +7911,7 @@ zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env, return 0; } - m = modstack_find(&env->mesh->mods, "validator"); + m = modstack_find(mods, "validator"); if(m == -1) { *why_bogus = "have trust anchor, but no validator module"; return 0; @@ -8021,7 +8023,8 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, return; } - auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure, NULL); + auth_zone_verify_zonemd_with_key(z, env, &env->mesh->mods, dnskey, + is_insecure, NULL); regional_free_all(env->scratch); lock_rw_unlock(&z->lock); } @@ -8085,7 +8088,7 @@ zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env) } void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, - char** result, int offline, int only_online) + struct module_stack* mods, char** result, int offline, int only_online) { char* reason = NULL, *why_bogus = NULL; struct trust_anchor* anchor = NULL; @@ -8107,7 +8110,7 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, return; } /* equal to trustanchor, no need for online lookups */ - dnskey = zonemd_get_dnskey_from_anchor(z, env, anchor, + dnskey = zonemd_get_dnskey_from_anchor(z, env, mods, anchor, &is_insecure, &why_bogus, &keystorage); lock_basic_unlock(&anchor->lock); if(!dnskey && !reason) { @@ -8137,7 +8140,8 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, return; } - auth_zone_verify_zonemd_with_key(z, env, dnskey, is_insecure, result); + auth_zone_verify_zonemd_with_key(z, env, mods, dnskey, is_insecure, + result); regional_free_all(env->scratch); } @@ -8162,7 +8166,7 @@ void auth_zones_pickup_zonemd_verify(struct auth_zones* az, savezname_len = z->namelen; memmove(savezname, z->name, z->namelen); lock_rw_unlock(&az->lock); - auth_zone_verify_zonemd(z, env, NULL, 0, 1); + auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 1); lock_rw_unlock(&z->lock); lock_rw_rdlock(&az->lock); /* find the zone we had before, it is not deleted, diff --git a/services/authzone.h b/services/authzone.h index 9ddc756f9..6f0791723 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -746,6 +746,7 @@ int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, * This includes DNSSEC verification if applicable. * @param z: auth zone to check. Caller holds lock. wrlock. * @param env: with temp region, buffer and config. + * @param mods: module stack for validator env. * @param result: if not NULL, result string strdupped in here. * @param offline: if true, there is no spawned lookup when online is needed. * Those zones are skipped for ZONEMD checking. @@ -753,7 +754,8 @@ int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme, * of DNSKEY chain of trust are processed. */ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, - char** result, int offline, int only_online); + struct module_stack* mods, char** result, int offline, + int only_online); /** mesh callback for zonemd on lookup of dnskey */ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 10c40c630..82ab9076d 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -291,7 +291,7 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, /* test */ lock_rw_wrlock(&z->lock); - auth_zone_verify_zonemd(z, &env, &result, 1, 0); + auth_zone_verify_zonemd(z, &env, &mods, &result, 1, 0); lock_rw_unlock(&z->lock); if(verbosity >= VERB_ALGO) { printf("auth zone %s: ZONEMD verification %s: %s\n", zname, From f854f4e8673291f730910f7037ba4152f2e25c01 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 22 Oct 2020 16:02:37 +0200 Subject: [PATCH 36/66] zonemd, test for server start with zonemd from file. --- testdata/auth_zonemd_file.rpl | 182 ++++++++++++++++++++++++++++ testdata/auth_zonemd_file_fail.rpl | 184 +++++++++++++++++++++++++++++ 2 files changed, 366 insertions(+) create mode 100644 testdata/auth_zonemd_file.rpl create mode 100644 testdata/auth_zonemd_file_fail.rpl diff --git a/testdata/auth_zonemd_file.rpl b/testdata/auth_zonemd_file.rpl new file mode 100644 index 000000000..ffccd6779 --- /dev/null +++ b/testdata/auth_zonemd_file.rpl @@ -0,0 +1,182 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD from zonefile + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_file_fail.rpl b/testdata/auth_zonemd_file_fail.rpl new file mode 100644 index 000000000..4bfa81b80 --- /dev/null +++ b/testdata/auth_zonemd_file_fail.rpl @@ -0,0 +1,184 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +; good zonemd +;example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; wrong zonemd +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D7AAAAA +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD failure from zonefile + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +SCENARIO_END From 1cb7d5a1941051e696f56ade1f4feb4bab9d30b9 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 09:12:51 +0200 Subject: [PATCH 37/66] zonemd, unit test for auth zone zonemd axfr zonemd, zonemds are checked after zone transfer. --- services/authzone.c | 10 ++ testdata/auth_zonemd_xfr.rpl | 237 +++++++++++++++++++++++++++++ testdata/auth_zonemd_xfr_fail.rpl | 240 ++++++++++++++++++++++++++++++ 3 files changed, 487 insertions(+) create mode 100644 testdata/auth_zonemd_xfr.rpl create mode 100644 testdata/auth_zonemd_xfr_fail.rpl diff --git a/services/authzone.c b/services/authzone.c index 861a1ce22..0a477442c 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -5164,6 +5164,16 @@ xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env, " (or malformed RR)", xfr->task_transfer->master->host); return 0; } + auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 0); + if(z->zone_expired) { + char zname[256]; + dname_str(xfr->name, zname); + /* ZONEMD must have failed */ + verbose(VERB_ALGO, "xfr from %s: ZONEMD failed for %s, transfer is failed", xfr->task_transfer->master->host, zname); + xfr->zone_expired = 1; + lock_rw_unlock(&z->lock); + return 0; + } if(xfr->have_zone) xfr->lease_time = *env->now; diff --git a/testdata/auth_zonemd_xfr.rpl b/testdata/auth_zonemd_xfr.rpl new file mode 100644 index 000000000..0a4d45f92 --- /dev/null +++ b/testdata/auth_zonemd_xfr.rpl @@ -0,0 +1,237 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + master: 1.2.3.44 + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: yes + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with AXFR with ZONEMD + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN SOA +SECTION ANSWER +; serial, refresh, retry, expire, minimum +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +STEP 30 TIME_PASSES ELAPSE 10 +STEP 40 TRAFFIC + +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +; the zonefile was updated with new contents +STEP 70 CHECK_TEMPFILE example.com +FILE_BEGIN +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +bar.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN A 1.2.3.4 +ns.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN A 127.0.0.1 +FILE_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_xfr_fail.rpl b/testdata/auth_zonemd_xfr_fail.rpl new file mode 100644 index 000000000..9fdf70889 --- /dev/null +++ b/testdata/auth_zonemd_xfr_fail.rpl @@ -0,0 +1,240 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + master: 1.2.3.44 + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: yes + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with AXFR with failed ZONEMD + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN SOA +SECTION ANSWER +; serial, refresh, retry, expire, minimum +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOTIMPL +SECTION QUESTION +example.com. IN IXFR +SECTION ANSWER +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +; old zonemd +;example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; wrong zonemd +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D7AAAAA +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +STEP 30 TIME_PASSES ELAPSE 10 +STEP 40 TRAFFIC + +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +; the zonefile was updated with new contents +STEP 70 CHECK_TEMPFILE example.com +FILE_BEGIN +FILE_END + +SCENARIO_END From 40e713e1219da89229f6b9a35233ed301670285f Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 10:14:21 +0200 Subject: [PATCH 38/66] zonemd, unlock xfr lock for auth zone verify of zonemd for mesh new callback. --- services/authzone.c | 56 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 0a477442c..470f490cf 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -5106,6 +5106,28 @@ xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env) lock_rw_unlock(&z->lock); } +/** reacquire locks and structures. Starts with no locks, ends + * with xfr and z locks, if fail, no z lock */ +static int xfr_process_reacquire_locks(struct auth_xfer* xfr, + struct module_env* env, struct auth_zone** z) +{ + /* release xfr lock, then, while holding az->lock grab both + * z->lock and xfr->lock */ + lock_rw_rdlock(&env->auth_zones->lock); + *z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen, + xfr->dclass); + if(!*z) { + lock_rw_unlock(&env->auth_zones->lock); + lock_basic_lock(&xfr->lock); + *z = NULL; + return 0; + } + lock_rw_wrlock(&(*z)->lock); + lock_basic_lock(&xfr->lock); + lock_rw_unlock(&env->auth_zones->lock); + return 1; +} + /** process chunk list and update zone in memory, * return false if it did not work */ static int @@ -5115,21 +5137,12 @@ xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env, struct auth_zone* z; /* obtain locks and structures */ - /* release xfr lock, then, while holding az->lock grab both - * z->lock and xfr->lock */ lock_basic_unlock(&xfr->lock); - lock_rw_rdlock(&env->auth_zones->lock); - z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen, - xfr->dclass); - if(!z) { - lock_rw_unlock(&env->auth_zones->lock); + if(!xfr_process_reacquire_locks(xfr, env, &z)) { /* the zone is gone, ignore xfr results */ - lock_basic_lock(&xfr->lock); return 0; } - lock_rw_wrlock(&z->lock); - lock_basic_lock(&xfr->lock); - lock_rw_unlock(&env->auth_zones->lock); + /* holding xfr and z locks */ /* apply data */ if(xfr->task_transfer->master->http) { @@ -5164,16 +5177,35 @@ xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env, " (or malformed RR)", xfr->task_transfer->master->host); return 0; } + + /* release xfr lock while verifying zonemd because it may have + * to spawn lookups in the state machines */ + lock_basic_unlock(&xfr->lock); + /* holding z lock */ auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 0); if(z->zone_expired) { char zname[256]; - dname_str(xfr->name, zname); /* ZONEMD must have failed */ + /* reacquire locks, so we hold xfr lock on exit of routine, + * and both xfr and z again after releasing xfr for potential + * state machine mesh callbacks */ + lock_rw_unlock(&z->lock); + if(!xfr_process_reacquire_locks(xfr, env, &z)) + return 0; + dname_str(xfr->name, zname); verbose(VERB_ALGO, "xfr from %s: ZONEMD failed for %s, transfer is failed", xfr->task_transfer->master->host, zname); xfr->zone_expired = 1; lock_rw_unlock(&z->lock); return 0; } + /* reacquire locks, so we hold xfr lock on exit of routine, + * and both xfr and z again after releasing xfr for potential + * state machine mesh callbacks */ + lock_rw_unlock(&z->lock); + if(!xfr_process_reacquire_locks(xfr, env, &z)) + return 0; + /* holding xfr and z locks */ + if(xfr->have_zone) xfr->lease_time = *env->now; From fb5f3f076dab106e6b2730b58105c481f53450dc Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 11:20:08 +0200 Subject: [PATCH 39/66] zonemd, zonemds are checked when a zone is auth_zone_reload from file, or reload with unbound-control. --- daemon/remote.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/daemon/remote.c b/daemon/remote.c index 8324e1901..498eb2495 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -2510,6 +2510,8 @@ do_auth_zone_reload(RES* ssl, struct worker* worker, char* arg) uint8_t* nm = NULL; struct auth_zones* az = worker->env.auth_zones; struct auth_zone* z = NULL; + char* reason = NULL; + int oldexpired = 0; if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs)) return; if(az) { @@ -2530,6 +2532,17 @@ do_auth_zone_reload(RES* ssl, struct worker* worker, char* arg) (void)ssl_printf(ssl, "error failed to read %s\n", arg); return; } + oldexpired = z->zone_expired; + auth_zone_verify_zonemd(z, &worker->env, &worker->env.mesh->mods, + &reason, 0, 0); + if(reason && !oldexpired && z->zone_expired) { + (void)ssl_printf(ssl, "error zonemd for %s failed: %s\n", + arg, reason); + } else if(reason && strcmp(reason, "ZONEMD verification successful") + ==0) { + (void)ssl_printf(ssl, "%s: %s\n", arg, reason); + } + free(reason); lock_rw_unlock(&z->lock); send_ok(ssl); } From c72ca35f0817683698cbdd9e2e1e36c5cdfedaa7 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 11:44:28 +0200 Subject: [PATCH 40/66] unbound-control auth_zone_reload sets zone to nonexpired and also updates the xfr soa values from the new zonefile contents. --- daemon/remote.c | 36 +++++++++++++++++++++++++++++++++--- services/authzone.c | 2 +- services/authzone.h | 3 +++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 498eb2495..8a6ede426 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -2510,8 +2510,8 @@ do_auth_zone_reload(RES* ssl, struct worker* worker, char* arg) uint8_t* nm = NULL; struct auth_zones* az = worker->env.auth_zones; struct auth_zone* z = NULL; + struct auth_xfer* xfr = NULL; char* reason = NULL; - int oldexpired = 0; if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs)) return; if(az) { @@ -2520,22 +2520,52 @@ do_auth_zone_reload(RES* ssl, struct worker* worker, char* arg) if(z) { lock_rw_wrlock(&z->lock); } + xfr = auth_xfer_find(az, nm, nmlen, LDNS_RR_CLASS_IN); + if(xfr) { + lock_basic_lock(&xfr->lock); + } lock_rw_unlock(&az->lock); } free(nm); if(!z) { + if(xfr) { + lock_basic_unlock(&xfr->lock); + } (void)ssl_printf(ssl, "error no auth-zone %s\n", arg); return; } if(!auth_zone_read_zonefile(z, worker->env.cfg)) { lock_rw_unlock(&z->lock); + if(xfr) { + lock_basic_unlock(&xfr->lock); + } (void)ssl_printf(ssl, "error failed to read %s\n", arg); return; } - oldexpired = z->zone_expired; + + z->zone_expired = 0; + if(xfr) { + xfr->zone_expired = 0; + if(!xfr_find_soa(z, xfr)) { + if(z->data.count == 0) { + lock_rw_unlock(&z->lock); + lock_basic_unlock(&xfr->lock); + (void)ssl_printf(ssl, "zone %s has no contents\n", arg); + return; + } + lock_rw_unlock(&z->lock); + lock_basic_unlock(&xfr->lock); + (void)ssl_printf(ssl, "error: no SOA in zone after read %s\n", arg); + return; + } + if(xfr->have_zone) + xfr->lease_time = *worker->env.now; + lock_basic_unlock(&xfr->lock); + } + auth_zone_verify_zonemd(z, &worker->env, &worker->env.mesh->mods, &reason, 0, 0); - if(reason && !oldexpired && z->zone_expired) { + if(reason && z->zone_expired) { (void)ssl_printf(ssl, "error zonemd for %s failed: %s\n", arg, reason); } else if(reason && strcmp(reason, "ZONEMD verification successful") diff --git a/services/authzone.c b/services/authzone.c index 470f490cf..d6931ce92 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1918,7 +1918,7 @@ auth_zone_get_serial(struct auth_zone* z, uint32_t* serial) } /** Find auth_zone SOA and populate the values in xfr(soa values). */ -static int +int xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr) { struct auth_data* apex; diff --git a/services/authzone.h b/services/authzone.h index 6f0791723..9452a3db2 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -633,6 +633,9 @@ int auth_zone_read_zonefile(struct auth_zone* z, struct config_file* cfg); /** find serial number of zone or false if none (no SOA record) */ int auth_zone_get_serial(struct auth_zone* z, uint32_t* serial); +/** Find auth_zone SOA and populate the values in xfr(soa values). */ +int xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr); + /** compare auth_zones for sorted rbtree */ int auth_zone_cmp(const void* z1, const void* z2); From 89087ae294d2094e7cded00fc7cfebb2a95d7f40 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 11:47:00 +0200 Subject: [PATCH 41/66] zonemd, unbound-control auth_zone_reload errors when ZONEMD fails. --- daemon/remote.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/daemon/remote.c b/daemon/remote.c index 8a6ede426..7c99e4f29 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -2566,14 +2566,17 @@ do_auth_zone_reload(RES* ssl, struct worker* worker, char* arg) auth_zone_verify_zonemd(z, &worker->env, &worker->env.mesh->mods, &reason, 0, 0); if(reason && z->zone_expired) { + lock_rw_unlock(&z->lock); (void)ssl_printf(ssl, "error zonemd for %s failed: %s\n", arg, reason); + free(reason); + return; } else if(reason && strcmp(reason, "ZONEMD verification successful") ==0) { (void)ssl_printf(ssl, "%s: %s\n", arg, reason); } - free(reason); lock_rw_unlock(&z->lock); + free(reason); send_ok(ssl); } From caee84d92ed82c0923a3bdcf74b8ad84334be9a9 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 12:10:30 +0200 Subject: [PATCH 42/66] zonemd, unit test for unbound-control auth_zone_reload with zonemd. --- .../zonemd_reload.tdir/zonemd_reload.conf | 22 ++++++ testdata/zonemd_reload.tdir/zonemd_reload.dsc | 16 ++++ .../zonemd_reload.tdir/zonemd_reload.post | 14 ++++ testdata/zonemd_reload.tdir/zonemd_reload.pre | 35 +++++++++ .../zonemd_reload.tdir/zonemd_reload.test | 74 +++++++++++++++++++ .../zonemd_reload.tdir/zonemd_reload.testns | 27 +++++++ .../zonemd_reload.tdir/zonemd_reload.zone | 8 ++ 7 files changed, 196 insertions(+) create mode 100644 testdata/zonemd_reload.tdir/zonemd_reload.conf create mode 100644 testdata/zonemd_reload.tdir/zonemd_reload.dsc create mode 100644 testdata/zonemd_reload.tdir/zonemd_reload.post create mode 100644 testdata/zonemd_reload.tdir/zonemd_reload.pre create mode 100644 testdata/zonemd_reload.tdir/zonemd_reload.test create mode 100644 testdata/zonemd_reload.tdir/zonemd_reload.testns create mode 100644 testdata/zonemd_reload.tdir/zonemd_reload.zone diff --git a/testdata/zonemd_reload.tdir/zonemd_reload.conf b/testdata/zonemd_reload.tdir/zonemd_reload.conf new file mode 100644 index 000000000..27bdb4424 --- /dev/null +++ b/testdata/zonemd_reload.tdir/zonemd_reload.conf @@ -0,0 +1,22 @@ +server: + verbosity: 7 + # num-threads: 1 + interface: 127.0.0.1 + port: @PORT@ + use-syslog: no + directory: "" + pidfile: "unbound.pid" + chroot: "" + username: "" + do-not-query-localhost: no + use-caps-for-id: yes +remote-control: + control-enable: yes + control-interface: @CONTROL_PATH@/controlpipe.@CONTROL_PID@ + control-use-cert: no +auth-zone: + name: "example.com" + for-upstream: yes + for-downstream: yes + zonefile: "zonemd_reload.zone" + #master: "127.0.0.1@@TOPORT@" diff --git a/testdata/zonemd_reload.tdir/zonemd_reload.dsc b/testdata/zonemd_reload.tdir/zonemd_reload.dsc new file mode 100644 index 000000000..016c3d6c7 --- /dev/null +++ b/testdata/zonemd_reload.tdir/zonemd_reload.dsc @@ -0,0 +1,16 @@ +BaseName: zonemd_reload +Version: 1.0 +Description: ZONEMD check after auth_zone_reload +CreationDate: Tue 23 Oct 12:00:00 CEST 2020 +Maintainer: dr. W.C.A. Wijngaards +Category: +Component: +CmdDepends: +Depends: +Help: +Pre: zonemd_reload.pre +Post: zonemd_reload.post +Test: zonemd_reload.test +AuxFiles: +Passed: +Failure: diff --git a/testdata/zonemd_reload.tdir/zonemd_reload.post b/testdata/zonemd_reload.tdir/zonemd_reload.post new file mode 100644 index 000000000..5e315088a --- /dev/null +++ b/testdata/zonemd_reload.tdir/zonemd_reload.post @@ -0,0 +1,14 @@ +# #-- zonemd_reload.post --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# source the test var file when it's there +[ -f .tpkg.var.test ] && source .tpkg.var.test +# +# do your teardown here +. ../common.sh +echo "> cat logfiles" +cat fwd.log +cat unbound.log +kill_pid $FWD_PID +kill_pid $UNBOUND_PID +rm -f $CONTROL_PATH/controlpipe.$CONTROL_PID diff --git a/testdata/zonemd_reload.tdir/zonemd_reload.pre b/testdata/zonemd_reload.tdir/zonemd_reload.pre new file mode 100644 index 000000000..fa5e4ca29 --- /dev/null +++ b/testdata/zonemd_reload.tdir/zonemd_reload.pre @@ -0,0 +1,35 @@ +# #-- zonemd_reload.pre--# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# use .tpkg.var.test for in test variable passing +[ -f .tpkg.var.test ] && source .tpkg.var.test + +. ../common.sh +get_random_port 2 +UNBOUND_PORT=$RND_PORT +FWD_PORT=$(($RND_PORT + 1)) +echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test +echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test + +# start forwarder +get_ldns_testns +$LDNS_TESTNS -p $FWD_PORT zonemd_reload.testns >fwd.log 2>&1 & +FWD_PID=$! +echo "FWD_PID=$FWD_PID" >> .tpkg.var.test + +# make config file +CONTROL_PATH=/tmp +CONTROL_PID=$$ +sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' -e 's?@CONTROL_PATH\@?'$CONTROL_PATH'?' -e 's/@CONTROL_PID@/'$CONTROL_PID'/' < zonemd_reload.conf > ub.conf +# start unbound in the background +PRE="../.." +$PRE/unbound -d -c ub.conf >unbound.log 2>&1 & +UNBOUND_PID=$! +echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test +echo "CONTROL_PATH=$CONTROL_PATH" >> .tpkg.var.test +echo "CONTROL_PID=$CONTROL_PID" >> .tpkg.var.test + +cat .tpkg.var.test +wait_ldns_testns_up fwd.log +wait_unbound_up unbound.log + diff --git a/testdata/zonemd_reload.tdir/zonemd_reload.test b/testdata/zonemd_reload.tdir/zonemd_reload.test new file mode 100644 index 000000000..5ae1d9b0c --- /dev/null +++ b/testdata/zonemd_reload.tdir/zonemd_reload.test @@ -0,0 +1,74 @@ +# #-- zonemd_reload.test --# +# source the master var file when it's there +[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master +# use .tpkg.var.test for in test variable passing +[ -f .tpkg.var.test ] && source .tpkg.var.test + +PRE="../.." +# do the test +echo "> dig www.example.com." +dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +if grep SERVFAIL outfile; then + echo "> try again" + dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +fi +if grep SERVFAIL outfile; then + echo "> try again" + sleep 1 + dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +fi +if grep SERVFAIL outfile; then + echo "> try again" + sleep 1 + dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +fi +if grep SERVFAIL outfile; then + echo "> try again" + sleep 1 + dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +fi +if grep SERVFAIL outfile; then + echo "> try again" + sleep 10 + dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +fi +if grep SERVFAIL outfile; then + echo "> try again" + sleep 10 + dig @localhost -p $UNBOUND_PORT www.example.com. | tee outfile +fi +echo "> cat logfiles" +cat fwd.log +cat unbound.log +echo "> check answer" +if grep www.example.com outfile | grep "127.0.0.1"; then + echo "OK" +else + echo "Not OK" + exit 1 +fi + +echo "> unbound-control status" +$PRE/unbound-control -c ub.conf status +if test $? -ne 0; then + echo "wrong exit value." + exit 1 +else + echo "exit value: OK" +fi + +echo "> unbound-control auth_zone_reload example.com" +$PRE/unbound-control -c ub.conf auth_zone_reload example.com 2>&1 | tee outfile +if test $? -ne 0; then + echo "wrong exit value." + exit 1 +fi +echo "> check unbound-control output" +if grep "example.com: ZONEMD verification successful" outfile; then + echo "OK" +else + echo "Not OK" + exit 1 +fi + +exit 0 diff --git a/testdata/zonemd_reload.tdir/zonemd_reload.testns b/testdata/zonemd_reload.tdir/zonemd_reload.testns new file mode 100644 index 000000000..f1678a1cc --- /dev/null +++ b/testdata/zonemd_reload.tdir/zonemd_reload.testns @@ -0,0 +1,27 @@ +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN SOA +SECTION ANSWER +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +example.com. IN NS ns.example.net. +EXTRA_PACKET +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +www.example.com. IN A 1.2.3.4 +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END diff --git a/testdata/zonemd_reload.tdir/zonemd_reload.zone b/testdata/zonemd_reload.tdir/zonemd_reload.zone new file mode 100644 index 000000000..16b631c7b --- /dev/null +++ b/testdata/zonemd_reload.tdir/zonemd_reload.zone @@ -0,0 +1,8 @@ +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 From 165b048e07cc281ae1211e31a40b1d4dc9072246 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 14:33:04 +0200 Subject: [PATCH 43/66] zonemd, zonemd-permissive-mode: yes logs the failure but does not block the zone after a ZONEMD verification failure. --- doc/example.conf.in | 3 + doc/unbound.conf.5.in | 6 + services/authzone.c | 6 + testdata/auth_zonefile_dnssec.rpl | 1 + util/config_file.c | 3 + util/config_file.h | 2 + util/configlexer.c | 4614 +++++++++++++++-------------- util/configlexer.lex | 1 + util/configparser.c | 2542 ++++++++-------- util/configparser.h | 6 +- util/configparser.y | 12 +- 11 files changed, 3633 insertions(+), 3563 deletions(-) diff --git a/doc/example.conf.in b/doc/example.conf.in index 85d475ea3..6e6bf781b 100644 --- a/doc/example.conf.in +++ b/doc/example.conf.in @@ -602,6 +602,9 @@ server: # List in ascending order the keysize and count values. # val-nsec3-keysize-iterations: "1024 150 2048 500 4096 2500" + # if enabled, ZONEMD verification failures do not block the zone. + # zonemd-permissive-mode: no + # instruct the auto-trust-anchor-file probing to add anchors after ttl. # add-holddown: 2592000 # 30 days diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in index 0b73480aa..6b4fbef56 100644 --- a/doc/unbound.conf.5.in +++ b/doc/unbound.conf.5.in @@ -1167,6 +1167,12 @@ be in ascending order and have at least one entry. If you set it to "1024 65535" there is no restriction to NSEC3 iteration values. This table must be kept short; a very long list could cause slower operation. .TP +.B zonemd\-permissive\-mode: \fI +If enabled the ZONEMD verification failures are only logged and do not cause +the zone to be blocked and only return servfail. Useful for testing out +if it works, or if the operator only wants to be notified of a problem without +disrupting service. Default is no. +.TP .B add\-holddown: \fI Instruct the \fBauto\-trust\-anchor\-file\fR probe mechanism for RFC5011 autotrust updates to add new trust anchors only after they have been diff --git a/services/authzone.c b/services/authzone.c index d6931ce92..4727b0546 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7818,6 +7818,12 @@ static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env, log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason); } + if(env->cfg->zonemd_permissive_mode) { + verbose(VERB_ALGO, "zonemd-permissive-mode enabled, " + "not blocking zone %s", zstr); + return; + } + /* expired means the zone gives servfail and is not used by * lookup if fallback_enabled*/ z->zone_expired = 1; diff --git a/testdata/auth_zonefile_dnssec.rpl b/testdata/auth_zonefile_dnssec.rpl index eb264ee8b..f58c52300 100644 --- a/testdata/auth_zonefile_dnssec.rpl +++ b/testdata/auth_zonefile_dnssec.rpl @@ -5,6 +5,7 @@ server: target-fetch-policy: "0 0 0 0 0" fake-sha1: yes trust-anchor-signaling: no + zonemd-permissive-mode: yes auth-zone: name: "example.com." diff --git a/util/config_file.c b/util/config_file.c index 406911ecc..af0aaa3c3 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -257,6 +257,7 @@ config_create(void) cfg->serve_expired_ttl_reset = 0; cfg->serve_expired_reply_ttl = 30; cfg->serve_expired_client_timeout = 0; + cfg->zonemd_permissive_mode = 0; cfg->add_holddown = 30*24*3600; cfg->del_holddown = 30*24*3600; cfg->keep_missing = 366*24*3600; /* one year plus a little leeway */ @@ -623,6 +624,7 @@ int config_set_option(struct config_file* cfg, const char* opt, { IS_NUMBER_OR_ZERO; cfg->serve_expired_reply_ttl = atoi(val); SERVE_EXPIRED_REPLY_TTL=(time_t)cfg->serve_expired_reply_ttl;} else S_NUMBER_OR_ZERO("serve-expired-client-timeout:", serve_expired_client_timeout) else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations) + else S_YNO("zonemd-permissive-mode:", zonemd_permissive_mode) else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown) else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown) else S_UNSIGNED_OR_ZERO("keep-missing:", keep_missing) @@ -1037,6 +1039,7 @@ config_get_option(struct config_file* cfg, const char* opt, else O_DEC(opt, "serve-expired-reply-ttl", serve_expired_reply_ttl) else O_DEC(opt, "serve-expired-client-timeout", serve_expired_client_timeout) else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations) + else O_YNO(opt, "zonemd_permissive_mode", zonemd_permissive_mode) else O_UNS(opt, "add-holddown", add_holddown) else O_UNS(opt, "del-holddown", del_holddown) else O_UNS(opt, "keep-missing", keep_missing) diff --git a/util/config_file.h b/util/config_file.h index a12a078f7..d707bac19 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -388,6 +388,8 @@ struct config_file { int serve_expired_client_timeout; /** nsec3 maximum iterations per key size, string */ char* val_nsec3_key_iterations; + /** if zonemd failures are permitted, only logged */ + int zonemd_permissive_mode; /** autotrust add holddown time, in seconds */ unsigned int add_holddown; /** autotrust del holddown time, in seconds */ diff --git a/util/configlexer.c b/util/configlexer.c index 9fc565e0c..0aac2586e 100644 --- a/util/configlexer.c +++ b/util/configlexer.c @@ -354,8 +354,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 336 -#define YY_END_OF_BUFFER 337 +#define YY_NUM_RULES 337 +#define YY_END_OF_BUFFER 338 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -363,368 +363,371 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[3281] = +static const flex_int16_t yy_accept[3300] = { 0, - 1, 1, 310, 310, 314, 314, 318, 318, 322, 322, - 1, 1, 326, 326, 330, 330, 337, 334, 1, 308, - 308, 335, 2, 335, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 310, 311, 311, 312, - 335, 314, 315, 315, 316, 335, 321, 318, 319, 319, - 320, 335, 322, 323, 323, 324, 335, 333, 309, 2, - 313, 335, 333, 329, 326, 327, 327, 328, 335, 330, - 331, 331, 332, 335, 334, 0, 1, 2, 2, 2, - 2, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 1, 1, 311, 311, 315, 315, 319, 319, 323, 323, + 1, 1, 327, 327, 331, 331, 338, 335, 1, 309, + 309, 336, 2, 336, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 311, 312, 312, 313, + 336, 315, 316, 316, 317, 336, 322, 319, 320, 320, + 321, 336, 323, 324, 324, 325, 336, 334, 310, 2, + 314, 336, 334, 330, 327, 328, 328, 329, 336, 331, + 332, 332, 333, 336, 335, 0, 1, 2, 2, 2, + 2, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 310, 0, 314, - 0, 321, 0, 318, 322, 0, 333, 0, 2, 2, - 333, 329, 0, 326, 330, 0, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 311, 0, 315, + 0, 322, 0, 319, 323, 0, 334, 0, 2, 2, + 334, 330, 0, 327, 331, 0, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 333, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 334, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 124, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 133, 334, 334, 334, 334, 334, 334, - 334, 333, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 124, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 133, 335, 335, 335, 335, 335, 335, + 335, 334, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 108, 334, 334, 334, 334, 334, 334, 8, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 125, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 108, 335, 335, 335, 335, 335, 335, 8, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 125, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 138, 334, 333, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 301, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 138, 335, 335, + 334, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 302, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 333, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 64, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 237, 334, 14, - 15, 334, 19, 18, 334, 334, 221, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 131, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 334, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 64, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 238, + 335, 14, 15, 335, 19, 18, 335, 335, 222, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 131, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 219, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 3, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 333, 334, 334, 334, 334, 334, 334, - 334, 295, 334, 334, 294, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 220, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 3, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 334, 335, 335, 335, + 335, 335, 335, 335, 296, 335, 335, 295, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 317, 334, 334, 334, 334, 334, 334, 334, - 334, 63, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 67, 334, - 268, 334, 334, 334, 334, 334, 334, 334, 334, 302, - 303, 334, 334, 334, 334, 334, 68, 334, 334, 132, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 318, 335, 335, 335, 335, + 335, 335, 335, 335, 63, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 67, 335, 269, 335, 335, 335, 335, 335, 335, + 335, 335, 303, 304, 335, 335, 335, 335, 335, 68, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 128, 334, 334, 334, 334, 334, - 334, 334, 334, 208, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 21, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 157, 334, 334, 333, 317, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 106, + 335, 335, 132, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 128, 335, 335, + 335, 335, 335, 335, 335, 335, 209, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 21, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 157, 335, 335, 335, + 334, 318, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 276, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 180, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 156, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 105, 334, + 335, 335, 335, 106, 335, 335, 335, 335, 335, 335, + 335, 277, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 180, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 156, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 32, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 33, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 65, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 130, 333, 334, 334, 334, 334, 334, 123, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 66, 334, 334, 334, 334, 334, + 335, 335, 105, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 32, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 33, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 65, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 130, 335, 334, 335, 335, + 335, 335, 335, 123, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 66, - 334, 334, 334, 334, 334, 334, 334, 241, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 181, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 54, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 242, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 181, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 54, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 259, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 58, - 334, 59, 334, 334, 334, 334, 334, 109, 334, 110, - 334, 334, 334, 334, 107, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 7, 334, 333, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 230, 334, 334, 334, 334, 159, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 260, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 58, 335, 59, 335, 335, 335, + 335, 335, 109, 335, 110, 335, 335, 335, 335, 107, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 7, 335, + 335, 334, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 242, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 45, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 55, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 200, 334, - 199, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 231, 335, 335, 335, 335, 159, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 243, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 45, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 55, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 201, 335, 200, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 16, 17, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 69, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 207, 334, 334, 334, 334, 334, - 334, 112, 334, 111, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 191, 334, 334, 334, 334, - 334, 334, 334, 334, 139, 333, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 100, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 89, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 16, 17, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 69, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 208, 335, 335, 335, 335, 335, 335, 112, 335, 111, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 192, 335, 335, 335, 335, 335, 335, 335, 335, + 139, 335, 334, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 100, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 220, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 93, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 62, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 194, 195, 334, 334, 334, 270, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 89, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 221, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 93, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 62, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 195, + 196, 335, 335, 335, 271, 335, 335, 335, 335, 335, - 6, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 274, 334, 334, 334, 334, 334, 334, 296, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 42, 334, 334, 334, 334, 44, 334, 334, 334, 334, - 334, 334, 334, 334, 52, 334, 334, 334, 334, 334, - 334, 334, 333, 334, 187, 334, 334, 334, 134, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 212, - 334, 188, 334, 334, 334, 227, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 6, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 275, + 335, 335, 335, 335, 335, 335, 297, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 42, 335, 335, + 335, 335, 44, 335, 335, 335, 335, 335, 335, 335, + 335, 52, 335, 335, 335, 335, 335, 335, 335, 335, + 334, 335, 188, 335, 335, 335, 134, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 213, 335, 189, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 53, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 136, 117, 334, - 118, 334, 334, 334, 116, 334, 334, 334, 334, 334, - 334, 334, 334, 154, 334, 334, 50, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 258, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 189, 334, 334, 334, 334, 334, 192, - 334, 198, 334, 334, 334, 334, 334, 226, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 228, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 53, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 136, 117, 335, 118, 335, + 335, 335, 116, 335, 335, 335, 335, 335, 335, 335, + 335, 154, 335, 335, 50, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 259, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 190, 335, 335, 335, 335, 335, 193, 335, 199, + 335, 335, 335, 335, 335, 227, 335, 335, 335, 335, - 334, 334, 104, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 129, 334, 334, 334, 334, 334, 334, 60, 334, - 334, 334, 26, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 20, 334, 334, 334, 334, 334, 334, 27, - 36, 334, 164, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 333, 334, 334, 334, - 334, 334, 334, 77, 79, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 278, 334, - 334, 334, 334, 238, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 104, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 129, + 335, 335, 335, 335, 335, 335, 60, 335, 335, 335, + 26, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 20, 335, 335, 335, 335, 335, 335, 27, 36, 335, + 164, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 334, 335, 335, 335, 335, + 335, 335, 77, 79, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 279, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 119, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 153, 334, 46, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 289, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 158, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 218, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 299, 334, 334, 334, 334, 334, 334, + 335, 335, 239, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 119, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 153, 335, 46, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 290, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 158, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 219, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 175, 334, 334, 334, 334, - 334, 334, 334, 334, 113, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 170, 334, 182, 334, 334, 334, - 334, 333, 334, 142, 334, 334, 334, 334, 334, 99, - 334, 334, 334, 334, 210, 334, 334, 334, 334, 334, - 334, 228, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 250, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 135, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 300, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 175, 335, 335, 335, 335, 335, + 335, 335, 335, 113, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 170, 335, 182, 335, 335, 335, 335, + 335, 334, 335, 142, 335, 335, 335, 335, 335, 99, + 335, 335, 335, 335, 211, 335, 335, 335, 335, 335, + 335, 229, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 251, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 135, - 334, 334, 334, 334, 174, 334, 334, 334, 334, 334, - 334, 80, 334, 81, 334, 334, 334, 334, 334, 61, - 292, 334, 334, 334, 334, 334, 88, 183, 334, 201, - 334, 231, 334, 334, 193, 271, 334, 334, 334, 334, - 334, 73, 334, 185, 334, 334, 334, 334, 334, 9, - 334, 334, 334, 103, 334, 334, 334, 334, 263, 334, - 334, 334, 334, 209, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 174, 335, 335, 335, 335, 335, + 335, 80, 335, 81, 335, 335, 335, 335, 335, 61, + 293, 335, 335, 335, 335, 335, 88, 183, 335, 202, + 335, 232, 335, 335, 194, 272, 335, 335, 335, 335, + 335, 73, 335, 185, 335, 335, 335, 335, 335, 9, + 335, 335, 335, 103, 335, 335, 335, 335, 264, 335, + 335, 335, 335, 210, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 333, - 334, 334, 334, 334, 173, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 160, 334, 277, 334, 334, - 334, 334, 334, 249, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 222, 334, 334, 306, 334, - 334, 334, 269, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 293, 334, 184, 334, 334, 334, 334, - 334, 334, 334, 72, 74, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 334, 335, 335, 335, 335, 173, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 160, 335, 278, 335, + 335, 335, 335, 335, 250, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 223, 335, 335, 307, + 335, 335, 335, 270, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 294, 335, 184, 335, 335, 335, - 334, 334, 102, 334, 334, 334, 334, 261, 334, 334, - 334, 334, 273, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 214, 34, 28, 30, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 35, 334, 29, - 31, 334, 334, 334, 334, 334, 334, 334, 334, 98, - 334, 334, 334, 334, 334, 334, 333, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 216, 213, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 71, 334, - 334, 334, 137, 334, 120, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 72, 74, 335, 335, 335, 335, + 335, 335, 335, 102, 335, 335, 335, 335, 262, 335, + 335, 335, 335, 274, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 215, 34, 28, 30, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 35, 335, + 29, 31, 335, 335, 335, 335, 335, 335, 335, 335, + 98, 335, 335, 335, 335, 335, 335, 335, 334, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 217, 214, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 155, 47, 334, 334, 334, 325, 13, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 287, 334, 290, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 12, 334, 334, 22, 334, 334, 334, - 267, 334, 334, 334, 334, 275, 334, 334, 334, 75, - 334, 224, 334, 334, 334, 334, 215, 334, 334, 70, - 334, 334, 334, 334, 23, 334, 43, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 169, - 168, 325, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 217, 211, 334, 229, 334, 334, 279, 334, 334, + 71, 335, 335, 335, 137, 335, 120, 335, 335, 335, + 335, 335, 335, 335, 335, 155, 47, 335, 335, 335, + 326, 13, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 288, 335, 291, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 12, 335, 335, 22, 335, + 335, 335, 268, 335, 335, 335, 335, 276, 335, 335, + 335, 75, 335, 225, 335, 335, 335, 335, 216, 335, + 335, 70, 335, 335, 335, 335, 23, 335, 43, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 169, 168, 335, 326, 335, 335, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 82, 334, 334, 334, 334, 262, 334, 334, 334, 334, - 197, 334, 334, 334, 334, 223, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 297, 298, 166, 334, 334, - 76, 334, 334, 334, 334, 176, 334, 334, 114, 115, - 334, 334, 334, 334, 161, 334, 163, 334, 202, 334, - 334, 334, 334, 167, 334, 334, 232, 334, 334, 334, - 334, 334, 334, 334, 144, 334, 334, 334, 334, 334, + 335, 335, 335, 335, 218, 212, 335, 230, 335, 335, + 280, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 82, 335, 335, 335, 335, 263, 335, + 335, 335, 335, 198, 335, 335, 335, 335, 224, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 298, 299, + 166, 335, 335, 76, 335, 335, 335, 335, 176, 335, + 335, 114, 115, 335, 335, 335, 335, 161, 335, 163, + 335, 203, 335, 335, 335, 335, 167, 335, 335, 335, - 334, 334, 334, 334, 334, 334, 334, 240, 334, 334, - 334, 334, 334, 334, 334, 334, 24, 334, 272, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 86, 203, 334, 334, 260, 334, 291, - 334, 196, 334, 334, 334, 334, 56, 334, 334, 334, - 334, 4, 334, 334, 334, 334, 127, 143, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 235, 37, 38, 334, - 334, 334, 334, 334, 334, 334, 280, 334, 334, 334, - 334, 334, 334, 334, 248, 334, 334, 334, 334, 334, + 233, 335, 335, 335, 335, 335, 335, 335, 144, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 241, 335, 335, 335, 335, 335, 335, 335, 335, + 24, 335, 273, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 86, 204, 335, + 335, 261, 335, 292, 335, 197, 335, 335, 335, 335, + 56, 335, 335, 335, 335, 4, 335, 335, 335, 335, + 127, 143, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 236, 37, 38, 335, 335, 335, 335, 335, 335, - 334, 334, 334, 206, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 85, 334, 57, 266, - 334, 236, 334, 334, 334, 334, 11, 334, 334, 334, - 334, 334, 334, 126, 334, 334, 334, 334, 204, 90, - 334, 40, 334, 334, 334, 334, 334, 334, 334, 334, - 172, 334, 334, 334, 334, 334, 146, 334, 334, 334, - 334, 239, 334, 334, 334, 334, 334, 247, 334, 334, - 334, 334, 140, 334, 334, 334, 121, 122, 334, 334, - 334, 92, 96, 91, 334, 334, 334, 334, 83, 334, - 334, 334, 334, 334, 10, 334, 334, 334, 264, 300, + 335, 281, 335, 335, 335, 335, 335, 335, 335, 249, + 335, 335, 335, 335, 335, 335, 335, 335, 207, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 85, 335, 57, 267, 335, 237, 335, 335, 335, + 335, 11, 335, 335, 335, 335, 335, 335, 126, 335, + 335, 335, 335, 205, 90, 335, 40, 335, 335, 335, + 335, 335, 335, 335, 335, 172, 335, 335, 335, 335, + 335, 335, 146, 335, 335, 335, 335, 240, 335, 335, + 335, 335, 335, 248, 335, 335, 335, 335, 140, 335, + 335, 335, 121, 122, 335, 335, 335, 92, 96, 91, - 334, 334, 334, 334, 305, 39, 334, 334, 334, 334, - 334, 171, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 97, 95, 334, 51, 334, - 334, 84, 288, 334, 334, 334, 334, 334, 334, 334, - 190, 334, 334, 334, 334, 334, 205, 334, 334, 334, - 334, 334, 334, 334, 334, 162, 78, 334, 334, 334, - 334, 334, 281, 334, 334, 334, 334, 334, 334, 334, - 244, 334, 334, 243, 141, 307, 334, 94, 48, 334, - 147, 148, 151, 152, 149, 150, 87, 334, 265, 334, + 335, 335, 335, 335, 83, 335, 335, 335, 335, 335, + 10, 335, 335, 335, 265, 301, 335, 335, 335, 335, + 306, 39, 335, 335, 335, 335, 335, 171, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 97, 95, 335, 51, 335, 335, 84, 289, + 335, 335, 335, 335, 335, 335, 335, 191, 335, 335, + 335, 335, 335, 206, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 162, 78, 335, 335, 335, 335, 335, + 282, 335, 335, 335, 335, 335, 335, 335, 245, 335, - 334, 334, 334, 165, 334, 334, 334, 334, 334, 234, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 178, 177, - 41, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 101, 334, 233, 334, - 257, 285, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 49, 5, 334, 334, 225, 334, - 334, 286, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 245, 25, 334, 334, 334, 334, 334, 334, 334, + 335, 244, 141, 308, 335, 94, 48, 335, 147, 148, + 151, 152, 149, 150, 87, 335, 266, 335, 335, 335, + 335, 165, 335, 335, 335, 335, 187, 335, 235, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 178, 177, 41, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 101, 335, 234, 335, 258, + 286, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 49, 5, 335, 335, 226, 335, 335, + + 287, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 246, 25, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 247, 335, 335, 335, 145, 335, + 335, 335, 335, 335, 335, 335, 335, 179, 335, 186, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 283, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 335, 305, 335, 335, + 254, 335, 335, 335, 335, 335, 284, 335, 335, 335, + 335, 335, 335, 285, 335, 335, 335, 252, 335, 255, + 256, 335, 335, 335, 335, 335, 253, 257, 0 - 334, 334, 334, 334, 334, 246, 334, 334, 334, 145, - 334, 334, 334, 334, 334, 334, 334, 334, 179, 334, - 186, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 282, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 304, 334, - 334, 253, 334, 334, 334, 334, 334, 283, 334, 334, - 334, 334, 334, 334, 284, 334, 334, 334, 251, 334, - 254, 255, 334, 334, 334, 334, 334, 252, 256, 0 } ; static const YY_CHAR yy_ec[256] = @@ -767,17 +770,17 @@ static const YY_CHAR yy_meta[41] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; -static const flex_int16_t yy_base[3299] = +static const flex_int16_t yy_base[3318] = { 0, 0, 0, 38, 41, 44, 46, 59, 65, 71, 77, - 90, 112, 96, 118, 124, 136, 3790, 3594, 81, 6407, - 6407, 6407, 129, 52, 130, 63, 131, 152, 70, 140, + 90, 112, 96, 118, 124, 136, 3276, 3137, 81, 6447, + 6447, 6447, 129, 52, 130, 63, 131, 152, 70, 140, 149, 156, 57, 88, 76, 173, 175, 95, 184, 145, - 185, 205, 194, 204, 178, 123, 2749, 6407, 6407, 6407, - 107, 2656, 6407, 6407, 6407, 154, 2610, 2162, 6407, 6407, - 6407, 226, 2040, 6407, 6407, 6407, 163, 1972, 6407, 238, - 6407, 242, 148, 1845, 1693, 6407, 6407, 6407, 246, 1651, - 6407, 6407, 6407, 250, 1521, 254, 219, 0, 258, 0, + 185, 205, 194, 204, 178, 123, 2962, 6447, 6447, 6447, + 107, 2759, 6447, 6447, 6447, 154, 2674, 2563, 6447, 6447, + 6447, 226, 2504, 6447, 6447, 6447, 163, 2331, 6447, 238, + 6447, 242, 148, 1978, 1862, 6447, 6447, 6447, 246, 1688, + 6447, 6447, 6447, 250, 1273, 254, 219, 0, 258, 0, 0, 165, 250, 191, 215, 243, 252, 256, 92, 260, 261, 262, 264, 265, 266, 273, 270, 277, 278, 281, @@ -785,8 +788,8 @@ static const flex_int16_t yy_base[3299] = 313, 314, 307, 323, 317, 312, 328, 326, 330, 334, 337, 340, 342, 343, 344, 346, 349, 354, 348, 356, 364, 357, 361, 359, 372, 376, 365, 360, 377, 380, - 384, 385, 387, 388, 391, 399, 389, 1437, 411, 1203, - 415, 1088, 422, 1027, 689, 426, 406, 430, 434, 0, + 384, 385, 387, 388, 391, 399, 389, 1153, 411, 1093, + 415, 953, 422, 901, 689, 426, 406, 430, 434, 0, 411, 280, 438, 233, 181, 442, 430, 442, 419, 438, 439, 441, 440, 443, 444, 445, 446, 449, 463, 455, 456, 467, 471, 472, 469, 476, 474, 460, 482, 488, @@ -807,701 +810,705 @@ static const flex_int16_t yy_base[3299] = 745, 743, 747, 749, 750, 766, 754, 739, 759, 767, 758, 760, 768, 774, 793, 779, 781, 789, 790, 791, 795, 797, 805, 807, 796, 809, 803, 810, 812, 813, - 822, 818, 6407, 817, 820, 833, 826, 834, 835, 836, + 822, 818, 6447, 817, 820, 833, 826, 834, 835, 836, 841, 842, 823, 849, 847, 848, 852, 874, 856, 858, - 854, 863, 866, 6407, 864, 868, 898, 870, 872, 892, - 888, 884, 887, 889, 899, 896, 909, 902, 907, 911, - 922, 918, 919, 920, 921, 924, 930, 937, 932, 934, + 854, 863, 866, 6447, 864, 868, 898, 870, 872, 892, + 896, 884, 887, 888, 899, 904, 921, 894, 907, 911, + 922, 919, 918, 928, 929, 930, 931, 939, 936, 932, - 859, 935, 944, 942, 943, 946, 950, 952, 953, 955, - 956, 769, 958, 962, 964, 973, 957, 965, 963, 975, - 977, 981, 982, 992, 985, 984, 998, 988, 1010, 1005, - 1006, 1007, 1013, 1009, 1008, 1017, 1019, 1021, 1022, 1023, - 1024, 1035, 1030, 1031, 1033, 1037, 1038, 1039, 1041, 1044, - 1045, 1047, 1049, 1051, 1050, 1056, 1060, 1058, 1066, 1061, - 6407, 1068, 1070, 1072, 1073, 1074, 1075, 6407, 1077, 1071, - 1076, 1078, 1090, 1093, 1104, 1081, 1085, 1100, 1103, 1101, - 1105, 1113, 1109, 1114, 1116, 1112, 1118, 1119, 1121, 1124, - 1122, 1125, 1130, 1131, 1132, 1133, 1152, 6407, 1136, 1139, + 859, 940, 947, 934, 945, 950, 960, 943, 949, 951, + 956, 769, 966, 971, 972, 973, 962, 964, 977, 978, + 980, 983, 984, 988, 990, 995, 1004, 1006, 1013, 1009, + 1010, 1014, 1017, 1019, 1011, 1021, 1012, 1027, 1023, 1029, + 1032, 1040, 1035, 1036, 1037, 1038, 1041, 1044, 1047, 1048, + 1049, 1050, 1052, 1056, 1054, 1063, 1065, 1057, 1071, 1061, + 6447, 1073, 1069, 1076, 1077, 1075, 1079, 6447, 1080, 1081, + 1082, 1087, 1094, 1096, 1103, 1104, 1092, 1107, 1108, 1110, + 1112, 1119, 1114, 1117, 1122, 1121, 1123, 1125, 1129, 1085, + 1126, 1130, 1132, 1133, 1136, 1138, 1156, 6447, 1139, 1143, - 1144, 1138, 1143, 1145, 1164, 1150, 1162, 1161, 1170, 1181, - 1174, 1182, 1176, 1163, 1187, 1184, 1191, 1189, 1193, 1195, - 1194, 1196, 1197, 1198, 1200, 1201, 1206, 6407, 1208, 1211, - 1220, 1221, 1222, 1223, 1224, 1225, 1137, 1226, 1228, 1227, - 1231, 1235, 1245, 1252, 1236, 1253, 1239, 1254, 1249, 1250, - 1256, 1259, 1258, 1260, 1270, 1266, 1272, 1281, 1284, 1283, - 1286, 1293, 1295, 1275, 1288, 1298, 1268, 1290, 1291, 1302, - 1292, 1303, 1304, 1306, 1313, 1308, 1311, 1314, 1316, 1317, - 1320, 1315, 1322, 1321, 1324, 1331, 1328, 1332, 1339, 1334, - 1340, 1338, 1343, 1348, 1349, 1355, 1345, 6407, 1363, 1358, + 1142, 1141, 1152, 1144, 1169, 1165, 1161, 1167, 1154, 1179, + 1171, 1185, 1177, 1181, 1189, 1191, 1192, 1194, 1195, 1196, + 1198, 1197, 1199, 1203, 1202, 1205, 1208, 6447, 1206, 1218, + 1223, 1230, 1213, 1226, 1210, 1228, 1231, 1232, 1233, 1234, + 985, 1235, 1236, 1239, 1249, 1240, 1251, 1248, 1253, 1254, + 1255, 1257, 1258, 1263, 1264, 1275, 1265, 1267, 1277, 1287, + 1284, 1286, 1294, 1296, 1271, 1289, 1297, 1293, 1291, 1299, + 1302, 1303, 1304, 1306, 1309, 1317, 1312, 1314, 1315, 1319, + 1321, 1323, 1318, 1324, 1326, 1328, 1336, 1335, 1331, 1341, + 1337, 1346, 1343, 1334, 1351, 1354, 1357, 1358, 6447, 1366, - 1361, 1362, 1365, 1368, 1372, 1373, 1374, 1375, 1378, 1376, - 1379, 1384, 1385, 1386, 1380, 1393, 1395, 1403, 1398, 1387, - 1411, 1410, 1401, 1400, 1412, 1420, 1416, 1423, 1419, 1415, - 1424, 1431, 1428, 1432, 1433, 1442, 1427, 1434, 1439, 1435, - 1447, 1449, 1451, 1463, 1450, 1459, 1466, 1467, 1458, 1232, - 1461, 1470, 1471, 1473, 1474, 1475, 1476, 1484, 1477, 1479, - 1482, 1485, 1486, 1487, 1490, 1493, 1501, 1498, 1499, 1503, - 1505, 1509, 1507, 1510, 1514, 1515, 1516, 1518, 1517, 1519, - 1536, 1527, 1528, 1529, 1537, 1538, 1530, 1544, 1541, 1545, - 1551, 1547, 1555, 1553, 1556, 1559, 1561, 1564, 1562, 1565, + 1363, 1362, 1364, 1369, 1367, 1375, 1376, 1377, 1378, 1381, + 1379, 1382, 1387, 1388, 1389, 1383, 1391, 1393, 1404, 1401, + 1403, 1412, 1411, 1413, 1415, 1416, 1423, 1419, 1426, 1422, + 1396, 1427, 1435, 1428, 1431, 1437, 1445, 1436, 1438, 1443, + 1440, 1449, 1446, 1451, 1458, 1459, 1461, 1468, 1463, 1465, + 1470, 1473, 1474, 1475, 1477, 1478, 1479, 1480, 1487, 1482, + 1485, 1484, 1488, 1483, 1489, 1497, 1491, 1510, 1502, 1505, + 1507, 1511, 1514, 1513, 1512, 1515, 1519, 1520, 1522, 1521, + 1523, 1525, 1532, 1534, 1536, 1541, 1540, 1542, 1544, 1547, + 1543, 1552, 1553, 1555, 1549, 1562, 1563, 1564, 1565, 1568, - 1566, 1572, 1567, 1577, 1578, 1580, 1579, 1583, 1587, 1585, - 1590, 1589, 6407, 1591, 1603, 1592, 1601, 1599, 1602, 1604, - 1613, 1606, 1608, 1616, 1617, 1609, 1643, 6407, 1618, 6407, - 6407, 315, 6407, 6407, 1619, 1620, 6407, 1624, 1623, 1621, - 1631, 1638, 1640, 1625, 1646, 1644, 1647, 1656, 1668, 1649, - 1653, 1659, 1657, 1660, 1678, 1666, 1673, 1676, 1679, 1685, - 1695, 1683, 1696, 1693, 1700, 1701, 1706, 1707, 1709, 1713, - 1715, 1716, 1699, 1719, 1720, 1703, 1721, 1724, 1726, 1730, - 1731, 1727, 1734, 1733, 1742, 1738, 1748, 1757, 6407, 1749, - 1758, 1759, 1760, 1767, 1763, 1762, 1764, 1770, 1774, 1771, + 1576, 1566, 1579, 1573, 1575, 1581, 1583, 1585, 1584, 1587, + 1591, 1594, 1596, 1588, 6447, 1595, 1608, 1603, 1606, 1604, + 1607, 1609, 1617, 1612, 1615, 1613, 1618, 1619, 1644, 6447, + 1621, 6447, 6447, 315, 6447, 6447, 1624, 1628, 6447, 1629, + 1638, 1625, 1626, 1650, 1654, 1637, 1640, 1645, 1642, 1667, + 1668, 1652, 1660, 1665, 1673, 1671, 1674, 1679, 1682, 1676, + 1685, 1689, 1699, 1690, 1702, 1696, 1700, 1706, 1704, 1712, + 1708, 1717, 1718, 1714, 1719, 1721, 1722, 1724, 1723, 1727, + 1729, 1732, 1733, 1730, 1735, 1736, 1745, 1749, 1741, 1756, + 6447, 1752, 1759, 1766, 1762, 1769, 1761, 1765, 1768, 1773, - 1775, 1776, 1777, 1778, 1783, 1780, 1786, 1788, 1791, 1790, - 6407, 1792, 1795, 1796, 1798, 1799, 1802, 1806, 1800, 1807, - 1810, 1737, 1818, 1815, 1813, 1821, 1822, 1823, 1824, 6407, - 1834, 1826, 1829, 1833, 1830, 1837, 1839, 1841, 1842, 1843, - 1844, 1735, 1846, 1849, 1854, 1856, 1858, 1853, 1855, 1860, - 1861, 1871, 1874, 1877, 1878, 1879, 1880, 1881, 1882, 1883, - 1885, 1890, 1892, 1889, 1900, 1891, 1912, 1913, 1910, 1896, - 1908, 1893, 1895, 1917, 1925, 1921, 1909, 1922, 1929, 1926, - 1931, 1932, 1933, 1940, 1936, 1937, 1942, 1944, 1945, 1947, - 1948, 6407, 1949, 1954, 6407, 1956, 1955, 1953, 1976, 1957, + 1775, 1770, 1777, 1779, 1780, 1781, 1783, 1785, 1788, 1790, + 1792, 1791, 6447, 1793, 1797, 1798, 1799, 1803, 1805, 1809, + 1737, 1801, 1807, 1811, 1819, 1820, 1815, 1817, 1823, 1825, + 1828, 6447, 1827, 1834, 1835, 1837, 1838, 1840, 1841, 1843, + 1844, 1845, 1846, 1847, 1848, 1852, 1863, 1853, 1855, 1858, + 1868, 1870, 1872, 1873, 1875, 1879, 1880, 1881, 1883, 1884, + 1885, 1887, 1888, 1896, 1898, 1895, 1900, 1893, 1903, 1911, + 1910, 1902, 1912, 1915, 1916, 1917, 1925, 1923, 1922, 1928, + 1933, 1929, 1931, 1934, 1938, 1935, 1945, 1942, 1946, 1947, + 1936, 1953, 1954, 1955, 6447, 1956, 1961, 6447, 1963, 1962, - 1959, 1962, 1961, 1964, 1978, 1971, 1970, 1983, 1980, 1996, - 1991, 1993, 1998, 2001, 2003, 1999, 2004, 2005, 2006, 2010, - 2012, 2017, 2015, 2028, 2031, 2030, 2037, 2039, 2013, 2026, - 2034, 2053, 2036, 2038, 2041, 2044, 2046, 2057, 2042, 2049, - 2051, 2058, 2060, 2071, 2064, 2066, 2068, 2074, 2075, 2081, - 2083, 2082, 6407, 2091, 2089, 2084, 2094, 2088, 2104, 2095, - 2096, 6407, 2097, 2105, 2107, 2116, 2108, 2109, 2113, 2111, - 2112, 2119, 2120, 2121, 2124, 2129, 2125, 2140, 6407, 2122, - 6407, 2127, 2136, 2143, 2137, 2145, 2144, 2147, 2148, 6407, - 6407, 2149, 2146, 2157, 2166, 2161, 6407, 2164, 2171, 6407, + 1960, 1983, 1964, 1966, 1969, 1968, 1971, 1985, 1972, 1977, + 1990, 1979, 2003, 1998, 2000, 2001, 2006, 2008, 2010, 2011, + 2012, 2009, 2015, 2018, 2019, 2028, 2037, 2038, 2035, 2041, + 2045, 2020, 2024, 2040, 2059, 2044, 2046, 2047, 2050, 2048, + 2052, 2055, 2054, 2053, 2064, 2066, 2075, 2071, 2074, 2070, + 2077, 2080, 2090, 2087, 2081, 6447, 2100, 2092, 2084, 2097, + 2096, 2105, 2106, 2104, 6447, 2107, 2108, 2110, 2118, 2113, + 2114, 2115, 2119, 2121, 2124, 2125, 2127, 2129, 2128, 2130, + 2146, 6447, 2132, 6447, 2131, 2141, 2143, 2142, 2149, 2150, + 2152, 2153, 6447, 6447, 2154, 2151, 2163, 2172, 2155, 6447, - 2168, 2173, 2167, 2175, 2177, 2178, 2179, 2182, 2189, 2184, - 2191, 2186, 2194, 2188, 6407, 2187, 2198, 2200, 2203, 2206, - 2207, 2209, 2211, 6407, 2210, 2213, 2215, 2224, 2226, 2227, - 2217, 2228, 2232, 2220, 2230, 2234, 2237, 2239, 2247, 2248, - 2245, 2246, 2253, 2261, 6407, 2244, 2243, 2265, 2264, 2257, - 2266, 2267, 2260, 2268, 2270, 2271, 2272, 2277, 2279, 2280, - 2288, 2290, 2281, 2289, 2286, 2292, 2293, 2297, 2302, 2300, - 2301, 2303, 2304, 6407, 2305, 2313, 2306, 171, 2314, 2308, - 2315, 2316, 2325, 2320, 2317, 2336, 2338, 2331, 2335, 2339, - 2343, 2342, 2344, 2345, 2346, 2333, 2353, 2349, 2351, 6407, + 2169, 2176, 6447, 2173, 2178, 2179, 2171, 2180, 2182, 2184, + 2183, 2192, 2187, 2194, 2189, 2190, 2199, 6447, 2202, 2201, + 2203, 2206, 2209, 2210, 2212, 2214, 6447, 2218, 2216, 2221, + 2229, 2220, 2228, 2230, 2231, 2235, 2233, 2238, 2239, 2240, + 2241, 2250, 2252, 2242, 2253, 2255, 2262, 6447, 2245, 2249, + 2267, 2265, 2272, 2264, 2266, 2268, 2274, 2276, 2277, 2278, + 2281, 2282, 2283, 2290, 2291, 2288, 2287, 2296, 2297, 2298, + 2301, 2304, 2305, 2306, 2307, 2308, 6447, 2309, 2311, 2314, + 2317, 171, 2318, 2320, 2322, 2324, 2321, 2339, 2325, 2342, + 2346, 2327, 2344, 2348, 2347, 2341, 2351, 2353, 2354, 2356, - 2355, 2357, 2359, 2363, 2362, 2365, 2367, 6407, 2369, 2374, - 2379, 2388, 2382, 2366, 2390, 2376, 2391, 2392, 2394, 2396, - 2398, 2397, 2400, 2405, 2403, 6407, 2407, 2408, 2412, 2404, - 2418, 2421, 2411, 2419, 2426, 2427, 2428, 2429, 2430, 2431, - 2432, 2433, 2435, 2436, 2445, 2438, 2439, 2447, 2448, 2449, - 2450, 2452, 2455, 2457, 2461, 6407, 2470, 2467, 2465, 2466, - 2469, 2475, 2473, 2476, 2493, 2477, 2483, 2485, 2494, 2499, - 2490, 2501, 2511, 2513, 2515, 2516, 2523, 2519, 2521, 2527, - 2509, 2531, 2533, 2486, 2484, 2534, 2529, 2535, 2537, 2539, - 2547, 2548, 2545, 2552, 2544, 2554, 2568, 2559, 6407, 2563, + 2357, 2359, 2360, 6447, 2362, 2363, 2366, 2367, 2370, 2368, + 2373, 6447, 2381, 2371, 2386, 2394, 2383, 2395, 2396, 2397, + 2380, 2401, 2400, 2402, 2403, 2406, 2404, 2408, 2407, 6447, + 2413, 2417, 2420, 2414, 2423, 2427, 2424, 2429, 2430, 2432, + 2435, 2437, 2436, 2438, 2439, 2440, 2441, 2442, 2449, 2446, + 2453, 2454, 2455, 2456, 2457, 2460, 2462, 2465, 2468, 6447, + 2477, 2467, 2472, 2476, 2474, 2481, 2478, 2489, 2491, 2492, + 2493, 2495, 2498, 2512, 2496, 2505, 2506, 2502, 2510, 2518, + 2522, 2519, 2523, 2529, 2526, 2532, 2534, 2536, 2540, 2541, + 2542, 2538, 2545, 2546, 2554, 2555, 2552, 2561, 2560, 2566, - 2546, 2569, 2571, 2578, 2573, 2574, 2576, 2575, 2579, 2583, - 2584, 2585, 2592, 2590, 2593, 2594, 2595, 2597, 2598, 2604, - 2605, 2609, 2613, 2606, 2616, 2617, 6407, 2620, 2624, 2618, - 2625, 2627, 2628, 2632, 2635, 2633, 2639, 2640, 2642, 2643, - 2644, 2645, 2646, 2649, 2650, 2653, 6407, 2654, 2655, 2659, - 2662, 2667, 2666, 2668, 2675, 2677, 2679, 2669, 2682, 2683, - 2681, 6407, 2691, 2692, 2693, 2695, 2696, 2697, 2699, 2701, - 2702, 6407, 2703, 2704, 2706, 2713, 2714, 2709, 6407, 2717, - 2712, 2719, 2720, 2721, 2723, 2725, 2727, 2730, 2731, 2734, - 2736, 2745, 2735, 2742, 6407, 2738, 2754, 2746, 2751, 2755, + 2573, 2568, 6447, 2577, 2572, 2575, 2544, 2589, 2582, 2563, + 2590, 2584, 2592, 2586, 2594, 2596, 2603, 2599, 2604, 2602, + 2606, 2607, 2608, 2609, 2614, 2615, 2619, 2622, 2624, 2626, + 6447, 2629, 2625, 2631, 2633, 2635, 2636, 2641, 2643, 2646, + 2638, 2645, 2648, 2649, 2652, 2653, 2657, 2654, 2658, 2661, + 6447, 2664, 2665, 2670, 2668, 2671, 2677, 2678, 2681, 2687, + 2684, 2672, 2691, 2692, 2693, 6447, 2700, 2701, 2698, 2702, + 2704, 2705, 2707, 2709, 2710, 6447, 2711, 2712, 2714, 2715, + 2722, 2723, 2719, 6447, 2726, 2721, 2728, 2731, 2732, 2733, + 2736, 2739, 2737, 2742, 2743, 2745, 2753, 2746, 2755, 6447, - 2759, 2761, 2762, 2766, 2769, 2765, 2768, 6407, 2781, 2779, - 2784, 2791, 2770, 2772, 2786, 2787, 2788, 2794, 2796, 2797, - 2799, 6407, 2800, 2803, 2805, 2806, 2809, 2808, 2801, 2817, - 2810, 2815, 2818, 2824, 2825, 2827, 2828, 2829, 2830, 2831, - 2838, 2841, 2837, 2844, 2843, 2850, 2854, 2861, 2845, 2857, - 2858, 2860, 2862, 2865, 2872, 2873, 2874, 2877, 2879, 6407, - 2882, 2871, 2884, 2869, 2885, 2886, 2888, 2889, 2890, 2892, - 2894, 2899, 2895, 2898, 2907, 2911, 2908, 2913, 2915, 2916, - 2918, 2919, 2920, 2921, 2922, 2929, 2925, 2926, 2937, 2932, - 2936, 2944, 2943, 2945, 2946, 2947, 2949, 2933, 2953, 2955, + 2749, 2764, 2756, 2762, 2765, 2766, 2770, 2772, 2776, 2777, + 2789, 2778, 6447, 2788, 2775, 2783, 2799, 2795, 2796, 2797, + 2800, 2801, 2802, 2803, 2804, 2807, 6447, 2810, 2808, 2811, + 2812, 2817, 2816, 2818, 2825, 2828, 2830, 2831, 2832, 2833, + 2835, 2836, 2839, 2838, 2842, 2844, 2850, 2852, 2855, 2856, + 2857, 2865, 2868, 2861, 2870, 2866, 2863, 2871, 2873, 2880, + 2883, 2887, 2884, 2888, 6447, 2891, 2882, 2893, 2894, 2895, + 2896, 2898, 2897, 2899, 2901, 2903, 2909, 2905, 2906, 2923, + 2930, 2908, 2915, 2918, 2920, 2926, 2927, 2931, 2933, 2934, + 2942, 2938, 2940, 2947, 2944, 2945, 2954, 2946, 2949, 2955, - 2957, 2958, 2972, 2974, 2975, 2977, 2948, 2950, 2969, 2983, - 6407, 2976, 2979, 2978, 2967, 2988, 2991, 2992, 3001, 2996, - 2986, 2998, 3005, 3006, 3000, 3007, 3008, 3018, 3014, 6407, - 3015, 6407, 3016, 3017, 3023, 3027, 3019, 6407, 3030, 6407, - 3031, 3036, 3026, 3032, 6407, 3038, 3040, 3043, 3044, 3046, - 3047, 3050, 3049, 3051, 3055, 3053, 3057, 3058, 3059, 3063, - 3066, 3067, 3071, 3072, 3078, 3070, 3079, 3081, 3083, 3086, - 3088, 3089, 3090, 6407, 3094, 3091, 3096, 3098, 3100, 3101, - 3102, 3103, 3106, 3109, 3110, 3117, 3113, 3118, 3121, 3124, - 3128, 3131, 3132, 3140, 6407, 3135, 3137, 3138, 3139, 6407, + 2956, 2957, 2958, 2961, 2959, 2964, 2969, 2973, 2978, 2980, + 2982, 2970, 2984, 2987, 2988, 6447, 2991, 2992, 2989, 2995, + 2996, 2999, 3001, 3008, 3003, 3010, 3011, 3013, 3020, 3005, + 3014, 3019, 3027, 3029, 6447, 3022, 6447, 3026, 3030, 3033, + 3037, 3036, 6447, 3042, 6447, 3043, 3045, 3038, 3048, 6447, + 3049, 3050, 3051, 3057, 3053, 3055, 3059, 3061, 3063, 3071, + 3065, 3062, 3067, 3069, 3083, 3073, 3075, 3081, 3085, 3089, + 3091, 3079, 3096, 3090, 3092, 3098, 3101, 3104, 6447, 3106, + 3108, 3107, 3110, 3111, 3113, 3115, 3114, 3116, 3119, 3118, + 3122, 3127, 3131, 3130, 3134, 3141, 3144, 3151, 3136, 3152, - 3142, 3143, 3150, 3153, 3144, 3146, 3148, 3156, 3160, 3155, - 3162, 3165, 3166, 3176, 3175, 3168, 6407, 3177, 3178, 3179, - 3188, 3182, 3195, 3196, 3192, 3193, 3198, 3206, 3202, 3201, - 3203, 3205, 3208, 3209, 3216, 3217, 3213, 3225, 3215, 3222, - 3230, 3226, 3223, 3220, 3232, 3233, 3234, 3235, 3236, 3237, - 3239, 3242, 3245, 6407, 3246, 3251, 3253, 3256, 3255, 3257, - 3259, 3260, 3261, 6407, 3268, 3265, 3271, 3269, 3277, 3272, - 3270, 3280, 3283, 3286, 3288, 3289, 3290, 3291, 6407, 3293, - 6407, 3292, 3294, 3306, 3310, 3300, 3298, 3311, 3319, 3315, - 3320, 3321, 3322, 3323, 3324, 3325, 3329, 3332, 3336, 3337, + 6447, 3147, 3158, 3148, 3153, 6447, 3150, 3160, 3162, 3164, + 3166, 3168, 3170, 3169, 3173, 3171, 3175, 3176, 3188, 3183, + 3190, 3178, 6447, 3192, 3193, 3179, 3199, 3208, 3209, 3211, + 3210, 3212, 3216, 3220, 3218, 3219, 3182, 3221, 3222, 3224, + 3231, 3234, 3230, 3239, 3226, 3236, 3238, 3243, 3229, 3244, + 3245, 3246, 3252, 3253, 3250, 3251, 3254, 3255, 3256, 6447, + 3259, 3261, 3269, 3278, 3263, 3270, 3274, 3277, 3279, 6447, + 3281, 3284, 3285, 3287, 3288, 3292, 3295, 3293, 3296, 3297, + 3298, 3301, 3303, 3302, 6447, 3305, 6447, 3310, 3316, 3322, + 3324, 3326, 3311, 3327, 3332, 3328, 3333, 3334, 3337, 3336, - 3347, 3330, 3338, 3335, 3343, 3333, 3352, 6407, 6407, 3354, - 3355, 3358, 3356, 3360, 3361, 3362, 3371, 3365, 3367, 3368, - 3374, 3382, 6407, 3384, 3375, 3378, 3386, 3393, 3388, 3395, - 3402, 3399, 3403, 3401, 6407, 3405, 3408, 3415, 3410, 3411, - 3418, 6407, 3413, 6407, 3416, 3417, 3419, 3424, 3426, 3428, - 3429, 3430, 3432, 3440, 3448, 3437, 3446, 3438, 3447, 3449, - 3451, 3460, 3452, 3455, 3457, 6407, 3462, 3456, 3459, 3467, - 3473, 3477, 3470, 3466, 6407, 3469, 3480, 3484, 3485, 3486, - 3487, 3491, 3488, 3492, 3493, 3496, 6407, 3494, 3497, 3507, - 3500, 3503, 3509, 3511, 3516, 3523, 6407, 3520, 3518, 3530, + 3340, 3344, 3343, 3345, 3349, 3365, 3347, 3348, 3350, 3351, + 3360, 3361, 3364, 6447, 6447, 3366, 3367, 3370, 3372, 3373, + 3375, 3378, 3383, 3381, 3384, 3387, 3389, 3400, 6447, 3390, + 3396, 3397, 3398, 3412, 3405, 3410, 3420, 3413, 3421, 3416, + 6447, 3417, 3424, 3431, 3426, 3427, 3434, 6447, 3432, 6447, + 3429, 3433, 3435, 3441, 3442, 3444, 3445, 3446, 3454, 3462, + 3464, 3461, 3466, 3447, 3451, 3449, 3463, 3477, 3470, 3472, + 3473, 6447, 3479, 3480, 3481, 3482, 3484, 3490, 3493, 3483, + 6447, 3494, 3486, 3496, 3505, 3497, 3501, 3499, 3508, 3509, + 3510, 3512, 3514, 6447, 3515, 3519, 3527, 3520, 3522, 3525, - 3529, 3514, 3531, 3532, 3534, 3536, 3537, 3538, 3539, 3540, - 3541, 3547, 3542, 3543, 3551, 3546, 3562, 3563, 3549, 3553, - 3571, 3561, 6407, 3569, 3570, 3575, 3572, 3576, 3579, 3580, - 3584, 3586, 3577, 3599, 3600, 3587, 3589, 3603, 3605, 3612, - 3604, 6407, 3617, 3596, 3619, 3615, 3618, 3623, 3616, 3620, - 3627, 3624, 3628, 3629, 3630, 3632, 3641, 3633, 3638, 3642, - 3643, 3650, 3648, 6407, 3657, 3653, 3654, 3659, 3655, 3662, - 3670, 3665, 3671, 3672, 3676, 3673, 3678, 3680, 3681, 3682, - 3685, 3686, 6407, 6407, 3688, 3689, 3692, 6407, 3695, 3690, - 3702, 3698, 3694, 3705, 3709, 3708, 3707, 3712, 3710, 3718, + 3529, 3530, 3536, 6447, 3537, 3538, 3549, 3545, 3541, 3546, + 3551, 3550, 3552, 3555, 3557, 3556, 3558, 3559, 3560, 3562, + 3564, 3567, 3565, 3566, 3579, 3580, 3582, 3592, 3583, 6447, + 3587, 3588, 3591, 3590, 3594, 3597, 3598, 3601, 3603, 3605, + 3615, 3616, 3609, 3612, 3619, 3620, 3627, 3623, 6447, 3628, + 3629, 3637, 3632, 3635, 3640, 3634, 3636, 3643, 3644, 3645, + 3646, 3648, 3650, 3658, 3656, 3653, 3660, 3661, 3671, 3662, + 6447, 3680, 3663, 3672, 3683, 3684, 3676, 3692, 3688, 3689, + 3690, 3694, 3696, 3698, 3700, 3701, 3702, 3705, 3706, 6447, + 6447, 3708, 3710, 3712, 6447, 3715, 3713, 3725, 3717, 3718, - 6407, 3719, 3727, 3722, 3723, 3731, 3732, 3729, 3735, 3737, - 3738, 3741, 3739, 3744, 3743, 3745, 3748, 3756, 3759, 3752, - 3754, 3762, 6407, 3755, 3757, 3763, 3765, 3767, 3770, 6407, - 3773, 3774, 3777, 3780, 3788, 3790, 3784, 3797, 3781, 3791, - 3793, 3798, 3799, 3801, 3810, 3807, 3806, 3809, 3813, 3816, - 6407, 3815, 3817, 3818, 3826, 6407, 3830, 3837, 3840, 3841, - 3823, 3827, 3839, 3848, 6407, 3843, 3846, 3844, 3845, 3853, - 3852, 3860, 3857, 3859, 6407, 3861, 3858, 3863, 6407, 3864, - 3865, 3876, 3879, 3869, 3886, 3881, 3883, 3884, 3882, 6407, - 3892, 6407, 3893, 3894, 3898, 6407, 3895, 3900, 3903, 3902, + 3714, 3730, 3727, 3728, 3731, 3733, 3740, 6447, 3738, 3747, + 3742, 3744, 3752, 3755, 3758, 3745, 3760, 3748, 3753, 3761, + 3664, 3763, 3764, 3765, 3776, 3777, 3767, 3774, 3775, 6447, + 3778, 3780, 3783, 3785, 3782, 3791, 6447, 3786, 3792, 3793, + 3794, 3808, 3800, 3809, 3811, 3797, 3812, 3813, 3814, 3815, + 3816, 3823, 3822, 3824, 3828, 3830, 3834, 6447, 3833, 3839, + 3821, 3844, 6447, 3846, 3853, 3854, 3857, 3840, 3856, 3858, + 3865, 6447, 3860, 3863, 3862, 3864, 3875, 3849, 3879, 3868, + 3876, 3878, 6447, 3880, 3877, 3883, 6447, 3882, 3893, 3898, + 3900, 3884, 3901, 3902, 3886, 3903, 3905, 6447, 3906, 6447, - 3904, 3905, 3909, 3915, 3917, 3911, 3919, 3920, 3921, 3922, - 3924, 3933, 3923, 3925, 3930, 3932, 6407, 3935, 3937, 3942, - 3943, 3949, 3945, 3952, 3939, 3953, 3872, 6407, 6407, 3957, - 6407, 3959, 3961, 3963, 6407, 3965, 3967, 3972, 3968, 3969, - 3971, 3975, 3976, 6407, 3983, 3986, 6407, 3978, 3988, 3995, - 3990, 3991, 3992, 3998, 3993, 3996, 4003, 4004, 4005, 4006, - 4000, 4007, 4008, 6407, 4009, 4010, 4011, 4025, 4019, 4021, - 4028, 4030, 4032, 6407, 4034, 4036, 4040, 4042, 4043, 6407, - 4044, 6407, 4045, 4046, 4048, 4049, 4054, 6407, 4057, 4056, - 4062, 4064, 4066, 4065, 4069, 4072, 4068, 4075, 4082, 4078, + 3907, 3912, 3915, 6447, 3913, 3917, 3918, 3920, 3921, 3922, + 3926, 3932, 3934, 3928, 3936, 3937, 3938, 3939, 3941, 3950, + 3940, 3942, 3947, 3949, 6447, 3952, 3954, 3959, 3960, 3966, + 3962, 3969, 3956, 3970, 3973, 6447, 6447, 3979, 6447, 3980, + 3974, 3976, 6447, 3982, 3984, 3991, 3987, 3988, 3993, 4000, + 3994, 6447, 4006, 4007, 6447, 3996, 4003, 4016, 4011, 4001, + 4012, 4013, 4015, 4017, 4021, 4022, 4020, 4025, 4026, 4027, + 4030, 6447, 4028, 4031, 4029, 4040, 4043, 4044, 4047, 4046, + 4045, 6447, 4053, 4055, 4056, 4062, 4059, 6447, 4060, 6447, + 4063, 4068, 4070, 4071, 4072, 6447, 4076, 4075, 4080, 4083, - 4079, 4080, 6407, 4081, 4084, 4094, 4096, 4087, 4085, 4107, - 4099, 4089, 4103, 4106, 4109, 4111, 4112, 4115, 4110, 4120, - 4117, 6407, 4118, 4124, 4128, 4137, 4129, 4132, 6407, 4133, - 4134, 4141, 6407, 4140, 4142, 4143, 4148, 4150, 4151, 4154, - 4157, 4158, 6407, 4155, 4160, 4156, 4159, 4161, 4165, 6407, - 6407, 4175, 6407, 4177, 4163, 4178, 4179, 4180, 4182, 4185, - 4187, 4189, 4190, 4195, 4198, 4200, 4192, 4207, 4208, 4210, - 4212, 4211, 4216, 6407, 6407, 4218, 4220, 4222, 4224, 4225, - 4227, 4229, 4234, 4232, 4240, 4243, 4233, 4250, 6407, 4245, - 4248, 4251, 4252, 6407, 4253, 4254, 4256, 4258, 4257, 4263, + 4085, 4084, 4087, 4088, 4094, 4095, 4102, 4098, 4097, 4099, + 6447, 4100, 4104, 4106, 4113, 4101, 4108, 4117, 4120, 4121, + 4122, 4126, 4130, 4124, 4131, 4137, 4135, 4141, 4127, 6447, + 4139, 4147, 4133, 4156, 4143, 4153, 6447, 4157, 4158, 4159, + 6447, 4160, 4161, 4162, 4167, 4168, 4170, 4174, 4175, 4172, + 6447, 4179, 4180, 4176, 4177, 4178, 4184, 6447, 6447, 4194, + 6447, 4195, 4185, 4197, 4198, 4199, 4202, 4204, 4205, 4207, + 4209, 4215, 4217, 4210, 4218, 4220, 4227, 4231, 4235, 4230, + 4232, 4234, 6447, 6447, 4239, 4243, 4236, 4247, 4248, 4241, + 4250, 4257, 4255, 4261, 4264, 4265, 4272, 6447, 4252, 4259, - 4260, 4264, 4261, 4265, 4270, 4267, 4274, 4275, 4277, 4283, - 4282, 4285, 4286, 4288, 4292, 4296, 6407, 4297, 4293, 4298, - 4299, 4300, 4302, 4306, 4307, 4308, 6407, 4311, 6407, 4315, - 4309, 4314, 4316, 4331, 4332, 4333, 4325, 4334, 4339, 4340, - 4343, 4344, 4350, 4345, 4351, 4353, 4347, 4358, 4362, 4363, - 6407, 4365, 4335, 4366, 4367, 4372, 4374, 4369, 4376, 4377, - 4381, 4378, 4382, 4384, 4390, 4385, 4391, 4392, 4394, 6407, - 4396, 4398, 4402, 4404, 4405, 4408, 4407, 4411, 4416, 4409, - 4417, 4418, 4420, 6407, 4422, 4424, 4425, 4426, 4434, 4429, - 4431, 4435, 4438, 6407, 4444, 4439, 4445, 4441, 4446, 4449, + 4267, 4273, 6447, 4274, 4275, 4277, 4276, 4278, 4284, 4281, + 4285, 4282, 4286, 4289, 4290, 4292, 4296, 4295, 4303, 4304, + 4298, 4306, 4309, 4312, 4314, 6447, 4315, 4318, 4319, 4320, + 4324, 4325, 4326, 4327, 4328, 6447, 4331, 6447, 4329, 4336, + 4334, 4333, 4352, 4353, 4354, 4332, 4341, 4356, 4359, 4362, + 4363, 4367, 4364, 4368, 4370, 4373, 4375, 4377, 4378, 6447, + 4384, 4372, 4380, 4386, 4388, 4391, 4393, 4395, 4396, 4402, + 4403, 4399, 4406, 4408, 4397, 4410, 4409, 4413, 6447, 4415, + 4417, 4421, 4425, 4426, 4422, 4427, 4433, 4436, 4429, 4431, + 4437, 4439, 6447, 4441, 4442, 4443, 4447, 4453, 4445, 4450, - 4451, 4456, 4454, 4458, 4462, 6407, 4461, 4466, 4469, 4468, - 4470, 4475, 4476, 4472, 6407, 4479, 4485, 4486, 4494, 4478, - 4495, 4487, 4497, 4491, 4500, 4503, 4505, 4508, 4509, 4510, - 4507, 4526, 4528, 4511, 6407, 4504, 6407, 4523, 4529, 4531, - 4533, 4535, 4527, 6407, 4536, 4537, 4539, 4541, 4545, 6407, - 4543, 4544, 4546, 4550, 6407, 4548, 4558, 4557, 4559, 4565, - 4566, 6407, 4569, 4570, 4574, 4578, 4581, 4576, 4583, 4580, - 4586, 4584, 4588, 4589, 4590, 4598, 4593, 4595, 6407, 4597, - 4603, 4605, 4609, 4616, 4611, 4599, 4613, 4622, 4612, 6407, - 4618, 4624, 4626, 4627, 4628, 4629, 4630, 4637, 4633, 4634, + 4454, 4457, 6447, 4460, 4462, 4463, 4466, 4467, 4468, 4471, + 4473, 4475, 4476, 4487, 6447, 4477, 4483, 4491, 4479, 4481, + 4492, 4493, 4495, 6447, 4501, 4503, 4499, 4515, 4502, 4516, + 4512, 4519, 4500, 4518, 4526, 4511, 4527, 4528, 4530, 4532, + 4540, 4541, 4538, 6447, 4533, 6447, 4543, 4544, 4554, 4549, + 4547, 4555, 4551, 6447, 4559, 4561, 4563, 4557, 4565, 6447, + 4564, 4566, 4568, 4567, 6447, 4578, 4580, 4569, 4584, 4587, + 4590, 6447, 4593, 4594, 4595, 4604, 4605, 4601, 4603, 4606, + 4607, 4609, 4611, 4612, 4613, 4622, 4615, 4618, 6447, 4624, + 4627, 4633, 4634, 4641, 4617, 4636, 4638, 4644, 4637, 6447, - 4636, 4638, 4640, 4642, 6407, 4647, 4648, 4651, 4660, 4650, - 4665, 6407, 4653, 6407, 4661, 4668, 4670, 4666, 4671, 6407, - 6407, 4674, 4682, 4677, 4680, 4681, 6407, 6407, 4684, 6407, - 4685, 6407, 4686, 4688, 6407, 6407, 4691, 4687, 4693, 4694, - 4702, 6407, 4706, 6407, 4714, 4709, 4695, 4697, 4707, 6407, - 4715, 4716, 4718, 6407, 4720, 4727, 4722, 4723, 6407, 4725, - 4730, 4726, 4731, 6407, 4735, 4742, 4732, 4739, 4743, 4746, - 4748, 4744, 4747, 4753, 4754, 4755, 4762, 4764, 4769, 4771, - 4773, 4766, 4756, 4776, 4779, 4782, 4777, 4784, 4785, 4786, - 4788, 4790, 4792, 4794, 4795, 4798, 4797, 4799, 4800, 4803, + 4646, 4645, 4647, 4648, 4649, 4652, 4654, 4661, 4657, 4570, + 4658, 4660, 4664, 4666, 6447, 4668, 4670, 4671, 4681, 4674, + 4683, 6447, 4684, 6447, 4678, 4688, 4691, 4673, 4695, 6447, + 6447, 4697, 4704, 4690, 4706, 4700, 6447, 6447, 4708, 6447, + 4703, 6447, 4710, 4711, 6447, 6447, 4712, 4713, 4714, 4715, + 4723, 6447, 4726, 6447, 4734, 4729, 4716, 4718, 4731, 6447, + 4733, 4735, 4738, 6447, 4741, 4748, 4743, 4744, 6447, 4746, + 4751, 4749, 4753, 6447, 4755, 4758, 4760, 4762, 4763, 4764, + 4773, 4767, 4770, 4766, 4774, 4776, 4777, 4786, 4788, 4790, + 4792, 4783, 4793, 4794, 4797, 4800, 4802, 4803, 4804, 4805, - 4801, 4807, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4822, - 4824, 4826, 4828, 4829, 6407, 4831, 4832, 4837, 4845, 4838, - 4846, 4850, 4840, 4857, 4858, 6407, 4861, 6407, 4863, 4847, - 4866, 4853, 4867, 6407, 4868, 4869, 4870, 4871, 4874, 4873, - 4876, 4875, 4879, 4880, 4884, 6407, 4890, 4881, 6407, 4886, - 4894, 4900, 6407, 4901, 4905, 4902, 4906, 4907, 4911, 4909, - 4912, 4913, 4915, 4917, 4919, 4921, 4922, 4925, 4933, 4936, - 4943, 4928, 4923, 4939, 4942, 4944, 4945, 4947, 4948, 4950, - 4955, 4957, 4961, 6407, 4951, 6407, 4962, 4963, 4964, 4966, - 4968, 4969, 4972, 6407, 6407, 4974, 4975, 4980, 4977, 4981, + 4807, 4808, 4810, 4813, 4817, 4818, 4816, 4819, 4820, 4829, + 4822, 4825, 4833, 4826, 4836, 4837, 4838, 4839, 4841, 4843, + 4844, 4846, 4849, 4852, 4853, 6447, 4848, 4850, 4854, 4861, + 4859, 4869, 4870, 4879, 4881, 4882, 6447, 4884, 6447, 4886, + 4871, 4888, 4876, 4890, 6447, 4891, 4892, 4893, 4894, 4897, + 4896, 4898, 4901, 4902, 4904, 4907, 6447, 4913, 4903, 6447, + 4909, 4917, 4924, 6447, 4919, 4930, 4925, 4927, 4932, 4933, + 4934, 4935, 4938, 4936, 4941, 4947, 4937, 4942, 4944, 4959, + 4962, 4969, 4949, 4951, 4956, 4964, 4965, 4968, 4971, 4972, + 4974, 4980, 4981, 4985, 6447, 4973, 6447, 4986, 4982, 4987, - 4984, 4993, 6407, 4985, 4998, 4988, 4990, 6407, 4995, 4996, - 5001, 5005, 6407, 5006, 5008, 5007, 5013, 5009, 5015, 5019, - 5020, 5022, 5023, 5026, 6407, 6407, 6407, 6407, 5030, 5027, - 5033, 5034, 5037, 5036, 5039, 5041, 5042, 6407, 5044, 6407, - 6407, 5046, 5053, 5052, 5054, 5055, 5056, 5060, 5062, 6407, - 5061, 5067, 5068, 5064, 5078, 5081, 5083, 5084, 5085, 5071, - 5074, 5093, 5094, 5095, 5086, 5097, 5104, 5106, 6407, 6407, - 5098, 5108, 5109, 5116, 5113, 5114, 5117, 5126, 5121, 5122, - 5123, 5124, 5128, 5129, 5140, 5141, 5133, 5088, 6407, 5130, - 5137, 5144, 6407, 5143, 6407, 5148, 5149, 5145, 5151, 5152, + 4989, 4993, 4990, 4994, 6447, 6447, 4996, 4997, 5003, 5004, + 5005, 5007, 5008, 6447, 5011, 5014, 5021, 5015, 6447, 5017, + 5022, 5024, 5030, 6447, 5025, 5027, 5031, 5034, 5038, 5040, + 5041, 5043, 5045, 5047, 5049, 6447, 6447, 6447, 6447, 5050, + 5053, 5055, 5056, 5058, 5063, 5064, 5066, 5062, 6447, 5068, + 6447, 6447, 5074, 5076, 5070, 5078, 5080, 5082, 5085, 5087, + 6447, 5089, 5086, 5092, 5090, 5099, 5103, 5106, 5108, 5093, + 5109, 5110, 5112, 5119, 5115, 5116, 5118, 5121, 5123, 5125, + 6447, 6447, 5127, 5132, 5134, 5142, 5138, 5139, 5135, 5151, + 5146, 5147, 5148, 5153, 5154, 5155, 5164, 5165, 5156, 5160, - 5156, 5157, 5159, 6407, 6407, 5160, 5172, 5167, 6407, 6407, - 5162, 5169, 5171, 5175, 5170, 5176, 5179, 5182, 5184, 5180, - 6407, 5185, 6407, 5186, 5187, 5193, 5194, 5202, 5204, 5207, - 5209, 5203, 5205, 6407, 5212, 5213, 6407, 5214, 5215, 5216, - 6407, 5222, 5217, 5225, 5228, 6407, 5233, 5230, 5236, 6407, - 5238, 6407, 5220, 5239, 5242, 5249, 6407, 5245, 5246, 6407, - 5251, 5253, 5255, 5256, 6407, 5257, 6407, 5259, 5261, 5262, - 5267, 5268, 5271, 5264, 5272, 5273, 5280, 5282, 5284, 6407, - 6407, 135, 5292, 5276, 5278, 5285, 5289, 5300, 5293, 5297, - 5303, 6407, 6407, 5304, 6407, 5306, 5307, 6407, 5296, 5308, + 6447, 5163, 5166, 5167, 6447, 5169, 6447, 5173, 5175, 5174, + 5177, 5182, 5184, 5185, 5187, 6447, 6447, 5183, 5194, 5189, + 6447, 6447, 5197, 5198, 5200, 5203, 5199, 5204, 5205, 5207, + 5209, 5210, 6447, 5211, 6447, 5212, 5213, 5221, 5215, 5230, + 5231, 5233, 5235, 5228, 5237, 6447, 5238, 5239, 6447, 5241, + 5243, 5244, 6447, 5248, 5246, 5251, 5254, 6447, 5256, 5258, + 5260, 6447, 5267, 6447, 5261, 5263, 5270, 5275, 6447, 5271, + 5272, 6447, 5277, 5279, 5280, 5284, 6447, 5285, 6447, 5286, + 5288, 5289, 5293, 5294, 5296, 5298, 5299, 5300, 5307, 5305, + 5308, 6447, 6447, 5316, 135, 5319, 5302, 5315, 5320, 5321, - 5312, 5315, 5317, 5316, 5319, 5323, 5325, 5326, 5327, 5328, - 5329, 5335, 5341, 5351, 5336, 5347, 5352, 5356, 5358, 5360, - 5349, 5362, 5354, 5363, 5364, 5366, 5368, 5370, 5371, 5372, - 6407, 5376, 5378, 5380, 5381, 6407, 5387, 5388, 5394, 5396, - 6407, 5398, 5400, 5402, 5403, 6407, 5390, 5405, 5406, 5407, - 5413, 5420, 5417, 5415, 5418, 6407, 6407, 6407, 5421, 5432, - 6407, 5434, 5423, 5425, 5427, 6407, 5429, 5435, 6407, 6407, - 5436, 5439, 5440, 5449, 6407, 5441, 6407, 5442, 6407, 5446, - 5452, 5454, 5456, 6407, 5459, 5466, 6407, 5469, 5472, 5474, - 5475, 5458, 5462, 5477, 6407, 5485, 5483, 5486, 5490, 5476, + 5328, 5323, 5326, 5332, 6447, 6447, 5324, 6447, 5333, 5334, + 6447, 5336, 5339, 5343, 5338, 5345, 5346, 5347, 5349, 5352, + 5354, 5359, 5357, 5353, 5358, 5373, 5375, 5360, 5378, 5380, + 5382, 5384, 5386, 5388, 5389, 5390, 5365, 5392, 5393, 5395, + 5396, 5398, 5399, 6447, 5402, 5407, 5408, 5403, 6447, 5414, + 5409, 5423, 5415, 6447, 5425, 5417, 5427, 5428, 6447, 5429, + 5431, 5434, 5432, 5433, 5445, 5440, 5442, 5446, 6447, 6447, + 6447, 5449, 5456, 6447, 5458, 5452, 5435, 5443, 6447, 5459, + 5462, 6447, 6447, 5463, 5464, 5465, 5475, 6447, 5467, 6447, + 5470, 6447, 5471, 5472, 5480, 5478, 6447, 5484, 5482, 5492, - 5480, 5487, 5493, 5495, 5502, 5497, 5500, 6407, 5501, 5504, - 5506, 5514, 5507, 5503, 5510, 5512, 6407, 5517, 6407, 5520, - 5521, 5519, 5527, 5524, 5528, 5529, 5530, 5538, 5541, 5531, - 5542, 5544, 5545, 6407, 6407, 5552, 5554, 6407, 5546, 6407, - 5556, 6407, 5557, 5558, 5559, 5560, 6407, 5562, 5563, 5548, - 5566, 6407, 5569, 5572, 5576, 5578, 6407, 6407, 5579, 5587, - 5584, 5580, 5591, 5593, 5588, 5597, 5320, 5594, 5598, 5606, - 5582, 5605, 5604, 5610, 5611, 5612, 6407, 6407, 6407, 5607, - 5615, 5626, 5622, 5625, 5629, 5627, 6407, 5631, 5633, 5634, - 5630, 5643, 5638, 5641, 6407, 5642, 5644, 5646, 5647, 5651, + 6447, 5498, 5500, 5502, 5494, 5486, 5490, 5505, 6447, 5513, + 5511, 5512, 5515, 5504, 5508, 5518, 5519, 5523, 5527, 5525, + 5529, 6447, 5526, 5531, 5532, 5533, 5535, 5538, 5540, 5542, + 6447, 5544, 6447, 5545, 5546, 5547, 5548, 5549, 5552, 5556, + 5561, 5567, 5560, 5563, 5570, 5573, 5574, 6447, 6447, 5576, + 5578, 6447, 5579, 6447, 5583, 6447, 5585, 5586, 5587, 5584, + 6447, 5591, 5588, 5592, 5580, 6447, 5594, 5597, 5598, 5605, + 6447, 6447, 5606, 5613, 5609, 5610, 5619, 5621, 5616, 5623, + 5624, 5625, 5627, 5637, 5629, 5628, 5630, 5639, 5641, 5643, + 5644, 6447, 6447, 6447, 5649, 5633, 5657, 5655, 5659, 5658, - 5648, 5653, 5652, 6407, 5659, 5664, 5665, 5666, 5668, 5675, - 5677, 5679, 5669, 5672, 5687, 5683, 6407, 5685, 6407, 6407, - 5686, 6407, 5689, 5690, 5691, 5692, 6407, 5695, 5696, 5697, - 5699, 5701, 5703, 6407, 5715, 5704, 5706, 5714, 6407, 6407, - 5721, 6407, 5723, 5726, 5716, 5733, 5728, 5729, 5735, 5736, - 6407, 5718, 5732, 5739, 5742, 5743, 6407, 5745, 5746, 5747, - 5748, 6407, 5751, 5750, 5755, 5756, 5757, 6407, 5758, 5759, - 5770, 5771, 6407, 5760, 5778, 5761, 6407, 6407, 5782, 5785, - 5786, 6407, 6407, 6407, 5788, 5789, 5791, 5793, 6407, 5796, - 5800, 5804, 5808, 5799, 6407, 5812, 5807, 5809, 6407, 6407, + 5660, 6447, 5663, 5665, 5666, 5667, 5675, 5670, 5673, 6447, + 5677, 5674, 5676, 5680, 5682, 5679, 5690, 5691, 6447, 5684, + 5696, 5697, 5685, 5703, 5705, 5707, 5710, 5711, 5712, 5719, + 5715, 6447, 5717, 6447, 6447, 5714, 6447, 5718, 5721, 5722, + 5725, 6447, 5728, 5723, 5729, 5730, 5732, 5735, 6447, 5742, + 5741, 5745, 5746, 6447, 6447, 5748, 6447, 5753, 5750, 5754, + 5762, 5757, 5758, 5760, 5765, 6447, 5763, 5771, 5772, 5773, + 5774, 5775, 6447, 5776, 5777, 5779, 5780, 6447, 5783, 5782, + 5785, 5787, 5788, 6447, 5789, 5790, 5811, 5804, 6447, 5795, + 5807, 5806, 6447, 6447, 5814, 5817, 5818, 6447, 6447, 6447, - 5813, 5814, 5815, 5817, 6407, 6407, 5818, 5819, 5824, 5821, - 5822, 6407, 5827, 5829, 5831, 5836, 5840, 5841, 5842, 5846, - 5850, 5854, 5851, 5852, 5853, 5857, 5859, 5860, 5866, 5869, - 5871, 5873, 5881, 5883, 5870, 6407, 6407, 5885, 6407, 5887, - 5888, 6407, 6407, 5890, 5892, 5894, 5896, 5899, 5901, 5903, - 6407, 5904, 5906, 5907, 5908, 5909, 6407, 5911, 5915, 5910, - 5918, 5912, 5921, 5917, 5927, 6407, 6407, 5919, 5933, 5923, - 5934, 5928, 6407, 5938, 5945, 5940, 5942, 5943, 5948, 5944, - 6407, 5950, 5952, 6407, 6407, 6407, 5953, 6407, 6407, 5951, - 6407, 6407, 6407, 6407, 6407, 6407, 6407, 5955, 6407, 5957, + 5821, 5823, 5824, 5826, 6447, 5830, 5834, 5838, 5842, 5833, + 6447, 5845, 5841, 5846, 6447, 6447, 5827, 5848, 5849, 5851, + 6447, 6447, 5852, 5855, 5853, 5856, 5858, 6447, 5861, 5864, + 5863, 5866, 5871, 5875, 5876, 5878, 5880, 5887, 5888, 5884, + 5885, 5890, 5893, 5894, 5895, 5897, 5907, 5902, 5904, 5906, + 5913, 5910, 6447, 6447, 5917, 6447, 5919, 5920, 6447, 6447, + 5922, 5924, 5926, 5928, 5931, 5933, 5935, 6447, 5936, 5938, + 5939, 5940, 5941, 6447, 5943, 5947, 5942, 5950, 5944, 5953, + 5959, 5949, 5966, 6447, 6447, 5951, 5967, 5955, 5971, 5960, + 6447, 5973, 5974, 5975, 5977, 5979, 5983, 5980, 6447, 5984, - 5964, 5972, 5974, 6407, 5959, 5967, 5965, 5975, 5978, 6407, - 5979, 5980, 5981, 5382, 5983, 5984, 5987, 5988, 5990, 5989, - 5993, 5994, 5997, 5999, 5996, 6010, 6001, 6014, 6407, 6407, - 6407, 6012, 6003, 6025, 6004, 6028, 6029, 6032, 6034, 6016, - 6020, 6036, 6037, 6038, 6022, 6041, 6050, 6045, 6046, 6048, - 6049, 6052, 6055, 6057, 6060, 6062, 6407, 6063, 6407, 6064, - 6407, 6407, 6066, 6067, 6073, 6070, 6077, 6080, 6076, 6075, - 6083, 6086, 6085, 6093, 6407, 6407, 6087, 6094, 6407, 6095, - 6096, 6407, 6097, 6098, 6099, 6106, 6107, 6104, 6105, 6111, - 6113, 6407, 6407, 6101, 6115, 6122, 6125, 6126, 6134, 6129, + 5985, 6447, 6447, 6447, 5987, 6447, 6447, 5986, 6447, 6447, + 6447, 6447, 6447, 6447, 6447, 5988, 6447, 5992, 6000, 6004, + 6007, 6447, 5993, 6008, 6009, 5995, 6447, 5997, 6447, 6010, + 6014, 6018, 6019, 6020, 6026, 6024, 6022, 6028, 6029, 6030, + 6032, 6031, 6036, 6038, 6034, 6042, 6044, 6447, 6447, 6447, + 6043, 6050, 6052, 6054, 6061, 6064, 6067, 6069, 6053, 6056, + 6071, 6073, 6075, 6058, 6077, 6085, 6081, 6082, 6084, 6086, + 6088, 6091, 6093, 6096, 6098, 6447, 6099, 6447, 6100, 6447, + 6447, 6102, 6103, 6105, 6107, 6116, 6117, 6109, 6112, 6119, + 6122, 6121, 6129, 6447, 6447, 6124, 6130, 6447, 6132, 6131, - 6127, 6135, 6137, 6136, 6144, 6407, 6146, 6143, 6150, 6407, - 6147, 6139, 5861, 6152, 6153, 6160, 6156, 6157, 6407, 6161, - 6407, 6164, 6165, 6168, 6159, 6166, 6167, 6181, 6179, 6176, - 6407, 6169, 6186, 6183, 6190, 6192, 6194, 6196, 6188, 6198, - 6200, 6204, 6209, 6210, 6211, 6201, 6214, 6212, 6407, 6216, - 6213, 6407, 6221, 6222, 6223, 6224, 6228, 6407, 6234, 6225, - 6230, 6235, 6238, 6239, 6407, 6241, 6248, 6245, 6407, 6250, - 6407, 6407, 6251, 6253, 6254, 6258, 6260, 6407, 6407, 6407, - 6287, 6294, 6301, 6308, 6315, 6322, 6329, 88, 6336, 6343, - 6350, 6357, 6364, 6371, 6378, 6385, 6392, 6399 + 6447, 6133, 6134, 6136, 6141, 6143, 6140, 6137, 6144, 6148, + 6447, 6447, 6151, 6152, 6157, 6161, 6158, 6168, 6164, 6167, + 6169, 6173, 6166, 6181, 6447, 6180, 6177, 6184, 6447, 6186, + 6187, 6188, 6189, 6191, 6198, 6193, 6194, 6447, 6196, 6447, + 6200, 6202, 6204, 6201, 6203, 6205, 6215, 6219, 6213, 6447, + 6217, 6227, 6221, 6229, 6231, 6233, 6234, 6223, 6236, 6239, + 6245, 6249, 6246, 6250, 6237, 6254, 6251, 6447, 6261, 6252, + 6447, 6258, 6262, 6255, 6264, 6265, 6447, 6269, 6272, 6273, + 6275, 6278, 6279, 6447, 6281, 6285, 6282, 6447, 6288, 6447, + 6447, 6290, 6287, 6294, 6297, 6299, 6447, 6447, 6447, 6327, + 6334, 6341, 6348, 6355, 6362, 6369, 88, 6376, 6383, 6390, + 6397, 6404, 6411, 6418, 6425, 6432, 6439 } ; -static const flex_int16_t yy_def[3299] = +static const flex_int16_t yy_def[3318] = { 0, - 3280, 1, 3281, 3281, 3282, 3282, 3283, 3283, 3284, 3284, - 3285, 3285, 3286, 3286, 3287, 3287, 3280, 3288, 3280, 3280, - 3280, 3280, 3289, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3290, 3280, 3280, 3280, - 3290, 3291, 3280, 3280, 3280, 3291, 3292, 3280, 3280, 3280, - 3280, 3292, 3293, 3280, 3280, 3280, 3293, 3294, 3280, 3295, - 3280, 3294, 3294, 3296, 3280, 3280, 3280, 3280, 3296, 3297, - 3280, 3280, 3280, 3297, 3288, 3288, 3280, 3298, 3289, 3298, - 3289, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3299, 1, 3300, 3300, 3301, 3301, 3302, 3302, 3303, 3303, + 3304, 3304, 3305, 3305, 3306, 3306, 3299, 3307, 3299, 3299, + 3299, 3299, 3308, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3309, 3299, 3299, 3299, + 3309, 3310, 3299, 3299, 3299, 3310, 3311, 3299, 3299, 3299, + 3299, 3311, 3312, 3299, 3299, 3299, 3312, 3313, 3299, 3314, + 3299, 3313, 3313, 3315, 3299, 3299, 3299, 3299, 3315, 3316, + 3299, 3299, 3299, 3316, 3307, 3307, 3299, 3317, 3308, 3317, + 3308, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3290, 3290, 3291, - 3291, 3292, 3292, 3280, 3293, 3293, 3294, 3294, 3295, 3295, - 3294, 3296, 3296, 3280, 3297, 3297, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3309, 3309, 3310, + 3310, 3311, 3311, 3299, 3312, 3312, 3313, 3313, 3314, 3314, + 3313, 3315, 3315, 3299, 3316, 3316, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3294, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3313, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3294, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3294, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3294, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, - 3280, 3288, 3280, 3280, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3299, 3299, 3307, 3299, 3299, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3294, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3313, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3299, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3280, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3299, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3294, 3294, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3313, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3294, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3313, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3294, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3280, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3294, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3280, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3299, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3294, 3288, 3280, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3280, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3313, 3307, 3299, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3280, 3288, - 3280, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3299, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3280, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3294, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3313, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3288, 3288, 3288, - 3288, 3294, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3313, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, - 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3280, 3288, 3280, - 3288, 3280, 3288, 3288, 3280, 3280, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, + 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3299, + 3307, 3299, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3294, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3280, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3280, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3280, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3313, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3299, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3280, 3280, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3294, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3280, 3288, 3280, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3299, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3313, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3280, 3280, 3288, 3288, 3288, 3280, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3280, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3280, - 3288, 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, - 3280, 3294, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3280, 3288, 3280, 3288, 3288, 3280, 3288, 3288, + 3299, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, + 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3299, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3299, 3307, 3313, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3280, 3280, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3280, 3280, - 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3288, 3280, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, + 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3299, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, + 3299, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3299, + 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3280, 3288, 3288, 3280, 3288, 3280, - 3288, 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3280, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3280, 3280, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, + 3307, 3299, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3280, - 3288, 3280, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3280, 3280, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3280, 3280, 3288, 3288, - 3288, 3280, 3280, 3280, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3280, 3280, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3299, 3307, 3299, 3299, 3307, 3299, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3299, 3299, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3299, 3299, 3299, - 3288, 3288, 3288, 3288, 3280, 3280, 3288, 3288, 3288, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3280, 3288, 3280, 3288, - 3288, 3280, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3280, 3280, 3288, 3288, 3288, - 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3280, 3280, 3280, 3288, 3280, 3280, 3288, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3288, 3280, 3288, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, + 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3299, 3299, 3307, 3299, 3307, 3307, 3299, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3280, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3280, 3288, - 3280, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3280, 3288, 3288, 3280, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3280, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, + 3307, 3299, 3299, 3299, 3307, 3299, 3299, 3307, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3307, 3299, 3307, 3307, 3307, + 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3299, + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3299, 3307, 3307, - 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3280, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3280, 3288, - 3288, 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3288, 3288, - 3288, 3288, 3288, 3288, 3280, 3288, 3288, 3288, 3280, 3288, - 3280, 3280, 3288, 3288, 3288, 3288, 3288, 3280, 3280, 0, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280 + 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3299, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3299, 3307, 3299, + 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 0, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299 } ; -static const flex_int16_t yy_nxt[6448] = +static const flex_int16_t yy_nxt[6488] = { 0, 18, 19, 20, 21, 22, 23, 22, 18, 18, 18, 18, 18, 22, 24, 25, 26, 27, 28, 29, 30, @@ -1540,7 +1547,7 @@ static const flex_int16_t yy_nxt[6448] = 204, 199, 86, 202, 207, 209, 86, 213, 210, 86, 86, 206, 208, 86, 216, 86, 86, 86, 86, 218, 86, 211, 212, 219, 223, 215, 86, 225, 226, 86, - 224, 86, 214, 86, 217, 919, 221, 86, 227, 220, + 224, 86, 214, 86, 217, 922, 221, 86, 227, 220, 86, 222, 228, 86, 231, 86, 86, 86, 236, 86, 233, 86, 86, 229, 234, 230, 238, 86, 248, 86, 86, 232, 86, 86, 86, 239, 235, 86, 86, 237, @@ -1588,7 +1595,7 @@ static const flex_int16_t yy_nxt[6448] = 435, 86, 86, 426, 440, 431, 86, 427, 86, 424, 86, 437, 86, 86, 433, 441, 434, 86, 439, 436, 450, 86, 86, 86, 455, 442, 449, 451, 438, 86, - 86, 86, 86, 452, 563, 453, 456, 86, 443, 458, + 86, 86, 86, 452, 564, 453, 456, 86, 443, 458, 459, 444, 86, 457, 86, 462, 445, 446, 447, 448, 460, 454, 86, 86, 86, 461, 86, 468, 86, 86, @@ -1599,622 +1606,626 @@ static const flex_int16_t yy_nxt[6448] = 482, 488, 486, 489, 86, 86, 497, 491, 487, 498, 86, 86, 86, 490, 495, 86, 499, 86, 500, 86, 492, 86, 86, 493, 501, 494, 86, 86, 502, 86, - 515, 86, 512, 86, 551, 86, 503, 86, 504, 510, + 515, 86, 512, 86, 552, 86, 503, 86, 504, 510, 505, 513, 511, 514, 526, 517, 516, 168, 525, 527, - 86, 86, 86, 506, 528, 86, 507, 529, 508, 86, - 509, 86, 86, 518, 519, 86, 535, 532, 530, 531, - 86, 533, 86, 520, 86, 521, 522, 523, 534, 539, - 524, 86, 86, 86, 86, 86, 541, 86, 538, 540, - 537, 536, 546, 86, 548, 86, 549, 86, 86, 545, - 86, 553, 543, 544, 542, 86, 86, 86, 547, 86, - 557, 558, 552, 86, 556, 86, 86, 550, 86, 86, - 86, 86, 555, 564, 565, 86, 86, 86, 86, 567, - 554, 568, 560, 562, 561, 559, 86, 570, 86, 571, - 86, 566, 573, 572, 86, 86, 569, 86, 86, 584, + 86, 86, 164, 506, 528, 86, 507, 86, 508, 86, + 509, 86, 86, 518, 519, 529, 533, 86, 531, 532, + 86, 534, 530, 520, 86, 521, 522, 523, 536, 540, + 524, 86, 86, 537, 86, 86, 535, 542, 539, 541, + 538, 86, 86, 86, 86, 86, 549, 86, 547, 86, + 550, 544, 86, 86, 554, 543, 86, 546, 86, 548, + 86, 545, 86, 86, 86, 551, 163, 553, 557, 86, + 558, 559, 555, 86, 556, 86, 560, 86, 561, 86, + 562, 565, 566, 563, 86, 86, 86, 571, 568, 569, + 86, 86, 573, 86, 572, 585, 86, 86, 86, 567, - 579, 86, 586, 576, 575, 86, 574, 585, 580, 581, - 588, 86, 582, 583, 577, 587, 578, 589, 86, 86, - 86, 86, 86, 86, 592, 591, 86, 594, 164, 593, - 86, 596, 86, 598, 86, 86, 86, 86, 601, 590, - 599, 595, 602, 86, 86, 597, 86, 603, 86, 600, - 86, 86, 86, 608, 86, 606, 607, 86, 86, 604, - 86, 609, 86, 86, 86, 614, 610, 605, 615, 86, - 617, 86, 613, 86, 86, 616, 612, 611, 618, 86, - 620, 86, 622, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 619, 624, 86, 625, 621, 633, 86, 636, + 712, 86, 580, 86, 570, 577, 574, 576, 86, 575, + 581, 582, 586, 587, 583, 584, 578, 86, 579, 86, + 590, 588, 86, 86, 86, 86, 86, 86, 589, 592, + 86, 593, 86, 594, 86, 597, 86, 595, 598, 599, + 86, 600, 86, 591, 596, 86, 602, 603, 86, 86, + 86, 86, 604, 86, 86, 601, 607, 86, 609, 608, + 86, 86, 86, 86, 605, 86, 610, 86, 615, 86, + 86, 606, 611, 616, 86, 614, 86, 618, 86, 617, + 613, 612, 86, 619, 86, 621, 86, 623, 86, 86, + 86, 620, 86, 86, 86, 86, 622, 625, 86, 626, - 627, 163, 630, 86, 623, 632, 86, 626, 628, 631, - 629, 635, 637, 86, 86, 634, 86, 86, 86, 640, - 643, 638, 86, 646, 639, 86, 86, 86, 641, 86, - 645, 86, 86, 642, 86, 86, 649, 86, 86, 648, - 653, 652, 644, 86, 86, 86, 86, 647, 655, 86, - 86, 86, 86, 654, 650, 651, 86, 86, 86, 658, - 656, 669, 672, 86, 657, 86, 659, 668, 707, 667, - 670, 660, 671, 661, 86, 86, 86, 86, 675, 662, - 676, 663, 673, 86, 664, 665, 674, 86, 680, 86, - 677, 666, 679, 678, 86, 86, 685, 86, 683, 681, + 86, 634, 653, 624, 628, 86, 161, 86, 627, 86, + 636, 629, 631, 630, 633, 632, 86, 86, 635, 638, + 86, 86, 637, 86, 641, 86, 644, 86, 639, 647, + 86, 640, 86, 646, 86, 86, 86, 642, 86, 86, + 643, 650, 86, 86, 654, 86, 86, 645, 649, 86, + 656, 86, 86, 648, 86, 86, 86, 86, 655, 670, + 651, 673, 657, 652, 659, 86, 159, 86, 658, 86, + 660, 669, 668, 671, 86, 661, 680, 662, 86, 677, + 86, 672, 86, 663, 86, 664, 681, 674, 665, 666, + 86, 675, 86, 676, 86, 667, 678, 682, 86, 679, - 86, 686, 86, 682, 86, 688, 86, 86, 86, 86, - 86, 86, 684, 86, 86, 694, 161, 689, 690, 86, - 695, 86, 687, 691, 168, 698, 692, 701, 700, 697, - 699, 693, 696, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 710, 708, 86, 86, 702, 833, 86, 86, - 703, 705, 86, 706, 709, 704, 712, 713, 86, 714, - 716, 715, 86, 86, 717, 86, 86, 86, 711, 86, - 718, 86, 86, 86, 721, 722, 719, 727, 720, 86, - 723, 86, 728, 86, 730, 86, 741, 724, 86, 726, - 725, 732, 729, 731, 86, 733, 86, 86, 734, 86, + 683, 684, 86, 687, 86, 86, 689, 86, 86, 86, + 86, 86, 86, 685, 686, 86, 86, 695, 86, 86, + 691, 86, 690, 86, 692, 696, 86, 699, 700, 688, + 693, 86, 694, 698, 697, 701, 168, 703, 704, 86, + 702, 86, 706, 86, 86, 86, 86, 86, 86, 86, + 710, 715, 86, 86, 705, 707, 716, 714, 718, 708, + 711, 86, 86, 709, 86, 717, 86, 86, 86, 720, + 86, 86, 713, 719, 724, 723, 86, 86, 86, 732, + 86, 721, 729, 722, 86, 725, 86, 730, 86, 733, + 86, 731, 726, 728, 734, 727, 735, 86, 736, 86, - 735, 86, 736, 86, 86, 86, 86, 737, 86, 738, - 745, 86, 743, 739, 740, 86, 86, 86, 744, 86, - 749, 86, 742, 748, 86, 750, 86, 86, 86, 86, - 86, 754, 752, 86, 86, 86, 747, 86, 760, 746, - 757, 86, 751, 753, 86, 86, 761, 86, 755, 756, - 758, 86, 86, 86, 768, 763, 86, 759, 86, 762, - 764, 86, 86, 765, 766, 767, 771, 772, 86, 769, - 775, 86, 770, 774, 86, 86, 86, 777, 86, 778, - 776, 86, 773, 780, 781, 86, 86, 86, 86, 86, - 782, 86, 86, 86, 787, 785, 789, 86, 86, 86, + 86, 737, 86, 738, 86, 740, 86, 86, 739, 86, + 86, 743, 86, 742, 741, 86, 86, 86, 746, 86, + 745, 747, 86, 744, 751, 86, 750, 86, 86, 752, + 86, 86, 86, 754, 86, 756, 86, 86, 749, 86, + 748, 86, 759, 762, 86, 753, 755, 86, 86, 86, + 86, 757, 758, 763, 86, 760, 86, 765, 764, 86, + 770, 761, 766, 772, 86, 767, 768, 86, 769, 773, + 86, 86, 774, 777, 771, 86, 86, 86, 779, 86, + 86, 780, 86, 783, 775, 778, 776, 782, 86, 86, + 86, 86, 86, 784, 86, 86, 86, 789, 787, 791, - 86, 779, 783, 797, 786, 784, 86, 790, 86, 792, - 795, 86, 788, 86, 86, 793, 86, 796, 791, 801, - 794, 798, 799, 86, 86, 86, 800, 804, 86, 86, - 806, 802, 86, 86, 805, 807, 86, 86, 810, 803, - 86, 86, 809, 811, 86, 86, 86, 86, 86, 817, - 159, 814, 86, 808, 812, 86, 819, 820, 813, 818, - 86, 822, 86, 86, 86, 815, 816, 824, 821, 823, - 826, 86, 86, 829, 86, 827, 86, 828, 830, 86, - 86, 831, 825, 86, 86, 835, 86, 86, 86, 86, - 86, 841, 86, 834, 842, 86, 832, 86, 86, 86, + 86, 86, 86, 781, 86, 785, 86, 788, 786, 86, + 792, 797, 794, 795, 86, 790, 86, 86, 796, 799, + 798, 793, 800, 801, 86, 86, 86, 802, 86, 86, + 806, 803, 86, 808, 810, 86, 86, 807, 809, 86, + 86, 86, 812, 805, 86, 811, 804, 813, 86, 86, + 86, 86, 819, 86, 814, 816, 86, 815, 86, 86, + 821, 822, 86, 824, 86, 828, 825, 826, 820, 817, + 818, 86, 86, 823, 86, 831, 86, 833, 86, 830, + 832, 86, 827, 86, 829, 835, 86, 86, 86, 837, + 86, 86, 86, 86, 843, 86, 86, 86, 86, 844, - 86, 843, 836, 86, 837, 838, 86, 839, 850, 840, - 844, 86, 86, 845, 86, 848, 86, 846, 86, 847, - 86, 849, 86, 86, 852, 851, 855, 86, 86, 86, - 86, 86, 86, 864, 86, 853, 862, 854, 856, 857, - 86, 86, 86, 86, 863, 858, 859, 860, 861, 86, - 86, 86, 867, 865, 86, 869, 868, 86, 86, 866, - 86, 873, 871, 874, 86, 876, 86, 870, 86, 86, - 872, 875, 86, 877, 86, 86, 879, 86, 168, 86, - 86, 880, 885, 884, 878, 86, 882, 883, 881, 886, - 86, 86, 86, 86, 887, 892, 86, 895, 86, 888, + 86, 86, 86, 834, 86, 836, 838, 845, 839, 840, + 86, 841, 846, 842, 848, 86, 847, 852, 86, 851, + 86, 849, 850, 86, 86, 86, 86, 86, 86, 853, + 854, 857, 86, 86, 86, 86, 86, 866, 86, 855, + 864, 859, 867, 856, 858, 86, 860, 86, 865, 86, + 861, 862, 863, 86, 86, 86, 86, 86, 869, 871, + 86, 876, 86, 870, 868, 86, 86, 875, 86, 872, + 874, 878, 877, 879, 873, 86, 86, 86, 86, 168, + 880, 86, 881, 886, 887, 882, 86, 884, 86, 86, + 889, 883, 86, 885, 86, 888, 86, 86, 86, 895, - 86, 893, 86, 86, 86, 86, 889, 890, 896, 894, - 899, 897, 86, 891, 86, 86, 86, 86, 901, 86, - 905, 86, 86, 898, 902, 900, 86, 906, 907, 86, - 86, 86, 86, 86, 86, 904, 86, 86, 86, 921, - 903, 920, 910, 922, 86, 923, 918, 908, 925, 928, - 924, 86, 926, 86, 927, 909, 86, 86, 911, 86, - 86, 912, 86, 932, 176, 913, 86, 940, 914, 86, - 86, 930, 86, 86, 943, 915, 916, 929, 917, 86, - 931, 86, 933, 934, 947, 935, 86, 941, 936, 86, - 942, 86, 86, 937, 174, 945, 86, 944, 86, 938, + 86, 86, 890, 891, 86, 896, 898, 86, 86, 86, + 900, 892, 893, 897, 899, 902, 86, 86, 894, 86, + 86, 86, 86, 904, 908, 86, 86, 901, 86, 905, + 86, 86, 86, 909, 86, 910, 903, 86, 86, 86, + 907, 86, 86, 928, 911, 906, 923, 924, 925, 921, + 86, 86, 913, 86, 927, 86, 912, 86, 86, 914, + 926, 931, 915, 86, 929, 86, 916, 86, 930, 917, + 943, 932, 933, 86, 935, 934, 918, 919, 86, 920, + 86, 86, 936, 937, 86, 938, 86, 86, 939, 86, + 946, 948, 86, 940, 944, 86, 945, 950, 86, 941, - 939, 951, 952, 954, 949, 948, 86, 953, 86, 86, - 955, 946, 86, 86, 86, 958, 86, 950, 957, 86, - 86, 956, 86, 960, 959, 962, 86, 961, 86, 86, - 963, 965, 86, 86, 86, 968, 966, 86, 970, 86, - 86, 964, 969, 86, 86, 973, 86, 86, 86, 977, - 86, 86, 1034, 967, 971, 86, 978, 972, 974, 975, - 979, 86, 86, 1013, 980, 983, 984, 982, 976, 981, - 86, 86, 86, 86, 986, 86, 86, 86, 985, 987, - 86, 988, 990, 86, 86, 989, 991, 86, 86, 86, - 86, 86, 992, 86, 994, 997, 86, 995, 1001, 86, + 942, 176, 86, 86, 952, 954, 955, 949, 947, 86, + 957, 956, 86, 86, 951, 86, 958, 86, 960, 86, + 961, 86, 962, 953, 959, 86, 964, 86, 963, 965, + 86, 86, 86, 966, 86, 86, 86, 86, 969, 967, + 86, 973, 86, 86, 972, 86, 86, 976, 86, 86, + 86, 968, 980, 982, 86, 970, 971, 974, 86, 975, + 978, 977, 86, 983, 1013, 86, 986, 981, 984, 86, + 985, 979, 86, 987, 86, 86, 989, 990, 86, 86, + 988, 86, 86, 86, 991, 993, 86, 994, 86, 992, + 86, 995, 86, 86, 86, 1000, 86, 997, 86, 1004, - 1000, 86, 998, 86, 86, 86, 993, 999, 86, 86, - 996, 86, 86, 86, 1003, 86, 1006, 1004, 1008, 86, - 86, 1007, 1002, 86, 1009, 1014, 86, 1010, 86, 1016, - 1015, 86, 1012, 1005, 86, 86, 86, 86, 1024, 86, - 1021, 1017, 86, 86, 1019, 1011, 86, 86, 1022, 1023, - 86, 1026, 86, 1018, 86, 86, 86, 86, 173, 86, - 1020, 1037, 86, 1025, 1027, 1032, 86, 86, 86, 86, - 1028, 86, 1029, 86, 86, 1031, 1030, 1035, 1038, 1042, - 1033, 1036, 1041, 1039, 86, 1040, 1045, 86, 1043, 1044, - 86, 86, 86, 86, 86, 86, 86, 1054, 86, 1055, + 998, 86, 1003, 86, 86, 86, 86, 1001, 996, 1002, + 86, 86, 86, 999, 86, 1006, 86, 1009, 86, 1007, + 86, 1011, 86, 1005, 86, 1010, 1017, 1012, 86, 1015, + 86, 1018, 86, 86, 1019, 1008, 86, 1016, 86, 1014, + 86, 86, 1026, 1020, 1024, 1022, 1027, 86, 86, 1021, + 86, 86, 1025, 86, 86, 1029, 86, 86, 86, 86, + 86, 86, 1023, 174, 1037, 86, 86, 1035, 86, 1028, + 1040, 86, 1030, 1031, 1032, 1041, 86, 1034, 1033, 1038, + 1042, 86, 1036, 86, 1039, 86, 86, 1048, 86, 1045, + 1043, 1047, 86, 86, 86, 1044, 86, 86, 86, 1046, - 1047, 1049, 86, 86, 86, 86, 86, 1057, 86, 86, - 1046, 1065, 1048, 86, 1050, 1052, 1056, 1051, 1053, 1059, - 1060, 86, 86, 86, 1058, 86, 86, 1061, 1062, 1066, - 86, 1067, 1068, 1063, 86, 86, 1072, 1069, 86, 86, - 1070, 1064, 86, 1074, 86, 86, 86, 1077, 1071, 86, - 86, 1076, 1078, 168, 1080, 86, 1081, 86, 86, 1073, - 86, 86, 86, 1075, 1079, 1084, 86, 86, 86, 86, - 86, 1097, 86, 1100, 86, 86, 1098, 86, 1083, 1082, - 1085, 1087, 1088, 86, 86, 168, 1086, 1090, 1089, 86, - 1099, 86, 1091, 86, 1092, 1102, 86, 1104, 1093, 1103, + 86, 86, 1050, 1057, 1052, 1058, 86, 1060, 86, 86, + 1062, 86, 1049, 86, 1051, 86, 86, 1053, 1063, 1055, + 1054, 1056, 1059, 86, 86, 86, 1061, 1064, 86, 86, + 86, 1070, 1071, 1068, 1065, 86, 86, 1066, 86, 1072, + 1075, 86, 86, 1077, 86, 1067, 86, 86, 86, 86, + 1069, 86, 1081, 1073, 1074, 86, 1079, 1082, 168, 86, + 86, 1085, 1076, 1084, 1080, 1078, 86, 86, 86, 86, + 1083, 1086, 1088, 86, 86, 86, 86, 86, 1101, 86, + 1104, 86, 86, 1102, 86, 86, 1087, 1089, 1091, 1092, + 86, 173, 86, 1090, 1094, 1093, 86, 1103, 86, 1095, - 1094, 1105, 1101, 1107, 86, 1095, 86, 1106, 1108, 86, - 1096, 86, 86, 1109, 86, 1111, 86, 86, 86, 86, - 1110, 1114, 1117, 86, 1116, 86, 86, 1112, 86, 1113, - 86, 1115, 1118, 1123, 1121, 1124, 1122, 1120, 1125, 86, - 1119, 86, 1126, 86, 86, 1127, 1128, 86, 1129, 86, - 86, 86, 86, 166, 86, 86, 1140, 86, 1130, 86, - 1143, 1139, 86, 1145, 86, 1131, 86, 1132, 1141, 1142, - 86, 86, 1133, 86, 1134, 1144, 1146, 86, 1150, 86, - 1135, 86, 1151, 1147, 86, 1136, 1137, 86, 86, 1149, - 1148, 1152, 1138, 1156, 86, 86, 86, 86, 1159, 1153, + 1107, 1096, 1106, 86, 1108, 1097, 1110, 1098, 1109, 1105, + 1111, 86, 1099, 86, 86, 1112, 86, 1100, 1115, 86, + 1113, 86, 86, 86, 86, 86, 1118, 1114, 86, 1121, + 1116, 86, 86, 86, 1117, 1120, 1119, 86, 1126, 1122, + 1125, 86, 1124, 1123, 1128, 1129, 1127, 1130, 86, 1131, + 86, 86, 1132, 86, 86, 1133, 1134, 86, 86, 86, + 86, 86, 1147, 86, 1144, 86, 86, 86, 86, 1143, + 1148, 1135, 86, 1136, 1145, 1146, 1149, 86, 1137, 86, + 1138, 1150, 1154, 86, 86, 1151, 1139, 86, 86, 1155, + 86, 1140, 1141, 86, 86, 1153, 1152, 86, 1142, 1156, - 1157, 86, 86, 1154, 86, 1160, 1155, 86, 86, 86, - 86, 1164, 1162, 1165, 1163, 1158, 1161, 86, 86, 1167, - 86, 86, 86, 1170, 86, 86, 86, 1168, 1166, 86, - 1171, 1173, 86, 86, 86, 86, 1169, 86, 86, 1175, - 86, 1172, 86, 1178, 1174, 1177, 1179, 1182, 1180, 86, - 86, 1183, 1176, 86, 1184, 1181, 86, 86, 86, 86, - 86, 86, 86, 164, 1187, 1190, 1191, 1192, 1193, 1185, - 86, 1194, 1189, 1195, 86, 1186, 1188, 86, 1198, 86, - 86, 86, 1200, 1199, 86, 1201, 86, 1196, 86, 1202, - 86, 86, 86, 1197, 1203, 86, 1209, 86, 1211, 86, + 86, 1157, 1160, 86, 1161, 86, 1158, 1163, 1164, 86, + 86, 1159, 1168, 86, 1162, 1166, 1165, 86, 86, 86, + 86, 86, 1167, 86, 1169, 1174, 86, 86, 86, 1171, + 1172, 86, 86, 1177, 86, 1175, 1170, 86, 86, 1173, + 86, 86, 86, 86, 86, 86, 1176, 1184, 1179, 1182, + 1181, 1183, 1178, 1186, 86, 86, 86, 1180, 1188, 86, + 1185, 1187, 86, 86, 86, 86, 86, 86, 86, 1191, + 1194, 1195, 1196, 1197, 1189, 1190, 86, 1198, 1193, 1199, + 1192, 1200, 86, 1202, 86, 86, 86, 1204, 1203, 86, + 1205, 86, 86, 86, 1206, 86, 86, 86, 1201, 1213, - 86, 86, 86, 1215, 86, 1207, 1205, 86, 1204, 1206, - 1208, 86, 1213, 86, 1212, 1214, 86, 1210, 1217, 86, - 86, 1218, 86, 86, 86, 1220, 86, 1221, 86, 1223, - 86, 1226, 1216, 86, 1225, 1219, 1222, 86, 1227, 86, - 86, 86, 1224, 86, 1230, 86, 1231, 86, 1229, 1228, - 86, 1232, 86, 1235, 1237, 1238, 86, 86, 86, 86, - 86, 86, 1233, 1239, 1240, 1236, 86, 1234, 1242, 1247, - 86, 1241, 1245, 86, 86, 1243, 1244, 86, 86, 86, - 86, 86, 1246, 86, 86, 86, 1252, 1253, 1248, 1249, - 86, 1250, 86, 86, 86, 1258, 1254, 1259, 1262, 86, + 86, 1215, 86, 86, 1208, 86, 1207, 86, 1217, 1209, + 1211, 1212, 86, 1210, 86, 86, 86, 1216, 1219, 86, + 1214, 1221, 86, 86, 1222, 86, 1218, 86, 1224, 86, + 1225, 86, 1231, 86, 86, 1220, 1230, 1227, 1223, 1226, + 1229, 86, 86, 86, 86, 1228, 86, 1234, 86, 1235, + 1232, 86, 86, 86, 86, 86, 1239, 1241, 86, 1242, + 1243, 1233, 86, 86, 1236, 86, 86, 1240, 86, 1246, + 1237, 1244, 1238, 1245, 1249, 86, 1247, 86, 86, 86, + 86, 86, 1248, 1250, 1251, 86, 1252, 86, 1253, 86, + 86, 86, 1256, 1257, 86, 86, 86, 1262, 1263, 1254, - 1251, 86, 86, 86, 1256, 86, 86, 1261, 1255, 1260, - 86, 1266, 1257, 86, 86, 86, 86, 86, 86, 168, - 1264, 86, 1265, 1268, 1263, 1272, 86, 86, 86, 86, - 86, 1267, 1279, 86, 1277, 1269, 1275, 1271, 86, 1273, - 1276, 1274, 1270, 1281, 86, 1282, 86, 1278, 86, 86, - 1280, 86, 86, 1284, 1285, 86, 86, 86, 86, 86, - 1283, 1286, 86, 1289, 86, 1291, 86, 1295, 86, 1287, - 86, 1288, 86, 1292, 1290, 86, 86, 1293, 86, 86, - 86, 1299, 86, 1294, 1296, 1301, 1305, 86, 1306, 86, - 1297, 1298, 86, 1310, 1302, 86, 1303, 1307, 1300, 1304, + 86, 86, 1258, 86, 86, 1265, 1255, 1260, 1266, 86, + 86, 86, 1259, 1270, 86, 1261, 1264, 86, 86, 86, + 86, 86, 86, 1276, 86, 1268, 1269, 86, 1272, 1267, + 168, 86, 1277, 86, 86, 86, 1271, 86, 86, 1273, + 86, 1275, 1282, 1283, 168, 1279, 1274, 1281, 1280, 1286, + 1278, 1284, 86, 1287, 86, 86, 1288, 86, 1285, 86, + 86, 86, 1289, 1290, 86, 1291, 86, 86, 1292, 86, + 86, 1294, 86, 86, 1300, 86, 86, 1297, 1293, 86, + 86, 86, 1295, 86, 86, 1311, 86, 1298, 1296, 1304, + 1301, 1306, 1299, 86, 86, 1303, 86, 1302, 1310, 86, - 1308, 86, 1309, 86, 86, 86, 1311, 86, 1312, 86, - 86, 86, 1315, 86, 1314, 1318, 86, 86, 86, 1322, - 86, 86, 1313, 1317, 86, 86, 1323, 1319, 1316, 1320, - 1324, 86, 86, 1328, 86, 1321, 1326, 1325, 1327, 86, - 86, 86, 86, 86, 86, 86, 86, 1329, 86, 86, - 1334, 86, 86, 1332, 1330, 1339, 1335, 1333, 86, 1331, - 86, 86, 86, 86, 1336, 86, 1338, 1337, 86, 1343, - 86, 1341, 1342, 1340, 86, 1346, 1344, 1351, 86, 86, - 86, 1345, 86, 86, 1347, 1349, 86, 1354, 86, 86, - 86, 1357, 1353, 1348, 1350, 1352, 86, 86, 86, 86, + 1307, 1305, 1308, 1314, 1312, 1309, 1313, 86, 86, 86, + 86, 1318, 1316, 86, 86, 86, 86, 86, 1320, 86, + 86, 86, 1315, 1319, 1323, 1327, 86, 86, 1322, 1317, + 86, 1324, 1325, 86, 1321, 1328, 86, 86, 1329, 1326, + 86, 1331, 86, 86, 1332, 86, 1333, 1330, 86, 86, + 86, 86, 86, 86, 86, 86, 1339, 1334, 1335, 86, + 1337, 1344, 86, 1340, 1336, 1338, 86, 86, 86, 86, + 86, 1341, 1343, 86, 1342, 86, 1348, 1345, 86, 1346, + 86, 86, 1351, 1349, 1356, 86, 1347, 86, 1350, 86, + 86, 86, 1352, 1354, 86, 1357, 1362, 1359, 1364, 1358, - 1359, 1358, 1355, 86, 1356, 1360, 86, 86, 1364, 1361, - 1362, 1363, 86, 1365, 86, 1387, 1372, 1366, 1374, 1386, - 1367, 1368, 86, 1373, 86, 1369, 86, 1375, 86, 86, - 1378, 1370, 86, 1376, 86, 1371, 86, 1379, 1377, 1380, - 86, 1381, 86, 1382, 86, 1383, 86, 86, 86, 1384, - 86, 1385, 86, 1390, 1393, 1394, 1388, 86, 86, 86, - 86, 86, 1389, 1395, 1391, 86, 1397, 86, 1402, 1396, - 1392, 1398, 86, 1399, 1407, 1400, 86, 1401, 1403, 1404, - 1406, 86, 86, 1405, 86, 1410, 86, 86, 86, 86, - 1411, 86, 86, 1409, 1414, 1412, 86, 86, 86, 1420, + 1353, 1355, 86, 1365, 86, 86, 86, 1360, 86, 86, + 1361, 86, 1369, 1379, 1363, 86, 1380, 166, 86, 86, + 1367, 1368, 1377, 86, 1366, 86, 1370, 1378, 1381, 1383, + 1371, 86, 86, 1372, 1373, 86, 86, 1384, 1374, 86, + 1382, 1385, 86, 1386, 1375, 86, 1388, 86, 1376, 86, + 1389, 86, 1390, 86, 86, 86, 1395, 86, 86, 86, + 1387, 1398, 1399, 1393, 164, 86, 1414, 86, 86, 1391, + 1400, 1392, 1396, 86, 86, 1394, 86, 1397, 1401, 86, + 1407, 86, 1402, 1408, 1409, 86, 86, 1403, 86, 1404, + 86, 1405, 1410, 1406, 1411, 86, 1415, 86, 1418, 86, - 1408, 1416, 1415, 86, 1421, 86, 86, 86, 86, 1413, - 86, 86, 1419, 1424, 1422, 1417, 1418, 86, 86, 86, - 1426, 1423, 86, 163, 1425, 1430, 86, 1429, 1432, 86, - 86, 86, 1433, 86, 1431, 1427, 1434, 86, 86, 1438, - 86, 86, 1435, 1428, 1440, 86, 86, 1437, 86, 1441, - 1436, 1442, 86, 86, 1445, 86, 86, 86, 86, 86, - 1447, 1439, 86, 86, 1449, 1451, 86, 86, 86, 161, - 1453, 1450, 86, 1443, 1444, 86, 1446, 1455, 1448, 86, - 86, 86, 86, 1454, 1452, 1457, 1459, 1458, 86, 1456, - 86, 1461, 86, 1460, 86, 86, 86, 1462, 1467, 1468, + 1412, 1416, 86, 86, 1417, 86, 1413, 86, 1419, 86, + 1425, 1420, 86, 1426, 1421, 86, 86, 86, 1422, 86, + 86, 86, 86, 1424, 1429, 1427, 1423, 86, 86, 1428, + 1431, 1435, 86, 1434, 1430, 86, 1437, 86, 86, 86, + 1432, 1438, 86, 1440, 86, 1439, 86, 1443, 86, 86, + 1436, 86, 1433, 1445, 86, 1442, 86, 1446, 86, 86, + 1450, 86, 86, 1441, 1447, 86, 86, 86, 1452, 1444, + 86, 86, 1448, 1456, 86, 1454, 1455, 86, 86, 1449, + 1458, 86, 1451, 86, 86, 86, 1453, 163, 1460, 1462, + 86, 86, 1457, 1459, 86, 1461, 1464, 86, 1463, 1465, - 1463, 1464, 1470, 1465, 86, 86, 86, 1466, 86, 86, - 86, 1469, 86, 1474, 86, 86, 168, 86, 1471, 86, - 1479, 1480, 86, 1473, 1482, 86, 86, 86, 1481, 1472, - 86, 1476, 86, 86, 86, 1475, 86, 1477, 86, 1483, - 86, 1490, 1478, 86, 86, 1484, 1487, 86, 86, 86, - 1488, 86, 1485, 1486, 1494, 86, 1489, 1495, 86, 86, - 1497, 1499, 159, 1491, 86, 1493, 1500, 86, 86, 1492, - 1498, 1496, 86, 1502, 86, 86, 1503, 1501, 86, 86, - 1511, 86, 86, 86, 1508, 86, 1504, 1509, 1513, 1505, - 1506, 1510, 86, 1507, 86, 1512, 1514, 86, 1516, 86, + 86, 1466, 1467, 1468, 86, 86, 86, 1472, 1473, 1475, + 1469, 86, 1470, 86, 86, 86, 1474, 86, 86, 1471, + 86, 1479, 86, 86, 86, 168, 1476, 86, 86, 1485, + 1486, 1478, 86, 1488, 86, 86, 86, 1477, 1487, 86, + 1482, 86, 1481, 1480, 86, 86, 86, 1483, 1489, 86, + 86, 1484, 86, 1496, 1490, 86, 86, 1493, 86, 86, + 1494, 1491, 86, 1500, 1492, 1501, 86, 1495, 86, 86, + 1497, 1505, 161, 1503, 1499, 86, 1506, 86, 86, 86, + 1498, 1504, 1502, 86, 1508, 86, 1509, 1507, 86, 86, + 86, 86, 1520, 1510, 1514, 1519, 86, 1515, 1511, 1516, - 86, 86, 1518, 1517, 86, 1521, 1522, 86, 1515, 86, - 86, 1519, 86, 86, 86, 1525, 86, 1520, 86, 86, - 1530, 86, 86, 86, 1534, 1523, 1531, 1527, 86, 1524, - 86, 86, 1526, 1533, 1528, 1535, 1529, 86, 86, 1532, - 86, 86, 86, 86, 86, 1537, 1541, 1536, 1543, 1542, - 86, 86, 1538, 1539, 86, 1546, 86, 86, 86, 1540, - 1545, 1551, 1544, 86, 1550, 1547, 1548, 86, 1552, 1554, - 86, 86, 1553, 86, 86, 86, 1549, 1555, 86, 1559, - 1560, 1561, 86, 1558, 86, 86, 86, 86, 1565, 1556, - 86, 1562, 86, 1563, 1564, 86, 1557, 86, 86, 86, + 1512, 86, 86, 1513, 1517, 1518, 1522, 1521, 86, 86, + 86, 1523, 86, 86, 86, 86, 86, 86, 1527, 1528, + 86, 86, 1531, 86, 86, 86, 1536, 1524, 1526, 86, + 86, 86, 1540, 1529, 1537, 1525, 1530, 1533, 86, 1534, + 1532, 86, 1535, 86, 86, 86, 86, 1538, 86, 86, + 1539, 86, 86, 1541, 1547, 86, 1549, 86, 1543, 1548, + 1544, 1545, 1542, 86, 1552, 86, 1551, 1546, 86, 86, + 86, 1556, 1557, 1550, 86, 1558, 86, 1554, 86, 86, + 1553, 86, 1560, 86, 86, 1561, 86, 1565, 1559, 1555, + 1566, 1564, 1562, 86, 1567, 86, 86, 86, 1568, 1571, - 1567, 86, 86, 86, 1572, 86, 1566, 86, 86, 1571, - 1568, 86, 86, 1569, 1578, 1574, 1570, 1575, 1580, 1579, - 86, 86, 1576, 1581, 86, 1573, 86, 1583, 86, 86, - 1577, 86, 86, 86, 86, 86, 1591, 1587, 86, 86, - 1586, 1582, 86, 1592, 1594, 86, 86, 1584, 1585, 86, - 86, 1597, 1588, 1590, 1589, 1596, 86, 86, 86, 86, - 86, 86, 86, 86, 1595, 1593, 86, 1603, 86, 1605, - 86, 86, 1613, 1606, 1612, 1598, 1602, 1599, 1600, 1601, - 86, 1604, 86, 1607, 1608, 86, 1609, 86, 86, 86, - 86, 86, 86, 1610, 1611, 1614, 86, 1619, 1615, 86, + 86, 86, 1569, 1570, 86, 1563, 86, 86, 86, 86, + 86, 86, 86, 1578, 86, 1572, 86, 1577, 86, 86, + 1574, 86, 86, 1575, 1580, 1573, 1576, 1581, 86, 1589, + 1584, 86, 1582, 86, 1579, 1585, 86, 1586, 1583, 86, + 86, 1588, 1587, 86, 86, 1593, 86, 86, 1592, 1597, + 1590, 86, 1591, 86, 1600, 86, 1598, 86, 86, 86, + 86, 1603, 86, 1594, 1602, 1596, 1595, 86, 86, 86, + 86, 86, 86, 1611, 86, 159, 1601, 86, 1604, 1599, + 1612, 1605, 86, 86, 1608, 1614, 86, 1606, 1607, 1610, + 1615, 86, 1609, 86, 1613, 86, 1618, 86, 1616, 1617, - 1621, 86, 1616, 1623, 86, 86, 1620, 1618, 1625, 86, - 1624, 86, 1627, 86, 86, 1617, 1628, 1622, 86, 86, - 86, 86, 1629, 1630, 1626, 1634, 1635, 86, 86, 86, - 86, 86, 86, 1631, 1640, 1638, 86, 1639, 1632, 86, - 86, 1633, 1642, 86, 86, 86, 1636, 1643, 1644, 86, - 1637, 86, 1641, 86, 1647, 1645, 86, 86, 1650, 86, - 86, 1646, 86, 86, 86, 1649, 86, 1654, 86, 1656, - 86, 86, 86, 1648, 1651, 1657, 86, 1661, 1655, 86, - 86, 1652, 1653, 86, 86, 86, 1659, 1667, 1658, 1664, - 1666, 86, 86, 1662, 86, 1669, 86, 1660, 1663, 86, + 86, 86, 86, 1621, 86, 86, 1619, 1622, 86, 86, + 1625, 1629, 86, 1620, 86, 1631, 86, 1626, 86, 1630, + 1623, 86, 1624, 86, 86, 1628, 86, 86, 1627, 1634, + 1635, 1632, 86, 86, 1640, 86, 1633, 1636, 1637, 86, + 86, 1641, 86, 86, 1646, 1638, 86, 1645, 1644, 86, + 86, 86, 1639, 1642, 1648, 86, 86, 1650, 86, 1649, + 1643, 86, 86, 86, 86, 1653, 86, 1651, 86, 1647, + 86, 1656, 86, 1655, 86, 86, 86, 1652, 86, 1660, + 86, 1657, 86, 1654, 86, 1662, 86, 1663, 86, 1658, + 1661, 1659, 86, 1664, 86, 1665, 86, 1667, 86, 1670, - 1665, 86, 86, 86, 168, 1672, 1675, 86, 1674, 86, - 1671, 86, 1668, 86, 86, 86, 86, 1683, 1670, 86, - 1676, 1673, 86, 86, 1684, 1678, 86, 1677, 1681, 1687, - 86, 86, 1679, 1680, 86, 1688, 1689, 86, 1693, 1691, - 1682, 86, 1685, 1686, 86, 86, 1692, 1695, 86, 1697, - 86, 86, 86, 86, 1690, 86, 86, 86, 1699, 86, - 1700, 86, 1696, 86, 1702, 1694, 86, 1703, 86, 86, - 1698, 1704, 1707, 86, 1708, 86, 1706, 1705, 86, 86, - 1701, 86, 1712, 1715, 1717, 1713, 1709, 1710, 86, 86, - 86, 86, 86, 1716, 1723, 86, 1720, 1714, 1711, 1719, + 1668, 1672, 86, 86, 86, 86, 1669, 1666, 1673, 86, + 1675, 86, 1674, 1671, 86, 1678, 1677, 86, 1681, 86, + 168, 86, 1680, 86, 86, 1676, 86, 86, 86, 86, + 1690, 86, 86, 1679, 1682, 86, 1683, 1691, 1685, 1694, + 86, 1684, 1688, 86, 86, 1686, 1687, 86, 1696, 86, + 86, 1692, 1689, 1695, 86, 1693, 1698, 86, 1700, 1702, + 86, 86, 1699, 86, 86, 86, 86, 1697, 1707, 1701, + 1704, 86, 1706, 86, 1703, 86, 1709, 86, 1710, 86, + 1705, 86, 86, 86, 86, 1714, 86, 1715, 86, 86, + 1722, 86, 86, 1711, 1724, 86, 86, 1708, 1713, 1712, - 1718, 86, 1724, 1725, 1722, 86, 86, 1727, 86, 86, - 1726, 86, 1728, 1729, 86, 86, 86, 1721, 86, 86, - 1730, 86, 86, 1736, 1737, 1735, 86, 1731, 86, 86, - 86, 1738, 1739, 86, 1732, 86, 86, 1733, 86, 86, - 1741, 1734, 1742, 86, 1743, 86, 86, 86, 86, 86, - 86, 1740, 86, 1745, 1744, 86, 1752, 1753, 86, 86, - 1747, 1748, 1749, 1758, 86, 1746, 86, 1750, 86, 86, - 86, 1755, 86, 86, 86, 1751, 1756, 1754, 86, 1757, - 1764, 86, 86, 86, 86, 86, 1760, 1762, 1759, 1766, - 86, 1768, 1761, 86, 1767, 1763, 86, 1770, 1765, 86, + 1717, 86, 1716, 86, 1719, 86, 86, 1720, 1723, 1718, + 1725, 1727, 86, 1739, 1726, 1729, 1731, 1728, 1732, 1721, + 1730, 86, 86, 86, 86, 86, 1734, 1736, 1733, 86, + 1735, 86, 86, 86, 86, 86, 1737, 86, 1743, 86, + 1742, 1744, 86, 86, 86, 1738, 1746, 86, 1745, 86, + 1749, 86, 86, 1740, 1748, 1741, 86, 86, 86, 86, + 1751, 1750, 1747, 86, 86, 86, 86, 86, 86, 86, + 1760, 1759, 86, 1754, 86, 3299, 86, 1752, 1753, 1755, + 1756, 1757, 86, 86, 1762, 1765, 1763, 86, 1761, 1758, + 86, 86, 86, 1771, 86, 1764, 1766, 86, 86, 1767, - 1769, 86, 86, 86, 86, 86, 86, 86, 1773, 1775, - 1782, 86, 1776, 86, 1772, 1777, 1774, 1771, 1783, 86, - 1778, 1779, 1784, 86, 86, 1785, 1780, 1787, 86, 1786, - 1781, 1788, 86, 86, 86, 86, 86, 86, 86, 1791, - 1792, 1789, 86, 86, 1800, 86, 86, 1795, 86, 86, - 86, 86, 1790, 1794, 1797, 1793, 86, 1798, 1799, 1801, - 86, 1796, 1806, 1802, 1803, 86, 1804, 86, 86, 86, - 1805, 86, 1810, 86, 86, 86, 1814, 1807, 86, 1813, - 86, 86, 1812, 1818, 86, 1811, 1809, 86, 86, 1822, - 1815, 86, 1808, 1816, 1823, 86, 1817, 86, 1819, 86, + 86, 86, 1775, 1773, 1769, 86, 86, 1768, 86, 86, + 86, 86, 1774, 1770, 86, 86, 86, 1772, 86, 1780, + 1776, 1782, 1777, 86, 86, 1783, 1781, 1779, 1784, 86, + 1778, 1785, 1789, 1786, 1790, 86, 1791, 86, 1787, 86, + 86, 86, 1793, 1794, 1795, 86, 86, 86, 1788, 86, + 86, 1792, 1798, 86, 1796, 1799, 86, 86, 86, 1808, + 86, 86, 86, 86, 86, 1797, 1802, 1804, 1800, 1801, + 1805, 1806, 1807, 86, 86, 1803, 1810, 86, 86, 86, + 86, 1809, 1811, 86, 1817, 86, 86, 1812, 86, 1814, + 1813, 86, 1821, 1820, 86, 1819, 86, 86, 1816, 1825, - 1828, 86, 1820, 1825, 1827, 1821, 86, 1830, 86, 1831, - 1833, 1824, 86, 1826, 86, 86, 86, 1832, 86, 1829, - 1834, 86, 1837, 86, 86, 1841, 86, 1839, 86, 86, - 86, 86, 86, 1840, 1842, 1836, 1838, 86, 1835, 86, - 1845, 86, 86, 86, 1851, 86, 1846, 1853, 1843, 1844, - 86, 86, 1847, 86, 1848, 1854, 1849, 1850, 1856, 86, - 86, 86, 86, 1855, 86, 86, 1852, 1861, 86, 86, - 86, 1857, 86, 86, 1865, 86, 1867, 1860, 1858, 86, - 86, 1859, 168, 86, 1863, 1868, 86, 1862, 1864, 1866, - 86, 1869, 1871, 86, 1873, 1870, 1875, 86, 86, 86, + 86, 1818, 86, 86, 1815, 1823, 1822, 1829, 1824, 86, + 86, 86, 1830, 86, 3299, 1826, 1834, 1831, 86, 1835, + 1828, 1827, 1837, 86, 1832, 86, 86, 1838, 1840, 86, + 86, 1839, 1833, 86, 86, 1841, 1836, 86, 1844, 86, + 86, 1848, 86, 1846, 86, 86, 86, 86, 86, 1847, + 1842, 1843, 1845, 1849, 86, 86, 1852, 86, 86, 86, + 86, 1850, 86, 1853, 86, 1851, 1858, 86, 1854, 1860, + 1855, 1861, 1856, 1857, 86, 86, 86, 86, 1863, 86, + 1864, 1866, 1865, 86, 1868, 86, 86, 1862, 1859, 1867, + 86, 1872, 86, 86, 86, 86, 86, 86, 1874, 168, - 86, 86, 1872, 1879, 86, 86, 86, 86, 1874, 86, - 86, 1877, 1881, 86, 1886, 1880, 86, 1876, 1882, 1878, - 86, 1883, 86, 1890, 86, 1887, 1884, 86, 1889, 86, - 1885, 86, 1891, 86, 1888, 1892, 86, 1895, 1893, 1897, - 1894, 1896, 86, 86, 86, 86, 1898, 86, 1899, 86, - 86, 86, 86, 86, 86, 86, 86, 1904, 1905, 86, - 86, 1909, 86, 1906, 86, 1917, 86, 1900, 1902, 1903, - 1908, 1901, 1907, 1910, 86, 86, 86, 1916, 1918, 1912, - 1913, 1915, 86, 86, 86, 86, 1911, 1914, 86, 86, - 86, 1924, 86, 86, 1927, 1919, 1928, 86, 1929, 86, + 1875, 1870, 1876, 86, 1871, 1869, 86, 86, 1877, 86, + 86, 1881, 86, 1873, 86, 1878, 1880, 1883, 86, 1879, + 1887, 86, 86, 86, 1882, 86, 1885, 86, 86, 1884, + 1889, 1886, 86, 86, 1894, 86, 1888, 1890, 86, 1891, + 86, 1898, 86, 86, 1897, 1895, 1899, 1892, 1900, 86, + 86, 86, 1893, 1896, 86, 1901, 1903, 1904, 86, 86, + 1902, 1906, 86, 86, 86, 86, 1905, 1907, 86, 86, + 86, 86, 86, 86, 1912, 86, 1913, 86, 86, 86, + 86, 1914, 1917, 1908, 1921, 1915, 1910, 1909, 1911, 1918, + 1916, 1922, 86, 86, 1925, 86, 86, 1923, 1920, 1926, - 86, 1920, 86, 1921, 1922, 1923, 1925, 86, 1926, 86, - 1930, 1931, 86, 86, 1932, 1935, 86, 86, 86, 1937, - 1938, 1933, 1936, 1934, 1939, 86, 1941, 1940, 86, 86, - 86, 86, 86, 86, 1943, 1944, 86, 86, 1946, 1947, - 86, 86, 86, 86, 1951, 86, 86, 1950, 1953, 1945, - 1952, 86, 1948, 1942, 86, 86, 86, 1961, 1954, 1955, - 1956, 86, 1949, 86, 1963, 1957, 86, 86, 86, 1964, - 86, 1958, 86, 1959, 1967, 86, 1960, 1970, 86, 1968, - 1965, 1962, 1966, 86, 86, 86, 86, 1971, 1974, 86, - 1969, 86, 1976, 86, 86, 86, 1979, 1980, 86, 86, + 86, 86, 1919, 86, 86, 86, 3299, 86, 1924, 1932, + 86, 86, 1935, 1936, 86, 1937, 86, 1927, 86, 1928, + 1930, 1929, 86, 1931, 1933, 86, 1934, 1939, 86, 86, + 1940, 1943, 86, 86, 1945, 1947, 86, 1944, 1938, 1946, + 86, 86, 86, 1941, 1949, 86, 1942, 86, 86, 86, + 86, 1951, 1952, 86, 1954, 1955, 86, 86, 86, 86, + 1948, 86, 1959, 86, 1958, 1961, 86, 1953, 1960, 86, + 1950, 86, 1956, 86, 86, 86, 86, 86, 1969, 1957, + 2017, 1962, 1963, 1964, 86, 86, 1966, 1971, 1965, 86, + 1973, 1967, 1972, 86, 1968, 1970, 86, 86, 1975, 1978, - 1982, 86, 86, 86, 1972, 86, 1973, 86, 86, 1987, - 1988, 86, 1975, 1977, 1984, 86, 1978, 1985, 86, 1981, - 86, 86, 86, 86, 1986, 86, 1994, 1983, 1989, 1991, - 1992, 86, 86, 1990, 1998, 86, 86, 1997, 2001, 2002, - 86, 2003, 86, 2000, 86, 86, 1993, 1996, 86, 1995, - 86, 86, 86, 2004, 86, 1999, 86, 86, 86, 2005, - 2009, 86, 2012, 2013, 2008, 86, 2014, 86, 86, 86, - 86, 2006, 86, 2007, 2010, 86, 86, 2022, 86, 2017, - 86, 2021, 2016, 86, 2011, 2015, 86, 86, 2019, 3280, - 86, 2026, 2020, 86, 86, 2018, 2027, 86, 2024, 2023, + 1974, 86, 86, 86, 1977, 86, 1982, 86, 1976, 86, + 1979, 86, 1984, 86, 86, 86, 1987, 1988, 86, 86, + 1990, 86, 1980, 86, 1981, 86, 86, 86, 86, 1996, + 86, 86, 1995, 1985, 1992, 1983, 1986, 1993, 86, 1989, + 86, 86, 1998, 86, 86, 2002, 86, 1994, 1991, 2000, + 1999, 86, 1997, 86, 2006, 86, 2005, 86, 86, 2009, + 86, 86, 2010, 2012, 2008, 86, 86, 2001, 86, 2004, + 2011, 86, 2003, 86, 86, 2007, 86, 86, 86, 2020, + 86, 2014, 2013, 2021, 2022, 2015, 2016, 86, 86, 86, + 86, 86, 2025, 86, 2018, 86, 86, 2030, 86, 86, - 2029, 86, 2028, 86, 86, 2025, 86, 2030, 2031, 2033, - 86, 86, 86, 2032, 86, 2034, 2037, 2040, 2035, 86, - 86, 2043, 86, 86, 2042, 2036, 86, 2044, 86, 86, - 86, 86, 2038, 2045, 2039, 2041, 86, 2046, 2050, 86, - 86, 2047, 2051, 86, 2052, 2057, 2048, 2054, 2055, 2053, - 86, 2049, 86, 86, 86, 2059, 86, 86, 86, 86, - 2064, 86, 2056, 2061, 2058, 86, 86, 2066, 2060, 2062, - 168, 86, 86, 86, 86, 2067, 86, 86, 86, 2073, - 2072, 2071, 86, 2063, 2068, 86, 2069, 2065, 2074, 86, - 2070, 2075, 86, 2077, 86, 86, 86, 86, 2116, 86, + 2023, 2029, 2024, 2019, 86, 86, 86, 86, 2026, 2034, + 86, 2027, 2035, 86, 2031, 2028, 2036, 2038, 2033, 2032, + 2037, 86, 86, 2041, 86, 86, 86, 86, 86, 86, + 2048, 2042, 2045, 2039, 86, 86, 86, 86, 2040, 2043, + 2051, 86, 2050, 86, 2052, 2044, 86, 86, 2046, 2047, + 2049, 2053, 86, 86, 2057, 2054, 2058, 86, 2059, 86, + 2060, 2062, 86, 2055, 2063, 2061, 86, 86, 2056, 86, + 86, 86, 2067, 86, 2065, 86, 86, 86, 86, 2064, + 2069, 86, 2072, 2066, 2073, 2068, 2074, 2070, 86, 168, + 86, 86, 86, 86, 2076, 86, 86, 86, 2081, 86, - 2078, 2079, 2076, 2080, 2081, 86, 86, 86, 86, 2083, - 2082, 86, 2085, 86, 2089, 86, 86, 86, 86, 2084, - 2086, 2088, 86, 2091, 86, 2087, 2090, 2092, 86, 2094, - 86, 2093, 86, 86, 86, 86, 86, 86, 86, 2099, - 2101, 2096, 2100, 86, 2095, 86, 86, 2103, 86, 2106, - 86, 2097, 86, 2098, 2102, 86, 86, 2110, 86, 2105, - 2107, 2104, 86, 2111, 2109, 86, 86, 2112, 2108, 2117, - 86, 2115, 86, 2114, 86, 2118, 86, 2113, 86, 2123, - 86, 86, 86, 2125, 86, 86, 2126, 2127, 86, 86, - 2119, 86, 2120, 2121, 2122, 2129, 86, 2128, 2124, 86, + 2075, 2080, 2071, 2077, 2088, 2078, 86, 2082, 2086, 2079, + 2083, 86, 2084, 86, 86, 86, 86, 2085, 86, 86, + 86, 2087, 2089, 2092, 2091, 86, 86, 2090, 86, 2094, + 86, 86, 2098, 86, 86, 86, 2097, 2093, 2095, 86, + 2100, 86, 2096, 2099, 2101, 86, 2103, 86, 2102, 86, + 86, 86, 86, 86, 86, 86, 2108, 2110, 2105, 2109, + 86, 2104, 86, 86, 2112, 86, 2115, 86, 2106, 86, + 2107, 2111, 86, 86, 2119, 86, 2114, 2116, 2113, 86, + 2120, 2118, 86, 86, 2121, 2117, 86, 86, 2124, 86, + 2123, 2126, 86, 86, 2122, 86, 2127, 86, 2132, 2125, - 2130, 86, 2133, 86, 86, 86, 86, 2132, 86, 86, - 2134, 86, 2137, 86, 2131, 2138, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 2136, 2135, 2146, 2140, 2141, - 2139, 2143, 86, 2142, 86, 2145, 2150, 2151, 86, 2144, - 2147, 86, 2148, 86, 2154, 86, 2149, 86, 2155, 86, - 2152, 2158, 2157, 86, 2153, 86, 86, 86, 86, 86, - 2160, 86, 86, 2161, 2166, 2156, 2162, 86, 2164, 86, - 86, 2159, 2168, 2165, 2170, 86, 2163, 86, 86, 86, - 2173, 86, 86, 2169, 2172, 86, 2167, 2174, 86, 2178, - 2175, 86, 86, 86, 86, 86, 2179, 86, 86, 2176, + 86, 86, 2134, 2128, 86, 2129, 86, 86, 2135, 86, + 2130, 2131, 2136, 86, 86, 2137, 86, 2133, 2138, 86, + 86, 2139, 2141, 2142, 86, 86, 86, 2146, 86, 86, + 86, 2143, 2140, 86, 86, 86, 2144, 2147, 86, 86, + 86, 86, 86, 86, 86, 2145, 2149, 2150, 2151, 2155, + 2152, 2148, 2160, 86, 2159, 2154, 86, 86, 86, 86, + 86, 2157, 2156, 2163, 2164, 2153, 86, 2158, 86, 86, + 2167, 2166, 86, 86, 2161, 86, 86, 2162, 2165, 2170, + 2169, 86, 2171, 86, 86, 86, 2175, 2168, 86, 86, + 2173, 2177, 2179, 86, 2172, 2174, 86, 86, 86, 2182, - 86, 2181, 86, 2171, 2190, 2180, 2184, 86, 2177, 86, - 2185, 2183, 86, 2182, 2188, 2186, 86, 2189, 2187, 86, - 86, 2194, 86, 86, 86, 86, 2196, 2192, 86, 2197, - 86, 86, 2198, 86, 2191, 2193, 2195, 86, 2199, 2203, - 2201, 86, 86, 2202, 2205, 86, 86, 86, 2200, 2206, - 86, 2207, 2210, 86, 86, 86, 86, 2208, 2209, 2211, - 2215, 86, 2204, 86, 86, 2214, 2212, 86, 86, 86, - 86, 86, 86, 86, 86, 2213, 86, 2224, 86, 2225, - 2221, 2216, 2217, 2218, 2219, 2222, 2220, 2226, 86, 2223, - 86, 86, 86, 86, 2227, 86, 2229, 2235, 86, 2230, + 86, 86, 2178, 2181, 2176, 2183, 2184, 86, 86, 2187, + 86, 86, 86, 86, 86, 86, 2188, 86, 2193, 86, + 2190, 86, 2180, 2189, 2197, 2185, 86, 2194, 2186, 2195, + 86, 2192, 2191, 86, 86, 86, 2199, 86, 2198, 86, + 86, 2196, 2203, 86, 86, 2205, 86, 2201, 86, 2204, + 86, 2206, 86, 2200, 86, 2202, 86, 2207, 2209, 2208, + 86, 2210, 2212, 2214, 2211, 2216, 86, 2213, 2215, 86, + 86, 86, 86, 86, 86, 86, 2219, 2220, 2217, 2224, + 86, 86, 2218, 86, 2223, 86, 2221, 86, 86, 86, + 86, 86, 86, 86, 2222, 2233, 2234, 86, 86, 2225, - 86, 2237, 86, 86, 2234, 168, 2231, 2228, 86, 2236, - 2232, 86, 2239, 86, 2243, 2245, 2240, 2246, 2233, 2244, - 86, 86, 2238, 86, 86, 86, 2241, 2242, 2247, 86, - 2250, 86, 2248, 86, 2251, 86, 2255, 86, 86, 2256, - 86, 2259, 86, 3280, 2254, 86, 86, 86, 2252, 2249, - 2260, 2263, 2257, 86, 2261, 2262, 86, 2264, 86, 2253, - 2258, 86, 2265, 86, 86, 86, 86, 86, 2267, 86, - 86, 86, 2270, 86, 86, 2273, 86, 86, 86, 2277, - 86, 2266, 2279, 86, 2280, 2268, 2272, 86, 86, 2275, - 86, 2269, 2271, 2282, 2274, 86, 86, 2276, 86, 86, + 2229, 2226, 2228, 2227, 2230, 2231, 2235, 86, 86, 2232, + 86, 86, 86, 2236, 2238, 86, 2244, 86, 86, 2246, + 86, 2239, 86, 86, 2243, 2240, 2237, 2245, 86, 2241, + 86, 86, 2248, 168, 2253, 2249, 2250, 2242, 2255, 2254, + 86, 2247, 2256, 86, 86, 86, 2257, 86, 86, 86, + 2251, 2260, 86, 2258, 86, 2252, 86, 2261, 2264, 2265, + 86, 86, 2266, 86, 2269, 86, 2267, 2259, 86, 2275, + 86, 2262, 86, 2270, 86, 2271, 2272, 86, 86, 2274, + 86, 2268, 2263, 2273, 2277, 86, 86, 86, 86, 86, + 86, 86, 2276, 2280, 86, 86, 2283, 86, 86, 86, - 2278, 86, 2281, 2284, 2287, 86, 86, 2285, 2290, 86, - 86, 86, 86, 86, 2288, 86, 2283, 2286, 2291, 86, - 86, 86, 86, 2289, 86, 2292, 3280, 86, 86, 86, - 2293, 2304, 2298, 2303, 2296, 2294, 2302, 2295, 86, 2300, - 2297, 2301, 2299, 2305, 86, 86, 86, 86, 86, 2307, - 2306, 2308, 86, 86, 2311, 2312, 86, 86, 86, 2313, - 86, 2309, 2314, 86, 86, 2310, 86, 2317, 2324, 2318, - 2320, 86, 2319, 2315, 2321, 86, 86, 2316, 86, 86, - 86, 2322, 86, 2323, 2327, 86, 2328, 86, 2330, 86, - 86, 86, 2326, 2332, 86, 86, 2335, 86, 86, 2325, + 2287, 2289, 86, 86, 2282, 86, 2278, 2290, 86, 86, + 2285, 86, 2279, 2281, 2292, 2284, 86, 86, 2286, 86, + 2291, 2288, 86, 2294, 2297, 86, 2300, 86, 86, 2295, + 2296, 86, 86, 86, 2293, 2298, 2301, 86, 86, 86, + 86, 86, 86, 2299, 86, 86, 86, 86, 2314, 86, + 2302, 2303, 2308, 2313, 86, 2311, 2304, 2306, 2318, 2310, + 2307, 2305, 2309, 2312, 2315, 86, 86, 86, 2319, 86, + 2317, 2316, 86, 2321, 2322, 86, 86, 86, 2323, 2324, + 86, 86, 2320, 86, 2327, 86, 86, 2330, 86, 2331, + 86, 86, 2325, 86, 2326, 2328, 2332, 86, 2329, 86, - 2334, 2329, 2336, 86, 86, 86, 2333, 86, 2331, 86, - 2342, 86, 2337, 2338, 2341, 86, 2344, 86, 86, 2339, - 86, 86, 86, 2347, 86, 2348, 2340, 2346, 2350, 86, - 86, 86, 2354, 86, 2343, 86, 2345, 86, 86, 86, - 2349, 2351, 86, 2358, 86, 2352, 2359, 86, 86, 2361, - 2353, 86, 86, 2357, 86, 2355, 2364, 86, 86, 86, - 2356, 2360, 86, 2362, 86, 2366, 2363, 86, 2367, 86, - 2371, 86, 2365, 2373, 86, 86, 2372, 2368, 2374, 86, - 2369, 86, 86, 86, 2378, 86, 2377, 2379, 86, 86, - 2370, 86, 86, 2375, 2383, 2376, 2381, 2385, 86, 86, + 2337, 86, 2333, 2338, 86, 2334, 86, 2340, 86, 86, + 86, 2336, 86, 2335, 2342, 86, 86, 2344, 2345, 86, + 2346, 86, 86, 86, 2347, 2339, 86, 2341, 86, 2352, + 86, 2343, 2348, 2351, 86, 86, 2349, 2354, 86, 86, + 86, 2356, 86, 2357, 86, 2350, 86, 2358, 2360, 86, + 86, 2364, 86, 2353, 86, 86, 86, 2355, 86, 2362, + 86, 2361, 2359, 86, 2368, 2369, 86, 86, 2371, 2363, + 86, 2367, 2374, 86, 2365, 86, 86, 2370, 2366, 86, + 86, 86, 2372, 2376, 86, 2373, 86, 2381, 86, 86, + 86, 2383, 86, 2377, 86, 2375, 86, 2382, 2378, 2379, - 86, 2388, 2390, 2386, 86, 2391, 2380, 86, 86, 2382, - 86, 2384, 2389, 86, 2387, 2392, 86, 86, 86, 2395, - 86, 86, 86, 86, 86, 3280, 2394, 2396, 2403, 2393, - 2397, 2398, 2399, 2401, 2400, 2402, 86, 2404, 2407, 86, - 86, 86, 86, 2406, 86, 2405, 86, 2408, 168, 86, - 86, 2415, 86, 2410, 86, 2409, 86, 86, 86, 86, - 2411, 86, 2412, 86, 2422, 2413, 2414, 2417, 2418, 2416, - 86, 86, 86, 2419, 2420, 2421, 2423, 2426, 86, 86, - 2427, 2428, 86, 86, 2425, 2431, 2429, 86, 2432, 86, - 2424, 86, 2430, 86, 86, 2434, 86, 86, 2433, 86, + 86, 2388, 2387, 2384, 86, 86, 86, 2391, 86, 2389, + 2380, 2393, 86, 86, 86, 86, 86, 2390, 2385, 2395, + 2386, 2396, 2398, 2400, 86, 86, 2392, 2397, 86, 86, + 2401, 86, 86, 2406, 2394, 3299, 2399, 2402, 2403, 86, + 86, 86, 2405, 86, 2404, 86, 86, 2411, 2412, 2407, + 2408, 86, 2409, 86, 86, 2413, 86, 86, 2416, 2410, + 86, 2417, 86, 2418, 86, 2415, 2414, 86, 168, 2420, + 86, 2419, 86, 2421, 86, 2426, 86, 86, 86, 86, + 86, 86, 86, 86, 2422, 2427, 2423, 2428, 2424, 2429, + 2425, 86, 2432, 86, 2433, 2430, 2431, 86, 2434, 2437, - 2436, 86, 86, 86, 2440, 2441, 86, 2435, 86, 2437, - 86, 86, 86, 2443, 2444, 2438, 86, 2446, 86, 2445, - 2442, 2439, 86, 2448, 86, 86, 86, 2447, 2449, 86, - 2452, 86, 2451, 2450, 2453, 86, 2455, 86, 2454, 86, - 86, 86, 86, 86, 2462, 2459, 86, 86, 2461, 86, - 86, 86, 2463, 86, 2458, 86, 3280, 2456, 2467, 2457, - 86, 86, 2460, 86, 86, 2464, 86, 2472, 2465, 2471, - 2466, 2473, 2469, 86, 86, 2475, 2468, 2470, 86, 86, - 2474, 86, 2477, 86, 86, 2480, 2478, 86, 2476, 2482, - 86, 2481, 2484, 86, 86, 86, 2486, 86, 86, 86, + 86, 2475, 2435, 86, 2438, 2439, 86, 86, 86, 2436, + 2440, 2442, 2443, 2441, 86, 2445, 86, 86, 86, 86, + 86, 2447, 86, 2444, 86, 86, 86, 2451, 86, 2452, + 86, 86, 3299, 2446, 2448, 86, 2454, 86, 2449, 2461, + 86, 2455, 2453, 2456, 2450, 2457, 86, 86, 2459, 86, + 86, 86, 2458, 2460, 86, 2463, 2464, 86, 86, 86, + 86, 86, 86, 2465, 2466, 86, 2470, 86, 2473, 2462, + 86, 86, 2472, 86, 86, 2469, 2474, 86, 2467, 86, + 2468, 86, 2478, 86, 86, 2471, 86, 86, 2483, 2482, + 2476, 86, 2477, 2480, 86, 2484, 86, 86, 2485, 2481, - 86, 86, 2483, 2485, 86, 2479, 86, 86, 86, 2490, - 86, 2492, 2493, 2488, 2494, 86, 2487, 2489, 2495, 86, - 86, 2496, 86, 2497, 2498, 2500, 2491, 86, 86, 86, - 2503, 86, 2499, 86, 2505, 86, 86, 2508, 86, 86, - 86, 2502, 2504, 86, 86, 86, 2509, 2501, 86, 2512, - 2514, 2507, 86, 2506, 2513, 86, 86, 86, 2510, 86, - 86, 86, 2511, 2518, 2517, 2516, 86, 86, 86, 86, - 2515, 2519, 2522, 3280, 2520, 86, 2525, 86, 2521, 86, - 2524, 2526, 86, 2527, 86, 2528, 86, 2530, 2523, 86, - 86, 2529, 86, 2532, 2531, 86, 2533, 86, 86, 86, + 2479, 86, 2488, 86, 86, 2487, 2486, 2489, 86, 2491, + 86, 2493, 2490, 86, 2492, 2494, 86, 86, 2495, 86, + 2497, 86, 2496, 86, 86, 86, 86, 86, 86, 86, + 2501, 86, 2503, 2504, 2498, 2505, 86, 2499, 2506, 86, + 2500, 2507, 86, 2508, 86, 2509, 86, 86, 86, 2511, + 2514, 86, 2502, 2510, 86, 2516, 86, 86, 2519, 86, + 2513, 86, 86, 2515, 86, 2512, 86, 2520, 86, 2523, + 2524, 86, 2518, 86, 2517, 86, 86, 86, 2525, 86, + 86, 2521, 2528, 86, 2522, 2527, 86, 86, 2529, 86, + 86, 2532, 2533, 2526, 2530, 2535, 86, 2531, 2536, 86, - 2538, 86, 2534, 86, 2540, 86, 2541, 86, 86, 2535, - 86, 86, 86, 86, 86, 2537, 86, 2544, 2536, 2542, - 86, 2547, 2539, 2543, 2545, 2550, 86, 86, 86, 86, - 86, 86, 86, 2546, 2548, 168, 2551, 86, 2558, 86, - 2549, 86, 86, 2554, 86, 86, 2556, 2557, 2559, 2553, - 86, 86, 2569, 86, 2552, 2555, 2560, 2561, 86, 86, - 86, 2565, 2562, 86, 2567, 2566, 86, 2563, 2568, 2570, - 86, 86, 2571, 2564, 86, 2572, 86, 2573, 2574, 86, - 86, 86, 86, 86, 86, 2576, 86, 86, 86, 86, - 2575, 2584, 86, 86, 86, 2577, 2582, 86, 2588, 86, + 2537, 86, 2538, 86, 2539, 86, 86, 86, 2540, 2534, + 86, 2543, 2542, 86, 2544, 86, 86, 86, 86, 2549, + 86, 86, 2551, 86, 2541, 2552, 86, 2545, 2546, 86, + 86, 86, 86, 86, 2548, 86, 2555, 2547, 86, 86, + 2550, 2553, 86, 2554, 2556, 2561, 86, 2558, 2562, 86, + 86, 86, 86, 2557, 86, 2559, 86, 168, 2560, 86, + 2570, 86, 86, 86, 2565, 86, 86, 86, 2567, 2569, + 2564, 2571, 86, 3299, 86, 2563, 2566, 2577, 2568, 2574, + 2572, 2573, 86, 86, 86, 2575, 2578, 2579, 2580, 86, + 2576, 2581, 86, 2582, 86, 86, 2583, 86, 2584, 86, - 2579, 2578, 2589, 86, 2581, 2580, 2583, 86, 2585, 2590, - 2586, 2587, 2593, 86, 86, 86, 2592, 2595, 86, 86, - 86, 2591, 86, 2594, 86, 86, 86, 2598, 86, 2604, - 86, 2605, 86, 2596, 86, 86, 86, 2597, 86, 2599, - 2600, 86, 2602, 2601, 2608, 2609, 86, 2603, 2610, 86, - 2611, 2613, 86, 2607, 2606, 86, 86, 86, 86, 2612, - 86, 86, 2616, 86, 86, 2620, 2619, 2621, 86, 2615, - 86, 2614, 2622, 2623, 86, 86, 86, 86, 2617, 86, - 2618, 86, 86, 2624, 2625, 86, 2629, 86, 86, 2627, - 86, 2633, 2634, 86, 86, 2626, 2637, 86, 86, 2628, + 2585, 86, 2586, 86, 86, 86, 86, 86, 2588, 86, + 86, 86, 2587, 2596, 86, 86, 86, 86, 2589, 2594, + 86, 2600, 86, 2591, 2590, 2601, 86, 2593, 2592, 2595, + 86, 2602, 86, 2598, 2597, 2599, 2605, 86, 86, 2604, + 86, 2606, 2607, 86, 2603, 86, 86, 86, 86, 86, + 86, 86, 2610, 2616, 86, 86, 2608, 86, 2609, 2617, + 86, 2611, 86, 2620, 86, 2612, 2613, 2614, 2615, 86, + 2618, 2621, 86, 2619, 2622, 86, 2623, 86, 86, 2625, + 2624, 86, 86, 2628, 86, 86, 86, 86, 2626, 2632, + 2631, 2627, 2633, 86, 86, 86, 2634, 2635, 86, 86, - 2641, 86, 2630, 86, 2631, 2635, 86, 2632, 86, 86, - 2638, 86, 2636, 2639, 86, 2640, 2642, 2646, 86, 86, - 86, 86, 86, 2643, 2649, 2650, 86, 2652, 86, 2644, - 2648, 2647, 86, 86, 2645, 86, 86, 2653, 2657, 86, - 86, 2651, 2654, 86, 2658, 2660, 86, 86, 2656, 86, - 86, 2655, 86, 2665, 86, 86, 2667, 86, 2663, 86, - 2661, 2664, 2659, 2662, 2668, 86, 86, 86, 86, 86, - 2666, 2669, 2671, 86, 86, 86, 2672, 86, 3280, 2670, - 86, 86, 2674, 2675, 86, 2677, 2678, 86, 2673, 2676, - 2680, 86, 2679, 2681, 86, 2682, 168, 86, 86, 86, + 86, 2629, 86, 86, 2630, 2636, 86, 86, 2637, 86, + 86, 2641, 2639, 2645, 2638, 2646, 86, 86, 86, 2649, + 86, 86, 2640, 2642, 86, 2650, 2643, 86, 86, 2644, + 86, 2652, 2647, 2653, 86, 86, 2648, 86, 86, 2651, + 86, 2654, 2658, 86, 86, 2655, 2662, 86, 2661, 2660, + 2659, 86, 2664, 86, 86, 2656, 86, 2657, 86, 2665, + 86, 2669, 86, 86, 2670, 2666, 86, 2672, 86, 86, + 2663, 86, 2668, 3299, 2667, 86, 86, 86, 2677, 86, + 2679, 86, 2673, 86, 2674, 2675, 2676, 86, 2671, 86, + 2678, 86, 2680, 86, 2681, 86, 2683, 2682, 86, 86, - 2687, 86, 2685, 2684, 2683, 2686, 86, 86, 86, 2689, - 86, 86, 2688, 2712, 2690, 2691, 2692, 86, 2693, 86, - 2695, 86, 86, 2697, 2694, 2696, 86, 86, 2698, 86, - 86, 2699, 2700, 2702, 86, 86, 86, 86, 2703, 86, - 2704, 86, 86, 86, 2701, 2705, 86, 2709, 2710, 2707, - 86, 2711, 2706, 86, 86, 2714, 86, 86, 86, 2713, - 2715, 86, 86, 2708, 86, 86, 2717, 2718, 2716, 86, - 86, 2723, 86, 86, 2721, 86, 2719, 2720, 2722, 2726, - 86, 2724, 86, 86, 86, 86, 2727, 2731, 86, 86, - 2732, 2725, 86, 86, 2728, 86, 2736, 86, 86, 86, + 86, 2684, 86, 86, 2689, 86, 86, 2686, 2687, 3299, + 2690, 2692, 86, 2696, 2685, 2693, 86, 2688, 2691, 86, + 2695, 168, 86, 86, 2694, 86, 2700, 2697, 86, 86, + 2702, 86, 86, 2701, 86, 2705, 86, 2706, 86, 2704, + 86, 2698, 3299, 2699, 2708, 86, 2703, 86, 86, 2710, + 2709, 86, 86, 2707, 2711, 86, 2712, 2713, 2715, 86, + 86, 86, 2714, 2716, 86, 2717, 86, 86, 86, 86, + 2718, 2722, 2723, 86, 2724, 2720, 86, 86, 86, 86, + 86, 2719, 86, 2728, 2727, 2725, 86, 86, 86, 2721, + 86, 2730, 2726, 2731, 2729, 86, 86, 86, 86, 2736, - 86, 2734, 2729, 2730, 2740, 2741, 86, 86, 2733, 2743, - 2735, 2744, 2737, 2738, 2745, 86, 86, 86, 86, 2739, - 86, 2746, 86, 2748, 2747, 86, 86, 86, 86, 86, - 86, 2751, 2742, 86, 2749, 86, 2754, 2756, 86, 2750, - 2757, 86, 2752, 86, 2753, 2758, 86, 2759, 2755, 86, - 2761, 86, 86, 2762, 2760, 86, 2765, 2763, 86, 86, - 2768, 2766, 86, 2769, 86, 2770, 86, 2764, 86, 86, - 86, 2771, 86, 2775, 86, 86, 2776, 86, 2767, 2777, - 86, 86, 2772, 2779, 86, 86, 86, 2783, 2773, 86, - 2780, 86, 2774, 86, 2784, 86, 2778, 86, 86, 2786, + 86, 2739, 86, 2733, 2734, 2732, 2735, 86, 2740, 2737, + 86, 86, 86, 86, 2738, 2744, 86, 86, 86, 2745, + 86, 2749, 86, 86, 86, 86, 86, 2747, 86, 2741, + 2753, 2742, 2743, 2754, 86, 2748, 2746, 2756, 2757, 2751, + 2758, 86, 2750, 86, 86, 2752, 86, 2759, 86, 2760, + 86, 86, 86, 2755, 86, 2761, 86, 86, 2764, 86, + 2762, 86, 2767, 2769, 86, 2763, 2770, 86, 2771, 86, + 2765, 86, 2766, 86, 86, 2772, 86, 2768, 2773, 2774, + 86, 2776, 2778, 86, 86, 86, 2781, 2779, 86, 2782, + 86, 2783, 86, 86, 2775, 2777, 2784, 86, 86, 86, - 2782, 2785, 86, 2781, 2787, 86, 86, 2792, 2791, 86, - 86, 2789, 2788, 86, 2794, 2795, 86, 86, 2790, 86, - 86, 86, 2796, 2798, 2800, 86, 2801, 2797, 86, 86, - 86, 2793, 86, 86, 2799, 2804, 86, 2808, 86, 86, - 86, 86, 86, 2810, 2944, 2802, 2803, 2805, 86, 86, - 2807, 2811, 2806, 2809, 86, 2812, 2814, 2815, 2816, 2819, - 86, 2813, 86, 2817, 86, 86, 2820, 86, 2818, 86, - 2821, 86, 2822, 86, 2823, 86, 86, 86, 2824, 86, - 2825, 86, 2828, 86, 86, 86, 2830, 2826, 2834, 86, - 2835, 86, 2831, 86, 86, 86, 2836, 3140, 2829, 2838, + 2788, 86, 86, 2789, 2780, 2790, 86, 86, 2792, 86, + 2785, 86, 86, 86, 2796, 86, 2786, 2797, 86, 2787, + 86, 86, 2791, 2799, 2793, 2798, 2800, 2795, 86, 86, + 2794, 2801, 86, 86, 86, 2806, 86, 86, 2802, 86, + 2805, 86, 2810, 2808, 2809, 86, 86, 86, 2803, 86, + 2812, 86, 86, 2804, 2811, 2814, 86, 2815, 86, 86, + 86, 2807, 86, 2818, 2822, 86, 86, 86, 2816, 2817, + 86, 86, 86, 86, 2813, 2824, 2821, 2819, 86, 2828, + 2820, 2823, 2830, 2825, 2826, 2827, 86, 2831, 86, 2829, + 2833, 86, 2832, 86, 2834, 86, 2835, 86, 2836, 86, - 86, 86, 2827, 86, 2832, 2833, 2840, 86, 2839, 86, - 2842, 86, 2837, 86, 2841, 86, 86, 2847, 86, 86, - 86, 2846, 2843, 2848, 2844, 2845, 86, 2851, 86, 2849, - 86, 86, 2852, 86, 86, 2855, 86, 2854, 86, 2856, - 86, 2850, 86, 2853, 2857, 86, 2858, 86, 86, 86, - 2859, 2862, 86, 86, 86, 86, 2867, 3280, 2861, 86, - 2863, 2865, 86, 2860, 2870, 86, 2868, 86, 2872, 86, - 2871, 86, 86, 2866, 2864, 86, 2869, 2874, 2873, 86, - 2875, 2877, 86, 2876, 2878, 86, 2879, 86, 86, 86, - 86, 2881, 2884, 86, 2882, 2883, 86, 2880, 86, 86, + 2837, 86, 86, 86, 2841, 86, 86, 2839, 86, 86, + 2842, 86, 86, 2844, 2848, 86, 86, 2838, 2845, 2849, + 86, 86, 86, 2840, 2850, 2843, 2852, 86, 86, 2853, + 86, 2846, 2847, 2855, 2851, 2854, 86, 2856, 86, 2857, + 86, 86, 86, 2861, 86, 86, 86, 86, 86, 2858, + 2859, 2862, 2865, 86, 2863, 86, 86, 2866, 86, 86, + 2860, 2864, 86, 2869, 2868, 86, 2867, 2870, 2871, 86, + 2872, 86, 86, 2874, 2875, 86, 86, 86, 86, 2873, + 86, 2876, 2881, 86, 86, 86, 2879, 2877, 86, 2884, + 2885, 86, 2882, 86, 2886, 86, 3299, 86, 2880, 86, - 86, 2885, 2887, 86, 2886, 2889, 86, 2888, 86, 2893, - 86, 2891, 2895, 86, 86, 86, 86, 86, 2896, 86, - 86, 2890, 2897, 86, 2898, 86, 2892, 86, 2899, 2904, - 86, 2901, 86, 86, 86, 2894, 2907, 86, 2902, 2900, - 86, 86, 86, 86, 86, 2903, 2905, 2906, 2912, 2908, - 2911, 86, 2913, 2909, 86, 86, 2917, 86, 86, 86, - 2910, 86, 2915, 2914, 2919, 86, 2920, 86, 2922, 86, - 86, 86, 86, 86, 2927, 86, 86, 2918, 2926, 86, - 2921, 2916, 86, 2931, 2929, 86, 2923, 2924, 2925, 86, - 2934, 86, 86, 86, 2936, 86, 2928, 86, 2930, 2932, + 2887, 2878, 2888, 86, 2883, 86, 2890, 86, 2889, 2891, + 2892, 86, 2893, 86, 2894, 86, 2895, 86, 86, 2896, + 2899, 86, 2897, 2898, 86, 86, 86, 2902, 86, 2900, + 2901, 86, 86, 2904, 2908, 2903, 86, 2906, 86, 86, + 86, 2910, 86, 2911, 86, 86, 86, 2914, 86, 2912, + 2913, 86, 2905, 86, 2907, 86, 2919, 86, 86, 86, + 86, 86, 86, 2909, 2922, 86, 2916, 2915, 2917, 86, + 2923, 2920, 2921, 86, 86, 2918, 86, 2926, 2924, 2927, + 86, 2928, 2929, 86, 2925, 2932, 86, 86, 2934, 86, + 2935, 86, 86, 86, 2930, 2937, 86, 86, 86, 86, - 86, 86, 2937, 2939, 86, 2940, 86, 86, 2933, 2942, - 86, 86, 2935, 2947, 2948, 2938, 2945, 86, 86, 86, - 86, 2941, 2951, 86, 86, 86, 2953, 2952, 86, 2943, - 2949, 2946, 2954, 2956, 2957, 86, 2959, 2950, 86, 86, - 86, 2958, 86, 86, 86, 2962, 86, 86, 2955, 2961, - 2965, 86, 2963, 2968, 86, 86, 86, 86, 2960, 86, - 86, 86, 2964, 2973, 86, 86, 86, 2969, 2966, 2967, - 2975, 2977, 86, 2972, 2976, 2970, 2978, 86, 86, 86, - 2974, 86, 86, 2979, 2971, 86, 2981, 2982, 86, 2983, - 86, 2984, 86, 2980, 2987, 2985, 86, 2989, 86, 86, + 86, 86, 2941, 2942, 86, 86, 2933, 86, 2946, 2931, + 86, 86, 2945, 2936, 2938, 2939, 2940, 2949, 86, 86, + 2951, 2943, 86, 86, 2947, 3299, 86, 2952, 2944, 86, + 2948, 2954, 86, 2955, 86, 2957, 86, 86, 86, 2950, + 86, 86, 86, 86, 2962, 2953, 86, 2960, 2959, 2956, + 86, 2966, 86, 2964, 86, 2958, 86, 86, 2969, 2968, + 2961, 2963, 86, 2965, 2972, 2975, 2971, 2973, 86, 2967, + 86, 86, 86, 86, 2970, 2974, 86, 2978, 86, 86, + 86, 2977, 2981, 86, 2979, 2984, 86, 86, 86, 86, + 86, 2976, 86, 86, 2989, 86, 2993, 86, 86, 2980, - 86, 2988, 86, 86, 86, 86, 2994, 2995, 86, 86, - 86, 2986, 86, 2999, 86, 3000, 86, 86, 2990, 86, - 3280, 2998, 3001, 2996, 2991, 2992, 2993, 86, 86, 86, - 2997, 86, 3004, 3005, 86, 3006, 86, 3002, 3003, 86, - 3009, 86, 86, 3008, 3007, 86, 86, 3012, 86, 86, - 3011, 3014, 86, 3010, 3013, 86, 86, 3016, 86, 86, - 86, 86, 3018, 86, 86, 3015, 3019, 3017, 86, 86, - 86, 86, 86, 86, 86, 3028, 3029, 3031, 3020, 3024, - 3021, 3022, 3023, 86, 86, 3025, 3026, 3035, 3280, 3032, - 3027, 86, 3030, 3033, 3036, 86, 3034, 3037, 86, 86, + 2982, 2983, 2985, 86, 86, 2986, 2988, 2991, 2994, 86, + 86, 2990, 2996, 2992, 2987, 2995, 86, 2998, 86, 2999, + 86, 2997, 3000, 86, 86, 86, 3003, 86, 86, 3005, + 86, 86, 86, 3004, 86, 86, 86, 3001, 86, 3010, + 3011, 86, 86, 86, 3015, 86, 3006, 3016, 86, 3017, + 3012, 3002, 3014, 3007, 86, 86, 3008, 3009, 86, 86, + 3021, 86, 3013, 86, 3020, 3022, 86, 86, 3023, 3025, + 86, 86, 3028, 86, 3018, 86, 86, 3019, 86, 3027, + 3030, 3024, 3026, 3029, 86, 86, 86, 86, 86, 86, + 86, 3033, 86, 86, 3035, 86, 86, 3036, 86, 3034, - 3039, 86, 86, 3038, 86, 3042, 86, 3040, 3043, 86, - 3044, 3045, 86, 86, 3046, 3047, 3050, 86, 3048, 3049, - 86, 86, 86, 3041, 3051, 86, 86, 86, 86, 3057, - 86, 86, 86, 3056, 86, 86, 3053, 86, 3052, 3059, - 86, 3060, 86, 3061, 86, 3065, 3054, 3055, 3066, 86, - 3062, 3064, 3067, 86, 86, 86, 3058, 3072, 3063, 86, - 3069, 3074, 3073, 86, 86, 86, 86, 86, 3070, 3068, - 86, 3071, 86, 86, 86, 3078, 3082, 3079, 3081, 86, - 3076, 3224, 86, 86, 86, 3084, 86, 3077, 3087, 3075, - 3083, 3280, 3080, 3085, 86, 3086, 86, 3088, 86, 3089, + 86, 86, 86, 86, 3031, 3032, 3045, 3046, 86, 3037, + 3299, 3041, 3038, 3039, 3040, 3042, 3043, 86, 3048, 86, + 86, 3044, 3049, 3047, 86, 3051, 3053, 86, 3050, 3054, + 86, 86, 3052, 3056, 86, 3055, 86, 86, 3059, 86, + 86, 3057, 3060, 86, 3061, 3062, 86, 86, 3063, 3064, + 3067, 86, 3065, 3066, 86, 86, 3058, 3068, 86, 86, + 3071, 86, 86, 3074, 86, 86, 86, 3073, 86, 86, + 3077, 86, 3069, 3070, 86, 3076, 86, 86, 3078, 86, + 3083, 3072, 3081, 3084, 86, 3082, 3079, 3085, 86, 86, + 3075, 86, 3080, 86, 3090, 3092, 3087, 86, 86, 3091, - 86, 86, 3091, 86, 3092, 86, 3093, 86, 3094, 86, - 3090, 3095, 86, 3096, 86, 3097, 86, 86, 3099, 86, - 86, 86, 86, 86, 86, 86, 3098, 3104, 86, 3100, - 86, 86, 86, 3101, 86, 3108, 86, 3107, 3105, 3110, - 86, 86, 3102, 3103, 3106, 3109, 86, 86, 3114, 3112, - 3111, 86, 3117, 86, 3116, 86, 86, 86, 86, 3115, - 3119, 86, 3113, 86, 86, 86, 86, 3118, 86, 3123, - 86, 3127, 86, 3122, 3124, 3120, 3129, 86, 86, 3121, - 86, 3125, 3134, 3128, 3130, 86, 3131, 86, 86, 3133, - 3126, 86, 86, 86, 86, 3132, 86, 86, 3142, 3139, + 86, 86, 3088, 86, 3086, 3089, 86, 86, 86, 3099, + 86, 3096, 3097, 3094, 3100, 86, 3102, 86, 3103, 86, + 86, 3101, 3093, 86, 3095, 3104, 86, 3098, 3105, 3106, + 86, 3107, 86, 86, 3109, 86, 3110, 86, 3111, 86, + 3112, 86, 3108, 3113, 86, 3114, 86, 3115, 86, 86, + 3117, 86, 86, 86, 86, 86, 86, 86, 3116, 3122, + 86, 3118, 86, 86, 86, 3119, 86, 3126, 86, 3125, + 3123, 3127, 86, 86, 3120, 3121, 3124, 3128, 3129, 86, + 86, 3136, 3130, 3131, 86, 3133, 86, 86, 86, 3135, + 86, 3134, 86, 86, 3132, 3138, 86, 86, 86, 86, - 86, 86, 86, 86, 3138, 3136, 86, 86, 3135, 86, - 86, 3141, 86, 3143, 86, 3137, 86, 86, 3146, 3149, - 3144, 3145, 3148, 86, 3150, 86, 3158, 86, 3152, 86, - 3151, 3147, 3154, 86, 3153, 86, 3156, 3157, 86, 3155, - 3159, 86, 86, 3160, 3161, 86, 3162, 86, 3163, 86, - 86, 86, 3165, 3164, 86, 3166, 3167, 3170, 86, 86, - 3168, 86, 86, 86, 3175, 86, 3173, 3176, 86, 3169, - 86, 3172, 3171, 86, 3179, 86, 86, 86, 3182, 86, - 86, 3183, 3174, 86, 3186, 3177, 86, 3187, 86, 86, - 86, 3180, 3178, 86, 3184, 3181, 86, 3192, 86, 86, + 86, 86, 3137, 3142, 3146, 86, 86, 3143, 86, 3141, + 86, 3139, 3148, 86, 3140, 3144, 3149, 86, 3147, 3150, + 86, 86, 86, 86, 3155, 3145, 3153, 86, 3154, 3151, + 3152, 86, 86, 86, 3159, 86, 3158, 86, 3157, 86, + 3161, 86, 86, 86, 86, 86, 3156, 86, 3160, 86, + 3162, 86, 3171, 3168, 3163, 86, 86, 86, 3165, 3164, + 3167, 3169, 3173, 86, 3176, 86, 86, 86, 3166, 86, + 3174, 86, 3170, 3178, 86, 3172, 3177, 86, 3179, 3180, + 86, 3181, 86, 3175, 86, 3182, 86, 3184, 86, 3183, + 86, 3185, 3189, 3186, 86, 86, 3187, 86, 86, 86, - 86, 3189, 3185, 3188, 3191, 3193, 86, 86, 86, 86, - 86, 86, 86, 3197, 86, 3190, 3199, 86, 86, 86, - 86, 3194, 3196, 3204, 86, 3206, 86, 3195, 86, 3205, - 3198, 3200, 3201, 3202, 3207, 86, 3203, 3210, 86, 86, - 86, 3212, 86, 3213, 3211, 3214, 3208, 86, 86, 86, - 86, 3218, 86, 3215, 3209, 3216, 86, 86, 3219, 86, - 86, 3220, 3221, 86, 3222, 86, 86, 3227, 3217, 86, - 86, 3223, 86, 86, 86, 3230, 3231, 86, 86, 86, - 86, 86, 86, 3229, 3225, 3226, 3234, 3232, 3228, 86, - 3233, 3235, 86, 3237, 86, 3238, 86, 3239, 3236, 86, + 3194, 86, 3192, 3195, 86, 3188, 86, 3191, 3190, 86, + 3198, 86, 86, 86, 3201, 86, 86, 3202, 86, 3193, + 86, 3196, 86, 3205, 3206, 86, 3203, 3199, 3197, 86, + 86, 3200, 86, 3211, 86, 86, 3207, 86, 3208, 3204, + 3210, 3212, 86, 86, 86, 86, 86, 86, 3216, 86, + 86, 3209, 3218, 86, 86, 3223, 86, 86, 3213, 3215, + 3225, 86, 3224, 3214, 86, 86, 3217, 3220, 3219, 3221, + 86, 86, 3222, 3229, 86, 3231, 3230, 86, 3232, 86, + 86, 86, 86, 3227, 3226, 3233, 86, 3234, 3237, 3228, + 86, 3235, 3238, 86, 86, 3239, 3240, 86, 3236, 86, - 3242, 86, 3240, 86, 3244, 86, 3245, 86, 3241, 86, - 3249, 86, 3246, 86, 86, 3243, 3247, 86, 3250, 3251, - 3248, 3252, 86, 86, 86, 86, 86, 86, 3258, 86, - 3253, 3254, 3256, 3255, 86, 86, 86, 86, 86, 3260, - 3261, 86, 3264, 86, 3257, 3259, 3265, 86, 86, 3268, - 3269, 86, 86, 3271, 86, 3262, 3263, 3266, 86, 3270, - 3272, 86, 3267, 86, 86, 3273, 86, 86, 3274, 3275, - 3278, 86, 3279, 86, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3276, 3277, 47, 47, 47, + 86, 86, 86, 3241, 86, 3246, 86, 86, 3243, 86, + 3249, 86, 3250, 86, 86, 86, 86, 86, 86, 3242, + 3248, 3244, 3253, 3245, 3251, 3247, 86, 3252, 86, 3257, + 86, 3256, 86, 3254, 86, 3255, 86, 3258, 3299, 3259, + 86, 3261, 86, 3263, 86, 3264, 86, 86, 3268, 86, + 86, 3265, 86, 3262, 3266, 3267, 3260, 3269, 86, 86, + 3270, 3271, 86, 86, 86, 86, 3272, 86, 86, 3274, + 3273, 86, 3275, 3277, 86, 86, 3279, 86, 86, 3283, + 3280, 3284, 86, 3276, 3278, 86, 86, 3281, 86, 3287, + 3288, 86, 86, 3290, 86, 86, 3282, 3291, 86, 3289, + + 86, 86, 3292, 86, 3285, 3286, 3293, 86, 3294, 3297, + 86, 3298, 86, 3299, 3299, 3299, 3299, 3299, 3299, 3295, + 3299, 3299, 3299, 3299, 3299, 3299, 3296, 47, 47, 47, 47, 47, 47, 47, 52, 52, 52, 52, 52, 52, - 52, 57, 57, 57, 57, 57, 57, 57, 63, 63, 63, 63, 63, 63, 63, 68, 68, 68, 68, 68, 68, 68, 74, 74, 74, 74, 74, 74, 74, 80, - 80, 80, 80, 80, 80, 80, 89, 89, 3280, 89, - 89, 89, 89, 158, 158, 3280, 3280, 3280, 158, 158, - 160, 160, 3280, 3280, 160, 3280, 160, 162, 3280, 3280, - 3280, 3280, 3280, 162, 165, 165, 3280, 3280, 3280, 165, - 165, 167, 3280, 3280, 3280, 3280, 3280, 167, 169, 169, - 3280, 169, 169, 169, 169, 172, 3280, 3280, 3280, 3280, - 3280, 172, 175, 175, 3280, 3280, 3280, 175, 175, 90, + 80, 80, 80, 80, 80, 80, 89, 89, 3299, 89, + 89, 89, 89, 158, 158, 3299, 3299, 3299, 158, 158, + 160, 160, 3299, 3299, 160, 3299, 160, 162, 3299, 3299, - 90, 3280, 90, 90, 90, 90, 17, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280 + 3299, 3299, 3299, 162, 165, 165, 3299, 3299, 3299, 165, + 165, 167, 3299, 3299, 3299, 3299, 3299, 167, 169, 169, + 3299, 169, 169, 169, 169, 172, 3299, 3299, 3299, 3299, + 3299, 172, 175, 175, 3299, 3299, 3299, 175, 175, 90, + 90, 3299, 90, 90, 90, 90, 17, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299 } ; -static const flex_int16_t yy_chk[6448] = +static const flex_int16_t yy_chk[6488] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2224,18 +2235,18 @@ static const flex_int16_t yy_chk[6448] = 5, 3, 6, 24, 4, 24, 24, 5, 24, 6, 7, 7, 7, 7, 24, 7, 8, 8, 8, 8, 33, 8, 7, 9, 9, 9, 26, 26, 8, 10, - 10, 10, 19, 29, 9, 33, 19, 29, 3288, 35, + 10, 10, 19, 29, 9, 33, 19, 29, 3307, 35, 10, 11, 11, 11, 11, 11, 11, 13, 13, 13, 13, 34, 13, 11, 35, 99, 34, 29, 38, 13, 51, 51, 11, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 99, 14, 12, 15, 15, 15, 38, 23, 14, 23, 23, 12, 23, 46, 15, 16, 16, - 16, 23, 23, 25, 27, 27, 25, 25, 2682, 16, + 16, 23, 23, 25, 27, 27, 25, 25, 2695, 16, 25, 46, 27, 30, 30, 25, 27, 56, 40, 27, 56, 73, 31, 31, 25, 28, 67, 67, 30, 32, 28, 31, 40, 32, 28, 73, 32, 28, 92, 28, - 28, 92, 31, 32, 1078, 32, 36, 36, 37, 37, + 28, 92, 31, 32, 1082, 32, 36, 36, 37, 37, 28, 45, 45, 37, 175, 36, 45, 39, 41, 41, 45, 36, 39, 41, 94, 36, 39, 43, 43, 37, @@ -2251,9 +2262,9 @@ static const flex_int16_t yy_chk[6448] = 104, 114, 111, 113, 108, 110, 110, 113, 116, 115, 112, 109, 117, 110, 115, 117, 119, 118, 117, 120, - 123, 114, 116, 118, 120, 126, 121, 122, 732, 121, + 123, 114, 116, 118, 120, 126, 121, 122, 734, 121, 125, 117, 117, 121, 123, 119, 124, 125, 126, 128, - 124, 127, 118, 129, 120, 732, 122, 130, 127, 121, + 124, 127, 118, 129, 120, 734, 122, 130, 127, 121, 131, 122, 128, 132, 131, 133, 134, 135, 135, 136, 133, 139, 137, 129, 133, 130, 137, 138, 143, 140, 142, 132, 144, 148, 143, 137, 134, 141, 147, 136, @@ -2315,616 +2326,620 @@ static const flex_int16_t yy_chk[6448] = 375, 376, 371, 378, 401, 379, 367, 368, 368, 369, 368, 372, 370, 373, 379, 376, 375, 382, 378, 380, - 383, 381, 384, 368, 380, 380, 368, 381, 368, 386, - 368, 377, 385, 377, 377, 388, 387, 384, 382, 383, - 389, 385, 387, 377, 390, 377, 377, 377, 386, 391, - 377, 392, 393, 394, 395, 391, 392, 396, 390, 391, - 389, 388, 396, 397, 398, 399, 399, 400, 402, 395, - 398, 403, 393, 394, 392, 404, 405, 403, 397, 406, - 407, 407, 402, 407, 406, 408, 409, 400, 410, 411, - 417, 413, 405, 413, 413, 414, 419, 415, 418, 414, - 404, 415, 409, 411, 410, 408, 416, 416, 420, 417, - 421, 413, 419, 418, 422, 423, 415, 426, 425, 424, + 383, 384, 164, 368, 380, 380, 368, 388, 368, 381, + 368, 377, 385, 377, 377, 381, 384, 386, 382, 383, + 389, 385, 381, 377, 390, 377, 377, 377, 387, 391, + 377, 393, 392, 388, 387, 391, 386, 392, 390, 391, + 389, 394, 395, 396, 397, 400, 398, 404, 396, 399, + 399, 393, 398, 402, 403, 392, 408, 395, 405, 397, + 403, 394, 409, 406, 410, 400, 162, 402, 406, 411, + 407, 407, 404, 407, 405, 417, 408, 418, 409, 413, + 410, 413, 413, 411, 414, 415, 416, 416, 414, 415, + 419, 420, 418, 421, 417, 424, 422, 423, 541, 413, - 423, 428, 426, 422, 421, 424, 420, 425, 423, 423, - 428, 427, 423, 423, 422, 427, 422, 429, 430, 431, - 432, 435, 434, 429, 432, 431, 433, 434, 164, 433, - 436, 436, 437, 438, 438, 439, 440, 441, 441, 430, - 439, 435, 442, 443, 444, 437, 445, 443, 442, 440, - 446, 447, 448, 448, 449, 446, 447, 450, 451, 444, - 452, 448, 453, 455, 454, 453, 449, 445, 454, 456, - 456, 458, 452, 457, 460, 455, 451, 450, 457, 459, - 459, 462, 462, 463, 470, 464, 465, 466, 467, 471, - 469, 472, 458, 464, 476, 465, 460, 473, 477, 476, + 541, 424, 423, 425, 415, 422, 419, 421, 426, 420, + 423, 423, 425, 426, 423, 423, 422, 427, 422, 428, + 429, 427, 430, 431, 435, 437, 429, 432, 428, 431, + 433, 432, 434, 433, 436, 436, 439, 434, 437, 438, + 438, 439, 440, 430, 435, 441, 441, 442, 443, 444, + 445, 446, 443, 442, 447, 440, 446, 448, 448, 447, + 449, 450, 451, 452, 444, 453, 448, 455, 453, 454, + 458, 445, 449, 454, 460, 452, 456, 456, 457, 455, + 451, 450, 463, 457, 459, 459, 462, 462, 466, 464, + 465, 458, 467, 469, 470, 471, 460, 464, 490, 465, - 467, 162, 470, 473, 463, 472, 474, 466, 469, 471, - 469, 475, 477, 478, 480, 474, 479, 475, 481, 479, - 482, 478, 483, 485, 478, 486, 482, 484, 480, 485, - 484, 487, 488, 481, 489, 491, 487, 490, 492, 486, - 491, 490, 483, 493, 494, 495, 496, 485, 493, 499, - 537, 502, 500, 492, 488, 489, 503, 501, 504, 496, - 494, 501, 504, 506, 495, 497, 497, 500, 537, 499, - 502, 497, 503, 497, 508, 507, 514, 505, 506, 497, - 507, 497, 505, 509, 497, 497, 505, 511, 510, 513, - 508, 497, 509, 508, 510, 512, 514, 516, 512, 510, + 472, 473, 490, 463, 467, 477, 160, 473, 466, 474, + 475, 469, 470, 469, 472, 471, 475, 476, 474, 477, + 478, 479, 476, 480, 479, 481, 482, 483, 478, 485, + 484, 478, 482, 484, 486, 485, 487, 480, 488, 491, + 481, 487, 489, 492, 491, 493, 494, 483, 486, 495, + 493, 496, 499, 485, 502, 501, 500, 504, 492, 501, + 488, 504, 494, 489, 496, 503, 158, 509, 495, 497, + 497, 500, 499, 502, 507, 497, 509, 497, 506, 507, + 508, 503, 505, 497, 511, 497, 510, 505, 497, 497, + 513, 505, 510, 506, 514, 497, 508, 510, 512, 508, - 515, 515, 518, 511, 517, 517, 519, 521, 520, 522, - 523, 524, 513, 525, 526, 523, 160, 518, 519, 527, - 524, 529, 516, 520, 530, 527, 521, 531, 530, 526, - 529, 522, 525, 531, 532, 533, 534, 535, 536, 538, - 540, 539, 540, 538, 541, 650, 532, 650, 542, 545, - 533, 535, 547, 536, 539, 534, 542, 543, 543, 544, - 546, 545, 549, 550, 547, 544, 546, 548, 541, 551, - 548, 553, 552, 554, 551, 552, 549, 555, 550, 556, - 553, 567, 555, 555, 557, 557, 567, 553, 564, 554, - 553, 559, 556, 558, 558, 560, 560, 559, 561, 561, + 511, 512, 515, 515, 516, 517, 517, 518, 519, 520, + 522, 521, 523, 513, 514, 525, 524, 523, 526, 529, + 519, 527, 518, 535, 520, 524, 533, 527, 529, 516, + 521, 530, 522, 526, 525, 530, 531, 532, 533, 534, + 531, 536, 535, 532, 537, 538, 539, 540, 542, 543, + 539, 544, 544, 546, 534, 536, 545, 543, 547, 537, + 540, 548, 545, 538, 547, 546, 549, 550, 551, 549, + 552, 553, 542, 548, 553, 552, 554, 555, 557, 558, + 558, 550, 556, 551, 565, 554, 85, 556, 556, 559, + 559, 557, 554, 555, 560, 554, 561, 561, 562, 562, - 562, 565, 563, 568, 569, 571, 562, 563, 563, 564, - 571, 566, 569, 565, 566, 570, 572, 573, 570, 574, - 575, 576, 568, 574, 577, 576, 575, 578, 582, 579, - 580, 580, 578, 581, 584, 583, 573, 585, 586, 572, - 583, 587, 577, 579, 586, 588, 587, 590, 581, 582, - 584, 592, 589, 591, 591, 589, 593, 585, 597, 588, - 589, 594, 595, 589, 589, 590, 594, 595, 596, 592, - 599, 600, 593, 597, 601, 602, 599, 601, 603, 602, - 600, 604, 596, 603, 604, 605, 606, 607, 608, 610, - 605, 609, 611, 615, 610, 608, 612, 612, 613, 614, + 560, 563, 566, 564, 569, 565, 568, 563, 564, 564, + 567, 568, 570, 567, 566, 571, 572, 573, 571, 574, + 570, 572, 575, 569, 576, 577, 575, 578, 579, 577, + 576, 583, 580, 579, 581, 581, 582, 584, 574, 585, + 573, 586, 584, 587, 589, 578, 580, 594, 588, 587, + 591, 582, 583, 588, 590, 585, 593, 590, 589, 592, + 592, 586, 590, 594, 595, 590, 590, 596, 591, 595, + 597, 598, 596, 600, 593, 602, 601, 603, 602, 600, + 605, 603, 604, 605, 597, 601, 598, 604, 606, 607, + 608, 609, 611, 606, 610, 612, 616, 611, 609, 613, - 620, 602, 606, 620, 609, 607, 616, 613, 617, 615, - 618, 619, 611, 624, 623, 616, 618, 619, 614, 623, - 617, 621, 621, 622, 621, 625, 622, 626, 630, 627, - 628, 624, 629, 626, 627, 629, 628, 631, 632, 625, - 637, 633, 631, 632, 632, 634, 635, 638, 640, 636, - 158, 635, 639, 630, 633, 636, 638, 639, 634, 637, - 641, 641, 642, 645, 643, 635, 635, 643, 640, 642, - 644, 649, 646, 647, 651, 645, 644, 646, 647, 647, - 648, 648, 643, 652, 653, 652, 654, 655, 656, 657, - 659, 658, 660, 651, 659, 661, 649, 658, 662, 663, + 613, 614, 615, 603, 617, 607, 618, 610, 608, 631, + 614, 619, 616, 617, 620, 612, 621, 619, 618, 621, + 620, 615, 622, 622, 623, 622, 624, 623, 625, 626, + 627, 624, 628, 629, 631, 630, 627, 628, 630, 629, + 632, 634, 633, 626, 635, 632, 625, 633, 633, 638, + 636, 639, 637, 641, 634, 636, 640, 635, 637, 643, + 639, 640, 642, 642, 644, 645, 643, 644, 638, 636, + 636, 645, 646, 641, 647, 648, 649, 649, 650, 647, + 648, 648, 644, 651, 646, 651, 652, 653, 654, 653, + 655, 656, 657, 658, 659, 660, 664, 662, 661, 660, - 664, 660, 653, 665, 654, 655, 666, 656, 667, 657, - 661, 668, 669, 662, 667, 665, 670, 663, 671, 664, - 673, 666, 672, 674, 669, 668, 672, 675, 676, 677, - 679, 678, 680, 680, 85, 670, 678, 671, 673, 674, - 682, 683, 684, 687, 679, 675, 676, 676, 677, 681, - 685, 686, 683, 681, 689, 685, 684, 688, 690, 682, - 692, 689, 687, 690, 691, 692, 694, 686, 693, 695, - 688, 691, 696, 693, 697, 699, 695, 698, 700, 701, - 703, 696, 701, 700, 694, 702, 698, 699, 697, 702, - 704, 705, 707, 706, 703, 708, 708, 710, 710, 704, + 659, 663, 665, 650, 667, 652, 654, 661, 655, 656, + 666, 657, 662, 658, 664, 669, 663, 668, 670, 667, + 671, 665, 666, 668, 672, 675, 674, 673, 676, 669, + 670, 673, 677, 678, 680, 679, 681, 681, 682, 671, + 679, 675, 682, 672, 674, 683, 676, 684, 680, 685, + 677, 677, 678, 687, 686, 688, 691, 689, 684, 686, + 690, 691, 695, 685, 683, 692, 693, 690, 694, 687, + 689, 693, 692, 694, 688, 696, 697, 698, 699, 702, + 695, 700, 696, 701, 702, 697, 704, 699, 705, 701, + 704, 698, 703, 700, 706, 703, 707, 709, 708, 710, - 709, 709, 712, 711, 714, 716, 705, 706, 711, 709, - 715, 712, 718, 707, 717, 719, 715, 720, 717, 722, - 721, 723, 726, 714, 718, 716, 721, 722, 723, 724, - 725, 729, 735, 736, 740, 720, 739, 738, 744, 736, - 719, 735, 726, 738, 741, 739, 729, 724, 741, 744, - 740, 742, 742, 743, 743, 725, 727, 746, 727, 745, - 747, 727, 750, 748, 80, 727, 751, 750, 727, 748, - 753, 746, 752, 754, 753, 727, 727, 745, 727, 756, - 747, 749, 749, 749, 756, 749, 757, 751, 749, 758, - 752, 755, 759, 749, 75, 755, 762, 754, 760, 749, + 710, 714, 705, 706, 711, 711, 712, 712, 716, 713, + 714, 707, 708, 711, 713, 717, 718, 720, 709, 719, + 721, 717, 722, 719, 723, 724, 726, 716, 725, 720, + 723, 727, 728, 724, 731, 725, 718, 737, 742, 743, + 722, 738, 740, 743, 726, 721, 737, 738, 740, 731, + 746, 741, 728, 747, 742, 749, 727, 729, 748, 729, + 741, 746, 729, 744, 744, 752, 729, 745, 745, 729, + 752, 747, 748, 753, 750, 749, 729, 729, 754, 729, + 750, 751, 751, 751, 756, 751, 755, 757, 751, 760, + 755, 757, 758, 751, 753, 759, 754, 758, 761, 751, - 749, 760, 761, 762, 758, 757, 764, 761, 761, 763, - 763, 755, 773, 765, 766, 766, 776, 759, 765, 767, - 768, 764, 769, 768, 767, 770, 770, 769, 771, 772, - 771, 773, 774, 775, 777, 776, 774, 778, 778, 779, - 782, 772, 777, 780, 781, 781, 784, 783, 842, 785, - 822, 786, 842, 775, 779, 785, 786, 780, 782, 783, - 787, 787, 790, 822, 788, 791, 792, 790, 784, 788, - 788, 791, 792, 793, 794, 796, 795, 797, 793, 795, - 794, 796, 798, 798, 800, 797, 799, 799, 801, 802, - 803, 804, 800, 806, 802, 805, 805, 803, 809, 807, + 751, 80, 762, 764, 760, 762, 763, 757, 756, 766, + 764, 763, 763, 767, 759, 765, 765, 769, 767, 768, + 768, 771, 769, 761, 766, 770, 771, 774, 770, 772, + 772, 773, 775, 773, 776, 777, 779, 778, 776, 774, + 780, 780, 781, 784, 779, 782, 783, 783, 785, 786, + 821, 775, 787, 789, 789, 777, 778, 781, 787, 782, + 785, 784, 788, 790, 821, 792, 793, 788, 790, 790, + 792, 786, 793, 794, 797, 795, 796, 797, 798, 794, + 795, 799, 796, 802, 798, 800, 800, 801, 801, 799, + 803, 802, 804, 805, 806, 807, 807, 804, 808, 811, - 808, 808, 806, 810, 809, 812, 801, 807, 813, 814, - 804, 815, 816, 819, 812, 817, 815, 813, 817, 818, - 820, 816, 810, 821, 818, 823, 825, 819, 824, 824, - 823, 823, 821, 814, 826, 827, 828, 829, 832, 832, - 829, 825, 833, 835, 827, 820, 834, 831, 829, 831, - 836, 834, 837, 826, 838, 839, 840, 841, 74, 843, - 828, 845, 844, 833, 835, 840, 848, 845, 849, 846, - 836, 847, 837, 850, 851, 839, 838, 843, 846, 850, - 841, 844, 849, 847, 852, 848, 853, 853, 851, 852, - 854, 855, 856, 857, 858, 859, 860, 862, 861, 863, + 805, 809, 810, 810, 812, 811, 814, 808, 803, 809, + 815, 816, 817, 806, 822, 814, 818, 817, 819, 815, + 823, 819, 820, 812, 824, 818, 825, 820, 827, 823, + 828, 825, 825, 826, 826, 816, 829, 824, 830, 822, + 833, 831, 833, 827, 831, 829, 834, 834, 835, 828, + 836, 837, 831, 838, 839, 836, 840, 841, 842, 843, + 844, 845, 830, 75, 844, 846, 848, 842, 849, 835, + 847, 850, 837, 838, 839, 848, 847, 841, 840, 845, + 849, 851, 843, 852, 846, 853, 854, 855, 855, 852, + 850, 854, 856, 857, 858, 851, 859, 860, 861, 853, - 855, 857, 864, 862, 866, 863, 872, 865, 873, 870, - 854, 872, 856, 865, 858, 860, 864, 859, 861, 867, - 868, 871, 877, 869, 866, 867, 868, 869, 870, 873, - 874, 874, 875, 871, 876, 878, 879, 876, 875, 880, - 877, 871, 879, 881, 881, 882, 883, 884, 878, 885, - 886, 883, 884, 884, 886, 887, 887, 888, 889, 880, - 890, 891, 893, 882, 885, 890, 898, 894, 897, 896, - 900, 900, 901, 903, 903, 902, 901, 904, 889, 888, - 891, 894, 896, 907, 906, 68, 893, 898, 897, 899, - 902, 905, 899, 909, 899, 905, 908, 907, 899, 906, + 862, 863, 857, 864, 859, 865, 868, 867, 866, 864, + 869, 865, 856, 867, 858, 872, 869, 860, 870, 862, + 861, 863, 866, 871, 870, 873, 868, 871, 874, 875, + 876, 876, 877, 874, 872, 879, 878, 873, 877, 878, + 881, 880, 882, 883, 883, 873, 881, 884, 886, 891, + 875, 885, 887, 879, 880, 888, 885, 887, 887, 889, + 890, 890, 882, 889, 886, 884, 892, 893, 894, 896, + 888, 891, 893, 901, 897, 900, 899, 903, 903, 904, + 906, 906, 905, 904, 907, 909, 892, 894, 897, 899, + 910, 74, 912, 896, 901, 900, 902, 905, 908, 902, - 899, 908, 904, 910, 911, 899, 912, 909, 910, 910, - 899, 913, 916, 911, 914, 913, 915, 917, 918, 919, - 912, 915, 917, 920, 916, 921, 929, 913, 923, 914, - 922, 915, 918, 923, 921, 924, 922, 920, 925, 930, - 919, 924, 926, 926, 925, 927, 928, 931, 929, 933, - 927, 934, 928, 63, 935, 939, 934, 936, 930, 937, - 937, 933, 940, 939, 941, 931, 932, 932, 935, 936, - 938, 942, 932, 943, 932, 938, 940, 945, 944, 946, - 932, 947, 945, 941, 944, 932, 932, 948, 949, 943, - 942, 946, 932, 950, 950, 952, 951, 956, 954, 947, + 909, 902, 908, 911, 910, 902, 912, 902, 911, 907, + 913, 914, 902, 915, 916, 913, 913, 902, 916, 917, + 914, 918, 922, 919, 920, 921, 918, 915, 923, 920, + 916, 924, 925, 932, 917, 919, 918, 933, 925, 921, + 924, 926, 923, 922, 927, 928, 926, 929, 929, 930, + 927, 928, 931, 934, 930, 932, 933, 936, 931, 937, + 938, 940, 940, 939, 937, 941, 944, 943, 942, 936, + 941, 934, 935, 935, 938, 939, 942, 945, 935, 946, + 935, 943, 947, 950, 948, 944, 935, 949, 947, 948, + 951, 935, 935, 952, 955, 946, 945, 959, 935, 949, - 951, 958, 955, 948, 954, 955, 949, 957, 960, 961, - 963, 959, 957, 960, 958, 952, 956, 959, 964, 963, - 965, 967, 968, 966, 970, 971, 969, 964, 961, 966, - 967, 969, 972, 973, 974, 980, 965, 975, 977, 971, - 982, 968, 976, 974, 970, 973, 975, 978, 976, 983, - 985, 980, 972, 978, 982, 977, 984, 987, 986, 993, - 988, 989, 992, 58, 985, 988, 989, 992, 993, 983, - 994, 994, 987, 995, 996, 984, 986, 998, 999, 995, - 1003, 1001, 1001, 999, 999, 1001, 1002, 996, 1004, 1002, - 1005, 1006, 1007, 998, 1003, 1008, 1009, 1010, 1011, 1012, + 954, 950, 953, 953, 954, 958, 951, 957, 958, 961, + 960, 952, 962, 957, 955, 960, 959, 964, 962, 963, + 966, 967, 961, 968, 963, 969, 970, 971, 972, 966, + 967, 969, 973, 972, 974, 970, 964, 975, 976, 968, + 977, 979, 978, 980, 985, 983, 971, 979, 974, 977, + 976, 978, 973, 981, 986, 988, 987, 975, 985, 981, + 980, 983, 989, 990, 996, 991, 992, 995, 999, 988, + 991, 992, 995, 996, 986, 987, 997, 997, 990, 998, + 989, 999, 1001, 1002, 1007, 998, 1004, 1004, 1002, 1002, + 1004, 1005, 1006, 1008, 1005, 1009, 1011, 1010, 1001, 1012, - 1016, 1014, 1009, 1016, 1011, 1007, 1005, 1013, 1004, 1006, - 1008, 1017, 1013, 1018, 1012, 1014, 1019, 1010, 1018, 1020, - 1021, 1019, 1022, 1025, 1023, 1021, 1026, 1022, 1027, 1025, - 1031, 1028, 1017, 1034, 1027, 1020, 1023, 1028, 1029, 1029, - 1030, 1032, 1026, 1035, 1032, 1033, 1033, 1036, 1031, 1030, - 1037, 1034, 1038, 1037, 1039, 1040, 1047, 1046, 1041, 1042, - 1039, 1040, 1035, 1041, 1042, 1038, 1043, 1036, 1044, 1050, - 1050, 1043, 1048, 1053, 1044, 1046, 1047, 1049, 1048, 1051, - 1052, 1054, 1049, 1055, 1056, 1057, 1055, 1056, 1051, 1052, - 1058, 1053, 1059, 1060, 1063, 1061, 1057, 1062, 1065, 1065, + 1013, 1014, 1015, 1016, 1007, 1012, 1006, 1014, 1016, 1008, + 1010, 1011, 1017, 1009, 1020, 1019, 1021, 1015, 1019, 1022, + 1013, 1021, 1023, 1024, 1022, 1025, 1017, 1026, 1024, 1029, + 1025, 1028, 1032, 1032, 1030, 1020, 1031, 1028, 1023, 1026, + 1030, 1033, 1031, 1034, 1035, 1029, 1037, 1035, 1036, 1036, + 1033, 1038, 1039, 1040, 1041, 1044, 1040, 1042, 1049, 1043, + 1044, 1034, 1050, 1042, 1037, 1043, 1045, 1041, 1046, 1047, + 1038, 1045, 1039, 1046, 1051, 1047, 1049, 1054, 1052, 1055, + 1051, 1056, 1050, 1052, 1053, 1053, 1054, 1057, 1055, 1058, + 1059, 1060, 1058, 1059, 1061, 1062, 1063, 1064, 1065, 1056, - 1054, 1061, 1064, 1062, 1059, 1066, 1067, 1064, 1058, 1063, - 1068, 1069, 1060, 1070, 1071, 1069, 1072, 1073, 1075, 1077, - 1067, 1080, 1068, 1071, 1066, 1076, 1076, 1079, 1081, 1082, - 1085, 1070, 1084, 1084, 1082, 1072, 1080, 1075, 1083, 1077, - 1081, 1079, 1073, 1086, 1088, 1087, 1096, 1083, 1089, 1086, - 1085, 1087, 1090, 1089, 1090, 1092, 1091, 1093, 1094, 1095, - 1088, 1091, 1098, 1094, 1099, 1096, 1097, 1101, 1101, 1092, - 1102, 1093, 1103, 1097, 1095, 1105, 1104, 1098, 1106, 1114, - 1107, 1105, 1109, 1099, 1102, 1107, 1109, 1110, 1110, 1116, - 1103, 1104, 1111, 1114, 1107, 1113, 1107, 1111, 1106, 1107, + 1067, 1066, 1060, 1064, 1065, 1067, 1057, 1062, 1068, 1068, + 1069, 1070, 1061, 1072, 1071, 1063, 1066, 1072, 1073, 1074, + 1075, 1076, 1078, 1079, 1079, 1070, 1071, 1080, 1074, 1069, + 1081, 1083, 1080, 1084, 1087, 1085, 1073, 1086, 1089, 1075, + 1092, 1078, 1086, 1087, 68, 1083, 1076, 1085, 1084, 1090, + 1081, 1088, 1088, 1091, 1096, 1090, 1092, 1093, 1089, 1091, + 1095, 1094, 1093, 1094, 1097, 1095, 1098, 1099, 1096, 1100, + 1101, 1098, 1102, 1103, 1105, 1105, 1106, 1101, 1097, 1107, + 1108, 1110, 1099, 1109, 1114, 1114, 1111, 1102, 1100, 1109, + 1106, 1111, 1103, 1121, 1113, 1108, 1117, 1107, 1113, 1115, - 1112, 1112, 1113, 1115, 1117, 1118, 1115, 1119, 1116, 1120, - 1122, 1121, 1119, 1123, 1118, 1122, 1125, 1130, 1124, 1127, - 1127, 1128, 1117, 1121, 1133, 1129, 1128, 1123, 1120, 1124, - 1129, 1131, 1134, 1133, 1132, 1125, 1131, 1130, 1132, 1135, - 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1134, 1143, 1144, - 1139, 1146, 1147, 1137, 1135, 1144, 1140, 1138, 1145, 1136, - 1148, 1149, 1150, 1151, 1141, 1152, 1143, 1142, 1153, 1148, - 1154, 1146, 1147, 1145, 1155, 1151, 1149, 1157, 1159, 1160, - 1158, 1150, 1161, 1157, 1152, 1154, 1163, 1160, 1162, 1164, - 1166, 1163, 1159, 1153, 1155, 1158, 1167, 1185, 1168, 1184, + 1111, 1110, 1111, 1117, 1115, 1111, 1116, 1116, 1118, 1119, + 1120, 1121, 1119, 1123, 1122, 1124, 1125, 1127, 1123, 1126, + 1129, 1128, 1118, 1122, 1126, 1131, 1131, 1134, 1125, 1120, + 1132, 1127, 1128, 1133, 1124, 1132, 1135, 1137, 1133, 1129, + 1136, 1135, 1138, 1139, 1136, 1140, 1137, 1134, 1141, 1143, + 1142, 1144, 1145, 1146, 1147, 1148, 1143, 1138, 1139, 1150, + 1141, 1148, 1149, 1144, 1140, 1142, 1151, 1152, 1153, 1154, + 1155, 1145, 1147, 1156, 1146, 1157, 1152, 1149, 1158, 1150, + 1162, 1159, 1155, 1153, 1161, 1163, 1151, 1165, 1154, 1164, + 1161, 1167, 1156, 1158, 1166, 1162, 1167, 1164, 1169, 1163, - 1165, 1164, 1161, 1171, 1162, 1165, 1165, 1169, 1169, 1166, - 1167, 1168, 1170, 1170, 1172, 1185, 1171, 1170, 1173, 1184, - 1170, 1170, 1181, 1172, 1173, 1170, 1174, 1174, 1175, 1176, - 1177, 1170, 1178, 1175, 1179, 1170, 1177, 1178, 1176, 1179, - 1180, 1180, 1187, 1181, 1182, 1182, 1183, 1186, 1188, 1183, - 1189, 1183, 1190, 1188, 1191, 1192, 1186, 1195, 1193, 1201, - 1191, 1192, 1187, 1193, 1189, 1194, 1195, 1196, 1196, 1194, - 1190, 1195, 1198, 1195, 1201, 1195, 1200, 1195, 1197, 1197, - 1200, 1197, 1202, 1198, 1203, 1204, 1205, 1206, 1208, 1207, - 1204, 1204, 1209, 1203, 1207, 1205, 1210, 1211, 1212, 1213, + 1157, 1159, 1168, 1169, 1169, 1170, 1171, 1165, 1172, 1175, + 1166, 1173, 1173, 1177, 1168, 1178, 1178, 63, 1176, 1177, + 1171, 1172, 1175, 1179, 1170, 1174, 1174, 1176, 1179, 1181, + 1174, 1180, 1182, 1174, 1174, 1181, 1183, 1182, 1174, 1185, + 1180, 1183, 1184, 1184, 1174, 1186, 1186, 1187, 1174, 1188, + 1187, 1192, 1187, 1189, 1190, 1191, 1192, 1207, 1193, 1194, + 1185, 1195, 1196, 1190, 58, 1197, 1207, 1195, 1196, 1188, + 1197, 1189, 1193, 1199, 1198, 1191, 1210, 1194, 1198, 1200, + 1200, 1202, 1199, 1201, 1201, 1205, 1201, 1199, 1206, 1199, + 1204, 1199, 1202, 1199, 1204, 1209, 1208, 1212, 1210, 1214, - 1202, 1209, 1208, 1214, 1214, 1213, 1215, 1216, 1217, 1206, - 1218, 1219, 1212, 1217, 1215, 1210, 1211, 1220, 1221, 1224, - 1219, 1216, 1222, 57, 1218, 1223, 1223, 1222, 1225, 1225, - 1226, 1230, 1226, 1228, 1224, 1220, 1228, 1229, 1231, 1232, - 1232, 1233, 1229, 1221, 1234, 1234, 1236, 1231, 1235, 1235, - 1230, 1236, 1237, 1238, 1239, 1239, 1240, 1241, 1242, 1243, - 1241, 1233, 1244, 1245, 1243, 1245, 1246, 1248, 1249, 52, - 1248, 1244, 1250, 1237, 1238, 1251, 1240, 1250, 1242, 1253, - 1252, 1254, 1258, 1249, 1246, 1252, 1254, 1253, 1255, 1251, - 1256, 1256, 1257, 1255, 1261, 1259, 1260, 1257, 1263, 1264, + 1205, 1208, 1208, 1211, 1209, 1213, 1206, 1215, 1211, 1216, + 1217, 1212, 1218, 1218, 1213, 1220, 1217, 1219, 1214, 1221, + 1222, 1223, 1224, 1216, 1221, 1219, 1215, 1225, 1226, 1220, + 1223, 1227, 1227, 1226, 1222, 1228, 1229, 1229, 1233, 1230, + 1224, 1230, 1232, 1233, 1234, 1232, 1235, 1236, 1236, 1237, + 1228, 1241, 1225, 1238, 1238, 1235, 1239, 1239, 1242, 1240, + 1243, 1243, 1244, 1234, 1240, 1245, 1246, 1248, 1245, 1237, + 1247, 1249, 1241, 1249, 1250, 1247, 1248, 1252, 1253, 1242, + 1252, 1255, 1244, 1254, 1256, 1262, 1246, 57, 1254, 1256, + 1257, 1258, 1250, 1253, 1259, 1255, 1258, 1261, 1257, 1259, - 1258, 1259, 1266, 1260, 1263, 1264, 1265, 1261, 1266, 1267, - 1268, 1265, 1269, 1270, 1270, 1271, 1273, 1274, 1267, 1275, - 1276, 1277, 1278, 1269, 1280, 1281, 1276, 1277, 1278, 1268, - 1280, 1273, 1282, 1283, 1284, 1271, 1285, 1274, 1286, 1281, - 1287, 1287, 1275, 1288, 1289, 1281, 1284, 1290, 1293, 1291, - 1285, 1296, 1282, 1283, 1291, 1294, 1286, 1292, 1292, 1298, - 1294, 1297, 47, 1288, 1299, 1290, 1297, 1297, 1300, 1289, - 1296, 1293, 1301, 1299, 1302, 1303, 1300, 1298, 1306, 1304, - 1306, 1307, 1305, 1313, 1304, 1314, 1301, 1304, 1309, 1302, - 1303, 1305, 1310, 1303, 1309, 1307, 1310, 1311, 1312, 1315, + 1260, 1260, 1261, 1262, 1263, 1264, 1265, 1267, 1268, 1270, + 1263, 1269, 1264, 1267, 1268, 1270, 1269, 1271, 1272, 1265, + 1273, 1274, 1274, 1275, 1277, 1278, 1271, 1279, 1280, 1281, + 1282, 1273, 1283, 1285, 1286, 1281, 1282, 1272, 1283, 1285, + 1278, 1287, 1277, 1275, 1288, 1289, 1290, 1279, 1286, 1291, + 1293, 1280, 1292, 1292, 1286, 1294, 1295, 1289, 1296, 1298, + 1290, 1287, 1301, 1296, 1288, 1297, 1297, 1291, 1299, 1303, + 1293, 1302, 52, 1299, 1295, 1304, 1302, 1302, 1305, 1306, + 1294, 1301, 1298, 1307, 1304, 1308, 1305, 1303, 1315, 1309, + 1310, 1312, 1315, 1306, 1309, 1314, 1316, 1309, 1307, 1310, - 1316, 1317, 1313, 1312, 1312, 1316, 1317, 1318, 1311, 1319, - 1320, 1314, 1321, 1323, 1329, 1320, 1324, 1315, 1325, 1326, - 1326, 1328, 1327, 1331, 1330, 1318, 1327, 1323, 1332, 1319, - 1330, 1333, 1321, 1329, 1324, 1331, 1325, 1334, 1335, 1328, - 1336, 1337, 1338, 1339, 1340, 1333, 1337, 1332, 1339, 1338, - 1343, 1341, 1334, 1335, 1342, 1342, 1345, 1344, 1349, 1336, - 1341, 1347, 1340, 1346, 1346, 1343, 1344, 1347, 1348, 1350, - 1350, 1351, 1349, 1352, 1348, 1353, 1345, 1351, 1354, 1355, - 1356, 1357, 1364, 1354, 1362, 1355, 1356, 1357, 1362, 1352, - 1358, 1358, 1359, 1359, 1361, 1361, 1353, 1363, 1365, 1366, + 1308, 1314, 1311, 1308, 1311, 1312, 1317, 1316, 1318, 1319, + 1320, 1317, 1317, 1321, 1322, 1323, 1324, 1325, 1321, 1322, + 1326, 1329, 1325, 1328, 1330, 1331, 1331, 1318, 1320, 1333, + 1332, 1334, 1335, 1323, 1332, 1319, 1324, 1328, 1335, 1329, + 1326, 1336, 1330, 1337, 1338, 1339, 1340, 1333, 1341, 1342, + 1334, 1344, 1343, 1336, 1342, 1345, 1344, 1346, 1338, 1343, + 1339, 1340, 1337, 1347, 1347, 1348, 1346, 1341, 1349, 1350, + 1351, 1351, 1352, 1345, 1354, 1353, 1357, 1349, 1352, 1356, + 1348, 1353, 1355, 1355, 1358, 1356, 1359, 1360, 1354, 1350, + 1361, 1359, 1357, 1360, 1362, 1367, 1361, 1363, 1363, 1367, - 1364, 1367, 1368, 1369, 1369, 1370, 1363, 1371, 1373, 1368, - 1365, 1374, 1372, 1366, 1375, 1371, 1367, 1372, 1376, 1375, - 1375, 1377, 1373, 1376, 1376, 1370, 1378, 1378, 1379, 1380, - 1374, 1381, 1382, 1383, 1384, 1385, 1386, 1382, 1387, 1388, - 1381, 1377, 1386, 1387, 1389, 1390, 1398, 1379, 1380, 1391, - 1389, 1392, 1383, 1385, 1384, 1391, 1393, 1392, 1394, 1395, - 1396, 1407, 1397, 1408, 1390, 1388, 1399, 1398, 1400, 1400, - 1401, 1402, 1408, 1401, 1407, 1393, 1397, 1394, 1395, 1396, - 1415, 1399, 1409, 1402, 1403, 1403, 1404, 1404, 1405, 1412, - 1406, 1414, 1413, 1405, 1406, 1409, 1410, 1413, 1410, 1421, + 1362, 1364, 1364, 1366, 1366, 1358, 1368, 1369, 1370, 1371, + 1373, 1372, 1374, 1374, 1375, 1368, 1376, 1373, 1378, 1379, + 1370, 1382, 1377, 1371, 1376, 1369, 1372, 1377, 1383, 1383, + 1380, 1384, 1378, 1385, 1375, 1380, 1380, 1381, 1379, 1386, + 1387, 1382, 1381, 1381, 1388, 1387, 1389, 1390, 1386, 1391, + 1384, 1392, 1385, 1393, 1394, 1391, 1392, 1395, 1396, 1398, + 1394, 1397, 1399, 1388, 1396, 1390, 1389, 1397, 1400, 1401, + 1402, 1403, 1405, 1405, 1404, 47, 1395, 1406, 1398, 1393, + 1406, 1399, 1407, 1412, 1402, 1408, 1408, 1400, 1401, 1404, + 1409, 1409, 1403, 1410, 1407, 1411, 1412, 1413, 1410, 1411, - 1415, 1416, 1410, 1417, 1417, 1418, 1414, 1412, 1419, 1420, - 1418, 1422, 1421, 1425, 1419, 1410, 1422, 1416, 1423, 1424, - 1426, 1427, 1423, 1424, 1420, 1428, 1429, 1429, 1431, 1433, - 1434, 1428, 1437, 1425, 1436, 1434, 1435, 1435, 1426, 1443, - 1436, 1427, 1439, 1439, 1441, 1444, 1431, 1441, 1442, 1442, - 1433, 1446, 1437, 1447, 1446, 1443, 1448, 1449, 1449, 1450, - 1451, 1444, 1453, 1452, 1454, 1448, 1456, 1453, 1455, 1455, - 1457, 1458, 1459, 1447, 1450, 1456, 1460, 1460, 1454, 1461, - 1462, 1451, 1452, 1466, 1463, 1464, 1458, 1466, 1457, 1463, - 1465, 1465, 1467, 1461, 1468, 1468, 1469, 1459, 1462, 1470, + 1414, 1415, 1419, 1415, 1417, 1418, 1413, 1415, 1420, 1421, + 1418, 1422, 1422, 1414, 1423, 1424, 1425, 1419, 1430, 1423, + 1415, 1424, 1417, 1426, 1427, 1421, 1428, 1431, 1420, 1427, + 1428, 1425, 1432, 1429, 1433, 1436, 1426, 1429, 1430, 1438, + 1433, 1434, 1434, 1439, 1441, 1431, 1440, 1440, 1439, 1442, + 1441, 1448, 1432, 1436, 1444, 1444, 1446, 1447, 1447, 1446, + 1438, 1449, 1451, 1452, 1453, 1451, 1455, 1448, 1456, 1442, + 1454, 1454, 1457, 1453, 1458, 1462, 1459, 1449, 1461, 1458, + 1463, 1455, 1464, 1452, 1460, 1460, 1466, 1461, 1467, 1456, + 1459, 1457, 1472, 1462, 1468, 1463, 1465, 1465, 1469, 1468, - 1464, 1471, 1472, 1473, 1476, 1471, 1475, 1475, 1473, 1477, - 1470, 1478, 1467, 1479, 1480, 1481, 1482, 1482, 1469, 1483, - 1476, 1472, 1484, 1485, 1483, 1478, 1487, 1477, 1480, 1486, - 1486, 1488, 1479, 1479, 1489, 1487, 1488, 1490, 1492, 1490, - 1481, 1491, 1484, 1485, 1492, 1493, 1491, 1494, 1496, 1497, - 1497, 1498, 1499, 1494, 1489, 1501, 1502, 1505, 1499, 1506, - 1501, 1507, 1496, 1503, 1503, 1493, 1504, 1504, 1510, 1508, - 1498, 1505, 1508, 1509, 1509, 1511, 1507, 1506, 1512, 1513, - 1502, 1516, 1513, 1514, 1516, 1513, 1510, 1511, 1515, 1514, - 1518, 1519, 1520, 1515, 1522, 1522, 1519, 1513, 1512, 1518, + 1466, 1470, 1470, 1474, 1471, 1475, 1467, 1464, 1471, 1473, + 1473, 1476, 1472, 1469, 1477, 1476, 1475, 1478, 1480, 1480, + 1482, 1481, 1478, 1483, 1484, 1474, 1485, 1487, 1486, 1488, + 1488, 1490, 1489, 1477, 1481, 1491, 1482, 1489, 1484, 1492, + 1492, 1483, 1486, 1494, 1493, 1485, 1485, 1495, 1494, 1499, + 18, 1490, 1487, 1493, 1496, 1491, 1496, 1497, 1498, 1500, + 1502, 1504, 1497, 1507, 1498, 1500, 1505, 1495, 1507, 1499, + 1503, 1503, 1505, 1508, 1502, 1509, 1509, 1510, 1510, 1511, + 1504, 1512, 1514, 1513, 1516, 1514, 1515, 1515, 1517, 1518, + 1520, 1522, 1526, 1511, 1522, 1537, 1520, 1508, 1513, 1512, - 1516, 1521, 1523, 1524, 1521, 1525, 1526, 1526, 1523, 1524, - 1525, 1527, 1527, 1528, 1530, 1529, 1531, 1520, 1532, 1528, - 1529, 1533, 1534, 1535, 1536, 1534, 1537, 1530, 1539, 1535, - 1536, 1537, 1538, 1544, 1531, 1540, 1543, 1532, 1538, 1542, - 1540, 1533, 1541, 1541, 1542, 1545, 1546, 1547, 1548, 1549, - 1550, 1539, 1551, 1544, 1543, 1552, 1551, 1552, 1553, 1555, - 1546, 1547, 1548, 1558, 1556, 1545, 1557, 1549, 1559, 1558, - 1560, 1555, 1561, 1562, 1563, 1550, 1556, 1553, 1566, 1557, - 1565, 1565, 1568, 1571, 1567, 1570, 1560, 1562, 1559, 1567, - 1569, 1569, 1561, 1572, 1568, 1563, 1573, 1571, 1566, 1574, + 1517, 1519, 1516, 1521, 1519, 1524, 1525, 1519, 1521, 1518, + 1522, 1525, 1527, 1537, 1524, 1527, 1529, 1526, 1530, 1519, + 1528, 1528, 1529, 1531, 1530, 1532, 1532, 1534, 1531, 1533, + 1533, 1535, 1536, 1534, 1538, 1539, 1535, 1540, 1541, 1545, + 1540, 1542, 1549, 1543, 1541, 1536, 1544, 1542, 1543, 1546, + 1547, 1547, 1544, 1538, 1546, 1539, 1548, 1550, 1551, 1552, + 1549, 1548, 1545, 1555, 1556, 1553, 1554, 1557, 1558, 1559, + 1558, 1557, 1561, 1552, 1562, 17, 1565, 1550, 1551, 1553, + 1554, 1555, 1563, 1566, 1561, 1564, 1562, 1567, 1559, 1556, + 1568, 1564, 1569, 1571, 1571, 1563, 1565, 1572, 1573, 1566, - 1570, 1575, 1576, 1577, 1578, 1582, 1580, 1583, 1574, 1576, - 1583, 1587, 1577, 1586, 1573, 1577, 1575, 1572, 1584, 1584, - 1578, 1580, 1585, 1585, 1588, 1586, 1580, 1588, 1590, 1587, - 1582, 1589, 1589, 1591, 1592, 1593, 1594, 1595, 1596, 1592, - 1593, 1590, 1597, 1602, 1600, 1598, 1606, 1596, 1604, 1599, - 1600, 1603, 1591, 1595, 1598, 1594, 1605, 1598, 1599, 1601, - 1601, 1597, 1606, 1602, 1603, 1607, 1604, 1610, 1611, 1613, - 1605, 1612, 1612, 1614, 1615, 1616, 1616, 1607, 1618, 1615, - 1619, 1620, 1614, 1618, 1617, 1613, 1611, 1621, 1625, 1622, - 1616, 1626, 1610, 1617, 1622, 1622, 1617, 1624, 1619, 1627, + 1574, 1575, 1575, 1573, 1568, 1576, 1578, 1567, 1577, 1579, + 1580, 1581, 1574, 1569, 1582, 1584, 1583, 1572, 1586, 1580, + 1576, 1582, 1577, 1588, 1593, 1583, 1581, 1579, 1583, 1589, + 1578, 1584, 1589, 1586, 1590, 1590, 1591, 1591, 1586, 1592, + 1594, 1596, 1593, 1594, 1595, 1595, 1597, 1598, 1588, 1600, + 1599, 1592, 1598, 1601, 1596, 1599, 1603, 1602, 1604, 1607, + 1607, 1608, 1605, 1609, 1610, 1597, 1602, 1604, 1600, 1601, + 1604, 1605, 1606, 1611, 1612, 1603, 1609, 1613, 1606, 1616, + 1617, 1608, 1610, 1618, 1618, 1619, 1620, 1611, 1621, 1613, + 1612, 1622, 1622, 1621, 1624, 1620, 1623, 1625, 1617, 1624, - 1628, 1629, 1620, 1625, 1627, 1621, 1628, 1630, 1630, 1631, - 1633, 1624, 1632, 1626, 1634, 1631, 1633, 1632, 1636, 1629, - 1634, 1637, 1638, 1639, 1640, 1641, 1643, 1640, 1638, 1645, - 1646, 1641, 1647, 1640, 1643, 1637, 1639, 1648, 1636, 1649, - 1647, 1650, 1651, 1652, 1653, 1653, 1648, 1654, 1645, 1646, - 1656, 1658, 1649, 1654, 1650, 1655, 1651, 1652, 1657, 1657, - 1659, 1655, 1660, 1656, 1661, 1663, 1653, 1662, 1664, 1668, - 1665, 1658, 1669, 1662, 1667, 1667, 1669, 1661, 1659, 1674, - 1670, 1660, 1676, 1673, 1664, 1670, 1671, 1663, 1665, 1668, - 1672, 1671, 1673, 1677, 1676, 1672, 1678, 1678, 1679, 1680, + 1626, 1619, 1627, 1630, 1616, 1623, 1622, 1628, 1623, 1631, + 1632, 1633, 1628, 1628, 0, 1625, 1633, 1630, 1635, 1634, + 1627, 1626, 1636, 1636, 1631, 1634, 1638, 1637, 1639, 1640, + 1642, 1638, 1632, 1637, 1639, 1640, 1635, 1643, 1644, 1645, + 1646, 1647, 1651, 1646, 1644, 1649, 1652, 1647, 1653, 1646, + 1642, 1643, 1645, 1649, 1654, 1655, 1653, 1656, 1657, 1658, + 1664, 1651, 1666, 1654, 1665, 1652, 1659, 1659, 1655, 1660, + 1656, 1661, 1657, 1658, 1662, 1660, 1667, 1661, 1663, 1663, + 1664, 1666, 1665, 1669, 1668, 1670, 1671, 1662, 1659, 1667, + 1668, 1673, 1673, 1674, 1675, 1676, 1680, 1677, 1675, 1683, - 1681, 1683, 1674, 1682, 1682, 1684, 1685, 1688, 1677, 1686, - 1689, 1680, 1684, 1691, 1690, 1683, 1692, 1679, 1685, 1681, - 1690, 1686, 1693, 1694, 1694, 1691, 1688, 1702, 1693, 1695, - 1689, 1699, 1695, 1698, 1692, 1696, 1696, 1700, 1698, 1702, - 1699, 1701, 1701, 1700, 1703, 1704, 1703, 1705, 1704, 1706, - 1707, 1708, 1709, 1710, 1711, 1713, 1714, 1709, 1710, 1716, - 1712, 1714, 1719, 1711, 1715, 1720, 1720, 1705, 1707, 1708, - 1713, 1706, 1712, 1715, 1722, 1717, 1718, 1719, 1721, 1716, - 1717, 1718, 1724, 1725, 1721, 1727, 1715, 1717, 1726, 1728, - 1733, 1728, 1729, 1730, 1730, 1722, 1731, 1731, 1732, 1732, + 1676, 1670, 1677, 1678, 1671, 1669, 1679, 1682, 1678, 1684, + 1686, 1683, 1688, 1674, 1687, 1679, 1682, 1685, 1685, 1680, + 1689, 1689, 1690, 1691, 1684, 1692, 1687, 1693, 1695, 1686, + 1691, 1688, 1696, 1698, 1697, 1699, 1690, 1692, 1700, 1693, + 1697, 1701, 1701, 1702, 1700, 1698, 1702, 1695, 1703, 1703, + 1705, 1706, 1696, 1699, 1709, 1705, 1707, 1708, 1708, 1710, + 1706, 1710, 1707, 1712, 1711, 1713, 1709, 1711, 1714, 1716, + 1715, 1717, 1718, 1719, 1716, 1720, 1717, 1721, 1723, 1724, + 1722, 1718, 1721, 1712, 1724, 1719, 1714, 1713, 1715, 1722, + 1720, 1724, 1725, 1726, 1727, 1727, 1729, 1725, 1723, 1728, - 1736, 1724, 1737, 1725, 1726, 1727, 1729, 18, 1729, 1744, - 1733, 1734, 1734, 1735, 1735, 1738, 1738, 1741, 1739, 1740, - 1741, 1736, 1739, 1737, 1743, 1740, 1745, 1744, 1746, 1749, - 1743, 1747, 1745, 1750, 1747, 1748, 1748, 1752, 1750, 1751, - 1751, 1753, 1754, 1755, 1755, 1756, 1758, 1754, 1757, 1749, - 1756, 1759, 1752, 1746, 1757, 1760, 1761, 1762, 1758, 1758, - 1758, 1763, 1753, 1762, 1765, 1758, 1766, 1767, 1769, 1765, - 1765, 1759, 1768, 1760, 1768, 1770, 1761, 1771, 1772, 1769, - 1766, 1763, 1767, 1771, 1773, 1774, 1776, 1772, 1775, 1775, - 1770, 1777, 1777, 1778, 1779, 1780, 1780, 1781, 1781, 1782, + 1731, 1732, 1722, 1734, 1733, 1728, 0, 1735, 1726, 1735, + 1736, 1737, 1737, 1738, 1738, 1739, 1739, 1729, 1740, 1731, + 1733, 1732, 1743, 1734, 1736, 1744, 1736, 1741, 1741, 1742, + 1742, 1745, 1745, 1746, 1747, 1750, 1748, 1746, 1740, 1748, + 1747, 1750, 1751, 1743, 1752, 1753, 1744, 1756, 1754, 1757, + 1752, 1754, 1755, 1755, 1757, 1758, 1758, 1759, 1760, 1761, + 1751, 1762, 1762, 1763, 1761, 1764, 1766, 1756, 1763, 1765, + 1753, 1764, 1759, 1767, 1768, 1770, 1773, 1821, 1769, 1760, + 1821, 1765, 1765, 1765, 1769, 1774, 1766, 1772, 1765, 1777, + 1773, 1767, 1772, 1772, 1768, 1770, 1775, 1776, 1775, 1778, - 1785, 1785, 1786, 1790, 1773, 1787, 1774, 1793, 1789, 1791, - 1792, 1792, 1776, 1778, 1787, 1791, 1779, 1789, 1794, 1782, - 1797, 1796, 1795, 1799, 1790, 1798, 1798, 1786, 1793, 1795, - 1796, 1800, 1802, 1794, 1803, 1804, 1805, 1802, 1806, 1807, - 1803, 1808, 1808, 1805, 1806, 1807, 1797, 1800, 1809, 1799, - 1810, 1811, 1813, 1809, 1812, 1804, 1815, 1814, 1816, 1810, - 1814, 1817, 1817, 1818, 1813, 1820, 1819, 1821, 1824, 1818, - 1825, 1811, 1819, 1812, 1815, 1822, 1826, 1827, 1827, 1822, - 1828, 1826, 1821, 1829, 1816, 1820, 1831, 1832, 1824, 17, - 1833, 1832, 1825, 1834, 1839, 1822, 1833, 1837, 1829, 1828, + 1774, 1779, 1780, 1781, 1777, 1778, 1782, 1782, 1776, 1783, + 1779, 1784, 1784, 1785, 1786, 1787, 1787, 1788, 1788, 1789, + 1792, 1792, 1780, 1793, 1781, 1794, 1797, 1801, 1796, 1799, + 1799, 1800, 1798, 1785, 1794, 1783, 1786, 1796, 1798, 1789, + 1803, 1804, 1801, 1802, 1805, 1805, 1806, 1797, 1793, 1803, + 1802, 1809, 1800, 1807, 1810, 1811, 1809, 1812, 1816, 1813, + 1810, 1818, 1814, 1816, 1812, 1813, 1819, 1804, 1814, 1807, + 1815, 1815, 1806, 1817, 1820, 1811, 1822, 1823, 1824, 1824, + 1827, 1818, 1817, 1825, 1826, 1819, 1820, 1828, 1829, 1825, + 1826, 1831, 1829, 1832, 1822, 1835, 1833, 1834, 1834, 1838, - 1835, 1835, 1834, 1836, 1840, 1831, 1841, 1836, 1837, 1838, - 1838, 1842, 1843, 1837, 1844, 1839, 1842, 1845, 1840, 1847, - 1846, 1848, 1848, 1845, 1847, 1841, 1849, 1849, 1852, 1850, - 1853, 1854, 1843, 1850, 1844, 1846, 1861, 1852, 1855, 1855, - 1862, 1853, 1857, 1857, 1858, 1862, 1853, 1859, 1860, 1858, - 1858, 1854, 1863, 1859, 1860, 1864, 1866, 1868, 1869, 1867, - 1870, 1864, 1861, 1867, 1863, 1871, 1870, 1872, 1866, 1868, - 1873, 1877, 1874, 1872, 1876, 1873, 1878, 1880, 1881, 1881, - 1880, 1878, 1884, 1869, 1874, 1927, 1876, 1871, 1882, 1882, - 1877, 1883, 1883, 1885, 1886, 1889, 1887, 1888, 1927, 1885, + 1827, 1833, 1828, 1823, 1836, 1839, 1840, 1841, 1829, 1839, + 1846, 1831, 1840, 1843, 1835, 1832, 1841, 1843, 1838, 1836, + 1842, 1842, 1844, 1845, 1845, 1847, 1848, 1849, 1850, 1851, + 1852, 1846, 1849, 1844, 1861, 1853, 1852, 1854, 1844, 1847, + 1855, 1855, 1854, 1856, 1856, 1848, 1859, 1857, 1850, 1851, + 1853, 1857, 1860, 1868, 1861, 1859, 1862, 1862, 1864, 1864, + 1865, 1866, 1878, 1860, 1867, 1865, 1865, 1866, 1860, 1869, + 1867, 1870, 1871, 1873, 1869, 1875, 1874, 1876, 1871, 1868, + 1874, 1880, 1877, 1870, 1878, 1873, 1879, 1875, 1877, 1881, + 1885, 1882, 1879, 1884, 1881, 1888, 1886, 1892, 1888, 1895, - 1886, 1887, 1884, 1888, 1889, 1891, 1893, 1894, 1897, 1893, - 1891, 1895, 1895, 1898, 1900, 1900, 1899, 1901, 1902, 1894, - 1897, 1899, 1903, 1902, 1906, 1898, 1901, 1903, 1904, 1905, - 1905, 1904, 1907, 1908, 1909, 1910, 1913, 1911, 1914, 1910, - 1912, 1907, 1911, 1915, 1906, 1916, 1912, 1914, 1918, 1918, - 1919, 1908, 1925, 1909, 1913, 1920, 1921, 1921, 1923, 1916, - 1918, 1915, 1922, 1922, 1920, 1924, 1926, 1923, 1919, 1930, - 1930, 1926, 1932, 1925, 1933, 1932, 1934, 1924, 1936, 1938, - 1937, 1939, 1940, 1940, 1941, 1938, 1941, 1942, 1942, 1943, - 1933, 1948, 1934, 1936, 1937, 1945, 1945, 1943, 1939, 1946, + 1880, 1886, 1876, 1882, 1895, 1884, 1889, 1889, 1893, 1885, + 1890, 1890, 1891, 1891, 1893, 1894, 1896, 1892, 1897, 1899, + 1901, 1894, 1896, 1901, 1899, 1902, 1905, 1897, 1903, 1903, + 1906, 1907, 1908, 1908, 1909, 1910, 1907, 1902, 1905, 1911, + 1910, 1914, 1906, 1909, 1911, 1912, 1913, 1913, 1912, 1915, + 1916, 1917, 1918, 1921, 1919, 1922, 1918, 1920, 1915, 1919, + 1923, 1914, 1924, 1920, 1922, 1926, 1926, 1927, 1916, 1933, + 1917, 1921, 1928, 1929, 1929, 1931, 1924, 1926, 1923, 1930, + 1930, 1928, 1932, 1934, 1931, 1927, 1935, 1941, 1934, 1942, + 1933, 1938, 1938, 1940, 1932, 1944, 1940, 1945, 1946, 1935, - 1946, 1949, 1950, 1951, 1952, 1953, 1955, 1949, 1950, 1956, - 1951, 1954, 1954, 1961, 1948, 1955, 1957, 1958, 1959, 1960, - 1962, 1963, 1965, 1966, 1967, 1953, 1952, 1963, 1957, 1958, - 1956, 1960, 1969, 1959, 1970, 1962, 1967, 1968, 1968, 1961, - 1963, 1971, 1965, 1972, 1971, 1973, 1966, 1975, 1972, 1976, - 1969, 1976, 1975, 1977, 1970, 1978, 1979, 1981, 1983, 1984, - 1978, 1985, 1986, 1979, 1986, 1973, 1981, 1987, 1984, 1990, - 1989, 1977, 1989, 1985, 1991, 1991, 1983, 1992, 1994, 1993, - 1994, 1997, 1995, 1990, 1993, 1996, 1987, 1995, 1998, 1999, - 1996, 2000, 2001, 2002, 2004, 1999, 2000, 2005, 2009, 1997, + 1947, 1948, 1948, 1941, 1946, 1942, 1949, 1951, 1949, 1956, + 1944, 1945, 1950, 1950, 1960, 1951, 1957, 1947, 1953, 1953, + 1954, 1954, 1957, 1958, 1959, 1961, 1962, 1962, 1963, 1958, + 1964, 1959, 1956, 1967, 1965, 1966, 1960, 1963, 1968, 1969, + 1970, 1973, 1975, 1971, 1974, 1961, 1965, 1966, 1967, 1971, + 1968, 1964, 1976, 1976, 1975, 1970, 1977, 1978, 1981, 1980, + 1979, 1973, 1971, 1979, 1980, 1969, 1983, 1974, 1984, 1985, + 1984, 1983, 1987, 1989, 1977, 1986, 1991, 1978, 1981, 1987, + 1986, 1992, 1989, 1993, 1994, 1995, 1994, 1985, 1998, 1997, + 1992, 1997, 1999, 1999, 1991, 1993, 2000, 2002, 2001, 2002, - 2008, 2002, 2012, 1992, 2012, 2001, 2006, 2006, 1998, 2007, - 2007, 2005, 2011, 2004, 2010, 2008, 2013, 2011, 2009, 2014, - 2010, 2015, 2015, 2019, 2016, 2017, 2017, 2014, 2018, 2018, - 2021, 2023, 2019, 2020, 2013, 2014, 2016, 2024, 2020, 2024, - 2023, 2025, 2027, 2023, 2026, 2028, 2030, 2031, 2021, 2026, - 2026, 2027, 2031, 2034, 2032, 2035, 2036, 2028, 2030, 2032, - 2037, 2037, 2025, 2038, 2039, 2036, 2034, 2040, 2044, 2046, - 2041, 2042, 2047, 2045, 2048, 2035, 2055, 2047, 2049, 2048, - 2044, 2038, 2039, 2040, 2041, 2045, 2042, 2049, 2052, 2046, - 2054, 2056, 2057, 2058, 2052, 2059, 2054, 2060, 2060, 2055, + 2003, 2004, 1998, 2001, 1995, 2003, 2004, 2005, 2006, 2007, + 2009, 2008, 2010, 2012, 2016, 2007, 2008, 2013, 2014, 2014, + 2010, 2017, 2000, 2009, 2018, 2005, 2015, 2015, 2006, 2016, + 2018, 2013, 2012, 2019, 2020, 2021, 2020, 2024, 2019, 2022, + 2029, 2017, 2023, 2023, 2025, 2025, 2033, 2022, 2027, 2024, + 2026, 2026, 2031, 2021, 2028, 2022, 2035, 2027, 2029, 2028, + 2032, 2031, 2032, 2034, 2031, 2035, 2036, 2033, 2034, 2034, + 2038, 2039, 2040, 2042, 2043, 2044, 2039, 2040, 2036, 2045, + 2045, 2046, 2038, 2047, 2044, 2050, 2042, 2048, 2049, 2054, + 2055, 2056, 2052, 2053, 2043, 2055, 2056, 2057, 2063, 2046, - 2061, 2062, 2062, 2063, 2059, 2067, 2056, 2052, 2064, 2061, - 2057, 2065, 2064, 2066, 2068, 2069, 2065, 2070, 2058, 2068, - 2068, 2069, 2063, 2070, 2072, 2071, 2066, 2067, 2071, 2073, - 2076, 2076, 2072, 2077, 2077, 2078, 2079, 2079, 2080, 2080, - 2081, 2083, 2082, 0, 2078, 2084, 2087, 2083, 2077, 2073, - 2084, 2087, 2081, 2085, 2085, 2086, 2086, 2088, 2090, 2077, - 2082, 2091, 2090, 2088, 2092, 2093, 2095, 2096, 2092, 2097, - 2099, 2098, 2096, 2101, 2103, 2099, 2100, 2102, 2104, 2103, - 2106, 2091, 2105, 2105, 2106, 2093, 2098, 2107, 2108, 2101, - 2109, 2095, 2097, 2108, 2100, 2111, 2110, 2102, 2112, 2113, + 2050, 2047, 2049, 2048, 2052, 2053, 2057, 2060, 2062, 2054, + 2064, 2065, 2066, 2060, 2062, 2067, 2068, 2068, 2069, 2070, + 2070, 2063, 2071, 2074, 2067, 2064, 2060, 2069, 2072, 2065, + 2073, 2075, 2072, 2076, 2077, 2073, 2074, 2066, 2078, 2077, + 2077, 2071, 2079, 2080, 2078, 2081, 2080, 2082, 2079, 2087, + 2075, 2085, 2085, 2081, 2090, 2076, 2086, 2086, 2087, 2088, + 2088, 2089, 2089, 2091, 2092, 2099, 2090, 2082, 2093, 2099, + 2092, 2086, 2100, 2093, 2094, 2094, 2095, 2095, 2096, 2097, + 2101, 2091, 2086, 2096, 2101, 2097, 2102, 2104, 2105, 2107, + 2106, 2108, 2100, 2105, 2110, 2112, 2108, 2109, 2111, 2113, - 2104, 2114, 2107, 2110, 2113, 2115, 2119, 2111, 2116, 2116, - 2118, 2120, 2121, 2122, 2114, 2123, 2109, 2112, 2118, 2124, - 2125, 2126, 2131, 2115, 2128, 2119, 0, 2132, 2130, 2133, - 2120, 2133, 2125, 2132, 2123, 2121, 2131, 2122, 2137, 2128, - 2124, 2130, 2126, 2134, 2134, 2135, 2136, 2138, 2153, 2136, - 2135, 2137, 2139, 2140, 2140, 2141, 2141, 2142, 2144, 2142, - 2147, 2138, 2143, 2143, 2145, 2139, 2146, 2146, 2153, 2147, - 2148, 2148, 2147, 2144, 2149, 2149, 2150, 2145, 2152, 2154, - 2155, 2150, 2158, 2152, 2156, 2156, 2157, 2157, 2159, 2159, - 2160, 2162, 2155, 2161, 2161, 2163, 2164, 2164, 2166, 2154, + 2112, 2114, 2114, 2115, 2107, 2116, 2102, 2115, 2118, 2117, + 2110, 2121, 2104, 2106, 2117, 2109, 2119, 2120, 2111, 2122, + 2116, 2113, 2123, 2119, 2122, 2124, 2125, 2125, 2127, 2120, + 2121, 2128, 2129, 2130, 2118, 2123, 2127, 2131, 2132, 2133, + 2134, 2135, 2139, 2124, 2137, 2146, 2142, 2141, 2142, 2140, + 2128, 2129, 2134, 2141, 2147, 2139, 2130, 2132, 2146, 2137, + 2133, 2131, 2135, 2140, 2143, 2143, 2144, 2145, 2147, 2148, + 2145, 2144, 2149, 2149, 2150, 2150, 2151, 2153, 2151, 2152, + 2152, 2154, 2148, 2155, 2155, 2162, 2156, 2157, 2157, 2158, + 2158, 2159, 2153, 2163, 2154, 2156, 2159, 2161, 2156, 2164, - 2163, 2158, 2165, 2165, 2167, 2168, 2162, 2169, 2160, 2171, - 2172, 2172, 2166, 2167, 2171, 2173, 2174, 2174, 2175, 2168, - 2177, 2176, 2180, 2177, 2178, 2178, 2169, 2176, 2179, 2179, - 2181, 2182, 2183, 2183, 2173, 2185, 2175, 2186, 2187, 2188, - 2178, 2180, 2190, 2188, 2191, 2181, 2189, 2189, 2192, 2191, - 2182, 2193, 2196, 2187, 2198, 2185, 2195, 2195, 2197, 2199, - 2186, 2190, 2200, 2192, 2201, 2197, 2193, 2203, 2198, 2202, - 2202, 2204, 2196, 2204, 2207, 2205, 2203, 2199, 2205, 2208, - 2200, 2210, 2209, 2211, 2208, 2214, 2207, 2209, 2212, 2213, - 2201, 2220, 2216, 2205, 2213, 2205, 2211, 2216, 2217, 2218, + 2165, 2165, 2161, 2166, 2166, 2162, 2167, 2168, 2168, 2169, + 2175, 2164, 2172, 2163, 2170, 2170, 2171, 2172, 2173, 2173, + 2174, 2174, 2177, 2176, 2175, 2167, 2178, 2169, 2180, 2181, + 2181, 2171, 2176, 2180, 2182, 2185, 2177, 2183, 2183, 2184, + 2186, 2185, 2189, 2186, 2190, 2178, 2187, 2187, 2188, 2188, + 2191, 2192, 2192, 2182, 2194, 2195, 2196, 2184, 2199, 2190, + 2197, 2189, 2187, 2200, 2197, 2198, 2198, 2201, 2200, 2191, + 2202, 2196, 2204, 2204, 2194, 2205, 2206, 2199, 2195, 2207, + 2208, 2209, 2201, 2206, 2210, 2202, 2211, 2211, 2212, 2213, + 2216, 2213, 2219, 2207, 2220, 2205, 2217, 2212, 2208, 2209, - 2222, 2219, 2221, 2217, 2224, 2222, 2210, 2219, 2221, 2212, - 2223, 2214, 2220, 2225, 2218, 2223, 2226, 2236, 2227, 2226, - 2231, 2228, 2229, 2230, 2234, 0, 2225, 2227, 2234, 2224, - 2228, 2229, 2230, 2232, 2231, 2233, 2238, 2236, 2240, 2232, - 2243, 2233, 2239, 2239, 2240, 2238, 2241, 2241, 2242, 2245, - 2246, 2247, 2247, 2242, 2248, 2241, 2251, 2252, 2249, 2253, - 2243, 2256, 2243, 2254, 2256, 2245, 2246, 2249, 2251, 2248, - 2258, 2257, 2259, 2252, 2253, 2254, 2257, 2260, 2260, 2261, - 2261, 2263, 2263, 2264, 2259, 2266, 2264, 2265, 2267, 2268, - 2258, 2266, 2265, 2270, 2267, 2269, 2269, 2272, 2268, 2271, + 2214, 2217, 2216, 2214, 2218, 2221, 2222, 2220, 2223, 2218, + 2210, 2222, 2227, 2233, 2225, 2229, 2226, 2219, 2214, 2225, + 2214, 2226, 2228, 2230, 2236, 2231, 2221, 2227, 2228, 2230, + 2231, 2234, 2232, 2236, 2223, 0, 2229, 2232, 2233, 2235, + 2237, 2238, 2235, 2239, 2234, 2240, 2245, 2241, 2242, 2237, + 2238, 2243, 2239, 2241, 2242, 2243, 2247, 2248, 2248, 2240, + 2251, 2249, 2250, 2250, 2253, 2247, 2245, 2249, 2252, 2251, + 2258, 2250, 2255, 2252, 2256, 2257, 2257, 2261, 2259, 2262, + 2264, 2263, 2268, 2310, 2253, 2258, 2253, 2259, 2255, 2261, + 2256, 2266, 2264, 2267, 2266, 2262, 2263, 2269, 2267, 2270, - 2271, 2273, 2274, 2275, 2275, 2276, 2277, 2270, 2278, 2272, - 2280, 2276, 2286, 2278, 2280, 2273, 2281, 2282, 2282, 2281, - 2277, 2274, 2283, 2284, 2285, 2289, 2287, 2283, 2284, 2284, - 2287, 2291, 2286, 2285, 2288, 2288, 2291, 2292, 2289, 2293, - 2294, 2295, 2296, 2297, 2298, 2295, 2299, 2300, 2297, 2301, - 2298, 2302, 2299, 2303, 2294, 2304, 0, 2292, 2303, 2293, - 2306, 2307, 2296, 2310, 2308, 2300, 2313, 2309, 2301, 2308, - 2302, 2310, 2306, 2309, 2315, 2313, 2304, 2307, 2311, 2318, - 2311, 2316, 2316, 2317, 2319, 2319, 2317, 2322, 2315, 2323, - 2324, 2322, 2325, 2325, 2326, 2323, 2329, 2329, 2331, 2333, + 2270, 2310, 2268, 2271, 2271, 2273, 2273, 2274, 2275, 2269, + 2274, 2276, 2277, 2275, 2278, 2279, 2279, 2276, 2277, 2280, + 2281, 2281, 2282, 2278, 2283, 2284, 2285, 2285, 2287, 2286, + 2295, 2288, 0, 2280, 2282, 2286, 2288, 2290, 2283, 2295, + 2291, 2290, 2287, 2291, 2284, 2292, 2292, 2293, 2294, 2296, + 2299, 2297, 2293, 2294, 2294, 2297, 2298, 2298, 2302, 2301, + 2303, 2304, 2305, 2299, 2301, 2306, 2305, 2307, 2308, 2296, + 2309, 2311, 2307, 2312, 2308, 2304, 2309, 2313, 2302, 2314, + 2303, 2316, 2313, 2317, 2318, 2306, 2328, 2320, 2319, 2318, + 2311, 2325, 2312, 2316, 2319, 2320, 2321, 2323, 2321, 2317, - 2338, 2334, 2324, 2326, 2337, 2318, 2339, 2340, 2347, 2337, - 2348, 2339, 2340, 2333, 2341, 2341, 2331, 2334, 2343, 2343, - 2349, 2345, 2346, 2346, 2347, 2349, 2338, 2345, 2351, 2352, - 2353, 2353, 2348, 2355, 2356, 2357, 2358, 2360, 2360, 2362, - 2356, 2352, 2355, 2361, 2363, 2367, 2361, 2351, 2365, 2365, - 2367, 2358, 2368, 2357, 2366, 2366, 2369, 2372, 2362, 2370, - 2373, 2371, 2363, 2371, 2370, 2369, 2374, 2375, 2376, 2383, - 2368, 2372, 2375, 0, 2373, 2377, 2378, 2378, 2374, 2382, - 2377, 2379, 2379, 2380, 2380, 2381, 2381, 2383, 2376, 2384, - 2387, 2382, 2385, 2385, 2384, 2386, 2386, 2388, 2389, 2390, + 2314, 2326, 2326, 2334, 2327, 2325, 2323, 2327, 2329, 2329, + 2332, 2333, 2328, 2336, 2332, 2334, 2341, 2333, 2335, 2335, + 2339, 2339, 2336, 2343, 2344, 2347, 2348, 2349, 2350, 2357, + 2347, 2358, 2349, 2350, 2341, 2351, 2351, 2343, 2353, 2353, + 2344, 2355, 2356, 2356, 2359, 2357, 2361, 2355, 2362, 2359, + 2363, 2363, 2348, 2358, 2365, 2366, 2367, 2368, 2370, 2370, + 2362, 2366, 2372, 2365, 2371, 2361, 2373, 2371, 2375, 2375, + 2376, 2376, 2368, 2377, 2367, 2378, 2379, 2380, 2377, 2384, + 2382, 2372, 2380, 2383, 2373, 2379, 2381, 2385, 2381, 2386, + 2387, 2384, 2385, 2378, 2382, 2387, 2392, 2383, 2388, 2388, - 2391, 2391, 2387, 2392, 2393, 2393, 2394, 2394, 2395, 2388, - 2397, 2396, 2398, 2399, 2401, 2390, 2400, 2397, 2389, 2395, - 2402, 2400, 2392, 2396, 2398, 2403, 2403, 2404, 2405, 2406, - 2407, 2408, 2409, 2399, 2401, 2410, 2404, 2411, 2411, 2412, - 2402, 2413, 2414, 2407, 2416, 2417, 2409, 2410, 2412, 2406, - 2418, 2420, 2423, 2423, 2405, 2408, 2413, 2414, 2419, 2421, - 2430, 2419, 2416, 2422, 2421, 2420, 2432, 2417, 2422, 2424, - 2424, 2425, 2425, 2418, 2427, 2427, 2429, 2429, 2430, 2431, - 2433, 2435, 2436, 2437, 2438, 2432, 2440, 2439, 2442, 2441, - 2431, 2441, 2443, 2444, 2448, 2433, 2439, 2445, 2445, 2450, + 2389, 2389, 2390, 2390, 2391, 2391, 2393, 2394, 2392, 2386, + 2395, 2395, 2394, 2396, 2396, 2397, 2398, 2399, 2400, 2401, + 2401, 2402, 2403, 2403, 2393, 2404, 2404, 2397, 2398, 2407, + 2405, 2406, 2408, 2409, 2400, 2411, 2407, 2399, 2412, 2414, + 2402, 2405, 2410, 2406, 2408, 2413, 2413, 2410, 2414, 2415, + 2416, 2417, 2418, 2409, 2419, 2411, 2420, 2421, 2412, 2422, + 2422, 2427, 2423, 2428, 2417, 2424, 2425, 2429, 2419, 2421, + 2416, 2423, 2431, 0, 2430, 2415, 2418, 2430, 2420, 2427, + 2424, 2425, 2432, 2433, 2441, 2428, 2431, 2432, 2433, 2443, + 2429, 2434, 2434, 2435, 2435, 2436, 2436, 2438, 2438, 2440, - 2436, 2435, 2447, 2447, 2438, 2437, 2440, 2451, 2442, 2448, - 2443, 2444, 2452, 2452, 2454, 2456, 2451, 2455, 2455, 2457, - 2458, 2450, 2460, 2454, 2459, 2461, 2462, 2458, 2463, 2464, - 2464, 2465, 2465, 2456, 2466, 2467, 2473, 2457, 2468, 2459, - 2460, 2472, 2462, 2461, 2468, 2469, 2469, 2463, 2470, 2470, - 2471, 2473, 2474, 2467, 2466, 2475, 2471, 2476, 2477, 2472, - 2478, 2479, 2476, 2480, 2485, 2480, 2479, 2481, 2481, 2475, - 2482, 2474, 2482, 2483, 2483, 2487, 2488, 2489, 2477, 2490, - 2478, 2491, 2492, 2485, 2487, 2493, 2491, 2496, 2497, 2489, - 2499, 2497, 2498, 2498, 2500, 2488, 2501, 2501, 2504, 2490, + 2440, 2442, 2441, 2444, 2446, 2447, 2448, 2449, 2443, 2451, + 2450, 2452, 2442, 2452, 2453, 2454, 2459, 2455, 2444, 2450, + 2456, 2456, 2461, 2447, 2446, 2458, 2458, 2449, 2448, 2451, + 2462, 2459, 2465, 2454, 2453, 2455, 2463, 2463, 2467, 2462, + 2468, 2465, 2466, 2466, 2461, 2469, 2470, 2471, 2472, 2474, + 2477, 2473, 2469, 2475, 2475, 2478, 2467, 2479, 2468, 2476, + 2476, 2470, 2483, 2479, 2484, 2471, 2472, 2473, 2474, 2485, + 2477, 2480, 2480, 2478, 2481, 2481, 2482, 2486, 2487, 2484, + 2483, 2488, 2482, 2487, 2489, 2490, 2496, 2491, 2485, 2491, + 2490, 2486, 2492, 2492, 2493, 2499, 2493, 2494, 2494, 2498, - 2506, 2506, 2492, 2507, 2493, 2499, 2502, 2496, 2509, 2510, - 2502, 2505, 2500, 2504, 2511, 2505, 2507, 2512, 2512, 2514, - 2516, 2515, 2518, 2509, 2516, 2517, 2517, 2519, 2519, 2510, - 2515, 2514, 2520, 2521, 2511, 2522, 2523, 2520, 2524, 2524, - 2530, 2518, 2521, 2529, 2529, 2531, 2531, 2532, 2523, 2534, - 2533, 2522, 2535, 2536, 2536, 2537, 2539, 2539, 2534, 2542, - 2532, 2535, 2530, 2533, 2542, 2544, 2543, 2545, 2546, 2547, - 2537, 2543, 2545, 2548, 2551, 2549, 2546, 2554, 0, 2544, - 2552, 2553, 2548, 2549, 2560, 2552, 2553, 2561, 2547, 2551, - 2555, 2555, 2554, 2556, 2556, 2557, 2557, 2558, 2559, 2565, + 2500, 2488, 2501, 2503, 2489, 2496, 2502, 2504, 2498, 2507, + 2508, 2502, 2500, 2508, 2499, 2509, 2509, 2510, 2511, 2512, + 2512, 2513, 2501, 2503, 2515, 2513, 2504, 2516, 2518, 2507, + 2520, 2516, 2510, 2517, 2517, 2521, 2511, 2522, 2525, 2515, + 2526, 2518, 2523, 2523, 2527, 2520, 2528, 2528, 2527, 2526, + 2525, 2529, 2530, 2530, 2531, 2521, 2532, 2522, 2533, 2531, + 2534, 2535, 2535, 2540, 2540, 2532, 2541, 2542, 2542, 2543, + 2529, 2544, 2534, 0, 2533, 2548, 2545, 2546, 2547, 2547, + 2550, 2550, 2543, 2555, 2544, 2545, 2546, 2553, 2541, 2554, + 2548, 2556, 2553, 2557, 2554, 2558, 2556, 2555, 2559, 2563, - 2562, 2588, 2560, 2559, 2558, 2561, 2562, 2563, 2564, 2564, - 2566, 2571, 2563, 2588, 2565, 2566, 2567, 2567, 2568, 2568, - 2572, 2572, 2573, 2574, 2571, 2573, 2575, 2576, 2574, 2574, - 2577, 2575, 2576, 2578, 2579, 2580, 2581, 2582, 2579, 2578, - 2580, 2583, 2584, 2590, 2577, 2581, 2587, 2585, 2586, 2583, - 2591, 2587, 2582, 2585, 2586, 2591, 2594, 2592, 2598, 2590, - 2592, 2596, 2597, 2584, 2599, 2600, 2596, 2597, 2594, 2601, - 2602, 2602, 2603, 2606, 2600, 2611, 2598, 2599, 2601, 2607, - 2608, 2603, 2612, 2615, 2613, 2607, 2608, 2614, 2614, 2616, - 2615, 2606, 2617, 2620, 2611, 2618, 2619, 2619, 2622, 2624, + 2560, 2557, 2562, 2565, 2563, 2564, 2570, 2559, 2560, 0, + 2564, 2566, 2566, 2570, 2558, 2567, 2567, 2562, 2565, 2568, + 2569, 2569, 2571, 2572, 2568, 2573, 2574, 2571, 2575, 2576, + 2576, 2577, 2574, 2575, 2578, 2579, 2579, 2580, 2580, 2578, + 2583, 2572, 0, 2573, 2584, 2584, 2577, 2585, 2589, 2586, + 2585, 2587, 2588, 2583, 2586, 2586, 2587, 2588, 2590, 2591, + 2592, 2593, 2589, 2591, 2590, 2592, 2594, 2595, 2596, 2599, + 2593, 2597, 2598, 2600, 2599, 2595, 2602, 2597, 2598, 2603, + 2604, 2594, 2606, 2604, 2603, 2600, 2608, 2610, 2609, 2596, + 2611, 2608, 2602, 2609, 2606, 2612, 2618, 2613, 2614, 2614, - 2625, 2617, 2612, 2613, 2625, 2626, 2626, 2627, 2616, 2628, - 2618, 2629, 2620, 2622, 2630, 2628, 2632, 2629, 2633, 2624, - 2630, 2631, 2631, 2633, 2632, 2635, 2636, 2638, 2639, 2640, - 2643, 2638, 2627, 2653, 2635, 2642, 2642, 2644, 2644, 2636, - 2645, 2645, 2639, 2648, 2640, 2647, 2647, 2648, 2643, 2649, - 2651, 2651, 2654, 2653, 2649, 2655, 2656, 2654, 2658, 2659, - 2659, 2656, 2656, 2661, 2661, 2662, 2662, 2655, 2663, 2664, - 2666, 2663, 2668, 2669, 2669, 2670, 2670, 2674, 2658, 2671, - 2671, 2672, 2664, 2673, 2673, 2675, 2676, 2677, 2666, 2684, - 2674, 2685, 2668, 2677, 2678, 2678, 2672, 2679, 2686, 2683, + 2615, 2619, 2620, 2611, 2612, 2610, 2613, 2619, 2620, 2615, + 2623, 2624, 2627, 2625, 2618, 2626, 2626, 2628, 2629, 2627, + 2630, 2631, 2631, 2632, 2634, 2636, 2637, 2629, 2639, 2623, + 2637, 2624, 2625, 2638, 2638, 2630, 2628, 2640, 2641, 2634, + 2642, 2644, 2632, 2640, 2641, 2636, 2642, 2643, 2643, 2644, + 2645, 2647, 2648, 2639, 2650, 2645, 2651, 2652, 2650, 2655, + 2647, 2654, 2654, 2656, 2656, 2648, 2657, 2657, 2659, 2659, + 2651, 2660, 2652, 2661, 2665, 2660, 2666, 2655, 2661, 2663, + 2663, 2666, 2668, 2667, 2670, 2671, 2671, 2668, 2668, 2673, + 2673, 2674, 2674, 2675, 2665, 2667, 2675, 2676, 2678, 2680, - 2676, 2679, 2687, 2675, 2683, 2683, 2689, 2688, 2687, 2699, - 2690, 2685, 2684, 2688, 2690, 2691, 2691, 2694, 2686, 2696, - 2697, 2700, 2694, 2697, 2700, 2701, 2701, 2696, 2702, 2704, - 2703, 2689, 2705, 2867, 2699, 2703, 2706, 2707, 2707, 2708, - 2709, 2710, 2711, 2709, 2867, 2702, 2702, 2704, 2712, 2715, - 2706, 2709, 2705, 2708, 2713, 2710, 2712, 2713, 2714, 2716, - 2716, 2711, 2721, 2714, 2714, 2717, 2717, 2723, 2715, 2718, - 2718, 2719, 2719, 2720, 2720, 2722, 2724, 2725, 2721, 2726, - 2722, 2727, 2725, 2728, 2729, 2730, 2727, 2723, 2732, 2732, - 2733, 2733, 2728, 2734, 2735, 3114, 2734, 3114, 2726, 2737, + 2681, 2681, 2682, 2682, 2670, 2683, 2683, 2684, 2685, 2685, + 2676, 2686, 2687, 2688, 2689, 2697, 2678, 2690, 2690, 2680, + 2689, 2691, 2684, 2694, 2686, 2691, 2696, 2688, 2698, 2694, + 2687, 2696, 2696, 2699, 2700, 2701, 2702, 2707, 2697, 2703, + 2700, 2701, 2707, 2703, 2704, 2704, 2709, 2710, 2698, 2712, + 2710, 2715, 2713, 2699, 2709, 2713, 2714, 2714, 2716, 2717, + 2718, 2702, 2719, 2716, 2720, 2720, 2724, 2721, 2715, 2715, + 2723, 2725, 2722, 2728, 2712, 2722, 2719, 2717, 2737, 2725, + 2718, 2721, 2727, 2722, 2723, 2724, 2726, 2727, 2727, 2726, + 2729, 2729, 2728, 2730, 2730, 2731, 2731, 2732, 2732, 2733, - 2737, 2738, 2724, 2747, 2729, 2730, 2739, 2739, 2738, 2740, - 2742, 2742, 2735, 2743, 2740, 2744, 2745, 2748, 2748, 2749, - 2750, 2747, 2743, 2749, 2744, 2745, 2751, 2752, 2754, 2750, - 2753, 2755, 2752, 2752, 2759, 2755, 2763, 2754, 2764, 2759, - 2765, 2751, 2767, 2753, 2760, 2760, 2762, 2762, 2768, 2771, - 2763, 2767, 2772, 2773, 2776, 2778, 2774, 0, 2765, 2780, - 2768, 2772, 2774, 2764, 2780, 2781, 2776, 2782, 2782, 2783, - 2781, 2792, 2785, 2773, 2771, 2793, 2778, 2785, 2783, 2786, - 2786, 2788, 2788, 2786, 2789, 2789, 2790, 2790, 2791, 2800, - 2794, 2792, 2796, 2801, 2793, 2794, 2797, 2791, 2796, 2798, + 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2735, 2740, 2741, + 2738, 2742, 2743, 2740, 2745, 2745, 2748, 2734, 2741, 2746, + 2746, 2747, 2751, 2736, 2747, 2739, 2750, 2750, 2753, 2751, + 2756, 2742, 2743, 2753, 2748, 2752, 2752, 2755, 2755, 2756, + 2757, 2758, 2760, 2761, 2761, 2763, 2764, 2762, 2777, 2757, + 2758, 2762, 2765, 2766, 2763, 2767, 2778, 2765, 2765, 2768, + 2760, 2764, 2772, 2768, 2767, 2776, 2766, 2772, 2773, 2773, + 2775, 2775, 2780, 2777, 2778, 2781, 2784, 2785, 2786, 2776, + 2789, 2780, 2787, 2791, 2793, 2794, 2785, 2781, 2787, 2793, + 2794, 2796, 2789, 2795, 2795, 2799, 0, 2798, 2786, 2806, - 2802, 2797, 2799, 2799, 2798, 2801, 2803, 2800, 2804, 2805, - 2806, 2803, 2807, 2807, 2809, 2805, 2814, 2810, 2809, 2811, - 2813, 2802, 2810, 2815, 2811, 2816, 2804, 2812, 2812, 2818, - 2818, 2814, 2822, 2820, 2821, 2806, 2822, 2824, 2815, 2813, - 2823, 2825, 2826, 2827, 2830, 2816, 2820, 2821, 2827, 2823, - 2826, 2828, 2828, 2824, 2829, 2831, 2832, 2832, 2833, 2839, - 2825, 2850, 2830, 2829, 2836, 2836, 2837, 2837, 2841, 2841, - 2843, 2844, 2845, 2846, 2848, 2848, 2849, 2833, 2846, 2851, - 2839, 2831, 2853, 2853, 2850, 2854, 2843, 2844, 2845, 2855, - 2856, 2856, 2859, 2862, 2860, 2871, 2849, 2861, 2851, 2854, + 2796, 2784, 2798, 2807, 2791, 2800, 2800, 2805, 2799, 2800, + 2802, 2802, 2803, 2803, 2804, 2804, 2805, 2814, 2808, 2806, + 2810, 2815, 2807, 2808, 2811, 2812, 2810, 2813, 2813, 2811, + 2812, 2816, 2817, 2815, 2819, 2814, 2818, 2817, 2820, 2823, + 2819, 2821, 2821, 2823, 2824, 2825, 2826, 2826, 2827, 2824, + 2825, 2828, 2816, 2829, 2818, 2830, 2832, 2832, 2834, 2835, + 2836, 2837, 2838, 2820, 2836, 2839, 2828, 2827, 2829, 2840, + 2837, 2834, 2835, 2843, 2841, 2830, 2844, 2840, 2838, 2841, + 2842, 2842, 2843, 2845, 2839, 2846, 2846, 2847, 2850, 2850, + 2851, 2851, 2853, 2865, 2844, 2855, 2855, 2860, 2857, 2858, - 2860, 2865, 2861, 2863, 2863, 2864, 2864, 2868, 2855, 2866, - 2866, 2869, 2859, 2870, 2871, 2862, 2868, 2873, 2872, 2870, - 2880, 2865, 2874, 2874, 2875, 2876, 2876, 2875, 2881, 2866, - 2872, 2869, 2880, 2882, 2883, 2883, 2885, 2873, 2884, 2882, - 2886, 2884, 2885, 2891, 2888, 2889, 2889, 2890, 2881, 2888, - 2892, 2893, 2890, 2894, 2894, 2896, 2892, 2897, 2886, 2898, - 2899, 2901, 2891, 2900, 2900, 2903, 2902, 2896, 2893, 2893, - 2902, 2905, 2905, 2899, 2903, 2897, 2906, 2906, 2907, 2908, - 2901, 2909, 2913, 2907, 2898, 2914, 2909, 2910, 2910, 2911, - 2911, 2912, 2912, 2908, 2915, 2913, 2916, 2918, 2918, 2921, + 2859, 2863, 2860, 2862, 2862, 2864, 2847, 2867, 2867, 2845, + 2868, 2869, 2865, 2853, 2857, 2858, 2859, 2870, 2870, 2873, + 2874, 2863, 2875, 2876, 2868, 0, 2874, 2875, 2864, 2879, + 2869, 2877, 2877, 2878, 2878, 2880, 2880, 2881, 2882, 2873, + 2883, 2886, 2885, 2887, 2884, 2876, 2896, 2882, 2881, 2879, + 2884, 2888, 2888, 2886, 2889, 2880, 2890, 2891, 2891, 2890, + 2883, 2885, 2895, 2887, 2897, 2900, 2896, 2898, 2898, 2889, + 2897, 2900, 2899, 2901, 2895, 2899, 2903, 2904, 2904, 2905, + 2906, 2903, 2907, 2908, 2905, 2909, 2909, 2912, 2907, 2913, + 2911, 2901, 2916, 2914, 2915, 2915, 2920, 2920, 2923, 2906, - 2915, 2916, 2923, 2924, 2925, 2926, 2926, 2928, 2928, 2929, - 2930, 2914, 2931, 2932, 2932, 2933, 2933, 2936, 2921, 2937, - 0, 2931, 2935, 2929, 2923, 2924, 2925, 2938, 2935, 2945, - 2930, 2952, 2938, 2941, 2941, 2943, 2943, 2936, 2937, 2944, - 2946, 2947, 2948, 2945, 2944, 2953, 2946, 2949, 2949, 2950, - 2948, 2952, 2954, 2947, 2950, 2955, 2956, 2954, 2958, 2959, - 2960, 2961, 2956, 2964, 2963, 2953, 2958, 2955, 2965, 2966, - 2967, 2969, 2970, 2974, 2976, 2967, 2969, 2971, 2959, 2964, - 2960, 2961, 2963, 2971, 2972, 2965, 2965, 2976, 0, 2972, - 2966, 2975, 2970, 2974, 2979, 2979, 2975, 2980, 2980, 2981, + 2908, 2908, 2911, 2917, 2918, 2912, 2914, 2917, 2921, 2921, + 2922, 2916, 2923, 2918, 2913, 2922, 2924, 2925, 2925, 2926, + 2926, 2924, 2927, 2927, 2928, 2929, 2930, 2936, 2931, 2933, + 2933, 2938, 2930, 2931, 2939, 2940, 2944, 2928, 2941, 2941, + 2943, 2943, 2945, 2946, 2947, 2947, 2936, 2948, 2948, 2950, + 2944, 2929, 2946, 2938, 2951, 2950, 2939, 2940, 2952, 2953, + 2956, 2956, 2945, 2959, 2953, 2958, 2958, 2960, 2959, 2961, + 2962, 2963, 2964, 2964, 2951, 2961, 2967, 2952, 2965, 2963, + 2967, 2960, 2962, 2965, 2968, 2969, 2970, 2971, 2972, 2974, + 2975, 2970, 2976, 2977, 2972, 2980, 2979, 2974, 2981, 2971, - 2985, 2985, 2986, 2981, 2987, 2988, 2988, 2986, 2990, 2990, - 2991, 2991, 2994, 2991, 2992, 2992, 2994, 2992, 2993, 2993, - 2997, 2993, 2998, 2987, 2996, 2996, 3001, 3002, 3003, 3004, - 3004, 3007, 3008, 3003, 3010, 3011, 2998, 3009, 2997, 3008, - 3013, 3009, 3014, 3010, 3015, 3015, 3001, 3002, 3016, 3016, - 3011, 3014, 3017, 3017, 3018, 3019, 3007, 3021, 3013, 3020, - 3019, 3022, 3021, 3021, 3023, 3024, 3025, 3022, 3020, 3018, - 3026, 3020, 3027, 3028, 3213, 3026, 3030, 3027, 3029, 3029, - 3024, 3213, 3030, 3035, 3031, 3032, 3032, 3025, 3035, 3023, - 3031, 0, 3028, 3033, 3033, 3034, 3034, 3038, 3038, 3040, + 2982, 2983, 2985, 2986, 2968, 2969, 2983, 2985, 2990, 2975, + 0, 2980, 2976, 2977, 2979, 2981, 2981, 2988, 2987, 2992, + 2991, 2982, 2988, 2986, 2987, 2991, 2995, 2995, 2990, 2996, + 2996, 2997, 2992, 3001, 3001, 2997, 3002, 3003, 3004, 3004, + 3017, 3002, 3006, 3006, 3007, 3007, 3010, 3007, 3008, 3008, + 3010, 3008, 3009, 3009, 3013, 3009, 3003, 3012, 3012, 3014, + 3017, 3018, 3019, 3020, 3020, 3023, 3025, 3019, 3024, 3026, + 3025, 3027, 3013, 3014, 3029, 3024, 3031, 3030, 3026, 3032, + 3032, 3018, 3030, 3033, 3033, 3031, 3027, 3034, 3034, 3035, + 3023, 3036, 3029, 3037, 3038, 3039, 3036, 3040, 3041, 3038, - 3040, 3041, 3044, 3044, 3045, 3045, 3046, 3046, 3047, 3047, - 3041, 3048, 3048, 3049, 3049, 3050, 3050, 3052, 3053, 3053, - 3054, 3055, 3056, 3060, 3058, 3062, 3052, 3059, 3059, 3054, - 3064, 3061, 3068, 3055, 3063, 3063, 3070, 3062, 3060, 3065, - 3065, 3072, 3056, 3058, 3061, 3064, 3069, 3071, 3071, 3069, - 3068, 3074, 3075, 3076, 3074, 3077, 3078, 3080, 3075, 3072, - 3077, 3079, 3070, 3082, 3090, 3083, 3087, 3076, 3098, 3082, - 3100, 3098, 3105, 3080, 3083, 3078, 3101, 3101, 3107, 3079, - 3106, 3087, 3107, 3100, 3102, 3102, 3103, 3103, 3108, 3106, - 3090, 3109, 3111, 3112, 3113, 3105, 3115, 3116, 3116, 3113, + 3038, 3039, 3037, 3042, 3035, 3037, 3043, 3044, 3045, 3046, + 3046, 3043, 3044, 3041, 3047, 3048, 3049, 3049, 3050, 3050, + 3047, 3048, 3040, 3052, 3042, 3051, 3051, 3045, 3052, 3055, + 3055, 3057, 3057, 3058, 3061, 3061, 3062, 3062, 3063, 3063, + 3064, 3064, 3058, 3065, 3065, 3066, 3066, 3067, 3067, 3069, + 3070, 3070, 3071, 3072, 3073, 3077, 3075, 3079, 3069, 3076, + 3076, 3071, 3082, 3078, 3086, 3072, 3080, 3080, 3088, 3079, + 3077, 3081, 3081, 3090, 3073, 3075, 3078, 3082, 3083, 3083, + 3087, 3093, 3086, 3087, 3089, 3089, 3092, 3093, 3094, 3092, + 3095, 3090, 3096, 3098, 3088, 3095, 3097, 3100, 3101, 3108, - 3117, 3118, 3120, 3119, 3112, 3109, 3121, 3122, 3108, 3125, - 3123, 3115, 3124, 3117, 3127, 3111, 3133, 3135, 3120, 3123, - 3118, 3119, 3122, 3126, 3124, 3132, 3135, 3128, 3126, 3140, - 3125, 3121, 3128, 3141, 3127, 3145, 3133, 3134, 3134, 3132, - 3136, 3136, 3137, 3137, 3138, 3138, 3139, 3139, 3140, 3142, - 3143, 3144, 3142, 3141, 3146, 3143, 3144, 3147, 3148, 3149, - 3145, 3150, 3151, 3147, 3152, 3152, 3150, 3153, 3153, 3146, - 3154, 3149, 3148, 3155, 3156, 3156, 3158, 3160, 3163, 3163, - 3164, 3164, 3151, 3166, 3167, 3154, 3165, 3168, 3170, 3169, - 3167, 3158, 3155, 3168, 3165, 3160, 3171, 3173, 3173, 3172, + 3105, 3116, 3094, 3100, 3116, 3118, 3123, 3101, 3126, 3098, + 3128, 3096, 3119, 3119, 3097, 3105, 3120, 3120, 3118, 3121, + 3121, 3124, 3125, 3130, 3128, 3108, 3125, 3131, 3126, 3123, + 3124, 3132, 3133, 3134, 3133, 3137, 3132, 3136, 3131, 3135, + 3135, 3138, 3139, 3140, 3142, 3141, 3130, 3145, 3134, 3143, + 3136, 3144, 3145, 3142, 3137, 3146, 3151, 3147, 3139, 3138, + 3141, 3143, 3147, 3152, 3153, 3153, 3159, 3154, 3140, 3160, + 3151, 3164, 3144, 3155, 3155, 3146, 3154, 3156, 3156, 3157, + 3157, 3158, 3158, 3152, 3161, 3159, 3162, 3161, 3163, 3160, + 3165, 3162, 3166, 3163, 3167, 3168, 3164, 3169, 3166, 3170, - 3177, 3170, 3166, 3169, 3172, 3174, 3174, 3178, 3180, 3181, - 3183, 3184, 3185, 3181, 3194, 3171, 3184, 3188, 3189, 3186, - 3187, 3177, 3180, 3189, 3190, 3191, 3191, 3178, 3195, 3190, - 3183, 3185, 3186, 3187, 3194, 3196, 3188, 3197, 3197, 3198, - 3201, 3199, 3200, 3200, 3198, 3201, 3195, 3199, 3202, 3204, - 3203, 3205, 3212, 3202, 3196, 3203, 3208, 3205, 3207, 3207, - 3211, 3208, 3209, 3209, 3211, 3214, 3215, 3216, 3204, 3217, - 3218, 3212, 3225, 3216, 3220, 3220, 3222, 3222, 3223, 3226, - 3227, 3224, 3232, 3218, 3214, 3215, 3224, 3223, 3217, 3230, - 3223, 3225, 3229, 3227, 3228, 3228, 3234, 3229, 3226, 3233, + 3171, 3171, 3169, 3172, 3172, 3165, 3173, 3168, 3167, 3174, + 3175, 3175, 3177, 3179, 3182, 3182, 3183, 3183, 3184, 3170, + 3185, 3173, 3188, 3186, 3187, 3189, 3184, 3177, 3174, 3186, + 3187, 3179, 3190, 3192, 3192, 3191, 3188, 3196, 3189, 3185, + 3191, 3193, 3193, 3197, 3200, 3199, 3202, 3203, 3200, 3204, + 3208, 3190, 3203, 3207, 3205, 3208, 3206, 3209, 3196, 3199, + 3210, 3210, 3209, 3197, 3213, 3214, 3202, 3205, 3204, 3206, + 3215, 3217, 3207, 3216, 3216, 3218, 3217, 3219, 3219, 3223, + 3220, 3218, 3221, 3214, 3213, 3220, 3222, 3221, 3224, 3215, + 3227, 3222, 3226, 3226, 3224, 3227, 3228, 3228, 3223, 3230, - 3233, 3239, 3230, 3235, 3235, 3236, 3236, 3237, 3232, 3238, - 3240, 3240, 3237, 3241, 3246, 3234, 3238, 3242, 3241, 3242, - 3239, 3243, 3243, 3244, 3245, 3248, 3251, 3247, 3250, 3250, - 3244, 3245, 3247, 3246, 3253, 3254, 3255, 3256, 3260, 3253, - 3254, 3257, 3257, 3261, 3248, 3251, 3259, 3259, 3262, 3262, - 3263, 3263, 3264, 3266, 3266, 3255, 3256, 3260, 3268, 3264, - 3267, 3267, 3261, 3270, 3273, 3268, 3274, 3275, 3270, 3273, - 3276, 3276, 3277, 3277, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3274, 3275, 3281, 3281, 3281, - 3281, 3281, 3281, 3281, 3282, 3282, 3282, 3282, 3282, 3282, + 3231, 3232, 3233, 3230, 3234, 3235, 3236, 3237, 3232, 3239, + 3239, 3235, 3241, 3241, 3244, 3242, 3245, 3243, 3246, 3231, + 3237, 3233, 3243, 3234, 3242, 3236, 3249, 3242, 3247, 3247, + 3251, 3246, 3248, 3244, 3253, 3245, 3258, 3248, 0, 3249, + 3252, 3252, 3254, 3254, 3255, 3255, 3256, 3257, 3259, 3259, + 3265, 3256, 3260, 3253, 3257, 3258, 3251, 3260, 3261, 3263, + 3261, 3262, 3262, 3264, 3267, 3270, 3263, 3266, 3274, 3265, + 3264, 3272, 3266, 3269, 3269, 3273, 3272, 3275, 3276, 3276, + 3273, 3278, 3278, 3267, 3270, 3279, 3280, 3274, 3281, 3281, + 3282, 3282, 3283, 3285, 3285, 3287, 3275, 3286, 3286, 3283, - 3282, 3283, 3283, 3283, 3283, 3283, 3283, 3283, 3284, 3284, - 3284, 3284, 3284, 3284, 3284, 3285, 3285, 3285, 3285, 3285, - 3285, 3285, 3286, 3286, 3286, 3286, 3286, 3286, 3286, 3287, - 3287, 3287, 3287, 3287, 3287, 3287, 3289, 3289, 0, 3289, - 3289, 3289, 3289, 3290, 3290, 0, 0, 0, 3290, 3290, - 3291, 3291, 0, 0, 3291, 0, 3291, 3292, 0, 0, - 0, 0, 0, 3292, 3293, 3293, 0, 0, 0, 3293, - 3293, 3294, 0, 0, 0, 0, 0, 3294, 3295, 3295, - 0, 3295, 3295, 3295, 3295, 3296, 0, 0, 0, 0, - 0, 3296, 3297, 3297, 0, 0, 0, 3297, 3297, 3298, + 3293, 3289, 3287, 3292, 3279, 3280, 3289, 3294, 3292, 3295, + 3295, 3296, 3296, 0, 0, 0, 0, 0, 0, 3293, + 0, 0, 0, 0, 0, 0, 3294, 3300, 3300, 3300, + 3300, 3300, 3300, 3300, 3301, 3301, 3301, 3301, 3301, 3301, + 3301, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3303, 3303, + 3303, 3303, 3303, 3303, 3303, 3304, 3304, 3304, 3304, 3304, + 3304, 3304, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3306, + 3306, 3306, 3306, 3306, 3306, 3306, 3308, 3308, 0, 3308, + 3308, 3308, 3308, 3309, 3309, 0, 0, 0, 3309, 3309, + 3310, 3310, 0, 0, 3310, 0, 3310, 3311, 0, 0, - 3298, 0, 3298, 3298, 3298, 3298, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, 3280, - 3280, 3280, 3280, 3280, 3280, 3280, 3280 + 0, 0, 0, 3311, 3312, 3312, 0, 0, 0, 3312, + 3312, 3313, 0, 0, 0, 0, 0, 3313, 3314, 3314, + 0, 3314, 3314, 3314, 3314, 3315, 0, 0, 0, 0, + 0, 3315, 3316, 3316, 0, 0, 0, 3316, 3316, 3317, + 3317, 0, 3317, 3317, 3317, 3317, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299 } ; static yy_state_type yy_last_accepting_state; @@ -3130,7 +3145,7 @@ static void config_end_include(void) } #endif -#line 3131 "" +#line 3146 "" #define YY_NO_INPUT 1 #line 191 "./util/configlexer.lex" #ifndef YY_NO_UNPUT @@ -3139,9 +3154,9 @@ static void config_end_include(void) #ifndef YY_NO_INPUT #define YY_NO_INPUT 1 #endif -#line 3140 "" +#line 3155 "" -#line 3142 "" +#line 3157 "" #define INITIAL 0 #define quotedstring 1 @@ -3365,7 +3380,7 @@ YY_DECL { #line 211 "./util/configlexer.lex" -#line 3366 "" +#line 3381 "" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -3398,13 +3413,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3281 ) + if ( yy_current_state >= 3300 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 6407 ); + while ( yy_base[yy_current_state] != 6447 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -4365,430 +4380,430 @@ YY_RULE_SETUP case 187: YY_RULE_SETUP #line 402 "./util/configlexer.lex" -{ YDVAR(1, VAR_ADD_HOLDDOWN) } +{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) } YY_BREAK case 188: YY_RULE_SETUP #line 403 "./util/configlexer.lex" -{ YDVAR(1, VAR_DEL_HOLDDOWN) } +{ YDVAR(1, VAR_ADD_HOLDDOWN) } YY_BREAK case 189: YY_RULE_SETUP #line 404 "./util/configlexer.lex" -{ YDVAR(1, VAR_KEEP_MISSING) } +{ YDVAR(1, VAR_DEL_HOLDDOWN) } YY_BREAK case 190: YY_RULE_SETUP #line 405 "./util/configlexer.lex" -{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } +{ YDVAR(1, VAR_KEEP_MISSING) } YY_BREAK case 191: YY_RULE_SETUP #line 406 "./util/configlexer.lex" -{ YDVAR(1, VAR_USE_SYSLOG) } +{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } YY_BREAK case 192: YY_RULE_SETUP #line 407 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_IDENTITY) } +{ YDVAR(1, VAR_USE_SYSLOG) } YY_BREAK case 193: YY_RULE_SETUP #line 408 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TIME_ASCII) } +{ YDVAR(1, VAR_LOG_IDENTITY) } YY_BREAK case 194: YY_RULE_SETUP #line 409 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_QUERIES) } +{ YDVAR(1, VAR_LOG_TIME_ASCII) } YY_BREAK case 195: YY_RULE_SETUP #line 410 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_REPLIES) } +{ YDVAR(1, VAR_LOG_QUERIES) } YY_BREAK case 196: YY_RULE_SETUP #line 411 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } +{ YDVAR(1, VAR_LOG_REPLIES) } YY_BREAK case 197: YY_RULE_SETUP #line 412 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } +{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } YY_BREAK case 198: YY_RULE_SETUP #line 413 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_SERVFAIL) } +{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } YY_BREAK case 199: YY_RULE_SETUP #line 414 "./util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE) } +{ YDVAR(1, VAR_LOG_SERVFAIL) } YY_BREAK case 200: YY_RULE_SETUP #line 415 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA) } +{ YDVAR(2, VAR_LOCAL_ZONE) } YY_BREAK case 201: YY_RULE_SETUP #line 416 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA_PTR) } +{ YDVAR(1, VAR_LOCAL_DATA) } YY_BREAK case 202: YY_RULE_SETUP #line 417 "./util/configlexer.lex" -{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } +{ YDVAR(1, VAR_LOCAL_DATA_PTR) } YY_BREAK case 203: YY_RULE_SETUP #line 418 "./util/configlexer.lex" -{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } +{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } YY_BREAK case 204: YY_RULE_SETUP #line 419 "./util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_INTERVAL) } +{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } YY_BREAK case 205: YY_RULE_SETUP #line 420 "./util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } +{ YDVAR(1, VAR_STATISTICS_INTERVAL) } YY_BREAK case 206: YY_RULE_SETUP #line 421 "./util/configlexer.lex" -{ YDVAR(1, VAR_EXTENDED_STATISTICS) } +{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } YY_BREAK case 207: YY_RULE_SETUP #line 422 "./util/configlexer.lex" -{ YDVAR(1, VAR_SHM_ENABLE) } +{ YDVAR(1, VAR_EXTENDED_STATISTICS) } YY_BREAK case 208: YY_RULE_SETUP #line 423 "./util/configlexer.lex" -{ YDVAR(1, VAR_SHM_KEY) } +{ YDVAR(1, VAR_SHM_ENABLE) } YY_BREAK case 209: YY_RULE_SETUP #line 424 "./util/configlexer.lex" -{ YDVAR(0, VAR_REMOTE_CONTROL) } +{ YDVAR(1, VAR_SHM_KEY) } YY_BREAK case 210: YY_RULE_SETUP #line 425 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_ENABLE) } +{ YDVAR(0, VAR_REMOTE_CONTROL) } YY_BREAK case 211: YY_RULE_SETUP #line 426 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_INTERFACE) } +{ YDVAR(1, VAR_CONTROL_ENABLE) } YY_BREAK case 212: YY_RULE_SETUP #line 427 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_PORT) } +{ YDVAR(1, VAR_CONTROL_INTERFACE) } YY_BREAK case 213: YY_RULE_SETUP #line 428 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_USE_CERT) } +{ YDVAR(1, VAR_CONTROL_PORT) } YY_BREAK case 214: YY_RULE_SETUP #line 429 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_KEY_FILE) } +{ YDVAR(1, VAR_CONTROL_USE_CERT) } YY_BREAK case 215: YY_RULE_SETUP #line 430 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_CERT_FILE) } +{ YDVAR(1, VAR_SERVER_KEY_FILE) } YY_BREAK case 216: YY_RULE_SETUP #line 431 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_KEY_FILE) } +{ YDVAR(1, VAR_SERVER_CERT_FILE) } YY_BREAK case 217: YY_RULE_SETUP #line 432 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_CERT_FILE) } +{ YDVAR(1, VAR_CONTROL_KEY_FILE) } YY_BREAK case 218: YY_RULE_SETUP #line 433 "./util/configlexer.lex" -{ YDVAR(1, VAR_PYTHON_SCRIPT) } +{ YDVAR(1, VAR_CONTROL_CERT_FILE) } YY_BREAK case 219: YY_RULE_SETUP #line 434 "./util/configlexer.lex" -{ YDVAR(0, VAR_PYTHON) } +{ YDVAR(1, VAR_PYTHON_SCRIPT) } YY_BREAK case 220: YY_RULE_SETUP #line 435 "./util/configlexer.lex" -{ YDVAR(1, VAR_DYNLIB_FILE) } +{ YDVAR(0, VAR_PYTHON) } YY_BREAK case 221: YY_RULE_SETUP #line 436 "./util/configlexer.lex" -{ YDVAR(0, VAR_DYNLIB) } +{ YDVAR(1, VAR_DYNLIB_FILE) } YY_BREAK case 222: YY_RULE_SETUP #line 437 "./util/configlexer.lex" -{ YDVAR(1, VAR_DOMAIN_INSECURE) } +{ YDVAR(0, VAR_DYNLIB) } YY_BREAK case 223: YY_RULE_SETUP #line 438 "./util/configlexer.lex" -{ YDVAR(1, VAR_MINIMAL_RESPONSES) } +{ YDVAR(1, VAR_DOMAIN_INSECURE) } YY_BREAK case 224: YY_RULE_SETUP #line 439 "./util/configlexer.lex" -{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } +{ YDVAR(1, VAR_MINIMAL_RESPONSES) } YY_BREAK case 225: YY_RULE_SETUP #line 440 "./util/configlexer.lex" -{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } +{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } YY_BREAK case 226: YY_RULE_SETUP #line 441 "./util/configlexer.lex" -{ YDVAR(1, VAR_MAX_UDP_SIZE) } +{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } YY_BREAK case 227: YY_RULE_SETUP #line 442 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_PREFIX) } +{ YDVAR(1, VAR_MAX_UDP_SIZE) } YY_BREAK case 228: YY_RULE_SETUP #line 443 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_SYNTHALL) } +{ YDVAR(1, VAR_DNS64_PREFIX) } YY_BREAK case 229: YY_RULE_SETUP #line 444 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } +{ YDVAR(1, VAR_DNS64_SYNTHALL) } YY_BREAK case 230: YY_RULE_SETUP #line 445 "./util/configlexer.lex" -{ YDVAR(1, VAR_DEFINE_TAG) } +{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } YY_BREAK case 231: YY_RULE_SETUP #line 446 "./util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } +{ YDVAR(1, VAR_DEFINE_TAG) } YY_BREAK case 232: YY_RULE_SETUP #line 447 "./util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } +{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } YY_BREAK case 233: YY_RULE_SETUP #line 448 "./util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } +{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } YY_BREAK case 234: YY_RULE_SETUP #line 449 "./util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } YY_BREAK case 235: YY_RULE_SETUP #line 450 "./util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } YY_BREAK case 236: YY_RULE_SETUP #line 451 "./util/configlexer.lex" -{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } +{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } YY_BREAK case 237: YY_RULE_SETUP #line 452 "./util/configlexer.lex" -{ YDVAR(0, VAR_DNSTAP) } +{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } YY_BREAK case 238: YY_RULE_SETUP #line 453 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_ENABLE) } +{ YDVAR(0, VAR_DNSTAP) } YY_BREAK case 239: YY_RULE_SETUP #line 454 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } +{ YDVAR(1, VAR_DNSTAP_ENABLE) } YY_BREAK case 240: YY_RULE_SETUP #line 455 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } +{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } YY_BREAK case 241: YY_RULE_SETUP #line 456 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IP) } +{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } YY_BREAK case 242: YY_RULE_SETUP #line 457 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS) } +{ YDVAR(1, VAR_DNSTAP_IP) } YY_BREAK case 243: YY_RULE_SETUP #line 458 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } +{ YDVAR(1, VAR_DNSTAP_TLS) } YY_BREAK case 244: YY_RULE_SETUP #line 459 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } +{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } YY_BREAK case 245: YY_RULE_SETUP #line 460 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } +{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } YY_BREAK case 246: YY_RULE_SETUP -#line 462 "./util/configlexer.lex" +#line 461 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } YY_BREAK case 247: YY_RULE_SETUP -#line 464 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } +#line 463 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } YY_BREAK case 248: YY_RULE_SETUP #line 465 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } +{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } YY_BREAK case 249: YY_RULE_SETUP #line 466 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IDENTITY) } +{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } YY_BREAK case 250: YY_RULE_SETUP #line 467 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_VERSION) } +{ YDVAR(1, VAR_DNSTAP_IDENTITY) } YY_BREAK case 251: YY_RULE_SETUP #line 468 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } +{ YDVAR(1, VAR_DNSTAP_VERSION) } YY_BREAK case 252: YY_RULE_SETUP -#line 470 "./util/configlexer.lex" +#line 469 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } YY_BREAK case 253: YY_RULE_SETUP -#line 472 "./util/configlexer.lex" +#line 471 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } YY_BREAK case 254: YY_RULE_SETUP -#line 474 "./util/configlexer.lex" +#line 473 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } YY_BREAK case 255: YY_RULE_SETUP -#line 476 "./util/configlexer.lex" +#line 475 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } YY_BREAK case 256: YY_RULE_SETUP -#line 478 "./util/configlexer.lex" +#line 477 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } YY_BREAK case 257: YY_RULE_SETUP -#line 480 "./util/configlexer.lex" -{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } +#line 479 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } YY_BREAK case 258: YY_RULE_SETUP #line 481 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT) } +{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } YY_BREAK case 259: YY_RULE_SETUP #line 482 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT) } +{ YDVAR(1, VAR_IP_RATELIMIT) } YY_BREAK case 260: YY_RULE_SETUP #line 483 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } +{ YDVAR(1, VAR_RATELIMIT) } YY_BREAK case 261: YY_RULE_SETUP #line 484 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SLABS) } +{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } YY_BREAK case 262: YY_RULE_SETUP #line 485 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } +{ YDVAR(1, VAR_RATELIMIT_SLABS) } YY_BREAK case 263: YY_RULE_SETUP #line 486 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SIZE) } +{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } YY_BREAK case 264: YY_RULE_SETUP #line 487 "./util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } +{ YDVAR(1, VAR_RATELIMIT_SIZE) } YY_BREAK case 265: YY_RULE_SETUP #line 488 "./util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } +{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } YY_BREAK case 266: YY_RULE_SETUP #line 489 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } +{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } YY_BREAK case 267: YY_RULE_SETUP #line 490 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_FACTOR) } +{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } YY_BREAK case 268: YY_RULE_SETUP #line 491 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOW_RTT) } +{ YDVAR(1, VAR_RATELIMIT_FACTOR) } YY_BREAK case 269: YY_RULE_SETUP #line 492 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_NUM) } +{ YDVAR(1, VAR_LOW_RTT) } YY_BREAK case 270: YY_RULE_SETUP #line 493 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_FAST_SERVER_NUM) } YY_BREAK case 271: YY_RULE_SETUP @@ -4803,99 +4818,99 @@ YY_RULE_SETUP case 273: YY_RULE_SETUP #line 496 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_TAG) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 274: YY_RULE_SETUP #line 497 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP) } +{ YDVAR(2, VAR_RESPONSE_IP_TAG) } YY_BREAK case 275: YY_RULE_SETUP #line 498 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_DATA) } +{ YDVAR(2, VAR_RESPONSE_IP) } YY_BREAK case 276: YY_RULE_SETUP #line 499 "./util/configlexer.lex" -{ YDVAR(0, VAR_DNSCRYPT) } +{ YDVAR(2, VAR_RESPONSE_IP_DATA) } YY_BREAK case 277: YY_RULE_SETUP #line 500 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } +{ YDVAR(0, VAR_DNSCRYPT) } YY_BREAK case 278: YY_RULE_SETUP #line 501 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PORT) } +{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } YY_BREAK case 279: YY_RULE_SETUP #line 502 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } +{ YDVAR(1, VAR_DNSCRYPT_PORT) } YY_BREAK case 280: YY_RULE_SETUP #line 503 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } YY_BREAK case 281: YY_RULE_SETUP #line 504 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } +{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } YY_BREAK case 282: YY_RULE_SETUP #line 505 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } YY_BREAK case 283: YY_RULE_SETUP #line 506 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } YY_BREAK case 284: YY_RULE_SETUP -#line 508 "./util/configlexer.lex" +#line 507 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } YY_BREAK case 285: YY_RULE_SETUP -#line 510 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } +#line 509 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } YY_BREAK case 286: YY_RULE_SETUP #line 511 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } YY_BREAK case 287: YY_RULE_SETUP #line 512 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_ENABLED) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } YY_BREAK case 288: YY_RULE_SETUP #line 513 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } +{ YDVAR(1, VAR_IPSECMOD_ENABLED) } YY_BREAK case 289: YY_RULE_SETUP #line 514 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_HOOK) } +{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } YY_BREAK case 290: YY_RULE_SETUP #line 515 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } +{ YDVAR(1, VAR_IPSECMOD_HOOK) } YY_BREAK case 291: YY_RULE_SETUP #line 516 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } +{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } YY_BREAK case 292: YY_RULE_SETUP @@ -4905,113 +4920,118 @@ YY_RULE_SETUP case 293: YY_RULE_SETUP #line 518 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_STRICT) } +{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } YY_BREAK case 294: YY_RULE_SETUP #line 519 "./util/configlexer.lex" -{ YDVAR(0, VAR_CACHEDB) } +{ YDVAR(1, VAR_IPSECMOD_STRICT) } YY_BREAK case 295: YY_RULE_SETUP #line 520 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_BACKEND) } +{ YDVAR(0, VAR_CACHEDB) } YY_BREAK case 296: YY_RULE_SETUP #line 521 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } +{ YDVAR(1, VAR_CACHEDB_BACKEND) } YY_BREAK case 297: YY_RULE_SETUP #line 522 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISHOST) } +{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } YY_BREAK case 298: YY_RULE_SETUP #line 523 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISPORT) } +{ YDVAR(1, VAR_CACHEDB_REDISHOST) } YY_BREAK case 299: YY_RULE_SETUP #line 524 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } +{ YDVAR(1, VAR_CACHEDB_REDISPORT) } YY_BREAK case 300: YY_RULE_SETUP #line 525 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } +{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } YY_BREAK case 301: YY_RULE_SETUP #line 526 "./util/configlexer.lex" -{ YDVAR(0, VAR_IPSET) } +{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } YY_BREAK case 302: YY_RULE_SETUP #line 527 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V4) } +{ YDVAR(0, VAR_IPSET) } YY_BREAK case 303: YY_RULE_SETUP #line 528 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V6) } +{ YDVAR(1, VAR_IPSET_NAME_V4) } YY_BREAK case 304: YY_RULE_SETUP #line 529 "./util/configlexer.lex" -{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } +{ YDVAR(1, VAR_IPSET_NAME_V6) } YY_BREAK case 305: YY_RULE_SETUP #line 530 "./util/configlexer.lex" -{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } +{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } YY_BREAK case 306: YY_RULE_SETUP #line 531 "./util/configlexer.lex" -{ YDVAR(2, VAR_EDNS_CLIENT_TAG) } +{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } YY_BREAK case 307: YY_RULE_SETUP #line 532 "./util/configlexer.lex" -{ YDVAR(1, VAR_EDNS_CLIENT_TAG_OPCODE) } +{ YDVAR(2, VAR_EDNS_CLIENT_TAG) } YY_BREAK case 308: -/* rule 308 can match eol */ YY_RULE_SETUP #line 533 "./util/configlexer.lex" +{ YDVAR(1, VAR_EDNS_CLIENT_TAG_OPCODE) } + YY_BREAK +case 309: +/* rule 309 can match eol */ +YY_RULE_SETUP +#line 534 "./util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK /* Quoted strings. Strip leading and ending quotes */ -case 309: +case 310: YY_RULE_SETUP -#line 536 "./util/configlexer.lex" +#line 537 "./util/configlexer.lex" { BEGIN(quotedstring); LEXOUT(("QS ")); } YY_BREAK case YY_STATE_EOF(quotedstring): -#line 537 "./util/configlexer.lex" +#line 538 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 310: -YY_RULE_SETUP -#line 542 "./util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 311: -/* rule 311 can match eol */ YY_RULE_SETUP #line 543 "./util/configlexer.lex" +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } + YY_BREAK +case 312: +/* rule 312 can match eol */ +YY_RULE_SETUP +#line 544 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end \""); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 312: +case 313: YY_RULE_SETUP -#line 545 "./util/configlexer.lex" +#line 546 "./util/configlexer.lex" { LEXOUT(("QE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5024,34 +5044,34 @@ YY_RULE_SETUP } YY_BREAK /* Single Quoted strings. Strip leading and ending quotes */ -case 313: +case 314: YY_RULE_SETUP -#line 557 "./util/configlexer.lex" +#line 558 "./util/configlexer.lex" { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } YY_BREAK case YY_STATE_EOF(singlequotedstr): -#line 558 "./util/configlexer.lex" +#line 559 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 314: -YY_RULE_SETUP -#line 563 "./util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 315: -/* rule 315 can match eol */ YY_RULE_SETUP #line 564 "./util/configlexer.lex" +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } + YY_BREAK +case 316: +/* rule 316 can match eol */ +YY_RULE_SETUP +#line 565 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end '"); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 316: +case 317: YY_RULE_SETUP -#line 566 "./util/configlexer.lex" +#line 567 "./util/configlexer.lex" { LEXOUT(("SQE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5064,38 +5084,38 @@ YY_RULE_SETUP } YY_BREAK /* include: directive */ -case 317: +case 318: YY_RULE_SETUP -#line 578 "./util/configlexer.lex" +#line 579 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); } YY_BREAK case YY_STATE_EOF(include): -#line 580 "./util/configlexer.lex" +#line 581 "./util/configlexer.lex" { yyerror("EOF inside include directive"); BEGIN(inc_prev); } YY_BREAK -case 318: -YY_RULE_SETUP -#line 584 "./util/configlexer.lex" -{ LEXOUT(("ISP ")); /* ignore */ } - YY_BREAK case 319: -/* rule 319 can match eol */ YY_RULE_SETUP #line 585 "./util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++;} +{ LEXOUT(("ISP ")); /* ignore */ } YY_BREAK case 320: +/* rule 320 can match eol */ YY_RULE_SETUP #line 586 "./util/configlexer.lex" -{ LEXOUT(("IQS ")); BEGIN(include_quoted); } +{ LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK case 321: YY_RULE_SETUP #line 587 "./util/configlexer.lex" +{ LEXOUT(("IQS ")); BEGIN(include_quoted); } + YY_BREAK +case 322: +YY_RULE_SETUP +#line 588 "./util/configlexer.lex" { LEXOUT(("Iunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 0); @@ -5103,27 +5123,27 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_quoted): -#line 592 "./util/configlexer.lex" +#line 593 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 322: -YY_RULE_SETUP -#line 596 "./util/configlexer.lex" -{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } - YY_BREAK case 323: -/* rule 323 can match eol */ YY_RULE_SETUP #line 597 "./util/configlexer.lex" +{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } + YY_BREAK +case 324: +/* rule 324 can match eol */ +YY_RULE_SETUP +#line 598 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 324: +case 325: YY_RULE_SETUP -#line 599 "./util/configlexer.lex" +#line 600 "./util/configlexer.lex" { LEXOUT(("IQE ")); yytext[yyleng - 1] = '\0'; @@ -5133,7 +5153,7 @@ YY_RULE_SETUP YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(val): -#line 605 "./util/configlexer.lex" +#line 606 "./util/configlexer.lex" { LEXOUT(("LEXEOF ")); yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ @@ -5148,39 +5168,39 @@ case YY_STATE_EOF(val): } YY_BREAK /* include-toplevel: directive */ -case 325: +case 326: YY_RULE_SETUP -#line 619 "./util/configlexer.lex" +#line 620 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel); } YY_BREAK case YY_STATE_EOF(include_toplevel): -#line 622 "./util/configlexer.lex" +#line 623 "./util/configlexer.lex" { yyerror("EOF inside include_toplevel directive"); BEGIN(inc_prev); } YY_BREAK -case 326: -YY_RULE_SETUP -#line 626 "./util/configlexer.lex" -{ LEXOUT(("ITSP ")); /* ignore */ } - YY_BREAK case 327: -/* rule 327 can match eol */ YY_RULE_SETUP #line 627 "./util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++; } +{ LEXOUT(("ITSP ")); /* ignore */ } YY_BREAK case 328: +/* rule 328 can match eol */ YY_RULE_SETUP #line 628 "./util/configlexer.lex" -{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } +{ LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK case 329: YY_RULE_SETUP #line 629 "./util/configlexer.lex" +{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } + YY_BREAK +case 330: +YY_RULE_SETUP +#line 630 "./util/configlexer.lex" { LEXOUT(("ITunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 1); @@ -5189,29 +5209,29 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_toplevel_quoted): -#line 635 "./util/configlexer.lex" +#line 636 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 330: -YY_RULE_SETUP -#line 639 "./util/configlexer.lex" -{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } - YY_BREAK case 331: -/* rule 331 can match eol */ YY_RULE_SETUP #line 640 "./util/configlexer.lex" +{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } + YY_BREAK +case 332: +/* rule 332 can match eol */ +YY_RULE_SETUP +#line 641 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 332: +case 333: YY_RULE_SETUP -#line 644 "./util/configlexer.lex" +#line 645 "./util/configlexer.lex" { LEXOUT(("ITQE ")); yytext[yyleng - 1] = '\0'; @@ -5220,33 +5240,33 @@ YY_RULE_SETUP return (VAR_FORCE_TOPLEVEL); } YY_BREAK -case 333: +case 334: YY_RULE_SETUP -#line 652 "./util/configlexer.lex" +#line 653 "./util/configlexer.lex" { LEXOUT(("unquotedstr(%s) ", yytext)); if(--num_args == 0) { BEGIN(INITIAL); } yylval.str = strdup(yytext); return STRING_ARG; } YY_BREAK -case 334: +case 335: YY_RULE_SETUP -#line 656 "./util/configlexer.lex" +#line 657 "./util/configlexer.lex" { ub_c_error_msg("unknown keyword '%s'", yytext); } YY_BREAK -case 335: +case 336: YY_RULE_SETUP -#line 660 "./util/configlexer.lex" +#line 661 "./util/configlexer.lex" { ub_c_error_msg("stray '%s'", yytext); } YY_BREAK -case 336: +case 337: YY_RULE_SETUP -#line 664 "./util/configlexer.lex" +#line 665 "./util/configlexer.lex" ECHO; YY_BREAK -#line 5247 "" +#line 5267 "" case YY_END_OF_BUFFER: { @@ -5541,7 +5561,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3281 ) + if ( yy_current_state >= 3300 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -5569,11 +5589,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3281 ) + if ( yy_current_state >= 3300 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 3280); + yy_is_jam = (yy_current_state == 3299); return yy_is_jam ? 0 : yy_current_state; } @@ -6212,6 +6232,6 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 664 "./util/configlexer.lex" +#line 665 "./util/configlexer.lex" diff --git a/util/configlexer.lex b/util/configlexer.lex index 4e0bf240f..460cce2c2 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -399,6 +399,7 @@ key-cache-slabs{COLON} { YDVAR(1, VAR_KEY_CACHE_SLABS) } neg-cache-size{COLON} { YDVAR(1, VAR_NEG_CACHE_SIZE) } val-nsec3-keysize-iterations{COLON} { YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } +zonemd-permissive-mode{COLON} { YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) } add-holddown{COLON} { YDVAR(1, VAR_ADD_HOLDDOWN) } del-holddown{COLON} { YDVAR(1, VAR_DEL_HOLDDOWN) } keep-missing{COLON} { YDVAR(1, VAR_KEEP_MISSING) } diff --git a/util/configparser.c b/util/configparser.c index 0ce58427e..d527cdf9c 100644 --- a/util/configparser.c +++ b/util/configparser.c @@ -432,7 +432,8 @@ extern int yydebug; VAR_DYNLIB = 553, VAR_DYNLIB_FILE = 554, VAR_EDNS_CLIENT_TAG = 555, - VAR_EDNS_CLIENT_TAG_OPCODE = 556 + VAR_EDNS_CLIENT_TAG_OPCODE = 556, + VAR_ZONEMD_PERMISSIVE_MODE = 557 }; #endif /* Tokens. */ @@ -735,6 +736,7 @@ extern int yydebug; #define VAR_DYNLIB_FILE 554 #define VAR_EDNS_CLIENT_TAG 555 #define VAR_EDNS_CLIENT_TAG_OPCODE 556 +#define VAR_ZONEMD_PERMISSIVE_MODE 557 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -744,7 +746,7 @@ union YYSTYPE char* str; -#line 748 "util/configparser.c" +#line 750 "util/configparser.c" }; typedef union YYSTYPE YYSTYPE; @@ -994,19 +996,19 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 639 +#define YYLAST 640 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 302 +#define YYNTOKENS 303 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 327 +#define YYNNTS 328 /* YYNRULES -- Number of rules. */ -#define YYNRULES 630 +#define YYNRULES 632 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 936 +#define YYNSTATES 939 #define YYUNDEFTOK 2 -#define YYMAXUTOK 556 +#define YYMAXUTOK 557 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ @@ -1072,77 +1074,77 @@ static const yytype_uint16 yytranslate[] = 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301 + 295, 296, 297, 298, 299, 300, 301, 302 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 184, 184, 184, 185, 185, 186, 186, 187, 187, - 187, 188, 188, 189, 189, 190, 190, 191, 193, 199, - 204, 205, 206, 206, 206, 207, 207, 208, 208, 208, - 209, 209, 210, 210, 210, 211, 211, 212, 212, 212, - 213, 213, 213, 214, 214, 215, 215, 216, 216, 217, - 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, - 222, 222, 223, 223, 223, 224, 224, 224, 225, 225, - 226, 226, 227, 227, 228, 228, 229, 229, 229, 230, - 230, 231, 231, 232, 232, 232, 233, 233, 234, 234, - 235, 235, 236, 236, 236, 237, 237, 238, 238, 239, - 239, 240, 240, 241, 241, 242, 242, 242, 243, 243, - 244, 244, 244, 245, 245, 245, 246, 246, 246, 247, - 247, 247, 247, 248, 249, 249, 249, 250, 250, 250, - 251, 251, 252, 252, 253, 253, 253, 254, 254, 255, - 255, 256, 256, 256, 257, 257, 258, 258, 258, 259, - 259, 260, 260, 261, 261, 262, 263, 263, 264, 264, - 265, 265, 266, 267, 267, 268, 268, 269, 269, 270, - 270, 271, 271, 272, 272, 272, 273, 273, 274, 274, - 275, 275, 276, 276, 277, 277, 278, 278, 279, 279, - 279, 280, 280, 280, 281, 281, 281, 282, 282, 283, - 284, 284, 285, 285, 286, 286, 287, 287, 288, 288, - 288, 289, 289, 289, 290, 290, 290, 291, 291, 292, - 292, 293, 293, 294, 294, 295, 297, 309, 310, 311, - 311, 311, 311, 311, 312, 312, 314, 326, 327, 328, - 328, 328, 328, 329, 329, 331, 345, 346, 347, 347, - 347, 347, 348, 348, 348, 350, 367, 368, 369, 369, - 369, 369, 370, 370, 370, 371, 374, 393, 410, 418, - 428, 436, 453, 454, 455, 455, 455, 455, 455, 456, - 456, 456, 457, 457, 459, 468, 477, 488, 497, 506, - 515, 526, 535, 547, 561, 576, 587, 604, 621, 638, - 655, 670, 685, 698, 713, 722, 731, 740, 749, 758, - 767, 776, 785, 794, 803, 812, 821, 830, 839, 852, - 861, 874, 883, 892, 901, 908, 915, 924, 931, 940, - 948, 955, 962, 970, 979, 987, 1003, 1011, 1019, 1027, - 1035, 1043, 1052, 1061, 1075, 1084, 1093, 1102, 1111, 1120, - 1129, 1136, 1143, 1169, 1177, 1184, 1191, 1198, 1205, 1213, - 1221, 1229, 1236, 1247, 1258, 1265, 1274, 1283, 1292, 1299, - 1306, 1314, 1322, 1332, 1342, 1352, 1366, 1374, 1387, 1398, - 1406, 1419, 1428, 1437, 1446, 1456, 1466, 1474, 1487, 1496, - 1504, 1513, 1521, 1534, 1543, 1553, 1560, 1570, 1580, 1590, - 1600, 1610, 1620, 1630, 1640, 1647, 1654, 1661, 1670, 1679, - 1688, 1697, 1704, 1714, 1734, 1741, 1759, 1772, 1785, 1794, - 1803, 1812, 1821, 1831, 1841, 1852, 1861, 1870, 1879, 1888, - 1897, 1906, 1919, 1932, 1941, 1948, 1957, 1966, 1975, 1984, - 1992, 2005, 2013, 2054, 2061, 2076, 2086, 2096, 2103, 2110, - 2117, 2126, 2134, 2148, 2169, 2190, 2202, 2214, 2226, 2235, - 2256, 2266, 2275, 2283, 2291, 2304, 2317, 2332, 2347, 2356, - 2365, 2371, 2380, 2389, 2399, 2409, 2422, 2435, 2447, 2461, - 2473, 2487, 2502, 2513, 2523, 2530, 2537, 2546, 2555, 2565, - 2575, 2585, 2592, 2599, 2608, 2617, 2627, 2637, 2644, 2651, - 2658, 2666, 2676, 2686, 2696, 2706, 2745, 2755, 2763, 2771, - 2786, 2795, 2800, 2801, 2802, 2802, 2802, 2803, 2803, 2803, - 2804, 2804, 2806, 2816, 2825, 2832, 2839, 2846, 2853, 2860, - 2867, 2872, 2873, 2874, 2874, 2874, 2875, 2875, 2875, 2876, - 2877, 2877, 2878, 2878, 2879, 2879, 2880, 2881, 2882, 2883, - 2884, 2885, 2887, 2896, 2906, 2913, 2920, 2929, 2936, 2943, - 2950, 2957, 2966, 2975, 2982, 2989, 2999, 3009, 3019, 3029, - 3039, 3049, 3054, 3055, 3056, 3058, 3064, 3069, 3070, 3071, - 3073, 3079, 3089, 3096, 3105, 3113, 3118, 3119, 3121, 3121, - 3121, 3122, 3122, 3123, 3124, 3125, 3126, 3127, 3129, 3139, - 3148, 3155, 3164, 3171, 3180, 3188, 3201, 3209, 3222, 3227, - 3228, 3229, 3229, 3230, 3230, 3230, 3231, 3233, 3245, 3257, - 3269, 3284, 3297, 3310, 3321, 3326, 3327, 3328, 3328, 3330, - 3345 + 0, 185, 185, 185, 186, 186, 187, 187, 188, 188, + 188, 189, 189, 190, 190, 191, 191, 192, 194, 200, + 205, 206, 207, 207, 207, 208, 208, 209, 209, 209, + 210, 210, 211, 211, 211, 212, 212, 213, 213, 213, + 214, 214, 214, 215, 215, 216, 216, 217, 217, 218, + 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, + 223, 223, 224, 224, 224, 225, 225, 225, 226, 226, + 227, 227, 228, 228, 229, 229, 230, 230, 230, 231, + 231, 232, 232, 233, 233, 233, 234, 234, 235, 235, + 236, 236, 237, 237, 237, 238, 238, 239, 239, 240, + 240, 241, 241, 242, 242, 243, 243, 243, 244, 244, + 245, 245, 245, 246, 246, 246, 247, 247, 247, 248, + 248, 248, 248, 249, 250, 250, 250, 251, 251, 251, + 252, 252, 253, 253, 254, 254, 254, 255, 255, 256, + 256, 257, 257, 257, 258, 258, 259, 259, 259, 260, + 260, 261, 261, 262, 262, 263, 264, 264, 265, 265, + 266, 266, 267, 268, 268, 269, 269, 270, 270, 271, + 271, 272, 272, 273, 273, 273, 274, 274, 275, 275, + 276, 276, 277, 277, 278, 278, 279, 279, 280, 280, + 280, 281, 281, 281, 282, 282, 282, 283, 283, 284, + 285, 285, 286, 286, 287, 287, 288, 288, 289, 289, + 289, 290, 290, 290, 291, 291, 291, 292, 292, 293, + 293, 294, 294, 295, 295, 296, 296, 298, 310, 311, + 312, 312, 312, 312, 312, 313, 313, 315, 327, 328, + 329, 329, 329, 329, 330, 330, 332, 346, 347, 348, + 348, 348, 348, 349, 349, 349, 351, 368, 369, 370, + 370, 370, 370, 371, 371, 371, 372, 375, 394, 411, + 419, 429, 437, 454, 455, 456, 456, 456, 456, 456, + 457, 457, 457, 458, 458, 460, 469, 478, 489, 498, + 507, 516, 527, 536, 548, 562, 577, 588, 605, 622, + 639, 656, 671, 686, 699, 714, 723, 732, 741, 750, + 759, 768, 777, 786, 795, 804, 813, 822, 831, 840, + 853, 862, 875, 884, 893, 902, 909, 916, 925, 932, + 941, 949, 956, 963, 971, 980, 988, 1004, 1012, 1020, + 1028, 1036, 1044, 1053, 1062, 1076, 1085, 1094, 1103, 1112, + 1121, 1130, 1137, 1144, 1170, 1178, 1185, 1192, 1199, 1206, + 1214, 1222, 1230, 1237, 1248, 1259, 1266, 1275, 1284, 1293, + 1300, 1307, 1315, 1323, 1333, 1343, 1353, 1367, 1375, 1388, + 1399, 1407, 1420, 1429, 1438, 1447, 1457, 1467, 1475, 1488, + 1497, 1505, 1514, 1522, 1535, 1544, 1554, 1561, 1571, 1581, + 1591, 1601, 1611, 1621, 1631, 1641, 1648, 1655, 1662, 1671, + 1680, 1689, 1698, 1705, 1715, 1735, 1742, 1760, 1773, 1786, + 1795, 1804, 1813, 1822, 1832, 1842, 1853, 1862, 1871, 1880, + 1889, 1898, 1907, 1920, 1933, 1942, 1949, 1958, 1967, 1976, + 1985, 1994, 2002, 2015, 2023, 2064, 2071, 2086, 2096, 2106, + 2113, 2120, 2127, 2136, 2144, 2158, 2179, 2200, 2212, 2224, + 2236, 2245, 2266, 2276, 2285, 2293, 2301, 2314, 2327, 2342, + 2357, 2366, 2375, 2381, 2390, 2399, 2409, 2419, 2432, 2445, + 2457, 2471, 2483, 2497, 2512, 2523, 2533, 2540, 2547, 2556, + 2565, 2575, 2585, 2595, 2602, 2609, 2618, 2627, 2637, 2647, + 2654, 2661, 2668, 2676, 2686, 2696, 2706, 2716, 2755, 2765, + 2773, 2781, 2796, 2805, 2810, 2811, 2812, 2812, 2812, 2813, + 2813, 2813, 2814, 2814, 2816, 2826, 2835, 2842, 2849, 2856, + 2863, 2870, 2877, 2882, 2883, 2884, 2884, 2884, 2885, 2885, + 2885, 2886, 2887, 2887, 2888, 2888, 2889, 2889, 2890, 2891, + 2892, 2893, 2894, 2895, 2897, 2906, 2916, 2923, 2930, 2939, + 2946, 2953, 2960, 2967, 2976, 2985, 2992, 2999, 3009, 3019, + 3029, 3039, 3049, 3059, 3064, 3065, 3066, 3068, 3074, 3079, + 3080, 3081, 3083, 3089, 3099, 3106, 3115, 3123, 3128, 3129, + 3131, 3131, 3131, 3132, 3132, 3133, 3134, 3135, 3136, 3137, + 3139, 3149, 3158, 3165, 3174, 3181, 3190, 3198, 3211, 3219, + 3232, 3237, 3238, 3239, 3239, 3240, 3240, 3240, 3241, 3243, + 3255, 3267, 3279, 3294, 3307, 3320, 3331, 3336, 3337, 3338, + 3338, 3340, 3355 }; #endif @@ -1263,17 +1265,17 @@ static const char *const yytname[] = "VAR_RPZ", "VAR_TAGS", "VAR_RPZ_ACTION_OVERRIDE", "VAR_RPZ_CNAME_OVERRIDE", "VAR_RPZ_LOG", "VAR_RPZ_LOG_NAME", "VAR_DYNLIB", "VAR_DYNLIB_FILE", "VAR_EDNS_CLIENT_TAG", - "VAR_EDNS_CLIENT_TAG_OPCODE", "$accept", "toplevelvars", "toplevelvar", - "force_toplevel", "serverstart", "contents_server", "content_server", - "stubstart", "contents_stub", "content_stub", "forwardstart", - "contents_forward", "content_forward", "viewstart", "contents_view", - "content_view", "authstart", "contents_auth", "content_auth", "rpz_tag", - "rpz_action_override", "rpz_cname_override", "rpz_log", "rpz_log_name", - "rpzstart", "contents_rpz", "content_rpz", "server_num_threads", - "server_verbosity", "server_statistics_interval", - "server_statistics_cumulative", "server_extended_statistics", - "server_shm_enable", "server_shm_key", "server_port", - "server_send_client_subnet", "server_client_subnet_zone", + "VAR_EDNS_CLIENT_TAG_OPCODE", "VAR_ZONEMD_PERMISSIVE_MODE", "$accept", + "toplevelvars", "toplevelvar", "force_toplevel", "serverstart", + "contents_server", "content_server", "stubstart", "contents_stub", + "content_stub", "forwardstart", "contents_forward", "content_forward", + "viewstart", "contents_view", "content_view", "authstart", + "contents_auth", "content_auth", "rpz_tag", "rpz_action_override", + "rpz_cname_override", "rpz_log", "rpz_log_name", "rpzstart", + "contents_rpz", "content_rpz", "server_num_threads", "server_verbosity", + "server_statistics_interval", "server_statistics_cumulative", + "server_extended_statistics", "server_shm_enable", "server_shm_key", + "server_port", "server_send_client_subnet", "server_client_subnet_zone", "server_client_subnet_always_forward", "server_client_subnet_opcode", "server_max_client_subnet_ipv4", "server_max_client_subnet_ipv6", "server_min_client_subnet_ipv4", "server_min_client_subnet_ipv6", @@ -1336,8 +1338,8 @@ static const char *const yytname[] = "server_serve_expired_ttl_reset", "server_serve_expired_reply_ttl", "server_serve_expired_client_timeout", "server_fake_dsa", "server_fake_sha1", "server_val_log_level", - "server_val_nsec3_keysize_iterations", "server_add_holddown", - "server_del_holddown", "server_keep_missing", + "server_val_nsec3_keysize_iterations", "server_zonemd_permissive_mode", + "server_add_holddown", "server_del_holddown", "server_keep_missing", "server_permit_small_holddown", "server_key_cache_size", "server_key_cache_slabs", "server_neg_cache_size", "server_local_zone", "server_local_data", "server_local_data_ptr", "server_minimal_responses", @@ -1432,7 +1434,7 @@ static const yytype_uint16 yytoknum[] = 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556 + 555, 556, 557 }; # endif @@ -1474,7 +1476,7 @@ static const yytype_int16 yypact[] = 251, 252, 253, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 279, 280, 281, 283, - 284, 285, 287, 321, 322, 323, 324, 328, 329, -290, + 284, 285, 287, 321, 322, 323, 324, 328, 329, 330, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, @@ -1495,55 +1497,55 @@ static const yytype_int16 yypact[] = -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, 330, 372, 373, 374, 375, 376, - 377, -290, -290, -290, -290, -290, -290, -290, -290, 378, - 379, 380, 384, 388, 389, -290, -290, -290, -290, -290, - -290, -290, 414, 415, 416, 425, 437, 438, 439, -290, - -290, -290, -290, -290, -290, -290, -290, 440, 441, 442, - 443, 444, 445, 446, 447, -290, -290, -290, -290, -290, - -290, -290, -290, -290, 448, 449, 450, 451, 452, -290, + -290, -290, -290, -290, -290, -290, 372, 373, 374, 375, + 376, 377, 378, -290, -290, -290, -290, -290, -290, -290, + -290, 379, 380, 384, 388, 389, 414, -290, -290, -290, + -290, -290, -290, -290, 415, 416, 425, 437, 438, 439, + 440, -290, -290, -290, -290, -290, -290, -290, -290, 441, + 442, 443, 444, 445, 446, 447, 448, -290, -290, -290, + -290, -290, -290, -290, -290, -290, 449, 450, 451, 452, + 453, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, 454, 455, 456, 496, 498, 514, 515, 516, + -290, -290, -290, -290, -290, -290, -290, -290, -290, 517, + 518, 519, 520, 521, 522, 523, 524, 531, 532, 533, + 534, 535, 536, 537, 539, 540, 541, 542, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - 453, 454, 455, 456, 496, 498, 514, 515, -290, -290, - -290, -290, -290, -290, -290, -290, -290, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 531, 532, 533, 534, - 535, 536, 537, 539, 540, 541, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, 542, -290, -290, 543, - -290, -290, 544, 545, 548, 551, 554, 555, 564, 565, - 566, 568, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, 569, 570, 571, 572, 573, 574, -290, - -290, -290, -290, -290, -290, -290, 575, 578, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, 543, -290, + -290, 544, -290, -290, 545, 548, 551, 554, 555, 564, + 565, 566, 568, 569, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, 570, 571, 572, 573, 574, + 575, -290, -290, -290, -290, -290, -290, -290, 579, 580, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, 579, 580, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, 581, 582, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, 581, 582, 583, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, 584, + -290, -290, -290, -290, -290, -290, -290, -290, 583, 584, 585, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, 586, 587, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - 586, 587, 588, 589, 590, 591, -290, -290, -290, -290, + -290, -290, 588, 589, 590, 591, 592, 593, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, 592, -290, -290, -290, -290, -290, -290, - -290, -290, -290, 593, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, 594, - -290, -290, 595, 596, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, 594, -290, -290, -290, -290, + -290, -290, -290, -290, -290, 595, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, 596, -290, -290, 597, 598, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, 597, 598, 599, -290, -290, -290, - -290, -290, -290, -290, -290, -290 + -290, -290, -290, -290, -290, -290, -290, 599, 600, 601, + -290, -290, -290, -290, -290, -290, -290, -290, -290 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1551,10 +1553,10 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 2, 0, 1, 18, 19, 226, 236, 511, 571, 530, - 245, 585, 608, 255, 624, 271, 576, 3, 17, 21, - 228, 238, 247, 257, 273, 513, 532, 573, 578, 587, - 610, 626, 4, 5, 6, 10, 14, 15, 8, 9, + 2, 0, 1, 18, 19, 227, 237, 513, 573, 532, + 246, 587, 610, 256, 626, 272, 578, 3, 17, 21, + 229, 239, 248, 258, 274, 515, 534, 575, 580, 589, + 612, 628, 4, 5, 6, 10, 14, 15, 8, 9, 7, 16, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1575,76 +1577,76 @@ static const yytype_uint16 yydefact[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 22, 23, 86, 89, 98, 194, 195, 24, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 37, 77, - 25, 90, 91, 48, 70, 85, 26, 27, 30, 31, - 28, 29, 32, 33, 34, 35, 36, 121, 206, 122, - 124, 125, 126, 208, 213, 209, 220, 221, 222, 223, - 127, 128, 129, 130, 131, 132, 133, 190, 87, 76, - 102, 119, 120, 218, 215, 123, 38, 39, 40, 41, - 42, 78, 92, 93, 108, 64, 74, 65, 198, 199, - 103, 58, 59, 197, 60, 61, 112, 116, 137, 146, - 173, 149, 219, 113, 71, 43, 44, 45, 100, 138, - 139, 140, 46, 47, 49, 50, 52, 53, 51, 144, - 150, 54, 55, 56, 62, 81, 117, 95, 145, 88, - 169, 96, 97, 114, 115, 216, 101, 57, 79, 82, - 63, 66, 104, 105, 80, 170, 106, 67, 68, 69, - 207, 118, 183, 184, 185, 186, 187, 188, 196, 107, - 75, 109, 110, 111, 171, 72, 73, 94, 83, 84, - 99, 134, 135, 217, 136, 141, 142, 143, 174, 175, - 177, 179, 180, 178, 181, 191, 147, 148, 153, 154, - 151, 152, 155, 156, 158, 157, 210, 212, 211, 172, - 182, 200, 202, 201, 203, 204, 205, 224, 225, 176, - 189, 192, 193, 214, 0, 0, 0, 0, 0, 0, - 0, 227, 229, 230, 231, 233, 234, 235, 232, 0, - 0, 0, 0, 0, 0, 237, 239, 240, 241, 242, - 243, 244, 0, 0, 0, 0, 0, 0, 0, 246, - 248, 249, 252, 253, 250, 254, 251, 0, 0, 0, - 0, 0, 0, 0, 0, 256, 258, 259, 260, 261, - 265, 262, 263, 264, 0, 0, 0, 0, 0, 276, - 280, 281, 282, 283, 272, 274, 275, 277, 278, 279, - 0, 0, 0, 0, 0, 0, 0, 0, 512, 514, - 516, 515, 521, 517, 518, 519, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 531, 533, 535, 534, - 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 0, 572, 574, 0, - 577, 579, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 586, 588, 589, 590, 592, 593, 591, 594, - 595, 596, 597, 0, 0, 0, 0, 0, 0, 609, - 611, 612, 613, 614, 615, 616, 0, 0, 625, 627, - 628, 285, 284, 291, 304, 302, 314, 310, 311, 315, - 312, 313, 316, 317, 318, 319, 320, 350, 351, 352, - 353, 354, 379, 380, 381, 386, 387, 307, 388, 389, - 392, 390, 391, 395, 396, 397, 411, 365, 366, 368, - 369, 398, 414, 359, 361, 415, 421, 422, 423, 308, - 378, 439, 440, 360, 434, 343, 303, 355, 412, 418, - 399, 0, 0, 443, 309, 286, 342, 403, 287, 305, - 306, 356, 357, 441, 401, 405, 406, 288, 444, 382, - 410, 344, 364, 416, 417, 420, 433, 358, 437, 435, - 436, 370, 377, 407, 408, 371, 372, 400, 425, 345, - 346, 349, 321, 323, 324, 325, 326, 327, 334, 335, - 336, 337, 338, 339, 340, 445, 446, 448, 383, 384, - 385, 393, 394, 449, 450, 451, 0, 0, 0, 402, - 373, 375, 581, 460, 464, 462, 461, 465, 463, 0, - 0, 468, 469, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 404, 419, 438, 473, 474, 374, 452, - 0, 0, 0, 0, 0, 0, 426, 427, 428, 429, - 430, 431, 432, 582, 367, 362, 424, 341, 289, 290, - 363, 475, 477, 476, 478, 479, 480, 322, 329, 470, - 472, 471, 328, 0, 348, 409, 447, 347, 376, 330, - 331, 333, 332, 0, 482, 483, 484, 485, 489, 488, - 486, 487, 490, 491, 492, 493, 495, 494, 504, 0, - 508, 509, 0, 0, 510, 496, 502, 497, 498, 499, - 501, 503, 500, 266, 267, 268, 269, 270, 522, 524, - 523, 526, 527, 528, 529, 525, 552, 554, 555, 556, - 557, 558, 559, 560, 561, 562, 553, 563, 564, 565, - 566, 567, 568, 569, 570, 575, 580, 598, 599, 600, - 603, 601, 602, 604, 605, 606, 607, 617, 618, 619, - 620, 621, 622, 629, 630, 413, 442, 459, 583, 584, - 466, 467, 453, 454, 0, 0, 0, 458, 623, 481, - 505, 506, 507, 457, 455, 456 + 20, 22, 23, 86, 89, 98, 194, 195, 24, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 37, + 77, 25, 90, 91, 48, 70, 85, 26, 27, 30, + 31, 28, 29, 32, 33, 34, 35, 36, 121, 206, + 122, 124, 125, 126, 208, 213, 209, 220, 221, 222, + 223, 127, 128, 129, 130, 131, 132, 133, 190, 87, + 76, 102, 119, 120, 218, 215, 123, 38, 39, 40, + 41, 42, 78, 92, 93, 108, 64, 74, 65, 198, + 199, 103, 58, 59, 197, 60, 61, 112, 116, 137, + 146, 173, 149, 219, 113, 71, 43, 44, 45, 100, + 138, 139, 140, 46, 47, 49, 50, 52, 53, 51, + 144, 150, 54, 55, 56, 62, 81, 117, 95, 145, + 88, 169, 96, 97, 114, 115, 216, 101, 57, 79, + 82, 63, 66, 104, 105, 80, 170, 106, 67, 68, + 69, 207, 118, 183, 184, 185, 186, 187, 188, 196, + 107, 75, 226, 109, 110, 111, 171, 72, 73, 94, + 83, 84, 99, 134, 135, 217, 136, 141, 142, 143, + 174, 175, 177, 179, 180, 178, 181, 191, 147, 148, + 153, 154, 151, 152, 155, 156, 158, 157, 210, 212, + 211, 172, 182, 200, 202, 201, 203, 204, 205, 224, + 225, 176, 189, 192, 193, 214, 0, 0, 0, 0, + 0, 0, 0, 228, 230, 231, 232, 234, 235, 236, + 233, 0, 0, 0, 0, 0, 0, 238, 240, 241, + 242, 243, 244, 245, 0, 0, 0, 0, 0, 0, + 0, 247, 249, 250, 253, 254, 251, 255, 252, 0, + 0, 0, 0, 0, 0, 0, 0, 257, 259, 260, + 261, 262, 266, 263, 264, 265, 0, 0, 0, 0, + 0, 277, 281, 282, 283, 284, 273, 275, 276, 278, + 279, 280, 0, 0, 0, 0, 0, 0, 0, 0, + 514, 516, 518, 517, 523, 519, 520, 521, 522, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 533, 535, + 537, 536, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 0, 574, + 576, 0, 579, 581, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 588, 590, 591, 592, 594, 595, + 593, 596, 597, 598, 599, 0, 0, 0, 0, 0, + 0, 611, 613, 614, 615, 616, 617, 618, 0, 0, + 627, 629, 630, 286, 285, 292, 305, 303, 315, 311, + 312, 316, 313, 314, 317, 318, 319, 320, 321, 351, + 352, 353, 354, 355, 380, 381, 382, 387, 388, 308, + 389, 390, 393, 391, 392, 396, 397, 398, 412, 366, + 367, 369, 370, 399, 415, 360, 362, 416, 422, 423, + 424, 309, 379, 441, 442, 361, 435, 344, 304, 356, + 413, 419, 400, 0, 0, 445, 310, 287, 343, 404, + 288, 306, 307, 357, 358, 443, 402, 406, 407, 289, + 446, 383, 411, 345, 365, 417, 418, 421, 434, 359, + 439, 437, 438, 371, 378, 408, 409, 372, 373, 401, + 426, 346, 347, 350, 322, 324, 325, 326, 327, 328, + 335, 336, 337, 338, 339, 340, 341, 447, 448, 450, + 384, 385, 386, 394, 395, 451, 452, 453, 0, 0, + 0, 403, 374, 376, 583, 462, 466, 464, 463, 467, + 465, 0, 0, 470, 471, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 405, 420, 440, 475, 476, + 375, 454, 0, 0, 0, 0, 0, 0, 427, 428, + 429, 430, 431, 432, 433, 584, 368, 363, 425, 342, + 290, 291, 364, 477, 479, 478, 480, 481, 482, 323, + 330, 472, 474, 473, 329, 0, 349, 410, 449, 348, + 377, 331, 332, 334, 333, 0, 484, 436, 485, 486, + 487, 491, 490, 488, 489, 492, 493, 494, 495, 497, + 496, 506, 0, 510, 511, 0, 0, 512, 498, 504, + 499, 500, 501, 503, 505, 502, 267, 268, 269, 270, + 271, 524, 526, 525, 528, 529, 530, 531, 527, 554, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 555, + 565, 566, 567, 568, 569, 570, 571, 572, 577, 582, + 600, 601, 602, 605, 603, 604, 606, 607, 608, 609, + 619, 620, 621, 622, 623, 624, 631, 632, 414, 444, + 461, 585, 586, 468, 469, 455, 456, 0, 0, 0, + 460, 625, 483, 507, 508, 509, 459, 457, 458 }; /* YYPGOTO[NTERM-NUM]. */ @@ -1673,8 +1675,8 @@ static const yytype_int16 yypgoto[] = -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, 576, - 577, 600, 601, 602, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + 576, 577, 578, 602, 603, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, @@ -1682,45 +1684,45 @@ static const yytype_int16 yypgoto[] = -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290 + -290, -290, -290, -290, -290, -290, -290, -290 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 17, 18, 19, 32, 249, 20, 33, 461, - 21, 34, 475, 22, 35, 489, 23, 36, 505, 519, - 520, 521, 522, 523, 24, 37, 524, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 445, 446, 447, 448, 462, 463, 464, 465, - 466, 467, 468, 476, 477, 478, 479, 480, 481, 506, - 507, 508, 509, 510, 511, 512, 513, 490, 491, 492, - 493, 494, 495, 496, 25, 38, 538, 539, 540, 541, - 542, 543, 544, 545, 546, 26, 39, 566, 567, 568, - 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, - 579, 580, 581, 582, 583, 584, 585, 27, 40, 587, - 588, 28, 41, 590, 591, 449, 450, 451, 452, 29, - 42, 602, 603, 604, 605, 606, 607, 608, 609, 610, - 611, 612, 30, 43, 619, 620, 621, 622, 623, 624, - 625, 453, 31, 44, 628, 629, 630 + -1, 1, 17, 18, 19, 32, 250, 20, 33, 463, + 21, 34, 477, 22, 35, 491, 23, 36, 507, 521, + 522, 523, 524, 525, 24, 37, 526, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 464, 465, 466, + 467, 468, 469, 470, 478, 479, 480, 481, 482, 483, + 508, 509, 510, 511, 512, 513, 514, 515, 492, 493, + 494, 495, 496, 497, 498, 25, 38, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 26, 39, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 27, 40, + 589, 590, 28, 41, 592, 593, 451, 452, 453, 454, + 29, 42, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 30, 43, 621, 622, 623, 624, 625, + 626, 627, 455, 31, 44, 630, 631, 632 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1728,70 +1730,71 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint16 yytable[] = { - 2, 497, 482, 454, 586, 455, 456, 469, 626, 627, - 589, 3, 4, 631, 632, 470, 471, 613, 614, 615, - 616, 617, 618, 633, 497, 592, 593, 594, 595, 596, - 597, 598, 599, 600, 601, 634, 635, 636, 483, 484, - 637, 638, 639, 640, 641, 642, 5, 643, 644, 645, - 646, 647, 6, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 485, 658, 659, 457, 547, 548, 549, - 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, - 560, 561, 562, 563, 564, 565, 530, 531, 532, 533, - 534, 535, 536, 537, 660, 661, 7, 458, 662, 663, - 472, 664, 473, 665, 666, 667, 668, 459, 669, 670, - 671, 672, 8, 673, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, - 690, 691, 692, 693, 694, 695, 696, 697, 698, 486, - 487, 699, 700, 701, 702, 703, 704, 705, 706, 707, - 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 9, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 488, - 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, - 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, - 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, - 10, 499, 500, 501, 776, 777, 778, 779, 780, 781, - 782, 504, 783, 784, 785, 786, 787, 460, 11, 788, - 474, 789, 498, 790, 499, 500, 501, 502, 503, 514, - 515, 516, 517, 518, 504, 12, 791, 792, 793, 794, - 795, 796, 797, 798, 13, 799, 800, 801, 802, 803, - 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, - 814, 815, 816, 817, 818, 819, 820, 821, 14, 822, - 823, 824, 15, 825, 826, 827, 0, 828, 16, 45, + 2, 499, 484, 456, 588, 457, 458, 471, 628, 629, + 591, 3, 4, 633, 634, 472, 473, 615, 616, 617, + 618, 619, 620, 635, 499, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 636, 637, 638, 485, 486, + 639, 640, 641, 642, 643, 644, 5, 645, 646, 647, + 648, 649, 6, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 487, 660, 661, 459, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 532, 533, 534, 535, + 536, 537, 538, 539, 662, 663, 7, 460, 664, 665, + 474, 666, 475, 667, 668, 669, 670, 461, 671, 672, + 673, 674, 8, 675, 676, 677, 678, 679, 680, 681, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 488, + 489, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 9, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 490, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, + 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, + 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, + 10, 501, 502, 503, 778, 779, 780, 781, 782, 783, + 784, 506, 785, 786, 787, 788, 789, 462, 11, 790, + 476, 791, 500, 792, 501, 502, 503, 504, 505, 516, + 517, 518, 519, 520, 506, 12, 793, 794, 795, 796, + 797, 798, 799, 800, 13, 801, 802, 803, 804, 805, + 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, + 816, 817, 818, 819, 820, 821, 822, 823, 14, 824, + 825, 826, 15, 827, 828, 829, 0, 830, 16, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 829, 830, 831, 832, 77, 78, 79, 833, 834, - 835, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 76, 831, 832, 833, 834, 77, 78, 79, 835, 836, + 837, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 836, 837, 838, 839, 840, 841, 842, 843, - 844, 121, 122, 123, 845, 124, 125, 126, 846, 847, + 119, 120, 838, 839, 840, 841, 842, 843, 844, 845, + 846, 121, 122, 123, 847, 124, 125, 126, 848, 849, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 848, 849, 850, 151, 152, 153, - 154, 155, 156, 157, 158, 851, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 852, 853, 854, - 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, - 865, 866, 867, 868, 869, 870, 871, 170, 171, 172, + 147, 148, 149, 150, 850, 851, 852, 151, 152, 153, + 154, 155, 156, 157, 158, 853, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 854, 855, 856, + 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, + 867, 868, 869, 870, 871, 872, 873, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 872, 209, 873, 210, + 203, 204, 205, 206, 207, 208, 874, 209, 875, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 874, 875, 876, 877, 878, 879, - 880, 881, 882, 883, 884, 225, 226, 227, 228, 229, - 230, 885, 886, 887, 888, 889, 890, 891, 231, 892, - 893, 894, 895, 896, 897, 898, 232, 233, 899, 234, - 235, 900, 236, 237, 901, 902, 238, 239, 240, 241, - 242, 243, 244, 245, 903, 904, 905, 246, 906, 907, - 908, 909, 910, 911, 912, 913, 247, 248, 914, 915, - 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, - 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, - 0, 0, 0, 525, 526, 0, 0, 0, 0, 0, + 221, 222, 223, 224, 876, 877, 878, 879, 880, 881, + 882, 883, 884, 885, 886, 225, 226, 227, 228, 229, + 230, 887, 888, 889, 890, 891, 892, 893, 231, 894, + 895, 896, 897, 898, 899, 900, 232, 233, 901, 234, + 235, 902, 236, 237, 903, 904, 238, 239, 240, 241, + 242, 243, 244, 245, 905, 906, 907, 246, 908, 909, + 910, 911, 912, 913, 914, 915, 247, 248, 249, 916, + 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, + 937, 938, 0, 527, 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 527, 528, 529 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 530, + 531 }; static const yytype_int16 yycheck[] = @@ -1854,23 +1857,24 @@ static const yytype_int16 yycheck[] = 10, 10, 10, 10, 10, 10, 270, 271, 10, 273, 274, 10, 276, 277, 10, 10, 280, 281, 282, 283, 284, 285, 286, 287, 10, 10, 10, 291, 10, 10, - 10, 10, 10, 10, 10, 10, 300, 301, 10, 10, + 10, 10, 10, 10, 10, 10, 300, 301, 302, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - -1, -1, -1, 37, 37, -1, -1, -1, -1, -1, + 10, 10, -1, 37, 37, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 37, 37, 37 + -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, + 37 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 303, 0, 11, 12, 46, 52, 96, 112, 161, - 220, 238, 255, 264, 288, 292, 298, 304, 305, 306, - 309, 312, 315, 318, 326, 556, 567, 589, 593, 601, - 614, 624, 307, 310, 313, 316, 319, 327, 557, 568, - 590, 594, 602, 615, 625, 13, 14, 15, 16, 17, + 0, 304, 0, 11, 12, 46, 52, 96, 112, 161, + 220, 238, 255, 264, 288, 292, 298, 305, 306, 307, + 310, 313, 316, 319, 327, 558, 569, 591, 595, 603, + 616, 626, 308, 311, 314, 317, 320, 328, 559, 570, + 592, 596, 604, 617, 627, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 49, 50, 51, @@ -1890,8 +1894,8 @@ static const yytype_uint16 yystos[] = 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 249, 250, 251, 252, 253, 254, 262, 270, 271, 273, 274, 276, 277, 280, 281, - 282, 283, 284, 285, 286, 287, 291, 300, 301, 308, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 282, 283, 284, 285, 286, 287, 291, 300, 301, 302, + 309, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, @@ -1910,26 +1914,26 @@ static const yytype_uint16 yystos[] = 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 526, 527, 597, - 598, 599, 600, 623, 45, 47, 48, 108, 139, 149, - 279, 311, 528, 529, 530, 531, 532, 533, 534, 45, - 53, 54, 138, 140, 278, 314, 535, 536, 537, 538, - 539, 540, 45, 81, 82, 106, 182, 183, 222, 317, - 549, 550, 551, 552, 553, 554, 555, 45, 263, 265, - 266, 267, 268, 269, 275, 320, 541, 542, 543, 544, - 545, 546, 547, 548, 293, 294, 295, 296, 297, 321, - 322, 323, 324, 325, 328, 541, 542, 543, 544, 545, - 97, 98, 99, 100, 101, 102, 103, 104, 558, 559, - 560, 561, 562, 563, 564, 565, 566, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 569, 570, 571, 572, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 599, 600, 601, 602, 625, 45, 47, 48, 108, + 139, 149, 279, 312, 530, 531, 532, 533, 534, 535, + 536, 45, 53, 54, 138, 140, 278, 315, 537, 538, + 539, 540, 541, 542, 45, 81, 82, 106, 182, 183, + 222, 318, 551, 552, 553, 554, 555, 556, 557, 45, + 263, 265, 266, 267, 268, 269, 275, 321, 543, 544, + 545, 546, 547, 548, 549, 550, 293, 294, 295, 296, + 297, 322, 323, 324, 325, 326, 329, 543, 544, 545, + 546, 547, 97, 98, 99, 100, 101, 102, 103, 104, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 113, 591, 592, 299, - 595, 596, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 603, 604, 605, 606, 607, 608, 609, 610, - 611, 612, 613, 256, 257, 258, 259, 260, 261, 616, - 617, 618, 619, 620, 621, 622, 289, 290, 626, 627, - 628, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 583, 584, 585, 586, 587, 588, 589, 590, 113, 593, + 594, 299, 597, 598, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 256, 257, 258, 259, 260, + 261, 618, 619, 620, 621, 622, 623, 624, 289, 290, + 628, 629, 630, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, @@ -1959,41 +1963,41 @@ static const yytype_uint16 yystos[] = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10 + 10, 10, 10, 10, 10, 10, 10, 10, 10 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 302, 303, 303, 304, 304, 304, 304, 304, 304, - 304, 304, 304, 304, 304, 304, 304, 304, 305, 306, - 307, 307, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 309, 310, 310, 311, - 311, 311, 311, 311, 311, 311, 312, 313, 313, 314, - 314, 314, 314, 314, 314, 315, 316, 316, 317, 317, - 317, 317, 317, 317, 317, 318, 319, 319, 320, 320, - 320, 320, 320, 320, 320, 320, 321, 322, 323, 324, - 325, 326, 327, 327, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 328, 329, 330, 331, 332, 333, 334, + 0, 303, 304, 304, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 306, 307, + 308, 308, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 310, 311, 311, + 312, 312, 312, 312, 312, 312, 312, 313, 314, 314, + 315, 315, 315, 315, 315, 315, 316, 317, 317, 318, + 318, 318, 318, 318, 318, 318, 319, 320, 320, 321, + 321, 321, 321, 321, 321, 321, 321, 322, 323, 324, + 325, 326, 327, 328, 328, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, @@ -2016,19 +2020,19 @@ static const yytype_uint16 yyr1[] = 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 557, 557, 558, 558, 558, 558, 558, 558, - 558, 558, 559, 560, 561, 562, 563, 564, 565, 566, - 567, 568, 568, 569, 569, 569, 569, 569, 569, 569, - 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, - 569, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 555, 556, 557, 558, 559, 559, 560, 560, 560, 560, + 560, 560, 560, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 570, 571, 571, 571, 571, 571, + 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, + 571, 571, 571, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 590, 591, 592, 593, 594, 594, 595, - 596, 597, 598, 599, 600, 601, 602, 602, 603, 603, - 603, 603, 603, 603, 603, 603, 603, 603, 604, 605, + 588, 589, 590, 591, 592, 592, 593, 594, 595, 596, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 604, + 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, - 615, 616, 616, 616, 616, 616, 616, 617, 618, 619, - 620, 621, 622, 623, 624, 625, 625, 626, 626, 627, - 628 + 616, 617, 617, 618, 618, 618, 618, 618, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 627, 628, + 628, 629, 630 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -2056,13 +2060,13 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, - 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 1, 2, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -2075,29 +2079,29 @@ static const yytype_uint8 yyr2[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, + 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 3, 4, 4, 4, 3, 3, - 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, - 2, 1, 2, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, + 2, 2, 2, 1, 2, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 2, 0, 1, 2, 1, 2, 0, 1, - 2, 2, 2, 3, 3, 1, 2, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 2, 3, 1, 2, 0, 1, 1, 2, - 2 + 2, 2, 2, 1, 2, 0, 1, 2, 1, 2, + 0, 1, 2, 2, 2, 3, 3, 1, 2, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 2, 0, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 3, 1, 2, 0, 1, + 1, 2, 2 }; @@ -2782,23 +2786,23 @@ yyreduce: switch (yyn) { case 18: -#line 194 "./util/configparser.y" +#line 195 "./util/configparser.y" { OUTYY(("\nP(force-toplevel)\n")); } -#line 2790 "util/configparser.c" +#line 2794 "util/configparser.c" break; case 19: -#line 200 "./util/configparser.y" +#line 201 "./util/configparser.y" { OUTYY(("\nP(server:)\n")); } -#line 2798 "util/configparser.c" +#line 2802 "util/configparser.c" break; - case 226: -#line 298 "./util/configparser.y" + case 227: +#line 299 "./util/configparser.y" { struct config_stub* s; OUTYY(("\nP(stub_zone:)\n")); @@ -2809,11 +2813,11 @@ yyreduce: } else yyerror("out of memory"); } -#line 2813 "util/configparser.c" +#line 2817 "util/configparser.c" break; - case 236: -#line 315 "./util/configparser.y" + case 237: +#line 316 "./util/configparser.y" { struct config_stub* s; OUTYY(("\nP(forward_zone:)\n")); @@ -2824,11 +2828,11 @@ yyreduce: } else yyerror("out of memory"); } -#line 2828 "util/configparser.c" +#line 2832 "util/configparser.c" break; - case 245: -#line 332 "./util/configparser.y" + case 246: +#line 333 "./util/configparser.y" { struct config_view* s; OUTYY(("\nP(view:)\n")); @@ -2841,11 +2845,11 @@ yyreduce: } else yyerror("out of memory"); } -#line 2845 "util/configparser.c" +#line 2849 "util/configparser.c" break; - case 255: -#line 351 "./util/configparser.y" + case 256: +#line 352 "./util/configparser.y" { struct config_auth* s; OUTYY(("\nP(auth_zone:)\n")); @@ -2861,11 +2865,11 @@ yyreduce: } else yyerror("out of memory"); } -#line 2865 "util/configparser.c" +#line 2869 "util/configparser.c" break; - case 266: -#line 375 "./util/configparser.y" + case 267: +#line 376 "./util/configparser.y" { uint8_t* bitlist; size_t len = 0; @@ -2882,11 +2886,11 @@ yyreduce: } } -#line 2886 "util/configparser.c" +#line 2890 "util/configparser.c" break; - case 267: -#line 394 "./util/configparser.y" + case 268: +#line 395 "./util/configparser.y" { OUTYY(("P(rpz_action_override:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "nxdomain")!=0 && strcmp((yyvsp[0].str), "nodata")!=0 && @@ -2901,21 +2905,21 @@ yyreduce: cfg_parser->cfg->auths->rpz_action_override = (yyvsp[0].str); } } -#line 2905 "util/configparser.c" +#line 2909 "util/configparser.c" break; - case 268: -#line 411 "./util/configparser.y" + case 269: +#line 412 "./util/configparser.y" { OUTYY(("P(rpz_cname_override:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->rpz_cname); cfg_parser->cfg->auths->rpz_cname = (yyvsp[0].str); } -#line 2915 "util/configparser.c" +#line 2919 "util/configparser.c" break; - case 269: -#line 419 "./util/configparser.y" + case 270: +#line 420 "./util/configparser.y" { OUTYY(("P(rpz_log:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -2923,21 +2927,21 @@ yyreduce: else cfg_parser->cfg->auths->rpz_log = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 2927 "util/configparser.c" +#line 2931 "util/configparser.c" break; - case 270: -#line 429 "./util/configparser.y" + case 271: +#line 430 "./util/configparser.y" { OUTYY(("P(rpz_log_name:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->rpz_log_name); cfg_parser->cfg->auths->rpz_log_name = (yyvsp[0].str); } -#line 2937 "util/configparser.c" +#line 2941 "util/configparser.c" break; - case 271: -#line 437 "./util/configparser.y" + case 272: +#line 438 "./util/configparser.y" { struct config_auth* s; OUTYY(("\nP(rpz:)\n")); @@ -2953,11 +2957,11 @@ yyreduce: } else yyerror("out of memory"); } -#line 2957 "util/configparser.c" +#line 2961 "util/configparser.c" break; - case 284: -#line 460 "./util/configparser.y" + case 285: +#line 461 "./util/configparser.y" { OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -2965,11 +2969,11 @@ yyreduce: else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 2969 "util/configparser.c" +#line 2973 "util/configparser.c" break; - case 285: -#line 469 "./util/configparser.y" + case 286: +#line 470 "./util/configparser.y" { OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -2977,11 +2981,11 @@ yyreduce: else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 2981 "util/configparser.c" +#line 2985 "util/configparser.c" break; - case 286: -#line 478 "./util/configparser.y" + case 287: +#line 479 "./util/configparser.y" { OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0) @@ -2991,11 +2995,11 @@ yyreduce: else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 2995 "util/configparser.c" +#line 2999 "util/configparser.c" break; - case 287: -#line 489 "./util/configparser.y" + case 288: +#line 490 "./util/configparser.y" { OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3003,11 +3007,11 @@ yyreduce: else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3007 "util/configparser.c" +#line 3011 "util/configparser.c" break; - case 288: -#line 498 "./util/configparser.y" + case 289: +#line 499 "./util/configparser.y" { OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3015,11 +3019,11 @@ yyreduce: else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3019 "util/configparser.c" +#line 3023 "util/configparser.c" break; - case 289: -#line 507 "./util/configparser.y" + case 290: +#line 508 "./util/configparser.y" { OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3027,11 +3031,11 @@ yyreduce: else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3031 "util/configparser.c" +#line 3035 "util/configparser.c" break; - case 290: -#line 516 "./util/configparser.y" + case 291: +#line 517 "./util/configparser.y" { OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0) @@ -3041,11 +3045,11 @@ yyreduce: else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3045 "util/configparser.c" +#line 3049 "util/configparser.c" break; - case 291: -#line 527 "./util/configparser.y" + case 292: +#line 528 "./util/configparser.y" { OUTYY(("P(server_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3053,11 +3057,11 @@ yyreduce: else cfg_parser->cfg->port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3057 "util/configparser.c" +#line 3061 "util/configparser.c" break; - case 292: -#line 536 "./util/configparser.y" + case 293: +#line 537 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str))); @@ -3068,11 +3072,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 3072 "util/configparser.c" +#line 3076 "util/configparser.c" break; - case 293: -#line 548 "./util/configparser.y" + case 294: +#line 549 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str))); @@ -3084,11 +3088,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 3088 "util/configparser.c" +#line 3092 "util/configparser.c" break; - case 294: -#line 562 "./util/configparser.y" + case 295: +#line 563 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str))); @@ -3102,11 +3106,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3106 "util/configparser.c" +#line 3110 "util/configparser.c" break; - case 295: -#line 577 "./util/configparser.y" + case 296: +#line 578 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str))); @@ -3116,11 +3120,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3120 "util/configparser.c" +#line 3124 "util/configparser.c" break; - case 296: -#line 588 "./util/configparser.y" + case 297: +#line 589 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str))); @@ -3136,11 +3140,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3140 "util/configparser.c" +#line 3144 "util/configparser.c" break; - case 297: -#line 605 "./util/configparser.y" + case 298: +#line 606 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str))); @@ -3156,11 +3160,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3160 "util/configparser.c" +#line 3164 "util/configparser.c" break; - case 298: -#line 622 "./util/configparser.y" + case 299: +#line 623 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[0].str))); @@ -3176,11 +3180,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3180 "util/configparser.c" +#line 3184 "util/configparser.c" break; - case 299: -#line 639 "./util/configparser.y" + case 300: +#line 640 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[0].str))); @@ -3196,11 +3200,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3200 "util/configparser.c" +#line 3204 "util/configparser.c" break; - case 300: -#line 656 "./util/configparser.y" + case 301: +#line 657 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[0].str))); @@ -3214,11 +3218,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3218 "util/configparser.c" +#line 3222 "util/configparser.c" break; - case 301: -#line 671 "./util/configparser.y" + case 302: +#line 672 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[0].str))); @@ -3232,11 +3236,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3236 "util/configparser.c" +#line 3240 "util/configparser.c" break; - case 302: -#line 686 "./util/configparser.y" + case 303: +#line 687 "./util/configparser.y" { OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->num_ifs == 0) @@ -3248,11 +3252,11 @@ yyreduce: else cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str); } -#line 3252 "util/configparser.c" +#line 3256 "util/configparser.c" break; - case 303: -#line 699 "./util/configparser.y" + case 304: +#line 700 "./util/configparser.y" { OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->num_out_ifs == 0) @@ -3266,11 +3270,11 @@ yyreduce: cfg_parser->cfg->out_ifs[ cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str); } -#line 3270 "util/configparser.c" +#line 3274 "util/configparser.c" break; - case 304: -#line 714 "./util/configparser.y" + case 305: +#line 715 "./util/configparser.y" { OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3278,11 +3282,11 @@ yyreduce: else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3282 "util/configparser.c" +#line 3286 "util/configparser.c" break; - case 305: -#line 723 "./util/configparser.y" + case 306: +#line 724 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str))); if(!cfg_mark_ports((yyvsp[0].str), 1, @@ -3290,11 +3294,11 @@ yyreduce: yyerror("port number or range (\"low-high\") expected"); free((yyvsp[0].str)); } -#line 3294 "util/configparser.c" +#line 3298 "util/configparser.c" break; - case 306: -#line 732 "./util/configparser.y" + case 307: +#line 733 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str))); if(!cfg_mark_ports((yyvsp[0].str), 0, @@ -3302,11 +3306,11 @@ yyreduce: yyerror("port number or range (\"low-high\") expected"); free((yyvsp[0].str)); } -#line 3306 "util/configparser.c" +#line 3310 "util/configparser.c" break; - case 307: -#line 741 "./util/configparser.y" + case 308: +#line 742 "./util/configparser.y" { OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3314,11 +3318,11 @@ yyreduce: else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3318 "util/configparser.c" +#line 3322 "util/configparser.c" break; - case 308: -#line 750 "./util/configparser.y" + case 309: +#line 751 "./util/configparser.y" { OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3326,11 +3330,11 @@ yyreduce: else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3330 "util/configparser.c" +#line 3334 "util/configparser.c" break; - case 309: -#line 759 "./util/configparser.y" + case 310: +#line 760 "./util/configparser.y" { OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3338,11 +3342,11 @@ yyreduce: else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3342 "util/configparser.c" +#line 3346 "util/configparser.c" break; - case 310: -#line 768 "./util/configparser.y" + case 311: +#line 769 "./util/configparser.y" { OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3350,11 +3354,11 @@ yyreduce: else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3354 "util/configparser.c" +#line 3358 "util/configparser.c" break; - case 311: -#line 777 "./util/configparser.y" + case 312: +#line 778 "./util/configparser.y" { OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3362,11 +3366,11 @@ yyreduce: else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3366 "util/configparser.c" +#line 3370 "util/configparser.c" break; - case 312: -#line 786 "./util/configparser.y" + case 313: +#line 787 "./util/configparser.y" { OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3374,11 +3378,11 @@ yyreduce: else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3378 "util/configparser.c" +#line 3382 "util/configparser.c" break; - case 313: -#line 795 "./util/configparser.y" + case 314: +#line 796 "./util/configparser.y" { OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3386,11 +3390,11 @@ yyreduce: else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3390 "util/configparser.c" +#line 3394 "util/configparser.c" break; - case 314: -#line 804 "./util/configparser.y" + case 315: +#line 805 "./util/configparser.y" { OUTYY(("P(server_prefer_ip4:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3398,11 +3402,11 @@ yyreduce: else cfg_parser->cfg->prefer_ip4 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3402 "util/configparser.c" +#line 3406 "util/configparser.c" break; - case 315: -#line 813 "./util/configparser.y" + case 316: +#line 814 "./util/configparser.y" { OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3410,11 +3414,11 @@ yyreduce: else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3414 "util/configparser.c" +#line 3418 "util/configparser.c" break; - case 316: -#line 822 "./util/configparser.y" + case 317: +#line 823 "./util/configparser.y" { OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3422,11 +3426,11 @@ yyreduce: else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3426 "util/configparser.c" +#line 3430 "util/configparser.c" break; - case 317: -#line 831 "./util/configparser.y" + case 318: +#line 832 "./util/configparser.y" { OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3434,11 +3438,11 @@ yyreduce: else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3438 "util/configparser.c" +#line 3442 "util/configparser.c" break; - case 318: -#line 840 "./util/configparser.y" + case 319: +#line 841 "./util/configparser.y" { OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3450,11 +3454,11 @@ yyreduce: else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3454 "util/configparser.c" +#line 3458 "util/configparser.c" break; - case 319: -#line 853 "./util/configparser.y" + case 320: +#line 854 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3462,11 +3466,11 @@ yyreduce: else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3466 "util/configparser.c" +#line 3470 "util/configparser.c" break; - case 320: -#line 862 "./util/configparser.y" + case 321: +#line 863 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3478,11 +3482,11 @@ yyreduce: else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3482 "util/configparser.c" +#line 3486 "util/configparser.c" break; - case 321: -#line 875 "./util/configparser.y" + case 322: +#line 876 "./util/configparser.y" { OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3490,11 +3494,11 @@ yyreduce: else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3494 "util/configparser.c" +#line 3498 "util/configparser.c" break; - case 322: -#line 884 "./util/configparser.y" + case 323: +#line 885 "./util/configparser.y" { OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3502,11 +3506,11 @@ yyreduce: else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3506 "util/configparser.c" +#line 3510 "util/configparser.c" break; - case 323: -#line 893 "./util/configparser.y" + case 324: +#line 894 "./util/configparser.y" { OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3514,31 +3518,31 @@ yyreduce: else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3518 "util/configparser.c" +#line 3522 "util/configparser.c" break; - case 324: -#line 902 "./util/configparser.y" + case 325: +#line 903 "./util/configparser.y" { OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->ssl_service_key); cfg_parser->cfg->ssl_service_key = (yyvsp[0].str); } -#line 3528 "util/configparser.c" +#line 3532 "util/configparser.c" break; - case 325: -#line 909 "./util/configparser.y" + case 326: +#line 910 "./util/configparser.y" { OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->ssl_service_pem); cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str); } -#line 3538 "util/configparser.c" +#line 3542 "util/configparser.c" break; - case 326: -#line 916 "./util/configparser.y" + case 327: +#line 917 "./util/configparser.y" { OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3546,21 +3550,21 @@ yyreduce: else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3550 "util/configparser.c" +#line 3554 "util/configparser.c" break; - case 327: -#line 925 "./util/configparser.y" + case 328: +#line 926 "./util/configparser.y" { OUTYY(("P(server_tls_cert_bundle:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_cert_bundle); cfg_parser->cfg->tls_cert_bundle = (yyvsp[0].str); } -#line 3560 "util/configparser.c" +#line 3564 "util/configparser.c" break; - case 328: -#line 932 "./util/configparser.y" + case 329: +#line 933 "./util/configparser.y" { OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3568,53 +3572,53 @@ yyreduce: else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3572 "util/configparser.c" +#line 3576 "util/configparser.c" break; - case 329: -#line 941 "./util/configparser.y" + case 330: +#line 942 "./util/configparser.y" { OUTYY(("P(server_tls_additional_port:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3583 "util/configparser.c" +#line 3587 "util/configparser.c" break; - case 330: -#line 949 "./util/configparser.y" + case 331: +#line 950 "./util/configparser.y" { OUTYY(("P(server_tls_ciphers:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_ciphers); cfg_parser->cfg->tls_ciphers = (yyvsp[0].str); } -#line 3593 "util/configparser.c" +#line 3597 "util/configparser.c" break; - case 331: -#line 956 "./util/configparser.y" + case 332: +#line 957 "./util/configparser.y" { OUTYY(("P(server_tls_ciphersuites:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_ciphersuites); cfg_parser->cfg->tls_ciphersuites = (yyvsp[0].str); } -#line 3603 "util/configparser.c" +#line 3607 "util/configparser.c" break; - case 332: -#line 963 "./util/configparser.y" + case 333: +#line 964 "./util/configparser.y" { OUTYY(("P(server_tls_session_ticket_keys:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3614 "util/configparser.c" +#line 3618 "util/configparser.c" break; - case 333: -#line 971 "./util/configparser.y" + case 334: +#line 972 "./util/configparser.y" { OUTYY(("P(server_tls_use_sni:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3622,11 +3626,11 @@ yyreduce: else cfg_parser->cfg->tls_use_sni = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3626 "util/configparser.c" +#line 3630 "util/configparser.c" break; - case 334: -#line 980 "./util/configparser.y" + case 335: +#line 981 "./util/configparser.y" { OUTYY(("P(server_https_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3634,11 +3638,11 @@ yyreduce: else cfg_parser->cfg->https_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3638 "util/configparser.c" +#line 3642 "util/configparser.c" break; - case 335: -#line 988 "./util/configparser.y" + case 336: +#line 989 "./util/configparser.y" { OUTYY(("P(server_http_endpoint:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->http_endpoint); @@ -3654,11 +3658,11 @@ yyreduce: cfg_parser->cfg->http_endpoint = (yyvsp[0].str); } } -#line 3658 "util/configparser.c" +#line 3662 "util/configparser.c" break; - case 336: -#line 1004 "./util/configparser.y" + case 337: +#line 1005 "./util/configparser.y" { OUTYY(("P(server_http_max_streams:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3666,11 +3670,11 @@ yyreduce: else cfg_parser->cfg->http_max_streams = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3670 "util/configparser.c" +#line 3674 "util/configparser.c" break; - case 337: -#line 1012 "./util/configparser.y" + case 338: +#line 1013 "./util/configparser.y" { OUTYY(("P(server_http_query_buffer_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), @@ -3678,11 +3682,11 @@ yyreduce: yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 3682 "util/configparser.c" +#line 3686 "util/configparser.c" break; - case 338: -#line 1020 "./util/configparser.y" + case 339: +#line 1021 "./util/configparser.y" { OUTYY(("P(server_http_response_buffer_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), @@ -3690,11 +3694,11 @@ yyreduce: yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 3694 "util/configparser.c" +#line 3698 "util/configparser.c" break; - case 339: -#line 1028 "./util/configparser.y" + case 340: +#line 1029 "./util/configparser.y" { OUTYY(("P(server_http_nodelay:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3702,11 +3706,11 @@ yyreduce: else cfg_parser->cfg->http_nodelay = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3706 "util/configparser.c" +#line 3710 "util/configparser.c" break; - case 340: -#line 1036 "./util/configparser.y" + case 341: +#line 1037 "./util/configparser.y" { OUTYY(("P(server_http_notls_downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3714,11 +3718,11 @@ yyreduce: else cfg_parser->cfg->http_notls_downstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3718 "util/configparser.c" +#line 3722 "util/configparser.c" break; - case 341: -#line 1044 "./util/configparser.y" + case 342: +#line 1045 "./util/configparser.y" { OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3726,11 +3730,11 @@ yyreduce: else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3730 "util/configparser.c" +#line 3734 "util/configparser.c" break; - case 342: -#line 1053 "./util/configparser.y" + case 343: +#line 1054 "./util/configparser.y" { OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3738,11 +3742,11 @@ yyreduce: else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3742 "util/configparser.c" +#line 3746 "util/configparser.c" break; - case 343: -#line 1062 "./util/configparser.y" + case 344: +#line 1063 "./util/configparser.y" { OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3755,11 +3759,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3759 "util/configparser.c" +#line 3763 "util/configparser.c" break; - case 344: -#line 1076 "./util/configparser.y" + case 345: +#line 1077 "./util/configparser.y" { OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3767,11 +3771,11 @@ yyreduce: else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3771 "util/configparser.c" +#line 3775 "util/configparser.c" break; - case 345: -#line 1085 "./util/configparser.y" + case 346: +#line 1086 "./util/configparser.y" { OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3779,11 +3783,11 @@ yyreduce: else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3783 "util/configparser.c" +#line 3787 "util/configparser.c" break; - case 346: -#line 1094 "./util/configparser.y" + case 347: +#line 1095 "./util/configparser.y" { OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3791,11 +3795,11 @@ yyreduce: else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3795 "util/configparser.c" +#line 3799 "util/configparser.c" break; - case 347: -#line 1103 "./util/configparser.y" + case 348: +#line 1104 "./util/configparser.y" { OUTYY(("P(server_log_tag_queryreply:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3803,11 +3807,11 @@ yyreduce: else cfg_parser->cfg->log_tag_queryreply = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3807 "util/configparser.c" +#line 3811 "util/configparser.c" break; - case 348: -#line 1112 "./util/configparser.y" + case 349: +#line 1113 "./util/configparser.y" { OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3815,11 +3819,11 @@ yyreduce: else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3819 "util/configparser.c" +#line 3823 "util/configparser.c" break; - case 349: -#line 1121 "./util/configparser.y" + case 350: +#line 1122 "./util/configparser.y" { OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3827,31 +3831,31 @@ yyreduce: else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3831 "util/configparser.c" +#line 3835 "util/configparser.c" break; - case 350: -#line 1130 "./util/configparser.y" + case 351: +#line 1131 "./util/configparser.y" { OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->chrootdir); cfg_parser->cfg->chrootdir = (yyvsp[0].str); } -#line 3841 "util/configparser.c" +#line 3845 "util/configparser.c" break; - case 351: -#line 1137 "./util/configparser.y" + case 352: +#line 1138 "./util/configparser.y" { OUTYY(("P(server_username:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->username); cfg_parser->cfg->username = (yyvsp[0].str); } -#line 3851 "util/configparser.c" +#line 3855 "util/configparser.c" break; - case 352: -#line 1144 "./util/configparser.y" + case 353: +#line 1145 "./util/configparser.y" { OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->directory); @@ -3876,105 +3880,105 @@ yyreduce: } } } -#line 3880 "util/configparser.c" +#line 3884 "util/configparser.c" break; - case 353: -#line 1170 "./util/configparser.y" + case 354: +#line 1171 "./util/configparser.y" { OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->logfile); cfg_parser->cfg->logfile = (yyvsp[0].str); cfg_parser->cfg->use_syslog = 0; } -#line 3891 "util/configparser.c" +#line 3895 "util/configparser.c" break; - case 354: -#line 1178 "./util/configparser.y" + case 355: +#line 1179 "./util/configparser.y" { OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->pidfile); cfg_parser->cfg->pidfile = (yyvsp[0].str); } -#line 3901 "util/configparser.c" +#line 3905 "util/configparser.c" break; - case 355: -#line 1185 "./util/configparser.y" + case 356: +#line 1186 "./util/configparser.y" { OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3911 "util/configparser.c" +#line 3915 "util/configparser.c" break; - case 356: -#line 1192 "./util/configparser.y" + case 357: +#line 1193 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str))); log_warn("option dlv-anchor-file ignored: DLV is decommissioned"); free((yyvsp[0].str)); } -#line 3921 "util/configparser.c" +#line 3925 "util/configparser.c" break; - case 357: -#line 1199 "./util/configparser.y" + case 358: +#line 1200 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str))); log_warn("option dlv-anchor ignored: DLV is decommissioned"); free((yyvsp[0].str)); } -#line 3931 "util/configparser.c" +#line 3935 "util/configparser.c" break; - case 358: -#line 1206 "./util/configparser.y" + case 359: +#line 1207 "./util/configparser.y" { OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> auto_trust_anchor_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3942 "util/configparser.c" +#line 3946 "util/configparser.c" break; - case 359: -#line 1214 "./util/configparser.y" + case 360: +#line 1215 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> trust_anchor_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3953 "util/configparser.c" +#line 3957 "util/configparser.c" break; - case 360: -#line 1222 "./util/configparser.y" + case 361: +#line 1223 "./util/configparser.y" { OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> trusted_keys_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3964 "util/configparser.c" +#line 3968 "util/configparser.c" break; - case 361: -#line 1230 "./util/configparser.y" + case 362: +#line 1231 "./util/configparser.y" { OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3974 "util/configparser.c" +#line 3978 "util/configparser.c" break; - case 362: -#line 1237 "./util/configparser.y" + case 363: +#line 1238 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3984,11 +3988,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3988 "util/configparser.c" +#line 3992 "util/configparser.c" break; - case 363: -#line 1248 "./util/configparser.y" + case 364: +#line 1249 "./util/configparser.y" { OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3998,21 +4002,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4002 "util/configparser.c" +#line 4006 "util/configparser.c" break; - case 364: -#line 1259 "./util/configparser.y" + case 365: +#line 1260 "./util/configparser.y" { OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4012 "util/configparser.c" +#line 4016 "util/configparser.c" break; - case 365: -#line 1266 "./util/configparser.y" + case 366: +#line 1267 "./util/configparser.y" { OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4020,11 +4024,11 @@ yyreduce: else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4024 "util/configparser.c" +#line 4028 "util/configparser.c" break; - case 366: -#line 1275 "./util/configparser.y" + case 367: +#line 1276 "./util/configparser.y" { OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4032,11 +4036,11 @@ yyreduce: else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4036 "util/configparser.c" +#line 4040 "util/configparser.c" break; - case 367: -#line 1284 "./util/configparser.y" + case 368: +#line 1285 "./util/configparser.y" { OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4044,53 +4048,53 @@ yyreduce: else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4048 "util/configparser.c" +#line 4052 "util/configparser.c" break; - case 368: -#line 1293 "./util/configparser.y" + case 369: +#line 1294 "./util/configparser.y" { OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->identity); cfg_parser->cfg->identity = (yyvsp[0].str); } -#line 4058 "util/configparser.c" +#line 4062 "util/configparser.c" break; - case 369: -#line 1300 "./util/configparser.y" + case 370: +#line 1301 "./util/configparser.y" { OUTYY(("P(server_version:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->version); cfg_parser->cfg->version = (yyvsp[0].str); } -#line 4068 "util/configparser.c" +#line 4072 "util/configparser.c" break; - case 370: -#line 1307 "./util/configparser.y" + case 371: +#line 1308 "./util/configparser.y" { OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_rcvbuf)) yyerror("buffer size expected"); free((yyvsp[0].str)); } -#line 4079 "util/configparser.c" +#line 4083 "util/configparser.c" break; - case 371: -#line 1315 "./util/configparser.y" + case 372: +#line 1316 "./util/configparser.y" { OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_sndbuf)) yyerror("buffer size expected"); free((yyvsp[0].str)); } -#line 4090 "util/configparser.c" +#line 4094 "util/configparser.c" break; - case 372: -#line 1323 "./util/configparser.y" + case 373: +#line 1324 "./util/configparser.y" { OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4099,11 +4103,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4103 "util/configparser.c" +#line 4107 "util/configparser.c" break; - case 373: -#line 1333 "./util/configparser.y" + case 374: +#line 1334 "./util/configparser.y" { OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4112,11 +4116,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4116 "util/configparser.c" +#line 4120 "util/configparser.c" break; - case 374: -#line 1343 "./util/configparser.y" + case 375: +#line 1344 "./util/configparser.y" { OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4125,11 +4129,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4129 "util/configparser.c" +#line 4133 "util/configparser.c" break; - case 375: -#line 1353 "./util/configparser.y" + case 376: +#line 1354 "./util/configparser.y" { OUTYY(("P(server_ip_dscp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4142,22 +4146,22 @@ yyreduce: cfg_parser->cfg->ip_dscp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4146 "util/configparser.c" +#line 4150 "util/configparser.c" break; - case 376: -#line 1367 "./util/configparser.y" + case 377: +#line 1368 "./util/configparser.y" { OUTYY(("P(server_stream_wait_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->stream_wait_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4157 "util/configparser.c" +#line 4161 "util/configparser.c" break; - case 377: -#line 1375 "./util/configparser.y" + case 378: +#line 1376 "./util/configparser.y" { OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4169,11 +4173,11 @@ yyreduce: else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4173 "util/configparser.c" +#line 4177 "util/configparser.c" break; - case 378: -#line 1388 "./util/configparser.y" + case 379: +#line 1389 "./util/configparser.y" { OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4183,22 +4187,22 @@ yyreduce: else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4187 "util/configparser.c" +#line 4191 "util/configparser.c" break; - case 379: -#line 1399 "./util/configparser.y" + case 380: +#line 1400 "./util/configparser.y" { OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->msg_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4198 "util/configparser.c" +#line 4202 "util/configparser.c" break; - case 380: -#line 1407 "./util/configparser.y" + case 381: +#line 1408 "./util/configparser.y" { OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4210,11 +4214,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4214 "util/configparser.c" +#line 4218 "util/configparser.c" break; - case 381: -#line 1420 "./util/configparser.y" + case 382: +#line 1421 "./util/configparser.y" { OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4222,11 +4226,11 @@ yyreduce: else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4226 "util/configparser.c" +#line 4230 "util/configparser.c" break; - case 382: -#line 1429 "./util/configparser.y" + case 383: +#line 1430 "./util/configparser.y" { OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4234,11 +4238,11 @@ yyreduce: else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4238 "util/configparser.c" +#line 4242 "util/configparser.c" break; - case 383: -#line 1438 "./util/configparser.y" + case 384: +#line 1439 "./util/configparser.y" { OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4246,11 +4250,11 @@ yyreduce: else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4250 "util/configparser.c" +#line 4254 "util/configparser.c" break; - case 384: -#line 1447 "./util/configparser.y" + case 385: +#line 1448 "./util/configparser.y" { OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4259,11 +4263,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4263 "util/configparser.c" +#line 4267 "util/configparser.c" break; - case 385: -#line 1457 "./util/configparser.y" + case 386: +#line 1458 "./util/configparser.y" { OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4272,22 +4276,22 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4276 "util/configparser.c" +#line 4280 "util/configparser.c" break; - case 386: -#line 1467 "./util/configparser.y" + case 387: +#line 1468 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->rrset_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4287 "util/configparser.c" +#line 4291 "util/configparser.c" break; - case 387: -#line 1475 "./util/configparser.y" + case 388: +#line 1476 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4299,11 +4303,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4303 "util/configparser.c" +#line 4307 "util/configparser.c" break; - case 388: -#line 1488 "./util/configparser.y" + case 389: +#line 1489 "./util/configparser.y" { OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4311,22 +4315,22 @@ yyreduce: else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4315 "util/configparser.c" +#line 4319 "util/configparser.c" break; - case 389: -#line 1497 "./util/configparser.y" + case 390: +#line 1498 "./util/configparser.y" { OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str))); verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option " "removed, use infra-host-ttl)", (yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4326 "util/configparser.c" +#line 4330 "util/configparser.c" break; - case 390: -#line 1505 "./util/configparser.y" + case 391: +#line 1506 "./util/configparser.y" { OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4334,22 +4338,22 @@ yyreduce: else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4338 "util/configparser.c" +#line 4342 "util/configparser.c" break; - case 391: -#line 1514 "./util/configparser.y" + case 392: +#line 1515 "./util/configparser.y" { OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str))); verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s " "(option removed, use infra-cache-numhosts)", (yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4349 "util/configparser.c" +#line 4353 "util/configparser.c" break; - case 392: -#line 1522 "./util/configparser.y" + case 393: +#line 1523 "./util/configparser.y" { OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4361,11 +4365,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4365 "util/configparser.c" +#line 4369 "util/configparser.c" break; - case 393: -#line 1535 "./util/configparser.y" + case 394: +#line 1536 "./util/configparser.y" { OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4373,11 +4377,11 @@ yyreduce: else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4377 "util/configparser.c" +#line 4381 "util/configparser.c" break; - case 394: -#line 1544 "./util/configparser.y" + case 395: +#line 1545 "./util/configparser.y" { OUTYY(("P(server_infra_keep_probing:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4386,21 +4390,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4390 "util/configparser.c" +#line 4394 "util/configparser.c" break; - case 395: -#line 1554 "./util/configparser.y" + case 396: +#line 1555 "./util/configparser.y" { OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->target_fetch_policy); cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str); } -#line 4400 "util/configparser.c" +#line 4404 "util/configparser.c" break; - case 396: -#line 1561 "./util/configparser.y" + case 397: +#line 1562 "./util/configparser.y" { OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4409,11 +4413,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4413 "util/configparser.c" +#line 4417 "util/configparser.c" break; - case 397: -#line 1571 "./util/configparser.y" + case 398: +#line 1572 "./util/configparser.y" { OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4422,11 +4426,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4426 "util/configparser.c" +#line 4430 "util/configparser.c" break; - case 398: -#line 1581 "./util/configparser.y" + case 399: +#line 1582 "./util/configparser.y" { OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4435,11 +4439,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4439 "util/configparser.c" +#line 4443 "util/configparser.c" break; - case 399: -#line 1591 "./util/configparser.y" + case 400: +#line 1592 "./util/configparser.y" { OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4448,11 +4452,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4452 "util/configparser.c" +#line 4456 "util/configparser.c" break; - case 400: -#line 1601 "./util/configparser.y" + case 401: +#line 1602 "./util/configparser.y" { OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4461,11 +4465,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4465 "util/configparser.c" +#line 4469 "util/configparser.c" break; - case 401: -#line 1611 "./util/configparser.y" + case 402: +#line 1612 "./util/configparser.y" { OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4474,11 +4478,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4478 "util/configparser.c" +#line 4482 "util/configparser.c" break; - case 402: -#line 1621 "./util/configparser.y" + case 403: +#line 1622 "./util/configparser.y" { OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4487,11 +4491,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4491 "util/configparser.c" +#line 4495 "util/configparser.c" break; - case 403: -#line 1631 "./util/configparser.y" + case 404: +#line 1632 "./util/configparser.y" { OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4500,41 +4504,41 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4504 "util/configparser.c" +#line 4508 "util/configparser.c" break; - case 404: -#line 1641 "./util/configparser.y" + case 405: +#line 1642 "./util/configparser.y" { OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4514 "util/configparser.c" +#line 4518 "util/configparser.c" break; - case 405: -#line 1648 "./util/configparser.y" + case 406: +#line 1649 "./util/configparser.y" { OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4524 "util/configparser.c" +#line 4528 "util/configparser.c" break; - case 406: -#line 1655 "./util/configparser.y" + case 407: +#line 1656 "./util/configparser.y" { OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4534 "util/configparser.c" +#line 4538 "util/configparser.c" break; - case 407: -#line 1662 "./util/configparser.y" + case 408: +#line 1663 "./util/configparser.y" { OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4542,11 +4546,11 @@ yyreduce: else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4546 "util/configparser.c" +#line 4550 "util/configparser.c" break; - case 408: -#line 1671 "./util/configparser.y" + case 409: +#line 1672 "./util/configparser.y" { OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4554,11 +4558,11 @@ yyreduce: else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4558 "util/configparser.c" +#line 4562 "util/configparser.c" break; - case 409: -#line 1680 "./util/configparser.y" + case 410: +#line 1681 "./util/configparser.y" { OUTYY(("P(server_deny_any:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4566,11 +4570,11 @@ yyreduce: else cfg_parser->cfg->deny_any = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4570 "util/configparser.c" +#line 4574 "util/configparser.c" break; - case 410: -#line 1689 "./util/configparser.y" + case 411: +#line 1690 "./util/configparser.y" { OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4578,21 +4582,21 @@ yyreduce: else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4582 "util/configparser.c" +#line 4586 "util/configparser.c" break; - case 411: -#line 1698 "./util/configparser.y" + case 412: +#line 1699 "./util/configparser.y" { OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4592 "util/configparser.c" +#line 4596 "util/configparser.c" break; - case 412: -#line 1705 "./util/configparser.y" + case 413: +#line 1706 "./util/configparser.y" { OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4601,11 +4605,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4605 "util/configparser.c" +#line 4609 "util/configparser.c" break; - case 413: -#line 1715 "./util/configparser.y" + case 414: +#line 1716 "./util/configparser.y" { OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "deny")!=0 && strcmp((yyvsp[0].str), "refuse")!=0 && @@ -4624,21 +4628,21 @@ yyreduce: fatal_exit("out of memory adding acl"); } } -#line 4628 "util/configparser.c" +#line 4632 "util/configparser.c" break; - case 414: -#line 1735 "./util/configparser.y" + case 415: +#line 1736 "./util/configparser.y" { OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->module_conf); cfg_parser->cfg->module_conf = (yyvsp[0].str); } -#line 4638 "util/configparser.c" +#line 4642 "util/configparser.c" break; - case 415: -#line 1742 "./util/configparser.y" + case 416: +#line 1743 "./util/configparser.y" { OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4655,11 +4659,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4659 "util/configparser.c" +#line 4663 "util/configparser.c" break; - case 416: -#line 1760 "./util/configparser.y" + case 417: +#line 1761 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4671,11 +4675,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4675 "util/configparser.c" +#line 4679 "util/configparser.c" break; - case 417: -#line 1773 "./util/configparser.y" + case 418: +#line 1774 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4687,11 +4691,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4691 "util/configparser.c" +#line 4695 "util/configparser.c" break; - case 418: -#line 1786 "./util/configparser.y" + case 419: +#line 1787 "./util/configparser.y" { OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4699,11 +4703,11 @@ yyreduce: else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4703 "util/configparser.c" +#line 4707 "util/configparser.c" break; - case 419: -#line 1795 "./util/configparser.y" + case 420: +#line 1796 "./util/configparser.y" { OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4711,11 +4715,11 @@ yyreduce: else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4715 "util/configparser.c" +#line 4719 "util/configparser.c" break; - case 420: -#line 1804 "./util/configparser.y" + case 421: +#line 1805 "./util/configparser.y" { OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4723,11 +4727,11 @@ yyreduce: else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4727 "util/configparser.c" +#line 4731 "util/configparser.c" break; - case 421: -#line 1813 "./util/configparser.y" + case 422: +#line 1814 "./util/configparser.y" { OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4735,11 +4739,11 @@ yyreduce: else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4739 "util/configparser.c" +#line 4743 "util/configparser.c" break; - case 422: -#line 1822 "./util/configparser.y" + case 423: +#line 1823 "./util/configparser.y" { OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4748,11 +4752,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4752 "util/configparser.c" +#line 4756 "util/configparser.c" break; - case 423: -#line 1832 "./util/configparser.y" + case 424: +#line 1833 "./util/configparser.y" { OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4761,11 +4765,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4765 "util/configparser.c" +#line 4769 "util/configparser.c" break; - case 424: -#line 1842 "./util/configparser.y" + case 425: +#line 1843 "./util/configparser.y" { OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4775,11 +4779,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4779 "util/configparser.c" +#line 4783 "util/configparser.c" break; - case 425: -#line 1853 "./util/configparser.y" + case 426: +#line 1854 "./util/configparser.y" { OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4787,11 +4791,11 @@ yyreduce: else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4791 "util/configparser.c" +#line 4795 "util/configparser.c" break; - case 426: -#line 1862 "./util/configparser.y" + case 427: +#line 1863 "./util/configparser.y" { OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4799,11 +4803,11 @@ yyreduce: else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4803 "util/configparser.c" +#line 4807 "util/configparser.c" break; - case 427: -#line 1871 "./util/configparser.y" + case 428: +#line 1872 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4811,11 +4815,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4815 "util/configparser.c" +#line 4819 "util/configparser.c" break; - case 428: -#line 1880 "./util/configparser.y" + case 429: +#line 1881 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4823,11 +4827,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4827 "util/configparser.c" +#line 4831 "util/configparser.c" break; - case 429: -#line 1889 "./util/configparser.y" + case 430: +#line 1890 "./util/configparser.y" { OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4835,11 +4839,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_reply_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4839 "util/configparser.c" +#line 4843 "util/configparser.c" break; - case 430: -#line 1898 "./util/configparser.y" + case 431: +#line 1899 "./util/configparser.y" { OUTYY(("P(server_serve_expired_client_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4847,11 +4851,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_client_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4851 "util/configparser.c" +#line 4855 "util/configparser.c" break; - case 431: -#line 1907 "./util/configparser.y" + case 432: +#line 1908 "./util/configparser.y" { OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4863,11 +4867,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 4867 "util/configparser.c" +#line 4871 "util/configparser.c" break; - case 432: -#line 1920 "./util/configparser.y" + case 433: +#line 1921 "./util/configparser.y" { OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4879,11 +4883,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 4883 "util/configparser.c" +#line 4887 "util/configparser.c" break; - case 433: -#line 1933 "./util/configparser.y" + case 434: +#line 1934 "./util/configparser.y" { OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4891,21 +4895,33 @@ yyreduce: else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4895 "util/configparser.c" +#line 4899 "util/configparser.c" break; - case 434: -#line 1942 "./util/configparser.y" + case 435: +#line 1943 "./util/configparser.y" { OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->val_nsec3_key_iterations); cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str); } -#line 4905 "util/configparser.c" +#line 4909 "util/configparser.c" break; - case 435: -#line 1949 "./util/configparser.y" + case 436: +#line 1950 "./util/configparser.y" + { + OUTYY(("P(server_zonemd_permissive_mode:%s)\n", (yyvsp[0].str))); + if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->zonemd_permissive_mode = (strcmp((yyvsp[0].str), "yes")==0); + free((yyvsp[0].str)); + } +#line 4921 "util/configparser.c" + break; + + case 437: +#line 1959 "./util/configparser.y" { OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4913,11 +4929,11 @@ yyreduce: else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4917 "util/configparser.c" +#line 4933 "util/configparser.c" break; - case 436: -#line 1958 "./util/configparser.y" + case 438: +#line 1968 "./util/configparser.y" { OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4925,11 +4941,11 @@ yyreduce: else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4929 "util/configparser.c" +#line 4945 "util/configparser.c" break; - case 437: -#line 1967 "./util/configparser.y" + case 439: +#line 1977 "./util/configparser.y" { OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4937,11 +4953,11 @@ yyreduce: else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4941 "util/configparser.c" +#line 4957 "util/configparser.c" break; - case 438: -#line 1976 "./util/configparser.y" + case 440: +#line 1986 "./util/configparser.y" { OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4950,22 +4966,22 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4954 "util/configparser.c" +#line 4970 "util/configparser.c" break; - case 439: -#line 1985 "./util/configparser.y" + case 441: +#line 1995 "./util/configparser.y" { OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4965 "util/configparser.c" +#line 4981 "util/configparser.c" break; - case 440: -#line 1993 "./util/configparser.y" + case 442: +#line 2003 "./util/configparser.y" { OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4977,22 +4993,22 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4981 "util/configparser.c" +#line 4997 "util/configparser.c" break; - case 441: -#line 2006 "./util/configparser.y" + case 443: +#line 2016 "./util/configparser.y" { OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4992 "util/configparser.c" +#line 5008 "util/configparser.c" break; - case 442: -#line 2014 "./util/configparser.y" + case 444: +#line 2024 "./util/configparser.y" { OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 && @@ -5032,21 +5048,21 @@ yyreduce: fatal_exit("out of memory adding local-zone"); } } -#line 5036 "util/configparser.c" +#line 5052 "util/configparser.c" break; - case 443: -#line 2055 "./util/configparser.y" + case 445: +#line 2065 "./util/configparser.y" { OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str))) fatal_exit("out of memory adding local-data"); } -#line 5046 "util/configparser.c" +#line 5062 "util/configparser.c" break; - case 444: -#line 2062 "./util/configparser.y" + case 446: +#line 2072 "./util/configparser.y" { char* ptr; OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str))); @@ -5060,11 +5076,11 @@ yyreduce: yyerror("local-data-ptr could not be reversed"); } } -#line 5064 "util/configparser.c" +#line 5080 "util/configparser.c" break; - case 445: -#line 2077 "./util/configparser.y" + case 447: +#line 2087 "./util/configparser.y" { OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5073,11 +5089,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5077 "util/configparser.c" +#line 5093 "util/configparser.c" break; - case 446: -#line 2087 "./util/configparser.y" + case 448: +#line 2097 "./util/configparser.y" { OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5086,41 +5102,41 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5090 "util/configparser.c" +#line 5106 "util/configparser.c" break; - case 447: -#line 2097 "./util/configparser.y" + case 449: +#line 2107 "./util/configparser.y" { OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5100 "util/configparser.c" +#line 5116 "util/configparser.c" break; - case 448: -#line 2104 "./util/configparser.y" + case 450: +#line 2114 "./util/configparser.y" { OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5110 "util/configparser.c" +#line 5126 "util/configparser.c" break; - case 449: -#line 2111 "./util/configparser.y" + case 451: +#line 2121 "./util/configparser.y" { OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dns64_prefix); cfg_parser->cfg->dns64_prefix = (yyvsp[0].str); } -#line 5120 "util/configparser.c" +#line 5136 "util/configparser.c" break; - case 450: -#line 2118 "./util/configparser.y" + case 452: +#line 2128 "./util/configparser.y" { OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5128,22 +5144,22 @@ yyreduce: else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5132 "util/configparser.c" +#line 5148 "util/configparser.c" break; - case 451: -#line 2127 "./util/configparser.y" + case 453: +#line 2137 "./util/configparser.y" { OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa, (yyvsp[0].str))) fatal_exit("out of memory adding dns64-ignore-aaaa"); } -#line 5143 "util/configparser.c" +#line 5159 "util/configparser.c" break; - case 452: -#line 2135 "./util/configparser.y" + case 454: +#line 2145 "./util/configparser.y" { char* p, *s = (yyvsp[0].str); OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str))); @@ -5156,11 +5172,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5160 "util/configparser.c" +#line 5176 "util/configparser.c" break; - case 453: -#line 2149 "./util/configparser.y" + case 455: +#line 2159 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5180,11 +5196,11 @@ yyreduce: } } } -#line 5184 "util/configparser.c" +#line 5200 "util/configparser.c" break; - case 454: -#line 2170 "./util/configparser.y" + case 456: +#line 2180 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5204,11 +5220,11 @@ yyreduce: } } } -#line 5208 "util/configparser.c" +#line 5224 "util/configparser.c" break; - case 455: -#line 2191 "./util/configparser.y" + case 457: +#line 2201 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions, @@ -5219,11 +5235,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5223 "util/configparser.c" +#line 5239 "util/configparser.c" break; - case 456: -#line 2203 "./util/configparser.y" + case 458: +#line 2213 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas, @@ -5234,11 +5250,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5238 "util/configparser.c" +#line 5254 "util/configparser.c" break; - case 457: -#line 2215 "./util/configparser.y" + case 459: +#line 2225 "./util/configparser.y" { OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides, @@ -5249,11 +5265,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5253 "util/configparser.c" +#line 5269 "util/configparser.c" break; - case 458: -#line 2227 "./util/configparser.y" + case 460: +#line 2237 "./util/configparser.y" { OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view, @@ -5261,11 +5277,11 @@ yyreduce: yyerror("out of memory"); } } -#line 5265 "util/configparser.c" +#line 5281 "util/configparser.c" break; - case 459: -#line 2236 "./util/configparser.y" + case 461: +#line 2246 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5285,11 +5301,11 @@ yyreduce: } } } -#line 5289 "util/configparser.c" +#line 5305 "util/configparser.c" break; - case 460: -#line 2257 "./util/configparser.y" + case 462: +#line 2267 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5297,11 +5313,11 @@ yyreduce: else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5301 "util/configparser.c" +#line 5317 "util/configparser.c" break; - case 461: -#line 2267 "./util/configparser.y" + case 463: +#line 2277 "./util/configparser.y" { OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5309,33 +5325,33 @@ yyreduce: else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5313 "util/configparser.c" +#line 5329 "util/configparser.c" break; - case 462: -#line 2276 "./util/configparser.y" + case 464: +#line 2286 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5324 "util/configparser.c" +#line 5340 "util/configparser.c" break; - case 463: -#line 2284 "./util/configparser.y" + case 465: +#line 2294 "./util/configparser.y" { OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5335 "util/configparser.c" +#line 5351 "util/configparser.c" break; - case 464: -#line 2292 "./util/configparser.y" + case 466: +#line 2302 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -5347,11 +5363,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5351 "util/configparser.c" +#line 5367 "util/configparser.c" break; - case 465: -#line 2305 "./util/configparser.y" + case 467: +#line 2315 "./util/configparser.y" { OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -5363,11 +5379,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5367 "util/configparser.c" +#line 5383 "util/configparser.c" break; - case 466: -#line 2318 "./util/configparser.y" + case 468: +#line 2328 "./util/configparser.y" { OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) { @@ -5381,11 +5397,11 @@ yyreduce: "ratelimit-for-domain"); } } -#line 5385 "util/configparser.c" +#line 5401 "util/configparser.c" break; - case 467: -#line 2333 "./util/configparser.y" + case 469: +#line 2343 "./util/configparser.y" { OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) { @@ -5399,11 +5415,11 @@ yyreduce: "ratelimit-below-domain"); } } -#line 5403 "util/configparser.c" +#line 5419 "util/configparser.c" break; - case 468: -#line 2348 "./util/configparser.y" + case 470: +#line 2358 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5411,11 +5427,11 @@ yyreduce: else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5415 "util/configparser.c" +#line 5431 "util/configparser.c" break; - case 469: -#line 2357 "./util/configparser.y" + case 471: +#line 2367 "./util/configparser.y" { OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5423,20 +5439,20 @@ yyreduce: else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5427 "util/configparser.c" +#line 5443 "util/configparser.c" break; - case 470: -#line 2366 "./util/configparser.y" + case 472: +#line 2376 "./util/configparser.y" { OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n")); free((yyvsp[0].str)); } -#line 5436 "util/configparser.c" +#line 5452 "util/configparser.c" break; - case 471: -#line 2372 "./util/configparser.y" + case 473: +#line 2382 "./util/configparser.y" { OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) <= 0) @@ -5444,11 +5460,11 @@ yyreduce: else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5448 "util/configparser.c" +#line 5464 "util/configparser.c" break; - case 472: -#line 2381 "./util/configparser.y" + case 474: +#line 2391 "./util/configparser.y" { OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5456,11 +5472,11 @@ yyreduce: else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5460 "util/configparser.c" +#line 5476 "util/configparser.c" break; - case 473: -#line 2390 "./util/configparser.y" + case 475: +#line 2400 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5469,11 +5485,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5473 "util/configparser.c" +#line 5489 "util/configparser.c" break; - case 474: -#line 2400 "./util/configparser.y" + case 476: +#line 2410 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5482,11 +5498,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5486 "util/configparser.c" +#line 5502 "util/configparser.c" break; - case 475: -#line 2410 "./util/configparser.y" + case 477: +#line 2420 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str))); @@ -5498,11 +5514,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5502 "util/configparser.c" +#line 5518 "util/configparser.c" break; - case 476: -#line 2423 "./util/configparser.y" + case 478: +#line 2433 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str))); @@ -5514,11 +5530,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5518 "util/configparser.c" +#line 5534 "util/configparser.c" break; - case 477: -#line 2436 "./util/configparser.y" + case 479: +#line 2446 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str))); @@ -5529,11 +5545,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5533 "util/configparser.c" +#line 5549 "util/configparser.c" break; - case 478: -#line 2448 "./util/configparser.y" + case 480: +#line 2458 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str))); @@ -5546,11 +5562,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5550 "util/configparser.c" +#line 5566 "util/configparser.c" break; - case 479: -#line 2462 "./util/configparser.y" + case 481: +#line 2472 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str))); @@ -5561,11 +5577,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5565 "util/configparser.c" +#line 5581 "util/configparser.c" break; - case 480: -#line 2474 "./util/configparser.y" + case 482: +#line 2484 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str))); @@ -5578,11 +5594,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5582 "util/configparser.c" +#line 5598 "util/configparser.c" break; - case 481: -#line 2488 "./util/configparser.y" + case 483: +#line 2498 "./util/configparser.y" { int tag_data; OUTYY(("P(server_edns_client_tag:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); @@ -5596,11 +5612,11 @@ yyreduce: fatal_exit("out of memory adding " "edns-client-tag"); } -#line 5600 "util/configparser.c" +#line 5616 "util/configparser.c" break; - case 482: -#line 2503 "./util/configparser.y" + case 484: +#line 2513 "./util/configparser.y" { OUTYY(("P(edns_client_tag_opcode:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5610,11 +5626,11 @@ yyreduce: else cfg_parser->cfg->edns_client_tag_opcode = atoi((yyvsp[0].str)); } -#line 5614 "util/configparser.c" +#line 5630 "util/configparser.c" break; - case 483: -#line 2514 "./util/configparser.y" + case 485: +#line 2524 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->stubs->name) @@ -5623,31 +5639,31 @@ yyreduce: free(cfg_parser->cfg->stubs->name); cfg_parser->cfg->stubs->name = (yyvsp[0].str); } -#line 5627 "util/configparser.c" +#line 5643 "util/configparser.c" break; - case 484: -#line 2524 "./util/configparser.y" + case 486: +#line 2534 "./util/configparser.y" { OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5637 "util/configparser.c" +#line 5653 "util/configparser.c" break; - case 485: -#line 2531 "./util/configparser.y" + case 487: +#line 2541 "./util/configparser.y" { OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5647 "util/configparser.c" +#line 5663 "util/configparser.c" break; - case 486: -#line 2538 "./util/configparser.y" + case 488: +#line 2548 "./util/configparser.y" { OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5655,11 +5671,11 @@ yyreduce: else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5659 "util/configparser.c" +#line 5675 "util/configparser.c" break; - case 487: -#line 2547 "./util/configparser.y" + case 489: +#line 2557 "./util/configparser.y" { OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5667,11 +5683,11 @@ yyreduce: else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5671 "util/configparser.c" +#line 5687 "util/configparser.c" break; - case 488: -#line 2556 "./util/configparser.y" + case 490: +#line 2566 "./util/configparser.y" { OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5680,11 +5696,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5684 "util/configparser.c" +#line 5700 "util/configparser.c" break; - case 489: -#line 2566 "./util/configparser.y" + case 491: +#line 2576 "./util/configparser.y" { OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5693,11 +5709,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5697 "util/configparser.c" +#line 5713 "util/configparser.c" break; - case 490: -#line 2576 "./util/configparser.y" + case 492: +#line 2586 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->forwards->name) @@ -5706,31 +5722,31 @@ yyreduce: free(cfg_parser->cfg->forwards->name); cfg_parser->cfg->forwards->name = (yyvsp[0].str); } -#line 5710 "util/configparser.c" +#line 5726 "util/configparser.c" break; - case 491: -#line 2586 "./util/configparser.y" + case 493: +#line 2596 "./util/configparser.y" { OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5720 "util/configparser.c" +#line 5736 "util/configparser.c" break; - case 492: -#line 2593 "./util/configparser.y" + case 494: +#line 2603 "./util/configparser.y" { OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5730 "util/configparser.c" +#line 5746 "util/configparser.c" break; - case 493: -#line 2600 "./util/configparser.y" + case 495: +#line 2610 "./util/configparser.y" { OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5738,11 +5754,11 @@ yyreduce: else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5742 "util/configparser.c" +#line 5758 "util/configparser.c" break; - case 494: -#line 2609 "./util/configparser.y" + case 496: +#line 2619 "./util/configparser.y" { OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5750,11 +5766,11 @@ yyreduce: else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5754 "util/configparser.c" +#line 5770 "util/configparser.c" break; - case 495: -#line 2618 "./util/configparser.y" + case 497: +#line 2628 "./util/configparser.y" { OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5763,11 +5779,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5767 "util/configparser.c" +#line 5783 "util/configparser.c" break; - case 496: -#line 2628 "./util/configparser.y" + case 498: +#line 2638 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->auths->name) @@ -5776,52 +5792,52 @@ yyreduce: free(cfg_parser->cfg->auths->name); cfg_parser->cfg->auths->name = (yyvsp[0].str); } -#line 5780 "util/configparser.c" +#line 5796 "util/configparser.c" break; - case 497: -#line 2638 "./util/configparser.y" + case 499: +#line 2648 "./util/configparser.y" { OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->zonefile); cfg_parser->cfg->auths->zonefile = (yyvsp[0].str); } -#line 5790 "util/configparser.c" +#line 5806 "util/configparser.c" break; - case 498: -#line 2645 "./util/configparser.y" + case 500: +#line 2655 "./util/configparser.y" { OUTYY(("P(master:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5800 "util/configparser.c" +#line 5816 "util/configparser.c" break; - case 499: -#line 2652 "./util/configparser.y" + case 501: +#line 2662 "./util/configparser.y" { OUTYY(("P(url:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5810 "util/configparser.c" +#line 5826 "util/configparser.c" break; - case 500: -#line 2659 "./util/configparser.y" + case 502: +#line 2669 "./util/configparser.y" { OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5821 "util/configparser.c" +#line 5837 "util/configparser.c" break; - case 501: -#line 2667 "./util/configparser.y" + case 503: +#line 2677 "./util/configparser.y" { OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5830,11 +5846,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5834 "util/configparser.c" +#line 5850 "util/configparser.c" break; - case 502: -#line 2677 "./util/configparser.y" + case 504: +#line 2687 "./util/configparser.y" { OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5843,11 +5859,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5847 "util/configparser.c" +#line 5863 "util/configparser.c" break; - case 503: -#line 2687 "./util/configparser.y" + case 505: +#line 2697 "./util/configparser.y" { OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5856,11 +5872,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5860 "util/configparser.c" +#line 5876 "util/configparser.c" break; - case 504: -#line 2697 "./util/configparser.y" + case 506: +#line 2707 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->views->name) @@ -5869,11 +5885,11 @@ yyreduce: free(cfg_parser->cfg->views->name); cfg_parser->cfg->views->name = (yyvsp[0].str); } -#line 5873 "util/configparser.c" +#line 5889 "util/configparser.c" break; - case 505: -#line 2707 "./util/configparser.y" + case 507: +#line 2717 "./util/configparser.y" { OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 && @@ -5911,11 +5927,11 @@ yyreduce: fatal_exit("out of memory adding local-zone"); } } -#line 5915 "util/configparser.c" +#line 5931 "util/configparser.c" break; - case 506: -#line 2746 "./util/configparser.y" + case 508: +#line 2756 "./util/configparser.y" { OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_respip_action((yyvsp[0].str)); @@ -5924,33 +5940,33 @@ yyreduce: fatal_exit("out of memory adding per-view " "response-ip action"); } -#line 5928 "util/configparser.c" +#line 5944 "util/configparser.c" break; - case 507: -#line 2756 "./util/configparser.y" + case 509: +#line 2766 "./util/configparser.y" { OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str))); if(!cfg_str2list_insert( &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip-data"); } -#line 5939 "util/configparser.c" +#line 5955 "util/configparser.c" break; - case 508: -#line 2764 "./util/configparser.y" + case 510: +#line 2774 "./util/configparser.y" { OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) { fatal_exit("out of memory adding local-data"); } } -#line 5950 "util/configparser.c" +#line 5966 "util/configparser.c" break; - case 509: -#line 2772 "./util/configparser.y" + case 511: +#line 2782 "./util/configparser.y" { char* ptr; OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str))); @@ -5964,11 +5980,11 @@ yyreduce: yyerror("local-data-ptr could not be reversed"); } } -#line 5968 "util/configparser.c" +#line 5984 "util/configparser.c" break; - case 510: -#line 2787 "./util/configparser.y" + case 512: +#line 2797 "./util/configparser.y" { OUTYY(("P(view-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5976,19 +5992,19 @@ yyreduce: else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5980 "util/configparser.c" +#line 5996 "util/configparser.c" break; - case 511: -#line 2796 "./util/configparser.y" + case 513: +#line 2806 "./util/configparser.y" { OUTYY(("\nP(remote-control:)\n")); } -#line 5988 "util/configparser.c" +#line 6004 "util/configparser.c" break; - case 522: -#line 2807 "./util/configparser.y" + case 524: +#line 2817 "./util/configparser.y" { OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5997,11 +6013,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6001 "util/configparser.c" +#line 6017 "util/configparser.c" break; - case 523: -#line 2817 "./util/configparser.y" + case 525: +#line 2827 "./util/configparser.y" { OUTYY(("P(control_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6009,79 +6025,79 @@ yyreduce: else cfg_parser->cfg->control_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 6013 "util/configparser.c" +#line 6029 "util/configparser.c" break; - case 524: -#line 2826 "./util/configparser.y" + case 526: +#line 2836 "./util/configparser.y" { OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6023 "util/configparser.c" +#line 6039 "util/configparser.c" break; - case 525: -#line 2833 "./util/configparser.y" + case 527: +#line 2843 "./util/configparser.y" { OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6033 "util/configparser.c" +#line 6049 "util/configparser.c" break; - case 526: -#line 2840 "./util/configparser.y" + case 528: +#line 2850 "./util/configparser.y" { OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->server_key_file); cfg_parser->cfg->server_key_file = (yyvsp[0].str); } -#line 6043 "util/configparser.c" +#line 6059 "util/configparser.c" break; - case 527: -#line 2847 "./util/configparser.y" + case 529: +#line 2857 "./util/configparser.y" { OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->server_cert_file); cfg_parser->cfg->server_cert_file = (yyvsp[0].str); } -#line 6053 "util/configparser.c" +#line 6069 "util/configparser.c" break; - case 528: -#line 2854 "./util/configparser.y" + case 530: +#line 2864 "./util/configparser.y" { OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->control_key_file); cfg_parser->cfg->control_key_file = (yyvsp[0].str); } -#line 6063 "util/configparser.c" +#line 6079 "util/configparser.c" break; - case 529: -#line 2861 "./util/configparser.y" + case 531: +#line 2871 "./util/configparser.y" { OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->control_cert_file); cfg_parser->cfg->control_cert_file = (yyvsp[0].str); } -#line 6073 "util/configparser.c" +#line 6089 "util/configparser.c" break; - case 530: -#line 2868 "./util/configparser.y" + case 532: +#line 2878 "./util/configparser.y" { OUTYY(("\nP(dnstap:)\n")); } -#line 6081 "util/configparser.c" +#line 6097 "util/configparser.c" break; - case 552: -#line 2888 "./util/configparser.y" + case 554: +#line 2898 "./util/configparser.y" { OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6089,11 +6105,11 @@ yyreduce: else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6093 "util/configparser.c" +#line 6109 "util/configparser.c" break; - case 553: -#line 2897 "./util/configparser.y" + case 555: +#line 2907 "./util/configparser.y" { OUTYY(("P(dt_dnstap_bidirectional:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6102,31 +6118,31 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6106 "util/configparser.c" +#line 6122 "util/configparser.c" break; - case 554: -#line 2907 "./util/configparser.y" + case 556: +#line 2917 "./util/configparser.y" { OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_socket_path); cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str); } -#line 6116 "util/configparser.c" +#line 6132 "util/configparser.c" break; - case 555: -#line 2914 "./util/configparser.y" + case 557: +#line 2924 "./util/configparser.y" { OUTYY(("P(dt_dnstap_ip:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_ip); cfg_parser->cfg->dnstap_ip = (yyvsp[0].str); } -#line 6126 "util/configparser.c" +#line 6142 "util/configparser.c" break; - case 556: -#line 2921 "./util/configparser.y" + case 558: +#line 2931 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6134,51 +6150,51 @@ yyreduce: else cfg_parser->cfg->dnstap_tls = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6138 "util/configparser.c" +#line 6154 "util/configparser.c" break; - case 557: -#line 2930 "./util/configparser.y" + case 559: +#line 2940 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_server_name); cfg_parser->cfg->dnstap_tls_server_name = (yyvsp[0].str); } -#line 6148 "util/configparser.c" +#line 6164 "util/configparser.c" break; - case 558: -#line 2937 "./util/configparser.y" + case 560: +#line 2947 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_cert_bundle); cfg_parser->cfg->dnstap_tls_cert_bundle = (yyvsp[0].str); } -#line 6158 "util/configparser.c" +#line 6174 "util/configparser.c" break; - case 559: -#line 2944 "./util/configparser.y" + case 561: +#line 2954 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_client_key_file); cfg_parser->cfg->dnstap_tls_client_key_file = (yyvsp[0].str); } -#line 6168 "util/configparser.c" +#line 6184 "util/configparser.c" break; - case 560: -#line 2951 "./util/configparser.y" + case 562: +#line 2961 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_client_cert_file); cfg_parser->cfg->dnstap_tls_client_cert_file = (yyvsp[0].str); } -#line 6178 "util/configparser.c" +#line 6194 "util/configparser.c" break; - case 561: -#line 2958 "./util/configparser.y" + case 563: +#line 2968 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6186,11 +6202,11 @@ yyreduce: else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6190 "util/configparser.c" +#line 6206 "util/configparser.c" break; - case 562: -#line 2967 "./util/configparser.y" + case 564: +#line 2977 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6198,31 +6214,31 @@ yyreduce: else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6202 "util/configparser.c" +#line 6218 "util/configparser.c" break; - case 563: -#line 2976 "./util/configparser.y" + case 565: +#line 2986 "./util/configparser.y" { OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_identity); cfg_parser->cfg->dnstap_identity = (yyvsp[0].str); } -#line 6212 "util/configparser.c" +#line 6228 "util/configparser.c" break; - case 564: -#line 2983 "./util/configparser.y" + case 566: +#line 2993 "./util/configparser.y" { OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_version); cfg_parser->cfg->dnstap_version = (yyvsp[0].str); } -#line 6222 "util/configparser.c" +#line 6238 "util/configparser.c" break; - case 565: -#line 2990 "./util/configparser.y" + case 567: +#line 3000 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6231,11 +6247,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6235 "util/configparser.c" +#line 6251 "util/configparser.c" break; - case 566: -#line 3000 "./util/configparser.y" + case 568: +#line 3010 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6244,11 +6260,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6248 "util/configparser.c" +#line 6264 "util/configparser.c" break; - case 567: -#line 3010 "./util/configparser.y" + case 569: +#line 3020 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6257,11 +6273,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6261 "util/configparser.c" +#line 6277 "util/configparser.c" break; - case 568: -#line 3020 "./util/configparser.y" + case 570: +#line 3030 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6270,11 +6286,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6274 "util/configparser.c" +#line 6290 "util/configparser.c" break; - case 569: -#line 3030 "./util/configparser.y" + case 571: +#line 3040 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6283,11 +6299,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6287 "util/configparser.c" +#line 6303 "util/configparser.c" break; - case 570: -#line 3040 "./util/configparser.y" + case 572: +#line 3050 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6296,47 +6312,47 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6300 "util/configparser.c" +#line 6316 "util/configparser.c" break; - case 571: -#line 3050 "./util/configparser.y" + case 573: +#line 3060 "./util/configparser.y" { OUTYY(("\nP(python:)\n")); } -#line 6308 "util/configparser.c" +#line 6324 "util/configparser.c" break; - case 575: -#line 3059 "./util/configparser.y" + case 577: +#line 3069 "./util/configparser.y" { OUTYY(("P(python-script:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6318 "util/configparser.c" +#line 6334 "util/configparser.c" break; - case 576: -#line 3065 "./util/configparser.y" + case 578: +#line 3075 "./util/configparser.y" { OUTYY(("\nP(dynlib:)\n")); } -#line 6326 "util/configparser.c" +#line 6342 "util/configparser.c" break; - case 580: -#line 3074 "./util/configparser.y" + case 582: +#line 3084 "./util/configparser.y" { OUTYY(("P(dynlib-file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6336 "util/configparser.c" +#line 6352 "util/configparser.c" break; - case 581: -#line 3080 "./util/configparser.y" + case 583: +#line 3090 "./util/configparser.y" { OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str))); if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6345,21 +6361,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6349 "util/configparser.c" +#line 6365 "util/configparser.c" break; - case 582: -#line 3090 "./util/configparser.y" + case 584: +#line 3100 "./util/configparser.y" { OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->log_identity); cfg_parser->cfg->log_identity = (yyvsp[0].str); } -#line 6359 "util/configparser.c" +#line 6375 "util/configparser.c" break; - case 583: -#line 3097 "./util/configparser.y" + case 585: +#line 3107 "./util/configparser.y" { OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_respip_action((yyvsp[0].str)); @@ -6367,30 +6383,30 @@ yyreduce: (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip"); } -#line 6371 "util/configparser.c" +#line 6387 "util/configparser.c" break; - case 584: -#line 3106 "./util/configparser.y" + case 586: +#line 3116 "./util/configparser.y" { OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip-data"); } -#line 6382 "util/configparser.c" +#line 6398 "util/configparser.c" break; - case 585: -#line 3114 "./util/configparser.y" + case 587: +#line 3124 "./util/configparser.y" { OUTYY(("\nP(dnscrypt:)\n")); } -#line 6390 "util/configparser.c" +#line 6406 "util/configparser.c" break; - case 598: -#line 3130 "./util/configparser.y" + case 600: +#line 3140 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6398,11 +6414,11 @@ yyreduce: else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6402 "util/configparser.c" +#line 6418 "util/configparser.c" break; - case 599: -#line 3140 "./util/configparser.y" + case 601: +#line 3150 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6410,21 +6426,21 @@ yyreduce: else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 6414 "util/configparser.c" +#line 6430 "util/configparser.c" break; - case 600: -#line 3149 "./util/configparser.y" + case 602: +#line 3159 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnscrypt_provider); cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str); } -#line 6424 "util/configparser.c" +#line 6440 "util/configparser.c" break; - case 601: -#line 3156 "./util/configparser.y" + case 603: +#line 3166 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str))) @@ -6432,21 +6448,21 @@ yyreduce: if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-provider-cert"); } -#line 6436 "util/configparser.c" +#line 6452 "util/configparser.c" break; - case 602: -#line 3165 "./util/configparser.y" + case 604: +#line 3175 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-provider-cert-rotated"); } -#line 6446 "util/configparser.c" +#line 6462 "util/configparser.c" break; - case 603: -#line 3172 "./util/configparser.y" + case 605: +#line 3182 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str))) @@ -6454,22 +6470,22 @@ yyreduce: if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-secret-key"); } -#line 6458 "util/configparser.c" +#line 6474 "util/configparser.c" break; - case 604: -#line 3181 "./util/configparser.y" + case 606: +#line 3191 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 6469 "util/configparser.c" +#line 6485 "util/configparser.c" break; - case 605: -#line 3189 "./util/configparser.y" + case 607: +#line 3199 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6481,22 +6497,22 @@ yyreduce: } free((yyvsp[0].str)); } -#line 6485 "util/configparser.c" +#line 6501 "util/configparser.c" break; - case 606: -#line 3202 "./util/configparser.y" + case 608: +#line 3212 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 6496 "util/configparser.c" +#line 6512 "util/configparser.c" break; - case 607: -#line 3210 "./util/configparser.y" + case 609: +#line 3220 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6508,19 +6524,19 @@ yyreduce: } free((yyvsp[0].str)); } -#line 6512 "util/configparser.c" +#line 6528 "util/configparser.c" break; - case 608: -#line 3223 "./util/configparser.y" + case 610: +#line 3233 "./util/configparser.y" { OUTYY(("\nP(cachedb:)\n")); } -#line 6520 "util/configparser.c" +#line 6536 "util/configparser.c" break; - case 617: -#line 3234 "./util/configparser.y" + case 619: +#line 3244 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(backend:%s)\n", (yyvsp[0].str))); @@ -6531,11 +6547,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6535 "util/configparser.c" +#line 6551 "util/configparser.c" break; - case 618: -#line 3246 "./util/configparser.y" + case 620: +#line 3256 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str))); @@ -6546,11 +6562,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6550 "util/configparser.c" +#line 6566 "util/configparser.c" break; - case 619: -#line 3258 "./util/configparser.y" + case 621: +#line 3268 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str))); @@ -6561,11 +6577,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6565 "util/configparser.c" +#line 6581 "util/configparser.c" break; - case 620: -#line 3270 "./util/configparser.y" + case 622: +#line 3280 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) int port; @@ -6579,11 +6595,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 6583 "util/configparser.c" +#line 6599 "util/configparser.c" break; - case 621: -#line 3285 "./util/configparser.y" + case 623: +#line 3295 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str))); @@ -6595,11 +6611,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 6599 "util/configparser.c" +#line 6615 "util/configparser.c" break; - case 622: -#line 3298 "./util/configparser.y" + case 624: +#line 3308 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_expire_records:%s)\n", (yyvsp[0].str))); @@ -6611,11 +6627,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 6615 "util/configparser.c" +#line 6631 "util/configparser.c" break; - case 623: -#line 3311 "./util/configparser.y" + case 625: +#line 3321 "./util/configparser.y" { OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if (atoi((yyvsp[0].str)) < 0) @@ -6625,19 +6641,19 @@ yyreduce: fatal_exit("out of memory adding tcp connection limit"); } } -#line 6629 "util/configparser.c" +#line 6645 "util/configparser.c" break; - case 624: -#line 3322 "./util/configparser.y" + case 626: +#line 3332 "./util/configparser.y" { OUTYY(("\nP(ipset:)\n")); } -#line 6637 "util/configparser.c" +#line 6653 "util/configparser.c" break; - case 629: -#line 3331 "./util/configparser.y" + case 631: +#line 3341 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v4:%s)\n", (yyvsp[0].str))); @@ -6651,11 +6667,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6655 "util/configparser.c" +#line 6671 "util/configparser.c" break; - case 630: -#line 3346 "./util/configparser.y" + case 632: +#line 3356 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v6:%s)\n", (yyvsp[0].str))); @@ -6669,11 +6685,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6673 "util/configparser.c" +#line 6689 "util/configparser.c" break; -#line 6677 "util/configparser.c" +#line 6693 "util/configparser.c" default: break; } @@ -6905,7 +6921,7 @@ yyreturn: #endif return yyresult; } -#line 3360 "./util/configparser.y" +#line 3370 "./util/configparser.y" /* parse helper routines could be here */ diff --git a/util/configparser.h b/util/configparser.h index 79ed369c4..bf8fa618a 100644 --- a/util/configparser.h +++ b/util/configparser.h @@ -347,7 +347,8 @@ extern int yydebug; VAR_DYNLIB = 553, VAR_DYNLIB_FILE = 554, VAR_EDNS_CLIENT_TAG = 555, - VAR_EDNS_CLIENT_TAG_OPCODE = 556 + VAR_EDNS_CLIENT_TAG_OPCODE = 556, + VAR_ZONEMD_PERMISSIVE_MODE = 557 }; #endif /* Tokens. */ @@ -650,6 +651,7 @@ extern int yydebug; #define VAR_DYNLIB_FILE 554 #define VAR_EDNS_CLIENT_TAG 555 #define VAR_EDNS_CLIENT_TAG_OPCODE 556 +#define VAR_ZONEMD_PERMISSIVE_MODE 557 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -659,7 +661,7 @@ union YYSTYPE char* str; -#line 663 "util/configparser.h" +#line 665 "util/configparser.h" }; typedef union YYSTYPE YYSTYPE; diff --git a/util/configparser.y b/util/configparser.y index 340fc0f5d..8067d04ef 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -179,6 +179,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_TLS_SESSION_TICKET_KEYS VAR_RPZ VAR_TAGS VAR_RPZ_ACTION_OVERRIDE %token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME %token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_TAG VAR_EDNS_CLIENT_TAG_OPCODE +%token VAR_ZONEMD_PERMISSIVE_MODE %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -292,7 +293,7 @@ content_server: server_num_threads | server_verbosity | server_port | server_stream_wait_size | server_tls_ciphers | server_tls_ciphersuites | server_tls_session_ticket_keys | server_tls_use_sni | server_edns_client_tag | - server_edns_client_tag_opcode + server_edns_client_tag_opcode | server_zonemd_permissive_mode ; stubstart: VAR_STUB_ZONE { @@ -1945,6 +1946,15 @@ server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG cfg_parser->cfg->val_nsec3_key_iterations = $2; } ; +server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG + { + OUTYY(("P(server_zonemd_permissive_mode:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->zonemd_permissive_mode = (strcmp($2, "yes")==0); + free($2); + } + ; server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG { OUTYY(("P(server_add_holddown:%s)\n", $2)); From 2b9569c7feeac7d6d2e98dd30291582952f89d32 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 14:38:57 +0200 Subject: [PATCH 44/66] zonemd, fix config_get_option for zonemd-permissive-mode and unit test for zonemd-permissive-mode. --- testdata/auth_zonemd_permissive_mode.rpl | 186 +++++++++++++++++++++++ util/config_file.c | 2 +- 2 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 testdata/auth_zonemd_permissive_mode.rpl diff --git a/testdata/auth_zonemd_permissive_mode.rpl b/testdata/auth_zonemd_permissive_mode.rpl new file mode 100644 index 000000000..4c75504f3 --- /dev/null +++ b/testdata/auth_zonemd_permissive_mode.rpl @@ -0,0 +1,186 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + zonemd-permissive-mode: yes + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +; good zonemd +;example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; wrong zonemd +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D7AAAAA +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD failure from zonefile + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +SCENARIO_END diff --git a/util/config_file.c b/util/config_file.c index af0aaa3c3..97aa01896 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -1039,7 +1039,7 @@ config_get_option(struct config_file* cfg, const char* opt, else O_DEC(opt, "serve-expired-reply-ttl", serve_expired_reply_ttl) else O_DEC(opt, "serve-expired-client-timeout", serve_expired_client_timeout) else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations) - else O_YNO(opt, "zonemd_permissive_mode", zonemd_permissive_mode) + else O_YNO(opt, "zonemd-permissive-mode", zonemd_permissive_mode) else O_UNS(opt, "add-holddown", add_holddown) else O_UNS(opt, "del-holddown", del_holddown) else O_UNS(opt, "keep-missing", keep_missing) From 8e53f0b14f0ddf863e4b21451b04ea42722a26de Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 23 Oct 2020 14:40:00 +0200 Subject: [PATCH 45/66] zonemd, unit test with correct title. --- testdata/auth_zonemd_permissive_mode.rpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testdata/auth_zonemd_permissive_mode.rpl b/testdata/auth_zonemd_permissive_mode.rpl index 4c75504f3..0df0a2951 100644 --- a/testdata/auth_zonemd_permissive_mode.rpl +++ b/testdata/auth_zonemd_permissive_mode.rpl @@ -47,7 +47,7 @@ stub-zone: stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. CONFIG_END -SCENARIO_BEGIN Test authority zone with ZONEMD failure from zonefile +SCENARIO_BEGIN Test zonemd permissive mode ; K.ROOT-SERVERS.NET. RANGE_BEGIN 0 100 From 94ac072f9b27d5e0ab175fb9ed528fe977ea1de3 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Mon, 26 Oct 2020 15:37:43 +0100 Subject: [PATCH 46/66] zonemd, zonemd-reject-absence config for an auth-zone rejects the zone if no ZONEMD is present. --- doc/example.conf.in | 1 + doc/unbound.conf.5.in | 13 + services/authzone.c | 3 +- services/authzone.h | 2 + util/config_file.h | 2 + util/configlexer.c | 4185 +++++++++++++++++++++-------------------- util/configlexer.lex | 1 + util/configparser.c | 2521 +++++++++++++------------ util/configparser.h | 6 +- util/configparser.y | 15 +- 10 files changed, 3411 insertions(+), 3338 deletions(-) diff --git a/doc/example.conf.in b/doc/example.conf.in index 6e6bf781b..ce8b22e57 100644 --- a/doc/example.conf.in +++ b/doc/example.conf.in @@ -998,6 +998,7 @@ remote-control: # name: "example.org" # for-downstream: yes # for-upstream: yes +# zonemd-reject-absence: no # zonefile: "example.org.zone" # Views diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in index 6b4fbef56..d5128f1c4 100644 --- a/doc/unbound.conf.5.in +++ b/doc/unbound.conf.5.in @@ -1829,6 +1829,19 @@ to the authority servers for this zone, it'll fetch the data directly from the zone data. Turn it on when you want unbound to provide recursion for downstream clients, and use the zone data as a local copy to speed up lookups. .TP +.B zonemd\-reject\-absence: \fI +Enable this option to reject the absence of the ZONEMD record. Without it, +when zonemd is not there it is not checked. It is useful to enable for a +nonDNSSEC signed zone where the operator wants to require the verification +of a ZONEMD, hence a missing ZONEMD is a failure. The action upon +failure is controlled by the \fBzonemd\-permissive\-mode\fR option, for +log only or also block the zone. The default is no. +.IP +Without the option absence of a ZONEMD is only a failure when the zone is +DNSSEC signed, and we have a trust anchor, and the DNSSEC verification of +the absence of the ZONEMD fails. With the option enabled, the absence of +a ZONEMD is always a failure, also for nonDNSSEC signed zones. +.TP .B zonefile: \fI The filename where the zone is stored. If not given then no zonefile is used. If the file does not exist or is empty, unbound will attempt to fetch zone diff --git a/services/authzone.c b/services/authzone.c index 4727b0546..252d2884c 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -2047,6 +2047,7 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c) z->for_downstream = c->for_downstream; z->for_upstream = c->for_upstream; z->fallback_enabled = c->fallback_enabled; + z->zonemd_reject_absence = c->zonemd_reject_absence; if(c->isrpz && !z->rpz){ if(!(z->rpz = rpz_create(c))){ fatal_exit("Could not setup RPZ zones"); @@ -7887,7 +7888,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, } } - if(zonemd_absent && 0) { + if(zonemd_absent && z->zonemd_reject_absence) { auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", NULL, result); return; } diff --git a/services/authzone.h b/services/authzone.h index 9452a3db2..b162b4ef5 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -132,6 +132,8 @@ struct auth_zone { /** for upstream: this zone answers queries that unbound intends to * send upstream. */ int for_upstream; + /** reject absence of ZONEMD records */ + int zonemd_reject_absence; /** RPZ zones */ struct rpz* rpz; /** store the env (worker thread specific) for the zonemd callbacks diff --git a/util/config_file.h b/util/config_file.h index d707bac19..1e71b9367 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -710,6 +710,8 @@ struct config_auth { /** Always reply with this CNAME target if the cname override action is * used */ char* rpz_cname; + /** Reject absence of ZONEMD records, zone must have one */ + int zonemd_reject_absence; }; /** diff --git a/util/configlexer.c b/util/configlexer.c index 0aac2586e..003978879 100644 --- a/util/configlexer.c +++ b/util/configlexer.c @@ -354,8 +354,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 337 -#define YY_END_OF_BUFFER 338 +#define YY_NUM_RULES 338 +#define YY_END_OF_BUFFER 339 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -363,371 +363,373 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[3300] = +static const flex_int16_t yy_accept[3315] = { 0, - 1, 1, 311, 311, 315, 315, 319, 319, 323, 323, - 1, 1, 327, 327, 331, 331, 338, 335, 1, 309, - 309, 336, 2, 336, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 311, 312, 312, 313, - 336, 315, 316, 316, 317, 336, 322, 319, 320, 320, - 321, 336, 323, 324, 324, 325, 336, 334, 310, 2, - 314, 336, 334, 330, 327, 328, 328, 329, 336, 331, - 332, 332, 333, 336, 335, 0, 1, 2, 2, 2, - 2, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 1, 1, 312, 312, 316, 316, 320, 320, 324, 324, + 1, 1, 328, 328, 332, 332, 339, 336, 1, 310, + 310, 337, 2, 337, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 312, 313, 313, 314, + 337, 316, 317, 317, 318, 337, 323, 320, 321, 321, + 322, 337, 324, 325, 325, 326, 337, 335, 311, 2, + 315, 337, 335, 331, 328, 329, 329, 330, 337, 332, + 333, 333, 334, 337, 336, 0, 1, 2, 2, 2, + 2, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 311, 0, 315, - 0, 322, 0, 319, 323, 0, 334, 0, 2, 2, - 334, 330, 0, 327, 331, 0, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 312, 0, 316, + 0, 323, 0, 320, 324, 0, 335, 0, 2, 2, + 335, 331, 0, 328, 332, 0, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 334, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 335, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 124, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 133, 335, 335, 335, 335, 335, 335, - 335, 334, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 124, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 133, 336, 336, 336, 336, 336, 336, + 336, 335, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 108, 335, 335, 335, 335, 335, 335, 8, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 125, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 108, 336, 336, 336, 336, 336, 336, 8, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 125, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 138, 335, 335, - 334, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 302, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 138, 336, 336, + 335, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 303, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 334, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 64, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 238, - 335, 14, 15, 335, 19, 18, 335, 335, 222, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 131, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 335, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 64, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 239, + 336, 14, 15, 336, 19, 18, 336, 336, 223, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 131, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 220, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 3, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 334, 335, 335, 335, - 335, 335, 335, 335, 296, 335, 335, 295, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 221, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 3, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 335, 336, 336, 336, + 336, 336, 336, 336, 297, 336, 336, 296, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 318, 335, 335, 335, 335, - 335, 335, 335, 335, 63, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 67, 335, 269, 335, 335, 335, 335, 335, 335, - 335, 335, 303, 304, 335, 335, 335, 335, 335, 68, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 319, 336, 336, 336, 336, + 336, 336, 336, 336, 63, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 67, 336, 270, 336, 336, 336, 336, 336, 336, + 336, 336, 304, 305, 336, 336, 336, 336, 336, 68, - 335, 335, 132, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 128, 335, 335, - 335, 335, 335, 335, 335, 335, 209, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 21, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 157, 335, 335, 335, - 334, 318, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 132, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 128, 336, 336, + 336, 336, 336, 336, 336, 336, 210, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 21, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 157, 336, 336, 336, + 336, 335, 319, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 106, 335, 335, 335, 335, 335, 335, - 335, 277, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 180, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 156, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 106, 336, 336, 336, 336, 336, + 336, 336, 278, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 180, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 156, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 105, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 32, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 33, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 65, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 130, 335, 334, 335, 335, - 335, 335, 335, 123, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 66, + 336, 336, 336, 105, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 32, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 33, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 65, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 130, 336, 336, 335, + 336, 336, 336, 336, 336, 123, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 242, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 181, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 54, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 66, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 243, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 181, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 54, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 260, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 58, 335, 59, 335, 335, 335, - 335, 335, 109, 335, 110, 335, 335, 335, 335, 107, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 7, 335, - 335, 334, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 261, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 58, 336, 59, 336, + 336, 336, 336, 336, 109, 336, 110, 336, 336, 336, + 336, 107, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 7, 336, 336, 336, 335, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 231, 335, 335, 335, 335, 159, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 243, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 45, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 55, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 201, 335, 200, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 232, 336, 336, 336, 336, 159, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 244, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 45, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 55, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 202, 336, 201, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 16, 17, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 69, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 208, 335, 335, 335, 335, 335, 335, 112, 335, 111, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 192, 335, 335, 335, 335, 335, 335, 335, 335, - 139, 335, 334, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 100, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 16, 17, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 69, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 209, 336, 336, 336, 336, 336, 336, + 112, 336, 111, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 193, 336, 336, 336, 336, 336, + 336, 336, 336, 139, 336, 336, 335, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 100, 336, 336, - 335, 335, 335, 89, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 221, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 93, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 62, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 195, - 196, 335, 335, 335, 271, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 89, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 222, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 93, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 62, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 196, 197, 336, 336, 336, 272, 336, - 335, 335, 335, 335, 335, 335, 335, 6, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 275, - 335, 335, 335, 335, 335, 335, 297, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 42, 335, 335, - 335, 335, 44, 335, 335, 335, 335, 335, 335, 335, - 335, 52, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 335, 188, 335, 335, 335, 134, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 213, 335, 189, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 6, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 276, 336, 336, 336, 336, 336, 336, + 298, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 42, 336, 336, 336, 336, 44, 336, 336, 336, + 336, 336, 336, 336, 336, 52, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 335, 336, 189, 336, 336, + 336, 134, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 228, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 53, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 136, 117, 335, 118, 335, - 335, 335, 116, 335, 335, 335, 335, 335, 335, 335, - 335, 154, 335, 335, 50, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 259, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 190, 335, 335, 335, 335, 335, 193, 335, 199, - 335, 335, 335, 335, 335, 227, 335, 335, 335, 335, + 336, 336, 214, 336, 190, 336, 336, 336, 229, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 53, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 136, 117, 336, 118, 336, 336, 336, 116, 336, 336, + 336, 336, 336, 336, 336, 336, 154, 336, 336, 50, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 260, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 191, 336, 336, 336, + 336, 336, 194, 336, 200, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 104, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 129, - 335, 335, 335, 335, 335, 335, 60, 335, 335, 335, - 26, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 20, 335, 335, 335, 335, 335, 335, 27, 36, 335, - 164, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 334, 335, 335, 335, 335, - 335, 335, 77, 79, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 279, 335, 335, + 228, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 104, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 129, 336, 336, 336, 336, 336, + 336, 60, 336, 336, 336, 26, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 20, 336, 336, 336, 336, + 336, 336, 27, 36, 336, 164, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 335, 336, 336, 336, 336, 336, 336, 77, 79, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 239, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 119, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 153, 335, 46, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 290, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 158, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 219, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 280, 336, 336, 336, 336, 240, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 119, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 153, 336, 46, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 291, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 158, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 220, 336, - 335, 335, 300, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 175, 335, 335, 335, 335, 335, - 335, 335, 335, 113, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 170, 335, 182, 335, 335, 335, 335, - 335, 334, 335, 142, 335, 335, 335, 335, 335, 99, - 335, 335, 335, 335, 211, 335, 335, 335, 335, 335, - 335, 229, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 251, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 135, + 336, 336, 336, 336, 336, 336, 336, 336, 301, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 175, 336, 336, 336, 336, 336, 336, 336, 336, 113, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 170, + 336, 182, 336, 336, 336, 336, 336, 336, 335, 336, + 142, 336, 336, 336, 336, 336, 99, 336, 336, 336, + 336, 212, 336, 336, 336, 336, 336, 336, 230, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 252, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 174, 335, 335, 335, 335, 335, - 335, 80, 335, 81, 335, 335, 335, 335, 335, 61, - 293, 335, 335, 335, 335, 335, 88, 183, 335, 202, - 335, 232, 335, 335, 194, 272, 335, 335, 335, 335, - 335, 73, 335, 185, 335, 335, 335, 335, 335, 9, - 335, 335, 335, 103, 335, 335, 335, 335, 264, 335, - 335, 335, 335, 210, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 135, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 174, 336, 336, 336, 336, 336, 336, 80, 336, + 81, 336, 336, 336, 336, 336, 61, 294, 336, 336, + 336, 336, 336, 88, 183, 336, 203, 336, 233, 336, + 336, 195, 273, 336, 336, 336, 336, 336, 73, 336, + 185, 336, 336, 336, 336, 336, 9, 336, 336, 336, + 103, 336, 336, 336, 336, 265, 336, 336, 336, 336, + 211, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 334, 335, 335, 335, 335, 173, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 160, 335, 278, 335, - 335, 335, 335, 335, 250, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 223, 335, 335, 307, - 335, 335, 335, 270, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 294, 335, 184, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 335, 336, + 336, 336, 336, 173, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 160, 336, 279, 336, 336, 336, + 336, 336, 251, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 224, 336, 336, 308, 336, 336, + 336, 271, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 72, 74, 335, 335, 335, 335, - 335, 335, 335, 102, 335, 335, 335, 335, 262, 335, - 335, 335, 335, 274, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 215, 34, 28, 30, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 35, 335, - 29, 31, 335, 335, 335, 335, 335, 335, 335, 335, - 98, 335, 335, 335, 335, 335, 335, 335, 334, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 217, 214, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 336, 336, 295, 336, 184, 336, 336, 336, 336, 336, + 336, 336, 72, 74, 336, 336, 336, 336, 336, 336, + 336, 102, 336, 336, 336, 336, 263, 336, 336, 336, + 336, 275, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 216, 34, 28, 30, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 35, 336, 29, 31, + 336, 336, 336, 336, 336, 336, 336, 336, 98, 336, + 336, 336, 336, 336, 336, 336, 336, 335, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 218, + 215, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 71, 335, 335, 335, 137, 335, 120, 335, 335, 335, - 335, 335, 335, 335, 335, 155, 47, 335, 335, 335, - 326, 13, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 288, 335, 291, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 12, 335, 335, 22, 335, - 335, 335, 268, 335, 335, 335, 335, 276, 335, 335, - 335, 75, 335, 225, 335, 335, 335, 335, 216, 335, - 335, 70, 335, 335, 335, 335, 23, 335, 43, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 169, 168, 335, 326, 335, 335, 335, 335, 335, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 71, + 336, 336, 336, 137, 336, 120, 336, 336, 336, 336, + 336, 336, 336, 336, 155, 47, 336, 336, 336, 327, + 13, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 289, 336, 292, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 12, 336, 336, 22, 336, 336, + 336, 269, 336, 336, 336, 336, 277, 336, 336, 336, + 75, 336, 226, 336, 336, 336, 336, 217, 336, 336, + 70, 336, 336, 336, 336, 23, 336, 43, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 335, 335, 335, 218, 212, 335, 230, 335, 335, - 280, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 82, 335, 335, 335, 335, 263, 335, - 335, 335, 335, 198, 335, 335, 335, 335, 224, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 298, 299, - 166, 335, 335, 76, 335, 335, 335, 335, 176, 335, - 335, 114, 115, 335, 335, 335, 335, 161, 335, 163, - 335, 203, 335, 335, 335, 335, 167, 335, 335, 335, + 169, 168, 336, 336, 327, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 219, 213, 336, 231, 336, 336, + 281, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 82, 336, 336, 336, 336, 264, 336, + 336, 336, 336, 199, 336, 336, 336, 336, 225, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 299, 300, + 166, 336, 336, 76, 336, 336, 336, 336, 176, 336, + 336, 114, 115, 336, 336, 336, 336, 161, 336, 163, - 233, 335, 335, 335, 335, 335, 335, 335, 144, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 241, 335, 335, 335, 335, 335, 335, 335, 335, - 24, 335, 273, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 86, 204, 335, - 335, 261, 335, 292, 335, 197, 335, 335, 335, 335, - 56, 335, 335, 335, 335, 4, 335, 335, 335, 335, - 127, 143, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 236, 37, 38, 335, 335, 335, 335, 335, 335, + 336, 204, 336, 336, 336, 336, 167, 336, 336, 336, + 336, 234, 336, 336, 336, 336, 336, 336, 336, 144, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 242, 336, 336, 336, 336, 336, 336, 336, + 336, 24, 336, 274, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 86, 205, + 336, 336, 262, 336, 293, 336, 198, 336, 336, 336, + 336, 56, 336, 336, 336, 336, 4, 336, 336, 336, + 336, 127, 143, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 335, 281, 335, 335, 335, 335, 335, 335, 335, 249, - 335, 335, 335, 335, 335, 335, 335, 335, 207, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 85, 335, 57, 267, 335, 237, 335, 335, 335, - 335, 11, 335, 335, 335, 335, 335, 335, 126, 335, - 335, 335, 335, 205, 90, 335, 40, 335, 335, 335, - 335, 335, 335, 335, 335, 172, 335, 335, 335, 335, - 335, 335, 146, 335, 335, 335, 335, 240, 335, 335, - 335, 335, 335, 248, 335, 335, 335, 335, 140, 335, - 335, 335, 121, 122, 335, 335, 335, 92, 96, 91, + 336, 336, 336, 237, 37, 38, 336, 336, 336, 336, + 336, 336, 336, 282, 336, 336, 336, 336, 336, 336, + 336, 250, 336, 336, 336, 336, 336, 336, 336, 336, + 208, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 85, 336, 57, 268, 336, 238, 336, + 336, 336, 336, 11, 336, 336, 336, 336, 336, 336, + 126, 336, 336, 336, 336, 206, 90, 336, 40, 336, + 336, 336, 336, 336, 336, 336, 336, 172, 336, 336, + 336, 336, 336, 336, 336, 146, 336, 336, 336, 336, + 241, 336, 336, 336, 336, 336, 249, 336, 336, 336, - 335, 335, 335, 335, 83, 335, 335, 335, 335, 335, - 10, 335, 335, 335, 265, 301, 335, 335, 335, 335, - 306, 39, 335, 335, 335, 335, 335, 171, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 97, 95, 335, 51, 335, 335, 84, 289, - 335, 335, 335, 335, 335, 335, 335, 191, 335, 335, - 335, 335, 335, 206, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 162, 78, 335, 335, 335, 335, 335, - 282, 335, 335, 335, 335, 335, 335, 335, 245, 335, + 336, 140, 336, 336, 336, 121, 122, 336, 336, 336, + 92, 96, 91, 336, 336, 336, 336, 83, 336, 336, + 336, 336, 336, 10, 336, 336, 336, 266, 302, 336, + 336, 336, 336, 307, 39, 336, 336, 336, 336, 336, + 171, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 97, 95, 336, 51, + 336, 336, 84, 290, 336, 336, 336, 336, 336, 336, + 336, 192, 336, 336, 336, 336, 336, 207, 336, 336, + 336, 336, 336, 336, 336, 188, 336, 336, 162, 78, - 335, 244, 141, 308, 335, 94, 48, 335, 147, 148, - 151, 152, 149, 150, 87, 335, 266, 335, 335, 335, - 335, 165, 335, 335, 335, 335, 187, 335, 235, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 178, 177, 41, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 101, 335, 234, 335, 258, - 286, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 49, 5, 335, 335, 226, 335, 335, + 336, 336, 336, 336, 336, 283, 336, 336, 336, 336, + 336, 336, 336, 246, 336, 336, 245, 141, 309, 336, + 94, 48, 336, 147, 148, 151, 152, 149, 150, 87, + 336, 267, 336, 336, 336, 336, 165, 336, 336, 336, + 336, 187, 336, 236, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 178, 177, 41, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 101, 336, 235, 336, 259, 287, 336, 336, 336, 336, - 287, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 246, 25, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 247, 335, 335, 335, 145, 335, - 335, 335, 335, 335, 335, 335, 335, 179, 335, 186, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 283, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, - 335, 335, 335, 335, 335, 335, 335, 305, 335, 335, - 254, 335, 335, 335, 335, 335, 284, 335, 335, 335, - 335, 335, 335, 285, 335, 335, 335, 252, 335, 255, - 256, 335, 335, 335, 335, 335, 253, 257, 0 + 336, 336, 336, 336, 336, 336, 336, 336, 49, 5, + 336, 336, 227, 336, 336, 288, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 247, 25, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 248, + 336, 336, 336, 145, 336, 336, 336, 336, 336, 336, + 336, 336, 179, 336, 186, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 284, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 306, 336, 336, 255, 336, 336, 336, 336, + 336, 285, 336, 336, 336, 336, 336, 336, 286, 336, + 336, 336, 253, 336, 256, 257, 336, 336, 336, 336, + 336, 254, 258, 0 } ; static const YY_CHAR yy_ec[256] = @@ -770,17 +772,17 @@ static const YY_CHAR yy_meta[41] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; -static const flex_int16_t yy_base[3318] = +static const flex_int16_t yy_base[3333] = { 0, 0, 0, 38, 41, 44, 46, 59, 65, 71, 77, - 90, 112, 96, 118, 124, 136, 3276, 3137, 81, 6447, - 6447, 6447, 129, 52, 130, 63, 131, 152, 70, 140, + 90, 112, 96, 118, 124, 136, 3501, 3446, 81, 6475, + 6475, 6475, 129, 52, 130, 63, 131, 152, 70, 140, 149, 156, 57, 88, 76, 173, 175, 95, 184, 145, - 185, 205, 194, 204, 178, 123, 2962, 6447, 6447, 6447, - 107, 2759, 6447, 6447, 6447, 154, 2674, 2563, 6447, 6447, - 6447, 226, 2504, 6447, 6447, 6447, 163, 2331, 6447, 238, - 6447, 242, 148, 1978, 1862, 6447, 6447, 6447, 246, 1688, - 6447, 6447, 6447, 250, 1273, 254, 219, 0, 258, 0, + 185, 205, 194, 204, 178, 123, 3377, 6475, 6475, 6475, + 107, 3198, 6475, 6475, 6475, 154, 3006, 2683, 6475, 6475, + 6475, 226, 2556, 6475, 6475, 6475, 163, 2418, 6475, 238, + 6475, 242, 148, 2195, 2165, 6475, 6475, 6475, 246, 1973, + 6475, 6475, 6475, 250, 1850, 254, 219, 0, 258, 0, 0, 165, 250, 191, 215, 243, 252, 256, 92, 260, 261, 262, 264, 265, 266, 273, 270, 277, 278, 281, @@ -788,9 +790,9 @@ static const flex_int16_t yy_base[3318] = 313, 314, 307, 323, 317, 312, 328, 326, 330, 334, 337, 340, 342, 343, 344, 346, 349, 354, 348, 356, 364, 357, 361, 359, 372, 376, 365, 360, 377, 380, - 384, 385, 387, 388, 391, 399, 389, 1153, 411, 1093, - 415, 953, 422, 901, 689, 426, 406, 430, 434, 0, - 411, 280, 438, 233, 181, 442, 430, 442, 419, 438, + 384, 385, 387, 388, 391, 399, 389, 1688, 411, 1273, + 415, 1153, 422, 1105, 953, 426, 889, 430, 434, 0, + 411, 689, 438, 418, 280, 442, 430, 442, 419, 438, 439, 441, 440, 443, 444, 445, 446, 449, 463, 455, 456, 467, 471, 472, 469, 476, 474, 460, 482, 488, @@ -810,9 +812,9 @@ static const flex_int16_t yy_base[3318] = 745, 743, 747, 749, 750, 766, 754, 739, 759, 767, 758, 760, 768, 774, 793, 779, 781, 789, 790, 791, 795, 797, 805, 807, 796, 809, 803, 810, 812, 813, - 822, 818, 6447, 817, 820, 833, 826, 834, 835, 836, + 822, 818, 6475, 817, 820, 833, 826, 834, 835, 836, 841, 842, 823, 849, 847, 848, 852, 874, 856, 858, - 854, 863, 866, 6447, 864, 868, 898, 870, 872, 892, + 854, 863, 866, 6475, 864, 868, 898, 870, 872, 892, 896, 884, 887, 888, 899, 904, 921, 894, 907, 911, 922, 919, 918, 928, 929, 930, 931, 939, 936, 932, @@ -822,21 +824,21 @@ static const flex_int16_t yy_base[3318] = 1010, 1014, 1017, 1019, 1011, 1021, 1012, 1027, 1023, 1029, 1032, 1040, 1035, 1036, 1037, 1038, 1041, 1044, 1047, 1048, 1049, 1050, 1052, 1056, 1054, 1063, 1065, 1057, 1071, 1061, - 6447, 1073, 1069, 1076, 1077, 1075, 1079, 6447, 1080, 1081, + 6475, 1073, 1069, 1076, 1077, 1075, 1079, 6475, 1080, 1081, 1082, 1087, 1094, 1096, 1103, 1104, 1092, 1107, 1108, 1110, 1112, 1119, 1114, 1117, 1122, 1121, 1123, 1125, 1129, 1085, - 1126, 1130, 1132, 1133, 1136, 1138, 1156, 6447, 1139, 1143, + 1126, 1130, 1132, 1133, 1136, 1138, 1156, 6475, 1139, 1143, 1142, 1141, 1152, 1144, 1169, 1165, 1161, 1167, 1154, 1179, 1171, 1185, 1177, 1181, 1189, 1191, 1192, 1194, 1195, 1196, - 1198, 1197, 1199, 1203, 1202, 1205, 1208, 6447, 1206, 1218, + 1198, 1197, 1199, 1203, 1202, 1205, 1208, 6475, 1206, 1218, 1223, 1230, 1213, 1226, 1210, 1228, 1231, 1232, 1233, 1234, 985, 1235, 1236, 1239, 1249, 1240, 1251, 1248, 1253, 1254, 1255, 1257, 1258, 1263, 1264, 1275, 1265, 1267, 1277, 1287, 1284, 1286, 1294, 1296, 1271, 1289, 1297, 1293, 1291, 1299, 1302, 1303, 1304, 1306, 1309, 1317, 1312, 1314, 1315, 1319, 1321, 1323, 1318, 1324, 1326, 1328, 1336, 1335, 1331, 1341, - 1337, 1346, 1343, 1334, 1351, 1354, 1357, 1358, 6447, 1366, + 1337, 1346, 1343, 1334, 1351, 1354, 1357, 1358, 6475, 1366, 1363, 1362, 1364, 1369, 1367, 1375, 1376, 1377, 1378, 1381, 1379, 1382, 1387, 1388, 1389, 1383, 1391, 1393, 1404, 1401, @@ -850,665 +852,669 @@ static const flex_int16_t yy_base[3318] = 1543, 1552, 1553, 1555, 1549, 1562, 1563, 1564, 1565, 1568, 1576, 1566, 1579, 1573, 1575, 1581, 1583, 1585, 1584, 1587, - 1591, 1594, 1596, 1588, 6447, 1595, 1608, 1603, 1606, 1604, - 1607, 1609, 1617, 1612, 1615, 1613, 1618, 1619, 1644, 6447, - 1621, 6447, 6447, 315, 6447, 6447, 1624, 1628, 6447, 1629, + 1591, 1594, 1596, 1588, 6475, 1595, 1608, 1603, 1606, 1604, + 1607, 1609, 1617, 1612, 1615, 1613, 1618, 1619, 1644, 6475, + 1621, 6475, 6475, 315, 6475, 6475, 1624, 1628, 6475, 1629, 1638, 1625, 1626, 1650, 1654, 1637, 1640, 1645, 1642, 1667, 1668, 1652, 1660, 1665, 1673, 1671, 1674, 1679, 1682, 1676, 1685, 1689, 1699, 1690, 1702, 1696, 1700, 1706, 1704, 1712, 1708, 1717, 1718, 1714, 1719, 1721, 1722, 1724, 1723, 1727, 1729, 1732, 1733, 1730, 1735, 1736, 1745, 1749, 1741, 1756, - 6447, 1752, 1759, 1766, 1762, 1769, 1761, 1765, 1768, 1773, + 6475, 1752, 1759, 1766, 1762, 1769, 1761, 1765, 1768, 1773, 1775, 1770, 1777, 1779, 1780, 1781, 1783, 1785, 1788, 1790, - 1792, 1791, 6447, 1793, 1797, 1798, 1799, 1803, 1805, 1809, + 1792, 1791, 6475, 1793, 1797, 1798, 1799, 1803, 1805, 1809, 1737, 1801, 1807, 1811, 1819, 1820, 1815, 1817, 1823, 1825, - 1828, 6447, 1827, 1834, 1835, 1837, 1838, 1840, 1841, 1843, + 1828, 6475, 1827, 1834, 1835, 1837, 1838, 1840, 1841, 1843, 1844, 1845, 1846, 1847, 1848, 1852, 1863, 1853, 1855, 1858, 1868, 1870, 1872, 1873, 1875, 1879, 1880, 1881, 1883, 1884, 1885, 1887, 1888, 1896, 1898, 1895, 1900, 1893, 1903, 1911, 1910, 1902, 1912, 1915, 1916, 1917, 1925, 1923, 1922, 1928, 1933, 1929, 1931, 1934, 1938, 1935, 1945, 1942, 1946, 1947, - 1936, 1953, 1954, 1955, 6447, 1956, 1961, 6447, 1963, 1962, + 1936, 1954, 1955, 1956, 6475, 1959, 1962, 6475, 1964, 1961, - 1960, 1983, 1964, 1966, 1969, 1968, 1971, 1985, 1972, 1977, - 1990, 1979, 2003, 1998, 2000, 2001, 2006, 2008, 2010, 2011, - 2012, 2009, 2015, 2018, 2019, 2028, 2037, 2038, 2035, 2041, - 2045, 2020, 2024, 2040, 2059, 2044, 2046, 2047, 2050, 2048, - 2052, 2055, 2054, 2053, 2064, 2066, 2075, 2071, 2074, 2070, - 2077, 2080, 2090, 2087, 2081, 6447, 2100, 2092, 2084, 2097, - 2096, 2105, 2106, 2104, 6447, 2107, 2108, 2110, 2118, 2113, - 2114, 2115, 2119, 2121, 2124, 2125, 2127, 2129, 2128, 2130, - 2146, 6447, 2132, 6447, 2131, 2141, 2143, 2142, 2149, 2150, - 2152, 2153, 6447, 6447, 2154, 2151, 2163, 2172, 2155, 6447, + 1963, 1985, 1965, 1967, 1972, 1969, 1970, 1978, 1989, 1979, + 1986, 1997, 2008, 2000, 1998, 1999, 2005, 2013, 1980, 2014, + 2010, 2016, 2017, 2021, 2023, 2022, 2032, 2039, 2035, 2041, + 2044, 2025, 2040, 2042, 2061, 2043, 2045, 2049, 2046, 2051, + 2048, 2056, 2054, 2057, 2065, 2066, 2077, 2073, 2074, 2070, + 2079, 2072, 2092, 2085, 2083, 6475, 2099, 2094, 2096, 2100, + 2098, 2107, 2104, 2102, 6475, 2108, 2110, 2106, 2118, 2114, + 2113, 2120, 2116, 2124, 2126, 2127, 2128, 2131, 2129, 2130, + 2148, 6475, 2133, 6475, 2141, 2134, 2143, 2144, 2145, 2150, + 2151, 2152, 6475, 6475, 2159, 2160, 2166, 2174, 2170, 6475, - 2169, 2176, 6447, 2173, 2178, 2179, 2171, 2180, 2182, 2184, - 2183, 2192, 2187, 2194, 2189, 2190, 2199, 6447, 2202, 2201, - 2203, 2206, 2209, 2210, 2212, 2214, 6447, 2218, 2216, 2221, - 2229, 2220, 2228, 2230, 2231, 2235, 2233, 2238, 2239, 2240, - 2241, 2250, 2252, 2242, 2253, 2255, 2262, 6447, 2245, 2249, - 2267, 2265, 2272, 2264, 2266, 2268, 2274, 2276, 2277, 2278, - 2281, 2282, 2283, 2290, 2291, 2288, 2287, 2296, 2297, 2298, - 2301, 2304, 2305, 2306, 2307, 2308, 6447, 2309, 2311, 2314, - 2317, 171, 2318, 2320, 2322, 2324, 2321, 2339, 2325, 2342, - 2346, 2327, 2344, 2348, 2347, 2341, 2351, 2353, 2354, 2356, + 2161, 2179, 6475, 2171, 2181, 2176, 2180, 2182, 2185, 2186, + 2187, 2194, 2189, 2197, 2192, 2196, 2204, 6475, 2205, 2193, + 2206, 2210, 2212, 2216, 2217, 2213, 6475, 2220, 2219, 2223, + 2230, 2232, 2227, 2233, 2234, 2238, 2240, 2241, 2242, 2243, + 2244, 2253, 2254, 2245, 2256, 2259, 2255, 6475, 2252, 2263, + 2271, 2267, 2269, 2266, 2273, 2274, 2276, 2277, 2278, 2279, + 2284, 2285, 2286, 2293, 2294, 2289, 2291, 2299, 2300, 2301, + 2306, 2307, 2308, 2311, 2309, 2310, 6475, 2312, 2314, 2316, + 2317, 2323, 221, 2324, 2325, 2327, 2329, 2332, 2337, 2330, + 2348, 2351, 2333, 2347, 2344, 2353, 2354, 2355, 2356, 2357, - 2357, 2359, 2360, 6447, 2362, 2363, 2366, 2367, 2370, 2368, - 2373, 6447, 2381, 2371, 2386, 2394, 2383, 2395, 2396, 2397, - 2380, 2401, 2400, 2402, 2403, 2406, 2404, 2408, 2407, 6447, - 2413, 2417, 2420, 2414, 2423, 2427, 2424, 2429, 2430, 2432, - 2435, 2437, 2436, 2438, 2439, 2440, 2441, 2442, 2449, 2446, - 2453, 2454, 2455, 2456, 2457, 2460, 2462, 2465, 2468, 6447, - 2477, 2467, 2472, 2476, 2474, 2481, 2478, 2489, 2491, 2492, - 2493, 2495, 2498, 2512, 2496, 2505, 2506, 2502, 2510, 2518, - 2522, 2519, 2523, 2529, 2526, 2532, 2534, 2536, 2540, 2541, - 2542, 2538, 2545, 2546, 2554, 2555, 2552, 2561, 2560, 2566, + 2359, 2360, 2362, 2363, 6475, 2365, 2366, 2370, 2371, 2373, + 2374, 2376, 6475, 2383, 2384, 2391, 2398, 2393, 2375, 2399, + 2401, 2403, 2404, 2405, 2406, 2407, 2409, 2408, 2412, 2411, + 6475, 2416, 2424, 2426, 2417, 2427, 2434, 2433, 2428, 2435, + 2436, 2439, 2441, 2440, 2445, 2444, 2446, 2448, 2452, 2449, + 2453, 2454, 2459, 2460, 2461, 2465, 2462, 2469, 2470, 2471, + 6475, 2478, 2482, 2476, 2479, 2483, 2484, 2488, 2486, 2502, + 2489, 2492, 2499, 2504, 2513, 2507, 2510, 2515, 2516, 2523, + 2524, 2531, 2529, 2530, 2537, 2527, 2539, 2541, 2542, 2543, + 2545, 2547, 2550, 2549, 2551, 2558, 2559, 2560, 2564, 2557, - 2573, 2568, 6447, 2577, 2572, 2575, 2544, 2589, 2582, 2563, - 2590, 2584, 2592, 2586, 2594, 2596, 2603, 2599, 2604, 2602, - 2606, 2607, 2608, 2609, 2614, 2615, 2619, 2622, 2624, 2626, - 6447, 2629, 2625, 2631, 2633, 2635, 2636, 2641, 2643, 2646, - 2638, 2645, 2648, 2649, 2652, 2653, 2657, 2654, 2658, 2661, - 6447, 2664, 2665, 2670, 2668, 2671, 2677, 2678, 2681, 2687, - 2684, 2672, 2691, 2692, 2693, 6447, 2700, 2701, 2698, 2702, - 2704, 2705, 2707, 2709, 2710, 6447, 2711, 2712, 2714, 2715, - 2722, 2723, 2719, 6447, 2726, 2721, 2728, 2731, 2732, 2733, - 2736, 2739, 2737, 2742, 2743, 2745, 2753, 2746, 2755, 6447, + 2578, 2583, 2574, 6475, 2572, 2582, 2570, 2584, 2592, 2587, + 2589, 2590, 2594, 2598, 2599, 2600, 2601, 2609, 2604, 2602, + 2606, 2612, 2613, 2614, 2616, 2621, 2624, 2626, 2622, 2631, + 2633, 6475, 2636, 2638, 2628, 2632, 2645, 2640, 2649, 2650, + 2652, 2642, 2653, 2655, 2656, 2658, 2659, 2662, 2664, 2666, + 2665, 6475, 2669, 2670, 2675, 2677, 2681, 2682, 2684, 2687, + 2693, 2695, 2678, 2697, 2698, 2688, 6475, 2708, 2710, 2706, + 2713, 2709, 2712, 2714, 2716, 2699, 6475, 2717, 171, 2721, + 2720, 2722, 2729, 2730, 2726, 6475, 2733, 2728, 2734, 2737, + 2738, 2739, 2741, 2743, 2746, 2747, 2749, 2751, 2761, 2752, - 2749, 2764, 2756, 2762, 2765, 2766, 2770, 2772, 2776, 2777, - 2789, 2778, 6447, 2788, 2775, 2783, 2799, 2795, 2796, 2797, - 2800, 2801, 2802, 2803, 2804, 2807, 6447, 2810, 2808, 2811, - 2812, 2817, 2816, 2818, 2825, 2828, 2830, 2831, 2832, 2833, - 2835, 2836, 2839, 2838, 2842, 2844, 2850, 2852, 2855, 2856, - 2857, 2865, 2868, 2861, 2870, 2866, 2863, 2871, 2873, 2880, - 2883, 2887, 2884, 2888, 6447, 2891, 2882, 2893, 2894, 2895, - 2896, 2898, 2897, 2899, 2901, 2903, 2909, 2905, 2906, 2923, - 2930, 2908, 2915, 2918, 2920, 2926, 2927, 2931, 2933, 2934, - 2942, 2938, 2940, 2947, 2944, 2945, 2954, 2946, 2949, 2955, + 2758, 6475, 2755, 2770, 2762, 2768, 2765, 2771, 2776, 2778, + 2779, 2781, 2786, 2783, 6475, 2795, 2794, 2792, 2805, 2782, + 2800, 2802, 2806, 2807, 2809, 2808, 2810, 2813, 6475, 2816, + 2814, 2817, 2818, 2821, 2822, 2823, 2837, 2824, 2829, 2838, + 2834, 2839, 2841, 2845, 2844, 2853, 2843, 2846, 2856, 2847, + 2859, 2863, 2864, 2872, 2873, 2870, 2875, 2871, 2495, 2869, + 2876, 2885, 2886, 2888, 2891, 2893, 6475, 2896, 2897, 2878, + 2889, 2898, 2899, 2900, 2902, 2903, 2905, 2906, 2911, 2908, + 2912, 2924, 2927, 2917, 2919, 2928, 2929, 2930, 2933, 2932, + 2934, 2935, 2942, 2940, 2941, 2949, 2944, 2946, 2956, 2955, - 2956, 2957, 2958, 2961, 2959, 2964, 2969, 2973, 2978, 2980, - 2982, 2970, 2984, 2987, 2988, 6447, 2991, 2992, 2989, 2995, - 2996, 2999, 3001, 3008, 3003, 3010, 3011, 3013, 3020, 3005, - 3014, 3019, 3027, 3029, 6447, 3022, 6447, 3026, 3030, 3033, - 3037, 3036, 6447, 3042, 6447, 3043, 3045, 3038, 3048, 6447, - 3049, 3050, 3051, 3057, 3053, 3055, 3059, 3061, 3063, 3071, - 3065, 3062, 3067, 3069, 3083, 3073, 3075, 3081, 3085, 3089, - 3091, 3079, 3096, 3090, 3092, 3098, 3101, 3104, 6447, 3106, - 3108, 3107, 3110, 3111, 3113, 3115, 3114, 3116, 3119, 3118, - 3122, 3127, 3131, 3130, 3134, 3141, 3144, 3151, 3136, 3152, + 2957, 2958, 2959, 2961, 2960, 2964, 2965, 2968, 2970, 2973, + 2984, 2980, 2986, 2987, 2988, 2989, 2992, 6475, 2991, 2996, + 2993, 2995, 3003, 3005, 3007, 3016, 2999, 3013, 3017, 3020, + 3021, 3018, 3023, 3027, 3034, 3030, 6475, 3031, 6475, 3032, + 3035, 3036, 3039, 3042, 6475, 3044, 6475, 3045, 3051, 3052, + 3054, 6475, 3055, 3046, 3056, 3059, 3057, 3061, 3064, 3069, + 3063, 3075, 3071, 3067, 3073, 3078, 3086, 3079, 3081, 3084, + 3090, 3092, 3094, 3095, 3096, 3100, 3101, 3102, 3104, 3108, + 6475, 3110, 3107, 3111, 3114, 3117, 3118, 3119, 3126, 3121, + 3124, 3128, 3127, 3129, 3137, 3134, 3145, 3131, 3142, 3148, - 6447, 3147, 3158, 3148, 3153, 6447, 3150, 3160, 3162, 3164, - 3166, 3168, 3170, 3169, 3173, 3171, 3175, 3176, 3188, 3183, - 3190, 3178, 6447, 3192, 3193, 3179, 3199, 3208, 3209, 3211, - 3210, 3212, 3216, 3220, 3218, 3219, 3182, 3221, 3222, 3224, - 3231, 3234, 3230, 3239, 3226, 3236, 3238, 3243, 3229, 3244, - 3245, 3246, 3252, 3253, 3250, 3251, 3254, 3255, 3256, 6447, - 3259, 3261, 3269, 3278, 3263, 3270, 3274, 3277, 3279, 6447, - 3281, 3284, 3285, 3287, 3288, 3292, 3295, 3293, 3296, 3297, - 3298, 3301, 3303, 3302, 6447, 3305, 6447, 3310, 3316, 3322, - 3324, 3326, 3311, 3327, 3332, 3328, 3333, 3334, 3337, 3336, + 3158, 3141, 3160, 6475, 3155, 3157, 3159, 3162, 6475, 3165, + 3163, 3166, 3171, 3174, 3164, 3175, 3173, 3179, 3177, 3181, + 3183, 3186, 3191, 3194, 3197, 6475, 3196, 3201, 3184, 3207, + 3212, 3208, 3219, 3215, 3217, 3221, 3229, 3225, 3214, 3224, + 3226, 3228, 3231, 3238, 3239, 3235, 3243, 3236, 3241, 3250, + 3247, 3244, 3251, 3253, 3254, 3255, 3256, 3257, 3258, 3260, + 3261, 3265, 6475, 3266, 3267, 3272, 3280, 3276, 3277, 3281, + 3286, 3282, 6475, 3288, 3289, 3290, 3292, 3297, 3291, 3294, + 3299, 3302, 3305, 3307, 2962, 3312, 3310, 6475, 3313, 6475, + 3311, 3315, 3317, 3330, 3319, 3325, 3332, 3338, 3327, 3334, - 3340, 3344, 3343, 3345, 3349, 3365, 3347, 3348, 3350, 3351, - 3360, 3361, 3364, 6447, 6447, 3366, 3367, 3370, 3372, 3373, - 3375, 3378, 3383, 3381, 3384, 3387, 3389, 3400, 6447, 3390, - 3396, 3397, 3398, 3412, 3405, 3410, 3420, 3413, 3421, 3416, - 6447, 3417, 3424, 3431, 3426, 3427, 3434, 6447, 3432, 6447, - 3429, 3433, 3435, 3441, 3442, 3444, 3445, 3446, 3454, 3462, - 3464, 3461, 3466, 3447, 3451, 3449, 3463, 3477, 3470, 3472, - 3473, 6447, 3479, 3480, 3481, 3482, 3484, 3490, 3493, 3483, - 6447, 3494, 3486, 3496, 3505, 3497, 3501, 3499, 3508, 3509, - 3510, 3512, 3514, 6447, 3515, 3519, 3527, 3520, 3522, 3525, + 3339, 3341, 3342, 3347, 3345, 3348, 3350, 3349, 3357, 3356, + 3352, 3360, 3364, 3365, 3368, 3366, 6475, 6475, 3369, 3370, + 3374, 3371, 3376, 3381, 3389, 3383, 3391, 3380, 3393, 3397, + 3406, 6475, 3399, 3401, 3402, 3403, 3417, 3407, 3410, 3418, + 3421, 3428, 3423, 6475, 3419, 3420, 3433, 3430, 3432, 3437, + 6475, 3436, 6475, 3438, 3440, 3442, 3445, 3447, 3448, 3449, + 3451, 3453, 3462, 3464, 3455, 3467, 3469, 3470, 3471, 3472, + 3479, 3475, 3476, 3477, 6475, 3481, 3478, 3482, 3491, 3494, + 3500, 3484, 3483, 6475, 3501, 3504, 3502, 3503, 3509, 3511, + 3512, 3513, 3516, 3517, 3519, 3521, 3522, 6475, 3520, 3523, - 3529, 3530, 3536, 6447, 3537, 3538, 3549, 3545, 3541, 3546, - 3551, 3550, 3552, 3555, 3557, 3556, 3558, 3559, 3560, 3562, - 3564, 3567, 3565, 3566, 3579, 3580, 3582, 3592, 3583, 6447, - 3587, 3588, 3591, 3590, 3594, 3597, 3598, 3601, 3603, 3605, - 3615, 3616, 3609, 3612, 3619, 3620, 3627, 3623, 6447, 3628, - 3629, 3637, 3632, 3635, 3640, 3634, 3636, 3643, 3644, 3645, - 3646, 3648, 3650, 3658, 3656, 3653, 3660, 3661, 3671, 3662, - 6447, 3680, 3663, 3672, 3683, 3684, 3676, 3692, 3688, 3689, - 3690, 3694, 3696, 3698, 3700, 3701, 3702, 3705, 3706, 6447, - 6447, 3708, 3710, 3712, 6447, 3715, 3713, 3725, 3717, 3718, + 3535, 3525, 3527, 3536, 3541, 3544, 3549, 6475, 3546, 3550, + 3558, 3554, 3555, 3560, 3561, 3556, 3557, 3563, 3565, 3566, + 3568, 3569, 3570, 3572, 3575, 3577, 3574, 3584, 3585, 3588, + 3592, 3601, 3593, 6475, 3597, 3598, 3604, 3602, 3605, 3609, + 3610, 3613, 3627, 3608, 3630, 3631, 3600, 3615, 3634, 3635, + 3643, 3638, 6475, 3646, 3606, 3648, 3619, 3647, 3652, 3645, + 3649, 3656, 3653, 3657, 3658, 3659, 3661, 3670, 3662, 3667, + 3671, 3672, 3679, 3677, 6475, 3686, 3669, 3684, 3688, 3682, + 3691, 3700, 3695, 3696, 3698, 3702, 3703, 3707, 3705, 3709, + 3710, 3713, 3714, 6475, 6475, 3718, 3715, 3721, 6475, 3723, - 3714, 3730, 3727, 3728, 3731, 3733, 3740, 6447, 3738, 3747, - 3742, 3744, 3752, 3755, 3758, 3745, 3760, 3748, 3753, 3761, - 3664, 3763, 3764, 3765, 3776, 3777, 3767, 3774, 3775, 6447, - 3778, 3780, 3783, 3785, 3782, 3791, 6447, 3786, 3792, 3793, - 3794, 3808, 3800, 3809, 3811, 3797, 3812, 3813, 3814, 3815, - 3816, 3823, 3822, 3824, 3828, 3830, 3834, 6447, 3833, 3839, - 3821, 3844, 6447, 3846, 3853, 3854, 3857, 3840, 3856, 3858, - 3865, 6447, 3860, 3863, 3862, 3864, 3875, 3849, 3879, 3868, - 3876, 3878, 6447, 3880, 3877, 3883, 6447, 3882, 3893, 3898, - 3900, 3884, 3901, 3902, 3886, 3903, 3905, 6447, 3906, 6447, + 3720, 3728, 3727, 3724, 3733, 3735, 3737, 3736, 3738, 3743, + 3744, 6475, 3747, 3755, 3750, 3751, 3759, 3763, 3765, 3756, + 3766, 3754, 3767, 3768, 3773, 3771, 3772, 3777, 3785, 3787, + 3782, 3784, 3788, 6475, 3783, 3790, 3791, 3794, 3795, 3800, + 6475, 3797, 3801, 3804, 3809, 3807, 3813, 3811, 3820, 3821, + 3823, 3824, 3825, 3826, 3828, 3835, 3832, 3831, 3834, 3838, + 3840, 6475, 3841, 3845, 3849, 3852, 6475, 3854, 3863, 3864, + 3865, 3855, 3866, 3860, 3873, 6475, 3868, 3870, 3875, 3876, + 3883, 3878, 3885, 3884, 3882, 3886, 3892, 6475, 3893, 3888, + 3889, 6475, 3895, 3896, 3909, 3911, 3899, 3912, 3914, 3913, - 3907, 3912, 3915, 6447, 3913, 3917, 3918, 3920, 3921, 3922, - 3926, 3932, 3934, 3928, 3936, 3937, 3938, 3939, 3941, 3950, - 3940, 3942, 3947, 3949, 6447, 3952, 3954, 3959, 3960, 3966, - 3962, 3969, 3956, 3970, 3973, 6447, 6447, 3979, 6447, 3980, - 3974, 3976, 6447, 3982, 3984, 3991, 3987, 3988, 3993, 4000, - 3994, 6447, 4006, 4007, 6447, 3996, 4003, 4016, 4011, 4001, - 4012, 4013, 4015, 4017, 4021, 4022, 4020, 4025, 4026, 4027, - 4030, 6447, 4028, 4031, 4029, 4040, 4043, 4044, 4047, 4046, - 4045, 6447, 4053, 4055, 4056, 4062, 4059, 6447, 4060, 6447, - 4063, 4068, 4070, 4071, 4072, 6447, 4076, 4075, 4080, 4083, + 3915, 3916, 6475, 3917, 6475, 3923, 3924, 3927, 6475, 3929, + 3930, 3932, 3934, 3931, 3938, 3939, 3945, 3947, 3935, 3949, + 3950, 3951, 3952, 3954, 3963, 3953, 3960, 3961, 3962, 6475, + 3965, 3964, 3972, 3973, 3983, 3978, 3980, 3967, 3985, 3986, + 6475, 6475, 3994, 6475, 3995, 3975, 3989, 6475, 3996, 4000, + 4003, 4001, 4006, 4002, 4009, 4012, 6475, 4016, 4021, 6475, + 4010, 4013, 4023, 4024, 4025, 4026, 4027, 4029, 4030, 4032, + 4036, 4034, 4040, 4035, 4039, 4037, 6475, 4042, 4041, 4045, + 4059, 4050, 4053, 4060, 4065, 4055, 6475, 4066, 4067, 4072, + 4074, 4076, 6475, 4077, 6475, 4078, 4080, 4081, 4082, 4085, - 4085, 4084, 4087, 4088, 4094, 4095, 4102, 4098, 4097, 4099, - 6447, 4100, 4104, 4106, 4113, 4101, 4108, 4117, 4120, 4121, - 4122, 4126, 4130, 4124, 4131, 4137, 4135, 4141, 4127, 6447, - 4139, 4147, 4133, 4156, 4143, 4153, 6447, 4157, 4158, 4159, - 6447, 4160, 4161, 4162, 4167, 4168, 4170, 4174, 4175, 4172, - 6447, 4179, 4180, 4176, 4177, 4178, 4184, 6447, 6447, 4194, - 6447, 4195, 4185, 4197, 4198, 4199, 4202, 4204, 4205, 4207, - 4209, 4215, 4217, 4210, 4218, 4220, 4227, 4231, 4235, 4230, - 4232, 4234, 6447, 6447, 4239, 4243, 4236, 4247, 4248, 4241, - 4250, 4257, 4255, 4261, 4264, 4265, 4272, 6447, 4252, 4259, + 6475, 4092, 4087, 4098, 4088, 4095, 4103, 4102, 4106, 4091, + 4099, 4116, 4108, 4112, 4115, 6475, 4117, 4118, 4121, 4126, + 4122, 4124, 4134, 4130, 4129, 4133, 4138, 4140, 4141, 4142, + 4147, 4149, 4145, 4152, 6475, 4155, 4157, 4156, 4166, 4162, + 4161, 6475, 4163, 4169, 4176, 6475, 4172, 4168, 4178, 4180, + 4182, 4183, 4186, 4184, 4189, 6475, 4191, 4193, 4190, 4192, + 4194, 4206, 6475, 6475, 4207, 6475, 4208, 4195, 4196, 4209, + 4212, 4216, 4220, 4221, 4223, 4217, 4224, 4229, 4231, 4232, + 4239, 4235, 4246, 4247, 4248, 4249, 4250, 4243, 6475, 6475, + 4254, 4255, 4259, 4261, 4264, 4262, 4266, 4273, 4271, 4277, - 4267, 4273, 6447, 4274, 4275, 4277, 4276, 4278, 4284, 4281, - 4285, 4282, 4286, 4289, 4290, 4292, 4296, 4295, 4303, 4304, - 4298, 4306, 4309, 4312, 4314, 6447, 4315, 4318, 4319, 4320, - 4324, 4325, 4326, 4327, 4328, 6447, 4331, 6447, 4329, 4336, - 4334, 4333, 4352, 4353, 4354, 4332, 4341, 4356, 4359, 4362, - 4363, 4367, 4364, 4368, 4370, 4373, 4375, 4377, 4378, 6447, - 4384, 4372, 4380, 4386, 4388, 4391, 4393, 4395, 4396, 4402, - 4403, 4399, 4406, 4408, 4397, 4410, 4409, 4413, 6447, 4415, - 4417, 4421, 4425, 4426, 4422, 4427, 4433, 4436, 4429, 4431, - 4437, 4439, 6447, 4441, 4442, 4443, 4447, 4453, 4445, 4450, + 4280, 4282, 4275, 6475, 4285, 4272, 4286, 4283, 6475, 4288, + 4291, 4293, 4294, 4295, 4297, 4298, 4299, 4301, 4302, 4305, + 4307, 4308, 4312, 4310, 4318, 4320, 4321, 4322, 4326, 4328, + 4330, 6475, 4333, 4331, 4334, 4335, 4337, 4338, 4342, 4343, + 4344, 6475, 4345, 6475, 4349, 4352, 4348, 4367, 4371, 4351, + 4372, 4364, 4359, 4368, 4378, 4383, 4374, 4385, 4380, 4386, + 4387, 4389, 4391, 4393, 4397, 6475, 4400, 4394, 4396, 4403, + 4407, 4409, 4404, 4411, 4412, 4418, 4413, 4419, 4421, 4426, + 4422, 4429, 4427, 4431, 6475, 4432, 4434, 4435, 4440, 4442, + 4443, 4444, 4445, 4452, 4448, 4453, 4455, 4457, 6475, 4458, - 4454, 4457, 6447, 4460, 4462, 4463, 4466, 4467, 4468, 4471, - 4473, 4475, 4476, 4487, 6447, 4477, 4483, 4491, 4479, 4481, - 4492, 4493, 4495, 6447, 4501, 4503, 4499, 4515, 4502, 4516, - 4512, 4519, 4500, 4518, 4526, 4511, 4527, 4528, 4530, 4532, - 4540, 4541, 4538, 6447, 4533, 6447, 4543, 4544, 4554, 4549, - 4547, 4555, 4551, 6447, 4559, 4561, 4563, 4557, 4565, 6447, - 4564, 4566, 4568, 4567, 6447, 4578, 4580, 4569, 4584, 4587, - 4590, 6447, 4593, 4594, 4595, 4604, 4605, 4601, 4603, 4606, - 4607, 4609, 4611, 4612, 4613, 4622, 4615, 4618, 6447, 4624, - 4627, 4633, 4634, 4641, 4617, 4636, 4638, 4644, 4637, 6447, + 4459, 4462, 4465, 4464, 4466, 4470, 4471, 4472, 6475, 4480, + 4473, 4476, 4481, 4484, 4488, 4489, 4490, 4492, 4494, 4500, + 6475, 4497, 4499, 4505, 4498, 4508, 4507, 4511, 4512, 6475, + 4514, 4517, 4524, 4531, 4513, 4532, 4530, 4536, 4527, 4529, + 4537, 4544, 4545, 4546, 4547, 4543, 4564, 4565, 4562, 6475, + 4548, 6475, 4551, 4549, 4567, 4569, 4563, 4573, 4571, 4575, + 6475, 4577, 4580, 4582, 4579, 4583, 6475, 4586, 4584, 4587, + 4589, 6475, 4585, 4599, 4590, 4591, 4606, 4607, 6475, 4612, + 4613, 4609, 4621, 4623, 4618, 4620, 4622, 4624, 4626, 4628, + 4629, 4630, 4639, 4632, 4635, 6475, 4637, 4644, 4650, 4651, - 4646, 4645, 4647, 4648, 4649, 4652, 4654, 4661, 4657, 4570, - 4658, 4660, 4664, 4666, 6447, 4668, 4670, 4671, 4681, 4674, - 4683, 6447, 4684, 6447, 4678, 4688, 4691, 4673, 4695, 6447, - 6447, 4697, 4704, 4690, 4706, 4700, 6447, 6447, 4708, 6447, - 4703, 6447, 4710, 4711, 6447, 6447, 4712, 4713, 4714, 4715, - 4723, 6447, 4726, 6447, 4734, 4729, 4716, 4718, 4731, 6447, - 4733, 4735, 4738, 6447, 4741, 4748, 4743, 4744, 6447, 4746, - 4751, 4749, 4753, 6447, 4755, 4758, 4760, 4762, 4763, 4764, - 4773, 4767, 4770, 4766, 4774, 4776, 4777, 4786, 4788, 4790, - 4792, 4783, 4793, 4794, 4797, 4800, 4802, 4803, 4804, 4805, + 4658, 4634, 4645, 4655, 4654, 4660, 6475, 4661, 4662, 4663, + 4664, 4667, 4668, 4669, 4676, 4675, 4672, 4677, 4679, 4680, + 4684, 6475, 4687, 4686, 4689, 4697, 4692, 4693, 6475, 4701, + 6475, 4703, 4706, 4708, 4704, 4712, 6475, 6475, 4714, 4715, + 4716, 4720, 4722, 6475, 6475, 4724, 6475, 4721, 6475, 4726, + 4725, 6475, 6475, 4727, 4729, 4733, 4737, 4735, 6475, 4744, + 6475, 4751, 4746, 4736, 4748, 4749, 6475, 4750, 4753, 4757, + 6475, 4758, 4766, 4759, 4761, 6475, 4763, 4768, 4764, 4772, + 6475, 4773, 4779, 4775, 4781, 4782, 4784, 4785, 4786, 4788, + 4792, 4793, 4794, 4796, 4806, 4808, 4810, 4812, 4803, 4795, - 4807, 4808, 4810, 4813, 4817, 4818, 4816, 4819, 4820, 4829, - 4822, 4825, 4833, 4826, 4836, 4837, 4838, 4839, 4841, 4843, - 4844, 4846, 4849, 4852, 4853, 6447, 4848, 4850, 4854, 4861, - 4859, 4869, 4870, 4879, 4881, 4882, 6447, 4884, 6447, 4886, - 4871, 4888, 4876, 4890, 6447, 4891, 4892, 4893, 4894, 4897, - 4896, 4898, 4901, 4902, 4904, 4907, 6447, 4913, 4903, 6447, - 4909, 4917, 4924, 6447, 4919, 4930, 4925, 4927, 4932, 4933, - 4934, 4935, 4938, 4936, 4941, 4947, 4937, 4942, 4944, 4959, - 4962, 4969, 4949, 4951, 4956, 4964, 4965, 4968, 4971, 4972, - 4974, 4980, 4981, 4985, 6447, 4973, 6447, 4986, 4982, 4987, + 4816, 4817, 4819, 4822, 4823, 4824, 4825, 4827, 4828, 4830, + 4832, 4837, 4833, 4836, 4838, 4839, 4846, 4840, 4842, 4853, + 4849, 4854, 4855, 4856, 4857, 4863, 4861, 4864, 4867, 4870, + 4865, 4872, 4873, 6475, 4868, 4876, 4878, 4882, 4889, 4890, + 4891, 4893, 4900, 4904, 6475, 4906, 6475, 4908, 4884, 4910, + 4894, 4897, 6475, 4911, 4914, 4915, 4916, 4917, 4918, 4920, + 4919, 4923, 4924, 4927, 6475, 4930, 4925, 6475, 4933, 4934, + 4945, 6475, 4947, 4949, 4935, 4946, 4950, 4951, 4952, 4954, + 4958, 4959, 4961, 4963, 4965, 4968, 4967, 4976, 4980, 4977, + 4969, 4981, 4982, 4983, 4984, 4988, 4990, 4993, 4992, 5000, - 4989, 4993, 4990, 4994, 6447, 6447, 4996, 4997, 5003, 5004, - 5005, 5007, 5008, 6447, 5011, 5014, 5021, 5015, 6447, 5017, - 5022, 5024, 5030, 6447, 5025, 5027, 5031, 5034, 5038, 5040, - 5041, 5043, 5045, 5047, 5049, 6447, 6447, 6447, 6447, 5050, - 5053, 5055, 5056, 5058, 5063, 5064, 5066, 5062, 6447, 5068, - 6447, 6447, 5074, 5076, 5070, 5078, 5080, 5082, 5085, 5087, - 6447, 5089, 5086, 5092, 5090, 5099, 5103, 5106, 5108, 5093, - 5109, 5110, 5112, 5119, 5115, 5116, 5118, 5121, 5123, 5125, - 6447, 6447, 5127, 5132, 5134, 5142, 5138, 5139, 5135, 5151, - 5146, 5147, 5148, 5153, 5154, 5155, 5164, 5165, 5156, 5160, + 5002, 5006, 6475, 4995, 6475, 5003, 5007, 5009, 4991, 5013, + 5015, 5017, 6475, 6475, 5019, 5020, 5025, 5016, 5022, 5028, + 5029, 6475, 5030, 5034, 5042, 5037, 6475, 5032, 5043, 5044, + 5049, 6475, 5046, 5051, 5052, 5054, 5055, 5062, 5065, 5057, + 5059, 5067, 5069, 6475, 6475, 6475, 6475, 5071, 5073, 5077, + 5078, 5080, 5081, 5083, 5085, 5082, 6475, 5087, 6475, 6475, + 5089, 5096, 5088, 5098, 5099, 5100, 5104, 5106, 6475, 5105, + 5110, 5111, 5108, 5118, 5122, 5124, 5109, 5126, 5127, 5130, + 5131, 5132, 5139, 5136, 5137, 5140, 5142, 5144, 5146, 6475, + 6475, 5148, 5152, 5153, 5160, 5157, 5158, 5164, 5171, 5166, - 6447, 5163, 5166, 5167, 6447, 5169, 6447, 5173, 5175, 5174, - 5177, 5182, 5184, 5185, 5187, 6447, 6447, 5183, 5194, 5189, - 6447, 6447, 5197, 5198, 5200, 5203, 5199, 5204, 5205, 5207, - 5209, 5210, 6447, 5211, 6447, 5212, 5213, 5221, 5215, 5230, - 5231, 5233, 5235, 5228, 5237, 6447, 5238, 5239, 6447, 5241, - 5243, 5244, 6447, 5248, 5246, 5251, 5254, 6447, 5256, 5258, - 5260, 6447, 5267, 6447, 5261, 5263, 5270, 5275, 6447, 5271, - 5272, 6447, 5277, 5279, 5280, 5284, 6447, 5285, 6447, 5286, - 5288, 5289, 5293, 5294, 5296, 5298, 5299, 5300, 5307, 5305, - 5308, 6447, 6447, 5316, 135, 5319, 5302, 5315, 5320, 5321, + 5167, 5168, 5169, 5173, 5174, 5182, 5185, 5175, 5186, 6475, + 5183, 5187, 5188, 6475, 5189, 6475, 5197, 5200, 5190, 5193, + 5194, 5204, 5209, 5207, 6475, 6475, 5196, 5217, 5212, 6475, + 6475, 5215, 5219, 5221, 5223, 5220, 5224, 5226, 5229, 5231, + 5228, 6475, 5233, 6475, 5225, 5232, 5238, 5241, 5252, 5255, + 5256, 5254, 5251, 5257, 6475, 5258, 5260, 6475, 5261, 5263, + 5264, 6475, 5268, 5270, 5272, 5275, 6475, 5281, 5278, 5284, + 6475, 5286, 6475, 5276, 5287, 5283, 5299, 6475, 5290, 5300, + 6475, 5303, 5305, 5291, 5306, 6475, 5297, 6475, 5307, 5309, + 5311, 5314, 5316, 5318, 5320, 5321, 5322, 5329, 5325, 5326, - 5328, 5323, 5326, 5332, 6447, 6447, 5324, 6447, 5333, 5334, - 6447, 5336, 5339, 5343, 5338, 5345, 5346, 5347, 5349, 5352, - 5354, 5359, 5357, 5353, 5358, 5373, 5375, 5360, 5378, 5380, - 5382, 5384, 5386, 5388, 5389, 5390, 5365, 5392, 5393, 5395, - 5396, 5398, 5399, 6447, 5402, 5407, 5408, 5403, 6447, 5414, - 5409, 5423, 5415, 6447, 5425, 5417, 5427, 5428, 6447, 5429, - 5431, 5434, 5432, 5433, 5445, 5440, 5442, 5446, 6447, 6447, - 6447, 5449, 5456, 6447, 5458, 5452, 5435, 5443, 6447, 5459, - 5462, 6447, 6447, 5463, 5464, 5465, 5475, 6447, 5467, 6447, - 5470, 6447, 5471, 5472, 5480, 5478, 6447, 5484, 5482, 5492, + 6475, 6475, 5334, 5332, 135, 5341, 5338, 5342, 5343, 5344, + 5351, 5346, 5348, 5354, 6475, 6475, 5355, 6475, 5349, 5356, + 6475, 5347, 5364, 5365, 5358, 5368, 5369, 5370, 5374, 5378, + 5379, 5380, 5381, 5382, 5384, 5386, 5400, 5385, 5397, 5402, + 5405, 5407, 5409, 5398, 5411, 5412, 5413, 5415, 5417, 5418, + 5419, 5421, 5422, 6475, 5425, 5427, 5430, 5429, 6475, 5435, + 5431, 5444, 5440, 6475, 5449, 5437, 5450, 5451, 6475, 5452, + 5454, 5457, 5455, 5456, 5468, 5463, 5465, 5469, 6475, 6475, + 6475, 5472, 5479, 6475, 5481, 5475, 5458, 5466, 6475, 5482, + 5485, 6475, 6475, 5486, 5487, 5488, 5498, 6475, 5490, 6475, - 6447, 5498, 5500, 5502, 5494, 5486, 5490, 5505, 6447, 5513, - 5511, 5512, 5515, 5504, 5508, 5518, 5519, 5523, 5527, 5525, - 5529, 6447, 5526, 5531, 5532, 5533, 5535, 5538, 5540, 5542, - 6447, 5544, 6447, 5545, 5546, 5547, 5548, 5549, 5552, 5556, - 5561, 5567, 5560, 5563, 5570, 5573, 5574, 6447, 6447, 5576, - 5578, 6447, 5579, 6447, 5583, 6447, 5585, 5586, 5587, 5584, - 6447, 5591, 5588, 5592, 5580, 6447, 5594, 5597, 5598, 5605, - 6447, 6447, 5606, 5613, 5609, 5610, 5619, 5621, 5616, 5623, - 5624, 5625, 5627, 5637, 5629, 5628, 5630, 5639, 5641, 5643, - 5644, 6447, 6447, 6447, 5649, 5633, 5657, 5655, 5659, 5658, + 5493, 6475, 5494, 5495, 5503, 5501, 6475, 5507, 5505, 5506, + 5515, 6475, 5522, 5524, 5526, 5527, 5509, 5513, 5528, 6475, + 5537, 5530, 5534, 5541, 5538, 5542, 5543, 5544, 5545, 5552, + 5547, 5551, 6475, 5553, 5555, 5561, 5558, 5548, 5562, 5565, + 5568, 6475, 5570, 6475, 5571, 5573, 5574, 5576, 5575, 5579, + 5581, 5582, 5592, 5590, 5583, 5594, 5596, 5597, 6475, 6475, + 5603, 5605, 6475, 5600, 6475, 5607, 6475, 5608, 5609, 5610, + 5612, 6475, 5614, 5611, 5615, 5618, 6475, 5622, 5619, 5627, + 5629, 6475, 6475, 5630, 5640, 5636, 5632, 5643, 5645, 5635, + 5648, 5649, 5652, 5639, 5657, 5653, 5656, 5658, 5663, 5664, - 5660, 6447, 5663, 5665, 5666, 5667, 5675, 5670, 5673, 6447, - 5677, 5674, 5676, 5680, 5682, 5679, 5690, 5691, 6447, 5684, - 5696, 5697, 5685, 5703, 5705, 5707, 5710, 5711, 5712, 5719, - 5715, 6447, 5717, 6447, 6447, 5714, 6447, 5718, 5721, 5722, - 5725, 6447, 5728, 5723, 5729, 5730, 5732, 5735, 6447, 5742, - 5741, 5745, 5746, 6447, 6447, 5748, 6447, 5753, 5750, 5754, - 5762, 5757, 5758, 5760, 5765, 6447, 5763, 5771, 5772, 5773, - 5774, 5775, 6447, 5776, 5777, 5779, 5780, 6447, 5783, 5782, - 5785, 5787, 5788, 6447, 5789, 5790, 5811, 5804, 6447, 5795, - 5807, 5806, 6447, 6447, 5814, 5817, 5818, 6447, 6447, 6447, + 5666, 5670, 5674, 6475, 6475, 6475, 5665, 5671, 5682, 5681, + 5683, 5690, 5685, 6475, 5687, 5689, 5693, 5694, 5701, 5697, + 5700, 6475, 5696, 5702, 5704, 5705, 5707, 5709, 5712, 5710, + 6475, 5722, 5724, 5725, 5717, 5727, 5734, 5736, 5738, 5726, + 5740, 5747, 5743, 6475, 5745, 6475, 6475, 5742, 6475, 5746, + 5749, 5750, 5751, 6475, 5754, 5755, 5756, 5758, 5760, 5763, + 6475, 5770, 5757, 5765, 5773, 6475, 6475, 5775, 6475, 5780, + 5781, 5782, 5789, 5785, 5787, 5791, 5788, 6475, 5794, 5799, + 5792, 5800, 5801, 5802, 5803, 6475, 5805, 5807, 5808, 5810, + 6475, 5811, 5815, 5816, 5817, 5818, 6475, 5819, 5821, 5842, - 5821, 5823, 5824, 5826, 6447, 5830, 5834, 5838, 5842, 5833, - 6447, 5845, 5841, 5846, 6447, 6447, 5827, 5848, 5849, 5851, - 6447, 6447, 5852, 5855, 5853, 5856, 5858, 6447, 5861, 5864, - 5863, 5866, 5871, 5875, 5876, 5878, 5880, 5887, 5888, 5884, - 5885, 5890, 5893, 5894, 5895, 5897, 5907, 5902, 5904, 5906, - 5913, 5910, 6447, 6447, 5917, 6447, 5919, 5920, 6447, 6447, - 5922, 5924, 5926, 5928, 5931, 5933, 5935, 6447, 5936, 5938, - 5939, 5940, 5941, 6447, 5943, 5947, 5942, 5950, 5944, 5953, - 5959, 5949, 5966, 6447, 6447, 5951, 5967, 5955, 5971, 5960, - 6447, 5973, 5974, 5975, 5977, 5979, 5983, 5980, 6447, 5984, + 5822, 6475, 5825, 5832, 5835, 6475, 6475, 5840, 5844, 5846, + 6475, 6475, 6475, 5852, 5849, 5847, 5856, 6475, 5858, 5862, + 5867, 5871, 5870, 6475, 5873, 5861, 5863, 6475, 6475, 5875, + 5876, 5878, 5881, 6475, 6475, 5882, 5884, 5885, 5888, 5886, + 6475, 5887, 5893, 5900, 5894, 5908, 5911, 5913, 5902, 5914, + 5906, 5922, 5926, 5904, 5923, 5924, 5925, 5927, 5928, 5934, + 5937, 5935, 5940, 5943, 5949, 5946, 6475, 6475, 5953, 6475, + 5955, 5950, 6475, 6475, 5957, 5961, 5963, 5965, 5967, 5969, + 5971, 6475, 5972, 5974, 5975, 5976, 5958, 6475, 5977, 5980, + 5982, 5985, 5983, 5986, 5990, 6475, 5991, 5993, 6475, 6475, - 5985, 6447, 6447, 6447, 5987, 6447, 6447, 5986, 6447, 6447, - 6447, 6447, 6447, 6447, 6447, 5988, 6447, 5992, 6000, 6004, - 6007, 6447, 5993, 6008, 6009, 5995, 6447, 5997, 6447, 6010, - 6014, 6018, 6019, 6020, 6026, 6024, 6022, 6028, 6029, 6030, - 6032, 6031, 6036, 6038, 6034, 6042, 6044, 6447, 6447, 6447, - 6043, 6050, 6052, 6054, 6061, 6064, 6067, 6069, 6053, 6056, - 6071, 6073, 6075, 6058, 6077, 6085, 6081, 6082, 6084, 6086, - 6088, 6091, 6093, 6096, 6098, 6447, 6099, 6447, 6100, 6447, - 6447, 6102, 6103, 6105, 6107, 6116, 6117, 6109, 6112, 6119, - 6122, 6121, 6129, 6447, 6447, 6124, 6130, 6447, 6132, 6131, + 5994, 5999, 6000, 6003, 6001, 6475, 6005, 6013, 6009, 6010, + 6011, 6014, 6017, 6475, 6016, 6018, 6475, 6475, 6475, 6020, + 6475, 6475, 6021, 6475, 6475, 6475, 6475, 6475, 6475, 6475, + 6025, 6475, 6024, 6039, 6041, 6043, 6475, 6029, 6036, 6044, + 6031, 6475, 6046, 6475, 6034, 6050, 6049, 5890, 6053, 6055, + 6058, 6059, 6062, 6063, 6064, 6066, 6065, 6070, 6067, 6072, + 6073, 6085, 6475, 6475, 6475, 6069, 6075, 6087, 6091, 6097, + 6098, 6102, 6104, 6092, 6094, 6105, 6107, 6110, 6084, 6106, + 6119, 6116, 6117, 6118, 6120, 6125, 6127, 6122, 6128, 6132, + 6475, 6133, 6475, 6134, 6475, 6475, 6136, 6138, 5936, 6141, - 6447, 6133, 6134, 6136, 6141, 6143, 6140, 6137, 6144, 6148, - 6447, 6447, 6151, 6152, 6157, 6161, 6158, 6168, 6164, 6167, - 6169, 6173, 6166, 6181, 6447, 6180, 6177, 6184, 6447, 6186, - 6187, 6188, 6189, 6191, 6198, 6193, 6194, 6447, 6196, 6447, - 6200, 6202, 6204, 6201, 6203, 6205, 6215, 6219, 6213, 6447, - 6217, 6227, 6221, 6229, 6231, 6233, 6234, 6223, 6236, 6239, - 6245, 6249, 6246, 6250, 6237, 6254, 6251, 6447, 6261, 6252, - 6447, 6258, 6262, 6255, 6264, 6265, 6447, 6269, 6272, 6273, - 6275, 6278, 6279, 6447, 6281, 6285, 6282, 6447, 6288, 6447, - 6447, 6290, 6287, 6294, 6297, 6299, 6447, 6447, 6447, 6327, + 6149, 6150, 6142, 6145, 6146, 6154, 6162, 6164, 6475, 6475, + 6151, 6153, 6475, 6155, 6166, 6475, 6157, 6171, 6167, 6168, + 6174, 6175, 6178, 6179, 6189, 6475, 6475, 6180, 6185, 6182, + 6191, 6192, 6199, 6195, 6202, 6204, 6205, 6198, 6212, 6475, + 6214, 6211, 6219, 6475, 6220, 6208, 6215, 6221, 6223, 6231, + 6226, 6228, 6475, 6229, 6475, 6233, 6234, 6239, 6235, 6236, + 6237, 6247, 6251, 6249, 6475, 6238, 6252, 6257, 6258, 6260, + 6263, 6265, 6266, 6270, 6273, 6275, 6280, 6267, 6281, 6271, + 6282, 6283, 6475, 6292, 6284, 6475, 6289, 6293, 6286, 6295, + 6296, 6475, 6300, 6301, 6304, 6306, 6309, 6310, 6475, 6312, - 6334, 6341, 6348, 6355, 6362, 6369, 88, 6376, 6383, 6390, - 6397, 6404, 6411, 6418, 6425, 6432, 6439 + 6316, 6318, 6475, 6319, 6475, 6475, 6321, 6313, 6322, 6328, + 6330, 6475, 6475, 6475, 6355, 6362, 6369, 6376, 6383, 6390, + 6397, 88, 6404, 6411, 6418, 6425, 6432, 6439, 6446, 6453, + 6460, 6467 } ; -static const flex_int16_t yy_def[3318] = +static const flex_int16_t yy_def[3333] = { 0, - 3299, 1, 3300, 3300, 3301, 3301, 3302, 3302, 3303, 3303, - 3304, 3304, 3305, 3305, 3306, 3306, 3299, 3307, 3299, 3299, - 3299, 3299, 3308, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3309, 3299, 3299, 3299, - 3309, 3310, 3299, 3299, 3299, 3310, 3311, 3299, 3299, 3299, - 3299, 3311, 3312, 3299, 3299, 3299, 3312, 3313, 3299, 3314, - 3299, 3313, 3313, 3315, 3299, 3299, 3299, 3299, 3315, 3316, - 3299, 3299, 3299, 3316, 3307, 3307, 3299, 3317, 3308, 3317, - 3308, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3314, 1, 3315, 3315, 3316, 3316, 3317, 3317, 3318, 3318, + 3319, 3319, 3320, 3320, 3321, 3321, 3314, 3322, 3314, 3314, + 3314, 3314, 3323, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3324, 3314, 3314, 3314, + 3324, 3325, 3314, 3314, 3314, 3325, 3326, 3314, 3314, 3314, + 3314, 3326, 3327, 3314, 3314, 3314, 3327, 3328, 3314, 3329, + 3314, 3328, 3328, 3330, 3314, 3314, 3314, 3314, 3330, 3331, + 3314, 3314, 3314, 3331, 3322, 3322, 3314, 3332, 3323, 3332, + 3323, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3309, 3309, 3310, - 3310, 3311, 3311, 3299, 3312, 3312, 3313, 3313, 3314, 3314, - 3313, 3315, 3315, 3299, 3316, 3316, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3324, 3324, 3325, + 3325, 3326, 3326, 3314, 3327, 3327, 3328, 3328, 3329, 3329, + 3328, 3330, 3330, 3314, 3331, 3331, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3313, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3328, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3328, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3328, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3299, 3299, 3307, 3299, 3299, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3328, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3322, 3314, 3314, 3322, 3314, 3314, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3313, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3299, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3328, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3314, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3299, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3314, 3322, 3322, 3322, 3322, 3322, 3314, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3313, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3328, 3328, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3313, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3328, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3314, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3328, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3314, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3313, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3328, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3299, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3314, 3322, 3322, 3322, 3314, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3313, 3307, 3299, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3328, 3322, 3314, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3299, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, + 3322, 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3314, 3322, 3314, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3314, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3313, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3314, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3328, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3314, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3313, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3328, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, - 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3299, - 3307, 3299, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3314, 3314, 3322, 3322, + 3322, 3322, 3322, 3314, 3314, 3322, 3314, 3322, 3314, 3322, + 3322, 3314, 3314, 3322, 3322, 3322, 3322, 3322, 3314, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3313, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3299, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3328, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3314, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3314, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3299, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3313, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3314, 3314, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3314, 3314, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3328, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3299, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, - 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3299, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3299, 3307, 3313, 3307, 3307, 3307, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3322, 3322, 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3314, 3322, 3322, 3322, 3314, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3314, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3299, 3299, 3307, 3299, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, - 3299, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3299, - 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, + 3314, 3314, 3322, 3322, 3328, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3314, 3322, 3314, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3314, + 3314, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, + 3322, 3314, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3314, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3307, - 3307, 3299, 3307, 3299, 3307, 3299, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, + 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3314, + 3322, 3322, 3314, 3322, 3314, 3322, 3314, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3314, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3299, 3307, 3299, 3299, 3307, 3299, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3299, 3299, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3299, 3299, 3299, + 3322, 3322, 3322, 3314, 3314, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3314, 3314, 3322, 3314, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3314, 3314, 3322, 3314, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, - 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3299, 3299, 3307, 3299, 3307, 3307, 3299, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3307, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, + 3322, 3314, 3322, 3322, 3322, 3314, 3314, 3322, 3322, 3322, + 3314, 3314, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3314, 3314, 3322, + 3322, 3322, 3322, 3314, 3314, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3314, 3322, 3314, + 3322, 3322, 3314, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3314, 3314, - 3307, 3299, 3299, 3299, 3307, 3299, 3299, 3307, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3307, 3299, 3307, 3307, 3307, - 3307, 3299, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, 3307, 3299, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3299, 3307, 3307, 3299, 3307, 3307, + 3322, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3314, 3322, 3322, 3314, 3314, 3314, 3322, + 3314, 3314, 3322, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + 3322, 3314, 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, + 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3314, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3314, 3322, 3314, 3322, 3314, 3314, 3322, 3322, 3322, 3322, - 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3299, 3299, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3299, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3307, - 3307, 3307, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, - 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3307, 3307, 3307, - 3307, 3307, 3307, 3299, 3307, 3307, 3307, 3299, 3307, 3299, - 3299, 3307, 3307, 3307, 3307, 3307, 3299, 3299, 0, 3299, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3314, + 3322, 3322, 3314, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3314, 3314, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3314, + 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3314, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, + 3322, 3322, 3314, 3322, 3322, 3314, 3322, 3322, 3322, 3322, + 3322, 3314, 3322, 3322, 3322, 3322, 3322, 3322, 3314, 3322, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299 + 3322, 3322, 3314, 3322, 3314, 3314, 3322, 3322, 3322, 3322, + 3322, 3314, 3314, 0, 3314, 3314, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + 3314, 3314 } ; -static const flex_int16_t yy_nxt[6488] = +static const flex_int16_t yy_nxt[6516] = { 0, 18, 19, 20, 21, 22, 23, 22, 18, 18, 18, 18, 18, 22, 24, 25, 26, 27, 28, 29, 30, @@ -1529,19 +1535,19 @@ static const flex_int16_t yy_nxt[6488] = 94, 157, 99, 86, 110, 95, 100, 160, 86, 101, 160, 168, 86, 112, 96, 86, 165, 165, 111, 86, 102, 113, 135, 115, 103, 171, 116, 104, 86, 105, - 106, 177, 114, 117, 168, 118, 86, 122, 86, 126, - 107, 86, 154, 127, 176, 123, 155, 86, 86, 136, + 106, 177, 114, 117, 86, 118, 86, 122, 86, 126, + 107, 86, 154, 127, 1484, 123, 155, 86, 86, 136, 156, 124, 130, 137, 86, 125, 131, 86, 146, 128, 147, 179, 132, 138, 139, 133, 140, 86, 86, 148, 87, 150, 134, 141, 88, 149, 142, 162, 86, 162, - 162, 151, 162, 143, 174, 152, 153, 144, 145, 90, + 162, 151, 162, 143, 168, 152, 153, 144, 145, 90, 180, 90, 90, 167, 90, 167, 167, 172, 167, 172, 172, 170, 172, 175, 175, 85, 86, 85, 85, 90, 85, 90, 90, 86, 90, 86, 85, 178, 182, 86, 90, 91, 183, 86, 86, 86, 181, 86, 86, 86, 195, 188, 186, 86, 86, 184, 86, 189, 187, 190, - 86, 86, 86, 173, 86, 191, 192, 197, 194, 196, + 86, 86, 86, 176, 86, 191, 192, 197, 194, 196, 193, 86, 203, 86, 198, 200, 201, 205, 86, 86, 204, 199, 86, 202, 207, 209, 86, 213, 210, 86, @@ -1555,7 +1561,7 @@ static const flex_int16_t yy_nxt[6488] = 86, 245, 256, 86, 255, 246, 253, 86, 86, 259, 86, 86, 86, 251, 86, 263, 252, 254, 260, 258, - 262, 257, 86, 264, 158, 158, 267, 266, 160, 168, + 262, 257, 86, 264, 158, 158, 267, 266, 160, 174, 261, 160, 265, 162, 168, 162, 162, 268, 162, 165, 165, 167, 86, 167, 167, 90, 167, 90, 90, 172, 90, 172, 172, 86, 172, 175, 175, 170, 269, 270, @@ -1587,7 +1593,7 @@ static const flex_int16_t yy_nxt[6488] = 399, 86, 402, 393, 394, 397, 86, 86, 86, 86, 396, 395, 400, 86, 403, 401, 86, 86, 86, 405, - 86, 406, 166, 398, 407, 404, 86, 86, 86, 409, + 86, 406, 173, 398, 407, 404, 86, 86, 86, 409, 86, 408, 410, 86, 413, 415, 411, 417, 86, 412, 86, 86, 86, 86, 416, 86, 422, 414, 86, 418, 86, 420, 86, 421, 423, 86, 86, 86, 425, 86, @@ -1609,13 +1615,13 @@ static const flex_int16_t yy_nxt[6488] = 515, 86, 512, 86, 552, 86, 503, 86, 504, 510, 505, 513, 511, 514, 526, 517, 516, 168, 525, 527, - 86, 86, 164, 506, 528, 86, 507, 86, 508, 86, + 86, 86, 168, 506, 528, 86, 507, 86, 508, 86, 509, 86, 86, 518, 519, 529, 533, 86, 531, 532, 86, 534, 530, 520, 86, 521, 522, 523, 536, 540, 524, 86, 86, 537, 86, 86, 535, 542, 539, 541, 538, 86, 86, 86, 86, 86, 549, 86, 547, 86, 550, 544, 86, 86, 554, 543, 86, 546, 86, 548, - 86, 545, 86, 86, 86, 551, 163, 553, 557, 86, + 86, 545, 86, 86, 86, 551, 166, 553, 557, 86, 558, 559, 555, 86, 556, 86, 560, 86, 561, 86, 562, 565, 566, 563, 86, 86, 86, 571, 568, 569, 86, 86, 573, 86, 572, 585, 86, 86, 86, 567, @@ -1631,13 +1637,13 @@ static const flex_int16_t yy_nxt[6488] = 613, 612, 86, 619, 86, 621, 86, 623, 86, 86, 86, 620, 86, 86, 86, 86, 622, 625, 86, 626, - 86, 634, 653, 624, 628, 86, 161, 86, 627, 86, + 86, 634, 653, 624, 628, 86, 164, 86, 627, 86, 636, 629, 631, 630, 633, 632, 86, 86, 635, 638, 86, 86, 637, 86, 641, 86, 644, 86, 639, 647, 86, 640, 86, 646, 86, 86, 86, 642, 86, 86, 643, 650, 86, 86, 654, 86, 86, 645, 649, 86, 656, 86, 86, 648, 86, 86, 86, 86, 655, 670, - 651, 673, 657, 652, 659, 86, 159, 86, 658, 86, + 651, 673, 657, 652, 659, 86, 163, 86, 658, 86, 660, 669, 668, 671, 86, 661, 680, 662, 86, 677, 86, 672, 86, 663, 86, 664, 681, 674, 665, 666, 86, 675, 86, 676, 86, 667, 678, 682, 86, 679, @@ -1650,7 +1656,7 @@ static const flex_int16_t yy_nxt[6488] = 710, 715, 86, 86, 705, 707, 716, 714, 718, 708, 711, 86, 86, 709, 86, 717, 86, 86, 86, 720, 86, 86, 713, 719, 724, 723, 86, 86, 86, 732, - 86, 721, 729, 722, 86, 725, 86, 730, 86, 733, + 86, 721, 729, 722, 86, 725, 161, 730, 86, 733, 86, 731, 726, 728, 734, 727, 735, 86, 736, 86, 86, 737, 86, 738, 86, 740, 86, 86, 739, 86, @@ -1697,7 +1703,7 @@ static const flex_int16_t yy_nxt[6488] = 86, 86, 936, 937, 86, 938, 86, 86, 939, 86, 946, 948, 86, 940, 944, 86, 945, 950, 86, 941, - 942, 176, 86, 86, 952, 954, 955, 949, 947, 86, + 942, 159, 86, 86, 952, 954, 955, 949, 947, 86, 957, 956, 86, 86, 951, 86, 958, 86, 960, 86, 961, 86, 962, 953, 959, 86, 964, 86, 963, 965, 86, 86, 86, 966, 86, 86, 86, 86, 969, 967, @@ -1714,7 +1720,7 @@ static const flex_int16_t yy_nxt[6488] = 86, 1018, 86, 86, 1019, 1008, 86, 1016, 86, 1014, 86, 86, 1026, 1020, 1024, 1022, 1027, 86, 86, 1021, 86, 86, 1025, 86, 86, 1029, 86, 86, 86, 86, - 86, 86, 1023, 174, 1037, 86, 86, 1035, 86, 1028, + 86, 86, 1023, 86, 1037, 86, 86, 1035, 86, 1028, 1040, 86, 1030, 1031, 1032, 1041, 86, 1034, 1033, 1038, 1042, 86, 1036, 86, 1039, 86, 86, 1048, 86, 1045, 1043, 1047, 86, 86, 86, 1044, 86, 86, 86, 1046, @@ -1724,508 +1730,512 @@ static const flex_int16_t yy_nxt[6488] = 1054, 1056, 1059, 86, 86, 86, 1061, 1064, 86, 86, 86, 1070, 1071, 1068, 1065, 86, 86, 1066, 86, 1072, 1075, 86, 86, 1077, 86, 1067, 86, 86, 86, 86, - 1069, 86, 1081, 1073, 1074, 86, 1079, 1082, 168, 86, - 86, 1085, 1076, 1084, 1080, 1078, 86, 86, 86, 86, - 1083, 1086, 1088, 86, 86, 86, 86, 86, 1101, 86, - 1104, 86, 86, 1102, 86, 86, 1087, 1089, 1091, 1092, - 86, 173, 86, 1090, 1094, 1093, 86, 1103, 86, 1095, + 1069, 86, 1082, 1073, 1074, 86, 1079, 1083, 168, 86, + 86, 1086, 1076, 1085, 1080, 1078, 1081, 86, 86, 86, + 1084, 1087, 86, 1089, 86, 86, 86, 86, 86, 1102, + 86, 1105, 86, 86, 1103, 86, 176, 1088, 1090, 1092, + 1093, 86, 86, 86, 1094, 1107, 1091, 1095, 86, 86, - 1107, 1096, 1106, 86, 1108, 1097, 1110, 1098, 1109, 1105, - 1111, 86, 1099, 86, 86, 1112, 86, 1100, 1115, 86, - 1113, 86, 86, 86, 86, 86, 1118, 1114, 86, 1121, - 1116, 86, 86, 86, 1117, 1120, 1119, 86, 1126, 1122, - 1125, 86, 1124, 1123, 1128, 1129, 1127, 1130, 86, 1131, - 86, 86, 1132, 86, 86, 1133, 1134, 86, 86, 86, - 86, 86, 1147, 86, 1144, 86, 86, 86, 86, 1143, - 1148, 1135, 86, 1136, 1145, 1146, 1149, 86, 1137, 86, - 1138, 1150, 1154, 86, 86, 1151, 1139, 86, 86, 1155, - 86, 1140, 1141, 86, 86, 1153, 1152, 86, 1142, 1156, + 1104, 1096, 86, 1097, 1110, 1121, 1109, 1098, 1106, 1099, + 86, 86, 86, 86, 1100, 1112, 1116, 1108, 86, 1101, + 1113, 86, 1114, 86, 1111, 1115, 86, 86, 1117, 86, + 86, 1119, 1122, 1118, 86, 86, 86, 1123, 86, 1129, + 1128, 1120, 1127, 1126, 1125, 86, 1130, 1131, 86, 1132, + 1124, 1133, 86, 86, 86, 86, 86, 86, 86, 86, + 1134, 86, 86, 1145, 86, 1148, 1149, 86, 1144, 86, + 86, 1147, 1135, 1136, 86, 1137, 1146, 1150, 86, 86, + 1138, 1151, 1139, 86, 1155, 86, 86, 86, 1140, 1152, + 86, 1156, 86, 1141, 1142, 1154, 86, 1153, 86, 1157, - 86, 1157, 1160, 86, 1161, 86, 1158, 1163, 1164, 86, - 86, 1159, 1168, 86, 1162, 1166, 1165, 86, 86, 86, - 86, 86, 1167, 86, 1169, 1174, 86, 86, 86, 1171, - 1172, 86, 86, 1177, 86, 1175, 1170, 86, 86, 1173, - 86, 86, 86, 86, 86, 86, 1176, 1184, 1179, 1182, - 1181, 1183, 1178, 1186, 86, 86, 86, 1180, 1188, 86, - 1185, 1187, 86, 86, 86, 86, 86, 86, 86, 1191, - 1194, 1195, 1196, 1197, 1189, 1190, 86, 1198, 1193, 1199, - 1192, 1200, 86, 1202, 86, 86, 86, 1204, 1203, 86, - 1205, 86, 86, 86, 1206, 86, 86, 86, 1201, 1213, + 1143, 1158, 1162, 1160, 1161, 86, 1164, 86, 1159, 86, + 1165, 86, 86, 86, 1169, 86, 1163, 86, 1167, 86, + 86, 86, 1170, 86, 1168, 1175, 86, 86, 1166, 86, + 1172, 86, 1173, 86, 1171, 1174, 1176, 86, 1178, 86, + 86, 86, 86, 86, 86, 1177, 86, 86, 1185, 1179, + 1183, 1180, 1182, 1184, 86, 1187, 86, 86, 86, 1181, + 1186, 86, 1188, 86, 86, 86, 174, 1190, 1189, 1195, + 1196, 1192, 86, 86, 86, 1191, 1193, 1197, 1194, 86, + 1199, 1200, 1198, 86, 86, 1205, 1203, 86, 1206, 86, + 1202, 1204, 86, 86, 86, 86, 1201, 1207, 86, 86, - 86, 1215, 86, 86, 1208, 86, 1207, 86, 1217, 1209, - 1211, 1212, 86, 1210, 86, 86, 86, 1216, 1219, 86, - 1214, 1221, 86, 86, 1222, 86, 1218, 86, 1224, 86, - 1225, 86, 1231, 86, 86, 1220, 1230, 1227, 1223, 1226, - 1229, 86, 86, 86, 86, 1228, 86, 1234, 86, 1235, - 1232, 86, 86, 86, 86, 86, 1239, 1241, 86, 1242, - 1243, 1233, 86, 86, 1236, 86, 86, 1240, 86, 1246, - 1237, 1244, 1238, 1245, 1249, 86, 1247, 86, 86, 86, - 86, 86, 1248, 1250, 1251, 86, 1252, 86, 1253, 86, - 86, 86, 1256, 1257, 86, 86, 86, 1262, 1263, 1254, + 86, 1214, 86, 1208, 1216, 86, 86, 86, 173, 86, + 86, 1210, 1212, 1209, 1218, 1213, 1211, 86, 86, 86, + 1217, 1220, 1215, 86, 1222, 86, 86, 1221, 1223, 86, + 86, 1219, 86, 86, 1225, 1226, 86, 1231, 1227, 1228, + 86, 1224, 1230, 86, 1232, 86, 86, 86, 1229, 1233, + 1235, 86, 1236, 86, 86, 86, 86, 86, 86, 1240, + 1242, 1243, 1247, 1244, 1234, 86, 86, 86, 86, 86, + 1241, 1237, 86, 1238, 1245, 1239, 86, 1246, 1250, 86, + 86, 1252, 86, 1248, 86, 1251, 86, 86, 1253, 86, + 86, 86, 86, 1257, 1258, 1254, 1249, 86, 86, 86, - 86, 86, 1258, 86, 86, 1265, 1255, 1260, 1266, 86, - 86, 86, 1259, 1270, 86, 1261, 1264, 86, 86, 86, - 86, 86, 86, 1276, 86, 1268, 1269, 86, 1272, 1267, - 168, 86, 1277, 86, 86, 86, 1271, 86, 86, 1273, - 86, 1275, 1282, 1283, 168, 1279, 1274, 1281, 1280, 1286, - 1278, 1284, 86, 1287, 86, 86, 1288, 86, 1285, 86, - 86, 86, 1289, 1290, 86, 1291, 86, 86, 1292, 86, - 86, 1294, 86, 86, 1300, 86, 86, 1297, 1293, 86, - 86, 86, 1295, 86, 86, 1311, 86, 1298, 1296, 1304, - 1301, 1306, 1299, 86, 86, 1303, 86, 1302, 1310, 86, + 1263, 1264, 86, 1259, 86, 1255, 86, 86, 1256, 1266, + 1261, 1267, 86, 86, 86, 1260, 1271, 1265, 1262, 86, + 86, 86, 86, 86, 86, 86, 1277, 86, 1269, 86, + 86, 1270, 1268, 1273, 1278, 1279, 168, 86, 86, 1272, + 86, 1274, 86, 86, 1276, 86, 86, 1284, 1275, 1286, + 86, 1281, 1283, 1282, 1285, 1288, 1280, 86, 1289, 1292, + 86, 86, 1290, 1287, 86, 1291, 86, 86, 86, 86, + 86, 1293, 86, 86, 1296, 86, 86, 1302, 86, 86, + 1299, 1294, 1295, 86, 86, 1297, 86, 86, 86, 86, + 1300, 1298, 1306, 1303, 1308, 1301, 86, 86, 1313, 1305, - 1307, 1305, 1308, 1314, 1312, 1309, 1313, 86, 86, 86, - 86, 1318, 1316, 86, 86, 86, 86, 86, 1320, 86, - 86, 86, 1315, 1319, 1323, 1327, 86, 86, 1322, 1317, - 86, 1324, 1325, 86, 1321, 1328, 86, 86, 1329, 1326, - 86, 1331, 86, 86, 1332, 86, 1333, 1330, 86, 86, - 86, 86, 86, 86, 86, 86, 1339, 1334, 1335, 86, - 1337, 1344, 86, 1340, 1336, 1338, 86, 86, 86, 86, - 86, 1341, 1343, 86, 1342, 86, 1348, 1345, 86, 1346, - 86, 86, 1351, 1349, 1356, 86, 1347, 86, 1350, 86, - 86, 86, 1352, 1354, 86, 1357, 1362, 1359, 1364, 1358, + 1312, 1304, 1317, 1309, 86, 1310, 86, 1307, 1311, 1314, + 1315, 86, 86, 1316, 86, 1318, 86, 86, 86, 86, + 86, 86, 86, 1322, 86, 86, 1321, 1325, 1329, 86, + 86, 168, 1324, 1319, 1320, 1326, 1327, 86, 1323, 86, + 86, 86, 1330, 1328, 1331, 1333, 86, 86, 86, 86, + 1332, 1334, 86, 86, 86, 1335, 1336, 86, 86, 86, + 1341, 86, 86, 1337, 1339, 86, 86, 86, 1338, 1340, + 1342, 1346, 86, 86, 86, 86, 1343, 1347, 86, 1345, + 1344, 1350, 86, 86, 86, 1358, 1348, 1349, 1351, 86, + 1353, 86, 86, 1352, 1354, 86, 86, 86, 1356, 86, - 1353, 1355, 86, 1365, 86, 86, 86, 1360, 86, 86, - 1361, 86, 1369, 1379, 1363, 86, 1380, 166, 86, 86, - 1367, 1368, 1377, 86, 1366, 86, 1370, 1378, 1381, 1383, - 1371, 86, 86, 1372, 1373, 86, 86, 1384, 1374, 86, - 1382, 1385, 86, 1386, 1375, 86, 1388, 86, 1376, 86, - 1389, 86, 1390, 86, 86, 86, 1395, 86, 86, 86, - 1387, 1398, 1399, 1393, 164, 86, 1414, 86, 86, 1391, - 1400, 1392, 1396, 86, 86, 1394, 86, 1397, 1401, 86, - 1407, 86, 1402, 1408, 1409, 86, 86, 1403, 86, 1404, - 86, 1405, 1410, 1406, 1411, 86, 1415, 86, 1418, 86, + 1361, 86, 86, 1360, 1357, 86, 1364, 1355, 86, 1366, + 1359, 1365, 86, 1363, 1367, 86, 1362, 86, 1371, 1369, + 86, 1368, 1381, 86, 1565, 1370, 86, 1372, 86, 86, + 1382, 1373, 1380, 1379, 1374, 1375, 86, 86, 1385, 1376, + 86, 1383, 86, 86, 86, 1377, 1384, 1386, 1387, 1378, + 86, 1388, 86, 1390, 86, 86, 86, 1391, 86, 1392, + 86, 1389, 86, 86, 86, 1400, 1401, 1395, 1397, 166, + 86, 86, 86, 86, 1394, 1393, 1398, 86, 1402, 1404, + 1396, 1403, 1399, 86, 1405, 86, 1406, 86, 1407, 1413, + 1408, 86, 1409, 1410, 1411, 86, 86, 86, 1412, 1417, - 1412, 1416, 86, 86, 1417, 86, 1413, 86, 1419, 86, - 1425, 1420, 86, 1426, 1421, 86, 86, 86, 1422, 86, - 86, 86, 86, 1424, 1429, 1427, 1423, 86, 86, 1428, - 1431, 1435, 86, 1434, 1430, 86, 1437, 86, 86, 86, - 1432, 1438, 86, 1440, 86, 1439, 86, 1443, 86, 86, - 1436, 86, 1433, 1445, 86, 1442, 86, 1446, 86, 86, - 1450, 86, 86, 1441, 1447, 86, 86, 86, 1452, 1444, - 86, 86, 1448, 1456, 86, 1454, 1455, 86, 86, 1449, - 1458, 86, 1451, 86, 86, 86, 1453, 163, 1460, 1462, - 86, 86, 1457, 1459, 86, 1461, 1464, 86, 1463, 1465, + 86, 1415, 86, 86, 1418, 86, 1416, 86, 1421, 1419, + 1414, 86, 86, 86, 86, 86, 1427, 86, 1428, 86, + 1423, 1422, 86, 1429, 1420, 86, 86, 86, 1426, 86, + 1431, 1424, 1425, 1430, 86, 86, 1433, 86, 1437, 86, + 1432, 86, 1436, 1439, 86, 86, 86, 1434, 1440, 86, + 1438, 86, 1441, 86, 1444, 86, 1442, 1445, 86, 1435, + 1443, 1447, 86, 86, 1448, 86, 86, 1452, 86, 86, + 1449, 86, 86, 1446, 1454, 86, 1450, 86, 86, 86, + 1456, 1458, 86, 86, 164, 1460, 1457, 1451, 86, 1453, + 86, 86, 1455, 1462, 86, 86, 1459, 86, 1461, 1464, - 86, 1466, 1467, 1468, 86, 86, 86, 1472, 1473, 1475, - 1469, 86, 1470, 86, 86, 86, 1474, 86, 86, 1471, - 86, 1479, 86, 86, 86, 168, 1476, 86, 86, 1485, - 1486, 1478, 86, 1488, 86, 86, 86, 1477, 1487, 86, - 1482, 86, 1481, 1480, 86, 86, 86, 1483, 1489, 86, - 86, 1484, 86, 1496, 1490, 86, 86, 1493, 86, 86, - 1494, 1491, 86, 1500, 1492, 1501, 86, 1495, 86, 86, - 1497, 1505, 161, 1503, 1499, 86, 1506, 86, 86, 86, - 1498, 1504, 1502, 86, 1508, 86, 1509, 1507, 86, 86, - 86, 86, 1520, 1510, 1514, 1519, 86, 1515, 1511, 1516, + 86, 86, 1466, 1465, 1463, 1467, 86, 1468, 86, 1470, + 86, 86, 86, 1469, 1473, 1474, 1471, 1475, 1472, 86, + 1477, 86, 86, 86, 1476, 86, 86, 86, 1481, 86, + 86, 1478, 1482, 86, 168, 86, 1488, 1489, 1480, 86, + 1491, 86, 86, 86, 1479, 1490, 86, 86, 1483, 1485, + 86, 86, 86, 1486, 86, 1492, 86, 1499, 1487, 86, + 86, 1493, 86, 1496, 86, 86, 1497, 1494, 86, 1503, + 1495, 86, 1498, 1504, 86, 86, 1506, 1508, 86, 1500, + 1502, 86, 1509, 86, 86, 1501, 1512, 1507, 1505, 86, + 1511, 86, 86, 1510, 86, 86, 86, 1517, 1513, 86, - 1512, 86, 86, 1513, 1517, 1518, 1522, 1521, 86, 86, - 86, 1523, 86, 86, 86, 86, 86, 86, 1527, 1528, - 86, 86, 1531, 86, 86, 86, 1536, 1524, 1526, 86, - 86, 86, 1540, 1529, 1537, 1525, 1530, 1533, 86, 1534, - 1532, 86, 1535, 86, 86, 86, 86, 1538, 86, 86, - 1539, 86, 86, 1541, 1547, 86, 1549, 86, 1543, 1548, - 1544, 1545, 1542, 86, 1552, 86, 1551, 1546, 86, 86, - 86, 1556, 1557, 1550, 86, 1558, 86, 1554, 86, 86, - 1553, 86, 1560, 86, 86, 1561, 86, 1565, 1559, 1555, - 1566, 1564, 1562, 86, 1567, 86, 86, 86, 1568, 1571, + 1518, 1520, 1522, 1519, 1514, 86, 1515, 86, 86, 1516, + 1521, 1523, 1525, 86, 1527, 86, 1524, 1526, 86, 86, + 86, 86, 86, 86, 1530, 1531, 86, 86, 1534, 86, + 86, 86, 1539, 1529, 86, 86, 86, 86, 1540, 1528, + 1532, 1533, 86, 1536, 1543, 1537, 1535, 86, 1538, 1544, + 86, 86, 86, 1541, 86, 1542, 86, 86, 86, 86, + 86, 1545, 1547, 1550, 1551, 1546, 86, 1548, 1554, 86, + 1555, 1552, 86, 1549, 1553, 1556, 86, 86, 1559, 1560, + 1561, 1557, 86, 86, 86, 86, 86, 1563, 86, 86, + 1564, 86, 1568, 1569, 1567, 1570, 1558, 1562, 86, 86, - 86, 86, 1569, 1570, 86, 1563, 86, 86, 86, 86, - 86, 86, 86, 1578, 86, 1572, 86, 1577, 86, 86, - 1574, 86, 86, 1575, 1580, 1573, 1576, 1581, 86, 1589, - 1584, 86, 1582, 86, 1579, 1585, 86, 1586, 1583, 86, - 86, 1588, 1587, 86, 86, 1593, 86, 86, 1592, 1597, - 1590, 86, 1591, 86, 1600, 86, 1598, 86, 86, 86, - 86, 1603, 86, 1594, 1602, 1596, 1595, 86, 86, 86, - 86, 86, 86, 1611, 86, 159, 1601, 86, 1604, 1599, - 1612, 1605, 86, 86, 1608, 1614, 86, 1606, 1607, 1610, - 1615, 86, 1609, 86, 1613, 86, 1618, 86, 1616, 1617, + 1575, 86, 86, 1566, 86, 1571, 86, 1572, 1573, 86, + 86, 86, 86, 86, 1574, 86, 86, 1581, 86, 86, + 1576, 86, 1580, 1577, 86, 86, 1578, 1583, 1579, 1584, + 86, 1587, 86, 1592, 1589, 1585, 1588, 86, 1582, 1590, + 86, 86, 86, 86, 1586, 86, 86, 86, 86, 1600, + 1591, 1596, 1595, 86, 86, 86, 1603, 86, 1601, 86, + 1593, 1594, 86, 1606, 1597, 1605, 1599, 1598, 86, 86, + 86, 86, 86, 86, 86, 86, 1604, 86, 86, 1614, + 1602, 86, 1786, 86, 1615, 1617, 86, 1607, 1611, 1608, + 1609, 1610, 1613, 86, 1612, 1616, 1618, 86, 1619, 86, - 86, 86, 86, 1621, 86, 86, 1619, 1622, 86, 86, - 1625, 1629, 86, 1620, 86, 1631, 86, 1626, 86, 1630, - 1623, 86, 1624, 86, 86, 1628, 86, 86, 1627, 1634, - 1635, 1632, 86, 86, 1640, 86, 1633, 1636, 1637, 86, - 86, 1641, 86, 86, 1646, 1638, 86, 1645, 1644, 86, - 86, 86, 1639, 1642, 1648, 86, 86, 1650, 86, 1649, - 1643, 86, 86, 86, 86, 1653, 86, 1651, 86, 1647, - 86, 1656, 86, 1655, 86, 86, 86, 1652, 86, 1660, - 86, 1657, 86, 1654, 86, 1662, 86, 1663, 86, 1658, - 1661, 1659, 86, 1664, 86, 1665, 86, 1667, 86, 1670, + 86, 86, 86, 1620, 86, 86, 86, 1624, 86, 86, + 1622, 1625, 86, 1621, 1628, 1623, 86, 1632, 86, 163, + 86, 1629, 1627, 1634, 1626, 1633, 86, 1635, 1630, 86, + 86, 86, 1631, 86, 86, 1637, 86, 1638, 1639, 1636, + 86, 1643, 1644, 86, 86, 86, 1649, 86, 86, 86, + 1648, 1640, 86, 1647, 1641, 86, 1651, 86, 86, 86, + 1642, 1652, 1645, 1653, 86, 86, 1646, 86, 86, 86, + 86, 1656, 86, 1659, 86, 1650, 86, 86, 1658, 1657, + 86, 1654, 86, 1655, 86, 1660, 86, 1663, 86, 1665, + 1664, 86, 86, 1666, 86, 1661, 1662, 86, 1667, 86, - 1668, 1672, 86, 86, 86, 86, 1669, 1666, 1673, 86, - 1675, 86, 1674, 1671, 86, 1678, 1677, 86, 1681, 86, - 168, 86, 1680, 86, 86, 1676, 86, 86, 86, 86, - 1690, 86, 86, 1679, 1682, 86, 1683, 1691, 1685, 1694, - 86, 1684, 1688, 86, 86, 1686, 1687, 86, 1696, 86, - 86, 1692, 1689, 1695, 86, 1693, 1698, 86, 1700, 1702, - 86, 86, 1699, 86, 86, 86, 86, 1697, 1707, 1701, - 1704, 86, 1706, 86, 1703, 86, 1709, 86, 1710, 86, - 1705, 86, 86, 86, 86, 1714, 86, 1715, 86, 86, - 1722, 86, 86, 1711, 1724, 86, 86, 1708, 1713, 1712, + 1670, 1668, 1673, 86, 1675, 86, 1671, 86, 86, 86, + 1678, 1676, 1672, 86, 86, 86, 1669, 86, 1674, 1681, + 86, 86, 1684, 86, 86, 1680, 1683, 168, 1677, 1686, + 86, 86, 86, 1685, 86, 1679, 1682, 86, 1694, 86, + 86, 86, 86, 1687, 86, 1689, 1695, 86, 1688, 1698, + 86, 1690, 1691, 1692, 86, 86, 1699, 1702, 86, 1693, + 1696, 86, 1697, 1700, 1701, 1704, 1703, 1706, 86, 1708, + 86, 86, 86, 86, 1705, 86, 86, 86, 86, 86, + 1713, 1710, 1707, 1711, 86, 1714, 86, 86, 86, 1718, + 86, 1709, 86, 1719, 86, 1716, 86, 86, 1726, 86, - 1717, 86, 1716, 86, 1719, 86, 86, 1720, 1723, 1718, - 1725, 1727, 86, 1739, 1726, 1729, 1731, 1728, 1732, 1721, - 1730, 86, 86, 86, 86, 86, 1734, 1736, 1733, 86, - 1735, 86, 86, 86, 86, 86, 1737, 86, 1743, 86, - 1742, 1744, 86, 86, 86, 1738, 1746, 86, 1745, 86, - 1749, 86, 86, 1740, 1748, 1741, 86, 86, 86, 86, - 1751, 1750, 1747, 86, 86, 86, 86, 86, 86, 86, - 1760, 1759, 86, 1754, 86, 3299, 86, 1752, 1753, 1755, - 1756, 1757, 86, 86, 1762, 1765, 1763, 86, 1761, 1758, - 86, 86, 86, 1771, 86, 1764, 1766, 86, 86, 1767, + 1712, 1715, 1723, 1717, 86, 1724, 1721, 86, 1720, 86, + 86, 161, 1727, 1728, 86, 1735, 1722, 1725, 1730, 1731, + 86, 86, 1732, 1733, 1734, 86, 1736, 86, 86, 1729, + 86, 1738, 86, 1737, 86, 1739, 1740, 86, 86, 86, + 1742, 86, 86, 1741, 86, 1747, 1748, 1746, 86, 86, + 1750, 86, 86, 1749, 86, 1743, 86, 86, 1744, 1752, + 86, 1745, 1753, 86, 86, 1754, 86, 86, 86, 86, + 86, 86, 1751, 86, 86, 1755, 1764, 1763, 86, 86, + 86, 1758, 1759, 1760, 1756, 86, 1757, 1769, 1761, 86, + 86, 1766, 1767, 86, 86, 86, 1762, 1765, 1768, 86, - 86, 86, 1775, 1773, 1769, 86, 86, 1768, 86, 86, - 86, 86, 1774, 1770, 86, 86, 86, 1772, 86, 1780, - 1776, 1782, 1777, 86, 86, 1783, 1781, 1779, 1784, 86, - 1778, 1785, 1789, 1786, 1790, 86, 1791, 86, 1787, 86, - 86, 86, 1793, 1794, 1795, 86, 86, 86, 1788, 86, - 86, 1792, 1798, 86, 1796, 1799, 86, 86, 86, 1808, - 86, 86, 86, 86, 86, 1797, 1802, 1804, 1800, 1801, - 1805, 1806, 1807, 86, 86, 1803, 1810, 86, 86, 86, - 86, 1809, 1811, 86, 1817, 86, 86, 1812, 86, 1814, - 1813, 86, 1821, 1820, 86, 1819, 86, 86, 1816, 1825, + 1775, 86, 86, 86, 86, 86, 1771, 86, 1777, 1770, + 86, 1779, 86, 1773, 1772, 86, 1774, 1778, 86, 1780, + 86, 1781, 1776, 86, 86, 86, 86, 1784, 86, 1794, + 86, 1793, 86, 1783, 1787, 1785, 1782, 1788, 86, 1789, + 86, 1790, 1795, 86, 1796, 86, 1791, 86, 1798, 1792, + 1799, 86, 86, 1800, 86, 86, 1797, 1802, 86, 1803, + 86, 86, 86, 86, 1811, 86, 1801, 1806, 1812, 86, + 86, 1810, 1808, 86, 1804, 1809, 1805, 86, 86, 86, + 1807, 86, 86, 86, 86, 1813, 1814, 86, 1821, 86, + 159, 1818, 1816, 86, 86, 1815, 86, 1817, 1823, 1824, - 86, 1818, 86, 86, 1815, 1823, 1822, 1829, 1824, 86, - 86, 86, 1830, 86, 3299, 1826, 1834, 1831, 86, 1835, - 1828, 1827, 1837, 86, 1832, 86, 86, 1838, 1840, 86, - 86, 1839, 1833, 86, 86, 1841, 1836, 86, 1844, 86, - 86, 1848, 86, 1846, 86, 86, 86, 86, 86, 1847, - 1842, 1843, 1845, 1849, 86, 86, 1852, 86, 86, 86, - 86, 1850, 86, 1853, 86, 1851, 1858, 86, 1854, 1860, - 1855, 1861, 1856, 1857, 86, 86, 86, 86, 1863, 86, - 1864, 1866, 1865, 86, 1868, 86, 86, 1862, 1859, 1867, - 86, 1872, 86, 86, 86, 86, 86, 86, 1874, 168, + 1822, 1820, 86, 1825, 86, 1827, 86, 1819, 1828, 1829, + 86, 1830, 86, 1833, 86, 86, 86, 1826, 1834, 86, + 86, 1838, 1841, 86, 1839, 1842, 1835, 1831, 1832, 1836, + 86, 86, 86, 86, 86, 1844, 86, 1837, 1840, 1843, + 1848, 86, 1845, 86, 1852, 86, 86, 1847, 1850, 86, + 86, 86, 1846, 86, 1851, 86, 1849, 1853, 86, 86, + 86, 86, 86, 1856, 86, 1862, 86, 1857, 86, 1864, + 1854, 1865, 1855, 1858, 1859, 86, 1860, 86, 1861, 1867, + 86, 1866, 86, 86, 86, 86, 1872, 1863, 86, 86, + 86, 86, 86, 1876, 86, 86, 86, 86, 1871, 1878, - 1875, 1870, 1876, 86, 1871, 1869, 86, 86, 1877, 86, - 86, 1881, 86, 1873, 86, 1878, 1880, 1883, 86, 1879, - 1887, 86, 86, 86, 1882, 86, 1885, 86, 86, 1884, - 1889, 1886, 86, 86, 1894, 86, 1888, 1890, 86, 1891, - 86, 1898, 86, 86, 1897, 1895, 1899, 1892, 1900, 86, - 86, 86, 1893, 1896, 86, 1901, 1903, 1904, 86, 86, - 1902, 1906, 86, 86, 86, 86, 1905, 1907, 86, 86, - 86, 86, 86, 86, 1912, 86, 1913, 86, 86, 86, - 86, 1914, 1917, 1908, 1921, 1915, 1910, 1909, 1911, 1918, - 1916, 1922, 86, 86, 1925, 86, 86, 1923, 1920, 1926, + 3314, 1869, 1868, 1870, 86, 1874, 1882, 86, 1875, 1879, + 1873, 1877, 1880, 86, 86, 168, 86, 86, 1881, 1883, + 1885, 1888, 86, 1884, 86, 86, 86, 1886, 1892, 86, + 86, 1887, 86, 86, 86, 86, 86, 1890, 86, 1894, + 86, 3314, 1899, 1889, 1893, 1891, 1895, 1896, 86, 86, + 1900, 3314, 1897, 1903, 86, 1902, 1898, 86, 1901, 86, + 1904, 1905, 86, 86, 1906, 1908, 1909, 86, 86, 86, + 86, 86, 1907, 86, 86, 1911, 86, 1912, 86, 86, + 1910, 86, 86, 86, 1917, 86, 1918, 86, 86, 1913, + 86, 1919, 1914, 1922, 1915, 1920, 1916, 86, 86, 1923, - 86, 86, 1919, 86, 86, 86, 3299, 86, 1924, 1932, - 86, 86, 1935, 1936, 86, 1937, 86, 1927, 86, 1928, - 1930, 1929, 86, 1931, 1933, 86, 1934, 1939, 86, 86, - 1940, 1943, 86, 86, 1945, 1947, 86, 1944, 1938, 1946, - 86, 86, 86, 1941, 1949, 86, 1942, 86, 86, 86, - 86, 1951, 1952, 86, 1954, 1955, 86, 86, 86, 86, - 1948, 86, 1959, 86, 1958, 1961, 86, 1953, 1960, 86, - 1950, 86, 1956, 86, 86, 86, 86, 86, 1969, 1957, - 2017, 1962, 1963, 1964, 86, 86, 1966, 1971, 1965, 86, - 1973, 1967, 1972, 86, 1968, 1970, 86, 86, 1975, 1978, + 1921, 86, 1926, 1928, 1930, 86, 86, 1925, 1931, 1927, + 86, 86, 1924, 86, 86, 86, 1929, 86, 86, 86, + 1937, 86, 86, 86, 1940, 1941, 86, 1932, 86, 1933, + 3314, 1934, 86, 1935, 1946, 1936, 1938, 1953, 1939, 1942, + 86, 1943, 1944, 86, 86, 1945, 1948, 86, 86, 1947, + 1950, 86, 1949, 1952, 1951, 1954, 86, 1955, 86, 86, + 86, 86, 86, 1956, 1957, 86, 86, 1959, 1960, 86, + 86, 86, 86, 1964, 86, 86, 1963, 1966, 1958, 1965, + 86, 1961, 86, 86, 86, 86, 1974, 1967, 1968, 1969, + 86, 1962, 86, 1976, 1970, 86, 1978, 86, 1977, 86, - 1974, 86, 86, 86, 1977, 86, 1982, 86, 1976, 86, - 1979, 86, 1984, 86, 86, 86, 1987, 1988, 86, 86, - 1990, 86, 1980, 86, 1981, 86, 86, 86, 86, 1996, - 86, 86, 1995, 1985, 1992, 1983, 1986, 1993, 86, 1989, - 86, 86, 1998, 86, 86, 2002, 86, 1994, 1991, 2000, - 1999, 86, 1997, 86, 2006, 86, 2005, 86, 86, 2009, - 86, 86, 2010, 2012, 2008, 86, 86, 2001, 86, 2004, - 2011, 86, 2003, 86, 86, 2007, 86, 86, 86, 2020, - 86, 2014, 2013, 2021, 2022, 2015, 2016, 86, 86, 86, - 86, 86, 2025, 86, 2018, 86, 86, 2030, 86, 86, + 1971, 86, 1972, 1980, 86, 1973, 1981, 1983, 86, 86, + 1975, 86, 1979, 86, 1987, 86, 86, 1984, 86, 1982, + 86, 1989, 86, 86, 1992, 1993, 86, 86, 86, 1985, + 1995, 86, 1986, 86, 86, 2000, 86, 86, 1990, 2001, + 86, 86, 1988, 1997, 1991, 1998, 86, 1994, 86, 86, + 86, 86, 2007, 1996, 1999, 2004, 86, 86, 2002, 2005, + 86, 2003, 2011, 86, 86, 2010, 2014, 86, 86, 86, + 2015, 2013, 86, 2009, 2017, 2006, 86, 2016, 86, 86, + 86, 86, 2008, 2012, 86, 86, 86, 2019, 2018, 2022, + 86, 2025, 2026, 2021, 2027, 86, 86, 86, 86, 2020, - 2023, 2029, 2024, 2019, 86, 86, 86, 86, 2026, 2034, - 86, 2027, 2035, 86, 2031, 2028, 2036, 2038, 2033, 2032, - 2037, 86, 86, 2041, 86, 86, 86, 86, 86, 86, - 2048, 2042, 2045, 2039, 86, 86, 86, 86, 2040, 2043, - 2051, 86, 2050, 86, 2052, 2044, 86, 86, 2046, 2047, - 2049, 2053, 86, 86, 2057, 2054, 2058, 86, 2059, 86, - 2060, 2062, 86, 2055, 2063, 2061, 86, 86, 2056, 86, - 86, 86, 2067, 86, 2065, 86, 86, 86, 86, 2064, - 2069, 86, 2072, 2066, 2073, 2068, 2074, 2070, 86, 168, - 86, 86, 86, 86, 2076, 86, 86, 86, 2081, 86, + 86, 86, 2023, 86, 86, 2030, 2035, 86, 86, 2034, + 86, 2024, 2029, 86, 86, 2028, 2032, 86, 2039, 2042, + 86, 2031, 86, 2040, 86, 2033, 86, 2036, 2037, 2038, + 2043, 2041, 2046, 86, 86, 2044, 86, 86, 86, 86, + 2045, 86, 2053, 2050, 86, 86, 2056, 86, 86, 2055, + 2048, 86, 2057, 86, 86, 2047, 2049, 2058, 86, 2051, + 2054, 2052, 86, 2059, 2063, 86, 2064, 86, 86, 2060, + 2065, 2067, 2068, 86, 2061, 2066, 86, 86, 86, 86, + 2072, 86, 2062, 86, 2070, 2071, 86, 2074, 86, 86, + 2077, 86, 2079, 2073, 2069, 86, 86, 86, 86, 168, - 2075, 2080, 2071, 2077, 2088, 2078, 86, 2082, 2086, 2079, - 2083, 86, 2084, 86, 86, 86, 86, 2085, 86, 86, - 86, 2087, 2089, 2092, 2091, 86, 86, 2090, 86, 2094, - 86, 86, 2098, 86, 86, 86, 2097, 2093, 2095, 86, - 2100, 86, 2096, 2099, 2101, 86, 2103, 86, 2102, 86, - 86, 86, 86, 86, 86, 86, 2108, 2110, 2105, 2109, - 86, 2104, 86, 86, 2112, 86, 2115, 86, 2106, 86, - 2107, 2111, 86, 86, 2119, 86, 2114, 2116, 2113, 86, - 2120, 2118, 86, 86, 2121, 2117, 86, 86, 2124, 86, - 2123, 2126, 86, 86, 2122, 86, 2127, 86, 2132, 2125, + 2075, 86, 86, 3314, 2082, 86, 86, 2086, 86, 86, + 2088, 2087, 86, 2078, 2076, 2081, 2080, 2083, 2084, 2092, + 2085, 2089, 86, 2090, 86, 86, 86, 86, 86, 86, + 86, 2094, 2091, 2093, 2095, 2097, 86, 86, 2096, 2098, + 86, 2100, 86, 86, 86, 86, 2104, 86, 86, 2099, + 2103, 86, 86, 2105, 2101, 2102, 2106, 2107, 86, 2109, + 86, 2108, 86, 86, 86, 86, 86, 86, 2110, 2114, + 2116, 2111, 2115, 86, 86, 86, 86, 86, 86, 2121, + 86, 2112, 2118, 2113, 2117, 86, 86, 2125, 86, 2120, + 2122, 86, 2119, 86, 2124, 2123, 86, 2126, 86, 86, - 86, 86, 2134, 2128, 86, 2129, 86, 86, 2135, 86, - 2130, 2131, 2136, 86, 86, 2137, 86, 2133, 2138, 86, - 86, 2139, 2141, 2142, 86, 86, 86, 2146, 86, 86, - 86, 2143, 2140, 86, 86, 86, 2144, 2147, 86, 86, - 86, 86, 86, 86, 86, 2145, 2149, 2150, 2151, 2155, - 2152, 2148, 2160, 86, 2159, 2154, 86, 86, 86, 86, - 86, 2157, 2156, 2163, 2164, 2153, 86, 2158, 86, 86, - 2167, 2166, 86, 86, 2161, 86, 86, 2162, 2165, 2170, - 2169, 86, 2171, 86, 86, 86, 2175, 2168, 86, 86, - 2173, 2177, 2179, 86, 2172, 2174, 86, 86, 86, 2182, + 2127, 2129, 86, 2130, 2134, 2128, 2132, 86, 86, 86, + 2138, 2133, 2131, 86, 86, 86, 86, 2141, 2135, 86, + 2140, 2142, 86, 86, 2136, 86, 86, 2137, 2144, 86, + 2148, 2139, 2147, 2143, 86, 2145, 86, 86, 86, 86, + 86, 2152, 86, 86, 2149, 86, 2146, 86, 86, 86, + 86, 2153, 86, 86, 86, 86, 2161, 2155, 86, 2151, + 2150, 2156, 2157, 86, 2154, 2158, 86, 2160, 86, 2162, + 2165, 2166, 86, 86, 2159, 2163, 2169, 2164, 86, 86, + 86, 2167, 2173, 2170, 2172, 86, 2168, 86, 2171, 86, + 86, 86, 2175, 86, 86, 86, 2176, 2181, 86, 2177, - 86, 86, 2178, 2181, 2176, 2183, 2184, 86, 86, 2187, - 86, 86, 86, 86, 86, 86, 2188, 86, 2193, 86, - 2190, 86, 2180, 2189, 2197, 2185, 86, 2194, 2186, 2195, - 86, 2192, 2191, 86, 86, 86, 2199, 86, 2198, 86, - 86, 2196, 2203, 86, 86, 2205, 86, 2201, 86, 2204, - 86, 2206, 86, 2200, 86, 2202, 86, 2207, 2209, 2208, - 86, 2210, 2212, 2214, 2211, 2216, 86, 2213, 2215, 86, - 86, 86, 86, 86, 86, 86, 2219, 2220, 2217, 2224, - 86, 86, 2218, 86, 2223, 86, 2221, 86, 86, 86, - 86, 86, 86, 86, 2222, 2233, 2234, 86, 86, 2225, + 86, 86, 2179, 2174, 86, 86, 2180, 2183, 86, 2178, + 2185, 86, 86, 2187, 2184, 86, 86, 2182, 2188, 86, + 2189, 86, 2191, 2193, 2190, 86, 2194, 2186, 86, 86, + 86, 86, 2192, 2199, 86, 86, 2196, 86, 2195, 86, + 2200, 2203, 86, 86, 2205, 2198, 86, 86, 2204, 2197, + 2201, 86, 2209, 86, 86, 86, 2211, 2202, 86, 2207, + 86, 2212, 86, 2214, 2206, 86, 2210, 2208, 86, 86, + 86, 2213, 2218, 2220, 86, 86, 86, 2216, 2221, 86, + 2217, 86, 86, 2215, 2222, 86, 2223, 2225, 2224, 86, + 2219, 86, 2230, 86, 2226, 86, 86, 86, 2227, 86, - 2229, 2226, 2228, 2227, 2230, 2231, 2235, 86, 86, 2232, - 86, 86, 86, 2236, 2238, 86, 2244, 86, 86, 2246, - 86, 2239, 86, 86, 2243, 2240, 2237, 2245, 86, 2241, - 86, 86, 2248, 168, 2253, 2249, 2250, 2242, 2255, 2254, - 86, 2247, 2256, 86, 86, 86, 2257, 86, 86, 86, - 2251, 2260, 86, 2258, 86, 2252, 86, 2261, 2264, 2265, - 86, 86, 2266, 86, 2269, 86, 2267, 2259, 86, 2275, - 86, 2262, 86, 2270, 86, 2271, 2272, 86, 86, 2274, - 86, 2268, 2263, 2273, 2277, 86, 86, 86, 86, 86, - 86, 86, 2276, 2280, 86, 86, 2283, 86, 86, 86, + 2229, 2228, 86, 86, 86, 86, 86, 86, 86, 86, + 2239, 2234, 2240, 2231, 2232, 2233, 2236, 2235, 2237, 86, + 86, 86, 86, 2238, 2246, 86, 2242, 2244, 2241, 86, + 86, 2245, 2250, 86, 86, 2252, 86, 86, 2249, 2243, + 2247, 2254, 86, 2251, 86, 86, 2258, 2255, 168, 2253, + 2248, 3314, 86, 2260, 2262, 2263, 86, 2256, 2261, 86, + 86, 86, 86, 86, 2257, 2264, 2267, 86, 86, 2268, + 2259, 2265, 86, 2272, 86, 86, 2266, 86, 2273, 86, + 2276, 2271, 2281, 2269, 86, 86, 86, 2274, 86, 2277, + 86, 2278, 2279, 86, 2270, 86, 86, 2275, 86, 86, - 2287, 2289, 86, 86, 2282, 86, 2278, 2290, 86, 86, - 2285, 86, 2279, 2281, 2292, 2284, 86, 86, 2286, 86, - 2291, 2288, 86, 2294, 2297, 86, 2300, 86, 86, 2295, - 2296, 86, 86, 86, 2293, 2298, 2301, 86, 86, 86, - 86, 86, 86, 2299, 86, 86, 86, 86, 2314, 86, - 2302, 2303, 2308, 2313, 86, 2311, 2304, 2306, 2318, 2310, - 2307, 2305, 2309, 2312, 2315, 86, 86, 86, 2319, 86, - 2317, 2316, 86, 2321, 2322, 86, 86, 86, 2323, 2324, - 86, 86, 2320, 86, 2327, 86, 86, 2330, 86, 2331, - 86, 86, 2325, 86, 2326, 2328, 2332, 86, 2329, 86, + 2280, 86, 2282, 2284, 86, 2283, 86, 86, 86, 2287, + 86, 86, 86, 2290, 86, 86, 2285, 2296, 86, 2294, + 86, 86, 2289, 86, 2297, 86, 2286, 2292, 2291, 2288, + 2299, 86, 2293, 86, 86, 86, 2298, 2295, 2301, 86, + 2304, 86, 2307, 86, 86, 2302, 86, 86, 86, 2300, + 86, 86, 2305, 2303, 2308, 86, 86, 86, 86, 2306, + 3314, 86, 86, 2309, 86, 86, 2310, 2320, 2315, 2323, + 2313, 2311, 86, 2317, 2312, 2318, 2314, 86, 2316, 2319, + 86, 86, 2321, 2322, 86, 86, 2326, 86, 2324, 2330, + 2325, 86, 2328, 86, 2327, 2329, 86, 2331, 86, 86, - 2337, 86, 2333, 2338, 86, 2334, 86, 2340, 86, 86, - 86, 2336, 86, 2335, 2342, 86, 86, 2344, 2345, 86, - 2346, 86, 86, 86, 2347, 2339, 86, 2341, 86, 2352, - 86, 2343, 2348, 2351, 86, 86, 2349, 2354, 86, 86, - 86, 2356, 86, 2357, 86, 2350, 86, 2358, 2360, 86, - 86, 2364, 86, 2353, 86, 86, 86, 2355, 86, 2362, - 86, 2361, 2359, 86, 2368, 2369, 86, 86, 2371, 2363, - 86, 2367, 2374, 86, 2365, 86, 86, 2370, 2366, 86, - 86, 86, 2372, 2376, 86, 2373, 86, 2381, 86, 86, - 86, 2383, 86, 2377, 86, 2375, 86, 2382, 2378, 2379, + 86, 2334, 86, 2337, 86, 2338, 86, 86, 2332, 86, + 86, 2335, 2333, 86, 2336, 2339, 86, 86, 2340, 2344, + 86, 2345, 86, 2347, 86, 86, 86, 2341, 2343, 2342, + 2349, 86, 86, 2352, 86, 86, 2346, 2351, 2353, 86, + 86, 2350, 86, 2348, 86, 86, 2359, 86, 86, 2354, + 2358, 2355, 2361, 86, 2356, 86, 86, 86, 86, 2365, + 2364, 86, 2363, 2357, 2367, 86, 86, 2360, 86, 2371, + 86, 86, 86, 2362, 2366, 86, 2376, 86, 86, 86, + 2368, 2369, 2375, 86, 86, 86, 86, 2370, 2378, 86, + 2374, 2372, 2381, 86, 86, 2373, 2383, 86, 2377, 2379, - 86, 2388, 2387, 2384, 86, 86, 86, 2391, 86, 2389, - 2380, 2393, 86, 86, 86, 86, 86, 2390, 2385, 2395, - 2386, 2396, 2398, 2400, 86, 86, 2392, 2397, 86, 86, - 2401, 86, 86, 2406, 2394, 3299, 2399, 2402, 2403, 86, - 86, 86, 2405, 86, 2404, 86, 86, 2411, 2412, 2407, - 2408, 86, 2409, 86, 86, 2413, 86, 86, 2416, 2410, - 86, 2417, 86, 2418, 86, 2415, 2414, 86, 168, 2420, - 86, 2419, 86, 2421, 86, 2426, 86, 86, 86, 86, - 86, 86, 86, 86, 2422, 2427, 2423, 2428, 2424, 2429, - 2425, 86, 2432, 86, 2433, 2430, 2431, 86, 2434, 2437, + 2380, 86, 86, 86, 2388, 86, 2382, 86, 2384, 2390, + 86, 86, 86, 86, 2389, 2385, 2391, 2395, 86, 2386, + 86, 86, 2394, 2396, 86, 86, 86, 86, 2387, 2400, + 86, 2392, 2402, 2393, 2398, 2403, 2397, 86, 2405, 2407, + 86, 2399, 86, 86, 86, 86, 3314, 2406, 2408, 86, + 86, 2401, 2404, 2412, 2409, 2411, 86, 86, 86, 86, + 86, 86, 86, 2423, 86, 2410, 2413, 2414, 2415, 2416, + 2417, 2418, 2419, 2422, 2424, 86, 86, 86, 86, 2420, + 86, 2421, 86, 2425, 168, 2427, 86, 2428, 86, 2429, + 86, 2426, 86, 86, 2434, 86, 86, 86, 86, 86, - 86, 2475, 2435, 86, 2438, 2439, 86, 86, 86, 2436, - 2440, 2442, 2443, 2441, 86, 2445, 86, 86, 86, 86, - 86, 2447, 86, 2444, 86, 86, 86, 2451, 86, 2452, - 86, 86, 3299, 2446, 2448, 86, 2454, 86, 2449, 2461, - 86, 2455, 2453, 2456, 2450, 2457, 86, 86, 2459, 86, - 86, 86, 2458, 2460, 86, 2463, 2464, 86, 86, 86, - 86, 86, 86, 2465, 2466, 86, 2470, 86, 2473, 2462, - 86, 86, 2472, 86, 86, 2469, 2474, 86, 2467, 86, - 2468, 86, 2478, 86, 86, 2471, 86, 86, 2483, 2482, - 2476, 86, 2477, 2480, 86, 2484, 86, 86, 2485, 2481, + 86, 2441, 86, 86, 86, 2436, 2432, 2435, 2430, 2433, + 2431, 2437, 86, 2438, 2440, 2439, 2444, 2442, 2445, 86, + 86, 2446, 86, 2443, 2447, 86, 86, 2449, 2450, 2448, + 2451, 86, 2453, 86, 86, 86, 86, 86, 2455, 86, + 2452, 86, 86, 86, 2459, 86, 2460, 86, 86, 2454, + 86, 2456, 86, 2462, 2463, 2457, 2469, 86, 86, 2461, + 2464, 2458, 2465, 86, 86, 2467, 2472, 86, 86, 2466, + 2468, 86, 2471, 86, 86, 86, 86, 86, 2470, 2474, + 86, 86, 86, 2481, 2478, 86, 2473, 2480, 86, 86, + 86, 2477, 86, 86, 2482, 2475, 2476, 86, 2486, 86, - 2479, 86, 2488, 86, 86, 2487, 2486, 2489, 86, 2491, - 86, 2493, 2490, 86, 2492, 2494, 86, 86, 2495, 86, - 2497, 86, 2496, 86, 86, 86, 86, 86, 86, 86, - 2501, 86, 2503, 2504, 2498, 2505, 86, 2499, 2506, 86, - 2500, 2507, 86, 2508, 86, 2509, 86, 86, 86, 2511, - 2514, 86, 2502, 2510, 86, 2516, 86, 86, 2519, 86, - 2513, 86, 86, 2515, 86, 2512, 86, 2520, 86, 2523, - 2524, 86, 2518, 86, 2517, 86, 86, 86, 2525, 86, - 86, 2521, 2528, 86, 2522, 2527, 86, 86, 2529, 86, - 86, 2532, 2533, 2526, 2530, 2535, 86, 2531, 2536, 86, + 86, 2479, 86, 2483, 2491, 86, 86, 2490, 2493, 2484, + 86, 2485, 2488, 2492, 86, 2489, 86, 86, 2487, 86, + 2496, 86, 2501, 2494, 2497, 86, 2499, 86, 86, 86, + 2495, 2500, 2503, 86, 86, 86, 2505, 86, 86, 86, + 86, 2502, 86, 2498, 2504, 2509, 86, 2513, 86, 86, + 86, 2511, 2506, 2507, 2508, 2512, 2514, 86, 2515, 86, + 2516, 86, 86, 86, 86, 2517, 86, 2519, 2510, 2522, + 86, 86, 86, 2524, 86, 2527, 86, 86, 2521, 86, + 2523, 86, 2520, 2518, 2528, 86, 86, 2531, 86, 2526, + 2525, 2532, 86, 2533, 86, 86, 2529, 86, 86, 86, - 2537, 86, 2538, 86, 2539, 86, 86, 86, 2540, 2534, - 86, 2543, 2542, 86, 2544, 86, 86, 86, 86, 2549, - 86, 86, 2551, 86, 2541, 2552, 86, 2545, 2546, 86, - 86, 86, 86, 86, 2548, 86, 2555, 2547, 86, 86, - 2550, 2553, 86, 2554, 2556, 2561, 86, 2558, 2562, 86, - 86, 86, 86, 2557, 86, 2559, 86, 168, 2560, 86, - 2570, 86, 86, 86, 2565, 86, 86, 86, 2567, 2569, - 2564, 2571, 86, 3299, 86, 2563, 2566, 2577, 2568, 2574, - 2572, 2573, 86, 86, 86, 2575, 2578, 2579, 2580, 86, - 2576, 2581, 86, 2582, 86, 86, 2583, 86, 2584, 86, + 2537, 86, 2536, 2530, 2535, 86, 86, 86, 86, 86, + 3314, 2541, 2534, 2538, 2543, 2539, 86, 2540, 2544, 86, + 2545, 86, 2546, 86, 2547, 86, 2549, 2542, 2548, 86, + 86, 2551, 86, 2552, 2550, 86, 86, 86, 86, 2557, + 86, 86, 2559, 86, 2560, 86, 86, 2553, 2554, 86, + 86, 86, 86, 86, 2556, 86, 2563, 2555, 2562, 86, + 2558, 2561, 86, 2564, 2566, 2569, 86, 86, 86, 86, + 86, 2570, 2565, 2567, 86, 2568, 86, 86, 86, 2577, + 168, 86, 2573, 86, 2579, 86, 86, 2580, 2572, 86, + 2575, 86, 2578, 2571, 2574, 86, 2576, 86, 2586, 2583, - 2585, 86, 2586, 86, 86, 86, 86, 86, 2588, 86, - 86, 86, 2587, 2596, 86, 86, 86, 86, 2589, 2594, - 86, 2600, 86, 2591, 2590, 2601, 86, 2593, 2592, 2595, - 86, 2602, 86, 2598, 2597, 2599, 2605, 86, 86, 2604, - 86, 2606, 2607, 86, 2603, 86, 86, 86, 86, 86, - 86, 86, 2610, 2616, 86, 86, 2608, 86, 2609, 2617, - 86, 2611, 86, 2620, 86, 2612, 2613, 2614, 2615, 86, - 2618, 2621, 86, 2619, 2622, 86, 2623, 86, 86, 2625, - 2624, 86, 86, 2628, 86, 86, 86, 86, 2626, 2632, - 2631, 2627, 2633, 86, 86, 86, 2634, 2635, 86, 86, + 2581, 2582, 86, 86, 86, 2590, 86, 86, 2588, 2589, + 86, 2584, 2591, 86, 2585, 2595, 2587, 86, 2592, 86, + 2593, 86, 2594, 86, 86, 2598, 2597, 86, 86, 86, + 86, 86, 86, 86, 2596, 2605, 86, 86, 86, 2603, + 86, 2609, 2610, 86, 2599, 2600, 86, 86, 86, 2602, + 2601, 2604, 2606, 2611, 2607, 2608, 2613, 2614, 86, 86, + 86, 2616, 86, 86, 86, 86, 2617, 86, 2612, 2615, + 2619, 86, 86, 2625, 86, 2626, 86, 2618, 86, 2620, + 86, 86, 86, 2621, 2632, 2622, 2629, 2623, 2630, 86, + 86, 2624, 2631, 86, 86, 86, 86, 86, 2627, 2628, - 86, 2629, 86, 86, 2630, 2636, 86, 86, 2637, 86, - 86, 2641, 2639, 2645, 2638, 2646, 86, 86, 86, 2649, - 86, 86, 2640, 2642, 86, 2650, 2643, 86, 86, 2644, - 86, 2652, 2647, 2653, 86, 86, 2648, 86, 86, 2651, - 86, 2654, 2658, 86, 86, 2655, 2662, 86, 2661, 2660, - 2659, 86, 2664, 86, 86, 2656, 86, 2657, 86, 2665, - 86, 2669, 86, 86, 2670, 2666, 86, 2672, 86, 86, - 2663, 86, 2668, 3299, 2667, 86, 86, 86, 2677, 86, - 2679, 86, 2673, 86, 2674, 2675, 2676, 86, 2671, 86, - 2678, 86, 2680, 86, 2681, 86, 2683, 2682, 86, 86, + 2633, 86, 2637, 86, 86, 86, 86, 2641, 86, 2634, + 2636, 2640, 2642, 86, 2635, 86, 86, 2643, 2644, 86, + 86, 2638, 86, 2639, 2649, 2646, 86, 2645, 86, 86, + 86, 2650, 86, 86, 2648, 86, 2654, 2655, 86, 2647, + 2658, 86, 86, 86, 2656, 86, 2659, 86, 2651, 2652, + 86, 2661, 2653, 2657, 2662, 86, 86, 86, 2660, 86, + 2664, 2667, 86, 2663, 86, 86, 2671, 86, 86, 2670, + 86, 2668, 86, 2669, 2673, 86, 2665, 2666, 86, 2675, + 86, 2678, 86, 2674, 86, 2679, 86, 2672, 2676, 2681, + 86, 86, 2677, 86, 86, 86, 86, 2686, 86, 2688, - 86, 2684, 86, 86, 2689, 86, 86, 2686, 2687, 3299, - 2690, 2692, 86, 2696, 2685, 2693, 86, 2688, 2691, 86, - 2695, 168, 86, 86, 2694, 86, 2700, 2697, 86, 86, - 2702, 86, 86, 2701, 86, 2705, 86, 2706, 86, 2704, - 86, 2698, 3299, 2699, 2708, 86, 2703, 86, 86, 2710, - 2709, 86, 86, 2707, 2711, 86, 2712, 2713, 2715, 86, - 86, 86, 2714, 2716, 86, 2717, 86, 86, 86, 86, - 2718, 2722, 2723, 86, 2724, 2720, 86, 86, 86, 86, - 86, 2719, 86, 2728, 2727, 2725, 86, 86, 86, 2721, - 86, 2730, 2726, 2731, 2729, 86, 86, 86, 86, 2736, + 86, 86, 86, 2684, 2682, 2685, 2683, 2689, 2680, 86, + 2687, 86, 86, 86, 2690, 2691, 2692, 86, 86, 86, + 2693, 86, 86, 86, 86, 3314, 2695, 2696, 2698, 2699, + 2701, 86, 2694, 2697, 2702, 86, 2700, 86, 2705, 168, + 86, 2704, 2703, 86, 86, 86, 2710, 2706, 2707, 86, + 86, 2712, 86, 86, 2711, 86, 2715, 86, 2716, 86, + 2714, 86, 2708, 2709, 2718, 86, 86, 2720, 2713, 2719, + 86, 86, 2721, 86, 2717, 2722, 2723, 86, 2725, 86, + 86, 86, 86, 2726, 86, 2727, 86, 86, 86, 2732, + 2728, 2724, 2733, 2734, 2730, 86, 86, 2729, 86, 86, - 86, 2739, 86, 2733, 2734, 2732, 2735, 86, 2740, 2737, - 86, 86, 86, 86, 2738, 2744, 86, 86, 86, 2745, - 86, 2749, 86, 86, 86, 86, 86, 2747, 86, 2741, - 2753, 2742, 2743, 2754, 86, 2748, 2746, 2756, 2757, 2751, - 2758, 86, 2750, 86, 86, 2752, 86, 2759, 86, 2760, - 86, 86, 86, 2755, 86, 2761, 86, 86, 2764, 86, - 2762, 86, 2767, 2769, 86, 2763, 2770, 86, 2771, 86, - 2765, 86, 2766, 86, 86, 2772, 86, 2768, 2773, 2774, - 86, 2776, 2778, 86, 86, 86, 2781, 2779, 86, 2782, - 86, 2783, 86, 86, 2775, 2777, 2784, 86, 86, 86, + 86, 86, 86, 86, 2738, 2737, 86, 86, 2731, 86, + 86, 2735, 2736, 86, 2739, 2740, 2744, 86, 2741, 2743, + 86, 2742, 86, 2746, 2749, 86, 2745, 2748, 86, 2747, + 86, 2750, 86, 86, 86, 2754, 86, 86, 86, 86, + 2755, 86, 86, 2759, 86, 86, 86, 2751, 2757, 2763, + 2764, 86, 2752, 2753, 86, 3314, 2756, 2758, 2762, 2766, + 2760, 2761, 2767, 2768, 86, 86, 2769, 86, 86, 86, + 86, 86, 2770, 86, 86, 2771, 86, 86, 2774, 2765, + 2772, 86, 2777, 86, 2779, 86, 2773, 2780, 86, 86, + 2775, 86, 2776, 2781, 86, 2782, 86, 86, 2784, 86, - 2788, 86, 86, 2789, 2780, 2790, 86, 86, 2792, 86, - 2785, 86, 86, 86, 2796, 86, 2786, 2797, 86, 2787, - 86, 86, 2791, 2799, 2793, 2798, 2800, 2795, 86, 86, - 2794, 2801, 86, 86, 86, 2806, 86, 86, 2802, 86, - 2805, 86, 2810, 2808, 2809, 86, 86, 86, 2803, 86, - 2812, 86, 86, 2804, 2811, 2814, 86, 2815, 86, 86, - 86, 2807, 86, 2818, 2822, 86, 86, 86, 2816, 2817, - 86, 86, 86, 86, 2813, 2824, 2821, 2819, 86, 2828, - 2820, 2823, 2830, 2825, 2826, 2827, 86, 2831, 86, 2829, - 2833, 86, 2832, 86, 2834, 86, 2835, 86, 2836, 86, + 86, 2778, 2783, 86, 86, 2786, 2788, 2794, 2787, 2785, + 86, 2789, 86, 86, 2791, 2792, 86, 2793, 86, 86, + 86, 2798, 86, 2790, 86, 2799, 2800, 86, 2796, 86, + 2802, 86, 2795, 86, 86, 86, 2806, 2807, 86, 86, + 2797, 2809, 86, 2808, 2801, 86, 2803, 86, 2811, 2805, + 2810, 86, 2804, 2812, 86, 86, 86, 86, 2817, 86, + 86, 86, 86, 2816, 86, 2819, 2820, 86, 86, 86, + 2822, 86, 2823, 2821, 2813, 2814, 2815, 86, 86, 2826, + 2825, 86, 86, 86, 2818, 2824, 2829, 86, 2827, 2828, + 2833, 86, 86, 86, 86, 86, 2835, 86, 86, 86, - 2837, 86, 86, 86, 2841, 86, 86, 2839, 86, 86, - 2842, 86, 86, 2844, 2848, 86, 86, 2838, 2845, 2849, - 86, 86, 86, 2840, 2850, 2843, 2852, 86, 86, 2853, - 86, 2846, 2847, 2855, 2851, 2854, 86, 2856, 86, 2857, - 86, 86, 86, 2861, 86, 86, 86, 86, 86, 2858, - 2859, 2862, 2865, 86, 2863, 86, 86, 2866, 86, 86, - 2860, 2864, 86, 2869, 2868, 86, 2867, 2870, 2871, 86, - 2872, 86, 86, 2874, 2875, 86, 86, 86, 86, 2873, - 86, 2876, 2881, 86, 86, 86, 2879, 2877, 86, 2884, - 2885, 86, 2882, 86, 2886, 86, 3299, 86, 2880, 86, + 2830, 2832, 2840, 2831, 2836, 2839, 2834, 2841, 2837, 2844, + 86, 86, 2842, 86, 2838, 86, 2845, 2843, 86, 2846, + 86, 2847, 86, 2848, 86, 86, 86, 2849, 86, 2850, + 86, 86, 86, 2853, 86, 86, 2855, 2859, 86, 2860, + 86, 2856, 86, 86, 86, 2851, 2861, 2863, 86, 2854, + 86, 2864, 2852, 86, 2857, 2858, 2865, 86, 2866, 2868, + 2862, 2867, 86, 86, 86, 86, 2872, 86, 86, 86, + 86, 86, 2869, 2870, 2873, 2876, 86, 2874, 86, 86, + 2877, 86, 86, 2871, 2875, 86, 2880, 2879, 86, 2878, + 2881, 2882, 86, 2883, 86, 86, 2885, 2886, 86, 86, - 2887, 2878, 2888, 86, 2883, 86, 2890, 86, 2889, 2891, - 2892, 86, 2893, 86, 2894, 86, 2895, 86, 86, 2896, - 2899, 86, 2897, 2898, 86, 86, 86, 2902, 86, 2900, - 2901, 86, 86, 2904, 2908, 2903, 86, 2906, 86, 86, - 86, 2910, 86, 2911, 86, 86, 86, 2914, 86, 2912, - 2913, 86, 2905, 86, 2907, 86, 2919, 86, 86, 86, - 86, 86, 86, 2909, 2922, 86, 2916, 2915, 2917, 86, - 2923, 2920, 2921, 86, 86, 2918, 86, 2926, 2924, 2927, - 86, 2928, 2929, 86, 2925, 2932, 86, 86, 2934, 86, - 2935, 86, 86, 86, 2930, 2937, 86, 86, 86, 86, + 86, 86, 2884, 86, 2887, 2892, 86, 86, 86, 2890, + 2888, 86, 2895, 2896, 86, 2893, 86, 2897, 86, 86, + 86, 2891, 86, 2898, 2889, 2899, 86, 2894, 86, 2902, + 3314, 2900, 2903, 2901, 2904, 86, 2905, 86, 2906, 86, + 86, 86, 2908, 86, 2911, 2909, 2910, 86, 2912, 2907, + 86, 86, 2913, 2914, 86, 86, 86, 86, 86, 2920, + 86, 86, 2918, 2922, 86, 86, 86, 2916, 86, 2915, + 2923, 86, 2926, 2924, 86, 86, 2919, 2917, 86, 2925, + 2927, 86, 2931, 86, 86, 2921, 86, 86, 86, 86, + 2928, 2934, 86, 2929, 86, 86, 86, 2932, 2935, 2933, - 86, 86, 2941, 2942, 86, 86, 2933, 86, 2946, 2931, - 86, 86, 2945, 2936, 2938, 2939, 2940, 2949, 86, 86, - 2951, 2943, 86, 86, 2947, 3299, 86, 2952, 2944, 86, - 2948, 2954, 86, 2955, 86, 2957, 86, 86, 86, 2950, - 86, 86, 86, 86, 2962, 2953, 86, 2960, 2959, 2956, - 86, 2966, 86, 2964, 86, 2958, 86, 86, 2969, 2968, - 2961, 2963, 86, 2965, 2972, 2975, 2971, 2973, 86, 2967, - 86, 86, 86, 86, 2970, 2974, 86, 2978, 86, 86, - 86, 2977, 2981, 86, 2979, 2984, 86, 86, 86, 86, - 86, 2976, 86, 86, 2989, 86, 2993, 86, 86, 2980, + 2939, 2930, 2938, 86, 2936, 86, 2940, 86, 2944, 86, + 86, 2937, 2941, 86, 2942, 2946, 86, 2947, 86, 2949, + 86, 86, 86, 86, 86, 86, 2954, 86, 86, 2945, + 2953, 86, 86, 2943, 2948, 86, 2958, 2950, 2951, 2952, + 86, 2961, 86, 86, 2955, 86, 2959, 2963, 86, 86, + 2957, 2956, 86, 86, 2964, 2966, 86, 2967, 86, 2960, + 2969, 86, 86, 2962, 2974, 86, 86, 2965, 2968, 86, + 86, 86, 2973, 2971, 2972, 2978, 86, 86, 86, 86, + 2970, 2976, 2980, 86, 86, 2975, 2981, 86, 2982, 2985, + 2983, 2977, 2979, 2986, 86, 86, 86, 2988, 86, 2987, - 2982, 2983, 2985, 86, 86, 2986, 2988, 2991, 2994, 86, - 86, 2990, 2996, 2992, 2987, 2995, 86, 2998, 86, 2999, - 86, 2997, 3000, 86, 86, 86, 3003, 86, 86, 3005, - 86, 86, 86, 3004, 86, 86, 86, 3001, 86, 3010, - 3011, 86, 86, 86, 3015, 86, 3006, 3016, 86, 3017, - 3012, 3002, 3014, 3007, 86, 86, 3008, 3009, 86, 86, - 3021, 86, 3013, 86, 3020, 3022, 86, 86, 3023, 3025, - 86, 86, 3028, 86, 3018, 86, 86, 3019, 86, 3027, - 3030, 3024, 3026, 3029, 86, 86, 86, 86, 86, 86, - 86, 3033, 86, 86, 3035, 86, 86, 3036, 86, 3034, + 86, 2991, 86, 86, 2984, 2990, 86, 86, 2994, 86, + 86, 2992, 2997, 86, 86, 86, 2989, 86, 86, 3002, + 86, 2998, 86, 86, 3314, 86, 2993, 2995, 2996, 3004, + 86, 3001, 3005, 2999, 3006, 86, 3007, 86, 86, 86, + 86, 3003, 3000, 3008, 3009, 3010, 3011, 86, 3012, 86, + 3013, 86, 3014, 86, 3016, 86, 86, 3018, 86, 86, + 86, 3017, 86, 86, 86, 3023, 3024, 86, 86, 86, + 86, 86, 3028, 86, 3019, 3029, 86, 3030, 86, 3015, + 3027, 3020, 3025, 86, 3021, 3022, 86, 3034, 86, 3026, + 3031, 3033, 3035, 86, 86, 86, 3038, 3032, 86, 3036, - 86, 86, 86, 86, 3031, 3032, 3045, 3046, 86, 3037, - 3299, 3041, 3038, 3039, 3040, 3042, 3043, 86, 3048, 86, - 86, 3044, 3049, 3047, 86, 3051, 3053, 86, 3050, 3054, - 86, 86, 3052, 3056, 86, 3055, 86, 86, 3059, 86, - 86, 3057, 3060, 86, 3061, 3062, 86, 86, 3063, 3064, - 3067, 86, 3065, 3066, 86, 86, 3058, 3068, 86, 86, - 3071, 86, 86, 3074, 86, 86, 86, 3073, 86, 86, - 3077, 86, 3069, 3070, 86, 3076, 86, 86, 3078, 86, - 3083, 3072, 3081, 3084, 86, 3082, 3079, 3085, 86, 86, - 3075, 86, 3080, 86, 3090, 3092, 3087, 86, 86, 3091, + 86, 86, 86, 3041, 86, 86, 3042, 86, 3040, 3037, + 3039, 3043, 86, 86, 86, 86, 86, 3044, 86, 3047, + 86, 86, 3049, 86, 86, 3045, 3050, 3048, 86, 86, + 86, 86, 86, 3046, 86, 86, 3059, 3060, 86, 3051, + 3063, 3052, 3054, 3053, 3055, 86, 3056, 3057, 86, 3062, + 3065, 3058, 3067, 86, 3061, 86, 3068, 86, 3064, 86, + 86, 3066, 86, 3069, 3070, 86, 3314, 3071, 3073, 86, + 3074, 86, 3075, 3076, 86, 86, 86, 3077, 3078, 3072, + 86, 3079, 3080, 86, 86, 3082, 86, 3081, 86, 86, + 3084, 86, 3083, 3088, 86, 86, 3087, 86, 86, 86, - 86, 86, 3088, 86, 3086, 3089, 86, 86, 86, 3099, - 86, 3096, 3097, 3094, 3100, 86, 3102, 86, 3103, 86, - 86, 3101, 3093, 86, 3095, 3104, 86, 3098, 3105, 3106, - 86, 3107, 86, 86, 3109, 86, 3110, 86, 3111, 86, - 3112, 86, 3108, 3113, 86, 3114, 86, 3115, 86, 86, - 3117, 86, 86, 86, 86, 86, 86, 86, 3116, 3122, - 86, 3118, 86, 86, 86, 3119, 86, 3126, 86, 3125, - 3123, 3127, 86, 86, 3120, 3121, 3124, 3128, 3129, 86, - 86, 3136, 3130, 3131, 86, 3133, 86, 86, 86, 3135, - 86, 3134, 86, 86, 3132, 3138, 86, 86, 86, 86, + 86, 86, 3091, 86, 3090, 3174, 86, 86, 3085, 3086, + 3092, 3095, 3096, 86, 3093, 86, 3097, 86, 3094, 86, + 3089, 86, 3098, 3099, 86, 3100, 86, 86, 3103, 3105, + 3101, 3104, 3102, 3107, 3106, 86, 86, 86, 86, 86, + 86, 86, 3108, 3111, 3115, 3112, 3114, 86, 86, 86, + 86, 3109, 3117, 86, 3116, 3118, 86, 3218, 3110, 86, + 3113, 3119, 86, 86, 3120, 3121, 86, 3122, 86, 3124, + 86, 86, 3123, 3125, 86, 3126, 86, 3127, 86, 3128, + 86, 3129, 86, 3130, 86, 86, 3132, 86, 86, 86, + 86, 3135, 3137, 86, 3131, 86, 86, 3133, 86, 86, - 86, 86, 3137, 3142, 3146, 86, 86, 3143, 86, 3141, - 86, 3139, 3148, 86, 3140, 3144, 3149, 86, 3147, 3150, - 86, 86, 86, 86, 3155, 3145, 3153, 86, 3154, 3151, - 3152, 86, 86, 86, 3159, 86, 3158, 86, 3157, 86, - 3161, 86, 86, 86, 86, 86, 3156, 86, 3160, 86, - 3162, 86, 3171, 3168, 3163, 86, 86, 86, 3165, 3164, - 3167, 3169, 3173, 86, 3176, 86, 86, 86, 3166, 86, - 3174, 86, 3170, 3178, 86, 3172, 3177, 86, 3179, 3180, - 86, 3181, 86, 3175, 86, 3182, 86, 3184, 86, 3183, - 86, 3185, 3189, 3186, 86, 86, 3187, 86, 86, 86, + 3141, 3134, 3142, 86, 86, 3144, 86, 86, 3140, 3136, + 3138, 3139, 86, 86, 86, 3146, 86, 3148, 86, 3143, + 3151, 3150, 86, 86, 86, 3145, 86, 86, 3153, 86, + 86, 86, 3149, 86, 86, 3157, 3152, 86, 86, 3147, + 3158, 3161, 86, 3154, 86, 3155, 3156, 86, 3159, 86, + 3162, 3163, 86, 3164, 86, 3165, 86, 86, 3167, 86, + 3160, 3168, 86, 86, 3169, 3166, 86, 3173, 86, 3176, + 3171, 86, 86, 3170, 3172, 86, 86, 86, 86, 86, + 86, 3175, 86, 86, 3177, 86, 86, 3183, 86, 3314, + 3186, 3178, 3180, 3179, 3182, 3184, 3189, 86, 86, 3191, - 3194, 86, 3192, 3195, 86, 3188, 86, 3191, 3190, 86, - 3198, 86, 86, 86, 3201, 86, 86, 3202, 86, 3193, - 86, 3196, 86, 3205, 3206, 86, 3203, 3199, 3197, 86, - 86, 3200, 86, 3211, 86, 86, 3207, 86, 3208, 3204, - 3210, 3212, 86, 86, 86, 86, 86, 86, 3216, 86, - 86, 3209, 3218, 86, 86, 3223, 86, 86, 3213, 3215, - 3225, 86, 3224, 3214, 86, 86, 3217, 3220, 3219, 3221, - 86, 86, 3222, 3229, 86, 3231, 3230, 86, 3232, 86, - 86, 86, 86, 3227, 3226, 3233, 86, 3234, 3237, 3228, - 86, 3235, 3238, 86, 86, 3239, 3240, 86, 3236, 86, + 86, 3185, 3181, 3188, 86, 86, 3187, 86, 3190, 3193, + 86, 86, 3194, 3192, 3195, 86, 3196, 86, 86, 86, + 86, 3199, 3202, 86, 3197, 3200, 3204, 3198, 3201, 86, + 86, 86, 86, 86, 3203, 86, 3207, 3209, 86, 3210, + 86, 86, 3206, 3205, 3213, 86, 86, 86, 3216, 86, + 3211, 86, 3217, 3208, 86, 86, 3220, 3221, 86, 86, + 3212, 3214, 86, 86, 86, 3215, 86, 86, 86, 3222, + 86, 3223, 3225, 3219, 3226, 86, 3227, 86, 3224, 86, + 86, 86, 3230, 3231, 86, 3228, 3229, 86, 86, 3233, + 3232, 86, 86, 86, 3235, 86, 3238, 3239, 86, 3234, - 86, 86, 86, 3241, 86, 3246, 86, 86, 3243, 86, - 3249, 86, 3250, 86, 86, 86, 86, 86, 86, 3242, - 3248, 3244, 3253, 3245, 3251, 3247, 86, 3252, 86, 3257, - 86, 3256, 86, 3254, 86, 3255, 86, 3258, 3299, 3259, - 86, 3261, 86, 3263, 86, 3264, 86, 86, 3268, 86, - 86, 3265, 86, 3262, 3266, 3267, 3260, 3269, 86, 86, - 3270, 3271, 86, 86, 86, 86, 3272, 86, 86, 3274, - 3273, 86, 3275, 3277, 86, 86, 3279, 86, 86, 3283, - 3280, 3284, 86, 3276, 3278, 86, 86, 3281, 86, 3287, - 3288, 86, 86, 3290, 86, 86, 3282, 3291, 86, 3289, + 3236, 3240, 86, 3244, 86, 86, 3246, 3237, 86, 3247, + 3245, 86, 86, 3241, 3243, 86, 3242, 86, 86, 3252, + 3248, 86, 3249, 3250, 86, 86, 3253, 86, 86, 3254, + 3251, 3255, 86, 86, 86, 3258, 86, 3256, 3261, 86, + 3257, 86, 86, 3264, 86, 3265, 86, 86, 86, 86, + 86, 86, 86, 3259, 3263, 3260, 3266, 3268, 3262, 3267, + 86, 3272, 86, 3271, 86, 86, 3276, 3269, 3270, 3273, + 86, 86, 3278, 86, 3279, 3274, 86, 3275, 86, 86, + 86, 3280, 3283, 86, 86, 3281, 86, 3287, 86, 3277, + 3285, 3284, 3286, 86, 86, 86, 86, 86, 3282, 86, - 86, 86, 3292, 86, 3285, 3286, 3293, 86, 3294, 3297, - 86, 3298, 86, 3299, 3299, 3299, 3299, 3299, 3299, 3295, - 3299, 3299, 3299, 3299, 3299, 3299, 3296, 47, 47, 47, - 47, 47, 47, 47, 52, 52, 52, 52, 52, 52, - 52, 57, 57, 57, 57, 57, 57, 57, 63, 63, - 63, 63, 63, 63, 63, 68, 68, 68, 68, 68, - 68, 68, 74, 74, 74, 74, 74, 74, 74, 80, - 80, 80, 80, 80, 80, 80, 89, 89, 3299, 89, - 89, 89, 89, 158, 158, 3299, 3299, 3299, 158, 158, - 160, 160, 3299, 3299, 160, 3299, 160, 162, 3299, 3299, + 3290, 3288, 86, 3289, 3292, 86, 86, 3294, 86, 86, + 3298, 3295, 3299, 86, 86, 3291, 3293, 86, 3296, 86, + 3302, 3303, 86, 86, 3305, 86, 86, 3297, 3306, 86, + 3304, 86, 86, 3300, 86, 86, 3301, 3308, 3307, 3309, + 3312, 86, 3313, 86, 3314, 3310, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3311, 47, 47, 47, 47, 47, + 47, 47, 52, 52, 52, 52, 52, 52, 52, 57, + 57, 57, 57, 57, 57, 57, 63, 63, 63, 63, + 63, 63, 63, 68, 68, 68, 68, 68, 68, 68, + 74, 74, 74, 74, 74, 74, 74, 80, 80, 80, - 3299, 3299, 3299, 162, 165, 165, 3299, 3299, 3299, 165, - 165, 167, 3299, 3299, 3299, 3299, 3299, 167, 169, 169, - 3299, 169, 169, 169, 169, 172, 3299, 3299, 3299, 3299, - 3299, 172, 175, 175, 3299, 3299, 3299, 175, 175, 90, - 90, 3299, 90, 90, 90, 90, 17, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299 + 80, 80, 80, 80, 89, 89, 3314, 89, 89, 89, + 89, 158, 158, 3314, 3314, 3314, 158, 158, 160, 160, + 3314, 3314, 160, 3314, 160, 162, 3314, 3314, 3314, 3314, + 3314, 162, 165, 165, 3314, 3314, 3314, 165, 165, 167, + 3314, 3314, 3314, 3314, 3314, 167, 169, 169, 3314, 169, + 169, 169, 169, 172, 3314, 3314, 3314, 3314, 3314, 172, + 175, 175, 3314, 3314, 3314, 175, 175, 90, 90, 3314, + 90, 90, 90, 90, 17, 3314, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + + 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3314 } ; -static const flex_int16_t yy_chk[6488] = +static const flex_int16_t yy_chk[6516] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2235,30 +2245,30 @@ static const flex_int16_t yy_chk[6488] = 5, 3, 6, 24, 4, 24, 24, 5, 24, 6, 7, 7, 7, 7, 24, 7, 8, 8, 8, 8, 33, 8, 7, 9, 9, 9, 26, 26, 8, 10, - 10, 10, 19, 29, 9, 33, 19, 29, 3307, 35, + 10, 10, 19, 29, 9, 33, 19, 29, 3322, 35, 10, 11, 11, 11, 11, 11, 11, 13, 13, 13, 13, 34, 13, 11, 35, 99, 34, 29, 38, 13, 51, 51, 11, 12, 12, 12, 12, 12, 12, 14, 14, 14, 14, 99, 14, 12, 15, 15, 15, 38, 23, 14, 23, 23, 12, 23, 46, 15, 16, 16, - 16, 23, 23, 25, 27, 27, 25, 25, 2695, 16, + 16, 23, 23, 25, 27, 27, 25, 25, 2705, 16, 25, 46, 27, 30, 30, 25, 27, 56, 40, 27, 56, 73, 31, 31, 25, 28, 67, 67, 30, 32, 28, 31, 40, 32, 28, 73, 32, 28, 92, 28, - 28, 92, 31, 32, 1082, 32, 36, 36, 37, 37, - 28, 45, 45, 37, 175, 36, 45, 39, 41, 41, + 28, 92, 31, 32, 1279, 32, 36, 36, 37, 37, + 28, 45, 45, 37, 1279, 36, 45, 39, 41, 41, 45, 36, 39, 41, 94, 36, 39, 43, 43, 37, 43, 94, 39, 41, 41, 39, 41, 44, 42, 43, 87, 44, 39, 42, 87, 43, 42, 62, 95, 62, - 62, 44, 62, 42, 174, 44, 44, 42, 42, 70, + 62, 44, 62, 42, 1083, 44, 44, 42, 42, 70, 95, 70, 70, 72, 70, 72, 72, 79, 72, 79, 79, 70, 79, 84, 84, 86, 96, 86, 86, 89, 86, 89, 89, 93, 89, 97, 86, 93, 97, 98, 89, 89, 98, 100, 101, 102, 96, 103, 104, 105, 106, 102, 100, 107, 111, 98, 106, 102, 101, 102, - 108, 109, 112, 172, 110, 103, 103, 107, 105, 106, + 108, 109, 112, 175, 110, 103, 103, 107, 105, 106, 104, 114, 111, 113, 108, 110, 110, 113, 116, 115, 112, 109, 117, 110, 115, 117, 119, 118, 117, 120, @@ -2272,7 +2282,7 @@ static const flex_int16_t yy_chk[6488] = 149, 141, 148, 150, 147, 141, 146, 151, 152, 151, 153, 154, 157, 145, 155, 153, 145, 146, 151, 150, - 152, 149, 156, 154, 159, 159, 157, 156, 161, 167, + 152, 149, 156, 154, 159, 159, 157, 156, 161, 174, 151, 161, 155, 163, 171, 163, 163, 171, 163, 166, 166, 168, 179, 168, 168, 169, 168, 169, 169, 173, 169, 173, 173, 177, 173, 176, 176, 169, 177, 178, @@ -2304,7 +2314,7 @@ static const flex_int16_t yy_chk[6488] = 285, 288, 288, 279, 280, 283, 285, 290, 293, 286, 282, 281, 286, 287, 289, 287, 294, 289, 291, 291, - 292, 292, 165, 284, 293, 290, 295, 297, 296, 295, + 292, 292, 172, 284, 293, 290, 295, 297, 296, 295, 298, 294, 296, 300, 299, 301, 297, 303, 309, 298, 299, 301, 302, 303, 302, 304, 307, 300, 306, 304, 305, 305, 307, 306, 308, 310, 311, 315, 309, 316, @@ -2326,13 +2336,13 @@ static const flex_int16_t yy_chk[6488] = 375, 376, 371, 378, 401, 379, 367, 368, 368, 369, 368, 372, 370, 373, 379, 376, 375, 382, 378, 380, - 383, 384, 164, 368, 380, 380, 368, 388, 368, 381, + 383, 384, 167, 368, 380, 380, 368, 388, 368, 381, 368, 377, 385, 377, 377, 381, 384, 386, 382, 383, 389, 385, 381, 377, 390, 377, 377, 377, 387, 391, 377, 393, 392, 388, 387, 391, 386, 392, 390, 391, 389, 394, 395, 396, 397, 400, 398, 404, 396, 399, 399, 393, 398, 402, 403, 392, 408, 395, 405, 397, - 403, 394, 409, 406, 410, 400, 162, 402, 406, 411, + 403, 394, 409, 406, 410, 400, 165, 402, 406, 411, 407, 407, 404, 407, 405, 417, 408, 418, 409, 413, 410, 413, 413, 411, 414, 415, 416, 416, 414, 415, 419, 420, 418, 421, 417, 424, 422, 423, 541, 413, @@ -2348,13 +2358,13 @@ static const flex_int16_t yy_chk[6488] = 451, 450, 463, 457, 459, 459, 462, 462, 466, 464, 465, 458, 467, 469, 470, 471, 460, 464, 490, 465, - 472, 473, 490, 463, 467, 477, 160, 473, 466, 474, + 472, 473, 490, 463, 467, 477, 164, 473, 466, 474, 475, 469, 470, 469, 472, 471, 475, 476, 474, 477, 478, 479, 476, 480, 479, 481, 482, 483, 478, 485, 484, 478, 482, 484, 486, 485, 487, 480, 488, 491, 481, 487, 489, 492, 491, 493, 494, 483, 486, 495, 493, 496, 499, 485, 502, 501, 500, 504, 492, 501, - 488, 504, 494, 489, 496, 503, 158, 509, 495, 497, + 488, 504, 494, 489, 496, 503, 162, 509, 495, 497, 497, 500, 499, 502, 507, 497, 509, 497, 506, 507, 508, 503, 505, 497, 511, 497, 510, 505, 497, 497, 513, 505, 510, 506, 514, 497, 508, 510, 512, 508, @@ -2367,7 +2377,7 @@ static const flex_int16_t yy_chk[6488] = 539, 544, 544, 546, 534, 536, 545, 543, 547, 537, 540, 548, 545, 538, 547, 546, 549, 550, 551, 549, 552, 553, 542, 548, 553, 552, 554, 555, 557, 558, - 558, 550, 556, 551, 565, 554, 85, 556, 556, 559, + 558, 550, 556, 551, 565, 554, 160, 556, 556, 559, 559, 557, 554, 555, 560, 554, 561, 561, 562, 562, 560, 563, 566, 564, 569, 565, 568, 563, 564, 564, @@ -2414,7 +2424,7 @@ static const flex_int16_t yy_chk[6488] = 750, 751, 751, 751, 756, 751, 755, 757, 751, 760, 755, 757, 758, 751, 753, 759, 754, 758, 761, 751, - 751, 80, 762, 764, 760, 762, 763, 757, 756, 766, + 751, 158, 762, 764, 760, 762, 763, 757, 756, 766, 764, 763, 763, 767, 759, 765, 765, 769, 767, 768, 768, 771, 769, 761, 766, 770, 771, 774, 770, 772, 772, 773, 775, 773, 776, 777, 779, 778, 776, 774, @@ -2431,7 +2441,7 @@ static const flex_int16_t yy_chk[6488] = 828, 825, 825, 826, 826, 816, 829, 824, 830, 822, 833, 831, 833, 827, 831, 829, 834, 834, 835, 828, 836, 837, 831, 838, 839, 836, 840, 841, 842, 843, - 844, 845, 830, 75, 844, 846, 848, 842, 849, 835, + 844, 845, 830, 85, 844, 846, 848, 842, 849, 835, 847, 850, 837, 838, 839, 848, 847, 841, 840, 845, 849, 851, 843, 852, 846, 853, 854, 855, 855, 852, 850, 854, 856, 857, 858, 851, 859, 860, 861, 853, @@ -2442,504 +2452,508 @@ static const flex_int16_t yy_chk[6488] = 876, 876, 877, 874, 872, 879, 878, 873, 877, 878, 881, 880, 882, 883, 883, 873, 881, 884, 886, 891, 875, 885, 887, 879, 880, 888, 885, 887, 887, 889, - 890, 890, 882, 889, 886, 884, 892, 893, 894, 896, - 888, 891, 893, 901, 897, 900, 899, 903, 903, 904, - 906, 906, 905, 904, 907, 909, 892, 894, 897, 899, - 910, 74, 912, 896, 901, 900, 902, 905, 908, 902, + 890, 890, 882, 889, 886, 884, 886, 892, 893, 894, + 888, 891, 896, 893, 900, 897, 901, 899, 903, 903, + 904, 906, 906, 907, 904, 905, 80, 892, 894, 897, + 899, 908, 910, 919, 900, 908, 896, 901, 902, 911, - 909, 902, 908, 911, 910, 902, 912, 902, 911, 907, - 913, 914, 902, 915, 916, 913, 913, 902, 916, 917, - 914, 918, 922, 919, 920, 921, 918, 915, 923, 920, - 916, 924, 925, 932, 917, 919, 918, 933, 925, 921, - 924, 926, 923, 922, 927, 928, 926, 929, 929, 930, - 927, 928, 931, 934, 930, 932, 933, 936, 931, 937, - 938, 940, 940, 939, 937, 941, 944, 943, 942, 936, - 941, 934, 935, 935, 938, 939, 942, 945, 935, 946, - 935, 943, 947, 950, 948, 944, 935, 949, 947, 948, - 951, 935, 935, 952, 955, 946, 945, 959, 935, 949, + 905, 902, 909, 902, 911, 919, 910, 902, 907, 902, + 912, 915, 916, 914, 902, 913, 916, 909, 917, 902, + 913, 913, 914, 921, 912, 915, 918, 920, 916, 922, + 923, 918, 920, 917, 924, 926, 925, 921, 932, 927, + 926, 918, 925, 924, 923, 927, 928, 929, 929, 930, + 922, 931, 928, 933, 930, 934, 936, 931, 937, 939, + 932, 941, 938, 937, 940, 940, 941, 943, 936, 942, + 944, 939, 933, 934, 935, 935, 938, 942, 945, 946, + 935, 943, 935, 950, 947, 952, 948, 949, 935, 944, + 947, 948, 951, 935, 935, 946, 955, 945, 954, 949, - 954, 950, 953, 953, 954, 958, 951, 957, 958, 961, - 960, 952, 962, 957, 955, 960, 959, 964, 962, 963, - 966, 967, 961, 968, 963, 969, 970, 971, 972, 966, - 967, 969, 973, 972, 974, 970, 964, 975, 976, 968, - 977, 979, 978, 980, 985, 983, 971, 979, 974, 977, - 976, 978, 973, 981, 986, 988, 987, 975, 985, 981, - 980, 983, 989, 990, 996, 991, 992, 995, 999, 988, - 991, 992, 995, 996, 986, 987, 997, 997, 990, 998, - 989, 999, 1001, 1002, 1007, 998, 1004, 1004, 1002, 1002, - 1004, 1005, 1006, 1008, 1005, 1009, 1011, 1010, 1001, 1012, + 935, 950, 954, 952, 953, 953, 957, 958, 951, 959, + 958, 961, 957, 960, 962, 964, 955, 963, 960, 968, + 962, 966, 963, 967, 961, 969, 971, 970, 959, 973, + 966, 969, 967, 972, 964, 968, 970, 974, 972, 975, + 976, 977, 979, 980, 978, 971, 983, 986, 979, 973, + 977, 974, 976, 978, 985, 981, 987, 988, 989, 975, + 980, 981, 983, 990, 991, 992, 75, 986, 985, 991, + 992, 988, 995, 996, 1001, 987, 989, 995, 990, 997, + 997, 998, 996, 999, 1004, 1004, 1002, 998, 1004, 1006, + 1001, 1002, 1002, 1007, 1005, 1008, 999, 1005, 1009, 1010, - 1013, 1014, 1015, 1016, 1007, 1012, 1006, 1014, 1016, 1008, - 1010, 1011, 1017, 1009, 1020, 1019, 1021, 1015, 1019, 1022, - 1013, 1021, 1023, 1024, 1022, 1025, 1017, 1026, 1024, 1029, - 1025, 1028, 1032, 1032, 1030, 1020, 1031, 1028, 1023, 1026, - 1030, 1033, 1031, 1034, 1035, 1029, 1037, 1035, 1036, 1036, - 1033, 1038, 1039, 1040, 1041, 1044, 1040, 1042, 1049, 1043, - 1044, 1034, 1050, 1042, 1037, 1043, 1045, 1041, 1046, 1047, - 1038, 1045, 1039, 1046, 1051, 1047, 1049, 1054, 1052, 1055, - 1051, 1056, 1050, 1052, 1053, 1053, 1054, 1057, 1055, 1058, - 1059, 1060, 1058, 1059, 1061, 1062, 1063, 1064, 1065, 1056, + 1011, 1012, 1013, 1006, 1014, 1015, 1020, 1012, 74, 1016, + 1014, 1008, 1010, 1007, 1016, 1011, 1009, 1017, 1019, 1021, + 1015, 1019, 1013, 1022, 1021, 1023, 1026, 1020, 1022, 1024, + 1025, 1017, 1029, 1028, 1024, 1025, 1030, 1031, 1026, 1028, + 1033, 1023, 1030, 1031, 1032, 1032, 1034, 1035, 1029, 1033, + 1035, 1036, 1036, 1037, 1038, 1039, 1040, 1041, 1044, 1040, + 1042, 1043, 1047, 1044, 1034, 1049, 1042, 1043, 1047, 1045, + 1041, 1037, 1046, 1038, 1045, 1039, 1050, 1046, 1051, 1054, + 1052, 1053, 1053, 1049, 1051, 1052, 1055, 1056, 1054, 1057, + 1058, 1059, 1060, 1058, 1059, 1055, 1050, 1061, 1062, 1063, - 1067, 1066, 1060, 1064, 1065, 1067, 1057, 1062, 1068, 1068, - 1069, 1070, 1061, 1072, 1071, 1063, 1066, 1072, 1073, 1074, - 1075, 1076, 1078, 1079, 1079, 1070, 1071, 1080, 1074, 1069, - 1081, 1083, 1080, 1084, 1087, 1085, 1073, 1086, 1089, 1075, - 1092, 1078, 1086, 1087, 68, 1083, 1076, 1085, 1084, 1090, - 1081, 1088, 1088, 1091, 1096, 1090, 1092, 1093, 1089, 1091, - 1095, 1094, 1093, 1094, 1097, 1095, 1098, 1099, 1096, 1100, - 1101, 1098, 1102, 1103, 1105, 1105, 1106, 1101, 1097, 1107, - 1108, 1110, 1099, 1109, 1114, 1114, 1111, 1102, 1100, 1109, - 1106, 1111, 1103, 1121, 1113, 1108, 1117, 1107, 1113, 1115, + 1064, 1065, 1066, 1060, 1067, 1056, 1064, 1065, 1057, 1067, + 1062, 1068, 1068, 1069, 1070, 1061, 1072, 1066, 1063, 1071, + 1072, 1073, 1075, 1076, 1074, 1078, 1079, 1079, 1070, 1080, + 1081, 1071, 1069, 1074, 1080, 1081, 1082, 1084, 1085, 1073, + 1086, 1075, 1087, 1090, 1078, 1088, 1093, 1087, 1076, 1089, + 1089, 1084, 1086, 1085, 1088, 1091, 1082, 1095, 1092, 1095, + 1094, 1091, 1093, 1090, 1092, 1094, 1096, 1097, 1098, 1099, + 1100, 1096, 1101, 1102, 1099, 1103, 1104, 1106, 1106, 1107, + 1102, 1097, 1098, 1108, 1109, 1100, 1110, 1111, 1119, 1112, + 1103, 1101, 1110, 1107, 1112, 1104, 1114, 1115, 1115, 1109, - 1111, 1110, 1111, 1117, 1115, 1111, 1116, 1116, 1118, 1119, - 1120, 1121, 1119, 1123, 1122, 1124, 1125, 1127, 1123, 1126, - 1129, 1128, 1118, 1122, 1126, 1131, 1131, 1134, 1125, 1120, - 1132, 1127, 1128, 1133, 1124, 1132, 1135, 1137, 1133, 1129, - 1136, 1135, 1138, 1139, 1136, 1140, 1137, 1134, 1141, 1143, - 1142, 1144, 1145, 1146, 1147, 1148, 1143, 1138, 1139, 1150, - 1141, 1148, 1149, 1144, 1140, 1142, 1151, 1152, 1153, 1154, - 1155, 1145, 1147, 1156, 1146, 1157, 1152, 1149, 1158, 1150, - 1162, 1159, 1155, 1153, 1161, 1163, 1151, 1165, 1154, 1164, - 1161, 1167, 1156, 1158, 1166, 1162, 1167, 1164, 1169, 1163, + 1114, 1108, 1119, 1112, 1116, 1112, 1118, 1111, 1112, 1116, + 1117, 1117, 1120, 1118, 1121, 1120, 1122, 1123, 1124, 1125, + 1126, 1128, 1127, 1124, 1130, 1129, 1123, 1127, 1132, 1132, + 1135, 68, 1126, 1121, 1122, 1128, 1129, 1133, 1125, 1134, + 1136, 1139, 1133, 1130, 1134, 1136, 1138, 1137, 1140, 1141, + 1135, 1137, 1142, 1144, 1143, 1138, 1139, 1146, 1145, 1147, + 1144, 1148, 1150, 1140, 1142, 1149, 1151, 1152, 1141, 1143, + 1145, 1149, 1153, 1154, 1155, 1157, 1146, 1150, 1156, 1148, + 1147, 1153, 1158, 1159, 1160, 1162, 1151, 1152, 1154, 1164, + 1156, 1162, 1165, 1155, 1157, 1163, 1166, 1167, 1159, 1169, - 1157, 1159, 1168, 1169, 1169, 1170, 1171, 1165, 1172, 1175, - 1166, 1173, 1173, 1177, 1168, 1178, 1178, 63, 1176, 1177, - 1171, 1172, 1175, 1179, 1170, 1174, 1174, 1176, 1179, 1181, - 1174, 1180, 1182, 1174, 1174, 1181, 1183, 1182, 1174, 1185, - 1180, 1183, 1184, 1184, 1174, 1186, 1186, 1187, 1174, 1188, - 1187, 1192, 1187, 1189, 1190, 1191, 1192, 1207, 1193, 1194, - 1185, 1195, 1196, 1190, 58, 1197, 1207, 1195, 1196, 1188, - 1197, 1189, 1193, 1199, 1198, 1191, 1210, 1194, 1198, 1200, - 1200, 1202, 1199, 1201, 1201, 1205, 1201, 1199, 1206, 1199, - 1204, 1199, 1202, 1199, 1204, 1209, 1208, 1212, 1210, 1214, + 1165, 1168, 1171, 1164, 1160, 1172, 1168, 1158, 1359, 1170, + 1163, 1169, 1173, 1167, 1170, 1170, 1166, 1174, 1174, 1172, + 1176, 1171, 1178, 1177, 1359, 1173, 1175, 1175, 1178, 1179, + 1179, 1175, 1177, 1176, 1175, 1175, 1180, 1181, 1182, 1175, + 1186, 1180, 1183, 1184, 1182, 1175, 1181, 1183, 1184, 1175, + 1185, 1185, 1187, 1187, 1188, 1189, 1190, 1188, 1191, 1188, + 1192, 1186, 1194, 1193, 1195, 1196, 1197, 1191, 1193, 63, + 1200, 1196, 1197, 1198, 1190, 1189, 1194, 1199, 1198, 1200, + 1192, 1199, 1195, 1207, 1200, 1205, 1200, 1203, 1200, 1205, + 1200, 1201, 1201, 1202, 1202, 1206, 1202, 1208, 1203, 1209, - 1205, 1208, 1208, 1211, 1209, 1213, 1206, 1215, 1211, 1216, - 1217, 1212, 1218, 1218, 1213, 1220, 1217, 1219, 1214, 1221, - 1222, 1223, 1224, 1216, 1221, 1219, 1215, 1225, 1226, 1220, - 1223, 1227, 1227, 1226, 1222, 1228, 1229, 1229, 1233, 1230, - 1224, 1230, 1232, 1233, 1234, 1232, 1235, 1236, 1236, 1237, - 1228, 1241, 1225, 1238, 1238, 1235, 1239, 1239, 1242, 1240, - 1243, 1243, 1244, 1234, 1240, 1245, 1246, 1248, 1245, 1237, - 1247, 1249, 1241, 1249, 1250, 1247, 1248, 1252, 1253, 1242, - 1252, 1255, 1244, 1254, 1256, 1262, 1246, 57, 1254, 1256, - 1257, 1258, 1250, 1253, 1259, 1255, 1258, 1261, 1257, 1259, + 1210, 1207, 1211, 1212, 1209, 1209, 1208, 1213, 1212, 1210, + 1206, 1214, 1215, 1216, 1217, 1220, 1218, 1219, 1219, 1221, + 1214, 1213, 1218, 1220, 1211, 1222, 1223, 1224, 1217, 1225, + 1222, 1215, 1216, 1221, 1226, 1229, 1224, 1227, 1228, 1228, + 1223, 1235, 1227, 1230, 1230, 1236, 1231, 1225, 1231, 1233, + 1229, 1234, 1233, 1238, 1236, 1242, 1234, 1237, 1237, 1226, + 1235, 1239, 1239, 1240, 1240, 1241, 1243, 1244, 1244, 1245, + 1241, 1246, 1247, 1238, 1246, 1248, 1242, 1249, 1251, 1250, + 1248, 1250, 1253, 1254, 58, 1253, 1249, 1243, 1255, 1245, + 1256, 1263, 1247, 1255, 1257, 1258, 1251, 1259, 1254, 1257, - 1260, 1260, 1261, 1262, 1263, 1264, 1265, 1267, 1268, 1270, - 1263, 1269, 1264, 1267, 1268, 1270, 1269, 1271, 1272, 1265, - 1273, 1274, 1274, 1275, 1277, 1278, 1271, 1279, 1280, 1281, - 1282, 1273, 1283, 1285, 1286, 1281, 1282, 1272, 1283, 1285, - 1278, 1287, 1277, 1275, 1288, 1289, 1290, 1279, 1286, 1291, - 1293, 1280, 1292, 1292, 1286, 1294, 1295, 1289, 1296, 1298, - 1290, 1287, 1301, 1296, 1288, 1297, 1297, 1291, 1299, 1303, - 1293, 1302, 52, 1299, 1295, 1304, 1302, 1302, 1305, 1306, - 1294, 1301, 1298, 1307, 1304, 1308, 1305, 1303, 1315, 1309, - 1310, 1312, 1315, 1306, 1309, 1314, 1316, 1309, 1307, 1310, + 1260, 1266, 1259, 1258, 1256, 1260, 1261, 1261, 1262, 1263, + 1264, 1265, 1276, 1262, 1266, 1268, 1264, 1269, 1265, 1270, + 1271, 1268, 1272, 1269, 1270, 1273, 1271, 1274, 1275, 1275, + 1278, 1272, 1276, 1281, 1280, 1282, 1283, 1284, 1274, 1285, + 1287, 1288, 1283, 1284, 1273, 1285, 1287, 1289, 1278, 1280, + 1290, 1291, 1292, 1281, 1293, 1288, 1294, 1294, 1282, 1295, + 1296, 1288, 1297, 1291, 1298, 1300, 1292, 1289, 1303, 1298, + 1290, 1301, 1293, 1299, 1299, 1305, 1301, 1304, 1307, 1295, + 1297, 1306, 1304, 1304, 1308, 1296, 1307, 1303, 1300, 1309, + 1306, 1310, 1311, 1305, 1312, 1320, 1314, 1311, 1308, 1313, - 1308, 1314, 1311, 1308, 1311, 1312, 1317, 1316, 1318, 1319, - 1320, 1317, 1317, 1321, 1322, 1323, 1324, 1325, 1321, 1322, - 1326, 1329, 1325, 1328, 1330, 1331, 1331, 1318, 1320, 1333, - 1332, 1334, 1335, 1323, 1332, 1319, 1324, 1328, 1335, 1329, - 1326, 1336, 1330, 1337, 1338, 1339, 1340, 1333, 1341, 1342, - 1334, 1344, 1343, 1336, 1342, 1345, 1344, 1346, 1338, 1343, - 1339, 1340, 1337, 1347, 1347, 1348, 1346, 1341, 1349, 1350, - 1351, 1351, 1352, 1345, 1354, 1353, 1357, 1349, 1352, 1356, - 1348, 1353, 1355, 1355, 1358, 1356, 1359, 1360, 1354, 1350, - 1361, 1359, 1357, 1360, 1362, 1367, 1361, 1363, 1363, 1367, + 1311, 1313, 1316, 1312, 1309, 1318, 1310, 1317, 1316, 1310, + 1314, 1317, 1319, 1321, 1320, 1322, 1318, 1319, 1319, 1323, + 1324, 1326, 1325, 1327, 1323, 1324, 1328, 1331, 1327, 1330, + 1332, 1333, 1333, 1322, 1334, 1335, 1336, 1338, 1334, 1321, + 1325, 1326, 1339, 1330, 1337, 1331, 1328, 1341, 1332, 1338, + 1337, 1340, 1342, 1335, 1343, 1336, 1347, 1345, 1344, 1348, + 1350, 1339, 1341, 1344, 1345, 1340, 1346, 1342, 1348, 1349, + 1349, 1346, 1351, 1343, 1347, 1350, 1352, 1353, 1353, 1354, + 1355, 1351, 1360, 1356, 1358, 1354, 1355, 1357, 1357, 1361, + 1358, 1370, 1362, 1363, 1361, 1364, 1352, 1356, 1362, 1363, - 1362, 1364, 1364, 1366, 1366, 1358, 1368, 1369, 1370, 1371, - 1373, 1372, 1374, 1374, 1375, 1368, 1376, 1373, 1378, 1379, - 1370, 1382, 1377, 1371, 1376, 1369, 1372, 1377, 1383, 1383, - 1380, 1384, 1378, 1385, 1375, 1380, 1380, 1381, 1379, 1386, - 1387, 1382, 1381, 1381, 1388, 1387, 1389, 1390, 1386, 1391, - 1384, 1392, 1385, 1393, 1394, 1391, 1392, 1395, 1396, 1398, - 1394, 1397, 1399, 1388, 1396, 1390, 1389, 1397, 1400, 1401, - 1402, 1403, 1405, 1405, 1404, 47, 1395, 1406, 1398, 1393, - 1406, 1399, 1407, 1412, 1402, 1408, 1408, 1400, 1401, 1404, - 1409, 1409, 1403, 1410, 1407, 1411, 1412, 1413, 1410, 1411, + 1370, 1364, 1371, 1360, 1365, 1365, 1366, 1366, 1368, 1368, + 1369, 1372, 1373, 1374, 1369, 1375, 1376, 1376, 1377, 1378, + 1371, 1380, 1375, 1372, 1379, 1381, 1373, 1378, 1374, 1379, + 1384, 1382, 1385, 1385, 1383, 1380, 1382, 1382, 1377, 1383, + 1383, 1386, 1387, 1388, 1381, 1390, 1389, 1391, 1392, 1393, + 1384, 1389, 1388, 1394, 1395, 1393, 1396, 1397, 1394, 1398, + 1386, 1387, 1396, 1399, 1390, 1398, 1392, 1391, 1400, 1399, + 1401, 1402, 1403, 1405, 1404, 1585, 1397, 1406, 1407, 1407, + 1395, 1408, 1585, 1409, 1408, 1410, 1410, 1400, 1404, 1401, + 1402, 1403, 1406, 1412, 1405, 1409, 1411, 1411, 1412, 1413, - 1414, 1415, 1419, 1415, 1417, 1418, 1413, 1415, 1420, 1421, - 1418, 1422, 1422, 1414, 1423, 1424, 1425, 1419, 1430, 1423, - 1415, 1424, 1417, 1426, 1427, 1421, 1428, 1431, 1420, 1427, - 1428, 1425, 1432, 1429, 1433, 1436, 1426, 1429, 1430, 1438, - 1433, 1434, 1434, 1439, 1441, 1431, 1440, 1440, 1439, 1442, - 1441, 1448, 1432, 1436, 1444, 1444, 1446, 1447, 1447, 1446, - 1438, 1449, 1451, 1452, 1453, 1451, 1455, 1448, 1456, 1442, - 1454, 1454, 1457, 1453, 1458, 1462, 1459, 1449, 1461, 1458, - 1463, 1455, 1464, 1452, 1460, 1460, 1466, 1461, 1467, 1456, - 1459, 1457, 1472, 1462, 1468, 1463, 1465, 1465, 1469, 1468, + 1414, 1415, 1416, 1413, 1419, 1417, 1421, 1417, 1422, 1420, + 1415, 1417, 1427, 1414, 1420, 1416, 1423, 1424, 1424, 57, + 1425, 1421, 1419, 1426, 1417, 1425, 1428, 1427, 1422, 1426, + 1429, 1432, 1423, 1430, 1431, 1429, 1433, 1430, 1431, 1428, + 1434, 1435, 1436, 1436, 1438, 1440, 1443, 1435, 1441, 1442, + 1442, 1432, 1443, 1441, 1433, 1444, 1446, 1446, 1448, 1454, + 1434, 1448, 1438, 1449, 1449, 1450, 1440, 1451, 1453, 1455, + 1457, 1453, 1456, 1456, 1458, 1444, 1461, 1459, 1455, 1454, + 1464, 1450, 1460, 1451, 1463, 1457, 1465, 1460, 1462, 1462, + 1461, 1466, 1468, 1463, 1469, 1458, 1459, 1470, 1464, 1467, - 1466, 1470, 1470, 1474, 1471, 1475, 1467, 1464, 1471, 1473, - 1473, 1476, 1472, 1469, 1477, 1476, 1475, 1478, 1480, 1480, - 1482, 1481, 1478, 1483, 1484, 1474, 1485, 1487, 1486, 1488, - 1488, 1490, 1489, 1477, 1481, 1491, 1482, 1489, 1484, 1492, - 1492, 1483, 1486, 1494, 1493, 1485, 1485, 1495, 1494, 1499, - 18, 1490, 1487, 1493, 1496, 1491, 1496, 1497, 1498, 1500, - 1502, 1504, 1497, 1507, 1498, 1500, 1505, 1495, 1507, 1499, - 1503, 1503, 1505, 1508, 1502, 1509, 1509, 1510, 1510, 1511, - 1504, 1512, 1514, 1513, 1516, 1514, 1515, 1515, 1517, 1518, - 1520, 1522, 1526, 1511, 1522, 1537, 1520, 1508, 1513, 1512, + 1467, 1465, 1470, 1471, 1472, 1472, 1468, 1473, 1474, 1475, + 1475, 1473, 1469, 1476, 1477, 1478, 1466, 1479, 1471, 1478, + 1483, 1480, 1482, 1482, 1484, 1477, 1480, 1485, 1474, 1484, + 1486, 1487, 1488, 1483, 1490, 1476, 1479, 1491, 1491, 1489, + 1493, 1492, 1494, 1485, 1498, 1487, 1492, 1496, 1486, 1495, + 1495, 1488, 1488, 1489, 1502, 1499, 1496, 1499, 1497, 1490, + 1493, 1500, 1494, 1497, 1498, 1501, 1500, 1503, 1505, 1506, + 1506, 1501, 1507, 1503, 1502, 1508, 1511, 1515, 1510, 1512, + 1512, 1508, 1505, 1510, 1513, 1513, 1517, 1514, 1516, 1517, + 1519, 1507, 1518, 1518, 1520, 1515, 1521, 1529, 1523, 1522, - 1517, 1519, 1516, 1521, 1519, 1524, 1525, 1519, 1521, 1518, - 1522, 1525, 1527, 1537, 1524, 1527, 1529, 1526, 1530, 1519, - 1528, 1528, 1529, 1531, 1530, 1532, 1532, 1534, 1531, 1533, - 1533, 1535, 1536, 1534, 1538, 1539, 1535, 1540, 1541, 1545, - 1540, 1542, 1549, 1543, 1541, 1536, 1544, 1542, 1543, 1546, - 1547, 1547, 1544, 1538, 1546, 1539, 1548, 1550, 1551, 1552, - 1549, 1548, 1545, 1555, 1556, 1553, 1554, 1557, 1558, 1559, - 1558, 1557, 1561, 1552, 1562, 17, 1565, 1550, 1551, 1553, - 1554, 1555, 1563, 1566, 1561, 1564, 1562, 1567, 1559, 1556, - 1568, 1564, 1569, 1571, 1571, 1563, 1565, 1572, 1573, 1566, + 1511, 1514, 1522, 1516, 1523, 1522, 1520, 1524, 1519, 1527, + 1525, 52, 1524, 1525, 1528, 1532, 1521, 1522, 1527, 1528, + 1530, 1532, 1529, 1530, 1531, 1531, 1533, 1539, 1534, 1525, + 1535, 1535, 1533, 1534, 1536, 1536, 1537, 1540, 1538, 1541, + 1539, 1542, 1537, 1538, 1543, 1544, 1545, 1543, 1546, 1548, + 1547, 1544, 1545, 1546, 1549, 1540, 1547, 1552, 1541, 1549, + 1551, 1542, 1550, 1550, 1553, 1551, 1554, 1555, 1556, 1557, + 1558, 1559, 1548, 1560, 1561, 1552, 1561, 1560, 1562, 1564, + 1565, 1555, 1556, 1557, 1553, 1566, 1554, 1567, 1558, 1568, + 1569, 1564, 1565, 1567, 1570, 1572, 1559, 1562, 1566, 1571, - 1574, 1575, 1575, 1573, 1568, 1576, 1578, 1567, 1577, 1579, - 1580, 1581, 1574, 1569, 1582, 1584, 1583, 1572, 1586, 1580, - 1576, 1582, 1577, 1588, 1593, 1583, 1581, 1579, 1583, 1589, - 1578, 1584, 1589, 1586, 1590, 1590, 1591, 1591, 1586, 1592, - 1594, 1596, 1593, 1594, 1595, 1595, 1597, 1598, 1588, 1600, - 1599, 1592, 1598, 1601, 1596, 1599, 1603, 1602, 1604, 1607, - 1607, 1608, 1605, 1609, 1610, 1597, 1602, 1604, 1600, 1601, - 1604, 1605, 1606, 1611, 1612, 1603, 1609, 1613, 1606, 1616, - 1617, 1608, 1610, 1618, 1618, 1619, 1620, 1611, 1621, 1613, - 1612, 1622, 1622, 1621, 1624, 1620, 1623, 1625, 1617, 1624, + 1574, 1574, 1575, 1576, 1579, 1577, 1569, 1580, 1576, 1568, + 1578, 1578, 1581, 1571, 1570, 1582, 1572, 1577, 1583, 1579, + 1584, 1580, 1575, 1587, 1591, 1586, 1589, 1583, 1592, 1593, + 1593, 1592, 1595, 1582, 1586, 1584, 1581, 1586, 1596, 1587, + 1599, 1589, 1594, 1594, 1595, 1597, 1589, 1600, 1597, 1591, + 1598, 1598, 1601, 1599, 1602, 1603, 1596, 1601, 1605, 1602, + 1604, 1606, 1608, 1607, 1609, 1611, 1600, 1605, 1610, 1610, + 1609, 1608, 1607, 1612, 1603, 1607, 1604, 1613, 1614, 1616, + 1606, 1615, 1619, 1620, 1622, 1611, 1612, 1621, 1621, 1623, + 47, 1616, 1614, 1628, 1624, 1613, 1626, 1615, 1623, 1624, - 1626, 1619, 1627, 1630, 1616, 1623, 1622, 1628, 1623, 1631, - 1632, 1633, 1628, 1628, 0, 1625, 1633, 1630, 1635, 1634, - 1627, 1626, 1636, 1636, 1631, 1634, 1638, 1637, 1639, 1640, - 1642, 1638, 1632, 1637, 1639, 1640, 1635, 1643, 1644, 1645, - 1646, 1647, 1651, 1646, 1644, 1649, 1652, 1647, 1653, 1646, - 1642, 1643, 1645, 1649, 1654, 1655, 1653, 1656, 1657, 1658, - 1664, 1651, 1666, 1654, 1665, 1652, 1659, 1659, 1655, 1660, - 1656, 1661, 1657, 1658, 1662, 1660, 1667, 1661, 1663, 1663, - 1664, 1666, 1665, 1669, 1668, 1670, 1671, 1662, 1659, 1667, - 1668, 1673, 1673, 1674, 1675, 1676, 1680, 1677, 1675, 1683, + 1622, 1620, 1625, 1625, 1627, 1626, 1629, 1619, 1626, 1627, + 1630, 1628, 1633, 1631, 1634, 1635, 1636, 1625, 1631, 1631, + 1638, 1636, 1639, 1639, 1637, 1640, 1633, 1629, 1630, 1634, + 1637, 1640, 1645, 1646, 1641, 1642, 1643, 1635, 1638, 1641, + 1647, 1642, 1643, 1648, 1650, 1649, 1647, 1646, 1649, 1652, + 1650, 1654, 1645, 1655, 1649, 1656, 1648, 1652, 1657, 18, + 1658, 1659, 1660, 1656, 1661, 1662, 1662, 1657, 1665, 1663, + 1654, 1664, 1655, 1658, 1659, 1663, 1660, 1664, 1661, 1666, + 1666, 1665, 1667, 1668, 1669, 1670, 1671, 1662, 1672, 1673, + 1674, 1677, 1671, 1676, 1676, 1678, 1683, 1682, 1670, 1678, - 1676, 1670, 1677, 1678, 1671, 1669, 1679, 1682, 1678, 1684, - 1686, 1683, 1688, 1674, 1687, 1679, 1682, 1685, 1685, 1680, - 1689, 1689, 1690, 1691, 1684, 1692, 1687, 1693, 1695, 1686, - 1691, 1688, 1696, 1698, 1697, 1699, 1690, 1692, 1700, 1693, - 1697, 1701, 1701, 1702, 1700, 1698, 1702, 1695, 1703, 1703, - 1705, 1706, 1696, 1699, 1709, 1705, 1707, 1708, 1708, 1710, - 1706, 1710, 1707, 1712, 1711, 1713, 1709, 1711, 1714, 1716, - 1715, 1717, 1718, 1719, 1716, 1720, 1717, 1721, 1723, 1724, - 1722, 1718, 1721, 1712, 1724, 1719, 1714, 1713, 1715, 1722, - 1720, 1724, 1725, 1726, 1727, 1727, 1729, 1725, 1723, 1728, + 17, 1668, 1667, 1669, 1679, 1673, 1682, 1680, 1674, 1679, + 1672, 1677, 1680, 1681, 1685, 1687, 1688, 1686, 1681, 1683, + 1686, 1689, 1689, 1685, 1690, 1691, 1692, 1687, 1693, 1693, + 1694, 1688, 1695, 1699, 1696, 1697, 1700, 1691, 1702, 1695, + 1703, 0, 1701, 1690, 1694, 1692, 1696, 1697, 1701, 1704, + 1702, 0, 1699, 1705, 1705, 1704, 1700, 1706, 1703, 1709, + 1706, 1707, 1707, 1710, 1709, 1711, 1712, 1712, 1713, 1716, + 1717, 1711, 1710, 1714, 1715, 1714, 1718, 1715, 1719, 1720, + 1713, 1721, 1722, 1723, 1720, 1724, 1721, 1727, 1725, 1716, + 1726, 1722, 1717, 1725, 1718, 1723, 1719, 1728, 1729, 1726, - 1731, 1732, 1722, 1734, 1733, 1728, 0, 1735, 1726, 1735, - 1736, 1737, 1737, 1738, 1738, 1739, 1739, 1729, 1740, 1731, - 1733, 1732, 1743, 1734, 1736, 1744, 1736, 1741, 1741, 1742, - 1742, 1745, 1745, 1746, 1747, 1750, 1748, 1746, 1740, 1748, - 1747, 1750, 1751, 1743, 1752, 1753, 1744, 1756, 1754, 1757, - 1752, 1754, 1755, 1755, 1757, 1758, 1758, 1759, 1760, 1761, - 1751, 1762, 1762, 1763, 1761, 1764, 1766, 1756, 1763, 1765, - 1753, 1764, 1759, 1767, 1768, 1770, 1773, 1821, 1769, 1760, - 1821, 1765, 1765, 1765, 1769, 1774, 1766, 1772, 1765, 1777, - 1773, 1767, 1772, 1772, 1768, 1770, 1775, 1776, 1775, 1778, + 1724, 1730, 1728, 1729, 1731, 1731, 1733, 1727, 1732, 1728, + 1735, 1736, 1726, 1747, 1732, 1738, 1730, 1737, 1739, 1755, + 1739, 1744, 1740, 1741, 1741, 1742, 1742, 1733, 1748, 1735, + 0, 1736, 1757, 1737, 1747, 1738, 1740, 1755, 1740, 1743, + 1743, 1744, 1745, 1745, 1746, 1746, 1749, 1749, 1750, 1748, + 1751, 1752, 1750, 1754, 1752, 1756, 1751, 1757, 1760, 1754, + 1758, 1756, 1761, 1758, 1759, 1759, 1763, 1761, 1762, 1762, + 1764, 1765, 1766, 1766, 1767, 1769, 1765, 1768, 1760, 1767, + 1770, 1763, 1777, 1768, 1771, 1772, 1773, 1769, 1769, 1769, + 1774, 1764, 1773, 1776, 1769, 1780, 1777, 1778, 1776, 1776, - 1774, 1779, 1780, 1781, 1777, 1778, 1782, 1782, 1776, 1783, - 1779, 1784, 1784, 1785, 1786, 1787, 1787, 1788, 1788, 1789, - 1792, 1792, 1780, 1793, 1781, 1794, 1797, 1801, 1796, 1799, - 1799, 1800, 1798, 1785, 1794, 1783, 1786, 1796, 1798, 1789, - 1803, 1804, 1801, 1802, 1805, 1805, 1806, 1797, 1793, 1803, - 1802, 1809, 1800, 1807, 1810, 1811, 1809, 1812, 1816, 1813, - 1810, 1818, 1814, 1816, 1812, 1813, 1819, 1804, 1814, 1807, - 1815, 1815, 1806, 1817, 1820, 1811, 1822, 1823, 1824, 1824, - 1827, 1818, 1817, 1825, 1826, 1819, 1820, 1828, 1829, 1825, - 1826, 1831, 1829, 1832, 1822, 1835, 1833, 1834, 1834, 1838, + 1770, 1779, 1771, 1779, 1781, 1772, 1780, 1782, 1783, 1784, + 1774, 1785, 1778, 1782, 1786, 1786, 1787, 1783, 1789, 1781, + 1788, 1788, 1790, 1791, 1791, 1792, 1792, 1793, 1797, 1784, + 1796, 1796, 1785, 1801, 1798, 1802, 1800, 1804, 1789, 1803, + 1803, 1802, 1787, 1798, 1790, 1800, 1805, 1793, 1806, 1808, + 1807, 1809, 1809, 1797, 1801, 1806, 1810, 1811, 1804, 1807, + 1813, 1805, 1814, 1815, 1816, 1813, 1817, 1822, 1814, 1820, + 1818, 1816, 1817, 1811, 1820, 1808, 1818, 1819, 1819, 1821, + 1823, 1824, 1810, 1815, 1826, 1827, 1825, 1822, 1821, 1825, + 1828, 1828, 1829, 1824, 1830, 1831, 1835, 1832, 1829, 1823, - 1827, 1833, 1828, 1823, 1836, 1839, 1840, 1841, 1829, 1839, - 1846, 1831, 1840, 1843, 1835, 1832, 1841, 1843, 1838, 1836, - 1842, 1842, 1844, 1845, 1845, 1847, 1848, 1849, 1850, 1851, - 1852, 1846, 1849, 1844, 1861, 1853, 1852, 1854, 1844, 1847, - 1855, 1855, 1854, 1856, 1856, 1848, 1859, 1857, 1850, 1851, - 1853, 1857, 1860, 1868, 1861, 1859, 1862, 1862, 1864, 1864, - 1865, 1866, 1878, 1860, 1867, 1865, 1865, 1866, 1860, 1869, - 1867, 1870, 1871, 1873, 1869, 1875, 1874, 1876, 1871, 1868, - 1874, 1880, 1877, 1870, 1878, 1873, 1879, 1875, 1877, 1881, - 1885, 1882, 1879, 1884, 1881, 1888, 1886, 1892, 1888, 1895, + 1830, 1833, 1826, 1836, 1837, 1833, 1838, 1838, 1839, 1837, + 1842, 1827, 1832, 1840, 1843, 1831, 1835, 1844, 1843, 1846, + 1846, 1833, 1845, 1844, 1848, 1836, 1847, 1839, 1840, 1842, + 1847, 1845, 1849, 1849, 1850, 1848, 1851, 1852, 1853, 1854, + 1848, 1855, 1856, 1853, 1858, 1857, 1859, 1859, 1856, 1858, + 1851, 1860, 1860, 1861, 1863, 1850, 1852, 1861, 1864, 1854, + 1857, 1855, 1865, 1863, 1866, 1866, 1868, 1868, 1872, 1864, + 1869, 1870, 1871, 1874, 1864, 1869, 1869, 1870, 1871, 1873, + 1875, 1877, 1865, 1878, 1873, 1874, 1875, 1878, 1879, 1880, + 1881, 1882, 1883, 1877, 1872, 1885, 1881, 1884, 1883, 1886, - 1880, 1886, 1876, 1882, 1895, 1884, 1889, 1889, 1893, 1885, - 1890, 1890, 1891, 1891, 1893, 1894, 1896, 1892, 1897, 1899, - 1901, 1894, 1896, 1901, 1899, 1902, 1905, 1897, 1903, 1903, - 1906, 1907, 1908, 1908, 1909, 1910, 1907, 1902, 1905, 1911, - 1910, 1914, 1906, 1909, 1911, 1912, 1913, 1913, 1912, 1915, - 1916, 1917, 1918, 1921, 1919, 1922, 1918, 1920, 1915, 1919, - 1923, 1914, 1924, 1920, 1922, 1926, 1926, 1927, 1916, 1933, - 1917, 1921, 1928, 1929, 1929, 1931, 1924, 1926, 1923, 1930, - 1930, 1928, 1932, 1934, 1931, 1927, 1935, 1941, 1934, 1942, - 1933, 1938, 1938, 1940, 1932, 1944, 1940, 1945, 1946, 1935, + 1879, 1890, 1891, 0, 1886, 1887, 1889, 1891, 1893, 1894, + 1894, 1893, 1897, 1882, 1880, 1885, 1884, 1887, 1889, 1898, + 1890, 1895, 1895, 1896, 1896, 1898, 1900, 1899, 1901, 1902, + 1904, 1900, 1897, 1899, 1901, 1904, 1906, 1907, 1902, 1906, + 1908, 1908, 1910, 1911, 1914, 1912, 1913, 1913, 1919, 1907, + 1912, 1915, 1916, 1914, 1910, 1911, 1915, 1916, 1917, 1918, + 1918, 1917, 1920, 1921, 1922, 1923, 1926, 1924, 1919, 1923, + 1925, 1920, 1924, 1927, 1928, 1929, 1925, 1932, 1931, 1931, + 1938, 1921, 1927, 1922, 1926, 1933, 1934, 1934, 1946, 1929, + 1931, 1936, 1928, 1937, 1933, 1932, 1935, 1935, 1939, 1940, - 1947, 1948, 1948, 1941, 1946, 1942, 1949, 1951, 1949, 1956, - 1944, 1945, 1950, 1950, 1960, 1951, 1957, 1947, 1953, 1953, - 1954, 1954, 1957, 1958, 1959, 1961, 1962, 1962, 1963, 1958, - 1964, 1959, 1956, 1967, 1965, 1966, 1960, 1963, 1968, 1969, - 1970, 1973, 1975, 1971, 1974, 1961, 1965, 1966, 1967, 1971, - 1968, 1964, 1976, 1976, 1975, 1970, 1977, 1978, 1981, 1980, - 1979, 1973, 1971, 1979, 1980, 1969, 1983, 1974, 1984, 1985, - 1984, 1983, 1987, 1989, 1977, 1986, 1991, 1978, 1981, 1987, - 1986, 1992, 1989, 1993, 1994, 1995, 1994, 1985, 1998, 1997, - 1992, 1997, 1999, 1999, 1991, 1993, 2000, 2002, 2001, 2002, + 1936, 1938, 1947, 1939, 1946, 1937, 1943, 1943, 1945, 1949, + 1951, 1945, 1940, 1950, 1952, 1954, 1951, 1954, 1947, 1953, + 1953, 1955, 1955, 1961, 1949, 1956, 1962, 1950, 1958, 1958, + 1963, 1952, 1962, 1956, 1959, 1959, 1963, 1964, 1965, 1966, + 1967, 1967, 1968, 1969, 1964, 1970, 1961, 1972, 1974, 1971, + 1976, 1968, 1975, 1973, 1979, 1978, 1976, 1970, 1980, 1966, + 1965, 1971, 1972, 1982, 1969, 1973, 1983, 1975, 1986, 1976, + 1980, 1981, 1981, 1984, 1974, 1978, 1984, 1979, 1985, 1988, + 1989, 1982, 1989, 1985, 1988, 1990, 1983, 1991, 1986, 1992, + 1994, 1996, 1991, 1997, 1998, 1999, 1992, 1999, 2000, 1994, - 2003, 2004, 1998, 2001, 1995, 2003, 2004, 2005, 2006, 2007, - 2009, 2008, 2010, 2012, 2016, 2007, 2008, 2013, 2014, 2014, - 2010, 2017, 2000, 2009, 2018, 2005, 2015, 2015, 2006, 2016, - 2018, 2013, 2012, 2019, 2020, 2021, 2020, 2024, 2019, 2022, - 2029, 2017, 2023, 2023, 2025, 2025, 2033, 2022, 2027, 2024, - 2026, 2026, 2031, 2021, 2028, 2022, 2035, 2027, 2029, 2028, - 2032, 2031, 2032, 2034, 2031, 2035, 2036, 2033, 2034, 2034, - 2038, 2039, 2040, 2042, 2043, 2044, 2039, 2040, 2036, 2045, - 2045, 2046, 2038, 2047, 2044, 2050, 2042, 2048, 2049, 2054, - 2055, 2056, 2052, 2053, 2043, 2055, 2056, 2057, 2063, 2046, + 2003, 2005, 1997, 1990, 2010, 2002, 1998, 2002, 2006, 1996, + 2004, 2004, 2011, 2006, 2003, 2008, 2007, 2000, 2007, 2009, + 2008, 2013, 2010, 2012, 2009, 2014, 2013, 2005, 2015, 2012, + 2017, 2018, 2011, 2019, 2019, 2021, 2015, 2022, 2014, 2020, + 2020, 2023, 2025, 2024, 2025, 2018, 2026, 2023, 2024, 2017, + 2021, 2027, 2028, 2028, 2029, 2030, 2030, 2022, 2033, 2027, + 2031, 2031, 2032, 2033, 2026, 2034, 2029, 2027, 2036, 2038, + 2037, 2032, 2037, 2039, 2041, 2040, 2043, 2036, 2039, 2039, + 2036, 2048, 2044, 2034, 2040, 2047, 2041, 2044, 2043, 2045, + 2038, 2049, 2050, 2050, 2045, 2051, 2052, 2054, 2047, 2053, - 2050, 2047, 2049, 2048, 2052, 2053, 2057, 2060, 2062, 2054, - 2064, 2065, 2066, 2060, 2062, 2067, 2068, 2068, 2069, 2070, - 2070, 2063, 2071, 2074, 2067, 2064, 2060, 2069, 2072, 2065, - 2073, 2075, 2072, 2076, 2077, 2073, 2074, 2066, 2078, 2077, - 2077, 2071, 2079, 2080, 2078, 2081, 2080, 2082, 2079, 2087, - 2075, 2085, 2085, 2081, 2090, 2076, 2086, 2086, 2087, 2088, - 2088, 2089, 2089, 2091, 2092, 2099, 2090, 2082, 2093, 2099, - 2092, 2086, 2100, 2093, 2094, 2094, 2095, 2095, 2096, 2097, - 2101, 2091, 2086, 2096, 2101, 2097, 2102, 2104, 2105, 2107, - 2106, 2108, 2100, 2105, 2110, 2112, 2108, 2109, 2111, 2113, + 2049, 2048, 2055, 2059, 2057, 2060, 2058, 2061, 2068, 2069, + 2060, 2054, 2061, 2051, 2052, 2053, 2057, 2055, 2058, 2062, + 2065, 2067, 2070, 2059, 2069, 2071, 2065, 2067, 2062, 2072, + 2076, 2068, 2073, 2073, 2074, 2075, 2075, 2077, 2072, 2065, + 2070, 2077, 2078, 2074, 2079, 2080, 2081, 2078, 2082, 2076, + 2071, 0, 2081, 2083, 2084, 2085, 2088, 2079, 2083, 2083, + 2084, 2085, 2086, 2087, 2080, 2086, 2091, 2091, 2092, 2092, + 2082, 2087, 2093, 2094, 2094, 2096, 2088, 2095, 2095, 2097, + 2098, 2093, 2103, 2092, 2099, 2106, 2098, 2096, 2103, 2099, + 2100, 2100, 2101, 2101, 2092, 2102, 2108, 2097, 2105, 2107, - 2112, 2114, 2114, 2115, 2107, 2116, 2102, 2115, 2118, 2117, - 2110, 2121, 2104, 2106, 2117, 2109, 2119, 2120, 2111, 2122, - 2116, 2113, 2123, 2119, 2122, 2124, 2125, 2125, 2127, 2120, - 2121, 2128, 2129, 2130, 2118, 2123, 2127, 2131, 2132, 2133, - 2134, 2135, 2139, 2124, 2137, 2146, 2142, 2141, 2142, 2140, - 2128, 2129, 2134, 2141, 2147, 2139, 2130, 2132, 2146, 2137, - 2133, 2131, 2135, 2140, 2143, 2143, 2144, 2145, 2147, 2148, - 2145, 2144, 2149, 2149, 2150, 2150, 2151, 2153, 2151, 2152, - 2152, 2154, 2148, 2155, 2155, 2162, 2156, 2157, 2157, 2158, - 2158, 2159, 2153, 2163, 2154, 2156, 2159, 2161, 2156, 2164, + 2102, 2110, 2105, 2107, 2111, 2106, 2112, 2113, 2114, 2111, + 2115, 2116, 2117, 2114, 2118, 2119, 2108, 2120, 2120, 2118, + 2121, 2122, 2113, 2124, 2121, 2123, 2110, 2116, 2115, 2112, + 2123, 2125, 2117, 2126, 2127, 2128, 2122, 2119, 2125, 2129, + 2128, 2130, 2131, 2131, 2134, 2126, 2133, 2135, 2136, 2124, + 2137, 2138, 2129, 2127, 2133, 2139, 2140, 2141, 2143, 2130, + 0, 2147, 2145, 2134, 2150, 2146, 2135, 2147, 2140, 2150, + 2138, 2136, 2153, 2143, 2137, 2145, 2139, 2152, 2141, 2146, + 2148, 2154, 2148, 2149, 2149, 2151, 2153, 2157, 2151, 2157, + 2152, 2155, 2155, 2159, 2154, 2156, 2156, 2158, 2158, 2160, - 2165, 2165, 2161, 2166, 2166, 2162, 2167, 2168, 2168, 2169, - 2175, 2164, 2172, 2163, 2170, 2170, 2171, 2172, 2173, 2173, - 2174, 2174, 2177, 2176, 2175, 2167, 2178, 2169, 2180, 2181, - 2181, 2171, 2176, 2180, 2182, 2185, 2177, 2183, 2183, 2184, - 2186, 2185, 2189, 2186, 2190, 2178, 2187, 2187, 2188, 2188, - 2191, 2192, 2192, 2182, 2194, 2195, 2196, 2184, 2199, 2190, - 2197, 2189, 2187, 2200, 2197, 2198, 2198, 2201, 2200, 2191, - 2202, 2196, 2204, 2204, 2194, 2205, 2206, 2199, 2195, 2207, - 2208, 2209, 2201, 2206, 2210, 2202, 2211, 2211, 2212, 2213, - 2216, 2213, 2219, 2207, 2220, 2205, 2217, 2212, 2208, 2209, + 2161, 2161, 2162, 2163, 2163, 2164, 2164, 2168, 2159, 2169, + 2165, 2162, 2160, 2167, 2162, 2165, 2170, 2173, 2167, 2171, + 2171, 2172, 2172, 2174, 2174, 2175, 2177, 2168, 2170, 2169, + 2176, 2176, 2178, 2179, 2179, 2181, 2173, 2178, 2180, 2180, + 2183, 2177, 2182, 2175, 2184, 2186, 2187, 2187, 2188, 2181, + 2186, 2182, 2189, 2189, 2183, 2190, 2191, 2192, 2193, 2193, + 2192, 2195, 2191, 2184, 2194, 2194, 2196, 2188, 2197, 2198, + 2198, 2200, 2201, 2190, 2193, 2202, 2204, 2204, 2203, 2205, + 2195, 2196, 2203, 2206, 2207, 2208, 2211, 2197, 2206, 2212, + 2202, 2200, 2210, 2210, 2213, 2201, 2212, 2214, 2205, 2207, - 2214, 2217, 2216, 2214, 2218, 2221, 2222, 2220, 2223, 2218, - 2210, 2222, 2227, 2233, 2225, 2229, 2226, 2219, 2214, 2225, - 2214, 2226, 2228, 2230, 2236, 2231, 2221, 2227, 2228, 2230, - 2231, 2234, 2232, 2236, 2223, 0, 2229, 2232, 2233, 2235, - 2237, 2238, 2235, 2239, 2234, 2240, 2245, 2241, 2242, 2237, - 2238, 2243, 2239, 2241, 2242, 2243, 2247, 2248, 2248, 2240, - 2251, 2249, 2250, 2250, 2253, 2247, 2245, 2249, 2252, 2251, - 2258, 2250, 2255, 2252, 2256, 2257, 2257, 2261, 2259, 2262, - 2264, 2263, 2268, 2310, 2253, 2258, 2253, 2259, 2255, 2261, - 2256, 2266, 2264, 2267, 2266, 2262, 2263, 2269, 2267, 2270, + 2208, 2215, 2216, 2217, 2217, 2218, 2211, 2219, 2213, 2219, + 2222, 2225, 2223, 2220, 2218, 2214, 2220, 2223, 2224, 2215, + 2227, 2226, 2222, 2224, 2228, 2229, 2235, 2231, 2216, 2228, + 2232, 2220, 2231, 2220, 2226, 2232, 2225, 2233, 2234, 2236, + 2239, 2227, 2240, 2237, 2234, 2236, 0, 2235, 2237, 2238, + 2241, 2229, 2233, 2241, 2238, 2240, 2246, 2242, 2243, 2244, + 2245, 2251, 2254, 2254, 2253, 2239, 2242, 2243, 2244, 2245, + 2246, 2247, 2248, 2253, 2255, 2249, 2257, 2247, 2248, 2249, + 2255, 2251, 2256, 2256, 2259, 2257, 2258, 2258, 2260, 2259, + 2262, 2256, 2265, 2263, 2264, 2264, 2266, 2269, 2273, 2268, - 2270, 2310, 2268, 2271, 2271, 2273, 2273, 2274, 2275, 2269, - 2274, 2276, 2277, 2275, 2278, 2279, 2279, 2276, 2277, 2280, - 2281, 2281, 2282, 2278, 2283, 2284, 2285, 2285, 2287, 2286, - 2295, 2288, 0, 2280, 2282, 2286, 2288, 2290, 2283, 2295, - 2291, 2290, 2287, 2291, 2284, 2292, 2292, 2293, 2294, 2296, - 2299, 2297, 2293, 2294, 2294, 2297, 2298, 2298, 2302, 2301, - 2303, 2304, 2305, 2299, 2301, 2306, 2305, 2307, 2308, 2296, - 2309, 2311, 2307, 2312, 2308, 2304, 2309, 2313, 2302, 2314, - 2303, 2316, 2313, 2317, 2318, 2306, 2328, 2320, 2319, 2318, - 2311, 2325, 2312, 2316, 2319, 2320, 2321, 2323, 2321, 2317, + 2270, 2273, 2271, 2275, 2276, 2266, 2262, 2265, 2260, 2263, + 2260, 2268, 2274, 2269, 2271, 2270, 2276, 2274, 2277, 2277, + 2278, 2278, 2282, 2275, 2280, 2280, 2281, 2282, 2283, 2281, + 2284, 2285, 2286, 2286, 2283, 2287, 2284, 2288, 2288, 2289, + 2285, 2290, 2291, 2292, 2292, 2294, 2293, 2302, 2295, 2287, + 2297, 2289, 2293, 2295, 2297, 2290, 2302, 2298, 2303, 2294, + 2298, 2291, 2299, 2299, 2300, 2301, 2305, 2305, 2304, 2300, + 2301, 2301, 2304, 2306, 2308, 2309, 2310, 2311, 2303, 2308, + 2312, 2313, 2314, 2315, 2312, 2317, 2306, 2314, 2316, 2315, + 2318, 2311, 2319, 2320, 2316, 2309, 2310, 2321, 2320, 2324, - 2314, 2326, 2326, 2334, 2327, 2325, 2323, 2327, 2329, 2329, - 2332, 2333, 2328, 2336, 2332, 2334, 2341, 2333, 2335, 2335, - 2339, 2339, 2336, 2343, 2344, 2347, 2348, 2349, 2350, 2357, - 2347, 2358, 2349, 2350, 2341, 2351, 2351, 2343, 2353, 2353, - 2344, 2355, 2356, 2356, 2359, 2357, 2361, 2355, 2362, 2359, - 2363, 2363, 2348, 2358, 2365, 2366, 2367, 2368, 2370, 2370, - 2362, 2366, 2372, 2365, 2371, 2361, 2373, 2371, 2375, 2375, - 2376, 2376, 2368, 2377, 2367, 2378, 2379, 2380, 2377, 2384, - 2382, 2372, 2380, 2383, 2373, 2379, 2381, 2385, 2381, 2386, - 2387, 2384, 2385, 2378, 2382, 2387, 2392, 2383, 2388, 2388, + 2323, 2313, 2325, 2317, 2326, 2327, 2328, 2325, 2328, 2318, + 2326, 2319, 2323, 2327, 2330, 2324, 2332, 2335, 2321, 2333, + 2333, 2334, 2340, 2330, 2334, 2336, 2336, 2339, 2340, 2341, + 2332, 2339, 2342, 2342, 2348, 2343, 2346, 2346, 2351, 2350, + 2354, 2341, 2355, 2335, 2343, 2354, 2356, 2358, 2358, 2364, + 2357, 2356, 2348, 2350, 2351, 2357, 2360, 2360, 2362, 2363, + 2363, 2365, 2366, 2368, 2362, 2364, 2369, 2366, 2355, 2370, + 2370, 2372, 2374, 2373, 2375, 2377, 2377, 2379, 2369, 2373, + 2372, 2378, 2368, 2365, 2378, 2380, 2382, 2382, 2384, 2375, + 2374, 2383, 2383, 2384, 2385, 2386, 2379, 2387, 2388, 2389, - 2389, 2389, 2390, 2390, 2391, 2391, 2393, 2394, 2392, 2386, - 2395, 2395, 2394, 2396, 2396, 2397, 2398, 2399, 2400, 2401, - 2401, 2402, 2403, 2403, 2393, 2404, 2404, 2397, 2398, 2407, - 2405, 2406, 2408, 2409, 2400, 2411, 2407, 2399, 2412, 2414, - 2402, 2405, 2410, 2406, 2408, 2413, 2413, 2410, 2414, 2415, - 2416, 2417, 2418, 2409, 2419, 2411, 2420, 2421, 2412, 2422, - 2422, 2427, 2423, 2428, 2417, 2424, 2425, 2429, 2419, 2421, - 2416, 2423, 2431, 0, 2430, 2415, 2418, 2430, 2420, 2427, - 2424, 2425, 2432, 2433, 2441, 2428, 2431, 2432, 2433, 2443, - 2429, 2434, 2434, 2435, 2435, 2436, 2436, 2438, 2438, 2440, + 2388, 2390, 2387, 2380, 2386, 2391, 2392, 2393, 2400, 2394, + 0, 2392, 2385, 2389, 2394, 2390, 2399, 2391, 2395, 2395, + 2396, 2396, 2397, 2397, 2398, 2398, 2400, 2393, 2399, 2401, + 2402, 2402, 2403, 2403, 2401, 2404, 2405, 2406, 2407, 2408, + 2408, 2409, 2410, 2410, 2411, 2411, 2413, 2404, 2405, 2414, + 2412, 2415, 2416, 2418, 2407, 2419, 2414, 2406, 2413, 2417, + 2409, 2412, 2421, 2415, 2417, 2420, 2420, 2422, 2423, 2424, + 2425, 2421, 2416, 2418, 2427, 2419, 2426, 2428, 2431, 2428, + 2429, 2435, 2424, 2430, 2430, 2432, 2433, 2431, 2423, 2436, + 2426, 2437, 2429, 2422, 2425, 2438, 2427, 2449, 2438, 2435, - 2440, 2442, 2441, 2444, 2446, 2447, 2448, 2449, 2443, 2451, - 2450, 2452, 2442, 2452, 2453, 2454, 2459, 2455, 2444, 2450, - 2456, 2456, 2461, 2447, 2446, 2458, 2458, 2449, 2448, 2451, - 2462, 2459, 2465, 2454, 2453, 2455, 2463, 2463, 2467, 2462, - 2468, 2465, 2466, 2466, 2461, 2469, 2470, 2471, 2472, 2474, - 2477, 2473, 2469, 2475, 2475, 2478, 2467, 2479, 2468, 2476, - 2476, 2470, 2483, 2479, 2484, 2471, 2472, 2473, 2474, 2485, - 2477, 2480, 2480, 2478, 2481, 2481, 2482, 2486, 2487, 2484, - 2483, 2488, 2482, 2487, 2489, 2490, 2496, 2491, 2485, 2491, - 2490, 2486, 2492, 2492, 2493, 2499, 2493, 2494, 2494, 2498, + 2432, 2433, 2439, 2440, 2441, 2442, 2442, 2451, 2440, 2441, + 2452, 2436, 2443, 2443, 2437, 2449, 2439, 2444, 2444, 2446, + 2446, 2448, 2448, 2450, 2454, 2452, 2451, 2455, 2456, 2457, + 2458, 2459, 2461, 2460, 2450, 2460, 2462, 2463, 2467, 2458, + 2464, 2464, 2466, 2466, 2454, 2455, 2469, 2470, 2475, 2457, + 2456, 2459, 2461, 2467, 2462, 2463, 2470, 2471, 2471, 2476, + 2473, 2474, 2474, 2477, 2478, 2479, 2475, 2480, 2469, 2473, + 2477, 2481, 2482, 2483, 2483, 2484, 2484, 2476, 2485, 2478, + 2487, 2486, 2491, 2479, 2490, 2480, 2487, 2481, 2488, 2488, + 2490, 2482, 2489, 2489, 2492, 2493, 2494, 2495, 2485, 2486, - 2500, 2488, 2501, 2503, 2489, 2496, 2502, 2504, 2498, 2507, - 2508, 2502, 2500, 2508, 2499, 2509, 2509, 2510, 2511, 2512, - 2512, 2513, 2501, 2503, 2515, 2513, 2504, 2516, 2518, 2507, - 2520, 2516, 2510, 2517, 2517, 2521, 2511, 2522, 2525, 2515, - 2526, 2518, 2523, 2523, 2527, 2520, 2528, 2528, 2527, 2526, - 2525, 2529, 2530, 2530, 2531, 2521, 2532, 2522, 2533, 2531, - 2534, 2535, 2535, 2540, 2540, 2532, 2541, 2542, 2542, 2543, - 2529, 2544, 2534, 0, 2533, 2548, 2545, 2546, 2547, 2547, - 2550, 2550, 2543, 2555, 2544, 2545, 2546, 2553, 2541, 2554, - 2548, 2556, 2553, 2557, 2554, 2558, 2556, 2555, 2559, 2563, + 2491, 2496, 2495, 2497, 2509, 2499, 2498, 2499, 2504, 2492, + 2494, 2498, 2500, 2500, 2493, 2501, 2506, 2501, 2502, 2502, + 2507, 2496, 2508, 2497, 2509, 2506, 2510, 2504, 2511, 2518, + 2512, 2510, 2515, 2516, 2508, 2519, 2516, 2517, 2517, 2507, + 2520, 2520, 2521, 2523, 2518, 2528, 2521, 2524, 2511, 2512, + 2526, 2524, 2515, 2519, 2525, 2525, 2529, 2530, 2523, 2533, + 2528, 2531, 2531, 2526, 2534, 2535, 2536, 2536, 2537, 2535, + 2540, 2533, 2541, 2534, 2538, 2538, 2529, 2530, 2539, 2540, + 2542, 2543, 2543, 2539, 2548, 2548, 2549, 2537, 2541, 2550, + 2550, 2551, 2542, 2552, 2553, 2556, 2554, 2555, 2555, 2558, - 2560, 2557, 2562, 2565, 2563, 2564, 2570, 2559, 2560, 0, - 2564, 2566, 2566, 2570, 2558, 2567, 2567, 2562, 2565, 2568, - 2569, 2569, 2571, 2572, 2568, 2573, 2574, 2571, 2575, 2576, - 2576, 2577, 2574, 2575, 2578, 2579, 2579, 2580, 2580, 2578, - 2583, 2572, 0, 2573, 2584, 2584, 2577, 2585, 2589, 2586, - 2585, 2587, 2588, 2583, 2586, 2586, 2587, 2588, 2590, 2591, - 2592, 2593, 2589, 2591, 2590, 2592, 2594, 2595, 2596, 2599, - 2593, 2597, 2598, 2600, 2599, 2595, 2602, 2597, 2598, 2603, - 2604, 2594, 2606, 2604, 2603, 2600, 2608, 2610, 2609, 2596, - 2611, 2608, 2602, 2609, 2606, 2612, 2618, 2613, 2614, 2614, + 2558, 2563, 2561, 2553, 2551, 2554, 2552, 2561, 2549, 2562, + 2556, 2564, 2565, 2566, 2562, 2563, 2564, 2567, 2570, 2568, + 2565, 2573, 2577, 2571, 2572, 0, 2567, 2568, 2571, 2572, + 2574, 2574, 2566, 2570, 2575, 2575, 2573, 2576, 2578, 2578, + 2579, 2577, 2576, 2580, 2581, 2582, 2583, 2579, 2580, 2584, + 2585, 2585, 2583, 2586, 2584, 2587, 2588, 2588, 2589, 2589, + 2587, 2592, 2581, 2582, 2593, 2593, 2594, 2595, 2586, 2594, + 2596, 2597, 2595, 2595, 2592, 2596, 2597, 2598, 2599, 2600, + 2601, 2602, 2603, 2600, 2599, 2601, 2604, 2605, 2608, 2606, + 2602, 2598, 2607, 2608, 2604, 2606, 2611, 2603, 2607, 2609, - 2615, 2619, 2620, 2611, 2612, 2610, 2613, 2619, 2620, 2615, - 2623, 2624, 2627, 2625, 2618, 2626, 2626, 2628, 2629, 2627, - 2630, 2631, 2631, 2632, 2634, 2636, 2637, 2629, 2639, 2623, - 2637, 2624, 2625, 2638, 2638, 2630, 2628, 2640, 2641, 2634, - 2642, 2644, 2632, 2640, 2641, 2636, 2642, 2643, 2643, 2644, - 2645, 2647, 2648, 2639, 2650, 2645, 2651, 2652, 2650, 2655, - 2647, 2654, 2654, 2656, 2656, 2648, 2657, 2657, 2659, 2659, - 2651, 2660, 2652, 2661, 2665, 2660, 2666, 2655, 2661, 2663, - 2663, 2666, 2668, 2667, 2670, 2671, 2671, 2668, 2668, 2673, - 2673, 2674, 2674, 2675, 2665, 2667, 2675, 2676, 2678, 2680, + 2612, 2613, 2615, 2619, 2613, 2612, 2620, 2621, 2605, 2627, + 2617, 2609, 2611, 2618, 2615, 2617, 2621, 2622, 2618, 2620, + 2624, 2619, 2623, 2623, 2628, 2629, 2622, 2627, 2632, 2624, + 2628, 2629, 2633, 2636, 2634, 2635, 2635, 2637, 2645, 2638, + 2636, 2641, 2639, 2640, 2640, 2646, 2643, 2632, 2638, 2646, + 2647, 2647, 2633, 2634, 2648, 0, 2637, 2639, 2645, 2649, + 2641, 2643, 2650, 2651, 2653, 2649, 2652, 2652, 2650, 2651, + 2654, 2656, 2653, 2657, 2659, 2654, 2660, 2661, 2659, 2648, + 2656, 2663, 2663, 2664, 2665, 2665, 2657, 2666, 2666, 2674, + 2660, 2669, 2661, 2668, 2668, 2669, 2676, 2670, 2672, 2672, - 2681, 2681, 2682, 2682, 2670, 2683, 2683, 2684, 2685, 2685, - 2676, 2686, 2687, 2688, 2689, 2697, 2678, 2690, 2690, 2680, - 2689, 2691, 2684, 2694, 2686, 2691, 2696, 2688, 2698, 2694, - 2687, 2696, 2696, 2699, 2700, 2701, 2702, 2707, 2697, 2703, - 2700, 2701, 2707, 2703, 2704, 2704, 2709, 2710, 2698, 2712, - 2710, 2715, 2713, 2699, 2709, 2713, 2714, 2714, 2716, 2717, - 2718, 2702, 2719, 2716, 2720, 2720, 2724, 2721, 2715, 2715, - 2723, 2725, 2722, 2728, 2712, 2722, 2719, 2717, 2737, 2725, - 2718, 2721, 2727, 2722, 2723, 2724, 2726, 2727, 2727, 2726, - 2729, 2729, 2728, 2730, 2730, 2731, 2731, 2732, 2732, 2733, + 2675, 2664, 2670, 2679, 2684, 2675, 2677, 2684, 2676, 2674, + 2687, 2677, 2677, 2680, 2680, 2682, 2682, 2683, 2683, 2685, + 2689, 2690, 2690, 2679, 2691, 2691, 2692, 2692, 2687, 2693, + 2694, 2694, 2685, 2695, 2696, 2697, 2698, 2699, 2699, 2700, + 2689, 2703, 2698, 2700, 2693, 2704, 2695, 2703, 2706, 2697, + 2704, 2707, 2696, 2706, 2706, 2708, 2709, 2710, 2711, 2712, + 2722, 2713, 2719, 2710, 2711, 2713, 2714, 2714, 2717, 2720, + 2719, 2725, 2720, 2717, 2707, 2708, 2709, 2723, 2724, 2724, + 2723, 2726, 2727, 2728, 2712, 2722, 2726, 2729, 2725, 2725, + 2730, 2730, 2731, 2732, 2733, 2734, 2732, 2735, 2738, 2736, - 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2735, 2740, 2741, - 2738, 2742, 2743, 2740, 2745, 2745, 2748, 2734, 2741, 2746, - 2746, 2747, 2751, 2736, 2747, 2739, 2750, 2750, 2753, 2751, - 2756, 2742, 2743, 2753, 2748, 2752, 2752, 2755, 2755, 2756, - 2757, 2758, 2760, 2761, 2761, 2763, 2764, 2762, 2777, 2757, - 2758, 2762, 2765, 2766, 2763, 2767, 2778, 2765, 2765, 2768, - 2760, 2764, 2772, 2768, 2767, 2776, 2766, 2772, 2773, 2773, - 2775, 2775, 2780, 2777, 2778, 2781, 2784, 2785, 2786, 2776, - 2789, 2780, 2787, 2791, 2793, 2794, 2785, 2781, 2787, 2793, - 2794, 2796, 2789, 2795, 2795, 2799, 0, 2798, 2786, 2806, + 2727, 2729, 2736, 2728, 2732, 2735, 2731, 2737, 2733, 2739, + 2739, 2744, 2737, 2737, 2734, 2740, 2740, 2738, 2741, 2741, + 2742, 2742, 2743, 2743, 2745, 2746, 2747, 2744, 2748, 2745, + 2749, 2750, 2751, 2748, 2752, 2753, 2750, 2755, 2755, 2756, + 2756, 2751, 2758, 2757, 2761, 2746, 2757, 2760, 2760, 2749, + 2766, 2761, 2747, 2763, 2752, 2753, 2762, 2762, 2763, 2766, + 2758, 2765, 2765, 2767, 2768, 2770, 2771, 2771, 2773, 2774, + 2772, 2787, 2767, 2768, 2772, 2775, 2776, 2773, 2777, 2788, + 2775, 2775, 2778, 2770, 2774, 2782, 2778, 2777, 2786, 2776, + 2782, 2783, 2783, 2785, 2785, 2790, 2787, 2788, 2791, 2794, - 2796, 2784, 2798, 2807, 2791, 2800, 2800, 2805, 2799, 2800, - 2802, 2802, 2803, 2803, 2804, 2804, 2805, 2814, 2808, 2806, - 2810, 2815, 2807, 2808, 2811, 2812, 2810, 2813, 2813, 2811, - 2812, 2816, 2817, 2815, 2819, 2814, 2818, 2817, 2820, 2823, - 2819, 2821, 2821, 2823, 2824, 2825, 2826, 2826, 2827, 2824, - 2825, 2828, 2816, 2829, 2818, 2830, 2832, 2832, 2834, 2835, - 2836, 2837, 2838, 2820, 2836, 2839, 2828, 2827, 2829, 2840, - 2837, 2834, 2835, 2843, 2841, 2830, 2844, 2840, 2838, 2841, - 2842, 2842, 2843, 2845, 2839, 2846, 2846, 2847, 2850, 2850, - 2851, 2851, 2853, 2865, 2844, 2855, 2855, 2860, 2857, 2858, + 2795, 2796, 2786, 2799, 2790, 2797, 2801, 2803, 2804, 2795, + 2791, 2797, 2803, 2804, 2806, 2799, 2805, 2805, 2809, 2810, + 2808, 2796, 2817, 2806, 2794, 2808, 2818, 2801, 2811, 2811, + 0, 2809, 2811, 2810, 2813, 2813, 2814, 2814, 2815, 2815, + 2816, 2819, 2817, 2822, 2821, 2818, 2819, 2823, 2822, 2816, + 2821, 2825, 2823, 2824, 2824, 2826, 2827, 2828, 2829, 2830, + 2831, 2838, 2828, 2832, 2832, 2830, 2834, 2826, 2835, 2825, + 2834, 2837, 2837, 2835, 2836, 2839, 2829, 2827, 2840, 2836, + 2838, 2841, 2843, 2843, 2845, 2831, 2846, 2847, 2849, 2848, + 2839, 2847, 2850, 2840, 2851, 2852, 2855, 2845, 2848, 2846, - 2859, 2863, 2860, 2862, 2862, 2864, 2847, 2867, 2867, 2845, - 2868, 2869, 2865, 2853, 2857, 2858, 2859, 2870, 2870, 2873, - 2874, 2863, 2875, 2876, 2868, 0, 2874, 2875, 2864, 2879, - 2869, 2877, 2877, 2878, 2878, 2880, 2880, 2881, 2882, 2873, - 2883, 2886, 2885, 2887, 2884, 2876, 2896, 2882, 2881, 2879, - 2884, 2888, 2888, 2886, 2889, 2880, 2890, 2891, 2891, 2890, - 2883, 2885, 2895, 2887, 2897, 2900, 2896, 2898, 2898, 2889, - 2897, 2900, 2899, 2901, 2895, 2899, 2903, 2904, 2904, 2905, - 2906, 2903, 2907, 2908, 2905, 2909, 2909, 2912, 2907, 2913, - 2911, 2901, 2916, 2914, 2915, 2915, 2920, 2920, 2923, 2906, + 2852, 2841, 2851, 2854, 2849, 2853, 2853, 2856, 2857, 2857, + 2858, 2850, 2854, 2864, 2855, 2861, 2861, 2862, 2862, 2866, + 2866, 2868, 2869, 2870, 2874, 2871, 2873, 2873, 2875, 2858, + 2871, 2876, 2879, 2856, 2864, 2878, 2878, 2868, 2869, 2870, + 2880, 2881, 2881, 2884, 2874, 2887, 2879, 2885, 2890, 2886, + 2876, 2875, 2894, 2885, 2886, 2888, 2888, 2889, 2889, 2880, + 2891, 2891, 2892, 2884, 2895, 2893, 2896, 2887, 2890, 2897, + 2895, 2898, 2894, 2892, 2893, 2899, 2899, 2900, 2907, 2901, + 2891, 2897, 2901, 2902, 2908, 2896, 2902, 2903, 2903, 2909, + 2907, 2898, 2900, 2910, 2910, 2909, 2911, 2912, 2913, 2911, - 2908, 2908, 2911, 2917, 2918, 2912, 2914, 2917, 2921, 2921, - 2922, 2916, 2923, 2918, 2913, 2922, 2924, 2925, 2925, 2926, - 2926, 2924, 2927, 2927, 2928, 2929, 2930, 2936, 2931, 2933, - 2933, 2938, 2930, 2931, 2939, 2940, 2944, 2928, 2941, 2941, - 2943, 2943, 2945, 2946, 2947, 2947, 2936, 2948, 2948, 2950, - 2944, 2929, 2946, 2938, 2951, 2950, 2939, 2940, 2952, 2953, - 2956, 2956, 2945, 2959, 2953, 2958, 2958, 2960, 2959, 2961, - 2962, 2963, 2964, 2964, 2951, 2961, 2967, 2952, 2965, 2963, - 2967, 2960, 2962, 2965, 2968, 2969, 2970, 2971, 2972, 2974, - 2975, 2970, 2976, 2977, 2972, 2980, 2979, 2974, 2981, 2971, + 2915, 2916, 2916, 2912, 2908, 2915, 2917, 2918, 2919, 2923, + 2920, 2917, 2921, 2921, 2919, 2924, 2913, 2925, 2926, 2927, + 2927, 2923, 2928, 2930, 0, 2929, 2918, 2920, 2920, 2929, + 2935, 2926, 2930, 2924, 2932, 2932, 2933, 2933, 2934, 2940, + 2936, 2928, 2925, 2934, 2935, 2936, 2937, 2937, 2938, 2938, + 2939, 2939, 2940, 2941, 2942, 2948, 2943, 2945, 2945, 2950, + 2942, 2943, 2951, 2952, 2953, 2953, 2955, 2955, 2956, 2957, + 2963, 2958, 2959, 2959, 2948, 2960, 2960, 2962, 2964, 2941, + 2958, 2950, 2956, 2962, 2951, 2952, 2965, 2968, 2968, 2957, + 2963, 2965, 2970, 2970, 2971, 2972, 2973, 2964, 2974, 2971, - 2982, 2983, 2985, 2986, 2968, 2969, 2983, 2985, 2990, 2975, - 0, 2980, 2976, 2977, 2979, 2981, 2981, 2988, 2987, 2992, - 2991, 2982, 2988, 2986, 2987, 2991, 2995, 2995, 2990, 2996, - 2996, 2997, 2992, 3001, 3001, 2997, 3002, 3003, 3004, 3004, - 3017, 3002, 3006, 3006, 3007, 3007, 3010, 3007, 3008, 3008, - 3010, 3008, 3009, 3009, 3013, 3009, 3003, 3012, 3012, 3014, - 3017, 3018, 3019, 3020, 3020, 3023, 3025, 3019, 3024, 3026, - 3025, 3027, 3013, 3014, 3029, 3024, 3031, 3030, 3026, 3032, - 3032, 3018, 3030, 3033, 3033, 3031, 3027, 3034, 3034, 3035, - 3023, 3036, 3029, 3037, 3038, 3039, 3036, 3040, 3041, 3038, + 2975, 2977, 2973, 2976, 2976, 2981, 2977, 2979, 2975, 2972, + 2974, 2979, 2980, 2982, 2983, 2984, 2985, 2980, 2987, 2983, + 2988, 2989, 2985, 2990, 2992, 2981, 2987, 2984, 2993, 2994, + 2995, 2996, 2998, 2982, 2999, 3001, 2996, 2998, 3003, 2988, + 3001, 2989, 2992, 2990, 2993, 3004, 2994, 2994, 3005, 3000, + 3004, 2995, 3008, 3008, 2999, 3000, 3009, 3009, 3003, 3010, + 3016, 3005, 3015, 3010, 3014, 3014, 0, 3015, 3017, 3017, + 3019, 3019, 3020, 3020, 3026, 3020, 3027, 3021, 3021, 3016, + 3021, 3022, 3022, 3023, 3022, 3025, 3025, 3023, 3030, 3031, + 3027, 3032, 3026, 3033, 3033, 3036, 3032, 3037, 3038, 3040, - 3038, 3039, 3037, 3042, 3035, 3037, 3043, 3044, 3045, 3046, - 3046, 3043, 3044, 3041, 3047, 3048, 3049, 3049, 3050, 3050, - 3047, 3048, 3040, 3052, 3042, 3051, 3051, 3045, 3052, 3055, - 3055, 3057, 3057, 3058, 3061, 3061, 3062, 3062, 3063, 3063, - 3064, 3064, 3058, 3065, 3065, 3066, 3066, 3067, 3067, 3069, - 3070, 3070, 3071, 3072, 3073, 3077, 3075, 3079, 3069, 3076, - 3076, 3071, 3082, 3078, 3086, 3072, 3080, 3080, 3088, 3079, - 3077, 3081, 3081, 3090, 3073, 3075, 3078, 3082, 3083, 3083, - 3087, 3093, 3086, 3087, 3089, 3089, 3092, 3093, 3094, 3092, - 3095, 3090, 3096, 3098, 3088, 3095, 3097, 3100, 3101, 3108, + 3042, 3039, 3038, 3148, 3037, 3148, 3043, 3045, 3030, 3031, + 3039, 3043, 3044, 3044, 3040, 3049, 3045, 3054, 3042, 3051, + 3036, 3046, 3046, 3047, 3047, 3048, 3048, 3050, 3051, 3052, + 3049, 3051, 3050, 3053, 3052, 3052, 3055, 3056, 3057, 3053, + 3058, 3059, 3054, 3057, 3061, 3058, 3060, 3060, 3062, 3199, + 3061, 3055, 3063, 3063, 3062, 3064, 3064, 3199, 3056, 3066, + 3059, 3065, 3065, 3072, 3066, 3069, 3069, 3071, 3071, 3075, + 3075, 3087, 3072, 3076, 3076, 3077, 3077, 3078, 3078, 3079, + 3079, 3080, 3080, 3081, 3081, 3083, 3084, 3084, 3085, 3086, + 3089, 3087, 3090, 3090, 3083, 3091, 3093, 3085, 3092, 3094, - 3105, 3116, 3094, 3100, 3116, 3118, 3123, 3101, 3126, 3098, - 3128, 3096, 3119, 3119, 3097, 3105, 3120, 3120, 3118, 3121, - 3121, 3124, 3125, 3130, 3128, 3108, 3125, 3131, 3126, 3123, - 3124, 3132, 3133, 3134, 3133, 3137, 3132, 3136, 3131, 3135, - 3135, 3138, 3139, 3140, 3142, 3141, 3130, 3145, 3134, 3143, - 3136, 3144, 3145, 3142, 3137, 3146, 3151, 3147, 3139, 3138, - 3141, 3143, 3147, 3152, 3153, 3153, 3159, 3154, 3140, 3160, - 3151, 3164, 3144, 3155, 3155, 3146, 3154, 3156, 3156, 3157, - 3157, 3158, 3158, 3152, 3161, 3159, 3162, 3161, 3163, 3160, - 3165, 3162, 3166, 3163, 3167, 3168, 3164, 3169, 3166, 3170, + 3094, 3086, 3095, 3095, 3097, 3098, 3098, 3101, 3093, 3089, + 3091, 3092, 3102, 3103, 3105, 3102, 3104, 3104, 3107, 3097, + 3108, 3107, 3109, 3110, 3111, 3101, 3108, 3112, 3110, 3115, + 3113, 3116, 3105, 3120, 3123, 3115, 3109, 3133, 3131, 3103, + 3116, 3131, 3138, 3111, 3141, 3112, 3113, 3145, 3120, 3139, + 3133, 3134, 3134, 3135, 3135, 3136, 3136, 3140, 3139, 3143, + 3123, 3140, 3147, 3146, 3141, 3138, 3149, 3147, 3150, 3150, + 3145, 3151, 3152, 3143, 3146, 3153, 3154, 3155, 3157, 3156, + 3159, 3149, 3166, 3158, 3151, 3160, 3161, 3157, 3167, 0, + 3160, 3152, 3154, 3153, 3156, 3158, 3166, 3179, 3162, 3168, - 3171, 3171, 3169, 3172, 3172, 3165, 3173, 3168, 3167, 3174, - 3175, 3175, 3177, 3179, 3182, 3182, 3183, 3183, 3184, 3170, - 3185, 3173, 3188, 3186, 3187, 3189, 3184, 3177, 3174, 3186, - 3187, 3179, 3190, 3192, 3192, 3191, 3188, 3196, 3189, 3185, - 3191, 3193, 3193, 3197, 3200, 3199, 3202, 3203, 3200, 3204, - 3208, 3190, 3203, 3207, 3205, 3208, 3206, 3209, 3196, 3199, - 3210, 3210, 3209, 3197, 3213, 3214, 3202, 3205, 3204, 3206, - 3215, 3217, 3207, 3216, 3216, 3218, 3217, 3219, 3219, 3223, - 3220, 3218, 3221, 3214, 3213, 3220, 3222, 3221, 3224, 3215, - 3227, 3222, 3226, 3226, 3224, 3227, 3228, 3228, 3223, 3230, + 3168, 3159, 3155, 3162, 3169, 3174, 3161, 3175, 3167, 3170, + 3170, 3171, 3171, 3169, 3172, 3172, 3173, 3173, 3176, 3180, + 3177, 3176, 3179, 3178, 3174, 3177, 3181, 3175, 3178, 3182, + 3183, 3184, 3181, 3185, 3180, 3188, 3184, 3186, 3186, 3187, + 3187, 3189, 3183, 3182, 3190, 3190, 3192, 3194, 3197, 3197, + 3188, 3198, 3198, 3185, 3200, 3203, 3201, 3202, 3204, 3205, + 3189, 3192, 3201, 3202, 3211, 3194, 3212, 3206, 3214, 3203, + 3217, 3204, 3206, 3200, 3207, 3207, 3208, 3208, 3205, 3215, + 3219, 3220, 3214, 3215, 3218, 3211, 3212, 3221, 3222, 3218, + 3217, 3223, 3224, 3228, 3220, 3230, 3223, 3224, 3229, 3219, - 3231, 3232, 3233, 3230, 3234, 3235, 3236, 3237, 3232, 3239, - 3239, 3235, 3241, 3241, 3244, 3242, 3245, 3243, 3246, 3231, - 3237, 3233, 3243, 3234, 3242, 3236, 3249, 3242, 3247, 3247, - 3251, 3246, 3248, 3244, 3253, 3245, 3258, 3248, 0, 3249, - 3252, 3252, 3254, 3254, 3255, 3255, 3256, 3257, 3259, 3259, - 3265, 3256, 3260, 3253, 3257, 3258, 3251, 3260, 3261, 3263, - 3261, 3262, 3262, 3264, 3267, 3270, 3263, 3266, 3274, 3265, - 3264, 3272, 3266, 3269, 3269, 3273, 3272, 3275, 3276, 3276, - 3273, 3278, 3278, 3267, 3270, 3279, 3280, 3274, 3281, 3281, - 3282, 3282, 3283, 3285, 3285, 3287, 3275, 3286, 3286, 3283, + 3221, 3225, 3225, 3231, 3231, 3232, 3233, 3222, 3234, 3234, + 3232, 3238, 3233, 3228, 3230, 3235, 3229, 3236, 3237, 3239, + 3235, 3246, 3236, 3237, 3242, 3239, 3241, 3241, 3247, 3242, + 3238, 3243, 3243, 3245, 3248, 3247, 3249, 3245, 3250, 3251, + 3246, 3252, 3254, 3254, 3250, 3256, 3256, 3257, 3259, 3260, + 3261, 3266, 3258, 3248, 3252, 3249, 3257, 3258, 3251, 3257, + 3262, 3262, 3264, 3261, 3263, 3267, 3267, 3259, 3260, 3263, + 3268, 3269, 3269, 3270, 3270, 3264, 3271, 3266, 3272, 3273, + 3278, 3271, 3274, 3274, 3280, 3272, 3275, 3278, 3276, 3268, + 3276, 3275, 3277, 3277, 3279, 3281, 3282, 3285, 3273, 3289, - 3293, 3289, 3287, 3292, 3279, 3280, 3289, 3294, 3292, 3295, - 3295, 3296, 3296, 0, 0, 0, 0, 0, 0, 3293, - 0, 0, 0, 0, 0, 0, 3294, 3300, 3300, 3300, - 3300, 3300, 3300, 3300, 3301, 3301, 3301, 3301, 3301, 3301, - 3301, 3302, 3302, 3302, 3302, 3302, 3302, 3302, 3303, 3303, - 3303, 3303, 3303, 3303, 3303, 3304, 3304, 3304, 3304, 3304, - 3304, 3304, 3305, 3305, 3305, 3305, 3305, 3305, 3305, 3306, - 3306, 3306, 3306, 3306, 3306, 3306, 3308, 3308, 0, 3308, - 3308, 3308, 3308, 3309, 3309, 0, 0, 0, 3309, 3309, - 3310, 3310, 0, 0, 3310, 0, 3310, 3311, 0, 0, + 3281, 3279, 3287, 3280, 3284, 3284, 3288, 3287, 3290, 3291, + 3291, 3288, 3293, 3293, 3294, 3282, 3285, 3295, 3289, 3296, + 3296, 3297, 3297, 3298, 3300, 3300, 3308, 3290, 3301, 3301, + 3298, 3302, 3304, 3294, 3307, 3309, 3295, 3304, 3302, 3307, + 3310, 3310, 3311, 3311, 0, 3308, 0, 0, 0, 0, + 0, 0, 0, 0, 3309, 3315, 3315, 3315, 3315, 3315, + 3315, 3315, 3316, 3316, 3316, 3316, 3316, 3316, 3316, 3317, + 3317, 3317, 3317, 3317, 3317, 3317, 3318, 3318, 3318, 3318, + 3318, 3318, 3318, 3319, 3319, 3319, 3319, 3319, 3319, 3319, + 3320, 3320, 3320, 3320, 3320, 3320, 3320, 3321, 3321, 3321, - 0, 0, 0, 3311, 3312, 3312, 0, 0, 0, 3312, - 3312, 3313, 0, 0, 0, 0, 0, 3313, 3314, 3314, - 0, 3314, 3314, 3314, 3314, 3315, 0, 0, 0, 0, - 0, 3315, 3316, 3316, 0, 0, 0, 3316, 3316, 3317, - 3317, 0, 3317, 3317, 3317, 3317, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, - 3299, 3299, 3299, 3299, 3299, 3299, 3299 + 3321, 3321, 3321, 3321, 3323, 3323, 0, 3323, 3323, 3323, + 3323, 3324, 3324, 0, 0, 0, 3324, 3324, 3325, 3325, + 0, 0, 3325, 0, 3325, 3326, 0, 0, 0, 0, + 0, 3326, 3327, 3327, 0, 0, 0, 3327, 3327, 3328, + 0, 0, 0, 0, 0, 3328, 3329, 3329, 0, 3329, + 3329, 3329, 3329, 3330, 0, 0, 0, 0, 0, 3330, + 3331, 3331, 0, 0, 0, 3331, 3331, 3332, 3332, 0, + 3332, 3332, 3332, 3332, 3314, 3314, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + + 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, 3314, + 3314, 3314, 3314, 3314, 3314 } ; static yy_state_type yy_last_accepting_state; @@ -3145,7 +3159,7 @@ static void config_end_include(void) } #endif -#line 3146 "" +#line 3160 "" #define YY_NO_INPUT 1 #line 191 "./util/configlexer.lex" #ifndef YY_NO_UNPUT @@ -3154,9 +3168,9 @@ static void config_end_include(void) #ifndef YY_NO_INPUT #define YY_NO_INPUT 1 #endif -#line 3155 "" +#line 3169 "" -#line 3157 "" +#line 3171 "" #define INITIAL 0 #define quotedstring 1 @@ -3380,7 +3394,7 @@ YY_DECL { #line 211 "./util/configlexer.lex" -#line 3381 "" +#line 3395 "" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -3413,13 +3427,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3300 ) + if ( yy_current_state >= 3315 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 6447 ); + while ( yy_base[yy_current_state] != 6475 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -4385,430 +4399,430 @@ YY_RULE_SETUP case 188: YY_RULE_SETUP #line 403 "./util/configlexer.lex" -{ YDVAR(1, VAR_ADD_HOLDDOWN) } +{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) } YY_BREAK case 189: YY_RULE_SETUP #line 404 "./util/configlexer.lex" -{ YDVAR(1, VAR_DEL_HOLDDOWN) } +{ YDVAR(1, VAR_ADD_HOLDDOWN) } YY_BREAK case 190: YY_RULE_SETUP #line 405 "./util/configlexer.lex" -{ YDVAR(1, VAR_KEEP_MISSING) } +{ YDVAR(1, VAR_DEL_HOLDDOWN) } YY_BREAK case 191: YY_RULE_SETUP #line 406 "./util/configlexer.lex" -{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } +{ YDVAR(1, VAR_KEEP_MISSING) } YY_BREAK case 192: YY_RULE_SETUP #line 407 "./util/configlexer.lex" -{ YDVAR(1, VAR_USE_SYSLOG) } +{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) } YY_BREAK case 193: YY_RULE_SETUP #line 408 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_IDENTITY) } +{ YDVAR(1, VAR_USE_SYSLOG) } YY_BREAK case 194: YY_RULE_SETUP #line 409 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TIME_ASCII) } +{ YDVAR(1, VAR_LOG_IDENTITY) } YY_BREAK case 195: YY_RULE_SETUP #line 410 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_QUERIES) } +{ YDVAR(1, VAR_LOG_TIME_ASCII) } YY_BREAK case 196: YY_RULE_SETUP #line 411 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_REPLIES) } +{ YDVAR(1, VAR_LOG_QUERIES) } YY_BREAK case 197: YY_RULE_SETUP #line 412 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } +{ YDVAR(1, VAR_LOG_REPLIES) } YY_BREAK case 198: YY_RULE_SETUP #line 413 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } +{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) } YY_BREAK case 199: YY_RULE_SETUP #line 414 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOG_SERVFAIL) } +{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) } YY_BREAK case 200: YY_RULE_SETUP #line 415 "./util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE) } +{ YDVAR(1, VAR_LOG_SERVFAIL) } YY_BREAK case 201: YY_RULE_SETUP #line 416 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA) } +{ YDVAR(2, VAR_LOCAL_ZONE) } YY_BREAK case 202: YY_RULE_SETUP #line 417 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOCAL_DATA_PTR) } +{ YDVAR(1, VAR_LOCAL_DATA) } YY_BREAK case 203: YY_RULE_SETUP #line 418 "./util/configlexer.lex" -{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } +{ YDVAR(1, VAR_LOCAL_DATA_PTR) } YY_BREAK case 204: YY_RULE_SETUP #line 419 "./util/configlexer.lex" -{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } +{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) } YY_BREAK case 205: YY_RULE_SETUP #line 420 "./util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_INTERVAL) } +{ YDVAR(1, VAR_INSECURE_LAN_ZONES) } YY_BREAK case 206: YY_RULE_SETUP #line 421 "./util/configlexer.lex" -{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } +{ YDVAR(1, VAR_STATISTICS_INTERVAL) } YY_BREAK case 207: YY_RULE_SETUP #line 422 "./util/configlexer.lex" -{ YDVAR(1, VAR_EXTENDED_STATISTICS) } +{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) } YY_BREAK case 208: YY_RULE_SETUP #line 423 "./util/configlexer.lex" -{ YDVAR(1, VAR_SHM_ENABLE) } +{ YDVAR(1, VAR_EXTENDED_STATISTICS) } YY_BREAK case 209: YY_RULE_SETUP #line 424 "./util/configlexer.lex" -{ YDVAR(1, VAR_SHM_KEY) } +{ YDVAR(1, VAR_SHM_ENABLE) } YY_BREAK case 210: YY_RULE_SETUP #line 425 "./util/configlexer.lex" -{ YDVAR(0, VAR_REMOTE_CONTROL) } +{ YDVAR(1, VAR_SHM_KEY) } YY_BREAK case 211: YY_RULE_SETUP #line 426 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_ENABLE) } +{ YDVAR(0, VAR_REMOTE_CONTROL) } YY_BREAK case 212: YY_RULE_SETUP #line 427 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_INTERFACE) } +{ YDVAR(1, VAR_CONTROL_ENABLE) } YY_BREAK case 213: YY_RULE_SETUP #line 428 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_PORT) } +{ YDVAR(1, VAR_CONTROL_INTERFACE) } YY_BREAK case 214: YY_RULE_SETUP #line 429 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_USE_CERT) } +{ YDVAR(1, VAR_CONTROL_PORT) } YY_BREAK case 215: YY_RULE_SETUP #line 430 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_KEY_FILE) } +{ YDVAR(1, VAR_CONTROL_USE_CERT) } YY_BREAK case 216: YY_RULE_SETUP #line 431 "./util/configlexer.lex" -{ YDVAR(1, VAR_SERVER_CERT_FILE) } +{ YDVAR(1, VAR_SERVER_KEY_FILE) } YY_BREAK case 217: YY_RULE_SETUP #line 432 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_KEY_FILE) } +{ YDVAR(1, VAR_SERVER_CERT_FILE) } YY_BREAK case 218: YY_RULE_SETUP #line 433 "./util/configlexer.lex" -{ YDVAR(1, VAR_CONTROL_CERT_FILE) } +{ YDVAR(1, VAR_CONTROL_KEY_FILE) } YY_BREAK case 219: YY_RULE_SETUP #line 434 "./util/configlexer.lex" -{ YDVAR(1, VAR_PYTHON_SCRIPT) } +{ YDVAR(1, VAR_CONTROL_CERT_FILE) } YY_BREAK case 220: YY_RULE_SETUP #line 435 "./util/configlexer.lex" -{ YDVAR(0, VAR_PYTHON) } +{ YDVAR(1, VAR_PYTHON_SCRIPT) } YY_BREAK case 221: YY_RULE_SETUP #line 436 "./util/configlexer.lex" -{ YDVAR(1, VAR_DYNLIB_FILE) } +{ YDVAR(0, VAR_PYTHON) } YY_BREAK case 222: YY_RULE_SETUP #line 437 "./util/configlexer.lex" -{ YDVAR(0, VAR_DYNLIB) } +{ YDVAR(1, VAR_DYNLIB_FILE) } YY_BREAK case 223: YY_RULE_SETUP #line 438 "./util/configlexer.lex" -{ YDVAR(1, VAR_DOMAIN_INSECURE) } +{ YDVAR(0, VAR_DYNLIB) } YY_BREAK case 224: YY_RULE_SETUP #line 439 "./util/configlexer.lex" -{ YDVAR(1, VAR_MINIMAL_RESPONSES) } +{ YDVAR(1, VAR_DOMAIN_INSECURE) } YY_BREAK case 225: YY_RULE_SETUP #line 440 "./util/configlexer.lex" -{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } +{ YDVAR(1, VAR_MINIMAL_RESPONSES) } YY_BREAK case 226: YY_RULE_SETUP #line 441 "./util/configlexer.lex" -{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } +{ YDVAR(1, VAR_RRSET_ROUNDROBIN) } YY_BREAK case 227: YY_RULE_SETUP #line 442 "./util/configlexer.lex" -{ YDVAR(1, VAR_MAX_UDP_SIZE) } +{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) } YY_BREAK case 228: YY_RULE_SETUP #line 443 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_PREFIX) } +{ YDVAR(1, VAR_MAX_UDP_SIZE) } YY_BREAK case 229: YY_RULE_SETUP #line 444 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_SYNTHALL) } +{ YDVAR(1, VAR_DNS64_PREFIX) } YY_BREAK case 230: YY_RULE_SETUP #line 445 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } +{ YDVAR(1, VAR_DNS64_SYNTHALL) } YY_BREAK case 231: YY_RULE_SETUP #line 446 "./util/configlexer.lex" -{ YDVAR(1, VAR_DEFINE_TAG) } +{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) } YY_BREAK case 232: YY_RULE_SETUP #line 447 "./util/configlexer.lex" -{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } +{ YDVAR(1, VAR_DEFINE_TAG) } YY_BREAK case 233: YY_RULE_SETUP #line 448 "./util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } +{ YDVAR(2, VAR_LOCAL_ZONE_TAG) } YY_BREAK case 234: YY_RULE_SETUP #line 449 "./util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } +{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) } YY_BREAK case 235: YY_RULE_SETUP #line 450 "./util/configlexer.lex" -{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) } YY_BREAK case 236: YY_RULE_SETUP #line 451 "./util/configlexer.lex" -{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } +{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) } YY_BREAK case 237: YY_RULE_SETUP #line 452 "./util/configlexer.lex" -{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } +{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) } YY_BREAK case 238: YY_RULE_SETUP #line 453 "./util/configlexer.lex" -{ YDVAR(0, VAR_DNSTAP) } +{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) } YY_BREAK case 239: YY_RULE_SETUP #line 454 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_ENABLE) } +{ YDVAR(0, VAR_DNSTAP) } YY_BREAK case 240: YY_RULE_SETUP #line 455 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } +{ YDVAR(1, VAR_DNSTAP_ENABLE) } YY_BREAK case 241: YY_RULE_SETUP #line 456 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } +{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) } YY_BREAK case 242: YY_RULE_SETUP #line 457 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IP) } +{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) } YY_BREAK case 243: YY_RULE_SETUP #line 458 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS) } +{ YDVAR(1, VAR_DNSTAP_IP) } YY_BREAK case 244: YY_RULE_SETUP #line 459 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } +{ YDVAR(1, VAR_DNSTAP_TLS) } YY_BREAK case 245: YY_RULE_SETUP #line 460 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } +{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) } YY_BREAK case 246: YY_RULE_SETUP #line 461 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } +{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) } YY_BREAK case 247: YY_RULE_SETUP -#line 463 "./util/configlexer.lex" +#line 462 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) } YY_BREAK case 248: YY_RULE_SETUP -#line 465 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } +#line 464 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) } YY_BREAK case 249: YY_RULE_SETUP #line 466 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } +{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) } YY_BREAK case 250: YY_RULE_SETUP #line 467 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_IDENTITY) } +{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) } YY_BREAK case 251: YY_RULE_SETUP #line 468 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSTAP_VERSION) } +{ YDVAR(1, VAR_DNSTAP_IDENTITY) } YY_BREAK case 252: YY_RULE_SETUP #line 469 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } +{ YDVAR(1, VAR_DNSTAP_VERSION) } YY_BREAK case 253: YY_RULE_SETUP -#line 471 "./util/configlexer.lex" +#line 470 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) } YY_BREAK case 254: YY_RULE_SETUP -#line 473 "./util/configlexer.lex" +#line 472 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) } YY_BREAK case 255: YY_RULE_SETUP -#line 475 "./util/configlexer.lex" +#line 474 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) } YY_BREAK case 256: YY_RULE_SETUP -#line 477 "./util/configlexer.lex" +#line 476 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) } YY_BREAK case 257: YY_RULE_SETUP -#line 479 "./util/configlexer.lex" +#line 478 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) } YY_BREAK case 258: YY_RULE_SETUP -#line 481 "./util/configlexer.lex" -{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } +#line 480 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) } YY_BREAK case 259: YY_RULE_SETUP #line 482 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT) } +{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) } YY_BREAK case 260: YY_RULE_SETUP #line 483 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT) } +{ YDVAR(1, VAR_IP_RATELIMIT) } YY_BREAK case 261: YY_RULE_SETUP #line 484 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } +{ YDVAR(1, VAR_RATELIMIT) } YY_BREAK case 262: YY_RULE_SETUP #line 485 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SLABS) } +{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) } YY_BREAK case 263: YY_RULE_SETUP #line 486 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } +{ YDVAR(1, VAR_RATELIMIT_SLABS) } YY_BREAK case 264: YY_RULE_SETUP #line 487 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_SIZE) } +{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) } YY_BREAK case 265: YY_RULE_SETUP #line 488 "./util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } +{ YDVAR(1, VAR_RATELIMIT_SIZE) } YY_BREAK case 266: YY_RULE_SETUP #line 489 "./util/configlexer.lex" -{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } +{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) } YY_BREAK case 267: YY_RULE_SETUP #line 490 "./util/configlexer.lex" -{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } +{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) } YY_BREAK case 268: YY_RULE_SETUP #line 491 "./util/configlexer.lex" -{ YDVAR(1, VAR_RATELIMIT_FACTOR) } +{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) } YY_BREAK case 269: YY_RULE_SETUP #line 492 "./util/configlexer.lex" -{ YDVAR(1, VAR_LOW_RTT) } +{ YDVAR(1, VAR_RATELIMIT_FACTOR) } YY_BREAK case 270: YY_RULE_SETUP #line 493 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_NUM) } +{ YDVAR(1, VAR_LOW_RTT) } YY_BREAK case 271: YY_RULE_SETUP #line 494 "./util/configlexer.lex" -{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } +{ YDVAR(1, VAR_FAST_SERVER_NUM) } YY_BREAK case 272: YY_RULE_SETUP @@ -4823,99 +4837,99 @@ YY_RULE_SETUP case 274: YY_RULE_SETUP #line 497 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_TAG) } +{ YDVAR(1, VAR_FAST_SERVER_PERMIL) } YY_BREAK case 275: YY_RULE_SETUP #line 498 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP) } +{ YDVAR(2, VAR_RESPONSE_IP_TAG) } YY_BREAK case 276: YY_RULE_SETUP #line 499 "./util/configlexer.lex" -{ YDVAR(2, VAR_RESPONSE_IP_DATA) } +{ YDVAR(2, VAR_RESPONSE_IP) } YY_BREAK case 277: YY_RULE_SETUP #line 500 "./util/configlexer.lex" -{ YDVAR(0, VAR_DNSCRYPT) } +{ YDVAR(2, VAR_RESPONSE_IP_DATA) } YY_BREAK case 278: YY_RULE_SETUP #line 501 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } +{ YDVAR(0, VAR_DNSCRYPT) } YY_BREAK case 279: YY_RULE_SETUP #line 502 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PORT) } +{ YDVAR(1, VAR_DNSCRYPT_ENABLE) } YY_BREAK case 280: YY_RULE_SETUP #line 503 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } +{ YDVAR(1, VAR_DNSCRYPT_PORT) } YY_BREAK case 281: YY_RULE_SETUP #line 504 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) } YY_BREAK case 282: YY_RULE_SETUP #line 505 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } +{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) } YY_BREAK case 283: YY_RULE_SETUP #line 506 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) } YY_BREAK case 284: YY_RULE_SETUP #line 507 "./util/configlexer.lex" -{ - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } +{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) } YY_BREAK case 285: YY_RULE_SETUP -#line 509 "./util/configlexer.lex" +#line 508 "./util/configlexer.lex" { - YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) } YY_BREAK case 286: YY_RULE_SETUP -#line 511 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } +#line 510 "./util/configlexer.lex" +{ + YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) } YY_BREAK case 287: YY_RULE_SETUP #line 512 "./util/configlexer.lex" -{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) } YY_BREAK case 288: YY_RULE_SETUP #line 513 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_ENABLED) } +{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) } YY_BREAK case 289: YY_RULE_SETUP #line 514 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } +{ YDVAR(1, VAR_IPSECMOD_ENABLED) } YY_BREAK case 290: YY_RULE_SETUP #line 515 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_HOOK) } +{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) } YY_BREAK case 291: YY_RULE_SETUP #line 516 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } +{ YDVAR(1, VAR_IPSECMOD_HOOK) } YY_BREAK case 292: YY_RULE_SETUP #line 517 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } +{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) } YY_BREAK case 293: YY_RULE_SETUP @@ -4925,113 +4939,118 @@ YY_RULE_SETUP case 294: YY_RULE_SETUP #line 519 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSECMOD_STRICT) } +{ YDVAR(1, VAR_IPSECMOD_WHITELIST) } YY_BREAK case 295: YY_RULE_SETUP #line 520 "./util/configlexer.lex" -{ YDVAR(0, VAR_CACHEDB) } +{ YDVAR(1, VAR_IPSECMOD_STRICT) } YY_BREAK case 296: YY_RULE_SETUP #line 521 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_BACKEND) } +{ YDVAR(0, VAR_CACHEDB) } YY_BREAK case 297: YY_RULE_SETUP #line 522 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } +{ YDVAR(1, VAR_CACHEDB_BACKEND) } YY_BREAK case 298: YY_RULE_SETUP #line 523 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISHOST) } +{ YDVAR(1, VAR_CACHEDB_SECRETSEED) } YY_BREAK case 299: YY_RULE_SETUP #line 524 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISPORT) } +{ YDVAR(1, VAR_CACHEDB_REDISHOST) } YY_BREAK case 300: YY_RULE_SETUP #line 525 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } +{ YDVAR(1, VAR_CACHEDB_REDISPORT) } YY_BREAK case 301: YY_RULE_SETUP #line 526 "./util/configlexer.lex" -{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } +{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) } YY_BREAK case 302: YY_RULE_SETUP #line 527 "./util/configlexer.lex" -{ YDVAR(0, VAR_IPSET) } +{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) } YY_BREAK case 303: YY_RULE_SETUP #line 528 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V4) } +{ YDVAR(0, VAR_IPSET) } YY_BREAK case 304: YY_RULE_SETUP #line 529 "./util/configlexer.lex" -{ YDVAR(1, VAR_IPSET_NAME_V6) } +{ YDVAR(1, VAR_IPSET_NAME_V4) } YY_BREAK case 305: YY_RULE_SETUP #line 530 "./util/configlexer.lex" -{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } +{ YDVAR(1, VAR_IPSET_NAME_V6) } YY_BREAK case 306: YY_RULE_SETUP #line 531 "./util/configlexer.lex" -{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } +{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) } YY_BREAK case 307: YY_RULE_SETUP #line 532 "./util/configlexer.lex" -{ YDVAR(2, VAR_EDNS_CLIENT_TAG) } +{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) } YY_BREAK case 308: YY_RULE_SETUP #line 533 "./util/configlexer.lex" -{ YDVAR(1, VAR_EDNS_CLIENT_TAG_OPCODE) } +{ YDVAR(2, VAR_EDNS_CLIENT_TAG) } YY_BREAK case 309: -/* rule 309 can match eol */ YY_RULE_SETUP #line 534 "./util/configlexer.lex" +{ YDVAR(1, VAR_EDNS_CLIENT_TAG_OPCODE) } + YY_BREAK +case 310: +/* rule 310 can match eol */ +YY_RULE_SETUP +#line 535 "./util/configlexer.lex" { LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK /* Quoted strings. Strip leading and ending quotes */ -case 310: +case 311: YY_RULE_SETUP -#line 537 "./util/configlexer.lex" +#line 538 "./util/configlexer.lex" { BEGIN(quotedstring); LEXOUT(("QS ")); } YY_BREAK case YY_STATE_EOF(quotedstring): -#line 538 "./util/configlexer.lex" +#line 539 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 311: -YY_RULE_SETUP -#line 543 "./util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 312: -/* rule 312 can match eol */ YY_RULE_SETUP #line 544 "./util/configlexer.lex" +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } + YY_BREAK +case 313: +/* rule 313 can match eol */ +YY_RULE_SETUP +#line 545 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end \""); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 313: +case 314: YY_RULE_SETUP -#line 546 "./util/configlexer.lex" +#line 547 "./util/configlexer.lex" { LEXOUT(("QE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5044,34 +5063,34 @@ YY_RULE_SETUP } YY_BREAK /* Single Quoted strings. Strip leading and ending quotes */ -case 314: +case 315: YY_RULE_SETUP -#line 558 "./util/configlexer.lex" +#line 559 "./util/configlexer.lex" { BEGIN(singlequotedstr); LEXOUT(("SQS ")); } YY_BREAK case YY_STATE_EOF(singlequotedstr): -#line 559 "./util/configlexer.lex" +#line 560 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); if(--num_args == 0) { BEGIN(INITIAL); } else { BEGIN(val); } } YY_BREAK -case 315: -YY_RULE_SETUP -#line 564 "./util/configlexer.lex" -{ LEXOUT(("STR(%s) ", yytext)); yymore(); } - YY_BREAK case 316: -/* rule 316 can match eol */ YY_RULE_SETUP #line 565 "./util/configlexer.lex" +{ LEXOUT(("STR(%s) ", yytext)); yymore(); } + YY_BREAK +case 317: +/* rule 317 can match eol */ +YY_RULE_SETUP +#line 566 "./util/configlexer.lex" { yyerror("newline inside quoted string, no end '"); cfg_parser->line++; BEGIN(INITIAL); } YY_BREAK -case 317: +case 318: YY_RULE_SETUP -#line 567 "./util/configlexer.lex" +#line 568 "./util/configlexer.lex" { LEXOUT(("SQE ")); if(--num_args == 0) { BEGIN(INITIAL); } @@ -5084,38 +5103,38 @@ YY_RULE_SETUP } YY_BREAK /* include: directive */ -case 318: +case 319: YY_RULE_SETUP -#line 579 "./util/configlexer.lex" +#line 580 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); } YY_BREAK case YY_STATE_EOF(include): -#line 581 "./util/configlexer.lex" +#line 582 "./util/configlexer.lex" { yyerror("EOF inside include directive"); BEGIN(inc_prev); } YY_BREAK -case 319: -YY_RULE_SETUP -#line 585 "./util/configlexer.lex" -{ LEXOUT(("ISP ")); /* ignore */ } - YY_BREAK case 320: -/* rule 320 can match eol */ YY_RULE_SETUP #line 586 "./util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++;} +{ LEXOUT(("ISP ")); /* ignore */ } YY_BREAK case 321: +/* rule 321 can match eol */ YY_RULE_SETUP #line 587 "./util/configlexer.lex" -{ LEXOUT(("IQS ")); BEGIN(include_quoted); } +{ LEXOUT(("NL\n")); cfg_parser->line++;} YY_BREAK case 322: YY_RULE_SETUP #line 588 "./util/configlexer.lex" +{ LEXOUT(("IQS ")); BEGIN(include_quoted); } + YY_BREAK +case 323: +YY_RULE_SETUP +#line 589 "./util/configlexer.lex" { LEXOUT(("Iunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 0); @@ -5123,27 +5142,27 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_quoted): -#line 593 "./util/configlexer.lex" +#line 594 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 323: -YY_RULE_SETUP -#line 597 "./util/configlexer.lex" -{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } - YY_BREAK case 324: -/* rule 324 can match eol */ YY_RULE_SETUP #line 598 "./util/configlexer.lex" +{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); } + YY_BREAK +case 325: +/* rule 325 can match eol */ +YY_RULE_SETUP +#line 599 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 325: +case 326: YY_RULE_SETUP -#line 600 "./util/configlexer.lex" +#line 601 "./util/configlexer.lex" { LEXOUT(("IQE ")); yytext[yyleng - 1] = '\0'; @@ -5153,7 +5172,7 @@ YY_RULE_SETUP YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(val): -#line 606 "./util/configlexer.lex" +#line 607 "./util/configlexer.lex" { LEXOUT(("LEXEOF ")); yy_set_bol(1); /* Set beginning of line, so "^" rules match. */ @@ -5168,39 +5187,39 @@ case YY_STATE_EOF(val): } YY_BREAK /* include-toplevel: directive */ -case 326: +case 327: YY_RULE_SETUP -#line 620 "./util/configlexer.lex" +#line 621 "./util/configlexer.lex" { LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel); } YY_BREAK case YY_STATE_EOF(include_toplevel): -#line 623 "./util/configlexer.lex" +#line 624 "./util/configlexer.lex" { yyerror("EOF inside include_toplevel directive"); BEGIN(inc_prev); } YY_BREAK -case 327: -YY_RULE_SETUP -#line 627 "./util/configlexer.lex" -{ LEXOUT(("ITSP ")); /* ignore */ } - YY_BREAK case 328: -/* rule 328 can match eol */ YY_RULE_SETUP #line 628 "./util/configlexer.lex" -{ LEXOUT(("NL\n")); cfg_parser->line++; } +{ LEXOUT(("ITSP ")); /* ignore */ } YY_BREAK case 329: +/* rule 329 can match eol */ YY_RULE_SETUP #line 629 "./util/configlexer.lex" -{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } +{ LEXOUT(("NL\n")); cfg_parser->line++; } YY_BREAK case 330: YY_RULE_SETUP #line 630 "./util/configlexer.lex" +{ LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); } + YY_BREAK +case 331: +YY_RULE_SETUP +#line 631 "./util/configlexer.lex" { LEXOUT(("ITunquotedstr(%s) ", yytext)); config_start_include_glob(yytext, 1); @@ -5209,29 +5228,29 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(include_toplevel_quoted): -#line 636 "./util/configlexer.lex" +#line 637 "./util/configlexer.lex" { yyerror("EOF inside quoted string"); BEGIN(inc_prev); } YY_BREAK -case 331: -YY_RULE_SETUP -#line 640 "./util/configlexer.lex" -{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } - YY_BREAK case 332: -/* rule 332 can match eol */ YY_RULE_SETUP #line 641 "./util/configlexer.lex" +{ LEXOUT(("ITSTR(%s) ", yytext)); yymore(); } + YY_BREAK +case 333: +/* rule 333 can match eol */ +YY_RULE_SETUP +#line 642 "./util/configlexer.lex" { yyerror("newline before \" in include name"); cfg_parser->line++; BEGIN(inc_prev); } YY_BREAK -case 333: +case 334: YY_RULE_SETUP -#line 645 "./util/configlexer.lex" +#line 646 "./util/configlexer.lex" { LEXOUT(("ITQE ")); yytext[yyleng - 1] = '\0'; @@ -5240,33 +5259,33 @@ YY_RULE_SETUP return (VAR_FORCE_TOPLEVEL); } YY_BREAK -case 334: +case 335: YY_RULE_SETUP -#line 653 "./util/configlexer.lex" +#line 654 "./util/configlexer.lex" { LEXOUT(("unquotedstr(%s) ", yytext)); if(--num_args == 0) { BEGIN(INITIAL); } yylval.str = strdup(yytext); return STRING_ARG; } YY_BREAK -case 335: +case 336: YY_RULE_SETUP -#line 657 "./util/configlexer.lex" +#line 658 "./util/configlexer.lex" { ub_c_error_msg("unknown keyword '%s'", yytext); } YY_BREAK -case 336: +case 337: YY_RULE_SETUP -#line 661 "./util/configlexer.lex" +#line 662 "./util/configlexer.lex" { ub_c_error_msg("stray '%s'", yytext); } YY_BREAK -case 337: +case 338: YY_RULE_SETUP -#line 665 "./util/configlexer.lex" +#line 666 "./util/configlexer.lex" ECHO; YY_BREAK -#line 5267 "" +#line 5286 "" case YY_END_OF_BUFFER: { @@ -5561,7 +5580,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3300 ) + if ( yy_current_state >= 3315 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -5589,11 +5608,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3300 ) + if ( yy_current_state >= 3315 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 3299); + yy_is_jam = (yy_current_state == 3314); return yy_is_jam ? 0 : yy_current_state; } @@ -6232,6 +6251,6 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 665 "./util/configlexer.lex" +#line 666 "./util/configlexer.lex" diff --git a/util/configlexer.lex b/util/configlexer.lex index 460cce2c2..632952651 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -400,6 +400,7 @@ neg-cache-size{COLON} { YDVAR(1, VAR_NEG_CACHE_SIZE) } val-nsec3-keysize-iterations{COLON} { YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) } zonemd-permissive-mode{COLON} { YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) } +zonemd-reject-absence{COLON} { YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) } add-holddown{COLON} { YDVAR(1, VAR_ADD_HOLDDOWN) } del-holddown{COLON} { YDVAR(1, VAR_DEL_HOLDDOWN) } keep-missing{COLON} { YDVAR(1, VAR_KEEP_MISSING) } diff --git a/util/configparser.c b/util/configparser.c index d527cdf9c..68ca1e9f3 100644 --- a/util/configparser.c +++ b/util/configparser.c @@ -433,7 +433,8 @@ extern int yydebug; VAR_DYNLIB_FILE = 554, VAR_EDNS_CLIENT_TAG = 555, VAR_EDNS_CLIENT_TAG_OPCODE = 556, - VAR_ZONEMD_PERMISSIVE_MODE = 557 + VAR_ZONEMD_PERMISSIVE_MODE = 557, + VAR_ZONEMD_REJECT_ABSENCE = 558 }; #endif /* Tokens. */ @@ -737,6 +738,7 @@ extern int yydebug; #define VAR_EDNS_CLIENT_TAG 555 #define VAR_EDNS_CLIENT_TAG_OPCODE 556 #define VAR_ZONEMD_PERMISSIVE_MODE 557 +#define VAR_ZONEMD_REJECT_ABSENCE 558 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -746,7 +748,7 @@ union YYSTYPE char* str; -#line 750 "util/configparser.c" +#line 752 "util/configparser.c" }; typedef union YYSTYPE YYSTYPE; @@ -996,19 +998,19 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 2 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 640 +#define YYLAST 642 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 303 +#define YYNTOKENS 304 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 328 +#define YYNNTS 329 /* YYNRULES -- Number of rules. */ -#define YYNRULES 632 +#define YYNRULES 634 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 939 +#define YYNSTATES 942 #define YYUNDEFTOK 2 -#define YYMAXUTOK 557 +#define YYMAXUTOK 558 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ @@ -1074,7 +1076,7 @@ static const yytype_uint16 yytranslate[] = 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302 + 295, 296, 297, 298, 299, 300, 301, 302, 303 }; #if YYDEBUG @@ -1106,45 +1108,45 @@ static const yytype_uint16 yyrline[] = 293, 294, 294, 295, 295, 296, 296, 298, 310, 311, 312, 312, 312, 312, 312, 313, 313, 315, 327, 328, 329, 329, 329, 329, 330, 330, 332, 346, 347, 348, - 348, 348, 348, 349, 349, 349, 351, 368, 369, 370, - 370, 370, 370, 371, 371, 371, 372, 375, 394, 411, - 419, 429, 437, 454, 455, 456, 456, 456, 456, 456, - 457, 457, 457, 458, 458, 460, 469, 478, 489, 498, - 507, 516, 527, 536, 548, 562, 577, 588, 605, 622, - 639, 656, 671, 686, 699, 714, 723, 732, 741, 750, - 759, 768, 777, 786, 795, 804, 813, 822, 831, 840, - 853, 862, 875, 884, 893, 902, 909, 916, 925, 932, - 941, 949, 956, 963, 971, 980, 988, 1004, 1012, 1020, - 1028, 1036, 1044, 1053, 1062, 1076, 1085, 1094, 1103, 1112, - 1121, 1130, 1137, 1144, 1170, 1178, 1185, 1192, 1199, 1206, - 1214, 1222, 1230, 1237, 1248, 1259, 1266, 1275, 1284, 1293, - 1300, 1307, 1315, 1323, 1333, 1343, 1353, 1367, 1375, 1388, - 1399, 1407, 1420, 1429, 1438, 1447, 1457, 1467, 1475, 1488, - 1497, 1505, 1514, 1522, 1535, 1544, 1554, 1561, 1571, 1581, - 1591, 1601, 1611, 1621, 1631, 1641, 1648, 1655, 1662, 1671, - 1680, 1689, 1698, 1705, 1715, 1735, 1742, 1760, 1773, 1786, - 1795, 1804, 1813, 1822, 1832, 1842, 1853, 1862, 1871, 1880, - 1889, 1898, 1907, 1920, 1933, 1942, 1949, 1958, 1967, 1976, - 1985, 1994, 2002, 2015, 2023, 2064, 2071, 2086, 2096, 2106, - 2113, 2120, 2127, 2136, 2144, 2158, 2179, 2200, 2212, 2224, - 2236, 2245, 2266, 2276, 2285, 2293, 2301, 2314, 2327, 2342, - 2357, 2366, 2375, 2381, 2390, 2399, 2409, 2419, 2432, 2445, - 2457, 2471, 2483, 2497, 2512, 2523, 2533, 2540, 2547, 2556, - 2565, 2575, 2585, 2595, 2602, 2609, 2618, 2627, 2637, 2647, - 2654, 2661, 2668, 2676, 2686, 2696, 2706, 2716, 2755, 2765, - 2773, 2781, 2796, 2805, 2810, 2811, 2812, 2812, 2812, 2813, - 2813, 2813, 2814, 2814, 2816, 2826, 2835, 2842, 2849, 2856, - 2863, 2870, 2877, 2882, 2883, 2884, 2884, 2884, 2885, 2885, - 2885, 2886, 2887, 2887, 2888, 2888, 2889, 2889, 2890, 2891, - 2892, 2893, 2894, 2895, 2897, 2906, 2916, 2923, 2930, 2939, - 2946, 2953, 2960, 2967, 2976, 2985, 2992, 2999, 3009, 3019, - 3029, 3039, 3049, 3059, 3064, 3065, 3066, 3068, 3074, 3079, - 3080, 3081, 3083, 3089, 3099, 3106, 3115, 3123, 3128, 3129, - 3131, 3131, 3131, 3132, 3132, 3133, 3134, 3135, 3136, 3137, - 3139, 3149, 3158, 3165, 3174, 3181, 3190, 3198, 3211, 3219, - 3232, 3237, 3238, 3239, 3239, 3240, 3240, 3240, 3241, 3243, - 3255, 3267, 3279, 3294, 3307, 3320, 3331, 3336, 3337, 3338, - 3338, 3340, 3355 + 348, 348, 348, 349, 349, 349, 351, 369, 370, 371, + 371, 371, 371, 372, 372, 372, 373, 373, 376, 395, + 412, 420, 430, 438, 455, 456, 457, 457, 457, 457, + 457, 458, 458, 458, 459, 459, 461, 470, 479, 490, + 499, 508, 517, 528, 537, 549, 563, 578, 589, 606, + 623, 640, 657, 672, 687, 700, 715, 724, 733, 742, + 751, 760, 769, 778, 787, 796, 805, 814, 823, 832, + 841, 854, 863, 876, 885, 894, 903, 910, 917, 926, + 933, 942, 950, 957, 964, 972, 981, 989, 1005, 1013, + 1021, 1029, 1037, 1045, 1054, 1063, 1077, 1086, 1095, 1104, + 1113, 1122, 1131, 1138, 1145, 1171, 1179, 1186, 1193, 1200, + 1207, 1215, 1223, 1231, 1238, 1249, 1260, 1267, 1276, 1285, + 1294, 1301, 1308, 1316, 1324, 1334, 1344, 1354, 1368, 1376, + 1389, 1400, 1408, 1421, 1430, 1439, 1448, 1458, 1468, 1476, + 1489, 1498, 1506, 1515, 1523, 1536, 1545, 1555, 1562, 1572, + 1582, 1592, 1602, 1612, 1622, 1632, 1642, 1649, 1656, 1663, + 1672, 1681, 1690, 1699, 1706, 1716, 1736, 1743, 1761, 1774, + 1787, 1796, 1805, 1814, 1823, 1833, 1843, 1854, 1863, 1872, + 1881, 1890, 1899, 1908, 1921, 1934, 1943, 1950, 1959, 1968, + 1977, 1986, 1995, 2003, 2016, 2024, 2065, 2072, 2087, 2097, + 2107, 2114, 2121, 2128, 2137, 2145, 2159, 2180, 2201, 2213, + 2225, 2237, 2246, 2267, 2277, 2286, 2294, 2302, 2315, 2328, + 2343, 2358, 2367, 2376, 2382, 2391, 2400, 2410, 2420, 2433, + 2446, 2458, 2472, 2484, 2498, 2513, 2524, 2534, 2541, 2548, + 2557, 2566, 2576, 2586, 2596, 2603, 2610, 2619, 2628, 2638, + 2648, 2655, 2662, 2669, 2677, 2687, 2697, 2707, 2717, 2727, + 2766, 2776, 2784, 2792, 2807, 2816, 2821, 2822, 2823, 2823, + 2823, 2824, 2824, 2824, 2825, 2825, 2827, 2837, 2846, 2853, + 2860, 2867, 2874, 2881, 2888, 2893, 2894, 2895, 2895, 2895, + 2896, 2896, 2896, 2897, 2898, 2898, 2899, 2899, 2900, 2900, + 2901, 2902, 2903, 2904, 2905, 2906, 2908, 2917, 2927, 2934, + 2941, 2950, 2957, 2964, 2971, 2978, 2987, 2996, 3003, 3010, + 3020, 3030, 3040, 3050, 3060, 3070, 3075, 3076, 3077, 3079, + 3085, 3090, 3091, 3092, 3094, 3100, 3110, 3117, 3126, 3134, + 3139, 3140, 3142, 3142, 3142, 3143, 3143, 3144, 3145, 3146, + 3147, 3148, 3150, 3160, 3169, 3176, 3185, 3192, 3201, 3209, + 3222, 3230, 3243, 3248, 3249, 3250, 3250, 3251, 3251, 3251, + 3252, 3254, 3266, 3278, 3290, 3305, 3318, 3331, 3342, 3347, + 3348, 3349, 3349, 3351, 3366 }; #endif @@ -1265,17 +1267,18 @@ static const char *const yytname[] = "VAR_RPZ", "VAR_TAGS", "VAR_RPZ_ACTION_OVERRIDE", "VAR_RPZ_CNAME_OVERRIDE", "VAR_RPZ_LOG", "VAR_RPZ_LOG_NAME", "VAR_DYNLIB", "VAR_DYNLIB_FILE", "VAR_EDNS_CLIENT_TAG", - "VAR_EDNS_CLIENT_TAG_OPCODE", "VAR_ZONEMD_PERMISSIVE_MODE", "$accept", - "toplevelvars", "toplevelvar", "force_toplevel", "serverstart", - "contents_server", "content_server", "stubstart", "contents_stub", - "content_stub", "forwardstart", "contents_forward", "content_forward", - "viewstart", "contents_view", "content_view", "authstart", - "contents_auth", "content_auth", "rpz_tag", "rpz_action_override", - "rpz_cname_override", "rpz_log", "rpz_log_name", "rpzstart", - "contents_rpz", "content_rpz", "server_num_threads", "server_verbosity", - "server_statistics_interval", "server_statistics_cumulative", - "server_extended_statistics", "server_shm_enable", "server_shm_key", - "server_port", "server_send_client_subnet", "server_client_subnet_zone", + "VAR_EDNS_CLIENT_TAG_OPCODE", "VAR_ZONEMD_PERMISSIVE_MODE", + "VAR_ZONEMD_REJECT_ABSENCE", "$accept", "toplevelvars", "toplevelvar", + "force_toplevel", "serverstart", "contents_server", "content_server", + "stubstart", "contents_stub", "content_stub", "forwardstart", + "contents_forward", "content_forward", "viewstart", "contents_view", + "content_view", "authstart", "contents_auth", "content_auth", "rpz_tag", + "rpz_action_override", "rpz_cname_override", "rpz_log", "rpz_log_name", + "rpzstart", "contents_rpz", "content_rpz", "server_num_threads", + "server_verbosity", "server_statistics_interval", + "server_statistics_cumulative", "server_extended_statistics", + "server_shm_enable", "server_shm_key", "server_port", + "server_send_client_subnet", "server_client_subnet_zone", "server_client_subnet_always_forward", "server_client_subnet_opcode", "server_max_client_subnet_ipv4", "server_max_client_subnet_ipv6", "server_min_client_subnet_ipv4", "server_min_client_subnet_ipv6", @@ -1363,11 +1366,12 @@ static const char *const yytname[] = "stub_first", "stub_no_cache", "stub_ssl_upstream", "stub_prime", "forward_name", "forward_host", "forward_addr", "forward_first", "forward_no_cache", "forward_ssl_upstream", "auth_name", "auth_zonefile", - "auth_master", "auth_url", "auth_allow_notify", "auth_for_downstream", - "auth_for_upstream", "auth_fallback_enabled", "view_name", - "view_local_zone", "view_response_ip", "view_response_ip_data", - "view_local_data", "view_local_data_ptr", "view_first", "rcstart", - "contents_rc", "content_rc", "rc_control_enable", "rc_control_port", + "auth_master", "auth_url", "auth_allow_notify", + "auth_zonemd_reject_absence", "auth_for_downstream", "auth_for_upstream", + "auth_fallback_enabled", "view_name", "view_local_zone", + "view_response_ip", "view_response_ip_data", "view_local_data", + "view_local_data_ptr", "view_first", "rcstart", "contents_rc", + "content_rc", "rc_control_enable", "rc_control_port", "rc_control_interface", "rc_control_use_cert", "rc_server_key_file", "rc_server_cert_file", "rc_control_key_file", "rc_control_cert_file", "dtstart", "contents_dt", "content_dt", "dt_dnstap_enable", @@ -1434,7 +1438,7 @@ static const yytype_uint16 yytoknum[] = 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 557 + 555, 556, 557, 558 }; # endif @@ -1455,12 +1459,12 @@ static const yytype_int16 yypact[] = -290, 0, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, 286, -42, -38, -43, -21, -44, -11, -95, - -109, -289, -214, -239, -281, 3, 4, 13, 25, 26, - 27, 30, 31, 32, 33, 34, 35, 37, 38, 39, - 40, 41, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 54, 55, 84, 85, 88, 89, 91, 93, - 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, + -290, -290, 286, -42, -36, -43, -44, -26, -67, -95, + -109, -289, -219, -216, -282, 3, 4, 5, 6, 37, + 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 54, 55, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 88, 89, 90, 91, + 93, 95, 96, 98, 99, 100, 101, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 131, 132, 133, 134, 135, 136, 137, @@ -1470,13 +1474,13 @@ static const yytype_int16 yypact[] = 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 214, 215, 216, 217, 218, 219, 220, 222, 223, 224, - 225, 226, 229, 231, 233, 246, 247, 248, 249, 250, - 251, 252, 253, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 279, 280, 281, 283, - 284, 285, 287, 321, 322, 323, 324, 328, 329, 330, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 216, + 217, 218, 219, 220, 222, 223, 224, 225, 226, 233, + 234, 235, 236, 237, 238, 240, 241, 242, 243, 244, + 246, 247, 248, 250, 251, 252, 253, 255, 256, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 279, 280, 281, 283, 284, + 285, 287, 321, 322, 323, 324, 328, 329, 330, 372, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, @@ -1497,55 +1501,56 @@ static const yytype_int16 yypact[] = -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, 372, 373, 374, 375, - 376, 377, 378, -290, -290, -290, -290, -290, -290, -290, - -290, 379, 380, 384, 388, 389, 414, -290, -290, -290, - -290, -290, -290, -290, 415, 416, 425, 437, 438, 439, - 440, -290, -290, -290, -290, -290, -290, -290, -290, 441, - 442, 443, 444, 445, 446, 447, 448, -290, -290, -290, - -290, -290, -290, -290, -290, -290, 449, 450, 451, 452, - 453, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, 454, 455, 456, 496, 498, 514, 515, 516, - -290, -290, -290, -290, -290, -290, -290, -290, -290, 517, - 518, 519, 520, 521, 522, 523, 524, 531, 532, 533, - 534, 535, 536, 537, 539, 540, 541, 542, -290, -290, + -290, -290, -290, -290, -290, -290, 373, 374, 375, 376, + 377, 378, 379, -290, -290, -290, -290, -290, -290, -290, + -290, 380, 384, 388, 389, 414, 415, -290, -290, -290, + -290, -290, -290, -290, 416, 425, 437, 438, 439, 440, + 441, -290, -290, -290, -290, -290, -290, -290, -290, 442, + 443, 444, 445, 446, 447, 448, 449, 450, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, 451, 452, + 453, 454, 455, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, 456, 496, 498, 514, 515, 516, + 517, 518, -290, -290, -290, -290, -290, -290, -290, -290, + -290, 519, 520, 521, 522, 523, 524, 531, 532, 533, + 534, 535, 536, 537, 539, 540, 541, 542, 543, 544, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, 543, -290, - -290, 544, -290, -290, 545, 548, 551, 554, 555, 564, - 565, 566, 568, 569, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, 570, 571, 572, 573, 574, - 575, -290, -290, -290, -290, -290, -290, -290, 579, 580, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + 545, -290, -290, 548, -290, -290, 551, 554, 555, 564, + 565, 566, 568, 569, 570, 571, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, 572, 573, 574, + 575, 579, 580, -290, -290, -290, -290, -290, -290, -290, + 581, 582, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, 583, 584, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, 581, 582, -290, -290, -290, -290, -290, + 585, 586, 587, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, 588, 589, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, 590, 591, 592, 593, 594, 595, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + -290, -290, -290, -290, -290, -290, -290, 596, -290, -290, + -290, -290, -290, -290, -290, -290, -290, 597, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, 583, 584, - 585, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, 586, 587, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, 588, 589, 590, 591, 592, 593, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, 594, -290, -290, -290, -290, - -290, -290, -290, -290, -290, 595, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, 596, -290, -290, 597, 598, -290, -290, -290, + -290, -290, -290, -290, 598, -290, -290, 599, 600, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, 599, 600, 601, - -290, -290, -290, -290, -290, -290, -290, -290, -290 + -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, + 601, 602, 603, -290, -290, -290, -290, -290, -290, -290, + -290, -290 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1553,10 +1558,10 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 2, 0, 1, 18, 19, 227, 237, 513, 573, 532, - 246, 587, 610, 256, 626, 272, 578, 3, 17, 21, - 229, 239, 248, 258, 274, 515, 534, 575, 580, 589, - 612, 628, 4, 5, 6, 10, 14, 15, 8, 9, + 2, 0, 1, 18, 19, 227, 237, 515, 575, 534, + 246, 589, 612, 256, 628, 273, 580, 3, 17, 21, + 229, 239, 248, 258, 275, 517, 536, 577, 582, 591, + 614, 630, 4, 5, 6, 10, 14, 15, 8, 9, 7, 16, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1603,50 +1608,51 @@ static const yytype_uint16 yydefact[] = 233, 0, 0, 0, 0, 0, 0, 238, 240, 241, 242, 243, 244, 245, 0, 0, 0, 0, 0, 0, 0, 247, 249, 250, 253, 254, 251, 255, 252, 0, - 0, 0, 0, 0, 0, 0, 0, 257, 259, 260, - 261, 262, 266, 263, 264, 265, 0, 0, 0, 0, - 0, 277, 281, 282, 283, 284, 273, 275, 276, 278, - 279, 280, 0, 0, 0, 0, 0, 0, 0, 0, - 514, 516, 518, 517, 523, 519, 520, 521, 522, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 257, 259, + 260, 261, 262, 266, 267, 263, 264, 265, 0, 0, + 0, 0, 0, 278, 282, 283, 284, 285, 274, 276, + 277, 279, 280, 281, 0, 0, 0, 0, 0, 0, + 0, 0, 516, 518, 520, 519, 525, 521, 522, 523, + 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 533, 535, - 537, 536, 538, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 552, 553, 0, 574, - 576, 0, 579, 581, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 588, 590, 591, 592, 594, 595, - 593, 596, 597, 598, 599, 0, 0, 0, 0, 0, - 0, 611, 613, 614, 615, 616, 617, 618, 0, 0, - 627, 629, 630, 286, 285, 292, 305, 303, 315, 311, - 312, 316, 313, 314, 317, 318, 319, 320, 321, 351, - 352, 353, 354, 355, 380, 381, 382, 387, 388, 308, - 389, 390, 393, 391, 392, 396, 397, 398, 412, 366, - 367, 369, 370, 399, 415, 360, 362, 416, 422, 423, - 424, 309, 379, 441, 442, 361, 435, 344, 304, 356, - 413, 419, 400, 0, 0, 445, 310, 287, 343, 404, - 288, 306, 307, 357, 358, 443, 402, 406, 407, 289, - 446, 383, 411, 345, 365, 417, 418, 421, 434, 359, - 439, 437, 438, 371, 378, 408, 409, 372, 373, 401, - 426, 346, 347, 350, 322, 324, 325, 326, 327, 328, - 335, 336, 337, 338, 339, 340, 341, 447, 448, 450, - 384, 385, 386, 394, 395, 451, 452, 453, 0, 0, - 0, 403, 374, 376, 583, 462, 466, 464, 463, 467, - 465, 0, 0, 470, 471, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 405, 420, 440, 475, 476, - 375, 454, 0, 0, 0, 0, 0, 0, 427, 428, - 429, 430, 431, 432, 433, 584, 368, 363, 425, 342, - 290, 291, 364, 477, 479, 478, 480, 481, 482, 323, - 330, 472, 474, 473, 329, 0, 349, 410, 449, 348, - 377, 331, 332, 334, 333, 0, 484, 436, 485, 486, - 487, 491, 490, 488, 489, 492, 493, 494, 495, 497, - 496, 506, 0, 510, 511, 0, 0, 512, 498, 504, - 499, 500, 501, 503, 505, 502, 267, 268, 269, 270, - 271, 524, 526, 525, 528, 529, 530, 531, 527, 554, - 556, 557, 558, 559, 560, 561, 562, 563, 564, 555, - 565, 566, 567, 568, 569, 570, 571, 572, 577, 582, - 600, 601, 602, 605, 603, 604, 606, 607, 608, 609, - 619, 620, 621, 622, 623, 624, 631, 632, 414, 444, - 461, 585, 586, 468, 469, 455, 456, 0, 0, 0, - 460, 625, 483, 507, 508, 509, 459, 457, 458 + 535, 537, 539, 538, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 0, 576, 578, 0, 581, 583, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 590, 592, 593, 594, + 596, 597, 595, 598, 599, 600, 601, 0, 0, 0, + 0, 0, 0, 613, 615, 616, 617, 618, 619, 620, + 0, 0, 629, 631, 632, 287, 286, 293, 306, 304, + 316, 312, 313, 317, 314, 315, 318, 319, 320, 321, + 322, 352, 353, 354, 355, 356, 381, 382, 383, 388, + 389, 309, 390, 391, 394, 392, 393, 397, 398, 399, + 413, 367, 368, 370, 371, 400, 416, 361, 363, 417, + 423, 424, 425, 310, 380, 442, 443, 362, 436, 345, + 305, 357, 414, 420, 401, 0, 0, 446, 311, 288, + 344, 405, 289, 307, 308, 358, 359, 444, 403, 407, + 408, 290, 447, 384, 412, 346, 366, 418, 419, 422, + 435, 360, 440, 438, 439, 372, 379, 409, 410, 373, + 374, 402, 427, 347, 348, 351, 323, 325, 326, 327, + 328, 329, 336, 337, 338, 339, 340, 341, 342, 448, + 449, 451, 385, 386, 387, 395, 396, 452, 453, 454, + 0, 0, 0, 404, 375, 377, 585, 463, 467, 465, + 464, 468, 466, 0, 0, 471, 472, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 406, 421, 441, + 476, 477, 376, 455, 0, 0, 0, 0, 0, 0, + 428, 429, 430, 431, 432, 433, 434, 586, 369, 364, + 426, 343, 291, 292, 365, 478, 480, 479, 481, 482, + 483, 324, 331, 473, 475, 474, 330, 0, 350, 411, + 450, 349, 378, 332, 333, 335, 334, 0, 485, 437, + 486, 487, 488, 492, 491, 489, 490, 493, 494, 495, + 496, 498, 497, 508, 0, 512, 513, 0, 0, 514, + 499, 506, 500, 501, 502, 505, 507, 503, 504, 268, + 269, 270, 271, 272, 526, 528, 527, 530, 531, 532, + 533, 529, 556, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 557, 567, 568, 569, 570, 571, 572, 573, + 574, 579, 584, 602, 603, 604, 607, 605, 606, 608, + 609, 610, 611, 621, 622, 623, 624, 625, 626, 633, + 634, 415, 445, 462, 587, 588, 469, 470, 456, 457, + 0, 0, 0, 461, 627, 484, 509, 510, 511, 460, + 458, 459 }; /* YYPGOTO[NTERM-NUM]. */ @@ -1676,7 +1682,7 @@ static const yytype_int16 yypgoto[] = -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - 576, 577, 578, 602, 603, -290, -290, -290, -290, -290, + 259, 577, 578, 604, 605, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, @@ -1684,15 +1690,15 @@ static const yytype_int16 yypgoto[] = -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290 + -290, -290, -290, -290, -290, -290, -290, -290, -290 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 17, 18, 19, 32, 250, 20, 33, 463, - 21, 34, 477, 22, 35, 491, 23, 36, 507, 521, - 522, 523, 524, 525, 24, 37, 526, 251, 252, 253, + 21, 34, 477, 22, 35, 491, 23, 36, 508, 523, + 524, 525, 526, 527, 24, 37, 528, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, @@ -1714,15 +1720,15 @@ static const yytype_int16 yydefgoto[] = 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 464, 465, 466, 467, 468, 469, 470, 478, 479, 480, 481, 482, 483, - 508, 509, 510, 511, 512, 513, 514, 515, 492, 493, - 494, 495, 496, 497, 498, 25, 38, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 26, 39, 568, 569, - 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, - 580, 581, 582, 583, 584, 585, 586, 587, 27, 40, - 589, 590, 28, 41, 592, 593, 451, 452, 453, 454, - 29, 42, 604, 605, 606, 607, 608, 609, 610, 611, - 612, 613, 614, 30, 43, 621, 622, 623, 624, 625, - 626, 627, 455, 31, 44, 630, 631, 632 + 509, 510, 511, 512, 513, 514, 515, 516, 517, 492, + 493, 494, 495, 496, 497, 498, 25, 38, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 26, 39, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 27, + 40, 591, 592, 28, 41, 594, 595, 451, 452, 453, + 454, 29, 42, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 30, 43, 623, 624, 625, 626, + 627, 628, 629, 455, 31, 44, 632, 633, 634 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1730,86 +1736,86 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint16 yytable[] = { - 2, 499, 484, 456, 588, 457, 458, 471, 628, 629, - 591, 3, 4, 633, 634, 472, 473, 615, 616, 617, - 618, 619, 620, 635, 499, 594, 595, 596, 597, 598, - 599, 600, 601, 602, 603, 636, 637, 638, 485, 486, - 639, 640, 641, 642, 643, 644, 5, 645, 646, 647, - 648, 649, 6, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 659, 487, 660, 661, 459, 549, 550, 551, - 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, - 562, 563, 564, 565, 566, 567, 532, 533, 534, 535, - 536, 537, 538, 539, 662, 663, 7, 460, 664, 665, - 474, 666, 475, 667, 668, 669, 670, 461, 671, 672, - 673, 674, 8, 675, 676, 677, 678, 679, 680, 681, - 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, 700, 488, - 489, 701, 702, 703, 704, 705, 706, 707, 708, 709, - 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, - 720, 9, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 736, 737, 490, - 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, - 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, - 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, - 10, 501, 502, 503, 778, 779, 780, 781, 782, 783, - 784, 506, 785, 786, 787, 788, 789, 462, 11, 790, - 476, 791, 500, 792, 501, 502, 503, 504, 505, 516, - 517, 518, 519, 520, 506, 12, 793, 794, 795, 796, - 797, 798, 799, 800, 13, 801, 802, 803, 804, 805, - 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, - 816, 817, 818, 819, 820, 821, 822, 823, 14, 824, - 825, 826, 15, 827, 828, 829, 0, 830, 16, 45, + 2, 499, 484, 456, 590, 457, 458, 630, 631, 471, + 593, 3, 4, 635, 636, 637, 638, 472, 473, 499, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 534, 535, 536, 537, 538, 539, 540, 541, 485, 486, + 617, 618, 619, 620, 621, 622, 5, 639, 640, 641, + 642, 643, 6, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 487, 654, 655, 459, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 7, 460, 666, 667, + 668, 669, 474, 670, 475, 671, 672, 461, 673, 674, + 675, 676, 8, 677, 678, 679, 680, 681, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 488, + 489, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 9, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 490, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, + 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, + 770, 771, 772, 773, 774, 775, 776, 777, 778, 500, + 10, 501, 502, 503, 504, 505, 779, 780, 781, 782, + 783, 506, 784, 785, 786, 787, 788, 462, 11, 501, + 502, 503, 476, 789, 790, 791, 792, 793, 794, 506, + 795, 796, 797, 798, 799, 12, 800, 801, 802, 507, + 803, 804, 805, 806, 13, 807, 808, 518, 519, 520, + 521, 522, 809, 810, 811, 812, 813, 814, 815, 816, + 817, 818, 819, 820, 821, 822, 823, 824, 14, 825, + 826, 827, 15, 828, 829, 830, 529, 831, 16, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 831, 832, 833, 834, 77, 78, 79, 835, 836, - 837, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 76, 832, 833, 834, 835, 77, 78, 79, 836, 837, + 838, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 838, 839, 840, 841, 842, 843, 844, 845, - 846, 121, 122, 123, 847, 124, 125, 126, 848, 849, + 119, 120, 839, 840, 841, 842, 843, 844, 845, 846, + 847, 121, 122, 123, 848, 124, 125, 126, 849, 850, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 850, 851, 852, 151, 152, 153, - 154, 155, 156, 157, 158, 853, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 854, 855, 856, - 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, - 867, 868, 869, 870, 871, 872, 873, 170, 171, 172, + 147, 148, 149, 150, 851, 852, 853, 151, 152, 153, + 154, 155, 156, 157, 158, 854, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 855, 856, 857, + 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, + 868, 869, 870, 871, 872, 873, 874, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 874, 209, 875, 210, + 203, 204, 205, 206, 207, 208, 875, 209, 876, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 876, 877, 878, 879, 880, 881, - 882, 883, 884, 885, 886, 225, 226, 227, 228, 229, - 230, 887, 888, 889, 890, 891, 892, 893, 231, 894, - 895, 896, 897, 898, 899, 900, 232, 233, 901, 234, - 235, 902, 236, 237, 903, 904, 238, 239, 240, 241, - 242, 243, 244, 245, 905, 906, 907, 246, 908, 909, - 910, 911, 912, 913, 914, 915, 247, 248, 249, 916, - 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, - 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, - 937, 938, 0, 527, 528, 529, 0, 0, 0, 0, + 221, 222, 223, 224, 877, 878, 879, 880, 881, 882, + 883, 884, 885, 886, 887, 225, 226, 227, 228, 229, + 230, 888, 889, 890, 891, 892, 893, 894, 231, 895, + 896, 897, 898, 899, 900, 901, 232, 233, 902, 234, + 235, 903, 236, 237, 904, 905, 238, 239, 240, 241, + 242, 243, 244, 245, 906, 907, 908, 246, 909, 910, + 911, 912, 913, 914, 915, 916, 247, 248, 249, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 530, 531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 530, - 531 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 532, 533 }; static const yytype_int16 yycheck[] = { - 0, 45, 45, 45, 113, 47, 48, 45, 289, 290, - 299, 11, 12, 10, 10, 53, 54, 256, 257, 258, - 259, 260, 261, 10, 45, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 10, 10, 10, 81, 82, - 10, 10, 10, 10, 10, 10, 46, 10, 10, 10, + 0, 45, 45, 45, 113, 47, 48, 289, 290, 45, + 299, 11, 12, 10, 10, 10, 10, 53, 54, 45, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 97, 98, 99, 100, 101, 102, 103, 104, 81, 82, + 256, 257, 258, 259, 260, 261, 46, 10, 10, 10, 10, 10, 52, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 106, 10, 10, 108, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 97, 98, 99, 100, - 101, 102, 103, 104, 10, 10, 96, 139, 10, 10, - 138, 10, 140, 10, 10, 10, 10, 149, 10, 10, + 175, 176, 177, 178, 179, 180, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 96, 139, 10, 10, + 10, 10, 138, 10, 140, 10, 10, 149, 10, 10, 10, 10, 112, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 182, @@ -1820,15 +1826,15 @@ static const yytype_int16 yycheck[] = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 220, 265, 266, 267, 10, 10, 10, 10, 10, 10, - 10, 275, 10, 10, 10, 10, 10, 279, 238, 10, - 278, 10, 263, 10, 265, 266, 267, 268, 269, 293, - 294, 295, 296, 297, 275, 255, 10, 10, 10, 10, - 10, 10, 10, 10, 264, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 263, + 220, 265, 266, 267, 268, 269, 10, 10, 10, 10, + 10, 275, 10, 10, 10, 10, 10, 279, 238, 265, + 266, 267, 278, 10, 10, 10, 10, 10, 10, 275, + 10, 10, 10, 10, 10, 255, 10, 10, 10, 303, + 10, 10, 10, 10, 264, 10, 10, 293, 294, 295, + 296, 297, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 288, 10, - 10, 10, 292, 10, 10, 10, -1, 10, 298, 13, + 10, 10, 292, 10, 10, 10, 37, 10, 298, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, @@ -1860,21 +1866,21 @@ static const yytype_int16 yycheck[] = 10, 10, 10, 10, 10, 10, 300, 301, 302, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, -1, 37, 37, 37, -1, -1, -1, -1, + 10, 10, 10, 10, 37, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, - 37 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 37, 37 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 304, 0, 11, 12, 46, 52, 96, 112, 161, - 220, 238, 255, 264, 288, 292, 298, 305, 306, 307, - 310, 313, 316, 319, 327, 558, 569, 591, 595, 603, - 616, 626, 308, 311, 314, 317, 320, 328, 559, 570, - 592, 596, 604, 617, 627, 13, 14, 15, 16, 17, + 0, 305, 0, 11, 12, 46, 52, 96, 112, 161, + 220, 238, 255, 264, 288, 292, 298, 306, 307, 308, + 311, 314, 317, 320, 328, 560, 571, 593, 597, 605, + 618, 628, 309, 312, 315, 318, 321, 329, 561, 572, + 594, 598, 606, 619, 629, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 49, 50, 51, @@ -1895,45 +1901,45 @@ static const yytype_uint16 yystos[] = 233, 234, 235, 236, 237, 249, 250, 251, 252, 253, 254, 262, 270, 271, 273, 274, 276, 277, 280, 281, 282, 283, 284, 285, 286, 287, 291, 300, 301, 302, - 309, 330, 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, - 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, - 529, 599, 600, 601, 602, 625, 45, 47, 48, 108, - 139, 149, 279, 312, 530, 531, 532, 533, 534, 535, - 536, 45, 53, 54, 138, 140, 278, 315, 537, 538, - 539, 540, 541, 542, 45, 81, 82, 106, 182, 183, - 222, 318, 551, 552, 553, 554, 555, 556, 557, 45, - 263, 265, 266, 267, 268, 269, 275, 321, 543, 544, - 545, 546, 547, 548, 549, 550, 293, 294, 295, 296, - 297, 322, 323, 324, 325, 326, 329, 543, 544, 545, - 546, 547, 97, 98, 99, 100, 101, 102, 103, 104, - 560, 561, 562, 563, 564, 565, 566, 567, 568, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 571, 572, + 310, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 601, 602, 603, 604, 627, 45, 47, 48, 108, + 139, 149, 279, 313, 531, 532, 533, 534, 535, 536, + 537, 45, 53, 54, 138, 140, 278, 316, 538, 539, + 540, 541, 542, 543, 45, 81, 82, 106, 182, 183, + 222, 319, 553, 554, 555, 556, 557, 558, 559, 45, + 263, 265, 266, 267, 268, 269, 275, 303, 322, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 293, 294, + 295, 296, 297, 323, 324, 325, 326, 327, 330, 544, + 545, 546, 547, 548, 97, 98, 99, 100, 101, 102, + 103, 104, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 162, 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, - 583, 584, 585, 586, 587, 588, 589, 590, 113, 593, - 594, 299, 597, 598, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 605, 606, 607, 608, 609, 610, - 611, 612, 613, 614, 615, 256, 257, 258, 259, 260, - 261, 618, 619, 620, 621, 622, 623, 624, 289, 290, - 628, 629, 630, 10, 10, 10, 10, 10, 10, 10, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 113, 595, 596, 299, 599, 600, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 256, 257, 258, + 259, 260, 261, 620, 621, 622, 623, 624, 625, 626, + 289, 290, 630, 631, 632, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, @@ -1963,41 +1969,42 @@ static const yytype_uint16 yystos[] = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10 + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 303, 304, 304, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 306, 307, - 308, 308, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 310, 311, 311, - 312, 312, 312, 312, 312, 312, 312, 313, 314, 314, - 315, 315, 315, 315, 315, 315, 316, 317, 317, 318, - 318, 318, 318, 318, 318, 318, 319, 320, 320, 321, - 321, 321, 321, 321, 321, 321, 321, 322, 323, 324, - 325, 326, 327, 328, 328, 329, 329, 329, 329, 329, - 329, 329, 329, 329, 329, 330, 331, 332, 333, 334, + 0, 304, 305, 305, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 307, 308, + 309, 309, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 310, 310, 310, 311, 312, 312, + 313, 313, 313, 313, 313, 313, 313, 314, 315, 315, + 316, 316, 316, 316, 316, 316, 317, 318, 318, 319, + 319, 319, 319, 319, 319, 319, 320, 321, 321, 322, + 322, 322, 322, 322, 322, 322, 322, 322, 323, 324, + 325, 326, 327, 328, 329, 329, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, @@ -2020,19 +2027,19 @@ static const yytype_uint16 yyr1[] = 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 557, 558, 559, 559, 560, 560, 560, 560, - 560, 560, 560, 560, 561, 562, 563, 564, 565, 566, - 567, 568, 569, 570, 570, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 572, 573, 574, 575, 576, 577, + 555, 556, 557, 558, 559, 560, 561, 561, 562, 562, + 562, 562, 562, 562, 562, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 572, 573, 573, 573, + 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, + 573, 573, 573, 573, 573, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 592, 593, 594, 595, 596, - 596, 597, 598, 599, 600, 601, 602, 603, 604, 604, - 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, - 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, - 616, 617, 617, 618, 618, 618, 618, 618, 618, 619, - 620, 621, 622, 623, 624, 625, 626, 627, 627, 628, - 628, 629, 630 + 588, 589, 590, 591, 592, 593, 594, 594, 595, 596, + 597, 598, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 606, 607, 607, 607, 607, 607, 607, 607, 607, + 607, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 619, 620, 620, 620, 620, 620, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 629, 630, 630, 631, 632 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -2064,44 +2071,44 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 1, 2, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, - 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, + 4, 3, 3, 2, 2, 2, 2, 2, 2, 3, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, + 3, 3, 2, 2, 2, 1, 2, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 2, 0, 1, 2, + 1, 2, 0, 1, 2, 2, 2, 3, 3, 1, + 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 2, 0, 1, 2, 1, 2, - 0, 1, 2, 2, 2, 3, 3, 1, 2, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 2, 0, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 3, 1, 2, 0, 1, - 1, 2, 2 + 1, 2, 2, 2, 2, 2, 2, 3, 1, 2, + 0, 1, 1, 2, 2 }; @@ -2790,7 +2797,7 @@ yyreduce: { OUTYY(("\nP(force-toplevel)\n")); } -#line 2794 "util/configparser.c" +#line 2801 "util/configparser.c" break; case 19: @@ -2798,7 +2805,7 @@ yyreduce: { OUTYY(("\nP(server:)\n")); } -#line 2802 "util/configparser.c" +#line 2809 "util/configparser.c" break; case 227: @@ -2813,7 +2820,7 @@ yyreduce: } else yyerror("out of memory"); } -#line 2817 "util/configparser.c" +#line 2824 "util/configparser.c" break; case 237: @@ -2828,7 +2835,7 @@ yyreduce: } else yyerror("out of memory"); } -#line 2832 "util/configparser.c" +#line 2839 "util/configparser.c" break; case 246: @@ -2845,7 +2852,7 @@ yyreduce: } else yyerror("out of memory"); } -#line 2849 "util/configparser.c" +#line 2856 "util/configparser.c" break; case 256: @@ -2861,15 +2868,16 @@ yyreduce: s->for_downstream = 1; s->for_upstream = 1; s->fallback_enabled = 0; + s->zonemd_reject_absence = 0; s->isrpz = 0; } else yyerror("out of memory"); } -#line 2869 "util/configparser.c" +#line 2877 "util/configparser.c" break; - case 267: -#line 376 "./util/configparser.y" + case 268: +#line 377 "./util/configparser.y" { uint8_t* bitlist; size_t len = 0; @@ -2886,11 +2894,11 @@ yyreduce: } } -#line 2890 "util/configparser.c" +#line 2898 "util/configparser.c" break; - case 268: -#line 395 "./util/configparser.y" + case 269: +#line 396 "./util/configparser.y" { OUTYY(("P(rpz_action_override:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "nxdomain")!=0 && strcmp((yyvsp[0].str), "nodata")!=0 && @@ -2905,21 +2913,21 @@ yyreduce: cfg_parser->cfg->auths->rpz_action_override = (yyvsp[0].str); } } -#line 2909 "util/configparser.c" +#line 2917 "util/configparser.c" break; - case 269: -#line 412 "./util/configparser.y" + case 270: +#line 413 "./util/configparser.y" { OUTYY(("P(rpz_cname_override:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->rpz_cname); cfg_parser->cfg->auths->rpz_cname = (yyvsp[0].str); } -#line 2919 "util/configparser.c" +#line 2927 "util/configparser.c" break; - case 270: -#line 420 "./util/configparser.y" + case 271: +#line 421 "./util/configparser.y" { OUTYY(("P(rpz_log:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -2927,21 +2935,21 @@ yyreduce: else cfg_parser->cfg->auths->rpz_log = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 2931 "util/configparser.c" +#line 2939 "util/configparser.c" break; - case 271: -#line 430 "./util/configparser.y" + case 272: +#line 431 "./util/configparser.y" { OUTYY(("P(rpz_log_name:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->rpz_log_name); cfg_parser->cfg->auths->rpz_log_name = (yyvsp[0].str); } -#line 2941 "util/configparser.c" +#line 2949 "util/configparser.c" break; - case 272: -#line 438 "./util/configparser.y" + case 273: +#line 439 "./util/configparser.y" { struct config_auth* s; OUTYY(("\nP(rpz:)\n")); @@ -2957,11 +2965,11 @@ yyreduce: } else yyerror("out of memory"); } -#line 2961 "util/configparser.c" +#line 2969 "util/configparser.c" break; - case 285: -#line 461 "./util/configparser.y" + case 286: +#line 462 "./util/configparser.y" { OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -2969,11 +2977,11 @@ yyreduce: else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 2973 "util/configparser.c" +#line 2981 "util/configparser.c" break; - case 286: -#line 470 "./util/configparser.y" + case 287: +#line 471 "./util/configparser.y" { OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -2981,11 +2989,11 @@ yyreduce: else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 2985 "util/configparser.c" +#line 2993 "util/configparser.c" break; - case 287: -#line 479 "./util/configparser.y" + case 288: +#line 480 "./util/configparser.y" { OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0) @@ -2995,11 +3003,11 @@ yyreduce: else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 2999 "util/configparser.c" +#line 3007 "util/configparser.c" break; - case 288: -#line 490 "./util/configparser.y" + case 289: +#line 491 "./util/configparser.y" { OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3007,11 +3015,11 @@ yyreduce: else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3011 "util/configparser.c" +#line 3019 "util/configparser.c" break; - case 289: -#line 499 "./util/configparser.y" + case 290: +#line 500 "./util/configparser.y" { OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3019,11 +3027,11 @@ yyreduce: else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3023 "util/configparser.c" +#line 3031 "util/configparser.c" break; - case 290: -#line 508 "./util/configparser.y" + case 291: +#line 509 "./util/configparser.y" { OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3031,11 +3039,11 @@ yyreduce: else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3035 "util/configparser.c" +#line 3043 "util/configparser.c" break; - case 291: -#line 517 "./util/configparser.y" + case 292: +#line 518 "./util/configparser.y" { OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0) @@ -3045,11 +3053,11 @@ yyreduce: else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3049 "util/configparser.c" +#line 3057 "util/configparser.c" break; - case 292: -#line 528 "./util/configparser.y" + case 293: +#line 529 "./util/configparser.y" { OUTYY(("P(server_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3057,11 +3065,11 @@ yyreduce: else cfg_parser->cfg->port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3061 "util/configparser.c" +#line 3069 "util/configparser.c" break; - case 293: -#line 537 "./util/configparser.y" + case 294: +#line 538 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str))); @@ -3072,11 +3080,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 3076 "util/configparser.c" +#line 3084 "util/configparser.c" break; - case 294: -#line 549 "./util/configparser.y" + case 295: +#line 550 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str))); @@ -3088,11 +3096,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 3092 "util/configparser.c" +#line 3100 "util/configparser.c" break; - case 295: -#line 563 "./util/configparser.y" + case 296: +#line 564 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str))); @@ -3106,11 +3114,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3110 "util/configparser.c" +#line 3118 "util/configparser.c" break; - case 296: -#line 578 "./util/configparser.y" + case 297: +#line 579 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str))); @@ -3120,11 +3128,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3124 "util/configparser.c" +#line 3132 "util/configparser.c" break; - case 297: -#line 589 "./util/configparser.y" + case 298: +#line 590 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str))); @@ -3140,11 +3148,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3144 "util/configparser.c" +#line 3152 "util/configparser.c" break; - case 298: -#line 606 "./util/configparser.y" + case 299: +#line 607 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str))); @@ -3160,11 +3168,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3164 "util/configparser.c" +#line 3172 "util/configparser.c" break; - case 299: -#line 623 "./util/configparser.y" + case 300: +#line 624 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[0].str))); @@ -3180,11 +3188,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3184 "util/configparser.c" +#line 3192 "util/configparser.c" break; - case 300: -#line 640 "./util/configparser.y" + case 301: +#line 641 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[0].str))); @@ -3200,11 +3208,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3204 "util/configparser.c" +#line 3212 "util/configparser.c" break; - case 301: -#line 657 "./util/configparser.y" + case 302: +#line 658 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[0].str))); @@ -3218,11 +3226,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3222 "util/configparser.c" +#line 3230 "util/configparser.c" break; - case 302: -#line 672 "./util/configparser.y" + case 303: +#line 673 "./util/configparser.y" { #ifdef CLIENT_SUBNET OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[0].str))); @@ -3236,11 +3244,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3240 "util/configparser.c" +#line 3248 "util/configparser.c" break; - case 303: -#line 687 "./util/configparser.y" + case 304: +#line 688 "./util/configparser.y" { OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->num_ifs == 0) @@ -3252,11 +3260,11 @@ yyreduce: else cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str); } -#line 3256 "util/configparser.c" +#line 3264 "util/configparser.c" break; - case 304: -#line 700 "./util/configparser.y" + case 305: +#line 701 "./util/configparser.y" { OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->num_out_ifs == 0) @@ -3270,11 +3278,11 @@ yyreduce: cfg_parser->cfg->out_ifs[ cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str); } -#line 3274 "util/configparser.c" +#line 3282 "util/configparser.c" break; - case 305: -#line 715 "./util/configparser.y" + case 306: +#line 716 "./util/configparser.y" { OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3282,11 +3290,11 @@ yyreduce: else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3286 "util/configparser.c" +#line 3294 "util/configparser.c" break; - case 306: -#line 724 "./util/configparser.y" + case 307: +#line 725 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str))); if(!cfg_mark_ports((yyvsp[0].str), 1, @@ -3294,11 +3302,11 @@ yyreduce: yyerror("port number or range (\"low-high\") expected"); free((yyvsp[0].str)); } -#line 3298 "util/configparser.c" +#line 3306 "util/configparser.c" break; - case 307: -#line 733 "./util/configparser.y" + case 308: +#line 734 "./util/configparser.y" { OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str))); if(!cfg_mark_ports((yyvsp[0].str), 0, @@ -3306,11 +3314,11 @@ yyreduce: yyerror("port number or range (\"low-high\") expected"); free((yyvsp[0].str)); } -#line 3310 "util/configparser.c" +#line 3318 "util/configparser.c" break; - case 308: -#line 742 "./util/configparser.y" + case 309: +#line 743 "./util/configparser.y" { OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3318,11 +3326,11 @@ yyreduce: else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3322 "util/configparser.c" +#line 3330 "util/configparser.c" break; - case 309: -#line 751 "./util/configparser.y" + case 310: +#line 752 "./util/configparser.y" { OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3330,11 +3338,11 @@ yyreduce: else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3334 "util/configparser.c" +#line 3342 "util/configparser.c" break; - case 310: -#line 760 "./util/configparser.y" + case 311: +#line 761 "./util/configparser.y" { OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3342,11 +3350,11 @@ yyreduce: else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3346 "util/configparser.c" +#line 3354 "util/configparser.c" break; - case 311: -#line 769 "./util/configparser.y" + case 312: +#line 770 "./util/configparser.y" { OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3354,11 +3362,11 @@ yyreduce: else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3358 "util/configparser.c" +#line 3366 "util/configparser.c" break; - case 312: -#line 778 "./util/configparser.y" + case 313: +#line 779 "./util/configparser.y" { OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3366,11 +3374,11 @@ yyreduce: else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3370 "util/configparser.c" +#line 3378 "util/configparser.c" break; - case 313: -#line 787 "./util/configparser.y" + case 314: +#line 788 "./util/configparser.y" { OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3378,11 +3386,11 @@ yyreduce: else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3382 "util/configparser.c" +#line 3390 "util/configparser.c" break; - case 314: -#line 796 "./util/configparser.y" + case 315: +#line 797 "./util/configparser.y" { OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3390,11 +3398,11 @@ yyreduce: else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3394 "util/configparser.c" +#line 3402 "util/configparser.c" break; - case 315: -#line 805 "./util/configparser.y" + case 316: +#line 806 "./util/configparser.y" { OUTYY(("P(server_prefer_ip4:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3402,11 +3410,11 @@ yyreduce: else cfg_parser->cfg->prefer_ip4 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3406 "util/configparser.c" +#line 3414 "util/configparser.c" break; - case 316: -#line 814 "./util/configparser.y" + case 317: +#line 815 "./util/configparser.y" { OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3414,11 +3422,11 @@ yyreduce: else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3418 "util/configparser.c" +#line 3426 "util/configparser.c" break; - case 317: -#line 823 "./util/configparser.y" + case 318: +#line 824 "./util/configparser.y" { OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3426,11 +3434,11 @@ yyreduce: else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3430 "util/configparser.c" +#line 3438 "util/configparser.c" break; - case 318: -#line 832 "./util/configparser.y" + case 319: +#line 833 "./util/configparser.y" { OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3438,11 +3446,11 @@ yyreduce: else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3442 "util/configparser.c" +#line 3450 "util/configparser.c" break; - case 319: -#line 841 "./util/configparser.y" + case 320: +#line 842 "./util/configparser.y" { OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3454,11 +3462,11 @@ yyreduce: else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3458 "util/configparser.c" +#line 3466 "util/configparser.c" break; - case 320: -#line 854 "./util/configparser.y" + case 321: +#line 855 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3466,11 +3474,11 @@ yyreduce: else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3470 "util/configparser.c" +#line 3478 "util/configparser.c" break; - case 321: -#line 863 "./util/configparser.y" + case 322: +#line 864 "./util/configparser.y" { OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3482,11 +3490,11 @@ yyreduce: else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3486 "util/configparser.c" +#line 3494 "util/configparser.c" break; - case 322: -#line 876 "./util/configparser.y" + case 323: +#line 877 "./util/configparser.y" { OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3494,11 +3502,11 @@ yyreduce: else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3498 "util/configparser.c" +#line 3506 "util/configparser.c" break; - case 323: -#line 885 "./util/configparser.y" + case 324: +#line 886 "./util/configparser.y" { OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3506,11 +3514,11 @@ yyreduce: else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3510 "util/configparser.c" +#line 3518 "util/configparser.c" break; - case 324: -#line 894 "./util/configparser.y" + case 325: +#line 895 "./util/configparser.y" { OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3518,31 +3526,31 @@ yyreduce: else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3522 "util/configparser.c" +#line 3530 "util/configparser.c" break; - case 325: -#line 903 "./util/configparser.y" + case 326: +#line 904 "./util/configparser.y" { OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->ssl_service_key); cfg_parser->cfg->ssl_service_key = (yyvsp[0].str); } -#line 3532 "util/configparser.c" +#line 3540 "util/configparser.c" break; - case 326: -#line 910 "./util/configparser.y" + case 327: +#line 911 "./util/configparser.y" { OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->ssl_service_pem); cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str); } -#line 3542 "util/configparser.c" +#line 3550 "util/configparser.c" break; - case 327: -#line 917 "./util/configparser.y" + case 328: +#line 918 "./util/configparser.y" { OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3550,21 +3558,21 @@ yyreduce: else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3554 "util/configparser.c" +#line 3562 "util/configparser.c" break; - case 328: -#line 926 "./util/configparser.y" + case 329: +#line 927 "./util/configparser.y" { OUTYY(("P(server_tls_cert_bundle:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_cert_bundle); cfg_parser->cfg->tls_cert_bundle = (yyvsp[0].str); } -#line 3564 "util/configparser.c" +#line 3572 "util/configparser.c" break; - case 329: -#line 933 "./util/configparser.y" + case 330: +#line 934 "./util/configparser.y" { OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3572,53 +3580,53 @@ yyreduce: else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3576 "util/configparser.c" +#line 3584 "util/configparser.c" break; - case 330: -#line 942 "./util/configparser.y" + case 331: +#line 943 "./util/configparser.y" { OUTYY(("P(server_tls_additional_port:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3587 "util/configparser.c" +#line 3595 "util/configparser.c" break; - case 331: -#line 950 "./util/configparser.y" + case 332: +#line 951 "./util/configparser.y" { OUTYY(("P(server_tls_ciphers:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_ciphers); cfg_parser->cfg->tls_ciphers = (yyvsp[0].str); } -#line 3597 "util/configparser.c" +#line 3605 "util/configparser.c" break; - case 332: -#line 957 "./util/configparser.y" + case 333: +#line 958 "./util/configparser.y" { OUTYY(("P(server_tls_ciphersuites:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->tls_ciphersuites); cfg_parser->cfg->tls_ciphersuites = (yyvsp[0].str); } -#line 3607 "util/configparser.c" +#line 3615 "util/configparser.c" break; - case 333: -#line 964 "./util/configparser.y" + case 334: +#line 965 "./util/configparser.y" { OUTYY(("P(server_tls_session_ticket_keys:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append(&cfg_parser->cfg->tls_session_ticket_keys, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3618 "util/configparser.c" +#line 3626 "util/configparser.c" break; - case 334: -#line 972 "./util/configparser.y" + case 335: +#line 973 "./util/configparser.y" { OUTYY(("P(server_tls_use_sni:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3626,11 +3634,11 @@ yyreduce: else cfg_parser->cfg->tls_use_sni = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3630 "util/configparser.c" +#line 3638 "util/configparser.c" break; - case 335: -#line 981 "./util/configparser.y" + case 336: +#line 982 "./util/configparser.y" { OUTYY(("P(server_https_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -3638,11 +3646,11 @@ yyreduce: else cfg_parser->cfg->https_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3642 "util/configparser.c" +#line 3650 "util/configparser.c" break; - case 336: -#line 989 "./util/configparser.y" + case 337: +#line 990 "./util/configparser.y" { OUTYY(("P(server_http_endpoint:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->http_endpoint); @@ -3658,11 +3666,11 @@ yyreduce: cfg_parser->cfg->http_endpoint = (yyvsp[0].str); } } -#line 3662 "util/configparser.c" +#line 3670 "util/configparser.c" break; - case 337: -#line 1005 "./util/configparser.y" + case 338: +#line 1006 "./util/configparser.y" { OUTYY(("P(server_http_max_streams:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -3670,11 +3678,11 @@ yyreduce: else cfg_parser->cfg->http_max_streams = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 3674 "util/configparser.c" +#line 3682 "util/configparser.c" break; - case 338: -#line 1013 "./util/configparser.y" + case 339: +#line 1014 "./util/configparser.y" { OUTYY(("P(server_http_query_buffer_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), @@ -3682,11 +3690,11 @@ yyreduce: yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 3686 "util/configparser.c" +#line 3694 "util/configparser.c" break; - case 339: -#line 1021 "./util/configparser.y" + case 340: +#line 1022 "./util/configparser.y" { OUTYY(("P(server_http_response_buffer_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), @@ -3694,11 +3702,11 @@ yyreduce: yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 3698 "util/configparser.c" +#line 3706 "util/configparser.c" break; - case 340: -#line 1029 "./util/configparser.y" + case 341: +#line 1030 "./util/configparser.y" { OUTYY(("P(server_http_nodelay:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3706,11 +3714,11 @@ yyreduce: else cfg_parser->cfg->http_nodelay = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3710 "util/configparser.c" +#line 3718 "util/configparser.c" break; - case 341: -#line 1037 "./util/configparser.y" + case 342: +#line 1038 "./util/configparser.y" { OUTYY(("P(server_http_notls_downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3718,11 +3726,11 @@ yyreduce: else cfg_parser->cfg->http_notls_downstream = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3722 "util/configparser.c" +#line 3730 "util/configparser.c" break; - case 342: -#line 1045 "./util/configparser.y" + case 343: +#line 1046 "./util/configparser.y" { OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3730,11 +3738,11 @@ yyreduce: else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3734 "util/configparser.c" +#line 3742 "util/configparser.c" break; - case 343: -#line 1054 "./util/configparser.y" + case 344: +#line 1055 "./util/configparser.y" { OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3742,11 +3750,11 @@ yyreduce: else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3746 "util/configparser.c" +#line 3754 "util/configparser.c" break; - case 344: -#line 1063 "./util/configparser.y" + case 345: +#line 1064 "./util/configparser.y" { OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3759,11 +3767,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 3763 "util/configparser.c" +#line 3771 "util/configparser.c" break; - case 345: -#line 1077 "./util/configparser.y" + case 346: +#line 1078 "./util/configparser.y" { OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3771,11 +3779,11 @@ yyreduce: else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3775 "util/configparser.c" +#line 3783 "util/configparser.c" break; - case 346: -#line 1086 "./util/configparser.y" + case 347: +#line 1087 "./util/configparser.y" { OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3783,11 +3791,11 @@ yyreduce: else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3787 "util/configparser.c" +#line 3795 "util/configparser.c" break; - case 347: -#line 1095 "./util/configparser.y" + case 348: +#line 1096 "./util/configparser.y" { OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3795,11 +3803,11 @@ yyreduce: else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3799 "util/configparser.c" +#line 3807 "util/configparser.c" break; - case 348: -#line 1104 "./util/configparser.y" + case 349: +#line 1105 "./util/configparser.y" { OUTYY(("P(server_log_tag_queryreply:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3807,11 +3815,11 @@ yyreduce: else cfg_parser->cfg->log_tag_queryreply = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3811 "util/configparser.c" +#line 3819 "util/configparser.c" break; - case 349: -#line 1113 "./util/configparser.y" + case 350: +#line 1114 "./util/configparser.y" { OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3819,11 +3827,11 @@ yyreduce: else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3823 "util/configparser.c" +#line 3831 "util/configparser.c" break; - case 350: -#line 1122 "./util/configparser.y" + case 351: +#line 1123 "./util/configparser.y" { OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3831,31 +3839,31 @@ yyreduce: else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3835 "util/configparser.c" +#line 3843 "util/configparser.c" break; - case 351: -#line 1131 "./util/configparser.y" + case 352: +#line 1132 "./util/configparser.y" { OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->chrootdir); cfg_parser->cfg->chrootdir = (yyvsp[0].str); } -#line 3845 "util/configparser.c" +#line 3853 "util/configparser.c" break; - case 352: -#line 1138 "./util/configparser.y" + case 353: +#line 1139 "./util/configparser.y" { OUTYY(("P(server_username:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->username); cfg_parser->cfg->username = (yyvsp[0].str); } -#line 3855 "util/configparser.c" +#line 3863 "util/configparser.c" break; - case 353: -#line 1145 "./util/configparser.y" + case 354: +#line 1146 "./util/configparser.y" { OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->directory); @@ -3880,105 +3888,105 @@ yyreduce: } } } -#line 3884 "util/configparser.c" +#line 3892 "util/configparser.c" break; - case 354: -#line 1171 "./util/configparser.y" + case 355: +#line 1172 "./util/configparser.y" { OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->logfile); cfg_parser->cfg->logfile = (yyvsp[0].str); cfg_parser->cfg->use_syslog = 0; } -#line 3895 "util/configparser.c" +#line 3903 "util/configparser.c" break; - case 355: -#line 1179 "./util/configparser.y" + case 356: +#line 1180 "./util/configparser.y" { OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->pidfile); cfg_parser->cfg->pidfile = (yyvsp[0].str); } -#line 3905 "util/configparser.c" +#line 3913 "util/configparser.c" break; - case 356: -#line 1186 "./util/configparser.y" + case 357: +#line 1187 "./util/configparser.y" { OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3915 "util/configparser.c" +#line 3923 "util/configparser.c" break; - case 357: -#line 1193 "./util/configparser.y" + case 358: +#line 1194 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str))); log_warn("option dlv-anchor-file ignored: DLV is decommissioned"); free((yyvsp[0].str)); } -#line 3925 "util/configparser.c" +#line 3933 "util/configparser.c" break; - case 358: -#line 1200 "./util/configparser.y" + case 359: +#line 1201 "./util/configparser.y" { OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str))); log_warn("option dlv-anchor ignored: DLV is decommissioned"); free((yyvsp[0].str)); } -#line 3935 "util/configparser.c" +#line 3943 "util/configparser.c" break; - case 359: -#line 1207 "./util/configparser.y" + case 360: +#line 1208 "./util/configparser.y" { OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> auto_trust_anchor_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3946 "util/configparser.c" +#line 3954 "util/configparser.c" break; - case 360: -#line 1215 "./util/configparser.y" + case 361: +#line 1216 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> trust_anchor_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3957 "util/configparser.c" +#line 3965 "util/configparser.c" break; - case 361: -#line 1223 "./util/configparser.y" + case 362: +#line 1224 "./util/configparser.y" { OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg-> trusted_keys_file_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3968 "util/configparser.c" +#line 3976 "util/configparser.c" break; - case 362: -#line 1231 "./util/configparser.y" + case 363: +#line 1232 "./util/configparser.y" { OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str))) yyerror("out of memory"); } -#line 3978 "util/configparser.c" +#line 3986 "util/configparser.c" break; - case 363: -#line 1238 "./util/configparser.y" + case 364: +#line 1239 "./util/configparser.y" { OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -3988,11 +3996,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 3992 "util/configparser.c" +#line 4000 "util/configparser.c" break; - case 364: -#line 1249 "./util/configparser.y" + case 365: +#line 1250 "./util/configparser.y" { OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4002,21 +4010,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4006 "util/configparser.c" +#line 4014 "util/configparser.c" break; - case 365: -#line 1260 "./util/configparser.y" + case 366: +#line 1261 "./util/configparser.y" { OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4016 "util/configparser.c" +#line 4024 "util/configparser.c" break; - case 366: -#line 1267 "./util/configparser.y" + case 367: +#line 1268 "./util/configparser.y" { OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4024,11 +4032,11 @@ yyreduce: else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4028 "util/configparser.c" +#line 4036 "util/configparser.c" break; - case 367: -#line 1276 "./util/configparser.y" + case 368: +#line 1277 "./util/configparser.y" { OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4036,11 +4044,11 @@ yyreduce: else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4040 "util/configparser.c" +#line 4048 "util/configparser.c" break; - case 368: -#line 1285 "./util/configparser.y" + case 369: +#line 1286 "./util/configparser.y" { OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4048,53 +4056,53 @@ yyreduce: else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4052 "util/configparser.c" +#line 4060 "util/configparser.c" break; - case 369: -#line 1294 "./util/configparser.y" + case 370: +#line 1295 "./util/configparser.y" { OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->identity); cfg_parser->cfg->identity = (yyvsp[0].str); } -#line 4062 "util/configparser.c" +#line 4070 "util/configparser.c" break; - case 370: -#line 1301 "./util/configparser.y" + case 371: +#line 1302 "./util/configparser.y" { OUTYY(("P(server_version:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->version); cfg_parser->cfg->version = (yyvsp[0].str); } -#line 4072 "util/configparser.c" +#line 4080 "util/configparser.c" break; - case 371: -#line 1308 "./util/configparser.y" + case 372: +#line 1309 "./util/configparser.y" { OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_rcvbuf)) yyerror("buffer size expected"); free((yyvsp[0].str)); } -#line 4083 "util/configparser.c" +#line 4091 "util/configparser.c" break; - case 372: -#line 1316 "./util/configparser.y" + case 373: +#line 1317 "./util/configparser.y" { OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_sndbuf)) yyerror("buffer size expected"); free((yyvsp[0].str)); } -#line 4094 "util/configparser.c" +#line 4102 "util/configparser.c" break; - case 373: -#line 1324 "./util/configparser.y" + case 374: +#line 1325 "./util/configparser.y" { OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4103,11 +4111,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4107 "util/configparser.c" +#line 4115 "util/configparser.c" break; - case 374: -#line 1334 "./util/configparser.y" + case 375: +#line 1335 "./util/configparser.y" { OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4116,11 +4124,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4120 "util/configparser.c" +#line 4128 "util/configparser.c" break; - case 375: -#line 1344 "./util/configparser.y" + case 376: +#line 1345 "./util/configparser.y" { OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4129,11 +4137,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4133 "util/configparser.c" +#line 4141 "util/configparser.c" break; - case 376: -#line 1354 "./util/configparser.y" + case 377: +#line 1355 "./util/configparser.y" { OUTYY(("P(server_ip_dscp:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4146,22 +4154,22 @@ yyreduce: cfg_parser->cfg->ip_dscp = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4150 "util/configparser.c" +#line 4158 "util/configparser.c" break; - case 377: -#line 1368 "./util/configparser.y" + case 378: +#line 1369 "./util/configparser.y" { OUTYY(("P(server_stream_wait_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->stream_wait_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4161 "util/configparser.c" +#line 4169 "util/configparser.c" break; - case 378: -#line 1376 "./util/configparser.y" + case 379: +#line 1377 "./util/configparser.y" { OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4173,11 +4181,11 @@ yyreduce: else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4177 "util/configparser.c" +#line 4185 "util/configparser.c" break; - case 379: -#line 1389 "./util/configparser.y" + case 380: +#line 1390 "./util/configparser.y" { OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4187,22 +4195,22 @@ yyreduce: else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4191 "util/configparser.c" +#line 4199 "util/configparser.c" break; - case 380: -#line 1400 "./util/configparser.y" + case 381: +#line 1401 "./util/configparser.y" { OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->msg_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4202 "util/configparser.c" +#line 4210 "util/configparser.c" break; - case 381: -#line 1408 "./util/configparser.y" + case 382: +#line 1409 "./util/configparser.y" { OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4214,11 +4222,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4218 "util/configparser.c" +#line 4226 "util/configparser.c" break; - case 382: -#line 1421 "./util/configparser.y" + case 383: +#line 1422 "./util/configparser.y" { OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4226,11 +4234,11 @@ yyreduce: else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4230 "util/configparser.c" +#line 4238 "util/configparser.c" break; - case 383: -#line 1430 "./util/configparser.y" + case 384: +#line 1431 "./util/configparser.y" { OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4238,11 +4246,11 @@ yyreduce: else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4242 "util/configparser.c" +#line 4250 "util/configparser.c" break; - case 384: -#line 1439 "./util/configparser.y" + case 385: +#line 1440 "./util/configparser.y" { OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4250,11 +4258,11 @@ yyreduce: else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4254 "util/configparser.c" +#line 4262 "util/configparser.c" break; - case 385: -#line 1448 "./util/configparser.y" + case 386: +#line 1449 "./util/configparser.y" { OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4263,11 +4271,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4267 "util/configparser.c" +#line 4275 "util/configparser.c" break; - case 386: -#line 1458 "./util/configparser.y" + case 387: +#line 1459 "./util/configparser.y" { OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4276,22 +4284,22 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4280 "util/configparser.c" +#line 4288 "util/configparser.c" break; - case 387: -#line 1468 "./util/configparser.y" + case 388: +#line 1469 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->rrset_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4291 "util/configparser.c" +#line 4299 "util/configparser.c" break; - case 388: -#line 1476 "./util/configparser.y" + case 389: +#line 1477 "./util/configparser.y" { OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4303,11 +4311,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4307 "util/configparser.c" +#line 4315 "util/configparser.c" break; - case 389: -#line 1489 "./util/configparser.y" + case 390: +#line 1490 "./util/configparser.y" { OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4315,22 +4323,22 @@ yyreduce: else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4319 "util/configparser.c" +#line 4327 "util/configparser.c" break; - case 390: -#line 1498 "./util/configparser.y" + case 391: +#line 1499 "./util/configparser.y" { OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str))); verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option " "removed, use infra-host-ttl)", (yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4330 "util/configparser.c" +#line 4338 "util/configparser.c" break; - case 391: -#line 1506 "./util/configparser.y" + case 392: +#line 1507 "./util/configparser.y" { OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4338,22 +4346,22 @@ yyreduce: else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4342 "util/configparser.c" +#line 4350 "util/configparser.c" break; - case 392: -#line 1515 "./util/configparser.y" + case 393: +#line 1516 "./util/configparser.y" { OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str))); verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s " "(option removed, use infra-cache-numhosts)", (yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4353 "util/configparser.c" +#line 4361 "util/configparser.c" break; - case 393: -#line 1523 "./util/configparser.y" + case 394: +#line 1524 "./util/configparser.y" { OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4365,11 +4373,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4369 "util/configparser.c" +#line 4377 "util/configparser.c" break; - case 394: -#line 1536 "./util/configparser.y" + case 395: +#line 1537 "./util/configparser.y" { OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4377,11 +4385,11 @@ yyreduce: else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4381 "util/configparser.c" +#line 4389 "util/configparser.c" break; - case 395: -#line 1545 "./util/configparser.y" + case 396: +#line 1546 "./util/configparser.y" { OUTYY(("P(server_infra_keep_probing:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4390,21 +4398,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4394 "util/configparser.c" +#line 4402 "util/configparser.c" break; - case 396: -#line 1555 "./util/configparser.y" + case 397: +#line 1556 "./util/configparser.y" { OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->target_fetch_policy); cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str); } -#line 4404 "util/configparser.c" +#line 4412 "util/configparser.c" break; - case 397: -#line 1562 "./util/configparser.y" + case 398: +#line 1563 "./util/configparser.y" { OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4413,11 +4421,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4417 "util/configparser.c" +#line 4425 "util/configparser.c" break; - case 398: -#line 1572 "./util/configparser.y" + case 399: +#line 1573 "./util/configparser.y" { OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4426,11 +4434,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4430 "util/configparser.c" +#line 4438 "util/configparser.c" break; - case 399: -#line 1582 "./util/configparser.y" + case 400: +#line 1583 "./util/configparser.y" { OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4439,11 +4447,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4443 "util/configparser.c" +#line 4451 "util/configparser.c" break; - case 400: -#line 1592 "./util/configparser.y" + case 401: +#line 1593 "./util/configparser.y" { OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4452,11 +4460,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4456 "util/configparser.c" +#line 4464 "util/configparser.c" break; - case 401: -#line 1602 "./util/configparser.y" + case 402: +#line 1603 "./util/configparser.y" { OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4465,11 +4473,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4469 "util/configparser.c" +#line 4477 "util/configparser.c" break; - case 402: -#line 1612 "./util/configparser.y" + case 403: +#line 1613 "./util/configparser.y" { OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4478,11 +4486,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4482 "util/configparser.c" +#line 4490 "util/configparser.c" break; - case 403: -#line 1622 "./util/configparser.y" + case 404: +#line 1623 "./util/configparser.y" { OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4491,11 +4499,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4495 "util/configparser.c" +#line 4503 "util/configparser.c" break; - case 404: -#line 1632 "./util/configparser.y" + case 405: +#line 1633 "./util/configparser.y" { OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4504,41 +4512,41 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4508 "util/configparser.c" +#line 4516 "util/configparser.c" break; - case 405: -#line 1642 "./util/configparser.y" + case 406: +#line 1643 "./util/configparser.y" { OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4518 "util/configparser.c" +#line 4526 "util/configparser.c" break; - case 406: -#line 1649 "./util/configparser.y" + case 407: +#line 1650 "./util/configparser.y" { OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4528 "util/configparser.c" +#line 4536 "util/configparser.c" break; - case 407: -#line 1656 "./util/configparser.y" + case 408: +#line 1657 "./util/configparser.y" { OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4538 "util/configparser.c" +#line 4546 "util/configparser.c" break; - case 408: -#line 1663 "./util/configparser.y" + case 409: +#line 1664 "./util/configparser.y" { OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4546,11 +4554,11 @@ yyreduce: else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4550 "util/configparser.c" +#line 4558 "util/configparser.c" break; - case 409: -#line 1672 "./util/configparser.y" + case 410: +#line 1673 "./util/configparser.y" { OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4558,11 +4566,11 @@ yyreduce: else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4562 "util/configparser.c" +#line 4570 "util/configparser.c" break; - case 410: -#line 1681 "./util/configparser.y" + case 411: +#line 1682 "./util/configparser.y" { OUTYY(("P(server_deny_any:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4570,11 +4578,11 @@ yyreduce: else cfg_parser->cfg->deny_any = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4574 "util/configparser.c" +#line 4582 "util/configparser.c" break; - case 411: -#line 1690 "./util/configparser.y" + case 412: +#line 1691 "./util/configparser.y" { OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4582,21 +4590,21 @@ yyreduce: else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4586 "util/configparser.c" +#line 4594 "util/configparser.c" break; - case 412: -#line 1699 "./util/configparser.y" + case 413: +#line 1700 "./util/configparser.y" { OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 4596 "util/configparser.c" +#line 4604 "util/configparser.c" break; - case 413: -#line 1706 "./util/configparser.y" + case 414: +#line 1707 "./util/configparser.y" { OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4605,11 +4613,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4609 "util/configparser.c" +#line 4617 "util/configparser.c" break; - case 414: -#line 1716 "./util/configparser.y" + case 415: +#line 1717 "./util/configparser.y" { OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "deny")!=0 && strcmp((yyvsp[0].str), "refuse")!=0 && @@ -4628,21 +4636,21 @@ yyreduce: fatal_exit("out of memory adding acl"); } } -#line 4632 "util/configparser.c" +#line 4640 "util/configparser.c" break; - case 415: -#line 1736 "./util/configparser.y" + case 416: +#line 1737 "./util/configparser.y" { OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->module_conf); cfg_parser->cfg->module_conf = (yyvsp[0].str); } -#line 4642 "util/configparser.c" +#line 4650 "util/configparser.c" break; - case 416: -#line 1743 "./util/configparser.y" + case 417: +#line 1744 "./util/configparser.y" { OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4659,11 +4667,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4663 "util/configparser.c" +#line 4671 "util/configparser.c" break; - case 417: -#line 1761 "./util/configparser.y" + case 418: +#line 1762 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4675,11 +4683,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4679 "util/configparser.c" +#line 4687 "util/configparser.c" break; - case 418: -#line 1774 "./util/configparser.y" + case 419: +#line 1775 "./util/configparser.y" { OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str))); if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) { @@ -4691,11 +4699,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4695 "util/configparser.c" +#line 4703 "util/configparser.c" break; - case 419: -#line 1787 "./util/configparser.y" + case 420: +#line 1788 "./util/configparser.y" { OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4703,11 +4711,11 @@ yyreduce: else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4707 "util/configparser.c" +#line 4715 "util/configparser.c" break; - case 420: -#line 1796 "./util/configparser.y" + case 421: +#line 1797 "./util/configparser.y" { OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4715,11 +4723,11 @@ yyreduce: else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4719 "util/configparser.c" +#line 4727 "util/configparser.c" break; - case 421: -#line 1805 "./util/configparser.y" + case 422: +#line 1806 "./util/configparser.y" { OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4727,11 +4735,11 @@ yyreduce: else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4731 "util/configparser.c" +#line 4739 "util/configparser.c" break; - case 422: -#line 1814 "./util/configparser.y" + case 423: +#line 1815 "./util/configparser.y" { OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4739,11 +4747,11 @@ yyreduce: else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4743 "util/configparser.c" +#line 4751 "util/configparser.c" break; - case 423: -#line 1823 "./util/configparser.y" + case 424: +#line 1824 "./util/configparser.y" { OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4752,11 +4760,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4756 "util/configparser.c" +#line 4764 "util/configparser.c" break; - case 424: -#line 1833 "./util/configparser.y" + case 425: +#line 1834 "./util/configparser.y" { OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4765,11 +4773,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4769 "util/configparser.c" +#line 4777 "util/configparser.c" break; - case 425: -#line 1843 "./util/configparser.y" + case 426: +#line 1844 "./util/configparser.y" { OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4779,11 +4787,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4783 "util/configparser.c" +#line 4791 "util/configparser.c" break; - case 426: -#line 1854 "./util/configparser.y" + case 427: +#line 1855 "./util/configparser.y" { OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4791,11 +4799,11 @@ yyreduce: else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4795 "util/configparser.c" +#line 4803 "util/configparser.c" break; - case 427: -#line 1863 "./util/configparser.y" + case 428: +#line 1864 "./util/configparser.y" { OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4803,11 +4811,11 @@ yyreduce: else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4807 "util/configparser.c" +#line 4815 "util/configparser.c" break; - case 428: -#line 1872 "./util/configparser.y" + case 429: +#line 1873 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4815,11 +4823,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4819 "util/configparser.c" +#line 4827 "util/configparser.c" break; - case 429: -#line 1881 "./util/configparser.y" + case 430: +#line 1882 "./util/configparser.y" { OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4827,11 +4835,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4831 "util/configparser.c" +#line 4839 "util/configparser.c" break; - case 430: -#line 1890 "./util/configparser.y" + case 431: +#line 1891 "./util/configparser.y" { OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4839,11 +4847,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_reply_ttl = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4843 "util/configparser.c" +#line 4851 "util/configparser.c" break; - case 431: -#line 1899 "./util/configparser.y" + case 432: +#line 1900 "./util/configparser.y" { OUTYY(("P(server_serve_expired_client_timeout:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4851,11 +4859,11 @@ yyreduce: else cfg_parser->cfg->serve_expired_client_timeout = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4855 "util/configparser.c" +#line 4863 "util/configparser.c" break; - case 432: -#line 1908 "./util/configparser.y" + case 433: +#line 1909 "./util/configparser.y" { OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4867,11 +4875,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 4871 "util/configparser.c" +#line 4879 "util/configparser.c" break; - case 433: -#line 1921 "./util/configparser.y" + case 434: +#line 1922 "./util/configparser.y" { OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4883,11 +4891,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 4887 "util/configparser.c" +#line 4895 "util/configparser.c" break; - case 434: -#line 1934 "./util/configparser.y" + case 435: +#line 1935 "./util/configparser.y" { OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4895,21 +4903,21 @@ yyreduce: else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4899 "util/configparser.c" +#line 4907 "util/configparser.c" break; - case 435: -#line 1943 "./util/configparser.y" + case 436: +#line 1944 "./util/configparser.y" { OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->val_nsec3_key_iterations); cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str); } -#line 4909 "util/configparser.c" +#line 4917 "util/configparser.c" break; - case 436: -#line 1950 "./util/configparser.y" + case 437: +#line 1951 "./util/configparser.y" { OUTYY(("P(server_zonemd_permissive_mode:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4917,11 +4925,11 @@ yyreduce: else cfg_parser->cfg->zonemd_permissive_mode = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4921 "util/configparser.c" +#line 4929 "util/configparser.c" break; - case 437: -#line 1959 "./util/configparser.y" + case 438: +#line 1960 "./util/configparser.y" { OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4929,11 +4937,11 @@ yyreduce: else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4933 "util/configparser.c" +#line 4941 "util/configparser.c" break; - case 438: -#line 1968 "./util/configparser.y" + case 439: +#line 1969 "./util/configparser.y" { OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4941,11 +4949,11 @@ yyreduce: else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4945 "util/configparser.c" +#line 4953 "util/configparser.c" break; - case 439: -#line 1977 "./util/configparser.y" + case 440: +#line 1978 "./util/configparser.y" { OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -4953,11 +4961,11 @@ yyreduce: else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 4957 "util/configparser.c" +#line 4965 "util/configparser.c" break; - case 440: -#line 1986 "./util/configparser.y" + case 441: +#line 1987 "./util/configparser.y" { OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -4966,22 +4974,22 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 4970 "util/configparser.c" +#line 4978 "util/configparser.c" break; - case 441: -#line 1995 "./util/configparser.y" + case 442: +#line 1996 "./util/configparser.y" { OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 4981 "util/configparser.c" +#line 4989 "util/configparser.c" break; - case 442: -#line 2003 "./util/configparser.y" + case 443: +#line 2004 "./util/configparser.y" { OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -4993,22 +5001,22 @@ yyreduce: } free((yyvsp[0].str)); } -#line 4997 "util/configparser.c" +#line 5005 "util/configparser.c" break; - case 443: -#line 2016 "./util/configparser.y" + case 444: +#line 2017 "./util/configparser.y" { OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5008 "util/configparser.c" +#line 5016 "util/configparser.c" break; - case 444: -#line 2024 "./util/configparser.y" + case 445: +#line 2025 "./util/configparser.y" { OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 && @@ -5048,21 +5056,21 @@ yyreduce: fatal_exit("out of memory adding local-zone"); } } -#line 5052 "util/configparser.c" +#line 5060 "util/configparser.c" break; - case 445: -#line 2065 "./util/configparser.y" + case 446: +#line 2066 "./util/configparser.y" { OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str))) fatal_exit("out of memory adding local-data"); } -#line 5062 "util/configparser.c" +#line 5070 "util/configparser.c" break; - case 446: -#line 2072 "./util/configparser.y" + case 447: +#line 2073 "./util/configparser.y" { char* ptr; OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str))); @@ -5076,11 +5084,11 @@ yyreduce: yyerror("local-data-ptr could not be reversed"); } } -#line 5080 "util/configparser.c" +#line 5088 "util/configparser.c" break; - case 447: -#line 2087 "./util/configparser.y" + case 448: +#line 2088 "./util/configparser.y" { OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5089,11 +5097,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5093 "util/configparser.c" +#line 5101 "util/configparser.c" break; - case 448: -#line 2097 "./util/configparser.y" + case 449: +#line 2098 "./util/configparser.y" { OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5102,41 +5110,41 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5106 "util/configparser.c" +#line 5114 "util/configparser.c" break; - case 449: -#line 2107 "./util/configparser.y" + case 450: +#line 2108 "./util/configparser.y" { OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5116 "util/configparser.c" +#line 5124 "util/configparser.c" break; - case 450: -#line 2114 "./util/configparser.y" + case 451: +#line 2115 "./util/configparser.y" { OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5126 "util/configparser.c" +#line 5134 "util/configparser.c" break; - case 451: -#line 2121 "./util/configparser.y" + case 452: +#line 2122 "./util/configparser.y" { OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dns64_prefix); cfg_parser->cfg->dns64_prefix = (yyvsp[0].str); } -#line 5136 "util/configparser.c" +#line 5144 "util/configparser.c" break; - case 452: -#line 2128 "./util/configparser.y" + case 453: +#line 2129 "./util/configparser.y" { OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5144,22 +5152,22 @@ yyreduce: else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5148 "util/configparser.c" +#line 5156 "util/configparser.c" break; - case 453: -#line 2137 "./util/configparser.y" + case 454: +#line 2138 "./util/configparser.y" { OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa, (yyvsp[0].str))) fatal_exit("out of memory adding dns64-ignore-aaaa"); } -#line 5159 "util/configparser.c" +#line 5167 "util/configparser.c" break; - case 454: -#line 2145 "./util/configparser.y" + case 455: +#line 2146 "./util/configparser.y" { char* p, *s = (yyvsp[0].str); OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str))); @@ -5172,11 +5180,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5176 "util/configparser.c" +#line 5184 "util/configparser.c" break; - case 455: -#line 2159 "./util/configparser.y" + case 456: +#line 2160 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5196,11 +5204,11 @@ yyreduce: } } } -#line 5200 "util/configparser.c" +#line 5208 "util/configparser.c" break; - case 456: -#line 2180 "./util/configparser.y" + case 457: +#line 2181 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5220,11 +5228,11 @@ yyreduce: } } } -#line 5224 "util/configparser.c" +#line 5232 "util/configparser.c" break; - case 457: -#line 2201 "./util/configparser.y" + case 458: +#line 2202 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions, @@ -5235,11 +5243,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5239 "util/configparser.c" +#line 5247 "util/configparser.c" break; - case 458: -#line 2213 "./util/configparser.y" + case 459: +#line 2214 "./util/configparser.y" { OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas, @@ -5250,11 +5258,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5254 "util/configparser.c" +#line 5262 "util/configparser.c" break; - case 459: -#line 2225 "./util/configparser.y" + case 460: +#line 2226 "./util/configparser.y" { OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides, @@ -5265,11 +5273,11 @@ yyreduce: free((yyvsp[0].str)); } } -#line 5269 "util/configparser.c" +#line 5277 "util/configparser.c" break; - case 460: -#line 2237 "./util/configparser.y" + case 461: +#line 2238 "./util/configparser.y" { OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view, @@ -5277,11 +5285,11 @@ yyreduce: yyerror("out of memory"); } } -#line 5281 "util/configparser.c" +#line 5289 "util/configparser.c" break; - case 461: -#line 2246 "./util/configparser.y" + case 462: +#line 2247 "./util/configparser.y" { size_t len = 0; uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str), @@ -5301,11 +5309,11 @@ yyreduce: } } } -#line 5305 "util/configparser.c" +#line 5313 "util/configparser.c" break; - case 462: -#line 2267 "./util/configparser.y" + case 463: +#line 2268 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5313,11 +5321,11 @@ yyreduce: else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5317 "util/configparser.c" +#line 5325 "util/configparser.c" break; - case 463: -#line 2277 "./util/configparser.y" + case 464: +#line 2278 "./util/configparser.y" { OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5325,33 +5333,33 @@ yyreduce: else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5329 "util/configparser.c" +#line 5337 "util/configparser.c" break; - case 464: -#line 2286 "./util/configparser.y" + case 465: +#line 2287 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5340 "util/configparser.c" +#line 5348 "util/configparser.c" break; - case 465: -#line 2294 "./util/configparser.y" + case 466: +#line 2295 "./util/configparser.y" { OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 5351 "util/configparser.c" +#line 5359 "util/configparser.c" break; - case 466: -#line 2302 "./util/configparser.y" + case 467: +#line 2303 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -5363,11 +5371,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5367 "util/configparser.c" +#line 5375 "util/configparser.c" break; - case 467: -#line 2315 "./util/configparser.y" + case 468: +#line 2316 "./util/configparser.y" { OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -5379,11 +5387,11 @@ yyreduce: } free((yyvsp[0].str)); } -#line 5383 "util/configparser.c" +#line 5391 "util/configparser.c" break; - case 468: -#line 2328 "./util/configparser.y" + case 469: +#line 2329 "./util/configparser.y" { OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) { @@ -5397,11 +5405,11 @@ yyreduce: "ratelimit-for-domain"); } } -#line 5401 "util/configparser.c" +#line 5409 "util/configparser.c" break; - case 469: -#line 2343 "./util/configparser.y" + case 470: +#line 2344 "./util/configparser.y" { OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) { @@ -5415,11 +5423,11 @@ yyreduce: "ratelimit-below-domain"); } } -#line 5419 "util/configparser.c" +#line 5427 "util/configparser.c" break; - case 470: -#line 2358 "./util/configparser.y" + case 471: +#line 2359 "./util/configparser.y" { OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5427,11 +5435,11 @@ yyreduce: else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5431 "util/configparser.c" +#line 5439 "util/configparser.c" break; - case 471: -#line 2367 "./util/configparser.y" + case 472: +#line 2368 "./util/configparser.y" { OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5439,20 +5447,20 @@ yyreduce: else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5443 "util/configparser.c" +#line 5451 "util/configparser.c" break; - case 472: -#line 2376 "./util/configparser.y" + case 473: +#line 2377 "./util/configparser.y" { OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n")); free((yyvsp[0].str)); } -#line 5452 "util/configparser.c" +#line 5460 "util/configparser.c" break; - case 473: -#line 2382 "./util/configparser.y" + case 474: +#line 2383 "./util/configparser.y" { OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) <= 0) @@ -5460,11 +5468,11 @@ yyreduce: else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5464 "util/configparser.c" +#line 5472 "util/configparser.c" break; - case 474: -#line 2391 "./util/configparser.y" + case 475: +#line 2392 "./util/configparser.y" { OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5472,11 +5480,11 @@ yyreduce: else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 5476 "util/configparser.c" +#line 5484 "util/configparser.c" break; - case 475: -#line 2400 "./util/configparser.y" + case 476: +#line 2401 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5485,11 +5493,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5489 "util/configparser.c" +#line 5497 "util/configparser.c" break; - case 476: -#line 2410 "./util/configparser.y" + case 477: +#line 2411 "./util/configparser.y" { OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5498,11 +5506,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5502 "util/configparser.c" +#line 5510 "util/configparser.c" break; - case 477: -#line 2420 "./util/configparser.y" + case 478: +#line 2421 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str))); @@ -5514,11 +5522,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5518 "util/configparser.c" +#line 5526 "util/configparser.c" break; - case 478: -#line 2433 "./util/configparser.y" + case 479: +#line 2434 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str))); @@ -5530,11 +5538,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 5534 "util/configparser.c" +#line 5542 "util/configparser.c" break; - case 479: -#line 2446 "./util/configparser.y" + case 480: +#line 2447 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str))); @@ -5545,11 +5553,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5549 "util/configparser.c" +#line 5557 "util/configparser.c" break; - case 480: -#line 2458 "./util/configparser.y" + case 481: +#line 2459 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str))); @@ -5562,11 +5570,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5566 "util/configparser.c" +#line 5574 "util/configparser.c" break; - case 481: -#line 2472 "./util/configparser.y" + case 482: +#line 2473 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str))); @@ -5577,11 +5585,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5581 "util/configparser.c" +#line 5589 "util/configparser.c" break; - case 482: -#line 2484 "./util/configparser.y" + case 483: +#line 2485 "./util/configparser.y" { #ifdef USE_IPSECMOD OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str))); @@ -5594,11 +5602,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 5598 "util/configparser.c" +#line 5606 "util/configparser.c" break; - case 483: -#line 2498 "./util/configparser.y" + case 484: +#line 2499 "./util/configparser.y" { int tag_data; OUTYY(("P(server_edns_client_tag:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); @@ -5612,11 +5620,11 @@ yyreduce: fatal_exit("out of memory adding " "edns-client-tag"); } -#line 5616 "util/configparser.c" +#line 5624 "util/configparser.c" break; - case 484: -#line 2513 "./util/configparser.y" + case 485: +#line 2514 "./util/configparser.y" { OUTYY(("P(edns_client_tag_opcode:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) @@ -5626,11 +5634,11 @@ yyreduce: else cfg_parser->cfg->edns_client_tag_opcode = atoi((yyvsp[0].str)); } -#line 5630 "util/configparser.c" +#line 5638 "util/configparser.c" break; - case 485: -#line 2524 "./util/configparser.y" + case 486: +#line 2525 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->stubs->name) @@ -5639,31 +5647,31 @@ yyreduce: free(cfg_parser->cfg->stubs->name); cfg_parser->cfg->stubs->name = (yyvsp[0].str); } -#line 5643 "util/configparser.c" +#line 5651 "util/configparser.c" break; - case 486: -#line 2534 "./util/configparser.y" + case 487: +#line 2535 "./util/configparser.y" { OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5653 "util/configparser.c" +#line 5661 "util/configparser.c" break; - case 487: -#line 2541 "./util/configparser.y" + case 488: +#line 2542 "./util/configparser.y" { OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5663 "util/configparser.c" +#line 5671 "util/configparser.c" break; - case 488: -#line 2548 "./util/configparser.y" + case 489: +#line 2549 "./util/configparser.y" { OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5671,11 +5679,11 @@ yyreduce: else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5675 "util/configparser.c" +#line 5683 "util/configparser.c" break; - case 489: -#line 2557 "./util/configparser.y" + case 490: +#line 2558 "./util/configparser.y" { OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5683,11 +5691,11 @@ yyreduce: else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5687 "util/configparser.c" +#line 5695 "util/configparser.c" break; - case 490: -#line 2566 "./util/configparser.y" + case 491: +#line 2567 "./util/configparser.y" { OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5696,11 +5704,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5700 "util/configparser.c" +#line 5708 "util/configparser.c" break; - case 491: -#line 2576 "./util/configparser.y" + case 492: +#line 2577 "./util/configparser.y" { OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5709,11 +5717,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5713 "util/configparser.c" +#line 5721 "util/configparser.c" break; - case 492: -#line 2586 "./util/configparser.y" + case 493: +#line 2587 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->forwards->name) @@ -5722,31 +5730,31 @@ yyreduce: free(cfg_parser->cfg->forwards->name); cfg_parser->cfg->forwards->name = (yyvsp[0].str); } -#line 5726 "util/configparser.c" +#line 5734 "util/configparser.c" break; - case 493: -#line 2596 "./util/configparser.y" + case 494: +#line 2597 "./util/configparser.y" { OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5736 "util/configparser.c" +#line 5744 "util/configparser.c" break; - case 494: -#line 2603 "./util/configparser.y" + case 495: +#line 2604 "./util/configparser.y" { OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5746 "util/configparser.c" +#line 5754 "util/configparser.c" break; - case 495: -#line 2610 "./util/configparser.y" + case 496: +#line 2611 "./util/configparser.y" { OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5754,11 +5762,11 @@ yyreduce: else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5758 "util/configparser.c" +#line 5766 "util/configparser.c" break; - case 496: -#line 2619 "./util/configparser.y" + case 497: +#line 2620 "./util/configparser.y" { OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5766,11 +5774,11 @@ yyreduce: else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5770 "util/configparser.c" +#line 5778 "util/configparser.c" break; - case 497: -#line 2628 "./util/configparser.y" + case 498: +#line 2629 "./util/configparser.y" { OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5779,11 +5787,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5783 "util/configparser.c" +#line 5791 "util/configparser.c" break; - case 498: -#line 2638 "./util/configparser.y" + case 499: +#line 2639 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->auths->name) @@ -5792,52 +5800,65 @@ yyreduce: free(cfg_parser->cfg->auths->name); cfg_parser->cfg->auths->name = (yyvsp[0].str); } -#line 5796 "util/configparser.c" +#line 5804 "util/configparser.c" break; - case 499: -#line 2648 "./util/configparser.y" + case 500: +#line 2649 "./util/configparser.y" { OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->auths->zonefile); cfg_parser->cfg->auths->zonefile = (yyvsp[0].str); } -#line 5806 "util/configparser.c" +#line 5814 "util/configparser.c" break; - case 500: -#line 2655 "./util/configparser.y" + case 501: +#line 2656 "./util/configparser.y" { OUTYY(("P(master:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5816 "util/configparser.c" +#line 5824 "util/configparser.c" break; - case 501: -#line 2662 "./util/configparser.y" + case 502: +#line 2663 "./util/configparser.y" { OUTYY(("P(url:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5826 "util/configparser.c" +#line 5834 "util/configparser.c" break; - case 502: -#line 2669 "./util/configparser.y" + case 503: +#line 2670 "./util/configparser.y" { OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify, (yyvsp[0].str))) yyerror("out of memory"); } -#line 5837 "util/configparser.c" +#line 5845 "util/configparser.c" break; - case 503: -#line 2677 "./util/configparser.y" + case 504: +#line 2678 "./util/configparser.y" + { + OUTYY(("P(zonemd-reject-absence:%s)\n", (yyvsp[0].str))); + if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->auths->zonemd_reject_absence = + (strcmp((yyvsp[0].str), "yes")==0); + free((yyvsp[0].str)); + } +#line 5858 "util/configparser.c" + break; + + case 505: +#line 2688 "./util/configparser.y" { OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5846,11 +5867,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5850 "util/configparser.c" +#line 5871 "util/configparser.c" break; - case 504: -#line 2687 "./util/configparser.y" + case 506: +#line 2698 "./util/configparser.y" { OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5859,11 +5880,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5863 "util/configparser.c" +#line 5884 "util/configparser.c" break; - case 505: -#line 2697 "./util/configparser.y" + case 507: +#line 2708 "./util/configparser.y" { OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5872,11 +5893,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5876 "util/configparser.c" +#line 5897 "util/configparser.c" break; - case 506: -#line 2707 "./util/configparser.y" + case 508: +#line 2718 "./util/configparser.y" { OUTYY(("P(name:%s)\n", (yyvsp[0].str))); if(cfg_parser->cfg->views->name) @@ -5885,11 +5906,11 @@ yyreduce: free(cfg_parser->cfg->views->name); cfg_parser->cfg->views->name = (yyvsp[0].str); } -#line 5889 "util/configparser.c" +#line 5910 "util/configparser.c" break; - case 507: -#line 2717 "./util/configparser.y" + case 509: +#line 2728 "./util/configparser.y" { OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 && @@ -5927,11 +5948,11 @@ yyreduce: fatal_exit("out of memory adding local-zone"); } } -#line 5931 "util/configparser.c" +#line 5952 "util/configparser.c" break; - case 508: -#line 2756 "./util/configparser.y" + case 510: +#line 2767 "./util/configparser.y" { OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_respip_action((yyvsp[0].str)); @@ -5940,33 +5961,33 @@ yyreduce: fatal_exit("out of memory adding per-view " "response-ip action"); } -#line 5944 "util/configparser.c" +#line 5965 "util/configparser.c" break; - case 509: -#line 2766 "./util/configparser.y" + case 511: +#line 2777 "./util/configparser.y" { OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str))); if(!cfg_str2list_insert( &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip-data"); } -#line 5955 "util/configparser.c" +#line 5976 "util/configparser.c" break; - case 510: -#line 2774 "./util/configparser.y" + case 512: +#line 2785 "./util/configparser.y" { OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) { fatal_exit("out of memory adding local-data"); } } -#line 5966 "util/configparser.c" +#line 5987 "util/configparser.c" break; - case 511: -#line 2782 "./util/configparser.y" + case 513: +#line 2793 "./util/configparser.y" { char* ptr; OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str))); @@ -5980,11 +6001,11 @@ yyreduce: yyerror("local-data-ptr could not be reversed"); } } -#line 5984 "util/configparser.c" +#line 6005 "util/configparser.c" break; - case 512: -#line 2797 "./util/configparser.y" + case 514: +#line 2808 "./util/configparser.y" { OUTYY(("P(view-first:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -5992,19 +6013,19 @@ yyreduce: else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 5996 "util/configparser.c" +#line 6017 "util/configparser.c" break; - case 513: -#line 2806 "./util/configparser.y" + case 515: +#line 2817 "./util/configparser.y" { OUTYY(("\nP(remote-control:)\n")); } -#line 6004 "util/configparser.c" +#line 6025 "util/configparser.c" break; - case 524: -#line 2817 "./util/configparser.y" + case 526: +#line 2828 "./util/configparser.y" { OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6013,11 +6034,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6017 "util/configparser.c" +#line 6038 "util/configparser.c" break; - case 525: -#line 2827 "./util/configparser.y" + case 527: +#line 2838 "./util/configparser.y" { OUTYY(("P(control_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6025,79 +6046,79 @@ yyreduce: else cfg_parser->cfg->control_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 6029 "util/configparser.c" +#line 6050 "util/configparser.c" break; - case 526: -#line 2836 "./util/configparser.y" + case 528: +#line 2847 "./util/configparser.y" { OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6039 "util/configparser.c" +#line 6060 "util/configparser.c" break; - case 527: -#line 2843 "./util/configparser.y" + case 529: +#line 2854 "./util/configparser.y" { OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str))); cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6049 "util/configparser.c" +#line 6070 "util/configparser.c" break; - case 528: -#line 2850 "./util/configparser.y" + case 530: +#line 2861 "./util/configparser.y" { OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->server_key_file); cfg_parser->cfg->server_key_file = (yyvsp[0].str); } -#line 6059 "util/configparser.c" +#line 6080 "util/configparser.c" break; - case 529: -#line 2857 "./util/configparser.y" + case 531: +#line 2868 "./util/configparser.y" { OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->server_cert_file); cfg_parser->cfg->server_cert_file = (yyvsp[0].str); } -#line 6069 "util/configparser.c" +#line 6090 "util/configparser.c" break; - case 530: -#line 2864 "./util/configparser.y" + case 532: +#line 2875 "./util/configparser.y" { OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->control_key_file); cfg_parser->cfg->control_key_file = (yyvsp[0].str); } -#line 6079 "util/configparser.c" +#line 6100 "util/configparser.c" break; - case 531: -#line 2871 "./util/configparser.y" + case 533: +#line 2882 "./util/configparser.y" { OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->control_cert_file); cfg_parser->cfg->control_cert_file = (yyvsp[0].str); } -#line 6089 "util/configparser.c" +#line 6110 "util/configparser.c" break; - case 532: -#line 2878 "./util/configparser.y" + case 534: +#line 2889 "./util/configparser.y" { OUTYY(("\nP(dnstap:)\n")); } -#line 6097 "util/configparser.c" +#line 6118 "util/configparser.c" break; - case 554: -#line 2898 "./util/configparser.y" + case 556: +#line 2909 "./util/configparser.y" { OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6105,11 +6126,11 @@ yyreduce: else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6109 "util/configparser.c" +#line 6130 "util/configparser.c" break; - case 555: -#line 2907 "./util/configparser.y" + case 557: +#line 2918 "./util/configparser.y" { OUTYY(("P(dt_dnstap_bidirectional:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6118,31 +6139,31 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6122 "util/configparser.c" +#line 6143 "util/configparser.c" break; - case 556: -#line 2917 "./util/configparser.y" + case 558: +#line 2928 "./util/configparser.y" { OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_socket_path); cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str); } -#line 6132 "util/configparser.c" +#line 6153 "util/configparser.c" break; - case 557: -#line 2924 "./util/configparser.y" + case 559: +#line 2935 "./util/configparser.y" { OUTYY(("P(dt_dnstap_ip:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_ip); cfg_parser->cfg->dnstap_ip = (yyvsp[0].str); } -#line 6142 "util/configparser.c" +#line 6163 "util/configparser.c" break; - case 558: -#line 2931 "./util/configparser.y" + case 560: +#line 2942 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6150,51 +6171,51 @@ yyreduce: else cfg_parser->cfg->dnstap_tls = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6154 "util/configparser.c" +#line 6175 "util/configparser.c" break; - case 559: -#line 2940 "./util/configparser.y" + case 561: +#line 2951 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_server_name:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_server_name); cfg_parser->cfg->dnstap_tls_server_name = (yyvsp[0].str); } -#line 6164 "util/configparser.c" +#line 6185 "util/configparser.c" break; - case 560: -#line 2947 "./util/configparser.y" + case 562: +#line 2958 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_cert_bundle:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_cert_bundle); cfg_parser->cfg->dnstap_tls_cert_bundle = (yyvsp[0].str); } -#line 6174 "util/configparser.c" +#line 6195 "util/configparser.c" break; - case 561: -#line 2954 "./util/configparser.y" + case 563: +#line 2965 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_key_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_client_key_file); cfg_parser->cfg->dnstap_tls_client_key_file = (yyvsp[0].str); } -#line 6184 "util/configparser.c" +#line 6205 "util/configparser.c" break; - case 562: -#line 2961 "./util/configparser.y" + case 564: +#line 2972 "./util/configparser.y" { OUTYY(("P(dt_dnstap_tls_client_cert_file:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_tls_client_cert_file); cfg_parser->cfg->dnstap_tls_client_cert_file = (yyvsp[0].str); } -#line 6194 "util/configparser.c" +#line 6215 "util/configparser.c" break; - case 563: -#line 2968 "./util/configparser.y" + case 565: +#line 2979 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6202,11 +6223,11 @@ yyreduce: else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6206 "util/configparser.c" +#line 6227 "util/configparser.c" break; - case 564: -#line 2977 "./util/configparser.y" + case 566: +#line 2988 "./util/configparser.y" { OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6214,31 +6235,31 @@ yyreduce: else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6218 "util/configparser.c" +#line 6239 "util/configparser.c" break; - case 565: -#line 2986 "./util/configparser.y" + case 567: +#line 2997 "./util/configparser.y" { OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_identity); cfg_parser->cfg->dnstap_identity = (yyvsp[0].str); } -#line 6228 "util/configparser.c" +#line 6249 "util/configparser.c" break; - case 566: -#line 2993 "./util/configparser.y" + case 568: +#line 3004 "./util/configparser.y" { OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnstap_version); cfg_parser->cfg->dnstap_version = (yyvsp[0].str); } -#line 6238 "util/configparser.c" +#line 6259 "util/configparser.c" break; - case 567: -#line 3000 "./util/configparser.y" + case 569: +#line 3011 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6247,11 +6268,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6251 "util/configparser.c" +#line 6272 "util/configparser.c" break; - case 568: -#line 3010 "./util/configparser.y" + case 570: +#line 3021 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6260,11 +6281,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6264 "util/configparser.c" +#line 6285 "util/configparser.c" break; - case 569: -#line 3020 "./util/configparser.y" + case 571: +#line 3031 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6273,11 +6294,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6277 "util/configparser.c" +#line 6298 "util/configparser.c" break; - case 570: -#line 3030 "./util/configparser.y" + case 572: +#line 3041 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6286,11 +6307,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6290 "util/configparser.c" +#line 6311 "util/configparser.c" break; - case 571: -#line 3040 "./util/configparser.y" + case 573: +#line 3051 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6299,11 +6320,11 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6303 "util/configparser.c" +#line 6324 "util/configparser.c" break; - case 572: -#line 3050 "./util/configparser.y" + case 574: +#line 3061 "./util/configparser.y" { OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6312,47 +6333,47 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6316 "util/configparser.c" +#line 6337 "util/configparser.c" break; - case 573: -#line 3060 "./util/configparser.y" + case 575: +#line 3071 "./util/configparser.y" { OUTYY(("\nP(python:)\n")); } -#line 6324 "util/configparser.c" +#line 6345 "util/configparser.c" break; - case 577: -#line 3069 "./util/configparser.y" + case 579: +#line 3080 "./util/configparser.y" { OUTYY(("P(python-script:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->python_script, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6334 "util/configparser.c" +#line 6355 "util/configparser.c" break; - case 578: -#line 3075 "./util/configparser.y" + case 580: +#line 3086 "./util/configparser.y" { OUTYY(("\nP(dynlib:)\n")); } -#line 6342 "util/configparser.c" +#line 6363 "util/configparser.c" break; - case 582: -#line 3084 "./util/configparser.y" + case 584: +#line 3095 "./util/configparser.y" { OUTYY(("P(dynlib-file:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_append_ex(&cfg_parser->cfg->dynlib_file, (yyvsp[0].str))) yyerror("out of memory"); } -#line 6352 "util/configparser.c" +#line 6373 "util/configparser.c" break; - case 583: -#line 3090 "./util/configparser.y" + case 585: +#line 3101 "./util/configparser.y" { OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str))); if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6361,21 +6382,21 @@ yyreduce: (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6365 "util/configparser.c" +#line 6386 "util/configparser.c" break; - case 584: -#line 3100 "./util/configparser.y" + case 586: +#line 3111 "./util/configparser.y" { OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->log_identity); cfg_parser->cfg->log_identity = (yyvsp[0].str); } -#line 6375 "util/configparser.c" +#line 6396 "util/configparser.c" break; - case 585: -#line 3107 "./util/configparser.y" + case 587: +#line 3118 "./util/configparser.y" { OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); validate_respip_action((yyvsp[0].str)); @@ -6383,30 +6404,30 @@ yyreduce: (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip"); } -#line 6387 "util/configparser.c" +#line 6408 "util/configparser.c" break; - case 586: -#line 3116 "./util/configparser.y" + case 588: +#line 3127 "./util/configparser.y" { OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str))); if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data, (yyvsp[-1].str), (yyvsp[0].str))) fatal_exit("out of memory adding response-ip-data"); } -#line 6398 "util/configparser.c" +#line 6419 "util/configparser.c" break; - case 587: -#line 3124 "./util/configparser.y" + case 589: +#line 3135 "./util/configparser.y" { OUTYY(("\nP(dnscrypt:)\n")); } -#line 6406 "util/configparser.c" +#line 6427 "util/configparser.c" break; - case 600: -#line 3140 "./util/configparser.y" + case 602: +#line 3151 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str))); if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0) @@ -6414,11 +6435,11 @@ yyreduce: else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0); free((yyvsp[0].str)); } -#line 6418 "util/configparser.c" +#line 6439 "util/configparser.c" break; - case 601: -#line 3150 "./util/configparser.y" + case 603: +#line 3161 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6426,21 +6447,21 @@ yyreduce: else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str)); free((yyvsp[0].str)); } -#line 6430 "util/configparser.c" +#line 6451 "util/configparser.c" break; - case 602: -#line 3159 "./util/configparser.y" + case 604: +#line 3170 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str))); free(cfg_parser->cfg->dnscrypt_provider); cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str); } -#line 6440 "util/configparser.c" +#line 6461 "util/configparser.c" break; - case 603: -#line 3166 "./util/configparser.y" + case 605: +#line 3177 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str))) @@ -6448,21 +6469,21 @@ yyreduce: if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-provider-cert"); } -#line 6452 "util/configparser.c" +#line 6473 "util/configparser.c" break; - case 604: -#line 3175 "./util/configparser.y" + case 606: +#line 3186 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str))); if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-provider-cert-rotated"); } -#line 6462 "util/configparser.c" +#line 6483 "util/configparser.c" break; - case 605: -#line 3182 "./util/configparser.y" + case 607: +#line 3193 "./util/configparser.y" { OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str))); if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str))) @@ -6470,22 +6491,22 @@ yyreduce: if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str))) fatal_exit("out of memory adding dnscrypt-secret-key"); } -#line 6474 "util/configparser.c" +#line 6495 "util/configparser.c" break; - case 606: -#line 3191 "./util/configparser.y" + case 608: +#line 3202 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 6485 "util/configparser.c" +#line 6506 "util/configparser.c" break; - case 607: -#line 3199 "./util/configparser.y" + case 609: +#line 3210 "./util/configparser.y" { OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6497,22 +6518,22 @@ yyreduce: } free((yyvsp[0].str)); } -#line 6501 "util/configparser.c" +#line 6522 "util/configparser.c" break; - case 608: -#line 3212 "./util/configparser.y" + case 610: +#line 3223 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str))); if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size)) yyerror("memory size expected"); free((yyvsp[0].str)); } -#line 6512 "util/configparser.c" +#line 6533 "util/configparser.c" break; - case 609: -#line 3220 "./util/configparser.y" + case 611: +#line 3231 "./util/configparser.y" { OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str))); if(atoi((yyvsp[0].str)) == 0) @@ -6524,19 +6545,19 @@ yyreduce: } free((yyvsp[0].str)); } -#line 6528 "util/configparser.c" +#line 6549 "util/configparser.c" break; - case 610: -#line 3233 "./util/configparser.y" + case 612: +#line 3244 "./util/configparser.y" { OUTYY(("\nP(cachedb:)\n")); } -#line 6536 "util/configparser.c" +#line 6557 "util/configparser.c" break; - case 619: -#line 3244 "./util/configparser.y" + case 621: +#line 3255 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(backend:%s)\n", (yyvsp[0].str))); @@ -6547,11 +6568,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6551 "util/configparser.c" +#line 6572 "util/configparser.c" break; - case 620: -#line 3256 "./util/configparser.y" + case 622: +#line 3267 "./util/configparser.y" { #ifdef USE_CACHEDB OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str))); @@ -6562,11 +6583,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6566 "util/configparser.c" +#line 6587 "util/configparser.c" break; - case 621: -#line 3268 "./util/configparser.y" + case 623: +#line 3279 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str))); @@ -6577,11 +6598,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6581 "util/configparser.c" +#line 6602 "util/configparser.c" break; - case 622: -#line 3280 "./util/configparser.y" + case 624: +#line 3291 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) int port; @@ -6595,11 +6616,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 6599 "util/configparser.c" +#line 6620 "util/configparser.c" break; - case 623: -#line 3295 "./util/configparser.y" + case 625: +#line 3306 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str))); @@ -6611,11 +6632,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 6615 "util/configparser.c" +#line 6636 "util/configparser.c" break; - case 624: -#line 3308 "./util/configparser.y" + case 626: +#line 3319 "./util/configparser.y" { #if defined(USE_CACHEDB) && defined(USE_REDIS) OUTYY(("P(redis_expire_records:%s)\n", (yyvsp[0].str))); @@ -6627,11 +6648,11 @@ yyreduce: #endif free((yyvsp[0].str)); } -#line 6631 "util/configparser.c" +#line 6652 "util/configparser.c" break; - case 625: -#line 3321 "./util/configparser.y" + case 627: +#line 3332 "./util/configparser.y" { OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str))); if (atoi((yyvsp[0].str)) < 0) @@ -6641,19 +6662,19 @@ yyreduce: fatal_exit("out of memory adding tcp connection limit"); } } -#line 6645 "util/configparser.c" +#line 6666 "util/configparser.c" break; - case 626: -#line 3332 "./util/configparser.y" + case 628: +#line 3343 "./util/configparser.y" { OUTYY(("\nP(ipset:)\n")); } -#line 6653 "util/configparser.c" +#line 6674 "util/configparser.c" break; - case 631: -#line 3341 "./util/configparser.y" + case 633: +#line 3352 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v4:%s)\n", (yyvsp[0].str))); @@ -6667,11 +6688,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6671 "util/configparser.c" +#line 6692 "util/configparser.c" break; - case 632: -#line 3356 "./util/configparser.y" + case 634: +#line 3367 "./util/configparser.y" { #ifdef USE_IPSET OUTYY(("P(name-v6:%s)\n", (yyvsp[0].str))); @@ -6685,11 +6706,11 @@ yyreduce: free((yyvsp[0].str)); #endif } -#line 6689 "util/configparser.c" +#line 6710 "util/configparser.c" break; -#line 6693 "util/configparser.c" +#line 6714 "util/configparser.c" default: break; } @@ -6921,7 +6942,7 @@ yyreturn: #endif return yyresult; } -#line 3370 "./util/configparser.y" +#line 3381 "./util/configparser.y" /* parse helper routines could be here */ diff --git a/util/configparser.h b/util/configparser.h index bf8fa618a..50782ec34 100644 --- a/util/configparser.h +++ b/util/configparser.h @@ -348,7 +348,8 @@ extern int yydebug; VAR_DYNLIB_FILE = 554, VAR_EDNS_CLIENT_TAG = 555, VAR_EDNS_CLIENT_TAG_OPCODE = 556, - VAR_ZONEMD_PERMISSIVE_MODE = 557 + VAR_ZONEMD_PERMISSIVE_MODE = 557, + VAR_ZONEMD_REJECT_ABSENCE = 558 }; #endif /* Tokens. */ @@ -652,6 +653,7 @@ extern int yydebug; #define VAR_EDNS_CLIENT_TAG 555 #define VAR_EDNS_CLIENT_TAG_OPCODE 556 #define VAR_ZONEMD_PERMISSIVE_MODE 557 +#define VAR_ZONEMD_REJECT_ABSENCE 558 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -661,7 +663,7 @@ union YYSTYPE char* str; -#line 665 "util/configparser.h" +#line 667 "util/configparser.h" }; typedef union YYSTYPE YYSTYPE; diff --git a/util/configparser.y b/util/configparser.y index 8067d04ef..4f808723f 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -179,7 +179,7 @@ extern struct config_parser_state* cfg_parser; %token VAR_TLS_SESSION_TICKET_KEYS VAR_RPZ VAR_TAGS VAR_RPZ_ACTION_OVERRIDE %token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME %token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_TAG VAR_EDNS_CLIENT_TAG_OPCODE -%token VAR_ZONEMD_PERMISSIVE_MODE +%token VAR_ZONEMD_PERMISSIVE_MODE VAR_ZONEMD_REJECT_ABSENCE %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -360,6 +360,7 @@ authstart: VAR_AUTH_ZONE s->for_downstream = 1; s->for_upstream = 1; s->fallback_enabled = 0; + s->zonemd_reject_absence = 0; s->isrpz = 0; } else yyerror("out of memory"); @@ -369,7 +370,7 @@ contents_auth: contents_auth content_auth | ; content_auth: auth_name | auth_zonefile | auth_master | auth_url | auth_for_downstream | auth_for_upstream | auth_fallback_enabled | - auth_allow_notify + auth_allow_notify | auth_zonemd_reject_absence ; rpz_tag: VAR_TAGS STRING_ARG @@ -2673,6 +2674,16 @@ auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG yyerror("out of memory"); } ; +auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG + { + OUTYY(("P(zonemd-reject-absence:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->auths->zonemd_reject_absence = + (strcmp($2, "yes")==0); + free($2); + } + ; auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG { OUTYY(("P(for-downstream:%s)\n", $2)); From 639a773c39b1dcb5fc47817da7a60e964e314dcd Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Tue, 27 Oct 2020 13:44:44 +0100 Subject: [PATCH 47/66] zonemd, unit test for chain of trust from recursion to check ZONEMD. --- testdata/auth_zonemd_chain.rpl | 233 +++++++++++++++++++++++++++ testdata/auth_zonemd_chain_fail.rpl | 235 ++++++++++++++++++++++++++++ 2 files changed, 468 insertions(+) create mode 100644 testdata/auth_zonemd_chain.rpl create mode 100644 testdata/auth_zonemd_chain_fail.rpl diff --git a/testdata/auth_zonemd_chain.rpl b/testdata/auth_zonemd_chain.rpl new file mode 100644 index 000000000..b693f6c35 --- /dev/null +++ b/testdata/auth_zonemd_chain.rpl @@ -0,0 +1,233 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD from zonefile with chain of trust + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION ANSWER +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_chain_fail.rpl b/testdata/auth_zonemd_chain_fail.rpl new file mode 100644 index 000000000..d38367b9d --- /dev/null +++ b/testdata/auth_zonemd_chain_fail.rpl @@ -0,0 +1,235 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +; dnskey is wrong: +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+AAAAA ;{id = 55566 (zsk), size = 1024b} +; dnskey that was correct: +;example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD from zonefile with failed chain of trust + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION ANSWER +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +SCENARIO_END From 7ebb890a4a96614e2dac545307d791f197ca80e4 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 28 Oct 2020 15:10:14 +0100 Subject: [PATCH 48/66] zonemd, unit test for zonemd from file and trust anchor directly for DNSSEC. --- testdata/auth_zonemd_anchor.rpl | 233 ++++++++++++++++++++++++++ testdata/auth_zonemd_anchor_fail.rpl | 235 +++++++++++++++++++++++++++ 2 files changed, 468 insertions(+) create mode 100644 testdata/auth_zonemd_anchor.rpl create mode 100644 testdata/auth_zonemd_anchor_fail.rpl diff --git a/testdata/auth_zonemd_anchor.rpl b/testdata/auth_zonemd_anchor.rpl new file mode 100644 index 000000000..7e4257513 --- /dev/null +++ b/testdata/auth_zonemd_anchor.rpl @@ -0,0 +1,233 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "example.com. DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD from zonefile with trust anchor + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION ANSWER +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_anchor_fail.rpl b/testdata/auth_zonemd_anchor_fail.rpl new file mode 100644 index 000000000..69492d5f8 --- /dev/null +++ b/testdata/auth_zonemd_anchor_fail.rpl @@ -0,0 +1,235 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + ; correct anchor + ; trust-anchor: "example.com. DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af" + ; wrong anchor + trust-anchor: "example.com. DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deeaaaaa" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD from zonefile with failed trust anchor + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION ANSWER +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +SCENARIO_END From 3ab188ea218b49c7705264a354f00e3448962ddb Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 29 Oct 2020 08:40:22 +0100 Subject: [PATCH 49/66] zonemd, please doxygen zonemd, fix clang analyzer warning about null nsec3 salt pointer access. --- services/authzone.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 252d2884c..b5b50c92c 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7673,9 +7673,14 @@ static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo, if(!nsec3_get_params(&pk, i, &rralgo, &rriter, &rrsalt, &rrsaltlen)) continue; /* no parameters, malformed */ - if(rralgo != algo || rriter != iter || rrsaltlen != saltlen || - memcmp(rrsalt, salt, saltlen) != 0) + if(rralgo != algo || rriter != iter || rrsaltlen != saltlen) continue; /* different parameters */ + if(saltlen != 0) { + if(rrsalt == NULL || salt == NULL) + continue; + if(memcmp(rrsalt, salt, saltlen) != 0) + continue; /* different salt parameters */ + } if(nsec3_has_type(&pk, i, rrtype)) return 1; } @@ -7929,6 +7934,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, * thus apply straight to the zone DNSKEY set. * @param z: the auth zone. * @param env: environment with time and temp buffers. + * @param mods: module stack for validator environment for dnssec validation. * @param anchor: trust anchor to use * @param is_insecure: returned, true if the zone is securely insecure. * @param why_bogus: if the routine fails, returns the failure reason. From 43e32eae3393ddb9f6ef1fe5b5dd7c54ce6bacb6 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 29 Oct 2020 09:55:03 +0100 Subject: [PATCH 50/66] zonemd, unit test for zonemd from axfr with trust anchor. --- testdata/auth_zonemd_xfr_anchor.rpl | 284 ++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 testdata/auth_zonemd_xfr_anchor.rpl diff --git a/testdata/auth_zonemd_xfr_anchor.rpl b/testdata/auth_zonemd_xfr_anchor.rpl new file mode 100644 index 000000000..682d51b47 --- /dev/null +++ b/testdata/auth_zonemd_xfr_anchor.rpl @@ -0,0 +1,284 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "example.com. DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + master: 1.2.3.44 + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: yes + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with AXFR with ZONEMD with trust anchor + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN SOA +SECTION ANSWER +; serial, refresh, retry, expire, minimum +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +STEP 30 TIME_PASSES ELAPSE 10 +STEP 40 TRAFFIC + +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +; the zonefile was updated with new contents +STEP 70 CHECK_TEMPFILE example.com +FILE_BEGIN +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY ZONEMD +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN ZONEMD 200154054 1 2 58F7620F93204BBB31B44F795B3409CC4ABD9EF5601DECC15675BD7751213152984EDDCE0626E6062E744B03B3E47711202FBB79E4A2EB8BC5CF46741B5CAE6F +example.com. 3600 IN RRSIG ZONEMD 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +FILE_END + +SCENARIO_END From 2757e0ff51905a1976816b99c47729f455662ddc Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 29 Oct 2020 10:00:59 +0100 Subject: [PATCH 51/66] zonemd, unit test for failed zonemd hash after axfr, zone is rejected and not written to file. --- testdata/auth_zonemd_xfr_anchor_fail.rpl | 265 +++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 testdata/auth_zonemd_xfr_anchor_fail.rpl diff --git a/testdata/auth_zonemd_xfr_anchor_fail.rpl b/testdata/auth_zonemd_xfr_anchor_fail.rpl new file mode 100644 index 000000000..2b2849546 --- /dev/null +++ b/testdata/auth_zonemd_xfr_anchor_fail.rpl @@ -0,0 +1,265 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "example.com. DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + master: 1.2.3.44 + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: yes + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with AXFR with ZONEMD fail with trust anchor + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN SOA +SECTION ANSWER +; serial, refresh, retry, expire, minimum +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOTIMPL +SECTION QUESTION +example.com. IN IXFR +SECTION ANSWER +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +; this is the bad RR that causes the wrong zonemd. RRSIG is wrong too. +bar.example.com. 3600 IN A 1.2.3.55 +; orig RR +;bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +STEP 30 TIME_PASSES ELAPSE 10 +STEP 40 TRAFFIC + +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +; the zonefile was updated with new contents +STEP 70 CHECK_TEMPFILE example.com +FILE_BEGIN +FILE_END + +SCENARIO_END From cd3d54b504cf48471c3b9bdb8cec51da82b705c6 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 29 Oct 2020 10:13:01 +0100 Subject: [PATCH 52/66] zonemd, unit test for failed zonemd hash after axfr with chain of trust, zone is written after axfr, but before check. But zone is then rejected after check completes.. --- testdata/auth_zonemd_xfr_chain.rpl | 309 +++++++++++++++++++++++ testdata/auth_zonemd_xfr_chain_fail.rpl | 320 ++++++++++++++++++++++++ 2 files changed, 629 insertions(+) create mode 100644 testdata/auth_zonemd_xfr_chain.rpl create mode 100644 testdata/auth_zonemd_xfr_chain_fail.rpl diff --git a/testdata/auth_zonemd_xfr_chain.rpl b/testdata/auth_zonemd_xfr_chain.rpl new file mode 100644 index 000000000..9d1fdcf68 --- /dev/null +++ b/testdata/auth_zonemd_xfr_chain.rpl @@ -0,0 +1,309 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + master: 1.2.3.44 + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: yes + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with AXFR with ZONEMD with chain of trust + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION ANSWER +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN SOA +SECTION ANSWER +; serial, refresh, retry, expire, minimum +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +STEP 30 TIME_PASSES ELAPSE 10 +STEP 40 TRAFFIC + +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +; the zonefile was updated with new contents +STEP 70 CHECK_TEMPFILE example.com +FILE_BEGIN +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY ZONEMD +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN ZONEMD 200154054 1 2 58F7620F93204BBB31B44F795B3409CC4ABD9EF5601DECC15675BD7751213152984EDDCE0626E6062E744B03B3E47711202FBB79E4A2EB8BC5CF46741B5CAE6F +example.com. 3600 IN RRSIG ZONEMD 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +FILE_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_xfr_chain_fail.rpl b/testdata/auth_zonemd_xfr_chain_fail.rpl new file mode 100644 index 000000000..8b3ad74f0 --- /dev/null +++ b/testdata/auth_zonemd_xfr_chain_fail.rpl @@ -0,0 +1,320 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + master: 1.2.3.44 + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: yes + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with AXFR with ZONEMD failure with chain of trust + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION ANSWER +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN SOA +SECTION ANSWER +; serial, refresh, retry, expire, minimum +example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOTIMPL +SECTION QUESTION +example.com. IN IXFR +SECTION ANSWER +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN AXFR +SECTION ANSWER +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566 (zsk), size = 1024b} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN TYPE63 \# 70 0bee1bc6010258f7620f93204bbb31b44f795b3409cc4abd9ef5601decc15675bd7751213152984eddce0626e6062e744b03b3e47711202fbb79e4a2eb8bc5cf46741b5cae6f +example.com. 3600 IN RRSIG TYPE63 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY TYPE63 +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +; this is the bad RR that causes the wrong zonemd. RRSIG is wrong too. +bar.example.com. 3600 IN A 1.2.3.55 +; orig RR +;bar.example.com. 3600 IN A 1.2.3.4 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +STEP 30 TIME_PASSES ELAPSE 10 +STEP 40 TRAFFIC + +STEP 50 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 60 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR AA RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +; the zonefile was updated with new contents +STEP 70 CHECK_TEMPFILE example.com +FILE_BEGIN +example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. 3600 IN RRSIG SOA 8 2 3600 20201116135527 20201019135527 55566 example.com. gcFHT/Q4iDZ78CK6fyY2HZr8sRtgH2Rna9fEs06RW0gqMnfDntweoIaBamOZ7NlAP84aY2bZeanmEccmkHexByUpodCoKQ4NzVXctLr0TO4PVoFyfUfj62fjhM56SF8ioDxsoDQcPtYXcjNQjwfntWofMqHCMxrb9LzbgePzhOM= +example.com. 3600 IN NS ns.example.com. +example.com. 3600 IN RRSIG NS 8 2 3600 20201116135527 20201019135527 55566 example.com. X+V3XsbJbBi9OsHpjMkGCox8RLY/uXp/XX/O/flTrIre9fMDWm9ZGnewtuQFpLgGc6hUTi0eLsuRWRA5fZXEKUBhmoR2Ph01KgE1gvlL7v6zPWQwXVcBRUr3mOSbYdNNkHkXEjiDBGEhNkfqR216zNgw563eEGXOkLUFNIx5Zpg= +example.com. 3600 IN NSEC bar.example.com. NS SOA RRSIG NSEC DNSKEY ZONEMD +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 55566 example.com. ufLrlOQprAqjnH85Rt3T0Mxd3ZB0mBeeNIr84eFJ8Rk6WiWEPm0Y1R7GRufNI24Mj7iqLcL4nJM6KK6B7dJqjqu73jw1acuYNnbsoV2BNDRXRFP2FNWTpctVdi+955f3FzgsmEJXfGiSUG0YXAEcZmdCPCn5ii2jk8mk7r6KKYo= +example.com. 3600 IN DNSKEY 256 3 8 AwEAAdug/L739i0mgN2nuK/bhxu3wFn5Ud9nK2+XUmZQlPUEZUC5YZvm1rfMmEWTGBn87fFxEu/kjFZHJ55JLzqsbbpVHLbmKCTT2gYR2FV2WDKROGKuYbVkJIXdKAjJ0ONuK507NinYvlWXIoxHn22KAWOd9wKgSTNHBlmGkX+ts3hh ;{id = 55566} +example.com. 3600 IN RRSIG DNSKEY 8 2 3600 20201116135527 20201019135527 55566 example.com. fsdnVg38PKQTH2mDOwkXL6Jre7JP7Gf8WI3CvIbmeYQUJtAlpcSbZkS3wInm3kKMxOuT55BWzndQzpfmpo91OqJjG27W0k9301NMLUwFprA6b9HK+iPAT0JpYPDPzcm1bQdarLzLS+eD/GPwmyVSX7Gze+08VfE8m8sOW2r7UjA= +example.com. 3600 IN ZONEMD 200154054 1 2 58F7620F93204BBB31B44F795B3409CC4ABD9EF5601DECC15675BD7751213152984EDDCE0626E6062E744B03B3E47711202FBB79E4A2EB8BC5CF46741B5CAE6F +example.com. 3600 IN RRSIG ZONEMD 8 2 3600 20201116135527 20201019135527 55566 example.com. orn8ZF/yqj9u4WrhiO6gtEcTaVsnZSWWZLfXhcIOiWSB8kKCxtZl5cG17dD3Du1NllUwMRqkp0KleLhIoUS9xeQ/0x05u+CYLrfQ62oAiD7q54ZQzpXJIH52aQzKV70ZnO03CZowhQBnetmIoKX6xLogKo8pt+BdQbo3oVHxV8Y= +bar.example.com. 3600 IN A 1.2.3.55 +bar.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. NYhmRicF4C9+YxpWeQrepy4ALM1CM0USoDuGi3W5Xtp4/+YpCJfSIdR9vlJaJ2WayYuZrz9Ai2ci7oWwE1Fn3oywGwCKvGo9m0c3mC2eEtphE19wrop6pWu6um4RiFhmzYS1voraA3PAdYzze9U4NHzlk0+sb5vNZW9dSZS30Ds= +bar.example.com. 3600 IN NSEC ding.example.com. A RRSIG NSEC +bar.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. VhsGuBx20DXQZNU8ITAMnasn6NVyEjN9xtB8msH5xJn80UCuaqvFBURzcPWN3aHnykEvGfdPF/9P3WvlON0cMikWkqSLy6Q9bpvgAq13HWYh+ZcDoqLtICaB7RkBQc+6aHAqZFyQbD8/m8Kxt5eVJtV6rEuf+yPX0+3aXHhsRg0= +ding.example.com. 3600 IN A 1.2.3.4 +ding.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. OERsruISkpd1s68ute8Xm8YXisBCTkkiDMt34K+0dVqvySOJq63d3qN18BeUxZxLyHDB1eR3nZZKqEdkTqrv2r98skhWhjnOECpFbu5gKjtN/KPexbbJ+rxC0QqciuWOC7M6YE0cvI17/RB9KhVRy5rqY2X4Gt2wk2CNeD1dAko= +ding.example.com. 3600 IN NSEC foo.example.com. A RRSIG NSEC +ding.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. nb1W2aaKrU5iAQiY8gMsoMOejID19JMTEwY2rRoe+KsvzMs0rE0ifEkqit4blXaU0tfy0foJ70uqdJFqBoGz1NcSwZ6GNk/iNfGvG3XpxZ/zqEe7kkIucqqei794G7z9psqV94yZ3WaT+IswPpWrSaWv1w41RtcWufPhe4fOAmU= +foo.example.com. 3600 IN A 1.2.3.4 +foo.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. ZcUngb2pUejwnsshbJN/Dfr+Bzu8fcZXyqLArQ+10Bw1IPHyfx7yyUJ43V5tTYVHPSEsJzTnaWj+olVrNhVZxq5e0pgzSYPfGln2FEItEvMIOn33j8yKTpPW2MLyuFF5ZkXhosG20EUwRMvMmRHRz9mIZfwWoMbSGPukmLh8zMA= +foo.example.com. 3600 IN NSEC ns.example.com. A RRSIG NSEC +foo.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. fUZEpkEULRWDntN5Z7Kr8M83Hjhf08ECMKRpo6IBoBc3ayenj+YMgWAvFXC825wjENPYYWNGag0d32U83zCZxqgv+8uXZd3B7QDpTbL41aWZdc++s5YWTkYjyOWwJ1XHOv4nL3qEnJBXVzo/E1gbSKhTFuG97i+7J1MFd9MsC5s= +ns.example.com. 3600 IN A 127.0.0.1 +ns.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. SiuxuPtN/ITd+Z20j8UNUHJWbLHirE8zQOWMv5fAZ1rPKpAidrZgUL8J417GdrTwkueU2ywAJ7EzFJSwNTa7o/wUnq7svmOR6Ze6UQsKuZFZGEfqPNDRp4YuF86LU5jChuo+f/IRpydHrxVwGxDPCR9KarDM+ewfW+yI5bZeZcg= +ns.example.com. 3600 IN NSEC www.example.com. A RRSIG NSEC +ns.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. 0upKNYjiow4NDJm3I1RbUddE9GGuFYEVKswww5BAc/6WHuukupncL30lskvcSKGpByDssP2Hi2CufyEtYeGWh6q1TxtOFRqFBX1p6Q5b3tBlCtvv4h31dQR9uqLvq+GkGS5MR+0LO5kWagIpZmnI8YY5plVdXEtNbp2Ar8zvz/A= +www.example.com. 3600 IN A 127.0.0.1 +www.example.com. 3600 IN RRSIG A 8 3 3600 20201116135527 20201019135527 55566 example.com. AaIeICaPjV50TDrpbyOn94+hs8EYIMTmN4pYqj7e8GIGimqQIk5jgpwSx6SOoOF+uOqkf9GKHkQTn5YVGaeXwEQleg7mPTmMYKAOk06Y7MFUO1Vwt1Vt7Wo+Cpa3x2a1CmEkfFOi4WqP43VJnUtjjKmXoKRz3VUmqByyJYUAGbQ= +www.example.com. 3600 IN NSEC example.com. A RRSIG NSEC +www.example.com. 3600 IN RRSIG NSEC 8 3 3600 20201116135527 20201019135527 55566 example.com. meg/t6nIBqQZ0d5/dT7uu/3CuP4vE+HxqFQaj2fjUNceA/6C7QIQnqQ5Kyblg+XijDkQX0yvyFNHYdgF16UDgFT7tlNUCHk1SpF5BWzV4c4tBEhxASTz7UQo111O3Tyd6CldPzO/Se15Ud0/ZYltHEqWTfY5nJoXC/OJD9V2QOI= +FILE_END + +SCENARIO_END From e573f55dcd9ea74a991c6b86221fa77707598a28 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 29 Oct 2020 14:59:11 +0100 Subject: [PATCH 53/66] zonemd, unit tests for insecure delegation zones. --- testdata/auth_zonemd_insecure.rpl | 214 +++++++++++++++++ testdata/auth_zonemd_insecure_absent.rpl | 216 +++++++++++++++++ .../auth_zonemd_insecure_absent_reject.rpl | 217 ++++++++++++++++++ testdata/auth_zonemd_insecure_fail.rpl | 217 ++++++++++++++++++ testdata/auth_zonemd_nokey.rpl | 211 +++++++++++++++++ 5 files changed, 1075 insertions(+) create mode 100644 testdata/auth_zonemd_insecure.rpl create mode 100644 testdata/auth_zonemd_insecure_absent.rpl create mode 100644 testdata/auth_zonemd_insecure_absent_reject.rpl create mode 100644 testdata/auth_zonemd_insecure_fail.rpl create mode 100644 testdata/auth_zonemd_nokey.rpl diff --git a/testdata/auth_zonemd_insecure.rpl b/testdata/auth_zonemd_insecure.rpl new file mode 100644 index 000000000..b48992b4d --- /dev/null +++ b/testdata/auth_zonemd_insecure.rpl @@ -0,0 +1,214 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD that is securely insecure +; the trust anchor finds an online delegation with an insecure DS referral. + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION AUTHORITY +com. SOA a.gtld-servers.net. nstld.verisign-grs.com. 1603979208 1800 900 604800 86400 +com. 3600 IN RRSIG SOA 8 1 3600 20201116135527 20201019135527 1444 com. LTUZ8PlkMLX+dBZLGcJcahrzOgf1PgYbi/s5VKyR9iyYKeP6qdxO5VehUVHdXfmUiXrsszvhAHzo4AZnfRbDkK6uTfMKCSIB1aXOU4A74LpjhJBsXjyo3CN3IK/dMS/FpJfAb6JnuQV1E3ytDd34yNsoBazEjYeoN1kymGAttbM= +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_insecure_absent.rpl b/testdata/auth_zonemd_insecure_absent.rpl new file mode 100644 index 000000000..4706ccb0a --- /dev/null +++ b/testdata/auth_zonemd_insecure_absent.rpl @@ -0,0 +1,216 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +; the missing ZONEMD record +;example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with absent ZONEMD that is securely insecure +; the trust anchor finds an online delegation with an insecure DS referral. +; the ZONEMD is not there. + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION AUTHORITY +com. SOA a.gtld-servers.net. nstld.verisign-grs.com. 1603979208 1800 900 604800 86400 +com. 3600 IN RRSIG SOA 8 1 3600 20201116135527 20201019135527 1444 com. LTUZ8PlkMLX+dBZLGcJcahrzOgf1PgYbi/s5VKyR9iyYKeP6qdxO5VehUVHdXfmUiXrsszvhAHzo4AZnfRbDkK6uTfMKCSIB1aXOU4A74LpjhJBsXjyo3CN3IK/dMS/FpJfAb6JnuQV1E3ytDd34yNsoBazEjYeoN1kymGAttbM= +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 127.0.0.1 +ENTRY_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_insecure_absent_reject.rpl b/testdata/auth_zonemd_insecure_absent_reject.rpl new file mode 100644 index 000000000..79225c936 --- /dev/null +++ b/testdata/auth_zonemd_insecure_absent_reject.rpl @@ -0,0 +1,217 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + zonemd-reject-absence: yes + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +; the missing ZONEMD record +;example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with reject-absence ZONEMD that is securely insecure +; the trust anchor finds an online delegation with an insecure DS referral. +; the ZONEMD is not there. This is not allowed by the zonemd-reject-absence +; option in config, so it fails the zone. + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION AUTHORITY +com. SOA a.gtld-servers.net. nstld.verisign-grs.com. 1603979208 1800 900 604800 86400 +com. 3600 IN RRSIG SOA 8 1 3600 20201116135527 20201019135527 1444 com. LTUZ8PlkMLX+dBZLGcJcahrzOgf1PgYbi/s5VKyR9iyYKeP6qdxO5VehUVHdXfmUiXrsszvhAHzo4AZnfRbDkK6uTfMKCSIB1aXOU4A74LpjhJBsXjyo3CN3IK/dMS/FpJfAb6JnuQV1E3ytDd34yNsoBazEjYeoN1kymGAttbM= +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_insecure_fail.rpl b/testdata/auth_zonemd_insecure_fail.rpl new file mode 100644 index 000000000..03bbdd64c --- /dev/null +++ b/testdata/auth_zonemd_insecure_fail.rpl @@ -0,0 +1,217 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +; correct ZONEMD +;example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; wrong ZONEMD +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D7AAAAA +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD fail that is securely insecure +; the trust anchor finds an online delegation with an insecure DS referral. +; the ZONEMD is wrong, eg. the hash does not match the zone data. + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION AUTHORITY +com. SOA a.gtld-servers.net. nstld.verisign-grs.com. 1603979208 1800 900 604800 86400 +com. 3600 IN RRSIG SOA 8 1 3600 20201116135527 20201019135527 1444 com. LTUZ8PlkMLX+dBZLGcJcahrzOgf1PgYbi/s5VKyR9iyYKeP6qdxO5VehUVHdXfmUiXrsszvhAHzo4AZnfRbDkK6uTfMKCSIB1aXOU4A74LpjhJBsXjyo3CN3IK/dMS/FpJfAb6JnuQV1E3ytDd34yNsoBazEjYeoN1kymGAttbM= +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. IN NSEC foo.com. NS RRSIG +example.com. 3600 IN RRSIG NSEC 8 2 3600 20201116135527 20201019135527 1444 com. KK6ci3DUnGJ9gaBBqS+71TiFBGcl51YLZAYGADDWuSgFOLLbh1nV//la08zE1i8ITQjjsqyRw7/MA8LWpPR3TnUjJLk6mBd/kB3dJ8BHWRqcyreFo6Pu383oCcXTpwkFcL4ulhp54LUxbA3arWVjWbx8815vvNKsEtWUyrz4LN8= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +SCENARIO_END diff --git a/testdata/auth_zonemd_nokey.rpl b/testdata/auth_zonemd_nokey.rpl new file mode 100644 index 000000000..57609337e --- /dev/null +++ b/testdata/auth_zonemd_nokey.rpl @@ -0,0 +1,211 @@ +; config options +server: + target-fetch-policy: "0 0 0 0 0" + trust-anchor: "com. DS 1444 8 2 0d72034e3e18a9ef383c164b68302433bbde957616e10cf44575fea2abae469c" + trust-anchor-signaling: no + val-override-date: 20201020135527 + +auth-zone: + name: "example.com." + ## zonefile (or none). + ## zonefile: "example.com.zone" + ## master by IP address or hostname + ## can list multiple masters, each on one line. + ## master: + ## url for http fetch + ## url: + ## queries from downstream clients get authoritative answers. + ## for-downstream: yes + for-downstream: no + ## queries are used to fetch authoritative answers from this zone, + ## instead of unbound itself sending queries there. + ## for-upstream: yes + for-upstream: yes + ## on failures with for-upstream, fallback to sending queries to + ## the authority servers + ## fallback-enabled: no + + ## this line generates zonefile: \n"/tmp/xxx.example.com"\n + zonefile: +TEMPFILE_NAME example.com + ## this is the inline file /tmp/xxx.example.com + ## the tempfiles are deleted when the testrun is over. +TEMPFILE_CONTENTS example.com +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 +TEMPFILE_END + +stub-zone: + name: "." + stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET. +CONFIG_END + +SCENARIO_BEGIN Test authority zone with ZONEMD that lacks a DNSKEY +; the zone has no DNSSEC, but the trust anchor requires it. + +; K.ROOT-SERVERS.NET. +RANGE_BEGIN 0 100 + ADDRESS 193.0.14.129 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +. IN NS +SECTION ANSWER +. IN NS K.ROOT-SERVERS.NET. +SECTION ADDITIONAL +K.ROOT-SERVERS.NET. IN A 193.0.14.129 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION AUTHORITY +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END +RANGE_END + +; a.gtld-servers.net. +RANGE_BEGIN 0 100 + ADDRESS 192.5.6.30 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +com. IN NS +SECTION ANSWER +com. IN NS a.gtld-servers.net. +SECTION ADDITIONAL +a.gtld-servers.net. IN A 192.5.6.30 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qname qtype +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +example.com. IN DS +SECTION ANSWER +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +ENTRY_END + +ENTRY_BEGIN +MATCH opcode subdomain +ADJUST copy_id copy_query +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION AUTHORITY +example.com. IN NS ns.example.com. +example.com. 3600 IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af +example.com. 3600 IN RRSIG DS 8 2 3600 20201116135527 20201019135527 1444 com. BpV1M171SSkbdlGawwweJwQ0W+aNaCrgkt2QTsxCvbo1acR5i3AKm4REOUzo4I36lRx26mYkF9Topkeu0aFmov7P2uUhCxk4faFK7k87k97FAqZaDGp/K9b3YCfiwJBc5pJSUW0ndU/Ve5zAh/wL493RMSC7LwJr5JjV0NxydFk= +SECTION ADDITIONAL +ns.example.com. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR AA NOERROR +SECTION QUESTION +com. IN DNSKEY +SECTION ANSWER +com. 3600 IN DNSKEY 257 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1444 (ksk), size = 1024b} +com. 3600 IN RRSIG DNSKEY 8 1 3600 20201116135527 20201019135527 1444 com. BEOMfWvi6RgnHaHsst+Ed265hBuCkgMR7gDpu89J7ZrVL6DzMKnNVFdgjl/9xwLj/pkukc7qeLSHjAfLlN0E4THW7PVshscQnjvXCkktG2Ejx9fTyllAqeGDh9z9QDGlQZIGTMgb9413qZhNqe2Tda9PTJRpiZ8b4bdQp6V1kVo= +SECTION ADDITIONAL +ENTRY_END + +RANGE_END + +; ns.example.net. +RANGE_BEGIN 0 100 + ADDRESS 1.2.3.44 +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.net. IN NS +SECTION ANSWER +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +ns.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN A +SECTION ANSWER +ns.example.net. IN A 1.2.3.44 +SECTION AUTHORITY +example.net. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +ns.example.net. IN AAAA +SECTION AUTHORITY +example.net. IN NS ns.example.net. +SECTION ADDITIONAL +www.example.net. IN A 1.2.3.44 +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +example.com. IN NS +SECTION ANSWER +example.com. IN NS ns.example.net. +ENTRY_END + +ENTRY_BEGIN +MATCH opcode qtype qname +ADJUST copy_id +REPLY QR NOERROR +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +www.example.com. IN A 10.20.30.40 +ENTRY_END +RANGE_END + +STEP 1 QUERY +ENTRY_BEGIN +REPLY RD +SECTION QUESTION +www.example.com. IN A +ENTRY_END + +; recursion happens here. +STEP 20 CHECK_ANSWER +ENTRY_BEGIN +MATCH all +REPLY QR RD RA SERVFAIL +SECTION QUESTION +www.example.com. IN A +SECTION ANSWER +ENTRY_END + +SCENARIO_END From 20ff80c5bb9e92901a53c666894e82842e97e514 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 22 Jan 2021 14:36:53 +0100 Subject: [PATCH 54/66] zonemd, fix to detect duplicate zonemd scheme and algo RRs. --- services/authzone.c | 48 +++++++++++++++++++++++++++++++++- testcode/unitzonemd.c | 7 +++++ testdata/zonemd.example16.zone | 11 ++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 testdata/zonemd.example16.zone diff --git a/services/authzone.c b/services/authzone.c index b5b50c92c..4c31452a6 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1823,6 +1823,43 @@ static int zonemd_fetch_parameters(struct auth_rrset* zonemd_rrset, size_t i, return 1; } +/** + * See if the ZONEMD scheme, hash occurs more than once. + * @param zonemd_rrset: the zonemd rrset to check with the RRs in it. + * @param index: index of the original, this is allowed to have that + * scheme and hashalgo, but other RRs should not have it. + * @param scheme: the scheme to check for. + * @param hashalgo: the hash algorithm to check for. + * @return true if it occurs more than once. + */ +static int zonemd_is_duplicate_scheme_hash(struct auth_rrset* zonemd_rrset, + size_t index, int scheme, int hashalgo) +{ + size_t j; + for(j=0; jdata->count; j++) { + uint32_t serial2 = 0; + int scheme2 = 0, hashalgo2 = 0; + uint8_t* hash2 = NULL; + size_t hashlen2 = 0; + if(index == j) { + /* this is the original */ + continue; + } + if(!zonemd_fetch_parameters(zonemd_rrset, j, &serial2, + &scheme2, &hashalgo2, &hash2, &hashlen2)) { + /* malformed, skip it */ + continue; + } + if(scheme == scheme2 && hashalgo == hashalgo2) { + /* duplicate scheme, hash */ + verbose(VERB_ALGO, "zonemd duplicate for scheme %d " + "and hash %d", scheme, hashalgo); + return 1; + } + } + return 0; +} + /** * Check ZONEMDs if present for the auth zone. Depending on config * it can warn or fail on that. Checks the hash of the ZONEMD. @@ -1875,6 +1912,15 @@ static int auth_zone_zonemd_check_hash(struct auth_zone* z, *reason = "ZONEMD rdata malformed"; continue; } + /* check for duplicates */ + if(zonemd_is_duplicate_scheme_hash(zonemd_rrset, i, scheme, + hashalgo)) { + /* duplicate hash of the same scheme,hash + * is not allowed. */ + *reason = "ZONEMD RRSet contains more than one RR " + "with the same scheme and hash algorithm"; + continue; + } regional_free_all(region); if(serial != soa_serial) { *reason = "ZONEMD serial is wrong"; @@ -7381,7 +7427,7 @@ static void add_rrlist_rrsigs_into_data(struct packed_rrset_data* data, data->rr_len[*done] = rrlist[i]->data->rr_len[rrlist[i]->data->count + j]; data->rr_ttl[*done] = rrlist[i]->data->rr_ttl[rrlist[i]->data->count + j]; /* reference the rdata in the rrset, no need to - * copy it, it is no longer need at the end of + * copy it, it is no longer needed at the end of * the routine */ data->rr_data[*done] = rrlist[i]->data->rr_data[rrlist[i]->data->count + j]; (*done)++; diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 82ab9076d..07f97c316 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -467,6 +467,13 @@ static void zonemd_verify_tests(void) /* okay date: "20201020135527", */ "20221020135527", "verify DNSKEY RRset with trust anchor failed: signature expired"); + + /* duplicate zonemd with same scheme and algorithm */ + zonemd_verify_test("example.com", + "testdata/zonemd.example16.zone", + NULL, + "20180302005009", + "ZONEMD RRSet contains more than one RR with the same scheme and hash algorithm"); } /** zonemd unit tests */ diff --git a/testdata/zonemd.example16.zone b/testdata/zonemd.example16.zone new file mode 100644 index 000000000..7520744d3 --- /dev/null +++ b/testdata/zonemd.example16.zone @@ -0,0 +1,11 @@ +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +example.com. IN NS ns.example.com. +; the ZONEMD that should be in this file, without DNSSEC +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; duplicate zonemd with same scheme and algorithm (different at end) +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D720000 +www.example.com. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 From dedc1e23401d0220e37073b0a08aa48bfe470910 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 22 Jan 2021 14:40:21 +0100 Subject: [PATCH 55/66] zonemd, unit test for capitalisation of owner and ns names. --- testcode/unitzonemd.c | 7 +++++++ testdata/zonemd.example17.zone | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 testdata/zonemd.example17.zone diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 07f97c316..544d032f2 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -474,6 +474,13 @@ static void zonemd_verify_tests(void) NULL, "20180302005009", "ZONEMD RRSet contains more than one RR with the same scheme and hash algorithm"); + /* different capitalisation of ns name and owner names, should + * be canonicalized. */ + zonemd_verify_test("example.com", + "testdata/zonemd.example17.zone", + NULL, + "20180302005009", + "ZONEMD verification successful"); } /** zonemd unit tests */ diff --git a/testdata/zonemd.example17.zone b/testdata/zonemd.example17.zone new file mode 100644 index 000000000..4315f9054 --- /dev/null +++ b/testdata/zonemd.example17.zone @@ -0,0 +1,11 @@ +example.com. IN SOA ns.example.com. hostmaster.example.com. 200154054 28800 7200 604800 3600 +; capitalisation is different here. +exaMPLe.cOM. IN NS Ns.exaMPLe.cOm. +; the ZONEMD that should be in this file, without DNSSEC +example.com. IN ZONEMD 200154054 1 2 EFAA5B78B38AB1C45DE57B8167BCCE906451D0E72118E1F5E80B5F0C3CF04BFFC65D53C011185528EAD439D6F3A02F511961E090E5E4E0DFA013BD276D728B22 +; capitalisation is different here. +wWW.exAMPLe.cOM. IN A 127.0.0.1 +ns.example.com. IN A 127.0.0.1 +bar.example.com. IN A 1.2.3.4 +ding.example.com. IN A 1.2.3.4 +foo.example.com. IN A 1.2.3.4 From d3b5f287b171cdb692948d57c8d0e07c943a9caf Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 4 Feb 2021 16:18:02 +0100 Subject: [PATCH 56/66] zonemd, fix unit test to allow nonvalidating zone without zonemd with permissive mode for zonemd. --- testdata/auth_zonefile_down.rpl | 1 + 1 file changed, 1 insertion(+) diff --git a/testdata/auth_zonefile_down.rpl b/testdata/auth_zonefile_down.rpl index 9c5ecbb1c..870ba9401 100644 --- a/testdata/auth_zonefile_down.rpl +++ b/testdata/auth_zonefile_down.rpl @@ -7,6 +7,7 @@ server: qname-minimisation: "no" trust-anchor-signaling: no aggressive-nsec: yes + zonemd-permissive-mode: yes auth-zone: name: "example.com." From 3d2692d6bc6d0c31183aabea7861c72e6ef5c06a Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 10 Feb 2021 15:30:23 +0100 Subject: [PATCH 57/66] zonemd, review comments, add comments to unit test, scope verbose output. --- services/authzone.c | 9 ++++++--- testcode/unitzonemd.c | 10 +++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 6ddf524f8..0495958d3 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -1879,7 +1879,6 @@ static int auth_zone_zonemd_check_hash(struct auth_zone* z, size_t i; struct regional* region = NULL; struct sldns_buffer* buf = NULL; - char zstr[255+1]; uint32_t soa_serial = 0; region = env->scratch; regional_free_all(region); @@ -1930,6 +1929,7 @@ static int auth_zone_zonemd_check_hash(struct auth_zone* z, hash, hashlen, region, buf, reason)) { /* success */ if(verbosity >= VERB_ALGO) { + char zstr[255+1]; dname_str(z->name, zstr); verbose(VERB_ALGO, "auth-zone %s ZONEMD hash is correct", zstr); } @@ -1940,8 +1940,11 @@ static int auth_zone_zonemd_check_hash(struct auth_zone* z, /* fail, we may have reason */ if(!*reason) *reason = "no ZONEMD records found"; - dname_str(z->name, zstr); - verbose(VERB_ALGO, "auth-zone %s ZONEMD failed: %s", zstr, *reason); + if(verbosity >= VERB_ALGO) { + char zstr[255+1]; + dname_str(z->name, zstr); + verbose(VERB_ALGO, "auth-zone %s ZONEMD failed: %s", zstr, *reason); + } return 0; } diff --git a/testcode/unitzonemd.c b/testcode/unitzonemd.c index 544d032f2..a8949a8c4 100644 --- a/testcode/unitzonemd.c +++ b/testcode/unitzonemd.c @@ -332,17 +332,19 @@ static void zonemd_verify_test(char* zname, char* zfile, char* tastr, static void zonemd_verify_tests(void) { unit_show_func("services/authzone.c", "auth_zone_verify_zonemd"); + /* give trustanchor for unsigned zone, should fail */ zonemd_verify_test("example.org", "testdata/zonemd.example1.zone", "example.org. IN DS 55566 8 2 9c148338951ce1c3b5cd3da532f3d90dfcf92595148022f2c2fd98e5deee90af", "20180302005009", "verify DNSKEY RRset with trust anchor failed: have trust anchor, but zone has no DNSKEY"); + /* unsigned zone without ZONEMD in it */ zonemd_verify_test("example.org", "testdata/zonemd.example1.zone", NULL, "20180302005009", "no ZONEMD present"); - /* no trust anchor, so it succeeds */ + /* no trust anchor, so it succeeds for zone with a correct ZONEMD */ zonemd_verify_test("example.com", "testdata/zonemd.example2.zone", NULL, @@ -356,18 +358,24 @@ static void zonemd_verify_tests(void) "ZONEMD verification successful"); /* load a DNSSEC signed zone, but no trust anchor */ + /* this zonefile has an incorrect ZONEMD digest, with correct + * DNSSEC signature. */ zonemd_verify_test("example.com", "testdata/zonemd.example3.zone", NULL, "20180302005009", "incorrect digest"); /* load a DNSSEC zone with NSEC3, but no trust anchor */ + /* this zonefile has an incorrect ZONEMD digest, with correct + * DNSSEC signature. */ zonemd_verify_test("example.com", "testdata/zonemd.example4.zone", NULL, "20180302005009", "incorrect digest"); /* valid zonemd, in dnssec signed zone, no trust anchor*/ + /* this zonefile has a correct ZONEMD digest and + * correct DNSSEC signature */ zonemd_verify_test("example.com", "testdata/zonemd.example5.zone", NULL, From 12171e3124a75de104e72b50cbd69fb86dc39ea5 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 10 Feb 2021 16:34:24 +0100 Subject: [PATCH 58/66] zonemd, review comments, compare list size correctly. --- services/authzone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/authzone.c b/services/authzone.c index 0495958d3..79fc89929 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7299,7 +7299,7 @@ static size_t authdata_rrsets_to_list(struct auth_rrset** array, struct auth_rrset* rrset = first; size_t num = 0; while(rrset) { - if(num+1 >= arraysize) + if(num >= arraysize) return num; array[num] = rrset; num++; From 9a972aa5b235928ad9186b673fd9632487db4077 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Wed, 10 Feb 2021 16:38:39 +0100 Subject: [PATCH 59/66] zonemd, review comments, compare list size for rrsigtype add. --- services/authzone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/authzone.c b/services/authzone.c index 79fc89929..71d9d2913 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7332,7 +7332,7 @@ static void addrrsigtype_if_needed(struct auth_rrset** array, { if(az_domain_rrset(node, LDNS_RR_TYPE_RRSIG)) return; /* already one there */ - if((*rrnum)+1 >= arraysize) + if((*rrnum) >= arraysize) return; /* array too small? */ array[*rrnum] = NULL; /* nothing there, but need entry in list */ (*rrnum)++; From d3b6e1679ce136eb0c8161806c414c9a0d1d3192 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 11 Feb 2021 16:05:28 +0100 Subject: [PATCH 60/66] zonemd, review comments, indentation. --- services/authzone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/authzone.c b/services/authzone.c index 71d9d2913..431df3931 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7576,7 +7576,7 @@ static int zonemd_simple_collate(struct auth_zone* z, int hashalgo, } int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme, - int hashalgo, uint8_t* hash, size_t hashlen, size_t* resultlen, + int hashalgo, uint8_t* hash, size_t hashlen, size_t* resultlen, struct regional* region, struct sldns_buffer* buf, char** reason) { struct secalgo_hash* h = zonemd_digest_init(hashalgo, reason); From e0f17c2443dc2870187ee1bb42ddfb538b26c982 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 11 Feb 2021 17:27:59 +0100 Subject: [PATCH 61/66] zonemd, review comments, stop callback for a deleted zone. --- services/authzone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/authzone.c b/services/authzone.c index 431df3931..a537bf9f0 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -8070,7 +8070,7 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, /* release the env variable so another worker can pick up the * ZONEMD verification task if it wants to */ z->zonemd_callback_env = NULL; - if(!env || env->outnet->want_to_quit) { + if(!env || env->outnet->want_to_quit || z->zone_deleted) { lock_rw_unlock(&z->lock); return; /* stop on quit */ } From 6965cef5e87edda785d4fd5b567efe0bcc655d8f Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 11 Feb 2021 17:33:10 +0100 Subject: [PATCH 62/66] zonemd, review comments, check qname for zonemd dnskey lookup. --- services/authzone.c | 1 + 1 file changed, 1 insertion(+) diff --git a/services/authzone.c b/services/authzone.c index a537bf9f0..196c4653c 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -8090,6 +8090,7 @@ void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf, memset(&rq, 0, sizeof(rq)); rep = parse_reply_in_temp_region(buf, temp, &rq); if(rep && rq.qtype == wanted_qtype && + query_dname_compare(z->name, rq.qname) == 0 && FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR) { /* parsed successfully */ struct ub_packed_rrset_key* answer = From 849050855968a0199f4a65c0ec6345f34f00fc1b Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 12 Feb 2021 08:33:03 +0100 Subject: [PATCH 63/66] zonemd, review comments, stop null dnskey, skip dnssec for insecure islands. --- services/authzone.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/services/authzone.c b/services/authzone.c index 196c4653c..60a05d4bb 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -7923,14 +7923,15 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, } } - /* if no ZONEMD, and no DNSSEC, done. */ + /* if no DNSSEC, done. */ /* if no ZONEMD, and DNSSEC, use DNSKEY to verify NSEC or NSEC3 for * zone apex. Check ZONEMD bit is turned off or else fail */ /* if ZONEMD, and DNSSEC, check DNSSEC signature on SOA and ZONEMD, * or else fail */ - if(!zonemd_rrset && is_insecure) { - /* success, zonemd is absent */ - } else if(!zonemd_rrset) { + if(!dnskey && !is_insecure) { + auth_zone_zonemd_fail(z, env, "DNSKEY missing", NULL, result); + return; + } else if(!zonemd_rrset && dnskey && !is_insecure) { /* fetch, DNSSEC verify, and check NSEC/NSEC3 */ if(!zonemd_check_dnssec_absence(z, env, mods, dnskey, apex, &reason, &why_bogus)) { @@ -7938,7 +7939,7 @@ auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env, return; } zonemd_absence_dnssecok = 1; - } else if(zonemd_rrset && dnskey) { + } else if(zonemd_rrset && dnskey && !is_insecure) { /* check DNSSEC verify of SOA and ZONEMD */ if(!zonemd_check_dnssec_soazonemd(z, env, mods, dnskey, apex, zonemd_rrset, &reason, &why_bogus)) { From b7ffa6618c90037bbd5b8ef1f58e13cda454b0b1 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 12 Feb 2021 09:16:22 +0100 Subject: [PATCH 64/66] zonemd, review comments, fix no anchor lookup if none. --- services/authzone.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/authzone.c b/services/authzone.c index 60a05d4bb..9818ab344 100644 --- a/services/authzone.c +++ b/services/authzone.c @@ -8214,7 +8214,9 @@ void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env, /* else, find chain of trust by fetching DNSKEYs lookup for zone */ /* result if that, if insecure, means no DNSSEC for the ZONEMD, * otherwise we have the zone DNSKEY for the DNSSEC verification. */ - anchor = anchors_lookup(env->anchors, z->name, z->namelen, z->dclass); + if(env->anchors) + anchor = anchors_lookup(env->anchors, z->name, z->namelen, + z->dclass); if(anchor && query_dname_compare(z->name, anchor->name) == 0) { if(only_online) { lock_basic_unlock(&anchor->lock); From 48e0d3356a6908dec29f1aa2990bfa48b76b1f94 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Fri, 12 Feb 2021 10:48:38 +0100 Subject: [PATCH 65/66] zonemd, review comments, spelling fix. --- services/authzone.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/authzone.h b/services/authzone.h index b162b4ef5..4810017a3 100644 --- a/services/authzone.h +++ b/services/authzone.h @@ -139,7 +139,7 @@ struct auth_zone { /** store the env (worker thread specific) for the zonemd callbacks * from the mesh with the results of the lookup, if nonNULL, some * worker has already picked up the zonemd verification task and - * this worked does not have to do it as well. */ + * this worker does not have to do it as well. */ struct module_env* zonemd_callback_env; /** zone has been deleted */ int zone_deleted; From d6e55a586cb877929964e8e8ff88bf752086fd02 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Thu, 18 Feb 2021 11:16:19 +0100 Subject: [PATCH 66/66] Changelog note for #317 - Merge PR #317: ZONEMD Zone Verification, with RFC 8976 support. ZONEMD records are checked for zones loaded as auth-zone, with DNSSEC if available. There is an added option zonemd-permissive-mode that makes it log but not fail wrong zones. With zonemd-reject-absence for an auth-zone the presence of a zonemd can be mandated for specific zones. --- doc/Changelog | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/Changelog b/doc/Changelog index f855e5a9a..8dd41fade 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,11 @@ +18 February 2021: Wouter + - Merge PR #317: ZONEMD Zone Verification, with RFC 8976 support. + ZONEMD records are checked for zones loaded as auth-zone, + with DNSSEC if available. There is an added option + zonemd-permissive-mode that makes it log but not fail wrong zones. + With zonemd-reject-absence for an auth-zone the presence of a + zonemd can be mandated for specific zones. + 15 February 2021: Wouter - Fix #422: IPv6 fallback issues when IPv6 is not properly enabled/configured.