]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Serve stale (#159)
authorgthess <george@nlnetlabs.nl>
Wed, 5 Feb 2020 13:20:27 +0000 (14:20 +0100)
committerGitHub <noreply@github.com>
Wed, 5 Feb 2020 13:20:27 +0000 (14:20 +0100)
- Added serve-stale functionality as described in
  draft-ietf-dnsop-serve-stale-10. `serve-expired-*` options can be used
  to configure the behavior.
- Updated cachedb to honor `serve-expired-ttl`; Fixes #107.
- Renamed statistic `num.zero_ttl` to `num.expired` as expired replies
  come with a configurable TTL value (`serve-expired-reply-ttl`).
- Fixed stats when replying with cached, cname-aliased records.
- Added missing default values for redis cachedb backend.

38 files changed:
cachedb/cachedb.c
daemon/remote.c
daemon/stats.c
daemon/worker.c
doc/Changelog
doc/example.conf.in
doc/unbound-control.8.in
doc/unbound.conf.5.in
edns-subnet/subnetmod.c
libunbound/libworker.c
libunbound/unbound.h
services/cache/dns.c
services/cache/dns.h
services/mesh.c
services/mesh.h
smallapp/unbound-control.c
testcode/replay.h
testdata/serve_expired.rpl [new file with mode: 0644]
testdata/serve_expired_client_timeout.rpl [new file with mode: 0644]
testdata/serve_expired_reply_ttl.rpl [new file with mode: 0644]
testdata/serve_expired_servfail.rpl [new file with mode: 0644]
testdata/serve_expired_ttl.rpl [new file with mode: 0644]
testdata/serve_expired_ttl_client_timeout.rpl [new file with mode: 0644]
testdata/serve_expired_zerottl.rpl [new file with mode: 0644]
util/config_file.c
util/config_file.h
util/configlexer.c
util/configlexer.lex
util/configparser.c
util/configparser.h
util/configparser.y
util/data/msgencode.c
util/data/msgparse.h
util/data/msgreply.c
util/data/packed_rrset.c
util/fptr_wlist.c
util/fptr_wlist.h
util/module.h

index d5ea9e3f68d09e5015286c4649f41af12bc49118..c5be516225f90c81daf6da05da1c1d895efa0c58 100644 (file)
@@ -218,10 +218,6 @@ static int
 cachedb_apply_cfg(struct cachedb_env* cachedb_env, struct config_file* cfg)
 {
        const char* backend_str = cfg->cachedb_backend;
-
-       /* If unspecified we use the in-memory test DB. */
-       if(!backend_str)
-               backend_str = "testframe";
        cachedb_env->backend = cachedb_find_backend(backend_str);
        if(!cachedb_env->backend) {
                log_err("cachedb: cannot find backend name '%s'", backend_str);
@@ -259,6 +255,15 @@ cachedb_init(struct module_env* env, int id)
                return 0;
        }
        cachedb_env->enabled = 1;
+       if(env->cfg->serve_expired_reply_ttl)
+               log_warn(
+                       "cachedb: serve-expired-reply-ttl is set but not working for data "
+                       "originating from the external cache; 0 TLL is used for those.");
+       if(env->cfg->serve_expired_client_timeout)
+               log_warn(
+                       "cachedb: serve-expired-client-timeout is set but not working for "
+                       "data originating from the external cache; expired data are used "
+                       "in the reply without first trying to refresh the data.");
        return 1;
 }
 
@@ -329,8 +334,7 @@ calc_hash(struct module_qstate* qstate, char* buf, size_t len)
        size_t clen = 0;
        uint8_t hash[CACHEDB_HASHSIZE/8];
        const char* hex = "0123456789ABCDEF";
-       const char* secret = qstate->env->cfg->cachedb_secret ?
-               qstate->env->cfg->cachedb_secret : "default";
+       const char* secret = qstate->env->cfg->cachedb_secret;
        size_t i;
 
        /* copy the hash info into the clear buffer */
@@ -433,8 +437,14 @@ good_expiry_and_qinfo(struct module_qstate* qstate, struct sldns_buffer* buf)
                &expiry, sizeof(expiry));
        expiry = be64toh(expiry);
 
+       /* Check if we are allowed to return expired entries:
+        * - serve_expired needs to be set
+        * - if SERVE_EXPIRED_TTL is set make sure that the record is not older
+        *   than that. */
        if((time_t)expiry < *qstate->env->now &&
-               !qstate->env->cfg->serve_expired)
+               (!qstate->env->cfg->serve_expired ||
+                       (SERVE_EXPIRED_TTL &&
+                       *qstate->env->now - (time_t)expiry > SERVE_EXPIRED_TTL)))
                return 0;
 
        return 1;
@@ -445,15 +455,15 @@ good_expiry_and_qinfo(struct module_qstate* qstate, struct sldns_buffer* buf)
 static void
 packed_rrset_ttl_subtract(struct packed_rrset_data* data, time_t subtract)
 {
-        size_t i;
-        size_t total = data->count + data->rrsig_count;
+       size_t i;
+       size_t total = data->count + data->rrsig_count;
        if(subtract >= 0 && data->ttl > subtract)
                data->ttl -= subtract;
        else    data->ttl = 0;
-        for(i=0; i<total; i++) {
+       for(i=0; i<total; i++) {
                if(subtract >= 0 && data->rr_ttl[i] > subtract)
-                       data->rr_ttl[i] -= subtract;
-                else   data->rr_ttl[i] = 0;
+                       data->rr_ttl[i] -= subtract;
+               else    data->rr_ttl[i] = 0;
        }
 }
 
@@ -465,7 +475,8 @@ adjust_msg_ttl(struct dns_msg* msg, time_t adjust)
        size_t i;
        if(adjust >= 0 && msg->rep->ttl > adjust)
                msg->rep->ttl -= adjust;
-       else    msg->rep->ttl = 0;
+       else
+               msg->rep->ttl = 0;
        msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
        msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
 
@@ -673,7 +684,8 @@ cachedb_handle_query(struct module_qstate* qstate,
                return;
        }
 
-       /* lookup inside unbound's internal cache */
+       /* lookup inside unbound's internal cache.
+        * This does not look for expired entries. */
        if(cachedb_intcache_lookup(qstate)) {
                if(verbosity >= VERB_ALGO) {
                        if(qstate->return_msg->rep)
@@ -681,8 +693,9 @@ cachedb_handle_query(struct module_qstate* qstate,
                                        &qstate->return_msg->qinfo,
                                        qstate->return_msg->rep);
                        else log_info("cachedb internal cache lookup: rcode %s",
-                               sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)?
-                               sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)->name:"??");
+                               sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)
+                               ?sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)->name
+                               :"??");
                }
                /* we are done with the query */
                qstate->ext_state[id] = module_finished;
@@ -697,6 +710,19 @@ cachedb_handle_query(struct module_qstate* qstate,
                                qstate->return_msg->rep);
                /* store this result in internal cache */
                cachedb_intcache_store(qstate);
+               /* In case we have expired data but there is a client timer for expired
+                * answers, pass execution to next module in order to try updating the
+                * data first.
+                * TODO: this needs revisit. The expired data stored from cachedb has
+                * 0 TTL which is picked up by iterator later when looking in the cache.
+                * Document that ext cachedb does not work properly with
+                * serve_stale_reply_ttl yet. */
+               if(qstate->need_refetch && qstate->serve_expired_data &&
+                       qstate->serve_expired_data->timer) {
+                               qstate->return_msg = NULL;
+                               qstate->ext_state[id] = module_wait_module;
+                               return;
+               }
                /* we are done with the query */
                qstate->ext_state[id] = module_finished;
                return;
index 45083f214307b3f6723bc368afe4cdb84e8ce0bd..1782a39cad7c5901c0c1a23e0dba09a0c275cb5c 100644 (file)
@@ -720,8 +720,8 @@ print_stats(RES* ssl, const char* nm, struct ub_stats_info* s)
                (unsigned long)s->svr.num_queries_missed_cache)) return 0;
        if(!ssl_printf(ssl, "%s.num.prefetch"SQ"%lu\n", nm, 
                (unsigned long)s->svr.num_queries_prefetch)) return 0;
-       if(!ssl_printf(ssl, "%s.num.zero_ttl"SQ"%lu\n", nm,
-               (unsigned long)s->svr.zero_ttl_responses)) return 0;
+       if(!ssl_printf(ssl, "%s.num.expired"SQ"%lu\n", nm,
+               (unsigned long)s->svr.ans_expired)) return 0;
        if(!ssl_printf(ssl, "%s.num.recursivereplies"SQ"%lu\n", nm, 
                (unsigned long)s->mesh_replies_sent)) return 0;
 #ifdef USE_DNSCRYPT
index 93a85c6186f61de7170c06f142c630b5cc922334..a568ba070a57313a4b022a8d3480f1ace27c81d7 100644 (file)
@@ -400,6 +400,7 @@ void server_stats_add(struct ub_stats_info* total, struct ub_stats_info* a)
        total->svr.num_queries_missed_cache += a->svr.num_queries_missed_cache;
        total->svr.num_queries_prefetch += a->svr.num_queries_prefetch;
        total->svr.sum_query_list_size += a->svr.sum_query_list_size;
+       total->svr.ans_expired += a->svr.ans_expired;
 #ifdef USE_DNSCRYPT
        total->svr.num_query_dnscrypt_crypted += a->svr.num_query_dnscrypt_crypted;
        total->svr.num_query_dnscrypt_cert += a->svr.num_query_dnscrypt_cert;
@@ -432,7 +433,6 @@ void server_stats_add(struct ub_stats_info* total, struct ub_stats_info* a)
                total->svr.qEDNS += a->svr.qEDNS;
                total->svr.qEDNS_DO += a->svr.qEDNS_DO;
                total->svr.ans_rcode_nodata += a->svr.ans_rcode_nodata;
-               total->svr.zero_ttl_responses += a->svr.zero_ttl_responses;
                total->svr.ans_secure += a->svr.ans_secure;
                total->svr.ans_bogus += a->svr.ans_bogus;
                total->svr.unwanted_replies += a->svr.unwanted_replies;
index c41cc5f8509b71d6c3442ceb1c295dc4d53404c2..eb7fdf2f576dfc924776df00919e12bad036d6ca 100644 (file)
@@ -625,10 +625,10 @@ apply_respip_action(struct worker* worker, const struct query_info* qinfo,
  * be completely dropped, '*need_drop' will be set to 1. */
 static int
 answer_from_cache(struct worker* worker, struct query_info* qinfo,
-       struct respip_client_info* cinfo, int* need_drop,
-       struct ub_packed_rrset_key** alias_rrset,
+       struct respip_client_info* cinfo, int* need_drop, int* is_expired_answer,
+       int* is_secure_answer, struct ub_packed_rrset_key** alias_rrset,
        struct reply_info** partial_repp,
-       struct reply_info* rep, uint16_t id, uint16_t flags, 
+       struct reply_info* rep, uint16_t id, uint16_t flags,
        struct comm_reply* repinfo, struct edns_data* edns)
 {
        struct edns_data edns_bak;
@@ -636,38 +636,37 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
        uint16_t udpsize = edns->udp_size;
        struct reply_info* encode_rep = rep;
        struct reply_info* partial_rep = *partial_repp;
-       int secure;
        int must_validate = (!(flags&BIT_CD) || worker->env.cfg->ignore_cd)
                && worker->env.need_to_validate;
-       *partial_repp = NULL;   /* avoid accidental further pass */
-       if(worker->env.cfg->serve_expired) {
-               if(worker->env.cfg->serve_expired_ttl &&
-                       rep->serve_expired_ttl < timenow)
-                       return 0;
-               if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
-                       return 0;
-               /* below, rrsets with ttl before timenow become TTL 0 in
-                * the response */
-               /* This response was served with zero TTL */
-               if (timenow >= rep->ttl) {
-                       worker->stats.zero_ttl_responses++;
-               }
-       } else {
-               /* see if it is possible */
-               if(rep->ttl < timenow) {
+       *partial_repp = NULL;  /* avoid accidental further pass */
+
+       /* Check TTL */
+       if(rep->ttl < timenow) {
+               /* Check if we need to serve expired now */
+               if(worker->env.cfg->serve_expired &&
+                       !worker->env.cfg->serve_expired_client_timeout) {
+                               if(worker->env.cfg->serve_expired_ttl &&
+                                       rep->serve_expired_ttl < timenow)
+                                       return 0;
+                               if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
+                                       return 0;
+                               *is_expired_answer = 1;
+               } else {
                        /* the rrsets may have been updated in the meantime.
                         * we will refetch the message format from the
-                        * authoritative server 
+                        * authoritative server
                         */
                        return 0;
                }
+       } else {
                if(!rrset_array_lock(rep->ref, rep->rrset_count, timenow))
                        return 0;
-               /* locked and ids and ttls are OK. */
        }
+       /* locked and ids and ttls are OK. */
+
        /* check CNAME chain (if any) */
-       if(rep->an_numrrsets > 0 && (rep->rrsets[0]->rk.type == 
-               htons(LDNS_RR_TYPE_CNAME) || rep->rrsets[0]->rk.type == 
+       if(rep->an_numrrsets > 0 && (rep->rrsets[0]->rk.type ==
+               htons(LDNS_RR_TYPE_CNAME) || rep->rrsets[0]->rk.type ==
                htons(LDNS_RR_TYPE_DNAME))) {
                if(!reply_check_cname_chain(qinfo, rep)) {
                        /* cname chain invalid, redo iterator steps */
@@ -686,31 +685,31 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
                if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, rep,
                        LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
                        goto bail_out;
-               error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL, 
+               error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
                        qinfo, id, flags, edns);
-               rrset_array_unlock_touch(worker->env.rrset_cache, 
+               rrset_array_unlock_touch(worker->env.rrset_cache,
                        worker->scratchpad, rep->ref, rep->rrset_count);
                if(worker->stats.extended) {
                        worker->stats.ans_bogus ++;
                        worker->stats.ans_rcode[LDNS_RCODE_SERVFAIL] ++;
                }
                return 1;
-       } else if( rep->security == sec_status_unchecked && must_validate) {
+       } else if(rep->security == sec_status_unchecked && must_validate) {
                verbose(VERB_ALGO, "Cache reply: unchecked entry needs "
                        "validation");
                goto bail_out; /* need to validate cache entry first */
        } else if(rep->security == sec_status_secure) {
-               if(reply_all_rrsets_secure(rep))
-                       secure = 1;
-               else    {
+               if(reply_all_rrsets_secure(rep)) {
+                       *is_secure_answer = 1;
+               } else {
                        if(must_validate) {
                                verbose(VERB_ALGO, "Cache reply: secure entry"
                                        " changed status");
                                goto bail_out; /* rrset changed, re-verify */
                        }
-                       secure = 0;
+                       *is_secure_answer = 0;
                }
-       } else  secure = 0;
+       } else *is_secure_answer = 0;
 
        edns_bak = *edns;
        edns->edns_version = EDNS_ADVERTISED_VERSION;
@@ -732,8 +731,10 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
                worker->env.auth_zones)) {
                goto bail_out;
        }
-       if(encode_rep != rep)
-               secure = 0; /* if rewritten, it can't be considered "secure" */
+       if(encode_rep != rep) {
+               /* if rewritten, it can't be considered "secure" */
+               *is_secure_answer = 0;
+       }
        if(!encode_rep || *alias_rrset) {
                if(!encode_rep)
                        *need_drop = 1;
@@ -750,7 +751,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
                repinfo->c, worker->scratchpad) ||
                !reply_info_answer_encode(qinfo, encode_rep, id, flags,
                repinfo->c->buffer, timenow, 1, worker->scratchpad,
-               udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
+               udpsize, edns, (int)(edns->bits & EDNS_DO), *is_secure_answer)) {
                if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
                        LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
                                edns->opt_list = NULL;
@@ -761,10 +762,6 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
         * is bad while holding locks. */
        rrset_array_unlock_touch(worker->env.rrset_cache, worker->scratchpad,
                rep->ref, rep->rrset_count);
-       if(worker->stats.extended) {
-               if(secure) worker->stats.ans_secure++;
-               server_stats_insrcode(&worker->stats, repinfo->c->buffer);
-       }
        /* go and return this buffer to the client */
        return 1;
 
@@ -1099,6 +1096,8 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
        struct acl_addr* acladdr;
        int rc = 0;
        int need_drop = 0;
+       int is_expired_answer = 0;
+       int is_secure_answer = 0;
        /* We might have to chase a CNAME chain internally, in which case
         * we'll have up to two replies and combine them to build a complete
         * answer.  These variables control this case. */
@@ -1481,12 +1480,14 @@ lookup_cache:
         * each pass.  We should still pass the original qinfo to
         * answer_from_cache(), however, since it's used to build the reply. */
        if(!edns_bypass_cache_stage(edns.opt_list, &worker->env)) {
+               is_expired_answer = 0;
+               is_secure_answer = 0;
                h = query_info_hash(lookup_qinfo, sldns_buffer_read_u16_at(c->buffer, 2));
                if((e=slabhash_lookup(worker->env.msg_cache, h, lookup_qinfo, 0))) {
                        /* answer from cache - we have acquired a readlock on it */
                        if(answer_from_cache(worker, &qinfo,
-                               cinfo, &need_drop, &alias_rrset, &partial_rep,
-                               (struct reply_info*)e->data,
+                               cinfo, &need_drop, &is_expired_answer, &is_secure_answer,
+                               &alias_rrset, &partial_rep, (struct reply_info*)e->data,
                                *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
                                sldns_buffer_read_u16_at(c->buffer, 2), repinfo,
                                &edns)) {
@@ -1583,6 +1584,13 @@ send_reply_rc:
                comm_point_drop_reply(repinfo);
                return 0;
        }
+       if(is_expired_answer) {
+               worker->stats.ans_expired++;
+       }
+       if(worker->stats.extended) {
+               if(is_secure_answer) worker->stats.ans_secure++;
+               server_stats_insrcode(&worker->stats, repinfo->c->buffer);
+       }
 #ifdef USE_DNSTAP
        if(worker->dtenv.log_client_response_messages)
                dt_msg_send_client_response(&worker->dtenv, &repinfo->addr,
@@ -1858,6 +1866,10 @@ worker_init(struct worker* worker, struct config_file *cfg,
                return 0;
        }
        worker->env.mesh = mesh_create(&worker->daemon->mods, &worker->env);
+       /* Pass on daemon variables that we would need in the mesh area */
+       worker->env.mesh->use_response_ip = worker->daemon->use_response_ip;
+       worker->env.mesh->use_rpz = worker->daemon->use_rpz;
+
        worker->env.detach_subs = &mesh_detach_subs;
        worker->env.attach_sub = &mesh_attach_sub;
        worker->env.add_sub = &mesh_add_sub;
index 99ebfcb049521932085314dd73eea8cb3685304c..b1a25d55a11b7b6ea04629527a9d6225f15810e4 100644 (file)
@@ -1,4 +1,14 @@
--3 February 2020: Ralph
+5 February 2020: George
+       - Added serve-stale functionality as described in
+         draft-ietf-dnsop-serve-stale-10. `serve-expired-*` options can be used
+         to configure the behavior.
+       - Updated cachedb to honor `serve-expired-ttl`; Fixes #107.
+       - Renamed statistic `num.zero_ttl` to `num.expired` as expired replies
+         come with a configurable TTL value (`serve-expired-reply-ttl`).
+       - Fixed stats when replying with cached, cname-aliased records.
+       - Added missing default values for redis cachedb backend.
+
+3 February 2020: Ralph
        - Add assertion to please static analyzer
 
 31 January 2020: Wouter
index ff5c16fc8ecf45c4abe4d958e1c309dc4313d9f2..4ce9348c21ed2366aa29ca8ca0ea5ee5f7361219 100644 (file)
@@ -558,8 +558,8 @@ server:
        # that set CD but cannot validate themselves.
        # ignore-cd-flag: no
 
-       # Serve expired responses from cache, with TTL 0 in the response,
-       # and then attempt to fetch the data afresh.
+       # Serve expired responses from cache, with serve-expired-reply-ttl in
+       # the response, and then attempt to fetch the data afresh.
        # serve-expired: no
        #
        # Limit serving of expired responses to configured seconds after
@@ -571,6 +571,16 @@ server:
        # that the expired records will be served as long as there are queries
        # for it.
        # serve-expired-ttl-reset: no
+       #
+       # TTL value to use when replying with expired data.
+       # serve-expired-reply-ttl: 30
+       #
+       # Time in milliseconds before replying to the client with expired data.
+       # This essentially enables the serve-stale behavior as specified in
+       # draft-ietf-dnsop-serve-stale-10 that first tries to resolve before
+       # immediately responding with expired data.  0 disables this behavior.
+       # A recommended value is 1800.
+       # serve-expired-client-timeout: 0
 
        # Have the validator log failed validations for your diagnosis.
        # 0: off. 1: A line per failed user query. 2: With reason and bad IP.
index 680b43ffcd7eae772842eee804b05c8435406596..74d06cfd9ea038e49ad85b5de74dbba050bb1cd6 100644 (file)
@@ -382,8 +382,8 @@ and resulted in recursive processing, taking a slot in the requestlist.
 Not part of the recursivereplies (or the histogram thereof) or cachemiss,
 as a cache response was sent.
 .TP
-.I threadX.num.zero_ttl
-number of replies with ttl zero, because they served an expired cache entry.
+.I threadX.num.expired
+number of replies that served an expired cache entry.
 .TP
 .I threadX.num.recursivereplies
 The number of replies sent to queries that needed recursive processing. Could be smaller than threadX.num.cachemiss if due to timeouts no replies were sent for some queries.
@@ -446,7 +446,7 @@ summed over threads.
 .I total.num.prefetch
 summed over threads.
 .TP
-.I total.num.zero_ttl
+.I total.num.expired
 summed over threads.
 .TP
 .I total.num.recursivereplies
index 7474d7c92a2698027f1e3260e51d2760b3b5a80e..ebc2028821edd61b5bd31a4b039a3cb7500d09bc 100644 (file)
@@ -1070,20 +1070,35 @@ The default value is "no".
 .TP
 .B serve\-expired: \fI<yes or no>
 If enabled, unbound attempts to serve old responses from cache with a
-TTL of 0 in the response without waiting for the actual resolution to finish.
-The actual resolution answer ends up in the cache later on.  Default is "no".
+TTL of \fBserve\-expired\-reply\-ttl\fR in the response without waiting for the
+actual resolution to finish.  The actual resolution answer ends up in the cache
+later on.  Default is "no".
 .TP
 .B serve\-expired\-ttl: \fI<seconds>
 Limit serving of expired responses to configured seconds after expiration. 0
-disables the limit. This option only applies when \fBserve\-expired\fR is
-enabled. The default is 0.
+disables the limit.  This option only applies when \fBserve\-expired\fR is
+enabled.  A suggested value per draft-ietf-dnsop-serve-stale-10 is between
+86400 (1 day) and 259200 (3 days).  The default is 0.
 .TP
 .B serve\-expired\-ttl\-reset: \fI<yes or no>
 Set the TTL of expired records to the \fBserve\-expired\-ttl\fR value after a
-failed attempt to retrieve the record from upstream. This makes sure that the
-expired records will be served as long as there are queries for it. Default is
+failed attempt to retrieve the record from upstream.  This makes sure that the
+expired records will be served as long as there are queries for it.  Default is
 "no".
 .TP
+.B serve\-expired\-reply\-ttl: \fI<seconds>
+TTL value to use when replying with expired data.  If
+\fBserve\-expired\-client\-timeout\fR is also used then it is RECOMMENDED to
+use 30 as the value (draft-ietf-dnsop-serve-stale-10).  The default is 30.
+.TP
+.B serve\-expired\-client\-timeout: \fI<msec>
+Time in milliseconds before replying to the client with expired data.  This
+essentially enables the serve-stale behavior as specified in
+draft-ietf-dnsop-serve-stale-10 that first tries to resolve before immediately
+responding with expired data.  A recommended value per
+draft-ietf-dnsop-serve-stale-10 is 1800.  Setting this to 0 will disable this
+behavior.  Default is 0.
+.TP
 .B val\-nsec3\-keysize\-iterations: \fI<"list of values">
 List of keysize and iteration count values, separated by spaces, surrounded
 by quotes. Default is "1024 150 2048 500 4096 2500". This determines the
@@ -2024,6 +2039,13 @@ to the query without performing iterative DNS resolution.
 If Unbound cannot even find an answer in the backend, it resolves the
 query as usual, and stores the answer in the backend.
 .P
+This module interacts with the \fBserve\-expired\-*\fR options and will reply
+with expired data if unbound is configured for that.  Currently the use
+of \fBserve\-expired\-client\-timeout:\fR and
+\fBserve\-expired\-reply\-ttl:\fR is not consistent for data originating from
+the external cache as these will result in a reply with 0 TTL without trying to
+update the data first, ignoring the configured values.
+.P
 If Unbound was built with
 \fB\-\-with\-libhiredis\fR
 on a system that has installed the hiredis C client library of Redis,
index 907f40d5859d4c6c2beda6d6e8516d41574799b8..37dc550cd69c36d768c4b95baf206ebd0cebf0a5 100644 (file)
@@ -431,7 +431,7 @@ lookup_and_reply(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
        }
 
        qstate->return_msg = tomsg(NULL, &qstate->qinfo,
-               (struct reply_info *)node->elem, qstate->region, *env->now,
+               (struct reply_info *)node->elem, qstate->region, *env->now, 0,
                env->scratch);
        scope = (uint8_t)node->scope;
        lock_rw_unlock(&e->lock);
index 5c62017a0fc23c9a5279c7596dd392f103b4cc5e..6cb97ff1fd4a58d35ec7197944e83ac95c16a4cc 100644 (file)
@@ -561,7 +561,6 @@ setup_qinfo_edns(struct libworker* w, struct ctx_query* q,
        if(!qinfo->qname) {
                return 0;
        }
-       qinfo->local_alias = NULL;
        edns->edns_present = 1;
        edns->ext_rcode = 0;
        edns->edns_version = 0;
index 491222e72ecf612e51f79b5961fd00970aedc76b..04661838c189a49bbced4da0d0432657f7d182e0 100644 (file)
@@ -735,8 +735,8 @@ struct ub_server_stats {
        long long unwanted_queries;
        /** usage of tcp accept list */
        long long tcp_accept_usage;
-       /** answers served from expired cache */
-       long long zero_ttl_responses;
+       /** expired answers served from cache */
+       long long ans_expired;
        /** histogram data exported to array 
         * if the array is the same size, no data is lost, and
         * if all histograms are same size (is so by default) then
index aa4efec73f412001f832fb27559a7b10122deedf..2a5bca4ace1738ca637f52aeba1f5c1923203565 100644 (file)
@@ -45,6 +45,7 @@
 #include "validator/val_utils.h"
 #include "services/cache/dns.h"
 #include "services/cache/rrset.h"
+#include "util/data/msgparse.h"
 #include "util/data/msgreply.h"
 #include "util/data/packed_rrset.h"
 #include "util/data/dname.h"
@@ -73,15 +74,15 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
        time_t leeway, int pside, struct reply_info* qrep,
        struct regional* region)
 {
-        size_t i;
-        /* see if rrset already exists in cache, if not insert it. */
-        for(i=0; i<rep->rrset_count; i++) {
-                rep->ref[i].key = rep->rrsets[i];
-                rep->ref[i].id = rep->rrsets[i]->id;
-               /* update ref if it was in the cache */ 
+       size_t i;
+       /* see if rrset already exists in cache, if not insert it. */
+       for(i=0; i<rep->rrset_count; i++) {
+               rep->ref[i].key = rep->rrsets[i];
+               rep->ref[i].id = rep->rrsets[i]->id;
+               /* update ref if it was in the cache */
                switch(rrset_cache_update(env->rrset_cache, &rep->ref[i],
-                        env->alloc, now + ((ntohs(rep->ref[i].key->rk.type)==
-                       LDNS_RR_TYPE_NS && !pside)?0:leeway))) {
+                               env->alloc, now + ((ntohs(rep->ref[i].key->rk.type)==
+                               LDNS_RR_TYPE_NS && !pside)?0:leeway))) {
                case 0: /* ref unchanged, item inserted */
                        break;
                case 2: /* ref updated, cache is superior */
@@ -104,9 +105,9 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
                         * the fallthrough warning */
                        /* fallthrough */
                case 1: /* ref updated, item inserted */
-                        rep->rrsets[i] = rep->ref[i].key;
+                       rep->rrsets[i] = rep->ref[i].key;
                }
-        }
+       }
 }
 
 /** delete message from message cache */
@@ -532,31 +533,51 @@ gen_dns_msg(struct regional* region, struct query_info* q, size_t num)
 }
 
 struct dns_msg*
-tomsg(struct module_env* env, struct query_info* q, struct reply_info* r, 
-       struct regional* region, time_t now, struct regional* scratch)
+tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
+       struct regional* region, time_t now, int allow_expired,
+       struct regional* scratch)
 {
        struct dns_msg* msg;
        size_t i;
-       if(now > r->ttl)
-               return NULL;
+       int is_expired = 0;
+       time_t now_control = now;
+       if(now > r->ttl) {
+               /* Check if we are allowed to serve expired */
+               if(allow_expired) {
+                       if(env->cfg->serve_expired_ttl &&
+                               r->serve_expired_ttl < now) {
+                               return NULL;
+                       }
+               } else {
+                       return NULL;
+               }
+               /* Change the current time so we can pass the below TTL checks when
+                * serving expired data. */
+               now_control = r->ttl - env->cfg->serve_expired_reply_ttl;
+               is_expired = 1;
+       }
+
        msg = gen_dns_msg(region, q, r->rrset_count);
-       if(!msg)
-               return NULL;
+       if(!msg) return NULL;
        msg->rep->flags = r->flags;
        msg->rep->qdcount = r->qdcount;
-       msg->rep->ttl = r->ttl - now;
+       msg->rep->ttl = is_expired
+               ?SERVE_EXPIRED_REPLY_TTL
+               :r->ttl - now;
        if(r->prefetch_ttl > now)
                msg->rep->prefetch_ttl = r->prefetch_ttl - now;
-       else    msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+       else
+               msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
        msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
        msg->rep->security = r->security;
        msg->rep->an_numrrsets = r->an_numrrsets;
        msg->rep->ns_numrrsets = r->ns_numrrsets;
        msg->rep->ar_numrrsets = r->ar_numrrsets;
        msg->rep->rrset_count = r->rrset_count;
-        msg->rep->authoritative = r->authoritative;
-       if(!rrset_array_lock(r->ref, r->rrset_count, now))
+       msg->rep->authoritative = r->authoritative;
+       if(!rrset_array_lock(r->ref, r->rrset_count, now_control)) {
                return NULL;
+       }
        if(r->an_numrrsets > 0 && (r->rrsets[0]->rk.type == htons(
                LDNS_RR_TYPE_CNAME) || r->rrsets[0]->rk.type == htons(
                LDNS_RR_TYPE_DNAME)) && !reply_check_cname_chain(q, r)) {
@@ -570,7 +591,7 @@ tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
                return NULL;
        }
        for(i=0; i<msg->rep->rrset_count; i++) {
-               msg->rep->rrsets[i] = packed_rrset_copy_region(r->rrsets[i], 
+               msg->rep->rrsets[i] = packed_rrset_copy_region(r->rrsets[i],
                        region, now);
                if(!msg->rep->rrsets[i]) {
                        rrset_array_unlock(r->ref, r->rrset_count);
@@ -797,7 +818,7 @@ dns_cache_lookup(struct module_env* env,
        if(e) {
                struct msgreply_entry* key = (struct msgreply_entry*)e->key;
                struct reply_info* data = (struct reply_info*)e->data;
-               struct dns_msg* msg = tomsg(env, &key->key, data, region, now, 
+               struct dns_msg* msg = tomsg(env, &key->key, data, region, now, 0,
                        scratch);
                if(msg) {
                        lock_rw_unlock(&e->lock);
@@ -899,37 +920,38 @@ dns_cache_lookup(struct module_env* env,
         * Empty nonterminals are NOERROR, so an NXDOMAIN for foo
         * means bla.foo also does not exist.  The DNSSEC proofs are
         * the same.  We search upwards for NXDOMAINs. */
-       if(env->cfg->harden_below_nxdomain)
-           while(!dname_is_root(k.qname)) {
-               dname_remove_label(&k.qname, &k.qname_len);
-               h = query_info_hash(&k, flags);
-               e = slabhash_lookup(env->msg_cache, h, &k, 0);
-               if(!e && k.qtype != LDNS_RR_TYPE_A &&
-                       env->cfg->qname_minimisation) {
-                       k.qtype = LDNS_RR_TYPE_A;
+       if(env->cfg->harden_below_nxdomain) {
+               while(!dname_is_root(k.qname)) {
+                       dname_remove_label(&k.qname, &k.qname_len);
                        h = query_info_hash(&k, flags);
                        e = slabhash_lookup(env->msg_cache, h, &k, 0);
-               }
-               if(e) {
-                       struct reply_info* data = (struct reply_info*)e->data;
-                       struct dns_msg* msg;
-                       if(FLAGS_GET_RCODE(data->flags) == LDNS_RCODE_NXDOMAIN
-                         && data->security == sec_status_secure
-                         && (data->an_numrrsets == 0 ||
-                               ntohs(data->rrsets[0]->rk.type) != LDNS_RR_TYPE_CNAME)
-                         && (msg=tomsg(env, &k, data, region, now, scratch))){
+                       if(!e && k.qtype != LDNS_RR_TYPE_A &&
+                               env->cfg->qname_minimisation) {
+                               k.qtype = LDNS_RR_TYPE_A;
+                               h = query_info_hash(&k, flags);
+                               e = slabhash_lookup(env->msg_cache, h, &k, 0);
+                       }
+                       if(e) {
+                               struct reply_info* data = (struct reply_info*)e->data;
+                               struct dns_msg* msg;
+                               if(FLAGS_GET_RCODE(data->flags) == LDNS_RCODE_NXDOMAIN
+                                       && data->security == sec_status_secure
+                                       && (data->an_numrrsets == 0 ||
+                                               ntohs(data->rrsets[0]->rk.type) != LDNS_RR_TYPE_CNAME)
+                                       && (msg=tomsg(env, &k, data, region, now, 0, scratch))) {
+                                       lock_rw_unlock(&e->lock);
+                                       msg->qinfo.qname=qname;
+                                       msg->qinfo.qname_len=qnamelen;
+                                       /* check that DNSSEC really works out */
+                                       msg->rep->security = sec_status_unchecked;
+                                       iter_scrub_nxdomain(msg);
+                                       return msg;
+                               }
                                lock_rw_unlock(&e->lock);
-                               msg->qinfo.qname=qname;
-                               msg->qinfo.qname_len=qnamelen;
-                               /* check that DNSSEC really works out */
-                               msg->rep->security = sec_status_unchecked;
-                               iter_scrub_nxdomain(msg);
-                               return msg;
                        }
-                       lock_rw_unlock(&e->lock);
+                       k.qtype = qtype;
                }
-               k.qtype = qtype;
-           }
+       }
 
        /* fill common RR types for ANY response to avoid requery */
        if(qtype == LDNS_RR_TYPE_ANY) {
index 19d0d9f992d1a6c266284039c5dcbbf8c2a93a60..f1b77fb36c004c63f3d55c50d3bebcff238cf853 100644 (file)
@@ -143,11 +143,14 @@ struct delegpt* dns_cache_find_delegation(struct module_env* env,
  * @param r: reply info that, together with qname, will make up the dns message.
  * @param region: where to allocate dns message.
  * @param now: the time now, for check if TTL on cache entry is ok.
+ * @param allow_expired: if true and serve-expired is enabled, it will allow
+ *     for expired dns_msg to be generated based on the configured serve-expired
+ *     logic.
  * @param scratch: where to allocate temporary data.
  * */
 struct dns_msg* tomsg(struct module_env* env, struct query_info* q,
        struct reply_info* r, struct regional* region, time_t now,
-       struct regional* scratch);
+       int allow_expired, struct regional* scratch);
 
 /** 
  * Find cached message 
@@ -160,7 +163,7 @@ struct dns_msg* tomsg(struct module_env* env, struct query_info* q,
  * @param region: where to allocate result.
  * @param scratch: where to allocate temporary data.
  * @param no_partial: if true, only complete messages and not a partial
- *   one (with only the start of the CNAME chain and not the rest).
+ *     one (with only the start of the CNAME chain and not the rest).
  * @return new response message (alloced in region, rrsets do not have IDs).
  *     or NULL on error or if not found in cache.
  *     TTLs are made relative to the current time.
index 61127c8456b7444997076218c5c16a53c09a9017..bcd84278b6b472a377bce20c1619da92f063cdca 100644 (file)
@@ -46,6 +46,7 @@
 #include "services/mesh.h"
 #include "services/outbound_list.h"
 #include "services/cache/dns.h"
+#include "services/cache/rrset.h"
 #include "util/log.h"
 #include "util/net_help.h"
 #include "util/module.h"
@@ -127,7 +128,7 @@ timeval_smaller(const struct timeval* x, const struct timeval* y)
 #endif
 }
 
-/*
+/**
  * Compare two response-ip client info entries for the purpose of mesh state
  * compare.  It returns 0 if ci_a and ci_b are considered equal; otherwise
  * 1 or -1 (they mean 'ci_a is larger/smaller than ci_b', respectively, but
@@ -250,6 +251,7 @@ mesh_create(struct module_stack* stack, struct module_env* env)
        mesh->num_forever_states = 0;
        mesh->stats_jostled = 0;
        mesh->stats_dropped = 0;
+       mesh->ans_expired = 0;
        mesh->max_reply_states = env->cfg->num_queries_per_thread;
        mesh->max_forever_states = (mesh->max_reply_states+1)/2;
 #ifndef S_SPLINT_S
@@ -345,6 +347,120 @@ int mesh_make_new_space(struct mesh_area* mesh, sldns_buffer* qbuf)
        return 0;
 }
 
+struct dns_msg*
+mesh_serve_expired_lookup(struct module_qstate* qstate,
+       struct query_info* lookup_qinfo)
+{
+       hashvalue_type h;
+       struct lruhash_entry* e;
+       struct dns_msg* msg;
+       struct reply_info* rep, *data;
+       struct msgreply_entry* key;
+       time_t timenow = *qstate->env->now;
+       int must_validate = (!(qstate->query_flags&BIT_CD)
+               || qstate->env->cfg->ignore_cd) && qstate->env->need_to_validate;
+       /* Lookup cache */
+       h = query_info_hash(lookup_qinfo, qstate->query_flags);
+       e = slabhash_lookup(qstate->env->msg_cache, h, lookup_qinfo, 0);
+       if(!e) return NULL;
+       rep = (struct reply_info*)e->data;
+       /* Check TTL */
+       if(rep->ttl < timenow) {
+               /* Check if we need to serve expired now */
+               if(qstate->env->cfg->serve_expired) {
+                       if(qstate->env->cfg->serve_expired_ttl &&
+                               rep->serve_expired_ttl < timenow)
+                               goto bail_out;
+                       if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
+                               goto bail_out;
+               } else {
+                       /* the rrsets may have been updated in the meantime.
+                        * we will refetch the message format from the
+                        * authoritative server
+                        */
+                       goto bail_out;
+               }
+       } else {
+               if(!rrset_array_lock(rep->ref, rep->rrset_count, timenow))
+                       goto bail_out;
+       }
+
+       /* Check CNAME chain (if any)
+        * This is part of tomsg further down; no need to check now. */
+
+       /* Check security status of the cached answer.
+        * tomsg further down has a subset of these checks, so we are leaving
+        * these as is.
+        * In case of bogus or revalidation we don't care to reply here. */
+       if(must_validate && (rep->security == sec_status_bogus ||
+               rep->security == sec_status_secure_sentinel_fail)) {
+               verbose(VERB_ALGO, "Serve expired: bogus answer found in cache");
+               goto bail_out_rrset;
+       } else if(rep->security == sec_status_unchecked && must_validate) {
+               verbose(VERB_ALGO, "Serve expired: unchecked entry needs "
+                       "validation");
+               goto bail_out_rrset; /* need to validate cache entry first */
+       } else if(rep->security == sec_status_secure &&
+               !reply_all_rrsets_secure(rep) && must_validate) {
+                       verbose(VERB_ALGO, "Serve expired: secure entry"
+                               " changed status");
+                       goto bail_out_rrset; /* rrset changed, re-verify */
+       }
+
+       key = (struct msgreply_entry*)e->key;
+       data = (struct reply_info*)e->data;
+       msg = tomsg(qstate->env, &key->key, data, qstate->region, timenow,
+               qstate->env->cfg->serve_expired, qstate->env->scratch);
+       rrset_array_unlock_touch(qstate->env->rrset_cache,
+               qstate->region, rep->ref, rep->rrset_count);
+       lock_rw_unlock(&e->lock);
+       return msg;
+
+bail_out_rrset:
+       rrset_array_unlock_touch(qstate->env->rrset_cache,
+               qstate->region, rep->ref, rep->rrset_count);
+bail_out:
+       lock_rw_unlock(&e->lock);
+       return NULL;
+}
+
+
+/** Init the serve expired data structure */
+static int
+mesh_serve_expired_init(struct mesh_state* mstate, int timeout)
+{
+       struct timeval t;
+
+       /* Create serve_expired_data if not there yet */
+       if(!mstate->s.serve_expired_data) {
+               mstate->s.serve_expired_data = (struct serve_expired_data*)
+                       regional_alloc_zero(
+                               mstate->s.region, sizeof(struct serve_expired_data));
+               if(!mstate->s.serve_expired_data)
+                       return 0;
+       }
+
+       /* Don't overwrite the function if already set */
+       mstate->s.serve_expired_data->get_cached_answer =
+               mstate->s.serve_expired_data->get_cached_answer?
+               mstate->s.serve_expired_data->get_cached_answer:
+               mesh_serve_expired_lookup;
+
+       /* In case this timer already popped, start it again */
+       if(!mstate->s.serve_expired_data->timer) {
+               mstate->s.serve_expired_data->timer = comm_timer_create(
+                       mstate->s.env->worker_base, mesh_serve_expired_callback, mstate);
+               if(!mstate->s.serve_expired_data->timer)
+                       return 0;
+#ifndef S_SPLINT_S
+               t.tv_sec = timeout/1000;
+               t.tv_usec = (timeout%1000)*1000;
+#endif
+               comm_timer_set(mstate->s.serve_expired_data->timer, &t);
+       }
+       return 1;
+}
+
 void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
        struct respip_client_info* cinfo, uint16_t qflags,
        struct edns_data* edns, struct comm_reply* rep, uint16_t qid)
@@ -354,6 +470,8 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
        int was_detached = 0;
        int was_noreply = 0;
        int added = 0;
+       int timeout = mesh->env->cfg->serve_expired?
+               mesh->env->cfg->serve_expired_client_timeout:0;
        struct sldns_buffer* r_buffer = rep->c->buffer;
        if(rep->c->tcp_req_info) {
                r_buffer = rep->c->tcp_req_info->spool_buffer;
@@ -366,7 +484,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
                        verbose(VERB_ALGO, "Too many queries. dropping "
                                "incoming query.");
                        comm_point_drop_reply(rep);
-                       mesh->stats_dropped ++;
+                       mesh->stats_dropped++;
                        return;
                }
                /* for this new reply state, the reply address is free,
@@ -376,8 +494,8 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
                if(mesh->num_reply_addrs > mesh->max_reply_states*16) {
                        verbose(VERB_ALGO, "Too many requests queued. "
                                "dropping incoming query.");
-                       mesh->stats_dropped++;
                        comm_point_drop_reply(rep);
+                       mesh->stats_dropped++;
                        return;
                }
        }
@@ -427,23 +545,16 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
                mesh->num_detached_states++;
                added = 1;
        }
-       if(!s->reply_list && !s->cb_list && s->super_set.count == 0)
-               was_detached = 1;
-       if(!s->reply_list && !s->cb_list)
+       if(!s->reply_list && !s->cb_list) {
                was_noreply = 1;
+               if(s->super_set.count == 0) {
+                       was_detached = 1;
+               }
+       }
        /* add reply to s */
        if(!mesh_state_add_reply(s, edns, rep, qid, qflags, qinfo)) {
-                       log_err("mesh_new_client: out of memory; SERVFAIL");
-               servfail_mem:
-                       if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, &s->s,
-                               NULL, LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
-                                       edns->opt_list = NULL;
-                       error_encode(r_buffer, LDNS_RCODE_SERVFAIL,
-                               qinfo, qid, qflags, edns);
-                       comm_point_send_reply(rep);
-                       if(added)
-                               mesh_state_delete(&s->s);
-                       return;
+               log_err("mesh_new_client: out of memory; SERVFAIL");
+               goto servfail_mem;
        }
        if(rep->c->tcp_req_info) {
                if(!tcp_req_info_add_meshstate(rep->c->tcp_req_info, mesh, s)) {
@@ -451,6 +562,11 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
                        goto servfail_mem;
                }
        }
+       /* add serve expired timer if required and not already there */
+       if(timeout && !mesh_serve_expired_init(s, timeout)) {
+               log_err("mesh_new_client: out of memory initializing serve expired");
+               goto servfail_mem;
+       }
        /* update statistics */
        if(was_detached) {
                log_assert(mesh->num_detached_states > 0);
@@ -475,6 +591,18 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
        }
        if(added)
                mesh_run(mesh, s, module_event_new, NULL);
+       return;
+
+servfail_mem:
+       if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, &s->s,
+               NULL, LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
+                       edns->opt_list = NULL;
+       error_encode(r_buffer, LDNS_RCODE_SERVFAIL,
+               qinfo, qid, qflags, edns);
+       comm_point_send_reply(rep);
+       if(added)
+               mesh_state_delete(&s->s);
+       return;
 }
 
 int 
@@ -484,6 +612,8 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
 {
        struct mesh_state* s = NULL;
        int unique = unique_mesh_state(edns->opt_list, mesh->env);
+       int timeout = mesh->env->cfg->serve_expired?
+               mesh->env->cfg->serve_expired_client_timeout:0;
        int was_detached = 0;
        int was_noreply = 0;
        int added = 0;
@@ -522,15 +652,21 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
                mesh->num_detached_states++;
                added = 1;
        }
-       if(!s->reply_list && !s->cb_list && s->super_set.count == 0)
-               was_detached = 1;
-       if(!s->reply_list && !s->cb_list)
+       if(!s->reply_list && !s->cb_list) {
                was_noreply = 1;
+               if(s->super_set.count == 0) {
+                       was_detached = 1;
+               }
+       }
        /* add reply to s */
        if(!mesh_state_add_cb(s, edns, buf, cb, cb_arg, qid, qflags)) {
-                       if(added)
-                               mesh_state_delete(&s->s);
-                       return 0;
+               if(added)
+                       mesh_state_delete(&s->s);
+               return 0;
+       }
+       /* add serve expired timer if not already there */
+       if(timeout && !mesh_serve_expired_init(s, timeout)) {
+               return 0;
        }
        /* update statistics */
        if(was_detached) {
@@ -546,15 +682,6 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
        return 1;
 }
 
-static void mesh_schedule_prefetch(struct mesh_area* mesh,
-       struct query_info* qinfo, uint16_t qflags, time_t leeway, int run);
-
-void mesh_new_prefetch(struct mesh_area* mesh, struct query_info* qinfo,
-        uint16_t qflags, time_t leeway)
-{
-       mesh_schedule_prefetch(mesh, qinfo, qflags, leeway, 1);
-}
-
 /* Internal backend routine of mesh_new_prefetch().  It takes one additional
  * parameter, 'run', which controls whether to run the prefetch state
  * immediately.  When this function is called internally 'run' could be
@@ -631,6 +758,12 @@ static void mesh_schedule_prefetch(struct mesh_area* mesh,
        mesh_run(mesh, s, module_event_new, NULL);
 }
 
+void mesh_new_prefetch(struct mesh_area* mesh, struct query_info* qinfo,
+        uint16_t qflags, time_t leeway)
+{
+       mesh_schedule_prefetch(mesh, qinfo, qflags, leeway, 1);
+}
+
 void mesh_report_reply(struct mesh_area* mesh, struct outbound_entry* e,
         struct comm_reply* reply, int what)
 {
@@ -703,6 +836,7 @@ mesh_state_create(struct module_env* env, struct query_info* qinfo,
        mstate->s.env = env;
        mstate->s.mesh_info = mstate;
        mstate->s.prefetch_leeway = 0;
+       mstate->s.serve_expired_data = NULL;
        mstate->s.no_cache_lookup = 0;
        mstate->s.no_cache_store = 0;
        mstate->s.need_refetch = 0;
@@ -742,6 +876,11 @@ mesh_state_cleanup(struct mesh_state* mstate)
        if(!mstate)
                return;
        mesh = mstate->s.env->mesh;
+       /* Stop and delete the serve expired timer */
+       if(mstate->s.serve_expired_data && mstate->s.serve_expired_data->timer) {
+               comm_timer_delete(mstate->s.serve_expired_data->timer);
+               mstate->s.serve_expired_data->timer = NULL;
+       }
        /* drop unsent replies */
        if(!mstate->replies_sent) {
                struct mesh_reply* rep = mstate->reply_list;
@@ -752,6 +891,7 @@ mesh_state_cleanup(struct mesh_state* mstate)
                mstate->reply_list = NULL;
                for(; rep; rep=rep->next) {
                        comm_point_drop_reply(&rep->query_reply);
+                       log_assert(mesh->num_reply_addrs > 0);
                        mesh->num_reply_addrs--;
                }
                while((cb = mstate->cb_list)!=NULL) {
@@ -759,6 +899,7 @@ mesh_state_cleanup(struct mesh_state* mstate)
                        fptr_ok(fptr_whitelist_mesh_cb(cb->cb));
                        (*cb->cb)(cb->cb_arg, LDNS_RCODE_SERVFAIL, NULL,
                                sec_status_unchecked, NULL, 0);
+                       log_assert(mesh->num_reply_addrs > 0);
                        mesh->num_reply_addrs--;
                }
        }
@@ -826,7 +967,7 @@ find_in_subsub(struct mesh_state* m, struct mesh_state* tofind, size_t *c)
 }
 
 /** find cycle for already looked up mesh_state */
-static int 
+static int
 mesh_detect_cycle_found(struct module_qstate* qstate, struct mesh_state* dep_m)
 {
        struct mesh_state* cyc_m = qstate->mesh_info;
@@ -1038,6 +1179,7 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
                }
        }
        free(reason);
+       log_assert(m->s.env->mesh->num_reply_addrs > 0);
        m->s.env->mesh->num_reply_addrs--;
 }
 
@@ -1139,6 +1281,7 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
                comm_point_send_reply(&r->query_reply);
        }
        /* account */
+       log_assert(m->s.env->mesh->num_reply_addrs > 0);
        m->s.env->mesh->num_reply_addrs--;
        end_time = *m->s.env->now_tv;
        timeval_subtract(&duration, &end_time, &r->start_time);
@@ -1170,14 +1313,23 @@ void mesh_query_done(struct mesh_state* mstate)
        struct mesh_cb* c;
        struct reply_info* rep = (mstate->s.return_msg?
                mstate->s.return_msg->rep:NULL);
-       if((mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
-               (rep && FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_SERVFAIL))
+       /* No need for the serve expired timer anymore; we are going to reply. */
+       if(mstate->s.serve_expired_data) {
+               comm_timer_delete(mstate->s.serve_expired_data->timer);
+               mstate->s.serve_expired_data->timer = NULL;
+       }
+       if(mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
+               (rep && FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_SERVFAIL)) {
+               /* we are SERVFAILing; check for expired asnwer here */
+               mesh_serve_expired_callback(mstate);
+               if((mstate->reply_list || mstate->cb_list)
                && mstate->s.env->cfg->log_servfail
                && !mstate->s.env->cfg->val_log_squelch) {
-               char* err = errinf_to_str_servfail(&mstate->s);
-               if(err)
-                       log_err("%s", err);
-               free(err);
+                       char* err = errinf_to_str_servfail(&mstate->s);
+                       if(err)
+                               log_err("%s", err);
+                       free(err);
+               }
        }
        for(r = mstate->reply_list; r; r = r->next) {
                /* if a response-ip address block has been stored the
@@ -1202,9 +1354,9 @@ void mesh_query_done(struct mesh_state* mstate)
 
                /* if this query is determined to be dropped during the
                 * mesh processing, this is the point to take that action. */
-               if(mstate->s.is_drop)
+               if(mstate->s.is_drop) {
                        comm_point_drop_reply(&r->query_reply);
-               else {
+               else {
                        struct sldns_buffer* r_buffer = r->query_reply.c->buffer;
                        if(r->query_reply.c->tcp_req_info) {
                                r_buffer = r->query_reply.c->tcp_req_info->spool_buffer;
@@ -1226,6 +1378,7 @@ void mesh_query_done(struct mesh_state* mstate)
                 * changed, eg. by adds from the callback routine */
                if(!mstate->reply_list && mstate->cb_list && !c->next) {
                        /* was a reply state, not anymore */
+                       log_assert(mstate->s.env->mesh->num_reply_states > 0);
                        mstate->s.env->mesh->num_reply_states--;
                }
                mstate->cb_list = c->next;
@@ -1591,6 +1744,7 @@ mesh_stats_clear(struct mesh_area* mesh)
        timehist_clear(mesh->histogram);
        mesh->ans_secure = 0;
        mesh->ans_bogus = 0;
+       mesh->ans_expired = 0;
        memset(&mesh->ans_rcode[0], 0, sizeof(size_t)*UB_STATS_RCODE_NUM);
        memset(&mesh->rpz_action[0], 0, sizeof(size_t)*UB_STATS_RPZ_ACTION_NUM);
        mesh->ans_nodata = 0;
@@ -1658,6 +1812,7 @@ void mesh_state_remove_reply(struct mesh_area* mesh, struct mesh_state* m,
                        if(prev) prev->next = n->next;
                        else m->reply_list = n->next;
                        /* delete it, but allocated in m region */
+                       log_assert(mesh->num_reply_addrs > 0);
                        mesh->num_reply_addrs--;
 
                        /* prev = prev; */
@@ -1678,3 +1833,176 @@ void mesh_state_remove_reply(struct mesh_area* mesh, struct mesh_state* m,
                mesh->num_reply_states--;
        }
 }
+
+
+static int
+apply_respip_action(struct module_qstate* qstate,
+       const struct query_info* qinfo, struct respip_client_info* cinfo,
+       struct respip_action_info* actinfo, struct reply_info* rep,
+       struct ub_packed_rrset_key** alias_rrset,
+       struct reply_info** encode_repp, struct auth_zones* az)
+{
+       if(qinfo->qtype != LDNS_RR_TYPE_A &&
+               qinfo->qtype != LDNS_RR_TYPE_AAAA &&
+               qinfo->qtype != LDNS_RR_TYPE_ANY)
+               return 1;
+
+       if(!respip_rewrite_reply(qinfo, cinfo, rep, encode_repp, actinfo,
+               alias_rrset, 0, qstate->region, az))
+               return 0;
+
+       /* xxx_deny actions mean dropping the reply, unless the original reply
+        * was redirected to response-ip data. */
+       if((actinfo->action == respip_deny ||
+               actinfo->action == respip_inform_deny) &&
+               *encode_repp == rep)
+               *encode_repp = NULL;
+
+       return 1;
+}
+
+void
+mesh_serve_expired_callback(void* arg)
+{
+       struct mesh_state* mstate = (struct mesh_state*) arg;
+       struct module_qstate* qstate = &mstate->s;
+       struct mesh_reply* r;
+       struct mesh_area* mesh = qstate->env->mesh;
+       struct dns_msg* msg;
+       struct mesh_cb* c;
+       struct mesh_reply* prev = NULL;
+       struct sldns_buffer* prev_buffer = NULL;
+       struct sldns_buffer* r_buffer = NULL;
+       struct reply_info* partial_rep = NULL;
+       struct ub_packed_rrset_key* alias_rrset = NULL;
+       struct reply_info* encode_rep = NULL;
+       struct respip_action_info actinfo;
+       struct query_info* lookup_qinfo = &qstate->qinfo;
+       struct query_info qinfo_tmp;
+       int must_validate = (!(qstate->query_flags&BIT_CD)
+               || qstate->env->cfg->ignore_cd) && qstate->env->need_to_validate;
+       if(!qstate->serve_expired_data) return;
+       verbose(VERB_ALGO, "Serve expired: Trying to reply with expired data");
+       comm_timer_delete(qstate->serve_expired_data->timer);
+       qstate->serve_expired_data->timer = NULL;
+       if(qstate->blacklist || qstate->no_cache_lookup || qstate->is_drop) {
+               verbose(VERB_ALGO,
+                       "Serve expired: Not allowed to look into cache for stale");
+               return;
+       }
+       /* The following while is used instead of the `goto lookup_cache`
+        * like in the worker. */
+       while(1) {
+               fptr_ok(fptr_whitelist_serve_expired_lookup(
+                       qstate->serve_expired_data->get_cached_answer));
+               msg = qstate->serve_expired_data->get_cached_answer(qstate,
+                       lookup_qinfo);
+               if(!msg)
+                       return;
+               /* Reset these in case we pass a second time from here. */
+               encode_rep = msg->rep;
+               memset(&actinfo, 0, sizeof(actinfo));
+               actinfo.action = respip_none;
+               alias_rrset = NULL;
+               if((mesh->use_response_ip || mesh->use_rpz) &&
+                       !partial_rep && !apply_respip_action(qstate, &qstate->qinfo,
+                       qstate->client_info, &actinfo, msg->rep, &alias_rrset, &encode_rep,
+                       qstate->env->auth_zones)) {
+                       return;
+               } else if(partial_rep &&
+                       !respip_merge_cname(partial_rep, &qstate->qinfo, msg->rep,
+                       qstate->client_info, must_validate, &encode_rep, qstate->region,
+                       qstate->env->auth_zones)) {
+                       return;
+               }
+               if(!encode_rep || alias_rrset) {
+                       if(!encode_rep) {
+                               /* Needs drop */
+                               return;
+                       } else {
+                               /* A partial CNAME chain is found. */
+                               partial_rep = encode_rep;
+                       }
+               }
+               /* We've found a partial reply ending with an
+               * alias.  Replace the lookup qinfo for the
+               * alias target and lookup the cache again to
+               * (possibly) complete the reply.  As we're
+               * passing the "base" reply, there will be no
+               * more alias chasing. */
+               if(partial_rep) {
+                       memset(&qinfo_tmp, 0, sizeof(qinfo_tmp));
+                       get_cname_target(alias_rrset, &qinfo_tmp.qname,
+                               &qinfo_tmp.qname_len);
+                       if(!qinfo_tmp.qname) {
+                               log_err("Serve expired: unexpected: invalid answer alias");
+                               return;
+                       }
+                       qinfo_tmp.qtype = qstate->qinfo.qtype;
+                       qinfo_tmp.qclass = qstate->qinfo.qclass;
+                       lookup_qinfo = &qinfo_tmp;
+                       continue;
+               }
+               break;
+       }
+
+       if(verbosity >= VERB_ALGO)
+               log_dns_msg("Serve expired lookup", &qstate->qinfo, msg->rep);
+
+       r = mstate->reply_list;
+       mstate->reply_list = NULL;
+       for(; r; r = r->next) {
+               /* If address info is returned, it means the action should be an
+               * 'inform' variant and the information should be logged. */
+               if(actinfo.addrinfo) {
+                       respip_inform_print(&actinfo, r->qname,
+                               qstate->qinfo.qtype, qstate->qinfo.qclass,
+                               r->local_alias, &r->query_reply);
+
+                       if(qstate->env->cfg->stat_extended && actinfo.rpz_used) {
+                               if(actinfo.rpz_disabled)
+                                       qstate->env->mesh->rpz_action[RPZ_DISABLED_ACTION]++;
+                               if(actinfo.rpz_cname_override)
+                                       qstate->env->mesh->rpz_action[RPZ_CNAME_OVERRIDE_ACTION]++;
+                               else
+                                       qstate->env->mesh->rpz_action[
+                                               respip_action_to_rpz_action(actinfo.action)]++;
+                       }
+               }
+
+               r_buffer = r->query_reply.c->buffer;
+               if(r->query_reply.c->tcp_req_info)
+                       r_buffer = r->query_reply.c->tcp_req_info->spool_buffer;
+               mesh_send_reply(mstate, LDNS_RCODE_NOERROR, msg->rep,
+                       r, r_buffer, prev, prev_buffer);
+               if(r->query_reply.c->tcp_req_info)
+                       tcp_req_info_remove_mesh_state(r->query_reply.c->tcp_req_info, mstate);
+               prev = r;
+               prev_buffer = r_buffer;
+
+               /* Account for each reply sent. */
+               mesh->ans_expired++;
+
+       }
+       while((c = mstate->cb_list) != NULL) {
+               /* take this cb off the list; so that the list can be
+                * changed, eg. by adds from the callback routine */
+               if(!mstate->reply_list && mstate->cb_list && !c->next) {
+                       /* was a reply state, not anymore */
+                       log_assert(qstate->env->mesh->num_reply_states > 0);
+                       qstate->env->mesh->num_reply_states--;
+               }
+               mstate->cb_list = c->next;
+               if(!mstate->reply_list && !mstate->cb_list &&
+                       mstate->super_set.count == 0)
+                       qstate->env->mesh->num_detached_states++;
+               mesh_do_callback(mstate, LDNS_RCODE_NOERROR, msg->rep, c);
+       }
+       if(!mstate->reply_list && !mstate->cb_list) {
+               log_assert(mesh->num_reply_states > 0);
+               mesh->num_reply_states--;
+               if(mstate->super_set.count == 0) {
+                       mesh->num_detached_states++;
+               }
+       }
+}
index 9c2b2c97c5e72de425ffed599a58825d7ef83ca0..df2972ac33063cd6a541b479b525fe1c296cac51 100644 (file)
@@ -112,6 +112,8 @@ struct mesh_area {
        size_t stats_jostled;
        /** stats, cumulative number of incoming client msgs dropped */
        size_t stats_dropped;
+       /** stats, number of expired replies sent */
+       size_t ans_expired;
        /** number of replies sent */
        size_t replies_sent;
        /** sum of waiting times for the replies */
@@ -146,6 +148,11 @@ struct mesh_area {
        struct mesh_state* jostle_last;
        /** timeout for jostling. if age is lower, it does not get jostled. */
        struct timeval jostle_max;
+
+       /** If we need to use response ip (value passed from daemon)*/
+       int use_response_ip;
+       /** If we need to use RPZ (value passed from daemon) */
+       int use_rpz;
 };
 
 /**
@@ -647,4 +654,22 @@ void mesh_list_remove(struct mesh_state* m, struct mesh_state** fp,
 void mesh_state_remove_reply(struct mesh_area* mesh, struct mesh_state* m,
        struct comm_point* cp);
 
+/** Callback for when the serve expired client timer has run out.  Tries to
+ * find an expired answer in the cache and reply that to the client.
+ * @param arg: the argument passed to the callback.
+ */
+void mesh_serve_expired_callback(void* arg);
+
+/**
+ * Try to get a (expired) cached answer.
+ * This needs to behave like the worker's answer_from_cache() in order to have
+ * the same behavior as when replying from cache.
+ * @param qstate: the module qstate.
+ * @param lookup_qinfo: the query info to look for in the cache.
+ * @return dns_msg if a cached answer was found, otherwise NULL.
+ */
+struct dns_msg*
+mesh_serve_expired_lookup(struct module_qstate* qstate,
+       struct query_info* lookup_qinfo);
+
 #endif /* SERVICES_MESH_H */
index 8d75d7282ce3ad95ca89a8cd30f6a4c0d7f5122e..4843a9b3112bc99e3da51f480c18dd9c0f8f6342 100644 (file)
@@ -211,7 +211,7 @@ static void pr_stats(const char* nm, struct ub_stats_info* s)
                s->svr.num_queries - s->svr.num_queries_missed_cache);
        PR_UL_NM("num.cachemiss", s->svr.num_queries_missed_cache);
        PR_UL_NM("num.prefetch", s->svr.num_queries_prefetch);
-       PR_UL_NM("num.zero_ttl", s->svr.zero_ttl_responses);
+       PR_UL_NM("num.expired", s->svr.ans_expired);
        PR_UL_NM("num.recursivereplies", s->mesh_replies_sent);
 #ifdef USE_DNSCRYPT
     PR_UL_NM("num.dnscrypt.crypted", s->svr.num_query_dnscrypt_crypted);
index 0cce0b4901057c955d7cf58fe165a43f70b140b6..5132cdacbd47310f4e416b13247295a3bea69dcd 100644 (file)
  *     o CHECK_ANSWER - followed by entry
  *     o CHECK_OUT_QUERY - followed by entry (if copy-id it is also reply).
  *     o REPLY - followed by entry
- *      o TIMEOUT
- *      o TIME_PASSES ELAPSE [seconds] - increase 'now' time counter, can be 
- *                             a floating point number.
- *        TIME_PASSES EVAL [macro] - expanded for seconds to move time.
- *      o TRAFFIC - like CHECK_ANSWER, causes traffic to flow.
+ *     o TIMEOUT
+ *     o TIME_PASSES ELAPSE [seconds] - increase 'now' time counter, can be
+ *             a floating point number.
+ *       TIME_PASSES EVAL [macro] - expanded for seconds to move time.
+ *     o TRAFFIC - like CHECK_ANSWER, causes traffic to flow.
  *             actually the traffic flows before this step is taken.
  *             the step waits for traffic to stop.
- *      o CHECK_AUTOTRUST [id] - followed by FILE_BEGIN [to match] FILE_END.
- *             The file contents is macro expanded before match.
- *      o CHECK_TEMPFILE [fname] - followed by FILE_BEGIN [to match] FILE_END
- *      o INFRA_RTT [ip] [dp] [rtt] - update infra cache entry with rtt.
- *      o ERROR
+ *     o CHECK_AUTOTRUST [id] - followed by FILE_BEGIN [to match] FILE_END.
+ *             The file contents is macro expanded before match.
+ *     o CHECK_TEMPFILE [fname] - followed by FILE_BEGIN [to match] FILE_END
+ *     o INFRA_RTT [ip] [dp] [rtt] - update infra cache entry with rtt.
+ *     o ERROR
  * ; following entry starts on the next line, ENTRY_BEGIN.
  * ; more STEP items
  * SCENARIO_END
diff --git a/testdata/serve_expired.rpl b/testdata/serve_expired.rpl
new file mode 100644 (file)
index 0000000..1674703
--- /dev/null
@@ -0,0 +1,122 @@
+; config options
+server:
+       module-config: "validator iterator"
+       qname-minimisation: "no"
+       minimal-responses: no
+       serve-expired: yes
+       access-control: 127.0.0.1/32 allow_snoop
+
+stub-zone:
+       name: "example.com"
+       stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired
+; Scenario overview:
+; - query for example.com. IN A
+; - check that we get an answer for example.com. IN A with the correct TTL
+; - query again (without the RD bit) right after the TTL expired
+; - check that we get the expired cached answer (this should trigger prefetching)
+; - query with RD bit and check that the cached record was updated
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+       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.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. 10 IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; Query with RD flag
+STEP 1 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer (should be cached)
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. 10 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+; Wait for the TTL to expire
+STEP 11 TIME_PASSES ELAPSE 3601
+
+; Query again without RD bit
+STEP 30 QUERY
+ENTRY_BEGIN
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got a stale answer
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  30 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 30 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 30 IN A 1.2.3.4
+ENTRY_END
+
+; Query with RD bit (the record should have been prefetched)
+STEP 50 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+STEP 60 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  10 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_client_timeout.rpl b/testdata/serve_expired_client_timeout.rpl
new file mode 100644 (file)
index 0000000..3f3163a
--- /dev/null
@@ -0,0 +1,127 @@
+; config options
+server:
+       module-config: "validator iterator"
+       qname-minimisation: "no"
+       minimal-responses: no
+       serve-expired: yes
+       serve-expired-client-timeout: 1
+       serve-expired-reply-ttl: 123
+
+stub-zone:
+       name: "example.com"
+       stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired with client-timeout and reply-ttl
+; Scenario overview:
+; - query for example.com. IN A
+; - check that we get an answer for example.com. IN A with the correct TTL
+; - query again right after the TTL expired
+; - check that we get the expired cached answer with the configured reply ttl
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+       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.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 20
+       ADDRESS 1.2.3.4
+       ; response to A query
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. 10 IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; Query with RD flag
+STEP 1 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer (should be cached)
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. 10 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+; Wait for the TTL to expire
+STEP 11 TIME_PASSES ELAPSE 3600
+
+; Query again
+STEP 30 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Allow the client timer to expire
+STEP 31 TIME_PASSES ELAPSE 1
+
+; Check that we got a stale answer
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  123 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 123 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 123 IN A 1.2.3.4
+ENTRY_END
+
+; Reply to the outstanding query so that the test doesn't fail with
+; pending messages.
+STEP 41 REPLY
+ENTRY_BEGIN
+       MATCH opcode qtype qname
+       ADJUST copy_id
+       ; authoritative answer
+       REPLY QR AA RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  3600 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 3600 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 3600 IN A 1.2.3.4
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_reply_ttl.rpl b/testdata/serve_expired_reply_ttl.rpl
new file mode 100644 (file)
index 0000000..c45b838
--- /dev/null
@@ -0,0 +1,103 @@
+; config options
+server:
+       module-config: "validator iterator"
+       qname-minimisation: "no"
+       minimal-responses: no
+       serve-expired: yes
+       serve-expired-reply-ttl: 123
+
+stub-zone:
+       name: "example.com"
+       stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired with reply-ttl
+; Scenario overview:
+; - query for example.com. IN A
+; - check that we get an answer for example.com. IN A with the correct TTL
+; - query again right after the TTL expired
+; - check that we get the expired cached answer with the configured TTL
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+       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.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. 10 IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; Query with RD flag
+STEP 1 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer (should be cached)
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. 10 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+; Wait for the TTL to expire
+STEP 11 TIME_PASSES ELAPSE 3601
+
+; Query again
+STEP 30 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got a stale answer
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  123 A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 123 NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 123 A 1.2.3.4
+ENTRY_END
+
+; Give time for the pending query to get answered
+STEP 41 TRAFFIC
+
+SCENARIO_END
diff --git a/testdata/serve_expired_servfail.rpl b/testdata/serve_expired_servfail.rpl
new file mode 100644 (file)
index 0000000..80ffcde
--- /dev/null
@@ -0,0 +1,117 @@
+; config options
+server:
+       module-config: "validator iterator"
+       qname-minimisation: "no"
+       minimal-responses: no
+       serve-expired: yes
+       serve-expired-client-timeout: 1800
+       serve-expired-reply-ttl: 123
+       log-servfail: yes
+
+
+stub-zone:
+       name: "example.com"
+       stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired with client-timeout and a SERVFAIL upstream reply
+; Scenario overview:
+; - query for example.com. IN A
+; - check that we get an answer for example.com. IN A with the correct TTL
+; - query again right after the TTL expired
+; - answer from upstream is servfail
+; - check that we get the expired cached answer instead
+
+; ns.example.com.
+RANGE_BEGIN 0 20
+       ADDRESS 1.2.3.4
+       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.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. 10 IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 30 100
+       ADDRESS 1.2.3.4
+       ; response to A query
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR AA SERVFAIL
+               SECTION QUESTION
+                       example.com. IN A
+       ENTRY_END
+RANGE_END
+
+; Query with RD flag
+STEP 1 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer (should be cached)
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. 10 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+; Wait for the TTL to expire
+STEP 11 TIME_PASSES ELAPSE 3601
+
+; Query again
+STEP 30 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got a stale answer
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  123 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 123 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 123 IN A 1.2.3.4
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_ttl.rpl b/testdata/serve_expired_ttl.rpl
new file mode 100644 (file)
index 0000000..df4ecb8
--- /dev/null
@@ -0,0 +1,100 @@
+; config options
+server:
+       module-config: "validator iterator"
+       qname-minimisation: "no"
+       minimal-responses: no
+       serve-expired: yes
+       serve-expired-ttl: 10
+
+stub-zone:
+       name: "example.com"
+       stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired
+; Scenario overview:
+; - query for example.com. IN A
+; - check that we get an answer for example.com. IN A with the correct TTL
+; - query again right after the TTL expired + serve-expired-ttl
+; - check that we get an updated answer and not the cached one
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+       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.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; Query with RD flag
+STEP 1 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer (should be cached)
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+; Wait for the TTL to expire + serve-expired-ttl
+STEP 11 TIME_PASSES ELAPSE 3611
+
+; Query again
+STEP 30 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got an updated answer
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_ttl_client_timeout.rpl b/testdata/serve_expired_ttl_client_timeout.rpl
new file mode 100644 (file)
index 0000000..169d070
--- /dev/null
@@ -0,0 +1,128 @@
+; config options
+server:
+       module-config: "validator iterator"
+       qname-minimisation: "no"
+       minimal-responses: no
+       serve-expired: yes
+       serve-expired-ttl: 10
+       serve-expired-client-timeout: 1
+
+stub-zone:
+       name: "example.com"
+       stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test serve-expired
+; Scenario overview:
+; - query for example.com. IN A
+; - check that we get an answer for example.com. IN A with the correct TTL
+; - query again right after the TTL expired + serve-expired-ttl
+; - check that we get an updated answer and not the cached one
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+       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.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 20
+       ADDRESS 1.2.3.4
+       ; response to A query
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; Query with RD flag
+STEP 1 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer (should be cached)
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+; Wait for the TTL to expire + serve-expired-ttl
+STEP 11 TIME_PASSES ELAPSE 3611
+
+; Query again
+STEP 30 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Allow the client timer to expire
+STEP 31 TIME_PASSES ELAPSE 1
+
+; We shouldn't get a reply here.
+; There is cached data but serve-expired-ttl has passed.
+
+STEP 40 REPLY
+ENTRY_BEGIN
+       MATCH opcode qtype qname
+       ADJUST copy_id
+       ; authoritative answer
+       REPLY QR AA RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  3600 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 3600 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 3600 IN A 1.2.3.4
+ENTRY_END
+
+; Check that we got the updated answer
+STEP 41 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com.  IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/serve_expired_zerottl.rpl b/testdata/serve_expired_zerottl.rpl
new file mode 100644 (file)
index 0000000..846435f
--- /dev/null
@@ -0,0 +1,154 @@
+; config options
+server:
+       module-config: "validator iterator"
+       qname-minimisation: "no"
+       minimal-responses: no
+       serve-expired: yes
+       serve-expired-reply-ttl: 123
+
+stub-zone:
+       name: "example.com"
+       stub-addr: 1.2.3.4
+CONFIG_END
+
+SCENARIO_BEGIN Test 0 TLL with serve-expired
+; Scenario overview:
+; - query for example.com. IN A
+; - check that we get an answer for example.com. IN A with the correct 0 TTL
+; - query again; this time the answer has >0 TTL
+; - check the answer
+; - query one last time after expiration
+; - check that the configured reply ttl is used
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+       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.com.
+               SECTION ADDITIONAL
+                       ns.example.com. IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 0 10
+       ADDRESS 1.2.3.4
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. 0 IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. 0 IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. 0 IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 11 100
+       ADDRESS 1.2.3.4
+       ENTRY_BEGIN
+               MATCH opcode qtype qname
+               ADJUST copy_id
+               REPLY QR NOERROR
+               SECTION QUESTION
+                       example.com. IN A
+               SECTION ANSWER
+                       example.com. 10 IN A 5.6.7.8
+               SECTION AUTHORITY
+                       example.com. 10 IN NS ns.example.com.
+               SECTION ADDITIONAL
+                       ns.example.com. 10 IN A 1.2.3.4
+       ENTRY_END
+RANGE_END
+
+; Let some time to pass so that timenow > 0
+STEP 1 TIME_PASSES ELAPSE 3600
+
+; Query with RD flag
+STEP 2 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer with 0 TTL
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. 0 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com.  0 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 0 IN A 1.2.3.4
+ENTRY_END
+
+; Let some time to pass
+STEP 11 TIME_PASSES ELAPSE 1
+
+; Query with RD flag
+STEP 20 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer
+STEP 29 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. 10 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 10 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 10 IN A 1.2.3.4
+ENTRY_END
+
+; Wait for the TTL to expire
+STEP 30 TIME_PASSES ELAPSE 11
+
+; Query with RD flag
+STEP 40 QUERY
+ENTRY_BEGIN
+       REPLY RD
+       SECTION QUESTION
+               example.com. IN A
+ENTRY_END
+
+; Check that we got the correct answer
+STEP 49 CHECK_ANSWER
+ENTRY_BEGIN
+       MATCH all ttl
+       REPLY QR RD RA NOERROR
+       SECTION QUESTION
+               example.com. IN A
+       SECTION ANSWER
+               example.com. 123 IN A 5.6.7.8
+       SECTION AUTHORITY
+               example.com. 123 IN NS ns.example.com.
+       SECTION ADDITIONAL
+               ns.example.com. 123 IN A 1.2.3.4
+ENTRY_END
+
+; Give time for the pending query to get answered
+STEP 50 TRAFFIC
+
+SCENARIO_END
index 027228135abf87846ef958190bbfb9c40fa14ea0..c7edba5489a4ed5ccdcc1304e7764012fbabc1af 100644 (file)
@@ -246,6 +246,8 @@ config_create(void)
        cfg->serve_expired = 0;
        cfg->serve_expired_ttl = 0;
        cfg->serve_expired_ttl_reset = 0;
+       cfg->serve_expired_reply_ttl = 30;
+       cfg->serve_expired_client_timeout = 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 */
@@ -327,9 +329,14 @@ config_create(void)
        cfg->ipsecmod_strict = 0;
 #endif
 #ifdef USE_CACHEDB
-       cfg->cachedb_backend = NULL;
-       cfg->cachedb_secret = NULL;
-#endif
+       if(!(cfg->cachedb_backend = strdup("testframe"))) goto error_exit;
+       if(!(cfg->cachedb_secret = strdup("default"))) goto error_exit;
+#ifdef USE_REDIS
+       if(!(cfg->redis_server_host = strdup("127.0.0.1"))) goto error_exit;
+       cfg->redis_timeout = 100;
+       cfg->redis_server_port = 6379;
+#endif  /* USE_REDIS */
+#endif  /* USE_CACHEDB */
 #ifdef USE_IPSET
        cfg->ipset_name_v4 = NULL;
        cfg->ipset_name_v6 = NULL;
@@ -581,10 +588,15 @@ int config_set_option(struct config_file* cfg, const char* opt,
        else S_YNO("val-permissive-mode:", val_permissive_mode)
        else S_YNO("aggressive-nsec:", aggressive_nsec)
        else S_YNO("ignore-cd-flag:", ignore_cd)
-       else S_YNO("serve-expired:", serve_expired)
+       else if(strcmp(opt, "serve-expired:") == 0)
+       { IS_YES_OR_NO; cfg->serve_expired = (strcmp(val, "yes") == 0);
+         SERVE_EXPIRED = cfg->serve_expired; }
        else if(strcmp(opt, "serve-expired-ttl:") == 0)
        { IS_NUMBER_OR_ZERO; cfg->serve_expired_ttl = atoi(val); SERVE_EXPIRED_TTL=(time_t)cfg->serve_expired_ttl;}
        else S_YNO("serve-expired-ttl-reset:", serve_expired_ttl_reset)
+       else if(strcmp(opt, "serve-expired-reply-ttl:") == 0)
+       { 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_UNSIGNED_OR_ZERO("add-holddown:", add_holddown)
        else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown)
@@ -977,6 +989,8 @@ config_get_option(struct config_file* cfg, const char* opt,
        else O_YNO(opt, "serve-expired", serve_expired)
        else O_DEC(opt, "serve-expired-ttl", serve_expired_ttl)
        else O_YNO(opt, "serve-expired-ttl-reset", serve_expired_ttl_reset)
+       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_UNS(opt, "add-holddown", add_holddown)
        else O_UNS(opt, "del-holddown", del_holddown)
@@ -1098,7 +1112,12 @@ config_get_option(struct config_file* cfg, const char* opt,
 #ifdef USE_CACHEDB
        else O_STR(opt, "backend", cachedb_backend)
        else O_STR(opt, "secret-seed", cachedb_secret)
-#endif
+#ifdef USE_REDIS
+       else O_STR(opt, "redis-server-host", redis_server_host)
+       else O_DEC(opt, "redis-server-port", redis_server_port)
+       else O_DEC(opt, "redis-timeout", redis_timeout)
+#endif  /* USE_REDIS */
+#endif  /* USE_CACHEDB */
 #ifdef USE_IPSET
        else O_STR(opt, "name-v4", ipset_name_v4)
        else O_STR(opt, "name-v6", ipset_name_v6)
@@ -1448,7 +1467,10 @@ config_delete(struct config_file* cfg)
 #ifdef USE_CACHEDB
        free(cfg->cachedb_backend);
        free(cfg->cachedb_secret);
-#endif
+#ifdef USE_REDIS
+       free(cfg->redis_server_host);
+#endif  /* USE_REDIS */
+#endif  /* USE_CACHEDB */
 #ifdef USE_IPSET
        free(cfg->ipset_name_v4);
        free(cfg->ipset_name_v6);
@@ -1964,7 +1986,9 @@ config_apply(struct config_file* config)
 {
        MAX_TTL = (time_t)config->max_ttl;
        MIN_TTL = (time_t)config->min_ttl;
+       SERVE_EXPIRED = config->serve_expired;
        SERVE_EXPIRED_TTL = (time_t)config->serve_expired_ttl;
+       SERVE_EXPIRED_REPLY_TTL = (time_t)config->serve_expired_reply_ttl;
        MAX_NEG_TTL = (time_t)config->max_negative_ttl;
        RTT_MIN_TIMEOUT = config->infra_cache_min_rtt;
        EDNS_ADVERTISED_SIZE = (uint16_t)config->edns_buffer_size;
index 72f44aba4fabfe1c9bcf64cc5bd3f45bbd520bc4..8739ca2ae1e850ac794cc1cb83f24282aadbb2e8 100644 (file)
@@ -362,6 +362,11 @@ struct config_file {
        int serve_expired_ttl;
        /** reset serve expired TTL after failed update attempt */
        int serve_expired_ttl_reset;
+       /** TTL for the serve expired replies */
+       int serve_expired_reply_ttl;
+       /** serve expired entries only after trying to update the entries and this
+        *  timeout (in milliseconds) is reached */
+       int serve_expired_client_timeout;
        /** nsec3 maximum iterations per key size, string */
        char* val_nsec3_key_iterations;
        /** autotrust add holddown time, in seconds */
index 462820cef461c12f291033d693c7056cafee776b..3b31bb02bb9cb741996edd259b7f63ceccb2dd36 100644 (file)
@@ -1,7 +1,7 @@
 #include "config.h"
 #include "util/configyyrename.h"
 
-#line 3 "<stdout>"
+#line 2 "<stdout>"
 
 #define  YY_INT_ALIGNED short int
 
@@ -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 300
-#define YY_END_OF_BUFFER 301
+#define YY_NUM_RULES 302
+#define YY_END_OF_BUFFER 303
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -363,333 +363,336 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static const flex_int16_t yy_accept[2961] =
+static const flex_int16_t yy_accept[2986] =
     {   0,
-        1,    1,  282,  282,  286,  286,  290,  290,  294,  294,
-        1,    1,  301,  298,    1,  280,  280,  299,    2,  299,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  282,  283,  283,  284,  299,  286,  287,  287,
-      288,  299,  293,  290,  291,  291,  292,  299,  294,  295,
-      295,  296,  299,  297,  281,    2,  285,  299,  297,  298,
-        0,    1,    2,    2,    2,    2,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      282,    0,  286,    0,  293,    0,  290,  294,    0,  297,
-        0,    2,    2,  297,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  297,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  112,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  120,  298,  298,  298,  298,
-      298,  298,  298,  297,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,   96,  298,
-      298,  298,  298,  298,  298,    8,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  113,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  125,  298,  297,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  275,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  297,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,   54,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  220,  298,   14,   15,  298,   18,   17,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  119,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  204,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-        3,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  297,  298,  298,  298,  298,  298,  298,
-      298,  270,  298,  298,  269,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  289,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,   57,  298,  244,  298,  298,  298,  298,
-      298,  298,  298,  298,  276,  277,  298,  298,  298,  298,
-      298,   58,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  116,  298,  298,
-      298,  298,  298,  298,  298,  298,  193,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,   20,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  144,  298,  298,  289,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,   94,
-      298,  298,  298,  298,  298,  298,  298,  252,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      165,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  143,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,   93,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,   31,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,   32,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,   55,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  118,  298,  298,  298,  298,
-      298,  111,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,   56,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  166,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,   45,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  235,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,   49,  298,   50,  298,  298,  298,
-      298,  298,   97,  298,   98,  298,  298,  298,  298,   95,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,    7,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  213,  298,  298,  298,
-      298,  146,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,   46,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  185,  298,  184,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,   16,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,   59,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  192,
-
-      298,  298,  298,  298,  298,  298,  100,  298,   99,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  176,
-      298,  298,  298,  298,  298,  298,  298,  298,  126,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,   78,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,   82,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,   53,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      179,  180,  298,  298,  298,  246,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,    6,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  250,
-      298,  298,  298,  298,  298,  298,  271,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,   41,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-       43,  298,  298,  298,  298,  298,  298,  298,  298,  172,
-      298,  298,  298,  121,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  197,  298,  173,  298,  298,  298,
-      210,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,   44,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  123,  105,  298,
-      106,  298,  298,  298,  104,  298,  298,  298,  298,  298,
-      298,  298,  298,  141,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  234,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  174,  298,  298,  298,  298,  298,
-      177,  298,  183,  298,  298,  298,  298,  298,  209,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,   92,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  117,  298,  298,  298,  298,  298,  298,   51,  298,
-      298,  298,   25,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,   19,  298,  298,  298,  298,  298,  298,   26,
-       35,  298,  151,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,   67,   69,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  254,  298,  298,
-      298,  221,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      107,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      140,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  265,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  145,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  203,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  274,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      162,  298,  298,  298,  298,  298,  298,  298,  298,  101,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  157,
-      298,  167,  298,  298,  298,  298,  298,  129,  298,  298,
-      298,  298,  298,   88,  298,  298,  298,  298,  195,  298,
-      298,  298,  298,  298,  298,  211,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  226,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  122,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  161,
-      298,  298,  298,  298,  298,   70,   71,  298,  298,  298,
-      298,  298,   52,  298,  298,  298,  298,  298,   77,  168,
-      298,  186,  298,  214,  298,  298,  178,  247,  298,  298,
-      298,  298,  298,   63,  298,  170,  298,  298,  298,  298,
-      298,    9,  298,  298,  298,   91,  298,  298,  298,  298,
-      239,  298,  298,  298,  194,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  160,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  147,  298,  253,  298,  298,  298,  298,
-      225,  298,  298,  298,  298,  298,  298,  298,  298,  205,
-      298,  298,  298,  298,  245,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  268,
-      298,  169,  298,  298,  298,  298,  298,  298,  298,   62,
-       64,  298,  298,  298,  298,  298,  298,  298,   90,  298,
-      298,  298,  298,  237,  298,  298,  298,  249,  298,  298,
-
-      298,  298,  298,  298,  298,  298,  298,  199,   33,   27,
-       29,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-       34,  298,   28,   30,  298,  298,  298,  298,  298,  298,
-      298,  298,   87,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      201,  198,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,   61,  298,  298,  124,
-      298,  108,  298,  298,  298,  298,  298,  298,  298,  298,
-      142,   13,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  263,  298,  266,  298,  298,  298,  298,  298,  298,
-
-      298,  298,  298,  298,   12,  298,  298,   21,  298,  298,
-      298,  243,  298,  298,  298,  251,  298,  298,  298,   65,
-      298,  207,  298,  298,  200,  298,  298,   60,  298,  298,
-      298,  298,   22,  298,   42,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  156,  155,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  202,  196,
-      298,  212,  298,  298,  255,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,   72,
-      298,  298,  298,  238,  298,  298,  298,  298,  182,  298,
-
-      298,  298,  298,  206,  298,  298,  298,  298,  298,  298,
-      298,  298,  272,  273,  153,  298,  298,   66,  298,  298,
-      163,  298,  298,  102,  103,  298,  298,  298,  298,  148,
-      298,  150,  298,  187,  298,  298,  298,  298,  154,  298,
-      298,  215,  298,  298,  298,  298,  298,  298,  298,  131,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  222,  298,  298,  298,   23,  298,  248,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  188,
-      298,  298,  236,  298,  267,  298,  181,  298,  298,  298,
-      298,   47,  298,  298,  298,  298,    4,  298,  298,  298,
-
-      115,  130,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  218,   36,
-       37,  298,  298,  298,  298,  298,  298,  298,  256,  298,
-      298,  298,  298,  298,  298,  224,  298,  298,  298,  191,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,   75,
-      298,   48,  242,  298,  219,  298,  298,  298,  298,   11,
-      298,  298,  298,  298,  298,  114,  298,  298,  189,   79,
-      298,   39,  298,  298,  298,  298,  298,  298,  298,  298,
-      159,  298,  298,  298,  298,  298,  133,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  223,  127,  298,  298,
-
-      109,  110,  298,  298,  298,   81,   85,   80,  298,   73,
-      298,  298,  298,  298,  298,   10,  298,  298,  298,  240,
-      298,  298,  279,   38,  298,  298,  298,  298,  298,  158,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,   86,   84,
-      298,   74,  264,  298,  298,  298,  298,  298,  298,  298,
-      175,  298,  298,  298,  190,  298,  298,  298,  298,  298,
-      298,  298,  298,  149,   68,  298,  298,  298,  298,  298,
-      257,  298,  298,  298,  298,  298,  298,  298,  128,  298,
-       83,  134,  135,  138,  139,  136,  137,   76,  298,  241,
-
-      298,  298,  152,  298,  298,  298,  298,  298,  217,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  164,   40,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,   89,  298,  216,  298,
-      233,  261,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,    5,  298,  208,  298,  298,  262,  298,  298,
-      298,  298,  298,  298,  298,  298,   24,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      132,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-
-      171,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      258,  298,  298,  298,  298,  298,  298,  298,  298,  298,
-      298,  298,  298,  298,  298,  298,  298,  298,  278,  298,
-      298,  229,  298,  298,  298,  298,  298,  259,  298,  298,
-      298,  298,  298,  298,  260,  298,  298,  298,  227,  298,
-      230,  231,  298,  298,  298,  298,  298,  228,  232,    0
+        1,    1,  284,  284,  288,  288,  292,  292,  296,  296,
+        1,    1,  303,  300,    1,  282,  282,  301,    2,  301,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  284,  285,  285,  286,  301,  288,  289,  289,
+      290,  301,  295,  292,  293,  293,  294,  301,  296,  297,
+      297,  298,  301,  299,  283,    2,  287,  301,  299,  300,
+        0,    1,    2,    2,    2,    2,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      284,    0,  288,    0,  295,    0,  292,  296,    0,  299,
+        0,    2,    2,  299,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  299,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  112,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  120,  300,  300,  300,  300,
+      300,  300,  300,  299,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,   96,  300,
+      300,  300,  300,  300,  300,    8,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  113,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  125,  300,  299,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  277,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  299,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,   54,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  222,  300,   14,   15,  300,   18,   17,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  119,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  206,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+        3,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  299,  300,  300,  300,  300,  300,  300,
+      300,  272,  300,  300,  271,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  291,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,   57,  300,  246,  300,  300,  300,  300,
+      300,  300,  300,  300,  278,  279,  300,  300,  300,  300,
+      300,   58,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  116,  300,  300,
+      300,  300,  300,  300,  300,  300,  195,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,   20,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  144,  300,  300,  291,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,   94,
+      300,  300,  300,  300,  300,  300,  300,  254,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      167,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  143,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,   93,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,   31,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,   32,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,   55,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  118,  300,  300,  300,  300,
+      300,  111,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,   56,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  168,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,   45,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  237,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,   49,  300,   50,  300,  300,  300,
+      300,  300,   97,  300,   98,  300,  300,  300,  300,   95,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,    7,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  215,  300,  300,  300,
+      300,  146,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,   46,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  187,  300,  186,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,   16,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,   59,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  194,
+
+      300,  300,  300,  300,  300,  300,  100,  300,   99,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  178,
+      300,  300,  300,  300,  300,  300,  300,  300,  126,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,   78,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,   82,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,   53,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      181,  182,  300,  300,  300,  248,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,    6,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  252,
+      300,  300,  300,  300,  300,  300,  273,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,   41,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+       43,  300,  300,  300,  300,  300,  300,  300,  300,  174,
+      300,  300,  300,  121,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  199,  300,  175,  300,  300,  300,
+      212,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,   44,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  123,  105,  300,
+      106,  300,  300,  300,  104,  300,  300,  300,  300,  300,
+      300,  300,  300,  141,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  236,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  176,  300,  300,  300,  300,  300,
+      179,  300,  185,  300,  300,  300,  300,  300,  211,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,   92,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  117,  300,  300,  300,  300,  300,  300,   51,  300,
+      300,  300,   25,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,   19,  300,  300,  300,  300,  300,  300,   26,
+       35,  300,  151,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,   67,   69,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  256,  300,  300,
+      300,  223,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      107,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      140,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  267,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  145,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  205,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  276,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      162,  300,  300,  300,  300,  300,  300,  300,  300,  101,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  157,
+      300,  169,  300,  300,  300,  300,  300,  129,  300,  300,
+      300,  300,  300,   88,  300,  300,  300,  300,  197,  300,
+      300,  300,  300,  300,  300,  213,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  228,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  122,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  161,
+      300,  300,  300,  300,  300,   70,   71,  300,  300,  300,
+      300,  300,   52,  300,  300,  300,  300,  300,   77,  170,
+      300,  188,  300,  216,  300,  300,  180,  249,  300,  300,
+      300,  300,  300,   63,  300,  172,  300,  300,  300,  300,
+      300,    9,  300,  300,  300,   91,  300,  300,  300,  300,
+      241,  300,  300,  300,  196,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  160,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  147,  300,  255,  300,  300,
+      300,  300,  227,  300,  300,  300,  300,  300,  300,  300,
+      300,  207,  300,  300,  300,  300,  247,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  270,  300,  171,  300,  300,  300,  300,  300,  300,
+      300,   62,   64,  300,  300,  300,  300,  300,  300,  300,
+       90,  300,  300,  300,  300,  239,  300,  300,  300,  251,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  201,   33,   27,   29,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,   34,  300,   28,   30,  300,  300,
+      300,  300,  300,  300,  300,  300,   87,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  203,  200,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+       61,  300,  300,  124,  300,  108,  300,  300,  300,  300,
+      300,  300,  300,  300,  142,   13,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  265,  300,  268,  300,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,   12,  300,
+      300,   21,  300,  300,  300,  245,  300,  300,  300,  253,
+      300,  300,  300,   65,  300,  209,  300,  300,  300,  300,
+      202,  300,  300,   60,  300,  300,  300,  300,   22,  300,
+       42,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  156,  155,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  204,  198,  300,  214,  300,  300,
+      257,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,   72,  300,  300,  300,  240,
+
+      300,  300,  300,  300,  184,  300,  300,  300,  300,  208,
+      300,  300,  300,  300,  300,  300,  300,  300,  274,  275,
+      153,  300,  300,   66,  300,  300,  300,  300,  163,  300,
+      300,  102,  103,  300,  300,  300,  300,  148,  300,  150,
+      300,  189,  300,  300,  300,  300,  154,  300,  300,  217,
+      300,  300,  300,  300,  300,  300,  300,  131,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  224,
+      300,  300,  300,   23,  300,  250,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  190,  300,  300,
+      238,  300,  269,  300,  183,  300,  300,  300,  300,   47,
+
+      300,  300,  300,  300,    4,  300,  300,  300,  115,  130,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  220,   36,
+       37,  300,  300,  300,  300,  300,  300,  300,  258,  300,
+      300,  300,  300,  300,  300,  226,  300,  300,  300,  193,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,   75,
+      300,   48,  244,  300,  221,  300,  300,  300,  300,   11,
+      300,  300,  300,  300,  300,  114,  300,  300,  300,  300,
+      191,   79,  300,   39,  300,  300,  300,  300,  300,  300,
+      300,  300,  159,  300,  300,  300,  300,  300,  133,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  225,  127,
+      300,  300,  109,  110,  300,  300,  300,   81,   85,   80,
+      300,   73,  300,  300,  300,  300,  300,   10,  300,  300,
+      300,  242,  300,  300,  300,  300,  281,   38,  300,  300,
+      300,  300,  300,  158,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,   86,   84,  300,   74,  266,  300,  300,  300,
+      300,  300,  300,  300,  177,  300,  300,  300,  300,  300,
+      192,  300,  300,  300,  300,  300,  300,  300,  300,  149,
+       68,  300,  300,  300,  300,  300,  259,  300,  300,  300,
+
+      300,  300,  300,  300,  128,  300,   83,  134,  135,  138,
+      139,  136,  137,   76,  300,  243,  300,  300,  300,  300,
+      152,  300,  300,  300,  300,  300,  219,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  165,  164,   40,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,   89,  300,  218,
+      300,  235,  263,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,    5,  300,  300,  210,  300,  300,  264,
+      300,  300,  300,  300,  300,  300,  300,  300,   24,  300,
+
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  300,  132,  300,  300,  300,  300,  300,
+      300,  300,  300,  166,  300,  173,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  260,  300,  300,  300,  300,
+      300,  300,  300,  300,  300,  300,  300,  300,  300,  300,
+      300,  300,  300,  280,  300,  300,  231,  300,  300,  300,
+      300,  300,  261,  300,  300,  300,  300,  300,  300,  262,
+      300,  300,  300,  229,  300,  232,  233,  300,  300,  300,
+      300,  300,  230,  234,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -732,15 +735,15 @@ static const YY_CHAR yy_meta[41] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static const flex_int16_t yy_base[2975] =
+static const flex_int16_t yy_base[3000] =
     {   0,
         0,    0,   38,   41,   44,   46,   59,   65,   71,   77,
-       90,  112, 4198, 4028,   81, 5768, 5768, 5768,   96,   52,
+       90,  112, 4280, 4028,   81, 5813, 5813, 5813,   96,   52,
       106,   63,  107,  111,   70,  128,  130,  133,   57,   88,
        76,  135,  141,  117,  148,  145,  160,  164,  185,  177,
-      189,  152, 3954, 5768, 5768, 5768,  107, 3854, 5768, 5768,
-     5768,  165, 3105, 2544, 5768, 5768, 5768,  211, 2291, 5768,
-     5768, 5768,  180, 2178, 5768,  217, 5768,  221,  168, 1832,
+      189,  152, 3954, 5813, 5813, 5813,  107, 3854, 5813, 5813,
+     5813,  165, 3105, 2544, 5813, 5813, 5813,  211, 2291, 5813,
+     5813, 5813,  180, 2178, 5813,  217, 5813,  221,  168, 1832,
       225,  231,    0,  237,    0,    0,  226,  231,   85,  180,
       114,  238,  239,  156,  234,  206,  240,  232,  200,  132,
       253,  244,  245,  248,  256,  257,  264,  271,  249,  277,
@@ -769,9 +772,9 @@ static const flex_int16_t yy_base[2975] =
 
       700,  701,  702,  711,  704,  712,  713,  726,  731,  721,
       732,  733,  735,  737,  740,  748,  739,  746,  743,  750,
-      752,  753,  762,  758, 5768,  757,  760,  773,  766,  774,
+      752,  753,  762,  758, 5813,  757,  760,  773,  766,  774,
       775,  776,  781,  782,  763,  789,  787,  788,  792,  814,
-      796,  798,  794,  803,  806, 5768,  804,  808,  838,  810,
+      796,  798,  794,  803,  806, 5813,  804,  808,  838,  810,
       812,  832,  828,  824,  827,  829,  839,  836,  849,  842,
       847,  851,  862,  858,  859,  860,  861,  864,  863,  877,
       872,  870,  799,  874,  889,  875,  882,  886,  887,  892,
@@ -780,21 +783,21 @@ static const flex_int16_t yy_base[2975] =
 
       942,  943,  937,  944,  947,  950,  951,  952,  953,  961,
       958,  959,  963,  964,  966,  967,  970,  972,  973,  975,
-      977,  979,  978,  985,  988,  981,  994,  989, 5768,  996,
-      998,  999, 1000, 1001, 1003, 5768, 1004, 1005, 1006, 1014,
+      977,  979,  978,  985,  988,  981,  994,  989, 5813,  996,
+      998,  999, 1000, 1001, 1003, 5813, 1004, 1005, 1006, 1014,
      1017, 1016, 1013, 1023, 1027, 1028, 1029, 1030, 1039, 1012,
      1041, 1040, 1036, 1042, 1046, 1048, 1049, 1051, 1052, 1054,
-     1055, 1057, 1060, 1077, 5768, 1061, 1064, 1062, 1063, 1070,
+     1055, 1057, 1060, 1077, 5813, 1061, 1064, 1062, 1063, 1070,
      1080, 1089, 1072, 1090, 1088, 1065, 1105, 1092, 1106, 1100,
      1101, 1111, 1102, 1113, 1107, 1116, 1115, 1117, 1118, 1119,
-     1120, 1125, 1126, 1131, 5768, 1133, 1134, 1145, 1135, 1143,
+     1120, 1125, 1126, 1131, 5813, 1133, 1134, 1145, 1135, 1143,
 
      1132, 1146, 1148, 1149, 1150, 1152, 1153, 1156, 1162, 1172,
      1157, 1174, 1159, 1170, 1175, 1176, 1177, 1178, 1179, 1180,
      1193, 1184, 1186, 1200, 1207, 1203, 1205, 1212, 1190, 1210,
      1209, 1208, 1215, 1216, 1217, 1218, 1220, 1221, 1230, 1228,
      1226, 1229, 1231, 1242, 1233, 1235, 1240, 1237, 1245, 1247,
-     1253, 1254, 1250, 1256, 5768, 1263, 1260, 1267, 1262, 1268,
+     1253, 1254, 1250, 1256, 5813, 1263, 1260, 1267, 1262, 1268,
      1272, 1274, 1261, 1276, 1278, 1280, 1281, 1282, 1284, 1287,
      1289, 1290, 1291, 1292, 1301, 1297, 1307, 1314, 1313, 1315,
      1299, 1305, 1324, 1321, 1328, 1327, 1329, 1337, 1325, 1332,
@@ -806,595 +809,601 @@ static const flex_int16_t yy_base[2975] =
      1416, 1417, 1418, 1419, 1420, 1423, 1424, 1183, 1425, 1440,
      1426, 1430, 1438, 1441, 1447, 1446, 1450, 1454, 1444, 1456,
      1457, 1458, 1460, 1461, 1465, 1464, 1471, 1468, 1474, 1476,
-     1478, 1477, 1480, 1484, 1487, 1481, 5768, 1488, 1495, 1494,
+     1478, 1477, 1480, 1484, 1487, 1481, 5813, 1488, 1495, 1494,
      1496, 1497, 1499, 1501, 1508, 1503, 1505, 1504, 1506, 1510,
-     1516, 5768, 1517, 5768, 5768, 1520, 5768, 5768, 1518, 1523,
+     1516, 5813, 1517, 5813, 5813, 1520, 5813, 5813, 1518, 1523,
      1526, 1536, 1533, 1543, 1298, 1539, 1541, 1545, 1552, 1566,
 
      1548, 1550, 1551, 1547, 1556, 1561, 1574, 1562, 1549, 1575,
      1577, 1580, 1586, 1513, 1587, 1579, 1554, 1588, 1590, 1589,
      1592, 1595, 1600, 1601, 1594, 1603, 1596, 1611, 1616, 1607,
-     1623, 5768, 1619, 1626, 1631, 1627, 1634, 1630, 1629, 1636,
+     1623, 5813, 1619, 1626, 1631, 1627, 1634, 1630, 1629, 1636,
      1638, 1640, 1641, 1642, 1643, 1645, 1646, 1651, 1604, 1647,
-     1659, 1654, 5768, 1657, 1658, 1656, 1662, 1669, 1663, 1664,
+     1659, 1654, 5813, 1657, 1658, 1656, 1662, 1669, 1663, 1664,
      1670, 1674, 1675, 1682, 1679, 1677, 1684, 1685, 1686, 1687,
-     5768, 1689, 1697, 1693, 1699, 1700, 1702, 1705, 1701, 1706,
+     5813, 1689, 1697, 1693, 1699, 1700, 1702, 1705, 1701, 1706,
      1707, 1708, 1709, 1711, 1715, 1718, 1719, 1720, 1717, 1724,
      1727, 1730, 1735, 1742, 1737, 1739, 1743, 1745, 1746, 1747,
 
      1749, 1750, 1758, 1751, 1760, 1755, 1762, 1767, 1772, 1759,
      1771, 1774, 1764, 1780, 1788, 1784, 1777, 1773, 1796, 1789,
      1793, 1794, 1797, 1799, 1800, 1801, 1803, 1806, 1807, 1808,
-     1810, 5768, 1811, 1816, 5768, 1814, 1817, 1839, 1818, 1820,
+     1810, 5813, 1811, 1816, 5813, 1814, 1817, 1839, 1818, 1820,
      1821, 1823, 1826, 1833, 1825, 1831, 1841, 1843, 1853, 1849,
      1854, 1856, 1859, 1861, 1862, 1865, 1867, 1869, 1878, 1879,
      1883, 1885, 1890, 1870, 1868, 1877, 1896, 1888, 1889, 1891,
-     1899, 1906, 1893, 1901, 1903, 1908, 1912, 1914, 1919, 5768,
+     1899, 1906, 1893, 1901, 1903, 1908, 1912, 1914, 1919, 5813,
      1924, 1925, 1920, 1921, 1932, 1930, 1929, 1933, 1936, 1937,
      1944, 1940, 1941, 1946, 1943, 1947, 1950, 1952, 1956, 1957,
 
-     1962, 1954, 1973, 5768, 1958, 5768, 1955, 1959, 1972, 1975,
-     1976, 1977, 1978, 1980, 5768, 5768, 1981, 1984, 1987, 1996,
-     1982, 5768, 1997, 2004, 2001, 2006, 2000, 1999, 2007, 2008,
-     2011, 2016, 2012, 2023, 2015, 2022, 2020, 5768, 2028, 2018,
-     2024, 2033, 2035, 2036, 2037, 2040, 5768, 2043, 2044, 2047,
+     1962, 1954, 1973, 5813, 1958, 5813, 1955, 1959, 1972, 1975,
+     1976, 1977, 1978, 1980, 5813, 5813, 1981, 1984, 1987, 1996,
+     1982, 5813, 1997, 2004, 2001, 2006, 2000, 1999, 2007, 2008,
+     2011, 2016, 2012, 2023, 2015, 2022, 2020, 5813, 2028, 2018,
+     2024, 2033, 2035, 2036, 2037, 2040, 5813, 2043, 2044, 2047,
      2054, 2046, 2050, 2055, 2058, 2056, 2062, 2063, 2064, 2065,
-     2066, 2075, 2076, 2067, 2078, 2081, 2077, 5768, 2074, 2085,
+     2066, 2075, 2076, 2067, 2078, 2081, 2077, 5813, 2074, 2085,
      2093, 2089, 2091, 2088, 2095, 2096, 2098, 2099, 2100, 2103,
      2106, 2107, 2115, 2116, 2108, 2112, 2120, 2113, 2122, 2125,
-     2128, 2127, 2129, 2130, 2131, 5768, 2133, 2135,  124, 2139,
+     2128, 2127, 2129, 2130, 2131, 5813, 2133, 2135,  124, 2139,
 
      2140, 2142, 2141, 2148, 2144, 2147, 2164, 2165, 2161, 2160,
-     2163, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2177, 5768,
-     2151, 2179, 2180, 2182, 2185, 2186, 2189, 5768, 2199, 2202,
+     2163, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2177, 5813,
+     2151, 2179, 2180, 2182, 2185, 2186, 2189, 5813, 2199, 2202,
      2188, 2201, 2209, 2204, 2210, 2211, 2213, 2218, 2214, 2217,
-     5768, 2221, 2224, 2226, 2227, 2228, 2230, 2235, 2237, 2238,
+     5813, 2221, 2224, 2226, 2227, 2228, 2230, 2235, 2237, 2238,
      2239, 2242, 2240, 2241, 2245, 2243, 2246, 2250, 2259, 2249,
-     2251, 2256, 2260, 5768, 2272, 2261, 2270, 2263, 2274, 2273,
+     2251, 2256, 2260, 5813, 2272, 2261, 2270, 2263, 2274, 2273,
      2287, 2277, 2280, 2282, 2288, 2297, 2290, 2284, 2298, 2299,
      2304, 2308, 2307, 2313, 2314, 2311, 2315, 2321, 2323, 2324,
      2325, 2329, 2327, 2330, 2331, 2332, 2339, 2340, 2337, 2348,
 
-     2346, 2353, 2351, 2356, 5768, 2357, 2358, 2341, 2363, 2371,
+     2346, 2353, 2351, 2356, 5813, 2357, 2358, 2341, 2363, 2371,
      2368, 2369, 2375, 2376, 2377, 2378, 2379, 2386, 2381, 2383,
      2384, 2387, 2388, 2394, 2395, 2399, 2400, 2407, 2401, 2409,
-     2410, 5768, 2411, 2415, 2404, 2417, 2419, 2421, 2428, 2429,
+     2410, 5813, 2411, 2415, 2404, 2417, 2419, 2421, 2428, 2429,
      2431, 2422, 2425, 2433, 2434, 2435, 2437, 2439, 2440, 2445,
-     2442, 5768, 2448, 2450, 2453, 2456, 2455, 2459, 2462, 2468,
-     2466, 2452, 2472, 2473, 2474, 5768, 2481, 2482, 2479, 2483,
-     2485, 2486, 2488, 2490, 2491, 5768, 2492, 2493, 2501, 2502,
-     2497, 5768, 2504, 2500, 2506, 2507, 2508, 2509, 2517, 2510,
-     2513, 2515, 2523, 2525, 2521, 2529, 5768, 2531, 2541, 2536,
+     2442, 5813, 2448, 2450, 2453, 2456, 2455, 2459, 2462, 2468,
+     2466, 2452, 2472, 2473, 2474, 5813, 2481, 2482, 2479, 2483,
+     2485, 2486, 2488, 2490, 2491, 5813, 2492, 2493, 2501, 2502,
+     2497, 5813, 2504, 2500, 2506, 2507, 2508, 2509, 2517, 2510,
+     2513, 2515, 2523, 2525, 2521, 2529, 5813, 2531, 2541, 2536,
 
      2537, 2539, 2542, 2543, 2545, 2557, 2549, 2552, 2559, 2564,
-     2561, 2548, 2555, 2569, 2570, 2571, 2573, 2574, 5768, 2576,
+     2561, 2548, 2555, 2569, 2570, 2571, 2573, 2574, 5813, 2576,
      2577, 2579, 2582, 2580, 2585, 2586, 2598, 2588, 2591, 2593,
      2596, 2599, 2601, 2604, 2606, 2612, 2608, 2615, 2618, 2616,
-     2621, 2602, 2625, 2628, 2635, 2632, 2636, 5768, 2639, 2640,
+     2621, 2602, 2625, 2628, 2635, 2632, 2636, 5813, 2639, 2640,
      2634, 2641, 2642, 2645, 2646, 2647, 2649, 2650, 2652, 2651,
      2654, 2667, 2676, 2662, 2663, 2655, 2668, 2671, 2672, 2678,
      2679, 2683, 2690, 2681, 2685, 2694, 2689, 2692, 2702, 2691,
      2693, 2695, 2700, 2703, 2704, 2705, 2706, 2713, 2709, 2723,
-     2724, 2726, 2715, 2718, 2731, 2732, 5768, 2735, 2733, 2736,
+     2724, 2726, 2715, 2718, 2731, 2732, 5813, 2735, 2733, 2736,
 
      2737, 2742, 2745, 2749, 2739, 2746, 2747, 2757, 2758, 2755,
-     2760, 2763, 2770, 2766, 5768, 2767, 5768, 2768, 2769, 2771,
-     2779, 2776, 5768, 2781, 5768, 2784, 2791, 2777, 2782, 5768,
+     2760, 2763, 2770, 2766, 5813, 2767, 5813, 2768, 2769, 2771,
+     2779, 2776, 5813, 2781, 5813, 2784, 2791, 2777, 2782, 5813,
      2792, 2786, 2788, 2799, 2794, 2801, 2802, 2803, 2804, 2810,
      2805, 2812, 2807, 2813, 2815, 2816, 2819, 2820, 2826, 2833,
-     2828, 2830, 2817, 2836, 2838, 2840, 2841, 5768, 2844, 2845,
+     2828, 2830, 2817, 2836, 2838, 2840, 2841, 5813, 2844, 2845,
      2850, 2849, 2851, 2852, 2853, 2855, 2856, 2858, 2857, 2862,
-     2861, 2870, 2874, 2886, 2871, 2888, 5768, 2873, 2884, 2875,
-     2889, 5768, 2885, 2892, 2896, 2898, 2893, 2900, 2902, 2901,
+     2861, 2870, 2874, 2886, 2871, 2888, 5813, 2873, 2884, 2875,
+     2889, 5813, 2885, 2892, 2896, 2898, 2893, 2900, 2902, 2901,
      2905, 2903, 2908, 2919, 2920, 2921, 2923, 2924, 2909, 2910,
 
      2933, 2930, 2911, 2938, 2942, 2940, 2931, 2941, 2943, 2946,
      2947, 2954, 2955, 2951, 2958, 2953, 2960, 2964, 2967, 2957,
      2961, 2968, 2969, 2970, 2973, 2974, 2977, 2978, 2979, 2980,
-     2982, 5768, 2990, 2986, 2991, 2992, 2995, 2997, 3000, 3001,
-     3004, 3002, 3005, 3009, 3007, 5768, 3014, 5768, 3008, 3022,
+     2982, 5813, 2990, 2986, 2991, 2992, 2995, 2997, 3000, 3001,
+     3004, 3002, 3005, 3009, 3007, 5813, 3014, 5813, 3008, 3022,
      3016, 3027, 3020, 3028, 3035, 3031, 3036, 3037, 3039, 3040,
      3041, 3042, 3043, 3047, 3050, 3048, 3061, 3054, 3051, 3063,
-     3064, 3065, 3067, 3068, 5768, 3069, 3070, 3072, 3074, 3075,
-     3081, 3077, 3087, 3085, 3089, 3091, 3101, 5768, 3093, 3097,
-     3098, 3106, 3108, 3104, 3114, 3121, 3118, 3125, 3124, 5768,
+     3064, 3065, 3067, 3068, 5813, 3069, 3070, 3072, 3074, 3075,
+     3081, 3077, 3087, 3085, 3089, 3091, 3101, 5813, 3093, 3097,
+     3098, 3106, 3108, 3104, 3114, 3121, 3118, 3125, 3124, 5813,
 
-     3116, 3117, 3132, 3127, 3134, 3135, 5768, 3133, 5768, 3128,
+     3116, 3117, 3132, 3127, 3134, 3135, 5813, 3133, 5813, 3128,
      3138, 3142, 3139, 3145, 3146, 3149, 3151, 3153, 3160, 3161,
-     3156, 3144, 3162, 3166, 3168, 3173, 3170, 3171, 3172, 5768,
-     3176, 3177, 3178, 3179, 3183, 3186, 3189, 3193, 5768, 3194,
+     3156, 3144, 3162, 3166, 3168, 3173, 3170, 3171, 3172, 5813,
+     3176, 3177, 3178, 3179, 3183, 3186, 3189, 3193, 5813, 3194,
      3196, 3199, 3200, 3201, 3203, 3205, 3204, 3210, 3213, 3207,
-     3208, 3221, 3217, 3206, 3227, 3231, 3232, 3237, 5768, 3234,
+     3208, 3221, 3217, 3206, 3227, 3231, 3232, 3237, 5813, 3234,
      3214, 3244, 3241, 3242, 3243, 3246, 3247, 3248, 3250, 3251,
      3252, 3253, 3259, 3258, 3255, 3256, 3261, 3264, 3275, 3272,
      3263, 3276, 3277, 3280, 3283, 3282, 3286, 3289, 3291, 3292,
-     3302, 3303, 3294, 3297, 3306, 3307, 3314, 3310, 5768, 3322,
+     3302, 3303, 3294, 3297, 3306, 3307, 3314, 3310, 5813, 3322,
 
      3299, 3325, 3309, 3320, 3327, 3328, 3330, 3331, 3321, 3332,
-     3339, 3335, 5768, 3348, 3337, 3336, 3346, 3349, 3359, 3354,
+     3339, 3335, 5813, 3348, 3337, 3336, 3346, 3349, 3359, 3354,
      3340, 3356, 3362, 3358, 3365, 3367, 3368, 3369, 3372, 3373,
-     5768, 5768, 3375, 3376, 3379, 5768, 3380, 3378, 3391, 3382,
-     3383, 3392, 3395, 3394, 3386, 3396, 3398, 3400, 5768, 3405,
+     5813, 5813, 3375, 3376, 3379, 5813, 3380, 3378, 3391, 3382,
+     3383, 3392, 3395, 3394, 3386, 3396, 3398, 3400, 5813, 3405,
      3414, 3406, 3411, 3415, 3419, 3421, 3417, 3423, 3425, 3427,
-     3428, 3430, 3429, 3431, 3434, 3442, 3438, 3437, 3439, 5768,
-     3441, 3444, 3448, 3450, 3451, 3454, 5768, 3455, 3456, 3462,
+     3428, 3430, 3429, 3431, 3434, 3442, 3438, 3437, 3439, 5813,
+     3441, 3444, 3448, 3450, 3451, 3454, 5813, 3455, 3456, 3462,
      3463, 3465, 3467, 3473, 3476, 3477, 3478, 3480, 3481, 3482,
-     3483, 3485, 3490, 3488, 3495, 3496, 3487, 5768, 3500, 3501,
+     3483, 3485, 3490, 3488, 3495, 3496, 3487, 5813, 3500, 3501,
 
      3504, 3507, 3511, 3514, 3521, 3522, 3518, 3520, 3519, 3529,
-     5768, 3526, 3528, 3527, 3530, 3540, 3535, 3542, 3533, 5768,
-     3537, 3541, 3543, 5768, 3547, 3551, 3554, 3559, 3546, 3562,
-     3561, 3563, 3564, 3565, 5768, 3571, 5768, 3569, 3573, 3577,
-     5768, 3575, 3579, 3581, 3583, 3580, 3588, 3590, 3597, 3584,
-     3592, 3594, 3598, 3599, 3600, 3608, 3606, 5768, 3609, 3607,
-     3613, 3614, 3618, 3611, 3616, 3619, 3626, 5768, 5768, 3629,
-     5768, 3630, 3631, 3632, 5768, 3634, 3636, 3641, 3638, 3642,
-     3644, 3652, 3645, 5768, 3654, 3640, 3656, 3658, 3659, 3662,
-     3663, 3664, 3665, 3666, 3671, 5768, 3668, 3670, 3673, 3669,
-
-     3678, 3683, 3679, 3685, 5768, 3689, 3693, 3692, 3696, 3697,
-     5768, 3699, 5768, 3700, 3702, 3703, 3707, 3706, 5768, 3712,
+     5813, 3526, 3528, 3527, 3530, 3540, 3535, 3542, 3533, 5813,
+     3537, 3541, 3543, 5813, 3547, 3551, 3554, 3559, 3546, 3562,
+     3561, 3563, 3564, 3565, 5813, 3571, 5813, 3569, 3573, 3577,
+     5813, 3575, 3579, 3581, 3583, 3580, 3588, 3590, 3597, 3584,
+     3592, 3594, 3598, 3599, 3600, 3608, 3606, 5813, 3609, 3607,
+     3613, 3614, 3618, 3611, 3616, 3619, 3626, 5813, 5813, 3629,
+     5813, 3630, 3631, 3632, 5813, 3634, 3636, 3641, 3638, 3642,
+     3644, 3652, 3645, 5813, 3654, 3640, 3656, 3658, 3659, 3662,
+     3663, 3664, 3665, 3666, 3671, 5813, 3668, 3670, 3673, 3669,
+
+     3678, 3683, 3679, 3685, 5813, 3689, 3693, 3692, 3696, 3697,
+     5813, 3699, 5813, 3700, 3702, 3703, 3707, 3706, 5813, 3712,
      3713, 3717, 3719, 3721, 3720, 3723, 3724, 3730, 3731, 3738,
-     3734, 3733, 3735, 5768, 3736, 3740, 3742, 3749, 3737, 3744,
+     3734, 3733, 3735, 5813, 3736, 3740, 3742, 3749, 3737, 3744,
      3753, 3756, 3757, 3758, 3763, 3760, 3767, 3769, 3771, 3773,
-     3765, 5768, 3775, 3777, 3776, 3791, 3786, 3781, 5768, 3782,
-     3796, 3798, 5768, 3789, 3788, 3800, 3805, 3792, 3799, 3806,
-     3807, 3811, 5768, 3812, 3813, 3814, 3815, 3818, 3819, 5768,
-     5768, 3827, 5768, 3829, 3816, 3830, 3831, 3832, 3838, 3837,
+     3765, 5813, 3775, 3777, 3776, 3791, 3786, 3781, 5813, 3782,
+     3796, 3798, 5813, 3789, 3788, 3800, 3805, 3792, 3799, 3806,
+     3807, 3811, 5813, 3812, 3813, 3814, 3815, 3818, 3819, 5813,
+     5813, 3827, 5813, 3829, 3816, 3830, 3831, 3832, 3838, 3837,
      3841, 3843, 3840, 3844, 3851, 3852, 3861, 3864, 3868, 3863,
 
-     3867, 3853, 5768, 5768, 3870, 3871, 3874, 3877, 3878, 3880,
-     3881, 3888, 3884, 3890, 3894, 3895, 3902, 5768, 3901, 3887,
-     3904, 5768, 3885, 3898, 3906, 3909, 3911, 3912, 3915, 3914,
+     3867, 3853, 5813, 5813, 3870, 3871, 3874, 3877, 3878, 3880,
+     3881, 3888, 3884, 3890, 3894, 3895, 3902, 5813, 3901, 3887,
+     3904, 5813, 3885, 3898, 3906, 3909, 3911, 3912, 3915, 3914,
      3917, 3918, 3920, 3919, 3922, 3923, 3927, 3926, 3928, 3936,
-     5768, 3940, 3937, 3938, 3941, 3943, 3944, 3947, 3949, 3950,
-     5768, 3951, 3953, 3955, 3959, 3960, 3962, 3969, 3977, 3979,
-     3965, 3973, 3981, 3983, 3985, 3988, 5768, 3989, 3987, 3990,
+     5813, 3940, 3937, 3938, 3941, 3943, 3944, 3947, 3949, 3950,
+     5813, 3951, 3953, 3955, 3959, 3960, 3962, 3969, 3977, 3979,
+     3965, 3973, 3981, 3983, 3985, 3988, 5813, 3989, 3987, 3990,
      3991, 3997, 3999, 4000, 4002, 4004, 4006, 4008, 4009, 4012,
-     4016, 4013, 4017, 4018, 4020, 5768, 4024, 4031, 4021, 4034,
-     4025, 4035, 4042, 4036, 4047, 4038, 4044, 4048, 4050, 5768,
-
-     4051, 4053, 4054, 4056, 4062, 4055, 4058, 4063, 5768, 4065,
-     4066, 4068, 4070, 4072, 4077, 4079, 4080, 4082, 4083, 4087,
-     5768, 4088, 4089, 4092, 4093, 4096, 4098, 4099, 4101, 5768,
-     4103, 4106, 4102, 4116, 4112, 4120, 4121, 4123, 4113, 4122,
-     4129, 4115, 4125, 4130, 4131, 4136, 4143, 4147, 4142, 5768,
-     4144, 5768, 4145, 4148, 4157, 4152, 4155, 5768, 4156, 4158,
-     4160, 4163, 4162, 5768, 4167, 4165, 4168, 4170, 5768, 4166,
-     4180, 4173, 4176, 4187, 4189, 5768, 4192, 4194, 4195, 4202,
-     4204, 4206, 4199, 4207, 4203, 4209, 4201, 4210, 5768, 4212,
-     4214, 4219, 4221, 4222, 4224, 4225, 4228, 4230, 5768, 4232,
-
-     4233, 4234, 4235, 4236, 4238, 4241, 4245, 4242, 4247, 5768,
-     4250, 4251, 4261, 4252, 4257, 5768, 5768, 4262, 4263, 4267,
-     4268, 4271, 5768, 4269, 4280, 4275, 4278, 4279, 5768, 5768,
-     4282, 5768, 4283, 5768, 4284, 4286, 5768, 5768, 4285, 4289,
-     4291, 4292, 4300, 5768, 4304, 5768, 4311, 4306, 4293, 4295,
-     4308, 5768, 4310, 4312, 4319, 5768, 4314, 4322, 4320, 4321,
-     5768, 4326, 4327, 4330, 5768, 4331, 4334, 4335, 4337, 4341,
-     4339, 4343, 4328, 4347, 4349, 4351, 4353, 4358, 4360, 4363,
-     4354, 4364, 4365, 4367, 4371, 4373, 4374, 4375, 4376, 4378,
-     4379, 4381, 4384, 4388, 4389, 4387, 4390, 4391, 4400, 4393,
-
-     4396, 4404, 4397, 4407, 4408, 4409, 4410, 4412, 4414, 4418,
-     4417, 4420, 5768, 4419, 4421, 4423, 4436, 4424, 4425, 4440,
-     4442, 4448, 4449, 5768, 4451, 5768, 4453, 4444, 4455, 4456,
-     5768, 4457, 4458, 4459, 4460, 4461, 4463, 4464, 4467, 5768,
-     4472, 4465, 4469, 4474, 5768, 4479, 4485, 4486, 4489, 4490,
-     4491, 4492, 4493, 4496, 4494, 4499, 4501, 4508, 4503, 4505,
-     4495, 4517, 4509, 4515, 4518, 4429, 4525, 4526, 4531, 5768,
-     4519, 5768, 4527, 4532, 4533, 4534, 4537, 4539, 4541, 5768,
-     5768, 4543, 4544, 4549, 4540, 4546, 4553, 4557, 5768, 4550,
-     4558, 4567, 4556, 5768, 4568, 4570, 4572, 5768, 4573, 4574,
-
-     4575, 4577, 4578, 4581, 4582, 4584, 4592, 5768, 5768, 5768,
-     5768, 4593, 4586, 4599, 4589, 4600, 4595, 4601, 4606, 4603,
-     5768, 4612, 5768, 5768, 4609, 4615, 4607, 4617, 4616, 4619,
-     4623, 4625, 5768, 4626, 4629, 4630, 4627, 4637, 4640, 4643,
-     4644, 4628, 4645, 4653, 4651, 4654, 4652, 4657, 4659, 4661,
-     5768, 5768, 4664, 4666, 4668, 4675, 4673, 4676, 4685, 4680,
-     4682, 4683, 4686, 4688, 4689, 4690, 5768, 4693, 4697, 5768,
-     4691, 5768, 4699, 4705, 4695, 4706, 4707, 4708, 4711, 4709,
-     5768, 5768, 4714, 4715, 4720, 4722, 4723, 4725, 4726, 4728,
-     4724, 5768, 4729, 5768, 4730, 4732, 4738, 4731, 4746, 4751,
-
-     4753, 4749, 4752, 4754, 5768, 4755, 4757, 5768, 4758, 4761,
-     4763, 5768, 4765, 4768, 4772, 5768, 4774, 4776, 4777, 5768,
-     4784, 5768, 4769, 4787, 5768, 4779, 4790, 5768, 4793, 4795,
-     4785, 4796, 5768, 4797, 5768, 4798, 4801, 4802, 4805, 4806,
-     4808, 4810, 4811, 4812, 4819, 4817, 4820, 5768, 5768, 4828,
-     4814, 4825, 4830, 4832, 4839, 4831, 4836, 4835, 5768, 5768,
-     4841, 5768, 4843, 4844, 5768, 4842, 4849, 4848, 4853, 4854,
-     4855, 4857, 4860, 4861, 4862, 4869, 4864, 4874, 4876, 4878,
-     4881, 4884, 4886, 4887, 4888, 4889, 4890, 4891, 4893, 5768,
-     4895, 4897, 4896, 5768, 4904, 4898, 4907, 4912, 5768, 4910,
-
-     4916, 4918, 4919, 5768, 4920, 4922, 4926, 4923, 4924, 4935,
-     4931, 4933, 5768, 5768, 5768, 4936, 4946, 5768, 4948, 4937,
-     5768, 4940, 4950, 5768, 5768, 4943, 4951, 4952, 4959, 5768,
-     4954, 5768, 4956, 5768, 4958, 4964, 4970, 4965, 5768, 4973,
-     4975, 5768, 4981, 4983, 4985, 4986, 4967, 4988, 4989, 5768,
-     4996, 4992, 4993, 5000, 4991, 5001, 5003, 5002, 5010, 5005,
-     5012, 5768, 5006, 5013, 5014, 5768, 5016, 5768, 5018, 5019,
-     4957, 5017, 5021, 5023, 5027, 5024, 5033, 5039, 5036, 5768,
-     5041, 5044, 5768, 5045, 5768, 5047, 5768, 5048, 5049, 5051,
-     5052, 5768, 5054, 5050, 5056, 5058, 5768, 5060, 5062, 5069,
-
-     5768, 5768, 5073, 4648, 5072, 5075, 5063, 5081, 5082, 5085,
-     5084, 5092, 5087, 5089, 5088, 5091, 5095, 5096, 5768, 5768,
-     5768, 5099, 5102, 5109, 5113, 5107, 5120, 5105, 5768, 5116,
-     5119, 5115, 5131, 5118, 5127, 5768, 5129, 5130, 5132, 5768,
-     5138, 5140, 5142, 5143, 5145, 5152, 5154, 5156, 5158, 5768,
-     5160, 5768, 5768, 5146, 5768, 5144, 5148, 5161, 5167, 5768,
-     5172, 5162, 5164, 5169, 5174, 5768, 5175, 5177, 5768, 5768,
-     5180, 5768, 5186, 5187, 5181, 5196, 5188, 5189, 5199, 5201,
-     5768, 5191, 5193, 5202, 5203, 5204, 5768, 5208, 5205, 5209,
-     5212, 5217, 5117, 5219, 5218, 5220, 5768, 5768, 5214, 5227,
-
-     5768, 5768, 5222, 5231, 5238, 5768, 5768, 5768, 5244, 5768,
-     5246, 5250, 5254, 5258, 5249, 5768, 5260, 5223, 5257, 5768,
-     5228, 5262, 5768, 5768, 5263, 5265, 5264, 5266, 5267, 5768,
-     5269, 5270, 5273, 5277, 5281, 5278, 5284, 5283, 5291, 5300,
-     5286, 5297, 5296, 5298, 5299, 5301, 5306, 5302, 5768, 5768,
-     5309, 5768, 5768, 5314, 5316, 5319, 5322, 5324, 5326, 5328,
-     5768, 5329, 5331, 5332, 5768, 5334, 5336, 5333, 5337, 5339,
-     5340, 5342, 5344, 5768, 5768, 5345, 5346, 5347, 5354, 5356,
-     5768, 5358, 5365, 5362, 5364, 5360, 5366, 5367, 5768, 5370,
-     5768, 5768, 5768, 5768, 5768, 5768, 5768, 5768, 5368, 5768,
-
-     5378, 5381, 5768, 5372, 5382, 5386, 5387, 5375, 5768, 5388,
-     5392, 5393, 5394, 5397, 5399, 5401, 5402, 5404, 5408, 5405,
-     5410, 5406, 5409, 5768, 5768, 5417, 5413, 5416, 5419, 5435,
-     5436, 5439, 5441, 5423, 5426, 5444, 5443, 5445, 5432, 5449,
-     5458, 5451, 5453, 5455, 5456, 5460, 5768, 5461, 5768, 5462,
-     5768, 5768, 5467, 5468, 5463, 5470, 5478, 5483, 5474, 5479,
-     5481, 5485, 5768, 5482, 5768, 5487, 5486, 5768, 5491, 5493,
-     5494, 5495, 5496, 5497, 5499, 5505, 5768, 5503, 5506, 5515,
-     5507, 5523, 5518, 5522, 5524, 5526, 5520, 5534, 5530, 5533,
-     5768, 5536, 5537, 5538, 5541, 5542, 5549, 5544, 5546, 5547,
-
-     5768, 5551, 5553, 5552, 5554, 5555, 5558, 5566, 5564, 5568,
-     5768, 5570, 5575, 5572, 5577, 5579, 5582, 5583, 5584, 5586,
-     5588, 5418, 5595, 5592, 5597, 5589, 5600, 5598, 5768, 5602,
-     5606, 5768, 5607, 5609, 5610, 5611, 5615, 5768, 5619, 5613,
-     5620, 5621, 5624, 5626, 5768, 5628, 5635, 5631, 5768, 5636,
-     5768, 5768, 5637, 5640, 5643, 5645, 5647, 5768, 5768, 5768,
-     5676, 5683, 5690, 5697, 5704,   88, 5711, 5718, 5725, 5732,
-     5739, 5746, 5753, 5760
+     4016, 4013, 4017, 4018, 4020, 5813, 4024, 4031, 4021, 4034,
+     4025, 4035, 4042, 4036, 4047, 4038, 4044, 4048, 4050, 5813,
+
+     4051, 4053, 4054, 4056, 4062, 4055, 4058, 4063, 5813, 4065,
+     4066, 4068, 4070, 4072, 4077, 4079, 4080, 4082, 4083, 4089,
+     5813, 4087, 4088, 4096, 4094, 4097, 4100, 4098, 4102, 5813,
+     4106, 4108, 4112, 4120, 4104, 4122, 4118, 4124, 4115, 4117,
+     4131, 4126, 4132, 4133, 4136, 4137, 4144, 4149, 4146, 5813,
+     4139, 5813, 4147, 4152, 4154, 4157, 4155, 5813, 4160, 4162,
+     4164, 4165, 4161, 5813, 4167, 4168, 4171, 4169, 5813, 4182,
+     4183, 4172, 4187, 4174, 4189, 5813, 4194, 4195, 4191, 4203,
+     4206, 4202, 4204, 4207, 4205, 4209, 4210, 4211, 5813, 4215,
+     4213, 4221, 4222, 4224, 4214, 4226, 4232, 4225, 5813, 4235,
+
+     4228, 4236, 4237, 4239, 4241, 4242, 4250, 4246, 4245, 5813,
+     4249, 4253, 4260, 4259, 4255, 5813, 5813, 4262, 4268, 4270,
+     4264, 4271, 5813, 4274, 4281, 4277, 4280, 4282, 5813, 5813,
+     4284, 5813, 4285, 5813, 4286, 4288, 5813, 5813, 4287, 4293,
+     4294, 4296, 4298, 5813, 4306, 5813, 4308, 4309, 4295, 4307,
+     4312, 5813, 4313, 4314, 4316, 5813, 4318, 4328, 4320, 4321,
+     5813, 4324, 4325, 4330, 5813, 4333, 4340, 4337, 4331, 4341,
+     4346, 4343, 4347, 4352, 4353, 4354, 4335, 4357, 4364, 4368,
+     4370, 4372, 4373, 4356, 4375, 4376, 4378, 4381, 4382, 4383,
+     4384, 4387, 4388, 4390, 4392, 4395, 4396, 4397, 4398, 4399,
+
+     4409, 4401, 4402, 4412, 4415, 4405, 4413, 4416, 4417, 4418,
+     4425, 4427, 4420, 4423, 5813, 4428, 4430, 4434, 4437, 4439,
+     4442, 4443, 4445, 4450, 4454, 5813, 4458, 5813, 4460, 4451,
+     4456, 4462, 5813, 4463, 4464, 4465, 4466, 4468, 4470, 4471,
+     4472, 5813, 4475, 4476, 4479, 4485, 5813, 4491, 4493, 4478,
+     4494, 4495, 4499, 4497, 4501, 4504, 4503, 4506, 4508, 4516,
+     4509, 4511, 4513, 4518, 4517, 4521, 4524, 4358, 4531, 4533,
+     4539, 5813, 4525, 5813, 4534, 4528, 4536, 4540, 4545, 4542,
+     4546, 5813, 5813, 4549, 4551, 4553, 4555, 4556, 4558, 4559,
+     5813, 4561, 4564, 4567, 4571, 5813, 4572, 4573, 4578, 5813,
+
+     4575, 4579, 4581, 4583, 4580, 4590, 4586, 4594, 4595, 4596,
+     4598, 5813, 5813, 5813, 5813, 4600, 4602, 4605, 4606, 4607,
+     4609, 4612, 4614, 4610, 5813, 4616, 5813, 5813, 4617, 4623,
+     4626, 4627, 4629, 4630, 4633, 4631, 5813, 4635, 4636, 4638,
+     4644, 4646, 4648, 4651, 4652, 4653, 4654, 4661, 4660, 4662,
+     4664, 4668, 4667, 4670, 5813, 5813, 4674, 4676, 4677, 4684,
+     4681, 4685, 4688, 4689, 4691, 4692, 4694, 4695, 4697, 4698,
+     5813, 4699, 4705, 5813, 4700, 5813, 4706, 4713, 4707, 4714,
+     4715, 4717, 4719, 4721, 5813, 5813, 4716, 4722, 4728, 4732,
+     4729, 4734, 4723, 4737, 4733, 5813, 4739, 5813, 4740, 4741,
+
+     4750, 4744, 4757, 4759, 4761, 4763, 4756, 4765, 5813, 4758,
+     4766, 5813, 4768, 4771, 4773, 5813, 4774, 4777, 4781, 5813,
+     4783, 4786, 4784, 5813, 4792, 5813, 4778, 4794, 4793, 4801,
+     5813, 4787, 4796, 5813, 4803, 4809, 4810, 4804, 5813, 4806,
+     5813, 4811, 4815, 4818, 4821, 4812, 4823, 4816, 4825, 4826,
+     4834, 4833, 4835, 5813, 5813, 4842, 4830, 4837, 4838, 4844,
+     4851, 4846, 4848, 4855, 5813, 5813, 4856, 5813, 4859, 4860,
+     5813, 4847, 4862, 4864, 4868, 4866, 4849, 4874, 4876, 4870,
+     4877, 4892, 4878, 4880, 4893, 4895, 4898, 4900, 4887, 4902,
+     4890, 4883, 4904, 4905, 4906, 5813, 4912, 4914, 4915, 5813,
+
+     4919, 4916, 4921, 4922, 5813, 4929, 4930, 4931, 4932, 5813,
+     4924, 4935, 4943, 4936, 4937, 4950, 4938, 4946, 5813, 5813,
+     5813, 4948, 4957, 5813, 4959, 4954, 4960, 4961, 5813, 4962,
+     4963, 5813, 5813, 4964, 4965, 4966, 4973, 5813, 4969, 5813,
+     4970, 5813, 4972, 4978, 4987, 4984, 5813, 4990, 4996, 5813,
+     4999, 5002, 5004, 5005, 4992, 4994, 5006, 5813, 4982, 5010,
+     5016, 5008, 5009, 5017, 5018, 5019, 5026, 5022, 5025, 5813,
+     5029, 5028, 5030, 5813, 5032, 5813, 5033, 5036, 5035, 5042,
+     5040, 5034, 5044, 5054, 5041, 5058, 5045, 5813, 5061, 5063,
+     5813, 5055, 5813, 5066, 5813, 5068, 5069, 5070, 5072, 5813,
+
+     5074, 5071, 5075, 5078, 5813, 5079, 5081, 5083, 5813, 5813,
+     5087, 5094, 5096, 4634, 5090, 5093, 5099, 5103, 5100, 5104,
+     5105, 5112, 5108, 5109, 5110, 5115, 5117, 5123, 5813, 5813,
+     5813, 5116, 5118, 5132, 5134, 5136, 5135, 5131, 5813, 5137,
+     5140, 5141, 5150, 5146, 5148, 5813, 5152, 5143, 5156, 5813,
+     5154, 5158, 5161, 5155, 5167, 5171, 5174, 5176, 5177, 5813,
+     5179, 5813, 5813, 5168, 5813, 5159, 5180, 5183, 5184, 5813,
+     5189, 5186, 5190, 5192, 5194, 5813, 5197, 5195, 5198, 5199,
+     5813, 5813, 5207, 5813, 5209, 5211, 5212, 5219, 5218, 5214,
+     5221, 5223, 5813, 5224, 5225, 5227, 5229, 5231, 5813, 5234,
+
+     5233, 5235, 5236, 5239, 5238, 5243, 5246, 5248, 5813, 5813,
+     5249, 5250, 5813, 5813, 5259, 5265, 5247, 5813, 5813, 5813,
+     5271, 5813, 5273, 5277, 5281, 5285, 5262, 5813, 5287, 5276,
+     5284, 5813, 5268, 5280, 5290, 5292, 5813, 5813, 5289, 5196,
+     5293, 5296, 5301, 5813, 5299, 5302, 5303, 5307, 5309, 5310,
+     5313, 5312, 5328, 5326, 5315, 5319, 5323, 5330, 5331, 5329,
+     5333, 5337, 5813, 5813, 5339, 5813, 5813, 5346, 5350, 5352,
+     5354, 5356, 5358, 5360, 5813, 5361, 5363, 5364, 5365, 5347,
+     5813, 5366, 5369, 5371, 5374, 5372, 5375, 5378, 5380, 5813,
+     5813, 5381, 5388, 5382, 5389, 5383, 5813, 5392, 5400, 5396,
+
+     5397, 5398, 5403, 5404, 5813, 5407, 5813, 5813, 5813, 5813,
+     5813, 5813, 5813, 5813, 5406, 5813, 5405, 5412, 5414, 5416,
+     5813, 5419, 5423, 5424, 5425, 5426, 5813, 5427, 5430, 5429,
+     5341, 5431, 5435, 5438, 5433, 5437, 5443, 5439, 5447, 5444,
+     5448, 5449, 5813, 5813, 5813, 5453, 5456, 5458, 5460, 5471,
+     5472, 5475, 5478, 5461, 5463, 5479, 5481, 5484, 5466, 5485,
+     5493, 5488, 5490, 5495, 5492, 5496, 5498, 5813, 5499, 5813,
+     5501, 5813, 5813, 5504, 5505, 5508, 5509, 5517, 5518, 5513,
+     5520, 5521, 5523, 5813, 5524, 5526, 5813, 5525, 5530, 5813,
+     5529, 5531, 5532, 5535, 5537, 5538, 5542, 5553, 5813, 5541,
+
+     5544, 5552, 5555, 5559, 5566, 5567, 5565, 5569, 5572, 5556,
+     5579, 5581, 5578, 5585, 5813, 5582, 5576, 5587, 5588, 5589,
+     5596, 5591, 5592, 5813, 5597, 5813, 5600, 5602, 5601, 5593,
+     5603, 5604, 5615, 5613, 5619, 5813, 5609, 5620, 5623, 5624,
+     5626, 5628, 5629, 5630, 5638, 5634, 5641, 5645, 5640, 5646,
+     5631, 5651, 5648, 5813, 5655, 5652, 5813, 5657, 5658, 5659,
+     5660, 5664, 5813, 5669, 5661, 5666, 5672, 5675, 5670, 5813,
+     5682, 5684, 5686, 5813, 5687, 5813, 5813, 5689, 5676, 5688,
+     5691, 5697, 5813, 5813, 5813, 5721, 5728, 5735, 5742, 5749,
+       88, 5756, 5763, 5770, 5777, 5784, 5791, 5798, 5805
+
     } ;
 
-static const flex_int16_t yy_def[2975] =
+static const flex_int16_t yy_def[3000] =
     {   0,
-     2960,    1, 2961, 2961, 2962, 2962, 2963, 2963, 2964, 2964,
-     2965, 2965, 2960, 2966, 2960, 2960, 2960, 2960, 2967, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2968, 2960, 2960, 2960, 2968, 2969, 2960, 2960,
-     2960, 2969, 2970, 2960, 2960, 2960, 2960, 2970, 2971, 2960,
-     2960, 2960, 2971, 2972, 2960, 2973, 2960, 2972, 2972, 2966,
-     2966, 2960, 2974, 2967, 2974, 2967, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2968, 2968, 2969, 2969, 2970, 2970, 2960, 2971, 2971, 2972,
-     2972, 2973, 2973, 2972, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2972, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2972, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2972, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2972, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2960, 2960, 2966, 2960, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2972, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2960, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2960, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2972, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2960, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2960, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2960, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2960, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2960, 2966,
-     2960, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2960, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2960, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2960, 2960, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2960, 2960,
-     2966, 2960, 2966, 2960, 2966, 2966, 2960, 2960, 2966, 2966,
-     2966, 2966, 2966, 2960, 2966, 2960, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2960, 2966, 2960, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2960, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2960, 2960,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2960, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2960,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2960, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2960,
-     2966, 2960, 2966, 2966, 2960, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2960, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2960,
-     2966, 2960, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2960, 2966,
-
-     2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2960, 2960, 2960, 2966, 2966, 2960, 2966, 2966,
-     2960, 2966, 2966, 2960, 2960, 2966, 2966, 2966, 2966, 2960,
-     2966, 2960, 2966, 2960, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2960, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2960, 2966, 2960, 2966, 2960, 2966, 2966, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-
-     2960, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2960,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2960, 2960, 2966, 2960, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2960, 2960,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2960, 2966, 2966,
-
-     2960, 2960, 2966, 2966, 2966, 2960, 2960, 2960, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2960,
-     2966, 2966, 2960, 2960, 2966, 2966, 2966, 2966, 2966, 2960,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2960,
-     2966, 2960, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2960, 2960, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2966, 2960,
-
-     2966, 2966, 2960, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2960, 2960, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2960, 2966,
-     2960, 2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2960, 2966, 2960, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2960, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966,
-     2966, 2966, 2966, 2966, 2966, 2966, 2966, 2966, 2960, 2966,
-     2966, 2960, 2966, 2966, 2966, 2966, 2966, 2960, 2966, 2966,
-     2966, 2966, 2966, 2966, 2960, 2966, 2966, 2966, 2960, 2966,
-     2960, 2960, 2966, 2966, 2966, 2966, 2966, 2960, 2960,    0,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-     2960, 2960, 2960, 2960
+     2985,    1, 2986, 2986, 2987, 2987, 2988, 2988, 2989, 2989,
+     2990, 2990, 2985, 2991, 2985, 2985, 2985, 2985, 2992, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2993, 2985, 2985, 2985, 2993, 2994, 2985, 2985,
+     2985, 2994, 2995, 2985, 2985, 2985, 2985, 2995, 2996, 2985,
+     2985, 2985, 2996, 2997, 2985, 2998, 2985, 2997, 2997, 2991,
+     2991, 2985, 2999, 2992, 2999, 2992, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2993, 2993, 2994, 2994, 2995, 2995, 2985, 2996, 2996, 2997,
+     2997, 2998, 2998, 2997, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2997, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2997, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2997, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2997, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2985, 2985, 2991, 2985, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2997, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2985, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2997, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2985, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2985, 2991,
+     2985, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2985, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2985, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2985, 2985, 2991, 2991, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2985, 2985,
+     2991, 2985, 2991, 2985, 2991, 2991, 2985, 2985, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2985,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2985, 2985, 2985, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2985, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2985, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2985, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2985, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2985, 2991, 2985, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2985,
+
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2985,
+     2985, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2985, 2985, 2991, 2991, 2991, 2991, 2985, 2991, 2985,
+     2991, 2985, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2985, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991, 2985,
+
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2985, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2985,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2985, 2985, 2991, 2985, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2985, 2985, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2985,
+     2991, 2991, 2985, 2985, 2991, 2991, 2991, 2985, 2985, 2985,
+     2991, 2985, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991,
+     2991, 2985, 2991, 2991, 2991, 2991, 2985, 2985, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2985, 2985, 2991, 2985, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2985, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+
+     2991, 2991, 2991, 2991, 2985, 2991, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2991, 2985, 2991, 2991, 2991, 2991,
+     2985, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2985, 2985, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991, 2985,
+     2991, 2985, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2991, 2985, 2991, 2991, 2985,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2985, 2991,
+
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2985, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991,
+     2991, 2991, 2991, 2985, 2991, 2991, 2985, 2991, 2991, 2991,
+     2991, 2991, 2985, 2991, 2991, 2991, 2991, 2991, 2991, 2985,
+     2991, 2991, 2991, 2985, 2991, 2985, 2985, 2991, 2991, 2991,
+     2991, 2991, 2985, 2985,    0, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985
+
     } ;
 
-static const flex_int16_t yy_nxt[5809] =
+static const flex_int16_t yy_nxt[5854] =
     {   0,
        14,   15,   16,   17,   18,   19,   18,   14,   14,   14,
        14,   14,   18,   20,   21,   22,   23,   24,   25,   26,
@@ -1847,197 +1856,202 @@ static const flex_int16_t yy_nxt[5809] =
      2155,   71, 2159,   71, 2157,   71, 2163, 2162, 2167, 2158,
        71, 2164,   71,   71, 2172,   71,   71, 2168, 2174, 2166,
 
-       71,   71,   71, 2169, 2173,   71,   71, 2177, 2170,   71,
-     2178,   71,   71, 2176,   71,   71,   71, 2182, 2171,   71,
-     2175, 2184, 2180, 2187, 2185,   71,   71, 2189,   71,   71,
-     2186, 2179, 2181,   71,   71,   71,   71, 2195,   71, 2190,
-     2183, 2191,   71,   71,   71, 2194, 2188, 2196, 2193,   71,
-     2200, 2192, 2197, 2198, 2201,   71,   71,   71,   71, 2202,
-       71,   71, 2205, 2199, 2206,   71, 2207, 2204,   71,   71,
-       71,   71, 2213,   71, 2208,   71,   71, 2203,   71,   71,
-       71,   71, 2220,   71, 2215, 2211,   71, 2212, 2209,   71,
-     2210, 2214, 2216,   71, 2217, 2219, 2218, 2960, 2221, 2224,
-
-       71, 2223,   71, 2225, 2226,   71, 2222,   71,   71, 2229,
-     2227, 2230,   71, 2228,   71,   71,   71,   71, 2231,   71,
-       71, 2233,   71,   71, 2237,   71, 2232,   71, 2234, 2238,
-     2239, 2240,   71, 2236,   71,   71, 2235,   71,   71, 2241,
-     2245,   71, 2244,   71, 2242,   71,   71,   71,   71,   71,
-     2247,   71, 2254, 2251,   71,   71, 2246, 2243,   71, 2253,
-       71, 2255, 2250,   71,   71,   71, 2248, 2249, 2259, 2258,
-       71, 2252, 2261, 2260,   71,   71,   71, 2263, 2256, 2257,
-       71,   71,   71, 2264,   71, 2266, 2267, 2268,   71, 2262,
-     2270,   71,   71,   71, 2272,   71,   71,   71,   71,   71,
-
-     2269, 2271,   71, 2276,   71,   71,   71, 2265,   71, 2278,
-     2279, 2274, 2280,   71, 2273, 2275, 2281,   71, 2282,   71,
-     2283,   71, 2284,   71,   71,   71, 2286,   71, 2277, 2291,
-     2285, 2289,   71,   71,   71,   71, 2290, 2288, 2294,   71,
-       71,   71, 2287,   71,   71, 2297, 2298,   71,   71, 2293,
-       71, 2292,   71, 2299,   71, 2304,   71, 2302, 2303, 2295,
-       71, 2296,   71, 2301,   71, 2308,   71,   71, 2300, 2307,
-     2309,   71, 2310,   71, 2305, 2311,   71,   71,   71, 2312,
-       71, 2315, 2306, 2314,   71, 2316,   71,   71,   71,   71,
-     2321,   71,   71, 2323,   71, 2313, 2324,   71, 2317, 2318,
-
-       71,   71,   71,   71,   71, 2320,   71, 2327, 2319,   71,
-       71, 2322, 2325,   71, 2326, 2328, 2333,   71, 2330, 2334,
-       71,   71,   71,   71, 2329,   71, 2331,   71, 2340, 2332,
-       71,   71,   71,   71,   71, 2337,   71,   71,   71, 2339,
-     2341, 2336,   71, 2349, 2391, 2342, 2335, 2338, 2343,   71,
-     2344, 2348, 2347,   71, 2351,   71, 2345,   71, 2350, 2346,
-     2352,   71,   71, 2353,   71, 2354,   71, 2355,   71,   71,
-       71,   71,   71,   71,   71, 2356,   71,   71,   71, 2357,
-       71, 2366,   71, 2363, 2367,   71, 2370,   71, 2358, 2360,
-     2359, 2369,   71, 2362, 2361, 2365, 2364, 2372,   71,   71,
-
-     2368, 2371,   71,   71,   71,   71,   71,   71,   71,   71,
-     2375, 2381,   71, 2382,   71, 2383,   71, 2373,   71, 2376,
-     2374,   71,   71, 2377, 2378, 2379, 2380, 2386,   71, 2960,
-       71,   71,   71, 2385, 2384, 2387, 2390, 2392,   71,   71,
-       71, 2393, 2388, 2394,   71,   71,   71,   71, 2389, 2396,
-       71, 2395,   71,   71,   71, 2400,   71,   71, 2398,   71,
-     2404, 2405,   71,   71, 2397, 2408,   71, 2399, 2406,   71,
-       71,   71, 2401, 2402, 2409, 2411, 2403, 2407, 2410, 2412,
-       71,   71, 2413,   71, 2416,   71,   71,   71,   71, 2420,
-       71,   71, 2419, 2422,   71,   71, 2418,   71, 2417,   71,
-
-     2423, 2414,   71, 2415, 2425,   71,   71, 2426,   71, 2424,
-     2421, 2428,   71,   71,   71, 2429,   71, 2431, 2433,   71,
-       71, 2427,   71, 2432, 2435,   71, 2430, 2436,   71,   71,
-       71, 2434,   71, 2437, 2438, 2439,   71, 2440,   71,   71,
-       71,   71,   71,   71, 2960, 2442, 2443, 2445, 2446, 2448,
-       71, 2441, 2449,   71, 2444, 2447,   71,   71,   71, 2452,
-     2454,   71, 2451, 2450,   71,   71,   71,   71, 2456, 2455,
-       71, 2459,   71, 2460,   71, 2458, 2453,   71, 2462,   71,
-     2457,   71, 2464, 2668, 2463, 2960,   71, 2465,   71,   71,
-     2461, 2466, 2468,   71, 2467,   71,   71, 2469,   71,   71,
-
-     2470,   71,   71,   71,   71, 2471,   71, 2474,   71, 2473,
-       71, 2476,   71, 2477, 2472, 2475, 2478, 2479,   71,   71,
-       71,   71,   71, 2480,   71, 2485, 2481,   71,   71, 2483,
-     2484, 2486, 2482,   71, 2490,   71,   71,   71,   71,   71,
-     2494,   71,   71,   71,   71,   71, 2487, 2492, 2488, 2498,
-     2499,   71, 2489, 2501, 2493, 2491, 2495, 2496, 2502,   71,
-     2503, 2504,   71, 2497,   71,   71,   71,   71,   71, 2500,
-       71,   71, 2506, 2505,   71, 2509,   71, 2507,   71, 2512,
-     2513,   71,   71, 2508, 2514,   71, 2515,   71, 2510,   71,
-       71, 2511,   71, 2516, 2520, 2517, 2518,   71,   71, 2521,
-
-       71, 2526, 2519,   71, 2523, 2524,   71, 2525,   71,   71,
-       71,   71, 2522, 2530,   71,   71, 2531, 2532,   71,   71,
-     2534,   71, 2527,   71,   71,   71, 2538,   71, 2528, 2539,
-       71, 2529,   71,   71, 2533, 2541, 2535, 2540,   71, 2537,
-     2542,   71, 2536,   71,   71,   71, 2547, 2550,   71,   71,
-     2543, 2546,   71, 2549,   71,   71,   71,   71, 2544, 2551,
-     2553,   71,   71, 2545, 2552, 2555,   71,   71,   71, 2548,
-       71, 2558, 2562,   71,   71,   71, 2565,   71, 2556, 2557,
-     2554, 2566,   71, 2564, 2561, 2559, 2568,   71, 2560,   71,
-     2569,   71, 2570, 2563,   71, 2571, 2567,   71, 2572,   71,
-
-       71,   71,   71,   71,   71, 2574,   71, 2580,   71,   71,
-       71,   71, 2577, 2581, 2960, 2573, 2583,   71, 2584, 2585,
-       71, 2575, 2587,   71, 2578,   71, 2579, 2582, 2576,   71,
-     2586,   71,   71,   71, 2592,   71,   71,   71, 2588,   71,
-     2589, 2590, 2596, 2593,   71, 2594,   71, 2597,   71,   71,
-       71, 2591, 2595,   71, 2600, 2599,   71, 2598, 2601,   71,
-     2602,   71, 2604,   71,   71,   71, 2609,   71, 2603,   71,
-       71,   71,   71, 2607, 2643, 2605, 2612,   71,   71, 2610,
-       71, 2606, 2613,   71, 2614, 2608,   71, 2615,   71, 2617,
-     2611, 2616, 2618, 2619,   71, 2620,   71, 2621,   71,   71,
-
-     2623,   71,   71, 2626,   71,   71,   71, 2625, 2622,   71,
-     2627, 2628, 2629,   71,   71,   71,   71, 2634,   71,   71,
-     2624, 2632, 2630,   71, 2636,   71,   71,   71, 2640,   71,
-       71,   71,   71, 2633,   71, 2631,   71,   71, 2637, 2644,
-       71, 2638, 2648, 2635, 2641, 2642,   71, 2639, 2647,   71,
-     2645, 2650,   71, 2652,   71, 2646, 2653,   71,   71, 2655,
-       71,   71,   71,   71,   71,   71, 2660,   71, 2651,   71,
-     2659,   71, 2649,   71, 2664,   71,   71, 2656, 2657, 2654,
-     2658, 2666,   71, 2661, 2669,   71,   71, 2670,   71, 2665,
-     2663, 2667, 2662, 2672,   71,   71, 2671,   71,   71, 2677,
-
-       71,   71,   71, 2681,   71,   71, 2674, 2675,   71,   71,
-     2683, 2682,   71, 2673, 2679,   71, 2686, 2676,   71, 2678,
-       71, 2680,   71, 2688, 2684, 2687,   71, 2689,   71,   71,
-       71,   71,   71,   71, 2691, 2685, 2690, 2692, 2694, 2697,
-       71, 2698,   71,   71,   71,   71, 2742, 2693, 2695, 2696,
-     2701,   71, 2702,   71, 2700,   71,   71,   71,   71,   71,
-     2703,   71, 2699, 2705, 2706,   71, 2707,   71, 2708,   71,
-     2704,   71, 2710,   71,   71,   71, 2709,   71, 2711, 2712,
-       71, 2715,   71, 2713, 2716,   71, 2720,   71,   71, 2717,
-       71, 2719, 2723,   71,   71, 2722, 2714, 2718, 2724,   71,
-
-       71,   71,   71, 2727,   71, 2725,   71, 2721, 2726,   71,
-     2729, 2730,   71, 2728,   71,   71,   71,   71,   71, 2731,
-     2734,   71,   71, 2736, 2732,   71, 2733,   71, 2735, 2737,
-       71,   71,   71,   71, 2749,   71,   71, 2738, 2746, 2960,
-       71,   71, 2739, 2750,   71, 2740, 2764, 2747, 2741, 2743,
-     2744,   71, 2745, 2748, 2762, 2751, 2752,   71, 2753,   71,
-     2754, 2755,   71,   71, 2756, 2757, 2760,   71, 2758, 2759,
-       71,   71, 2761,   71, 2765,   71,   71,   71,   71,   71,
-       71, 2768,   71,   71, 2763, 2767,   71, 2773, 2769, 2774,
-       71,   71, 2772, 2775,   71, 2770,   71,   71, 2780,   71,
-
-     2771, 2766, 2777, 2781,   71, 2778, 2776, 2782, 2779,   71,
-       71,   71,   71,   71,   71,   71, 2786, 2787, 2789,   71,
-     2790, 2791,   71, 2960, 2783, 2784, 2792,   71, 2793,   71,
-     2785, 2794,   71, 2788, 2795,   71, 2796,   71, 2797,   71,
-     2798,   71,   71, 2800,   71,   71,   71,   71, 2803,   71,
-       71, 2799,   71,   71, 2807,   71, 2809,   71,   71,   71,
-       71, 2804, 2811, 2805, 2806, 2801, 2802,   71, 2813,   71,
-     2808,   71, 2816,   71, 2815,   71, 2810,   71,   71,   71,
-       71,   71, 2818,   71, 2823,   71, 2812, 2814,   71, 2817,
-     2824,   71, 2819, 2825,   71,   71, 2821, 2820, 2822,   71,
-
-       71,   71, 2830, 2828, 2827,   71,   71,   71, 2826, 2834,
-       71, 2833,   71, 2836,   71,   71, 2832,   71,   71,   71,
-     2829,   71,   71,   71, 2831, 2835,   71, 2837, 2847,   71,
-       71,   71,   71, 2931, 2838, 2839,   71, 2840, 2842,   71,
-     2843, 2848, 2844, 2841, 2845,   71, 2846, 2849,   71,   71,
-     2850, 2851,   71, 2852,   71, 2853,   71,   71,   71, 2854,
-     2855, 2856,   71, 2857,   71, 2860,   71, 2863,   71,   71,
-     2858,   71, 2865,   71,   71,   71,   71, 2859, 2861, 2868,
-       71,   71, 2869,   71, 2870, 2872, 2862,   71, 2864, 2866,
-     2873,   71,   71, 2867,   71,   71,   71, 2877,   71,   71,
-
-       71, 2874, 2871, 2880,   71, 2875,   71,   71,   71,   71,
-       71, 2882,   71, 2876, 2879, 2878,   71, 2887,   71,   71,
-       71, 2884, 2885, 2888, 2881, 2892, 2883, 2891,   71, 2886,
-     2893,   71, 2894,   71, 2889,   71,   71,   71, 2890,   71,
-     2895, 2899, 2896,   71, 2897, 2901,   71,   71, 2900,   71,
-       71,   71, 2898, 2902,   71,   71, 2907,   71, 2904,   71,
-       71, 2910,   71, 2911,   71,   71,   71,   71,   71, 2903,
-     2914,   71, 2909, 2905, 2906, 2912, 2908,   71, 2913,   71,
-     2918,   71, 2919,   71, 2917,   71, 2915, 2916,   71, 2922,
-       71, 2924,   71, 2925, 2920,   71,   71,   71, 2929,   71,
-
-     2926,   71,   71, 2927, 2923,   71, 2930, 2932,   71, 2921,
-       71,   71, 2933,   71, 2938,   71, 2928, 2934, 2936,   71,
-       71, 2935,   71,   71,   71, 2940,   71, 2941,   71, 2944,
-     2937, 2945,   71,   71,   71, 2948, 2949,   71, 2939,   71,
-     2951,   71, 2942, 2943,   71, 2946, 2950, 2952,   71,   71,
-       71, 2953, 2947,   71, 2954, 2955,   71, 2958,   71, 2959,
-       71, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-     2960, 2960, 2956, 2960, 2960, 2957,   43,   43,   43,   43,
-       43,   43,   43,   48,   48,   48,   48,   48,   48,   48,
-       53,   53,   53,   53,   53,   53,   53,   59,   59,   59,
-
-       59,   59,   59,   59,   64,   64,   64,   64,   64,   64,
-       64,   74,   74, 2960,   74,   74,   74,   74,  141,  141,
-     2960, 2960, 2960,  141,  141,  143,  143, 2960, 2960,  143,
-     2960,  143,  145, 2960, 2960, 2960, 2960, 2960,  145,  148,
-      148, 2960, 2960, 2960,  148,  148,  150, 2960, 2960, 2960,
-     2960, 2960,  150,  152,  152, 2960,  152,  152,  152,  152,
-       75,   75, 2960,   75,   75,   75,   75,   13, 2960, 2960,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960
+       71,   71,   71, 2169, 2173, 2175, 2179,   71, 2170,   71,
+       71,   71, 2178,   71, 2180,   71, 2184,   71, 2171,   71,
+     2176,   71, 2177, 2182, 2186,   71, 2187, 2189,   71, 2191,
+       71,   71, 2181,   71, 2183,   71, 2192,   71, 2190,   71,
+     2188, 2185, 2193, 2195,   71,   71,   71, 2196, 2197,   71,
+       71, 2202,   71, 2194, 2198, 2199, 2203,   71, 2200,   71,
+       71, 2208,   71, 2204, 2201,   71, 2207,   71,   71, 2206,
+       71, 2209, 2205,   71,   71,   71, 2215,   71,   71, 2210,
+       71,   71,   71, 2217,   71,   71, 2226,   71, 2211, 2213,
+     2212, 2214, 2218, 2216, 2221,   71,   71, 2219, 2222, 2220,
+
+       71, 2223,   71, 2227,   71, 2224, 2228,   71,   71, 2230,
+     2231, 2229, 2225, 2232, 2233,   71,   71,   71,   71,   71,
+       71, 2235,   71,   71,   71, 2239,   71,   71,   71, 2241,
+     2236, 2234, 2240, 2242,   71,   71, 2237,   71,   71,   71,
+     2243,   71, 2238, 2246, 2247,   71, 2244, 2245,   71,   71,
+       71, 2248,   71, 2249,   71,   71, 2253, 2256,   71,   71,
+     2255, 2250,   71,   71, 2252, 2257,   71, 2261,   71, 2251,
+     2263, 2260,   71,   71, 2254,   71, 2258,   71, 2259, 2985,
+     2262,   71, 2265,   71,   71, 2268, 2266,   71, 2270, 2264,
+       71, 2269, 2272,   71,   71,   71, 2274,   71,   71,   71,
+
+       71,   71, 2271, 2267, 2273, 2278,   71,   71,   71,   71,
+     2282,   71, 2280, 2276, 2281, 2284, 2275, 2277, 2283,   71,
+       71,   71,   71, 2285, 2286,   71,   71,   71, 2291,   71,
+     2288,   71, 2279,   71,   71, 2293, 2296,   71,   71, 2290,
+     2292,   71, 2287,   71,   71, 2289,   71, 2299,   71, 2295,
+       71, 2294, 2300,   71,   71, 2301,   71, 2297, 2305,   71,
+       71, 2298, 2302, 2303, 2304,   71,   71,   71, 2310,   71,
+       71,   71, 2309, 2395, 2306, 2311, 2312,   71, 2308, 2307,
+     2313,   71, 2314,   71, 2315,   71,   71, 2317,   71,   71,
+     2319,   71, 2320, 2318,   71,   71,   71,   71, 2316, 2325,
+
+       71,   71, 2327,   71, 2328,   71, 2321, 2322,   71,   71,
+       71,   71,   71, 2324,   71,   71, 2323, 2331,   71, 2329,
+     2326, 2330,   71, 2332, 2337,   71,   71, 2334,   71,   71,
+       71,   71, 2333,   71, 2335, 2336,   71, 2338,   71, 2344,
+       71,   71, 2341,   71, 2339, 2343, 2340,   71, 2346, 2345,
+       71, 2347,   71, 2351, 2342,   71,   71, 2355,   71, 2348,
+     2353, 2354, 2356,   71,   71, 2349, 2352,   71, 2357,   71,
+     2350,   71, 2358,   71, 2359,   71,   71,   71,   71,   71,
+     2361,   71, 2360,   71,   71,   71, 2370, 2371,   71,   71,
+     2367,   71,   71, 2985, 2362, 2364, 2363, 2374,   71, 2366,
+
+     2365, 2373, 2369, 2368,   71, 2376,   71,   71,   71, 2377,
+       71, 2372,   71, 2375,   71, 2379,   71,   71, 2385,   71,
+     2386,   71,   71, 2387,   71, 2378,   71, 2380, 2381,   71,
+       71,   71, 2382, 2383,   71, 2384, 2391,   71,   71, 2389,
+     2388,   71, 2394, 2396,   71, 2390,   71,   71, 2397,   71,
+     2392, 2398,   71,   71, 2393,   71, 2400, 2399,   71,   71,
+     2401, 2402,   71, 2404,   71, 2409,   71, 2408,   71,   71,
+     2412,   71,   71, 2403,   71, 2405, 2413,   71, 2406, 2416,
+       71, 2415, 2407, 2410,   71,   71,   71, 2411,   71, 2414,
+     2420,   71,   71,   71,   71, 2424,   71, 2417, 2423,   71,
+
+     2421, 2422, 2426,   71, 2427, 2418, 2419,   71,   71,   71,
+     2431,   71, 2425,   71, 2432,   71, 2428, 2434,   71,   71,
+       71, 2430,   71,   71, 2429,   71, 2439,   71, 2441,   71,
+       71, 2437, 2435, 2436, 2438, 2442,   71, 2433, 2440,   71,
+       71, 2443,   71,   71,   71, 2445,   71,   71,   71,   71,
+     2446,   71, 2449, 2444, 2451, 2448, 2452,   71, 2454,   71,
+     2455,   71, 2447, 2450,   71,   71,   71,   71, 2460, 2680,
+     2457, 2456, 2453,   71,   71,   71, 2462,   71, 2461, 2465,
+       71,   71, 2466,   71, 2458, 2459, 2464,   71, 2468,   71,
+       71, 2470, 2463, 2469,   71, 2474, 2471,   71,   71, 2472,
+
+     2467,   71,   71, 2473,   71,   71, 2475,   71,   71, 2476,
+       71,   71,   71,   71, 2477, 2480, 2479, 2482,   71,   71,
+       71, 2483, 2478, 2481, 2485, 2484,   71,   71,   71,   71,
+       71, 2486,   71, 2491,   71,   71,   71, 2489, 2487, 2490,
+     2488,   71,   71, 2492, 2496,   71,   71,   71, 2493, 2500,
+       71, 2499,   71,   71,   71, 2494, 2498,   71, 2504, 2985,
+     2495, 2497, 2505,   71, 2507, 2501, 2508, 2502, 2509,   71,
+       71,   71,   71, 2503,   71, 2510,   71, 2511,   71,   71,
+     2513,   71, 2506, 2512,   71, 2515,   71,   71, 2518, 2519,
+       71,   71, 2514, 2520,   71, 2521,   71,   71, 2516,   71,
+
+       71, 2517, 2523, 2522, 2524,   71,   71,   71, 2528,   71,
+     2531, 2525, 2526, 2529,   71, 2532,   71,   71, 2527,   71,
+     2530, 2533,   71,   71,   71,   71, 2534, 2538,   71,   71,
+     2535,   71, 2539, 2540,   71, 2542,   71, 2536,   71,   71,
+     2541, 2546, 2543,   71, 2537, 2547,   71,   71,   71, 2549,
+       71,   71, 2548, 2545, 2550,   71, 2544,   71, 2555,   71,
+       71,   71,   71, 2554,   71, 2557, 2551, 2558,   71,   71,
+     2552, 2553,   71,   71, 2559,   71, 2561,   71, 2563,   71,
+     2560,   71, 2568,   71, 2556, 2562, 2566,   71, 2570,   71,
+       71,   71, 2576,   71, 2564, 2565,   71, 2567, 2572, 2573,
+
+       71, 2569, 2571,   71, 2574,   71,   71, 2577,   71, 2578,
+     2575,   71, 2579,   71, 2580,   71, 2581,   71,   71,   71,
+     2582, 2985, 2584, 2583, 2588,   71, 2585,   71,   71,   71,
+     2589, 2591,   71, 2593,   71,   71, 2592,   71, 2586, 2587,
+     2594, 2595,   71,   71,   71,   71, 2590, 2600,   71,   71,
+       71,   71, 2596, 2597, 2598, 2599,   71, 2604, 2602,   71,
+     2601,   71, 2605,   71, 2606, 2603, 2608,   71, 2607, 2609,
+       71, 2610,   71,   71,   71,   71,   71,   71,   71,   71,
+     2619, 2611,   71,   71, 2614,   71,   71, 2617, 2615, 2636,
+     2622,   71, 2613, 2985, 2620,   71, 2623,   71, 2612, 2618,
+
+       71, 2624, 2616,   71, 2621,   71, 2625,   71, 2626,   71,
+     2627, 2629,   71, 2628, 2630,   71, 2631,   71,   71,   71,
+     2639,   71,   71,   71, 2635, 2633, 2634, 2632, 2637,   71,
+       71,   71,   71, 2644, 2638,   71, 2642, 2646,   71,   71,
+     2640,   71,   71,   71, 2650,   71,   71,   71,   71,   71,
+     2643, 2641, 2653,   71,   71,   71, 2648,   71,   71, 2651,
+     2645, 2647, 2652, 2649, 2654, 2657, 2656,   71,   71, 2655,
+     2660,   71, 2658, 2662,   71, 2663,   71, 2661, 2665,   71,
+     2659,   71,   71,   71,   71,   71, 2670,   71,   71, 2664,
+     2669,   71,   71, 2674,   71, 2676,   71, 2666, 2667, 2668,
+
+       71, 2678, 2681,   71, 2671, 2682,   71,   71, 2675,   71,
+     2673, 2672,   71,   71, 2679, 2684,   71,   71,   71, 2689,
+     2677,   71,   71,   71, 2686,   71, 2687, 2693,   71,   71,
+       71,   71, 2683, 2694, 2691, 2685,   71, 2695, 2688, 2698,
+     2690, 2696, 2701, 2692,   71,   71, 2699,   71,   71,   71,
+       71, 2697, 2700,   71,   71, 2703,   71, 2706, 2704,   71,
+     2709,   71, 2702,   71, 2710,   71, 2713,   71,   71,   71,
+     2714,   71,   71, 2705,   71, 2711, 2707, 2708, 2712, 2715,
+       71,   71, 2716, 2718,   71, 2717, 2719,   71, 2720,   71,
+       71, 2722,   71,   71, 2724, 2721,   71,   71, 2727,   71,
+
+     2723, 2728,   71,   71, 2733,   71, 2732,   71,   71,   71,
+       71,   71,   71, 2729, 2731, 2725, 2783, 2736, 2726, 2737,
+       71, 2738,   71, 2730,   71,   71, 2741,   71, 2734, 2739,
+     2735,   71,   71, 2744,   71, 2743,   71,   71,   71, 2740,
+       71, 2745,   71, 2742,   71, 2748,   71,   71,   71,   71,
+     2750,   71,   71, 2985, 2749, 2751,   71, 2746, 2747,   71,
+       71,   71,   71,   71, 2765, 2752, 2760, 2756, 2753, 2754,
+     2755, 2763,   71, 2757, 2758,   71, 2762, 2764,   71, 2774,
+     2759,   71, 2761, 2766,   71, 2767,   71, 2768, 2769,   71,
+       71, 2770, 2771,   71,   71, 2772, 2773,   71,   71, 2775,
+
+       71, 2778,   71,   71, 2781,   71,   71, 2776, 2780,   71,
+     2784, 2777,   71, 2779,   71,   71,   71, 2789, 2785, 2790,
+       71, 2791,   71,   71, 2788,   71,   71, 2782,   71, 2786,
+     2787, 2793,   71, 2798, 2794, 2796,   71, 2795, 2792,   71,
+     2797,   71,   71,   71,   71, 2805,   71, 2800, 2802, 2803,
+       71, 2807,   71, 2799,   71, 2806, 2854, 2801, 2808,   71,
+       71, 2804, 2809,   71, 2810,   71, 2811,   71, 2812,   71,
+     2813,   71, 2814,   71,   71, 2816,   71,   71,   71,   71,
+     2819, 2821,   71, 2815,   71,   71, 2817,   71,   71, 2825,
+     2818,   71, 2827,   71,   71,   71,   71, 2824, 2820, 2822,
+
+     2823,   71,   71, 2831, 2829,   71, 2826, 2834, 2833,   71,
+       71,   71, 2828,   71, 2832, 2836,   71,   71,   71,   71,
+       71, 2830, 2841, 2835, 2843,   71, 2844,   71, 2845,   71,
+     2837, 2842,   71, 2839, 2838, 2840,   71,   71,   71,   71,
+       71, 2848,   71,   71,   71, 2847,   71, 2853,   71, 2856,
+       71,   71,   71, 2850, 2852, 2846,   71,   71, 2849, 2855,
+       71,   71,   71, 2851, 2857, 2858,   71, 2865, 2859,   71,
+     2868,   71, 2860,   71,   71, 2862,   71, 2861, 2863,   71,
+     2866, 2864, 2869, 2870,   71,   71, 2871, 2872,   71, 2867,
+     2873,   71,   71, 2874,   71, 2876, 2875,   71,   71, 2877,
+
+     2881,   71, 2878,   71, 2879,   71,   71, 2884,   71,   71,
+     2887,   71,   71, 2880,   71, 2882, 2890,   71,   71, 2891,
+     2885,   71,   71, 2883, 2894, 2895,   71, 2888, 2886, 2892,
+       71,   71, 2889,   71,   71, 2899,   71,   71,   71,   71,
+     2896, 2893,   71,   71,   71,   71, 2897, 2903,   71, 2905,
+       71,   71, 2902, 2898,   71,   71, 2985,   71, 2900, 2901,
+     2910, 2907, 2904, 2908, 2906,   71,   71, 2915,   71,   71,
+     2909, 2911,   71, 2917, 2912, 2913, 2985, 2916,   71,   71,
+       71, 2918,   71, 2919, 2914,   71, 2923, 2920, 2922,   71,
+     2921,   71,   71, 2924,   71,   71, 2925, 2926,   71, 2927,
+
+       71,   71,   71, 2932,   71,   71,   71, 2929, 2928,   71,
+       71, 2935, 2936,   71,   71,   71,   71,   71, 2934, 2939,
+     2930, 2931,   71, 2933, 2937, 2940,   71, 2938,   71, 2943,
+     2942, 2944,   71,   71, 2947, 2941,   71,   71, 2949,   71,
+     2950,   71,   71,   71,   71, 2945, 2951,   71, 2946, 2952,
+     2954,   71, 2955,   71,   71, 2948, 2956, 2957,   71,   71,
+     2958,   71, 2953, 2960,   71,   71, 2959, 2963,   71, 2961,
+       71,   71,   71,   71,   71, 2965, 2966,   71, 2969,   71,
+     2962, 2970,   71,   71, 2964,   71, 2973, 2974,   71,   71,
+     2975, 2967, 2968, 2971, 2976,   71, 2977,   71, 2972,   71,
+
+       71,   71,   71, 2983,   71, 2979, 2978, 2980, 2981, 2984,
+       71, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2982,   43,   43,   43,   43,   43,   43,   43,   48,   48,
+       48,   48,   48,   48,   48,   53,   53,   53,   53,   53,
+       53,   53,   59,   59,   59,   59,   59,   59,   59,   64,
+       64,   64,   64,   64,   64,   64,   74,   74, 2985,   74,
+       74,   74,   74,  141,  141, 2985, 2985, 2985,  141,  141,
+      143,  143, 2985, 2985,  143, 2985,  143,  145, 2985, 2985,
+     2985, 2985, 2985,  145,  148,  148, 2985, 2985, 2985,  148,
+      148,  150, 2985, 2985, 2985, 2985, 2985,  150,  152,  152,
+
+     2985,  152,  152,  152,  152,   75,   75, 2985,   75,   75,
+       75,   75,   13, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985
     } ;
 
-static const flex_int16_t yy_chk[5809] =
+static const flex_int16_t yy_chk[5854] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -2047,7 +2061,7 @@ static const flex_int16_t yy_chk[5809] =
         5,    3,    6,   20,    4,   20,   20,    5,   20,    6,
         7,    7,    7,    7,   20,    7,    8,    8,    8,    8,
        29,    8,    7,    9,    9,    9,   22,   22,    8,   10,
-       10,   10,   15,   25,    9,   29,   15,   25, 2966,   31,
+       10,   10,   15,   25,    9,   29,   15,   25, 2991,   31,
        10,   11,   11,   11,   11,   11,   11,   19,   79,   19,
 
        19,   30,   19,   11,   31,   79,   30,   25,   19,   19,
@@ -2490,194 +2504,199 @@ static const flex_int16_t yy_chk[5809] =
      1998, 2012, 2003, 2013, 2001, 2014, 2007, 2006, 2012, 2002,
      2015, 2008, 2016, 2017, 2017, 2018, 2019, 2013, 2019, 2011,
 
-     2020, 2022, 2023, 2014, 2018, 2024, 2025, 2023, 2015, 2026,
-     2024, 2027, 2028, 2022, 2029, 2033, 2031, 2028, 2016, 2032,
-     2020, 2031, 2026, 2034, 2032, 2035, 2039, 2036, 2042, 2034,
-     2033, 2025, 2027, 2036, 2037, 2040, 2038, 2042, 2043, 2037,
-     2029, 2038, 2041, 2044, 2045, 2041, 2035, 2043, 2040, 2046,
-     2047, 2039, 2044, 2045, 2048, 2049, 2047, 2051, 2053, 2049,
-     2048, 2054, 2054, 2046, 2055, 2056, 2056, 2053, 2057, 2059,
-     2055, 2060, 2061, 2061, 2056, 2063, 2062, 2051, 2066, 2070,
-     2065, 2067, 2070, 2068, 2063, 2059, 2072, 2060, 2057, 2073,
-     2057, 2062, 2065, 2071, 2066, 2068, 2067,   13, 2071, 2074,
-
-     2074, 2073, 2075, 2075, 2077, 2077, 2072, 2078, 2079, 2080,
-     2078, 2081, 2083, 2079, 2087, 2080, 2085, 2081, 2082, 2082,
-     2084, 2084, 2086, 2088, 2088, 2090, 2083, 2091, 2085, 2090,
-     2091, 2092, 2092, 2087, 2093, 2094, 2086, 2095, 2096, 2093,
-     2097, 2097, 2096, 2098, 2094, 2100, 2101, 2102, 2103, 2104,
-     2100, 2105, 2107, 2104, 2106, 2108, 2098, 2095, 2107, 2106,
-     2109, 2108, 2103, 2111, 2112, 2114, 2101, 2102, 2113, 2112,
-     2115, 2105, 2115, 2114, 2113, 2118, 2119, 2119, 2109, 2111,
-     2120, 2121, 2124, 2120, 2122, 2122, 2124, 2125, 2126, 2118,
-     2127, 2127, 2128, 2125, 2131, 2131, 2133, 2135, 2139, 2136,
-
-     2126, 2128, 2140, 2139, 2141, 2142, 2149, 2121, 2150, 2141,
-     2142, 2135, 2143, 2143, 2133, 2136, 2145, 2145, 2147, 2148,
-     2148, 2151, 2149, 2153, 2147, 2154, 2151, 2157, 2140, 2158,
-     2150, 2155, 2155, 2159, 2160, 2158, 2157, 2154, 2162, 2162,
-     2163, 2173, 2153, 2164, 2166, 2166, 2167, 2167, 2168, 2160,
-     2169, 2159, 2171, 2168, 2170, 2173, 2172, 2171, 2172, 2163,
-     2174, 2164, 2175, 2170, 2176, 2177, 2177, 2181, 2169, 2176,
-     2178, 2178, 2179, 2179, 2174, 2180, 2180, 2182, 2183, 2181,
-     2184, 2184, 2175, 2183, 2185, 2185, 2186, 2187, 2188, 2189,
-     2190, 2190, 2191, 2192, 2192, 2182, 2193, 2193, 2186, 2187,
-
-     2196, 2194, 2195, 2197, 2198, 2189, 2200, 2196, 2188, 2201,
-     2203, 2191, 2194, 2199, 2195, 2197, 2202, 2202, 2199, 2203,
-     2204, 2205, 2206, 2207, 2198, 2208, 2200, 2209, 2209, 2201,
-     2211, 2210, 2214, 2212, 2215, 2206, 2216, 2218, 2219, 2208,
-     2210, 2205, 2266, 2219, 2266, 2211, 2204, 2207, 2212, 2217,
-     2214, 2218, 2217, 2220, 2221, 2221, 2215, 2228, 2220, 2216,
-     2222, 2222, 2223, 2223, 2225, 2225, 2227, 2227, 2229, 2230,
-     2232, 2233, 2234, 2235, 2236, 2228, 2237, 2238, 2242, 2229,
-     2239, 2239, 2243, 2236, 2241, 2241, 2244, 2244, 2230, 2233,
-     2232, 2243, 2246, 2235, 2234, 2238, 2237, 2247, 2247, 2248,
-
-     2242, 2246, 2249, 2250, 2251, 2252, 2253, 2255, 2261, 2254,
-     2250, 2256, 2256, 2257, 2257, 2258, 2259, 2248, 2260, 2251,
-     2249, 2258, 2263, 2252, 2253, 2254, 2255, 2261, 2264,    0,
-     2262, 2265, 2271, 2260, 2259, 2262, 2265, 2267, 2267, 2268,
-     2273, 2268, 2263, 2269, 2269, 2274, 2275, 2276, 2264, 2273,
-     2277, 2271, 2278, 2285, 2279, 2277, 2282, 2283, 2275, 2286,
-     2283, 2284, 2284, 2290, 2274, 2287, 2287, 2276, 2285, 2293,
-     2288, 2291, 2278, 2279, 2288, 2291, 2282, 2286, 2290, 2292,
-     2292, 2295, 2293, 2296, 2297, 2297, 2299, 2300, 2301, 2302,
-     2302, 2303, 2301, 2304, 2304, 2305, 2300, 2306, 2299, 2313,
-
-     2305, 2295, 2315, 2296, 2307, 2307, 2312, 2312, 2317, 2306,
-     2303, 2314, 2314, 2316, 2318, 2315, 2320, 2317, 2319, 2319,
-     2327, 2313, 2325, 2318, 2322, 2322, 2316, 2325, 2326, 2329,
-     2328, 2320, 2330, 2326, 2327, 2328, 2331, 2329, 2332, 2334,
-     2337, 2342, 2335, 2336,    0, 2331, 2332, 2335, 2336, 2338,
-     2338, 2330, 2339, 2339, 2334, 2337, 2340, 2341, 2343, 2342,
-     2344, 2604, 2341, 2340, 2345, 2347, 2344, 2346, 2346, 2345,
-     2348, 2349, 2349, 2350, 2350, 2348, 2343, 2353, 2354, 2354,
-     2347, 2355, 2356, 2604, 2355,    0, 2357, 2356, 2356, 2358,
-     2353, 2357, 2359, 2360, 2358, 2361, 2362, 2360, 2359, 2363,
-
-     2361, 2364, 2365, 2366, 2371, 2362, 2368, 2365, 2375, 2364,
-     2369, 2368, 2373, 2369, 2363, 2366, 2371, 2373, 2374, 2376,
-     2377, 2378, 2380, 2374, 2379, 2379, 2375, 2383, 2384, 2377,
-     2378, 2380, 2376, 2385, 2386, 2386, 2387, 2391, 2388, 2389,
-     2390, 2390, 2393, 2395, 2398, 2396, 2383, 2388, 2384, 2396,
-     2397, 2397, 2385, 2399, 2389, 2387, 2391, 2393, 2400, 2399,
-     2401, 2402, 2402, 2395, 2400, 2403, 2401, 2404, 2406, 2398,
-     2407, 2409, 2404, 2403, 2410, 2409, 2411, 2406, 2413, 2413,
-     2414, 2414, 2423, 2407, 2415, 2415, 2417, 2417, 2410, 2418,
-     2419, 2411, 2426, 2418, 2424, 2419, 2421, 2421, 2431, 2424,
-
-     2424, 2431, 2423, 2427, 2427, 2429, 2429, 2430, 2430, 2432,
-     2434, 2436, 2426, 2437, 2437, 2438, 2438, 2439, 2439, 2440,
-     2441, 2441, 2432, 2442, 2443, 2444, 2445, 2451, 2434, 2446,
-     2446, 2436, 2445, 2447, 2440, 2450, 2442, 2447, 2452, 2444,
-     2450, 2450, 2443, 2453, 2456, 2454, 2455, 2458, 2458, 2457,
-     2451, 2454, 2455, 2457, 2461, 2466, 2463, 2464, 2452, 2461,
-     2464, 2468, 2467, 2453, 2463, 2467, 2469, 2470, 2471, 2456,
-     2472, 2469, 2473, 2473, 2474, 2475, 2476, 2477, 2468, 2468,
-     2466, 2476, 2476, 2475, 2472, 2470, 2478, 2478, 2471, 2479,
-     2479, 2480, 2480, 2474, 2481, 2481, 2477, 2482, 2482, 2483,
-
-     2484, 2485, 2486, 2487, 2488, 2484, 2489, 2491, 2491, 2493,
-     2492, 2496, 2487, 2492,    0, 2483, 2495, 2495, 2496, 2497,
-     2497, 2485, 2500, 2500, 2488, 2498, 2489, 2493, 2486, 2501,
-     2498, 2502, 2503, 2505, 2506, 2506, 2508, 2509, 2501, 2507,
-     2502, 2503, 2510, 2507, 2511, 2508, 2512, 2510, 2510, 2516,
-     2520, 2505, 2509, 2522, 2516, 2512, 2526, 2511, 2517, 2517,
-     2519, 2519, 2522, 2523, 2527, 2528, 2529, 2531, 2520, 2533,
-     2571, 2535, 2529, 2527, 2571, 2523, 2535, 2536, 2538, 2531,
-     2547, 2526, 2536, 2537, 2537, 2528, 2540, 2538, 2541, 2541,
-     2533, 2540, 2541, 2543, 2543, 2544, 2544, 2545, 2545, 2546,
-
-     2547, 2548, 2549, 2551, 2555, 2552, 2553, 2549, 2546, 2551,
-     2552, 2553, 2554, 2554, 2556, 2558, 2557, 2559, 2560, 2563,
-     2548, 2557, 2555, 2559, 2561, 2561, 2564, 2565, 2567, 2567,
-     2572, 2569, 2570, 2558, 2573, 2556, 2574, 2576, 2563, 2572,
-     2575, 2564, 2576, 2560, 2569, 2570, 2577, 2565, 2575, 2579,
-     2573, 2578, 2578, 2581, 2581, 2574, 2582, 2582, 2584, 2586,
-     2586, 2588, 2589, 2594, 2590, 2591, 2593, 2593, 2579, 2595,
-     2591, 2596, 2577, 2598, 2598, 2599, 2607, 2588, 2589, 2584,
-     2590, 2600, 2600, 2594, 2605, 2605, 2603, 2606, 2606, 2599,
-     2596, 2603, 2595, 2608, 2608, 2609, 2607, 2611, 2610, 2612,
-
-     2613, 2615, 2614, 2616, 2616, 2612, 2609, 2610, 2617, 2618,
-     2618, 2617, 2622, 2608, 2614, 2623, 2624, 2611, 2628, 2613,
-     2626, 2615, 2624, 2626, 2622, 2625, 2625, 2627, 2632, 2630,
-     2693, 2634, 2631, 2627, 2630, 2623, 2628, 2631, 2633, 2635,
-     2635, 2637, 2637, 2638, 2633, 2639, 2693, 2632, 2634, 2634,
-     2641, 2641, 2642, 2642, 2639, 2643, 2644, 2656, 2645, 2654,
-     2643, 2657, 2638, 2645, 2646, 2646, 2647, 2647, 2648, 2648,
-     2644, 2649, 2651, 2651, 2658, 2662, 2649, 2663, 2654, 2656,
-     2659, 2659, 2664, 2657, 2661, 2661, 2665, 2665, 2667, 2662,
-     2668, 2664, 2671, 2671, 2675, 2668, 2658, 2663, 2673, 2673,
-
-     2674, 2677, 2678, 2676, 2682, 2674, 2683, 2667, 2675, 2676,
-     2678, 2679, 2679, 2677, 2680, 2684, 2685, 2686, 2689, 2680,
-     2684, 2688, 2690, 2686, 2682, 2691, 2683, 2699, 2685, 2688,
-     2692, 2695, 2694, 2696, 2703, 2703, 2718, 2689, 2696,    0,
-     2700, 2721, 2690, 2704, 2704, 2691, 2721, 2699, 2692, 2694,
-     2694, 2705, 2695, 2700, 2718, 2705, 2709, 2709, 2711, 2711,
-     2712, 2712, 2715, 2712, 2713, 2713, 2715, 2713, 2714, 2714,
-     2719, 2714, 2717, 2717, 2722, 2722, 2725, 2727, 2726, 2728,
-     2729, 2727, 2731, 2732, 2719, 2726, 2733, 2733, 2728, 2734,
-     2734, 2736, 2732, 2735, 2735, 2729, 2738, 2737, 2739, 2741,
-
-     2731, 2725, 2737, 2739, 2739, 2738, 2736, 2740, 2738, 2743,
-     2742, 2744, 2745, 2740, 2746, 2748, 2744, 2745, 2747, 2747,
-     2748, 2751, 2751,    0, 2741, 2742, 2754, 2754, 2755, 2755,
-     2743, 2756, 2756, 2746, 2757, 2757, 2758, 2758, 2759, 2759,
-     2760, 2760, 2762, 2763, 2763, 2764, 2768, 2766, 2767, 2767,
-     2769, 2762, 2770, 2771, 2771, 2772, 2773, 2773, 2776, 2777,
-     2778, 2768, 2777, 2769, 2770, 2764, 2766, 2779, 2779, 2780,
-     2772, 2782, 2783, 2786, 2782, 2784, 2776, 2785, 2783, 2787,
-     2788, 2799, 2785, 2790, 2799, 2804, 2778, 2780, 2808, 2784,
-     2801, 2801, 2786, 2802, 2802, 2805, 2788, 2787, 2790, 2806,
-
-     2807, 2810, 2808, 2806, 2805, 2811, 2812, 2813, 2804, 2813,
-     2814, 2812, 2815, 2815, 2816, 2817, 2811, 2818, 2820, 2822,
-     2807, 2819, 2823, 2821, 2810, 2814, 2827, 2816, 2828, 2828,
-     2826, 2922, 2829, 2922, 2817, 2818, 2834, 2819, 2821, 2835,
-     2822, 2829, 2823, 2820, 2826, 2839, 2827, 2830, 2830, 2831,
-     2831, 2832, 2832, 2833, 2833, 2834, 2837, 2836, 2838, 2835,
-     2836, 2837, 2840, 2838, 2842, 2841, 2843, 2844, 2844, 2845,
-     2839, 2841, 2846, 2846, 2848, 2850, 2855, 2840, 2842, 2853,
-     2853, 2854, 2854, 2856, 2855, 2857, 2843, 2859, 2845, 2848,
-     2858, 2857, 2860, 2850, 2861, 2864, 2858, 2862, 2862, 2867,
-
-     2866, 2859, 2856, 2867, 2869, 2860, 2870, 2871, 2872, 2873,
-     2874, 2870, 2875, 2861, 2866, 2864, 2878, 2875, 2876, 2879,
-     2881, 2872, 2873, 2876, 2869, 2881, 2871, 2880, 2880, 2874,
-     2882, 2883, 2883, 2887, 2878, 2884, 2882, 2885, 2879, 2886,
-     2884, 2888, 2885, 2889, 2886, 2890, 2890, 2888, 2889, 2892,
-     2893, 2894, 2887, 2892, 2895, 2896, 2897, 2898, 2894, 2899,
-     2900, 2900, 2897, 2902, 2902, 2904, 2903, 2905, 2906, 2893,
-     2904, 2907, 2899, 2895, 2896, 2903, 2898, 2909, 2903, 2908,
-     2908, 2910, 2909, 2912, 2907, 2914, 2905, 2906, 2913, 2913,
-     2915, 2915, 2916, 2916, 2910, 2917, 2918, 2919, 2920, 2920,
-
-     2917, 2921, 2926, 2918, 2914, 2924, 2921, 2923, 2923, 2912,
-     2925, 2928, 2924, 2927, 2930, 2930, 2919, 2925, 2927, 2931,
-     2933, 2926, 2934, 2935, 2936, 2933, 2940, 2934, 2937, 2937,
-     2928, 2939, 2939, 2941, 2942, 2942, 2943, 2943, 2931, 2944,
-     2946, 2946, 2935, 2936, 2948, 2940, 2944, 2947, 2947, 2950,
-     2953, 2948, 2941, 2954, 2950, 2953, 2955, 2956, 2956, 2957,
-     2957,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0, 2954,    0,    0, 2955, 2961, 2961, 2961, 2961,
-     2961, 2961, 2961, 2962, 2962, 2962, 2962, 2962, 2962, 2962,
-     2963, 2963, 2963, 2963, 2963, 2963, 2963, 2964, 2964, 2964,
-
-     2964, 2964, 2964, 2964, 2965, 2965, 2965, 2965, 2965, 2965,
-     2965, 2967, 2967,    0, 2967, 2967, 2967, 2967, 2968, 2968,
-        0,    0,    0, 2968, 2968, 2969, 2969,    0,    0, 2969,
-        0, 2969, 2970,    0,    0,    0,    0,    0, 2970, 2971,
-     2971,    0,    0,    0, 2971, 2971, 2972,    0,    0,    0,
-        0,    0, 2972, 2973, 2973,    0, 2973, 2973, 2973, 2973,
-     2974, 2974,    0, 2974, 2974, 2974, 2974, 2960, 2960, 2960,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960,
-
-     2960, 2960, 2960, 2960, 2960, 2960, 2960, 2960
+     2022, 2023, 2020, 2014, 2018, 2020, 2023, 2025, 2015, 2024,
+     2026, 2028, 2022, 2027, 2024, 2029, 2028, 2035, 2016, 2031,
+     2020, 2032, 2020, 2026, 2031, 2033, 2032, 2034, 2039, 2036,
+     2040, 2037, 2025, 2034, 2027, 2036, 2037, 2038, 2035, 2042,
+     2033, 2029, 2038, 2040, 2041, 2043, 2044, 2041, 2042, 2045,
+     2046, 2047, 2051, 2039, 2043, 2044, 2048, 2047, 2045, 2049,
+     2053, 2055, 2048, 2049, 2046, 2054, 2054, 2055, 2057, 2053,
+     2056, 2056, 2051, 2059, 2063, 2060, 2061, 2061, 2062, 2056,
+     2065, 2066, 2068, 2063, 2067, 2072, 2074, 2074, 2057, 2059,
+     2057, 2060, 2065, 2062, 2068, 2070, 2071, 2066, 2070, 2067,
+
+     2073, 2071, 2075, 2075, 2079, 2072, 2077, 2077, 2078, 2079,
+     2080, 2078, 2073, 2081, 2082, 2082, 2080, 2083, 2085, 2081,
+     2084, 2084, 2086, 2087, 2088, 2088, 2091, 2095, 2090, 2091,
+     2085, 2083, 2090, 2092, 2092, 2093, 2086, 2094, 2098, 2096,
+     2093, 2101, 2087, 2096, 2097, 2097, 2094, 2095, 2100, 2102,
+     2103, 2098, 2104, 2100, 2105, 2106, 2104, 2107, 2109, 2108,
+     2106, 2101, 2111, 2107, 2103, 2108, 2112, 2113, 2115, 2102,
+     2115, 2112, 2114, 2113, 2105, 2118, 2109, 2121, 2111,   13,
+     2114, 2119, 2119, 2120, 2122, 2122, 2120, 2124, 2125, 2118,
+     2126, 2124, 2127, 2127, 2125, 2128, 2131, 2131, 2133, 2135,
+
+     2139, 2136, 2126, 2121, 2128, 2139, 2140, 2141, 2149, 2142,
+     2143, 2143, 2141, 2135, 2142, 2147, 2133, 2136, 2145, 2145,
+     2150, 2147, 2148, 2148, 2149, 2151, 2153, 2154, 2155, 2155,
+     2151, 2157, 2140, 2159, 2160, 2158, 2162, 2162, 2163, 2154,
+     2157, 2158, 2150, 2164, 2169, 2153, 2166, 2166, 2177, 2160,
+     2168, 2159, 2167, 2167, 2170, 2168, 2172, 2163, 2172, 2171,
+     2173, 2164, 2169, 2170, 2171, 2174, 2175, 2176, 2177, 2184,
+     2178, 2268, 2176, 2268, 2173, 2178, 2179, 2179, 2175, 2174,
+     2180, 2180, 2181, 2181, 2182, 2182, 2183, 2184, 2185, 2186,
+     2186, 2187, 2187, 2185, 2188, 2189, 2190, 2191, 2183, 2192,
+
+     2192, 2193, 2194, 2194, 2195, 2195, 2188, 2189, 2196, 2197,
+     2198, 2199, 2200, 2191, 2202, 2203, 2190, 2198, 2206, 2196,
+     2193, 2197, 2201, 2199, 2204, 2204, 2207, 2201, 2205, 2208,
+     2209, 2210, 2200, 2213, 2202, 2203, 2214, 2205, 2211, 2211,
+     2212, 2216, 2208, 2217, 2206, 2210, 2207, 2218, 2213, 2212,
+     2219, 2214, 2220, 2219, 2209, 2221, 2222, 2223, 2223, 2216,
+     2221, 2222, 2224, 2224, 2230, 2217, 2220, 2225, 2225, 2231,
+     2218, 2227, 2227, 2229, 2229, 2232, 2234, 2235, 2236, 2237,
+     2231, 2238, 2230, 2239, 2240, 2241, 2241, 2243, 2243, 2244,
+     2238, 2250, 2245,    0, 2232, 2235, 2234, 2246, 2246, 2237,
+
+     2236, 2245, 2240, 2239, 2248, 2249, 2249, 2251, 2252, 2250,
+     2254, 2244, 2253, 2248, 2255, 2252, 2257, 2256, 2258, 2258,
+     2259, 2259, 2261, 2260, 2262, 2251, 2263, 2253, 2254, 2260,
+     2265, 2264, 2255, 2256, 2266, 2257, 2264, 2267, 2273, 2262,
+     2261, 2276, 2267, 2269, 2269, 2263, 2270, 2275, 2270, 2277,
+     2265, 2271, 2271, 2278, 2266, 2280, 2275, 2273, 2279, 2281,
+     2276, 2277, 2284, 2279, 2285, 2286, 2286, 2285, 2287, 2288,
+     2289, 2289, 2290, 2278, 2292, 2280, 2290, 2293, 2281, 2294,
+     2294, 2293, 2284, 2287, 2295, 2297, 2298, 2288, 2301, 2292,
+     2299, 2299, 2302, 2305, 2303, 2304, 2304, 2295, 2303, 2307,
+
+     2301, 2302, 2306, 2306, 2307, 2297, 2298, 2308, 2309, 2310,
+     2311, 2311, 2305, 2316, 2316, 2317, 2308, 2318, 2318, 2319,
+     2320, 2310, 2321, 2324, 2309, 2322, 2323, 2323, 2326, 2326,
+     2329, 2321, 2319, 2320, 2322, 2329, 2330, 2317, 2324, 2331,
+     2332, 2330, 2333, 2334, 2336, 2332, 2335, 2614, 2338, 2339,
+     2333, 2340, 2336, 2331, 2339, 2335, 2340, 2341, 2342, 2342,
+     2343, 2343, 2334, 2338, 2344, 2345, 2346, 2347, 2348, 2614,
+     2345, 2344, 2341, 2349, 2348, 2350, 2350, 2351, 2349, 2353,
+     2353, 2352, 2354, 2354, 2346, 2347, 2352, 2357, 2358, 2358,
+     2359, 2360, 2351, 2359, 2361, 2363, 2360, 2360, 2362, 2361,
+
+     2357, 2363, 2364, 2362, 2365, 2366, 2364, 2367, 2368, 2365,
+     2369, 2370, 2372, 2375, 2366, 2369, 2368, 2372, 2373, 2377,
+     2379, 2373, 2367, 2370, 2377, 2375, 2378, 2380, 2381, 2387,
+     2382, 2378, 2383, 2383, 2384, 2388, 2393, 2381, 2379, 2382,
+     2380, 2389, 2391, 2384, 2390, 2390, 2395, 2392, 2387, 2394,
+     2394, 2393, 2397, 2399, 2400, 2388, 2392, 2402, 2400,    0,
+     2389, 2391, 2401, 2401, 2403, 2395, 2404, 2397, 2405, 2407,
+     2403, 2410, 2404, 2399, 2405, 2406, 2406, 2407, 2408, 2411,
+     2410, 2413, 2402, 2408, 2414, 2413, 2415, 2417, 2417, 2418,
+     2418, 2427, 2411, 2419, 2419, 2421, 2421, 2423, 2414, 2422,
+
+     2432, 2415, 2423, 2422, 2425, 2425, 2429, 2428, 2430, 2433,
+     2433, 2427, 2428, 2430, 2430, 2435, 2435, 2438, 2429, 2440,
+     2432, 2436, 2436, 2437, 2442, 2446, 2437, 2443, 2443, 2448,
+     2438, 2444, 2444, 2445, 2445, 2447, 2447, 2440, 2449, 2450,
+     2446, 2451, 2448, 2457, 2442, 2452, 2452, 2451, 2453, 2456,
+     2458, 2459, 2453, 2450, 2456, 2456, 2449, 2460, 2461, 2462,
+     2472, 2463, 2477, 2460, 2461, 2463, 2457, 2464, 2464, 2467,
+     2458, 2459, 2469, 2470, 2467, 2473, 2470, 2474, 2473, 2476,
+     2469, 2475, 2477, 2480, 2462, 2472, 2475, 2478, 2479, 2479,
+     2481, 2483, 2484, 2484, 2474, 2474, 2492, 2476, 2481, 2482,
+
+     2489, 2478, 2480, 2491, 2482, 2482, 2485, 2485, 2486, 2486,
+     2483, 2487, 2487, 2488, 2488, 2490, 2489, 2493, 2494, 2495,
+     2490,    0, 2492, 2491, 2497, 2497, 2493, 2498, 2499, 2502,
+     2498, 2501, 2501, 2503, 2503, 2504, 2502, 2511, 2494, 2495,
+     2504, 2506, 2506, 2507, 2508, 2509, 2499, 2512, 2512, 2514,
+     2515, 2517, 2507, 2508, 2509, 2511, 2513, 2516, 2514, 2518,
+     2513, 2522, 2516, 2516, 2517, 2515, 2522, 2526, 2518, 2523,
+     2523, 2525, 2525, 2527, 2528, 2530, 2531, 2534, 2535, 2536,
+     2537, 2526, 2539, 2541, 2530, 2543, 2537, 2535, 2531, 2559,
+     2543, 2544, 2528,    0, 2539, 2559, 2544, 2546, 2527, 2536,
+
+     2545, 2545, 2534, 2548, 2541, 2555, 2546, 2556, 2548, 2549,
+     2549, 2551, 2551, 2549, 2552, 2552, 2553, 2553, 2554, 2557,
+     2562, 2562, 2563, 2560, 2557, 2555, 2556, 2554, 2560, 2561,
+     2564, 2565, 2566, 2567, 2561, 2568, 2565, 2569, 2569, 2567,
+     2563, 2572, 2571, 2573, 2575, 2575, 2577, 2582, 2579, 2578,
+     2566, 2564, 2579, 2581, 2585, 2580, 2572, 2583, 2587, 2577,
+     2568, 2571, 2578, 2573, 2580, 2583, 2582, 2584, 2592, 2581,
+     2586, 2586, 2584, 2589, 2589, 2590, 2590, 2587, 2594, 2594,
+     2585, 2596, 2597, 2598, 2602, 2599, 2601, 2601, 2603, 2592,
+     2599, 2604, 2606, 2606, 2607, 2608, 2608, 2596, 2597, 2598,
+
+     2611, 2612, 2615, 2615, 2602, 2616, 2616, 2612, 2607, 2613,
+     2604, 2603, 2617, 2619, 2613, 2618, 2618, 2620, 2621, 2622,
+     2611, 2623, 2624, 2625, 2619, 2622, 2620, 2626, 2626, 2632,
+     2627, 2633, 2617, 2627, 2624, 2618, 2628, 2628, 2621, 2634,
+     2623, 2632, 2637, 2625, 2638, 2634, 2635, 2635, 2637, 2636,
+     2640, 2633, 2636, 2641, 2642, 2640, 2648, 2643, 2641, 2644,
+     2645, 2645, 2638, 2643, 2647, 2647, 2651, 2651, 2654, 2649,
+     2652, 2652, 2666, 2642, 2653, 2648, 2644, 2644, 2649, 2653,
+     2655, 2664, 2654, 2656, 2656, 2655, 2657, 2657, 2658, 2658,
+     2659, 2661, 2661, 2667, 2666, 2659, 2668, 2669, 2669, 2672,
+
+     2664, 2671, 2671, 2673, 2677, 2674, 2675, 2675, 2678, 2740,
+     2677, 2679, 2680, 2672, 2674, 2667, 2740, 2680, 2668, 2683,
+     2683, 2685, 2685, 2673, 2686, 2687, 2688, 2690, 2678, 2686,
+     2679, 2689, 2688, 2691, 2691, 2690, 2692, 2694, 2695, 2687,
+     2696, 2692, 2697, 2689, 2698, 2696, 2701, 2700, 2702, 2703,
+     2698, 2705, 2704,    0, 2697, 2700, 2706, 2694, 2695, 2707,
+     2717, 2708, 2711, 2712, 2717, 2701, 2708, 2705, 2702, 2703,
+     2704, 2715, 2715, 2706, 2706, 2727, 2712, 2716, 2716, 2727,
+     2707, 2733, 2711, 2721, 2721, 2723, 2723, 2724, 2724, 2730,
+     2724, 2725, 2725, 2734, 2725, 2726, 2726, 2731, 2726, 2729,
+
+     2729, 2733, 2739, 2735, 2736, 2736, 2741, 2730, 2735, 2742,
+     2741, 2731, 2745, 2734, 2743, 2746, 2747, 2747, 2742, 2748,
+     2748, 2749, 2749, 2750, 2746, 2752, 2751, 2739, 2755, 2743,
+     2745, 2751, 2756, 2754, 2752, 2753, 2757, 2752, 2750, 2754,
+     2753, 2753, 2760, 2758, 2759, 2761, 2761, 2756, 2758, 2759,
+     2762, 2765, 2765, 2755, 2831, 2762, 2831, 2757, 2768, 2768,
+     2780, 2760, 2769, 2769, 2770, 2770, 2771, 2771, 2772, 2772,
+     2773, 2773, 2774, 2774, 2776, 2777, 2777, 2778, 2779, 2782,
+     2780, 2783, 2783, 2776, 2784, 2786, 2778, 2785, 2787, 2787,
+     2779, 2788, 2789, 2789, 2792, 2794, 2796, 2786, 2782, 2784,
+
+     2785, 2793, 2795, 2795, 2793, 2798, 2788, 2799, 2798, 2800,
+     2801, 2802, 2792, 2799, 2796, 2801, 2803, 2804, 2817, 2815,
+     2806, 2794, 2815, 2800, 2818, 2818, 2819, 2819, 2820, 2820,
+     2802, 2817, 2822, 2804, 2803, 2806, 2823, 2824, 2825, 2826,
+     2828, 2824, 2830, 2829, 2832, 2823, 2835, 2830, 2833, 2833,
+     2836, 2834, 2838, 2826, 2829, 2822, 2837, 2840, 2825, 2832,
+     2839, 2841, 2842, 2828, 2834, 2835, 2846, 2842, 2836, 2847,
+     2848, 2848, 2837, 2849, 2854, 2839, 2855, 2838, 2840, 2859,
+     2846, 2841, 2849, 2850, 2850, 2851, 2851, 2852, 2852, 2847,
+     2853, 2853, 2856, 2854, 2857, 2856, 2855, 2858, 2860, 2857,
+
+     2861, 2862, 2858, 2863, 2859, 2865, 2861, 2864, 2864, 2866,
+     2867, 2867, 2869, 2860, 2871, 2862, 2874, 2874, 2875, 2875,
+     2865, 2876, 2877, 2863, 2878, 2879, 2880, 2869, 2866, 2876,
+     2878, 2879, 2871, 2881, 2882, 2883, 2883, 2885, 2888, 2886,
+     2880, 2877, 2891, 2889, 2892, 2893, 2881, 2889, 2894, 2892,
+     2895, 2896, 2888, 2882, 2900, 2897,    0, 2901, 2885, 2886,
+     2897, 2894, 2891, 2895, 2893, 2902, 2898, 2903, 2903, 2910,
+     2896, 2898, 2904, 2905, 2900, 2901,    0, 2904, 2907, 2905,
+     2906, 2906, 2908, 2907, 2902, 2909, 2911, 2908, 2910, 2917,
+     2909, 2913, 2911, 2912, 2912, 2916, 2913, 2914, 2914, 2916,
+
+     2918, 2919, 2920, 2921, 2922, 2923, 2930, 2918, 2917, 2921,
+     2925, 2925, 2927, 2927, 2929, 2928, 2931, 2932, 2923, 2929,
+     2919, 2920, 2937, 2922, 2928, 2930, 2934, 2928, 2933, 2933,
+     2932, 2934, 2935, 2938, 2938, 2931, 2939, 2940, 2940, 2941,
+     2941, 2942, 2943, 2944, 2951, 2935, 2942, 2946, 2937, 2943,
+     2945, 2945, 2946, 2949, 2947, 2939, 2947, 2948, 2948, 2950,
+     2949, 2953, 2944, 2951, 2952, 2956, 2950, 2955, 2955, 2952,
+     2958, 2959, 2960, 2961, 2965, 2958, 2959, 2962, 2962, 2966,
+     2953, 2964, 2964, 2969, 2956, 2967, 2967, 2968, 2968, 2979,
+     2969, 2960, 2961, 2965, 2971, 2971, 2972, 2972, 2966, 2973,
+
+     2975, 2980, 2978, 2981, 2981, 2975, 2973, 2978, 2979, 2982,
+     2982,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+     2980, 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2987, 2987,
+     2987, 2987, 2987, 2987, 2987, 2988, 2988, 2988, 2988, 2988,
+     2988, 2988, 2989, 2989, 2989, 2989, 2989, 2989, 2989, 2990,
+     2990, 2990, 2990, 2990, 2990, 2990, 2992, 2992,    0, 2992,
+     2992, 2992, 2992, 2993, 2993,    0,    0,    0, 2993, 2993,
+     2994, 2994,    0,    0, 2994,    0, 2994, 2995,    0,    0,
+        0,    0,    0, 2995, 2996, 2996,    0,    0,    0, 2996,
+     2996, 2997,    0,    0,    0,    0,    0, 2997, 2998, 2998,
+
+        0, 2998, 2998, 2998, 2998, 2999, 2999,    0, 2999, 2999,
+     2999, 2999, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985, 2985,
+     2985, 2985, 2985
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -2876,7 +2895,7 @@ static void config_end_include(void)
         }
 #endif
 
-#line 2878 "<stdout>"
+#line 2896 "<stdout>"
 #define YY_NO_INPUT 1
 #line 184 "./util/configlexer.lex"
 #ifndef YY_NO_UNPUT
@@ -2885,9 +2904,9 @@ static void config_end_include(void)
 #ifndef YY_NO_INPUT
 #define YY_NO_INPUT 1
 #endif
-#line 2887 "<stdout>"
+#line 2905 "<stdout>"
 
-#line 2889 "<stdout>"
+#line 2907 "<stdout>"
 
 #define INITIAL 0
 #define quotedstring 1
@@ -3109,7 +3128,7 @@ YY_DECL
        {
 #line 204 "./util/configlexer.lex"
 
-#line 3111 "<stdout>"
+#line 3129 "<stdout>"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -3142,13 +3161,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 >= 2961 )
+                               if ( yy_current_state >= 2986 )
                                        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] != 5768 );
+               while ( yy_base[yy_current_state] != 5813 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -3998,424 +4017,424 @@ YY_RULE_SETUP
 case 165:
 YY_RULE_SETUP
 #line 372 "./util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_DSA) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
        YY_BREAK
 case 166:
 YY_RULE_SETUP
 #line 373 "./util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_SHA1) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
        YY_BREAK
 case 167:
 YY_RULE_SETUP
 #line 374 "./util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+{ YDVAR(1, VAR_FAKE_DSA) }
        YY_BREAK
 case 168:
 YY_RULE_SETUP
 #line 375 "./util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+{ YDVAR(1, VAR_FAKE_SHA1) }
        YY_BREAK
 case 169:
 YY_RULE_SETUP
 #line 376 "./util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
        YY_BREAK
 case 170:
 YY_RULE_SETUP
 #line 377 "./util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
        YY_BREAK
 case 171:
 YY_RULE_SETUP
 #line 378 "./util/configlexer.lex"
-{ 
-                                 YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
        YY_BREAK
 case 172:
 YY_RULE_SETUP
-#line 380 "./util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
+#line 379 "./util/configlexer.lex"
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
        YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 381 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
+#line 380 "./util/configlexer.lex"
+{ 
+                                 YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
        YY_BREAK
 case 174:
 YY_RULE_SETUP
 #line 382 "./util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
+{ YDVAR(1, VAR_ADD_HOLDDOWN) }
        YY_BREAK
 case 175:
 YY_RULE_SETUP
 #line 383 "./util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
+{ YDVAR(1, VAR_DEL_HOLDDOWN) }
        YY_BREAK
 case 176:
 YY_RULE_SETUP
 #line 384 "./util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+{ YDVAR(1, VAR_KEEP_MISSING) }
        YY_BREAK
 case 177:
 YY_RULE_SETUP
 #line 385 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_IDENTITY) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
        YY_BREAK
 case 178:
 YY_RULE_SETUP
 #line 386 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
        YY_BREAK
 case 179:
 YY_RULE_SETUP
 #line 387 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_LOG_IDENTITY) }
        YY_BREAK
 case 180:
 YY_RULE_SETUP
 #line 388 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_REPLIES) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
        YY_BREAK
 case 181:
 YY_RULE_SETUP
 #line 389 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
        YY_BREAK
 case 182:
 YY_RULE_SETUP
 #line 390 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
+{ YDVAR(1, VAR_LOG_REPLIES) }
        YY_BREAK
 case 183:
 YY_RULE_SETUP
 #line 391 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_SERVFAIL) }
+{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
        YY_BREAK
 case 184:
 YY_RULE_SETUP
 #line 392 "./util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
        YY_BREAK
 case 185:
 YY_RULE_SETUP
 #line 393 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(1, VAR_LOG_SERVFAIL) }
        YY_BREAK
 case 186:
 YY_RULE_SETUP
 #line 394 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
        YY_BREAK
 case 187:
 YY_RULE_SETUP
 #line 395 "./util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
        YY_BREAK
 case 188:
 YY_RULE_SETUP
 #line 396 "./util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
        YY_BREAK
 case 189:
 YY_RULE_SETUP
 #line 397 "./util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
        YY_BREAK
 case 190:
 YY_RULE_SETUP
 #line 398 "./util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
        YY_BREAK
 case 191:
 YY_RULE_SETUP
 #line 399 "./util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
        YY_BREAK
 case 192:
 YY_RULE_SETUP
 #line 400 "./util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_ENABLE) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
        YY_BREAK
 case 193:
 YY_RULE_SETUP
 #line 401 "./util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_KEY) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
        YY_BREAK
 case 194:
 YY_RULE_SETUP
 #line 402 "./util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_SHM_ENABLE) }
        YY_BREAK
 case 195:
 YY_RULE_SETUP
 #line 403 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(1, VAR_SHM_KEY) }
        YY_BREAK
 case 196:
 YY_RULE_SETUP
 #line 404 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
        YY_BREAK
 case 197:
 YY_RULE_SETUP
 #line 405 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
        YY_BREAK
 case 198:
 YY_RULE_SETUP
 #line 406 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
        YY_BREAK
 case 199:
 YY_RULE_SETUP
 #line 407 "./util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
        YY_BREAK
 case 200:
 YY_RULE_SETUP
 #line 408 "./util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
        YY_BREAK
 case 201:
 YY_RULE_SETUP
 #line 409 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
        YY_BREAK
 case 202:
 YY_RULE_SETUP
 #line 410 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
        YY_BREAK
 case 203:
 YY_RULE_SETUP
 #line 411 "./util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
        YY_BREAK
 case 204:
 YY_RULE_SETUP
 #line 412 "./util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
        YY_BREAK
 case 205:
 YY_RULE_SETUP
 #line 413 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
        YY_BREAK
 case 206:
 YY_RULE_SETUP
 #line 414 "./util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(0, VAR_PYTHON) }
        YY_BREAK
 case 207:
 YY_RULE_SETUP
 #line 415 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
        YY_BREAK
 case 208:
 YY_RULE_SETUP
 #line 416 "./util/configlexer.lex"
-{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
        YY_BREAK
 case 209:
 YY_RULE_SETUP
 #line 417 "./util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
        YY_BREAK
 case 210:
 YY_RULE_SETUP
 #line 418 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
        YY_BREAK
 case 211:
 YY_RULE_SETUP
 #line 419 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
        YY_BREAK
 case 212:
 YY_RULE_SETUP
 #line 420 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
        YY_BREAK
 case 213:
 YY_RULE_SETUP
 #line 421 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DEFINE_TAG) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
        YY_BREAK
 case 214:
 YY_RULE_SETUP
 #line 422 "./util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
+{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
        YY_BREAK
 case 215:
 YY_RULE_SETUP
 #line 423 "./util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
+{ YDVAR(1, VAR_DEFINE_TAG) }
        YY_BREAK
 case 216:
 YY_RULE_SETUP
 #line 424 "./util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
+{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
        YY_BREAK
 case 217:
 YY_RULE_SETUP
 #line 425 "./util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
        YY_BREAK
 case 218:
 YY_RULE_SETUP
 #line 426 "./util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
        YY_BREAK
 case 219:
 YY_RULE_SETUP
 #line 427 "./util/configlexer.lex"
-{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
        YY_BREAK
 case 220:
 YY_RULE_SETUP
 #line 428 "./util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
        YY_BREAK
 case 221:
 YY_RULE_SETUP
 #line 429 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
        YY_BREAK
 case 222:
 YY_RULE_SETUP
 #line 430 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(0, VAR_DNSTAP) }
        YY_BREAK
 case 223:
 YY_RULE_SETUP
 #line 431 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
        YY_BREAK
 case 224:
 YY_RULE_SETUP
 #line 432 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
        YY_BREAK
 case 225:
 YY_RULE_SETUP
 #line 433 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
        YY_BREAK
 case 226:
 YY_RULE_SETUP
 #line 434 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
        YY_BREAK
 case 227:
 YY_RULE_SETUP
 #line 435 "./util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
        YY_BREAK
 case 228:
 YY_RULE_SETUP
-#line 437 "./util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+#line 436 "./util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
        YY_BREAK
 case 229:
 YY_RULE_SETUP
-#line 439 "./util/configlexer.lex"
+#line 437 "./util/configlexer.lex"
 {
-               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
        YY_BREAK
 case 230:
 YY_RULE_SETUP
-#line 441 "./util/configlexer.lex"
+#line 439 "./util/configlexer.lex"
 {
-               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
        YY_BREAK
 case 231:
 YY_RULE_SETUP
-#line 443 "./util/configlexer.lex"
+#line 441 "./util/configlexer.lex"
 {
-               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
        YY_BREAK
 case 232:
 YY_RULE_SETUP
-#line 445 "./util/configlexer.lex"
+#line 443 "./util/configlexer.lex"
 {
-               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
        YY_BREAK
 case 233:
 YY_RULE_SETUP
-#line 447 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
+#line 445 "./util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
        YY_BREAK
 case 234:
 YY_RULE_SETUP
-#line 448 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
+#line 447 "./util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
        YY_BREAK
 case 235:
 YY_RULE_SETUP
 #line 449 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
        YY_BREAK
 case 236:
 YY_RULE_SETUP
 #line 450 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_IP_RATELIMIT) }
        YY_BREAK
 case 237:
 YY_RULE_SETUP
 #line 451 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_RATELIMIT) }
        YY_BREAK
 case 238:
 YY_RULE_SETUP
 #line 452 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
        YY_BREAK
 case 239:
 YY_RULE_SETUP
 #line 453 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
        YY_BREAK
 case 240:
 YY_RULE_SETUP
 #line 454 "./util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
        YY_BREAK
 case 241:
 YY_RULE_SETUP
 #line 455 "./util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
        YY_BREAK
 case 242:
 YY_RULE_SETUP
 #line 456 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
        YY_BREAK
 case 243:
 YY_RULE_SETUP
 #line 457 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
        YY_BREAK
 case 244:
 YY_RULE_SETUP
 #line 458 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT) }
+{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
        YY_BREAK
 case 245:
 YY_RULE_SETUP
 #line 459 "./util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_NUM) }
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
        YY_BREAK
 case 246:
 YY_RULE_SETUP
 #line 460 "./util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_LOW_RTT) }
        YY_BREAK
 case 247:
 YY_RULE_SETUP
 #line 461 "./util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_FAST_SERVER_NUM) }
        YY_BREAK
 case 248:
 YY_RULE_SETUP
@@ -4425,195 +4444,205 @@ YY_RULE_SETUP
 case 249:
 YY_RULE_SETUP
 #line 463 "./util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
        YY_BREAK
 case 250:
 YY_RULE_SETUP
 #line 464 "./util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
        YY_BREAK
 case 251:
 YY_RULE_SETUP
 #line 465 "./util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
+{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
        YY_BREAK
 case 252:
 YY_RULE_SETUP
 #line 466 "./util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
+{ YDVAR(2, VAR_RESPONSE_IP) }
        YY_BREAK
 case 253:
 YY_RULE_SETUP
 #line 467 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
+{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
        YY_BREAK
 case 254:
 YY_RULE_SETUP
 #line 468 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
+{ YDVAR(0, VAR_DNSCRYPT) }
        YY_BREAK
 case 255:
 YY_RULE_SETUP
 #line 469 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
+{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
        YY_BREAK
 case 256:
 YY_RULE_SETUP
 #line 470 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
+{ YDVAR(1, VAR_DNSCRYPT_PORT) }
        YY_BREAK
 case 257:
 YY_RULE_SETUP
 #line 471 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
        YY_BREAK
 case 258:
 YY_RULE_SETUP
 #line 472 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
+{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
        YY_BREAK
 case 259:
 YY_RULE_SETUP
 #line 473 "./util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
        YY_BREAK
 case 260:
 YY_RULE_SETUP
-#line 475 "./util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
+#line 474 "./util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
        YY_BREAK
 case 261:
 YY_RULE_SETUP
-#line 477 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
+#line 475 "./util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
        YY_BREAK
 case 262:
 YY_RULE_SETUP
-#line 478 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
+#line 477 "./util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
        YY_BREAK
 case 263:
 YY_RULE_SETUP
 #line 479 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
        YY_BREAK
 case 264:
 YY_RULE_SETUP
 #line 480 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
        YY_BREAK
 case 265:
 YY_RULE_SETUP
 #line 481 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_HOOK) }
+{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
        YY_BREAK
 case 266:
 YY_RULE_SETUP
 #line 482 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
+{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
        YY_BREAK
 case 267:
 YY_RULE_SETUP
 #line 483 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_IPSECMOD_HOOK) }
        YY_BREAK
 case 268:
 YY_RULE_SETUP
 #line 484 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
        YY_BREAK
 case 269:
 YY_RULE_SETUP
 #line 485 "./util/configlexer.lex"
-{ YDVAR(0, VAR_CACHEDB) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
        YY_BREAK
 case 270:
 YY_RULE_SETUP
 #line 486 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+{ YDVAR(1, VAR_IPSECMOD_STRICT) }
        YY_BREAK
 case 271:
 YY_RULE_SETUP
 #line 487 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+{ YDVAR(0, VAR_CACHEDB) }
        YY_BREAK
 case 272:
 YY_RULE_SETUP
 #line 488 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+{ YDVAR(1, VAR_CACHEDB_BACKEND) }
        YY_BREAK
 case 273:
 YY_RULE_SETUP
 #line 489 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
        YY_BREAK
 case 274:
 YY_RULE_SETUP
 #line 490 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
        YY_BREAK
 case 275:
 YY_RULE_SETUP
 #line 491 "./util/configlexer.lex"
-{ YDVAR(0, VAR_IPSET) }
+{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
        YY_BREAK
 case 276:
 YY_RULE_SETUP
 #line 492 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V4) }
+{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
        YY_BREAK
 case 277:
 YY_RULE_SETUP
 #line 493 "./util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V6) }
+{ YDVAR(0, VAR_IPSET) }
        YY_BREAK
 case 278:
 YY_RULE_SETUP
 #line 494 "./util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+{ YDVAR(1, VAR_IPSET_NAME_V4) }
        YY_BREAK
 case 279:
 YY_RULE_SETUP
 #line 495 "./util/configlexer.lex"
-{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+{ YDVAR(1, VAR_IPSET_NAME_V6) }
        YY_BREAK
 case 280:
-/* rule 280 can match eol */
 YY_RULE_SETUP
 #line 496 "./util/configlexer.lex"
+{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+       YY_BREAK
+case 281:
+YY_RULE_SETUP
+#line 497 "./util/configlexer.lex"
+{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+       YY_BREAK
+case 282:
+/* rule 282 can match eol */
+YY_RULE_SETUP
+#line 498 "./util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++; }
        YY_BREAK
 /* Quoted strings. Strip leading and ending quotes */
-case 281:
+case 283:
 YY_RULE_SETUP
-#line 499 "./util/configlexer.lex"
+#line 501 "./util/configlexer.lex"
 { BEGIN(quotedstring); LEXOUT(("QS ")); }
        YY_BREAK
 case YY_STATE_EOF(quotedstring):
-#line 500 "./util/configlexer.lex"
+#line 502 "./util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
        if(--num_args == 0) { BEGIN(INITIAL); }
        else                { BEGIN(val); }
 }
        YY_BREAK
-case 282:
+case 284:
 YY_RULE_SETUP
-#line 505 "./util/configlexer.lex"
+#line 507 "./util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 283:
-/* rule 283 can match eol */
+case 285:
+/* rule 285 can match eol */
 YY_RULE_SETUP
-#line 506 "./util/configlexer.lex"
+#line 508 "./util/configlexer.lex"
 { yyerror("newline inside quoted string, no end \""); 
                          cfg_parser->line++; BEGIN(INITIAL); }
        YY_BREAK
-case 284:
+case 286:
 YY_RULE_SETUP
-#line 508 "./util/configlexer.lex"
+#line 510 "./util/configlexer.lex"
 {
         LEXOUT(("QE "));
        if(--num_args == 0) { BEGIN(INITIAL); }
@@ -4626,34 +4655,34 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* Single Quoted strings. Strip leading and ending quotes */
-case 285:
+case 287:
 YY_RULE_SETUP
-#line 520 "./util/configlexer.lex"
+#line 522 "./util/configlexer.lex"
 { BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
        YY_BREAK
 case YY_STATE_EOF(singlequotedstr):
-#line 521 "./util/configlexer.lex"
+#line 523 "./util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
        if(--num_args == 0) { BEGIN(INITIAL); }
        else                { BEGIN(val); }
 }
        YY_BREAK
-case 286:
+case 288:
 YY_RULE_SETUP
-#line 526 "./util/configlexer.lex"
+#line 528 "./util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 287:
-/* rule 287 can match eol */
+case 289:
+/* rule 289 can match eol */
 YY_RULE_SETUP
-#line 527 "./util/configlexer.lex"
+#line 529 "./util/configlexer.lex"
 { yyerror("newline inside quoted string, no end '"); 
                             cfg_parser->line++; BEGIN(INITIAL); }
        YY_BREAK
-case 288:
+case 290:
 YY_RULE_SETUP
-#line 529 "./util/configlexer.lex"
+#line 531 "./util/configlexer.lex"
 {
         LEXOUT(("SQE "));
        if(--num_args == 0) { BEGIN(INITIAL); }
@@ -4666,38 +4695,38 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* include: directive */
-case 289:
+case 291:
 YY_RULE_SETUP
-#line 541 "./util/configlexer.lex"
+#line 543 "./util/configlexer.lex"
 { 
        LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
        YY_BREAK
 case YY_STATE_EOF(include):
-#line 543 "./util/configlexer.lex"
+#line 545 "./util/configlexer.lex"
 {
         yyerror("EOF inside include directive");
         BEGIN(inc_prev);
 }
        YY_BREAK
-case 290:
+case 292:
 YY_RULE_SETUP
-#line 547 "./util/configlexer.lex"
+#line 549 "./util/configlexer.lex"
 { LEXOUT(("ISP ")); /* ignore */ }
        YY_BREAK
-case 291:
-/* rule 291 can match eol */
+case 293:
+/* rule 293 can match eol */
 YY_RULE_SETUP
-#line 548 "./util/configlexer.lex"
+#line 550 "./util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++;}
        YY_BREAK
-case 292:
+case 294:
 YY_RULE_SETUP
-#line 549 "./util/configlexer.lex"
+#line 551 "./util/configlexer.lex"
 { LEXOUT(("IQS ")); BEGIN(include_quoted); }
        YY_BREAK
-case 293:
+case 295:
 YY_RULE_SETUP
-#line 550 "./util/configlexer.lex"
+#line 552 "./util/configlexer.lex"
 {
        LEXOUT(("Iunquotedstr(%s) ", yytext));
        config_start_include_glob(yytext);
@@ -4705,27 +4734,27 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(include_quoted):
-#line 555 "./util/configlexer.lex"
+#line 557 "./util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(inc_prev);
 }
        YY_BREAK
-case 294:
+case 296:
 YY_RULE_SETUP
-#line 559 "./util/configlexer.lex"
+#line 561 "./util/configlexer.lex"
 { LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 295:
-/* rule 295 can match eol */
+case 297:
+/* rule 297 can match eol */
 YY_RULE_SETUP
-#line 560 "./util/configlexer.lex"
+#line 562 "./util/configlexer.lex"
 { yyerror("newline before \" in include name"); 
                                  cfg_parser->line++; BEGIN(inc_prev); }
        YY_BREAK
-case 296:
+case 298:
 YY_RULE_SETUP
-#line 562 "./util/configlexer.lex"
+#line 564 "./util/configlexer.lex"
 {
        LEXOUT(("IQE "));
        yytext[yyleng - 1] = '\0';
@@ -4735,7 +4764,7 @@ YY_RULE_SETUP
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(val):
-#line 568 "./util/configlexer.lex"
+#line 570 "./util/configlexer.lex"
 {
        LEXOUT(("LEXEOF "));
        yy_set_bol(1); /* Set beginning of line, so "^" rules match.  */
@@ -4747,33 +4776,33 @@ case YY_STATE_EOF(val):
        }
 }
        YY_BREAK
-case 297:
+case 299:
 YY_RULE_SETUP
-#line 579 "./util/configlexer.lex"
+#line 581 "./util/configlexer.lex"
 { LEXOUT(("unquotedstr(%s) ", yytext)); 
                        if(--num_args == 0) { BEGIN(INITIAL); }
                        yylval.str = strdup(yytext); return STRING_ARG; }
        YY_BREAK
-case 298:
+case 300:
 YY_RULE_SETUP
-#line 583 "./util/configlexer.lex"
+#line 585 "./util/configlexer.lex"
 {
        ub_c_error_msg("unknown keyword '%s'", yytext);
        }
        YY_BREAK
-case 299:
+case 301:
 YY_RULE_SETUP
-#line 587 "./util/configlexer.lex"
+#line 589 "./util/configlexer.lex"
 {
        ub_c_error_msg("stray '%s'", yytext);
        }
        YY_BREAK
-case 300:
+case 302:
 YY_RULE_SETUP
-#line 591 "./util/configlexer.lex"
+#line 593 "./util/configlexer.lex"
 ECHO;
        YY_BREAK
-#line 4775 "<stdout>"
+#line 4803 "<stdout>"
 
        case YY_END_OF_BUFFER:
                {
@@ -5068,7 +5097,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 >= 2961 )
+                       if ( yy_current_state >= 2986 )
                                yy_c = yy_meta[yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -5096,11 +5125,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 >= 2961 )
+               if ( yy_current_state >= 2986 )
                        yy_c = yy_meta[yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-       yy_is_jam = (yy_current_state == 2960);
+       yy_is_jam = (yy_current_state == 2985);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -5739,6 +5768,6 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 591 "./util/configlexer.lex"
+#line 593 "./util/configlexer.lex"
 
 
index 8d9d1d5252ccacda76b8875eb2e87656ffdd2173..deedffa58da4b414814c530804a360cc42ee90f5 100644 (file)
@@ -369,6 +369,8 @@ ignore-cd-flag{COLON}               { YDVAR(1, VAR_IGNORE_CD_FLAG) }
 serve-expired{COLON}           { YDVAR(1, VAR_SERVE_EXPIRED) }
 serve-expired-ttl{COLON}       { YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
 serve-expired-ttl-reset{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
+serve-expired-reply-ttl{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
+serve-expired-client-timeout{COLON}    { YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
 fake-dsa{COLON}                        { YDVAR(1, VAR_FAKE_DSA) }
 fake-sha1{COLON}               { YDVAR(1, VAR_FAKE_SHA1) }
 val-log-level{COLON}           { YDVAR(1, VAR_VAL_LOG_LEVEL) }
index b59e42b17553cb95831e1c5229ec656a7c14b636..84312f0d3ab9e7db6d810752633a0f723e209883 100644 (file)
@@ -1,8 +1,9 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.4.1.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
+   Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
+/* Undocumented macros, especially those whose name start with YY_,
+   are private implementation details.  Do not rely on them.  */
+
 /* Identify Bison output.  */
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.0.4"
+#define YYBISON_VERSION "3.4.1"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -61,8 +65,8 @@
 
 
 
-/* Copy the first part of user declarations.  */
-#line 38 "./util/configparser.y" /* yacc.c:339  */
+/* First part of user prologue.  */
+#line 38 "./util/configparser.y"
 
 #include "config.h"
 
@@ -91,13 +95,17 @@ extern struct config_parser_state* cfg_parser;
 #endif
 
 
-#line 95 "util/configparser.c" /* yacc.c:339  */
+#line 99 "util/configparser.c"
 
 # ifndef YY_NULLPTR
-#  if defined __cplusplus && 201103L <= __cplusplus
-#   define YY_NULLPTR nullptr
+#  if defined __cplusplus
+#   if 201103L <= __cplusplus
+#    define YY_NULLPTR nullptr
+#   else
+#    define YY_NULLPTR 0
+#   endif
 #  else
-#   define YY_NULLPTR 0
+#   define YY_NULLPTR ((void*)0)
 #  endif
 # endif
 
@@ -109,8 +117,8 @@ extern struct config_parser_state* cfg_parser;
 # define YYERROR_VERBOSE 0
 #endif
 
-/* In a future release of Bison, this section will be replaced
-   by #include "configparser.h".  */
+/* Use api.header.include to #include this header
+   instead of duplicating it here.  */
 #ifndef YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
 # define YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
 /* Debug traces.  */
@@ -331,74 +339,76 @@ extern int yydebug;
     VAR_SERVE_EXPIRED = 460,
     VAR_SERVE_EXPIRED_TTL = 461,
     VAR_SERVE_EXPIRED_TTL_RESET = 462,
-    VAR_FAKE_DSA = 463,
-    VAR_FAKE_SHA1 = 464,
-    VAR_LOG_IDENTITY = 465,
-    VAR_HIDE_TRUSTANCHOR = 466,
-    VAR_TRUST_ANCHOR_SIGNALING = 467,
-    VAR_AGGRESSIVE_NSEC = 468,
-    VAR_USE_SYSTEMD = 469,
-    VAR_SHM_ENABLE = 470,
-    VAR_SHM_KEY = 471,
-    VAR_ROOT_KEY_SENTINEL = 472,
-    VAR_DNSCRYPT = 473,
-    VAR_DNSCRYPT_ENABLE = 474,
-    VAR_DNSCRYPT_PORT = 475,
-    VAR_DNSCRYPT_PROVIDER = 476,
-    VAR_DNSCRYPT_SECRET_KEY = 477,
-    VAR_DNSCRYPT_PROVIDER_CERT = 478,
-    VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 479,
-    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 480,
-    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 481,
-    VAR_DNSCRYPT_NONCE_CACHE_SIZE = 482,
-    VAR_DNSCRYPT_NONCE_CACHE_SLABS = 483,
-    VAR_IPSECMOD_ENABLED = 484,
-    VAR_IPSECMOD_HOOK = 485,
-    VAR_IPSECMOD_IGNORE_BOGUS = 486,
-    VAR_IPSECMOD_MAX_TTL = 487,
-    VAR_IPSECMOD_WHITELIST = 488,
-    VAR_IPSECMOD_STRICT = 489,
-    VAR_CACHEDB = 490,
-    VAR_CACHEDB_BACKEND = 491,
-    VAR_CACHEDB_SECRETSEED = 492,
-    VAR_CACHEDB_REDISHOST = 493,
-    VAR_CACHEDB_REDISPORT = 494,
-    VAR_CACHEDB_REDISTIMEOUT = 495,
-    VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 496,
-    VAR_FOR_UPSTREAM = 497,
-    VAR_AUTH_ZONE = 498,
-    VAR_ZONEFILE = 499,
-    VAR_MASTER = 500,
-    VAR_URL = 501,
-    VAR_FOR_DOWNSTREAM = 502,
-    VAR_FALLBACK_ENABLED = 503,
-    VAR_TLS_ADDITIONAL_PORT = 504,
-    VAR_LOW_RTT = 505,
-    VAR_LOW_RTT_PERMIL = 506,
-    VAR_FAST_SERVER_PERMIL = 507,
-    VAR_FAST_SERVER_NUM = 508,
-    VAR_ALLOW_NOTIFY = 509,
-    VAR_TLS_WIN_CERT = 510,
-    VAR_TCP_CONNECTION_LIMIT = 511,
-    VAR_FORWARD_NO_CACHE = 512,
-    VAR_STUB_NO_CACHE = 513,
-    VAR_LOG_SERVFAIL = 514,
-    VAR_DENY_ANY = 515,
-    VAR_UNKNOWN_SERVER_TIME_LIMIT = 516,
-    VAR_LOG_TAG_QUERYREPLY = 517,
-    VAR_STREAM_WAIT_SIZE = 518,
-    VAR_TLS_CIPHERS = 519,
-    VAR_TLS_CIPHERSUITES = 520,
-    VAR_IPSET = 521,
-    VAR_IPSET_NAME_V4 = 522,
-    VAR_IPSET_NAME_V6 = 523,
-    VAR_TLS_SESSION_TICKET_KEYS = 524,
-    VAR_RPZ = 525,
-    VAR_TAGS = 526,
-    VAR_RPZ_ACTION_OVERRIDE = 527,
-    VAR_RPZ_CNAME_OVERRIDE = 528,
-    VAR_RPZ_LOG = 529,
-    VAR_RPZ_LOG_NAME = 530
+    VAR_SERVE_EXPIRED_REPLY_TTL = 463,
+    VAR_SERVE_EXPIRED_CLIENT_TIMEOUT = 464,
+    VAR_FAKE_DSA = 465,
+    VAR_FAKE_SHA1 = 466,
+    VAR_LOG_IDENTITY = 467,
+    VAR_HIDE_TRUSTANCHOR = 468,
+    VAR_TRUST_ANCHOR_SIGNALING = 469,
+    VAR_AGGRESSIVE_NSEC = 470,
+    VAR_USE_SYSTEMD = 471,
+    VAR_SHM_ENABLE = 472,
+    VAR_SHM_KEY = 473,
+    VAR_ROOT_KEY_SENTINEL = 474,
+    VAR_DNSCRYPT = 475,
+    VAR_DNSCRYPT_ENABLE = 476,
+    VAR_DNSCRYPT_PORT = 477,
+    VAR_DNSCRYPT_PROVIDER = 478,
+    VAR_DNSCRYPT_SECRET_KEY = 479,
+    VAR_DNSCRYPT_PROVIDER_CERT = 480,
+    VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 481,
+    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 482,
+    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 483,
+    VAR_DNSCRYPT_NONCE_CACHE_SIZE = 484,
+    VAR_DNSCRYPT_NONCE_CACHE_SLABS = 485,
+    VAR_IPSECMOD_ENABLED = 486,
+    VAR_IPSECMOD_HOOK = 487,
+    VAR_IPSECMOD_IGNORE_BOGUS = 488,
+    VAR_IPSECMOD_MAX_TTL = 489,
+    VAR_IPSECMOD_WHITELIST = 490,
+    VAR_IPSECMOD_STRICT = 491,
+    VAR_CACHEDB = 492,
+    VAR_CACHEDB_BACKEND = 493,
+    VAR_CACHEDB_SECRETSEED = 494,
+    VAR_CACHEDB_REDISHOST = 495,
+    VAR_CACHEDB_REDISPORT = 496,
+    VAR_CACHEDB_REDISTIMEOUT = 497,
+    VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 498,
+    VAR_FOR_UPSTREAM = 499,
+    VAR_AUTH_ZONE = 500,
+    VAR_ZONEFILE = 501,
+    VAR_MASTER = 502,
+    VAR_URL = 503,
+    VAR_FOR_DOWNSTREAM = 504,
+    VAR_FALLBACK_ENABLED = 505,
+    VAR_TLS_ADDITIONAL_PORT = 506,
+    VAR_LOW_RTT = 507,
+    VAR_LOW_RTT_PERMIL = 508,
+    VAR_FAST_SERVER_PERMIL = 509,
+    VAR_FAST_SERVER_NUM = 510,
+    VAR_ALLOW_NOTIFY = 511,
+    VAR_TLS_WIN_CERT = 512,
+    VAR_TCP_CONNECTION_LIMIT = 513,
+    VAR_FORWARD_NO_CACHE = 514,
+    VAR_STUB_NO_CACHE = 515,
+    VAR_LOG_SERVFAIL = 516,
+    VAR_DENY_ANY = 517,
+    VAR_UNKNOWN_SERVER_TIME_LIMIT = 518,
+    VAR_LOG_TAG_QUERYREPLY = 519,
+    VAR_STREAM_WAIT_SIZE = 520,
+    VAR_TLS_CIPHERS = 521,
+    VAR_TLS_CIPHERSUITES = 522,
+    VAR_IPSET = 523,
+    VAR_IPSET_NAME_V4 = 524,
+    VAR_IPSET_NAME_V6 = 525,
+    VAR_TLS_SESSION_TICKET_KEYS = 526,
+    VAR_RPZ = 527,
+    VAR_TAGS = 528,
+    VAR_RPZ_ACTION_OVERRIDE = 529,
+    VAR_RPZ_CNAME_OVERRIDE = 530,
+    VAR_RPZ_LOG = 531,
+    VAR_RPZ_LOG_NAME = 532
   };
 #endif
 /* Tokens.  */
@@ -607,87 +617,88 @@ extern int yydebug;
 #define VAR_SERVE_EXPIRED 460
 #define VAR_SERVE_EXPIRED_TTL 461
 #define VAR_SERVE_EXPIRED_TTL_RESET 462
-#define VAR_FAKE_DSA 463
-#define VAR_FAKE_SHA1 464
-#define VAR_LOG_IDENTITY 465
-#define VAR_HIDE_TRUSTANCHOR 466
-#define VAR_TRUST_ANCHOR_SIGNALING 467
-#define VAR_AGGRESSIVE_NSEC 468
-#define VAR_USE_SYSTEMD 469
-#define VAR_SHM_ENABLE 470
-#define VAR_SHM_KEY 471
-#define VAR_ROOT_KEY_SENTINEL 472
-#define VAR_DNSCRYPT 473
-#define VAR_DNSCRYPT_ENABLE 474
-#define VAR_DNSCRYPT_PORT 475
-#define VAR_DNSCRYPT_PROVIDER 476
-#define VAR_DNSCRYPT_SECRET_KEY 477
-#define VAR_DNSCRYPT_PROVIDER_CERT 478
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 479
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 480
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 481
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 482
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 483
-#define VAR_IPSECMOD_ENABLED 484
-#define VAR_IPSECMOD_HOOK 485
-#define VAR_IPSECMOD_IGNORE_BOGUS 486
-#define VAR_IPSECMOD_MAX_TTL 487
-#define VAR_IPSECMOD_WHITELIST 488
-#define VAR_IPSECMOD_STRICT 489
-#define VAR_CACHEDB 490
-#define VAR_CACHEDB_BACKEND 491
-#define VAR_CACHEDB_SECRETSEED 492
-#define VAR_CACHEDB_REDISHOST 493
-#define VAR_CACHEDB_REDISPORT 494
-#define VAR_CACHEDB_REDISTIMEOUT 495
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 496
-#define VAR_FOR_UPSTREAM 497
-#define VAR_AUTH_ZONE 498
-#define VAR_ZONEFILE 499
-#define VAR_MASTER 500
-#define VAR_URL 501
-#define VAR_FOR_DOWNSTREAM 502
-#define VAR_FALLBACK_ENABLED 503
-#define VAR_TLS_ADDITIONAL_PORT 504
-#define VAR_LOW_RTT 505
-#define VAR_LOW_RTT_PERMIL 506
-#define VAR_FAST_SERVER_PERMIL 507
-#define VAR_FAST_SERVER_NUM 508
-#define VAR_ALLOW_NOTIFY 509
-#define VAR_TLS_WIN_CERT 510
-#define VAR_TCP_CONNECTION_LIMIT 511
-#define VAR_FORWARD_NO_CACHE 512
-#define VAR_STUB_NO_CACHE 513
-#define VAR_LOG_SERVFAIL 514
-#define VAR_DENY_ANY 515
-#define VAR_UNKNOWN_SERVER_TIME_LIMIT 516
-#define VAR_LOG_TAG_QUERYREPLY 517
-#define VAR_STREAM_WAIT_SIZE 518
-#define VAR_TLS_CIPHERS 519
-#define VAR_TLS_CIPHERSUITES 520
-#define VAR_IPSET 521
-#define VAR_IPSET_NAME_V4 522
-#define VAR_IPSET_NAME_V6 523
-#define VAR_TLS_SESSION_TICKET_KEYS 524
-#define VAR_RPZ 525
-#define VAR_TAGS 526
-#define VAR_RPZ_ACTION_OVERRIDE 527
-#define VAR_RPZ_CNAME_OVERRIDE 528
-#define VAR_RPZ_LOG 529
-#define VAR_RPZ_LOG_NAME 530
+#define VAR_SERVE_EXPIRED_REPLY_TTL 463
+#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 464
+#define VAR_FAKE_DSA 465
+#define VAR_FAKE_SHA1 466
+#define VAR_LOG_IDENTITY 467
+#define VAR_HIDE_TRUSTANCHOR 468
+#define VAR_TRUST_ANCHOR_SIGNALING 469
+#define VAR_AGGRESSIVE_NSEC 470
+#define VAR_USE_SYSTEMD 471
+#define VAR_SHM_ENABLE 472
+#define VAR_SHM_KEY 473
+#define VAR_ROOT_KEY_SENTINEL 474
+#define VAR_DNSCRYPT 475
+#define VAR_DNSCRYPT_ENABLE 476
+#define VAR_DNSCRYPT_PORT 477
+#define VAR_DNSCRYPT_PROVIDER 478
+#define VAR_DNSCRYPT_SECRET_KEY 479
+#define VAR_DNSCRYPT_PROVIDER_CERT 480
+#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 481
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 482
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 483
+#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 484
+#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 485
+#define VAR_IPSECMOD_ENABLED 486
+#define VAR_IPSECMOD_HOOK 487
+#define VAR_IPSECMOD_IGNORE_BOGUS 488
+#define VAR_IPSECMOD_MAX_TTL 489
+#define VAR_IPSECMOD_WHITELIST 490
+#define VAR_IPSECMOD_STRICT 491
+#define VAR_CACHEDB 492
+#define VAR_CACHEDB_BACKEND 493
+#define VAR_CACHEDB_SECRETSEED 494
+#define VAR_CACHEDB_REDISHOST 495
+#define VAR_CACHEDB_REDISPORT 496
+#define VAR_CACHEDB_REDISTIMEOUT 497
+#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 498
+#define VAR_FOR_UPSTREAM 499
+#define VAR_AUTH_ZONE 500
+#define VAR_ZONEFILE 501
+#define VAR_MASTER 502
+#define VAR_URL 503
+#define VAR_FOR_DOWNSTREAM 504
+#define VAR_FALLBACK_ENABLED 505
+#define VAR_TLS_ADDITIONAL_PORT 506
+#define VAR_LOW_RTT 507
+#define VAR_LOW_RTT_PERMIL 508
+#define VAR_FAST_SERVER_PERMIL 509
+#define VAR_FAST_SERVER_NUM 510
+#define VAR_ALLOW_NOTIFY 511
+#define VAR_TLS_WIN_CERT 512
+#define VAR_TCP_CONNECTION_LIMIT 513
+#define VAR_FORWARD_NO_CACHE 514
+#define VAR_STUB_NO_CACHE 515
+#define VAR_LOG_SERVFAIL 516
+#define VAR_DENY_ANY 517
+#define VAR_UNKNOWN_SERVER_TIME_LIMIT 518
+#define VAR_LOG_TAG_QUERYREPLY 519
+#define VAR_STREAM_WAIT_SIZE 520
+#define VAR_TLS_CIPHERS 521
+#define VAR_TLS_CIPHERSUITES 522
+#define VAR_IPSET 523
+#define VAR_IPSET_NAME_V4 524
+#define VAR_IPSET_NAME_V6 525
+#define VAR_TLS_SESSION_TICKET_KEYS 526
+#define VAR_RPZ 527
+#define VAR_TAGS 528
+#define VAR_RPZ_ACTION_OVERRIDE 529
+#define VAR_RPZ_CNAME_OVERRIDE 530
+#define VAR_RPZ_LOG 531
+#define VAR_RPZ_LOG_NAME 532
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
 union YYSTYPE
 {
-#line 66 "./util/configparser.y" /* yacc.c:355  */
+#line 66 "./util/configparser.y"
 
        char*   str;
 
-#line 689 "util/configparser.c" /* yacc.c:355  */
-};
+#line 700 "util/configparser.c"
 
+};
 typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
@@ -700,9 +711,7 @@ int yyparse (void);
 
 #endif /* !YY_YY_UTIL_CONFIGPARSER_H_INCLUDED  */
 
-/* Copy the second part of user declarations.  */
 
-#line 706 "util/configparser.c" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -723,13 +732,13 @@ typedef signed char yytype_int8;
 #ifdef YYTYPE_UINT16
 typedef YYTYPE_UINT16 yytype_uint16;
 #else
-typedef unsigned short int yytype_uint16;
+typedef unsigned short yytype_uint16;
 #endif
 
 #ifdef YYTYPE_INT16
 typedef YYTYPE_INT16 yytype_int16;
 #else
-typedef short int yytype_int16;
+typedef short yytype_int16;
 #endif
 
 #ifndef YYSIZE_T
@@ -741,7 +750,7 @@ typedef short int yytype_int16;
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
-#  define YYSIZE_T unsigned int
+#  define YYSIZE_T unsigned
 # endif
 #endif
 
@@ -777,15 +786,6 @@ typedef short int yytype_int16;
 # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
 #endif
 
-#if !defined _Noreturn \
-     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-# if defined _MSC_VER && 1200 <= _MSC_VER
-#  define _Noreturn __declspec (noreturn)
-# else
-#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
-# endif
-#endif
-
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
 # define YYUSE(E) ((void) (E))
@@ -793,7 +793,7 @@ typedef short int yytype_int16;
 # define YYUSE(E) /* empty */
 #endif
 
-#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
 /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
     _Pragma ("GCC diagnostic push") \
@@ -813,6 +813,8 @@ typedef short int yytype_int16;
 #endif
 
 
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
 #if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
@@ -944,27 +946,27 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   586
+#define YYLAST   590
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  276
+#define YYNTOKENS  278
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  299
+#define YYNNTS  301
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  576
+#define YYNRULES  580
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  857
+#define YYNSTATES  863
 
-/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
-   by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   530
+#define YYMAXUTOK   532
 
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, with out-of-bounds checking.  */
 #define YYTRANSLATE(YYX)                                                \
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+  ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
-   as returned by yylex, without out-of-bounds checking.  */
+   as returned by yylex.  */
 static const yytype_uint16 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1020,71 +1022,72 @@ static const yytype_uint16 yytranslate[] =
      245,   246,   247,   248,   249,   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
+     275,   276,   277
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   174,   174,   174,   175,   175,   176,   176,   177,   177,
-     177,   178,   178,   179,   179,   180,   184,   189,   190,   191,
-     191,   191,   192,   192,   193,   193,   194,   194,   195,   195,
-     195,   196,   196,   197,   197,   197,   198,   198,   198,   199,
-     199,   200,   200,   201,   201,   202,   202,   203,   203,   204,
-     204,   205,   205,   206,   206,   207,   207,   207,   208,   208,
-     208,   209,   209,   209,   210,   210,   211,   211,   212,   212,
-     213,   213,   214,   214,   214,   215,   215,   216,   216,   217,
-     217,   217,   218,   218,   219,   219,   220,   220,   221,   221,
-     221,   222,   222,   223,   223,   224,   224,   225,   225,   226,
-     226,   227,   227,   227,   228,   228,   229,   229,   229,   230,
-     230,   230,   231,   231,   231,   232,   232,   232,   232,   233,
-     234,   234,   234,   235,   235,   235,   236,   236,   237,   237,
-     238,   238,   238,   239,   239,   240,   240,   240,   241,   241,
-     242,   242,   243,   244,   244,   245,   245,   246,   246,   247,
-     248,   248,   249,   249,   250,   250,   251,   251,   252,   252,
-     253,   253,   253,   254,   254,   255,   255,   256,   256,   257,
-     257,   258,   258,   259,   259,   259,   260,   260,   260,   261,
-     261,   261,   262,   262,   263,   264,   264,   265,   265,   266,
-     266,   267,   267,   268,   268,   268,   269,   269,   269,   270,
-     270,   270,   271,   271,   272,   272,   273,   273,   275,   287,
-     288,   289,   289,   289,   289,   289,   290,   290,   292,   304,
-     305,   306,   306,   306,   306,   307,   307,   309,   323,   324,
-     325,   325,   325,   325,   326,   326,   326,   328,   345,   346,
-     347,   347,   347,   347,   348,   348,   348,   349,   352,   371,
-     388,   396,   406,   414,   431,   432,   433,   433,   433,   433,
-     433,   434,   434,   434,   435,   435,   437,   446,   455,   466,
-     475,   484,   493,   504,   513,   525,   539,   554,   565,   582,
-     599,   616,   633,   648,   663,   676,   691,   700,   709,   718,
-     727,   736,   745,   754,   763,   772,   781,   790,   799,   808,
-     821,   830,   843,   852,   861,   870,   877,   884,   893,   900,
-     909,   917,   924,   931,   939,   948,   957,   971,   980,   989,
-     998,  1007,  1016,  1025,  1032,  1039,  1065,  1073,  1080,  1087,
-    1094,  1101,  1109,  1117,  1125,  1132,  1143,  1154,  1161,  1170,
-    1179,  1188,  1195,  1202,  1210,  1218,  1228,  1238,  1248,  1256,
-    1269,  1280,  1288,  1301,  1310,  1319,  1328,  1338,  1348,  1356,
-    1369,  1378,  1386,  1395,  1403,  1416,  1425,  1432,  1442,  1452,
-    1462,  1472,  1482,  1492,  1502,  1512,  1519,  1526,  1533,  1542,
-    1551,  1560,  1569,  1576,  1586,  1606,  1613,  1631,  1644,  1657,
-    1666,  1675,  1684,  1693,  1703,  1713,  1724,  1733,  1742,  1751,
-    1760,  1773,  1786,  1795,  1802,  1811,  1820,  1829,  1838,  1846,
-    1859,  1867,  1908,  1915,  1930,  1940,  1950,  1957,  1964,  1971,
-    1980,  1988,  2002,  2023,  2044,  2056,  2068,  2080,  2089,  2110,
-    2120,  2129,  2137,  2145,  2158,  2171,  2186,  2201,  2210,  2219,
-    2225,  2234,  2243,  2253,  2263,  2276,  2289,  2301,  2315,  2327,
-    2341,  2351,  2358,  2365,  2374,  2383,  2393,  2403,  2413,  2420,
-    2427,  2436,  2445,  2455,  2465,  2472,  2479,  2486,  2494,  2504,
-    2514,  2524,  2534,  2573,  2583,  2591,  2599,  2614,  2623,  2628,
-    2629,  2630,  2630,  2630,  2631,  2631,  2631,  2632,  2632,  2634,
-    2644,  2653,  2660,  2667,  2674,  2681,  2688,  2695,  2700,  2701,
-    2702,  2702,  2703,  2703,  2704,  2704,  2705,  2706,  2707,  2708,
-    2709,  2710,  2712,  2721,  2728,  2737,  2746,  2753,  2760,  2770,
-    2780,  2790,  2800,  2810,  2820,  2825,  2826,  2827,  2829,  2835,
-    2845,  2852,  2861,  2869,  2874,  2875,  2877,  2877,  2877,  2878,
-    2878,  2879,  2880,  2881,  2882,  2883,  2885,  2895,  2904,  2911,
-    2920,  2927,  2936,  2944,  2957,  2965,  2978,  2983,  2984,  2985,
-    2985,  2986,  2986,  2986,  2988,  3003,  3018,  3030,  3045,  3058,
-    3069,  3074,  3075,  3076,  3076,  3078,  3093
+       0,   175,   175,   175,   176,   176,   177,   177,   178,   178,
+     178,   179,   179,   180,   180,   181,   185,   190,   191,   192,
+     192,   192,   193,   193,   194,   194,   195,   195,   196,   196,
+     196,   197,   197,   198,   198,   198,   199,   199,   199,   200,
+     200,   201,   201,   202,   202,   203,   203,   204,   204,   205,
+     205,   206,   206,   207,   207,   208,   208,   208,   209,   209,
+     209,   210,   210,   210,   211,   211,   212,   212,   213,   213,
+     214,   214,   215,   215,   215,   216,   216,   217,   217,   218,
+     218,   218,   219,   219,   220,   220,   221,   221,   222,   222,
+     222,   223,   223,   224,   224,   225,   225,   226,   226,   227,
+     227,   228,   228,   228,   229,   229,   230,   230,   230,   231,
+     231,   231,   232,   232,   232,   233,   233,   233,   233,   234,
+     235,   235,   235,   236,   236,   236,   237,   237,   238,   238,
+     239,   239,   239,   240,   240,   241,   241,   241,   242,   242,
+     243,   243,   244,   245,   245,   246,   246,   247,   247,   248,
+     249,   249,   250,   250,   251,   251,   252,   252,   253,   253,
+     254,   254,   254,   255,   255,   256,   256,   257,   257,   258,
+     258,   259,   259,   260,   260,   261,   261,   261,   262,   262,
+     262,   263,   263,   263,   264,   264,   265,   266,   266,   267,
+     267,   268,   268,   269,   269,   270,   270,   270,   271,   271,
+     271,   272,   272,   272,   273,   273,   274,   274,   275,   275,
+     277,   289,   290,   291,   291,   291,   291,   291,   292,   292,
+     294,   306,   307,   308,   308,   308,   308,   309,   309,   311,
+     325,   326,   327,   327,   327,   327,   328,   328,   328,   330,
+     347,   348,   349,   349,   349,   349,   350,   350,   350,   351,
+     354,   373,   390,   398,   408,   416,   433,   434,   435,   435,
+     435,   435,   435,   436,   436,   436,   437,   437,   439,   448,
+     457,   468,   477,   486,   495,   506,   515,   527,   541,   556,
+     567,   584,   601,   618,   635,   650,   665,   678,   693,   702,
+     711,   720,   729,   738,   747,   756,   765,   774,   783,   792,
+     801,   810,   823,   832,   845,   854,   863,   872,   879,   886,
+     895,   902,   911,   919,   926,   933,   941,   950,   959,   973,
+     982,   991,  1000,  1009,  1018,  1027,  1034,  1041,  1067,  1075,
+    1082,  1089,  1096,  1103,  1111,  1119,  1127,  1134,  1145,  1156,
+    1163,  1172,  1181,  1190,  1197,  1204,  1212,  1220,  1230,  1240,
+    1250,  1258,  1271,  1282,  1290,  1303,  1312,  1321,  1330,  1340,
+    1350,  1358,  1371,  1380,  1388,  1397,  1405,  1418,  1427,  1434,
+    1444,  1454,  1464,  1474,  1484,  1494,  1504,  1514,  1521,  1528,
+    1535,  1544,  1553,  1562,  1571,  1578,  1588,  1608,  1615,  1633,
+    1646,  1659,  1668,  1677,  1686,  1695,  1705,  1715,  1726,  1735,
+    1744,  1753,  1762,  1771,  1780,  1793,  1806,  1815,  1822,  1831,
+    1840,  1849,  1858,  1866,  1879,  1887,  1928,  1935,  1950,  1960,
+    1970,  1977,  1984,  1991,  2000,  2008,  2022,  2043,  2064,  2076,
+    2088,  2100,  2109,  2130,  2140,  2149,  2157,  2165,  2178,  2191,
+    2206,  2221,  2230,  2239,  2245,  2254,  2263,  2273,  2283,  2296,
+    2309,  2321,  2335,  2347,  2361,  2371,  2378,  2385,  2394,  2403,
+    2413,  2423,  2433,  2440,  2447,  2456,  2465,  2475,  2485,  2492,
+    2499,  2506,  2514,  2524,  2534,  2544,  2554,  2593,  2603,  2611,
+    2619,  2634,  2643,  2648,  2649,  2650,  2650,  2650,  2651,  2651,
+    2651,  2652,  2652,  2654,  2664,  2673,  2680,  2687,  2694,  2701,
+    2708,  2715,  2720,  2721,  2722,  2722,  2723,  2723,  2724,  2724,
+    2725,  2726,  2727,  2728,  2729,  2730,  2732,  2741,  2748,  2757,
+    2766,  2773,  2780,  2790,  2800,  2810,  2820,  2830,  2840,  2845,
+    2846,  2847,  2849,  2855,  2865,  2872,  2881,  2889,  2894,  2895,
+    2897,  2897,  2897,  2898,  2898,  2899,  2900,  2901,  2902,  2903,
+    2905,  2915,  2924,  2931,  2940,  2947,  2956,  2964,  2977,  2985,
+    2998,  3003,  3004,  3005,  3005,  3006,  3006,  3006,  3008,  3020,
+    3032,  3044,  3059,  3072,  3083,  3088,  3089,  3090,  3090,  3092,
+    3107
 };
 #endif
 
@@ -1168,7 +1171,8 @@ static const char *const yytname[] =
   "VAR_LOCAL_ZONE_OVERRIDE", "VAR_ACCESS_CONTROL_TAG_ACTION",
   "VAR_ACCESS_CONTROL_TAG_DATA", "VAR_VIEW", "VAR_ACCESS_CONTROL_VIEW",
   "VAR_VIEW_FIRST", "VAR_SERVE_EXPIRED", "VAR_SERVE_EXPIRED_TTL",
-  "VAR_SERVE_EXPIRED_TTL_RESET", "VAR_FAKE_DSA", "VAR_FAKE_SHA1",
+  "VAR_SERVE_EXPIRED_TTL_RESET", "VAR_SERVE_EXPIRED_REPLY_TTL",
+  "VAR_SERVE_EXPIRED_CLIENT_TIMEOUT", "VAR_FAKE_DSA", "VAR_FAKE_SHA1",
   "VAR_LOG_IDENTITY", "VAR_HIDE_TRUSTANCHOR", "VAR_TRUST_ANCHOR_SIGNALING",
   "VAR_AGGRESSIVE_NSEC", "VAR_USE_SYSTEMD", "VAR_SHM_ENABLE",
   "VAR_SHM_KEY", "VAR_ROOT_KEY_SENTINEL", "VAR_DNSCRYPT",
@@ -1260,6 +1264,7 @@ static const char *const yytname[] =
   "server_val_permissive_mode", "server_aggressive_nsec",
   "server_ignore_cd_flag", "server_serve_expired",
   "server_serve_expired_ttl", "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",
@@ -1350,14 +1355,14 @@ static const yytype_uint16 yytoknum[] =
      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
+     525,   526,   527,   528,   529,   530,   531,   532
 };
 # endif
 
-#define YYPACT_NINF -261
+#define YYPACT_NINF -262
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-261)))
+  (!!((Yystate) == (-262)))
 
 #define YYTABLE_NINF -1
 
@@ -1368,92 +1373,93 @@ static const yytype_uint16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    -261,     0,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,   259,   -42,
-     -37,   -38,    -6,   -41,   -67,  -136,  -102,  -168,  -191,  -260,
-       2,     3,    26,    28,    29,    30,    33,    51,    52,    53,
-      55,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+    -262,     0,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,   261,   -41,
+     -36,   -40,   -20,   -42,   -29,  -128,  -105,  -170,  -221,  -261,
+       2,     3,     4,    12,    26,    27,    28,    31,    32,    33,
+      35,    36,    37,    38,    39,    51,    52,    53,    64,    65,
       66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    86,    87,
-      90,    92,    93,    94,    95,    96,    97,    98,    99,   101,
+      76,    77,    78,    79,    80,    81,    82,    83,    85,    87,
+      88,    91,    93,    94,    95,    96,    97,    98,    99,   101,
      102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-     112,   113,   114,   115,   116,   119,   120,   121,   122,   123,
+     112,   113,   114,   117,   118,   119,   120,   121,   122,   123,
      124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
      134,   135,   136,   137,   138,   139,   140,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   157,   158,   159,   160,   161,   162,   163,   164,   165,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   164,   165,
      166,   167,   168,   169,   170,   171,   172,   173,   174,   175,
      176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   196,   197,   198,   199,
-     200,   201,   202,   204,   205,   207,   209,   211,   212,   213,
-     214,   215,   216,   217,   218,   219,   227,   234,   235,   236,
-     237,   239,   240,   241,   242,   243,   244,   245,   246,   247,
-     248,   249,   250,   251,   252,   253,   254,   255,   257,   258,
-     292,   293,   294,   295,   299,   300,   301,   343,   344,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,   345,
-     346,   347,   348,   349,   350,   351,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,   355,   359,   360,   385,   386,   387,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,   389,   400,   401,
-     402,   403,   404,   405,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,   406,   407,   408,   409,   410,   411,   412,   451,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,   453,
-     467,   468,   469,   470,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,   471,   472,   473,   474,   475,
-     476,   477,   484,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,   485,   486,   487,   488,   489,   491,   492,   493,
-     494,   495,   496,   497,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,   500,  -261,  -261,
-     503,   506,   507,   515,   516,   517,   519,   520,   521,   522,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,   523,   524,   525,   526,   527,  -261,  -261,  -261,  -261,
-    -261,  -261,   528,   529,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,   530,   531,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,   532,   533,   534,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,   535,   536,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,   537,   538,   539,   540,
-     541,   542,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,   543,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-     544,  -261,  -261,   545,   546,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,   547,   548,   549,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261
+     186,   187,   188,   189,   190,   191,   193,   197,   198,   199,
+     200,   201,   202,   203,   205,   206,   207,   208,   211,   212,
+     215,   228,   229,   230,   231,   232,   233,   234,   236,   237,
+     238,   239,   240,   241,   242,   243,   244,   245,   246,   247,
+     248,   249,   250,   251,   252,   253,   254,   255,   256,   257,
+     259,   260,   294,   295,   296,   297,   301,   302,   303,   345,
+     346,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,   347,   348,   349,   350,   351,   352,   353,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,   357,   361,
+     362,   387,   388,   389,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,   391,   402,   403,   404,   405,   406,   407,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,   408,   409,   410,   411,
+     412,   413,   414,   453,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,   455,   471,   472,   473,   474,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,   475,
+     476,   477,   478,   479,   480,   481,   488,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,   489,   490,   491,   492,
+     493,   495,   496,   497,   498,   499,   500,   501,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,   504,  -262,  -262,   507,   510,   511,   519,   520,   521,
+     523,   524,   525,   526,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,   527,   528,   529,   530,   531,
+    -262,  -262,  -262,  -262,  -262,  -262,   532,   533,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+     534,   535,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,   536,   537,   538,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,   539,
+     540,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+     541,   542,   543,   544,   545,   546,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,   547,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,   548,  -262,  -262,   549,
+     550,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,   551,   552,   553,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1461,9 +1467,9 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       2,     0,     1,    16,   208,   218,   478,   524,   497,   227,
-     533,   556,   237,   570,   253,     3,    18,   210,   220,   229,
-     239,   255,   480,   499,   526,   535,   558,   572,     4,     5,
+       2,     0,     1,    16,   210,   220,   482,   528,   501,   229,
+     537,   560,   239,   574,   255,     3,    18,   212,   222,   231,
+     241,   257,   484,   503,   530,   539,   562,   576,     4,     5,
        6,    10,    14,    15,     8,     9,     7,    11,    12,    13,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -1483,140 +1489,143 @@ 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,    17,
-      19,    20,    82,    85,    94,   179,   180,    21,   146,   147,
-     148,   149,   150,   151,   152,   153,   154,   155,    33,    73,
-      22,    86,    87,    44,    66,    81,    23,    24,    26,    27,
-      25,    28,    29,    30,    31,    32,   117,   191,   118,   120,
-     121,   122,   193,   198,   194,   205,   206,   207,   175,    83,
-      72,    98,   115,   116,   203,   200,   119,    34,    35,    36,
-      37,    38,    74,    88,    89,   104,    60,    70,    61,   183,
-     184,    99,    54,    55,   182,    56,    57,   108,   112,   126,
-     135,   160,   204,   109,    67,    39,    40,    41,    96,   127,
-     128,   129,    42,    43,    45,    46,    48,    49,    47,   133,
-      50,    51,    52,    58,    77,   113,    91,   134,    84,   156,
-      92,    93,   110,   111,   201,    97,    53,    75,    78,    59,
-      62,   100,   101,    76,   157,   102,    63,    64,    65,   192,
-     114,   170,   171,   172,   173,   181,   103,    71,   105,   106,
-     107,   158,    68,    69,    90,    79,    80,    95,   123,   124,
-     202,   125,   130,   131,   132,   161,   162,   164,   166,   167,
-     165,   168,   176,   136,   137,   140,   141,   138,   139,   142,
-     143,   145,   144,   195,   197,   196,   159,   169,   185,   187,
-     186,   188,   189,   190,   163,   174,   177,   178,   199,     0,
-       0,     0,     0,     0,     0,     0,   209,   211,   212,   213,
-     215,   216,   217,   214,     0,     0,     0,     0,     0,     0,
-     219,   221,   222,   223,   224,   225,   226,     0,     0,     0,
-       0,     0,     0,     0,   228,   230,   231,   234,   235,   232,
-     236,   233,     0,     0,     0,     0,     0,     0,     0,     0,
-     238,   240,   241,   242,   243,   247,   244,   245,   246,     0,
-       0,     0,     0,     0,   258,   262,   263,   264,   265,   254,
-     256,   257,   259,   260,   261,     0,     0,     0,     0,     0,
-       0,     0,     0,   479,   481,   483,   482,   488,   484,   485,
-     486,   487,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   498,   500,   501,   502,   503,   504,
-     505,   506,   507,   508,   509,   510,   511,     0,   525,   527,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     534,   536,   537,   538,   540,   541,   539,   542,   543,   544,
-     545,     0,     0,     0,     0,     0,   557,   559,   560,   561,
-     562,   563,     0,     0,   571,   573,   574,   267,   266,   273,
-     286,   284,   292,   293,   296,   294,   295,   297,   298,   299,
-     300,   301,   323,   324,   325,   326,   327,   351,   352,   353,
-     358,   359,   289,   360,   361,   364,   362,   363,   366,   367,
-     368,   382,   338,   339,   341,   342,   369,   385,   332,   334,
-     386,   392,   393,   394,   290,   350,   408,   409,   333,   403,
-     316,   285,   328,   383,   389,   370,     0,     0,   412,   291,
-     268,   315,   374,   269,   287,   288,   329,   330,   410,   372,
-     376,   377,   270,   413,   354,   381,   317,   337,   387,   388,
-     391,   402,   331,   406,   404,   405,   343,   349,   378,   379,
-     344,   345,   371,   396,   318,   319,   322,   302,   304,   305,
-     306,   307,   308,   414,   415,   417,   355,   356,   357,   365,
-     418,   419,   420,     0,     0,     0,   373,   346,   529,   429,
-     433,   431,   430,   434,   432,     0,     0,   437,   438,   274,
-     275,   276,   277,   278,   279,   280,   281,   282,   283,   375,
-     390,   407,   442,   443,   347,   421,     0,     0,     0,     0,
-       0,     0,   397,   398,   399,   400,   401,   530,   340,   335,
-     395,   314,   271,   272,   336,   444,   446,   445,   447,   448,
-     449,   303,   310,   439,   441,   440,   309,     0,   321,   380,
-     416,   320,   348,   311,   312,   313,   450,   451,   452,   456,
-     455,   453,   454,   457,   458,   459,   460,   462,   461,   471,
-       0,   475,   476,     0,     0,   477,   463,   469,   464,   465,
-     466,   468,   470,   467,   248,   249,   250,   251,   252,   489,
-     491,   490,   493,   494,   495,   496,   492,   512,   513,   514,
-     515,   516,   517,   518,   519,   520,   521,   522,   523,   528,
-     546,   547,   548,   551,   549,   550,   552,   553,   554,   555,
-     564,   565,   566,   567,   568,   575,   576,   384,   411,   428,
-     531,   532,   435,   436,   422,   423,     0,     0,     0,   427,
-     569,   472,   473,   474,   426,   424,   425
+       0,    17,    19,    20,    82,    85,    94,   181,   182,    21,
+     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
+      33,    73,    22,    86,    87,    44,    66,    81,    23,    24,
+      26,    27,    25,    28,    29,    30,    31,    32,   117,   193,
+     118,   120,   121,   122,   195,   200,   196,   207,   208,   209,
+     177,    83,    72,    98,   115,   116,   205,   202,   119,    34,
+      35,    36,    37,    38,    74,    88,    89,   104,    60,    70,
+      61,   185,   186,    99,    54,    55,   184,    56,    57,   108,
+     112,   126,   135,   160,   206,   109,    67,    39,    40,    41,
+      96,   127,   128,   129,    42,    43,    45,    46,    48,    49,
+      47,   133,    50,    51,    52,    58,    77,   113,    91,   134,
+      84,   156,    92,    93,   110,   111,   203,    97,    53,    75,
+      78,    59,    62,   100,   101,    76,   157,   102,    63,    64,
+      65,   194,   114,   170,   171,   172,   173,   174,   175,   183,
+     103,    71,   105,   106,   107,   158,    68,    69,    90,    79,
+      80,    95,   123,   124,   204,   125,   130,   131,   132,   161,
+     162,   164,   166,   167,   165,   168,   178,   136,   137,   140,
+     141,   138,   139,   142,   143,   145,   144,   197,   199,   198,
+     159,   169,   187,   189,   188,   190,   191,   192,   163,   176,
+     179,   180,   201,     0,     0,     0,     0,     0,     0,     0,
+     211,   213,   214,   215,   217,   218,   219,   216,     0,     0,
+       0,     0,     0,     0,   221,   223,   224,   225,   226,   227,
+     228,     0,     0,     0,     0,     0,     0,     0,   230,   232,
+     233,   236,   237,   234,   238,   235,     0,     0,     0,     0,
+       0,     0,     0,     0,   240,   242,   243,   244,   245,   249,
+     246,   247,   248,     0,     0,     0,     0,     0,   260,   264,
+     265,   266,   267,   256,   258,   259,   261,   262,   263,     0,
+       0,     0,     0,     0,     0,     0,     0,   483,   485,   487,
+     486,   492,   488,   489,   490,   491,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   502,   504,
+     505,   506,   507,   508,   509,   510,   511,   512,   513,   514,
+     515,     0,   529,   531,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   538,   540,   541,   542,   544,   545,
+     543,   546,   547,   548,   549,     0,     0,     0,     0,     0,
+     561,   563,   564,   565,   566,   567,     0,     0,   575,   577,
+     578,   269,   268,   275,   288,   286,   294,   295,   298,   296,
+     297,   299,   300,   301,   302,   303,   325,   326,   327,   328,
+     329,   353,   354,   355,   360,   361,   291,   362,   363,   366,
+     364,   365,   368,   369,   370,   384,   340,   341,   343,   344,
+     371,   387,   334,   336,   388,   394,   395,   396,   292,   352,
+     412,   413,   335,   407,   318,   287,   330,   385,   391,   372,
+       0,     0,   416,   293,   270,   317,   376,   271,   289,   290,
+     331,   332,   414,   374,   378,   379,   272,   417,   356,   383,
+     319,   339,   389,   390,   393,   406,   333,   410,   408,   409,
+     345,   351,   380,   381,   346,   347,   373,   398,   320,   321,
+     324,   304,   306,   307,   308,   309,   310,   418,   419,   421,
+     357,   358,   359,   367,   422,   423,   424,     0,     0,     0,
+     375,   348,   533,   433,   437,   435,   434,   438,   436,     0,
+       0,   441,   442,   276,   277,   278,   279,   280,   281,   282,
+     283,   284,   285,   377,   392,   411,   446,   447,   349,   425,
+       0,     0,     0,     0,     0,     0,   399,   400,   401,   402,
+     403,   404,   405,   534,   342,   337,   397,   316,   273,   274,
+     338,   448,   450,   449,   451,   452,   453,   305,   312,   443,
+     445,   444,   311,     0,   323,   382,   420,   322,   350,   313,
+     314,   315,   454,   455,   456,   460,   459,   457,   458,   461,
+     462,   463,   464,   466,   465,   475,     0,   479,   480,     0,
+       0,   481,   467,   473,   468,   469,   470,   472,   474,   471,
+     250,   251,   252,   253,   254,   493,   495,   494,   497,   498,
+     499,   500,   496,   516,   517,   518,   519,   520,   521,   522,
+     523,   524,   525,   526,   527,   532,   550,   551,   552,   555,
+     553,   554,   556,   557,   558,   559,   568,   569,   570,   571,
+     572,   579,   580,   386,   415,   432,   535,   536,   439,   440,
+     426,   427,     0,     0,     0,   431,   573,   476,   477,   478,
+     430,   428,   429
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,   -23,   550,   551,   552,   553,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,
-    -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261,  -261
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,   -23,   554,   555,   556,   557,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,  -262,
+    -262
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,    15,    16,    28,   229,    17,    29,   426,    18,
-      30,   440,    19,    31,   454,    20,    32,   470,   484,   485,
-     486,   487,   488,    21,    33,   489,   230,   231,   232,   233,
-     234,   235,   236,   237,   238,   239,   240,   241,   242,   243,
-     244,   245,   246,   247,   248,   249,   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,
-     427,   428,   429,   430,   431,   432,   433,   441,   442,   443,
-     444,   445,   446,   471,   472,   473,   474,   475,   476,   477,
-     478,   455,   456,   457,   458,   459,   460,   461,    22,    34,
-     503,   504,   505,   506,   507,   508,   509,   510,   511,    23,
-      35,   524,   525,   526,   527,   528,   529,   530,   531,   532,
-     533,   534,   535,   536,    24,    36,   538,   539,   414,   415,
-     416,   417,    25,    37,   550,   551,   552,   553,   554,   555,
-     556,   557,   558,   559,   560,    26,    38,   566,   567,   568,
-     569,   570,   571,   418,    27,    39,   574,   575,   576
+      -1,     1,    15,    16,    28,   231,    17,    29,   430,    18,
+      30,   444,    19,    31,   458,    20,    32,   474,   488,   489,
+     490,   491,   492,    21,    33,   493,   232,   233,   234,   235,
+     236,   237,   238,   239,   240,   241,   242,   243,   244,   245,
+     246,   247,   248,   249,   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,   431,   432,   433,   434,   435,   436,   437,   445,
+     446,   447,   448,   449,   450,   475,   476,   477,   478,   479,
+     480,   481,   482,   459,   460,   461,   462,   463,   464,   465,
+      22,    34,   507,   508,   509,   510,   511,   512,   513,   514,
+     515,    23,    35,   528,   529,   530,   531,   532,   533,   534,
+     535,   536,   537,   538,   539,   540,    24,    36,   542,   543,
+     418,   419,   420,   421,    25,    37,   554,   555,   556,   557,
+     558,   559,   560,   561,   562,   563,   564,    26,    38,   570,
+     571,   572,   573,   574,   575,   422,    27,    39,   578,   579,
+     580
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1624,138 +1633,140 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint16 yytable[] =
 {
-       2,   419,   462,   420,   421,   447,   434,   572,   573,   537,
-     490,     3,   577,   578,   435,   436,   512,   513,   514,   515,
-     516,   517,   518,   519,   520,   521,   522,   523,   495,   496,
-     497,   498,   499,   500,   501,   502,   579,   462,   580,   581,
-     582,   448,   449,   583,     4,   561,   562,   563,   564,   565,
-       5,   540,   541,   542,   543,   544,   545,   546,   547,   548,
-     549,   584,   585,   586,   422,   587,   450,   588,   589,   590,
-     591,   592,   593,   594,   595,   596,   597,   598,   599,   600,
-     601,   602,   603,   604,   605,   606,   607,   608,   609,   610,
-     611,   612,   613,   614,     6,   423,   615,   616,   424,   437,
-     617,   438,   618,   619,   620,   621,   622,   623,   624,   625,
-       7,   626,   627,   628,   629,   630,   631,   632,   633,   634,
-     635,   636,   637,   638,   639,   640,   641,   451,   452,   642,
-     643,   644,   645,   646,   647,   648,   649,   650,   651,   652,
-     653,   654,   655,   656,   657,   658,   659,   660,   661,   662,
-     663,     8,   664,   665,   666,   667,   668,   669,   670,   671,
-     672,   673,   674,   675,   676,   677,   453,   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,   703,   704,   705,   706,   707,   708,   709,   710,
-     711,   712,     9,   464,   465,   466,   713,   714,   715,   716,
-     717,   718,   719,   469,   720,   721,   425,   722,    10,   723,
-     439,   724,   725,   726,   727,   728,   729,   730,   731,   732,
-     479,   480,   481,   482,   483,    11,   463,   733,   464,   465,
-     466,   467,   468,    12,   734,   735,   736,   737,   469,   738,
-     739,   740,   741,   742,   743,   744,   745,   746,   747,   748,
-     749,   750,   751,   752,   753,   754,    13,   755,   756,     0,
-      14,    40,    41,    42,    43,    44,    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,   757,   758,   759,   760,    71,    72,    73,   761,
-     762,   763,    74,    75,    76,    77,    78,    79,    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,   764,   765,   766,   767,   768,   769,   770,
-     771,   772,   115,   116,   117,   773,   118,   119,   120,   774,
-     775,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140,   141,   142,   143,   144,   776,   777,   778,   145,   779,
-     146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     780,   781,   782,   783,   784,   785,   786,   787,   788,   789,
-     790,   791,   792,   156,   157,   158,   159,   160,   161,   162,
-     163,   164,   165,   166,   167,   168,   169,   170,   171,   172,
-     173,   174,   175,   176,   177,   178,   179,   180,   181,   182,
-     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
-     193,   793,   194,   794,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   795,   796,   797,
-     798,   799,   800,   801,   802,   803,   804,   805,   208,   209,
-     210,   211,   212,   213,   806,   807,   808,   809,   810,   811,
-     214,   812,   813,   814,   815,   816,   817,   818,   215,   216,
-     819,   217,   218,   820,   219,   220,   821,   822,   221,   222,
-     223,   224,   225,   226,   227,   823,   824,   825,   228,   826,
-     827,   828,   829,   830,   831,   832,   833,   834,   835,   836,
-     837,   838,   839,   840,   841,   842,   843,   844,   845,   846,
-     847,   848,   849,   850,   851,   852,   853,   854,   855,   856,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       2,   466,   423,   451,   424,   425,   541,   438,   576,   577,
+     494,     3,   581,   582,   583,   439,   440,   565,   566,   567,
+     568,   569,   584,   466,   516,   517,   518,   519,   520,   521,
+     522,   523,   524,   525,   526,   527,   585,   586,   587,   452,
+     453,   588,   589,   590,     4,   591,   592,   593,   594,   595,
+       5,   544,   545,   546,   547,   548,   549,   550,   551,   552,
+     553,   596,   597,   598,   454,   426,   499,   500,   501,   502,
+     503,   504,   505,   506,   599,   600,   601,   602,   603,   604,
+     605,   606,   607,   608,   609,   610,   611,   612,   613,   614,
+     615,   616,   617,   618,     6,   619,   427,   620,   621,   428,
+     441,   622,   442,   623,   624,   625,   626,   627,   628,   629,
+       7,   630,   631,   632,   633,   634,   635,   636,   637,   638,
+     639,   640,   641,   642,   643,   455,   456,   644,   645,   646,
+     647,   648,   649,   650,   651,   652,   653,   654,   655,   656,
+     657,   658,   659,   660,   661,   662,   663,   664,   665,   666,
+     667,     8,   668,   669,   670,   671,   672,   673,   674,   675,
+     676,   677,   678,   679,   457,   680,   681,   682,   683,   684,
+     685,   686,   687,   688,   689,   690,   691,   692,   693,   694,
+     695,   696,   697,   698,   699,   700,   701,   702,   703,   704,
+     705,   706,   707,   708,   709,   710,   711,   712,   713,   714,
+     715,   716,     9,   717,   468,   469,   470,   718,   719,   720,
+     721,   722,   723,   724,   473,   725,   726,   727,   728,   429,
+      10,   729,   730,   443,   467,   731,   468,   469,   470,   471,
+     472,   483,   484,   485,   486,   487,   473,    11,   732,   733,
+     734,   735,   736,   737,   738,    12,   739,   740,   741,   742,
+     743,   744,   745,   746,   747,   748,   749,   750,   751,   752,
+     753,   754,   755,   756,   757,   758,   759,   760,    13,   761,
+     762,     0,    14,    40,    41,    42,    43,    44,    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,   763,   764,   765,   766,    71,    72,
+      73,   767,   768,   769,    74,    75,    76,    77,    78,    79,
+      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,   770,   771,   772,   773,   774,
+     775,   776,   777,   778,   115,   116,   117,   779,   118,   119,
+     120,   780,   781,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   782,   783,   784,
+     145,   785,   146,   147,   148,   149,   150,   151,   152,   153,
+     154,   155,   786,   787,   788,   789,   790,   791,   792,   793,
+     794,   795,   796,   797,   798,   156,   157,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   193,   799,   194,   800,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   801,   802,   803,   804,   805,   806,   807,   808,   809,
+     810,   811,   210,   211,   212,   213,   214,   215,   812,   813,
+     814,   815,   816,   817,   216,   818,   819,   820,   821,   822,
+     823,   824,   217,   218,   825,   219,   220,   826,   221,   222,
+     827,   828,   223,   224,   225,   226,   227,   228,   229,   829,
+     830,   831,   230,   832,   833,   834,   835,   836,   837,   838,
+     839,   840,   841,   842,   843,   844,   845,   846,   847,   848,
+     849,   850,   851,   852,   853,   854,   855,   856,   857,   858,
+     859,   860,   861,   862,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   491,   492,   493,   494
+       0,     0,     0,     0,     0,     0,     0,   495,   496,   497,
+     498
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    43,    43,    45,    46,    43,    43,   267,   268,   111,
-      33,    11,    10,    10,    51,    52,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,   162,   163,    95,    96,
-      97,    98,    99,   100,   101,   102,    10,    43,    10,    10,
-      10,    79,    80,    10,    44,   236,   237,   238,   239,   240,
-      50,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,    10,    10,    10,   106,    10,   104,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
+       0,    43,    43,    43,    45,    46,   111,    43,   269,   270,
+      33,    11,    10,    10,    10,    51,    52,   238,   239,   240,
+     241,   242,    10,    43,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,    10,    10,    10,    79,
+      80,    10,    10,    10,    44,    10,    10,    10,    10,    10,
+      50,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,    10,    10,    10,   104,   106,    95,    96,    97,    98,
+      99,   100,   101,   102,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    94,   137,    10,    10,   140,   136,
-      10,   138,    10,    10,    10,    10,    10,    10,    10,    10,
+      10,    10,    10,    10,    94,    10,   137,    10,    10,   140,
+     136,    10,   138,    10,    10,    10,    10,    10,    10,    10,
      110,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,    10,   165,   166,    10,
+      10,    10,    10,    10,    10,   165,   166,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
       10,   151,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,   204,    10,    10,    10,
+      10,    10,    10,    10,   204,    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,   202,   244,   245,   246,    10,    10,    10,    10,
-      10,    10,    10,   254,    10,    10,   258,    10,   218,    10,
-     257,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-     271,   272,   273,   274,   275,   235,   242,    10,   244,   245,
-     246,   247,   248,   243,    10,    10,    10,    10,   254,    10,
-      10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,   266,    10,    10,    -1,
-     270,    12,    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,    10,    10,    10,    10,    47,    48,    49,    10,
-      10,    10,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,   103,   104,   105,    10,   107,   108,   109,    10,
-      10,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
-     131,   132,   133,   134,   135,    10,    10,    10,   139,    10,
-     141,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-      10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,   164,   165,   166,   167,   168,   169,   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,    10,   203,    10,   205,   206,   207,   208,   209,   210,
-     211,   212,   213,   214,   215,   216,   217,    10,    10,    10,
-      10,    10,    10,    10,    10,    10,    10,    10,   229,   230,
-     231,   232,   233,   234,    10,    10,    10,    10,    10,    10,
-     241,    10,    10,    10,    10,    10,    10,    10,   249,   250,
-      10,   252,   253,    10,   255,   256,    10,    10,   259,   260,
-     261,   262,   263,   264,   265,    10,    10,    10,   269,    10,
+      10,    10,   202,    10,   246,   247,   248,    10,    10,    10,
+      10,    10,    10,    10,   256,    10,    10,    10,    10,   260,
+     220,    10,    10,   259,   244,    10,   246,   247,   248,   249,
+     250,   273,   274,   275,   276,   277,   256,   237,    10,    10,
+      10,    10,    10,    10,    10,   245,    10,    10,    10,    10,
       10,    10,    10,    10,    10,    10,    10,    10,    10,    10,
+      10,    10,    10,    10,    10,    10,    10,    10,   268,    10,
+      10,    -1,   272,    12,    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,    10,    10,    10,    10,    47,    48,
+      49,    10,    10,    10,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    10,    10,    10,    10,    10,
+      10,    10,    10,    10,   103,   104,   105,    10,   107,   108,
+     109,    10,    10,   112,   113,   114,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,    10,    10,    10,
+     139,    10,   141,   142,   143,   144,   145,   146,   147,   148,
+     149,   150,    10,    10,    10,    10,    10,    10,    10,    10,
+      10,    10,    10,    10,    10,   164,   165,   166,   167,   168,
+     169,   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,    10,   203,    10,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,    10,    10,    10,    10,    10,    10,    10,    10,    10,
+      10,    10,   231,   232,   233,   234,   235,   236,    10,    10,
+      10,    10,    10,    10,   243,    10,    10,    10,    10,    10,
+      10,    10,   251,   252,    10,   254,   255,    10,   257,   258,
+      10,    10,   261,   262,   263,   264,   265,   266,   267,    10,
+      10,    10,   271,    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,    -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,    33,    33,    33,    33
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    33,    33,    33,
+      33
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint16 yystos[] =
 {
-       0,   277,     0,    11,    44,    50,    94,   110,   151,   202,
-     218,   235,   243,   266,   270,   278,   279,   282,   285,   288,
-     291,   299,   514,   525,   540,   548,   561,   570,   280,   283,
-     286,   289,   292,   300,   515,   526,   541,   549,   562,   571,
+       0,   279,     0,    11,    44,    50,    94,   110,   151,   202,
+     220,   237,   245,   268,   272,   280,   281,   284,   287,   290,
+     293,   301,   518,   529,   544,   552,   565,   574,   282,   285,
+     288,   291,   294,   302,   519,   530,   545,   553,   566,   575,
       12,    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,
@@ -1772,10 +1783,10 @@ static const yytype_uint16 yystos[] =
      178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
      188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
      198,   199,   200,   201,   203,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   229,   230,
-     231,   232,   233,   234,   241,   249,   250,   252,   253,   255,
-     256,   259,   260,   261,   262,   263,   264,   265,   269,   281,
-     302,   303,   304,   305,   306,   307,   308,   309,   310,   311,
+     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
+     231,   232,   233,   234,   235,   236,   243,   251,   252,   254,
+     255,   257,   258,   261,   262,   263,   264,   265,   266,   267,
+     271,   283,   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,
@@ -1793,23 +1804,24 @@ static const yytype_uint16 yystos[] =
      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,   544,   545,   546,   547,   569,    43,
-      45,    46,   106,   137,   140,   258,   284,   486,   487,   488,
-     489,   490,   491,   492,    43,    51,    52,   136,   138,   257,
-     287,   493,   494,   495,   496,   497,   498,    43,    79,    80,
-     104,   165,   166,   204,   290,   507,   508,   509,   510,   511,
-     512,   513,    43,   242,   244,   245,   246,   247,   248,   254,
-     293,   499,   500,   501,   502,   503,   504,   505,   506,   271,
-     272,   273,   274,   275,   294,   295,   296,   297,   298,   301,
-     499,   500,   501,   502,   503,    95,    96,    97,    98,    99,
-     100,   101,   102,   516,   517,   518,   519,   520,   521,   522,
-     523,   524,   152,   153,   154,   155,   156,   157,   158,   159,
-     160,   161,   162,   163,   527,   528,   529,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   111,   542,   543,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     550,   551,   552,   553,   554,   555,   556,   557,   558,   559,
-     560,   236,   237,   238,   239,   240,   563,   564,   565,   566,
-     567,   568,   267,   268,   572,   573,   574,    10,    10,    10,
+     482,   483,   484,   485,   486,   487,   488,   489,   548,   549,
+     550,   551,   573,    43,    45,    46,   106,   137,   140,   260,
+     286,   490,   491,   492,   493,   494,   495,   496,    43,    51,
+      52,   136,   138,   259,   289,   497,   498,   499,   500,   501,
+     502,    43,    79,    80,   104,   165,   166,   204,   292,   511,
+     512,   513,   514,   515,   516,   517,    43,   244,   246,   247,
+     248,   249,   250,   256,   295,   503,   504,   505,   506,   507,
+     508,   509,   510,   273,   274,   275,   276,   277,   296,   297,
+     298,   299,   300,   303,   503,   504,   505,   506,   507,    95,
+      96,    97,    98,    99,   100,   101,   102,   520,   521,   522,
+     523,   524,   525,   526,   527,   528,   152,   153,   154,   155,
+     156,   157,   158,   159,   160,   161,   162,   163,   531,   532,
+     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
+     543,   111,   546,   547,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   554,   555,   556,   557,   558,   559,
+     560,   561,   562,   563,   564,   238,   239,   240,   241,   242,
+     567,   568,   569,   570,   571,   572,   269,   270,   576,   577,
+     578,    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,
@@ -1837,39 +1849,39 @@ 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
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint16 yyr1[] =
 {
-       0,   276,   277,   277,   278,   278,   278,   278,   278,   278,
-     278,   278,   278,   278,   278,   278,   279,   280,   280,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   281,   281,
-     281,   281,   281,   281,   281,   281,   281,   281,   282,   283,
-     283,   284,   284,   284,   284,   284,   284,   284,   285,   286,
-     286,   287,   287,   287,   287,   287,   287,   288,   289,   289,
-     290,   290,   290,   290,   290,   290,   290,   291,   292,   292,
-     293,   293,   293,   293,   293,   293,   293,   293,   294,   295,
-     296,   297,   298,   299,   300,   300,   301,   301,   301,   301,
-     301,   301,   301,   301,   301,   301,   302,   303,   304,   305,
+       0,   278,   279,   279,   280,   280,   280,   280,   280,   280,
+     280,   280,   280,   280,   280,   280,   281,   282,   282,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     283,   283,   283,   283,   283,   283,   283,   283,   283,   283,
+     284,   285,   285,   286,   286,   286,   286,   286,   286,   286,
+     287,   288,   288,   289,   289,   289,   289,   289,   289,   290,
+     291,   291,   292,   292,   292,   292,   292,   292,   292,   293,
+     294,   294,   295,   295,   295,   295,   295,   295,   295,   295,
+     296,   297,   298,   299,   300,   301,   302,   302,   303,   303,
+     303,   303,   303,   303,   303,   303,   303,   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,
@@ -1891,16 +1903,17 @@ static const yytype_uint16 yyr1[] =
      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,
-     515,   516,   516,   516,   516,   516,   516,   516,   516,   517,
-     518,   519,   520,   521,   522,   523,   524,   525,   526,   526,
-     527,   527,   527,   527,   527,   527,   527,   527,   527,   527,
-     527,   527,   528,   529,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   541,   542,   543,   544,
-     545,   546,   547,   548,   549,   549,   550,   550,   550,   550,
-     550,   550,   550,   550,   550,   550,   551,   552,   553,   554,
-     555,   556,   557,   558,   559,   560,   561,   562,   562,   563,
-     563,   563,   563,   563,   564,   565,   566,   567,   568,   569,
-     570,   571,   571,   572,   572,   573,   574
+     516,   517,   518,   519,   519,   520,   520,   520,   520,   520,
+     520,   520,   520,   521,   522,   523,   524,   525,   526,   527,
+     528,   529,   530,   530,   531,   531,   531,   531,   531,   531,
+     531,   531,   531,   531,   531,   531,   532,   533,   534,   535,
+     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
+     545,   546,   547,   548,   549,   550,   551,   552,   553,   553,
+     554,   554,   554,   554,   554,   554,   554,   554,   554,   554,
+     555,   556,   557,   558,   559,   560,   561,   562,   563,   564,
+     565,   566,   566,   567,   567,   567,   567,   567,   568,   569,
+     570,   571,   572,   573,   574,   575,   575,   576,   576,   577,
+     578
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1926,14 +1939,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,     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,     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,     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,
@@ -1944,26 +1956,28 @@ 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,     3,     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,
+       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,     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,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     1,     2,     0,     1,     2,     2,
-       2,     3,     3,     1,     2,     0,     1,     1,     1,     1,
+       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,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     0,     1,
-       1,     1,     1,     1,     2,     2,     2,     2,     2,     3,
-       1,     2,     0,     1,     1,     2,     2
+       2,     2,     2,     2,     2,     2,     2,     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,     2,     2,
+       2,     2,     2,     3,     1,     2,     0,     1,     1,     2,
+       2
 };
 
 
@@ -1979,22 +1993,22 @@ static const yytype_uint8 yyr2[] =
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
-#define YYBACKUP(Token, Value)                                  \
-do                                                              \
-  if (yychar == YYEMPTY)                                        \
-    {                                                           \
-      yychar = (Token);                                         \
-      yylval = (Value);                                         \
-      YYPOPSTACK (yylen);                                       \
-      yystate = *yyssp;                                         \
-      goto yybackup;                                            \
-    }                                                           \
-  else                                                          \
-    {                                                           \
-      yyerror (YY_("syntax error: cannot back up")); \
-      YYERROR;                                                  \
-    }                                                           \
-while (0)
+#define YYBACKUP(Token, Value)                                    \
+  do                                                              \
+    if (yychar == YYEMPTY)                                        \
+      {                                                           \
+        yychar = (Token);                                         \
+        yylval = (Value);                                         \
+        YYPOPSTACK (yylen);                                       \
+        yystate = *yyssp;                                         \
+        goto yybackup;                                            \
+      }                                                           \
+    else                                                          \
+      {                                                           \
+        yyerror (YY_("syntax error: cannot back up")); \
+        YYERROR;                                                  \
+      }                                                           \
+  while (0)
 
 /* Error token number */
 #define YYTERROR        1
@@ -2034,37 +2048,37 @@ do {                                                                      \
 } while (0)
 
 
-/*----------------------------------------.
-| Print this symbol's value on YYOUTPUT.  |
-`----------------------------------------*/
+/*-----------------------------------.
+| Print this symbol's value on YYO.  |
+`-----------------------------------*/
 
 static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep)
 {
-  FILE *yyo = yyoutput;
-  YYUSE (yyo);
+  FILE *yyoutput = yyo;
+  YYUSE (yyoutput);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
   if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+    YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
 # endif
   YYUSE (yytype);
 }
 
 
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
+/*---------------------------.
+| Print this symbol on YYO.  |
+`---------------------------*/
 
 static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep)
 {
-  YYFPRINTF (yyoutput, "%s %s (",
+  YYFPRINTF (yyo, "%s %s (",
              yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
 
-  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
-  YYFPRINTF (yyoutput, ")");
+  yy_symbol_value_print (yyo, yytype, yyvaluep);
+  YYFPRINTF (yyo, ")");
 }
 
 /*------------------------------------------------------------------.
@@ -2098,7 +2112,7 @@ do {                                                            \
 static void
 yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
 {
-  unsigned long int yylno = yyrline[yyrule];
+  unsigned long yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
   int yyi;
   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
@@ -2109,7 +2123,7 @@ yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
       yy_symbol_print (stderr,
                        yystos[yyssp[yyi + 1 - yynrhs]],
-                       &(yyvsp[(yyi + 1) - (yynrhs)])
+                       &yyvsp[(yyi + 1) - (yynrhs)]
                                               );
       YYFPRINTF (stderr, "\n");
     }
@@ -2213,7 +2227,10 @@ yytnamerr (char *yyres, const char *yystr)
           case '\\':
             if (*++yyp != '\\')
               goto do_not_strip_quotes;
-            /* Fall through.  */
+            else
+              goto append;
+
+          append:
           default:
             if (yyres)
               yyres[yyn] = *yyp;
@@ -2231,7 +2248,7 @@ yytnamerr (char *yyres, const char *yystr)
   if (! yyres)
     return yystrlen (yystr);
 
-  return yystpcpy (yyres, yystr) - yyres;
+  return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres);
 }
 # endif
 
@@ -2309,10 +2326,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yyarg[yycount++] = yytname[yyx];
                 {
                   YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
-                  if (! (yysize <= yysize1
-                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                  if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+                    yysize = yysize1;
+                  else
                     return 2;
-                  yysize = yysize1;
                 }
               }
         }
@@ -2324,6 +2341,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
       case N:                               \
         yyformat = S;                       \
       break
+    default: /* Avoid compiler warnings. */
       YYCASE_(0, YY_("syntax error"));
       YYCASE_(1, YY_("syntax error, unexpected %s"));
       YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
@@ -2335,9 +2353,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 
   {
     YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
-    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+    if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+      yysize = yysize1;
+    else
       return 2;
-    yysize = yysize1;
   }
 
   if (*yymsg_alloc < yysize)
@@ -2463,23 +2482,33 @@ yyparse (void)
   yychar = YYEMPTY; /* Cause a token to be read.  */
   goto yysetstate;
 
+
 /*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate.  |
+| yynewstate -- push a new state, which is found in yystate.  |
 `------------------------------------------------------------*/
- yynewstate:
+yynewstate:
   /* In all cases, when you get here, the value and location stacks
      have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
- yysetstate:
-  *yyssp = yystate;
+
+/*--------------------------------------------------------------------.
+| yynewstate -- set current state (the top of the stack) to yystate.  |
+`--------------------------------------------------------------------*/
+yysetstate:
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+  YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+  *yyssp = (yytype_int16) yystate;
 
   if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+    goto yyexhaustedlab;
+#else
     {
       /* Get the current used size of the three stacks, in elements.  */
-      YYSIZE_T yysize = yyssp - yyss + 1;
+      YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1);
 
-#ifdef yyoverflow
+# if defined yyoverflow
       {
         /* Give user a chance to reallocate the stack.  Use copies of
            these so that the &'s don't force the real ones into
@@ -2495,14 +2524,10 @@ yyparse (void)
                     &yyss1, yysize * sizeof (*yyssp),
                     &yyvs1, yysize * sizeof (*yyvsp),
                     &yystacksize);
-
         yyss = yyss1;
         yyvs = yyvs1;
       }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
-# else
+# else /* defined YYSTACK_RELOCATE */
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
         goto yyexhaustedlab;
@@ -2518,35 +2543,33 @@ yyparse (void)
           goto yyexhaustedlab;
         YYSTACK_RELOCATE (yyss_alloc, yyss);
         YYSTACK_RELOCATE (yyvs_alloc, yyvs);
-#  undef YYSTACK_RELOCATE
+# undef YYSTACK_RELOCATE
         if (yyss1 != yyssa)
           YYSTACK_FREE (yyss1);
       }
 # endif
-#endif /* no yyoverflow */
 
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-                  (unsigned long int) yystacksize));
+                  (unsigned long) yystacksize));
 
       if (yyss + yystacksize - 1 <= yyssp)
         YYABORT;
     }
-
-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
 
   if (yystate == YYFINAL)
     YYACCEPT;
 
   goto yybackup;
 
+
 /*-----------.
 | yybackup.  |
 `-----------*/
 yybackup:
-
   /* Do appropriate processing given the current state.  Read a
      lookahead token if we need one and don't already have one.  */
 
@@ -2604,7 +2627,6 @@ yybackup:
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
   YY_IGNORE_MAYBE_UNINITIALIZED_END
-
   goto yynewstate;
 
 
@@ -2619,7 +2641,7 @@ yydefault:
 
 
 /*-----------------------------.
-| yyreduce -- Do a reduction.  |
+| yyreduce -- do a reduction.  |
 `-----------------------------*/
 yyreduce:
   /* yyn is the number of a rule to reduce with.  */
@@ -2639,16 +2661,16 @@ yyreduce:
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
-        case 16:
-#line 185 "./util/configparser.y" /* yacc.c:1646  */
+  case 16:
+#line 186 "./util/configparser.y"
     { 
                OUTYY(("\nP(server:)\n")); 
        }
-#line 2648 "util/configparser.c" /* yacc.c:1646  */
+#line 2670 "util/configparser.c"
     break;
 
-  case 208:
-#line 276 "./util/configparser.y" /* yacc.c:1646  */
+  case 210:
+#line 278 "./util/configparser.y"
     {
                struct config_stub* s;
                OUTYY(("\nP(stub_zone:)\n")); 
@@ -2659,11 +2681,11 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2663 "util/configparser.c" /* yacc.c:1646  */
+#line 2685 "util/configparser.c"
     break;
 
-  case 218:
-#line 293 "./util/configparser.y" /* yacc.c:1646  */
+  case 220:
+#line 295 "./util/configparser.y"
     {
                struct config_stub* s;
                OUTYY(("\nP(forward_zone:)\n")); 
@@ -2674,11 +2696,11 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2678 "util/configparser.c" /* yacc.c:1646  */
+#line 2700 "util/configparser.c"
     break;
 
-  case 227:
-#line 310 "./util/configparser.y" /* yacc.c:1646  */
+  case 229:
+#line 312 "./util/configparser.y"
     {
                struct config_view* s;
                OUTYY(("\nP(view:)\n")); 
@@ -2691,11 +2713,11 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2695 "util/configparser.c" /* yacc.c:1646  */
+#line 2717 "util/configparser.c"
     break;
 
-  case 237:
-#line 329 "./util/configparser.y" /* yacc.c:1646  */
+  case 239:
+#line 331 "./util/configparser.y"
     {
                struct config_auth* s;
                OUTYY(("\nP(auth_zone:)\n")); 
@@ -2711,11 +2733,11 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2715 "util/configparser.c" /* yacc.c:1646  */
+#line 2737 "util/configparser.c"
     break;
 
-  case 248:
-#line 353 "./util/configparser.y" /* yacc.c:1646  */
+  case 250:
+#line 355 "./util/configparser.y"
     {
                uint8_t* bitlist;
                size_t len = 0;
@@ -2732,11 +2754,11 @@ yyreduce:
 
                }
        }
-#line 2736 "util/configparser.c" /* yacc.c:1646  */
+#line 2758 "util/configparser.c"
     break;
 
-  case 249:
-#line 372 "./util/configparser.y" /* yacc.c:1646  */
+  case 251:
+#line 374 "./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 &&
@@ -2751,21 +2773,21 @@ yyreduce:
                        cfg_parser->cfg->auths->rpz_action_override = (yyvsp[0].str);
                }
        }
-#line 2755 "util/configparser.c" /* yacc.c:1646  */
+#line 2777 "util/configparser.c"
     break;
 
-  case 250:
-#line 389 "./util/configparser.y" /* yacc.c:1646  */
+  case 252:
+#line 391 "./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 2765 "util/configparser.c" /* yacc.c:1646  */
+#line 2787 "util/configparser.c"
     break;
 
-  case 251:
-#line 397 "./util/configparser.y" /* yacc.c:1646  */
+  case 253:
+#line 399 "./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)
@@ -2773,21 +2795,21 @@ yyreduce:
                else cfg_parser->cfg->auths->rpz_log = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2777 "util/configparser.c" /* yacc.c:1646  */
+#line 2799 "util/configparser.c"
     break;
 
-  case 252:
-#line 407 "./util/configparser.y" /* yacc.c:1646  */
+  case 254:
+#line 409 "./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 2787 "util/configparser.c" /* yacc.c:1646  */
+#line 2809 "util/configparser.c"
     break;
 
-  case 253:
-#line 415 "./util/configparser.y" /* yacc.c:1646  */
+  case 255:
+#line 417 "./util/configparser.y"
     {
                struct config_auth* s;
                OUTYY(("\nP(rpz:)\n")); 
@@ -2803,11 +2825,11 @@ yyreduce:
                } else 
                        yyerror("out of memory");
        }
-#line 2807 "util/configparser.c" /* yacc.c:1646  */
+#line 2829 "util/configparser.c"
     break;
 
-  case 266:
-#line 438 "./util/configparser.y" /* yacc.c:1646  */
+  case 268:
+#line 440 "./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)
@@ -2815,11 +2837,11 @@ yyreduce:
                else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2819 "util/configparser.c" /* yacc.c:1646  */
+#line 2841 "util/configparser.c"
     break;
 
-  case 267:
-#line 447 "./util/configparser.y" /* yacc.c:1646  */
+  case 269:
+#line 449 "./util/configparser.y"
     { 
                OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2827,11 +2849,11 @@ yyreduce:
                else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2831 "util/configparser.c" /* yacc.c:1646  */
+#line 2853 "util/configparser.c"
     break;
 
-  case 268:
-#line 456 "./util/configparser.y" /* yacc.c:1646  */
+  case 270:
+#line 458 "./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)
@@ -2841,11 +2863,11 @@ yyreduce:
                else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2845 "util/configparser.c" /* yacc.c:1646  */
+#line 2867 "util/configparser.c"
     break;
 
-  case 269:
-#line 467 "./util/configparser.y" /* yacc.c:1646  */
+  case 271:
+#line 469 "./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)
@@ -2853,11 +2875,11 @@ yyreduce:
                else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2857 "util/configparser.c" /* yacc.c:1646  */
+#line 2879 "util/configparser.c"
     break;
 
-  case 270:
-#line 476 "./util/configparser.y" /* yacc.c:1646  */
+  case 272:
+#line 478 "./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)
@@ -2865,11 +2887,11 @@ yyreduce:
                else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2869 "util/configparser.c" /* yacc.c:1646  */
+#line 2891 "util/configparser.c"
     break;
 
-  case 271:
-#line 485 "./util/configparser.y" /* yacc.c:1646  */
+  case 273:
+#line 487 "./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)
@@ -2877,11 +2899,11 @@ yyreduce:
                else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 2881 "util/configparser.c" /* yacc.c:1646  */
+#line 2903 "util/configparser.c"
     break;
 
-  case 272:
-#line 494 "./util/configparser.y" /* yacc.c:1646  */
+  case 274:
+#line 496 "./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)
@@ -2891,11 +2913,11 @@ yyreduce:
                else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2895 "util/configparser.c" /* yacc.c:1646  */
+#line 2917 "util/configparser.c"
     break;
 
-  case 273:
-#line 505 "./util/configparser.y" /* yacc.c:1646  */
+  case 275:
+#line 507 "./util/configparser.y"
     {
                OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -2903,11 +2925,11 @@ yyreduce:
                else cfg_parser->cfg->port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 2907 "util/configparser.c" /* yacc.c:1646  */
+#line 2929 "util/configparser.c"
     break;
 
-  case 274:
-#line 514 "./util/configparser.y" /* yacc.c:1646  */
+  case 276:
+#line 516 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str)));
@@ -2918,11 +2940,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 2922 "util/configparser.c" /* yacc.c:1646  */
+#line 2944 "util/configparser.c"
     break;
 
-  case 275:
-#line 526 "./util/configparser.y" /* yacc.c:1646  */
+  case 277:
+#line 528 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str)));
@@ -2934,11 +2956,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 2938 "util/configparser.c" /* yacc.c:1646  */
+#line 2960 "util/configparser.c"
     break;
 
-  case 276:
-#line 540 "./util/configparser.y" /* yacc.c:1646  */
+  case 278:
+#line 542 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str)));
@@ -2952,11 +2974,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2956 "util/configparser.c" /* yacc.c:1646  */
+#line 2978 "util/configparser.c"
     break;
 
-  case 277:
-#line 555 "./util/configparser.y" /* yacc.c:1646  */
+  case 279:
+#line 557 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str)));
@@ -2966,11 +2988,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2970 "util/configparser.c" /* yacc.c:1646  */
+#line 2992 "util/configparser.c"
     break;
 
-  case 278:
-#line 566 "./util/configparser.y" /* yacc.c:1646  */
+  case 280:
+#line 568 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -2986,11 +3008,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 2990 "util/configparser.c" /* yacc.c:1646  */
+#line 3012 "util/configparser.c"
     break;
 
-  case 279:
-#line 583 "./util/configparser.y" /* yacc.c:1646  */
+  case 281:
+#line 585 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3006,11 +3028,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 3010 "util/configparser.c" /* yacc.c:1646  */
+#line 3032 "util/configparser.c"
     break;
 
-  case 280:
-#line 600 "./util/configparser.y" /* yacc.c:1646  */
+  case 282:
+#line 602 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(min_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3026,11 +3048,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 3030 "util/configparser.c" /* yacc.c:1646  */
+#line 3052 "util/configparser.c"
     break;
 
-  case 281:
-#line 617 "./util/configparser.y" /* yacc.c:1646  */
+  case 283:
+#line 619 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(min_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3046,11 +3068,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 3050 "util/configparser.c" /* yacc.c:1646  */
+#line 3072 "util/configparser.c"
     break;
 
-  case 282:
-#line 634 "./util/configparser.y" /* yacc.c:1646  */
+  case 284:
+#line 636 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_ecs_tree_size_ipv4:%s)\n", (yyvsp[0].str)));
@@ -3064,11 +3086,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 3068 "util/configparser.c" /* yacc.c:1646  */
+#line 3090 "util/configparser.c"
     break;
 
-  case 283:
-#line 649 "./util/configparser.y" /* yacc.c:1646  */
+  case 285:
+#line 651 "./util/configparser.y"
     {
        #ifdef CLIENT_SUBNET
                OUTYY(("P(max_ecs_tree_size_ipv6:%s)\n", (yyvsp[0].str)));
@@ -3082,11 +3104,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 3086 "util/configparser.c" /* yacc.c:1646  */
+#line 3108 "util/configparser.c"
     break;
 
-  case 284:
-#line 664 "./util/configparser.y" /* yacc.c:1646  */
+  case 286:
+#line 666 "./util/configparser.y"
     {
                OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->num_ifs == 0)
@@ -3098,11 +3120,11 @@ yyreduce:
                else
                        cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
        }
-#line 3102 "util/configparser.c" /* yacc.c:1646  */
+#line 3124 "util/configparser.c"
     break;
 
-  case 285:
-#line 677 "./util/configparser.y" /* yacc.c:1646  */
+  case 287:
+#line 679 "./util/configparser.y"
     {
                OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->num_out_ifs == 0)
@@ -3116,11 +3138,11 @@ yyreduce:
                        cfg_parser->cfg->out_ifs[
                                cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
        }
-#line 3120 "util/configparser.c" /* yacc.c:1646  */
+#line 3142 "util/configparser.c"
     break;
 
-  case 286:
-#line 692 "./util/configparser.y" /* yacc.c:1646  */
+  case 288:
+#line 694 "./util/configparser.y"
     {
                OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3128,11 +3150,11 @@ yyreduce:
                else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3132 "util/configparser.c" /* yacc.c:1646  */
+#line 3154 "util/configparser.c"
     break;
 
-  case 287:
-#line 701 "./util/configparser.y" /* yacc.c:1646  */
+  case 289:
+#line 703 "./util/configparser.y"
     {
                OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str)));
                if(!cfg_mark_ports((yyvsp[0].str), 1, 
@@ -3140,11 +3162,11 @@ yyreduce:
                        yyerror("port number or range (\"low-high\") expected");
                free((yyvsp[0].str));
        }
-#line 3144 "util/configparser.c" /* yacc.c:1646  */
+#line 3166 "util/configparser.c"
     break;
 
-  case 288:
-#line 710 "./util/configparser.y" /* yacc.c:1646  */
+  case 290:
+#line 712 "./util/configparser.y"
     {
                OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str)));
                if(!cfg_mark_ports((yyvsp[0].str), 0, 
@@ -3152,11 +3174,11 @@ yyreduce:
                        yyerror("port number or range (\"low-high\") expected");
                free((yyvsp[0].str));
        }
-#line 3156 "util/configparser.c" /* yacc.c:1646  */
+#line 3178 "util/configparser.c"
     break;
 
-  case 289:
-#line 719 "./util/configparser.y" /* yacc.c:1646  */
+  case 291:
+#line 721 "./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)
@@ -3164,11 +3186,11 @@ yyreduce:
                else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3168 "util/configparser.c" /* yacc.c:1646  */
+#line 3190 "util/configparser.c"
     break;
 
-  case 290:
-#line 728 "./util/configparser.y" /* yacc.c:1646  */
+  case 292:
+#line 730 "./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)
@@ -3176,11 +3198,11 @@ yyreduce:
                else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3180 "util/configparser.c" /* yacc.c:1646  */
+#line 3202 "util/configparser.c"
     break;
 
-  case 291:
-#line 737 "./util/configparser.y" /* yacc.c:1646  */
+  case 293:
+#line 739 "./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)
@@ -3188,11 +3210,11 @@ yyreduce:
                else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3192 "util/configparser.c" /* yacc.c:1646  */
+#line 3214 "util/configparser.c"
     break;
 
-  case 292:
-#line 746 "./util/configparser.y" /* yacc.c:1646  */
+  case 294:
+#line 748 "./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)
@@ -3200,11 +3222,11 @@ yyreduce:
                else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3204 "util/configparser.c" /* yacc.c:1646  */
+#line 3226 "util/configparser.c"
     break;
 
-  case 293:
-#line 755 "./util/configparser.y" /* yacc.c:1646  */
+  case 295:
+#line 757 "./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)
@@ -3212,11 +3234,11 @@ yyreduce:
                else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3216 "util/configparser.c" /* yacc.c:1646  */
+#line 3238 "util/configparser.c"
     break;
 
-  case 294:
-#line 764 "./util/configparser.y" /* yacc.c:1646  */
+  case 296:
+#line 766 "./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)
@@ -3224,11 +3246,11 @@ yyreduce:
                else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3228 "util/configparser.c" /* yacc.c:1646  */
+#line 3250 "util/configparser.c"
     break;
 
-  case 295:
-#line 773 "./util/configparser.y" /* yacc.c:1646  */
+  case 297:
+#line 775 "./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)
@@ -3236,11 +3258,11 @@ yyreduce:
                else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3240 "util/configparser.c" /* yacc.c:1646  */
+#line 3262 "util/configparser.c"
     break;
 
-  case 296:
-#line 782 "./util/configparser.y" /* yacc.c:1646  */
+  case 298:
+#line 784 "./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)
@@ -3248,11 +3270,11 @@ yyreduce:
                else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3252 "util/configparser.c" /* yacc.c:1646  */
+#line 3274 "util/configparser.c"
     break;
 
-  case 297:
-#line 791 "./util/configparser.y" /* yacc.c:1646  */
+  case 299:
+#line 793 "./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)
@@ -3260,11 +3282,11 @@ yyreduce:
                 else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
                 free((yyvsp[0].str));
        }
-#line 3264 "util/configparser.c" /* yacc.c:1646  */
+#line 3286 "util/configparser.c"
     break;
 
-  case 298:
-#line 800 "./util/configparser.y" /* yacc.c:1646  */
+  case 300:
+#line 802 "./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)
@@ -3272,11 +3294,11 @@ yyreduce:
                else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3276 "util/configparser.c" /* yacc.c:1646  */
+#line 3298 "util/configparser.c"
     break;
 
-  case 299:
-#line 809 "./util/configparser.y" /* yacc.c:1646  */
+  case 301:
+#line 811 "./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)
@@ -3288,11 +3310,11 @@ yyreduce:
                else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3292 "util/configparser.c" /* yacc.c:1646  */
+#line 3314 "util/configparser.c"
     break;
 
-  case 300:
-#line 822 "./util/configparser.y" /* yacc.c:1646  */
+  case 302:
+#line 824 "./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)
@@ -3300,11 +3322,11 @@ yyreduce:
                else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3304 "util/configparser.c" /* yacc.c:1646  */
+#line 3326 "util/configparser.c"
     break;
 
-  case 301:
-#line 831 "./util/configparser.y" /* yacc.c:1646  */
+  case 303:
+#line 833 "./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)
@@ -3316,11 +3338,11 @@ yyreduce:
                else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3320 "util/configparser.c" /* yacc.c:1646  */
+#line 3342 "util/configparser.c"
     break;
 
-  case 302:
-#line 844 "./util/configparser.y" /* yacc.c:1646  */
+  case 304:
+#line 846 "./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)
@@ -3328,11 +3350,11 @@ yyreduce:
                else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3332 "util/configparser.c" /* yacc.c:1646  */
+#line 3354 "util/configparser.c"
     break;
 
-  case 303:
-#line 853 "./util/configparser.y" /* yacc.c:1646  */
+  case 305:
+#line 855 "./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)
@@ -3340,11 +3362,11 @@ yyreduce:
                else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3344 "util/configparser.c" /* yacc.c:1646  */
+#line 3366 "util/configparser.c"
     break;
 
-  case 304:
-#line 862 "./util/configparser.y" /* yacc.c:1646  */
+  case 306:
+#line 864 "./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)
@@ -3352,31 +3374,31 @@ yyreduce:
                else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3356 "util/configparser.c" /* yacc.c:1646  */
+#line 3378 "util/configparser.c"
     break;
 
-  case 305:
-#line 871 "./util/configparser.y" /* yacc.c:1646  */
+  case 307:
+#line 873 "./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 3366 "util/configparser.c" /* yacc.c:1646  */
+#line 3388 "util/configparser.c"
     break;
 
-  case 306:
-#line 878 "./util/configparser.y" /* yacc.c:1646  */
+  case 308:
+#line 880 "./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 3376 "util/configparser.c" /* yacc.c:1646  */
+#line 3398 "util/configparser.c"
     break;
 
-  case 307:
-#line 885 "./util/configparser.y" /* yacc.c:1646  */
+  case 309:
+#line 887 "./util/configparser.y"
     {
                OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3384,21 +3406,21 @@ yyreduce:
                else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3388 "util/configparser.c" /* yacc.c:1646  */
+#line 3410 "util/configparser.c"
     break;
 
-  case 308:
-#line 894 "./util/configparser.y" /* yacc.c:1646  */
+  case 310:
+#line 896 "./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 3398 "util/configparser.c" /* yacc.c:1646  */
+#line 3420 "util/configparser.c"
     break;
 
-  case 309:
-#line 901 "./util/configparser.y" /* yacc.c:1646  */
+  case 311:
+#line 903 "./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)
@@ -3406,53 +3428,53 @@ yyreduce:
                else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3410 "util/configparser.c" /* yacc.c:1646  */
+#line 3432 "util/configparser.c"
     break;
 
-  case 310:
-#line 910 "./util/configparser.y" /* yacc.c:1646  */
+  case 312:
+#line 912 "./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 3421 "util/configparser.c" /* yacc.c:1646  */
+#line 3443 "util/configparser.c"
     break;
 
-  case 311:
-#line 918 "./util/configparser.y" /* yacc.c:1646  */
+  case 313:
+#line 920 "./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 3431 "util/configparser.c" /* yacc.c:1646  */
+#line 3453 "util/configparser.c"
     break;
 
-  case 312:
-#line 925 "./util/configparser.y" /* yacc.c:1646  */
+  case 314:
+#line 927 "./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 3441 "util/configparser.c" /* yacc.c:1646  */
+#line 3463 "util/configparser.c"
     break;
 
-  case 313:
-#line 932 "./util/configparser.y" /* yacc.c:1646  */
+  case 315:
+#line 934 "./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 3452 "util/configparser.c" /* yacc.c:1646  */
+#line 3474 "util/configparser.c"
     break;
 
-  case 314:
-#line 940 "./util/configparser.y" /* yacc.c:1646  */
+  case 316:
+#line 942 "./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)
@@ -3460,11 +3482,11 @@ yyreduce:
                else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3464 "util/configparser.c" /* yacc.c:1646  */
+#line 3486 "util/configparser.c"
     break;
 
-  case 315:
-#line 949 "./util/configparser.y" /* yacc.c:1646  */
+  case 317:
+#line 951 "./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)
@@ -3472,11 +3494,11 @@ yyreduce:
                else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3476 "util/configparser.c" /* yacc.c:1646  */
+#line 3498 "util/configparser.c"
     break;
 
-  case 316:
-#line 958 "./util/configparser.y" /* yacc.c:1646  */
+  case 318:
+#line 960 "./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)
@@ -3489,11 +3511,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 3493 "util/configparser.c" /* yacc.c:1646  */
+#line 3515 "util/configparser.c"
     break;
 
-  case 317:
-#line 972 "./util/configparser.y" /* yacc.c:1646  */
+  case 319:
+#line 974 "./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)
@@ -3501,11 +3523,11 @@ yyreduce:
                else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3505 "util/configparser.c" /* yacc.c:1646  */
+#line 3527 "util/configparser.c"
     break;
 
-  case 318:
-#line 981 "./util/configparser.y" /* yacc.c:1646  */
+  case 320:
+#line 983 "./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)
@@ -3513,11 +3535,11 @@ yyreduce:
                else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3517 "util/configparser.c" /* yacc.c:1646  */
+#line 3539 "util/configparser.c"
     break;
 
-  case 319:
-#line 990 "./util/configparser.y" /* yacc.c:1646  */
+  case 321:
+#line 992 "./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)
@@ -3525,11 +3547,11 @@ yyreduce:
        else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
        free((yyvsp[0].str));
   }
-#line 3529 "util/configparser.c" /* yacc.c:1646  */
+#line 3551 "util/configparser.c"
     break;
 
-  case 320:
-#line 999 "./util/configparser.y" /* yacc.c:1646  */
+  case 322:
+#line 1001 "./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)
@@ -3537,11 +3559,11 @@ yyreduce:
        else cfg_parser->cfg->log_tag_queryreply = (strcmp((yyvsp[0].str), "yes")==0);
        free((yyvsp[0].str));
   }
-#line 3541 "util/configparser.c" /* yacc.c:1646  */
+#line 3563 "util/configparser.c"
     break;
 
-  case 321:
-#line 1008 "./util/configparser.y" /* yacc.c:1646  */
+  case 323:
+#line 1010 "./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)
@@ -3549,11 +3571,11 @@ yyreduce:
                else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3553 "util/configparser.c" /* yacc.c:1646  */
+#line 3575 "util/configparser.c"
     break;
 
-  case 322:
-#line 1017 "./util/configparser.y" /* yacc.c:1646  */
+  case 324:
+#line 1019 "./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)
@@ -3561,31 +3583,31 @@ yyreduce:
        else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0);
        free((yyvsp[0].str));
   }
-#line 3565 "util/configparser.c" /* yacc.c:1646  */
+#line 3587 "util/configparser.c"
     break;
 
-  case 323:
-#line 1026 "./util/configparser.y" /* yacc.c:1646  */
+  case 325:
+#line 1028 "./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 3575 "util/configparser.c" /* yacc.c:1646  */
+#line 3597 "util/configparser.c"
     break;
 
-  case 324:
-#line 1033 "./util/configparser.y" /* yacc.c:1646  */
+  case 326:
+#line 1035 "./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 3585 "util/configparser.c" /* yacc.c:1646  */
+#line 3607 "util/configparser.c"
     break;
 
-  case 325:
-#line 1040 "./util/configparser.y" /* yacc.c:1646  */
+  case 327:
+#line 1042 "./util/configparser.y"
     {
                OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->directory);
@@ -3610,105 +3632,105 @@ yyreduce:
                        }
                }
        }
-#line 3614 "util/configparser.c" /* yacc.c:1646  */
+#line 3636 "util/configparser.c"
     break;
 
-  case 326:
-#line 1066 "./util/configparser.y" /* yacc.c:1646  */
+  case 328:
+#line 1068 "./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 3625 "util/configparser.c" /* yacc.c:1646  */
+#line 3647 "util/configparser.c"
     break;
 
-  case 327:
-#line 1074 "./util/configparser.y" /* yacc.c:1646  */
+  case 329:
+#line 1076 "./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 3635 "util/configparser.c" /* yacc.c:1646  */
+#line 3657 "util/configparser.c"
     break;
 
-  case 328:
-#line 1081 "./util/configparser.y" /* yacc.c:1646  */
+  case 330:
+#line 1083 "./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 3645 "util/configparser.c" /* yacc.c:1646  */
+#line 3667 "util/configparser.c"
     break;
 
-  case 329:
-#line 1088 "./util/configparser.y" /* yacc.c:1646  */
+  case 331:
+#line 1090 "./util/configparser.y"
     {
                OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dlv_anchor_file);
                cfg_parser->cfg->dlv_anchor_file = (yyvsp[0].str);
        }
-#line 3655 "util/configparser.c" /* yacc.c:1646  */
+#line 3677 "util/configparser.c"
     break;
 
-  case 330:
-#line 1095 "./util/configparser.y" /* yacc.c:1646  */
+  case 332:
+#line 1097 "./util/configparser.y"
     {
                OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 3665 "util/configparser.c" /* yacc.c:1646  */
+#line 3687 "util/configparser.c"
     break;
 
-  case 331:
-#line 1102 "./util/configparser.y" /* yacc.c:1646  */
+  case 333:
+#line 1104 "./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 3676 "util/configparser.c" /* yacc.c:1646  */
+#line 3698 "util/configparser.c"
     break;
 
-  case 332:
-#line 1110 "./util/configparser.y" /* yacc.c:1646  */
+  case 334:
+#line 1112 "./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 3687 "util/configparser.c" /* yacc.c:1646  */
+#line 3709 "util/configparser.c"
     break;
 
-  case 333:
-#line 1118 "./util/configparser.y" /* yacc.c:1646  */
+  case 335:
+#line 1120 "./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 3698 "util/configparser.c" /* yacc.c:1646  */
+#line 3720 "util/configparser.c"
     break;
 
-  case 334:
-#line 1126 "./util/configparser.y" /* yacc.c:1646  */
+  case 336:
+#line 1128 "./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 3708 "util/configparser.c" /* yacc.c:1646  */
+#line 3730 "util/configparser.c"
     break;
 
-  case 335:
-#line 1133 "./util/configparser.y" /* yacc.c:1646  */
+  case 337:
+#line 1135 "./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)
@@ -3718,11 +3740,11 @@ yyreduce:
                                (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3722 "util/configparser.c" /* yacc.c:1646  */
+#line 3744 "util/configparser.c"
     break;
 
-  case 336:
-#line 1144 "./util/configparser.y" /* yacc.c:1646  */
+  case 338:
+#line 1146 "./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)
@@ -3732,21 +3754,21 @@ yyreduce:
                                (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3736 "util/configparser.c" /* yacc.c:1646  */
+#line 3758 "util/configparser.c"
     break;
 
-  case 337:
-#line 1155 "./util/configparser.y" /* yacc.c:1646  */
+  case 339:
+#line 1157 "./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 3746 "util/configparser.c" /* yacc.c:1646  */
+#line 3768 "util/configparser.c"
     break;
 
-  case 338:
-#line 1162 "./util/configparser.y" /* yacc.c:1646  */
+  case 340:
+#line 1164 "./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)
@@ -3754,11 +3776,11 @@ yyreduce:
                else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3758 "util/configparser.c" /* yacc.c:1646  */
+#line 3780 "util/configparser.c"
     break;
 
-  case 339:
-#line 1171 "./util/configparser.y" /* yacc.c:1646  */
+  case 341:
+#line 1173 "./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)
@@ -3766,11 +3788,11 @@ yyreduce:
                else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3770 "util/configparser.c" /* yacc.c:1646  */
+#line 3792 "util/configparser.c"
     break;
 
-  case 340:
-#line 1180 "./util/configparser.y" /* yacc.c:1646  */
+  case 342:
+#line 1182 "./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)
@@ -3778,53 +3800,53 @@ yyreduce:
                else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3782 "util/configparser.c" /* yacc.c:1646  */
+#line 3804 "util/configparser.c"
     break;
 
-  case 341:
-#line 1189 "./util/configparser.y" /* yacc.c:1646  */
+  case 343:
+#line 1191 "./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 3792 "util/configparser.c" /* yacc.c:1646  */
+#line 3814 "util/configparser.c"
     break;
 
-  case 342:
-#line 1196 "./util/configparser.y" /* yacc.c:1646  */
+  case 344:
+#line 1198 "./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 3802 "util/configparser.c" /* yacc.c:1646  */
+#line 3824 "util/configparser.c"
     break;
 
-  case 343:
-#line 1203 "./util/configparser.y" /* yacc.c:1646  */
+  case 345:
+#line 1205 "./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 3813 "util/configparser.c" /* yacc.c:1646  */
+#line 3835 "util/configparser.c"
     break;
 
-  case 344:
-#line 1211 "./util/configparser.y" /* yacc.c:1646  */
+  case 346:
+#line 1213 "./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 3824 "util/configparser.c" /* yacc.c:1646  */
+#line 3846 "util/configparser.c"
     break;
 
-  case 345:
-#line 1219 "./util/configparser.y" /* yacc.c:1646  */
+  case 347:
+#line 1221 "./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)
@@ -3833,11 +3855,11 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 3837 "util/configparser.c" /* yacc.c:1646  */
+#line 3859 "util/configparser.c"
     break;
 
-  case 346:
-#line 1229 "./util/configparser.y" /* yacc.c:1646  */
+  case 348:
+#line 1231 "./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)
@@ -3846,11 +3868,11 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 3850 "util/configparser.c" /* yacc.c:1646  */
+#line 3872 "util/configparser.c"
     break;
 
-  case 347:
-#line 1239 "./util/configparser.y" /* yacc.c:1646  */
+  case 349:
+#line 1241 "./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)
@@ -3859,22 +3881,22 @@ yyreduce:
             (strcmp((yyvsp[0].str), "yes")==0);
         free((yyvsp[0].str));
     }
-#line 3863 "util/configparser.c" /* yacc.c:1646  */
+#line 3885 "util/configparser.c"
     break;
 
-  case 348:
-#line 1249 "./util/configparser.y" /* yacc.c:1646  */
+  case 350:
+#line 1251 "./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 3874 "util/configparser.c" /* yacc.c:1646  */
+#line 3896 "util/configparser.c"
     break;
 
-  case 349:
-#line 1257 "./util/configparser.y" /* yacc.c:1646  */
+  case 351:
+#line 1259 "./util/configparser.y"
     {
                OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3886,11 +3908,11 @@ yyreduce:
                else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3890 "util/configparser.c" /* yacc.c:1646  */
+#line 3912 "util/configparser.c"
     break;
 
-  case 350:
-#line 1270 "./util/configparser.y" /* yacc.c:1646  */
+  case 352:
+#line 1272 "./util/configparser.y"
     {
                OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3900,22 +3922,22 @@ yyreduce:
                else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3904 "util/configparser.c" /* yacc.c:1646  */
+#line 3926 "util/configparser.c"
     break;
 
-  case 351:
-#line 1281 "./util/configparser.y" /* yacc.c:1646  */
+  case 353:
+#line 1283 "./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 3915 "util/configparser.c" /* yacc.c:1646  */
+#line 3937 "util/configparser.c"
     break;
 
-  case 352:
-#line 1289 "./util/configparser.y" /* yacc.c:1646  */
+  case 354:
+#line 1291 "./util/configparser.y"
     {
                OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3927,11 +3949,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 3931 "util/configparser.c" /* yacc.c:1646  */
+#line 3953 "util/configparser.c"
     break;
 
-  case 353:
-#line 1302 "./util/configparser.y" /* yacc.c:1646  */
+  case 355:
+#line 1304 "./util/configparser.y"
     {
                OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -3939,11 +3961,11 @@ yyreduce:
                else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3943 "util/configparser.c" /* yacc.c:1646  */
+#line 3965 "util/configparser.c"
     break;
 
-  case 354:
-#line 1311 "./util/configparser.y" /* yacc.c:1646  */
+  case 356:
+#line 1313 "./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)
@@ -3951,11 +3973,11 @@ yyreduce:
                else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3955 "util/configparser.c" /* yacc.c:1646  */
+#line 3977 "util/configparser.c"
     break;
 
-  case 355:
-#line 1320 "./util/configparser.y" /* yacc.c:1646  */
+  case 357:
+#line 1322 "./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)
@@ -3963,11 +3985,11 @@ yyreduce:
                else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 3967 "util/configparser.c" /* yacc.c:1646  */
+#line 3989 "util/configparser.c"
     break;
 
-  case 356:
-#line 1329 "./util/configparser.y" /* yacc.c:1646  */
+  case 358:
+#line 1331 "./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)
@@ -3976,11 +3998,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3980 "util/configparser.c" /* yacc.c:1646  */
+#line 4002 "util/configparser.c"
     break;
 
-  case 357:
-#line 1339 "./util/configparser.y" /* yacc.c:1646  */
+  case 359:
+#line 1341 "./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)
@@ -3989,22 +4011,22 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 3993 "util/configparser.c" /* yacc.c:1646  */
+#line 4015 "util/configparser.c"
     break;
 
-  case 358:
-#line 1349 "./util/configparser.y" /* yacc.c:1646  */
+  case 360:
+#line 1351 "./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 4004 "util/configparser.c" /* yacc.c:1646  */
+#line 4026 "util/configparser.c"
     break;
 
-  case 359:
-#line 1357 "./util/configparser.y" /* yacc.c:1646  */
+  case 361:
+#line 1359 "./util/configparser.y"
     {
                OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4016,11 +4038,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4020 "util/configparser.c" /* yacc.c:1646  */
+#line 4042 "util/configparser.c"
     break;
 
-  case 360:
-#line 1370 "./util/configparser.y" /* yacc.c:1646  */
+  case 362:
+#line 1372 "./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)
@@ -4028,22 +4050,22 @@ yyreduce:
                else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4032 "util/configparser.c" /* yacc.c:1646  */
+#line 4054 "util/configparser.c"
     break;
 
-  case 361:
-#line 1379 "./util/configparser.y" /* yacc.c:1646  */
+  case 363:
+#line 1381 "./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 4043 "util/configparser.c" /* yacc.c:1646  */
+#line 4065 "util/configparser.c"
     break;
 
-  case 362:
-#line 1387 "./util/configparser.y" /* yacc.c:1646  */
+  case 364:
+#line 1389 "./util/configparser.y"
     {
                OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4051,22 +4073,22 @@ yyreduce:
                else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4055 "util/configparser.c" /* yacc.c:1646  */
+#line 4077 "util/configparser.c"
     break;
 
-  case 363:
-#line 1396 "./util/configparser.y" /* yacc.c:1646  */
+  case 365:
+#line 1398 "./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 4066 "util/configparser.c" /* yacc.c:1646  */
+#line 4088 "util/configparser.c"
     break;
 
-  case 364:
-#line 1404 "./util/configparser.y" /* yacc.c:1646  */
+  case 366:
+#line 1406 "./util/configparser.y"
     {
                OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4078,11 +4100,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4082 "util/configparser.c" /* yacc.c:1646  */
+#line 4104 "util/configparser.c"
     break;
 
-  case 365:
-#line 1417 "./util/configparser.y" /* yacc.c:1646  */
+  case 367:
+#line 1419 "./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)
@@ -4090,21 +4112,21 @@ yyreduce:
                else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4094 "util/configparser.c" /* yacc.c:1646  */
+#line 4116 "util/configparser.c"
     break;
 
-  case 366:
-#line 1426 "./util/configparser.y" /* yacc.c:1646  */
+  case 368:
+#line 1428 "./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 4104 "util/configparser.c" /* yacc.c:1646  */
+#line 4126 "util/configparser.c"
     break;
 
-  case 367:
-#line 1433 "./util/configparser.y" /* yacc.c:1646  */
+  case 369:
+#line 1435 "./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)
@@ -4113,11 +4135,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4117 "util/configparser.c" /* yacc.c:1646  */
+#line 4139 "util/configparser.c"
     break;
 
-  case 368:
-#line 1443 "./util/configparser.y" /* yacc.c:1646  */
+  case 370:
+#line 1445 "./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)
@@ -4126,11 +4148,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4130 "util/configparser.c" /* yacc.c:1646  */
+#line 4152 "util/configparser.c"
     break;
 
-  case 369:
-#line 1453 "./util/configparser.y" /* yacc.c:1646  */
+  case 371:
+#line 1455 "./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)
@@ -4139,11 +4161,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4143 "util/configparser.c" /* yacc.c:1646  */
+#line 4165 "util/configparser.c"
     break;
 
-  case 370:
-#line 1463 "./util/configparser.y" /* yacc.c:1646  */
+  case 372:
+#line 1465 "./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)
@@ -4152,11 +4174,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4156 "util/configparser.c" /* yacc.c:1646  */
+#line 4178 "util/configparser.c"
     break;
 
-  case 371:
-#line 1473 "./util/configparser.y" /* yacc.c:1646  */
+  case 373:
+#line 1475 "./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)
@@ -4165,11 +4187,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4169 "util/configparser.c" /* yacc.c:1646  */
+#line 4191 "util/configparser.c"
     break;
 
-  case 372:
-#line 1483 "./util/configparser.y" /* yacc.c:1646  */
+  case 374:
+#line 1485 "./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)
@@ -4178,11 +4200,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4182 "util/configparser.c" /* yacc.c:1646  */
+#line 4204 "util/configparser.c"
     break;
 
-  case 373:
-#line 1493 "./util/configparser.y" /* yacc.c:1646  */
+  case 375:
+#line 1495 "./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)
@@ -4191,11 +4213,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4195 "util/configparser.c" /* yacc.c:1646  */
+#line 4217 "util/configparser.c"
     break;
 
-  case 374:
-#line 1503 "./util/configparser.y" /* yacc.c:1646  */
+  case 376:
+#line 1505 "./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)
@@ -4204,41 +4226,41 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4208 "util/configparser.c" /* yacc.c:1646  */
+#line 4230 "util/configparser.c"
     break;
 
-  case 375:
-#line 1513 "./util/configparser.y" /* yacc.c:1646  */
+  case 377:
+#line 1515 "./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 4218 "util/configparser.c" /* yacc.c:1646  */
+#line 4240 "util/configparser.c"
     break;
 
-  case 376:
-#line 1520 "./util/configparser.y" /* yacc.c:1646  */
+  case 378:
+#line 1522 "./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 4228 "util/configparser.c" /* yacc.c:1646  */
+#line 4250 "util/configparser.c"
     break;
 
-  case 377:
-#line 1527 "./util/configparser.y" /* yacc.c:1646  */
+  case 379:
+#line 1529 "./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 4238 "util/configparser.c" /* yacc.c:1646  */
+#line 4260 "util/configparser.c"
     break;
 
-  case 378:
-#line 1534 "./util/configparser.y" /* yacc.c:1646  */
+  case 380:
+#line 1536 "./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)
@@ -4246,11 +4268,11 @@ yyreduce:
                else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4250 "util/configparser.c" /* yacc.c:1646  */
+#line 4272 "util/configparser.c"
     break;
 
-  case 379:
-#line 1543 "./util/configparser.y" /* yacc.c:1646  */
+  case 381:
+#line 1545 "./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)
@@ -4258,11 +4280,11 @@ yyreduce:
                else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4262 "util/configparser.c" /* yacc.c:1646  */
+#line 4284 "util/configparser.c"
     break;
 
-  case 380:
-#line 1552 "./util/configparser.y" /* yacc.c:1646  */
+  case 382:
+#line 1554 "./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)
@@ -4270,11 +4292,11 @@ yyreduce:
                else cfg_parser->cfg->deny_any = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4274 "util/configparser.c" /* yacc.c:1646  */
+#line 4296 "util/configparser.c"
     break;
 
-  case 381:
-#line 1561 "./util/configparser.y" /* yacc.c:1646  */
+  case 383:
+#line 1563 "./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)
@@ -4282,21 +4304,21 @@ yyreduce:
                else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4286 "util/configparser.c" /* yacc.c:1646  */
+#line 4308 "util/configparser.c"
     break;
 
-  case 382:
-#line 1570 "./util/configparser.y" /* yacc.c:1646  */
+  case 384:
+#line 1572 "./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 4296 "util/configparser.c" /* yacc.c:1646  */
+#line 4318 "util/configparser.c"
     break;
 
-  case 383:
-#line 1577 "./util/configparser.y" /* yacc.c:1646  */
+  case 385:
+#line 1579 "./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)
@@ -4305,11 +4327,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4309 "util/configparser.c" /* yacc.c:1646  */
+#line 4331 "util/configparser.c"
     break;
 
-  case 384:
-#line 1587 "./util/configparser.y" /* yacc.c:1646  */
+  case 386:
+#line 1589 "./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 &&
@@ -4328,21 +4350,21 @@ yyreduce:
                                fatal_exit("out of memory adding acl");
                }
        }
-#line 4332 "util/configparser.c" /* yacc.c:1646  */
+#line 4354 "util/configparser.c"
     break;
 
-  case 385:
-#line 1607 "./util/configparser.y" /* yacc.c:1646  */
+  case 387:
+#line 1609 "./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 4342 "util/configparser.c" /* yacc.c:1646  */
+#line 4364 "util/configparser.c"
     break;
 
-  case 386:
-#line 1614 "./util/configparser.y" /* yacc.c:1646  */
+  case 388:
+#line 1616 "./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) {
@@ -4359,11 +4381,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4363 "util/configparser.c" /* yacc.c:1646  */
+#line 4385 "util/configparser.c"
     break;
 
-  case 387:
-#line 1632 "./util/configparser.y" /* yacc.c:1646  */
+  case 389:
+#line 1634 "./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) {
@@ -4375,11 +4397,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4379 "util/configparser.c" /* yacc.c:1646  */
+#line 4401 "util/configparser.c"
     break;
 
-  case 388:
-#line 1645 "./util/configparser.y" /* yacc.c:1646  */
+  case 390:
+#line 1647 "./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) {
@@ -4391,11 +4413,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4395 "util/configparser.c" /* yacc.c:1646  */
+#line 4417 "util/configparser.c"
     break;
 
-  case 389:
-#line 1658 "./util/configparser.y" /* yacc.c:1646  */
+  case 391:
+#line 1660 "./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)
@@ -4403,11 +4425,11 @@ yyreduce:
                else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4407 "util/configparser.c" /* yacc.c:1646  */
+#line 4429 "util/configparser.c"
     break;
 
-  case 390:
-#line 1667 "./util/configparser.y" /* yacc.c:1646  */
+  case 392:
+#line 1669 "./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)
@@ -4415,11 +4437,11 @@ yyreduce:
                else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4419 "util/configparser.c" /* yacc.c:1646  */
+#line 4441 "util/configparser.c"
     break;
 
-  case 391:
-#line 1676 "./util/configparser.y" /* yacc.c:1646  */
+  case 393:
+#line 1678 "./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)
@@ -4427,11 +4449,11 @@ yyreduce:
                else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4431 "util/configparser.c" /* yacc.c:1646  */
+#line 4453 "util/configparser.c"
     break;
 
-  case 392:
-#line 1685 "./util/configparser.y" /* yacc.c:1646  */
+  case 394:
+#line 1687 "./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)
@@ -4439,11 +4461,11 @@ yyreduce:
                else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4443 "util/configparser.c" /* yacc.c:1646  */
+#line 4465 "util/configparser.c"
     break;
 
-  case 393:
-#line 1694 "./util/configparser.y" /* yacc.c:1646  */
+  case 395:
+#line 1696 "./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)
@@ -4452,11 +4474,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4456 "util/configparser.c" /* yacc.c:1646  */
+#line 4478 "util/configparser.c"
     break;
 
-  case 394:
-#line 1704 "./util/configparser.y" /* yacc.c:1646  */
+  case 396:
+#line 1706 "./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)
@@ -4465,11 +4487,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4469 "util/configparser.c" /* yacc.c:1646  */
+#line 4491 "util/configparser.c"
     break;
 
-  case 395:
-#line 1714 "./util/configparser.y" /* yacc.c:1646  */
+  case 397:
+#line 1716 "./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)
@@ -4479,11 +4501,11 @@ yyreduce:
                                (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4483 "util/configparser.c" /* yacc.c:1646  */
+#line 4505 "util/configparser.c"
     break;
 
-  case 396:
-#line 1725 "./util/configparser.y" /* yacc.c:1646  */
+  case 398:
+#line 1727 "./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)
@@ -4491,11 +4513,11 @@ yyreduce:
                else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4495 "util/configparser.c" /* yacc.c:1646  */
+#line 4517 "util/configparser.c"
     break;
 
-  case 397:
-#line 1734 "./util/configparser.y" /* yacc.c:1646  */
+  case 399:
+#line 1736 "./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)
@@ -4503,11 +4525,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4507 "util/configparser.c" /* yacc.c:1646  */
+#line 4529 "util/configparser.c"
     break;
 
-  case 398:
-#line 1743 "./util/configparser.y" /* yacc.c:1646  */
+  case 400:
+#line 1745 "./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)
@@ -4515,11 +4537,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4519 "util/configparser.c" /* yacc.c:1646  */
+#line 4541 "util/configparser.c"
     break;
 
-  case 399:
-#line 1752 "./util/configparser.y" /* yacc.c:1646  */
+  case 401:
+#line 1754 "./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)
@@ -4527,11 +4549,35 @@ yyreduce:
                else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4531 "util/configparser.c" /* yacc.c:1646  */
+#line 4553 "util/configparser.c"
     break;
 
-  case 400:
-#line 1761 "./util/configparser.y" /* yacc.c:1646  */
+  case 402:
+#line 1763 "./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)
+                       yyerror("number expected");
+               else cfg_parser->cfg->serve_expired_reply_ttl = atoi((yyvsp[0].str));
+               free((yyvsp[0].str));
+       }
+#line 4565 "util/configparser.c"
+    break;
+
+  case 403:
+#line 1772 "./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)
+                       yyerror("number expected");
+               else cfg_parser->cfg->serve_expired_client_timeout = atoi((yyvsp[0].str));
+               free((yyvsp[0].str));
+       }
+#line 4577 "util/configparser.c"
+    break;
+
+  case 404:
+#line 1781 "./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)
@@ -4543,11 +4589,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 4547 "util/configparser.c" /* yacc.c:1646  */
+#line 4593 "util/configparser.c"
     break;
 
-  case 401:
-#line 1774 "./util/configparser.y" /* yacc.c:1646  */
+  case 405:
+#line 1794 "./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)
@@ -4559,11 +4605,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 4563 "util/configparser.c" /* yacc.c:1646  */
+#line 4609 "util/configparser.c"
     break;
 
-  case 402:
-#line 1787 "./util/configparser.y" /* yacc.c:1646  */
+  case 406:
+#line 1807 "./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)
@@ -4571,21 +4617,21 @@ yyreduce:
                else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4575 "util/configparser.c" /* yacc.c:1646  */
+#line 4621 "util/configparser.c"
     break;
 
-  case 403:
-#line 1796 "./util/configparser.y" /* yacc.c:1646  */
+  case 407:
+#line 1816 "./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 4585 "util/configparser.c" /* yacc.c:1646  */
+#line 4631 "util/configparser.c"
     break;
 
-  case 404:
-#line 1803 "./util/configparser.y" /* yacc.c:1646  */
+  case 408:
+#line 1823 "./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)
@@ -4593,11 +4639,11 @@ yyreduce:
                else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4597 "util/configparser.c" /* yacc.c:1646  */
+#line 4643 "util/configparser.c"
     break;
 
-  case 405:
-#line 1812 "./util/configparser.y" /* yacc.c:1646  */
+  case 409:
+#line 1832 "./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)
@@ -4605,11 +4651,11 @@ yyreduce:
                else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4609 "util/configparser.c" /* yacc.c:1646  */
+#line 4655 "util/configparser.c"
     break;
 
-  case 406:
-#line 1821 "./util/configparser.y" /* yacc.c:1646  */
+  case 410:
+#line 1841 "./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)
@@ -4617,11 +4663,11 @@ yyreduce:
                else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4621 "util/configparser.c" /* yacc.c:1646  */
+#line 4667 "util/configparser.c"
     break;
 
-  case 407:
-#line 1830 "./util/configparser.y" /* yacc.c:1646  */
+  case 411:
+#line 1850 "./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)
@@ -4630,22 +4676,22 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4634 "util/configparser.c" /* yacc.c:1646  */
+#line 4680 "util/configparser.c"
     break;
 
-  case 408:
-#line 1839 "./util/configparser.y" /* yacc.c:1646  */
+  case 412:
+#line 1859 "./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 4645 "util/configparser.c" /* yacc.c:1646  */
+#line 4691 "util/configparser.c"
     break;
 
-  case 409:
-#line 1847 "./util/configparser.y" /* yacc.c:1646  */
+  case 413:
+#line 1867 "./util/configparser.y"
     {
                OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4657,22 +4703,22 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4661 "util/configparser.c" /* yacc.c:1646  */
+#line 4707 "util/configparser.c"
     break;
 
-  case 410:
-#line 1860 "./util/configparser.y" /* yacc.c:1646  */
+  case 414:
+#line 1880 "./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 4672 "util/configparser.c" /* yacc.c:1646  */
+#line 4718 "util/configparser.c"
     break;
 
-  case 411:
-#line 1868 "./util/configparser.y" /* yacc.c:1646  */
+  case 415:
+#line 1888 "./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 &&
@@ -4712,21 +4758,21 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 4716 "util/configparser.c" /* yacc.c:1646  */
+#line 4762 "util/configparser.c"
     break;
 
-  case 412:
-#line 1909 "./util/configparser.y" /* yacc.c:1646  */
+  case 416:
+#line 1929 "./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 4726 "util/configparser.c" /* yacc.c:1646  */
+#line 4772 "util/configparser.c"
     break;
 
-  case 413:
-#line 1916 "./util/configparser.y" /* yacc.c:1646  */
+  case 417:
+#line 1936 "./util/configparser.y"
     {
                char* ptr;
                OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -4740,11 +4786,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 4744 "util/configparser.c" /* yacc.c:1646  */
+#line 4790 "util/configparser.c"
     break;
 
-  case 414:
-#line 1931 "./util/configparser.y" /* yacc.c:1646  */
+  case 418:
+#line 1951 "./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)
@@ -4753,11 +4799,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4757 "util/configparser.c" /* yacc.c:1646  */
+#line 4803 "util/configparser.c"
     break;
 
-  case 415:
-#line 1941 "./util/configparser.y" /* yacc.c:1646  */
+  case 419:
+#line 1961 "./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)
@@ -4766,41 +4812,41 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4770 "util/configparser.c" /* yacc.c:1646  */
+#line 4816 "util/configparser.c"
     break;
 
-  case 416:
-#line 1951 "./util/configparser.y" /* yacc.c:1646  */
+  case 420:
+#line 1971 "./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 4780 "util/configparser.c" /* yacc.c:1646  */
+#line 4826 "util/configparser.c"
     break;
 
-  case 417:
-#line 1958 "./util/configparser.y" /* yacc.c:1646  */
+  case 421:
+#line 1978 "./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 4790 "util/configparser.c" /* yacc.c:1646  */
+#line 4836 "util/configparser.c"
     break;
 
-  case 418:
-#line 1965 "./util/configparser.y" /* yacc.c:1646  */
+  case 422:
+#line 1985 "./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 4800 "util/configparser.c" /* yacc.c:1646  */
+#line 4846 "util/configparser.c"
     break;
 
-  case 419:
-#line 1972 "./util/configparser.y" /* yacc.c:1646  */
+  case 423:
+#line 1992 "./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)
@@ -4808,22 +4854,22 @@ yyreduce:
                else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4812 "util/configparser.c" /* yacc.c:1646  */
+#line 4858 "util/configparser.c"
     break;
 
-  case 420:
-#line 1981 "./util/configparser.y" /* yacc.c:1646  */
+  case 424:
+#line 2001 "./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 4823 "util/configparser.c" /* yacc.c:1646  */
+#line 4869 "util/configparser.c"
     break;
 
-  case 421:
-#line 1989 "./util/configparser.y" /* yacc.c:1646  */
+  case 425:
+#line 2009 "./util/configparser.y"
     {
                char* p, *s = (yyvsp[0].str);
                OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -4836,11 +4882,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4840 "util/configparser.c" /* yacc.c:1646  */
+#line 4886 "util/configparser.c"
     break;
 
-  case 422:
-#line 2003 "./util/configparser.y" /* yacc.c:1646  */
+  case 426:
+#line 2023 "./util/configparser.y"
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4860,11 +4906,11 @@ yyreduce:
                        }
                }
        }
-#line 4864 "util/configparser.c" /* yacc.c:1646  */
+#line 4910 "util/configparser.c"
     break;
 
-  case 423:
-#line 2024 "./util/configparser.y" /* yacc.c:1646  */
+  case 427:
+#line 2044 "./util/configparser.y"
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4884,11 +4930,11 @@ yyreduce:
                        }
                }
        }
-#line 4888 "util/configparser.c" /* yacc.c:1646  */
+#line 4934 "util/configparser.c"
     break;
 
-  case 424:
-#line 2045 "./util/configparser.y" /* yacc.c:1646  */
+  case 428:
+#line 2065 "./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,
@@ -4899,11 +4945,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4903 "util/configparser.c" /* yacc.c:1646  */
+#line 4949 "util/configparser.c"
     break;
 
-  case 425:
-#line 2057 "./util/configparser.y" /* yacc.c:1646  */
+  case 429:
+#line 2077 "./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,
@@ -4914,11 +4960,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4918 "util/configparser.c" /* yacc.c:1646  */
+#line 4964 "util/configparser.c"
     break;
 
-  case 426:
-#line 2069 "./util/configparser.y" /* yacc.c:1646  */
+  case 430:
+#line 2089 "./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,
@@ -4929,11 +4975,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4933 "util/configparser.c" /* yacc.c:1646  */
+#line 4979 "util/configparser.c"
     break;
 
-  case 427:
-#line 2081 "./util/configparser.y" /* yacc.c:1646  */
+  case 431:
+#line 2101 "./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,
@@ -4941,11 +4987,11 @@ yyreduce:
                        yyerror("out of memory");
                }
        }
-#line 4945 "util/configparser.c" /* yacc.c:1646  */
+#line 4991 "util/configparser.c"
     break;
 
-  case 428:
-#line 2090 "./util/configparser.y" /* yacc.c:1646  */
+  case 432:
+#line 2110 "./util/configparser.y"
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4965,11 +5011,11 @@ yyreduce:
                        }
                }
        }
-#line 4969 "util/configparser.c" /* yacc.c:1646  */
+#line 5015 "util/configparser.c"
     break;
 
-  case 429:
-#line 2111 "./util/configparser.y" /* yacc.c:1646  */
+  case 433:
+#line 2131 "./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)
@@ -4977,11 +5023,11 @@ yyreduce:
                else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4981 "util/configparser.c" /* yacc.c:1646  */
+#line 5027 "util/configparser.c"
     break;
 
-  case 430:
-#line 2121 "./util/configparser.y" /* yacc.c:1646  */
+  case 434:
+#line 2141 "./util/configparser.y"
     { 
                OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4989,33 +5035,33 @@ yyreduce:
                else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4993 "util/configparser.c" /* yacc.c:1646  */
+#line 5039 "util/configparser.c"
     break;
 
-  case 431:
-#line 2130 "./util/configparser.y" /* yacc.c:1646  */
+  case 435:
+#line 2150 "./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 5004 "util/configparser.c" /* yacc.c:1646  */
+#line 5050 "util/configparser.c"
     break;
 
-  case 432:
-#line 2138 "./util/configparser.y" /* yacc.c:1646  */
+  case 436:
+#line 2158 "./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 5015 "util/configparser.c" /* yacc.c:1646  */
+#line 5061 "util/configparser.c"
     break;
 
-  case 433:
-#line 2146 "./util/configparser.y" /* yacc.c:1646  */
+  case 437:
+#line 2166 "./util/configparser.y"
     {
        OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -5027,11 +5073,11 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 5031 "util/configparser.c" /* yacc.c:1646  */
+#line 5077 "util/configparser.c"
     break;
 
-  case 434:
-#line 2159 "./util/configparser.y" /* yacc.c:1646  */
+  case 438:
+#line 2179 "./util/configparser.y"
     {
                OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -5043,11 +5089,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 5047 "util/configparser.c" /* yacc.c:1646  */
+#line 5093 "util/configparser.c"
     break;
 
-  case 435:
-#line 2172 "./util/configparser.y" /* yacc.c:1646  */
+  case 439:
+#line 2192 "./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) {
@@ -5061,11 +5107,11 @@ yyreduce:
                                        "ratelimit-for-domain");
                }
        }
-#line 5065 "util/configparser.c" /* yacc.c:1646  */
+#line 5111 "util/configparser.c"
     break;
 
-  case 436:
-#line 2187 "./util/configparser.y" /* yacc.c:1646  */
+  case 440:
+#line 2207 "./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) {
@@ -5079,11 +5125,11 @@ yyreduce:
                                        "ratelimit-below-domain");
                }
        }
-#line 5083 "util/configparser.c" /* yacc.c:1646  */
+#line 5129 "util/configparser.c"
     break;
 
-  case 437:
-#line 2202 "./util/configparser.y" /* yacc.c:1646  */
+  case 441:
+#line 2222 "./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)
@@ -5091,11 +5137,11 @@ yyreduce:
        else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
        free((yyvsp[0].str));
        }
-#line 5095 "util/configparser.c" /* yacc.c:1646  */
+#line 5141 "util/configparser.c"
     break;
 
-  case 438:
-#line 2211 "./util/configparser.y" /* yacc.c:1646  */
+  case 442:
+#line 2231 "./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)
@@ -5103,20 +5149,20 @@ yyreduce:
                else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5107 "util/configparser.c" /* yacc.c:1646  */
+#line 5153 "util/configparser.c"
     break;
 
-  case 439:
-#line 2220 "./util/configparser.y" /* yacc.c:1646  */
+  case 443:
+#line 2240 "./util/configparser.y"
     { 
                OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
                free((yyvsp[0].str));
        }
-#line 5116 "util/configparser.c" /* yacc.c:1646  */
+#line 5162 "util/configparser.c"
     break;
 
-  case 440:
-#line 2226 "./util/configparser.y" /* yacc.c:1646  */
+  case 444:
+#line 2246 "./util/configparser.y"
     { 
                OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) <= 0)
@@ -5124,11 +5170,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5128 "util/configparser.c" /* yacc.c:1646  */
+#line 5174 "util/configparser.c"
     break;
 
-  case 441:
-#line 2235 "./util/configparser.y" /* yacc.c:1646  */
+  case 445:
+#line 2255 "./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)
@@ -5136,11 +5182,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5140 "util/configparser.c" /* yacc.c:1646  */
+#line 5186 "util/configparser.c"
     break;
 
-  case 442:
-#line 2244 "./util/configparser.y" /* yacc.c:1646  */
+  case 446:
+#line 2264 "./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)
@@ -5149,11 +5195,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5153 "util/configparser.c" /* yacc.c:1646  */
+#line 5199 "util/configparser.c"
     break;
 
-  case 443:
-#line 2254 "./util/configparser.y" /* yacc.c:1646  */
+  case 447:
+#line 2274 "./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)
@@ -5162,11 +5208,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5166 "util/configparser.c" /* yacc.c:1646  */
+#line 5212 "util/configparser.c"
     break;
 
-  case 444:
-#line 2264 "./util/configparser.y" /* yacc.c:1646  */
+  case 448:
+#line 2284 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
@@ -5178,11 +5224,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5182 "util/configparser.c" /* yacc.c:1646  */
+#line 5228 "util/configparser.c"
     break;
 
-  case 445:
-#line 2277 "./util/configparser.y" /* yacc.c:1646  */
+  case 449:
+#line 2297 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
@@ -5194,11 +5240,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5198 "util/configparser.c" /* yacc.c:1646  */
+#line 5244 "util/configparser.c"
     break;
 
-  case 446:
-#line 2290 "./util/configparser.y" /* yacc.c:1646  */
+  case 450:
+#line 2310 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -5209,11 +5255,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5213 "util/configparser.c" /* yacc.c:1646  */
+#line 5259 "util/configparser.c"
     break;
 
-  case 447:
-#line 2302 "./util/configparser.y" /* yacc.c:1646  */
+  case 451:
+#line 2322 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -5226,11 +5272,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5230 "util/configparser.c" /* yacc.c:1646  */
+#line 5276 "util/configparser.c"
     break;
 
-  case 448:
-#line 2316 "./util/configparser.y" /* yacc.c:1646  */
+  case 452:
+#line 2336 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -5241,11 +5287,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5245 "util/configparser.c" /* yacc.c:1646  */
+#line 5291 "util/configparser.c"
     break;
 
-  case 449:
-#line 2328 "./util/configparser.y" /* yacc.c:1646  */
+  case 453:
+#line 2348 "./util/configparser.y"
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -5258,11 +5304,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5262 "util/configparser.c" /* yacc.c:1646  */
+#line 5308 "util/configparser.c"
     break;
 
-  case 450:
-#line 2342 "./util/configparser.y" /* yacc.c:1646  */
+  case 454:
+#line 2362 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->stubs->name)
@@ -5271,31 +5317,31 @@ yyreduce:
                free(cfg_parser->cfg->stubs->name);
                cfg_parser->cfg->stubs->name = (yyvsp[0].str);
        }
-#line 5275 "util/configparser.c" /* yacc.c:1646  */
+#line 5321 "util/configparser.c"
     break;
 
-  case 451:
-#line 2352 "./util/configparser.y" /* yacc.c:1646  */
+  case 455:
+#line 2372 "./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 5285 "util/configparser.c" /* yacc.c:1646  */
+#line 5331 "util/configparser.c"
     break;
 
-  case 452:
-#line 2359 "./util/configparser.y" /* yacc.c:1646  */
+  case 456:
+#line 2379 "./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 5295 "util/configparser.c" /* yacc.c:1646  */
+#line 5341 "util/configparser.c"
     break;
 
-  case 453:
-#line 2366 "./util/configparser.y" /* yacc.c:1646  */
+  case 457:
+#line 2386 "./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)
@@ -5303,11 +5349,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5307 "util/configparser.c" /* yacc.c:1646  */
+#line 5353 "util/configparser.c"
     break;
 
-  case 454:
-#line 2375 "./util/configparser.y" /* yacc.c:1646  */
+  case 458:
+#line 2395 "./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)
@@ -5315,11 +5361,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5319 "util/configparser.c" /* yacc.c:1646  */
+#line 5365 "util/configparser.c"
     break;
 
-  case 455:
-#line 2384 "./util/configparser.y" /* yacc.c:1646  */
+  case 459:
+#line 2404 "./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)
@@ -5328,11 +5374,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5332 "util/configparser.c" /* yacc.c:1646  */
+#line 5378 "util/configparser.c"
     break;
 
-  case 456:
-#line 2394 "./util/configparser.y" /* yacc.c:1646  */
+  case 460:
+#line 2414 "./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)
@@ -5341,11 +5387,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5345 "util/configparser.c" /* yacc.c:1646  */
+#line 5391 "util/configparser.c"
     break;
 
-  case 457:
-#line 2404 "./util/configparser.y" /* yacc.c:1646  */
+  case 461:
+#line 2424 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->forwards->name)
@@ -5354,31 +5400,31 @@ yyreduce:
                free(cfg_parser->cfg->forwards->name);
                cfg_parser->cfg->forwards->name = (yyvsp[0].str);
        }
-#line 5358 "util/configparser.c" /* yacc.c:1646  */
+#line 5404 "util/configparser.c"
     break;
 
-  case 458:
-#line 2414 "./util/configparser.y" /* yacc.c:1646  */
+  case 462:
+#line 2434 "./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 5368 "util/configparser.c" /* yacc.c:1646  */
+#line 5414 "util/configparser.c"
     break;
 
-  case 459:
-#line 2421 "./util/configparser.y" /* yacc.c:1646  */
+  case 463:
+#line 2441 "./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 5378 "util/configparser.c" /* yacc.c:1646  */
+#line 5424 "util/configparser.c"
     break;
 
-  case 460:
-#line 2428 "./util/configparser.y" /* yacc.c:1646  */
+  case 464:
+#line 2448 "./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)
@@ -5386,11 +5432,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5390 "util/configparser.c" /* yacc.c:1646  */
+#line 5436 "util/configparser.c"
     break;
 
-  case 461:
-#line 2437 "./util/configparser.y" /* yacc.c:1646  */
+  case 465:
+#line 2457 "./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)
@@ -5398,11 +5444,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5402 "util/configparser.c" /* yacc.c:1646  */
+#line 5448 "util/configparser.c"
     break;
 
-  case 462:
-#line 2446 "./util/configparser.y" /* yacc.c:1646  */
+  case 466:
+#line 2466 "./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)
@@ -5411,11 +5457,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5415 "util/configparser.c" /* yacc.c:1646  */
+#line 5461 "util/configparser.c"
     break;
 
-  case 463:
-#line 2456 "./util/configparser.y" /* yacc.c:1646  */
+  case 467:
+#line 2476 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->auths->name)
@@ -5424,52 +5470,52 @@ yyreduce:
                free(cfg_parser->cfg->auths->name);
                cfg_parser->cfg->auths->name = (yyvsp[0].str);
        }
-#line 5428 "util/configparser.c" /* yacc.c:1646  */
+#line 5474 "util/configparser.c"
     break;
 
-  case 464:
-#line 2466 "./util/configparser.y" /* yacc.c:1646  */
+  case 468:
+#line 2486 "./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 5438 "util/configparser.c" /* yacc.c:1646  */
+#line 5484 "util/configparser.c"
     break;
 
-  case 465:
-#line 2473 "./util/configparser.y" /* yacc.c:1646  */
+  case 469:
+#line 2493 "./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 5448 "util/configparser.c" /* yacc.c:1646  */
+#line 5494 "util/configparser.c"
     break;
 
-  case 466:
-#line 2480 "./util/configparser.y" /* yacc.c:1646  */
+  case 470:
+#line 2500 "./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 5458 "util/configparser.c" /* yacc.c:1646  */
+#line 5504 "util/configparser.c"
     break;
 
-  case 467:
-#line 2487 "./util/configparser.y" /* yacc.c:1646  */
+  case 471:
+#line 2507 "./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 5469 "util/configparser.c" /* yacc.c:1646  */
+#line 5515 "util/configparser.c"
     break;
 
-  case 468:
-#line 2495 "./util/configparser.y" /* yacc.c:1646  */
+  case 472:
+#line 2515 "./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)
@@ -5478,11 +5524,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5482 "util/configparser.c" /* yacc.c:1646  */
+#line 5528 "util/configparser.c"
     break;
 
-  case 469:
-#line 2505 "./util/configparser.y" /* yacc.c:1646  */
+  case 473:
+#line 2525 "./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)
@@ -5491,11 +5537,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5495 "util/configparser.c" /* yacc.c:1646  */
+#line 5541 "util/configparser.c"
     break;
 
-  case 470:
-#line 2515 "./util/configparser.y" /* yacc.c:1646  */
+  case 474:
+#line 2535 "./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)
@@ -5504,11 +5550,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5508 "util/configparser.c" /* yacc.c:1646  */
+#line 5554 "util/configparser.c"
     break;
 
-  case 471:
-#line 2525 "./util/configparser.y" /* yacc.c:1646  */
+  case 475:
+#line 2545 "./util/configparser.y"
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->views->name)
@@ -5517,11 +5563,11 @@ yyreduce:
                free(cfg_parser->cfg->views->name);
                cfg_parser->cfg->views->name = (yyvsp[0].str);
        }
-#line 5521 "util/configparser.c" /* yacc.c:1646  */
+#line 5567 "util/configparser.c"
     break;
 
-  case 472:
-#line 2535 "./util/configparser.y" /* yacc.c:1646  */
+  case 476:
+#line 2555 "./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 &&
@@ -5559,11 +5605,11 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 5563 "util/configparser.c" /* yacc.c:1646  */
+#line 5609 "util/configparser.c"
     break;
 
-  case 473:
-#line 2574 "./util/configparser.y" /* yacc.c:1646  */
+  case 477:
+#line 2594 "./util/configparser.y"
     {
                OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -5572,33 +5618,33 @@ yyreduce:
                        fatal_exit("out of memory adding per-view "
                                "response-ip action");
        }
-#line 5576 "util/configparser.c" /* yacc.c:1646  */
+#line 5622 "util/configparser.c"
     break;
 
-  case 474:
-#line 2584 "./util/configparser.y" /* yacc.c:1646  */
+  case 478:
+#line 2604 "./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 5587 "util/configparser.c" /* yacc.c:1646  */
+#line 5633 "util/configparser.c"
     break;
 
-  case 475:
-#line 2592 "./util/configparser.y" /* yacc.c:1646  */
+  case 479:
+#line 2612 "./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 5598 "util/configparser.c" /* yacc.c:1646  */
+#line 5644 "util/configparser.c"
     break;
 
-  case 476:
-#line 2600 "./util/configparser.y" /* yacc.c:1646  */
+  case 480:
+#line 2620 "./util/configparser.y"
     {
                char* ptr;
                OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5612,11 +5658,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 5616 "util/configparser.c" /* yacc.c:1646  */
+#line 5662 "util/configparser.c"
     break;
 
-  case 477:
-#line 2615 "./util/configparser.y" /* yacc.c:1646  */
+  case 481:
+#line 2635 "./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)
@@ -5624,19 +5670,19 @@ yyreduce:
                else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5628 "util/configparser.c" /* yacc.c:1646  */
+#line 5674 "util/configparser.c"
     break;
 
-  case 478:
-#line 2624 "./util/configparser.y" /* yacc.c:1646  */
+  case 482:
+#line 2644 "./util/configparser.y"
     { 
                OUTYY(("\nP(remote-control:)\n")); 
        }
-#line 5636 "util/configparser.c" /* yacc.c:1646  */
+#line 5682 "util/configparser.c"
     break;
 
-  case 489:
-#line 2635 "./util/configparser.y" /* yacc.c:1646  */
+  case 493:
+#line 2655 "./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)
@@ -5645,11 +5691,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5649 "util/configparser.c" /* yacc.c:1646  */
+#line 5695 "util/configparser.c"
     break;
 
-  case 490:
-#line 2645 "./util/configparser.y" /* yacc.c:1646  */
+  case 494:
+#line 2665 "./util/configparser.y"
     {
                OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -5657,79 +5703,79 @@ yyreduce:
                else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5661 "util/configparser.c" /* yacc.c:1646  */
+#line 5707 "util/configparser.c"
     break;
 
-  case 491:
-#line 2654 "./util/configparser.y" /* yacc.c:1646  */
+  case 495:
+#line 2674 "./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 5671 "util/configparser.c" /* yacc.c:1646  */
+#line 5717 "util/configparser.c"
     break;
 
-  case 492:
-#line 2661 "./util/configparser.y" /* yacc.c:1646  */
+  case 496:
+#line 2681 "./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 5681 "util/configparser.c" /* yacc.c:1646  */
+#line 5727 "util/configparser.c"
     break;
 
-  case 493:
-#line 2668 "./util/configparser.y" /* yacc.c:1646  */
+  case 497:
+#line 2688 "./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 5691 "util/configparser.c" /* yacc.c:1646  */
+#line 5737 "util/configparser.c"
     break;
 
-  case 494:
-#line 2675 "./util/configparser.y" /* yacc.c:1646  */
+  case 498:
+#line 2695 "./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 5701 "util/configparser.c" /* yacc.c:1646  */
+#line 5747 "util/configparser.c"
     break;
 
-  case 495:
-#line 2682 "./util/configparser.y" /* yacc.c:1646  */
+  case 499:
+#line 2702 "./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 5711 "util/configparser.c" /* yacc.c:1646  */
+#line 5757 "util/configparser.c"
     break;
 
-  case 496:
-#line 2689 "./util/configparser.y" /* yacc.c:1646  */
+  case 500:
+#line 2709 "./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 5721 "util/configparser.c" /* yacc.c:1646  */
+#line 5767 "util/configparser.c"
     break;
 
-  case 497:
-#line 2696 "./util/configparser.y" /* yacc.c:1646  */
+  case 501:
+#line 2716 "./util/configparser.y"
     {
                OUTYY(("\nP(dnstap:)\n"));
        }
-#line 5729 "util/configparser.c" /* yacc.c:1646  */
+#line 5775 "util/configparser.c"
     break;
 
-  case 512:
-#line 2713 "./util/configparser.y" /* yacc.c:1646  */
+  case 516:
+#line 2733 "./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)
@@ -5737,21 +5783,21 @@ yyreduce:
                else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5741 "util/configparser.c" /* yacc.c:1646  */
+#line 5787 "util/configparser.c"
     break;
 
-  case 513:
-#line 2722 "./util/configparser.y" /* yacc.c:1646  */
+  case 517:
+#line 2742 "./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 5751 "util/configparser.c" /* yacc.c:1646  */
+#line 5797 "util/configparser.c"
     break;
 
-  case 514:
-#line 2729 "./util/configparser.y" /* yacc.c:1646  */
+  case 518:
+#line 2749 "./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)
@@ -5759,11 +5805,11 @@ yyreduce:
                else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5763 "util/configparser.c" /* yacc.c:1646  */
+#line 5809 "util/configparser.c"
     break;
 
-  case 515:
-#line 2738 "./util/configparser.y" /* yacc.c:1646  */
+  case 519:
+#line 2758 "./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)
@@ -5771,31 +5817,31 @@ yyreduce:
                else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5775 "util/configparser.c" /* yacc.c:1646  */
+#line 5821 "util/configparser.c"
     break;
 
-  case 516:
-#line 2747 "./util/configparser.y" /* yacc.c:1646  */
+  case 520:
+#line 2767 "./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 5785 "util/configparser.c" /* yacc.c:1646  */
+#line 5831 "util/configparser.c"
     break;
 
-  case 517:
-#line 2754 "./util/configparser.y" /* yacc.c:1646  */
+  case 521:
+#line 2774 "./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 5795 "util/configparser.c" /* yacc.c:1646  */
+#line 5841 "util/configparser.c"
     break;
 
-  case 518:
-#line 2761 "./util/configparser.y" /* yacc.c:1646  */
+  case 522:
+#line 2781 "./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)
@@ -5804,11 +5850,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5808 "util/configparser.c" /* yacc.c:1646  */
+#line 5854 "util/configparser.c"
     break;
 
-  case 519:
-#line 2771 "./util/configparser.y" /* yacc.c:1646  */
+  case 523:
+#line 2791 "./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)
@@ -5817,11 +5863,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5821 "util/configparser.c" /* yacc.c:1646  */
+#line 5867 "util/configparser.c"
     break;
 
-  case 520:
-#line 2781 "./util/configparser.y" /* yacc.c:1646  */
+  case 524:
+#line 2801 "./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)
@@ -5830,11 +5876,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5834 "util/configparser.c" /* yacc.c:1646  */
+#line 5880 "util/configparser.c"
     break;
 
-  case 521:
-#line 2791 "./util/configparser.y" /* yacc.c:1646  */
+  case 525:
+#line 2811 "./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)
@@ -5843,11 +5889,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5847 "util/configparser.c" /* yacc.c:1646  */
+#line 5893 "util/configparser.c"
     break;
 
-  case 522:
-#line 2801 "./util/configparser.y" /* yacc.c:1646  */
+  case 526:
+#line 2821 "./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)
@@ -5856,11 +5902,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5860 "util/configparser.c" /* yacc.c:1646  */
+#line 5906 "util/configparser.c"
     break;
 
-  case 523:
-#line 2811 "./util/configparser.y" /* yacc.c:1646  */
+  case 527:
+#line 2831 "./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)
@@ -5869,29 +5915,29 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5873 "util/configparser.c" /* yacc.c:1646  */
+#line 5919 "util/configparser.c"
     break;
 
-  case 524:
-#line 2821 "./util/configparser.y" /* yacc.c:1646  */
+  case 528:
+#line 2841 "./util/configparser.y"
     { 
                OUTYY(("\nP(python:)\n")); 
        }
-#line 5881 "util/configparser.c" /* yacc.c:1646  */
+#line 5927 "util/configparser.c"
     break;
 
-  case 528:
-#line 2830 "./util/configparser.y" /* yacc.c:1646  */
+  case 532:
+#line 2850 "./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 5891 "util/configparser.c" /* yacc.c:1646  */
+#line 5937 "util/configparser.c"
     break;
 
-  case 529:
-#line 2836 "./util/configparser.y" /* yacc.c:1646  */
+  case 533:
+#line 2856 "./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)
@@ -5900,21 +5946,21 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5904 "util/configparser.c" /* yacc.c:1646  */
+#line 5950 "util/configparser.c"
     break;
 
-  case 530:
-#line 2846 "./util/configparser.y" /* yacc.c:1646  */
+  case 534:
+#line 2866 "./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 5914 "util/configparser.c" /* yacc.c:1646  */
+#line 5960 "util/configparser.c"
     break;
 
-  case 531:
-#line 2853 "./util/configparser.y" /* yacc.c:1646  */
+  case 535:
+#line 2873 "./util/configparser.y"
     {
                OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -5922,30 +5968,30 @@ yyreduce:
                        (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip");
        }
-#line 5926 "util/configparser.c" /* yacc.c:1646  */
+#line 5972 "util/configparser.c"
     break;
 
-  case 532:
-#line 2862 "./util/configparser.y" /* yacc.c:1646  */
+  case 536:
+#line 2882 "./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 5937 "util/configparser.c" /* yacc.c:1646  */
+#line 5983 "util/configparser.c"
     break;
 
-  case 533:
-#line 2870 "./util/configparser.y" /* yacc.c:1646  */
+  case 537:
+#line 2890 "./util/configparser.y"
     {
                OUTYY(("\nP(dnscrypt:)\n"));
        }
-#line 5945 "util/configparser.c" /* yacc.c:1646  */
+#line 5991 "util/configparser.c"
     break;
 
-  case 546:
-#line 2886 "./util/configparser.y" /* yacc.c:1646  */
+  case 550:
+#line 2906 "./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)
@@ -5953,11 +5999,11 @@ yyreduce:
                else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5957 "util/configparser.c" /* yacc.c:1646  */
+#line 6003 "util/configparser.c"
     break;
 
-  case 547:
-#line 2896 "./util/configparser.y" /* yacc.c:1646  */
+  case 551:
+#line 2916 "./util/configparser.y"
     {
                OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -5965,21 +6011,21 @@ yyreduce:
                else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5969 "util/configparser.c" /* yacc.c:1646  */
+#line 6015 "util/configparser.c"
     break;
 
-  case 548:
-#line 2905 "./util/configparser.y" /* yacc.c:1646  */
+  case 552:
+#line 2925 "./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 5979 "util/configparser.c" /* yacc.c:1646  */
+#line 6025 "util/configparser.c"
     break;
 
-  case 549:
-#line 2912 "./util/configparser.y" /* yacc.c:1646  */
+  case 553:
+#line 2932 "./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)))
@@ -5987,21 +6033,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 5991 "util/configparser.c" /* yacc.c:1646  */
+#line 6037 "util/configparser.c"
     break;
 
-  case 550:
-#line 2921 "./util/configparser.y" /* yacc.c:1646  */
+  case 554:
+#line 2941 "./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 6001 "util/configparser.c" /* yacc.c:1646  */
+#line 6047 "util/configparser.c"
     break;
 
-  case 551:
-#line 2928 "./util/configparser.y" /* yacc.c:1646  */
+  case 555:
+#line 2948 "./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)))
@@ -6009,22 +6055,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 6013 "util/configparser.c" /* yacc.c:1646  */
+#line 6059 "util/configparser.c"
     break;
 
-  case 552:
-#line 2937 "./util/configparser.y" /* yacc.c:1646  */
+  case 556:
+#line 2957 "./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 6024 "util/configparser.c" /* yacc.c:1646  */
+#line 6070 "util/configparser.c"
     break;
 
-  case 553:
-#line 2945 "./util/configparser.y" /* yacc.c:1646  */
+  case 557:
+#line 2965 "./util/configparser.y"
     {
        OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -6036,22 +6082,22 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 6040 "util/configparser.c" /* yacc.c:1646  */
+#line 6086 "util/configparser.c"
     break;
 
-  case 554:
-#line 2958 "./util/configparser.y" /* yacc.c:1646  */
+  case 558:
+#line 2978 "./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 6051 "util/configparser.c" /* yacc.c:1646  */
+#line 6097 "util/configparser.c"
     break;
 
-  case 555:
-#line 2966 "./util/configparser.y" /* yacc.c:1646  */
+  case 559:
+#line 2986 "./util/configparser.y"
     {
        OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -6063,25 +6109,22 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 6067 "util/configparser.c" /* yacc.c:1646  */
+#line 6113 "util/configparser.c"
     break;
 
-  case 556:
-#line 2979 "./util/configparser.y" /* yacc.c:1646  */
+  case 560:
+#line 2999 "./util/configparser.y"
     {
                OUTYY(("\nP(cachedb:)\n"));
        }
-#line 6075 "util/configparser.c" /* yacc.c:1646  */
+#line 6121 "util/configparser.c"
     break;
 
-  case 564:
-#line 2989 "./util/configparser.y" /* yacc.c:1646  */
+  case 568:
+#line 3009 "./util/configparser.y"
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
-               if(cfg_parser->cfg->cachedb_backend)
-                       yyerror("cachedb backend override, there must be one "
-                               "backend");
                free(cfg_parser->cfg->cachedb_backend);
                cfg_parser->cfg->cachedb_backend = (yyvsp[0].str);
        #else
@@ -6089,17 +6132,14 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6093 "util/configparser.c" /* yacc.c:1646  */
+#line 6136 "util/configparser.c"
     break;
 
-  case 565:
-#line 3004 "./util/configparser.y" /* yacc.c:1646  */
+  case 569:
+#line 3021 "./util/configparser.y"
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
-               if(cfg_parser->cfg->cachedb_secret)
-                       yyerror("cachedb secret-seed override, there must be "
-                               "only one secret");
                free(cfg_parser->cfg->cachedb_secret);
                cfg_parser->cfg->cachedb_secret = (yyvsp[0].str);
        #else
@@ -6107,11 +6147,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6111 "util/configparser.c" /* yacc.c:1646  */
+#line 6151 "util/configparser.c"
     break;
 
-  case 566:
-#line 3019 "./util/configparser.y" /* yacc.c:1646  */
+  case 570:
+#line 3033 "./util/configparser.y"
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
@@ -6122,11 +6162,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 6126 "util/configparser.c" /* yacc.c:1646  */
+#line 6166 "util/configparser.c"
     break;
 
-  case 567:
-#line 3031 "./util/configparser.y" /* yacc.c:1646  */
+  case 571:
+#line 3045 "./util/configparser.y"
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                int port;
@@ -6140,11 +6180,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 6144 "util/configparser.c" /* yacc.c:1646  */
+#line 6184 "util/configparser.c"
     break;
 
-  case 568:
-#line 3046 "./util/configparser.y" /* yacc.c:1646  */
+  case 572:
+#line 3060 "./util/configparser.y"
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
@@ -6156,11 +6196,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 6160 "util/configparser.c" /* yacc.c:1646  */
+#line 6200 "util/configparser.c"
     break;
 
-  case 569:
-#line 3059 "./util/configparser.y" /* yacc.c:1646  */
+  case 573:
+#line 3073 "./util/configparser.y"
     {
                OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if (atoi((yyvsp[0].str)) < 0)
@@ -6170,19 +6210,19 @@ yyreduce:
                                fatal_exit("out of memory adding tcp connection limit");
                }
        }
-#line 6174 "util/configparser.c" /* yacc.c:1646  */
+#line 6214 "util/configparser.c"
     break;
 
-  case 570:
-#line 3070 "./util/configparser.y" /* yacc.c:1646  */
+  case 574:
+#line 3084 "./util/configparser.y"
     {
                        OUTYY(("\nP(ipset:)\n"));
                }
-#line 6182 "util/configparser.c" /* yacc.c:1646  */
+#line 6222 "util/configparser.c"
     break;
 
-  case 575:
-#line 3079 "./util/configparser.y" /* yacc.c:1646  */
+  case 579:
+#line 3093 "./util/configparser.y"
     {
                #ifdef USE_IPSET
                        OUTYY(("P(name-v4:%s)\n", (yyvsp[0].str)));
@@ -6196,11 +6236,11 @@ yyreduce:
                        free((yyvsp[0].str));
                #endif
                }
-#line 6200 "util/configparser.c" /* yacc.c:1646  */
+#line 6240 "util/configparser.c"
     break;
 
-  case 576:
-#line 3094 "./util/configparser.y" /* yacc.c:1646  */
+  case 580:
+#line 3108 "./util/configparser.y"
     {
                #ifdef USE_IPSET
                        OUTYY(("P(name-v6:%s)\n", (yyvsp[0].str)));
@@ -6214,11 +6254,12 @@ yyreduce:
                        free((yyvsp[0].str));
                #endif
                }
-#line 6218 "util/configparser.c" /* yacc.c:1646  */
+#line 6258 "util/configparser.c"
     break;
 
 
-#line 6222 "util/configparser.c" /* yacc.c:1646  */
+#line 6262 "util/configparser.c"
+
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -6243,14 +6284,13 @@ yyreduce:
   /* Now 'shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
-
-  yyn = yyr1[yyn];
-
-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-    yystate = yytable[yystate];
-  else
-    yystate = yydefgoto[yyn - YYNTOKENS];
+  {
+    const int yylhs = yyr1[yyn] - YYNTOKENS;
+    const int yyi = yypgoto[yylhs] + *yyssp;
+    yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+               ? yytable[yyi]
+               : yydefgoto[yylhs]);
+  }
 
   goto yynewstate;
 
@@ -6333,12 +6373,10 @@ yyerrlab:
 | yyerrorlab -- error raised explicitly by YYERROR.  |
 `---------------------------------------------------*/
 yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (/*CONSTCOND*/ 0)
-     goto yyerrorlab;
+  /* Pacify compilers when the user code never invokes YYERROR and the
+     label yyerrorlab therefore never appears in user code.  */
+  if (0)
+    YYERROR;
 
   /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
@@ -6400,6 +6438,7 @@ yyacceptlab:
   yyresult = 0;
   goto yyreturn;
 
+
 /*-----------------------------------.
 | yyabortlab -- YYABORT comes here.  |
 `-----------------------------------*/
@@ -6407,6 +6446,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
+
 #if !defined yyoverflow || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
@@ -6417,6 +6457,10 @@ yyexhaustedlab:
   /* Fall through.  */
 #endif
 
+
+/*-----------------------------------------------------.
+| yyreturn -- parsing is finished, return the result.  |
+`-----------------------------------------------------*/
 yyreturn:
   if (yychar != YYEMPTY)
     {
@@ -6446,7 +6490,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 3108 "./util/configparser.y" /* yacc.c:1906  */
+#line 3122 "./util/configparser.y"
 
 
 /* parse helper routines could be here */
index 9d661aee123ac76eae57cba9b676648964907a42..4d7e6b12fd81e74fb0df7b78944b7e9defab6548 100644 (file)
@@ -1,8 +1,9 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.4.1.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
+   Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -30,6 +31,9 @@
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+/* Undocumented macros, especially those whose name start with YY_,
+   are private implementation details.  Do not rely on them.  */
+
 #ifndef YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
 # define YY_YY_UTIL_CONFIGPARSER_H_INCLUDED
 /* Debug traces.  */
@@ -250,74 +254,76 @@ extern int yydebug;
     VAR_SERVE_EXPIRED = 460,
     VAR_SERVE_EXPIRED_TTL = 461,
     VAR_SERVE_EXPIRED_TTL_RESET = 462,
-    VAR_FAKE_DSA = 463,
-    VAR_FAKE_SHA1 = 464,
-    VAR_LOG_IDENTITY = 465,
-    VAR_HIDE_TRUSTANCHOR = 466,
-    VAR_TRUST_ANCHOR_SIGNALING = 467,
-    VAR_AGGRESSIVE_NSEC = 468,
-    VAR_USE_SYSTEMD = 469,
-    VAR_SHM_ENABLE = 470,
-    VAR_SHM_KEY = 471,
-    VAR_ROOT_KEY_SENTINEL = 472,
-    VAR_DNSCRYPT = 473,
-    VAR_DNSCRYPT_ENABLE = 474,
-    VAR_DNSCRYPT_PORT = 475,
-    VAR_DNSCRYPT_PROVIDER = 476,
-    VAR_DNSCRYPT_SECRET_KEY = 477,
-    VAR_DNSCRYPT_PROVIDER_CERT = 478,
-    VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 479,
-    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 480,
-    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 481,
-    VAR_DNSCRYPT_NONCE_CACHE_SIZE = 482,
-    VAR_DNSCRYPT_NONCE_CACHE_SLABS = 483,
-    VAR_IPSECMOD_ENABLED = 484,
-    VAR_IPSECMOD_HOOK = 485,
-    VAR_IPSECMOD_IGNORE_BOGUS = 486,
-    VAR_IPSECMOD_MAX_TTL = 487,
-    VAR_IPSECMOD_WHITELIST = 488,
-    VAR_IPSECMOD_STRICT = 489,
-    VAR_CACHEDB = 490,
-    VAR_CACHEDB_BACKEND = 491,
-    VAR_CACHEDB_SECRETSEED = 492,
-    VAR_CACHEDB_REDISHOST = 493,
-    VAR_CACHEDB_REDISPORT = 494,
-    VAR_CACHEDB_REDISTIMEOUT = 495,
-    VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 496,
-    VAR_FOR_UPSTREAM = 497,
-    VAR_AUTH_ZONE = 498,
-    VAR_ZONEFILE = 499,
-    VAR_MASTER = 500,
-    VAR_URL = 501,
-    VAR_FOR_DOWNSTREAM = 502,
-    VAR_FALLBACK_ENABLED = 503,
-    VAR_TLS_ADDITIONAL_PORT = 504,
-    VAR_LOW_RTT = 505,
-    VAR_LOW_RTT_PERMIL = 506,
-    VAR_FAST_SERVER_PERMIL = 507,
-    VAR_FAST_SERVER_NUM = 508,
-    VAR_ALLOW_NOTIFY = 509,
-    VAR_TLS_WIN_CERT = 510,
-    VAR_TCP_CONNECTION_LIMIT = 511,
-    VAR_FORWARD_NO_CACHE = 512,
-    VAR_STUB_NO_CACHE = 513,
-    VAR_LOG_SERVFAIL = 514,
-    VAR_DENY_ANY = 515,
-    VAR_UNKNOWN_SERVER_TIME_LIMIT = 516,
-    VAR_LOG_TAG_QUERYREPLY = 517,
-    VAR_STREAM_WAIT_SIZE = 518,
-    VAR_TLS_CIPHERS = 519,
-    VAR_TLS_CIPHERSUITES = 520,
-    VAR_IPSET = 521,
-    VAR_IPSET_NAME_V4 = 522,
-    VAR_IPSET_NAME_V6 = 523,
-    VAR_TLS_SESSION_TICKET_KEYS = 524,
-    VAR_RPZ = 525,
-    VAR_TAGS = 526,
-    VAR_RPZ_ACTION_OVERRIDE = 527,
-    VAR_RPZ_CNAME_OVERRIDE = 528,
-    VAR_RPZ_LOG = 529,
-    VAR_RPZ_LOG_NAME = 530
+    VAR_SERVE_EXPIRED_REPLY_TTL = 463,
+    VAR_SERVE_EXPIRED_CLIENT_TIMEOUT = 464,
+    VAR_FAKE_DSA = 465,
+    VAR_FAKE_SHA1 = 466,
+    VAR_LOG_IDENTITY = 467,
+    VAR_HIDE_TRUSTANCHOR = 468,
+    VAR_TRUST_ANCHOR_SIGNALING = 469,
+    VAR_AGGRESSIVE_NSEC = 470,
+    VAR_USE_SYSTEMD = 471,
+    VAR_SHM_ENABLE = 472,
+    VAR_SHM_KEY = 473,
+    VAR_ROOT_KEY_SENTINEL = 474,
+    VAR_DNSCRYPT = 475,
+    VAR_DNSCRYPT_ENABLE = 476,
+    VAR_DNSCRYPT_PORT = 477,
+    VAR_DNSCRYPT_PROVIDER = 478,
+    VAR_DNSCRYPT_SECRET_KEY = 479,
+    VAR_DNSCRYPT_PROVIDER_CERT = 480,
+    VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 481,
+    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 482,
+    VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 483,
+    VAR_DNSCRYPT_NONCE_CACHE_SIZE = 484,
+    VAR_DNSCRYPT_NONCE_CACHE_SLABS = 485,
+    VAR_IPSECMOD_ENABLED = 486,
+    VAR_IPSECMOD_HOOK = 487,
+    VAR_IPSECMOD_IGNORE_BOGUS = 488,
+    VAR_IPSECMOD_MAX_TTL = 489,
+    VAR_IPSECMOD_WHITELIST = 490,
+    VAR_IPSECMOD_STRICT = 491,
+    VAR_CACHEDB = 492,
+    VAR_CACHEDB_BACKEND = 493,
+    VAR_CACHEDB_SECRETSEED = 494,
+    VAR_CACHEDB_REDISHOST = 495,
+    VAR_CACHEDB_REDISPORT = 496,
+    VAR_CACHEDB_REDISTIMEOUT = 497,
+    VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 498,
+    VAR_FOR_UPSTREAM = 499,
+    VAR_AUTH_ZONE = 500,
+    VAR_ZONEFILE = 501,
+    VAR_MASTER = 502,
+    VAR_URL = 503,
+    VAR_FOR_DOWNSTREAM = 504,
+    VAR_FALLBACK_ENABLED = 505,
+    VAR_TLS_ADDITIONAL_PORT = 506,
+    VAR_LOW_RTT = 507,
+    VAR_LOW_RTT_PERMIL = 508,
+    VAR_FAST_SERVER_PERMIL = 509,
+    VAR_FAST_SERVER_NUM = 510,
+    VAR_ALLOW_NOTIFY = 511,
+    VAR_TLS_WIN_CERT = 512,
+    VAR_TCP_CONNECTION_LIMIT = 513,
+    VAR_FORWARD_NO_CACHE = 514,
+    VAR_STUB_NO_CACHE = 515,
+    VAR_LOG_SERVFAIL = 516,
+    VAR_DENY_ANY = 517,
+    VAR_UNKNOWN_SERVER_TIME_LIMIT = 518,
+    VAR_LOG_TAG_QUERYREPLY = 519,
+    VAR_STREAM_WAIT_SIZE = 520,
+    VAR_TLS_CIPHERS = 521,
+    VAR_TLS_CIPHERSUITES = 522,
+    VAR_IPSET = 523,
+    VAR_IPSET_NAME_V4 = 524,
+    VAR_IPSET_NAME_V6 = 525,
+    VAR_TLS_SESSION_TICKET_KEYS = 526,
+    VAR_RPZ = 527,
+    VAR_TAGS = 528,
+    VAR_RPZ_ACTION_OVERRIDE = 529,
+    VAR_RPZ_CNAME_OVERRIDE = 530,
+    VAR_RPZ_LOG = 531,
+    VAR_RPZ_LOG_NAME = 532
   };
 #endif
 /* Tokens.  */
@@ -526,87 +532,88 @@ extern int yydebug;
 #define VAR_SERVE_EXPIRED 460
 #define VAR_SERVE_EXPIRED_TTL 461
 #define VAR_SERVE_EXPIRED_TTL_RESET 462
-#define VAR_FAKE_DSA 463
-#define VAR_FAKE_SHA1 464
-#define VAR_LOG_IDENTITY 465
-#define VAR_HIDE_TRUSTANCHOR 466
-#define VAR_TRUST_ANCHOR_SIGNALING 467
-#define VAR_AGGRESSIVE_NSEC 468
-#define VAR_USE_SYSTEMD 469
-#define VAR_SHM_ENABLE 470
-#define VAR_SHM_KEY 471
-#define VAR_ROOT_KEY_SENTINEL 472
-#define VAR_DNSCRYPT 473
-#define VAR_DNSCRYPT_ENABLE 474
-#define VAR_DNSCRYPT_PORT 475
-#define VAR_DNSCRYPT_PROVIDER 476
-#define VAR_DNSCRYPT_SECRET_KEY 477
-#define VAR_DNSCRYPT_PROVIDER_CERT 478
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 479
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 480
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 481
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 482
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 483
-#define VAR_IPSECMOD_ENABLED 484
-#define VAR_IPSECMOD_HOOK 485
-#define VAR_IPSECMOD_IGNORE_BOGUS 486
-#define VAR_IPSECMOD_MAX_TTL 487
-#define VAR_IPSECMOD_WHITELIST 488
-#define VAR_IPSECMOD_STRICT 489
-#define VAR_CACHEDB 490
-#define VAR_CACHEDB_BACKEND 491
-#define VAR_CACHEDB_SECRETSEED 492
-#define VAR_CACHEDB_REDISHOST 493
-#define VAR_CACHEDB_REDISPORT 494
-#define VAR_CACHEDB_REDISTIMEOUT 495
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 496
-#define VAR_FOR_UPSTREAM 497
-#define VAR_AUTH_ZONE 498
-#define VAR_ZONEFILE 499
-#define VAR_MASTER 500
-#define VAR_URL 501
-#define VAR_FOR_DOWNSTREAM 502
-#define VAR_FALLBACK_ENABLED 503
-#define VAR_TLS_ADDITIONAL_PORT 504
-#define VAR_LOW_RTT 505
-#define VAR_LOW_RTT_PERMIL 506
-#define VAR_FAST_SERVER_PERMIL 507
-#define VAR_FAST_SERVER_NUM 508
-#define VAR_ALLOW_NOTIFY 509
-#define VAR_TLS_WIN_CERT 510
-#define VAR_TCP_CONNECTION_LIMIT 511
-#define VAR_FORWARD_NO_CACHE 512
-#define VAR_STUB_NO_CACHE 513
-#define VAR_LOG_SERVFAIL 514
-#define VAR_DENY_ANY 515
-#define VAR_UNKNOWN_SERVER_TIME_LIMIT 516
-#define VAR_LOG_TAG_QUERYREPLY 517
-#define VAR_STREAM_WAIT_SIZE 518
-#define VAR_TLS_CIPHERS 519
-#define VAR_TLS_CIPHERSUITES 520
-#define VAR_IPSET 521
-#define VAR_IPSET_NAME_V4 522
-#define VAR_IPSET_NAME_V6 523
-#define VAR_TLS_SESSION_TICKET_KEYS 524
-#define VAR_RPZ 525
-#define VAR_TAGS 526
-#define VAR_RPZ_ACTION_OVERRIDE 527
-#define VAR_RPZ_CNAME_OVERRIDE 528
-#define VAR_RPZ_LOG 529
-#define VAR_RPZ_LOG_NAME 530
+#define VAR_SERVE_EXPIRED_REPLY_TTL 463
+#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 464
+#define VAR_FAKE_DSA 465
+#define VAR_FAKE_SHA1 466
+#define VAR_LOG_IDENTITY 467
+#define VAR_HIDE_TRUSTANCHOR 468
+#define VAR_TRUST_ANCHOR_SIGNALING 469
+#define VAR_AGGRESSIVE_NSEC 470
+#define VAR_USE_SYSTEMD 471
+#define VAR_SHM_ENABLE 472
+#define VAR_SHM_KEY 473
+#define VAR_ROOT_KEY_SENTINEL 474
+#define VAR_DNSCRYPT 475
+#define VAR_DNSCRYPT_ENABLE 476
+#define VAR_DNSCRYPT_PORT 477
+#define VAR_DNSCRYPT_PROVIDER 478
+#define VAR_DNSCRYPT_SECRET_KEY 479
+#define VAR_DNSCRYPT_PROVIDER_CERT 480
+#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 481
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 482
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 483
+#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 484
+#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 485
+#define VAR_IPSECMOD_ENABLED 486
+#define VAR_IPSECMOD_HOOK 487
+#define VAR_IPSECMOD_IGNORE_BOGUS 488
+#define VAR_IPSECMOD_MAX_TTL 489
+#define VAR_IPSECMOD_WHITELIST 490
+#define VAR_IPSECMOD_STRICT 491
+#define VAR_CACHEDB 492
+#define VAR_CACHEDB_BACKEND 493
+#define VAR_CACHEDB_SECRETSEED 494
+#define VAR_CACHEDB_REDISHOST 495
+#define VAR_CACHEDB_REDISPORT 496
+#define VAR_CACHEDB_REDISTIMEOUT 497
+#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 498
+#define VAR_FOR_UPSTREAM 499
+#define VAR_AUTH_ZONE 500
+#define VAR_ZONEFILE 501
+#define VAR_MASTER 502
+#define VAR_URL 503
+#define VAR_FOR_DOWNSTREAM 504
+#define VAR_FALLBACK_ENABLED 505
+#define VAR_TLS_ADDITIONAL_PORT 506
+#define VAR_LOW_RTT 507
+#define VAR_LOW_RTT_PERMIL 508
+#define VAR_FAST_SERVER_PERMIL 509
+#define VAR_FAST_SERVER_NUM 510
+#define VAR_ALLOW_NOTIFY 511
+#define VAR_TLS_WIN_CERT 512
+#define VAR_TCP_CONNECTION_LIMIT 513
+#define VAR_FORWARD_NO_CACHE 514
+#define VAR_STUB_NO_CACHE 515
+#define VAR_LOG_SERVFAIL 516
+#define VAR_DENY_ANY 517
+#define VAR_UNKNOWN_SERVER_TIME_LIMIT 518
+#define VAR_LOG_TAG_QUERYREPLY 519
+#define VAR_STREAM_WAIT_SIZE 520
+#define VAR_TLS_CIPHERS 521
+#define VAR_TLS_CIPHERSUITES 522
+#define VAR_IPSET 523
+#define VAR_IPSET_NAME_V4 524
+#define VAR_IPSET_NAME_V6 525
+#define VAR_TLS_SESSION_TICKET_KEYS 526
+#define VAR_RPZ 527
+#define VAR_TAGS 528
+#define VAR_RPZ_ACTION_OVERRIDE 529
+#define VAR_RPZ_CNAME_OVERRIDE 530
+#define VAR_RPZ_LOG 531
+#define VAR_RPZ_LOG_NAME 532
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
 union YYSTYPE
 {
-#line 66 "./util/configparser.y" /* yacc.c:1909  */
+#line 66 "./util/configparser.y"
 
        char*   str;
 
-#line 608 "util/configparser.h" /* yacc.c:1909  */
-};
+#line 615 "util/configparser.h"
 
+};
 typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
index 8671a7cd3061fdb02edddfe1d447965717cfbde8..d471babe6de1a58d8ff36eeb648d1827c19ee43c 100644 (file)
@@ -143,10 +143,11 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_LOCAL_ZONE_OVERRIDE VAR_ACCESS_CONTROL_TAG_ACTION
 %token VAR_ACCESS_CONTROL_TAG_DATA VAR_VIEW VAR_ACCESS_CONTROL_VIEW
 %token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_SERVE_EXPIRED_TTL
-%token VAR_SERVE_EXPIRED_TTL_RESET VAR_FAKE_DSA VAR_FAKE_SHA1
-%token VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR VAR_TRUST_ANCHOR_SIGNALING
-%token VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD VAR_SHM_ENABLE VAR_SHM_KEY
-%token VAR_ROOT_KEY_SENTINEL
+%token VAR_SERVE_EXPIRED_TTL_RESET VAR_SERVE_EXPIRED_REPLY_TTL
+%token VAR_SERVE_EXPIRED_CLIENT_TIMEOUT VAR_FAKE_DSA
+%token VAR_FAKE_SHA1 VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR
+%token VAR_TRUST_ANCHOR_SIGNALING VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD
+%token VAR_SHM_ENABLE VAR_SHM_KEY VAR_ROOT_KEY_SENTINEL
 %token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
 %token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT
 %token VAR_DNSCRYPT_PROVIDER_CERT_ROTATED
@@ -256,6 +257,7 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_access_control_tag_data | server_access_control_view |
        server_qname_minimisation_strict | server_serve_expired |
        server_serve_expired_ttl | server_serve_expired_ttl_reset |
+       server_serve_expired_reply_ttl | server_serve_expired_client_timeout |
        server_fake_dsa | server_log_identity | server_use_systemd |
        server_response_ip_tag | server_response_ip | server_response_ip_data |
        server_shm_enable | server_shm_key | server_fake_sha1 |
@@ -1757,6 +1759,24 @@ server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG
                free($2);
        }
        ;
+server_serve_expired_reply_ttl: VAR_SERVE_EXPIRED_REPLY_TTL STRING_ARG
+       {
+               OUTYY(("P(server_serve_expired_reply_ttl:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else cfg_parser->cfg->serve_expired_reply_ttl = atoi($2);
+               free($2);
+       }
+       ;
+server_serve_expired_client_timeout: VAR_SERVE_EXPIRED_CLIENT_TIMEOUT STRING_ARG
+       {
+               OUTYY(("P(server_serve_expired_client_timeout:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else cfg_parser->cfg->serve_expired_client_timeout = atoi($2);
+               free($2);
+       }
+       ;
 server_fake_dsa: VAR_FAKE_DSA STRING_ARG
        {
                OUTYY(("P(server_fake_dsa:%s)\n", $2));
@@ -2989,9 +3009,6 @@ cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG
        {
        #ifdef USE_CACHEDB
                OUTYY(("P(backend:%s)\n", $2));
-               if(cfg_parser->cfg->cachedb_backend)
-                       yyerror("cachedb backend override, there must be one "
-                               "backend");
                free(cfg_parser->cfg->cachedb_backend);
                cfg_parser->cfg->cachedb_backend = $2;
        #else
@@ -3004,9 +3021,6 @@ cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG
        {
        #ifdef USE_CACHEDB
                OUTYY(("P(secret-seed:%s)\n", $2));
-               if(cfg_parser->cfg->cachedb_secret)
-                       yyerror("cachedb secret-seed override, there must be "
-                               "only one secret");
                free(cfg_parser->cfg->cachedb_secret);
                cfg_parser->cfg->cachedb_secret = $2;
        #else
index a51a4b9b85d8a4b408b80e722b4a2835440bbf34..be69f628a50743b95d3842b6830073ae457f6702 100644 (file)
@@ -480,7 +480,8 @@ packed_rrset_encode(struct ub_packed_rrset_key* key, sldns_buffer* pkt,
                        sldns_buffer_write(pkt, &key->rk.type, 2);
                        sldns_buffer_write(pkt, &key->rk.rrset_class, 2);
                        if(data->rr_ttl[j] < timenow)
-                               sldns_buffer_write_u32(pkt, 0);
+                               sldns_buffer_write_u32(pkt,
+                                       SERVE_EXPIRED?SERVE_EXPIRED_REPLY_TTL:0);
                        else    sldns_buffer_write_u32(pkt, 
                                        data->rr_ttl[j]-timenow);
                        if(c) {
@@ -517,7 +518,8 @@ packed_rrset_encode(struct ub_packed_rrset_key* key, sldns_buffer* pkt,
                        sldns_buffer_write_u16(pkt, LDNS_RR_TYPE_RRSIG);
                        sldns_buffer_write(pkt, &key->rk.rrset_class, 2);
                        if(data->rr_ttl[i] < timenow)
-                               sldns_buffer_write_u32(pkt, 0);
+                               sldns_buffer_write_u32(pkt,
+                                       SERVE_EXPIRED?SERVE_EXPIRED_REPLY_TTL:0);
                        else    sldns_buffer_write_u32(pkt, 
                                        data->rr_ttl[i]-timenow);
                        /* rrsig rdata cannot be compressed, perform 100+ byte
index c0c6ff5fd09f4759684dca7d736c99ccd1142128..fd04f9f6f071dd175e328e6eb977a676cedbe616 100644 (file)
@@ -79,8 +79,12 @@ extern time_t MAX_TTL;
 extern time_t MIN_TTL;
 /** Maximum Negative TTL that is allowed */
 extern time_t MAX_NEG_TTL;
+/** If we serve expired entries and prefetch them */
+extern int SERVE_EXPIRED;
 /** Time to serve records after expiration */
 extern time_t SERVE_EXPIRED_TTL;
+/** TTL to use for expired records */
+extern time_t SERVE_EXPIRED_REPLY_TTL;
 /** Negative cache time (for entries without any RRs.) */
 #define NORR_TTL 5 /* seconds */
 
index 4320f312d6f3def44fb71f047a43d19924473b67..927bf09a29d8f8372e19c700966c2cdef2a1e4fd 100644 (file)
@@ -61,8 +61,12 @@ time_t MAX_TTL = 3600 * 24 * 10; /* ten days */
 time_t MIN_TTL = 0;
 /** MAX Negative TTL, for SOA records in authority section */
 time_t MAX_NEG_TTL = 3600; /* one hour */
+/** If we serve expired entries and prefetch them */
+int SERVE_EXPIRED = 0;
 /** Time to serve records after expiration */
 time_t SERVE_EXPIRED_TTL = 0;
+/** TTL to use for expired records */
+time_t SERVE_EXPIRED_REPLY_TTL = 30;
 
 /** allocate qinfo, return 0 on error */
 static int
index 7f3feb1d0dd758bc5407bbe1519979f624231a82..4b0294f9724b03e05794d68022c330c6cd61108c 100644 (file)
@@ -40,6 +40,7 @@
  */
 
 #include "config.h"
+#include "util/data/msgparse.h"
 #include "util/data/packed_rrset.h"
 #include "util/data/dname.h"
 #include "util/storage/lookup3.h"
@@ -351,11 +352,11 @@ packed_rrset_copy_region(struct ub_packed_rrset_key* key,
        /* make TTLs relative - once per rrset */
        for(i=0; i<d->count + d->rrsig_count; i++) {
                if(d->rr_ttl[i] < now)
-                       d->rr_ttl[i] = 0;
+                       d->rr_ttl[i] = SERVE_EXPIRED?SERVE_EXPIRED_REPLY_TTL:0;
                else    d->rr_ttl[i] -= now;
        }
        if(d->ttl < now)
-               d->ttl = 0;
+               d->ttl = SERVE_EXPIRED?SERVE_EXPIRED_REPLY_TTL:0;
        else    d->ttl -= now;
        return ck;
 }
index f5da501de19be48cc09e211ff7d36619b3885caf..84d41cc84641d0f4f52236893bf7c3351cfd7947 100644 (file)
@@ -131,6 +131,7 @@ fptr_whitelist_comm_timer(void (*fptr)(void*))
        else if(fptr == &auth_xfer_timer) return 1;
        else if(fptr == &auth_xfer_probe_timer_callback) return 1;
        else if(fptr == &auth_xfer_transfer_timer_callback) return 1;
+       else if(fptr == &mesh_serve_expired_callback) return 1;
        return 0;
 }
 
@@ -619,3 +620,9 @@ int fptr_whitelist_inplace_cb_query_response(
        return 0;
 }
 
+int fptr_whitelist_serve_expired_lookup(serve_expired_lookup_func_type* fptr)
+{
+       if(fptr == &mesh_serve_expired_lookup)
+               return 1;
+       return 0;
+}
index 03c2b92b45aae3f5a313be9a5531cb185c030e81..cd331febb0701a7bdbe515620228ff5ce5222880 100644 (file)
@@ -377,6 +377,13 @@ int fptr_whitelist_inplace_cb_edns_back_parsed(
 int fptr_whitelist_inplace_cb_query_response(
        inplace_cb_query_response_func_type* fptr);
 
+/**
+ * Check function pointer whitelist for serve_expired_lookup func values.
+ * @param fptr: function pointer to check.
+ * @return false if not in whitelist.
+ */
+int fptr_whitelist_serve_expired_lookup(serve_expired_lookup_func_type* fptr);
+
 /** Due to module breakage by fptr wlist, these test app declarations
  * are presented here */
 /** 
index 1b9aed216c7b89812eba66bcc0b27173fca73225..fa89c647e3700085c32053d28080294f13f64dfe 100644 (file)
@@ -306,6 +306,17 @@ typedef int inplace_cb_edns_back_parsed_func_type(struct module_qstate* qstate,
 typedef int inplace_cb_query_response_func_type(struct module_qstate* qstate,
        struct dns_msg* response, int id, void* cb_args);
 
+/**
+ * Function called when looking for (expired) cached answers during the serve
+ * expired logic.
+ * Called as func(qstate, lookup_qinfo)
+ * Where:
+ *     qstate: the query state.
+ *     lookup_qinfo: the qinfo to lookup for.
+ */
+typedef struct dns_msg* serve_expired_lookup_func_type(
+       struct module_qstate* qstate, struct query_info* lookup_qinfo);
+
 /**
  * Module environment.
  * Services and data provided to the module.
@@ -571,6 +582,14 @@ struct sock_list {
 
 struct respip_action_info;
 
+/**
+ * Struct to hold relevant data for serve expired
+ */
+struct serve_expired_data {
+       struct comm_timer* timer;
+       serve_expired_lookup_func_type* get_cached_answer;
+};
+
 /**
  * Module state, per query.
  */
@@ -612,6 +631,8 @@ struct module_qstate {
        struct mesh_state* mesh_info;
        /** how many seconds before expiry is this prefetched (0 if not) */
        time_t prefetch_leeway;
+       /** serve expired data */
+       struct serve_expired_data* serve_expired_data;
 
        /** incoming edns options from the front end */
        struct edns_option* edns_opts_front_in;