diff --git a/.gitignore b/.gitignore
index 9d1018edfc2597741aa248aa06c2f097ecadaebe..f60a19afbaabaaabdeea3e7eeb687325243f4287 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,8 @@
 /src/Makefile.in
 /src/zscanner/Makefile
 /src/zscanner/Makefile.in
+/python/Makefile
+/python/Makefile.in
 /samples/Makefile
 /samples/Makefile.in
 /samples/knot.sample.conf
@@ -72,6 +74,7 @@
 /src/kdig
 /src/keymgr
 /src/khost
+/src/kjournalprint
 /src/knot1to2
 /src/knotc
 /src/knotd
diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py
index d09c0848c4dfb6dbde29326d7442462764449ce1..ef39348fc2a0bc32ae57017e03d45a14a6756df6 100644
--- a/.ycm_extra_conf.py
+++ b/.ycm_extra_conf.py
@@ -14,7 +14,7 @@ DIR = os.path.dirname(__file__)
 FLAGS = [
     '-std=gnu99',
     '-Wall', '-Wno-unused', '-Werror=implicit', '-Wno-#warnings',
-    '-DCONFIG_DIR=', '-DRUN_DIR=', '-DSTORAGE_DIR=',
+    '-DCONFIG_DIR=', '-DRUN_DIR=', '-DSTORAGE_DIR=', '-DPACKAGE_VERSION=',
 ]
 
 CONFIG_H = 'src/config.h'
diff --git a/Knot.files b/Knot.files
index 17c2571483af00a1725f80cbcd582a80ddf71ef1..74f4cd282146f8c4d21ba6fe3bdab2489acdd886 100644
--- a/Knot.files
+++ b/Knot.files
@@ -29,7 +29,6 @@ src/contrib/fnv/hash_64a.c
 src/contrib/fnv/longlong.h
 src/contrib/getline.c
 src/contrib/getline.h
-src/contrib/hat-trie/hat-trie.c
 src/contrib/hat-trie/hat-trie.h
 src/contrib/hhash.c
 src/contrib/hhash.h
@@ -50,6 +49,8 @@ src/contrib/openbsd/strlcpy.c
 src/contrib/openbsd/strlcpy.h
 src/contrib/print.c
 src/contrib/print.h
+src/contrib/qp-trie/qp.c
+src/contrib/qp-trie/qp.h
 src/contrib/sockaddr.c
 src/contrib/sockaddr.h
 src/contrib/string.c
@@ -80,8 +81,10 @@ src/dnssec/lib/dnssec/event.h
 src/dnssec/lib/dnssec/kasp.h
 src/dnssec/lib/dnssec/key.h
 src/dnssec/lib/dnssec/keyid.h
+src/dnssec/lib/dnssec/keystate.h
 src/dnssec/lib/dnssec/keystore.h
 src/dnssec/lib/dnssec/keytag.h
+src/dnssec/lib/dnssec/keyusage.h
 src/dnssec/lib/dnssec/list.h
 src/dnssec/lib/dnssec/nsec.h
 src/dnssec/lib/dnssec/random.h
@@ -94,7 +97,6 @@ src/dnssec/lib/event/action/nsec3_resalt.c
 src/dnssec/lib/event/action/zsk_rollover.c
 src/dnssec/lib/event/event.c
 src/dnssec/lib/event/keystate.c
-src/dnssec/lib/event/keystate.h
 src/dnssec/lib/event/utils.c
 src/dnssec/lib/event/utils.h
 src/dnssec/lib/kasp/dir/dir.c
@@ -136,6 +138,7 @@ src/dnssec/lib/keystore/keystore.c
 src/dnssec/lib/keystore/pkcs11.c
 src/dnssec/lib/keystore/pkcs8.c
 src/dnssec/lib/keystore/pkcs8_dir.c
+src/dnssec/lib/keyusage/keyusage.c
 src/dnssec/lib/list/list.c
 src/dnssec/lib/list/ucw_clists.h
 src/dnssec/lib/nsec/bitmap.c
@@ -185,6 +188,7 @@ src/dnssec/tests/keystore_pkcs11.c
 src/dnssec/tests/keystore_pkcs8.c
 src/dnssec/tests/keystore_pkcs8_dir.c
 src/dnssec/tests/keytag.c
+src/dnssec/tests/keyusage.c
 src/dnssec/tests/list.c
 src/dnssec/tests/nsec_bitmap.c
 src/dnssec/tests/nsec_hash.c
@@ -208,6 +212,8 @@ src/knot/common/process.c
 src/knot/common/process.h
 src/knot/common/ref.c
 src/knot/common/ref.h
+src/knot/common/stats.c
+src/knot/common/stats.h
 src/knot/conf/base.c
 src/knot/conf/base.h
 src/knot/conf/conf.c
@@ -216,6 +222,8 @@ src/knot/conf/confdb.c
 src/knot/conf/confdb.h
 src/knot/conf/confio.c
 src/knot/conf/confio.h
+src/knot/conf/migration.c
+src/knot/conf/migration.h
 src/knot/conf/scheme.c
 src/knot/conf/scheme.h
 src/knot/conf/tools.c
@@ -256,23 +264,35 @@ src/knot/events/log.c
 src/knot/events/log.h
 src/knot/events/replan.c
 src/knot/events/replan.h
-src/knot/modules/dnsproxy.c
-src/knot/modules/dnsproxy.h
-src/knot/modules/dnstap.c
-src/knot/modules/dnstap.h
-src/knot/modules/noudp.c
-src/knot/modules/noudp.h
-src/knot/modules/online_sign/module.c
-src/knot/modules/online_sign/module.h
+src/knot/journal/journal.c
+src/knot/journal/journal.h
+src/knot/journal/old_journal.c
+src/knot/journal/old_journal.h
+src/knot/journal/serialization.c
+src/knot/journal/serialization.h
+src/knot/modules/dnsproxy/dnsproxy.c
+src/knot/modules/dnsproxy/dnsproxy.h
+src/knot/modules/dnstap/dnstap.c
+src/knot/modules/dnstap/dnstap.h
+src/knot/modules/noudp/noudp.c
+src/knot/modules/noudp/noudp.h
 src/knot/modules/online_sign/nsec_next.c
 src/knot/modules/online_sign/nsec_next.h
-src/knot/modules/rosedb.c
-src/knot/modules/rosedb.h
-src/knot/modules/rosedb_tool.c
-src/knot/modules/synth_record.c
-src/knot/modules/synth_record.h
-src/knot/modules/whoami.c
-src/knot/modules/whoami.h
+src/knot/modules/online_sign/online_sign.c
+src/knot/modules/online_sign/online_sign.h
+src/knot/modules/rosedb/rosedb.c
+src/knot/modules/rosedb/rosedb.h
+src/knot/modules/rosedb/rosedb_tool.c
+src/knot/modules/rrl/functions.c
+src/knot/modules/rrl/functions.h
+src/knot/modules/rrl/rrl.c
+src/knot/modules/rrl/rrl.h
+src/knot/modules/stats/stats.c
+src/knot/modules/stats/stats.h
+src/knot/modules/synth_record/synth_record.c
+src/knot/modules/synth_record/synth_record.h
+src/knot/modules/whoami/whoami.c
+src/knot/modules/whoami/whoami.h
 src/knot/nameserver/axfr.c
 src/knot/nameserver/axfr.h
 src/knot/nameserver/chaos.c
@@ -306,12 +326,6 @@ src/knot/query/requestor.c
 src/knot/query/requestor.h
 src/knot/server/dthreads.c
 src/knot/server/dthreads.h
-src/knot/server/journal.c
-src/knot/server/journal.h
-src/knot/server/rrl.c
-src/knot/server/rrl.h
-src/knot/server/serialization.c
-src/knot/server/serialization.h
 src/knot/server/server.c
 src/knot/server/server.h
 src/knot/server/tcp-handler.c
@@ -488,6 +502,7 @@ src/utils/keymgr/options.h
 src/utils/khost/khost_main.c
 src/utils/khost/khost_params.c
 src/utils/khost/khost_params.h
+src/utils/kjournalprint/main.c
 src/utils/knot1to2/cf-lex.c
 src/utils/knot1to2/cf-lex.l
 src/utils/knot1to2/cf-parse.tab.c
@@ -530,35 +545,26 @@ src/zscanner/tests/processing.h
 src/zscanner/tests/tests.c
 src/zscanner/tests/tests.h
 src/zscanner/tests/zscanner-tool.c
+tests-fuzz/afl-loop.h
 tests-fuzz/packet.c
 tests-fuzz/packet_libfuzzer.c
 tests-fuzz/wrap/server.c
 tests-fuzz/wrap/tcp-handler.c
 tests-fuzz/wrap/udp-handler.c
-tests/acl.c
-tests/changeset.c
-tests/conf.c
-tests/conf_tools.c
-tests/confdb.c
-tests/confio.c
 tests/contrib/test_base32hex.c
 tests/contrib/test_base64.c
 tests/contrib/test_endian.c
-tests/contrib/test_hat-trie.c
 tests/contrib/test_heap.c
 tests/contrib/test_hhash.c
 tests/contrib/test_net.c
 tests/contrib/test_net_shortwrite.c
+tests/contrib/test_qp-trie.c
 tests/contrib/test_sockaddr.c
 tests/contrib/test_string.c
 tests/contrib/test_strtonum.c
 tests/contrib/test_time.c
 tests/contrib/test_wire.c
 tests/contrib/test_wire_ctx.c
-tests/dthreads.c
-tests/fake_server.h
-tests/fdset.c
-tests/journal.c
 tests/libknot/test_control.c
 tests/libknot/test_cookies-client.c
 tests/libknot/test_cookies-opt.c
@@ -578,21 +584,31 @@ tests/libknot/test_tsig.c
 tests/libknot/test_yparser.c
 tests/libknot/test_ypscheme.c
 tests/libknot/test_yptrafo.c
-tests/modules/online_sign.c
-tests/node.c
-tests/process_query.c
-tests/query_module.c
-tests/requestor.c
-tests/rrl.c
-tests/server.c
+tests/modules/test_online_sign.c
+tests/modules/test_rrl.c
+tests/test_acl.c
+tests/test_changeset.c
+tests/test_conf.c
 tests/test_conf.h
+tests/test_conf_tools.c
+tests/test_confdb.c
+tests/test_confio.c
+tests/test_dthreads.c
+tests/test_fdset.c
+tests/test_journal.c
+tests/test_node.c
+tests/test_process_query.c
+tests/test_query_module.c
+tests/test_requestor.c
+tests/test_server.c
+tests/test_server.h
+tests/test_worker_pool.c
+tests/test_worker_queue.c
+tests/test_zone-tree.c
+tests/test_zone-update.c
+tests/test_zone_events.c
+tests/test_zone_serial.c
+tests/test_zone_timers.c
+tests/test_zonedb.c
 tests/utils/test_cert.c
 tests/utils/test_lookup.c
-tests/worker_pool.c
-tests/worker_queue.c
-tests/zone_events.c
-tests/zone_serial.c
-tests/zone_timers.c
-tests/zone_update.c
-tests/zonedb.c
-tests/ztree.c
diff --git a/Makefile.am b/Makefile.am
index f6f6962f9d61c8b3fe3c2878a104b4a6b957eb0c..88d86ad861fc3f889679603c20f3163c8dd663f4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
 ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = libtap src tests tests-fuzz samples doc
+SUBDIRS = libtap src tests tests-fuzz python samples doc
 
 .PHONY: singlehtml install-singlehtml
 singlehtml install-singlehtml:
diff --git a/NEWS b/NEWS
index b78af82acc2a1a9ef378d18086356743f5b6f903..230aafba0f16a0b4b37c86ec1f238c8cf24f76be 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,57 @@
-Knot DNS 2.4.0-dev
-==================
+Knot DNS 2.4.0-dev (unreleased)
+===============================
+
+Bugfixes:
+--------
+ - Schedule zone refresh after load only if not already scheduled
+ - Purge the timers together with zone-purge
+ - Don't preserve CD flag in the answers
+ - Fix incorrect type bitmap in NSEC
+ - Dump DNSSEC related records also if DNSSEC is not active
+ - Preserve bootstrap_retry interval after zone reload
+ - Don't set SO_REUSEPORT on the TCP socket as SO_REUSEPORT on TCP
+   is buggy
+ - Allow deleting non-apex DNSKEY and NSEC3PARAM records via DDNS
+
+Improvements:
+-------------
+ - Lower memory consumption when used with many zones due hat-trie
+   replacement with qp-trie in zone-tree
+ - Improve the event scheduler
+ - Store the XFER timer between restarts
+ - Print all zone names in the FQDN format
+ - Improve and simplify modules interface
+
+Features:
+---------
+ - New unified LMDB-based zone journal
+ - Add kjournalprint utility
+ - New mod-stats module for detailed server metrics
+ - Automatically delete retired DNSSEC keys
+
+Knot DNS 2.3.1 (2016-10-07)
+===========================
+
+Bugfixes:
+---------
+ - Missing glue records in some responses
+ - Knsupdate prompt printing on non-terminal
+ - Mismatch between configuration policy item names and documentation
+ - Segfault on OS X (Sierra)
+
+Improvements:
+-------------
+ - Significant speed-up of conf-commit and conf-diff operations (in most cases)
+ - New EDNS Client Subnet libknot API
+ - Better semantic-checks error messages
+
+Features:
+---------
+ - Print TLS certificate hierarchy in kdig verbose mode
+ - New +subnet alias for +client
+ - New mod-whoami and mod-noudp modules
+ - New zone-purge control command
+ - New log-queries and log-responses options for mod-dnstap
 
 Knot DNS 2.3.0 (2016-08-09)
 ===========================
diff --git a/README b/README
index 8bb0c1e064ca7f83746d7c5203dc5e8f6ae80dff..4a63572b094a4b0beb7fe87f1c84bb70f6ca95c2 100644
--- a/README
+++ b/README
@@ -4,6 +4,7 @@ Dependencies
 Knot DNS has several dependencies:
 * libtool
 * autoconf > 2.65
+* pkg-config
 * liburcu >= 0.5.4
 * gnutls >= 3.0
 * jansson >= 2.3
@@ -40,7 +41,7 @@ $ sudo apt-get upgrade
 
 Install prerequisites:
 $ sudo apt-get install \
-  libtool autoconf make liburcu-dev libgnutls28-dev libjansson-dev libedit-dev
+  libtool autoconf make pkg-config liburcu-dev libgnutls28-dev libjansson-dev libedit-dev
 
 Install optional packages to override embedded libraries:
 $ sudo apt-get install liblmdb-dev
@@ -51,20 +52,20 @@ $ sudo apt-get install libcap-ng-dev libsystemd-dev libidn11-dev protobuf-c-comp
 Fedora like distributions
 -------------------------
 Update the system:
-# yum upgrade
+# dnf upgrade
 
 Install basic development tools:
-# yum install @buildsys-build
+# dnf install @buildsys-build
 
 Install prerequisites:
-# yum install \
-  libtool autoconf automake userspace-rcu-devel gnutls-devel jansson-devel libedit-devel
+# dnf install \
+  libtool autoconf pkgconfig automake userspace-rcu-devel gnutls-devel jansson-devel libedit-devel
 
 Install optional packages to override embedded libraries:
-# yum install lmdb-devel
+# dnf install lmdb-devel
 
 Install optional packages:
-# yum install libcap-ng-devel systemd-devel libidn-devel protobuf-c-devel fstrm-devel
+# dnf install libcap-ng-devel systemd-devel libidn-devel protobuf-c-devel fstrm-devel
 
 When compiling on RHEL based system, the Fedora EPEL repository has to be
 enabled. Also for RHEL 6, forward compatibility package gnutls30-devel
diff --git a/configure.ac b/configure.ac
index 3f0f21628b3d264b799127c290744e137e591990..34c2916aad80fe9b07c994a02d58e80102dc8f78 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,7 +28,7 @@ AC_CONFIG_FILES([src/libknot/version.h
 
 # Updating version info
 # https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
-AC_SUBST([libknot_VERSION_INFO],["-version-info 3:0:0"])
+AC_SUBST([libknot_VERSION_INFO],["-version-info 4:0:0"])
 AC_SUBST([libdnssec_VERSION_INFO],["-version-info 2:0:0"])
 AC_SUBST([libzscanner_VERSION_INFO],["-version-info 1:0:0"])
 
@@ -123,27 +123,21 @@ PKG_CHECK_MODULES([gnutls], [gnutls >= 3.3 nettle], [
 # JSON for DNSSEC status storage
 PKG_CHECK_MODULES([jansson], [jansson >= 2.3])
 
-# recvmmsg() (valgrind doesn't support it, so disable for debugging)
-# The check for struct mmsghdr is required when libc doesn't have an API but the function links
 AC_ARG_ENABLE([recvmmsg],
-    AS_HELP_STRING([--enable-recvmmsg=yes|no], [enable recvmmsg() network API under Linux (kernel support required) (set to 'no' if you have trouble running server under valgrind) [default=yes]]),
-    [case "${enableval}" in
-      yes)
-          AC_CHECK_FUNCS([sendmmsg])
-          AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]], [[struct mmsghdr v; recvmmsg(0,0,0,0,0);]])],
-          [AC_DEFINE(HAVE_RECVMMSG, 1, [Define if struct mmsghdr and recvmmsg() exists.])])
-          ;;
-      no)
-          ;;
-      *)
-          AC_MSG_ERROR([bad value ${enableval} for --enable-recvmmsg])
-          ;;
-    esac],
-    [
-      AC_CHECK_FUNCS([sendmmsg])
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]], [[struct mmsghdr v; recvmmsg(0,0,0,0,0);]])],
-      [AC_DEFINE(HAVE_RECVMMSG, 1, [Define if struct mmsghdr and recvmmsg() exists.])])
-    ])
+   AS_HELP_STRING([--enable-recvmmsg=auto|yes|no], [enable recvmmsg() network API [default=auto]]),
+   [], [enable_recvmmsg=auto])
+
+AS_CASE([$enable_recvmmsg],
+   [auto|yes],[
+      AC_CHECK_FUNC([recvmmsg],
+                    [AC_CHECK_FUNC([sendmmsg],[enable_recvmmsg=yes],[enable_recvmmsg=no])],
+                    [enable_recvmmsg=no])],
+   [no],[],
+   [*], [AC_MSG_ERROR([Invalid value of --enable-recvmmsg.]
+ )])
+
+AS_IF([test "$enable_recvmmsg" = yes],[
+   AC_DEFINE([ENABLE_RECVMMSG], [1], [Use recvmmsg().])])
 
 AC_ARG_ENABLE([reuseport],
     AS_HELP_STRING([--enable-reuseport=auto|yes|no], [enable Linux SO_REUSEPORT support [default=auto]]),
@@ -178,6 +172,8 @@ AS_IF([test "$enable_reuseport" = yes],[
    AC_DEFINE([ENABLE_REUSEPORT], [1], [Use SO_REUSEPORT.])])
 
 AX_CHECK_COMPILE_FLAG("-fpredictive-commoning", [CFLAGS="$CFLAGS -fpredictive-commoning"], [], "-Werror")
+AX_CHECK_LINK_FLAG(["-Wl,--exclude-libs,ALL"], [ldflag_exclude_libs="-Wl,--exclude-libs,ALL"], [ldflag_exclude_libs=""], "")
+AC_SUBST([LDFLAG_EXCLUDE_LIBS], $ldflag_exclude_libs)
 
 # Default directories
 run_dir="${localstatedir}/run/knot"
@@ -353,13 +349,14 @@ AS_IF([test "$with_lmdb" != "no"],[
     ])
 
 AS_IF([test "$have_lmdb" != "no"],[
-    AC_SUBST([lmdb_CFLAGS])
     AC_SUBST([lmdb_LIBS])
     enable_lmdb=shared
     ],[
     enable_lmdb=embedded
+    lmdb_CFLAGS='-I$(srcdir)/contrib/lmdb'
     ])
-AM_CONDITIONAL([HAVE_LMDB], test "$have_lmdb" != "no")
+AM_CONDITIONAL([HAVE_LMDB], test "$enable_lmdb" = "shared")
+AC_SUBST([lmdb_CFLAGS])
 
 # LMDB mapping sizes
 conf_mapsize_default=500
@@ -534,6 +531,7 @@ AC_CONFIG_FILES([Makefile
                  tests/Makefile
                  tests-fuzz/Makefile
                  samples/Makefile
+                 python/Makefile
                  src/Makefile
                  src/contrib/dnstap/Makefile
                  src/dnssec/Makefile
@@ -572,6 +570,7 @@ AC_MSG_RESULT([
     Knot DNS utils:         ${enable_utilities}
     Knot DNS documentation: ${enable_documentation}
 
+    Use recvmmsg:        ${enable_recvmmsg}
     Use SO_REUSEPORT:    ${enable_reuseport}
     Fast zone parser:    ${enable_fastparser}
     Utilities with IDN:  ${with_libidn}
diff --git a/doc/.gitignore b/doc/.gitignore
index 8eb82f2cfd31852fd6d8181e2b576d38ab0c61af..abcf6fdb39dfbc4a43abe6f4cc993e9140908f7a 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -4,6 +4,7 @@
 /man/kdig.1
 /man/keymgr.8
 /man/khost.1
+/man/kjournalprint.1
 /man/knot.conf.5
 /man/knot1to2.1
 /man/knotc.8
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 1a14126a49f26bdc5b376e2bc6dce1c45ef89581..37c169b3b76206ffe2b23efccba67bbdb7db1056 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,5 +1,5 @@
-MANPAGES_IN = man/knot.conf.5in man/knotc.8in man/knotd.8in man/kdig.1in man/khost.1in man/knsupdate.1in man/knot1to2.1in man/knsec3hash.1in man/keymgr.8in man/kzonecheck.1in
-MANPAGES_RST = reference.rst man_knotc.rst man_knotd.rst man_kdig.rst man_khost.rst man_knsupdate.rst man_knot1to2.rst man_knsec3hash.rst man_keymgr.rst man_kzonecheck.rst
+MANPAGES_IN = man/knot.conf.5in man/knotc.8in man/knotd.8in man/kdig.1in man/khost.1in man/kjournalprint.1in man/knsupdate.1in man/knot1to2.1in man/knsec3hash.1in man/keymgr.8in man/kzonecheck.1in
+MANPAGES_RST = reference.rst man_knotc.rst man_knotd.rst man_kdig.rst man_khost.rst man_kjournalprint.rst man_knsupdate.rst man_knot1to2.rst man_knsec3hash.rst man_keymgr.rst man_kzonecheck.rst
 
 EXTRA_DIST = \
 	conf.py		\
@@ -62,7 +62,7 @@ man_MANS += man/knot.conf.5 man/knotc.8 man/knotd.8
 endif # HAVE_DAEMON
 
 if HAVE_UTILS
-man_MANS += man/kdig.1 man/khost.1 man/knsupdate.1 man/knot1to2.1 man/knsec3hash.1 man/keymgr.8 man/kzonecheck.1
+man_MANS += man/kdig.1 man/khost.1 man/kjournalprint.1 man/knsupdate.1 man/knot1to2.1 man/knsec3hash.1 man/keymgr.8 man/kzonecheck.1
 endif # HAVE_UTILS
 
 man/knot.conf.5: man/knot.conf.5in
@@ -70,6 +70,7 @@ man/knotc.8: man/knotc.8in
 man/knotd.8: man/knotd.8in
 man/kdig.1: man/kdig.1in
 man/khost.1: man/khost.1in
+man/kjournalprint.1: man/kjournalprint.1in
 man/knsupdate.1: man/knsupdate.1in
 man/knot1to2.1: man/knot1to2.1in
 man/knsec3hash.1: man/knsec3hash.1in
diff --git a/doc/conf.py b/doc/conf.py
index 0be8a3157c1e36740b3b4ec5e3bff96cacaaeb50..a51b9ebc636a86cfde1a5795ab11161296302973 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -13,6 +13,8 @@
 
 import sys, os, time
 
+sys.setrecursionlimit(1500)
+
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
@@ -220,6 +222,7 @@ man_pages = [
     ('man_kdig', 'kdig', 'Advanced DNS lookup utility', author, 1),
     ('man_keymgr', 'keymgr', ' DNSSEC key management utility', author, 8),
     ('man_khost', 'khost', 'Simple DNS lookup utility', author, 1),
+    ('man_kjournalprint', 'kjournalprint', 'Knot DNS journal print utility', author, 1),
     ('man_knot1to2', 'knot1to2', 'Knot DNS configuration conversion utility', author, 1),
     ('man_knotc', 'knotc', 'Knot DNS control utility', author, 8),
     ('man_knotd', 'knotd', 'Knot DNS server daemon', author, 8),
diff --git a/doc/configuration.rst b/doc/configuration.rst
index c60939a7cbf08acc5ae700af40357d3c27cbf0f6..e422ca426438f7f2fca1c73f2e08845bac8d52b7 100644
--- a/doc/configuration.rst
+++ b/doc/configuration.rst
@@ -46,8 +46,7 @@ Zone templates
 ==============
 
 A zone template allows a single zone configuration to be shared among several zones.
-Each template option can be explicitly overridden in zone-specific configurations.
-A ``default`` template identifier is reserved for the default template::
+The ``default`` template identifier is reserved for the default template::
 
     template:
       - id: default
@@ -58,6 +57,7 @@ A ``default`` template identifier is reserved for the default template::
         storage: /var/lib/knot/signed
         dnssec-signing: on
         semantic-checks: on
+        master: [master1, master2]
 
       - id: slave
         storage: /var/lib/knot/slave
@@ -70,6 +70,7 @@ A ``default`` template identifier is reserved for the default template::
 
       - domain: example.cz
         template: signed
+        master: master3          # Override masters to just master3
 
       - domain: example1.eu
         template: slave
@@ -79,37 +80,59 @@ A ``default`` template identifier is reserved for the default template::
         template: slave
         master: master2
 
+.. NOTE::
+   Each template option can be explicitly overridden in zone-specific configuration.
+
 Access control list (ACL)
 =========================
 
 An ACL list specifies which remotes are allowed to send the server a specific
 request. A remote can be a single IP address or a network subnet. Also a TSIG
-key can be assigned (see :doc:`keymgr <man_keymgr>` how to generate a TSIG key)::
+key can be assigned (see :doc:`keymgr <man_keymgr>` how to generate a TSIG key).
 
-    key:
-      - id: key1
-        algorithm: hmac-md5
-        secret: Wg==
+With no ACL rule, all the actions are denied for the zone. Each ACL rule
+can allow one or more actions for given address/subnet/TSIG, or deny them.
+
+The rule precendence, if multiple rules match (e.g. overlapping address ranges),
+is not for stricter or more specific rules. In any case, just the first -- in the
+order of rules in zone or template acl configuration item, not in the order of
+declarations in acl section -- matching rule applies and the rest is ignored.
+
+See following examples and :ref:`ACL section`.::
 
     acl:
       - id: address_rule
-        address: [2001:db8::1, 192.168.2.0/24] # Allowed IP address list
-        action: [transfer, update]  # Allow zone transfers and updates
+        address: [2001:db8::1, 192.168.2.0/24]
+        action: transfer
 
-      - id: deny_rule             # Negative match rule
+      - id: deny_rule
         address: 192.168.2.100
         action: transfer
-        deny: on                  # The request is denied
+        deny: on
+
+    zone:
+      - domain: acl1.example.com.
+        acl: [deny_rule, address_rule] # deny_rule first here to take precendence
+
+::
+
+    key:
+      - id: key1
+        algorithm: hmac-md5
+        secret: Wg==
+
+    acl:
+      - id: deny_all
+        address: 192.168.3.0/24
+        deny: on # no action specified and deny on implies denial of all actions
 
       - id: key_rule
         key: key1                 # Access based just on TSIG key
-        action: transfer
-
-These rules can then be referenced from a zone :ref:`zone_acl`::
+        action: [transfer, notify]
 
     zone:
-      - domain: example.com
-        acl: [address_rule, deny_rule, key_rule]
+      - domain: acl2.example.com
+        acl: [deny_all, key_rule]
 
 Slave zone
 ==========
@@ -243,31 +266,6 @@ processed::
         file: example.com.zone
         acl: update_acl
 
-Response rate limiting
-======================
-
-Response rate limiting (RRL) is a method to combat DNS reflection amplification
-attacks. These attacks rely on the fact that source address of a UDP query
-can be forged, and without a worldwide deployment of `BCP38
-<https://tools.ietf.org/html/bcp38>`_, such a forgery cannot be prevented.
-An attacker can use a DNS server (or multiple servers) as an amplification
-source and can flood a victim with a large number of unsolicited DNS responses.
-
-The RRL lowers the amplification factor of these attacks by sending some of
-the responses as truncated or by dropping them altogether.
-
-You can enable RRL by setting the :ref:`server_rate-limit` option in the
-:ref:`server section<Server section>`. The option controls how many responses
-per second are permitted for each flow. Responses exceeding this rate are
-limited. The option :ref:`server_rate-limit-slip` then configures how many
-limited responses are sent as truncated (slip) instead of being dropped.
-
-::
-
-    server:
-        rate-limit: 200     # Allow 200 resp/s for each flow
-        rate-limit-slip: 2  # Every other response slips
-
 .. _dnssec:
 
 Automatic DNSSEC signing
@@ -364,8 +362,7 @@ with manual key management flag has to be set::
       dnssec-policy: manual
 
 To generate signing keys, use the :doc:`keymgr <man_keymgr>` utility.
-Let's use the Single-Type Signing scheme with two algorithms, which is
-a scheme currently not supported by the automatic key management. Run:
+Let's use the Single-Type Signing scheme with two algorithms. Run:
 
 .. code-block:: console
 
@@ -445,7 +442,7 @@ of the limitations will be hopefully removed in the near future.
 - Automatic key management:
 
   - Only one DNSSEC algorithm can be used per zone.
-  - Single-Type Signing scheme is not supported.
+  - CSK rollover with Single-Type Signing scheme is not implemented.
   - ZSK rollover always uses key pre-publish method (actually a feature).
   - KSK rollover is not implemented.
 
@@ -460,516 +457,14 @@ of the limitations will be hopefully removed in the near future.
   - Legacy key export is not implemented.
   - DS record export is not implemented.
 
-Query modules
-=============
-
-Knot DNS supports configurable query modules that can alter the way
-queries are processed. The concept is quite simple – each query
-requires a finite number of steps to be resolved. We call this set of
-steps a *query plan*, an abstraction that groups these steps into
-several stages.
-
-* Before-query processing
-* Answer, Authority, Additional records packet sections processing
-* After-query processing
-
-For example, processing an Internet-class query needs to find an
-answer. Then based on the previous state, it may also append an
-authority SOA or provide additional records. Each of these actions
-represents a 'processing step'. Now, if a query module is loaded for a
-zone, it is provided with an implicit query plan which can be extended
-by the module or even changed altogether.
-
-Each module is configured in the corresponding module section and is
-identified for the subsequent usage. Then the identifier is referenced
-in the form of ``module_name/module_id`` through a zone/template :ref:`zone_module`
-option or through the *default* template :ref:`template_global-module` option
-if it is used for all queries.
-
-``dnstap`` – dnstap-enabled query logging
------------------------------------------
-
-A module for query and response logging based on dnstap_ library.
-You can capture either all or zone-specific queries and responses; usually
-you want to do the former. The configuration comprises only a
-:ref:`mod-dnstap_sink` path parameter, which can be either a file or
-a UNIX socket::
-
-   mod-dnstap:
-     - id: capture_all
-       sink: /tmp/capture.tap
-
-   template:
-     - id: default
-       global-module: mod-dnstap/capture_all
-
-.. NOTE::
-   To be able to use a Unix socket you need an external program to create it.
-   Knot DNS connects to it as a client using the libfstrm library. It operates
-   exactly like syslog. See `here
-   <https://www.nlnetlabs.nl/bugs-script/show_bug.cgi?id=741#c10>`_ for
-   more details.
-
-.. NOTE::
-   Dnstap log files can also be created or read using ``kdig``.
-
-.. _dnstap: http://dnstap.info/
-
-``synth-record`` – Automatic forward/reverse records
-----------------------------------------------------
-
-This module is able to synthesize either forward or reverse records for
-a given prefix and subnet.
-
-Records are synthesized only if the query can't be satisfied from the zone.
-Both IPv4 and IPv6 are supported.
-
-Automatic forward records
--------------------------
-
-Example::
-
-   mod-synth-record:
-     - id: test1
-       type: forward
-       prefix: dynamic-
-       ttl: 400
-       network: 2620:0:b61::/52
-
-   zone:
-     - domain: test.
-       file: test.zone # Must exist
-       module: mod-synth-record/test1
-
-Result:
-
-.. code-block:: console
-
-   $ kdig AAAA dynamic-2620-0000-0b61-0100-0000-0000-0000-0001.test.
-   ...
-   ;; QUESTION SECTION:
-   ;; dynamic-2620-0000-0b61-0100-0000-0000-0000-0001.test. IN AAAA
-
-   ;; ANSWER SECTION:
-   dynamic-2620-0000-0b61-0100-0000-0000-0000-0001.test. 400 IN AAAA 2620:0:b61:100::1
-
-You can also have CNAME aliases to the dynamic records, which are going to be
-further resolved:
-
-.. code-block:: console
-
-   $ kdig AAAA alias.test.
-   ...
-   ;; QUESTION SECTION:
-   ;; alias.test. IN AAAA
-
-   ;; ANSWER SECTION:
-   alias.test. 3600 IN CNAME dynamic-2620-0000-0b61-0100-0000-0000-0000-0002.test.
-   dynamic-2620-0000-0b61-0100-0000-0000-0000-0002.test. 400 IN AAAA 2620:0:b61:100::2
-
-Automatic reverse records
--------------------------
-
-Example::
-
-   mod-synth-record:
-     - id: test2
-       type: reverse
-       prefix: dynamic-
-       origin: test
-       ttl: 400
-       network: 2620:0:b61::/52
-
-   zone:
-     - domain: 1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa.
-       file: 1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa.zone # Must exist
-       module: mod-synth-record/test2
-
-Result:
-
-.. code-block:: console
-
-   $ kdig -x 2620:0:b61::1
-   ...
-   ;; QUESTION SECTION:
-   ;; 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa. IN PTR
-
-   ;; ANSWER SECTION:
-   1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa. 400 IN PTR
-                                  dynamic-2620-0000-0b61-0000-0000-0000-0000-0001.test.
-
-``dnsproxy`` – Tiny DNS proxy
------------------------------
-
-The module catches all unsatisfied queries and forwards them to the
-indicated server for resolution, i.e. a tiny DNS proxy. There are several
-uses of this feature:
-
-* A substitute public-facing server in front of the real one
-* Local zones (poor man's "views"), rest is forwarded to the public-facing server
-* etc.
-
-.. NOTE::
-   The module does not alter the query/response as the resolver would,
-   and the original transport protocol is kept as well.
-
-The configuration is straightforward and just a single remote server is
-required::
-
-   remote:
-     - id: hidden
-       address: 10.0.1.1
-
-   mod-dnsproxy:
-     - id: default
-       remote: hidden
-
-   template:
-     - id: default
-       global-module: mod-dnsproxy/default
-
-   zone:
-     - domain: local.zone
-
-When clients query for anything in the ``local.zone``, they will be
-responded to locally. The rest of the requests will be forwarded to the
-specified server (``10.0.1.1`` in this case).
-
-``rosedb`` – Static resource records
-------------------------------------
-
-The module provides a mean to override responses for certain queries before
-the record is searched in the available zones. The module comes with the
-``rosedb_tool`` tool used to manipulate the database of static records.
-Neither the tool nor the module are enabled by default, recompile with
-the ``--enable-rosedb`` configuration flag to enable them.
-
-For example, let's suppose we have a database of following records:
-
-.. code-block:: none
-
-   myrecord.com.      3600 IN A 127.0.0.1
-   www.myrecord.com.  3600 IN A 127.0.0.2
-   ipv6.myrecord.com. 3600 IN AAAA ::1
-
-And we query the nameserver with the following:
-
-.. code-block:: console
-
-   $ kdig IN A myrecord.com
-     ... returns NOERROR, 127.0.0.1
-   $ kdig IN A www.myrecord.com
-     ... returns NOERROR, 127.0.0.2
-   $ kdig IN A stuff.myrecord.com
-     ... returns NOERROR, 127.0.0.1
-   $ kdig IN AAAA myrecord.com
-     ... returns NOERROR, NODATA
-   $ kdig IN AAAA ipv6.myrecord.com
-     ... returns NOERROR, ::1
-
-An entry in the database matches anything at the same or a lower domain
-level, i.e. 'myrecord.com' matches 'a.a.myrecord.com' as well.
-This can be utilized to create catch-all entries.
-
-You can also add authority information for the entries, provided you create
-SOA + NS records for a name, like so:
-
-.. code-block:: none
-
-   myrecord.com.     3600 IN SOA master host 1 3600 60 3600 3600
-   myrecord.com.     3600 IN NS ns1.myrecord.com.
-   myrecord.com.     3600 IN NS ns2.myrecord.com.
-   ns1.myrecord.com. 3600 IN A 127.0.0.1
-   ns2.myrecord.com. 3600 IN A 127.0.0.2
-
-In this case, the responses will:
-
-1. Be authoritative (AA flag set)
-2. Provide an authority section (SOA + NS)
-3. Be NXDOMAIN if the name is found *(i.e. the 'IN AAAA myrecord.com' from
-   the example)*, but not the RR type *(this is to allow the synthesis of
-   negative responses)*
-
-The SOA record applies only to the 'myrecord.com.', not to any other
-record (not even those of its subdomains). From this point of view, all records
-in the database are unrelated and not hierarchical. The idea is to provide
-subtree isolation for each entry.*
-
-In addition, the module is able to log matching queries via remote syslog if
-you specify a syslog address endpoint and an optional string code.
-
-Here is an example on how to use the module:
-
-* Create the entries in the database:
-
-  .. code-block:: console
-
-   $ mkdir /tmp/static_rrdb
-   $ # No logging
-   $ rosedb_tool /tmp/static_rrdb add myrecord.com. A 3600 "127.0.0.1" "-" "-"
-   $ # Logging as 'www_query' to Syslog at 10.0.0.1
-   $ rosedb_tool /tmp/static_rrdb add www.myrecord.com. A 3600 "127.0.0.1" \
-                                                    "www_query" "10.0.0.1"
-   $ # Logging as 'ipv6_query' to Syslog at 10.0.0.1
-   $ rosedb_tool /tmp/static_rrdb add ipv6.myrecord.com. AAAA 3600 "::1" \
-                                                 "ipv6_query" "10.0.0.1"
-   $ # Verify settings
-   $ rosedb_tool /tmp/static_rrdb list
-   www.myrecord.com.       A RDATA=10B     www_query       10.0.0.1
-   ipv6.myrecord.com.      AAAA RDATA=22B  ipv6_query      10.0.0.1
-   myrecord.com.           A RDATA=10B     -               -
-
-.. NOTE::
-   The database may be modified later on while the server is running.
-
-* Configure the query module::
-
-   mod-rosedb:
-     - id: default
-       dbdir: /tmp/static_rrdb
-
-   template:
-     - id: default
-       global-module: mod-rosedb/default
-
-The module accepts just one parameter – the path to the directory where
-the database will be stored.
-
-* Start the server:
-
-  .. code-block:: console
-
-   $ knotd -c knot.conf
-
-* Verify the running instance:
-
-  .. code-block:: console
-
-   $ kdig @127.0.0.1#6667 A myrecord.com
-
-``online-sign`` — Online DNSSEC signing
----------------------------------------
-
-The module provides online DNSSEC signing. Instead of pre-computing the zone
-signatures when the zone is loaded into the server or instead of loading an
-externally signed zone, the signatures are computed on-the-fly during
-answering.
-
-The main purpose of the module is to enable authenticated responses with
-zones which use other dynamic module (e.g., automatic reverse record
-synthesis) because these zones cannot be pre-signed. However, it can be also
-used as a simple signing solution for zones with low traffic and also as
-a protection against zone content enumeration (zone walking).
-
-In order to minimize the number of computed signatures per query, the module
-produces a bit different responses from the responses that would be sent if
-the zone was pre-signed. Still, the responses should be perfectly valid for
-a DNSSEC validating resolver.
-
-Differences from statically signed zones:
-
-* The NSEC records are constructed as Minimally Covering NSEC Records
-  (see Appendix A in :rfc:`7129`). Therefore the generated domain names cover
-  the complete domain name space in the zone's authority.
-
-* NXDOMAIN responses are promoted to NODATA responses. The module proves
-  that the query type does not exist rather than that the domain name does not
-  exist.
-
-* Domain names matching a wildcard are expanded. The module pretends and proves
-  that the domain name exists rather than proving a presence of the wildcard.
-
-Records synthesized by the module:
-
-* DNSKEY record is synthesized in the zone apex and includes public key
-  material for the active signing key.
-
-* NSEC records are synthesized as needed.
-
-* RRSIG records are synthesized for authoritative content of the zone.
-
-How to use the online signing module:
-
-* First add the zone into the server's KASP database and generate a key to be
-  used for signing:
-
-  .. code-block:: console
-
-   $ cd /path/to/kasp
-   $ keymgr zone add example.com
-   $ keymgr zone key generate example.com algorithm ecdsap256sha256 size 256
-
-* Enable the module in server configuration and hook it to the zone::
-
-   mod-online-sign:
-     - id: default
-
-   zone:
-     - domain: example.com
-       module: mod-online-sign/default
-       dnssec-signing: false
-
-* Make sure the zone is not signed and also that the automatic signing is
-  disabled. All is set, you are good to go. Reload (or start) the server:
-
-  .. code-block:: console
-
-   $ knotc reload
-
-The following example stacks the online signing with reverse record synthesis
-module::
-
- mod-online-sign:
-   - id: default
-
- mod-synth-record:
-   - id: lan-forward
-     type: forward
-     prefix: ip-
-     ttl: 1200
-     network: 192.168.100.0/24
-
- template:
-   - id: default
-     dnssec-signing: false
-
- zone:
-   - domain: corp.example.net
-     module: mod-synth-record/lan-forward
-     module: mod-online-sign/default
+.. _dnssec-keyusage:
 
-Known issues:
+DNSSEC keys used by multiple zones 
+----------------------------------
 
-* The delegations are not signed correctly.
+Using same key for multiple zones with automatic key management is possible. 
+However, all zones must be listed in keyusage (keys directory) or they will be deleted,
+when they retire in any zone.
 
-* Some CNAME records are not signed correctly.
-
-Limitations:
-
-* Only a Single-Type Signing scheme is supported.
-
-* Only one active signing key can be used.
-
-* Key rollover is not possible.
-
-* The NSEC records may differ for one domain name if queried for different
-  types. This is an implementation shortcoming as the dynamic modules
-  cooperate loosely. Possible synthesis of a type by other module cannot
-  be predicted. This dissimilarity should not affect response validation,
-  even with validators performing `aggressive negative caching
-  <https://datatracker.ietf.org/doc/draft-fujiwara-dnsop-nsec-aggressiveuse/>`_.
-
-* The NSEC proofs will work well with other dynamic modules only if the
-  modules synthesize only A and AAAA records. If synthesis of other type
-  is required, please, report this information to Knot DNS developers.
-
-``whoami`` — whoami module
---------------------------
-
-The module synthesizes an A or AAAA record containing the query source IP address,
-at the apex of the zone being served. It makes sure to allow Knot DNS to generate
-cacheable negative responses, and to allow fallback to extra records defined in the
-underlying zone file. The TTL of the synthesized record is copied from
-the TTL of the SOA record in the zone file.
-
-Because a DNS query for type A or AAAA has nothing to do with whether
-the query occurs over IPv4 or IPv6, this module requires a special
-zone configuration to support both address families. For A queries, the
-underlying zone must have a set of nameservers that only have IPv4
-addresses, and for AAAA queries, the underlying zone must have a set of
-nameservers that only have IPv6 addresses.
-
-To enable this module, you need to add something like the following to
-the Knot DNS configuration file::
-
-    mod-whoami:
-      - id: default
-
-    zone:
-      - domain: whoami.domain.example
-        file: "/path/to/whoami.domain.example"
-        module: [mod-whoami/default]
-
-    zone:
-      - domain: whoami6.domain.example
-        file: "/path/to/whoami6.domain.example"
-        module: [mod-whoami/default]
-
-The whoami.domain.example zone file example:
-
-  .. code-block:: none
-
-    $TTL 1
-
-    @       SOA     (
-                            whoami.domain.example.          ; MNAME
-                            hostmaster.domain.example.      ; RNAME
-                            2016051300                      ; SERIAL
-                            86400                           ; REFRESH
-                            86400                           ; RETRY
-                            86400                           ; EXPIRE
-                            1                               ; MINIMUM
-                    )
-
-    $TTL 86400
-
-    @       NS      ns1.whoami.domain.example.
-    @       NS      ns2.whoami.domain.example.
-    @       NS      ns3.whoami.domain.example.
-    @       NS      ns4.whoami.domain.example.
-
-    ns1     A       198.51.100.53
-    ns2     A       192.0.2.53
-    ns3     A       203.0.113.53
-    ns4     A       198.19.123.53
-
-The whoami6.domain.example zone file example:
-
-  .. code-block:: none
-
-    $TTL 1
-
-    @       SOA     (
-                            whoami6.domain.example.         ; MNAME
-                            hostmaster.domain.example.      ; RNAME
-                            2016051300                      ; SERIAL
-                            86400                           ; REFRESH
-                            86400                           ; RETRY
-                            86400                           ; EXPIRE
-                            1                               ; MINIMUM
-                    )
-
-    $TTL 86400
-
-    @       NS      ns1.whoami6.domain.example.
-    @       NS      ns2.whoami6.domain.example.
-    @       NS      ns3.whoami6.domain.example.
-    @       NS      ns4.whoami6.domain.example.
-
-    ns1     AAAA    2001:db8:100::53
-    ns2     AAAA    2001:db8:200::53
-    ns3     AAAA    2001:db8:300::53
-    ns4     AAAA    2001:db8:400::53
-
-The parent domain would then delegate whoami.domain.example to
-ns[1-4].whoami.domain.example and whoami6.domain.example to
-ns[1-4].whoami6.domain.example, and include the corresponding A-only or
-AAAA-only glue records.
-
-``noudp`` — noudp module
-------------------------
-
-The module sends empty truncated response to any UDP query. This is similar
-to a slipped answer in :ref:`response rate limiting<server_rate-limit>`.
-
-To enable this module globally, you need to add something like the following
-to the configuration file::
-
-    mod-noudp:
-      - id: default
-
-    template:
-      - id: default
-        global-module: mod-noudp/default
+If keys are added manually as published, but not active (for next rollover event), they are added automatically.
 
-The TCP queries are not affected.
diff --git a/doc/index.rst b/doc/index.rst
index f785bd9bd7508b1bf9aa277a1281a7d66a8499bd..3c919d8889908884b951cec8e3909c67200a444a 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -10,6 +10,7 @@ Welcome to Knot DNS's documentation!
    requirements
    installation
    configuration
+   modules
    operation
    troubleshooting
    reference
diff --git a/doc/introduction.rst b/doc/introduction.rst
index 5243280c5960e805cae7a792b81fb89bb3322a0b..1e80feab89ecef7283b3c856d7a9953fb05bed42 100644
--- a/doc/introduction.rst
+++ b/doc/introduction.rst
@@ -48,6 +48,7 @@ Server features:
 * Automatic DNSSEC signing
 * PKCS #11 interface
 * Forward and reverse records synthesis
+* DNS request traffic statistics
 
 For more info and downloads see `www.knot-dns.cz <https://www.knot-dns.cz>`_.
 
diff --git a/doc/man/kdig.1in b/doc/man/kdig.1in
index 2e7feffd9e44a59d9e1ea73efe148f4a4a824073..5973db126f616e965354a8e3ab3450648f50983c 100644
--- a/doc/man/kdig.1in
+++ b/doc/man/kdig.1in
@@ -251,7 +251,7 @@ on libidn availability during project building!
 .sp
 Options \fB\-k\fP and \fB\-y\fP can not be used simultaneously.
 .sp
-Dnssec\-keygen keyfile format is not supported. Use \fIkeymgr(8)\fP instead.
+Dnssec\-keygen keyfile format is not supported. Use \fBkeymgr(8)\fP instead.
 .SH EXAMPLES
 .INDENT 0.0
 .IP 1. 3
@@ -312,10 +312,10 @@ $ kdig \-d @185.49.141.38 +tls\-ca +tls\-host=getdnsapi.net \e
 \fB/etc/resolv.conf\fP
 .SH SEE ALSO
 .sp
-\fIkhost(1)\fP, \fIknsupdate(1)\fP, \fIkeymgr(8)\fP\&.
+\fBkhost(1)\fP, \fBknsupdate(1)\fP, \fBkeymgr(8)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/keymgr.8in b/doc/man/keymgr.8in
index cda26f5e2e2c59b82820a15c42567b3cdcca6dcd..f089af49e187c949668429c62c9458d4665246be 100644
--- a/doc/man/keymgr.8in
+++ b/doc/man/keymgr.8in
@@ -148,14 +148,16 @@ utilities.
 .SS zone commands
 .INDENT 0.0
 .TP
-\fBzone\fP \fBkey\fP \fBlist\fP \fIzone\-name\fP [\fBfilter\fP]
-List key IDs and tags of zone keys.
+\fBzone\fP \fBkey\fP \fBlist\fP \fIzone\-name\fP [\fBfilter\fP [\fBfilter\fP]]
+List key IDs and tags of zone keys. The \fBfilter\fP can be a key tag, a key ID prefix, a key state (active, published, retired, removed) or ksk/zsk. Key state and ksk/zsk combination is possible.
+Use these key state and ksk/zsk with prefix \(aq+\(aq (\(aq+ksk\(aq, \(aq+active\(aq).
 .TP
 \fBzone\fP \fBkey\fP \fBshow\fP \fIzone\-name\fP \fIkey\fP
 Show zone key details. The \fIkey\fP can be a key tag or a key ID prefix.
 .TP
-\fBzone\fP \fBkey\fP \fBds\fP \fIzone\-name\fP \fIkey\fP
-Show DS records for a zone key. The \fIkey\fP can be a key tag or a key ID prefix.
+\fBzone\fP \fBkey\fP \fBds\fP \fIzone\-name\fP \fIfilter\fP
+Show DS records for a zone key. The \fIfilter\fP can be a key tag, a key ID prefix or key state (limited to active and published ksk).
+Use these key state as \(aq+active\(aq or \(aq+published\(aq.
 .TP
 \fBzone\fP \fBkey\fP \fBgenerate\fP \fIzone\-name\fP [\fIkey\-parameter\fP\&...]
 Generate a new key for a zone.
@@ -386,12 +388,12 @@ $ keymgr tsig generate operator.key algorithm hmac\-sha512
 .sp
 \fI\%RFC 6781\fP \- DNSSEC Operational Practices.
 .sp
-\fIknot.conf(5)\fP,
-\fIknotc(8)\fP,
-\fIknotd(8)\fP\&.
+\fBknot.conf(5)\fP,
+\fBknotc(8)\fP,
+\fBknotd(8)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/khost.1in b/doc/man/khost.1in
index 5e6763638e587fe287cabf50be71ca5a6f105595..29c0eecce88310f6ec6e89f8c77a75336f55b58d 100644
--- a/doc/man/khost.1in
+++ b/doc/man/khost.1in
@@ -143,10 +143,10 @@ $ khost \-t AXFR \-v example.com
 \fB/etc/resolv.conf\fP
 .SH SEE ALSO
 .sp
-\fIkdig(1)\fP, \fIknsupdate(1)\fP\&.
+\fBkdig(1)\fP, \fBknsupdate(1)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/kjournalprint.1in b/doc/man/kjournalprint.1in
new file mode 100644
index 0000000000000000000000000000000000000000..9745e0263dd90aa1c2f2e7a60737e82c5f2a4a7e
--- /dev/null
+++ b/doc/man/kjournalprint.1in
@@ -0,0 +1,89 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "KJOURNALPRINT" "1" "@RELEASE_DATE@" "@VERSION@" "Knot DNS"
+.SH NAME
+kjournalprint \- Knot DNS journal print utility
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.sp
+\fBkjournalprint\fP [\fIoptions\fP] \fIjournal_db\fP \fIzone_name\fP
+.SH DESCRIPTION
+.sp
+The program prints zone history stored in a journal database. As default,
+changes are colored for terminal.
+.SS Options
+.INDENT 0.0
+.TP
+\fB\-l\fP, \fB\-\-limit\fP \fIlimit\fP
+Limits the number of displayed changes.
+.TP
+\fB\-n\fP, \fB\-\-no\-color\fP
+Removes changes coloring.
+.TP
+\fB\-z\fP, \fB\-\-zone\-list\fP
+Instead of reading jurnal, display the list of zones in the DB.
+(\fIzone_name\fP not needed)
+.TP
+\fB\-h\fP, \fB\-\-help\fP
+Print the program help.
+.TP
+\fB\-V\fP, \fB\-\-version\fP
+Print the program version.
+.UNINDENT
+.SS Parameters
+.INDENT 0.0
+.TP
+\fIjournal_db\fP
+A path to the journal database.
+.TP
+\fIzone_name\fP
+A name of the zone to print the history for.
+.UNINDENT
+.SH EXAMPLES
+.sp
+Last (most recent) 5 changes without colors:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+$ kjournalprint \-nl 5 /var/lib/knot/journal example.com.
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH SEE ALSO
+.sp
+\fBknotd(8)\fP, \fBknot.conf(5)\fP\&.
+.SH AUTHOR
+CZ.NIC Labs <http://www.knot-dns.cz>
+.SH COPYRIGHT
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
+.\" Generated by docutils manpage writer.
+.
diff --git a/doc/man/knot.conf.5in b/doc/man/knot.conf.5in
index ac940dcc0d75b0aabda6c36e0b87e748d151d44f..769b119286e9026ccdb0001682bcacabffd30b36 100644
--- a/doc/man/knot.conf.5in
+++ b/doc/man/knot.conf.5in
@@ -66,12 +66,13 @@ the following symbols:
 | – Choice
 .UNINDENT
 .sp
-There are 10 main sections (\fBserver\fP, \fBcontrol\fP, \fBlog\fP, \fBkeystore\fP,
-\fBpolicy\fP, \fBkey\fP, \fBacl\fP, \fBremote\fP, \fBtemplate\fP, and \fBzone\fP) and
-module sections with the \fBmod\-\fP prefix. Most of the sections (excluding
-\fBserver\fP and \fBcontrol\fP) are sequences of settings blocks. Each settings block
-begins with a unique identifier, which can be used as a reference from other
-sections (such identifier must be defined in advance).
+There are 11 main sections (\fBserver\fP, \fBcontrol\fP, \fBlog\fP, \fBstatistics\fP,
+\fBkeystore\fP, \fBpolicy\fP, \fBkey\fP, \fBacl\fP, \fBremote\fP, \fBtemplate\fP, and
+\fBzone\fP) and module sections with the \fBmod\-\fP prefix. Most of the sections
+(excluding \fBserver\fP, \fBcontrol\fP, and \fBstatistics\fP) are sequences of
+settings blocks. Each settings block begins with a unique identifier,
+which can be used as a reference from other sections (such identifier
+must be defined in advance).
 .sp
 A multi\-valued item can be specified either as a YAML sequence:
 .INDENT 0.0
@@ -103,8 +104,8 @@ to enclose such value within double quotes \fB"\fP \fB"\fP\&.
 .SH COMMENTS
 .sp
 A comment begins with a \fB#\fP character and is ignored during processing.
-Also each configuration section or sequence block allows to specify permanent
-comment using \fBcomment\fP item which is stored in the server beside the
+Also each configuration section or sequence block allows a permanent
+comment using the \fBcomment\fP item which is stored in the server beside the
 configuration.
 .SH INCLUDES
 .sp
@@ -149,10 +150,6 @@ server:
     max\-udp\-payload: SIZE
     max\-ipv4\-udp\-payload: SIZE
     max\-ipv6\-udp\-payload: SIZE
-    rate\-limit: INT
-    rate\-limit\-slip: INT
-    rate\-limit\-table\-size: INT
-    rate\-limit\-whitelist: ADDR[/INT] | ADDR\-ADDR ...
     listen: ADDR[@INT] ...
 .ft P
 .fi
@@ -243,69 +240,6 @@ A maximum number of TCP clients connected in parallel, set this below the file
 descriptor limit to avoid resource exhaustion.
 .sp
 \fIDefault:\fP 100
-.SS rate\-limit
-.sp
-Rate limiting is based on the token bucket scheme. A rate basically
-represents a number of tokens available each second. Each response is
-processed and classified (based on several discriminators, e.g.
-source netblock, query type, zone name, rcode, etc.). Classified responses are
-then hashed and assigned to a bucket containing number of available
-tokens, timestamp and metadata. When available tokens are exhausted,
-response is dropped or sent as truncated (see \fI\%rate\-limit\-slip\fP).
-Number of available tokens is recalculated each second.
-.sp
-\fIDefault:\fP 0 (disabled)
-.SS rate\-limit\-table\-size
-.sp
-Size of the hash table in a number of buckets. The larger the hash table, the lesser
-the probability of a hash collision, but at the expense of additional memory costs.
-Each bucket is estimated roughly to 32 bytes. The size should be selected as
-a reasonably large prime due to better hash function distribution properties.
-Hash table is internally chained and works well up to a fill rate of 90 %, general
-rule of thumb is to select a prime near 1.2 * maximum_qps.
-.sp
-\fIDefault:\fP 393241
-.SS rate\-limit\-slip
-.sp
-As attacks using DNS/UDP are usually based on a forged source address,
-an attacker could deny services to the victim\(aqs netblock if all
-responses would be completely blocked. The idea behind SLIP mechanism
-is to send each N\s-2\uth\d\s0 response as truncated, thus allowing client to
-reconnect via TCP for at least some degree of service. It is worth
-noting, that some responses can\(aqt be truncated (e.g. SERVFAIL).
-.INDENT 0.0
-.IP \(bu 2
-Setting the value to \fB0\fP will cause that all rate\-limited responses will
-be dropped. The outbound bandwidth and packet rate will be strictly capped
-by the \fI\%rate\-limit\fP option. All legitimate requestors affected
-by the limit will face denial of service and will observe excessive timeouts.
-Therefore this setting is not recommended.
-.IP \(bu 2
-Setting the value to \fB1\fP will cause that all rate\-limited responses will
-be sent as truncated. The amplification factor of the attack will be reduced,
-but the outbound data bandwidth won\(aqt be lower than the incoming bandwidth.
-Also the outbound packet rate will be the same as without RRL.
-.IP \(bu 2
-Setting the value to \fB2\fP will cause that half of the rate\-limited responses
-will be dropped, the other half will be sent as truncated. With this
-configuration, both outbound bandwidth and packet rate will be lower than the
-inbound. On the other hand, the dropped responses enlarge the time window
-for possible cache poisoning attack on the resolver.
-.IP \(bu 2
-Setting the value to anything \fBlarger than 2\fP will keep on decreasing
-the outgoing rate\-limited bandwidth, packet rate, and chances to notify
-legitimate requestors to reconnect using TCP. These attributes are inversely
-proportional to the configured value. Setting the value high is not advisable.
-.UNINDENT
-.sp
-\fIDefault:\fP 1
-.SS rate\-limit\-whitelist
-.sp
-A list of IP addresses, network subnets, or network ranges to exempt from
-rate limiting. Empty list means that no incoming connection will be
-white\-listed.
-.sp
-\fIDefault:\fP not set
 .SS max\-udp\-payload
 .sp
 Maximum EDNS0 UDP payload size default for both IPv4 and IPv6.
@@ -395,8 +329,7 @@ match one of them. Empty value means that TSIG key is not required.
 \fIDefault:\fP not set
 .SS action
 .sp
-An ordered list of allowed actions. Empty action list is only allowed if
-\fI\%deny\fP is set.
+An ordered list of allowed (or denied) actions.
 .sp
 Possible values:
 .INDENT 0.0
@@ -411,8 +344,9 @@ Possible values:
 \fIDefault:\fP not set
 .SS deny
 .sp
-Deny if \fI\%address\fP, \fI\%key\fP and
-\fI\%action\fP match.
+If enabled, instead of allowing, deny the specified \fI\%action\fP,
+\fI\%address\fP, \fI\%key\fP, or combination if these
+items. If no action is specified, deny all actions.
 .sp
 \fIDefault:\fP off
 .SH CONTROL SECTION
@@ -440,6 +374,39 @@ A UNIX socket path where the server listens for control commands.
 Maximum time the control socket operations can take. Set 0 for infinity.
 .sp
 \fIDefault:\fP 5
+.SH STATISTICS SECTION
+.sp
+Periodic server statistics dumping.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+statistics:
+    timer: TIME
+    file: STR
+    append: BOOL
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS timer
+.sp
+A period after which all available statistics metrics will by written to the
+\fI\%file\fP\&.
+.sp
+\fIDefault:\fP not set
+.SS file
+.sp
+A file path of statistics output in the YAML format.
+.sp
+\fIDefault:\fP \fI\%rundir\fP/stats.yaml
+.SS append
+.sp
+If enabled, the output will be appended to the \fI\%file\fP
+instead of file replacement.
+.sp
+\fIDefault:\fP off
 .SH KEYSTORE SECTION
 .sp
 DNSSEC keystore configuration.
@@ -500,18 +467,19 @@ policy:
   \- id: STR
     keystore: STR
     manual: BOOL
+    single\-type\-signing: BOOL
     algorithm: dsa | rsasha1 | dsa\-nsec3\-sha1 | rsasha1\-nsec3\-sha1 | rsasha256 | rsasha512 | ecdsap256sha256 | ecdsap384sha384
     ksk\-size: SIZE
     zsk\-size: SIZE
     dnskey\-ttl: TIME
     zsk\-lifetime: TIME
+    propagation\-delay: TIME
     rrsig\-lifetime: TIME
     rrsig\-refresh: TIME
     nsec3: BOOL
     nsec3\-iterations: INT
     nsec3\-salt\-length: INT
     nsec3\-salt\-lifetime: TIME
-    propagation\-delay: TIME
 .ft P
 .fi
 .UNINDENT
@@ -530,6 +498,20 @@ for zones. A special \fIdefault\fP value can be used for the default keystore se
 If enabled, automatic key management is not used.
 .sp
 \fIDefault:\fP off
+.SS single\-type\-signing
+.sp
+If enabled, Single\-Type Signing Scheme is used in the automatic key management
+mode.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Because key rollover is not supported yet, just one combined signing key is
+generated if none is available.
+.UNINDENT
+.UNINDENT
+.sp
+\fIDefault:\fP off
 .SS algorithm
 .sp
 An algorithm of signing keys and issued signatures.
@@ -550,11 +532,38 @@ A length of newly generated ZSK keys.
 A TTL value for DNSKEY records added into zone apex.
 .sp
 \fIDefault:\fP zone SOA TTL
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+has infuence over ZSK key lifetime
+.UNINDENT
+.UNINDENT
 .SS zsk\-lifetime
 .sp
 A period between ZSK publication and the next rollover initiation.
 .sp
 \fIDefault:\fP 30 days
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+ZSK key lifetime is also infuenced by propagation\-delay and dnskey\-ttl
+.UNINDENT
+.UNINDENT
+.SS propagation\-delay
+.sp
+An extra delay added for each key rollover step. This value should be high
+enough to cover propagation of data from the master server to all slaves.
+.sp
+\fIDefault:\fP 1 day
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+has infuence over ZSK key lifetime
+.UNINDENT
+.UNINDENT
 .SS rrsig\-lifetime
 .sp
 A validity period of newly issued signatures.
@@ -586,12 +595,6 @@ name before hashing.
 A validity period of newly issued salt field.
 .sp
 \fIDefault:\fP 30 days
-.SS propagation\-delay
-.sp
-An extra delay added for each key rollover step. This value should be high
-enough to cover propagation of data from the master server to all slaves.
-.sp
-\fIDefault:\fP 1 day
 .SH REMOTE SECTION
 .sp
 Definitions of remote servers for outgoing connections (source of a zone
@@ -630,7 +633,7 @@ can be appended to the address using \fB@\fP separator.
 \fIDefault:\fP not set
 .SS key
 .sp
-A \fI\%reference\fP to the TSIG key which ise used to autenticate
+A \fI\%reference\fP to the TSIG key which is used to authenticate
 the communication with the remote server.
 .sp
 \fIDefault:\fP not set
@@ -648,6 +651,8 @@ if a zone doesn\(aqt have another template specified.
 template:
   \- id: STR
     timer\-db: STR
+    journal\-db: STR
+    max\-journal\-db\-size: SIZE
     global\-module: STR/STR ...
     # All zone options (excluding \(aqtemplate\(aq item)
 .ft P
@@ -670,9 +675,41 @@ This option is only available in the \fIdefault\fP template.
 .UNINDENT
 .sp
 \fIDefault:\fP \fI\%storage\fP/timers
+.SS journal\-db
+.sp
+Specifies a path of the persistent journal database. The path can be specified
+as a relative path to the \fIdefault\fP template \fI\%storage\fP\&.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+This option is only available in the \fIdefault\fP template.
+.UNINDENT
+.UNINDENT
+.sp
+\fIDefault:\fP \fI\%storage\fP/journal
+.SS max\-journal\-db\-size
+.sp
+Hard limit for the common journal DB. There is no cleanup logic in journal
+to recover from reaching this limit: journal simply starts refusing changes
+across all zones. Decreasing this value has no effect if lower than actual
+DB file size.
+.sp
+It is recommended to limit \fI\%max\-journal\-usage\fP
+per\-zone instead of max\-journal\-size in most cases. Please keep this value
+large enough. This value also influences server\(aqs usage of virtual memory.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+This option is only available in the \fIdefault\fP template.
+.UNINDENT
+.UNINDENT
+.sp
+\fIDefault:\fP 20 GiB
 .SS global\-module
 .sp
-An ordered list of references to query modules in the form
+An ordered list of references to query modules in the form of \fImodule_name\fP or
 \fImodule_name/module_id\fP\&. These modules apply to all queries.
 .sp
 \fBNOTE:\fP
@@ -694,8 +731,8 @@ Definition of zones served by the server.
 zone:
   \- domain: DNAME
     template: template_id
-    file: STR
     storage: STR
+    file: STR
     master: remote_id ...
     ddns\-master: remote_id
     notify: remote_id ...
@@ -704,7 +741,8 @@ zone:
     disable\-any: BOOL
     zonefile\-sync: TIME
     ixfr\-from\-differences: BOOL
-    max\-journal\-size: SIZE
+    max\-journal\-usage: SIZE
+    max\-journal\-depth: INT
     max\-zone\-size : SIZE
     dnssec\-signing: BOOL
     dnssec\-policy: STR
@@ -724,6 +762,11 @@ A zone name identifier.
 A \fI\%reference\fP to a configuration template.
 .sp
 \fIDefault:\fP not set or \fIdefault\fP (if the template exists)
+.SS storage
+.sp
+A data directory for storing zone files, journal files and timers database.
+.sp
+\fIDefault:\fP \fB${localstatedir}/lib/knot\fP (configured with \fB\-\-with\-storage=path\fP)
 .SS file
 .sp
 A path to the zone file. Non absolute path is relative to
@@ -733,8 +776,8 @@ A path to the zone file. Non absolute path is relative to
 \fB%c[\fP\fIN\fP\fB]\fP or \fB%c[\fP\fIN\fP\fB\-\fP\fIM\fP\fB]\fP – means the \fIN\fPth
 character or a sequence of characters beginning from the \fIN\fPth and ending
 with the \fIM\fPth character of the textual zone name (see \fB%s\fP). The
-indexes are counted from 0 from the left. If the character is not available,
-the formatter has no effect.
+indexes are counted from 0 from the left. All dots (including the terminal
+one) are considered. If the character is not available, the formatter has no effect.
 .IP \(bu 2
 \fB%l[\fP\fIN\fP\fB]\fP – means the \fIN\fPth label of the textual zone name
 (see \fB%s\fP). The index is counted from 0 from the right (0 ~ TLD).
@@ -749,11 +792,6 @@ terminating dot (the result for the root zone is the empty string!).
 .UNINDENT
 .sp
 \fIDefault:\fP \fI\%storage\fP/\fB%s\fP\&.zone
-.SS storage
-.sp
-A data directory for storing zone files, journal files and timers database.
-.sp
-\fIDefault:\fP \fB${localstatedir}/lib/knot\fP (configured with \fB\-\-with\-storage=path\fP)
 .SS master
 .sp
 An ordered list of \fI\%references\fP to zone master servers.
@@ -849,6 +887,15 @@ the immediate sync with a zone file is not desirable, increase the value.
 .UNINDENT
 .UNINDENT
 .sp
+\fBWARNING:\fP
+.INDENT 0.0
+.INDENT 3.5
+If the zone file is not up\-to\-date, the zone should be flushed before its
+zone file editation or the SOA record must be untouched after editation.
+Otherwise the journal can\(aqt be applied.
+.UNINDENT
+.UNINDENT
+.sp
 \fIDefault:\fP 0 (immediate)
 .SS ixfr\-from\-differences
 .sp
@@ -865,9 +912,22 @@ This option has no effect with enabled
 .UNINDENT
 .sp
 \fIDefault:\fP off
-.SS max\-journal\-size
+.SS max\-journal\-usage
 .sp
-Maximum size of the zone journal file.
+Policy how much space in journal DB will the zone\(aqs journal occupy.
+.sp
+\fIDefault:\fP 100 MiB
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Journal DB may grow far above the sum of max\-journal\-usage across
+all zones, because of DB free space fragmentation.
+.UNINDENT
+.UNINDENT
+.SS max\-journal\-depth
+.sp
+Maximum history length of journal.
 .sp
 \fIDefault:\fP 2^64
 .SS max\-zone\-size
@@ -938,7 +998,7 @@ done by hand (see RFC 1982).
 \fIDefault:\fP increment
 .SS module
 .sp
-An ordered list of references to query modules in the form
+An ordered list of references to query modules in the form of \fImodule_name\fP or
 \fImodule_name/module_id\fP\&. These modules apply only to the current zone queries.
 .sp
 \fIDefault:\fP not set
@@ -975,6 +1035,7 @@ will be logged to both standard error output and syslog. The \fBinfo\fP and
 log:
   \- target: stdout | stderr | syslog | STR
     server: critical | error | warning | notice | info | debug
+    control: critical | error | warning | notice | info | debug
     zone: critical | error | warning | notice | info | debug
     any: critical | error | warning | notice | info | debug
 .ft P
@@ -1002,6 +1063,11 @@ Minimum severity level for messages related to general operation of the server
 that are logged.
 .sp
 \fIDefault:\fP not set
+.SS control
+.sp
+Minimum severity level for messages related to server control that are logged.
+.sp
+\fIDefault:\fP not set
 .SS zone
 .sp
 Minimum severity level for messages related to zones that are logged.
@@ -1012,6 +1078,90 @@ Minimum severity level for messages related to zones that are logged.
 Minimum severity level for all message types that are logged.
 .sp
 \fIDefault:\fP not set
+.SH MODULE RRL
+.sp
+A response rate limiting module.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+mod\-rrl:
+  \- id: STR
+    rate\-limit: INT
+    slip: INT
+    table\-size: INT
+    whitelist: ADDR[/INT] | ADDR\-ADDR ...
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS id
+.sp
+A module identifier.
+.SS rate\-limit
+.sp
+Rate limiting is based on the token bucket scheme. A rate basically
+represents a number of tokens available each second. Each response is
+processed and classified (based on several discriminators, e.g.
+source netblock, query type, zone name, rcode, etc.). Classified responses are
+then hashed and assigned to a bucket containing number of available
+tokens, timestamp and metadata. When available tokens are exhausted,
+response is dropped or sent as truncated (see \fI\%slip\fP).
+Number of available tokens is recalculated each second.
+.sp
+\fIRequired\fP
+.SS table\-size
+.sp
+Size of the hash table in a number of buckets. The larger the hash table, the lesser
+the probability of a hash collision, but at the expense of additional memory costs.
+Each bucket is estimated roughly to 32 bytes. The size should be selected as
+a reasonably large prime due to better hash function distribution properties.
+Hash table is internally chained and works well up to a fill rate of 90 %, general
+rule of thumb is to select a prime near 1.2 * maximum_qps.
+.sp
+\fIDefault:\fP 393241
+.SS slip
+.sp
+As attacks using DNS/UDP are usually based on a forged source address,
+an attacker could deny services to the victim\(aqs netblock if all
+responses would be completely blocked. The idea behind SLIP mechanism
+is to send each N\s-2\uth\d\s0 response as truncated, thus allowing client to
+reconnect via TCP for at least some degree of service. It is worth
+noting, that some responses can\(aqt be truncated (e.g. SERVFAIL).
+.INDENT 0.0
+.IP \(bu 2
+Setting the value to \fB0\fP will cause that all rate\-limited responses will
+be dropped. The outbound bandwidth and packet rate will be strictly capped
+by the \fI\%rate\-limit\fP option. All legitimate requestors affected
+by the limit will face denial of service and will observe excessive timeouts.
+Therefore this setting is not recommended.
+.IP \(bu 2
+Setting the value to \fB1\fP will cause that all rate\-limited responses will
+be sent as truncated. The amplification factor of the attack will be reduced,
+but the outbound data bandwidth won\(aqt be lower than the incoming bandwidth.
+Also the outbound packet rate will be the same as without RRL.
+.IP \(bu 2
+Setting the value to \fB2\fP will cause that half of the rate\-limited responses
+will be dropped, the other half will be sent as truncated. With this
+configuration, both outbound bandwidth and packet rate will be lower than the
+inbound. On the other hand, the dropped responses enlarge the time window
+for possible cache poisoning attack on the resolver.
+.IP \(bu 2
+Setting the value to anything \fBlarger than 2\fP will keep on decreasing
+the outgoing rate\-limited bandwidth, packet rate, and chances to notify
+legitimate requestors to reconnect using TCP. These attributes are inversely
+proportional to the configured value. Setting the value high is not advisable.
+.UNINDENT
+.sp
+\fIDefault:\fP 1
+.SS whitelist
+.sp
+A list of IP addresses, network subnets, or network ranges to exempt from
+rate limiting. Empty list means that no incoming connection will be
+white\-listed.
+.sp
+\fIDefault:\fP not set
 .SH MODULE DNSTAP
 .sp
 The module dnstap allows query and response logging.
@@ -1063,6 +1213,30 @@ If enabled, query messages will be logged.
 If enabled, response messages will be logged.
 .sp
 \fIDefault:\fP on
+.SH MODULE ONLINE-SIGN
+.sp
+The module provides online DNSSEC signing. Instead of pre\-computing the zone signatures
+when the zone is loaded into the server or instead of loading an externally signed zone,
+the signatures are computed on\-the\-fly during answering.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+mod\-online\-sign:
+  \- id: STR
+    policy: STR
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS id
+.sp
+A module identifier.
+.SS policy
+.sp
+A \fI\%reference\fP to DNSSEC signing policy. A special \fIdefault\fP
+value can be used for the default policy settings.
 .SH MODULE SYNTH-RECORD
 .sp
 This module is able to synthesize either forward or reverse records for the
@@ -1139,6 +1313,7 @@ server for resolution.
 mod\-dnsproxy:
   \- id: STR
     remote: remote_id
+    timeout: INT
     catch\-nxdomain: BOOL
 .ft P
 .fi
@@ -1153,6 +1328,11 @@ A \fI\%reference\fP to a remote server where the queries are
 forwarded to.
 .sp
 \fIRequired\fP
+.SS timeout
+.sp
+A remote response timeout in milliseconds.
+.sp
+\fIDefault:\fP 500
 .SS catch\-nxdomain
 .sp
 If enabled, all unsatisfied queries (also applies to local zone lookups)
@@ -1183,16 +1363,34 @@ A module identifier.
 A path to the directory where the database is stored.
 .sp
 \fIRequired\fP
-.SH MODULE ONLINE-SIGN
+.SH MODULE STATS
+.sp
+The module provides incoming query processing statistics.
 .sp
-The module provides online DNSSEC signing.
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Leading 16\-bit message size over TCP is not considered.
+.UNINDENT
+.UNINDENT
 .INDENT 0.0
 .INDENT 3.5
 .sp
 .nf
 .ft C
-mod\-online\-sign:
+mod\-stats:
   \- id: STR
+    request\-protocol: BOOL
+    server\-operation: BOOL
+    request\-bytes: BOOL
+    response\-bytes: BOOL
+    edns\-presence: BOOL
+    flag\-presence: BOOL
+    response\-code: BOOL
+    reply\-nodata: BOOL
+    query\-type: BOOL
+    query\-size: BOOL
+    reply\-size: BOOL
 .ft P
 .fi
 .UNINDENT
@@ -1200,44 +1398,220 @@ mod\-online\-sign:
 .SS id
 .sp
 A module identifier.
-.SH MODULE WHOAMI
+.SS request\-protocol
+.sp
+If enabled, all incoming requests are counted by the network protocol:
+.INDENT 0.0
+.IP \(bu 2
+udp4 \- UDP over IPv4
+.IP \(bu 2
+tcp4 \- TCP over IPv4
+.IP \(bu 2
+udp6 \- UDP over IPv6
+.IP \(bu 2
+tcp6 \- TCP over IPv6
+.UNINDENT
+.sp
+\fIDefault:\fP on
+.SS server\-operation
+.sp
+If enabled, all incoming requests are counted by the server operation. The
+server operation is based on message header OpCode and message query (meta) type:
+.INDENT 0.0
+.IP \(bu 2
+query \- Normal query operation
+.IP \(bu 2
+update \- Dynamic update operation
+.IP \(bu 2
+notify \- NOTIFY request operation
+.IP \(bu 2
+axfr \- Full zone transfer operation
+.IP \(bu 2
+ixfr \- Incremental zone transfer operation
+.IP \(bu 2
+invalid \- Invalid server operation
+.UNINDENT
+.sp
+\fIDefault:\fP on
+.SS request\-bytes
+.sp
+If enabled, all incoming request bytes are counted by the server operation:
+.INDENT 0.0
+.IP \(bu 2
+query \- Normal query bytes
+.IP \(bu 2
+update \- Dynamic update bytes
+.IP \(bu 2
+other \- Other request bytes
+.UNINDENT
+.sp
+\fIDefault:\fP on
+.SS response\-bytes
 .sp
-The module synthesizes an A or AAAA record containing the query source IP address,
-at the apex of the zone being served.
+If enabled, outgoing response bytes are counted by the server operation:
+.INDENT 0.0
+.IP \(bu 2
+reply \- Normal response bytes
+.IP \(bu 2
+transfer \- Zone transfer bytes
+.IP \(bu 2
+other \- Other response bytes
+.UNINDENT
+.sp
+\fBWARNING:\fP
 .INDENT 0.0
 .INDENT 3.5
+Dynamic update response bytes are not counted by this module.
+.UNINDENT
+.UNINDENT
 .sp
-.nf
-.ft C
-mod\-whoami:
-  \- id: STR
-.ft P
-.fi
+\fIDefault:\fP on
+.SS edns\-presence
+.sp
+If enabled, EDNS pseudo section presence is counted by the message direction:
+.INDENT 0.0
+.IP \(bu 2
+request \- EDNS present in request
+.IP \(bu 2
+response \- EDNS present in response
 .UNINDENT
+.sp
+\fIDefault:\fP off
+.SS flag\-presence
+.sp
+If enabled, some message header flags are counted:
+.INDENT 0.0
+.IP \(bu 2
+TC \- Truncated Answer in response
+.IP \(bu 2
+DO \- DNSSEC OK in request
 .UNINDENT
-.SS id
 .sp
-A module identifier.
-.SH MODULE NOUDP
+\fIDefault:\fP off
+.SS response\-code
 .sp
-The module sends empty truncated response to any UDP query.
+If enabled, outgoing response code is counted:
+.INDENT 0.0
+.IP \(bu 2
+NOERROR
+.IP \(bu 2
+\&...
+.IP \(bu 2
+NOTZONE
+.IP \(bu 2
+BADVERS
+.IP \(bu 2
+\&...
+.IP \(bu 2
+BADCOOKIE
+.IP \(bu 2
+other \- All other codes
+.UNINDENT
+.sp
+\fBNOTE:\fP
 .INDENT 0.0
 .INDENT 3.5
+In the case of multi\-message zone transfer response, just one counter is
+incremented.
+.UNINDENT
+.UNINDENT
 .sp
-.nf
-.ft C
-mod\-noudp:
-  \- id: STR
-.ft P
-.fi
+\fBWARNING:\fP
+.INDENT 0.0
+.INDENT 3.5
+Dynamic update response code is not counted by this module.
 .UNINDENT
 .UNINDENT
-.SS id
 .sp
-A module identifier.
+\fIDefault:\fP on
+.SS reply\-nodata
+.sp
+If enabled, NODATA pseudo RCODE (see RFC 2308, Section 2.2) is counted by the
+query type:
+.INDENT 0.0
+.IP \(bu 2
+A
+.IP \(bu 2
+AAAA
+.IP \(bu 2
+other \- All other types
+.UNINDENT
+.sp
+\fIDefault:\fP off
+.SS query\-type
+.sp
+If enabled, normal query type is counted:
+.INDENT 0.0
+.IP \(bu 2
+A (TYPE1)
+.IP \(bu 2
+\&...
+.IP \(bu 2
+TYPE65
+.IP \(bu 2
+SPF (TYPE99)
+.IP \(bu 2
+\&...
+.IP \(bu 2
+TYPE110
+.IP \(bu 2
+ANY (TYPE255)
+.IP \(bu 2
+\&...
+.IP \(bu 2
+TYPE260
+.IP \(bu 2
+other \- All other types
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Not all assigned meta types (IXFR, AXFR,...) have their own counters,
+because such types are not processed as normal query.
+.UNINDENT
+.UNINDENT
+.sp
+\fIDefault:\fP off
+.SS query\-size
+.sp
+If enabled, normal query message size distribution is counted by the size range
+in bytes:
+.INDENT 0.0
+.IP \(bu 2
+0\-15
+.IP \(bu 2
+16\-31
+.IP \(bu 2
+\&...
+.IP \(bu 2
+272\-287
+.IP \(bu 2
+288\-65535
+.UNINDENT
+.sp
+\fIDefault:\fP off
+.SS reply\-size
+.sp
+If enabled, normal reply message size distribution is counted by the size range
+in bytes:
+.INDENT 0.0
+.IP \(bu 2
+0\-15
+.IP \(bu 2
+16\-31
+.IP \(bu 2
+\&...
+.IP \(bu 2
+4080\-4095
+.IP \(bu 2
+4096\-65535
+.UNINDENT
+.sp
+\fIDefault:\fP off
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/knot1to2.1in b/doc/man/knot1to2.1in
index 51f90de247c1088e564dbf50444b1a8dea66ae17..5e69973b2c960a7d00137c081be533dbc1e7fcc8 100644
--- a/doc/man/knot1to2.1in
+++ b/doc/man/knot1to2.1in
@@ -63,10 +63,10 @@ Print the program version.
 .UNINDENT
 .SH SEE ALSO
 .sp
-\fIknotc(8)\fP, \fIknotd(8)\fP, \fIknot.conf(5)\fP\&.
+\fBknotc(8)\fP, \fBknotd(8)\fP, \fBknot.conf(5)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/knotc.8in b/doc/man/knotc.8in
index d547b97fcecd09ed7f0b1ca7bc06703bcc88c5ef..adc8ed6faa17e19715618406298c368960cb20ec 100644
--- a/doc/man/knotc.8in
+++ b/doc/man/knotc.8in
@@ -78,6 +78,10 @@ Stop the server if running.
 Reload the server configuration and modified zone files. All open zone
 transactions will be aborted!
 .TP
+\fBstats\fP [\fImodule\fP[\fB\&.\fP\fIcounter\fP]]
+Show global statistics counter(s). To print also counters with value 0, use
+force option.
+.TP
 \fBzone\-check\fP [\fIzone\fP\&...]
 Test if the server can load the zone. Semantic checks are executed if enabled
 in the configuration. (*)
@@ -135,7 +139,11 @@ requires a ttl value specified.
 Remove zone data within the transaction.
 .TP
 \fBzone\-purge\fP \fIzone\fP\&...
-Purge zone data, zone file, and zone journal.
+Purge zone data, file, journal, and timers.
+.TP
+\fBzone\-stats\fP \fIzone\fP [\fImodule\fP[\fB\&.\fP\fIcounter\fP]]
+Show zone statistics counter(s). To print also counters with value 0, use
+force option.
 .TP
 \fBconf\-init\fP
 Initialize the configuration database. (*)
@@ -193,7 +201,7 @@ The utility provides interactive mode with basic line editing functionality,
 command completion, and command history.
 .sp
 Interactive mode behavior can be customized in \fI~/.editrc\fP\&. Refer to
-\fIeditrc(5)\fP for details.
+\fBeditrc(5)\fP for details.
 .sp
 Command history is saved in \fI~/.knotc_history\fP\&.
 .SH EXAMPLES
@@ -279,10 +287,10 @@ $ knotc zone\-read \-\- @ SOA
 .UNINDENT
 .SH SEE ALSO
 .sp
-\fIknotd(8)\fP, \fIknot.conf(5)\fP, \fIeditrc(5)\fP\&.
+\fBknotd(8)\fP, \fBknot.conf(5)\fP, \fBeditrc(5)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/knotd.8in b/doc/man/knotd.8in
index 93ad872ec3f7e1bebd4babdf6f4626ac7c6cd206..263ee445dd05c21a0b6fe85b4194f753f5812b3d 100644
--- a/doc/man/knotd.8in
+++ b/doc/man/knotd.8in
@@ -63,10 +63,10 @@ Print the program version.
 .UNINDENT
 .SH SEE ALSO
 .sp
-\fIknotc(8)\fP, \fIknot.conf(5)\fP\&.
+\fBknotc(8)\fP, \fBknot.conf(5)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/knsec3hash.1in b/doc/man/knsec3hash.1in
index 261b3e5e6c9fafc5fb13ee9bd6728b06b4908750..5470c89c2bd9171f5b2b8489ea931f9f72a2e4f0 100644
--- a/doc/man/knsec3hash.1in
+++ b/doc/man/knsec3hash.1in
@@ -78,10 +78,10 @@ A1RT98BS5QGC9NFI51S9HCI47ULJG6JH (salt=\-, hash=1, iterations=0)
 .sp
 \fI\%RFC 5155\fP – DNS Security (DNSSEC) Hashed Authenticated Denial of Existence.
 .sp
-\fIknotc(8)\fP, \fIknotd(8)\fP\&.
+\fBknotc(8)\fP, \fBknotd(8)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/knsupdate.1in b/doc/man/knsupdate.1in
index 1aacad4b82d2483eaa8a0eb8c05307a802421700..0b4f8011dd2cf0e986fe9de2575d26aaaef15fdb 100644
--- a/doc/man/knsupdate.1in
+++ b/doc/man/knsupdate.1in
@@ -156,7 +156,7 @@ Quit the program.
 .sp
 Options \fB\-k\fP and \fB\-y\fP can not be used simultaneously.
 .sp
-Dnssec\-keygen keyfile format is not supported. Use \fIkeymgr(8)\fP instead.
+Dnssec\-keygen keyfile format is not supported. Use \fBkeymgr(8)\fP instead.
 .sp
 Zone name/server guessing is not supported if the zone name/server is not specified.
 .sp
@@ -189,10 +189,10 @@ $ knsupdate
 .UNINDENT
 .SH SEE ALSO
 .sp
-\fIkdig(1)\fP, \fIkhost(1)\fP, \fIkeymgr(8)\fP\&.
+\fBkdig(1)\fP, \fBkhost(1)\fP, \fBkeymgr(8)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man/kzonecheck.1in b/doc/man/kzonecheck.1in
index 0f8ae784ac389d7f48c6abd3aedc07209d83afca..fab5b87cf69d5c3ad1a929a5e7415299c5769d98 100644
--- a/doc/man/kzonecheck.1in
+++ b/doc/man/kzonecheck.1in
@@ -32,7 +32,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 ..
 .SH SYNOPSIS
 .sp
-\fBkzonecheck\fP [\fIoptions\fP] \fIzone\-file\fP
+\fBkzonecheck\fP [\fIoptions\fP] \fIfilename\fP
 .SH DESCRIPTION
 .sp
 The utility checks zone file syntax and runs semantic checks on the zone
@@ -40,7 +40,7 @@ content. The executed checks are the same as the checks run by the Knot
 DNS server.
 .sp
 Please, refer to the \fBsemantic\-checks\fP configuration option in
-\fIknot.conf(5)\fP for the full list of available semantic checks.
+\fBknot.conf(5)\fP for the full list of available semantic checks.
 .SS Options
 .INDENT 0.0
 .TP
@@ -59,10 +59,10 @@ Print the program version.
 .UNINDENT
 .SH SEE ALSO
 .sp
-\fIknotd(8)\fP, \fIknot.conf(5)\fP
+\fBknotd(8)\fP, \fBknot.conf(5)\fP\&.
 .SH AUTHOR
 CZ.NIC Labs <http://www.knot-dns.cz>
 .SH COPYRIGHT
-Copyright 2010–2016, CZ.NIC, z.s.p.o.
+Copyright 2010–2017, CZ.NIC, z.s.p.o.
 .\" Generated by docutils manpage writer.
 .
diff --git a/doc/man_keymgr.rst b/doc/man_keymgr.rst
index 1720fda5772a070810de544a8f75dd7304ee1ea6..4101bbbacbd85fb67deffdccde5d3d1a31f1ecc7 100644
--- a/doc/man_keymgr.rst
+++ b/doc/man_keymgr.rst
@@ -118,14 +118,16 @@ tsig commands
 zone commands
 .............
 
-**zone** **key** **list** *zone-name* [**filter**]
-  List key IDs and tags of zone keys.
+**zone** **key** **list** *zone-name* [**filter** [**filter**]]
+  List key IDs and tags of zone keys. The **filter** can be a key tag, a key ID prefix, a key state (active, published, retired, removed) or ksk/zsk. Key state and ksk/zsk combination is possible.
+  Use these key state and ksk/zsk with prefix '+' ('+ksk', '+active').
 
 **zone** **key** **show** *zone-name* *key*
   Show zone key details. The *key* can be a key tag or a key ID prefix.
 
-**zone** **key** **ds** *zone-name* *key*
-  Show DS records for a zone key. The *key* can be a key tag or a key ID prefix.
+**zone** **key** **ds** *zone-name* *filter*
+  Show DS records for a zone key. The *filter* can be a key tag, a key ID prefix or key state (limited to active and published ksk).
+  Use these key state as '+active' or '+published'.
 
 **zone** **key** **generate** *zone-name* [*key-parameter*...]
   Generate a new key for a zone.
diff --git a/doc/man_kjournalprint.rst b/doc/man_kjournalprint.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6748c31d9bf1386f5f2b9c8ff38121e23263e816
--- /dev/null
+++ b/doc/man_kjournalprint.rst
@@ -0,0 +1,55 @@
+.. highlight:: console
+
+kjournalprint – Knot DNS journal print utility
+==============================================
+
+Synopsis
+--------
+
+:program:`kjournalprint` [*options*] *journal_db* *zone_name*
+
+Description
+-----------
+
+The program prints zone history stored in a journal database. As default,
+changes are colored for terminal.
+
+Options
+.......
+
+**-l**, **--limit** *limit*
+  Limits the number of displayed changes.
+
+**-n**, **--no-color**
+  Removes changes coloring.
+
+**-z**, **--zone-list**
+  Instead of reading jurnal, display the list of zones in the DB.
+  (*zone_name* not needed)
+
+**-h**, **--help**
+  Print the program help.
+
+**-V**, **--version**
+  Print the program version.
+
+Parameters
+..........
+
+*journal_db*
+  A path to the journal database.
+
+*zone_name*
+  A name of the zone to print the history for.
+
+Examples
+--------
+
+Last (most recent) 5 changes without colors::
+
+  $ kjournalprint -nl 5 /var/lib/knot/journal example.com.
+
+See Also
+--------
+
+:manpage:`knotd(8)`, :manpage:`knot.conf(5)`.
diff --git a/doc/man_knotc.rst b/doc/man_knotc.rst
index 70baa568ceabded38b8153ef5abae1044fa942ca..845b76f43e8cf94c601f21281ff8c754ce177ed5 100644
--- a/doc/man_knotc.rst
+++ b/doc/man_knotc.rst
@@ -55,6 +55,10 @@ Actions
   Reload the server configuration and modified zone files. All open zone
   transactions will be aborted!
 
+**stats** [*module*\ [\ **.**\ *counter*\ ]]
+  Show global statistics counter(s). To print also counters with value 0, use
+  force option.
+
 **zone-check** [*zone*...]
   Test if the server can load the zone. Semantic checks are executed if enabled
   in the configuration. (*)
@@ -112,7 +116,11 @@ Actions
   Remove zone data within the transaction.
 
 **zone-purge** *zone*...
-  Purge zone data, zone file, and zone journal.
+  Purge zone data, file, journal, and timers.
+
+**zone-stats** *zone* [*module*\ [\ **.**\ *counter*\ ]]
+  Show zone statistics counter(s). To print also counters with value 0, use
+  force option.
 
 **conf-init**
   Initialize the configuration database. (*)
diff --git a/doc/man_kzonecheck.rst b/doc/man_kzonecheck.rst
index 61f20bf8ffbcca556cc7f137659f4c3196ccdc81..5ca1f27477c589c8e6f50377228ca78af6667c9c 100644
--- a/doc/man_kzonecheck.rst
+++ b/doc/man_kzonecheck.rst
@@ -6,7 +6,7 @@ kzonecheck – Knot DNS zone file checking tool
 Synopsis
 --------
 
-:program:`kzonecheck` [*options*] *zone-file*
+:program:`kzonecheck` [*options*] *filename*
 
 Description
 -----------
@@ -19,7 +19,7 @@ Please, refer to the ``semantic-checks`` configuration option in
 :manpage:`knot.conf(5)` for the full list of available semantic checks.
 
 Options
-..........
+.......
 
 **-o**, **--origin** *origin*
   Zone origin. If not specified, the origin is determined from the file name
@@ -37,4 +37,4 @@ Options
 See Also
 --------
 
-:manpage:`knotd(8)`, :manpage:`knot.conf(5)`
+:manpage:`knotd(8)`, :manpage:`knot.conf(5)`.
diff --git a/doc/modules.rst b/doc/modules.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d78dc932d95c870f9f154240f3a98f4f8209cec2
--- /dev/null
+++ b/doc/modules.rst
@@ -0,0 +1,585 @@
+.. highlight:: none
+.. _Query_modules:
+
+*************
+Query modules
+*************
+
+Knot DNS supports configurable query modules that can alter the way
+queries are processed. The concept is quite simple – each query
+requires a finite number of steps to be resolved. We call this set of
+steps a *query plan*, an abstraction that groups these steps into
+several stages.
+
+* Before-query processing
+* Answer, Authority, Additional records packet sections processing
+* After-query processing
+
+For example, processing an Internet-class query needs to find an
+answer. Then based on the previous state, it may also append an
+authority SOA or provide additional records. Each of these actions
+represents a 'processing step'. Now, if a query module is loaded for a
+zone, it is provided with an implicit query plan which can be extended
+by the module or even changed altogether.
+
+A module is active if its name, which includes the ``mod-`` prefix, is assigned
+to the zone/template :ref:`zone_module` option or to the *default* template
+:ref:`template_global-module` option if activating for all queries.
+If the module is configurable, a corresponding module section with
+an identifier must be created and then referenced in the form of
+``module_name/module_id``.
+
+.. NOTE::
+   Query modules are processed in the order they are specified in the
+   zone/template configuration. In most cases, the recommended order is::
+
+      mod-synth-record, mod-online-sign, mod-rrl, mod-dnstap, mod-stats
+
+``rrl`` — Response rate limiting
+--------------------------------
+
+Response rate limiting (RRL) is a method to combat DNS reflection amplification
+attacks. These attacks rely on the fact that source address of a UDP query
+can be forged, and without a worldwide deployment of `BCP38
+<https://tools.ietf.org/html/bcp38>`_, such a forgery cannot be prevented.
+An attacker can use a DNS server (or multiple servers) as an amplification
+source and can flood a victim with a large number of unsolicited DNS responses.
+The RRL lowers the amplification factor of these attacks by sending some of
+the responses as truncated or by dropping them altogether.
+
+The module introduces two counters. The number of slipped and dropped responses.
+
+You can enable RRL by setting the :ref:`mod-rrl<mod-rrl>` module globally or per zone.
+
+::
+
+    mod-rrl:
+      - id: default
+        rate-limit: 200   # Allow 200 resp/s for each flow
+        slip: 2           # Every other response slips
+
+    template:
+      - id: default
+        global-module: mod-rrl/default   # Enable RRL globally
+
+``dnstap`` – dnstap-enabled query logging
+-----------------------------------------
+
+A module for query and response logging based on dnstap_ library.
+You can capture either all or zone-specific queries and responses; usually
+you want to do the former. The configuration comprises only a
+:ref:`mod-dnstap_sink` path parameter, which can be either a file or
+a UNIX socket::
+
+   mod-dnstap:
+     - id: capture_all
+       sink: /tmp/capture.tap
+
+   template:
+     - id: default
+       global-module: mod-dnstap/capture_all
+
+.. NOTE::
+   To be able to use a Unix socket you need an external program to create it.
+   Knot DNS connects to it as a client using the libfstrm library. It operates
+   exactly like syslog. See `here
+   <https://www.nlnetlabs.nl/bugs-script/show_bug.cgi?id=741#c10>`_ for
+   more details.
+
+.. NOTE::
+   Dnstap log files can also be created or read using ``kdig``.
+
+.. _dnstap: http://dnstap.info/
+
+``synth-record`` – Automatic forward/reverse records
+----------------------------------------------------
+
+This module is able to synthesize either forward or reverse records for
+a given prefix and subnet.
+
+Records are synthesized only if the query can't be satisfied from the zone.
+Both IPv4 and IPv6 are supported.
+
+Automatic forward records
+.........................
+
+Example::
+
+   mod-synth-record:
+     - id: test1
+       type: forward
+       prefix: dynamic-
+       ttl: 400
+       network: 2620:0:b61::/52
+
+   zone:
+     - domain: test.
+       file: test.zone # Must exist
+       module: mod-synth-record/test1
+
+Result:
+
+.. code-block:: console
+
+   $ kdig AAAA dynamic-2620-0000-0b61-0100-0000-0000-0000-0001.test.
+   ...
+   ;; QUESTION SECTION:
+   ;; dynamic-2620-0000-0b61-0100-0000-0000-0000-0001.test. IN AAAA
+
+   ;; ANSWER SECTION:
+   dynamic-2620-0000-0b61-0100-0000-0000-0000-0001.test. 400 IN AAAA 2620:0:b61:100::1
+
+You can also have CNAME aliases to the dynamic records, which are going to be
+further resolved:
+
+.. code-block:: console
+
+   $ kdig AAAA alias.test.
+   ...
+   ;; QUESTION SECTION:
+   ;; alias.test. IN AAAA
+
+   ;; ANSWER SECTION:
+   alias.test. 3600 IN CNAME dynamic-2620-0000-0b61-0100-0000-0000-0000-0002.test.
+   dynamic-2620-0000-0b61-0100-0000-0000-0000-0002.test. 400 IN AAAA 2620:0:b61:100::2
+
+Automatic reverse records
+.........................
+
+Example::
+
+   mod-synth-record:
+     - id: test2
+       type: reverse
+       prefix: dynamic-
+       origin: test
+       ttl: 400
+       network: 2620:0:b61::/52
+
+   zone:
+     - domain: 1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa.
+       file: 1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa.zone # Must exist
+       module: mod-synth-record/test2
+
+Result:
+
+.. code-block:: console
+
+   $ kdig -x 2620:0:b61::1
+   ...
+   ;; QUESTION SECTION:
+   ;; 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa. IN PTR
+
+   ;; ANSWER SECTION:
+   1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.b.0.0.0.0.0.0.2.6.2.ip6.arpa. 400 IN PTR
+                                  dynamic-2620-0000-0b61-0000-0000-0000-0000-0001.test.
+
+``dnsproxy`` – Tiny DNS proxy
+-----------------------------
+
+The module catches all unsatisfied queries and forwards them to the
+indicated server for resolution, i.e. a tiny DNS proxy. There are several
+uses of this feature:
+
+* A substitute public-facing server in front of the real one
+* Local zones (poor man's "views"), rest is forwarded to the public-facing server
+* etc.
+
+.. NOTE::
+   The module does not alter the query/response as the resolver would,
+   and the original transport protocol is kept as well.
+
+The configuration is straightforward and just a single remote server is
+required::
+
+   remote:
+     - id: hidden
+       address: 10.0.1.1
+
+   mod-dnsproxy:
+     - id: default
+       remote: hidden
+
+   template:
+     - id: default
+       global-module: mod-dnsproxy/default
+
+   zone:
+     - domain: local.zone
+
+When clients query for anything in the ``local.zone``, they will be
+responded to locally. The rest of the requests will be forwarded to the
+specified server (``10.0.1.1`` in this case).
+
+``rosedb`` – Static resource records
+------------------------------------
+
+The module provides a mean to override responses for certain queries before
+the record is searched in the available zones. The module comes with the
+``rosedb_tool`` tool used to manipulate the database of static records.
+Neither the tool nor the module are enabled by default, recompile with
+the ``--enable-rosedb`` configuration flag to enable them.
+
+For example, let's suppose we have a database of following records:
+
+.. code-block:: none
+
+   myrecord.com.      3600 IN A 127.0.0.1
+   www.myrecord.com.  3600 IN A 127.0.0.2
+   ipv6.myrecord.com. 3600 IN AAAA ::1
+
+And we query the nameserver with the following:
+
+.. code-block:: console
+
+   $ kdig IN A myrecord.com
+     ... returns NOERROR, 127.0.0.1
+   $ kdig IN A www.myrecord.com
+     ... returns NOERROR, 127.0.0.2
+   $ kdig IN A stuff.myrecord.com
+     ... returns NOERROR, 127.0.0.1
+   $ kdig IN AAAA myrecord.com
+     ... returns NOERROR, NODATA
+   $ kdig IN AAAA ipv6.myrecord.com
+     ... returns NOERROR, ::1
+
+An entry in the database matches anything at the same or a lower domain
+level, i.e. 'myrecord.com' matches 'a.a.myrecord.com' as well.
+This can be utilized to create catch-all entries.
+
+You can also add authority information for the entries, provided you create
+SOA + NS records for a name, like so:
+
+.. code-block:: none
+
+   myrecord.com.     3600 IN SOA master host 1 3600 60 3600 3600
+   myrecord.com.     3600 IN NS ns1.myrecord.com.
+   myrecord.com.     3600 IN NS ns2.myrecord.com.
+   ns1.myrecord.com. 3600 IN A 127.0.0.1
+   ns2.myrecord.com. 3600 IN A 127.0.0.2
+
+In this case, the responses will:
+
+1. Be authoritative (AA flag set)
+2. Provide an authority section (SOA + NS)
+3. Be NXDOMAIN if the name is found *(i.e. the 'IN AAAA myrecord.com' from
+   the example)*, but not the RR type *(this is to allow the synthesis of
+   negative responses)*
+
+The SOA record applies only to the 'myrecord.com.', not to any other
+record (not even those of its subdomains). From this point of view, all records
+in the database are unrelated and not hierarchical. The idea is to provide
+subtree isolation for each entry.*
+
+In addition, the module is able to log matching queries via remote syslog if
+you specify a syslog address endpoint and an optional string code.
+
+Here is an example on how to use the module:
+
+* Create the entries in the database:
+
+  .. code-block:: console
+
+   $ mkdir /tmp/static_rrdb
+   $ # No logging
+   $ rosedb_tool /tmp/static_rrdb add myrecord.com. A 3600 "127.0.0.1" "-" "-"
+   $ # Logging as 'www_query' to Syslog at 10.0.0.1
+   $ rosedb_tool /tmp/static_rrdb add www.myrecord.com. A 3600 "127.0.0.1" \
+                                                    "www_query" "10.0.0.1"
+   $ # Logging as 'ipv6_query' to Syslog at 10.0.0.1
+   $ rosedb_tool /tmp/static_rrdb add ipv6.myrecord.com. AAAA 3600 "::1" \
+                                                 "ipv6_query" "10.0.0.1"
+   $ # Verify settings
+   $ rosedb_tool /tmp/static_rrdb list
+   www.myrecord.com.       A RDATA=10B     www_query       10.0.0.1
+   ipv6.myrecord.com.      AAAA RDATA=22B  ipv6_query      10.0.0.1
+   myrecord.com.           A RDATA=10B     -               -
+
+.. NOTE::
+   The database may be modified later on while the server is running.
+
+* Configure the query module::
+
+   mod-rosedb:
+     - id: default
+       dbdir: /tmp/static_rrdb
+
+   template:
+     - id: default
+       global-module: mod-rosedb/default
+
+The module accepts just one parameter – the path to the directory where
+the database will be stored.
+
+* Start the server:
+
+  .. code-block:: console
+
+   $ knotd -c knot.conf
+
+* Verify the running instance:
+
+  .. code-block:: console
+
+   $ kdig @127.0.0.1#6667 A myrecord.com
+
+``online-sign`` — Online DNSSEC signing
+---------------------------------------
+
+The module provides online DNSSEC signing. Instead of pre-computing the zone
+signatures when the zone is loaded into the server or instead of loading an
+externally signed zone, the signatures are computed on-the-fly during
+answering.
+
+The main purpose of the module is to enable authenticated responses with
+zones which use other dynamic module (e.g., automatic reverse record
+synthesis) because these zones cannot be pre-signed. However, it can be also
+used as a simple signing solution for zones with low traffic and also as
+a protection against zone content enumeration (zone walking).
+
+In order to minimize the number of computed signatures per query, the module
+produces a bit different responses from the responses that would be sent if
+the zone was pre-signed. Still, the responses should be perfectly valid for
+a DNSSEC validating resolver.
+
+Differences from statically signed zones:
+
+* The NSEC records are constructed as Minimally Covering NSEC Records
+  (see Appendix A in :rfc:`7129`). Therefore the generated domain names cover
+  the complete domain name space in the zone's authority.
+
+* NXDOMAIN responses are promoted to NODATA responses. The module proves
+  that the query type does not exist rather than that the domain name does not
+  exist.
+
+* Domain names matching a wildcard are expanded. The module pretends and proves
+  that the domain name exists rather than proving a presence of the wildcard.
+
+Records synthesized by the module:
+
+* DNSKEY record is synthesized in the zone apex and includes public key
+  material for the active signing key.
+
+* NSEC records are synthesized as needed.
+
+* RRSIG records are synthesized for authoritative content of the zone.
+
+How to use the online signing module:
+
+* Enable the module in the zone configuration with the default signing policy::
+
+   zone:
+     - domain: example.com
+       module: mod-online-sign
+
+  Or with an explicit signing policy::
+
+   policy:
+     - id: rsa
+       algorithm: RSASHA256
+       zsk-size: 2048
+
+   mod-online-sign:
+     - id: explicit
+       policy: rsa
+
+   zone:
+     - domain: example.com
+       module: mod-online-sign/explicit
+
+  Or use manual policy in an analogous manner, see
+  :ref:`Manual key management<dnssec-manual-key-management>`.
+
+  .. NOTE::
+     Only id, manual, keystore, algorithm, zsk-size, and rrsig-lifetime policy items are
+     relevant to this module. If no rrsig-lifetime is configured, the
+     default value is 25 hours.
+
+* Make sure the zone is not signed and also that the automatic signing is
+  disabled. All is set, you are good to go. Reload (or start) the server:
+
+  .. code-block:: console
+
+   $ knotc reload
+
+The following example stacks the online signing with reverse record synthesis
+module::
+
+ mod-synth-record:
+   - id: lan-forward
+     type: forward
+     prefix: ip-
+     ttl: 1200
+     network: 192.168.100.0/24
+
+ zone:
+   - domain: corp.example.net
+     module: [mod-synth-record/lan-forward, mod-online-sign]
+
+Known issues:
+
+* The delegations are not signed correctly.
+
+* Some CNAME records are not signed correctly.
+
+* The automatic policy-based key rotation does not work. The rotation events are
+  invoked just at server (re)load.
+
+Limitations:
+
+* Online-sign module always enforces Single-Type Signing scheme.
+
+* Only one active signing key can be used.
+
+* Key rollover is not possible.
+
+* The NSEC records may differ for one domain name if queried for different
+  types. This is an implementation shortcoming as the dynamic modules
+  cooperate loosely. Possible synthesis of a type by other module cannot
+  be predicted. This dissimilarity should not affect response validation,
+  even with validators performing `aggressive negative caching
+  <https://datatracker.ietf.org/doc/draft-fujiwara-dnsop-nsec-aggressiveuse/>`_.
+
+* The NSEC proofs will work well with other dynamic modules only if the
+  modules synthesize only A and AAAA records. If synthesis of other type
+  is required, please, report this information to Knot DNS developers.
+
+``whoami`` — whoami module
+--------------------------
+
+The module synthesizes an A or AAAA record containing the query source IP address,
+at the apex of the zone being served. It makes sure to allow Knot DNS to generate
+cacheable negative responses, and to allow fallback to extra records defined in the
+underlying zone file. The TTL of the synthesized record is copied from
+the TTL of the SOA record in the zone file.
+
+Because a DNS query for type A or AAAA has nothing to do with whether
+the query occurs over IPv4 or IPv6, this module requires a special
+zone configuration to support both address families. For A queries, the
+underlying zone must have a set of nameservers that only have IPv4
+addresses, and for AAAA queries, the underlying zone must have a set of
+nameservers that only have IPv6 addresses.
+
+To enable this module, you need to add something like the following to
+the Knot DNS configuration file::
+
+    zone:
+      - domain: whoami.domain.example
+        file: "/path/to/whoami.domain.example"
+        module: mod-whoami
+
+    zone:
+      - domain: whoami6.domain.example
+        file: "/path/to/whoami6.domain.example"
+        module: mod-whoami
+
+.. NOTE::
+   This module is not configurable.
+
+The whoami.domain.example zone file example:
+
+  .. code-block:: none
+
+    $TTL 1
+
+    @       SOA     (
+                            whoami.domain.example.          ; MNAME
+                            hostmaster.domain.example.      ; RNAME
+                            2016051300                      ; SERIAL
+                            86400                           ; REFRESH
+                            86400                           ; RETRY
+                            86400                           ; EXPIRE
+                            1                               ; MINIMUM
+                    )
+
+    $TTL 86400
+
+    @       NS      ns1.whoami.domain.example.
+    @       NS      ns2.whoami.domain.example.
+    @       NS      ns3.whoami.domain.example.
+    @       NS      ns4.whoami.domain.example.
+
+    ns1     A       198.51.100.53
+    ns2     A       192.0.2.53
+    ns3     A       203.0.113.53
+    ns4     A       198.19.123.53
+
+The whoami6.domain.example zone file example:
+
+  .. code-block:: none
+
+    $TTL 1
+
+    @       SOA     (
+                            whoami6.domain.example.         ; MNAME
+                            hostmaster.domain.example.      ; RNAME
+                            2016051300                      ; SERIAL
+                            86400                           ; REFRESH
+                            86400                           ; RETRY
+                            86400                           ; EXPIRE
+                            1                               ; MINIMUM
+                    )
+
+    $TTL 86400
+
+    @       NS      ns1.whoami6.domain.example.
+    @       NS      ns2.whoami6.domain.example.
+    @       NS      ns3.whoami6.domain.example.
+    @       NS      ns4.whoami6.domain.example.
+
+    ns1     AAAA    2001:db8:100::53
+    ns2     AAAA    2001:db8:200::53
+    ns3     AAAA    2001:db8:300::53
+    ns4     AAAA    2001:db8:400::53
+
+The parent domain would then delegate whoami.domain.example to
+ns[1-4].whoami.domain.example and whoami6.domain.example to
+ns[1-4].whoami6.domain.example, and include the corresponding A-only or
+AAAA-only glue records.
+
+``noudp`` — noudp module
+------------------------
+
+The module sends empty truncated response to any UDP query. This is similar
+to a slipped answer in :ref:`response rate limiting<mod-rrl_rate-limit>`.
+TCP queries are not affected.
+
+To enable this module globally, you need to add something like the following
+to the configuration file::
+
+    template:
+      - id: default
+        global-module: mod-noudp
+
+.. NOTE::
+   This module is not configurable.
+
+``stats`` — query statistics
+----------------------------
+
+The module extends server statistics with incoming DNS request and corresponding
+response counters, such as used network protocol, total number of responded bytes,
+etc (see :ref:`mod-stats<mod-stats>` for full list of supported counters).
+This module should be configured as the last module.
+
+Common statistics with default module configuration::
+
+    template:
+      - id: default
+        global-module: mod-stats
+
+Per zone statistics with explicit module configuration::
+
+    mod-stats:
+      - id: custom
+        edns-presence: on
+        query-type: on
+
+    template:
+      - id: default
+        module: mod-stats/custom
+
+.. NOTE::
+   Server initiated communication (outgoing NOTIFY, incoming \*XFR,...) is not
+   counted by this module.
+
diff --git a/doc/operation.rst b/doc/operation.rst
index 47c72c3872f7ba632e228fccf3ab97a7d66d8d8c..f7d0663703192284cff53315fc4fcabc11c2c544 100644
--- a/doc/operation.rst
+++ b/doc/operation.rst
@@ -246,6 +246,37 @@ A full example of setting up a completely new zone from scratch::
     $ knotc zone-set example.com www 3600 A 192.168.0.100
     $ knotc zone-commit example.com
 
+.. _Journal behaviour:
+
+Journal behaviour
+=================
+
+Zone journal keeps some history of changes of the zone. It is useful for
+responding IXFR queries. Also if zone file flush is disabled,
+journal keeps diff between zonefile and zone for the case of server shutdown.
+The history is stored by changesets - diffs of zone contents between two
+(usually subsequent) zone serials.
+
+Journals for all zones are stored in common LMDB database. Huge changesets are
+split into 70 KiB (this constant is hardcoded) blocks to prevent fragmentation of the DB.
+Journal does each operation in one transaction to keep consistency of the DB and performance.
+The exception is when store transaction exceeds 5% of the whole DB mapsize, it is split into multiple ones
+and some dirty-chunks-management involves.
+
+Each zone journal has own
+usage limit on how much DB space it may occupy. Before hitting the limit,
+changesets are stored one-by-one and whole history is linear. While hitting the limit,
+the zone is flushed into zone file, and oldest changesets are deleted as needed to free
+some space. Actually, twice (again, hardcoded constant) the needed amount is deleted to
+prevent too frequent deletes. Further zone file flush is invoked after the journal runs out of deletable
+"flushed changesets".
+
+If zone file flush is disabled, instead of flushing the zone, the journal tries to
+save space by merging older changesets into one. It works well if the changes rewrite
+each other, e.g. periodically changing few zone records, re-signing whole zone...
+The diff between zone file and zone is thus preserved, even if journal deletes some
+older changesets.
+
 .. _Controlling running daemon:
 
 Daemon controls
@@ -266,3 +297,24 @@ no differences will be created.
 If you want to refresh the slave zones, you can do this with::
 
     $ knotc zone-refresh
+
+.. _Statistics:
+
+Statistics
+==========
+
+The server provides some general statistics and optional query module statistics
+(see :ref:`mod-stats<mod-stats>`).
+
+Server statistics or global module statistics can be shown by::
+
+    $ knotc stats
+    $ knotc stats server             # Show all server counters
+    $ knotc stats mod-stats          # Show all mod-stats counters
+    $ knotc stats server.zone-count  # Show specific server counter
+
+Per zone statistics can be shown by::
+
+    $ knotc zone-stats example.com mod-stats
+
+To show all supported counters even with 0 value use the force option.
diff --git a/doc/reference.rst b/doc/reference.rst
index 479b60636ef1b15c6998754a47301bc9f95c4ff3..36c0519b561ee3bf45ec14e84aeff0cddaac1f68 100644
--- a/doc/reference.rst
+++ b/doc/reference.rst
@@ -31,12 +31,13 @@ the following symbols:
 - [ ] – Optional value
 - \| – Choice
 
-There are 10 main sections (``server``, ``control``, ``log``, ``keystore``,
-``policy``, ``key``, ``acl``, ``remote``, ``template``, and ``zone``) and
-module sections with the ``mod-`` prefix. Most of the sections (excluding
-``server`` and ``control``) are sequences of settings blocks. Each settings block
-begins with a unique identifier, which can be used as a reference from other
-sections (such identifier must be defined in advance).
+There are 11 main sections (``server``, ``control``, ``log``, ``statistics``,
+``keystore``, ``policy``, ``key``, ``acl``, ``remote``, ``template``, and
+``zone``) and module sections with the ``mod-`` prefix. Most of the sections
+(excluding ``server``, ``control``, and ``statistics``) are sequences of
+settings blocks. Each settings block begins with a unique identifier,
+which can be used as a reference from other sections (such identifier
+must be defined in advance).
 
 A multi-valued item can be specified either as a YAML sequence::
 
@@ -56,8 +57,8 @@ Comments
 ========
 
 A comment begins with a ``#`` character and is ignored during processing.
-Also each configuration section or sequence block allows to specify permanent
-comment using ``comment`` item which is stored in the server beside the
+Also each configuration section or sequence block allows a permanent
+comment using the ``comment`` item which is stored in the server beside the
 configuration.
 
 .. _Includes:
@@ -102,10 +103,6 @@ General options related to the server.
      max-udp-payload: SIZE
      max-ipv4-udp-payload: SIZE
      max-ipv6-udp-payload: SIZE
-     rate-limit: INT
-     rate-limit-slip: INT
-     rate-limit-table-size: INT
-     rate-limit-whitelist: ADDR[/INT] | ADDR-ADDR ...
      listen: ADDR[@INT] ...
 
 .. _server_identity:
@@ -249,83 +246,6 @@ descriptor limit to avoid resource exhaustion.
 
 *Default:* 100
 
-.. _server_rate-limit:
-
-rate-limit
-----------
-
-Rate limiting is based on the token bucket scheme. A rate basically
-represents a number of tokens available each second. Each response is
-processed and classified (based on several discriminators, e.g.
-source netblock, query type, zone name, rcode, etc.). Classified responses are
-then hashed and assigned to a bucket containing number of available
-tokens, timestamp and metadata. When available tokens are exhausted,
-response is dropped or sent as truncated (see :ref:`server_rate-limit-slip`).
-Number of available tokens is recalculated each second.
-
-*Default:* 0 (disabled)
-
-.. _server_rate-limit-table-size:
-
-rate-limit-table-size
----------------------
-
-Size of the hash table in a number of buckets. The larger the hash table, the lesser
-the probability of a hash collision, but at the expense of additional memory costs.
-Each bucket is estimated roughly to 32 bytes. The size should be selected as
-a reasonably large prime due to better hash function distribution properties.
-Hash table is internally chained and works well up to a fill rate of 90 %, general
-rule of thumb is to select a prime near 1.2 * maximum_qps.
-
-*Default:* 393241
-
-.. _server_rate-limit-slip:
-
-rate-limit-slip
----------------
-
-As attacks using DNS/UDP are usually based on a forged source address,
-an attacker could deny services to the victim's netblock if all
-responses would be completely blocked. The idea behind SLIP mechanism
-is to send each N\ :sup:`th` response as truncated, thus allowing client to
-reconnect via TCP for at least some degree of service. It is worth
-noting, that some responses can't be truncated (e.g. SERVFAIL).
-
-- Setting the value to **0** will cause that all rate-limited responses will
-  be dropped. The outbound bandwidth and packet rate will be strictly capped
-  by the :ref:`server_rate-limit` option. All legitimate requestors affected
-  by the limit will face denial of service and will observe excessive timeouts.
-  Therefore this setting is not recommended.
-
-- Setting the value to **1** will cause that all rate-limited responses will
-  be sent as truncated. The amplification factor of the attack will be reduced,
-  but the outbound data bandwidth won't be lower than the incoming bandwidth.
-  Also the outbound packet rate will be the same as without RRL.
-
-- Setting the value to **2** will cause that half of the rate-limited responses
-  will be dropped, the other half will be sent as truncated. With this
-  configuration, both outbound bandwidth and packet rate will be lower than the
-  inbound. On the other hand, the dropped responses enlarge the time window
-  for possible cache poisoning attack on the resolver.
-
-- Setting the value to anything **larger than 2** will keep on decreasing
-  the outgoing rate-limited bandwidth, packet rate, and chances to notify
-  legitimate requestors to reconnect using TCP. These attributes are inversely
-  proportional to the configured value. Setting the value high is not advisable.
-
-*Default:* 1
-
-.. _server_rate-limit-whitelist:
-
-rate-limit-whitelist
---------------------
-
-A list of IP addresses, network subnets, or network ranges to exempt from
-rate limiting. Empty list means that no incoming connection will be
-white-listed.
-
-*Default:* not set
-
 .. _server_max-udp-payload:
 
 max-udp-payload
@@ -454,8 +374,7 @@ match one of them. Empty value means that TSIG key is not required.
 action
 ------
 
-An ordered list of allowed actions. Empty action list is only allowed if
-:ref:`deny<acl_deny>` is set.
+An ordered list of allowed (or denied) actions.
 
 Possible values:
 
@@ -470,8 +389,9 @@ Possible values:
 deny
 ----
 
-Deny if :ref:`address<acl_address>`, :ref:`key<acl_key>` and
-:ref:`action<acl_action>` match.
+If enabled, instead of allowing, deny the specified :ref:`action<acl_action>`,
+:ref:`address<acl_address>`, :ref:`key<acl_key>`, or combination if these
+items. If no action is specified, deny all actions.
 
 *Default:* off
 
@@ -506,6 +426,49 @@ Maximum time the control socket operations can take. Set 0 for infinity.
 
 *Default:* 5
 
+.. _statistics_section:
+
+Statistics section
+==================
+
+Periodic server statistics dumping.
+
+::
+
+  statistics:
+      timer: TIME
+      file: STR
+      append: BOOL
+
+.. _statistics_timer:
+
+timer
+-----
+
+A period after which all available statistics metrics will by written to the
+:ref:`file<statistics_file>`.
+
+*Default:* not set
+
+.. _statistics_file:
+
+file
+----
+
+A file path of statistics output in the YAML format.
+
+*Default:* :ref:`rundir<server_rundir>`/stats.yaml
+
+.. _statistics_append:
+
+append
+------
+
+If enabled, the output will be appended to the :ref:`file<statistics_file>`
+instead of file replacement.
+
+*Default:* off
+
 .. _Keystore section:
 
 Keystore section
@@ -566,18 +529,19 @@ DNSSEC policy configuration.
    - id: STR
      keystore: STR
      manual: BOOL
+     single-type-signing: BOOL
      algorithm: dsa | rsasha1 | dsa-nsec3-sha1 | rsasha1-nsec3-sha1 | rsasha256 | rsasha512 | ecdsap256sha256 | ecdsap384sha384
      ksk-size: SIZE
      zsk-size: SIZE
      dnskey-ttl: TIME
      zsk-lifetime: TIME
+     propagation-delay: TIME
      rrsig-lifetime: TIME
      rrsig-refresh: TIME
      nsec3: BOOL
      nsec3-iterations: INT
      nsec3-salt-length: INT
      nsec3-salt-lifetime: TIME
-     propagation-delay: TIME
 
 .. _policy_id:
 
@@ -605,6 +569,20 @@ If enabled, automatic key management is not used.
 
 *Default:* off
 
+.. _policy_single-type-signing:
+
+single-type-signing
+-------------------
+
+If enabled, Single-Type Signing Scheme is used in the automatic key management
+mode.
+
+.. NOTE::
+   Because key rollover is not supported yet, just one combined signing key is
+   generated if none is available.
+
+*Default:* off
+
 .. _policy_algorithm:
 
 algorithm
@@ -641,6 +619,9 @@ A TTL value for DNSKEY records added into zone apex.
 
 *Default:* zone SOA TTL
 
+.. NOTE::
+   has infuence over ZSK key lifetime
+
 .. _policy_zsk-lifetime:
 
 zsk-lifetime
@@ -650,6 +631,22 @@ A period between ZSK publication and the next rollover initiation.
 
 *Default:* 30 days
 
+.. NOTE::
+   ZSK key lifetime is also infuenced by propagation-delay and dnskey-ttl
+
+.. _policy_propagation-delay:
+
+propagation-delay
+-----------------
+
+An extra delay added for each key rollover step. This value should be high
+enough to cover propagation of data from the master server to all slaves.
+
+*Default:* 1 day
+
+.. NOTE::
+   has infuence over ZSK key lifetime
+
 .. _policy_rrsig-lifetime:
 
 rrsig-lifetime
@@ -705,16 +702,6 @@ A validity period of newly issued salt field.
 
 *Default:* 30 days
 
-.. _policy_propagation-delay:
-
-propagation-delay
------------------
-
-An extra delay added for each key rollover step. This value should be high
-enough to cover propagation of data from the master server to all slaves.
-
-*Default:* 1 day
-
 .. _Remote section:
 
 Remote section
@@ -766,7 +753,7 @@ can be appended to the address using ``@`` separator.
 key
 ---
 
-A :ref:`reference<key_id>` to the TSIG key which ise used to autenticate
+A :ref:`reference<key_id>` to the TSIG key which is used to authenticate
 the communication with the remote server.
 
 *Default:* not set
@@ -786,6 +773,8 @@ if a zone doesn't have another template specified.
  template:
    - id: STR
      timer-db: STR
+     journal-db: STR
+     max-journal-db-size: SIZE
      global-module: STR/STR ...
      # All zone options (excluding 'template' item)
 
@@ -809,12 +798,44 @@ as a relative path to the *default* template :ref:`storage<zone_storage>`.
 
 *Default:* :ref:`storage<zone_storage>`/timers
 
+.. _template_journal-db:
+
+journal-db
+----------
+
+Specifies a path of the persistent journal database. The path can be specified
+as a relative path to the *default* template :ref:`storage<zone_storage>`.
+
+.. NOTE::
+   This option is only available in the *default* template.
+
+*Default:* :ref:`storage<zone_storage>`/journal
+
+.. _template_max-journal-db-size:
+
+max-journal-db-size
+-------------------
+
+Hard limit for the common journal DB. There is no cleanup logic in journal
+to recover from reaching this limit: journal simply starts refusing changes
+across all zones. Decreasing this value has no effect if lower than actual
+DB file size.
+
+It is recommended to limit :ref:`max-journal-usage<zone_max-journal-usage>`
+per-zone instead of max-journal-size in most cases. Please keep this value
+large enough. This value also influences server's usage of virtual memory.
+
+.. NOTE::
+   This option is only available in the *default* template.
+
+*Default:* 20 GiB
+
 .. _template_global-module:
 
 global-module
 -------------
 
-An ordered list of references to query modules in the form
+An ordered list of references to query modules in the form of *module_name* or
 *module_name/module_id*. These modules apply to all queries.
 
 .. NOTE::
@@ -834,8 +855,8 @@ Definition of zones served by the server.
  zone:
    - domain: DNAME
      template: template_id
-     file: STR
      storage: STR
+     file: STR
      master: remote_id ...
      ddns-master: remote_id
      notify: remote_id ...
@@ -844,7 +865,8 @@ Definition of zones served by the server.
      disable-any: BOOL
      zonefile-sync: TIME
      ixfr-from-differences: BOOL
-     max-journal-size: SIZE
+     max-journal-usage: SIZE
+     max-journal-depth: INT
      max-zone-size : SIZE
      dnssec-signing: BOOL
      dnssec-policy: STR
@@ -869,6 +891,15 @@ A :ref:`reference<template_id>` to a configuration template.
 
 *Default:* not set or *default* (if the template exists)
 
+.. _zone_storage:
+
+storage
+-------
+
+A data directory for storing zone files, journal files and timers database.
+
+*Default:* ``${localstatedir}/lib/knot`` (configured with ``--with-storage=path``)
+
 .. _zone_file:
 
 file
@@ -880,8 +911,8 @@ A path to the zone file. Non absolute path is relative to
 - ``%c[``\ *N*\ ``]`` or ``%c[``\ *N*\ ``-``\ *M*\ ``]`` – means the *N*\ th
   character or a sequence of characters beginning from the *N*\ th and ending
   with the *M*\ th character of the textual zone name (see ``%s``). The
-  indexes are counted from 0 from the left. If the character is not available,
-  the formatter has no effect.
+  indexes are counted from 0 from the left. All dots (including the terminal
+  one) are considered. If the character is not available, the formatter has no effect.
 - ``%l[``\ *N*\ ``]`` – means the *N*\ th label of the textual zone name
   (see ``%s``). The index is counted from 0 from the right (0 ~ TLD).
   If the label is not available, the formatter has no effect.
@@ -893,15 +924,6 @@ A path to the zone file. Non absolute path is relative to
 
 *Default:* :ref:`storage<zone_storage>`/``%s``\ .zone
 
-.. _zone_storage:
-
-storage
--------
-
-A data directory for storing zone files, journal files and timers database.
-
-*Default:* ``${localstatedir}/lib/knot`` (configured with ``--with-storage=path``)
-
 .. _zone_master:
 
 master
@@ -1003,6 +1025,11 @@ can be used (manual zone flush is still possible).
    If you are serving large zones with frequent updates where
    the immediate sync with a zone file is not desirable, increase the value.
 
+.. WARNING::
+   If the zone file is not up-to-date, the zone should be flushed before its
+   zone file editation or the SOA record must be untouched after editation.
+   Otherwise the journal can't be applied.
+
 *Default:* 0 (immediate)
 
 .. _zone_ixfr-from-differences:
@@ -1020,12 +1047,25 @@ is a master server for the zone.
 
 *Default:* off
 
-.. _zone_max_journal_size:
+.. _zone_max-journal-usage:
 
-max-journal-size
-----------------
+max-journal-usage
+-----------------
+
+Policy how much space in journal DB will the zone's journal occupy.
+
+*Default:* 100 MiB
+
+.. NOTE::
+   Journal DB may grow far above the sum of max-journal-usage across
+   all zones, because of DB free space fragmentation.
 
-Maximum size of the zone journal file.
+.. _zone_max_journal_depth:
+
+max-journal-depth
+-----------------
+
+Maximum history length of journal.
 
 *Default:* 2^64
 
@@ -1113,7 +1153,7 @@ Possible values:
 module
 ------
 
-An ordered list of references to query modules in the form
+An ordered list of references to query modules in the form of *module_name* or
 *module_name/module_id*. These modules apply only to the current zone queries.
 
 *Default:* not set
@@ -1150,6 +1190,7 @@ will be logged to both standard error output and syslog. The ``info`` and
  log:
    - target: stdout | stderr | syslog | STR
      server: critical | error | warning | notice | info | debug
+     control: critical | error | warning | notice | info | debug
      zone: critical | error | warning | notice | info | debug
      any: critical | error | warning | notice | info | debug
 
@@ -1177,6 +1218,15 @@ that are logged.
 
 *Default:* not set
 
+.. _log_control:
+
+control
+-------
+
+Minimum severity level for messages related to server control that are logged.
+
+*Default:* not set
+
 .. _log_zone:
 
 zone
@@ -1195,6 +1245,106 @@ Minimum severity level for all message types that are logged.
 
 *Default:* not set
 
+.. _mod-rrl:
+
+Module rrl
+==========
+
+A response rate limiting module.
+
+::
+
+ mod-rrl:
+   - id: STR
+     rate-limit: INT
+     slip: INT
+     table-size: INT
+     whitelist: ADDR[/INT] | ADDR-ADDR ...
+
+.. _mod-rrl_id:
+
+id
+--
+
+A module identifier.
+
+.. _mod-rrl_rate-limit:
+
+rate-limit
+----------
+
+Rate limiting is based on the token bucket scheme. A rate basically
+represents a number of tokens available each second. Each response is
+processed and classified (based on several discriminators, e.g.
+source netblock, query type, zone name, rcode, etc.). Classified responses are
+then hashed and assigned to a bucket containing number of available
+tokens, timestamp and metadata. When available tokens are exhausted,
+response is dropped or sent as truncated (see :ref:`mod-rrl_slip`).
+Number of available tokens is recalculated each second.
+
+*Required*
+
+.. _mod-rrl_table-size:
+
+table-size
+----------
+
+Size of the hash table in a number of buckets. The larger the hash table, the lesser
+the probability of a hash collision, but at the expense of additional memory costs.
+Each bucket is estimated roughly to 32 bytes. The size should be selected as
+a reasonably large prime due to better hash function distribution properties.
+Hash table is internally chained and works well up to a fill rate of 90 %, general
+rule of thumb is to select a prime near 1.2 * maximum_qps.
+
+*Default:* 393241
+
+.. _mod-rrl_slip:
+
+slip
+----
+
+As attacks using DNS/UDP are usually based on a forged source address,
+an attacker could deny services to the victim's netblock if all
+responses would be completely blocked. The idea behind SLIP mechanism
+is to send each N\ :sup:`th` response as truncated, thus allowing client to
+reconnect via TCP for at least some degree of service. It is worth
+noting, that some responses can't be truncated (e.g. SERVFAIL).
+
+- Setting the value to **0** will cause that all rate-limited responses will
+  be dropped. The outbound bandwidth and packet rate will be strictly capped
+  by the :ref:`mod-rrl_rate-limit` option. All legitimate requestors affected
+  by the limit will face denial of service and will observe excessive timeouts.
+  Therefore this setting is not recommended.
+
+- Setting the value to **1** will cause that all rate-limited responses will
+  be sent as truncated. The amplification factor of the attack will be reduced,
+  but the outbound data bandwidth won't be lower than the incoming bandwidth.
+  Also the outbound packet rate will be the same as without RRL.
+
+- Setting the value to **2** will cause that half of the rate-limited responses
+  will be dropped, the other half will be sent as truncated. With this
+  configuration, both outbound bandwidth and packet rate will be lower than the
+  inbound. On the other hand, the dropped responses enlarge the time window
+  for possible cache poisoning attack on the resolver.
+
+- Setting the value to anything **larger than 2** will keep on decreasing
+  the outgoing rate-limited bandwidth, packet rate, and chances to notify
+  legitimate requestors to reconnect using TCP. These attributes are inversely
+  proportional to the configured value. Setting the value high is not advisable.
+
+*Default:* 1
+
+.. _mod-rrl_whitelist:
+
+whitelist
+---------
+
+A list of IP addresses, network subnets, or network ranges to exempt from
+rate limiting. Empty list means that no incoming connection will be
+white-listed.
+
+*Default:* not set
+
 .. _Module dnstap:
 
 Module dnstap
@@ -1268,6 +1418,36 @@ If enabled, response messages will be logged.
 
 *Default:* on
 
+.. _Module online-sign:
+
+Module online-sign
+==================
+
+The module provides online DNSSEC signing. Instead of pre-computing the zone signatures
+when the zone is loaded into the server or instead of loading an externally signed zone,
+the signatures are computed on-the-fly during answering.
+
+::
+
+ mod-online-sign:
+   - id: STR
+     policy: STR
+
+.. _mod-online-sign_id:
+
+id
+--
+
+A module identifier.
+
+.. _mod-online-sign_policy:
+
+policy
+------
+
+A :ref:`reference<policy_id>` to DNSSEC signing policy. A special *default*
+value can be used for the default policy settings.
+
 .. _Module synth-record:
 
 Module synth-record
@@ -1360,6 +1540,7 @@ server for resolution.
  mod-dnsproxy:
    - id: STR
      remote: remote_id
+     timeout: INT
      catch-nxdomain: BOOL
 
 .. _mod-dnsproxy_id:
@@ -1379,6 +1560,15 @@ forwarded to.
 
 *Required*
 
+.. _mod-dnsproxy_timeout:
+
+timeout
+-------
+
+A remote response timeout in milliseconds.
+
+*Default:* 500
+
 .. _mod-dnsproxy_catch-nxdomain:
 
 catch-nxdomain
@@ -1419,60 +1609,213 @@ A path to the directory where the database is stored.
 
 *Required*
 
-.. _mod-online-sign:
+.. _mod-stats:
 
-Module online-sign
-==================
+Module stats
+============
+
+The module provides incoming query processing statistics.
 
-The module provides online DNSSEC signing.
+.. NOTE::
+   Leading 16-bit message size over TCP is not considered.
 
 ::
 
- mod-online-sign:
+ mod-stats:
    - id: STR
-
-.. _mod-online-sign_id:
+     request-protocol: BOOL
+     server-operation: BOOL
+     request-bytes: BOOL
+     response-bytes: BOOL
+     edns-presence: BOOL
+     flag-presence: BOOL
+     response-code: BOOL
+     reply-nodata: BOOL
+     query-type: BOOL
+     query-size: BOOL
+     reply-size: BOOL
+
+.. _mod-stats_id:
 
 id
 --
 
 A module identifier.
 
-.. _mod-whoami:
+.. _mod-stats_request-protocol:
 
-Module whoami
-=============
+request-protocol
+----------------
 
-The module synthesizes an A or AAAA record containing the query source IP address, 
-at the apex of the zone being served.
+If enabled, all incoming requests are counted by the network protocol:
 
-::
+* udp4 - UDP over IPv4
+* tcp4 - TCP over IPv4
+* udp6 - UDP over IPv6
+* tcp6 - TCP over IPv6
 
- mod-whoami:
-   - id: STR
+*Default:* on
 
-.. _mod-whoami_id:
+.. _mod-stats_server-operation:
 
-id
---
+server-operation
+----------------
 
-A module identifier.
+If enabled, all incoming requests are counted by the server operation. The
+server operation is based on message header OpCode and message query (meta) type:
 
-.. _mod-noudp:
+* query - Normal query operation
+* update - Dynamic update operation
+* notify - NOTIFY request operation
+* axfr - Full zone transfer operation
+* ixfr - Incremental zone transfer operation
+* invalid - Invalid server operation
 
-Module noudp
-============
+*Default:* on
 
-The module sends empty truncated response to any UDP query.
+.. _mod-stats_request-bytes:
 
-::
+request-bytes
+-------------
 
- mod-noudp:
-   - id: STR
+If enabled, all incoming request bytes are counted by the server operation:
 
-.. _mod-noudp_id:
+* query - Normal query bytes
+* update - Dynamic update bytes
+* other - Other request bytes
 
-id
---
+*Default:* on
 
-A module identifier.
+.. _mod-stats_response-bytes:
+
+response-bytes
+--------------
+
+If enabled, outgoing response bytes are counted by the server operation:
+
+* reply - Normal response bytes
+* transfer - Zone transfer bytes
+* other - Other response bytes
+
+.. WARNING::
+   Dynamic update response bytes are not counted by this module.
+
+*Default:* on
+
+.. _mod-stats_edns-presence:
+
+edns-presence
+-------------
+
+If enabled, EDNS pseudo section presence is counted by the message direction:
+
+* request - EDNS present in request
+* response - EDNS present in response
+
+*Default:* off
+
+.. _mod-stats_flag-presence:
+
+flag-presence
+-------------
+
+If enabled, some message header flags are counted:
+
+* TC - Truncated Answer in response
+* DO - DNSSEC OK in request
+
+*Default:* off
+
+.. _mod-stats_response-code:
+
+response-code
+-------------
+
+If enabled, outgoing response code is counted:
+
+* NOERROR
+* ...
+* NOTZONE
+* BADVERS
+* ...
+* BADCOOKIE
+* other - All other codes
+
+.. NOTE::
+   In the case of multi-message zone transfer response, just one counter is
+   incremented.
+
+.. WARNING::
+   Dynamic update response code is not counted by this module.
+
+*Default:* on
+
+.. _mod-stats_reply-nodata:
+
+reply-nodata
+------------
+
+If enabled, NODATA pseudo RCODE (see RFC 2308, Section 2.2) is counted by the
+query type:
+
+* A
+* AAAA
+* other - All other types
+
+*Default:* off
+
+.. _mod-stats_query-type:
+
+query-type
+----------
+
+If enabled, normal query type is counted:
+
+* A (TYPE1)
+* ...
+* TYPE65
+* SPF (TYPE99)
+* ...
+* TYPE110
+* ANY (TYPE255)
+* ...
+* TYPE260
+* other - All other types
+
+.. NOTE::
+   Not all assigned meta types (IXFR, AXFR,...) have their own counters,
+   because such types are not processed as normal query.
+
+*Default:* off
+
+.. _mod-stats_query-size:
+
+query-size
+----------
+
+If enabled, normal query message size distribution is counted by the size range
+in bytes:
+
+* 0-15
+* 16-31
+* ...
+* 272-287
+* 288-65535
+
+*Default:* off
+
+.. _mod-stats_reply-size:
+
+reply-size
+----------
+
+If enabled, normal reply message size distribution is counted by the size range
+in bytes:
+
+* 0-15
+* 16-31
+* ...
+* 4080-4095
+* 4096-65535
+
+*Default:* off
diff --git a/doc/utilities.rst b/doc/utilities.rst
index 7df012f42ed1f41cfa75ef0c1dd3ff6b5f02ce52..77134987d82c6b55fa1080dc9c7e9edb5d89df34 100644
--- a/doc/utilities.rst
+++ b/doc/utilities.rst
@@ -13,6 +13,7 @@ the server. This section collects manual pages for all provided binaries:
    man_kdig
    man_keymgr
    man_khost
+   man_kjournalprint
    man_knot1to2
    man_knotc
    man_knotd
diff --git a/libtap/tap/files.c b/libtap/tap/files.c
index 90f087f3724cfb206f4866b6ce195f73cf65549e..2e67e9e57975b8ca8a33272f4bb5281a9f600baa 100644
--- a/libtap/tap/files.c
+++ b/libtap/tap/files.c
@@ -16,6 +16,7 @@
 
 #include "files.h"
 
+#include "../../src/contrib/string.c"
 #include "../../src/contrib/files.c"
 
 #include <stdlib.h>
diff --git a/m4/ax_check_link_flag.m4 b/m4/ax_check_link_flag.m4
new file mode 100644
index 0000000000000000000000000000000000000000..e2d0d363e4c4ac672d36a2c964973136d007be73
--- /dev/null
+++ b/m4/ax_check_link_flag.m4
@@ -0,0 +1,71 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
+#
+# DESCRIPTION
+#
+#   Check whether the given FLAG works with the linker or gives an error.
+#   (Warnings, however, are ignored)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   If EXTRA-FLAGS is defined, it is added to the linker's default flags
+#   when the check is done.  The check is thus made with the flags: "LDFLAGS
+#   EXTRA-FLAGS FLAG".  This can for example be used to force the linker to
+#   issue an error when a bad flag is given.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+#   macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   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 the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 2
+
+AC_DEFUN([AX_CHECK_LINK_FLAG],
+[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
+AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
+  ax_check_save_flags=$LDFLAGS
+  LDFLAGS="$LDFLAGS $4 $1"
+  AC_LINK_IFELSE([AC_LANG_PROGRAM()],
+    [AS_VAR_SET(CACHEVAR,[yes])],
+    [AS_VAR_SET(CACHEVAR,[no])])
+  LDFLAGS=$ax_check_save_flags])
+AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
+  [m4_default([$2], :)],
+  [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_LINK_FLAGS
diff --git a/python/Makefile.am b/python/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..2c03a5bb7c3ad55868bfaae5ad8ea95bc43d7c1e
--- /dev/null
+++ b/python/Makefile.am
@@ -0,0 +1,5 @@
+EXTRA_DIST =			\
+	libknot/__init__.py	\
+	libknot/control.py	\
+	stats_http.py		\
+	stats_influxdb.py
diff --git a/python/libknot/control.py b/python/libknot/control.py
index 43737031b3a0f891b2c0e3f41c44c9d26e144f4b..c2f677e2fa37b205f19e6c43899166c5c00a70e6 100755
--- a/python/libknot/control.py
+++ b/python/libknot/control.py
@@ -1,6 +1,9 @@
 """Libknot server control interface wrapper.
 
 Example:
+    import json
+    from libknot.control import *
+
     ctl = KnotCtl()
     ctl.connect("/var/run/knot/knot.sock")
 
@@ -25,35 +28,72 @@ Example:
 from ctypes import cdll, c_void_p, c_int, c_char_p, c_uint, byref
 from enum import IntEnum
 
-LIB = cdll.LoadLibrary('libknot.so')
+CTL_ALLOC = None
+CTL_FREE = None
+CTL_SET_TIMEOUT = None
+CTL_CONNECT = None
+CTL_CLOSE = None
+CTL_SEND = None
+CTL_RECEIVE = None
+CTL_ERROR = None
+
+
+def load_lib(path="libknot.so"):
+    """Loads the libknot library."""
+
+    LIB = cdll.LoadLibrary(path)
+
+    global CTL_ALLOC
+    CTL_ALLOC = LIB.knot_ctl_alloc
+    CTL_ALLOC.restype = c_void_p
+
+    global CTL_FREE
+    CTL_FREE = LIB.knot_ctl_free
+    CTL_FREE.argtypes = [c_void_p]
+
+    global CTL_SET_TIMEOUT
+    CTL_SET_TIMEOUT = LIB.knot_ctl_set_timeout
+    CTL_SET_TIMEOUT.argtypes = [c_void_p, c_int]
 
-CTL_ALLOC = LIB.knot_ctl_alloc
-CTL_ALLOC.restype = c_void_p
+    global CTL_CONNECT
+    CTL_CONNECT = LIB.knot_ctl_connect
+    CTL_CONNECT.restype = c_int
+    CTL_CONNECT.argtypes = [c_void_p, c_char_p]
 
-CTL_FREE = LIB.knot_ctl_free
-CTL_FREE.argtypes = [c_void_p]
+    global CTL_CLOSE
+    CTL_CLOSE = LIB.knot_ctl_close
+    CTL_CLOSE.argtypes = [c_void_p]
 
-CTL_SET_TIMEOUT = LIB.knot_ctl_set_timeout
-CTL_SET_TIMEOUT.argtypes = [c_void_p, c_int]
+    global CTL_SEND
+    CTL_SEND = LIB.knot_ctl_send
+    CTL_SEND.restype = c_int
+    CTL_SEND.argtypes = [c_void_p, c_uint, c_void_p]
 
-CTL_CONNECT = LIB.knot_ctl_connect
-CTL_CONNECT.restype = c_int
-CTL_CONNECT.argtypes = [c_void_p, c_char_p]
+    global CTL_RECEIVE
+    CTL_RECEIVE = LIB.knot_ctl_receive
+    CTL_RECEIVE.restype = c_int
+    CTL_RECEIVE.argtypes = [c_void_p, c_void_p, c_void_p]
 
-CTL_CLOSE = LIB.knot_ctl_close
-CTL_CLOSE.argtypes = [c_void_p]
+    global CTL_ERROR
+    CTL_ERROR = LIB.knot_strerror
+    CTL_ERROR.restype = c_char_p
+    CTL_ERROR.argtypes = [c_int]
 
-CTL_SEND = LIB.knot_ctl_send
-CTL_SEND.restype = c_int
-CTL_SEND.argtypes = [c_void_p, c_uint, c_void_p]
 
-CTL_RECEIVE = LIB.knot_ctl_receive
-CTL_RECEIVE.restype = c_int
-CTL_RECEIVE.argtypes = [c_void_p, c_void_p, c_void_p]
+class KnotCtlError(Exception):
+    """Libknot server control error."""
 
-CTL_ERROR = LIB.knot_strerror
-CTL_ERROR.restype = c_char_p
-CTL_ERROR.argtypes = [c_int]
+    def __init__(self, message, data=None):
+        """
+        @type message: str
+        @type data: KnotCtlData
+        """
+
+        self.message = message
+        self.data = data
+
+    def __str__(self):
+        return "%s (data: %s)" % (self.message, self.data)
 
 
 class KnotCtlType(IntEnum):
@@ -89,6 +129,17 @@ class KnotCtlData(object):
     def __init__(self):
         self.data = self.DataArray()
 
+    def __str__(self):
+        string = str()
+
+        for idx in KnotCtlDataIdx:
+            if self.data[idx]:
+                if string:
+                    string += ", "
+                string += "%s = %s" % (idx.name, self.data[idx])
+
+        return string
+
     def __getitem__(self, index):
         """Data unit item getter.
 
@@ -114,6 +165,8 @@ class KnotCtl(object):
     """Libknot server control interface."""
 
     def __init__(self):
+        if not CTL_ALLOC:
+            load_lib()
         self.obj = CTL_ALLOC()
 
     def __del__(self):
@@ -136,7 +189,7 @@ class KnotCtl(object):
         ret = CTL_CONNECT(self.obj, path.encode())
         if ret != 0:
             err = CTL_ERROR(ret)
-            raise Exception(err if isinstance(err, str) else err.decode())
+            raise KnotCtlError(err if isinstance(err, str) else err.decode())
 
     def close(self):
         """Disconnects from the current control socket."""
@@ -154,7 +207,7 @@ class KnotCtl(object):
                        data.data if data else c_char_p())
         if ret != 0:
             err = CTL_ERROR(ret)
-            raise Exception(err if isinstance(err, str) else err.decode())
+            raise KnotCtlError(err if isinstance(err, str) else err.decode())
 
     def receive(self, data=None):
         """Receives a data unit from the connected control socket.
@@ -168,11 +221,11 @@ class KnotCtl(object):
                           data.data if data else c_char_p())
         if ret != 0:
             err = CTL_ERROR(ret)
-            raise Exception(err if isinstance(err, str) else err.decode())
+            raise KnotCtlError(err if isinstance(err, str) else err.decode())
         return KnotCtlType(data_type.value)
 
     def send_block(self, cmd, section=None, item=None, identifier=None, zone=None,
-                   owner=None, ttl=None, rtype=None, data=None):
+                   owner=None, ttl=None, rtype=None, data=None, flags=None):
         """Sends a control query block.
 
         @type cmd: str
@@ -196,6 +249,7 @@ class KnotCtl(object):
         query[KnotCtlDataIdx.TTL] = ttl
         query[KnotCtlDataIdx.TYPE] = rtype
         query[KnotCtlDataIdx.DATA] = data
+        query[KnotCtlDataIdx.FLAGS] = flags
 
         self.send(KnotCtlType.DATA, query)
         self.send(KnotCtlType.BLOCK)
@@ -212,18 +266,19 @@ class KnotCtl(object):
             out[section] = dict()
 
         # Add the identifier if not exists.
-        if ident and ident not in section:
-            section[ident] = dict()
+        if ident and ident not in out[section]:
+            out[section][ident] = dict()
 
         # Return if no item/value.
         if not item:
             return
 
-        item_level = section[ident] if ident else section
+        item_level = out[section][ident] if ident else out[section]
 
         # Treat alone identifier item differently.
         if item in ["id", "domain", "target"]:
-            section[data] = dict()
+            if data not in out[section]:
+                out[section][data] = dict()
         else:
             if item not in item_level:
                 item_level[item] = list()
@@ -269,6 +324,64 @@ class KnotCtl(object):
         else:
             out[zone][owner][rtype]["data"].append(data)
 
+    def _receive_stats(self, out, reply):
+
+        zone = reply[KnotCtlDataIdx.ZONE]
+        section = reply[KnotCtlDataIdx.SECTION]
+        item = reply[KnotCtlDataIdx.ITEM]
+        idx = reply[KnotCtlDataIdx.ID]
+        data = reply[KnotCtlDataIdx.DATA]
+
+        # Add the zone if not exists.
+        if zone:
+            if "zone" not in out:
+                out["zone"] = dict()
+
+            if zone not in out["zone"]:
+                out["zone"][zone] = dict()
+
+        section_level = out["zone"][zone] if zone else out
+
+        if section not in section_level:
+            section_level[section] = dict()
+
+        if idx:
+            if item not in section_level[section]:
+                section_level[section][item] = dict()
+
+            section_level[section][item][idx] = data
+        else:
+            section_level[section][item] = data
+
+    def receive_stats(self):
+        """Receives statistics answer and returns it as a structured dictionary.
+
+        @rtype: dict
+        """
+
+        out = dict()
+        err_reply = None
+
+        while True:
+            reply = KnotCtlData()
+            reply_type = self.receive(reply)
+
+            # Stop if not data type.
+            if reply_type not in [KnotCtlType.DATA, KnotCtlType.EXTRA]:
+                break
+
+            # Check for an error.
+            if reply[KnotCtlDataIdx.ERROR]:
+                err_reply = reply
+                continue
+
+            self._receive_stats(out, reply)
+
+        if err_reply:
+            raise KnotCtlError(err_reply[KnotCtlDataIdx.ERROR], err_reply)
+
+        return out
+
     def receive_block(self):
         """Receives a control answer and returns it as a structured dictionary.
 
@@ -276,6 +389,7 @@ class KnotCtl(object):
         """
 
         out = dict()
+        err_reply = None
 
         while True:
             reply = KnotCtlData()
@@ -287,7 +401,8 @@ class KnotCtl(object):
 
             # Check for an error.
             if reply[KnotCtlDataIdx.ERROR]:
-                raise Exception(reply[KnotCtlDataIdx.ERROR])
+                err_reply = reply
+                continue
 
             # Check for config data.
             if reply[KnotCtlDataIdx.SECTION]:
@@ -301,4 +416,7 @@ class KnotCtl(object):
             else:
                 continue
 
+        if err_reply:
+            raise KnotCtlError(err_reply[KnotCtlDataIdx.ERROR], err_reply)
+
         return out
diff --git a/python/stats_http.py b/python/stats_http.py
new file mode 100755
index 0000000000000000000000000000000000000000..a38d5f752160888e22ef0733c7c292a226a7e18c
--- /dev/null
+++ b/python/stats_http.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+
+"""Simple program for exposing statistics from Knot DNS over HTTP/HTTPS."""
+
+import http.server
+import libknot.control
+import json
+import ssl
+import time
+
+# Configuration.
+#libknot.control.load_lib("../src/.libs/libknot.so")
+ctl_socket = "/tmp/knot.sock"
+ctl_timeout = 2
+ctl_flags = "" # set "F" for all supported counters.
+http_host = "127.0.0.1"
+http_port = 8080
+ssl_enable = False
+ssl_keyfile = "./mykey.key"
+ssl_certfile = "./mycert.crt"
+
+
+class StatsServer(http.server.BaseHTTPRequestHandler):
+    def do_GET(self):
+        self.send_response(200)
+        self.send_header("Content-type", "text/html")
+        self.end_headers()
+
+        # Connect to Knot server.
+        ctl = libknot.control.KnotCtl()
+        ctl.connect(ctl_socket)
+        ctl.set_timeout(ctl_timeout)
+
+        # Get global metrics.
+        global_stats = dict()
+        try:
+            ctl.send_block(cmd="stats", flags=ctl_flags)
+            global_stats = ctl.receive_stats()
+        except:
+            pass
+
+        # Get zone metrics.
+        zone_stats = dict()
+        try:
+            ctl.send_block(cmd="zone-stats", flags=ctl_flags)
+            zone_stats = ctl.receive_stats()
+        except:
+           pass
+
+        # Disconnect from the server.
+        ctl.send(libknot.control.KnotCtlType.END)
+        ctl.close()
+
+        # Publish the stats.
+        stats = {**global_stats, **zone_stats}
+        self.wfile.write(bytes(json.dumps(stats, indent=4, sort_keys=True), "utf-8"))
+
+
+httpd = http.server.HTTPServer((http_host, http_port), StatsServer)
+
+if ssl_enable:
+    httpd.socket = ssl.wrap_socket(httpd.socket, keyfile=ssl_keyfile,
+                                   certfile=ssl_certfile, server_side=True)
+
+print("%s: HTTP%s Server Start - %s:%s" %
+      (time.asctime(), "S" if ssl_enable else "", http_host, http_port))
+
+try:
+    httpd.serve_forever()
+except KeyboardInterrupt:
+    pass
+
+httpd.server_close()
diff --git a/python/stats_influxdb.py b/python/stats_influxdb.py
new file mode 100755
index 0000000000000000000000000000000000000000..33d3709501981b1e4bcc2b13dd651beea266fc83
--- /dev/null
+++ b/python/stats_influxdb.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+
+"""Simple program for exporting statistics from Knot DNS to influxdb."""
+
+import libknot.control
+import io
+import json
+import os
+import time
+
+# Configuration.
+#libknot.control.load_lib("../src/.libs/libknot.so")
+ctl_socket = "/tmp/knot.sock"
+ctl_timeout = 2
+# InfluxDB parameters.
+host = "217.31.192.164"
+port = "8086"
+db = "KnotDNS"
+instance = "Knot"
+# Send metrics every N seconds.
+send_interval = 5
+
+
+def send():
+    # Connect to Knot server.
+    ctl = libknot.control.KnotCtl()
+    ctl.connect(ctl_socket)
+    ctl.set_timeout(ctl_timeout)
+
+    # Get global metrics.
+    global_stats = dict()
+    try:
+        ctl.send_block(cmd="stats", flags="F")
+        global_stats = ctl.receive_stats()
+    except:
+        pass
+
+    # Get zone metrics.
+    zone_stats = dict()
+    try:
+        ctl.send_block(cmd="zone-stats", flags="F")
+        zone_stats = ctl.receive_stats()
+    except:
+        pass
+
+    # Disconnect from the server.
+    ctl.send(libknot.control.KnotCtlType.END)
+    ctl.close()
+
+    # Prepare the metrics to publish.
+    output = io.StringIO()
+
+    stats = {**global_stats, **zone_stats}
+    timestamp = str(int(time.time()))
+
+    for metric in stats["server"]:
+        print("server,instance=" + instance + ",metric=" + metric + " value=" +
+              stats["server"][metric] + " " + timestamp, file=output)
+
+    for group in stats["mod-stats"]:
+        for metric in stats["mod-stats"][group]:
+            print(group + ",instance=" + instance + ",metric=" + metric +
+                  " value=" + stats["mod-stats"][group][metric] + " " + timestamp,
+                  file=output)
+
+    # Publish the metrics.
+    os.system("curl -i -XPOST 'http://%s:%s/write?db=%s&precision=s' --data-binary '%s'"
+              % (host, port, db, output.getvalue()))
+
+
+print("%s: Graphite sender - Server Start - %s:%s" %
+      (time.asctime(), host, port))
+
+try:
+   while(True):
+      send()
+      time.sleep(send_interval)
+except KeyboardInterrupt:
+   pass
diff --git a/src/Makefile.am b/src/Makefile.am
index 887e38f14bcad95454bf3aad8222031670bb6042..9bc4abd737a6f48a917bdbc14f7a30f21c62e7b4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -28,7 +28,6 @@ EXTRA_DIST =					\
 	contrib/licenses/LGPL-2.0		\
 	contrib/licenses/MIT			\
 	contrib/licenses/OLDAP-2.8		\
-	contrib/hat-trie/LICENSE		\
 	contrib/lmdb/LICENSE			\
 	contrib/murmurhash3/LICENSE		\
 	contrib/openbsd/LICENSE			\
@@ -49,6 +48,7 @@ libcontrib_la_SOURCES = 			\
 	contrib/fnv/longlong.h			\
 	contrib/getline.c			\
 	contrib/getline.h			\
+	contrib/hat-trie/hat-trie.h		\
 	contrib/hhash.c				\
 	contrib/hhash.h				\
 	contrib/macros.h			\
@@ -58,6 +58,8 @@ libcontrib_la_SOURCES = 			\
 	contrib/net.h				\
 	contrib/print.c				\
 	contrib/print.h				\
+	contrib/qp-trie/qp.c			\
+	contrib/qp-trie/qp.h			\
 	contrib/sockaddr.c			\
 	contrib/sockaddr.h			\
 	contrib/string.c			\
@@ -69,8 +71,6 @@ libcontrib_la_SOURCES = 			\
 	contrib/trim.h				\
 	contrib/wire.h				\
 	contrib/wire_ctx.h			\
-	contrib/hat-trie/hat-trie.c		\
-	contrib/hat-trie/hat-trie.h		\
 	contrib/murmurhash3/murmurhash3.c	\
 	contrib/murmurhash3/murmurhash3.h	\
 	contrib/openbsd/strlcat.c		\
@@ -86,6 +86,14 @@ libcontrib_la_SOURCES = 			\
 	contrib/ucw/mempool.c			\
 	contrib/ucw/mempool.h
 
+if !HAVE_LMDB
+libcontrib_la_SOURCES +=			\
+	contrib/lmdb/lmdb.h			\
+	contrib/lmdb/mdb.c			\
+	contrib/lmdb/midl.c			\
+	contrib/lmdb/midl.h
+endif !HAVE_LMDB
+
 # static: libknot-yparser sources
 libknot_yparser_la_SOURCES = 			\
 	libknot/yparser/yparser.c		\
@@ -183,22 +191,12 @@ libknot_la_SOURCES =				\
 
 libknot_la_CPPFLAGS = $(AM_CPPFLAGS) $(CFLAG_VISIBILITY) $(lmdb_CFLAGS)
 libknot_la_CFLAGS = $(AM_CFLAGS)
-libknot_la_LDFLAGS = $(AM_LDFLAGS) $(libknot_VERSION_INFO) $(lmdb_LIBS)
+libknot_la_LDFLAGS = $(AM_LDFLAGS) $(libknot_VERSION_INFO) $(lmdb_LIBS) $(LDFLAG_EXCLUDE_LIBS)
 libknot_la_LIBADD = dnssec/libdnssec.la libcontrib.la
 
 # pkg-config
 pkgconfig_DATA = libknot.pc
 
-if !HAVE_LMDB
-libknot_la_SOURCES +=				\
-	contrib/lmdb/lmdb.h			\
-	contrib/lmdb/mdb.c			\
-	contrib/lmdb/midl.c			\
-	contrib/lmdb/midl.h
-libknot_la_CPPFLAGS +=				\
-	-I$(srcdir)/contrib/lmdb/
-endif
-
 # static: utilities shared
 libknotus_la_SOURCES =				\
 	utils/common/cert.c			\
@@ -237,6 +235,8 @@ libknotd_la_SOURCES =				\
 	knot/conf/confdb.h			\
 	knot/conf/confio.c			\
 	knot/conf/confio.h			\
+	knot/conf/migration.c			\
+	knot/conf/migration.h			\
 	knot/conf/scheme.c			\
 	knot/conf/scheme.h			\
 	knot/conf/tools.c			\
@@ -277,18 +277,24 @@ libknotd_la_SOURCES =				\
 	knot/events/log.h			\
 	knot/events/replan.c			\
 	knot/events/replan.h			\
-	knot/modules/dnsproxy.c			\
-	knot/modules/dnsproxy.h			\
-	knot/modules/noudp.c			\
-	knot/modules/noudp.h			\
-	knot/modules/online_sign/module.c	\
-	knot/modules/online_sign/module.h	\
+	knot/modules/dnsproxy/dnsproxy.c	\
+	knot/modules/dnsproxy/dnsproxy.h	\
+	knot/modules/noudp/noudp.c		\
+	knot/modules/noudp/noudp.h		\
+	knot/modules/online_sign/online_sign.c	\
+	knot/modules/online_sign/online_sign.h	\
 	knot/modules/online_sign/nsec_next.c	\
 	knot/modules/online_sign/nsec_next.h	\
-	knot/modules/synth_record.c		\
-	knot/modules/synth_record.h		\
-	knot/modules/whoami.c			\
-	knot/modules/whoami.h			\
+	knot/modules/rrl/functions.c		\
+	knot/modules/rrl/functions.h		\
+	knot/modules/rrl/rrl.c			\
+	knot/modules/rrl/rrl.h			\
+	knot/modules/stats/stats.c		\
+	knot/modules/stats/stats.h		\
+	knot/modules/synth_record/synth_record.c\
+	knot/modules/synth_record/synth_record.h\
+	knot/modules/whoami/whoami.c		\
+	knot/modules/whoami/whoami.h		\
 	knot/nameserver/axfr.c			\
 	knot/nameserver/axfr.h			\
 	knot/nameserver/chaos.c			\
@@ -330,14 +336,16 @@ libknotd_la_SOURCES =				\
 	knot/common/process.h			\
 	knot/common/ref.c			\
 	knot/common/ref.h			\
+	knot/common/stats.c			\
+	knot/common/stats.h			\
 	knot/server/dthreads.c			\
 	knot/server/dthreads.h			\
-	knot/server/journal.c			\
-	knot/server/journal.h			\
-	knot/server/rrl.c			\
-	knot/server/rrl.h			\
-	knot/server/serialization.c		\
-	knot/server/serialization.h		\
+	knot/journal/journal.c			\
+	knot/journal/journal.h			\
+	knot/journal/old_journal.c		\
+	knot/journal/old_journal.h		\
+	knot/journal/serialization.c		\
+	knot/journal/serialization.h		\
 	knot/server/server.c			\
 	knot/server/server.h			\
 	knot/server/tcp-handler.c		\
@@ -385,7 +393,7 @@ libknotd_la_SOURCES =				\
 	knot/zone/zonefile.c			\
 	knot/zone/zonefile.h
 
-libknotd_la_CPPFLAGS  = $(AM_CPPFLAGS) $(systemd_CFLAGS) $(liburcu_CFLAGS)
+libknotd_la_CPPFLAGS  = $(AM_CPPFLAGS) $(systemd_CFLAGS) $(liburcu_CFLAGS) $(lmdb_CFLAGS)
 libknotd_la_LDFLAGS = $(AM_LDFLAGS) $(systemd_LIBS) $(liburcu_LIBS)
 libknotd_la_LIBADD = libknot.la libknot-yparser.la zscanner/libzscanner.la $(liburcu_LIBS)
 
@@ -450,7 +458,7 @@ keymgr_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/dnssec/lib/dnssec -I$(srcdir)/dnsse
 keymgr_LDADD = libknotd.la libknotus.la dnssec/libdnssec.la dnssec/libshared.la \
                zscanner/libzscanner.la $(gnutls_LIBS)
 knotd_CPPFLAGS = $(AM_CPPFLAGS) $(liburcu_CFLAGS)
-knotd_LDADD = libknotd.la $(liburcu_LIBS)
+knotd_LDADD = libknotd.la libcontrib.la $(liburcu_LIBS)
 knotc_CPPFLAGS = $(AM_CPPFLAGS) $(libedit_CFLAGS)
 knotc_LDADD = libknotd.la libknotus.la $(libedit_LIBS)
 knot1to2_LDADD = libcontrib.la
@@ -461,16 +469,16 @@ knot1to2_LDADD = libcontrib.la
 
 if HAVE_DNSTAP
 libknotd_la_SOURCES +=				\
-	knot/modules/dnstap.c			\
-	knot/modules/dnstap.h
+	knot/modules/dnstap/dnstap.c		\
+	knot/modules/dnstap/dnstap.h
 libknotd_la_CPPFLAGS += $(DNSTAP_CFLAGS)
 libknotd_la_LIBADD += $(DNSTAP_LIBS) contrib/dnstap/libdnstap.la
 endif # HAVE_DNSTAP
 
 if HAVE_ROSEDB
 libknotd_la_SOURCES +=				\
-	knot/modules/rosedb.c			\
-	knot/modules/rosedb.h
+	knot/modules/rosedb/rosedb.c		\
+	knot/modules/rosedb/rosedb.h
 endif # HAVE_ROSEDB
 
 # Create storage and run-time directories
@@ -487,7 +495,7 @@ endif # HAVE_DAEMON
 
 if HAVE_UTILS
 
-bin_PROGRAMS = kdig khost knsec3hash knsupdate kzonecheck
+bin_PROGRAMS = kdig khost knsec3hash knsupdate kzonecheck kjournalprint
 if !HAVE_DAEMON
 noinst_LTLIBRARIES += libknotd.la
 endif
@@ -524,16 +532,21 @@ kzonecheck_SOURCES =				\
 	utils/kzonecheck/zone_check.c		\
 	utils/kzonecheck/zone_check.h
 
+kjournalprint_SOURCES = 			\
+	utils/kjournalprint/main.c
+
 # bin programs
-kdig_CPPFLAGS       = $(AM_CPPFLAGS) $(gnutls_CFLAGS)
-kdig_LDADD          = $(libidn_LIBS) libknotus.la
-khost_CPPFLAGS      = $(AM_CPPFLAGS) $(gnutls_CFLAGS)
-khost_LDADD         = $(libidn_LIBS) libknotus.la
-knsupdate_CPPFLAGS  = $(AM_CPPFLAGS) $(gnutls_CFLAGS)
-knsupdate_LDADD     = zscanner/libzscanner.la libknotus.la
-knsec3hash_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/dnssec/lib/dnssec -I$(srcdir)/dnssec
-knsec3hash_LDADD    = dnssec/libdnssec.la dnssec/libshared.la
-kzonecheck_LDADD = libknotd.la
+kdig_CPPFLAGS          = $(AM_CPPFLAGS) $(gnutls_CFLAGS)
+kdig_LDADD             = $(libidn_LIBS) libknotus.la
+khost_CPPFLAGS         = $(AM_CPPFLAGS) $(gnutls_CFLAGS)
+khost_LDADD            = $(libidn_LIBS) libknotus.la
+knsupdate_CPPFLAGS     = $(AM_CPPFLAGS) $(gnutls_CFLAGS)
+knsupdate_LDADD        = zscanner/libzscanner.la libknotus.la
+knsec3hash_CPPFLAGS    = $(AM_CPPFLAGS) -I$(srcdir)/dnssec/lib/dnssec -I$(srcdir)/dnssec
+knsec3hash_LDADD       = dnssec/libdnssec.la dnssec/libshared.la
+kzonecheck_LDADD       = libknotd.la libcontrib.la
+kjournalprint_CPPFLAGS = $(AM_CPPFLAGS) $(gnutls_CFLAGS)
+kjournalprint_LDADD    = $(libidn_LIBS) libknotd.la libcontrib.la
 
 #######################################
 # Optional Knot DNS Utilities modules #
@@ -548,8 +561,8 @@ endif # HAVE_DNSTAP
 
 if HAVE_ROSEDB
 bin_PROGRAMS += rosedb_tool
-rosedb_tool_SOURCES = knot/modules/rosedb_tool.c
-rosedb_tool_LDADD = libknotd.la
+rosedb_tool_SOURCES = knot/modules/rosedb/rosedb_tool.c
+rosedb_tool_LDADD = libknotd.la libcontrib.la
 rosedb_tool_CFLAGS = $(AM_CFLAGS) $(lmdb_CFLAGS) $(DNSTAP_CFLAGS)
 rosedb_tool_LDFLAGS = $(AM_LDFLAGS) $(lmdb_LIBS)
 endif # HAVE_ROSEDB
diff --git a/src/contrib/endian.h b/src/contrib/endian.h
index d49f9da37ae7fb965d5dbb75899340505fdebac8..b5447a1ef9ace2456167ffd2cc106dc590dc83d2 100644
--- a/src/contrib/endian.h
+++ b/src/contrib/endian.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -24,7 +24,8 @@
 
 #pragma once
 
-#if defined(__linux__)
+#if defined(__linux__) || defined(__gnu_hurd__) || \
+    (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
 #       include <endian.h>
 #  ifndef be64toh
 #       include <arpa/inet.h>
diff --git a/src/contrib/files.c b/src/contrib/files.c
index 12a6ae51f03030eef23ede89906f098107801d3f..e654ea79a8393488733fe693389131eed4a7005a 100644
--- a/src/contrib/files.c
+++ b/src/contrib/files.c
@@ -21,9 +21,11 @@
 #include <fcntl.h>
 #include <stdbool.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include "contrib/string.h"
 #include "libknot/errcode.h"
 
 static bool special_name(const char *name)
@@ -114,3 +116,69 @@ int make_dir(const char *path, mode_t mode, bool ignore_existing)
 
 	return KNOT_EOK;
 }
+
+int make_path(const char *path, mode_t mode)
+{
+	if (path == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	char *dir = strdup(path);
+	if (dir == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	for (char *p = strchr(dir + 1, '/'); p != NULL; p = strchr(p + 1, '/')) {
+		*p = '\0';
+		if (mkdir(dir, mode) == -1 && errno != EEXIST) {
+			free(dir);
+			return knot_map_errno();
+		}
+		*p = '/';
+	}
+
+	free(dir);
+
+	return KNOT_EOK;
+}
+
+int open_tmp_file(const char *path, char **tmp_name, FILE **file, mode_t mode)
+{
+	int ret;
+
+	*tmp_name = sprintf_alloc("%s.XXXXXX", path);
+	if (*tmp_name == NULL) {
+		ret = KNOT_ENOMEM;
+		goto open_tmp_failed;
+	}
+
+	int fd = mkstemp(*tmp_name);
+	if (fd < 0) {
+		ret = knot_map_errno();
+		goto open_tmp_failed;
+	}
+
+	if (fchmod(fd, mode) != 0) {
+		ret = knot_map_errno();
+		close(fd);
+		unlink(*tmp_name);
+		goto open_tmp_failed;
+	}
+
+	*file = fdopen(fd, "w");
+	if (*file == NULL) {
+		ret = knot_map_errno();
+		close(fd);
+		unlink(*tmp_name);
+		goto open_tmp_failed;
+	}
+
+	return KNOT_EOK;
+open_tmp_failed:
+	free(*tmp_name);
+	*tmp_name = NULL;
+	*file = NULL;
+
+	assert(ret != KNOT_EOK);
+	return ret;
+}
diff --git a/src/contrib/files.h b/src/contrib/files.h
index 6756cb8d53ba549f765758b41a56f076b8610746..c4c681f866699efcf5ed7c4e7ea2aea5cfde6bca 100644
--- a/src/contrib/files.h
+++ b/src/contrib/files.h
@@ -17,6 +17,7 @@
 #pragma once
 
 #include <stdbool.h>
+#include <stdio.h>
 #include <sys/types.h>
 
 /*!
@@ -30,3 +31,13 @@ bool remove_path(const char *path);
  * Equivalent to mkdir(2), can succeed if the directory already exists.
  */
 int make_dir(const char *path, mode_t mode, bool ignore_existing);
+
+/*!
+ * Makes a directory part of the path with all parent directories if not exist.
+ */
+int make_path(const char *path, mode_t mode);
+
+/*!
+ * Creates and opens for writing a temporary file based on given path.
+ */
+int open_tmp_file(const char *path, char **tmp_name, FILE **file, mode_t mode);
diff --git a/src/contrib/hat-trie/LICENSE b/src/contrib/hat-trie/LICENSE
deleted file mode 100644
index 01617031f0794897d5be06e0dc8d0751eec03f5b..0000000000000000000000000000000000000000
--- a/src/contrib/hat-trie/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-../licenses/MIT
\ No newline at end of file
diff --git a/src/contrib/hat-trie/hat-trie.c b/src/contrib/hat-trie/hat-trie.c
deleted file mode 100644
index 5b8be94a2e4c15353d724ef49c68413be2472a19..0000000000000000000000000000000000000000
--- a/src/contrib/hat-trie/hat-trie.c
+++ /dev/null
@@ -1,1114 +0,0 @@
-/*
- * This file is part of hat-trie.
- *
- * Copyright (c) 2011 by Daniel C. Jones <dcjones@cs.washington.edu>
- *
- */
-
-#include <stdint.h>
-#include <assert.h>
-#include <string.h>
-#include "contrib/hhash.h"
-#include "contrib/hat-trie/hat-trie.h"
-#include "contrib/mempattern.h"
-#include "libknot/errcode.h"
-
-/* number of child nodes for used alphabet */
-#define NODE_CHILDS (TRIE_MAXCHAR+1)
-/* initial nodestack size */
-#define NODESTACK_INIT 128
-/* hashtable max fill (undefine to maximize) */
-#define HHASH_MAX_FILL 0.9
-
-static const uint8_t NODE_TYPE_TRIE          = 0x1;
-static const uint8_t NODE_TYPE_PURE_BUCKET   = 0x2;
-static const uint8_t NODE_TYPE_HYBRID_BUCKET = 0x4;
-static const uint8_t NODE_HAS_VAL            = 0x8;
-
-struct trie_node_t_;
-
-/* Node's may be trie nodes or buckets. This union allows us to keep
- * non-specific pointer. */
-typedef union node_ptr_
-{
-    hhash_t*           b;
-    struct trie_node_t_* t;
-    uint8_t*             flag;
-} node_ptr;
-
-typedef struct trie_node_t_
-{
-    uint8_t flag;
-
-    /* the value for the key that is consumed on a trie node */
-    value_t val;
-
-    /* Map a character to either a trie_node_t or a hhash_t. The first byte
-     * must be examined to determine which. */
-    node_ptr xs[NODE_CHILDS];
-
-} trie_node_t;
-
-struct hattrie_t_
-{
-    node_ptr root; // root node
-    size_t m;      // number of stored keys
-    unsigned bsize; // bucket size
-    knot_mm_t mm;
-};
-
-/* Create an empty trie node. */
-static trie_node_t* alloc_empty_node(hattrie_t* T)
-{
-    trie_node_t* node = T->mm.alloc(T->mm.ctx, sizeof(trie_node_t));
-    node->flag = NODE_TYPE_TRIE;
-    node->val  = 0;
-
-    memset(node->xs, 0, sizeof(node_ptr) * NODE_CHILDS);
-    return node;
-}
-
-/* Create a new trie node with all pointer pointing to the given child (which
- * can be NULL). */
-static trie_node_t* alloc_trie_node(hattrie_t* T, node_ptr child)
-{
-    trie_node_t* node = T->mm.alloc(T->mm.ctx, sizeof(trie_node_t));
-    node->flag = NODE_TYPE_TRIE;
-    node->val  = 0;
-
-    size_t i;
-    for (i = 0; i < NODE_CHILDS; ++i) node->xs[i] = child;
-    return node;
-}
-
-/* iterate trie nodes until string is consumed or bucket is found */
-static node_ptr hattrie_consume_ns(node_ptr **s, size_t *sp, size_t slen,
-                                const char **k, size_t *l, unsigned min_len)
-{
-
-    node_ptr *bs = *s;
-    node_ptr node = bs[*sp].t->xs[(unsigned char) **k];
-    while (node.flag && *node.flag & NODE_TYPE_TRIE && *l > min_len) {
-        ++*k;
-        --*l;
-        /* build node stack if slen > 0 */
-        if (slen > 0) {
-            if (*sp == slen - 1) {
-                /* switch pointers if allocating from base
-                 * this is a bit ugly, but needed to avoid memory allocation
-                 * most of the time
-                 */
-                slen *= 2;
-                if (bs == *s) { /* points to original stack mem */
-                    bs = malloc(slen * sizeof(node_ptr));
-                    memcpy(bs, *s, (slen/2) * sizeof(node_ptr));
-                } else {        /* points to heap memory already */
-                    node_ptr *bs_new = realloc(bs, slen * sizeof(node_ptr));
-                    /* \note tricky, hattrie should be slowly moved from 'never-expect-malloc-fail' state */
-                    if (bs_new == NULL) {
-                        *sp = 0;      /* caller will get take care of freeing old 'bs' */
-                        return bs[0]; /* return root node, so the search fails */
-                    } else {
-                        bs = bs_new;
-                    }
-                }
-                /* update parent pointer on resize */
-                *s = bs;
-            }
-            /* increment stack pointer */
-            ++*sp;
-        }
-        bs[*sp] = node;
-        node = node.t->xs[(unsigned char) **k];
-    }
-
-    /* stack top is always parent node */
-    assert(*bs[*sp].flag & NODE_TYPE_TRIE);
-    return node;
-}
-
-/*! \brief Consume key. */
-static inline node_ptr hattrie_consume(node_ptr *parent, const char **key,
-                                       size_t *key_len, unsigned min_len)
-{
-    size_t sp = 0;
-    return hattrie_consume_ns(&parent, &sp, 0, key, key_len, min_len);
-}
-
-/* use node value and return pointer to it */
-static inline value_t* hattrie_useval(hattrie_t *T, node_ptr n)
-{
-    if (!(n.t->flag & NODE_HAS_VAL)) {
-        n.t->flag |= NODE_HAS_VAL;
-        ++T->m;
-    }
-    return &n.t->val;
-}
-
-/* clear node value if exists */
-static inline int hattrie_clrval(hattrie_t *T, node_ptr n)
-{
-    if (n.t->flag & NODE_HAS_VAL) {
-        n.t->flag &= ~NODE_HAS_VAL;
-        n.t->val = 0;
-        --T->m;
-        return 0;
-    }
-    return -1;
-}
-
-/* find rightmost non-empty node */
-static value_t* hattrie_find_rightmost(node_ptr node)
-{
-    /* iterate children from right */
-    if (*node.flag & NODE_TYPE_TRIE) {
-        for (int i = TRIE_MAXCHAR; i > -1; --i) {
-            /* skip repeated pointers to hybrid bucket */
-            if (i < TRIE_MAXCHAR && node.t->xs[i].t == node.t->xs[i + 1].t)
-                continue;
-            /* nest if trie */
-            value_t *ret = hattrie_find_rightmost(node.t->xs[i]);
-            if (ret) {
-                return ret;
-            }
-        }
-        /* use trie node value if no children found */
-        if (node.t->flag & NODE_HAS_VAL) {
-            return &node.t->val;
-        }
-
-        /* no non-empty children? */
-        return NULL;
-    }
-
-    /* node is hashtable */
-    if (node.b->weight == 0) {
-        return NULL;
-    }
-    /* return rightmost value */
-    assert(node.b->index);
-    return hhash_indexval(node.b, node.b->weight - 1);
-}
-
-static value_t* hattrie_find_leftmost(node_ptr node)
-{
-    /* iterate children from left */
-    if (*node.flag & NODE_TYPE_TRIE) {
-        for (int i = 0; i <= TRIE_MAXCHAR; ++i) {
-            /* skip repeated pointers to hybrid bucket */
-            if (i < TRIE_MAXCHAR - 1 && node.t->xs[i].t == node.t->xs[i + 1].t) {
-                continue;
-            }
-            /* nest if trie */
-            value_t *ret = hattrie_find_leftmost(node.t->xs[i]);
-            if (ret) {
-                return ret;
-            }
-        }
-        /* use trie node value if no children found */
-        if (node.t->flag & NODE_HAS_VAL) {
-            return &node.t->val;
-        }
-
-        /* no non-empty children? */
-        return NULL;
-    }
-
-    /* node is hashtable */
-    if (node.b->weight == 0) {
-        return NULL;
-    }
-    /* return leftmost value */
-    assert(node.b->index);
-    return hhash_indexval(node.b, 0);
-}
-
-/* find node in trie and keep node stack (if slen > 0) */
-static node_ptr hattrie_find_ns(node_ptr **s, size_t *sp, size_t slen,
-                                const char **key, size_t *len)
-{
-    assert(*(*s)[*sp].flag & NODE_TYPE_TRIE);
-
-    if (*len == 0) return (*s)[*sp]; /* parent, as sp == 0 */
-
-    node_ptr node = hattrie_consume_ns(s, sp, slen, key, len, 1);
-
-    /* using pure trie and couldn't find the key, return stack top */
-    if (node.flag == NULL) {
-        node = (*s)[*sp];
-    }
-
-    /* if the trie node consumes value, use it */
-    if (*node.flag & NODE_TYPE_TRIE) {
-        if (!(node.t->flag & NODE_HAS_VAL)) {
-            node.flag = NULL;
-        }
-        return node;
-    }
-
-    /* pure bucket holds only key suffixes, skip current char */
-    if (*node.flag & NODE_TYPE_PURE_BUCKET) {
-        ++*key;
-        --*len;
-    }
-
-    /* do not scan bucket, it's not needed for this operation */
-    return node;
-}
-
-/* find node in trie */
-static inline node_ptr hattrie_find(node_ptr *parent, const char **key, size_t *len)
-{
-    size_t sp = 0;
-    return hattrie_find_ns(&parent, &sp, 0, key, len);
-}
-
-/* initialize root node */
-static void hattrie_initroot(hattrie_t *T)
-{
-    node_ptr node;
-    if (T->bsize > 0) {
-        node.b = hhash_create(TRIE_BUCKET_SIZE);
-        node.b->flag = NODE_TYPE_HYBRID_BUCKET;
-        node.b->c0 = 0x00;
-        node.b->c1 = TRIE_MAXCHAR;
-        T->root.t = alloc_trie_node(T, node);
-    } else {
-        T->root.t = alloc_empty_node(T);
-    }
-}
-
-/* Free hat-trie nodes recursively. */
-static void hattrie_free_node(node_ptr node, knot_mm_free_t free_cb)
-{
-    if (*node.flag & NODE_TYPE_TRIE) {
-        size_t i;
-        for (i = 0; i < NODE_CHILDS; ++i) {
-            if (i > 0 && node.t->xs[i].t == node.t->xs[i - 1].t)
-                continue;
-
-            /* XXX: recursion might not be the best choice here. It is possible
-             * to build a very deep trie. */
-            if (node.t->xs[i].t)
-                hattrie_free_node(node.t->xs[i], free_cb);
-        }
-        if (free_cb)
-            free_cb(node.t);
-    }
-    else {
-        hhash_free(node.b);
-    }
-}
-
-/* Initialize hat-trie. */
-static void hattrie_init(hattrie_t * T, unsigned bucket_size)
-{
-    T->m = 0;
-    T->bsize = bucket_size;
-    hattrie_initroot(T);
-}
-
-/* Deinitialize hat-trie. */
-static void hattrie_deinit(hattrie_t * T)
-{
-    if (T->bsize > 0 || T->mm.free)
-        hattrie_free_node(T->root, T->mm.free);
-}
-
-hattrie_t* hattrie_create()
-{
-    knot_mm_t mm;
-    mm_ctx_init(&mm);
-    return hattrie_create_n(TRIE_BUCKET_SIZE, &mm);
-}
-
-void hattrie_free(hattrie_t* T)
-{
-    if (T == NULL) {
-        return;
-    }
-    hattrie_deinit(T);
-    if (T->mm.free)
-        T->mm.free(T);
-}
-
-void hattrie_clear(hattrie_t* T)
-{
-    if (T == NULL) {
-        return;
-    }
-
-    hattrie_deinit(T);
-    hattrie_init(T, T->bsize);
-}
-
-hattrie_t* hattrie_dup(const hattrie_t* T, value_t (*nval)(value_t))
-{
-    hattrie_t *N = hattrie_create_n(T->bsize, &T->mm);
-
-    if (nval == NULL) {
-        return N;
-    }
-
-    /*! \todo could be probably implemented faster */
-
-    size_t l = 0;
-    const char *k = NULL;
-    hattrie_iter_t *i = hattrie_iter_begin(T, false);
-    while (!hattrie_iter_finished(i)) {
-        k = hattrie_iter_key(i, &l);
-        *hattrie_get(N, k, l) = nval(*hattrie_iter_val(i));
-        hattrie_iter_next(i);
-    }
-    hattrie_iter_free(i);
-    return N;
-}
-
-size_t hattrie_weight (const hattrie_t *T)
-{
-    if (T == NULL) {
-        return 0;
-    }
-
-    return T->m;
-}
-
-hattrie_t* hattrie_create_n(unsigned bucket_size, const knot_mm_t *mm)
-{
-    hattrie_t* T = mm_alloc((knot_mm_t *)mm, sizeof(hattrie_t));
-    memcpy(&T->mm, mm, sizeof(knot_mm_t));
-    hattrie_init(T, bucket_size);
-    return T;
-}
-
-static void node_build_index(node_ptr node)
-{
-    /* build index on all hashtable nodes */
-    if (*node.flag & NODE_TYPE_TRIE) {
-        size_t i;
-        for (i = 0; i < NODE_CHILDS; ++i) {
-            if (i > 0 && node.t->xs[i].t == node.t->xs[i - 1].t) continue;
-            if (node.t->xs[i].t) node_build_index(node.t->xs[i]);
-        }
-    }
-    else {
-        hhash_build_index(node.b);
-    }
-}
-
-void hattrie_build_index(hattrie_t *T)
-{
-    node_build_index(T->root);
-}
-
-static int node_apply(node_ptr node, int (*f)(value_t*,void*), void* d)
-{
-    int result = TRIE_EOK;
-
-    if (*node.flag & NODE_TYPE_TRIE) {
-        size_t i;
-        for (i = 0; i < NODE_CHILDS; ++i) {
-            if (i > 0 && node.t->xs[i].t == node.t->xs[i - 1].t) {
-                continue;
-            }
-            if (node.t->xs[i].t) {
-                result = node_apply(node.t->xs[i], f, d);
-            }
-            if (result == TRIE_EOK && *node.flag & NODE_HAS_VAL) {
-                result = f(&node.t->val, d);
-            }
-            if (result != TRIE_EOK) {
-                break;
-            }
-        }
-    }
-    else {
-        hhash_iter_t i;
-        hhash_iter_begin(node.b, &i, false);
-        while (!hhash_iter_finished(&i)) {
-            result = f(hhash_iter_val(&i), d);
-            if (result != TRIE_EOK) {
-                break;
-            }
-            hhash_iter_next(&i);
-        }
-    }
-
-    return result;
-}
-
-static int node_apply_ahtable(node_ptr node, int (*f)(void*,void*), void* d)
-{
-    int result = TRIE_EOK;
-
-    if (*node.flag & NODE_TYPE_TRIE) {
-        size_t i;
-        for (i = 0; i < NODE_CHILDS; ++i) {
-            if (i > 0 && node.t->xs[i].t == node.t->xs[i - 1].t) {
-                continue;
-            }
-            if (node.t->xs[i].t) {
-                result = node_apply_ahtable(node.t->xs[i], f, d);
-                if (result != TRIE_EOK) {
-                    break;
-                }
-            }
-        }
-    }
-    else {
-        result = f(node.b, d);
-    }
-
-    return result;
-}
-
-int hattrie_apply_rev(hattrie_t* T, int (*f)(value_t*,void*), void* d)
-{
-    return node_apply(T->root, f, d);
-}
-
-int hattrie_apply_rev_ahtable(hattrie_t* T, int (*f)(void*,void*), void* d)
-{
-    return node_apply_ahtable(T->root, f, d);
-}
-
-int hattrie_split_mid(node_ptr node, unsigned *left_m, unsigned *right_m)
-{
-    /* count the number of occourances of every leading character */
-    unsigned int cs[NODE_CHILDS]; // occurrence count for leading chars
-    memset(cs, 0, NODE_CHILDS * sizeof(unsigned int));
-    uint16_t len;
-    const char* key;
-
-    /*! \todo expensive, maybe some heuristics or precalc would be better */
-    hhash_iter_t i;
-    hhash_iter_begin(node.b, &i, false);
-    while (!hhash_iter_finished(&i)) {
-        key = hhash_iter_key(&i, &len);
-        assert(len > 0);
-        cs[(unsigned char) key[0]] += 1;
-        hhash_iter_next(&i);
-    }
-
-    /* choose a split point */
-    unsigned int all_m;
-    unsigned char j = node.b->c0;
-    all_m   = node.b->weight;
-    *left_m  = cs[j];
-    *right_m = all_m - *left_m;
-    int d;
-
-    while (j + 1 < node.b->c1) {
-        d = abs((int) (*left_m + cs[j + 1]) - (int) (*right_m - cs[j + 1]));
-        if (d <= abs((int) (*left_m) - (int) (*right_m)) && *left_m + cs[j + 1] < all_m) {
-            j += 1;
-            *left_m  += cs[j];
-            *right_m -= cs[j];
-        }
-        else break;
-    }
-
-    return j;
-}
-
-static value_t *find_below(hattrie_t *T, node_ptr parent,
-                          const char *key, size_t len);
-
-static void hashnode_split_reinsert(hattrie_t *T, node_ptr parent, node_ptr src)
-{
-    value_t* u = NULL;
-    const char* key = NULL;
-    uint16_t len = 0;
-    hhash_iter_t i;
-
-    hhash_iter_begin(src.b, &i, false);
-    while (!hhash_iter_finished(&i)) {
-        key = hhash_iter_key(&i, &len);
-        u   = hhash_iter_val(&i);
-
-        *find_below(T, parent, key, len) = *u;
-
-        hhash_iter_next(&i);
-    }
-    hhash_free(src.b);
-}
-
-static size_t hashnode_nextsize(unsigned items)
-{
-    /* Next bucket size increments. */
-    size_t increment = ((items + (TRIE_BUCKET_INCR/2))/TRIE_BUCKET_INCR);
-    if (increment > TRIE_BUCKET_MAX) {
-       increment = TRIE_BUCKET_MAX;
-    }
-    /* Align to closest bucket size. */
-    return TRIE_BUCKET_SIZE + increment * TRIE_BUCKET_INCR;
-}
-
-static void hashnode_split(hattrie_t *T, node_ptr parent, node_ptr node)
-{
-    /* Find split point. */
-    unsigned left_m, right_m;
-    unsigned char j = hattrie_split_mid(node, &left_m, &right_m);
-
-    /* now split into two nodes corresponding to ranges [0, j] and
-     * [j + 1, TRIE_MAXCHAR], respectively. */
-
-    /* create new left and right nodes
-     * one node may reuse existing if it keeps hybrid flag
-     * hybrid -> pure always needs a new table
-     */
-    unsigned char c0 = node.b->c0, c1 = node.b->c1;
-    node_ptr left, right;
-    right.b = hhash_create(hashnode_nextsize(right_m));
-    left.b = hhash_create(hashnode_nextsize(left_m));
-
-    /* setup created nodes */
-    left.b->c0    = c0;
-    left.b->c1    = j;
-    left.b->flag = c0 == j ? NODE_TYPE_PURE_BUCKET : NODE_TYPE_HYBRID_BUCKET; // need to force it
-    right.b->c0   = j + 1;
-    right.b->c1   = c1;
-    right.b->flag = right.b->c0 == right.b->c1 ?
-                      NODE_TYPE_PURE_BUCKET : NODE_TYPE_HYBRID_BUCKET;
-
-    /* update the parent's pointer */
-    unsigned int c;
-    for (c = c0; c <= j; ++c) parent.t->xs[c] = left;
-    for (; c <= c1; ++c)      parent.t->xs[c] = right;
-
-    /* fill new tables */
-    hashnode_split_reinsert(T, parent, node);
-}
-
-/* Perform one split operation on the given node with the given parent.
- */
-static void node_split(hattrie_t* T, node_ptr parent, node_ptr node)
-{
-    /* only buckets may be split */
-    assert(*node.flag & NODE_TYPE_PURE_BUCKET ||
-           *node.flag & NODE_TYPE_HYBRID_BUCKET);
-
-    assert(*parent.flag & NODE_TYPE_TRIE);
-
-    if (*node.flag & NODE_TYPE_PURE_BUCKET) {
-        /* turn the pure bucket into a hybrid bucket */
-        parent.t->xs[node.b->c0].t = alloc_trie_node(T, node);
-
-        /* if the bucket had an empty key, move it to the new trie node */
-        value_t* val = hhash_find(node.b, NULL, 0);
-        if (val) {
-            parent.t->xs[node.b->c0].t->val     = *val;
-            parent.t->xs[node.b->c0].t->flag |= NODE_HAS_VAL;
-            *val = 0;
-            hhash_del(node.b, NULL, 0);
-        }
-
-        node.b->c0   = 0x00;
-        node.b->c1   = TRIE_MAXCHAR;
-        node.b->flag = NODE_TYPE_HYBRID_BUCKET;
-
-        return;
-    }
-
-    /* This is a hybrid bucket. Perform a proper split. */
-    hashnode_split(T, parent, node);
-}
-
-static value_t *find_below(hattrie_t *T, node_ptr parent, const char *key, size_t len)
-{
-    /* consume all trie nodes, now parent must be trie and child anything */
-    node_ptr node = hattrie_consume(&parent, &key, &len, 0);
-    assert(*parent.flag & NODE_TYPE_TRIE);
-
-    /* if the key has been consumed on a trie node, use its value */
-    if (len == 0) {
-        if (*node.flag & NODE_TYPE_TRIE) {
-            return hattrie_useval(T, node);
-        } else if (*node.flag & NODE_TYPE_HYBRID_BUCKET) {
-            return hattrie_useval(T, parent);
-        }
-    }
-
-#ifdef HHASH_MAX_FILL
-    /* preemptively split the bucket if fill is over threshold */
-    if (node.b->weight >= node.b->size * HHASH_MAX_FILL) {
-        node_split(T, parent, node);
-        return find_below(T, parent, key, len);
-    }
-#endif
-
-    /* attempt to fit new element and split if it doesn't fit */
-    value_t *val = NULL;
-    assert(len > 0);
-    if (*node.flag & NODE_TYPE_PURE_BUCKET) {
-        val = hhash_map(node.b, key + 1, len - 1, HHASH_INSERT);
-    }
-    else {
-        val = hhash_map(node.b, key, len, HHASH_INSERT);
-    }
-
-    /* not inserted, recursively split */
-    if (val == NULL) {
-        node_split(T, parent, node);
-        val = find_below(T, parent, key, len);
-    }
-
-    return val;
-}
-
-value_t* hattrie_get(hattrie_t* T, const char* key, size_t len)
-{
-    node_ptr parent = T->root;
-    value_t *val = NULL;
-    assert(*parent.flag & NODE_TYPE_TRIE);
-
-    /* Find value below root node if not empty string. */
-    if (len == 0) {
-        val = &parent.t->val;
-    } else {
-        val = find_below(T, parent, key, len);
-    }
-
-    /* Count insertions. */
-    if (val && *val == NULL) {
-        ++T->m;
-    }
-
-    return val;
-}
-
-value_t* hattrie_tryget(hattrie_t* T, const char* key, size_t len)
-{
-    /* find node for given key */
-    node_ptr parent = T->root;
-    node_ptr node = hattrie_find(&parent, &key, &len);
-    if (node.flag == NULL) {
-        return NULL;
-    }
-
-    /* if the trie node consumes value, use it */
-    if (*node.flag & NODE_TYPE_TRIE) {
-        return &node.t->val;
-    }
-
-    return hhash_find(node.b, key, len);
-}
-
-static value_t* hattrie_walk_left(node_ptr* s, size_t sp,
-                             const char* key, value_t* (*f)(node_ptr))
-{
-    value_t *r = NULL;
-    while (r == NULL)  {
-        /* if not found prev in table, it should be
-         * the rightmost of the nodes left of the current
-         */
-        node_ptr visited = s[sp].t->xs[(unsigned char)*key];
-        for (int i = *key - 1; i > -1; --i) {
-            if (s[sp].t->xs[i].flag == visited.flag)
-                continue; /* skip pointers to visited container */
-            r = f(s[sp].t->xs[i]);
-            if (r) {
-                return r;
-            }
-        }
-
-        /* use trie node value if possible */
-        if (s[sp].t->flag & NODE_HAS_VAL) {
-            return &s[sp].t->val;
-        }
-
-        /* consumed whole stack */
-        if (sp == 0) {
-            break;
-        }
-
-        /* pop stack */
-        --key;
-        --sp;
-    }
-
-    return NULL;
-}
-
-static value_t* hattrie_walk_right(node_ptr* s, size_t sp,
-                                   const char* key, value_t* (*f)(node_ptr))
-{
-    value_t *r = NULL;
-    while (r == NULL)  {
-        /* if not found next in table, it should be
-         * the leftmost of the nodes right of the current
-         */
-        node_ptr visited = s[sp].t->xs[(unsigned char)*key];
-        for (int i = *key + 1; i <= TRIE_MAXCHAR; ++i) {
-            if (s[sp].t->xs[i].flag == visited.flag)
-                continue; /* skip pointers to visited container */
-            r = f(s[sp].t->xs[i]);
-            if (r) {
-                return r;
-            }
-        }
-        /* use trie node value if possible */
-        if (s[sp].t->flag & NODE_HAS_VAL) {
-            return &s[sp].t->val;
-        }
-
-        /* consumed whole stack */
-        if (sp == 0) {
-            break;
-        }
-
-        /* pop stack */
-        --key;
-        --sp;
-    }
-
-    return NULL;
-}
-
-int hattrie_find_leq (hattrie_t* T, const char* key, size_t len, value_t** dst)
-{
-    /* create node stack for traceback */
-    size_t sp = 0;
-    node_ptr bs[NODESTACK_INIT];  /* base stack (will be enough mostly) */
-    node_ptr *ns = bs;            /* generic ptr, could point to new mem */
-    ns[sp] = T->root;
-
-    /* find node for given key */
-    int ret = 1; /* no node on the left matches */
-    node_ptr node = hattrie_find_ns(&ns, &sp, NODESTACK_INIT, &key, &len);
-    if (node.flag == NULL) {
-        *dst = hattrie_walk_left(ns, sp, key, hattrie_find_rightmost);
-        if (ns != bs) free(ns);
-        if (*dst) {
-            return -1; /* found previous */
-        }
-        return 1; /* no previous key found */
-    }
-
-    /* assign value from trie or find in table */
-    if (*node.flag & NODE_TYPE_TRIE) {
-        *dst = &node.t->val;
-        ret = 0;     /* found exact match */
-    } else {
-        *dst = hhash_find(node.b, key, len);
-        if (*dst) {
-            ret = 0; /* found exact match */
-        } else {     /* look for previous in hashtable */
-            ret = hhash_find_leq(node.b, key, len, dst);
-        }
-    }
-
-    /* return if found equal or left in hashtable */
-    if (*dst == 0) {
-        /* we're retracing from pure bucket, pop the key */
-        if (*node.flag & NODE_TYPE_PURE_BUCKET) {
-            --key;
-        }
-        /* walk up the stack of visited nodes and find closest match on the left */
-        *dst = hattrie_walk_left(ns, sp, key, hattrie_find_rightmost);
-        if (*dst) {
-            ret = -1; /* found previous */
-        } else {
-            ret = 1; /* no previous key found */
-        }
-    }
-
-    if (ns != bs) free(ns);
-    return ret;
-}
-
-int hattrie_find_next (hattrie_t* T, const char* key, size_t len, value_t **dst)
-{
-    /* create node stack for traceback */
-    size_t sp = 0;
-    node_ptr bs[NODESTACK_INIT];  /* base stack (will be enough mostly) */
-    node_ptr *ns = bs;            /* generic ptr, could point to new mem */
-    ns[sp] = T->root;
-
-    /* find node for given key */
-    node_ptr ptr = hattrie_find_ns(&ns, &sp, NODESTACK_INIT, &key, &len);
-    if (ptr.flag == NULL) {
-        *dst = hattrie_walk_right(ns, sp, key, hattrie_find_leftmost);
-        if (ns != bs) free(ns);
-        if (*dst) {
-            return 0; /* found next. */
-        } else {
-            return 1; /* no next key found. */
-        }
-    }
-
-    int ret = 0;
-    if (*ptr.flag & NODE_TYPE_TRIE) {
-        /* Get next using walk. */
-        ret = 1;
-    } else {
-        ret = hhash_find_next(ptr.b, key, len, dst);
-    }
-
-    if (ret == 1) {
-        /* we're retracing from pure bucket, pop the key. */
-        if (*ptr.flag & NODE_TYPE_PURE_BUCKET) {
-            --key;
-        }
-        *dst = hattrie_walk_right(ns, sp, key, hattrie_find_leftmost);
-        if (ns != bs) free(ns);
-        if (*dst) {
-            ret = 0; /* found next. */
-        } else {
-            ret = 1; /* no next key found. */
-        }
-    }
-
-    return ret;
-}
-
-int hattrie_del(hattrie_t* T, const char* key, size_t len)
-{
-    node_ptr parent = T->root;
-    assert(*parent.flag & NODE_TYPE_TRIE);
-
-    /* find node for deletion */
-    node_ptr node = hattrie_find(&parent, &key, &len);
-    if (node.flag == NULL) {
-        return -1;
-    }
-
-    /* if consumed on a trie node, clear the value */
-    if (*node.flag & NODE_TYPE_TRIE) {
-        return hattrie_clrval(T, node);
-    }
-
-    /* remove from bucket */
-    size_t m_old = node.b->weight;
-    int ret =  hhash_del(node.b, key, len);
-    T->m -= (m_old - node.b->weight);
-
-    /* merge empty buckets */
-    /*! \todo */
-
-    return ret;
-}
-
-/* plan for iteration:
- * This is tricky, as we have no parent pointers currently, and I would like to
- * avoid adding them. That means maintaining a stack
- *
- */
-
-typedef struct hattrie_node_stack_t_
-{
-    unsigned char   c;
-    size_t level;
-
-    node_ptr node;
-    struct hattrie_node_stack_t_* next;
-
-} hattrie_node_stack_t;
-
-struct hattrie_iter_t_
-{
-    char* key;
-    size_t keysize; // space reserved for the key
-    size_t level;
-
-    /* keep track of keys stored in trie nodes */
-    bool    has_nil_key;
-    value_t nil_val;
-
-    const hattrie_t* T;
-    bool sorted;
-    hhash_iter_t* i;
-    hattrie_node_stack_t* stack;
-};
-
-static void hattrie_iter_pushchar(hattrie_iter_t* i, size_t level, char c)
-{
-    if (i->keysize < level) {
-        i->keysize *= 2;
-        i->key = realloc(i->key, i->keysize * sizeof(char));
-    }
-
-    if (level > 0) {
-        i->key[level - 1] = c;
-    }
-
-    i->level = level;
-}
-
-static void hattrie_iter_nextnode(hattrie_iter_t* i)
-{
-    if (i->stack == NULL) return;
-
-    /* pop the stack */
-    node_ptr node;
-    hattrie_node_stack_t* next;
-    unsigned char   c;
-    size_t level;
-
-    node  = i->stack->node;
-    next  = i->stack->next;
-    c     = i->stack->c;
-    level = i->stack->level;
-
-    free(i->stack);
-    i->stack = next;
-
-    if (*node.flag & NODE_TYPE_TRIE) {
-        hattrie_iter_pushchar(i, level, c);
-
-        if(node.t->flag & NODE_HAS_VAL) {
-            i->has_nil_key = true;
-            i->nil_val = node.t->val;
-        }
-
-        /* push all child nodes from right to left */
-        int j;
-        for (j = TRIE_MAXCHAR; j >= 0; --j) {
-
-            /* skip repeated pointers to hybrid bucket */
-            if (j < TRIE_MAXCHAR && node.t->xs[j].t == node.t->xs[j + 1].t) continue;
-
-            // push stack
-            next = i->stack;
-            i->stack = malloc(sizeof(hattrie_node_stack_t));
-            i->stack->node  = node.t->xs[j];
-            i->stack->next  = next;
-            i->stack->level = level + 1;
-            i->stack->c     = (unsigned char) j;
-        }
-    }
-    else {
-        if (*node.flag & NODE_TYPE_PURE_BUCKET) {
-            hattrie_iter_pushchar(i, level, c);
-        }
-        else {
-            i->level = level - 1;
-        }
-
-        i->i = malloc(sizeof(hhash_iter_t));
-        hhash_iter_begin(node.b, i->i, i->sorted);
-    }
-}
-
-hattrie_iter_t* hattrie_iter_begin(const hattrie_t* T, bool sorted)
-{
-    hattrie_iter_t* i = NULL;
-    if (T) {
-        i = malloc(sizeof(hattrie_iter_t));
-        i->T = T;
-        i->sorted = sorted;
-        i->i = NULL;
-        i->keysize = 16;
-        i->key = malloc(i->keysize * sizeof(char));
-        i->level   = 0;
-        i->has_nil_key = false;
-        i->nil_val     = 0;
-
-        i->stack = malloc(sizeof(hattrie_node_stack_t));
-        i->stack->next   = NULL;
-        i->stack->node   = T->root;
-        i->stack->c      = '\0';
-        i->stack->level  = 0;
-
-        while (((i->i == NULL || hhash_iter_finished(i->i)) && !i->has_nil_key) &&
-               i->stack != NULL ) {
-
-            free(i->i);
-            i->i = NULL;
-            hattrie_iter_nextnode(i);
-        }
-
-        if (i->i != NULL && hhash_iter_finished(i->i)) {
-             free(i->i);
-             i->i = NULL;
-        }
-    }
-
-    return i;
-}
-
-void hattrie_iter_next(hattrie_iter_t* i)
-{
-    if (hattrie_iter_finished(i)) return;
-
-    if (i->i != NULL && !hhash_iter_finished(i->i)) {
-        hhash_iter_next(i->i);
-    }
-    else if (i->has_nil_key) {
-        i->has_nil_key = false;
-        i->nil_val = 0;
-        hattrie_iter_nextnode(i);
-    }
-
-    while (((i->i == NULL || hhash_iter_finished(i->i)) && !i->has_nil_key) &&
-           i->stack != NULL ) {
-
-        free(i->i);
-        i->i = NULL;
-        hattrie_iter_nextnode(i);
-    }
-
-    if (i->i != NULL && hhash_iter_finished(i->i)) {
-        free(i->i);
-        i->i = NULL;
-    }
-}
-
-bool hattrie_iter_finished(hattrie_iter_t* i)
-{
-    return i->stack == NULL && i->i == NULL && !i->has_nil_key;
-}
-
-void hattrie_iter_free(hattrie_iter_t* i)
-{
-    if (i == NULL) return;
-    if (i->i) {
-        free(i->i);
-    }
-
-    hattrie_node_stack_t* next;
-    while (i->stack) {
-        next = i->stack->next;
-        free(i->stack);
-        i->stack = next;
-    }
-
-    free(i->key);
-    free(i);
-}
-
-const char* hattrie_iter_key(hattrie_iter_t* i, size_t* len)
-{
-    if (hattrie_iter_finished(i)) return NULL;
-
-    uint16_t sublen;
-    const char* subkey;
-
-    if (i->has_nil_key) {
-        subkey = NULL;
-        sublen = 0;
-    }
-    else subkey = hhash_iter_key(i->i, &sublen);
-
-    if (i->keysize < i->level + sublen + 1) {
-        while (i->keysize < i->level + sublen + 1) i->keysize *= 2;
-        i->key = realloc(i->key, i->keysize * sizeof(char));
-    }
-
-    if (sublen > 0) {
-        memcpy(i->key + i->level, subkey, sublen);
-    }
-    i->key[i->level + sublen] = '\0';
-
-    *len = i->level + sublen;
-    return i->key;
-}
-
-value_t* hattrie_iter_val(hattrie_iter_t* i)
-{
-    if (i->has_nil_key) return &i->nil_val;
-
-    if (hattrie_iter_finished(i)) return NULL;
-
-    return hhash_iter_val(i->i);
-}
diff --git a/src/contrib/hat-trie/hat-trie.h b/src/contrib/hat-trie/hat-trie.h
index d579ff8865555d04d947ab2770394b10d44437c2..1e57fc2c7f6907f4dcffc3a8505e07bf14a18669 100644
--- a/src/contrib/hat-trie/hat-trie.h
+++ b/src/contrib/hat-trie/hat-trie.h
@@ -1,101 +1,98 @@
-/*
- * This file is part of hat-trie
- *
- * Copyright (c) 2011 by Daniel C. Jones <dcjones@cs.washington.edu>
- *
- * This is an ANSI C99 implementation of the HAT-trie data structure of Askitis
- * and Sinha, an extremely efficient (space and time) modern variant of tries.
- * The HAT-trie is in essence a hybrid data structure, combining tries and hash
- * tables in a clever way to try to get the best of both worlds.
- *
- * The version implemented here maps arrays of bytes to words (i.e., unsigned
- * longs), which can be used to store counts, pointers, etc, or not used at all if
- * you simply want to maintain a set of unique strings.
- *
- * For details see
- *  1. Askitis, N., & Sinha, R. (2007). HAT-trie: a cache-conscious trie-based data
- *     structure for strings. Proceedings of the thirtieth Australasian conference on
- *     Computer science-Volume 62 (pp. 97–105). Australian Computer Society, Inc.
- *  2. Askitis, N., & Zobel, J. (2005). Cache-conscious collision resolution in
- *     string hash tables. String Processing and Information Retrieval (pp.
- *     91–102). Springer.
- */
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
-#pragma once
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
 
-#include <stdlib.h>
-#include <stdbool.h>
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 
+#pragma once
+
+#include "contrib/qp-trie/qp.h"
 #include "contrib/hhash.h"
 
-struct knot_mm;
+typedef trie_t hattrie_t;
+typedef trie_it_t hattrie_iter_t;
 
-/* Hat-trie defines. */
-#define TRIE_ZEROBUCKETS  0    /* Do not use hash buckets (pure trie). */
-#define TRIE_BUCKET_SIZE  253  /* 253, 509, 765 for n*4K pages per 1 hhash. */
-#define TRIE_BUCKET_INCR  256  /* Size increase. */
-#define TRIE_BUCKET_MAX   4    /* Maximum N table increments. */
-#define TRIE_MAXCHAR      0xff /* Use 7-bit ASCII alphabet. */
-#define TRIE_EOK          KNOT_EOK
+inline static hattrie_t* hattrie_create(struct knot_mm *mm)
+{
+	return trie_create(mm);
+}
 
-typedef struct hattrie_t_ hattrie_t;
+inline static void hattrie_free(hattrie_t *trie)
+{
+	trie_free(trie);
+}
 
-hattrie_t* hattrie_create (void);              //< Create an empty hat-trie.
-void       hattrie_free   (hattrie_t*);        //< Free all memory used by a trie.
-void       hattrie_clear  (hattrie_t*);        //< Remove all entries.
-size_t     hattrie_weight (const hattrie_t*);  //< Number of entries
+inline static void hattrie_clear(hattrie_t *trie)
+{
+	trie_clear(trie);
+}
 
-/** Create new trie with custom bucket size and memory management.
- */
-hattrie_t* hattrie_create_n (unsigned, const struct knot_mm *);
+inline static size_t hattrie_weight(const hattrie_t *trie)
+{
+	return trie_weight(trie);
+}
 
-/** Duplicate an existing trie.
- */
-hattrie_t* hattrie_dup (const hattrie_t*, value_t (*nval)(value_t));
+inline static int hattrie_apply_rev(hattrie_t *trie, int (*f)(value_t*,void*), void* d)
+{
+	return trie_apply(trie, f, d);
+}
 
-/** Build order index on all ahtable nodes in trie.
- */
-void hattrie_build_index (hattrie_t*);
+inline static value_t* hattrie_tryget(hattrie_t *trie, const char *key, size_t len)
+{
+	return trie_get_try(trie, key, len);
+}
 
-int hattrie_apply_rev (hattrie_t*, int (*f)(value_t*,void*), void* d);
-int hattrie_apply_rev_ahtable(hattrie_t* T, int (*f)(void*,void*), void* d);
+inline static value_t* hattrie_get(hattrie_t *trie, const char *key, size_t len)
+{
+	return trie_get_ins(trie, key, len);
+}
 
-/** Find the given key in the trie, inserting it if it does not exist, and
- * returning a pointer to its key.
- *
- * This pointer is not guaranteed to be valid after additional calls to
- * hattrie_get, hattrie_del, hattrie_clear, or other functions that modifies the
- * trie.
- */
-value_t* hattrie_get (hattrie_t*, const char* key, size_t len);
+inline static int hattrie_find_leq(hattrie_t *trie, const char *key, size_t len, value_t **dst)
+{
+	return trie_get_leq(trie, key, len, dst);
+}
+
+inline static int hattrie_del(hattrie_t *trie, const char* key, size_t len, value_t *val)
+{
+	return trie_del(trie, key, len, val);
+}
 
-/** Find a given key in the table, returning a NULL pointer if it does not
- * exist. */
-value_t* hattrie_tryget (hattrie_t*, const char* key, size_t len);
+inline static hattrie_iter_t* hattrie_iter_begin(hattrie_t *trie)
+{
+	return trie_it_begin(trie);
+}
 
-/** Find a given key in the table, returning a NULL pointer if it does not
- * exist. Also set prev to point to previous node. */
-int hattrie_find_leq (hattrie_t*, const char* key, size_t len, value_t** dst);
-/** Find a next value for given key, returning NULL if it does not exist. */
-int hattrie_find_next (hattrie_t* T, const char* key, size_t len, value_t **dst);
+inline static void hattrie_iter_next(hattrie_iter_t *it)
+{
+	trie_it_next(it);
+}
 
-/** Delete a given key from trie. Returns 0 if successful or -1 if not found.
- */
-int hattrie_del(hattrie_t* T, const char* key, size_t len);
+inline static bool hattrie_iter_finished(hattrie_iter_t *it)
+{
+	return trie_it_finished(it);
+}
 
-typedef struct hattrie_iter_t_ hattrie_iter_t;
+inline static void hattrie_iter_free(hattrie_iter_t *it)
+{
+	trie_it_free(it);
+}
 
-hattrie_iter_t* hattrie_iter_begin     (const hattrie_t*, bool sorted);
-void            hattrie_iter_next      (hattrie_iter_t*);
-bool            hattrie_iter_finished  (hattrie_iter_t*);
-void            hattrie_iter_free      (hattrie_iter_t*);
-const char*     hattrie_iter_key       (hattrie_iter_t*, size_t* len);
-value_t*        hattrie_iter_val       (hattrie_iter_t*);
+inline static const char* hattrie_iter_key(hattrie_iter_t *it, size_t *len)
+{
+	return trie_it_key(it, len);
+}
 
-#ifdef __cplusplus
+inline static value_t* hattrie_iter_val(hattrie_iter_t *it)
+{
+	return trie_it_val(it);
 }
-#endif
diff --git a/src/contrib/lmdb/lmdb.h b/src/contrib/lmdb/lmdb.h
index c4d05d1791f90d8ff7f5fe6e70e1f17b1968c6c4..0aeff0d320036d3997a726e8846ed6d78417b6e4 100644
--- a/src/contrib/lmdb/lmdb.h
+++ b/src/contrib/lmdb/lmdb.h
@@ -77,6 +77,11 @@
  *	  access to locks and lock file. Exceptions: On read-only filesystems
  *	  or with the #MDB_NOLOCK flag described under #mdb_env_open().
  *
+ *	- An LMDB configuration will often reserve considerable \b unused
+ *	  memory address space and maybe file size for future growth.
+ *	  This does not use actual memory or disk space, but users may need
+ *	  to understand the difference so they won't be scared off.
+ *
  *	- By default, in versions before 0.9.10, unused portions of the data
  *	  file might receive garbage data from memory freed by other code.
  *	  (This does not happen when using the #MDB_WRITEMAP flag.) As of
@@ -91,11 +96,12 @@
  *	  transactions.  Each transaction belongs to one thread.  See below.
  *	  The #MDB_NOTLS flag changes this for read-only transactions.
  *
- *	- Use an MDB_env* in the process which opened it, without fork()ing.
+ *	- Use an MDB_env* in the process which opened it, not after fork().
  *
  *	- Do not have open an LMDB database twice in the same process at
  *	  the same time.  Not even from a plain open() call - close()ing it
- *	  breaks flock() advisory locking.
+ *	  breaks fcntl() advisory locking.  (It is OK to reopen it after
+ *	  fork() - exec*(), since the lockfile has FD_CLOEXEC set.)
  *
  *	- Avoid long-lived transactions.  Read transactions prevent
  *	  reuse of pages freed by newer write transactions, thus the
@@ -194,7 +200,7 @@ typedef int mdb_filehandle_t;
 /** Library minor version */
 #define MDB_VERSION_MINOR	9
 /** Library patch version */
-#define MDB_VERSION_PATCH	18
+#define MDB_VERSION_PATCH	19
 
 /** Combine args a,b,c into a single integer for easy version comparisons */
 #define MDB_VERINT(a,b,c)	(((a) << 24) | ((b) << 16) | (c))
@@ -204,7 +210,7 @@ typedef int mdb_filehandle_t;
 	MDB_VERINT(MDB_VERSION_MAJOR,MDB_VERSION_MINOR,MDB_VERSION_PATCH)
 
 /** The release date of this library version */
-#define MDB_VERSION_DATE	"February 5, 2016"
+#define MDB_VERSION_DATE	"December 28, 2016"
 
 /** A stringifier for the version info */
 #define MDB_VERSTR(a,b,c,d)	"LMDB " #a "." #b "." #c ": (" d ")"
@@ -383,7 +389,9 @@ typedef enum MDB_cursor_op {
 	MDB_PREV_NODUP,			/**< Position at last data item of previous key */
 	MDB_SET,				/**< Position at specified key */
 	MDB_SET_KEY,			/**< Position at specified key, return key + data */
-	MDB_SET_RANGE			/**< Position at first key greater than or equal to specified key. */
+	MDB_SET_RANGE,			/**< Position at first key greater than or equal to specified key. */
+	MDB_PREV_MULTIPLE		/**< Position at previous page and return key and up to
+								a page of duplicate data items. Only for #MDB_DUPFIXED */
 } MDB_cursor_op;
 
 /** @defgroup  errors	Return Codes
@@ -672,6 +680,7 @@ int  mdb_env_copyfd(MDB_env *env, mdb_filehandle_t fd);
 	 *	<li>#MDB_CP_COMPACT - Perform compaction while copying: omit free
 	 *		pages and sequentially renumber all pages in output. This option
 	 *		consumes more CPU and runs more slowly than the default.
+	 *		Currently it fails if the environment has suffered a page leak.
 	 * </ul>
 	 * @return A non-zero error value on failure and 0 on success.
 	 */
@@ -786,6 +795,10 @@ int  mdb_env_get_flags(MDB_env *env, unsigned int *flags);
 int  mdb_env_get_path(MDB_env *env, const char **path);
 
 	/** @brief Return the filedescriptor for the given environment.
+	 *
+	 * This function may be called after fork(), so the descriptor can be
+	 * closed before exec*().  Other LMDB file descriptors have FD_CLOEXEC.
+	 * (Until LMDB 0.9.18, only the lockfile had that.)
 	 *
 	 * @param[in] env An environment handle returned by #mdb_env_create()
 	 * @param[out] fd Address of a mdb_filehandle_t to contain the descriptor.
@@ -1090,8 +1103,9 @@ int  mdb_txn_renew(MDB_txn *txn);
 	 *		This flag may only be used in combination with #MDB_DUPSORT. This option
 	 *		tells the library that the data items for this database are all the same
 	 *		size, which allows further optimizations in storage and retrieval. When
-	 *		all data items are the same size, the #MDB_GET_MULTIPLE and #MDB_NEXT_MULTIPLE
-	 *		cursor operations may be used to retrieve multiple items at once.
+	 *		all data items are the same size, the #MDB_GET_MULTIPLE, #MDB_NEXT_MULTIPLE
+	 *		and #MDB_PREV_MULTIPLE cursor operations may be used to retrieve multiple
+	 *		items at once.
 	 *	<li>#MDB_INTEGERDUP
 	 *		This option specifies that duplicate data items are binary integers,
 	 *		similar to #MDB_INTEGERKEY keys.
diff --git a/src/contrib/lmdb/mdb.c b/src/contrib/lmdb/mdb.c
index 25b44a5f4d7f750d30dbc3270b549b6b1a17128b..23c1f009b01dd75b8d4d6c212d360238f65e19ae 100644
--- a/src/contrib/lmdb/mdb.c
+++ b/src/contrib/lmdb/mdb.c
@@ -35,9 +35,14 @@
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE 1
 #endif
+#if defined(__WIN64__)
+#define _FILE_OFFSET_BITS	64
+#endif
 #ifdef _WIN32
 #include <malloc.h>
 #include <windows.h>
+#include <wchar.h>				/* get wcscpy() */
+
 /** getpid() returns int; MinGW defines pid_t but MinGW64 typedefs it
  *  as int64 which is wrong. MSVC doesn't define it at all, so just
  *  don't use it.
@@ -115,7 +120,7 @@ typedef SSIZE_T	ssize_t;
 #include <resolv.h>	/* defines BYTE_ORDER on HPUX and Solaris */
 #endif
 
-#if defined(__APPLE__) || defined (BSD)
+#if defined(__APPLE__) || defined (BSD) || defined(__FreeBSD_kernel__)
 # define MDB_USE_POSIX_SEM	1
 # define MDB_FDATASYNC		fsync
 #elif defined(ANDROID)
@@ -124,6 +129,7 @@ typedef SSIZE_T	ssize_t;
 
 #ifndef _WIN32
 #include <pthread.h>
+#include <signal.h>
 #ifdef MDB_USE_POSIX_SEM
 # define MDB_USE_HASH		1
 #include <semaphore.h>
@@ -244,10 +250,9 @@ typedef SSIZE_T	ssize_t;
 /** Some platforms define the EOWNERDEAD error code
  * even though they don't support Robust Mutexes.
  * Compile with -DMDB_USE_ROBUST=0, or use some other
- * mechanism like -DMDB_USE_SYSV_SEM instead of
- * -DMDB_USE_POSIX_MUTEX. (SysV semaphores are
- * also Robust, but some systems don't support them
- * either.)
+ * mechanism like -DMDB_USE_POSIX_SEM instead of
+ * -DMDB_USE_POSIX_MUTEX.
+ * (Posix semaphores are not robust.)
  */
 #ifndef MDB_USE_ROBUST
 /* Android currently lacks Robust Mutex support. So does glibc < 2.4. */
@@ -256,16 +261,20 @@ typedef SSIZE_T	ssize_t;
 #  define MDB_USE_ROBUST	0
 # else
 #  define MDB_USE_ROBUST	1
+# endif
+#endif /* !MDB_USE_ROBUST */
+
+#if defined(MDB_USE_POSIX_MUTEX) && (MDB_USE_ROBUST)
 /* glibc < 2.12 only provided _np API */
-#  if defined(__GLIBC__) && GLIBC_VER < 0x02000c
+#  if (defined(__GLIBC__) && GLIBC_VER < 0x02000c) || \
+	(defined(PTHREAD_MUTEX_ROBUST_NP) && !defined(PTHREAD_MUTEX_ROBUST))
 #   define PTHREAD_MUTEX_ROBUST	PTHREAD_MUTEX_ROBUST_NP
 #   define pthread_mutexattr_setrobust(attr, flag)	pthread_mutexattr_setrobust_np(attr, flag)
 #   define pthread_mutex_consistent(mutex)	pthread_mutex_consistent_np(mutex)
 #  endif
-# endif
-#endif /* MDB_USE_ROBUST */
+#endif /* MDB_USE_POSIX_MUTEX && MDB_USE_ROBUST */
 
-#if defined(MDB_OWNERDEAD) && MDB_USE_ROBUST
+#if defined(MDB_OWNERDEAD) && (MDB_USE_ROBUST)
 #define MDB_ROBUST_SUPPORTED	1
 #endif
 
@@ -288,8 +297,10 @@ typedef HANDLE mdb_mutex_t, mdb_mutexref_t;
 #define pthread_mutex_lock(x)	WaitForSingleObject(*x, INFINITE)
 #define pthread_cond_signal(x)	SetEvent(*x)
 #define pthread_cond_wait(cond,mutex)	do{SignalObjectAndWait(*mutex, *cond, INFINITE, FALSE); WaitForSingleObject(*mutex, INFINITE);}while(0)
-#define THREAD_CREATE(thr,start,arg)	thr=CreateThread(NULL,0,start,arg,0,NULL)
-#define THREAD_FINISH(thr)	WaitForSingleObject(thr, INFINITE)
+#define THREAD_CREATE(thr,start,arg) \
+	(((thr) = CreateThread(NULL, 0, start, arg, 0, NULL)) ? 0 : ErrCode())
+#define THREAD_FINISH(thr) \
+	(WaitForSingleObject(thr, INFINITE) ? ErrCode() : 0)
 #define LOCK_MUTEX0(mutex)		WaitForSingleObject(mutex, INFINITE)
 #define UNLOCK_MUTEX(mutex)		ReleaseMutex(mutex)
 #define mdb_mutex_consistent(mutex)	0
@@ -330,15 +341,15 @@ mdb_sem_wait(sem_t *sem)
 }
 
 #else	/* MDB_USE_POSIX_MUTEX: */
-	/** Shared mutex/semaphore as it is stored (mdb_mutex_t), and as
-	 *	local variables keep it (mdb_mutexref_t).
+	/** Shared mutex/semaphore as the original is stored.
 	 *
-	 *	When #mdb_mutexref_t is a pointer declaration and #mdb_mutex_t is
-	 *	not, then it is array[size 1] so it can be assigned to a pointer.
-	 *	@{
+	 *	Not for copies.  Instead it can be assigned to an #mdb_mutexref_t.
+	 *	When mdb_mutexref_t is a pointer and mdb_mutex_t is not, then it
+	 *	is array[size 1] so it can be assigned to the pointer.
 	 */
-typedef pthread_mutex_t mdb_mutex_t[1], *mdb_mutexref_t;
-	/*	@} */
+typedef pthread_mutex_t mdb_mutex_t[1];
+	/** Reference to an #mdb_mutex_t */
+typedef pthread_mutex_t *mdb_mutexref_t;
 	/** Lock the reader or writer mutex.
 	 *	Returns 0 or a code to give #mdb_mutex_failed(), as in #LOCK_MUTEX().
 	 */
@@ -475,7 +486,7 @@ static txnid_t mdb_debug_start;
 	 *	The string is printed literally, with no format processing.
 	 */
 #define DPUTS(arg)	DPRINTF(("%s", arg))
-	/** Debugging output value of a cursor DBI: Negative in a sub-cursor. */
+	/** Debuging output value of a cursor DBI: Negative in a sub-cursor. */
 #define DDBI(mc) \
 	(((mc)->mc_flags & C_SUB) ? -(int)(mc)->mc_dbi : (int)(mc)->mc_dbi)
 /** @} */
@@ -763,9 +774,23 @@ typedef struct MDB_txninfo {
 	  + (((MDB_PIDLOCK) != 0) << 16)))
 /** @} */
 
-/** Common header for all page types.
- * Overflow records occupy a number of contiguous pages with no
- * headers on any page after the first.
+/** Common header for all page types. The page type depends on #mp_flags.
+ *
+ * #P_BRANCH and #P_LEAF pages have unsorted '#MDB_node's at the end, with
+ * sorted #mp_ptrs[] entries referring to them. Exception: #P_LEAF2 pages
+ * omit mp_ptrs and pack sorted #MDB_DUPFIXED values after the page header.
+ *
+ * #P_OVERFLOW records occupy one or more contiguous pages where only the
+ * first has a page header. They hold the real data of #F_BIGDATA nodes.
+ *
+ * #P_SUBP sub-pages are small leaf "pages" with duplicate data.
+ * A node with flag #F_DUPDATA but not #F_SUBDATA contains a sub-page.
+ * (Duplicate data can also go in sub-databases, which use normal pages.)
+ *
+ * #P_META pages contain #MDB_meta, the start point of an LMDB snapshot.
+ *
+ * Each non-metapage up to #MDB_meta.%mm_last_pg is reachable exactly once
+ * in the snapshot: Either used by a database or listed in a freeDB record.
  */
 typedef struct MDB_page {
 #define	mp_pgno	mp_p.p_pgno
@@ -774,7 +799,7 @@ typedef struct MDB_page {
 		pgno_t		p_pgno;	/**< page number */
 		struct MDB_page *p_next; /**< for in-memory list of freed pages */
 	} mp_p;
-	uint16_t	mp_pad;
+	uint16_t	mp_pad;			/**< key size if this is a LEAF2 page */
 /**	@defgroup mdb_page	Page Flags
  *	@ingroup internal
  *	Flags for the page headers.
@@ -841,25 +866,34 @@ typedef struct MDB_page {
 	/** The number of overflow pages needed to store the given size. */
 #define OVPAGES(size, psize)	((PAGEHDRSZ-1 + (size)) / (psize) + 1)
 
-	/** Link in #MDB_txn.%mt_loose_pgs list */
+	/** Link in #MDB_txn.%mt_loose_pgs list.
+	 *  Kept outside the page header, which is needed when reusing the page.
+	 */
 #define NEXT_LOOSE_PAGE(p)		(*(MDB_page **)((p) + 2))
 
 	/** Header for a single key/data pair within a page.
 	 * Used in pages of type #P_BRANCH and #P_LEAF without #P_LEAF2.
 	 * We guarantee 2-byte alignment for 'MDB_node's.
+	 *
+	 * #mn_lo and #mn_hi are used for data size on leaf nodes, and for child
+	 * pgno on branch nodes.  On 64 bit platforms, #mn_flags is also used
+	 * for pgno.  (Branch nodes have no flags).  Lo and hi are in host byte
+	 * order in case some accesses can be optimized to 32-bit word access.
+	 *
+	 * Leaf node flags describe node contents.  #F_BIGDATA says the node's
+	 * data part is the page number of an overflow page with actual data.
+	 * #F_DUPDATA and #F_SUBDATA can be combined giving duplicate data in
+	 * a sub-page/sub-database, and named databases (just #F_SUBDATA).
 	 */
 typedef struct MDB_node {
-	/** lo and hi are used for data size on leaf nodes and for
-	 * child pgno on branch nodes. On 64 bit platforms, flags
-	 * is also used for pgno. (Branch nodes have no flags).
-	 * They are in host byte order in case that lets some
-	 * accesses be optimized into a 32-bit word access.
-	 */
+	/** part of data size or pgno
+	 *	@{ */
 #if BYTE_ORDER == LITTLE_ENDIAN
-	unsigned short	mn_lo, mn_hi;	/**< part of data size or pgno */
+	unsigned short	mn_lo, mn_hi;
 #else
 	unsigned short	mn_hi, mn_lo;
 #endif
+	/** @} */
 /** @defgroup mdb_node Node Flags
  *	@ingroup internal
  *	Flags for node headers.
@@ -969,9 +1003,9 @@ typedef struct MDB_db {
 	pgno_t		md_root;		/**< the root page of this tree */
 } MDB_db;
 
-	/** mdb_dbi_open flags */
 #define MDB_VALID	0x8000		/**< DB handle is valid, for me_dbflags */
 #define PERSISTENT_FLAGS	(0xffff & ~(MDB_VALID))
+	/** #mdb_dbi_open() flags */
 #define VALID_FLAGS	(MDB_REVERSEKEY|MDB_DUPSORT|MDB_INTEGERKEY|MDB_DUPFIXED|\
 	MDB_INTEGERDUP|MDB_REVERSEDUP|MDB_CREATE)
 
@@ -1002,7 +1036,10 @@ typedef struct MDB_meta {
 #define	mm_psize	mm_dbs[FREE_DBI].md_pad
 	/** Any persistent environment flags. @ref mdb_env */
 #define	mm_flags	mm_dbs[FREE_DBI].md_flags
-	pgno_t		mm_last_pg;			/**< last used page in file */
+	/** Last used page in the datafile.
+	 *	Actually the file may be shorter if the freeDB lists the final pages.
+	 */
+	pgno_t		mm_last_pg;
 	volatile txnid_t	mm_txnid;	/**< txnid that committed this page */
 } MDB_meta;
 
@@ -1052,7 +1089,7 @@ struct MDB_txn {
 	 *	in this transaction, linked through #NEXT_LOOSE_PAGE(page).
 	 */
 	MDB_page	*mt_loose_pgs;
-	/* #Number of loose pages (#mt_loose_pgs) */
+	/** Number of loose pages (#mt_loose_pgs) */
 	int			mt_loose_count;
 	/** The sorted list of dirty pages we temporarily wrote to disk
 	 *	because the dirty list was full. page numbers in here are
@@ -1075,11 +1112,12 @@ struct MDB_txn {
  *	@ingroup internal
  * @{
  */
-#define DB_DIRTY	0x01		/**< DB was modified or is DUPSORT data */
+#define DB_DIRTY	0x01		/**< DB was written in this txn */
 #define DB_STALE	0x02		/**< Named-DB record is older than txnID */
 #define DB_NEW		0x04		/**< Named-DB handle opened in this txn */
 #define DB_VALID	0x08		/**< DB handle is valid, see also #MDB_VALID */
 #define DB_USRVALID	0x10		/**< As #DB_VALID, but not set for #FREE_DBI */
+#define DB_DUPDATA	0x20		/**< DB is #MDB_DUPSORT data */
 /** @} */
 	/** In write txns, array of cursors for each DB */
 	MDB_cursor	**mt_cursors;
@@ -1184,6 +1222,21 @@ typedef struct MDB_xcursor {
 	unsigned char mx_dbflag;
 } MDB_xcursor;
 
+	/** Check if there is an inited xcursor, so #XCURSOR_REFRESH() is proper */
+#define XCURSOR_INITED(mc) \
+	((mc)->mc_xcursor && ((mc)->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED))
+
+	/** Update sub-page pointer, if any, in \b mc->mc_xcursor.  Needed
+	 *	when the node which contains the sub-page may have moved.  Called
+	 *	with \b mp = mc->mc_pg[mc->mc_top], \b ki = mc->mc_ki[mc->mc_top].
+	 */
+#define XCURSOR_REFRESH(mc, mp, ki) do { \
+	MDB_page *xr_pg = (mp); \
+	MDB_node *xr_node = NODEPTR(xr_pg, ki); \
+	if ((xr_node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA) \
+		(mc)->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(xr_node); \
+} while (0)
+
 	/** State of FreeDB old pages, stored in the MDB_env */
 typedef struct MDB_pgstate {
 	pgno_t		*mf_pghead;	/**< Reclaimed freeDB pages, or NULL before use */
@@ -1194,7 +1247,7 @@ typedef struct MDB_pgstate {
 struct MDB_env {
 	HANDLE		me_fd;		/**< The main data file */
 	HANDLE		me_lfd;		/**< The lock file */
-	HANDLE		me_mfd;			/**< just for writing the meta pages */
+	HANDLE		me_mfd;		/**< For writing and syncing the meta pages */
 	/** Failed to update the meta page. Probably an I/O error. */
 #define	MDB_FATAL_ERROR	0x80000000U
 	/** Some fields are initialized. */
@@ -1298,7 +1351,7 @@ enum {
 #define MDB_END_SLOT MDB_NOTLS	/**< release any reader slot if #MDB_NOTLS */
 static void mdb_txn_end(MDB_txn *txn, unsigned mode);
 
-static int  mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **mp, int *lvl);
+static int  mdb_page_get(MDB_cursor *mc, pgno_t pgno, MDB_page **mp, int *lvl);
 static int  mdb_page_search_root(MDB_cursor *mc,
 			    MDB_val *key, int modify);
 #define MDB_PS_MODIFY	1
@@ -1327,7 +1380,7 @@ static int  mdb_node_add(MDB_cursor *mc, indx_t indx,
 static void mdb_node_del(MDB_cursor *mc, int ksize);
 static void mdb_node_shrink(MDB_page *mp, indx_t indx);
 static int	mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft);
-static int  mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data);
+static int  mdb_node_read(MDB_cursor *mc, MDB_node *leaf, MDB_val *data);
 static size_t	mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data);
 static size_t	mdb_branch_size(MDB_env *env, MDB_val *key);
 
@@ -1372,7 +1425,8 @@ static SECURITY_DESCRIPTOR mdb_null_sd;
 static SECURITY_ATTRIBUTES mdb_all_sa;
 static int mdb_sec_inited;
 
-static int utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize);
+struct MDB_name;
+static int utf8_to_utf16(const char *src, struct MDB_name *dst, int xtra);
 #endif
 
 /** Return the library version info. */
@@ -1417,8 +1471,9 @@ mdb_strerror(int err)
 	 *	This works as long as no function between the call to mdb_strerror
 	 *	and the actual use of the message uses more than 4K of stack.
 	 */
-	char pad[4096];
-	char buf[1024], *ptr = buf;
+#define MSGSIZE	1024
+#define PADSIZE	4096
+	char buf[MSGSIZE+PADSIZE], *ptr = buf;
 #endif
 	int i;
 	if (!err)
@@ -1450,7 +1505,7 @@ mdb_strerror(int err)
 	buf[0] = 0;
 	FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM |
 		FORMAT_MESSAGE_IGNORE_INSERTS,
-		NULL, err, 0, ptr, sizeof(buf), (va_list *)pad);
+		NULL, err, 0, ptr, MSGSIZE, (va_list *)buf+MSGSIZE);
 	return ptr;
 #else
 	return strerror(err);
@@ -1558,7 +1613,7 @@ mdb_page_list(MDB_page *mp)
 			pgno, ((MDB_meta *)METADATA(mp))->mm_txnid);
 		return;
 	default:
-		fprintf(stderr, "Bad page %"Z"u flags 0x%u\n", pgno, mp->mp_flags);
+		fprintf(stderr, "Bad page %"Z"u flags 0x%X\n", pgno, mp->mp_flags);
 		return;
 	}
 
@@ -1613,7 +1668,7 @@ mdb_cursor_chk(MDB_cursor *mc)
 	}
 	if (mc->mc_ki[i] >= NUMKEYS(mc->mc_pg[i]))
 		printf("ack!\n");
-	if (mc->mc_xcursor && (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)) {
+	if (XCURSOR_INITED(mc)) {
 		node = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
 		if (((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA) &&
 			mc->mc_xcursor->mx_cursor.mc_pg[0] != NODEDATA(node)) {
@@ -1674,7 +1729,7 @@ static void mdb_audit(MDB_txn *txn)
 		}
 	}
 	if (freecount + count + NUM_METAS != txn->mt_next_pgno) {
-		fprintf(stderr, "audit: %lu freecount: %lu count: %lu total: %lu next_pgno: %lu\n",
+		fprintf(stderr, "audit: %"Z"u freecount: %"Z"u count: %"Z"u total: %"Z"u next_pgno: %"Z"u\n",
 			txn->mt_txnid, freecount, count+NUM_METAS,
 			freecount+count+NUM_METAS, txn->mt_next_pgno);
 	}
@@ -1700,6 +1755,7 @@ mdb_dcmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b)
 
 /** Allocate memory for a page.
  * Re-use old malloc'd pages first for singletons, otherwise just malloc.
+ * Set #MDB_TXN_ERROR on failure.
  */
 static MDB_page *
 mdb_page_malloc(MDB_txn *txn, unsigned num)
@@ -1842,7 +1898,7 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned pflags, int all)
 {
 	enum { Mask = P_SUBP|P_DIRTY|P_LOOSE|P_KEEP };
 	MDB_txn *txn = mc->mc_txn;
-	MDB_cursor *m3;
+	MDB_cursor *m3, *m0 = mc;
 	MDB_xcursor *mx;
 	MDB_page *dp, *mp;
 	MDB_node *leaf;
@@ -1885,7 +1941,7 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned pflags, int all)
 				pgno_t pgno = txn->mt_dbs[i].md_root;
 				if (pgno == P_INVALID)
 					continue;
-				if ((rc = mdb_page_get(txn, pgno, &dp, &level)) != MDB_SUCCESS)
+				if ((rc = mdb_page_get(m0, pgno, &dp, &level)) != MDB_SUCCESS)
 					break;
 				if ((dp->mp_flags & Mask) == pflags && level <= 1)
 					dp->mp_flags ^= P_KEEP;
@@ -2067,7 +2123,7 @@ mdb_page_dirty(MDB_txn *txn, MDB_page *mp)
 }
 
 /** Allocate page numbers and memory for writing.  Maintain me_pglast,
- * me_pghead and mt_next_pgno.
+ * me_pghead and mt_next_pgno.  Set #MDB_TXN_ERROR on failure.
  *
  * If there are free pages available from older transactions, they
  * are re-used first. Otherwise allocate a new page at mt_next_pgno.
@@ -2189,8 +2245,8 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp)
 		}
 		np = m2.mc_pg[m2.mc_top];
 		leaf = NODEPTR(np, m2.mc_ki[m2.mc_top]);
-		if ((rc = mdb_node_read(txn, leaf, &data)) != MDB_SUCCESS)
-			return rc;
+		if ((rc = mdb_node_read(&m2, leaf, &data)) != MDB_SUCCESS)
+			goto fail;
 
 		idl = (MDB_ID *) data.mv_data;
 		i = idl[0];
@@ -2340,6 +2396,7 @@ mdb_page_unspill(MDB_txn *txn, MDB_page *mp, MDB_page **ret)
 }
 
 /** Touch a page: make it dirty and re-insert into tree with updated pgno.
+ * Set #MDB_TXN_ERROR on failure.
  * @param[in] mc cursor pointing to the page to be touched
  * @return 0 on success, non-zero on failure.
  */
@@ -2428,14 +2485,8 @@ done:
 			if (m2 == mc) continue;
 			if (m2->mc_pg[mc->mc_top] == mp) {
 				m2->mc_pg[mc->mc_top] = np;
-				if ((mc->mc_db->md_flags & MDB_DUPSORT) &&
-					IS_LEAF(np) &&
-					(m2->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED))
-				{
-					MDB_node *leaf = NODEPTR(np, m2->mc_ki[mc->mc_top]);
-					if ((leaf->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA)
-						m2->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(leaf);
-				}
+				if (XCURSOR_INITED(m2) && IS_LEAF(np))
+					XCURSOR_REFRESH(m2, np, m2->mc_ki[mc->mc_top]);
 			}
 		}
 	}
@@ -3786,7 +3837,10 @@ mdb_env_write_meta(MDB_txn *txn)
 	len = sizeof(MDB_meta) - off;
 	off += (char *)mp - env->me_map;
 
-	/* Write to the SYNC fd */
+	/* Write to the SYNC fd unless MDB_NOSYNC/MDB_NOMETASYNC.
+	 * (me_mfd goes to the same file as me_fd, but writing to it
+	 * also syncs to disk.  Avoids a separate fdatasync() call.)
+	 */
 	mfd = (flags & (MDB_NOSYNC|MDB_NOMETASYNC)) ? env->me_fd : env->me_mfd;
 #ifdef _WIN32
 	{
@@ -4041,6 +4095,189 @@ mdb_fsize(HANDLE fd, size_t *size)
 	return MDB_SUCCESS;
 }
 
+
+#ifdef _WIN32
+typedef wchar_t	mdb_nchar_t;
+# define MDB_NAME(str)	L##str
+# define mdb_name_cpy	wcscpy
+#else
+/** Character type for file names: char on Unix, wchar_t on Windows */
+typedef char	mdb_nchar_t;
+# define MDB_NAME(str)	str		/**< #mdb_nchar_t[] string literal */
+# define mdb_name_cpy	strcpy	/**< Copy name (#mdb_nchar_t string) */
+#endif
+
+/** Filename - string of #mdb_nchar_t[] */
+typedef struct MDB_name {
+	int mn_len;					/**< Length  */
+	int mn_alloced;				/**< True if #mn_val was malloced */
+	mdb_nchar_t	*mn_val;		/**< Contents */
+} MDB_name;
+
+/** Filename suffixes [datafile,lockfile][without,with MDB_NOSUBDIR] */
+static const mdb_nchar_t *const mdb_suffixes[2][2] = {
+	{ MDB_NAME("/data.mdb"), MDB_NAME("")      },
+	{ MDB_NAME("/lock.mdb"), MDB_NAME("-lock") }
+};
+
+#define MDB_SUFFLEN 9	/**< Max string length in #mdb_suffixes[] */
+
+/** Set up filename + scratch area for filename suffix, for opening files.
+ * It should be freed with #mdb_fname_destroy().
+ * On Windows, paths are converted from char *UTF-8 to wchar_t *UTF-16.
+ *
+ * @param[in] path Pathname for #mdb_env_open().
+ * @param[in] envflags Whether a subdir and/or lockfile will be used.
+ * @param[out] fname Resulting filename, with room for a suffix if necessary.
+ */
+static int ESECT
+mdb_fname_init(const char *path, unsigned envflags, MDB_name *fname)
+{
+	int no_suffix = F_ISSET(envflags, MDB_NOSUBDIR|MDB_NOLOCK);
+	fname->mn_alloced = 0;
+#ifdef _WIN32
+	return utf8_to_utf16(path, fname, no_suffix ? 0 : MDB_SUFFLEN);
+#else
+	fname->mn_len = strlen(path);
+	if (no_suffix)
+		fname->mn_val = (char *) path;
+	else if ((fname->mn_val = malloc(fname->mn_len + MDB_SUFFLEN+1)) != NULL) {
+		fname->mn_alloced = 1;
+		strcpy(fname->mn_val, path);
+	}
+	else
+		return ENOMEM;
+	return MDB_SUCCESS;
+#endif
+}
+
+/** Destroy \b fname from #mdb_fname_init() */
+#define mdb_fname_destroy(fname) \
+	do { if ((fname).mn_alloced) free((fname).mn_val); } while (0)
+
+#ifdef O_CLOEXEC /* POSIX.1-2008: Set FD_CLOEXEC atomically at open() */
+# define MDB_CLOEXEC		O_CLOEXEC
+#else
+# define MDB_CLOEXEC		0
+#endif
+
+/** File type, access mode etc. for #mdb_fopen() */
+enum mdb_fopen_type {
+#ifdef _WIN32
+	MDB_O_RDONLY, MDB_O_RDWR, MDB_O_META, MDB_O_COPY, MDB_O_LOCKS
+#else
+	/* A comment in mdb_fopen() explains some O_* flag choices. */
+	MDB_O_RDONLY= O_RDONLY,                            /**< for RDONLY me_fd */
+	MDB_O_RDWR  = O_RDWR  |O_CREAT,                    /**< for me_fd */
+	MDB_O_META  = O_WRONLY|MDB_DSYNC     |MDB_CLOEXEC, /**< for me_mfd */
+	MDB_O_COPY  = O_WRONLY|O_CREAT|O_EXCL|MDB_CLOEXEC, /**< for #mdb_env_copy() */
+	/** Bitmask for open() flags in enum #mdb_fopen_type.  The other bits
+	 * distinguish otherwise-equal MDB_O_* constants from each other.
+	 */
+	MDB_O_MASK  = MDB_O_RDWR|MDB_CLOEXEC | MDB_O_RDONLY|MDB_O_META|MDB_O_COPY,
+	MDB_O_LOCKS = MDB_O_RDWR|MDB_CLOEXEC | ((MDB_O_MASK+1) & ~MDB_O_MASK) /**< for me_lfd */
+#endif
+};
+
+/** Open an LMDB file.
+ * @param[in] env	The LMDB environment.
+ * @param[in,out] fname	Path from from #mdb_fname_init().  A suffix is
+ * appended if necessary to create the filename, without changing mn_len.
+ * @param[in] which	Determines file type, access mode, etc.
+ * @param[in] mode	The Unix permissions for the file, if we create it.
+ * @param[out] res	Resulting file handle.
+ * @return 0 on success, non-zero on failure.
+ */
+static int ESECT
+mdb_fopen(const MDB_env *env, MDB_name *fname,
+	enum mdb_fopen_type which, mdb_mode_t mode,
+	HANDLE *res)
+{
+	int rc = MDB_SUCCESS;
+	HANDLE fd;
+#ifdef _WIN32
+	DWORD acc, share, disp, attrs;
+#else
+	int flags;
+#endif
+
+	if (fname->mn_alloced)		/* modifiable copy */
+		mdb_name_cpy(fname->mn_val + fname->mn_len,
+			mdb_suffixes[which==MDB_O_LOCKS][F_ISSET(env->me_flags, MDB_NOSUBDIR)]);
+
+	/* The directory must already exist.  Usually the file need not.
+	 * MDB_O_META requires the file because we already created it using
+	 * MDB_O_RDWR.  MDB_O_COPY must not overwrite an existing file.
+	 *
+	 * With MDB_O_COPY we do not want the OS to cache the writes, since
+	 * the source data is already in the OS cache.
+	 *
+	 * The lockfile needs FD_CLOEXEC (close file descriptor on exec*())
+	 * to avoid the flock() issues noted under Caveats in lmdb.h.
+	 * Also set it for other filehandles which the user cannot get at
+	 * and close himself, which he may need after fork().  I.e. all but
+	 * me_fd, which programs do use via mdb_env_get_fd().
+	 */
+
+#ifdef _WIN32
+	acc = GENERIC_READ|GENERIC_WRITE;
+	share = FILE_SHARE_READ|FILE_SHARE_WRITE;
+	disp = OPEN_ALWAYS;
+	attrs = FILE_ATTRIBUTE_NORMAL;
+	switch (which) {
+	case MDB_O_RDONLY:			/* read-only datafile */
+		acc = GENERIC_READ;
+		disp = OPEN_EXISTING;
+		break;
+	case MDB_O_META:			/* for writing metapages */
+		acc = GENERIC_WRITE;
+		disp = OPEN_EXISTING;
+		attrs = FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH;
+		break;
+	case MDB_O_COPY:			/* mdb_env_copy() & co */
+		acc = GENERIC_WRITE;
+		share = 0;
+		disp = CREATE_NEW;
+		attrs = FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH;
+		break;
+	default: break;	/* silence gcc -Wswitch (not all enum values handled) */
+	}
+	fd = CreateFileW(fname->mn_val, acc, share, NULL, disp, attrs, NULL);
+#else
+	fd = open(fname->mn_val, which & MDB_O_MASK, mode);
+#endif
+
+	if (fd == INVALID_HANDLE_VALUE)
+		rc = ErrCode();
+#ifndef _WIN32
+	else {
+		if (which != MDB_O_RDONLY && which != MDB_O_RDWR) {
+			/* Set CLOEXEC if we could not pass it to open() */
+			if (!MDB_CLOEXEC && (flags = fcntl(fd, F_GETFD)) != -1)
+				(void) fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
+		}
+		if (which == MDB_O_COPY && env->me_psize >= env->me_os_psize) {
+			/* This may require buffer alignment.  There is no portable
+			 * way to ask how much, so we require OS pagesize alignment.
+			 */
+# ifdef F_NOCACHE	/* __APPLE__ */
+			(void) fcntl(fd, F_NOCACHE, 1);
+# elif defined O_DIRECT
+			/* open(...O_DIRECT...) would break on filesystems without
+			 * O_DIRECT support (ITS#7682). Try to set it here instead.
+			 */
+			if ((flags = fcntl(fd, F_GETFL)) != -1)
+				(void) fcntl(fd, F_SETFL, flags | O_DIRECT);
+# endif
+		}
+	}
+#endif	/* !_WIN32 */
+
+	*res = fd;
+	return rc;
+}
+
+
 #ifdef BROKEN_FDATASYNC
 #include <sys/utsname.h>
 #include <sys/vfs.h>
@@ -4206,7 +4443,11 @@ mdb_env_reader_dest(void *ptr)
 {
 	MDB_reader *reader = ptr;
 
-	reader->mr_pid = 0;
+#ifndef _WIN32
+	if (reader->mr_pid == getpid()) /* catch pthread_exit() in child process */
+#endif
+		/* We omit the mutex, so do this atomically (i.e. skip mr_txnid) */
+		reader->mr_pid = 0;
 }
 
 #ifdef _WIN32
@@ -4446,52 +4687,30 @@ mdb_hash_enc(MDB_val *val, char *encbuf)
 
 /** Open and/or initialize the lock region for the environment.
  * @param[in] env The LMDB environment.
- * @param[in] lpath The pathname of the file used for the lock region.
+ * @param[in] fname Filename + scratch area, from #mdb_fname_init().
  * @param[in] mode The Unix permissions for the file, if we create it.
  * @param[in,out] excl In -1, out lock type: -1 none, 0 shared, 1 exclusive
  * @return 0 on success, non-zero on failure.
  */
 static int ESECT
-mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
+mdb_env_setup_locks(MDB_env *env, MDB_name *fname, int mode, int *excl)
 {
 #ifdef _WIN32
 #	define MDB_ERRCODE_ROFS	ERROR_WRITE_PROTECT
 #else
 #	define MDB_ERRCODE_ROFS	EROFS
-#ifdef O_CLOEXEC	/* Linux: Open file and set FD_CLOEXEC atomically */
-#	define MDB_CLOEXEC		O_CLOEXEC
-#else
-	int fdflags;
-#	define MDB_CLOEXEC		0
-#endif
 #endif
 	int rc;
 	off_t size, rsize;
 
-#ifdef _WIN32
-	wchar_t *wlpath;
-	rc = utf8_to_utf16(lpath, -1, &wlpath, NULL);
-	if (rc)
-		return rc;
-	env->me_lfd = CreateFileW(wlpath, GENERIC_READ|GENERIC_WRITE,
-		FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
-		FILE_ATTRIBUTE_NORMAL, NULL);
-	free(wlpath);
-#else
-	env->me_lfd = open(lpath, O_RDWR|O_CREAT|MDB_CLOEXEC, mode);
-#endif
-	if (env->me_lfd == INVALID_HANDLE_VALUE) {
-		rc = ErrCode();
+	rc = mdb_fopen(env, fname, MDB_O_LOCKS, mode, &env->me_lfd);
+	if (rc) {
+		/* Omit lockfile if read-only env on read-only filesystem */
 		if (rc == MDB_ERRCODE_ROFS && (env->me_flags & MDB_RDONLY)) {
 			return MDB_SUCCESS;
 		}
-		goto fail_errno;
+		goto fail;
 	}
-#if ! ((MDB_CLOEXEC) || defined(_WIN32))
-	/* Lose record locks when exec*() */
-	if ((fdflags = fcntl(env->me_lfd, F_GETFD) | FD_CLOEXEC) >= 0)
-			fcntl(env->me_lfd, F_SETFD, fdflags);
-#endif
 
 	if (!(env->me_flags & MDB_NOTLS)) {
 		rc = pthread_key_create(&env->me_txkey, mdb_env_reader_dest);
@@ -4619,15 +4838,25 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
 #else	/* MDB_USE_POSIX_MUTEX: */
 		pthread_mutexattr_t mattr;
 
-		if ((rc = pthread_mutexattr_init(&mattr))
-			|| (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))
+		/* Solaris needs this before initing a robust mutex.  Otherwise
+		 * it may skip the init and return EBUSY "seems someone already
+		 * inited" or EINVAL "it was inited differently".
+		 */
+		memset(env->me_txns->mti_rmutex, 0, sizeof(*env->me_txns->mti_rmutex));
+		memset(env->me_txns->mti_wmutex, 0, sizeof(*env->me_txns->mti_wmutex));
+
+		if ((rc = pthread_mutexattr_init(&mattr)))
+			goto fail;
+
+		rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
 #ifdef MDB_ROBUST_SUPPORTED
-			|| (rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST))
+		if (!rc) rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST);
 #endif
-			|| (rc = pthread_mutex_init(env->me_txns->mti_rmutex, &mattr))
-			|| (rc = pthread_mutex_init(env->me_txns->mti_wmutex, &mattr)))
-			goto fail;
+		if (!rc) rc = pthread_mutex_init(env->me_txns->mti_rmutex, &mattr);
+		if (!rc) rc = pthread_mutex_init(env->me_txns->mti_wmutex, &mattr);
 		pthread_mutexattr_destroy(&mattr);
+		if (rc)
+			goto fail;
 #endif	/* _WIN32 || MDB_USE_POSIX_SEM */
 
 		env->me_txns->mti_magic = MDB_MAGIC;
@@ -4671,12 +4900,6 @@ fail:
 	return rc;
 }
 
-	/** The name of the lock file in the DB environment */
-#define LOCKNAME	"/lock.mdb"
-	/** The name of the data file in the DB environment */
-#define DATANAME	"/data.mdb"
-	/** The suffix of the lock file when no subdir is used */
-#define LOCKSUFF	"-lock"
 	/** Only a subset of the @ref mdb_env flags can be changed
 	 *	at runtime. Changing other flags requires closing the
 	 *	environment and re-opening it with the new flags.
@@ -4692,36 +4915,18 @@ fail:
 int ESECT
 mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode)
 {
-	int		oflags, rc, len, excl = -1;
-	char *lpath, *dpath;
-#ifdef _WIN32
-	wchar_t *wpath;
-#endif
+	int rc, excl = -1;
+	MDB_name fname;
 
 	if (env->me_fd!=INVALID_HANDLE_VALUE || (flags & ~(CHANGEABLE|CHANGELESS)))
 		return EINVAL;
 
-	len = strlen(path);
-	if (flags & MDB_NOSUBDIR) {
-		rc = len + sizeof(LOCKSUFF) + len + 1;
-	} else {
-		rc = len + sizeof(LOCKNAME) + len + sizeof(DATANAME);
-	}
-	lpath = malloc(rc);
-	if (!lpath)
-		return ENOMEM;
-	if (flags & MDB_NOSUBDIR) {
-		dpath = lpath + len + sizeof(LOCKSUFF);
-		sprintf(lpath, "%s" LOCKSUFF, path);
-		strcpy(dpath, path);
-	} else {
-		dpath = lpath + len + sizeof(LOCKNAME);
-		sprintf(lpath, "%s" LOCKNAME, path);
-		sprintf(dpath, "%s" DATANAME, path);
-	}
-
-	rc = MDB_SUCCESS;
 	flags |= env->me_flags;
+
+	rc = mdb_fname_init(path, flags, &fname);
+	if (rc)
+		return rc;
+
 	if (flags & MDB_RDONLY) {
 		/* silently ignore WRITEMAP when we're only getting read access */
 		flags &= ~MDB_WRITEMAP;
@@ -4746,69 +4951,31 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
 
 	/* For RDONLY, get lockfile after we know datafile exists */
 	if (!(flags & (MDB_RDONLY|MDB_NOLOCK))) {
-		rc = mdb_env_setup_locks(env, lpath, mode, &excl);
+		rc = mdb_env_setup_locks(env, &fname, mode, &excl);
 		if (rc)
 			goto leave;
 	}
 
-#ifdef _WIN32
-	if (F_ISSET(flags, MDB_RDONLY)) {
-		oflags = GENERIC_READ;
-		len = OPEN_EXISTING;
-	} else {
-		oflags = GENERIC_READ|GENERIC_WRITE;
-		len = OPEN_ALWAYS;
-	}
-	mode = FILE_ATTRIBUTE_NORMAL;
-	rc = utf8_to_utf16(dpath, -1, &wpath, NULL);
+	rc = mdb_fopen(env, &fname,
+		(flags & MDB_RDONLY) ? MDB_O_RDONLY : MDB_O_RDWR,
+		mode, &env->me_fd);
 	if (rc)
 		goto leave;
-	env->me_fd = CreateFileW(wpath, oflags, FILE_SHARE_READ|FILE_SHARE_WRITE,
-		NULL, len, mode, NULL);
-	free(wpath);
-#else
-	if (F_ISSET(flags, MDB_RDONLY))
-		oflags = O_RDONLY;
-	else
-		oflags = O_RDWR | O_CREAT;
-
-	env->me_fd = open(dpath, oflags, mode);
-#endif
-	if (env->me_fd == INVALID_HANDLE_VALUE) {
-		rc = ErrCode();
-		goto leave;
-	}
 
 	if ((flags & (MDB_RDONLY|MDB_NOLOCK)) == MDB_RDONLY) {
-		rc = mdb_env_setup_locks(env, lpath, mode, &excl);
+		rc = mdb_env_setup_locks(env, &fname, mode, &excl);
 		if (rc)
 			goto leave;
 	}
 
 	if ((rc = mdb_env_open2(env)) == MDB_SUCCESS) {
-		if (flags & (MDB_RDONLY|MDB_WRITEMAP)) {
-			env->me_mfd = env->me_fd;
-		} else {
+		if (!(flags & (MDB_RDONLY|MDB_WRITEMAP))) {
 			/* Synchronous fd for meta writes. Needed even with
 			 * MDB_NOSYNC/MDB_NOMETASYNC, in case these get reset.
 			 */
-#ifdef _WIN32
-			len = OPEN_EXISTING;
-			rc = utf8_to_utf16(dpath, -1, &wpath, NULL);
+			rc = mdb_fopen(env, &fname, MDB_O_META, mode, &env->me_mfd);
 			if (rc)
 				goto leave;
-			env->me_mfd = CreateFileW(wpath, oflags,
-				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, len,
-				mode | FILE_FLAG_WRITE_THROUGH, NULL);
-			free(wpath);
-#else
-			oflags &= ~O_CREAT;
-			env->me_mfd = open(dpath, oflags | MDB_DSYNC, mode);
-#endif
-			if (env->me_mfd == INVALID_HANDLE_VALUE) {
-				rc = ErrCode();
-				goto leave;
-			}
 		}
 		DPRINTF(("opened dbenv %p", (void *) env));
 		if (excl > 0) {
@@ -4841,7 +5008,7 @@ leave:
 	if (rc) {
 		mdb_env_close0(env, excl);
 	}
-	free(lpath);
+	mdb_fname_destroy(fname);
 	return rc;
 }
 
@@ -4885,7 +5052,7 @@ mdb_env_close0(MDB_env *env, int excl)
 	if (env->me_map) {
 		munmap(env->me_map, env->me_mapsize);
 	}
-	if (env->me_mfd != env->me_fd && env->me_mfd != INVALID_HANDLE_VALUE)
+	if (env->me_mfd != INVALID_HANDLE_VALUE)
 		(void) close(env->me_mfd);
 	if (env->me_fd != INVALID_HANDLE_VALUE)
 		(void) close(env->me_fd);
@@ -5185,7 +5352,9 @@ mdb_cursor_pop(MDB_cursor *mc)
 	}
 }
 
-/** Push a page onto the top of the cursor's stack. */
+/** Push a page onto the top of the cursor's stack.
+ * Set #MDB_TXN_ERROR on failure.
+ */
 static int
 mdb_cursor_push(MDB_cursor *mc, MDB_page *mp)
 {
@@ -5205,15 +5374,17 @@ mdb_cursor_push(MDB_cursor *mc, MDB_page *mp)
 }
 
 /** Find the address of the page corresponding to a given page number.
- * @param[in] txn the transaction for this access.
+ * Set #MDB_TXN_ERROR on failure.
+ * @param[in] mc the cursor accessing the page.
  * @param[in] pgno the page number for the page to retrieve.
  * @param[out] ret address of a pointer where the page's address will be stored.
  * @param[out] lvl dirty_list inheritance level of found page. 1=current txn, 0=mapped page.
  * @return 0 on success, non-zero on failure.
  */
 static int
-mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **ret, int *lvl)
+mdb_page_get(MDB_cursor *mc, pgno_t pgno, MDB_page **ret, int *lvl)
 {
+	MDB_txn *txn = mc->mc_txn;
 	MDB_env *env = txn->mt_env;
 	MDB_page *p = NULL;
 	int level;
@@ -5308,7 +5479,7 @@ mdb_page_search_root(MDB_cursor *mc, MDB_val *key, int flags)
 		mdb_cassert(mc, i < NUMKEYS(mp));
 		node = NODEPTR(mp, i);
 
-		if ((rc = mdb_page_get(mc->mc_txn, NODEPGNO(node), &mp, NULL)) != 0)
+		if ((rc = mdb_page_get(mc, NODEPGNO(node), &mp, NULL)) != 0)
 			return rc;
 
 		mc->mc_ki[mc->mc_top] = i;
@@ -5350,7 +5521,7 @@ mdb_page_search_lowest(MDB_cursor *mc)
 	MDB_node	*node = NODEPTR(mp, 0);
 	int rc;
 
-	if ((rc = mdb_page_get(mc->mc_txn, NODEPGNO(node), &mp, NULL)) != 0)
+	if ((rc = mdb_page_get(mc, NODEPGNO(node), &mp, NULL)) != 0)
 		return rc;
 
 	mc->mc_ki[mc->mc_top] = 0;
@@ -5402,7 +5573,7 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
 						return MDB_NOTFOUND;
 					if ((leaf->mn_flags & (F_DUPDATA|F_SUBDATA)) != F_SUBDATA)
 						return MDB_INCOMPATIBLE; /* not a named DB */
-					rc = mdb_node_read(mc->mc_txn, leaf, &data);
+					rc = mdb_node_read(&mc2, leaf, &data);
 					if (rc)
 						return rc;
 					memcpy(&flags, ((char *) data.mv_data + offsetof(MDB_db, md_flags)),
@@ -5426,7 +5597,7 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
 
 	mdb_cassert(mc, root > 1);
 	if (!mc->mc_pg[0] || mc->mc_pg[0]->mp_pgno != root)
-		if ((rc = mdb_page_get(mc->mc_txn, root, &mc->mc_pg[0], NULL)) != 0)
+		if ((rc = mdb_page_get(mc, root, &mc->mc_pg[0], NULL)) != 0)
 			return rc;
 
 	mc->mc_snum = 1;
@@ -5523,13 +5694,13 @@ release:
 }
 
 /** Return the data associated with a given node.
- * @param[in] txn The transaction for this operation.
+ * @param[in] mc The cursor for this operation.
  * @param[in] leaf The node being read.
  * @param[out] data Updated to point to the node's data.
  * @return 0 on success, non-zero on failure.
  */
 static int
-mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data)
+mdb_node_read(MDB_cursor *mc, MDB_node *leaf, MDB_val *data)
 {
 	MDB_page	*omp;		/* overflow page */
 	pgno_t		 pgno;
@@ -5545,7 +5716,7 @@ mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data)
 	 */
 	data->mv_size = NODEDSZ(leaf);
 	memcpy(&pgno, NODEDATA(leaf), sizeof(pgno));
-	if ((rc = mdb_page_get(txn, pgno, &omp, NULL)) != 0) {
+	if ((rc = mdb_page_get(mc, pgno, &omp, NULL)) != 0) {
 		DPRINTF(("read overflow page %"Z"u failed", pgno));
 		return rc;
 	}
@@ -5619,7 +5790,7 @@ mdb_cursor_sibling(MDB_cursor *mc, int move_right)
 	mdb_cassert(mc, IS_BRANCH(mc->mc_pg[mc->mc_top]));
 
 	indx = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
-	if ((rc = mdb_page_get(mc->mc_txn, NODEPGNO(indx), &mp, NULL)) != 0) {
+	if ((rc = mdb_page_get(mc, NODEPGNO(indx), &mp, NULL)) != 0) {
 		/* mc will be inconsistent if caller does mc_snum++ as above */
 		mc->mc_flags &= ~(C_INITIALIZED|C_EOF);
 		return rc;
@@ -5640,11 +5811,12 @@ mdb_cursor_next(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
 	MDB_node	*leaf;
 	int rc;
 
-	if (mc->mc_flags & C_EOF) {
+	if ((mc->mc_flags & C_EOF) ||
+		((mc->mc_flags & C_DEL) && op == MDB_NEXT_DUP)) {
 		return MDB_NOTFOUND;
 	}
-
-	mdb_cassert(mc, mc->mc_flags & C_INITIALIZED);
+	if (!(mc->mc_flags & C_INITIALIZED))
+		return mdb_cursor_first(mc, key, data);
 
 	mp = mc->mc_pg[mc->mc_top];
 
@@ -5701,7 +5873,7 @@ skip:
 		mdb_xcursor_init1(mc, leaf);
 	}
 	if (data) {
-		if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+		if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
 			return rc;
 
 		if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
@@ -5723,7 +5895,12 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
 	MDB_node	*leaf;
 	int rc;
 
-	mdb_cassert(mc, mc->mc_flags & C_INITIALIZED);
+	if (!(mc->mc_flags & C_INITIALIZED)) {
+		rc = mdb_cursor_last(mc, key, data);
+		if (rc)
+			return rc;
+		mc->mc_ki[mc->mc_top]++;
+	}
 
 	mp = mc->mc_pg[mc->mc_top];
 
@@ -5779,7 +5956,7 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
 		mdb_xcursor_init1(mc, leaf);
 	}
 	if (data) {
-		if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+		if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
 			return rc;
 
 		if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
@@ -5873,6 +6050,7 @@ mdb_cursor_set(MDB_cursor *mc, MDB_val *key, MDB_val *data,
 						}
 					}
 					rc = 0;
+					mc->mc_flags &= ~C_EOF;
 					goto set2;
 				}
 			}
@@ -5961,7 +6139,7 @@ set1:
 		} else if (op == MDB_GET_BOTH || op == MDB_GET_BOTH_RANGE) {
 			MDB_val olddata;
 			MDB_cmp_func *dcmp;
-			if ((rc = mdb_node_read(mc->mc_txn, leaf, &olddata)) != MDB_SUCCESS)
+			if ((rc = mdb_node_read(mc, leaf, &olddata)) != MDB_SUCCESS)
 				return rc;
 			dcmp = mc->mc_dbx->md_dcmp;
 #if UINT_MAX < SIZE_MAX
@@ -5973,13 +6151,13 @@ set1:
 				if (op == MDB_GET_BOTH || rc > 0)
 					return MDB_NOTFOUND;
 				rc = 0;
-				*data = olddata;
 			}
+			*data = olddata;
 
 		} else {
 			if (mc->mc_xcursor)
 				mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
-			if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+			if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
 				return rc;
 		}
 	}
@@ -6028,7 +6206,7 @@ mdb_cursor_first(MDB_cursor *mc, MDB_val *key, MDB_val *data)
 			if (rc)
 				return rc;
 		} else {
-			if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+			if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
 				return rc;
 		}
 	}
@@ -6073,7 +6251,7 @@ mdb_cursor_last(MDB_cursor *mc, MDB_val *key, MDB_val *data)
 			if (rc)
 				return rc;
 		} else {
-			if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+			if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
 				return rc;
 		}
 	}
@@ -6119,7 +6297,7 @@ mdb_cursor_get(MDB_cursor *mc, MDB_val *key, MDB_val *data,
 					if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
 						rc = mdb_cursor_get(&mc->mc_xcursor->mx_cursor, data, NULL, MDB_GET_CURRENT);
 					} else {
-						rc = mdb_node_read(mc->mc_txn, leaf, data);
+						rc = mdb_node_read(mc, leaf, data);
 					}
 				}
 			}
@@ -6169,10 +6347,7 @@ mdb_cursor_get(MDB_cursor *mc, MDB_val *key, MDB_val *data,
 			rc = MDB_INCOMPATIBLE;
 			break;
 		}
-		if (!(mc->mc_flags & C_INITIALIZED))
-			rc = mdb_cursor_first(mc, key, data);
-		else
-			rc = mdb_cursor_next(mc, key, data, MDB_NEXT_DUP);
+		rc = mdb_cursor_next(mc, key, data, MDB_NEXT_DUP);
 		if (rc == MDB_SUCCESS) {
 			if (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
 				MDB_cursor *mx;
@@ -6187,24 +6362,38 @@ fetchm:
 			}
 		}
 		break;
+	case MDB_PREV_MULTIPLE:
+		if (data == NULL) {
+			rc = EINVAL;
+			break;
+		}
+		if (!(mc->mc_db->md_flags & MDB_DUPFIXED)) {
+			rc = MDB_INCOMPATIBLE;
+			break;
+		}
+		if (!(mc->mc_flags & C_INITIALIZED))
+			rc = mdb_cursor_last(mc, key, data);
+		else
+			rc = MDB_SUCCESS;
+		if (rc == MDB_SUCCESS) {
+			MDB_cursor *mx = &mc->mc_xcursor->mx_cursor;
+			if (mx->mc_flags & C_INITIALIZED) {
+				rc = mdb_cursor_sibling(mx, 0);
+				if (rc == MDB_SUCCESS)
+					goto fetchm;
+			} else {
+				rc = MDB_NOTFOUND;
+			}
+		}
+		break;
 	case MDB_NEXT:
 	case MDB_NEXT_DUP:
 	case MDB_NEXT_NODUP:
-		if (!(mc->mc_flags & C_INITIALIZED))
-			rc = mdb_cursor_first(mc, key, data);
-		else
-			rc = mdb_cursor_next(mc, key, data, op);
+		rc = mdb_cursor_next(mc, key, data, op);
 		break;
 	case MDB_PREV:
 	case MDB_PREV_DUP:
 	case MDB_PREV_NODUP:
-		if (!(mc->mc_flags & C_INITIALIZED)) {
-			rc = mdb_cursor_last(mc, key, data);
-			if (rc)
-				break;
-			mc->mc_flags |= C_INITIALIZED;
-			mc->mc_ki[mc->mc_top]++;
-		}
 		rc = mdb_cursor_prev(mc, key, data, op);
 		break;
 	case MDB_FIRST:
@@ -6225,7 +6414,7 @@ fetchm:
 			MDB_node *leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
 			if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
 				MDB_GET_KEY(leaf, key);
-				rc = mdb_node_read(mc->mc_txn, leaf, data);
+				rc = mdb_node_read(mc, leaf, data);
 				break;
 			}
 		}
@@ -6262,7 +6451,8 @@ mdb_cursor_touch(MDB_cursor *mc)
 {
 	int rc = MDB_SUCCESS;
 
-	if (mc->mc_dbi >= CORE_DBS && !(*mc->mc_dbflag & DB_DIRTY)) {
+	if (mc->mc_dbi >= CORE_DBS && !(*mc->mc_dbflag & (DB_DIRTY|DB_DUPDATA))) {
+		/* Touch DB record of named DB */
 		MDB_cursor mc2;
 		MDB_xcursor mcx;
 		if (TXN_DBI_CHANGED(mc->mc_txn, mc->mc_dbi))
@@ -6609,7 +6799,7 @@ current:
 			int level, ovpages, dpages = OVPAGES(data->mv_size, env->me_psize);
 
 			memcpy(&pg, olddata.mv_data, sizeof(pg));
-			if ((rc2 = mdb_page_get(mc->mc_txn, pg, &omp, &level)) != 0)
+			if ((rc2 = mdb_page_get(mc, pg, &omp, &level)) != 0)
 				return rc2;
 			ovpages = omp->mp_pages;
 
@@ -6641,8 +6831,13 @@ current:
 					/* Note - this page is already counted in parent's dirty_room */
 					rc2 = mdb_mid2l_insert(mc->mc_txn->mt_u.dirty_list, &id2);
 					mdb_cassert(mc, rc2 == 0);
+					/* Currently we make the page look as with put() in the
+					 * parent txn, in case the user peeks at MDB_RESERVEd
+					 * or unused parts. Some users treat ovpages specially.
+					 */
 					if (!(flags & MDB_RESERVE)) {
-						/* Copy end of page, adjusting alignment so
+						/* Skip the part where LMDB will put *data.
+						 * Copy end of page, adjusting alignment so
 						 * compiler may copy words instead of bytes.
 						 */
 						off = (PAGEHDRSZ + data->mv_size) & -sizeof(size_t);
@@ -6711,11 +6906,8 @@ new_sub:
 				if (m3->mc_ki[i] >= mc->mc_ki[i] && insert_key) {
 					m3->mc_ki[i]++;
 				}
-				if (m3->mc_xcursor && (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)) {
-					MDB_node *n2 = NODEPTR(mp, m3->mc_ki[i]);
-					if ((n2->mn_flags & (F_SUBDATA|F_DUPDATA)) == F_DUPDATA)
-						m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(n2);
-				}
+				if (XCURSOR_INITED(m3))
+					XCURSOR_REFRESH(m3, mp, m3->mc_ki[i]);
 			}
 		}
 	}
@@ -6766,9 +6958,7 @@ put_sub:
 						if (m2->mc_ki[i] == mc->mc_ki[i]) {
 							mdb_xcursor_init2(m2, mx, new_dupdata);
 						} else if (!insert_key && m2->mc_ki[i] < nkeys) {
-							MDB_node *n2 = NODEPTR(mp, m2->mc_ki[i]);
-							if ((n2->mn_flags & (F_SUBDATA|F_DUPDATA)) == F_DUPDATA)
-								m2->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(n2);
+							XCURSOR_REFRESH(m2, mp, m2->mc_ki[i]);
 						}
 					}
 				}
@@ -6873,13 +7063,12 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
 						if (m2 == mc || m2->mc_snum < mc->mc_snum) continue;
 						if (!(m2->mc_flags & C_INITIALIZED)) continue;
 						if (m2->mc_pg[mc->mc_top] == mp) {
-							if (m2->mc_ki[mc->mc_top] == mc->mc_ki[mc->mc_top]) {
-								m2->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(leaf);
-							} else {
-								MDB_node *n2 = NODEPTR(mp, m2->mc_ki[mc->mc_top]);
-								if (!(n2->mn_flags & F_SUBDATA))
-									m2->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(n2);
+							MDB_node *n2 = leaf;
+							if (m2->mc_ki[mc->mc_top] != mc->mc_ki[mc->mc_top]) {
+								n2 = NODEPTR(mp, m2->mc_ki[mc->mc_top]);
+								if (n2->mn_flags & F_SUBDATA) continue;
 							}
+							m2->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(n2);
 						}
 					}
 				}
@@ -6910,7 +7099,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
 		pgno_t pg;
 
 		memcpy(&pg, NODEDATA(leaf), sizeof(pg));
-		if ((rc = mdb_page_get(mc->mc_txn, pg, &omp, NULL)) ||
+		if ((rc = mdb_page_get(mc, pg, &omp, NULL)) ||
 			(rc = mdb_ovpage_free(mc, omp)))
 			goto fail;
 	}
@@ -6924,6 +7113,7 @@ fail:
 }
 
 /** Allocate and initialize new pages for a database.
+ * Set #MDB_TXN_ERROR on failure.
  * @param[in] mc a cursor on the database being added to.
  * @param[in] flags flags defining what type of page is being allocated.
  * @param[in] num the number of pages to allocate. This is usually 1,
@@ -7009,6 +7199,7 @@ mdb_branch_size(MDB_env *env, MDB_val *key)
 }
 
 /** Add a node to the page pointed to by the cursor.
+ * Set #MDB_TXN_ERROR on failure.
  * @param[in] mc The cursor for this operation.
  * @param[in] indx The index on the page where the new node should be added.
  * @param[in] key The key for the new node.
@@ -7318,7 +7509,7 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_node *node)
 	}
 	DPRINTF(("Sub-db -%u root page %"Z"u", mx->mx_cursor.mc_dbi,
 		mx->mx_db.md_root));
-	mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DIRTY; /* DB_DIRTY guides mdb_cursor_touch */
+	mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DUPDATA;
 #if UINT_MAX < SIZE_MAX
 	if (mx->mx_dbx.md_cmp == mdb_cmp_int && mx->mx_db.md_pad == sizeof(size_t))
 		mx->mx_dbx.md_cmp = mdb_cmp_clong;
@@ -7344,7 +7535,7 @@ mdb_xcursor_init2(MDB_cursor *mc, MDB_xcursor *src_mx, int new_dupdata)
 		mx->mx_cursor.mc_top = 0;
 		mx->mx_cursor.mc_flags |= C_INITIALIZED;
 		mx->mx_cursor.mc_ki[0] = 0;
-		mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DIRTY; /* DB_DIRTY guides mdb_cursor_touch */
+		mx->mx_dbflag = DB_VALID|DB_USRVALID|DB_DUPDATA;
 #if UINT_MAX < SIZE_MAX
 		mx->mx_dbx.md_cmp = src_mx->mx_dbx.md_cmp;
 #endif
@@ -7497,6 +7688,7 @@ mdb_cursor_dbi(MDB_cursor *mc)
 }
 
 /** Replace the key for a branch node with a new key.
+ * Set #MDB_TXN_ERROR on failure.
  * @param[in] mc Cursor pointing to the node to operate on.
  * @param[in] key The new key to use.
  * @return 0 on success, non-zero on failure.
@@ -7716,12 +7908,8 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
 					m3->mc_ki[csrc->mc_top] = cdst->mc_ki[cdst->mc_top];
 					m3->mc_ki[csrc->mc_top-1]++;
 				}
-				if (m3->mc_xcursor && (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) &&
-					IS_LEAF(mps)) {
-					MDB_node *node = NODEPTR(m3->mc_pg[csrc->mc_top], m3->mc_ki[csrc->mc_top]);
-					if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA)
-						m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
-				}
+				if (XCURSOR_INITED(m3) && IS_LEAF(mps))
+					XCURSOR_REFRESH(m3, m3->mc_pg[csrc->mc_top], m3->mc_ki[csrc->mc_top]);
 			}
 		} else
 		/* Adding on the right, bump others down */
@@ -7742,12 +7930,8 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
 					} else {
 						m3->mc_ki[csrc->mc_top]--;
 					}
-					if (m3->mc_xcursor && (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) &&
-						IS_LEAF(mps)) {
-						MDB_node *node = NODEPTR(m3->mc_pg[csrc->mc_top], m3->mc_ki[csrc->mc_top]);
-						if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA)
-							m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
-					}
+					if (XCURSOR_INITED(m3) && IS_LEAF(mps))
+						XCURSOR_REFRESH(m3, m3->mc_pg[csrc->mc_top], m3->mc_ki[csrc->mc_top]);
 				}
 			}
 		}
@@ -7948,12 +8132,8 @@ mdb_page_merge(MDB_cursor *csrc, MDB_cursor *cdst)
 				m3->mc_ki[top-1] > csrc->mc_ki[top-1]) {
 				m3->mc_ki[top-1]--;
 			}
-			if (m3->mc_xcursor && (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) &&
-				IS_LEAF(psrc)) {
-				MDB_node *node = NODEPTR(m3->mc_pg[top], m3->mc_ki[top]);
-				if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA)
-					m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
-			}
+			if (XCURSOR_INITED(m3) && IS_LEAF(psrc))
+				XCURSOR_REFRESH(m3, m3->mc_pg[top], m3->mc_ki[top]);
 		}
 	}
 	{
@@ -8069,7 +8249,7 @@ mdb_rebalance(MDB_cursor *mc)
 			if (rc)
 				return rc;
 			mc->mc_db->md_root = NODEPGNO(NODEPTR(mp, 0));
-			rc = mdb_page_get(mc->mc_txn,mc->mc_db->md_root,&mc->mc_pg[0],NULL);
+			rc = mdb_page_get(mc, mc->mc_db->md_root, &mc->mc_pg[0], NULL);
 			if (rc)
 				return rc;
 			mc->mc_db->md_depth--;
@@ -8130,7 +8310,7 @@ mdb_rebalance(MDB_cursor *mc)
 		DPUTS("reading right neighbor");
 		mn.mc_ki[ptop]++;
 		node = NODEPTR(mc->mc_pg[ptop], mn.mc_ki[ptop]);
-		rc = mdb_page_get(mc->mc_txn,NODEPGNO(node),&mn.mc_pg[mn.mc_top],NULL);
+		rc = mdb_page_get(mc, NODEPGNO(node), &mn.mc_pg[mn.mc_top], NULL);
 		if (rc)
 			return rc;
 		mn.mc_ki[mn.mc_top] = 0;
@@ -8142,7 +8322,7 @@ mdb_rebalance(MDB_cursor *mc)
 		DPUTS("reading left neighbor");
 		mn.mc_ki[ptop]--;
 		node = NODEPTR(mc->mc_pg[ptop], mn.mc_ki[ptop]);
-		rc = mdb_page_get(mc->mc_txn,NODEPGNO(node),&mn.mc_pg[mn.mc_top],NULL);
+		rc = mdb_page_get(mc, NODEPGNO(node), &mn.mc_pg[mn.mc_top], NULL);
 		if (rc)
 			return rc;
 		mn.mc_ki[mn.mc_top] = NUMKEYS(mn.mc_pg[mn.mc_top]) - 1;
@@ -8207,16 +8387,16 @@ mdb_cursor_del0(MDB_cursor *mc)
 			if (m3->mc_pg[mc->mc_top] == mp) {
 				if (m3->mc_ki[mc->mc_top] == ki) {
 					m3->mc_flags |= C_DEL;
-					if (mc->mc_db->md_flags & MDB_DUPSORT)
-						m3->mc_xcursor->mx_cursor.mc_flags &= ~C_INITIALIZED;
+					if (mc->mc_db->md_flags & MDB_DUPSORT) {
+						/* Sub-cursor referred into dataset which is gone */
+						m3->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
+					}
+					continue;
 				} else if (m3->mc_ki[mc->mc_top] > ki) {
 					m3->mc_ki[mc->mc_top]--;
 				}
-				if (m3->mc_xcursor && (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)) {
-					MDB_node *node = NODEPTR(m3->mc_pg[mc->mc_top], m3->mc_ki[mc->mc_top]);
-					if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA)
-						m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
-				}
+				if (XCURSOR_INITED(m3))
+					XCURSOR_REFRESH(m3, m3->mc_pg[mc->mc_top], m3->mc_ki[mc->mc_top]);
 			}
 		}
 	}
@@ -8242,11 +8422,27 @@ mdb_cursor_del0(MDB_cursor *mc)
 				continue;
 			if (m3->mc_pg[mc->mc_top] == mp) {
 				/* if m3 points past last node in page, find next sibling */
-				if (m3->mc_ki[mc->mc_top] >= nkeys) {
-					rc = mdb_cursor_sibling(m3, 1);
-					if (rc == MDB_NOTFOUND) {
-						m3->mc_flags |= C_EOF;
-						rc = MDB_SUCCESS;
+				if (m3->mc_ki[mc->mc_top] >= mc->mc_ki[mc->mc_top]) {
+					if (m3->mc_ki[mc->mc_top] >= nkeys) {
+						rc = mdb_cursor_sibling(m3, 1);
+						if (rc == MDB_NOTFOUND) {
+							m3->mc_flags |= C_EOF;
+							rc = MDB_SUCCESS;
+							continue;
+						}
+					}
+					if (mc->mc_db->md_flags & MDB_DUPSORT) {
+						MDB_node *node = NODEPTR(m3->mc_pg[m3->mc_top], m3->mc_ki[m3->mc_top]);
+						/* If this node is a fake page, it needs to be reinited
+						 * because its data has moved. But just reset mc_pg[0]
+						 * if the xcursor is already live.
+						 */
+						if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA) {
+							if (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED)
+								m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
+							else
+								mdb_xcursor_init1(m3, node);
+						}
 					}
 				}
 			}
@@ -8321,6 +8517,7 @@ mdb_del0(MDB_txn *txn, MDB_dbi dbi,
 }
 
 /** Split a page and insert a new node.
+ * Set #MDB_TXN_ERROR on failure.
  * @param[in,out] mc Cursor pointing to the page and desired insertion index.
  * The cursor will be updated to point to the actual page and index where
  * the node got inserted after the split.
@@ -8730,12 +8927,8 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
 				m3->mc_ki[ptop] >= mc->mc_ki[ptop]) {
 				m3->mc_ki[ptop]++;
 			}
-			if (m3->mc_xcursor && (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) &&
-				IS_LEAF(mp)) {
-				MDB_node *node = NODEPTR(m3->mc_pg[mc->mc_top], m3->mc_ki[mc->mc_top]);
-				if ((node->mn_flags & (F_DUPDATA|F_SUBDATA)) == F_DUPDATA)
-					m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
-			}
+			if (XCURSOR_INITED(m3) && IS_LEAF(mp))
+				XCURSOR_REFRESH(m3, m3->mc_pg[mc->mc_top], m3->mc_ki[mc->mc_top]);
 		}
 	}
 	DPRINTF(("mp left: %d, rp left: %d", SIZELEFT(mp), SIZELEFT(rp)));
@@ -8776,23 +8969,26 @@ mdb_put(MDB_txn *txn, MDB_dbi dbi,
 #ifndef MDB_WBUF
 #define MDB_WBUF	(1024*1024)
 #endif
+#define MDB_EOF		0x10	/**< #mdb_env_copyfd1() is done reading */
 
-	/** State needed for a compacting copy. */
+	/** State needed for a double-buffering compacting copy. */
 typedef struct mdb_copy {
+	MDB_env *mc_env;
+	MDB_txn *mc_txn;
 	pthread_mutex_t mc_mutex;
-	pthread_cond_t mc_cond;
+	pthread_cond_t mc_cond;	/**< Condition variable for #mc_new */
 	char *mc_wbuf[2];
 	char *mc_over[2];
-	MDB_env *mc_env;
-	MDB_txn *mc_txn;
 	int mc_wlen[2];
 	int mc_olen[2];
 	pgno_t mc_next_pgno;
 	HANDLE mc_fd;
-	int mc_status;
-	volatile int mc_new;
-	int mc_toggle;
-
+	int mc_toggle;			/**< Buffer number in provider */
+	int mc_new;				/**< (0-2 buffers to write) | (#MDB_EOF at end) */
+	/** Error code.  Never cleared if set.  Both threads can set nonzero
+	 *	to fail the copy.  Not mutex-protected, LMDB expects atomic int.
+	 */
+	volatile int mc_error;
 } mdb_copy;
 
 	/** Dedicated writer thread for compacting copy. */
@@ -8808,26 +9004,38 @@ mdb_env_copythr(void *arg)
 #else
 	int len;
 #define DO_WRITE(rc, fd, ptr, w2, len)	len = write(fd, ptr, w2); rc = (len >= 0)
+#ifdef SIGPIPE
+	sigset_t set;
+	sigemptyset(&set);
+	sigaddset(&set, SIGPIPE);
+	if ((rc = pthread_sigmask(SIG_BLOCK, &set, NULL)) != 0)
+		my->mc_error = rc;
+#endif
 #endif
 
 	pthread_mutex_lock(&my->mc_mutex);
-	my->mc_new = 0;
-	pthread_cond_signal(&my->mc_cond);
 	for(;;) {
 		while (!my->mc_new)
 			pthread_cond_wait(&my->mc_cond, &my->mc_mutex);
-		if (my->mc_new < 0) {
-			my->mc_new = 0;
+		if (my->mc_new == 0 + MDB_EOF) /* 0 buffers, just EOF */
 			break;
-		}
-		my->mc_new = 0;
 		wsize = my->mc_wlen[toggle];
 		ptr = my->mc_wbuf[toggle];
 again:
-		while (wsize > 0) {
+		rc = MDB_SUCCESS;
+		while (wsize > 0 && !my->mc_error) {
 			DO_WRITE(rc, my->mc_fd, ptr, wsize, len);
 			if (!rc) {
 				rc = ErrCode();
+#if defined(SIGPIPE) && !defined(_WIN32)
+				if (rc == EPIPE) {
+					/* Collect the pending SIGPIPE, otherwise at least OS X
+					 * gives it to the process on thread-exit (ITS#8504).
+					 */
+					int tmp;
+					sigwait(&set, &tmp);
+				}
+#endif
 				break;
 			} else if (len > 0) {
 				rc = MDB_SUCCESS;
@@ -8840,8 +9048,7 @@ again:
 			}
 		}
 		if (rc) {
-			my->mc_status = rc;
-			break;
+			my->mc_error = rc;
 		}
 		/* If there's an overflow page tail, write it too */
 		if (my->mc_olen[toggle]) {
@@ -8852,39 +9059,45 @@ again:
 		}
 		my->mc_wlen[toggle] = 0;
 		toggle ^= 1;
+		/* Return the empty buffer to provider */
+		my->mc_new--;
 		pthread_cond_signal(&my->mc_cond);
 	}
-	pthread_cond_signal(&my->mc_cond);
 	pthread_mutex_unlock(&my->mc_mutex);
 	return (THREAD_RET)0;
 #undef DO_WRITE
 }
 
-	/** Tell the writer thread there's a buffer ready to write */
+	/** Give buffer and/or #MDB_EOF to writer thread, await unused buffer.
+	 *
+	 * @param[in] my control structure.
+	 * @param[in] adjust (1 to hand off 1 buffer) | (MDB_EOF when ending).
+	 */
 static int ESECT
-mdb_env_cthr_toggle(mdb_copy *my, int st)
+mdb_env_cthr_toggle(mdb_copy *my, int adjust)
 {
-	int toggle = my->mc_toggle ^ 1;
 	pthread_mutex_lock(&my->mc_mutex);
-	if (my->mc_status) {
-		pthread_mutex_unlock(&my->mc_mutex);
-		return my->mc_status;
-	}
-	while (my->mc_new == 1)
-		pthread_cond_wait(&my->mc_cond, &my->mc_mutex);
-	my->mc_new = st;
-	my->mc_toggle = toggle;
+	my->mc_new += adjust;
 	pthread_cond_signal(&my->mc_cond);
+	while (my->mc_new & 2)		/* both buffers in use */
+		pthread_cond_wait(&my->mc_cond, &my->mc_mutex);
 	pthread_mutex_unlock(&my->mc_mutex);
-	return 0;
+
+	my->mc_toggle ^= (adjust & 1);
+	/* Both threads reset mc_wlen, to be safe from threading errors */
+	my->mc_wlen[my->mc_toggle] = 0;
+	return my->mc_error;
 }
 
-	/** Depth-first tree traversal for compacting copy. */
+	/** Depth-first tree traversal for compacting copy.
+	 * @param[in] my control structure.
+	 * @param[in,out] pg database root.
+	 * @param[in] flags includes #F_DUPDATA if it is a sorted-duplicate sub-DB.
+	 */
 static int ESECT
 mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
 {
-	MDB_cursor mc;
-	MDB_txn *txn = my->mc_txn;
+	MDB_cursor mc = {0};
 	MDB_node *ni;
 	MDB_page *mo, *mp, *leaf;
 	char *buf, *ptr;
@@ -8896,10 +9109,9 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
 		return MDB_SUCCESS;
 
 	mc.mc_snum = 1;
-	mc.mc_top = 0;
-	mc.mc_txn = txn;
+	mc.mc_txn = my->mc_txn;
 
-	rc = mdb_page_get(my->mc_txn, *pg, &mc.mc_pg[0], NULL);
+	rc = mdb_page_get(&mc, *pg, &mc.mc_pg[0], NULL);
 	if (rc)
 		return rc;
 	rc = mdb_page_search_root(&mc, NULL, MDB_PS_FIRST);
@@ -8943,7 +9155,8 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
 						}
 
 						memcpy(&pg, NODEDATA(ni), sizeof(pg));
-						rc = mdb_page_get(txn, pg, &omp, NULL);
+						memcpy(NODEDATA(ni), &my->mc_next_pgno, sizeof(pgno_t));
+						rc = mdb_page_get(&mc, pg, &omp, NULL);
 						if (rc)
 							goto done;
 						if (my->mc_wlen[toggle] >= MDB_WBUF) {
@@ -8965,7 +9178,6 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
 								goto done;
 							toggle = my->mc_toggle;
 						}
-						memcpy(NODEDATA(ni), &mo->mp_pgno, sizeof(pgno_t));
 					} else if (ni->mn_flags & F_SUBDATA) {
 						MDB_db db;
 
@@ -8994,7 +9206,7 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
 again:
 				ni = NODEPTR(mp, mc.mc_ki[mc.mc_top]);
 				pg = NODEPGNO(ni);
-				rc = mdb_page_get(txn, pg, &mp, NULL);
+				rc = mdb_page_get(&mc, pg, &mp, NULL);
 				if (rc)
 					goto done;
 				mc.mc_top++;
@@ -9043,47 +9255,56 @@ mdb_env_copyfd1(MDB_env *env, HANDLE fd)
 {
 	MDB_meta *mm;
 	MDB_page *mp;
-	mdb_copy my;
+	mdb_copy my = {0};
 	MDB_txn *txn = NULL;
 	pthread_t thr;
-	int rc;
+	pgno_t root, new_root;
+	int rc = MDB_SUCCESS;
 
 #ifdef _WIN32
-	my.mc_mutex = CreateMutex(NULL, FALSE, NULL);
-	my.mc_cond = CreateEvent(NULL, FALSE, FALSE, NULL);
+	if (!(my.mc_mutex = CreateMutex(NULL, FALSE, NULL)) ||
+		!(my.mc_cond = CreateEvent(NULL, FALSE, FALSE, NULL))) {
+		rc = ErrCode();
+		goto done;
+	}
 	my.mc_wbuf[0] = _aligned_malloc(MDB_WBUF*2, env->me_os_psize);
-	if (my.mc_wbuf[0] == NULL)
-		return errno;
+	if (my.mc_wbuf[0] == NULL) {
+		/* _aligned_malloc() sets errno, but we use Windows error codes */
+		rc = ERROR_NOT_ENOUGH_MEMORY;
+		goto done;
+	}
 #else
-	pthread_mutex_init(&my.mc_mutex, NULL);
-	pthread_cond_init(&my.mc_cond, NULL);
+	if ((rc = pthread_mutex_init(&my.mc_mutex, NULL)) != 0)
+		return rc;
+	if ((rc = pthread_cond_init(&my.mc_cond, NULL)) != 0)
+		goto done2;
 #ifdef HAVE_MEMALIGN
 	my.mc_wbuf[0] = memalign(env->me_os_psize, MDB_WBUF*2);
-	if (my.mc_wbuf[0] == NULL)
-		return errno;
+	if (my.mc_wbuf[0] == NULL) {
+		rc = errno;
+		goto done;
+	}
 #else
-	rc = posix_memalign((void **)&my.mc_wbuf[0], env->me_os_psize, MDB_WBUF*2);
-	if (rc)
-		return rc;
+	{
+		void *p;
+		if ((rc = posix_memalign(&p, env->me_os_psize, MDB_WBUF*2)) != 0)
+			goto done;
+		my.mc_wbuf[0] = p;
+	}
 #endif
 #endif
 	memset(my.mc_wbuf[0], 0, MDB_WBUF*2);
 	my.mc_wbuf[1] = my.mc_wbuf[0] + MDB_WBUF;
-	my.mc_wlen[0] = 0;
-	my.mc_wlen[1] = 0;
-	my.mc_olen[0] = 0;
-	my.mc_olen[1] = 0;
 	my.mc_next_pgno = NUM_METAS;
-	my.mc_status = 0;
-	my.mc_new = 1;
-	my.mc_toggle = 0;
 	my.mc_env = env;
 	my.mc_fd = fd;
-	THREAD_CREATE(thr, mdb_env_copythr, &my);
+	rc = THREAD_CREATE(thr, mdb_env_copythr, &my);
+	if (rc)
+		goto done;
 
 	rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
 	if (rc)
-		return rc;
+		goto finish;
 
 	mp = (MDB_page *)my.mc_wbuf[0];
 	memset(mp, 0, NUM_METAS * env->me_psize);
@@ -9099,57 +9320,64 @@ mdb_env_copyfd1(MDB_env *env, HANDLE fd)
 	*(MDB_meta *)METADATA(mp) = *mm;
 	mm = (MDB_meta *)METADATA(mp);
 
-	/* Count the number of free pages, subtract from lastpg to find
-	 * number of active pages
-	 */
-	{
+	/* Set metapage 1 with current main DB */
+	root = new_root = txn->mt_dbs[MAIN_DBI].md_root;
+	if (root != P_INVALID) {
+		/* Count free pages + freeDB pages.  Subtract from last_pg
+		 * to find the new last_pg, which also becomes the new root.
+		 */
 		MDB_ID freecount = 0;
 		MDB_cursor mc;
 		MDB_val key, data;
 		mdb_cursor_init(&mc, txn, FREE_DBI, NULL);
 		while ((rc = mdb_cursor_get(&mc, &key, &data, MDB_NEXT)) == 0)
 			freecount += *(MDB_ID *)data.mv_data;
+		if (rc != MDB_NOTFOUND)
+			goto finish;
 		freecount += txn->mt_dbs[FREE_DBI].md_branch_pages +
 			txn->mt_dbs[FREE_DBI].md_leaf_pages +
 			txn->mt_dbs[FREE_DBI].md_overflow_pages;
 
-		/* Set metapage 1 */
-		mm->mm_last_pg = txn->mt_next_pgno - freecount - 1;
+		new_root = txn->mt_next_pgno - 1 - freecount;
+		mm->mm_last_pg = new_root;
 		mm->mm_dbs[MAIN_DBI] = txn->mt_dbs[MAIN_DBI];
-		if (mm->mm_last_pg > NUM_METAS-1) {
-			mm->mm_dbs[MAIN_DBI].md_root = mm->mm_last_pg;
-			mm->mm_txnid = 1;
-		} else {
-			mm->mm_dbs[MAIN_DBI].md_root = P_INVALID;
-		}
+		mm->mm_dbs[MAIN_DBI].md_root = new_root;
+	} else {
+		/* When the DB is empty, handle it specially to
+		 * fix any breakage like page leaks from ITS#8174.
+		 */
+		mm->mm_dbs[MAIN_DBI].md_flags = txn->mt_dbs[MAIN_DBI].md_flags;
+	}
+	if (root != P_INVALID || mm->mm_dbs[MAIN_DBI].md_flags) {
+		mm->mm_txnid = 1;		/* use metapage 1 */
 	}
+
 	my.mc_wlen[0] = env->me_psize * NUM_METAS;
 	my.mc_txn = txn;
-	pthread_mutex_lock(&my.mc_mutex);
-	while(my.mc_new)
-		pthread_cond_wait(&my.mc_cond, &my.mc_mutex);
-	pthread_mutex_unlock(&my.mc_mutex);
-	rc = mdb_env_cwalk(&my, &txn->mt_dbs[MAIN_DBI].md_root, 0);
-	if (rc == MDB_SUCCESS && my.mc_wlen[my.mc_toggle])
-		rc = mdb_env_cthr_toggle(&my, 1);
-	mdb_env_cthr_toggle(&my, -1);
-	pthread_mutex_lock(&my.mc_mutex);
-	while(my.mc_new)
-		pthread_cond_wait(&my.mc_cond, &my.mc_mutex);
-	pthread_mutex_unlock(&my.mc_mutex);
-	THREAD_FINISH(thr);
+	rc = mdb_env_cwalk(&my, &root, 0);
+	if (rc == MDB_SUCCESS && root != new_root) {
+		rc = MDB_INCOMPATIBLE;	/* page leak or corrupt DB */
+	}
 
+finish:
+	if (rc)
+		my.mc_error = rc;
+	mdb_env_cthr_toggle(&my, 1 | MDB_EOF);
+	rc = THREAD_FINISH(thr);
 	mdb_txn_abort(txn);
+
+done:
 #ifdef _WIN32
-	CloseHandle(my.mc_cond);
-	CloseHandle(my.mc_mutex);
-	_aligned_free(my.mc_wbuf[0]);
+	if (my.mc_wbuf[0]) _aligned_free(my.mc_wbuf[0]);
+	if (my.mc_cond)  CloseHandle(my.mc_cond);
+	if (my.mc_mutex) CloseHandle(my.mc_mutex);
 #else
+	free(my.mc_wbuf[0]);
 	pthread_cond_destroy(&my.mc_cond);
+done2:
 	pthread_mutex_destroy(&my.mc_mutex);
-	free(my.mc_wbuf[0]);
 #endif
-	return rc;
+	return rc ? rc : my.mc_error;
 }
 
 	/** Copy environment as-is. */
@@ -9270,67 +9498,20 @@ mdb_env_copyfd(MDB_env *env, HANDLE fd)
 int ESECT
 mdb_env_copy2(MDB_env *env, const char *path, unsigned int flags)
 {
-	int rc, len;
-	char *lpath;
+	int rc;
+	MDB_name fname;
 	HANDLE newfd = INVALID_HANDLE_VALUE;
-#ifdef _WIN32
-	wchar_t *wpath;
-#endif
 
-	if (env->me_flags & MDB_NOSUBDIR) {
-		lpath = (char *)path;
-	} else {
-		len = strlen(path);
-		len += sizeof(DATANAME);
-		lpath = malloc(len);
-		if (!lpath)
-			return ENOMEM;
-		sprintf(lpath, "%s" DATANAME, path);
-	}
-
-	/* The destination path must exist, but the destination file must not.
-	 * We don't want the OS to cache the writes, since the source data is
-	 * already in the OS cache.
-	 */
-#ifdef _WIN32
-	rc = utf8_to_utf16(lpath, -1, &wpath, NULL);
-	if (rc)
-		goto leave;
-	newfd = CreateFileW(wpath, GENERIC_WRITE, 0, NULL, CREATE_NEW,
-				FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH, NULL);
-	free(wpath);
-#else
-	newfd = open(lpath, O_WRONLY|O_CREAT|O_EXCL, 0666);
-#endif
-	if (newfd == INVALID_HANDLE_VALUE) {
-		rc = ErrCode();
-		goto leave;
-	}
-
-	if (env->me_psize >= env->me_os_psize) {
-#ifdef O_DIRECT
-	/* Set O_DIRECT if the file system supports it */
-	if ((rc = fcntl(newfd, F_GETFL)) != -1)
-		(void) fcntl(newfd, F_SETFL, rc | O_DIRECT);
-#endif
-#ifdef F_NOCACHE	/* __APPLE__ */
-	rc = fcntl(newfd, F_NOCACHE, 1);
-	if (rc) {
-		rc = ErrCode();
-		goto leave;
-	}
-#endif
+	rc = mdb_fname_init(path, env->me_flags | MDB_NOLOCK, &fname);
+	if (rc == MDB_SUCCESS) {
+		rc = mdb_fopen(env, &fname, MDB_O_COPY, 0666, &newfd);
+		mdb_fname_destroy(fname);
 	}
-
-	rc = mdb_env_copyfd2(env, newfd, flags);
-
-leave:
-	if (!(env->me_flags & MDB_NOSUBDIR))
-		free(lpath);
-	if (newfd != INVALID_HANDLE_VALUE)
+	if (rc == MDB_SUCCESS) {
+		rc = mdb_env_copyfd2(env, newfd, flags);
 		if (close(newfd) < 0 && rc == MDB_SUCCESS)
 			rc = ErrCode();
-
+	}
 	return rc;
 }
 
@@ -9567,7 +9748,8 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
 		memset(&dummy, 0, sizeof(dummy));
 		dummy.md_root = P_INVALID;
 		dummy.md_flags = flags & PERSISTENT_FLAGS;
-		rc = mdb_cursor_put(&mc, &key, &data, F_SUBDATA);
+		WITH_CURSOR_TRACKING(mc,
+			rc = mdb_cursor_put(&mc, &key, &data, F_SUBDATA));
 		dbflag |= DB_DIRTY;
 	}
 
@@ -9659,8 +9841,11 @@ mdb_drop0(MDB_cursor *mc, int subs)
 
 		/* DUPSORT sub-DBs have no ovpages/DBs. Omit scanning leaves.
 		 * This also avoids any P_LEAF2 pages, which have no nodes.
+		 * Also if the DB doesn't have sub-DBs and has no overflow
+		 * pages, omit scanning leaves.
 		 */
-		if (mc->mc_flags & C_SUB)
+		if ((mc->mc_flags & C_SUB) ||
+			(!subs && !mc->mc_db->md_overflow_pages))
 			mdb_cursor_pop(mc);
 
 		mdb_cursor_copy(mc, &mx);
@@ -9674,7 +9859,7 @@ mdb_drop0(MDB_cursor *mc, int subs)
 						MDB_page *omp;
 						pgno_t pg;
 						memcpy(&pg, NODEDATA(ni), sizeof(pg));
-						rc = mdb_page_get(txn, pg, &omp, NULL);
+						rc = mdb_page_get(mc, pg, &omp, NULL);
 						if (rc != 0)
 							goto done;
 						mdb_cassert(mc, IS_OVERFLOW(omp));
@@ -9682,6 +9867,9 @@ mdb_drop0(MDB_cursor *mc, int subs)
 							pg, omp->mp_pages);
 						if (rc)
 							goto done;
+						mc->mc_db->md_overflow_pages -= omp->mp_pages;
+						if (!mc->mc_db->md_overflow_pages && !subs)
+							break;
 					} else if (subs && (ni->mn_flags & F_SUBDATA)) {
 						mdb_xcursor_init1(mc, ni);
 						rc = mdb_drop0(&mc->mc_xcursor->mx_cursor, 0);
@@ -9689,6 +9877,8 @@ mdb_drop0(MDB_cursor *mc, int subs)
 							goto done;
 					}
 				}
+				if (!subs && !mc->mc_db->md_overflow_pages)
+					goto pop;
 			} else {
 				if ((rc = mdb_midl_need(&txn->mt_free_pgs, n)) != 0)
 					goto done;
@@ -9710,6 +9900,7 @@ mdb_drop0(MDB_cursor *mc, int subs)
 				/* no more siblings, go back to beginning
 				 * of previous level.
 				 */
+pop:
 				mdb_cursor_pop(mc);
 				mc->mc_ki[0] = 0;
 				for (i=1; i<mc->mc_snum; i++) {
@@ -9911,7 +10102,7 @@ mdb_reader_check(MDB_env *env, int *dead)
 	return env->me_txns ? mdb_reader_check0(env, 0, dead) : MDB_SUCCESS;
 }
 
-/** As #mdb_reader_check(). rlocked = <caller locked the reader mutex>. */
+/** As #mdb_reader_check(). \b rlocked is set if caller locked #me_rmutex. */
 static int ESECT
 mdb_reader_check0(MDB_env *env, int rlocked, int *dead)
 {
@@ -10014,25 +10205,32 @@ mdb_mutex_failed(MDB_env *env, mdb_mutexref_t mutex, int rc)
 	return rc;
 }
 #endif	/* MDB_ROBUST_SUPPORTED */
-/** @} */
 
 #if defined(_WIN32)
-static int utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize)
-{
-	int need;
-	wchar_t *result;
-	need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, NULL, 0);
-	if (need == 0xFFFD)
-		return EILSEQ;
-	if (need == 0)
-		return EINVAL;
-	result = malloc(sizeof(wchar_t) * need);
-	if (!result)
-		return ENOMEM;
-	MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need);
-	if (dstsize)
-		*dstsize = need;
-	*dst = result;
-	return 0;
+/** Convert \b src to new wchar_t[] string with room for \b xtra extra chars */
+static int ESECT
+utf8_to_utf16(const char *src, MDB_name *dst, int xtra)
+{
+	int rc, need = 0;
+	wchar_t *result = NULL;
+	for (;;) {					/* malloc result, then fill it in */
+		need = MultiByteToWideChar(CP_UTF8, 0, src, -1, result, need);
+		if (!need) {
+			rc = ErrCode();
+			free(result);
+			return rc;
+		}
+		if (!result) {
+			result = malloc(sizeof(wchar_t) * (need + xtra));
+			if (!result)
+				return ENOMEM;
+			continue;
+		}
+		dst->mn_alloced = 1;
+		dst->mn_len = need - 1;
+		dst->mn_val = result;
+		return MDB_SUCCESS;
+	}
 }
 #endif /* defined(_WIN32) */
+/** @} */
diff --git a/src/contrib/qp-trie/qp.c b/src/contrib/qp-trie/qp.c
new file mode 100644
index 0000000000000000000000000000000000000000..6f9b9dbb32812f136b066e76da51bbd28c53bbcb
--- /dev/null
+++ b/src/contrib/qp-trie/qp.c
@@ -0,0 +1,833 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+    The code originated from https://github.com/fanf2/qp/blob/master/qp.c
+    at revision 5f6d93753.
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "contrib/qp-trie/qp.h"
+#include "contrib/macros.h"
+#include "contrib/mempattern.h"
+#include "libknot/errcode.h"
+
+#if defined(__i386) || defined(__x86_64) || defined(_M_IX86) \
+	|| (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN) \
+		&& __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+
+	/*!
+	 * \brief Use a pointer alignment hack to save memory.
+	 *
+	 * When on, isbranch() relies on the fact that in leaf_t the first pointer
+	 * is aligned on multiple of 4 bytes and that the flags bitfield is
+	 * overlaid over the lowest two bits of that pointer.
+	 * Neither is really guaranteed by the C standards; the second part should
+	 * be OK with x86_64 ABI and most likely any other little-endian platform.
+	 * It would be possible to manipulate the right bits portably, but it would
+	 * complicate the code nontrivially. C++ doesn't even guarantee type-punning.
+	 * In debug mode we check this works OK when creating a new trie instance.
+	 */
+	#define FLAGS_HACK 1
+#else
+	#define FLAGS_HACK 0
+#endif
+
+typedef unsigned char byte;
+typedef unsigned int uint;
+typedef uint bitmap_t; /*! Bit-maps, using the range of 1<<0 to 1<<16 (inclusive). */
+
+typedef struct {
+	uint32_t len; // 32 bits are enough for key lengths; probably even 16 bits would be.
+	char chars[];
+} tkey_t;
+
+/*! \brief Leaf of trie. */
+typedef struct {
+	#if !FLAGS_HACK
+		byte flags;
+	#endif
+	tkey_t *key; /*!< The pointer must be aligned to 4-byte multiples! */
+	trie_val_t val;
+} leaf_t;
+
+/*! \brief A trie node is either leaf_t or branch_t. */
+typedef union node node_t;
+
+/*!
+ * \brief Branch node of trie.
+ *
+ * - The flags distinguish whether the node is a leaf_t (0), or a branch
+ *   testing the more-important nibble (1) or the less-important one (2).
+ * - It stores the index of the byte that the node tests.  The combined
+ *   value (index*4 + flags) increases in branch nodes as you go deeper
+ *   into the trie.  All the keys below a branch are identical up to the
+ *   nibble identified by the branch.  Indices have to be stored because
+ *   we skip any branch nodes that would have a single child.
+ *   (Consequently, the skipped parts of key have to be validated in a leaf.)
+ * - The bitmap indicates which subtries are present.  The present child nodes
+ *   are stored in the twigs array (with no holes between them).
+ * - To simplify storing keys that are prefixes of each other, the end-of-string
+ *   position is treated as another nibble value, ordered before all others.
+ *   That affects the bitmap and twigs fields.
+ *
+ * \note The branch nodes are never allocated individually, but they are
+ *   always part of either the root node or the twigs array of the parent.
+ */
+typedef struct {
+	#if FLAGS_HACK
+		uint32_t flags  : 2,
+		         bitmap : 17; /*!< The first bitmap bit is for end-of-string child. */
+	#else
+		byte flags;
+		uint32_t bitmap;
+	#endif
+	uint32_t index;
+	node_t *twigs;
+} branch_t;
+
+union node {
+	leaf_t leaf;
+	branch_t branch;
+};
+
+struct trie {
+	node_t root; // undefined when weight == 0, see empty_root()
+	size_t weight;
+	knot_mm_t mm;
+};
+
+/*! \brief Make the root node empty (debug-only). */
+static inline void empty_root(node_t *root) {
+#ifndef NDEBUG
+	*root = (node_t){ .branch = {
+		.flags = 3, // invalid value that fits
+		.bitmap = 0,
+		.index = -1,
+		.twigs = NULL
+	} };
+#endif
+}
+
+/*! \brief Check that unportable code works OK (debug-only). */
+static void assert_portability(void) {
+#if FLAGS_HACK
+	assert(((union node){ .leaf = {
+			.key = ((void *)NULL) + 1,
+			.val = NULL
+		} }).branch.flags == 1);
+#endif
+}
+
+/*! \brief Propagate error codes. */
+#define ERR_RETURN(x) \
+	do { \
+		int err_code_ = x; \
+		if (unlikely(err_code_ != KNOT_EOK)) \
+			return err_code_; \
+	} while (false)
+
+/*!
+ * \brief Count the number of set bits.
+ *
+ * \TODO This implementation may be relatively slow on some HW.
+ */
+static uint bitmap_weight(bitmap_t w)
+{
+	assert((w & ~((1 << 17) - 1)) == 0); // using the least-important 17 bits
+	return __builtin_popcount(w);
+}
+
+/*! \brief Test flags to determine type of this node. */
+static bool isbranch(const node_t *t)
+{
+	uint f = t->branch.flags;
+	assert(f <= 2);
+	return f != 0;
+}
+
+/*! \brief Make a bitmask for testing a branch bitmap. */
+static bitmap_t nibbit(byte k, uint flags)
+{
+	uint shift = (2 - flags) << 2;
+	uint nibble = (k >> shift) & 0xf;
+	return 1 << (nibble + 1/*because of prefix keys*/);
+}
+
+/*! \brief Extract a nibble from a key and turn it into a bitmask. */
+static bitmap_t twigbit(node_t *t, const char *key, uint32_t len)
+{
+	assert(isbranch(t));
+	uint i = t->branch.index;
+
+	if (i >= len)
+		return 1 << 0; // leaf position
+
+	return nibbit((byte)key[i], t->branch.flags);
+}
+
+/*! \brief Test if a branch node has a child indicated by a bitmask. */
+static bool hastwig(node_t *t, bitmap_t bit)
+{
+	assert(isbranch(t));
+	return t->branch.bitmap & bit;
+}
+
+/*! \brief Compute offset of an existing child in a branch node. */
+static uint twigoff(node_t *t, bitmap_t b)
+{
+	assert(isbranch(t));
+	return bitmap_weight(t->branch.bitmap & (b - 1));
+}
+
+/*! \brief Get pointer to a particular child of a branch node. */
+static node_t* twig(node_t *t, uint i)
+{
+	assert(isbranch(t));
+	return &t->branch.twigs[i];
+}
+
+/*!
+ * \brief For a branch nod, compute offset of a child and child count.
+ *
+ * Having this separate might be meaningful for performance optimization.
+ */
+#define TWIGOFFMAX(off, max, t, b) do {			\
+		off = twigoff(t, b);			\
+		max = bitmap_weight(t->branch.bitmap);	\
+	} while(0)
+
+/*! \brief Simple string comparator. */
+static int key_cmp(const char *k1, uint32_t k1_len, const char *k2, uint32_t k2_len)
+{
+	int ret = memcmp(k1, k2, MIN(k1_len, k2_len));
+	if (ret != 0) {
+		return ret;
+	}
+
+	/* Key string is equal, compare lengths. */
+	if (k1_len == k2_len) {
+		return 0;
+	} else if (k1_len < k2_len) {
+		return -1;
+	} else {
+		return 1;
+	}
+}
+
+trie_t* trie_create(knot_mm_t *mm)
+{
+	assert_portability();
+	trie_t *trie = mm_alloc(mm, sizeof(trie_t));
+	if (trie != NULL) {
+		empty_root(&trie->root);
+		trie->weight = 0;
+		if (mm != NULL)
+			trie->mm = *mm;
+		else
+			mm_ctx_init(&trie->mm);
+	}
+	return trie;
+}
+
+/*! \brief Free anything under the trie node, except for the passed pointer itself. */
+static void clear_trie(node_t *trie, knot_mm_t *mm)
+{
+	if (!isbranch(trie)) {
+		mm_free(mm, trie->leaf.key);
+	} else {
+		branch_t *b = &trie->branch;
+		int len = bitmap_weight(b->bitmap);
+		for (int i = 0; i < len; ++i)
+			clear_trie(b->twigs + i, mm);
+		mm_free(mm, b->twigs);
+	}
+}
+
+void trie_free(trie_t *tbl)
+{
+	if (tbl == NULL)
+		return;
+	if (tbl->weight)
+		clear_trie(&tbl->root, &tbl->mm);
+	mm_free(&tbl->mm, tbl);
+}
+
+void trie_clear(trie_t *tbl)
+{
+	assert(tbl);
+	if (!tbl->weight)
+		return;
+	clear_trie(&tbl->root, &tbl->mm);
+	empty_root(&tbl->root);
+	tbl->weight = 0;
+}
+
+size_t trie_weight(const trie_t *tbl)
+{
+	assert(tbl);
+	return tbl->weight;
+}
+
+trie_val_t* trie_get_try(trie_t *tbl, const char *key, uint32_t len)
+{
+	assert(tbl);
+	if (!tbl->weight)
+		return NULL;
+	node_t *t = &tbl->root;
+	while (isbranch(t)) {
+		__builtin_prefetch(t->branch.twigs);
+		bitmap_t b = twigbit(t, key, len);
+		if (!hastwig(t, b))
+			return NULL;
+		t = twig(t, twigoff(t, b));
+	}
+	if (key_cmp(key, len, t->leaf.key->chars, t->leaf.key->len) != 0)
+		return NULL;
+	return &t->leaf.val;
+}
+
+int trie_del(trie_t *tbl, const char *key, uint32_t len, trie_val_t *val)
+{
+	assert(tbl);
+	if (!tbl->weight)
+		return KNOT_ENOENT;
+	node_t *t = &tbl->root; // current and parent node
+	branch_t *p = NULL;
+	bitmap_t b = 0;
+	while (isbranch(t)) {
+		__builtin_prefetch(t->branch.twigs);
+		b = twigbit(t, key, len);
+		if (!hastwig(t, b))
+			return KNOT_ENOENT;
+		p = &t->branch;
+		t = twig(t, twigoff(t, b));
+	}
+	if (key_cmp(key, len, t->leaf.key->chars, t->leaf.key->len) != 0)
+		return KNOT_ENOENT;
+	mm_free(&tbl->mm, t->leaf.key);
+	if (val != NULL)
+		*val = t->leaf.val; // we return trie_val_t directly when deleting
+	--tbl->weight;
+	if (unlikely(!p)) { // whole trie was a single leaf
+		assert(tbl->weight == 0);
+		empty_root(&tbl->root);
+		return KNOT_EOK;
+	}
+	// remove leaf t as child of p
+	int ci = t - p->twigs, // child index via pointer arithmetic
+	    cc = bitmap_weight(p->bitmap); // child count
+	assert(ci >= 0 && ci < cc);
+
+	if (cc == 2) { // collapse binary node p: move the other child to this node
+		node_t *twigs = p->twigs;
+		(*(node_t *)p) = twigs[1 - ci]; // it might be a leaf or branch
+		mm_free(&tbl->mm, twigs);
+		return KNOT_EOK;
+	}
+	memmove(p->twigs + ci, p->twigs + ci + 1, sizeof(node_t) * (cc - ci - 1));
+	p->bitmap &= ~b;
+	node_t *twigs = mm_realloc(&tbl->mm, p->twigs, sizeof(node_t) * (cc - 1),
+	                           sizeof(node_t) * cc);
+	if (likely(twigs != NULL))
+		p->twigs = twigs;
+		/* We can ignore mm_realloc failure, only beware that next time
+		 * the prev_size passed to it wouldn't be correct; TODO? */
+	return KNOT_EOK;
+}
+
+/*!
+ * \brief Stack of nodes, storing a path down a trie.
+ *
+ * The structure also serves directly as the public trie_it_t type,
+ * in which case it always points to the current leaf, unless we've finished
+ * (i.e. it->len == 0).
+ */
+typedef struct trie_it {
+	node_t* *stack; /*!< The stack; malloc is used directly instead of mm. */
+	uint32_t len;   /*!< Current length of the stack. */
+	uint32_t alen;  /*!< Allocated/available length of the stack. */
+	/*! \brief Initial storage for \a stack; it should fit in most use cases. */
+	node_t* stack_init[2000 / sizeof(node_t *)];
+} nstack_t;
+
+/*! \brief Create a node stack containing just the root (or empty). */
+static void ns_init(nstack_t *ns, trie_t *tbl)
+{
+	assert(tbl);
+	ns->stack = ns->stack_init;
+	ns->alen = sizeof(ns->stack_init) / sizeof(ns->stack_init[0]);
+	if (tbl->weight) {
+		ns->len = 1;
+		ns->stack[0] = &tbl->root;
+	} else {
+		ns->len = 0;
+	}
+}
+
+/*! \brief Free inside of the stack, i.e. not the passed pointer itself. */
+static void ns_cleanup(nstack_t *ns)
+{
+	assert(ns && ns->stack);
+	if (likely(ns->stack == ns->stack_init))
+		return;
+	free(ns->stack);
+	#ifndef NDEBUG
+		ns->stack = NULL;
+		ns->alen = 0;
+	#endif
+}
+
+/*! \brief Allocate more space for the stack. */
+static int ns_longer_alloc(nstack_t *ns)
+{
+	ns->alen *= 2;
+	size_t new_size = sizeof(nstack_t) + ns->alen * sizeof(node_t *);
+	node_t **st;
+	if (ns->stack == ns->stack_init) {
+		st = malloc(new_size);
+		if (st != NULL)
+			memcpy(st, ns->stack, ns->len * sizeof(node_t *));
+	} else {
+		st = realloc(ns->stack, new_size);
+	}
+	if (st == NULL)
+		return KNOT_ENOMEM;
+	ns->stack = st;
+	return KNOT_EOK;
+}
+
+/*! \brief Ensure the node stack can be extended by one. */
+static inline int ns_longer(nstack_t *ns)
+{
+	// get a longer stack if needed
+	if (likely(ns->len < ns->alen))
+		return KNOT_EOK;
+	return ns_longer_alloc(ns); // hand-split the part suitable for inlining
+}
+
+/*!
+ * \brief Find the "branching point" as if searching for a key.
+ *
+ *  The whole path to the point is kept on the passed stack;
+ *  always at least the root will remain on the top of it.
+ *  Beware: the precise semantics of this function is rather tricky.
+ *  The top of the stack will contain: the corresponding leaf if exact match is found;
+ *  or the immediate node below a branching-point-on-edge or the branching-point itself.
+ *
+ *  \param info   Set position of the point of first mismatch (in index and flags).
+ *  \param first  Set the value of the first non-matching character (from trie),
+ *                optionally; end-of-string character has value -256 (that's why it's int).
+ *
+ *  \return KNOT_EOK or KNOT_ENOMEM.
+ */
+static int ns_find_branch(nstack_t *ns, const char *key, uint32_t len,
+                          branch_t *info, int *first)
+{
+	assert(ns && ns->len && info);
+	// First find some leaf with longest matching prefix.
+	while (isbranch(ns->stack[ns->len - 1])) {
+		ERR_RETURN(ns_longer(ns));
+		node_t *t = ns->stack[ns->len - 1];
+		__builtin_prefetch(t->branch.twigs);
+		bitmap_t b = twigbit(t, key, len);
+		// Even if our key is missing from this branch we need to
+		// keep iterating down to a leaf. It doesn't matter which
+		// twig we choose since the keys are all the same up to this
+		// index. Note that blindly using twigoff(t, b) can cause
+		// an out-of-bounds index if it equals twigmax(t).
+		uint i = hastwig(t, b) ? twigoff(t, b) : 0;
+		ns->stack[ns->len++] = twig(t, i);
+	}
+	tkey_t *lkey = ns->stack[ns->len-1]->leaf.key;
+	// Find index of the first char that differs.
+	uint32_t index = 0;
+	while (index < MIN(len,lkey->len)) {
+		if (key[index] != lkey->chars[index])
+			break;
+		else
+			++index;
+	}
+	info->index = index;
+	if (first)
+		*first = lkey->len > index ? lkey->chars[index] : -256;
+	// Find flags: which half-byte has matched.
+	uint flags;
+	if (index == len && len == lkey->len) { // found equivalent key
+		info->flags = flags = 0;
+		goto success;
+	}
+	if (likely(index < MIN(len,lkey->len))) {
+		byte k2 = (byte)lkey->chars[index];
+		byte k1 = (byte)key[index];
+		flags = ((k1 ^ k2) & 0xf0) ? 1 : 2;
+	} else { // one is prefix of another
+		flags = 1;
+	}
+	info->flags = flags;
+	// now go up the trie from the current leaf
+	branch_t *t;
+	do {
+		if (unlikely(ns->len == 1))
+			goto success; // only the root stays on the stack
+		t = (branch_t*)ns->stack[ns->len - 2];
+		if (t->index < index || (t->index == index && t->flags < flags))
+			goto success;
+		--ns->len;
+	} while (true);
+success:
+	#ifndef NDEBUG // invariants on successful return
+		assert(ns->len);
+		if (isbranch(ns->stack[ns->len - 1])) {
+			t = &ns->stack[ns->len - 1]->branch;
+			assert(t->index > index || (t->index == index && t->flags >= flags));
+		}
+		if (ns->len > 1) {
+			t = &ns->stack[ns->len - 2]->branch;
+			assert(t->index < index || (t->index == index
+			       && (t->flags < flags || (t->flags == 1 && flags == 0))));
+		}
+	#endif
+	return KNOT_EOK;
+}
+
+/*!
+ * \brief Advance the node stack to the last leaf in the subtree.
+ *
+ * \return KNOT_EOK or KNOT_ENOMEM.
+ */
+static int ns_last_leaf(nstack_t *ns)
+{
+	assert(ns);
+	do {
+		ERR_RETURN(ns_longer(ns));
+		node_t *t = ns->stack[ns->len - 1];
+		if (!isbranch(t))
+			return KNOT_EOK;
+		int lasti = bitmap_weight(t->branch.bitmap) - 1;
+		assert(lasti >= 0);
+		ns->stack[ns->len++] = twig(t, lasti);
+	} while (true);
+}
+
+/*!
+ * \brief Advance the node stack to the first leaf in the subtree.
+ *
+ * \return KNOT_EOK or KNOT_ENOMEM.
+ */
+static int ns_first_leaf(nstack_t *ns)
+{
+	assert(ns && ns->len);
+	do {
+		ERR_RETURN(ns_longer(ns));
+		node_t *t = ns->stack[ns->len - 1];
+		if (!isbranch(t))
+			return KNOT_EOK;
+		ns->stack[ns->len++] = twig(t, 0);
+	} while (true);
+}
+
+/*!
+ * \brief Advance the node stack to the leaf that is previous to the current node.
+ *
+ * \note Prefix leaf under the current node DOES count (if present; perhaps questionable).
+ * \return KNOT_EOK on success, KNOT_ENOENT on not-found, or possibly KNOT_ENOMEM.
+ */
+static int ns_prev_leaf(nstack_t *ns)
+{
+	assert(ns && ns->len > 0);
+
+	node_t *t = ns->stack[ns->len - 1];
+	if (hastwig(t, 1 << 0)) { // the prefix leaf
+		t = twig(t, 0);
+		ERR_RETURN(ns_longer(ns));
+		ns->stack[ns->len++] = t;
+		return KNOT_EOK;
+	}
+
+	do {
+		if (ns->len < 2)
+			return KNOT_ENOENT; // root without empty key has no previous leaf
+		t = ns->stack[ns->len - 1];
+		node_t *p = ns->stack[ns->len - 2];
+		int pindex = t - p->branch.twigs; // index in parent via pointer arithmetic
+		assert(pindex >= 0 && pindex <= 16);
+		if (pindex > 0) { // t isn't the first child -> go down the previous one
+			ns->stack[ns->len - 1] = twig(p, pindex - 1);
+			return ns_last_leaf(ns);
+		}
+		// we've got to go up again
+		--ns->len;
+	} while (true);
+}
+
+/*!
+ * \brief Advance the node stack to the leaf that is successor to the current node.
+ *
+ * \note Prefix leaf or anything else under the current node DOES count.
+ * \return KNOT_EOK on success, KNOT_ENOENT on not-found, or possibly KNOT_ENOMEM.
+ */
+static int ns_next_leaf(nstack_t *ns)
+{
+	assert(ns && ns->len > 0);
+
+	node_t *t = ns->stack[ns->len - 1];
+	if (isbranch(t))
+		return ns_first_leaf(ns);
+	do {
+		if (ns->len < 2)
+			return KNOT_ENOENT; // not found, as no more parent is available
+		t = ns->stack[ns->len - 1];
+		node_t *p = ns->stack[ns->len - 2];
+		int pindex = t - p->branch.twigs; // index in parent via pointer arithmetic
+		assert(pindex >= 0 && pindex <= 16);
+		int pcount = bitmap_weight(p->branch.bitmap);
+		if (pindex + 1 < pcount) { // t isn't the last child -> go down the next one
+			ns->stack[ns->len - 1] = twig(p, pindex + 1);
+			return ns_first_leaf(ns);
+		}
+		// we've got to go up again
+		--ns->len;
+	} while (true);
+}
+
+int trie_get_leq(trie_t *tbl, const char *key, uint32_t len, trie_val_t **val)
+{
+	assert(tbl && val);
+	*val = NULL; // so on failure we can just return;
+	if (tbl->weight == 0)
+		return KNOT_ENOENT;
+	{ // Intentionally un-indented; until end of function, to bound cleanup attr.
+	// First find a key with longest-matching prefix
+	__attribute__((cleanup(ns_cleanup)))
+		nstack_t ns_local;
+	ns_init(&ns_local, tbl);
+	nstack_t *ns = &ns_local;
+	branch_t bp;
+	int un_leaf; // first unmatched character in the leaf
+	ERR_RETURN(ns_find_branch(ns, key, len, &bp, &un_leaf));
+	int un_key = bp.index < len ? key[bp.index] : -256;
+	node_t *t = ns->stack[ns->len - 1];
+	if (bp.flags == 0) { // found exact match
+		*val = &t->leaf.val;
+		return KNOT_EOK;
+	}
+	// Get t: the last node on matching path
+	if (isbranch(t) && t->branch.index == bp.index && t->branch.flags == bp.flags) {
+		// t is OK
+	} else {
+		// the top of the stack was the first unmatched node -> step up
+		if (ns->len == 1) {
+			// root was unmatched already
+			if (un_key < un_leaf)
+				return KNOT_ENOENT;
+			ERR_RETURN(ns_last_leaf(ns));
+			goto success;
+		}
+		--ns->len;
+		t = ns->stack[ns->len - 1];
+	}
+	// Now we re-do the first "non-matching" step in the trie
+	// but try the previous child if key was less (it may not exist)
+	bitmap_t b = twigbit(t, key, len);
+	int i = hastwig(t, b)
+		? twigoff(t, b) - (un_key < un_leaf)
+		: twigoff(t, b) - 1 /*twigoff returns successor when !hastwig*/;
+	if (i >= 0) {
+		ERR_RETURN(ns_longer(ns));
+		ns->stack[ns->len++] = twig(t, i);
+		ERR_RETURN(ns_last_leaf(ns));
+	} else {
+		ERR_RETURN(ns_prev_leaf(ns));
+	}
+success:
+	assert(!isbranch(ns->stack[ns->len - 1]));
+	*val = &ns->stack[ns->len - 1]->leaf.val;
+	return 1;
+	}
+}
+
+/*! \brief Initialize a new leaf, copying the key, and returning failure code. */
+static int mk_leaf(node_t *leaf, const char *key, uint32_t len, knot_mm_t *mm)
+{
+	tkey_t *k = mm_alloc(mm, sizeof(tkey_t) + len);
+	#if FLAGS_HACK
+		assert(((uintptr_t)k) % 4 == 0); // we need an aligned pointer
+	#endif
+	if (unlikely(!k))
+		return KNOT_ENOMEM;
+	k->len = len;
+	memcpy(k->chars, key, len);
+	leaf->leaf = (leaf_t){
+		#if !FLAGS_HACK
+			.flags = 0,
+		#endif
+		.val = NULL,
+		.key = k
+	};
+	return KNOT_EOK;
+}
+
+trie_val_t* trie_get_ins(trie_t *tbl, const char *key, uint32_t len)
+{
+	assert(tbl);
+	// First leaf in an empty tbl?
+	if (unlikely(!tbl->weight)) {
+		if (unlikely(mk_leaf(&tbl->root, key, len, &tbl->mm)))
+			return NULL;
+		++tbl->weight;
+		return &tbl->root.leaf.val;
+	}
+	{ // Intentionally un-indented; until end of function, to bound cleanup attr.
+	// Find the branching-point
+	__attribute__((cleanup(ns_cleanup)))
+		nstack_t ns_local;
+	ns_init(&ns_local, tbl);
+	nstack_t *ns = &ns_local;
+	branch_t bp; // branch-point: index and flags signifying the longest common prefix
+	int k2; // the first unmatched character in the leaf
+	if (unlikely(ns_find_branch(ns, key, len, &bp, &k2)))
+		return NULL;
+	node_t *t = ns->stack[ns->len - 1];
+	if (bp.flags == 0) // the same key was already present
+		return &t->leaf.val;
+	node_t leaf;
+	if (unlikely(mk_leaf(&leaf, key, len, &tbl->mm)))
+		return NULL;
+
+	if (isbranch(t) && bp.index == t->branch.index && bp.flags == t->branch.flags) {
+		// The node t needs a new leaf child.
+		bitmap_t b1 = twigbit(t, key, len);
+		assert(!hastwig(t, b1));
+		uint s, m; TWIGOFFMAX(s, m, t, b1); // new child position and original child count
+		node_t *twigs = mm_realloc(&tbl->mm, t->branch.twigs,
+				sizeof(node_t) * (m + 1), sizeof(node_t) * m);
+		if (unlikely(!twigs))
+			goto err_leaf;
+		memmove(twigs + s + 1, twigs + s, sizeof(node_t) * (m - s));
+		twigs[s] = leaf;
+		t->branch.twigs = twigs;
+		t->branch.bitmap |= b1;
+		++tbl->weight;
+		return &twigs[s].leaf.val;
+	} else {
+		// We need to insert a new binary branch with leaf at *t.
+		// Note: it works the same for the case where we insert above root t.
+		#ifndef NDEBUG
+			if (ns->len > 1) {
+				node_t *pt = ns->stack[ns->len - 2];
+				assert(hastwig(pt, twigbit(pt, key, len)));
+			}
+		#endif
+		node_t *twigs = mm_alloc(&tbl->mm, sizeof(node_t) * 2);
+		if (unlikely(!twigs))
+			goto err_leaf;
+		node_t t2 = *t; // Save before overwriting t.
+		t->branch.flags = bp.flags;
+		t->branch.index = bp.index;
+		t->branch.twigs = twigs;
+		bitmap_t b1 = twigbit(t, key, len);
+		bitmap_t b2 = unlikely(k2 == -256) ? (1 << 0) : nibbit(k2, bp.flags);
+		t->branch.bitmap = b1 | b2;
+		*twig(t, twigoff(t, b1)) = leaf;
+		*twig(t, twigoff(t, b2)) = t2;
+		++tbl->weight;
+		return &twig(t, twigoff(t, b1))->leaf.val;
+	};
+err_leaf:
+	mm_free(&tbl->mm, leaf.leaf.key);
+	return NULL;
+	}
+}
+
+/*! \brief Apply a function to every trie_val_t*, in order; a recursive solution. */
+static int apply_trie(node_t *t, int (*f)(trie_val_t *, void *), void *d)
+{
+	assert(t);
+	if (!isbranch(t))
+		return f(&t->leaf.val, d);
+	int child_count = bitmap_weight(t->branch.bitmap);
+	for (int i = 0; i < child_count; ++i)
+		ERR_RETURN(apply_trie(twig(t, i), f, d));
+	return KNOT_EOK;
+}
+
+int trie_apply(trie_t *tbl, int (*f)(trie_val_t *, void *), void *d)
+{
+	assert(tbl && f);
+	if (!tbl->weight)
+		return KNOT_EOK;
+	return apply_trie(&tbl->root, f, d);
+}
+
+/* These are all thin wrappers around static Tns* functions. */
+trie_it_t* trie_it_begin(trie_t *tbl)
+{
+	assert(tbl);
+	trie_it_t *it = malloc(sizeof(nstack_t));
+	if (!it)
+		return NULL;
+	ns_init(it, tbl);
+	if (it->len == 0) // empty tbl
+		return it;
+	if (ns_first_leaf(it)) {
+		ns_cleanup(it);
+		free(it);
+		return NULL;
+	}
+	return it;
+}
+
+void trie_it_next(trie_it_t *it)
+{
+	assert(it && it->len);
+	if (ns_next_leaf(it) != KNOT_EOK)
+		it->len = 0;
+}
+
+bool trie_it_finished(trie_it_t *it)
+{
+	assert(it);
+	return it->len == 0;
+}
+
+void trie_it_free(trie_it_t *it)
+{
+	if (!it)
+		return;
+	ns_cleanup(it);
+	free(it);
+}
+
+const char* trie_it_key(trie_it_t *it, size_t *len)
+{
+	assert(it && it->len);
+	node_t *t = it->stack[it->len - 1];
+	assert(!isbranch(t));
+	tkey_t *key = t->leaf.key;
+	if (len)
+		*len = key->len;
+	return key->chars;
+}
+
+trie_val_t* trie_it_val(trie_it_t *it)
+{
+	assert(it && it->len);
+	node_t *t = it->stack[it->len - 1];
+	assert(!isbranch(t));
+	return &t->leaf.val;
+}
diff --git a/src/contrib/qp-trie/qp.h b/src/contrib/qp-trie/qp.h
new file mode 100644
index 0000000000000000000000000000000000000000..df208e4dcc27ced2eac470c523d6a4bae8576fef
--- /dev/null
+++ b/src/contrib/qp-trie/qp.h
@@ -0,0 +1,109 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "libknot/mm_ctx.h"
+
+/*!
+ * \file \brief Native API of QP-tries:
+ *
+ * - keys are char strings, not necessarily zero-terminated,
+ *   the structure copies the contents of the passed keys
+ * - values are void* pointers, typically you get an ephemeral pointer to it
+ * - key lengths are limited by 2^32-1 ATM
+ */
+
+/*! \brief Element value. */
+typedef void* trie_val_t;
+
+/*! \brief Opaque structure holding a QP-trie. */
+typedef struct trie trie_t;
+
+/*! \brief Opaque type for holding a QP-trie iterator. */
+typedef struct trie_it trie_it_t;
+
+/*! \brief Create a trie instance. */
+trie_t* trie_create(knot_mm_t *mm);
+
+/*! \brief Free a trie instance. */
+void trie_free(trie_t *tbl);
+
+/*! \brief Clear a trie instance (make it empty). */
+void trie_clear(trie_t *tbl);
+
+/*! \brief Return the number of keys in the trie. */
+size_t trie_weight(const trie_t *tbl);
+
+/*! \brief Search the trie, returning NULL on failure. */
+trie_val_t* trie_get_try(trie_t *tbl, const char *key, uint32_t len);
+
+/*! \brief Search the trie, inserting NULL trie_val_t on failure. */
+trie_val_t* trie_get_ins(trie_t *tbl, const char *key, uint32_t len);
+
+/*!
+ * \brief Search for less-or-equal element.
+ *
+ * \param val must be valid; it will be set to NULL if not found or errored.
+ * \return KNOT_EOK for exact match, 1 for previous, KNOT_ENOENT for not-found,
+ *         or KNOT_E*.
+ */
+int trie_get_leq(trie_t *tbl, const char *key, uint32_t len, trie_val_t **val);
+
+/*!
+ * \brief Apply a function to every trie_val_t, in order.
+ *
+ * \return KNOT_EOK if success or KNOT_E* if error.
+ */
+int trie_apply(trie_t *tbl, int (*f)(trie_val_t *, void *), void *d);
+
+/*!
+ * \brief Remove an item, returning KNOT_EOK if succeeded or KNOT_ENOENT if not found.
+ *
+ * If val!=NULL and deletion succeeded, the deleted value is set.
+ */
+int trie_del(trie_t *tbl, const char *key, uint32_t len, trie_val_t *val);
+
+/*! \brief Create a new iterator pointing to the first element (if any). */
+trie_it_t* trie_it_begin(trie_t *tbl);
+
+/*!
+ * \brief Advance the iterator to the next element.
+ *
+ * Iteration is in ascending lexicographical order.
+ * In particular, the empty string would be considered as the very first.
+ */
+void trie_it_next(trie_it_t *it);
+
+/*! \brief Test if the iterator has gone past the last element. */
+bool trie_it_finished(trie_it_t *it);
+
+/*! \brief Free any resources of the iterator. It's OK to call it on NULL. */
+void trie_it_free(trie_it_t *it);
+
+/*!
+ * \brief Return pointer to the key of the current element.
+ *
+ * \note The len is uint32_t internally but size_t is better for our usage
+ *       as it is without an additional type conversion.
+ */
+const char* trie_it_key(trie_it_t *it, size_t *len);
+
+/*! \brief Return pointer to the value of the current element (writable). */
+trie_val_t* trie_it_val(trie_it_t *it);
diff --git a/src/contrib/sockaddr.h b/src/contrib/sockaddr.h
index a58d7d4c0ea02a6998a1da6b88a6b023184bbfcf..533d3d001233f32f5f50682d75adcbf879424f6c 100644
--- a/src/contrib/sockaddr.h
+++ b/src/contrib/sockaddr.h
@@ -18,7 +18,7 @@
 
 /* BSD IPv6 */
 #ifndef __POSIX_VISIBLE
-#define __POSIX_VISIBLE = 200112
+#define __POSIX_VISIBLE 200112
 #endif
 
 #include <stdbool.h>
diff --git a/src/contrib/wire.h b/src/contrib/wire.h
index 333e117ff8cf6c9177852e7b664f849dd6af5223..b70dcc01036a3d6b14017b82109234a0b0864bf6 100644
--- a/src/contrib/wire.h
+++ b/src/contrib/wire.h
@@ -38,7 +38,9 @@
  */
 inline static uint16_t wire_read_u16(const uint8_t *pos)
 {
-	return be16toh(*(uint16_t *)pos);
+	uint16_t result;
+	memcpy(&result, pos, sizeof(result));
+	return be16toh(result);
 }
 
 /*!
@@ -50,7 +52,9 @@ inline static uint16_t wire_read_u16(const uint8_t *pos)
  */
 inline static uint32_t wire_read_u32(const uint8_t *pos)
 {
-	return be32toh(*(uint32_t *)pos);
+	uint32_t result;
+	memcpy(&result, pos, sizeof(result));
+	return be32toh(result);
 }
 
 /*!
@@ -76,7 +80,9 @@ inline static uint64_t wire_read_u48(const uint8_t *pos)
  */
 inline static uint64_t wire_read_u64(const uint8_t *pos)
 {
-	return be64toh(*(uint64_t *)pos);
+	uint64_t result;
+	memcpy(&result, pos, sizeof(result));
+	return be64toh(result);
 }
 
 /*!
@@ -89,7 +95,8 @@ inline static uint64_t wire_read_u64(const uint8_t *pos)
  */
 inline static void wire_write_u16(uint8_t *pos, uint16_t data)
 {
-	*(uint16_t *)pos = htobe16(data);
+	uint16_t beval = htobe16(data);
+	memcpy(pos, &beval, sizeof(beval));
 }
 
 /*!
@@ -102,7 +109,8 @@ inline static void wire_write_u16(uint8_t *pos, uint16_t data)
  */
 inline static void wire_write_u32(uint8_t *pos, uint32_t data)
 {
-	*(uint32_t *)pos = htobe32(data);
+	uint32_t beval = htobe32(data);
+	memcpy(pos, &beval, sizeof(beval));
 }
 
 /*!
@@ -129,7 +137,8 @@ inline static void wire_write_u48(uint8_t *pos, uint64_t data)
  */
 inline static void wire_write_u64(uint8_t *pos, uint64_t data)
 {
-	*(uint64_t *)pos = htobe64(data);
+	uint64_t beval = htobe64(data);
+	memcpy(pos, &beval, sizeof(beval));
 }
 
 /*! @} */
diff --git a/src/contrib/wire_ctx.h b/src/contrib/wire_ctx.h
index a416400bc2b317c13163689594da926e7cf765dc..d8df799ef724d9e32e4e948d406411ad0cbc0dd3 100644
--- a/src/contrib/wire_ctx.h
+++ b/src/contrib/wire_ctx.h
@@ -187,222 +187,131 @@ static inline int wire_ctx_can_write(wire_ctx_t *ctx, size_t size)
 	return KNOT_EOK;
 }
 
-static inline uint8_t wire_ctx_read_u8(wire_ctx_t *ctx)
+
+static inline void wire_ctx_read(wire_ctx_t *ctx, void *data, size_t size)
 {
 	assert(ctx);
+	assert(data);
 
 	if (ctx->error != KNOT_EOK) {
-		return 0;
+		/* Avoid leaving data uninitialized. */
+		memset(data, 0, size);
+		return;
 	}
 
-	int ret = wire_ctx_can_read(ctx, sizeof(uint8_t));
+	int ret = wire_ctx_can_read(ctx, size);
 	if (ret != KNOT_EOK) {
 		ctx->error = ret;
-		return 0;
+		memset(data, 0, size);
+		return;
 	}
 
-	uint8_t result = *ctx->position;
-	ctx->position += sizeof(uint8_t);
+	memcpy(data, ctx->position, size);
+	ctx->position += size;
+}
+
+static inline uint8_t wire_ctx_read_u8(wire_ctx_t *ctx)
+{
+	uint8_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return result;
 }
 
 static inline uint16_t wire_ctx_read_u16(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, sizeof(uint16_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
-	uint16_t result = *((uint16_t *)ctx->position);
-	ctx->position += sizeof(uint16_t);
+	uint16_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return be16toh(result);
 }
 
 static inline uint32_t wire_ctx_read_u32(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, sizeof(uint32_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
-	uint32_t result = *((uint32_t *)ctx->position);
-	ctx->position += sizeof(uint32_t);
+	uint32_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return be32toh(result);
 }
 
 static inline uint64_t wire_ctx_read_u48(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, 6);
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
+	/* This case is slightly tricky. */
 	uint64_t result = 0;
-	memcpy((uint8_t *)&result + 1, ctx->position, 6);
-	ctx->position += 6;
+	wire_ctx_read(ctx, (uint8_t *)&result + 1, 6);
 
 	return be64toh(result) >> 8;
 }
 
 static inline uint64_t wire_ctx_read_u64(wire_ctx_t *ctx)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return 0;
-	}
-
-	int ret = wire_ctx_can_read(ctx, sizeof(uint64_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return 0;
-	}
-
-	uint64_t result = *((uint64_t *)ctx->position);
-	ctx->position += sizeof(uint64_t);
+	uint64_t result;
+	wire_ctx_read(ctx, &result, sizeof(result));
 
 	return be64toh(result);
 }
 
-static inline void wire_ctx_read(wire_ctx_t *ctx, uint8_t *data, size_t size)
+
+static inline void wire_ctx_write(wire_ctx_t *ctx, const void *data, size_t size)
 {
 	assert(ctx);
-	assert(data);
 
 	if (ctx->error != KNOT_EOK) {
 		return;
 	}
 
-	int ret = wire_ctx_can_read(ctx, size);
+	if (size == 0) {
+		return;
+	}
+
+	assert(data);
+
+	int ret = wire_ctx_can_write(ctx, size);
 	if (ret != KNOT_EOK) {
 		ctx->error = ret;
 		return;
 	}
 
-	memcpy(data, ctx->position, size);
+	memcpy(ctx->position, data, size);
 	ctx->position += size;
 }
 
 static inline void wire_ctx_write_u8(wire_ctx_t *ctx, uint8_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint8_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*ctx->position = value;
-	ctx->position += sizeof(uint8_t);
+	wire_ctx_write(ctx, &value, sizeof(value));
 }
 
 static inline void wire_ctx_write_u16(wire_ctx_t *ctx, uint16_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint16_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*((uint16_t *)ctx->position) = htobe16(value);
-	ctx->position += sizeof(uint16_t);
+	uint16_t beval = htobe16(value);
+	wire_ctx_write(ctx, &beval, sizeof(beval));
 }
 
 static inline void wire_ctx_write_u32(wire_ctx_t *ctx, uint32_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint32_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*((uint32_t *)ctx->position) = htobe32(value);
-	ctx->position += sizeof(uint32_t);
+	uint32_t beval = htobe32(value);
+	wire_ctx_write(ctx, &beval, sizeof(beval));
 }
 
 static inline void wire_ctx_write_u48(wire_ctx_t *ctx, uint64_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, 6);
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
+	/* This case is slightly tricky. */
 	uint64_t swapped = htobe64(value << 8);
-	memcpy(ctx->position, (uint8_t *)&swapped + 1, 6);
-	ctx->position += 6;
+	wire_ctx_write(ctx, (uint8_t *)&swapped + 1, 6);
 }
 
 static inline void wire_ctx_write_u64(wire_ctx_t *ctx, uint64_t value)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, sizeof(uint64_t));
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	*((uint64_t *)ctx->position) = htobe64(value);
-	ctx->position += sizeof(uint64_t);
+	uint64_t beval = htobe64(value);
+	wire_ctx_write(ctx, &beval, sizeof(beval));
 }
 
-static inline void wire_ctx_write(wire_ctx_t *ctx, const uint8_t *data, size_t size)
+
+static inline void wire_ctx_memset(wire_ctx_t *dst, int value, size_t size)
 {
-	assert(ctx);
+	assert(dst);
 
-	if (ctx->error != KNOT_EOK) {
+	if (dst->error != KNOT_EOK) {
 		return;
 	}
 
@@ -410,34 +319,19 @@ static inline void wire_ctx_write(wire_ctx_t *ctx, const uint8_t *data, size_t s
 		return;
 	}
 
-	assert(data);
-
-	int ret = wire_ctx_can_write(ctx, size);
+	int ret = wire_ctx_can_write(dst, size);
 	if (ret != KNOT_EOK) {
-		ctx->error = ret;
+		dst->error = ret;
 		return;
 	}
 
-	memcpy(ctx->position, data, size);
-	ctx->position += size;
+	memset(dst->position, value, size);
+	dst->position += size;
 }
 
 static inline void wire_ctx_clear(wire_ctx_t *ctx, size_t size)
 {
-	assert(ctx);
-
-	if (ctx->error != KNOT_EOK) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(ctx, size);
-	if (ret != KNOT_EOK) {
-		ctx->error = ret;
-		return;
-	}
-
-	memset(ctx->position, 0, size);
-	ctx->position += size;
+	wire_ctx_memset(ctx, 0, size);
 }
 
 static inline void wire_ctx_copy(wire_ctx_t *dst, wire_ctx_t *src, size_t size)
@@ -465,24 +359,3 @@ static inline void wire_ctx_copy(wire_ctx_t *dst, wire_ctx_t *src, size_t size)
 	src->position += size;
 }
 
-static inline void wire_ctx_memset(wire_ctx_t *dst, int value, size_t size)
-{
-	assert(dst);
-
-	if (dst->error != KNOT_EOK) {
-		return;
-	}
-
-	if (size == 0) {
-		return;
-	}
-
-	int ret = wire_ctx_can_write(dst, size);
-	if (ret != KNOT_EOK) {
-		dst->error = ret;
-		return;
-	}
-
-	memset(dst->position, value, size);
-	dst->position += size;
-}
diff --git a/src/dnssec/Makefile.am b/src/dnssec/Makefile.am
index 38fe0b83641b95769bce7f9405bd7eaf7bb754b9..13ac2c45e93ff3980e69fc112b65bd1bee1b398c 100644
--- a/src/dnssec/Makefile.am
+++ b/src/dnssec/Makefile.am
@@ -63,7 +63,9 @@ include_dnssec_HEADERS = \
 	lib/dnssec/kasp.h \
 	lib/dnssec/key.h \
 	lib/dnssec/keyid.h \
+	lib/dnssec/keystate.h \
 	lib/dnssec/keystore.h \
+	lib/dnssec/keyusage.h \
 	lib/dnssec/keytag.h \
 	lib/dnssec/list.h \
 	lib/dnssec/nsec.h \
@@ -82,7 +84,6 @@ libdnssec_la_SOURCES = \
 	lib/event/action/zsk_rollover.c \
 	lib/event/event.c \
 	lib/event/keystate.c \
-	lib/event/keystate.h \
 	lib/event/utils.c \
 	lib/event/utils.h \
 	lib/kasp/dir/dir.c \
@@ -124,6 +125,7 @@ libdnssec_la_SOURCES = \
 	lib/keystore/pkcs11.c \
 	lib/keystore/pkcs8.c \
 	lib/keystore/pkcs8_dir.c \
+	lib/keyusage/keyusage.c	 \
 	lib/list/list.c \
 	lib/list/ucw_clists.h \
 	lib/nsec/bitmap.c \
diff --git a/src/dnssec/doc/coding.md b/src/dnssec/doc/coding.md
index bc7240d7b6787b5247ecdc71eeb9be3275e4cc87..2d679b8a0570bd7dc92a660f44885cb712bc6beb 100644
--- a/src/dnssec/doc/coding.md
+++ b/src/dnssec/doc/coding.md
@@ -3,7 +3,7 @@
 ## Components Location
 
 - library: `lib` (public headers in `lib/dnssec`)
-- shared: `shared` (shared code for library and utilities, inaccesible from the library)
+- shared: `shared` (shared code for library and utilities, inaccessible from the library)
 - tests: `tests`
 - utilities: `utils`
 
diff --git a/src/dnssec/lib/dnssec/dnssec.h b/src/dnssec/lib/dnssec/dnssec.h
index 7bb37072d943ca2cb46d53488514b64b9fed78d8..6f8620a660311dcca1bfab1044a9438141b00a0e 100644
--- a/src/dnssec/lib/dnssec/dnssec.h
+++ b/src/dnssec/lib/dnssec/dnssec.h
@@ -109,8 +109,10 @@
 #include <dnssec/kasp.h>
 #include <dnssec/key.h>
 #include <dnssec/keyid.h>
+#include <dnssec/keystate.h>
 #include <dnssec/keystore.h>
 #include <dnssec/keytag.h>
+#include <dnssec/keyusage.h>
 #include <dnssec/list.h>
 #include <dnssec/nsec.h>
 #include <dnssec/random.h>
diff --git a/src/dnssec/lib/dnssec/kasp.h b/src/dnssec/lib/dnssec/kasp.h
index 51e09dcf39fa97973de1da298d63ff0f1edf537b..dd04d366fb8ddc6ed42cd8bc04c6d2af5383a33f 100644
--- a/src/dnssec/lib/dnssec/kasp.h
+++ b/src/dnssec/lib/dnssec/kasp.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -299,6 +299,7 @@ typedef struct dnssec_kasp_policy {
 	uint16_t zsk_size;
 	uint32_t dnskey_ttl;
 	uint32_t zsk_lifetime;
+	bool singe_type_signing;
 	// RRSIG
 	uint32_t rrsig_lifetime;
 	uint32_t rrsig_refresh_before;
diff --git a/src/dnssec/lib/dnssec/key.h b/src/dnssec/lib/dnssec/key.h
index 8403b699f66d172db525342b9222cbcc9ff954ae..6048bd4f0aa93311046eb74dbaed48ca976d9dac 100644
--- a/src/dnssec/lib/dnssec/key.h
+++ b/src/dnssec/lib/dnssec/key.h
@@ -92,6 +92,8 @@ typedef enum dnssec_key_algorithm {
 	DNSSEC_KEY_ALGORITHM_RSA_SHA512 = 10,
 	DNSSEC_KEY_ALGORITHM_ECDSA_P256_SHA256 = 13,
 	DNSSEC_KEY_ALGORITHM_ECDSA_P384_SHA384 = 14,
+	DNSSEC_KEY_ALGORITHM_ED25519 = 15,
+	DNSSEC_KEY_ALGORITHM_ED448 = 16,
 } dnssec_key_algorithm_t;
 
 struct dnssec_key;
diff --git a/src/dnssec/lib/event/keystate.h b/src/dnssec/lib/dnssec/keystate.h
similarity index 92%
rename from src/dnssec/lib/event/keystate.h
rename to src/dnssec/lib/dnssec/keystate.h
index 26f87cef9bf5b354e940e2d0e87e246dca573216..e843c37921e8b5fbcd525d24d27ed40249b34c4a 100644
--- a/src/dnssec/lib/event/keystate.h
+++ b/src/dnssec/lib/dnssec/keystate.h
@@ -30,4 +30,4 @@ enum key_state {
 
 typedef enum key_state key_state_t;
 
-key_state_t get_key_state(const dnssec_kasp_key_t *key, time_t moment);
+key_state_t dnssec_get_key_state(const dnssec_kasp_key_t *key, time_t moment);
diff --git a/src/dnssec/lib/dnssec/keystore.h b/src/dnssec/lib/dnssec/keystore.h
index 118af1200f5da3fd02663a2212cb1d4c380672b5..67240b23c3cde5d4cb1dcfaba392f858ef4ab242 100644
--- a/src/dnssec/lib/dnssec/keystore.h
+++ b/src/dnssec/lib/dnssec/keystore.h
@@ -27,7 +27,7 @@
  *
  * PKCS #8 uses unencrypted PEM, and allows implementation of custom stores.
  *
- * PKCS #11 allows to access Hardware Security Modules.
+ * PKCS #11 provides access Hardware Security Modules.
  *
  * Example of using default PKCS #8 and to generate an RSA key:
  *
diff --git a/src/dnssec/lib/dnssec/keyusage.h b/src/dnssec/lib/dnssec/keyusage.h
new file mode 100644
index 0000000000000000000000000000000000000000..be08ad71538494162296b52674a635538d4035ee
--- /dev/null
+++ b/src/dnssec/lib/dnssec/keyusage.h
@@ -0,0 +1,43 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+	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
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include <dnssec/list.h>
+#include "kasp.h"
+
+typedef struct record {
+	char *key_id;
+	dnssec_list_t *zones;
+} record_keyusage_t;
+
+typedef dnssec_list_t dnssec_keyusage_t;
+
+char *dnssec_keyusage_path(dnssec_kasp_t *kasp);
+
+int dnssec_keyusage_add(dnssec_keyusage_t *keyusage, const char *key_id, char *zone);
+
+int dnssec_keyusage_remove(dnssec_keyusage_t *keyusage, const char *key_id, char *zone);
+
+bool dnssec_keyusage_is_used(dnssec_keyusage_t *keyusage, const char *key_id);
+
+int dnssec_keyusage_load(dnssec_keyusage_t *keyusage, const char *filename);
+
+int dnssec_keyusage_save(dnssec_keyusage_t *keyusage, const char *filename);
+
+dnssec_keyusage_t *dnssec_keyusage_new(void);
+
+void dnssec_keyusage_free(dnssec_keyusage_t *keyusage);
diff --git a/src/dnssec/lib/error.c b/src/dnssec/lib/error.c
index 4a4cc0600833da668202dc8fae805cba8013335c..796e7f03d627aab78c4524daa78a29b275bc1e40 100644
--- a/src/dnssec/lib/error.c
+++ b/src/dnssec/lib/error.c
@@ -32,7 +32,7 @@ static const error_message_t ERROR_MESSAGES[] = {
 	{ DNSSEC_ENOENT,		"no such file or directory" },
 
 	{ DNSSEC_ERROR,			"unspecified error" },
-	{ DNSSEC_NOT_IMPLEMENTED_ERROR,	"not implemeted" },
+	{ DNSSEC_NOT_IMPLEMENTED_ERROR,	"not implemented" },
 	{ DNSSEC_MALFORMED_DATA,	"malformed data" },
 	{ DNSSEC_OUT_OF_RANGE,		"value out of range" },
 	{ DNSSEC_NOT_FOUND,		"not found" },
diff --git a/src/dnssec/lib/event/action/initial_key.c b/src/dnssec/lib/event/action/initial_key.c
index bbe7fcb4d17e43aee59f6e4134a0723a6baff8c4..74f9de9af32242cacf8d1ea89253c55f5341feee 100644
--- a/src/dnssec/lib/event/action/initial_key.c
+++ b/src/dnssec/lib/event/action/initial_key.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -22,6 +22,7 @@
 #include "shared.h"
 #include "event/action.h"
 #include "event/utils.h"
+#include "dnssec/keyusage.h"
 
 /*!
  * Scan zone keys and check if ZSK and KSK key exists.
@@ -58,6 +59,19 @@ static int generate_initial_key(dnssec_event_ctx_t *ctx, bool ksk)
 		return r;
 	}
 
+	if (!ksk) {
+		char *path = dnssec_keyusage_path(ctx->kasp);
+		if (path == NULL) {
+			return DNSSEC_ENOMEM;
+		}
+		dnssec_keyusage_t *keyusage = dnssec_keyusage_new();
+		dnssec_keyusage_load(keyusage, path);
+		dnssec_keyusage_add(keyusage, key->id, ctx->zone->name);
+		dnssec_keyusage_save(keyusage, path);
+		dnssec_keyusage_free(keyusage);
+		free(path);
+	}
+
 	key->timing.active  = ctx->now;
 	key->timing.publish = ctx->now;
 
@@ -77,7 +91,7 @@ static int plan(dnssec_event_ctx_t *ctx, dnssec_event_t *event)
 	bool has_ksk, has_zsk;
 	scan_keys(ctx->zone, &has_ksk, &has_zsk);
 
-	if (!has_ksk || !has_zsk) {
+	if (!has_zsk || (!ctx->policy->singe_type_signing && !has_ksk)) {
 		event->type = DNSSEC_EVENT_GENERATE_INITIAL_KEY;
 		event->time = ctx->now;
 	} else {
@@ -100,7 +114,7 @@ static int exec(dnssec_event_ctx_t *ctx, const dnssec_event_t *event)
 
 	int r = DNSSEC_EOK;
 
-	if (!has_ksk) {
+	if (!ctx->policy->singe_type_signing && !has_ksk) {
 		r = generate_initial_key(ctx, true);
 	}
 
diff --git a/src/dnssec/lib/event/action/nsec3_resalt.c b/src/dnssec/lib/event/action/nsec3_resalt.c
index 0c25f6bb3f7f4fec2b62a7ab29c1f394a09b11a4..cac05fcc6a996d34cfcaf057c41a49fd7b54e4e5 100644
--- a/src/dnssec/lib/event/action/nsec3_resalt.c
+++ b/src/dnssec/lib/event/action/nsec3_resalt.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
diff --git a/src/dnssec/lib/event/action/zsk_rollover.c b/src/dnssec/lib/event/action/zsk_rollover.c
index 416d52c04aba3c59206e8a641887a526d0c86d7e..5db4348dd9f00d4935af57caf8d9d6ef79ec672f 100644
--- a/src/dnssec/lib/event/action/zsk_rollover.c
+++ b/src/dnssec/lib/event/action/zsk_rollover.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -18,8 +18,9 @@
 
 #include "dnssec/error.h"
 #include "dnssec/event.h"
+#include "dnssec/keyusage.h"
 #include "event/action.h"
-#include "event/keystate.h"
+#include "dnssec/keystate.h"
 #include "event/utils.h"
 #include "key/internal.h"
 #include "shared.h"
@@ -45,7 +46,7 @@ static bool newer_key(const dnssec_kasp_key_t *prev, const dnssec_kasp_key_t *cu
 static bool zsk_match(const dnssec_kasp_key_t *key, time_t now, key_state_t state)
 {
 	return dnssec_key_get_flags(key->key) == DNSKEY_FLAGS_ZSK &&
-	       get_key_state(key, now) == state;
+	       dnssec_get_key_state(key, now) == state;
 }
 
 static dnssec_kasp_key_t *last_key(dnssec_event_ctx_t *ctx, key_state_t state)
@@ -87,6 +88,12 @@ static int plan(dnssec_event_ctx_t *ctx, dnssec_event_t *event)
 	assert(ctx);
 	assert(event);
 
+	// Not supported with Single-Type signing.
+	if (ctx->policy->singe_type_signing) {
+		event->type = DNSSEC_EVENT_NONE;
+		return DNSSEC_EOK;
+	}
+
 	/*
 	 * We should not start another rollover, if there is a rollover
 	 * in progress. Therefore we will check the keys in reverse order
@@ -169,6 +176,17 @@ static int exec_new_signatures(dnssec_event_ctx_t *ctx)
 	active->timing.retire = ctx->now;
 	rolling->timing.active = ctx->now;
 
+	char *path = dnssec_keyusage_path(ctx->kasp);
+	if (path == NULL) {
+		return DNSSEC_ENOMEM;
+	}
+	dnssec_keyusage_t *keyusage = dnssec_keyusage_new();
+	dnssec_keyusage_load(keyusage, path);
+	dnssec_keyusage_add(keyusage, rolling->id, ctx->zone->name);
+	dnssec_keyusage_save(keyusage, path);
+	dnssec_keyusage_free(keyusage);
+	free(path);
+
 	return dnssec_kasp_zone_save(ctx->kasp, ctx->zone);
 }
 
@@ -179,7 +197,32 @@ static int exec_remove_old_key(dnssec_event_ctx_t *ctx)
 		return DNSSEC_EINVAL;
 	}
 
+	char *path = dnssec_keyusage_path(ctx->kasp);
+	if (path == NULL) {
+		return DNSSEC_ENOMEM;
+	}
+	dnssec_keyusage_t *keyusage = dnssec_keyusage_new();
+	dnssec_keyusage_load(keyusage, path);
+	dnssec_keyusage_remove(keyusage, retired->id, ctx->zone->name);
+	dnssec_keyusage_save(keyusage, path);
+
 	retired->timing.remove = ctx->now;
+	dnssec_list_foreach(item, ctx->zone->keys) {
+		dnssec_kasp_key_t *key = dnssec_item_get(item);
+		if (key->id == retired->id) {
+			dnssec_list_remove(item);
+		}
+	}
+
+	if (dnssec_keyusage_is_used(keyusage, retired->id)) {
+		dnssec_keyusage_free(keyusage);
+		free(path);
+		return dnssec_kasp_zone_save(ctx->kasp, ctx->zone);
+	}
+	dnssec_keyusage_free(keyusage);
+	free(path);
+
+	dnssec_keystore_remove_key(ctx->keystore, retired->id);
 
 	return dnssec_kasp_zone_save(ctx->kasp, ctx->zone);
 }
diff --git a/src/dnssec/lib/event/keystate.c b/src/dnssec/lib/event/keystate.c
index 5f161d32d70f58b8c0ece61757a561ad34f7063d..409f756a77270c9fda0f4f125e1ddfaea2d5e75c 100644
--- a/src/dnssec/lib/event/keystate.c
+++ b/src/dnssec/lib/event/keystate.c
@@ -16,14 +16,19 @@
 
 #include <assert.h>
 #include <time.h>
+#include <string.h>
 
 #include "dnssec/kasp.h"
-#include "event/keystate.h"
+#include "dnssec/keystate.h"
+#include "shared.h"
 
-key_state_t get_key_state(const dnssec_kasp_key_t *key, time_t moment)
+_public_
+key_state_t dnssec_get_key_state(const dnssec_kasp_key_t *key, time_t moment)
 {
-	assert(key);
-	assert(time > 0);
+	if (!key || moment <= 0)
+	{
+		return DNSSEC_KEY_STATE_INVALID;
+	}
 
 	/*
 	 * The meaning of unset timing parameter is different for key
diff --git a/src/dnssec/lib/kasp/dir/dir.c b/src/dnssec/lib/kasp/dir/dir.c
index 4ebf5c94195fdce5ae74c78c31d066faec11b630..1e3e272de3a8249345fc2c9d94f18789beddf88b 100644
--- a/src/dnssec/lib/kasp/dir/dir.c
+++ b/src/dnssec/lib/kasp/dir/dir.c
@@ -101,17 +101,17 @@ static int entity_list(const char *entity, void *_ctx, dnssec_list_t *names)
 		return DNSSEC_NOT_FOUND;
 	}
 
-	int error;
-	struct dirent entry, *result;
-	while (error = readdir_r(dir, &entry, &result), error == 0 && result) {
-		char *zone = file_to_entity(entity, entry.d_name);
+	errno = 0;
+	struct dirent *result;
+	while ((result = readdir(dir)) != NULL) {
+		char *zone = file_to_entity(entity, result->d_name);
 		if (zone) {
 			dnssec_list_append(names, zone);
 		}
 	}
 
-	if (error != 0) {
-		return dnssec_errno_to_error(error);
+	if (errno != 0) {
+		return dnssec_errno_to_error(errno);
 	}
 
 	return DNSSEC_EOK;
diff --git a/src/dnssec/lib/kasp/dir/json.c b/src/dnssec/lib/kasp/dir/json.c
index a9f35c5c464dd6dfd34feddbc824c47519bb4394..3b2411a5e335ac4d100511e05ddd213ba2924c93 100644
--- a/src/dnssec/lib/kasp/dir/json.c
+++ b/src/dnssec/lib/kasp/dir/json.c
@@ -73,7 +73,7 @@ int encode_keyid(const void *value, json_t **result)
 }
 
 /*!
- * Decode bounded interger value from JSON.
+ * Decode bounded integer value from JSON.
  */
 static int decode_int(const json_int_t min, const json_int_t max,
 		      const json_t *value, json_int_t *result)
diff --git a/src/dnssec/lib/key/algorithm.c b/src/dnssec/lib/key/algorithm.c
index 0cfe9d54c6dbc728666abb4481d43d5e2f644356..e4d0894d71adc24ca03a5f60736f73ac96dba701 100644
--- a/src/dnssec/lib/key/algorithm.c
+++ b/src/dnssec/lib/key/algorithm.c
@@ -68,6 +68,18 @@ static const struct limits *get_limits(dnssec_key_algorithm_t algorithm)
 		.def = 384,
 	};
 
+	static const struct limits ED25519 = {
+		.min = 256,
+		.max = 256,
+		.def = 256,
+	};
+
+	static const struct limits ED448 = {
+		.min = 456,
+		.max = 456,
+		.def = 456,
+	};
+
 	switch (algorithm) {
 	case DNSSEC_KEY_ALGORITHM_DSA_SHA1:
 	case DNSSEC_KEY_ALGORITHM_DSA_SHA1_NSEC3:
@@ -82,6 +94,10 @@ static const struct limits *get_limits(dnssec_key_algorithm_t algorithm)
 		return &EC256;
 	case DNSSEC_KEY_ALGORITHM_ECDSA_P384_SHA384:
 		return &EC384;
+	case DNSSEC_KEY_ALGORITHM_ED25519:
+		return &ED25519;
+	case DNSSEC_KEY_ALGORITHM_ED448:
+		return &ED448;
 	default:
 		return NULL;
 	}
@@ -103,6 +119,8 @@ gnutls_pk_algorithm_t algorithm_to_gnutls(dnssec_key_algorithm_t dnssec)
 	case DNSSEC_KEY_ALGORITHM_ECDSA_P256_SHA256:
 	case DNSSEC_KEY_ALGORITHM_ECDSA_P384_SHA384:
 		return GNUTLS_PK_EC;
+	case DNSSEC_KEY_ALGORITHM_ED25519:
+	case DNSSEC_KEY_ALGORITHM_ED448:
 	default:
 		return GNUTLS_PK_UNKNOWN;
 	}
diff --git a/src/dnssec/lib/keystore/pkcs8_dir.c b/src/dnssec/lib/keystore/pkcs8_dir.c
index fe094201c05cca44a6bd273403a915bf18e1e811..f1b4d4ae79bbebb49a97b634e74aa0ad35aea57d 100644
--- a/src/dnssec/lib/keystore/pkcs8_dir.c
+++ b/src/dnssec/lib/keystore/pkcs8_dir.c
@@ -315,18 +315,18 @@ static int pkcs8_dir_list(void *_handle, dnssec_list_t **list_ptr)
 		return DNSSEC_ENOMEM;
 	}
 
-	int error;
-	struct dirent entry, *result;
-	while (error = readdir_r(dir, &entry, &result), error == 0 && result) {
-		char *keyid = filename_to_keyid(entry.d_name);
+	errno = 0;
+	struct dirent *result;
+	while ((result = readdir(dir)) != NULL) {
+		char *keyid = filename_to_keyid(result->d_name);
 		if (keyid) {
 			dnssec_list_append(list, keyid);
 		}
 	}
 
-	if (error != 0) {
+	if (errno != 0) {
 		dnssec_list_free_full(list, NULL, NULL);
-		return dnssec_errno_to_error(error);
+		return dnssec_errno_to_error(errno);
 	}
 
 	*list_ptr = list;
diff --git a/src/dnssec/lib/keyusage/keyusage.c b/src/dnssec/lib/keyusage/keyusage.c
new file mode 100644
index 0000000000000000000000000000000000000000..b5dfff773d6153dd5382cfd07c721548d35b8f51
--- /dev/null
+++ b/src/dnssec/lib/keyusage/keyusage.c
@@ -0,0 +1,326 @@
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <assert.h>
+#include <string.h>
+
+#include "dnssec.h"
+#include "error.h"
+#include "kasp/dir/json.h"
+#include "kasp/internal.h"
+#include "shared.h"
+
+char *dnssec_keyusage_path(dnssec_kasp_t *kasp)
+{
+	char *res;
+	if (asprintf(&res, "%s/keyusage.json", kasp->functions->base_path(kasp->ctx)) == -1) {
+		res = NULL;
+	}
+	return res;
+}
+
+int dnssec_keyusage_add(dnssec_keyusage_t *keyusage, const char *key_id, char *zone)
+{
+	char *lzone = strdup(zone);
+	dnssec_list_foreach(item, keyusage) {
+
+		record_keyusage_t *record = dnssec_item_get(item);
+		if (strcmp(record->key_id, key_id) == 0) {
+
+			if (!dnssec_list_contains(record->zones, lzone)) {
+				dnssec_list_append(record->zones, lzone);
+			}
+
+			return DNSSEC_EOK;
+		}
+	}
+
+	record_keyusage_t *record = malloc(sizeof(*record));
+	record->key_id = strdup(key_id);
+	record->zones = dnssec_list_new();
+
+	dnssec_list_append(record->zones, lzone);
+	dnssec_list_append(keyusage, record);
+
+	return DNSSEC_EOK;
+}
+
+int dnssec_keyusage_remove(dnssec_keyusage_t *keyusage, const char *key_id, char *zone)
+{
+	dnssec_list_foreach(item, keyusage) {
+		record_keyusage_t *record = dnssec_item_get(item);
+
+		if (strcmp(record->key_id, key_id) == 0) {
+			dnssec_list_foreach(item2, record->zones) {
+
+				char *tmp = dnssec_item_get(item2);
+
+				if (strcmp(tmp, zone) == 0) {
+
+					free(tmp);
+					dnssec_list_remove(item2);
+
+					if (dnssec_list_is_empty(record->zones)) {
+						free(record->key_id);
+						dnssec_list_free(record->zones);
+						free(record);
+						dnssec_list_remove(item);
+					}
+
+					return DNSSEC_EOK;
+				}
+			}
+		}
+	}
+
+	return DNSSEC_ENOENT;
+}
+
+bool dnssec_keyusage_is_used(dnssec_keyusage_t *keyusage, const char *key_id)
+{
+	if (dnssec_list_is_empty(keyusage)) {
+		return false;
+	}
+
+	dnssec_list_foreach(item, keyusage) {
+		record_keyusage_t *record = dnssec_item_get(item);
+
+		if (record == NULL || record->key_id == NULL) {
+			return false;
+		}
+
+		if (strcmp(record->key_id, key_id) == 0) {
+			return !dnssec_list_is_empty(record->zones);
+		}
+	}
+	return false;
+}
+
+static int import_keyusage(dnssec_keyusage_t *keyusage, const json_t *json)
+{
+	json_t *jrecord = NULL;
+	int a, b;
+
+	if (!json_is_array(json)) {
+		if (json_is_null(json)) {
+			return DNSSEC_EOK;
+		} else {
+			return DNSSEC_CONFIG_MALFORMED;
+		}
+	}
+
+	json_array_foreach(json, a, jrecord) {
+		json_t *jkey_id = NULL;
+		jkey_id = json_object_get(jrecord, "key_id");
+
+		record_keyusage_t *record = malloc(sizeof(*record));
+		if (record == NULL) {
+			return DNSSEC_ENOMEM;
+		}
+
+		int r = decode_string(jkey_id, &record->key_id);
+		if (r != DNSSEC_EOK) {
+			free(record);
+			return r;
+		}
+
+		json_t *jzones = NULL, *jzone = NULL;
+		jzones = json_object_get(jrecord, "zones");
+		record->zones = dnssec_list_new();
+
+		json_array_foreach(jzones, b, jzone) {
+			char *zone;
+			int r = decode_string(jzone, &zone);
+			if (r != DNSSEC_EOK) {
+				free(record);
+				return r;
+			}
+			dnssec_list_append(record->zones, zone);
+		}
+		dnssec_list_append(keyusage, record);
+	}
+
+	return DNSSEC_EOK;
+}
+
+static int export_keyusage(dnssec_keyusage_t *keyusage, json_t **json)
+{
+	assert(keyusage);
+	assert(json);
+	record_keyusage_t *record;
+	int r;
+
+	if (dnssec_list_is_empty(keyusage)) {
+		return DNSSEC_EOK;
+	}
+
+	json_t *jrecords = json_array();
+	if (!jrecords) {
+		return DNSSEC_ENOMEM;
+	}
+
+	json_t *jkey_id = NULL;
+	json_t *jzone = NULL;
+	json_t *jzones = NULL;
+
+	dnssec_list_foreach(item, keyusage) {
+		record = dnssec_item_get(item);
+
+		json_t *jzones = json_array();
+		if (!jzones) {
+			json_array_clear(jrecords);
+			return DNSSEC_ENOMEM;
+		}
+
+		r = encode_string(&record->key_id, &jkey_id);
+		if (r != DNSSEC_EOK) {
+			json_decref(jkey_id);
+			goto error;
+		}
+		dnssec_list_foreach(item, record->zones) {
+
+			const char *zone = dnssec_item_get(item);
+			r = encode_string(&zone, &jzone);
+
+			if (r != DNSSEC_EOK) {
+				json_decref(jzone);
+				goto error;
+			}
+
+			if (json_array_append_new(jzones, jzone)) {
+				r = DNSSEC_ENOMEM;
+				goto error;
+			}
+		}
+		json_t *jrecord = json_object();
+		if (!jrecord) {
+			r = DNSSEC_ENOMEM;
+			goto error;
+		}
+
+		if (json_object_set(jrecord, "key_id", jkey_id)) {
+			json_object_clear(jrecord);
+			r = DNSSEC_ENOMEM;
+			goto error;
+		}
+		json_decref(jkey_id);
+
+		if (json_object_set(jrecord, "zones", jzones)) {
+			json_object_clear(jrecord);
+			r = DNSSEC_ENOMEM;
+			goto error;
+		}
+		json_decref(jzones);
+
+		if (json_array_append_new(jrecords, jrecord)) {
+			json_object_clear(jrecord);
+			r = DNSSEC_ENOMEM;
+			goto error;
+		}
+	}
+	*json = jrecords;
+
+	return DNSSEC_EOK;
+error:
+	json_array_clear(jzones);
+	json_array_clear(jrecords);
+	return r;
+}
+
+int dnssec_keyusage_load(dnssec_keyusage_t *keyusage, const char *filename)
+{
+	assert(keyusage);
+	assert(filename);
+
+	dnssec_list_clear(keyusage);
+
+	_cleanup_fclose_ FILE *file = fopen(filename, "r");
+	if (!file) {
+		return DNSSEC_NOT_FOUND;
+	}
+
+	json_error_t error = { 0 };
+	_json_cleanup_ json_t *json = json_loadf(file, JSON_LOAD_OPTIONS, &error);
+	if (!json) {
+		if (error.position != 1) {
+			return DNSSEC_CONFIG_MALFORMED;
+		} else {
+			return DNSSEC_EOK;
+		}
+	}
+
+	return import_keyusage(keyusage, json);
+}
+
+int dnssec_keyusage_save(dnssec_keyusage_t *keyusage, const char *filename)
+{
+	assert(keyusage);
+	assert(filename);
+
+	_json_cleanup_ json_t *json = NULL;
+	int r = export_keyusage(keyusage, &json);
+	if (r != DNSSEC_EOK) {
+		return r;
+	}
+
+	_cleanup_fclose_ FILE *file = fopen(filename, "w");
+	if (!file) {
+		return DNSSEC_NOT_FOUND;
+	}
+
+	if (json) {
+		r = json_dumpf(json, file, JSON_DUMP_OPTIONS);
+		if (r != DNSSEC_EOK) {
+			return r;
+		}
+	}
+
+	fputc('\n', file);
+	return DNSSEC_EOK;
+}
+
+/* -- public API ----------------------------------------------------------- */
+
+_public_
+dnssec_keyusage_t *dnssec_keyusage_new()
+{
+	dnssec_keyusage_t *keyusage = dnssec_list_new();
+	return keyusage;
+}
+
+_public_
+void dnssec_keyusage_free(dnssec_keyusage_t *keyusage)
+{
+	if (keyusage == NULL) {
+		return;
+	}
+
+	if (!dnssec_list_is_empty(keyusage)) {
+		dnssec_list_foreach(item, keyusage) {
+			record_keyusage_t *record = dnssec_item_get(item);
+
+			free(record->key_id);
+			dnssec_list_foreach(item2, record->zones) {
+				char *zone = dnssec_item_get(item2);
+				free(zone);
+			}
+			dnssec_list_free(record->zones);
+			free(record);
+		}
+	}
+	dnssec_list_free(keyusage);
+	keyusage = NULL;
+}
diff --git a/src/dnssec/lib/sign/sign.c b/src/dnssec/lib/sign/sign.c
index 60cba347bd5e38dd43e33099bfbafc2f9cfaeccd..03f727ffdf0e937461c844b482455dd840a17d14 100644
--- a/src/dnssec/lib/sign/sign.c
+++ b/src/dnssec/lib/sign/sign.c
@@ -266,6 +266,8 @@ static const algorithm_functions_t *get_functions(const dnssec_key_t *key)
 	case DNSSEC_KEY_ALGORITHM_ECDSA_P256_SHA256:
 	case DNSSEC_KEY_ALGORITHM_ECDSA_P384_SHA384:
 		return &ecdsa_functions;
+	case DNSSEC_KEY_ALGORITHM_ED25519:
+	case DNSSEC_KEY_ALGORITHM_ED448:
 	default:
 		return NULL;
 	}
@@ -291,6 +293,8 @@ static gnutls_digest_algorithm_t get_digest_algorithm(const dnssec_key_t *key)
 		return GNUTLS_DIG_SHA512;
 	case DNSSEC_KEY_ALGORITHM_ECDSA_P384_SHA384:
 		return GNUTLS_DIG_SHA384;
+	case DNSSEC_KEY_ALGORITHM_ED25519:
+	case DNSSEC_KEY_ALGORITHM_ED448:
 	default:
 		return GNUTLS_DIG_UNKNOWN;
 	}
diff --git a/src/dnssec/tests/.gitignore b/src/dnssec/tests/.gitignore
index bdbb8facbb25f061778b53b874d9b526967700ae..5075e739c2e7c3b1b4b0a6d28519d537cdcf2f71 100644
--- a/src/dnssec/tests/.gitignore
+++ b/src/dnssec/tests/.gitignore
@@ -9,6 +9,7 @@
 /event_nsec3_resalt
 /kasp_dir_escape
 /kasp_dir_file
+/keyusage
 /kasp_policy
 /kasp_store
 /key
diff --git a/src/dnssec/tests/Makefile.am b/src/dnssec/tests/Makefile.am
index 2821b55c3f8ca692bf6a67bfe28434ff7f8cfca2..6f3fed12f8715ce48607089dc869b7eec0d84cfc 100644
--- a/src/dnssec/tests/Makefile.am
+++ b/src/dnssec/tests/Makefile.am
@@ -34,6 +34,7 @@ check_PROGRAMS = \
 	keystore_pkcs8	\
 	keystore_pkcs8_dir \
 	keytag		\
+	keyusage	\
 	list		\
 	nsec_bitmap	\
 	nsec_hash	\
diff --git a/src/dnssec/tests/event_keystate.c b/src/dnssec/tests/event_keystate.c
index da0efb9c8eb9f709e3ef659169211ebe59ebcc31..b14768d07f760b1a82c4d84313b4d5628bf37527 100644
--- a/src/dnssec/tests/event_keystate.c
+++ b/src/dnssec/tests/event_keystate.c
@@ -17,7 +17,7 @@
 #include <tap/basic.h>
 #include <string.h>
 
-#include "event/keystate.h"
+#include "dnssec/keystate.h"
 
 #define PAST   1426852710
 #define NOW    1426852711
@@ -40,28 +40,28 @@ int main(int argc, char *argv[])
 	// valid states
 
 	key.timing.publish = PAST;
-	ok(get_key_state(&key, NOW) == DNSSEC_KEY_STATE_PUBLISHED, "published");
+	ok(dnssec_get_key_state(&key, NOW) == DNSSEC_KEY_STATE_PUBLISHED, "published");
 
 	key.timing.active = PAST;
-	ok(get_key_state(&key, NOW) == DNSSEC_KEY_STATE_ACTIVE, "active");
+	ok(dnssec_get_key_state(&key, NOW) == DNSSEC_KEY_STATE_ACTIVE, "active");
 
 	key.timing.retire = PAST;
-	ok(get_key_state(&key, NOW) == DNSSEC_KEY_STATE_RETIRED, "retired");
+	ok(dnssec_get_key_state(&key, NOW) == DNSSEC_KEY_STATE_RETIRED, "retired");
 
 	key.timing.remove = PAST;
-	ok(get_key_state(&key, NOW) == DNSSEC_KEY_STATE_REMOVED, "removed");
+	ok(dnssec_get_key_state(&key, NOW) == DNSSEC_KEY_STATE_REMOVED, "removed");
 
 	memset(&key.timing, 0, sizeof(key.timing));
-	ok(get_key_state(&key, NOW) == DNSSEC_KEY_STATE_ACTIVE, "default (active)");
+	ok(dnssec_get_key_state(&key, NOW) == DNSSEC_KEY_STATE_ACTIVE, "default (active)");
 
 	// currently unsupported
 
 	key.timing = INITIAL_TIMING;
-	ok(get_key_state(&key, NOW) == DNSSEC_KEY_STATE_INVALID, "created");
+	ok(dnssec_get_key_state(&key, NOW) == DNSSEC_KEY_STATE_INVALID, "created");
 
 	key.timing.publish = FUTURE;
 	key.timing.active = PAST;
-	ok(get_key_state(&key, NOW) == DNSSEC_KEY_STATE_INVALID, "signature pre-publish");
+	ok(dnssec_get_key_state(&key, NOW) == DNSSEC_KEY_STATE_INVALID, "signature pre-publish");
 
 	return 0;
 }
diff --git a/src/dnssec/tests/keyusage.c b/src/dnssec/tests/keyusage.c
new file mode 100644
index 0000000000000000000000000000000000000000..59a3dd2506bc7d47f1b093dbc16eafa8d58767eb
--- /dev/null
+++ b/src/dnssec/tests/keyusage.c
@@ -0,0 +1,124 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <tap/basic.h>
+#include <tap/files.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "dnssec.h"
+
+static void test_keyusage_empty(const char *json_file)
+{
+	diag("%s", __func__);
+
+	dnssec_keyusage_t *k = dnssec_keyusage_new();
+
+	ok(dnssec_keyusage_load(k, json_file)== DNSSEC_NOT_FOUND, "keyusage_load empty, no keyusage");
+
+	ok(dnssec_list_is_empty(k), "List of records is empty.");
+
+	ok(dnssec_keyusage_save(k, json_file) == DNSSEC_EOK , "keyusage_save empty");
+
+	ok(dnssec_keyusage_load(k, json_file)== DNSSEC_EOK , "keyusage_load empty");
+
+	ok(dnssec_list_is_empty(k), "List of records is empty.");
+
+	dnssec_keyusage_free(k);
+}
+
+static void test_keyusage_basic(void)
+{
+	diag("%s", __func__);
+
+	dnssec_keyusage_t *k = NULL;
+
+	k = dnssec_keyusage_new();
+	ok(dnssec_list_is_empty(k), "List of records is empty.");
+
+	dnssec_keyusage_add(k, "prvni", "zona");
+
+	ok(!dnssec_list_is_empty(k), "List of records is not empty.");
+	// Check added key being used
+	ok(dnssec_keyusage_is_used(k, "prvni"), "Key is used.");
+	// Remove added key and check empty record
+	dnssec_keyusage_remove(k, "prvni", "zona");
+	ok(dnssec_list_is_empty(k), "List of records is empty.");
+	ok(!dnssec_keyusage_is_used(k, "prvni"), "Key is not used.");
+	// Check if key is used when one of zones is deleted
+	dnssec_keyusage_add(k, "prvni", "zona");
+	dnssec_keyusage_add(k, "prvni", "zona2");
+	dnssec_keyusage_remove(k, "prvni", "zona");
+	ok(dnssec_keyusage_is_used(k, "prvni"), "Key is used.");
+
+	// Check if key is unused after deleting both zones
+	dnssec_keyusage_remove(k, "prvni", "zona2");
+	ok(!dnssec_keyusage_is_used(k, "prvni"), "Key is not used.");
+
+	dnssec_keyusage_free(k);
+}
+
+static void test_keyusage_file(const char *json_file)
+{
+	dnssec_keyusage_t *k = NULL;
+	k = dnssec_keyusage_new();
+	dnssec_keyusage_add(k, "prvni", "zona");
+	dnssec_keyusage_add(k, "prvni", "zona2");
+	dnssec_keyusage_add(k, "druhy", "zona");
+
+	ok(dnssec_keyusage_save(k, json_file) == DNSSEC_EOK , "kayusage_save");
+
+	dnssec_keyusage_free(k);
+	k = dnssec_keyusage_new();
+
+	ok(!dnssec_keyusage_is_used(k, "prvni"), "Key is not used - freed succesfully.");
+	ok(!dnssec_keyusage_is_used(k, "druhy"), "Key is not used - freed succesfully.");
+
+	ok(dnssec_keyusage_load(k, json_file)== DNSSEC_EOK , "kayusage_load");
+
+	ok(dnssec_keyusage_is_used(k, "prvni"), "Key is used - loaded succesfully.");
+	ok(dnssec_keyusage_is_used(k, "druhy"), "Key is used - loaded succesfully.");
+
+	dnssec_keyusage_free(k);
+}
+
+int main(void)
+{
+	plan_lazy();
+
+	char *json_path = NULL, *json_file = NULL;
+
+	json_path = test_mkdtemp();
+	if (!json_path) {
+		fprintf(stderr, "Failed to create teporary path.");
+		return -1;
+	}
+
+	int r = asprintf(&json_file, "%s/keyusage.json", json_path);
+	if (r == -1) {
+		fprintf(stderr, "Failed to create teporary file path.");
+		return -1;
+	}
+
+	test_keyusage_empty(json_file);
+	test_keyusage_basic();
+	test_keyusage_file(json_file);
+
+	test_rm_rf(json_path);
+	free(json_path);
+
+	return 0;
+}
diff --git a/src/knot/common/log.c b/src/knot/common/log.c
index 9bf114167e368683a7a6b5547d4577c17af7cdaf..390efd48923f328d89de3c2ca7ef7602f1588fe7 100644
--- a/src/knot/common/log.c
+++ b/src/knot/common/log.c
@@ -43,11 +43,11 @@ int use_journal = 0;
 
 /*! Log context. */
 typedef struct {
-	size_t facility_count; /*!< Log sink count. */
-	int *facility;         /*!< Log sinks. */
-	size_t file_count;     /*!< Open files count. */
-	FILE **file;           /*!< Open files. */
-	logflag_t flags;       /*!< Formatting flags. */
+	size_t target_count; /*!< Log target count. */
+	int *target;         /*!< Log targets. */
+	size_t file_count;   /*!< Open files count. */
+	FILE **file;         /*!< Open files. */
+	log_flag_t flags;    /*!< Formatting flags. */
 } log_t;
 
 /*! Log singleton. */
@@ -68,13 +68,13 @@ static void sink_free(log_t *log)
 	for (int i = 0; i < log->file_count; ++i) {
 		fclose(log->file[i]);
 	}
-	free(log->facility);
+	free(log->target);
 	free(log->file);
 	free(log);
 }
 
 /*!
- * \brief Create logging facilities respecting their canonical order.
+ * \brief Create logging targets respecting their canonical order.
  *
  * Facilities ordering: Syslog, Stderr, Stdout, File0...
  */
@@ -86,20 +86,20 @@ static log_t *sink_setup(size_t file_count)
 	}
 	memset(log, 0, sizeof(*log));
 
-	// Reserve space for facilities.
-	log->facility_count = LOGT_FILE + file_count;
-	log->facility = malloc(LOG_ANY * sizeof(int) * log->facility_count);
-	if (!log->facility) {
+	// Reserve space for targets.
+	log->target_count = LOG_TARGET_FILE + file_count;
+	log->target = malloc(LOG_SOURCE_ANY * sizeof(int) * log->target_count);
+	if (!log->target) {
 		free(log);
 		return NULL;
 	}
-	memset(log->facility, 0, LOG_ANY * sizeof(int) * log->facility_count);
+	memset(log->target, 0, LOG_SOURCE_ANY * sizeof(int) * log->target_count);
 
 	// Reserve space for log files.
 	if (file_count > 0) {
 		log->file = malloc(sizeof(FILE *) * file_count);
 		if (!log->file) {
-			free(log->facility);
+			free(log->target);
 			free(log);
 			return NULL;
 		}
@@ -117,34 +117,34 @@ static void sink_publish(log_t *log)
 	sink_free(old_log);
 }
 
-static int *src_levels(log_t *log, logfacility_t facility, logsrc_t src)
+static int *src_levels(log_t *log, log_target_t target, log_source_t src)
 {
-	assert(src < LOG_ANY);
-	return &log->facility[LOG_ANY * facility + src];
+	assert(src < LOG_SOURCE_ANY);
+	return &log->target[LOG_SOURCE_ANY * target + src];
 }
 
-static void sink_levels_set(log_t *log, logfacility_t facility, logsrc_t src, int levels)
+static void sink_levels_set(log_t *log, log_target_t target, log_source_t src, int levels)
 {
 	// Assign levels to the specified source.
-	if (src != LOG_ANY) {
-		*src_levels(log, facility, src) = levels;
+	if (src != LOG_SOURCE_ANY) {
+		*src_levels(log, target, src) = levels;
 	} else {
 		// ANY ~ set levels to all sources.
-		for (int i = 0; i < LOG_ANY; ++i) {
-			*src_levels(log, facility, i) = levels;
+		for (int i = 0; i < LOG_SOURCE_ANY; ++i) {
+			*src_levels(log, target, i) = levels;
 		}
 	}
 }
 
-static void sink_levels_add(log_t *log, logfacility_t facility, logsrc_t src, int levels)
+static void sink_levels_add(log_t *log, log_target_t target, log_source_t src, int levels)
 {
 	// Add levels to the specified source.
-	if (src != LOG_ANY) {
-		*src_levels(log, facility, src) |= levels;
+	if (src != LOG_SOURCE_ANY) {
+		*src_levels(log, target, src) |= levels;
 	} else {
 		// ANY ~ add levels to all sources.
-		for (int i = 0; i < LOG_ANY; ++i) {
-			*src_levels(log, facility, i) |= levels;
+		for (int i = 0; i < LOG_SOURCE_ANY; ++i) {
+			*src_levels(log, target, i) |= levels;
 		}
 	}
 }
@@ -167,9 +167,9 @@ void log_init(void)
 	use_journal = sd_booted();
 #endif
 
-	sink_levels_set(log, LOGT_SYSLOG, LOG_ANY, emask);
-	sink_levels_set(log, LOGT_STDERR, LOG_ANY, emask);
-	sink_levels_set(log, LOGT_STDOUT, LOG_ANY, imask);
+	sink_levels_set(log, LOG_TARGET_SYSLOG, LOG_SOURCE_ANY, emask);
+	sink_levels_set(log, LOG_TARGET_STDERR, LOG_SOURCE_ANY, emask);
+	sink_levels_set(log, LOG_TARGET_STDOUT, LOG_SOURCE_ANY, imask);
 	sink_publish(log);
 
 	setlogmask(LOG_UPTO(LOG_DEBUG));
@@ -186,34 +186,34 @@ void log_close(void)
 	closelog();
 }
 
-void log_flag_set(logflag_t flag)
+void log_flag_set(log_flag_t flag)
 {
 	if (log_isopen()) {
 		s_log->flags |= flag;
 	}
 }
 
-void log_levels_set(logfacility_t facility, logsrc_t src, int levels)
+void log_levels_set(log_target_t target, log_source_t src, int levels)
 {
 	if (log_isopen()) {
-		sink_levels_set(s_log, facility, src, levels);
+		sink_levels_set(s_log, target, src, levels);
 	}
 }
 
-void log_levels_add(logfacility_t facility, logsrc_t src, int levels)
+void log_levels_add(log_target_t target, log_source_t src, int levels)
 {
 	if (log_isopen()) {
-		sink_levels_add(s_log, facility, src, levels);
+		sink_levels_add(s_log, target, src, levels);
 	}
 }
 
-static void emit_log_msg(int level, const char *zone, size_t zone_len, const char *msg)
+static void emit_log_msg(int level, log_source_t src, const char *zone,
+                         size_t zone_len, const char *msg)
 {
 	log_t *log = s_log;
-	logsrc_t src = zone ? LOG_ZONE : LOG_SERVER;
 
-	// Syslog facility.
-	if (*src_levels(log, LOGT_SYSLOG, src) & LOG_MASK(level)) {
+	// Syslog target.
+	if (*src_levels(log, LOG_TARGET_SYSLOG, src) & LOG_MASK(level)) {
 #ifdef ENABLE_SYSTEMD
 		if (use_journal) {
 			char *zone_fmt = zone ? "ZONE=%.*s" : NULL;
@@ -230,7 +230,7 @@ static void emit_log_msg(int level, const char *zone, size_t zone_len, const cha
 
 	// Prefix date and time.
 	char tstr[LOG_BUFLEN] = { 0 };
-	if (!(s_log->flags & LOG_FNO_TIMESTAMP)) {
+	if (!(s_log->flags & LOG_FLAG_NOTIMESTAMP)) {
 		struct tm lt;
 		struct timeval tv;
 		gettimeofday(&tv, NULL);
@@ -240,14 +240,14 @@ static void emit_log_msg(int level, const char *zone, size_t zone_len, const cha
 		}
 	}
 
-	// Other log facilities.
-	for (int i = LOGT_STDERR; i < LOGT_FILE + log->file_count; ++i) {
+	// Other log targets.
+	for (int i = LOG_TARGET_STDERR; i < LOG_TARGET_FILE + log->file_count; ++i) {
 		if (*src_levels(log, i, src) & LOG_MASK(level)) {
 			FILE *stream;
 			switch (i) {
-			case LOGT_STDERR: stream = stderr; break;
-			case LOGT_STDOUT: stream = stdout; break;
-			default: stream = log->file[i - LOGT_FILE]; break;
+			case LOG_TARGET_STDERR: stream = stderr; break;
+			case LOG_TARGET_STDOUT: stream = stdout; break;
+			default: stream = log->file[i - LOG_TARGET_FILE]; break;
 			}
 
 			// Print the message.
@@ -289,7 +289,8 @@ static int log_msg_add(char **write, size_t *capacity, const char *fmt, ...)
 	return KNOT_EOK;
 }
 
-static void log_msg_text(int level, const char *zone, const char *fmt, va_list args)
+static void log_msg_text(int level, log_source_t src, const char *zone,
+                         const char *fmt, va_list args)
 {
 	if (!log_isopen()) {
 		return;
@@ -303,7 +304,7 @@ static void log_msg_text(int level, const char *zone, const char *fmt, va_list a
 	rcu_read_lock();
 
 	// Prefix error level.
-	if (level != LOG_INFO || !(s_log->flags & LOG_FNO_INFO)) {
+	if (level != LOG_INFO || !(s_log->flags & LOG_FLAG_NOINFO)) {
 		const char *prefix = level_prefix(level);
 		int ret = log_msg_add(&write, &capacity, "%s: ", prefix);
 		if (ret != KNOT_EOK) {
@@ -315,13 +316,10 @@ static void log_msg_text(int level, const char *zone, const char *fmt, va_list a
 	// Prefix zone name.
 	size_t zone_len = 0;
 	if (zone != NULL) {
-		// Strip terminating dot (unless root zone).
 		zone_len = strlen(zone);
-		if (zone_len > 1 && zone[zone_len - 1] == '.') {
-			zone_len -= 1;
-		}
+		const char *trailing_dot = zone[zone_len - 1] == '.' ? "" : ".";
 
-		int ret = log_msg_add(&write, &capacity, "[%.*s] ", zone_len, zone);
+		int ret = log_msg_add(&write, &capacity, "[%.*s%s] ", zone_len, zone, trailing_dot);
 		if (ret != KNOT_EOK) {
 			rcu_read_unlock();
 			return;
@@ -331,37 +329,46 @@ static void log_msg_text(int level, const char *zone, const char *fmt, va_list a
 	// Compile log message.
 	int ret = vsnprintf(write, capacity, fmt, args);
 	if (ret >= 0) {
-		// Send to logging facilities.
-		emit_log_msg(level, zone, zone_len, buff);
+		// Send to logging targets.
+		emit_log_msg(level, src, zone, zone_len, buff);
 	}
 
 	rcu_read_unlock();
 }
 
-void log_msg(int priority, const char *fmt, ...)
+void log_fmt(int priority, log_source_t src, const char *fmt, ...)
 {
 	va_list args;
 	va_start(args, fmt);
-	log_msg_text(priority, NULL, fmt, args);
+	log_msg_text(priority, src, NULL, fmt, args);
 	va_end(args);
 }
 
-void log_msg_zone(int priority, const knot_dname_t *zone, const char *fmt, ...)
+void log_fmt_zone(int priority, log_source_t src, const knot_dname_t *zone,
+                  const char *fmt, ...)
 {
 	char buff[KNOT_DNAME_TXT_MAXLEN + 1];
 	char *zone_str = knot_dname_to_str(buff, zone, sizeof(buff));
+	if (zone_str == NULL) {
+		zone_str = NULL_ZONE_STR;
+	}
 
 	va_list args;
 	va_start(args, fmt);
-	log_msg_text(priority, zone_str ? zone_str : NULL_ZONE_STR, fmt, args);
+	log_msg_text(priority, src, zone_str, fmt, args);
 	va_end(args);
 }
 
-void log_msg_zone_str(int priority, const char *zone, const char *fmt, ...)
+void log_fmt_zone_str(int priority, log_source_t src, const char *zone,
+                      const char *fmt, ...)
 {
+	if (zone == NULL) {
+		zone = NULL_ZONE_STR;
+	}
+
 	va_list args;
 	va_start(args, fmt);
-	log_msg_text(priority, zone ? zone : NULL_ZONE_STR, fmt, args);
+	log_msg_text(priority, src, zone, fmt, args);
 	va_end(args);
 }
 
@@ -380,24 +387,24 @@ int log_update_privileges(int uid, int gid)
 	return KNOT_EOK;
 }
 
-static logfacility_t get_logtype(const char *logname)
+static log_target_t get_logtype(const char *logname)
 {
 	assert(logname);
 
 	if (strcasecmp(logname, "syslog") == 0) {
-		return LOGT_SYSLOG;
+		return LOG_TARGET_SYSLOG;
 	} else if (strcasecmp(logname, "stderr") == 0) {
-		return LOGT_STDERR;
+		return LOG_TARGET_STDERR;
 	} else if (strcasecmp(logname, "stdout") == 0) {
-		return LOGT_STDOUT;
+		return LOG_TARGET_STDOUT;
 	} else {
-		return LOGT_FILE;
+		return LOG_TARGET_FILE;
 	}
 }
 
 static int log_open_file(log_t *log, const char *filename)
 {
-	assert(LOGT_FILE + log->file_count < log->facility_count);
+	assert(LOG_TARGET_FILE + log->file_count < log->target_count);
 
 	// Open the file.
 	log->file[log->file_count] = fopen(filename, "a");
@@ -408,7 +415,7 @@ static int log_open_file(log_t *log, const char *filename)
 	// Disable buffering.
 	setvbuf(log->file[log->file_count], NULL, _IONBF, 0);
 
-	return LOGT_FILE + log->file_count++;
+	return LOG_TARGET_FILE + log->file_count++;
 }
 
 void log_reconfigure(conf_t *conf)
@@ -420,12 +427,12 @@ void log_reconfigure(conf_t *conf)
 		return;
 	}
 
-	// Find maximum log facility id.
+	// Find maximum log target id.
 	unsigned files = 0;
 	for (conf_iter_t iter = conf_iter(conf, C_LOG); iter.code == KNOT_EOK;
 	     conf_iter_next(conf, &iter)) {
 		conf_val_t id = conf_iter_id(conf, &iter);
-		if (get_logtype(conf_str(&id)) == LOGT_FILE) {
+		if (get_logtype(conf_str(&id)) == LOG_TARGET_FILE) {
 			++files;
 		}
 	}
@@ -443,13 +450,13 @@ void log_reconfigure(conf_t *conf)
 		conf_val_t id = conf_iter_id(conf, &iter);
 		const char *logname = conf_str(&id);
 
-		// Get facility.
-		int facility = get_logtype(logname);
-		if (facility == LOGT_FILE) {
-			facility = log_open_file(log, logname);
-			if (facility < 0) {
+		// Get target.
+		int target = get_logtype(logname);
+		if (target == LOG_TARGET_FILE) {
+			target = log_open_file(log, logname);
+			if (target < 0) {
 				log_error("failed to open log, file '%s' (%s)",
-				          logname, knot_strerror(facility));
+				          logname, knot_strerror(target));
 				continue;
 			}
 		}
@@ -460,17 +467,22 @@ void log_reconfigure(conf_t *conf)
 		// Set SERVER logging.
 		levels_val = conf_id_get(conf, C_LOG, C_SERVER, &id);
 		levels = conf_opt(&levels_val);
-		sink_levels_add(log, facility, LOG_SERVER, levels);
+		sink_levels_add(log, target, LOG_SOURCE_SERVER, levels);
+
+		// Set CONTROL logging.
+		levels_val = conf_id_get(conf, C_LOG, C_CTL, &id);
+		levels = conf_opt(&levels_val);
+		sink_levels_add(log, target, LOG_SOURCE_CONTROL, levels);
 
 		// Set ZONE logging.
 		levels_val = conf_id_get(conf, C_LOG, C_ZONE, &id);
 		levels = conf_opt(&levels_val);
-		sink_levels_add(log, facility, LOG_ZONE, levels);
+		sink_levels_add(log, target, LOG_SOURCE_ZONE, levels);
 
 		// Set ANY logging.
 		levels_val = conf_id_get(conf, C_LOG, C_ANY, &id);
 		levels = conf_opt(&levels_val);
-		sink_levels_add(log, facility, LOG_ANY, levels);
+		sink_levels_add(log, target, LOG_SOURCE_ANY, levels);
 	}
 
 	sink_publish(log);
diff --git a/src/knot/common/log.h b/src/knot/common/log.h
index 18746dd685864cd6d3ec655800b1bc5d3f85f745..3fb3d0cc5ca9389decc5541480b194756283e223 100644
--- a/src/knot/common/log.h
+++ b/src/knot/common/log.h
@@ -40,26 +40,27 @@
 /*! \brief Format for timestamps in log files. */
 #define KNOT_LOG_TIME_FORMAT "%Y-%m-%dT%H:%M:%S"
 
-/*! \brief Logging facility types. */
+/*! \brief Logging targets. */
 typedef enum {
-	LOGT_SYSLOG = 0, /*!< Logging to syslog(3) facility. */
-	LOGT_STDERR = 1, /*!< Print log messages to the stderr. */
-	LOGT_STDOUT = 2, /*!< Print log messages to the stdout. */
-	LOGT_FILE   = 3  /*!< Generic logging to (unbuffered) file on the disk. */
-} logfacility_t;
+	LOG_TARGET_SYSLOG = 0, /*!< System log. */
+	LOG_TARGET_STDERR = 1, /*!< Standard error stream. */
+	LOG_TARGET_STDOUT = 2, /*!< Standard output stream. */
+	LOG_TARGET_FILE   = 3  /*!< Generic logging to a file (unbuffered). */
+} log_target_t;
 
 /*! \brief Logging sources. */
 typedef enum {
-	LOG_SERVER = 0, /*!< Server module. */
-	LOG_ZONE   = 1, /*!< Zone manipulation module. */
-	LOG_ANY    = 2  /*!< Any module. */
-} logsrc_t;
+	LOG_SOURCE_SERVER  = 0, /*!< Server module. */
+	LOG_SOURCE_CONTROL = 1, /*!< Server control module. */
+	LOG_SOURCE_ZONE    = 2, /*!< Zone manipulation module. */
+	LOG_SOURCE_ANY     = 3  /*!< Any module. */
+} log_source_t;
 
 /*! \brief Logging format flags. */
 typedef enum {
-	LOG_FNO_TIMESTAMP = 1 << 0, /*!< Don't print timestamp prefix. */
-	LOG_FNO_INFO      = 1 << 1  /*!< Don't print info level prefix. */
-} logflag_t;
+	LOG_FLAG_NOTIMESTAMP = 1 << 0, /*!< Don't print timestamp prefix. */
+	LOG_FLAG_NOINFO      = 1 << 1  /*!< Don't print info level prefix. */
+} log_flag_t;
 
 /*!
  * \brief Setup logging subsystem.
@@ -74,28 +75,28 @@ void log_close(void);
 /*!
  * \brief Set logging format flag.
  */
-void log_flag_set(logflag_t flag);
+void log_flag_set(log_flag_t flag);
 
 /*!
- * \brief Set log levels for given facility.
+ * \brief Set log levels for given target.
  *
- * \param facility  Logging facility index (LOGT_SYSLOG...).
- * \param src       Logging source (LOG_SERVER...LOG_ANY).
- * \param levels    Bitmask of specified log levels.
+ * \param target  Logging target index (LOG_TARGET_SYSLOG...).
+ * \param src     Logging source (LOG_SOURCE_SERVER...LOG_SOURCE_ANY).
+ * \param levels  Bitmask of specified log levels.
  */
-void log_levels_set(logfacility_t facility, logsrc_t src, int levels);
+void log_levels_set(log_target_t target, log_source_t src, int levels);
 
 /*!
- * \brief Add log levels to a given facility.
+ * \brief Add log levels to a given target.
  *
  * New levels are added on top of existing, the resulting levels set is
  * "old_levels OR new_levels".
  *
- * \param facility  Logging facility index (LOGT_SYSLOG...).
- * \param src       Logging source (LOG_SERVER...LOG_ANY).
- * \param levels    Bitmask of specified log levels.
+ * \param target  Logging target index (LOG_TARGET_SYSLOG...).
+ * \param src     Logging source (LOG_SOURCE_SERVER...LOG_SOURCE_ANY).
+ * \param levels  Bitmask of specified log levels.
  */
-void log_levels_add(logfacility_t facility, logsrc_t src, int levels);
+void log_levels_add(log_target_t target, log_source_t src, int levels);
 
 /*!
  * \brief Log message into server category.
@@ -103,54 +104,71 @@ void log_levels_add(logfacility_t facility, logsrc_t src, int levels);
  * Function follows printf() format.
  *
  * \param priority  Message priority.
+ * \param src       Message source.
  * \param fmt       Content of the logged message.
  */
-void log_msg(int priority, const char *fmt, ...)
-	__attribute__((format(printf, 2, 3)));
+void log_fmt(int priority, log_source_t src, const char *fmt, ...)
+__attribute__((format(printf, 3, 4)));
 
 /*!
  * \brief Log message into zone category.
  *
- * \see log_msg
+ * \see log_fmt
  *
  * \param zone  Zone name in wire format.
  */
-void log_msg_zone(int priority, const knot_dname_t *zone, const char *fmt, ...)
-	__attribute__((format(printf, 3, 4)));
+void log_fmt_zone(int priority, log_source_t src, const knot_dname_t *zone, const char *fmt, ...)
+__attribute__((format(printf, 4, 5)));
 
 /*!
  * \brief Log message into zone category.
  *
- * \see log_msg
+ * \see log_fmt
  *
  * \param zone  Zone name as an ASCII string.
  */
-void log_msg_zone_str(int priority, const char *zone, const char *fmt, ...)
-	__attribute__((format(printf, 3, 4)));
+void log_fmt_zone_str(int priority, log_source_t src, const char *zone, const char *fmt, ...)
+__attribute__((format(printf, 4, 5)));
+
+/* Compatibility wrappers. */
+#define log_msg(priority, fmt, ...) log_fmt(priority, LOG_SOURCE_SERVER, fmt, ##__VA_ARGS__)
+#define log_msg_zone(priority, zone, fmt, ...) log_fmt_zone(priority, LOG_SOURCE_ZONE, zone, fmt, ##__VA_ARGS__)
+#define log_msg_zone_str(priority, zone, fmt, ...) log_fmt_zone_str(priority, LOG_SOURCE_ZONE, zone, fmt, ##__VA_ARGS__)
 
 /*!
  * \brief Convenient logging macros.
  */
-#define log_fatal(msg, ...)   log_msg(LOG_CRIT,    msg, ##__VA_ARGS__)
-#define log_error(msg, ...)   log_msg(LOG_ERR,     msg, ##__VA_ARGS__)
-#define log_warning(msg, ...) log_msg(LOG_WARNING, msg, ##__VA_ARGS__)
-#define log_notice(msg, ...)  log_msg(LOG_NOTICE,  msg, ##__VA_ARGS__)
-#define log_info(msg, ...)    log_msg(LOG_INFO,    msg, ##__VA_ARGS__)
-#define log_debug(msg, ...)   log_msg(LOG_DEBUG,   msg, ##__VA_ARGS__)
-
-#define log_zone_fatal(zone, msg, ...)   log_msg_zone(LOG_CRIT,    zone, msg, ##__VA_ARGS__)
-#define log_zone_error(zone, msg, ...)   log_msg_zone(LOG_ERR,     zone, msg, ##__VA_ARGS__)
-#define log_zone_warning(zone, msg, ...) log_msg_zone(LOG_WARNING, zone, msg, ##__VA_ARGS__)
-#define log_zone_notice(zone, msg, ...)  log_msg_zone(LOG_NOTICE,  zone, msg, ##__VA_ARGS__)
-#define log_zone_info(zone, msg, ...)    log_msg_zone(LOG_INFO,    zone, msg, ##__VA_ARGS__)
-#define log_zone_debug(zone, msg, ...)   log_msg_zone(LOG_DEBUG,   zone, msg, ##__VA_ARGS__)
-
-#define log_zone_str_fatal(zone, msg, ...)   log_msg_zone_str(LOG_CRIT,    zone, msg, ##__VA_ARGS__)
-#define log_zone_str_error(zone, msg, ...)   log_msg_zone_str(LOG_ERR,     zone, msg, ##__VA_ARGS__)
-#define log_zone_str_warning(zone, msg, ...) log_msg_zone_str(LOG_WARNING, zone, msg, ##__VA_ARGS__)
-#define log_zone_str_notice(zone, msg, ...)  log_msg_zone_str(LOG_NOTICE,  zone, msg, ##__VA_ARGS__)
-#define log_zone_str_info(zone, msg, ...)    log_msg_zone_str(LOG_INFO,    zone, msg, ##__VA_ARGS__)
-#define log_zone_str_debug(zone, msg, ...)   log_msg_zone_str(LOG_DEBUG,   zone, msg, ##__VA_ARGS__)
+#define log_fatal(msg, ...)   log_fmt(LOG_CRIT,    LOG_SOURCE_SERVER, msg, ##__VA_ARGS__)
+#define log_error(msg, ...)   log_fmt(LOG_ERR,     LOG_SOURCE_SERVER, msg, ##__VA_ARGS__)
+#define log_warning(msg, ...) log_fmt(LOG_WARNING, LOG_SOURCE_SERVER, msg, ##__VA_ARGS__)
+#define log_notice(msg, ...)  log_fmt(LOG_NOTICE,  LOG_SOURCE_SERVER, msg, ##__VA_ARGS__)
+#define log_info(msg, ...)    log_fmt(LOG_INFO,    LOG_SOURCE_SERVER, msg, ##__VA_ARGS__)
+#define log_debug(msg, ...)   log_fmt(LOG_DEBUG,   LOG_SOURCE_SERVER, msg, ##__VA_ARGS__)
+
+#define log_ctl_fatal(msg, ...)   log_fmt(LOG_CRIT,    LOG_SOURCE_CONTROL, msg, ##__VA_ARGS__)
+#define log_ctl_error(msg, ...)   log_fmt(LOG_ERR,     LOG_SOURCE_CONTROL, msg, ##__VA_ARGS__)
+#define log_ctl_warning(msg, ...) log_fmt(LOG_WARNING, LOG_SOURCE_CONTROL, msg, ##__VA_ARGS__)
+#define log_ctl_notice(msg, ...)  log_fmt(LOG_NOTICE,  LOG_SOURCE_CONTROL, msg, ##__VA_ARGS__)
+#define log_ctl_info(msg, ...)    log_fmt(LOG_INFO,    LOG_SOURCE_CONTROL, msg, ##__VA_ARGS__)
+#define log_ctl_debug(msg, ...)   log_fmt(LOG_DEBUG,   LOG_SOURCE_CONTROL, msg, ##__VA_ARGS__)
+
+#define log_ctl_zone_str_error(zone, msg, ...) log_fmt_zone_str(LOG_ERR,   LOG_SOURCE_CONTROL, zone, msg, ##__VA_ARGS__)
+#define log_ctl_zone_str_info(zone, msg, ...)  log_fmt_zone_str(LOG_INFO,  LOG_SOURCE_CONTROL, zone, msg, ##__VA_ARGS__)
+#define log_ctl_zone_str_debug(zone, msg, ...) log_fmt_zone_str(LOG_DEBUG, LOG_SOURCE_CONTROL, zone, msg, ##__VA_ARGS__)
+
+#define log_zone_fatal(zone, msg, ...)   log_fmt_zone(LOG_CRIT,    LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_error(zone, msg, ...)   log_fmt_zone(LOG_ERR,     LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_warning(zone, msg, ...) log_fmt_zone(LOG_WARNING, LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_notice(zone, msg, ...)  log_fmt_zone(LOG_NOTICE,  LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_info(zone, msg, ...)    log_fmt_zone(LOG_INFO,    LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_debug(zone, msg, ...)   log_fmt_zone(LOG_DEBUG,   LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+
+#define log_zone_str_fatal(zone, msg, ...)   log_fmt_zone_str(LOG_CRIT,    LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_str_error(zone, msg, ...)   log_fmt_zone_str(LOG_ERR,     LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_str_warning(zone, msg, ...) log_fmt_zone_str(LOG_WARNING, LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_str_notice(zone, msg, ...)  log_fmt_zone_str(LOG_NOTICE,  LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_str_info(zone, msg, ...)    log_fmt_zone_str(LOG_INFO,    LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
+#define log_zone_str_debug(zone, msg, ...)   log_fmt_zone_str(LOG_DEBUG,   LOG_SOURCE_ZONE, zone, msg, ##__VA_ARGS__)
 
 /*!
  * \brief Update open files ownership.
diff --git a/src/knot/common/stats.c b/src/knot/common/stats.c
new file mode 100644
index 0000000000000000000000000000000000000000..2c507f9fe92b5b2585f6b2cb1ec972297ca660c2
--- /dev/null
+++ b/src/knot/common/stats.c
@@ -0,0 +1,277 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <inttypes.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+#include <urcu.h>
+
+#include "contrib/files.h"
+#include "knot/common/stats.h"
+#include "knot/common/log.h"
+#include "knot/nameserver/query_module.h"
+
+struct {
+	bool active_dumper;
+	pthread_t dumper;
+	uint32_t timer;
+	server_t *server;
+} stats = { 0 };
+
+#define DUMP_STR(fd, level, name, ...) do { \
+	fprintf(fd, "%-.*s"name": %s\n", level, "    ", ##__VA_ARGS__); \
+	} while (0)
+#define DUMP_CTR(fd, level, name, ...) do { \
+	fprintf(fd, "%-.*s"name": %"PRIu64"\n", level, "    ", ##__VA_ARGS__); \
+	} while (0)
+
+uint64_t server_zone_count(server_t *server)
+{
+	return knot_zonedb_size(server->zone_db);
+}
+
+const stats_item_t server_stats[] = {
+	{ "zone-count", server_zone_count },
+	{ 0 }
+};
+
+static void dump_counters(FILE *fd, int level, mod_ctr_t *ctr)
+{
+	for (uint32_t j = 0; j < ctr->count; j++) {
+		// Skip empty counters.
+		if (ctr->counters[j] == 0) {
+			continue;
+		}
+
+		if (ctr->idx_to_str != NULL) {
+			char *str = ctr->idx_to_str(j, ctr->count);
+			if (str != NULL) {
+				DUMP_CTR(fd, level, "%s", str, ctr->counters[j]);
+				free(str);
+			}
+		} else {
+			DUMP_CTR(fd, level, "%u", j, ctr->counters[j]);
+		}
+	}
+}
+
+static void dump_modules(FILE *fd, list_t *query_modules, const knot_dname_t *zone)
+{
+	static int level = 0;
+	struct query_module *mod = NULL;
+	WALK_LIST(mod, *query_modules) {
+		// Skip modules without statistics.
+		if (mod->stats_count == 0) {
+			continue;
+		}
+
+		// Dump zone name.
+		if (zone != NULL) {
+			// Prevent from zone section override.
+			if (level == 0) {
+				DUMP_STR(fd, level++, "zone", "");
+			} else {
+				level = 1;
+			}
+
+			char name[KNOT_DNAME_TXT_MAXLEN + 1];
+			if (knot_dname_to_str(name, zone, sizeof(name)) == NULL) {
+				return;
+			}
+			DUMP_STR(fd, level++, "\"%s\"", name, "");
+		} else {
+			level = 0;
+		}
+
+		// Dump module counters.
+		DUMP_STR(fd, level, "%s", mod->id->name + 1, "");
+		for (int i = 0; i < mod->stats_count; i++) {
+			mod_ctr_t *ctr = mod->stats + i;
+			if (ctr->name == NULL) {
+				// Empty counter.
+				continue;
+			}
+			if (ctr->count == 1) {
+				// Simple counter.
+				DUMP_CTR(fd, level + 1, "%s", ctr->name, ctr->counter);
+			} else {
+				// Array of counters.
+				DUMP_STR(fd, level + 1, "%s", ctr->name, "");
+				dump_counters(fd, level + 2, ctr);
+			}
+		}
+	}
+}
+
+static void zone_stats_dump(zone_t *zone, FILE *fd)
+{
+	if (EMPTY_LIST(zone->query_modules)) {
+		return;
+	}
+
+	dump_modules(fd, &zone->query_modules, zone->name);
+}
+
+static void dump_to_file(FILE *fd, server_t *server)
+{
+	char date[64] = "";
+
+	// Get formated current time string.
+	struct tm tm;
+	time_t now = time(NULL);
+	localtime_r(&now, &tm);
+	strftime(date, sizeof(date), "%Y-%m-%dT%H:%M:%S%z", &tm);
+
+	// Get the server identity.
+	conf_val_t val = conf_get(conf(), C_SRV, C_IDENT);
+	const char *ident = conf_str(&val);
+	if (val.code != KNOT_EOK || ident[0] == '\0') {
+		ident = conf()->hostname;
+	}
+
+	// Dump record header.
+	fprintf(fd,
+	        "---\n"
+	        "time: %s\n"
+	        "identity: %s\n",
+	        date, ident);
+
+	// Dump server statistics.
+	DUMP_STR(fd, 0, "server", "");
+	for (const stats_item_t *item = server_stats; item->name != NULL; item++) {
+		DUMP_CTR(fd, 1, "%s", item->name, item->val(server));
+	}
+
+	// Dump global statistics.
+	dump_modules(fd, &conf()->query_modules, NULL);
+
+	// Dump zone statistics.
+	knot_zonedb_foreach(server->zone_db, zone_stats_dump, fd);
+}
+
+static void dump_stats(server_t *server)
+{
+	conf_val_t val = conf_get(conf(), C_SRV, C_RUNDIR);
+	char *rundir = conf_abs_path(&val, NULL);
+	val = conf_get(conf(), C_STATS, C_FILE);
+	char *file_name = conf_abs_path(&val, rundir);
+	free(rundir);
+
+	val = conf_get(conf(), C_STATS, C_APPEND);
+	bool append = conf_bool(&val);
+
+	// Open or create output file.
+	FILE *fd = NULL;
+	char *tmp_name = NULL;
+	if (append) {
+		fd = fopen(file_name, "a");
+		if (fd == NULL) {
+			log_error("stats, failed to append file '%s' (%s)",
+			          file_name, knot_strerror(knot_map_errno()));
+			free(file_name);
+			return;
+		}
+	} else {
+		int ret = open_tmp_file(file_name, &tmp_name, &fd,
+		                        S_IRUSR | S_IWUSR | S_IRGRP);
+		if (ret != KNOT_EOK) {
+			log_error("stats, failed to open file '%s' (%s)",
+			          file_name, knot_strerror(ret));
+			free(file_name);
+			return;
+		}
+	}
+	assert(fd);
+
+	// Dump stats into the file.
+	dump_to_file(fd, server);
+
+	fflush(fd);
+	fclose(fd);
+
+	// Switch the file contents.
+	if (!append) {
+		int ret = rename(tmp_name, file_name);
+		if (ret != 0) {
+			log_error("stats, failed to access file '%s' (%s)",
+			          file_name, knot_strerror(knot_map_errno()));
+			unlink(tmp_name);
+		}
+		free(tmp_name);
+	}
+
+	log_debug("stats, dumped into file '%s'", file_name);
+	free(file_name);
+}
+
+static void *dumper(void *data)
+{
+	while (true) {
+		assert(stats.timer > 0);
+		sleep(stats.timer);
+
+		pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+		rcu_read_lock();
+		dump_stats(stats.server);
+		rcu_read_unlock();
+		pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+	}
+
+	return NULL;
+}
+
+void stats_reconfigure(conf_t *conf, server_t *server)
+{
+	if (conf == NULL || server == NULL) {
+		return;
+	}
+
+	// Update server context.
+	stats.server = server;
+
+	conf_val_t val = conf_get(conf, C_STATS, C_TIMER);
+	stats.timer = conf_int(&val);
+	if (stats.timer > 0) {
+		// Check if dumping is already running.
+		if (stats.active_dumper) {
+			return;
+		}
+
+		int ret = pthread_create(&stats.dumper, NULL, dumper, NULL);
+		if (ret != 0) {
+			log_error("stats, failed to launch periodic dumping (%s)",
+			          knot_strerror(knot_map_errno_code(ret)));
+		} else {
+			stats.active_dumper = true;
+		}
+	// Stop current dumping.
+	} else if (stats.active_dumper) {
+		pthread_cancel(stats.dumper);
+		pthread_join(stats.dumper, NULL);
+		stats.active_dumper = false;
+	}
+}
+
+void stats_deinit(void)
+{
+	if (stats.active_dumper) {
+		pthread_cancel(stats.dumper);
+		pthread_join(stats.dumper, NULL);
+	}
+
+	memset(&stats, 0, sizeof(stats));
+}
diff --git a/src/knot/common/stats.h b/src/knot/common/stats.h
new file mode 100644
index 0000000000000000000000000000000000000000..9cbdd8b2d0e9f30c45c9f3a4bd1c2c42b666bae8
--- /dev/null
+++ b/src/knot/common/stats.h
@@ -0,0 +1,44 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "knot/server/server.h"
+
+typedef uint64_t (*stats_val_f)(server_t *server);
+
+/*!
+ * \brief Statistics metrics item.
+ */
+typedef struct {
+	const char *name; /*!< Metrics name. */
+	stats_val_f val;  /*!< Metrics value getter. */
+} stats_item_t;
+
+/*!
+ * \brief Basic server metrics.
+ */
+extern const stats_item_t server_stats[];
+
+/*!
+ * \brief Reconfigures the statistics facility.
+ */
+void stats_reconfigure(conf_t *conf, server_t *server);
+
+/*!
+ * \brief Deinitializes the statistics facility.
+ */
+void stats_deinit(void);
diff --git a/src/knot/conf/base.c b/src/knot/conf/base.c
index a940253ef684a542486c3c61ecfdc61c314becc6..c595668abe296cce49cb462689fa3cdc69c92bf0 100644
--- a/src/knot/conf/base.c
+++ b/src/knot/conf/base.c
@@ -133,15 +133,10 @@ static void init_cache(
 	val = conf_get(conf, C_SRV, C_MAX_TCP_CLIENTS);
 	conf->cache.srv_max_tcp_clients = conf_int(&val);
 
-	val = conf_get(conf, C_SRV, C_RATE_LIMIT_SLIP);
-	conf->cache.srv_rate_limit_slip = conf_int(&val);
-
 	val = conf_get(conf, C_CTL, C_TIMEOUT);
 	conf->cache.ctl_timeout = conf_int(&val) * 1000;
 
 	conf->cache.srv_nsid = conf_get(conf, C_SRV, C_NSID);
-
-	conf->cache.srv_rate_limit_whitelist = conf_get(conf, C_SRV, C_RATE_LIMIT_WHITELIST);
 }
 
 int conf_new(
@@ -180,6 +175,7 @@ int conf_new(
 	out->api = knot_db_lmdb_api();
 	struct knot_db_lmdb_opts lmdb_opts = KNOT_DB_LMDB_OPTS_INITIALIZER;
 	lmdb_opts.mapsize = (size_t)CONF_MAPSIZE * 1024 * 1024;
+	lmdb_opts.maxreaders = CONF_MAX_DB_READERS;
 	lmdb_opts.flags.env = KNOT_DB_LMDB_NOTLS;
 
 	// Open the database.
@@ -309,11 +305,22 @@ int conf_clone(
 }
 
 void conf_update(
-	conf_t *conf)
+	conf_t *conf,
+	conf_update_flag_t flags)
 {
 	// Remove the clone flag for new master configuration.
 	if (conf != NULL) {
 		conf->is_clone = false;
+
+		if ((flags & CONF_UPD_FCONFIO) && s_conf != NULL) {
+			conf->io.flags = s_conf->io.flags;
+			conf->io.zones = s_conf->io.zones;
+		}
+		if ((flags & CONF_UPD_FMODULES) && s_conf != NULL) {
+			list_dup(&conf->query_modules, &s_conf->query_modules,
+			         sizeof(struct query_module));
+			conf->query_plan = s_conf->query_plan;
+		}
 	}
 
 	conf_t **current_conf = &s_conf;
@@ -324,6 +331,15 @@ void conf_update(
 	if (old_conf != NULL) {
 		// Remove the clone flag if a single configuration.
 		old_conf->is_clone = (conf != NULL) ? true : false;
+
+		if (flags & CONF_UPD_FCONFIO) {
+			old_conf->io.zones = NULL;
+		}
+		if (flags & CONF_UPD_FMODULES) {
+			init_list(&old_conf->query_modules);
+			old_conf->query_plan = NULL;
+		}
+
 		conf_free(old_conf);
 	}
 }
@@ -343,6 +359,10 @@ void conf_free(
 	if (conf->io.txn != NULL) {
 		conf->api->txn_abort(conf->io.txn_stack);
 	}
+	if (conf->io.zones != NULL) {
+		hattrie_free(conf->io.zones);
+		mm_free(conf->mm, conf->io.zones);
+	}
 
 	conf_deactivate_modules(&conf->query_modules, &conf->query_plan);
 
@@ -355,6 +375,10 @@ void conf_free(
 	free(conf);
 }
 
+#define LOG_ARGS(mod_id, msg, ...) "module '%s%s%.*s', " msg, \
+	mod_id->name + 1, (mod_id->len > 0) ? "/" : "", (int)mod_id->len, \
+	mod_id->data
+
 void conf_activate_modules(
 	conf_t *conf,
 	const knot_dname_t *zone_name,
@@ -381,6 +405,7 @@ void conf_activate_modules(
 	case KNOT_EOK:
 		break;
 	case KNOT_ENOENT: // Check if a module is configured at all.
+	case KNOT_YP_EINVAL_ID:
 		return;
 	default:
 		ret = val.code;
@@ -406,7 +431,8 @@ void conf_activate_modules(
 		}
 
 		// Open the module.
-		struct query_module *mod = query_module_open(conf, mod_id, conf->mm);
+		struct query_module *mod = query_module_open(conf, mod_id, *query_plan,
+		                                             zone_name, conf->mm);
 		if (mod == NULL) {
 			ret = KNOT_ENOMEM;
 			goto activate_error;
@@ -416,14 +442,9 @@ void conf_activate_modules(
 		if ((zone_name == NULL && (mod->scope & MOD_SCOPE_GLOBAL) == 0) ||
 		    (zone_name != NULL && (mod->scope & MOD_SCOPE_ZONE) == 0)) {
 			if (zone_name != NULL) {
-				log_zone_warning(zone_name,
-				                 "out of scope module '%s/%.*s'",
-				                 mod_id->name + 1, (int)mod_id->len,
-				                 mod_id->data);
+				log_zone_warning(zone_name, LOG_ARGS(mod_id, "out of scope"));
 			} else {
-				log_warning("out of scope module '%s/%.*s'",
-				            mod_id->name + 1, (int)mod_id->len,
-				            mod_id->data);
+				log_warning(LOG_ARGS(mod_id, "out of scope"));
 			}
 			query_module_close(mod);
 			conf_val_next(&val);
@@ -431,17 +452,12 @@ void conf_activate_modules(
 		}
 
 		// Load the module.
-		ret = mod->load(*query_plan, mod, zone_name);
+		ret = mod->load(mod);
 		if (ret != KNOT_EOK) {
 			if (zone_name != NULL) {
-				log_zone_error(zone_name,
-				               "failed to load module '%s/%.*s' (%s)",
-				               mod_id->name + 1, (int)mod_id->len,
-				               mod_id->data, knot_strerror(ret));
+				log_zone_error(zone_name, LOG_ARGS(mod_id, "failed to load"));
 			} else {
-				log_error("failed to load global module '%s/%.*s' (%s)",
-				          mod_id->name + 1, (int)mod_id->len,
-				          mod_id->data, knot_strerror(ret));
+				log_error(LOG_ARGS(mod_id, "failed to load"));
 			}
 			query_module_close(mod);
 			conf_val_next(&val);
diff --git a/src/knot/conf/base.h b/src/knot/conf/base.h
index 27f39a4b89719a7c62119111f10835fe967f0129..4cd69f8570f8e81c2873c166ec49ab88c6a4d1b0 100644
--- a/src/knot/conf/base.h
+++ b/src/knot/conf/base.h
@@ -27,6 +27,7 @@
 
 #include "libknot/libknot.h"
 #include "libknot/yparser/ypscheme.h"
+#include "contrib/hat-trie/hat-trie.h"
 #include "contrib/ucw/lists.h"
 
 /*! Default template identifier. */
@@ -37,12 +38,18 @@
 #define CONF_DEFAULT_DBDIR	(STORAGE_DIR "/confdb")
 /*! Maximum depth of nested transactions. */
 #define CONF_MAX_TXN_DEPTH	5
+/*! Maximum number of concurrent DB readers. */
+#define CONF_MAX_DB_READERS	630
 
 /*! Configuration specific logging. */
 #define CONF_LOG(severity, msg, ...) do { \
 	log_msg(severity, "config, " msg, ##__VA_ARGS__); \
 	} while (0)
 
+#define CONF_LOG_ZONE(severity, zone, msg, ...) do { \
+	log_msg_zone(severity, zone, "config, " msg, ##__VA_ARGS__); \
+	} while (0)
+
 /*! Configuration getter output. */
 typedef struct {
 	/*! Item description. */
@@ -81,6 +88,10 @@ typedef struct {
 		knot_db_txn_t *txn;
 		/*! Stack of nested writing transactions. */
 		knot_db_txn_t txn_stack[CONF_MAX_TXN_DEPTH];
+		/*! Master transaction flags. */
+		yp_flag_t flags;
+		/*! Changed zones. */
+		hattrie_t *zones;
 	} io;
 
 	/*! Current config file (for reload if started with config file). */
@@ -97,10 +108,8 @@ typedef struct {
 		int32_t srv_tcp_idle_timeout;
 		int32_t srv_tcp_reply_timeout;
 		int32_t srv_max_tcp_clients;
-		int32_t srv_rate_limit_slip;
 		int32_t ctl_timeout;
 		conf_val_t srv_nsid;
-		conf_val_t srv_rate_limit_whitelist;
 	} cache;
 
 	/*! List of active query modules. */
@@ -119,6 +128,15 @@ typedef enum {
 	CONF_FNOHOSTNAME  = 1 << 2, /*!< Don't set the hostname. */
 } conf_flag_t;
 
+/*!
+ * Configuration update flags.
+ */
+typedef enum {
+	CONF_UPD_FNONE    = 0,      /*!< Empty flag. */
+	CONF_UPD_FMODULES = 1 << 0, /*!< Reuse previous global modules. */
+	CONF_UPD_FCONFIO  = 1 << 1, /*!< Reuse previous cofio reload context. */
+} conf_update_flag_t;
+
 /*!
  * Returns the active configuration.
  */
@@ -177,10 +195,12 @@ int conf_clone(
 /*!
  * Replaces the active configuration with the specified one.
  *
- * \param[in] conf  New configuration.
+ * \param[in] conf   New configuration.
+ * \param[in] flags  Update flags.
  */
 void conf_update(
-	conf_t *conf
+	conf_t *conf,
+	conf_update_flag_t flags
 );
 
 /*!
diff --git a/src/knot/conf/conf.c b/src/knot/conf/conf.c
index 02a0a6b4c1e6395871b6f4e9b66e8e8443a4de58..44eb2c48bc703935b1dc535ebac731823d9e5820 100644
--- a/src/knot/conf/conf.c
+++ b/src/knot/conf/conf.c
@@ -30,15 +30,6 @@
 #include "contrib/wire_ctx.h"
 #include "contrib/openbsd/strlcat.h"
 
-/*! Configuration specific logging. */
-#define CONF_LOG(severity, msg, ...) do { \
-	log_msg(severity, "config, " msg, ##__VA_ARGS__); \
-	} while (0)
-
-#define CONF_LOG_ZONE(severity, zone, msg, ...) do { \
-	log_msg_zone(severity, zone, "config, " msg, ##__VA_ARGS__); \
-	} while (0)
-
 conf_val_t conf_get_txn(
 	conf_t *conf,
 	knot_db_txn_t *txn,
@@ -89,6 +80,7 @@ conf_val_t conf_rawid_get_txn(
 		// FALLTHROUGH
 	case KNOT_EOK:
 	case KNOT_ENOENT:
+	case KNOT_YP_EINVAL_ID:
 		return val;
 	}
 }
@@ -119,6 +111,7 @@ conf_val_t conf_id_get_txn(
 		// FALLTHROUGH
 	case KNOT_EOK:
 	case KNOT_ENOENT:
+	case KNOT_YP_EINVAL_ID:
 		return val;
 	}
 }
@@ -146,6 +139,7 @@ conf_val_t conf_mod_get_txn(
 		// FALLTHROUGH
 	case KNOT_EOK:
 	case KNOT_ENOENT:
+	case KNOT_YP_EINVAL_ID:
 		return val;
 	}
 }
@@ -204,6 +198,7 @@ conf_val_t conf_zone_get_txn(
 		// FALLTHROUGH
 	case KNOT_EOK:
 	case KNOT_ENOENT:
+	case KNOT_YP_EINVAL_ID:
 		break;
 	}
 
@@ -232,6 +227,7 @@ conf_val_t conf_default_get_txn(
 		// FALLTHROUGH
 	case KNOT_EOK:
 	case KNOT_ENOENT:
+	case KNOT_YP_EINVAL_ID:
 		break;
 	}
 
@@ -285,6 +281,7 @@ bool conf_id_exists_txn(
 		CONF_LOG(LOG_ERR, "failed to check '%s' for identifier (%s)",
 		         key0_name + 1, knot_strerror(ret));
 		// FALLTHROUGH
+	case KNOT_ENOENT:
 	case KNOT_YP_EINVAL_ID:
 		return false;
 	}
@@ -841,9 +838,10 @@ static void replace_slashes(
 		}
 	}
 
-	// Remove trailing dot if not root zone.
-	if (remove_dot && ch - name > 1) {
-		*(--ch) = '\0';
+	// Remove trailing dot.
+	if (remove_dot && ch > name) {
+		assert(*(ch - 1) == '.');
+		*(ch - 1) = '\0';
 	}
 }
 
@@ -858,10 +856,8 @@ static int str_char(
 		return KNOT_EINVAL;
 	}
 
-	// Remove the trailing dot.
 	size_t zone_len = strlen(buff);
 	assert(zone_len > 0);
-	buff[zone_len--] = '\0';
 
 	// Get the block length.
 	size_t len = index2 - index1 + 1;
@@ -1054,16 +1050,45 @@ char* conf_zonefile_txn(
 	return get_filename(conf, txn, zone, file);
 }
 
-char* conf_journalfile_txn(
+char* conf_old_journalfile(
 	conf_t *conf,
-	knot_db_txn_t *txn,
 	const knot_dname_t *zone)
 {
 	if (zone == NULL) {
 		return NULL;
 	}
 
-	return get_filename(conf, txn, zone, "%s.db");
+	conf_val_t val = conf_zone_get(conf, C_JOURNAL, zone);
+	const char *journal = conf_str(&val);
+
+	// Use default journalfile name pattern if not specified.
+	if (journal == NULL) {
+		journal = "%s.db";
+	} else {
+		CONF_LOG_ZONE(LOG_NOTICE, zone, "obsolete configuration 'journal', "
+		              "use 'template.journal-db'' instead");
+	}
+
+	val = conf_zone_get(conf, C_MAX_JOURNAL_SIZE, zone);
+	if (val.code == KNOT_EOK) {
+		CONF_LOG_ZONE(LOG_NOTICE, zone, "obsolete configuration 'max-journal-size', "
+		              "use 'max-journal-usage' and 'template.journal-db' instead");
+	}
+
+	return get_filename(conf, &conf->read_txn, zone, journal);
+}
+
+char* conf_journalfile_txn(
+	conf_t *conf,
+	knot_db_txn_t *txn)
+{
+	conf_val_t val = conf_default_get_txn(conf, txn, C_STORAGE);
+	char *storage = conf_abs_path(&val, NULL);
+	val = conf_default_get_txn(conf, txn, C_JOURNAL_DB);
+	char *journaldir = conf_abs_path(&val, storage);
+	free(storage);
+
+	return journaldir;
 }
 
 size_t conf_udp_threads_txn(
diff --git a/src/knot/conf/conf.h b/src/knot/conf/conf.h
index 713ca233eebcec58468f759a483fbf0a21da9d0b..6cfa6cfa2f464a5c345c90ccaa028cb084881165 100644
--- a/src/knot/conf/conf.h
+++ b/src/knot/conf/conf.h
@@ -580,22 +580,23 @@ static inline char* conf_zonefile(
  *
  * \param[in] conf  Configuration.
  * \param[in] txn   Configuration DB transaction.
- * \param[in] zone  Zone name.
  *
  * \return Absolute journal file path string pointer.
  */
 char* conf_journalfile_txn(
 	conf_t *conf,
-	knot_db_txn_t *txn,
-	const knot_dname_t *zone
-);
+	knot_db_txn_t *txn);
 static inline char* conf_journalfile(
-	conf_t *conf,
-	const knot_dname_t *zone)
+	conf_t *conf)
 {
-	return conf_journalfile_txn(conf, &conf->read_txn, zone);
+	return conf_journalfile_txn(conf, &conf->read_txn);
 }
 
+char* conf_old_journalfile(
+	conf_t *conf,
+	const knot_dname_t *zone
+);
+
 /*!
  * Gets the configured number of UDP threads.
  *
diff --git a/src/knot/conf/confio.c b/src/knot/conf/confio.c
index d9ccf82837d64ec93a560ef8a613e9b17c96d2be..422d10ea87aadc4202d9b1a8266951103e22fbbb 100644
--- a/src/knot/conf/confio.c
+++ b/src/knot/conf/confio.c
@@ -79,6 +79,14 @@ int conf_io_begin(
 
 	conf()->io.txn = txn;
 
+	// Reset master transaction flags.
+	if (!child) {
+		conf()->io.flags = CONF_IO_FACTIVE;
+		if (conf()->io.zones != NULL) {
+			hattrie_clear(conf()->io.zones);
+		}
+	}
+
 	return KNOT_EOK;
 }
 
@@ -117,6 +125,14 @@ void conf_io_abort(
 	// Abort the writing transaction.
 	conf()->api->txn_abort(txn);
 	conf()->io.txn = child ? txn - 1 : NULL;
+
+	// Reset master transaction flags.
+	if (!child) {
+		conf()->io.flags = YP_FNONE;
+		if (conf()->io.zones != NULL) {
+			hattrie_clear(conf()->io.zones);
+		}
+	}
 }
 
 static int list_section(
@@ -334,6 +350,114 @@ static int diff_section(
 	return KNOT_EOK;
 }
 
+static int diff_iter_section(
+	conf_io_t *io)
+{
+	// First compare the section with the old and common identifiers.
+	conf_iter_t iter;
+	int ret = conf_db_iter_begin(conf(), &conf()->read_txn, io->key0->name,
+	                             &iter);
+	switch (ret) {
+	case KNOT_EOK:
+		break;
+	case KNOT_ENOENT:
+		return KNOT_EOK;
+	default:
+		return ret;
+	}
+
+	while (ret == KNOT_EOK) {
+		ret = conf_db_iter_id(conf(), &iter, &io->id, &io->id_len);
+		if (ret != KNOT_EOK) {
+			conf_db_iter_finish(conf(), &iter);
+			return ret;
+		}
+
+		ret = diff_section(io);
+		if (ret != KNOT_EOK) {
+			conf_db_iter_finish(conf(), &iter);
+			return ret;
+		}
+
+		ret = conf_db_iter_next(conf(), &iter);
+	}
+	if (ret != KNOT_EOF) {
+		return ret;
+	}
+
+	// Second compare the section with the new identifiers.
+	ret = conf_db_iter_begin(conf(), conf()->io.txn, io->key0->name, &iter);
+	switch (ret) {
+	case KNOT_EOK:
+		break;
+	case KNOT_ENOENT:
+		return KNOT_EOK;
+	default:
+		return ret;
+	}
+
+	while (ret == KNOT_EOK) {
+		ret = conf_db_iter_id(conf(), &iter, &io->id, &io->id_len);
+		if (ret != KNOT_EOK) {
+			conf_db_iter_finish(conf(), &iter);
+			return ret;
+		}
+
+		// Ignore old and common identifiers.
+		ret = conf_db_get(conf(), &conf()->read_txn, io->key0->name,
+		                  NULL, io->id, io->id_len, NULL);
+		switch (ret) {
+		case KNOT_EOK:
+			ret = conf_db_iter_next(conf(), &iter);
+			continue;
+		case KNOT_ENOENT:
+		case KNOT_YP_EINVAL_ID:
+			break;
+		default:
+			conf_db_iter_finish(conf(), &iter);
+			return ret;
+		}
+
+		ret = diff_section(io);
+		if (ret != KNOT_EOK) {
+			conf_db_iter_finish(conf(), &iter);
+			return ret;
+		}
+
+		ret = conf_db_iter_next(conf(), &iter);
+	}
+	if (ret != KNOT_EOF) {
+		return ret;
+	}
+
+	return KNOT_EOK;
+}
+
+static int diff_zone_section(
+	conf_io_t *io)
+{
+	assert(io->key0->flags & CONF_IO_FZONE);
+
+	if (conf()->io.zones == NULL) {
+		return KNOT_EOK;
+	}
+
+	hattrie_iter_t *it = hattrie_iter_begin(conf()->io.zones);
+	for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
+		io->id = (const uint8_t *)hattrie_iter_key(it, &io->id_len);
+
+		// Get the difference for specific zone.
+		int ret = diff_section(io);
+		if (ret != KNOT_EOK) {
+			hattrie_iter_free(it);
+			return ret;
+		}
+	}
+	hattrie_iter_free(it);
+
+	return KNOT_EOK;
+}
+
 int conf_io_diff(
 	const char *key0,
 	const char *key1,
@@ -410,79 +534,22 @@ int conf_io_diff(
 
 	// Compare the section with all identifiers by default.
 	if ((io->key0->flags & YP_FMULTI) != 0 && io->id_len == 0) {
-		// First compare the section with the old and common identifiers.
-		conf_iter_t iter;
-		ret = conf_db_iter_begin(conf(), &conf()->read_txn,
-		                         io->key0->name, &iter);
-		switch (ret) {
-		case KNOT_EOK:
-		case KNOT_ENOENT:
-			break;
-		default:
-			goto diff_error;
-		}
-
-		while (ret == KNOT_EOK) {
-			// Set the section identifier.
-			ret = conf_db_iter_id(conf(), &iter, &io->id, &io->id_len);
-			if (ret != KNOT_EOK) {
-				conf_db_iter_finish(conf(), &iter);
-				return ret;
+		// The zone section has an optimized diff.
+		if (io->key0->flags & CONF_IO_FZONE) {
+			// Full diff by default.
+			if (!(conf()->io.flags & CONF_IO_FACTIVE)) {
+				ret = diff_iter_section(io);
+			// Full diff if all zones changed.
+			} else if (conf()->io.flags & CONF_IO_FDIFF_ZONES) {
+				ret = diff_iter_section(io);
+			// Optimized diff for specific zones.
+			} else {
+				ret = diff_zone_section(io);
 			}
-
-			ret = diff_section(io);
-			if (ret != KNOT_EOK) {
-				conf_db_iter_finish(conf(), &iter);
-				return ret;
-			}
-
-			ret = conf_db_iter_next(conf(), &iter);
-		}
-
-		// Second compare the section with the new identifiers.
-		ret = conf_db_iter_begin(conf(), conf()->io.txn, io->key0->name,
-		                         &iter);
-		switch (ret) {
-		case KNOT_EOK:
-		case KNOT_ENOENT:
-			break;
-		default:
-			goto diff_error;
-		}
-
-		while (ret == KNOT_EOK) {
-			// Set the section identifier.
-			ret = conf_db_iter_id(conf(), &iter, &io->id, &io->id_len);
-			if (ret != KNOT_EOK) {
-				conf_db_iter_finish(conf(), &iter);
-				return ret;
-			}
-
-			// Ignore old and common identifiers.
-			ret = conf_db_get(conf(), &conf()->read_txn, io->key0->name,
-			                  NULL, io->id, io->id_len, NULL);
-			switch (ret) {
-			case KNOT_EOK:
-				ret = conf_db_iter_next(conf(), &iter);
-				continue;
-			case KNOT_ENOENT:
-			case KNOT_YP_EINVAL_ID:
-				break;
-			default:
-				conf_db_iter_finish(conf(), &iter);
-				return ret;
-			}
-
-			ret = diff_section(io);
-			if (ret != KNOT_EOK) {
-				conf_db_iter_finish(conf(), &iter);
-				return ret;
-			}
-
-			ret = conf_db_iter_next(conf(), &iter);
+		} else {
+			ret = diff_iter_section(io);
 		}
 
-		ret = KNOT_EOK;
 		goto diff_error;
 	}
 
@@ -709,6 +776,95 @@ get_error:
 	return ret;
 }
 
+static void upd_changes(
+	const conf_io_t *io,
+	conf_io_type_t type,
+	yp_flag_t flags,
+	bool any_id)
+{
+	// Update common flags.
+	conf()->io.flags |= flags;
+
+	// Return if not important change.
+	if (type == CONF_IO_TNONE) {
+		return;
+	}
+
+	// Update reference item.
+	if (flags & CONF_IO_FREF) {
+		// Expected an identifier, which cannot be changed.
+		assert(type != CONF_IO_TCHANGE);
+
+		// Re-check and reload all zones if a reference has been removed.
+		if (type == CONF_IO_TUNSET) {
+			conf()->io.flags |= CONF_IO_FCHECK_ZONES | CONF_IO_FRLD_ZONES;
+		}
+		return;
+	// Return if no specific zone operation.
+	} else if (!(flags & CONF_IO_FZONE)) {
+		return;
+	}
+
+	// Don't process each zone individually, process all instead.
+	if (any_id) {
+		// Diff all zone changes.
+		conf()->io.flags |= CONF_IO_FCHECK_ZONES | CONF_IO_FDIFF_ZONES;
+
+		// Reload just with important changes.
+		if (flags & CONF_IO_FRLD_ZONE) {
+			conf()->io.flags |= CONF_IO_FRLD_ZONES;
+		}
+		return;
+	}
+
+	// Prepare zone changes storage if it doesn't exist.
+	hattrie_t *zones = conf()->io.zones;
+	if (zones == NULL) {
+		zones = hattrie_create(conf()->mm);
+		if (zones == NULL) {
+			return;
+		}
+		conf()->io.zones = zones;
+	}
+
+	// Get zone status or create new.
+	value_t *val = hattrie_get(zones, (const char *)io->id, io->id_len);
+	conf_io_type_t *current = (conf_io_type_t *)val;
+
+	switch (type) {
+	case CONF_IO_TSET:
+		// Revert remove zone, but don't remove (probably changed).
+		if (*current & CONF_IO_TUNSET) {
+			*current &= ~CONF_IO_TUNSET;
+		} else {
+			// Must be a new zone.
+			assert(*current == CONF_IO_TNONE);
+			// Mark added zone.
+			*current = type;
+		}
+		break;
+	case CONF_IO_TUNSET:
+		if (*current & CONF_IO_TSET) {
+			// Remove inserted zone -> no change.
+			hattrie_del(zones, (const char *)io->id, io->id_len, NULL);
+		} else {
+			// Remove existing zone.
+			*current |= type;
+		}
+		break;
+	case CONF_IO_TCHANGE:
+		*current |= type;
+		// Mark zone to reload if required.
+		if (flags & CONF_IO_FRLD_ZONE) {
+			*current |= CONF_IO_TRELOAD;
+		}
+		break;
+	case CONF_IO_TRELOAD:
+	default:
+		assert(0);
+	}
+}
+
 static int set_item(
 	conf_io_t *io)
 {
@@ -720,42 +876,28 @@ static int set_item(
 	}
 
 	// Postpone group callbacks to config check.
-	if (io->key0->type != YP_TGRP) {
-		conf_check_t args = {
-			.conf = conf(),
-			.txn = conf()->io.txn,
-			.item = (io->key1 != NULL) ? io->key1 : io->key0,
-			.id = io->id,
-			.id_len = io->id_len,
-			.data = io->data.bin,
-			.data_len = io->data.bin_len
-		};
-
-		// Call the item callbacks.
-		io->error.code = conf_exec_callbacks(&args);
-		if (io->error.code != KNOT_EOK) {
-			io->error.str = args.err_str;
-			ret = FCN(io);
-			if (ret == KNOT_EOK) {
-				ret = io->error.code;
-			}
-		}
+	if (io->key0->type == YP_TGRP) {
+		return KNOT_EOK;
 	}
 
-	return ret;
+	conf_check_t args = {
+		.conf = conf(),
+		.txn = conf()->io.txn,
+		.item = (io->key1 != NULL) ? io->key1 : io->key0,
+		.data = io->data.bin,
+		.data_len = io->data.bin_len
+	};
+
+	// Call the item callbacks (include).
+	return conf_exec_callbacks(&args);
 }
 
 int conf_io_set(
 	const char *key0,
 	const char *key1,
 	const char *id,
-	const char *data,
-	conf_io_t *io)
+	const char *data)
 {
-	if (io == NULL) {
-		return KNOT_EINVAL;
-	}
-
 	assert(conf() != NULL);
 
 	if (conf()->io.txn == NULL) {
@@ -781,9 +923,16 @@ int conf_io_set(
 	yp_node_t *node = &ctx->nodes[ctx->current];
 	yp_node_t *parent = node->parent;
 
+	yp_flag_t upd_flags = node->item->flags;
+	conf_io_type_t upd_type = CONF_IO_TNONE;
+
+	conf_io_t io = { NULL };
+
 	// Key1 is not a group identifier.
 	if (parent != NULL) {
-		io_reset_bin(io, parent->item, node->item, parent->id,
+		upd_type = CONF_IO_TCHANGE;
+		upd_flags |= parent->item->flags;
+		io_reset_bin(&io, parent->item, node->item, parent->id,
 		             parent->id_len, node->data, node->data_len);
 	// No key1 but a group identifier.
 	} else if (node->id_len != 0) {
@@ -791,11 +940,13 @@ int conf_io_set(
 		       (node->item->flags & YP_FMULTI) != 0);
 		assert(node->data_len == 0);
 
-		io_reset_bin(io, node->item, node->item->var.g.id, node->id,
+		upd_type = CONF_IO_TSET;
+		upd_flags |= node->item->var.g.id->flags;
+		io_reset_bin(&io, node->item, node->item->var.g.id, node->id,
 		             node->id_len, NULL, 0);
 	// Ensure some data for non-group items (include).
 	} else if (node->item->type == YP_TGRP || node->data_len != 0) {
-		io_reset_bin(io, node->item, NULL, node->id, node->id_len,
+		io_reset_bin(&io, node->item, NULL, node->id, node->id_len,
 		             node->data, node->data_len);
 	// Non-group without data.
 	} else {
@@ -804,10 +955,10 @@ int conf_io_set(
 	}
 
 	// Set the item for all identifiers by default.
-	if (io->key0->type == YP_TGRP && io->key1 != NULL &&
-	    (io->key0->flags & YP_FMULTI) != 0 && io->id_len == 0) {
+	if (io.key0->type == YP_TGRP && io.key1 != NULL &&
+	    (io.key0->flags & YP_FMULTI) != 0 && io.id_len == 0) {
 		conf_iter_t iter;
-		ret = conf_db_iter_begin(conf(), conf()->io.txn, io->key0->name,
+		ret = conf_db_iter_begin(conf(), conf()->io.txn, io.key0->name,
 		                         &iter);
 		switch (ret) {
 		case KNOT_EOK:
@@ -821,14 +972,14 @@ int conf_io_set(
 
 		while (ret == KNOT_EOK) {
 			// Get the identifier.
-			ret = conf_db_iter_id(conf(), &iter, &io->id, &io->id_len);
+			ret = conf_db_iter_id(conf(), &iter, &io.id, &io.id_len);
 			if (ret != KNOT_EOK) {
 				conf_db_iter_finish(conf(), &iter);
 				goto set_error;
 			}
 
 			// Set the data.
-			ret = set_item(io);
+			ret = set_item(&io);
 			if (ret != KNOT_EOK) {
 				conf_db_iter_finish(conf(), &iter);
 				goto set_error;
@@ -840,12 +991,18 @@ int conf_io_set(
 			goto set_error;
 		}
 
+		upd_changes(&io, upd_type, upd_flags, true);
+
 		ret = KNOT_EOK;
 		goto set_error;
 	}
 
 	// Set the item with a possible identifier.
-	ret = set_item(io);
+	ret = set_item(&io);
+
+	if (ret == KNOT_EOK) {
+		upd_changes(&io, upd_type, upd_flags, false);
+	}
 set_error:
 	yp_scheme_check_deinit(ctx);
 
@@ -855,14 +1012,14 @@ set_error:
 static int unset_section_data(
 	conf_io_t *io)
 {
-	// Delete the value for the specified item.
+	// Unset the value for the specified item.
 	if (io->key1 != NULL) {
 		return conf_db_unset(conf(), conf()->io.txn, io->key0->name,
 		                     io->key1->name, io->id, io->id_len,
 		                     io->data.bin, io->data.bin_len, false);
 	}
 
-	// Delete the whole section by default.
+	// Unset the whole section by default.
 	for (yp_item_t *i = io->key0->sub_items; i->name != NULL; i++) {
 		// Skip the identifier item.
 		if ((io->key0->flags & YP_FMULTI) != 0 && io->key0->var.g.id == i) {
@@ -887,7 +1044,7 @@ static int unset_section_data(
 static int unset_section(
 	const yp_item_t *key0)
 {
-	// Delete the section items.
+	// Unset the section items.
 	for (yp_item_t *i = key0->sub_items; i->name != NULL; i++) {
 		// Skip the identifier item.
 		if ((key0->flags & YP_FMULTI) != 0 && key0->var.g.id == i) {
@@ -905,7 +1062,7 @@ static int unset_section(
 		}
 	}
 
-	// Delete the section.
+	// Unset the section.
 	int ret = conf_db_unset(conf(), conf()->io.txn, key0->name, NULL, NULL,
 	                        0, NULL, 0, false);
 	switch (ret) {
@@ -929,7 +1086,7 @@ int conf_io_unset(
 		return KNOT_TXN_ENOTEXISTS;
 	}
 
-	// Delete all sections by default.
+	// Unset all sections by default.
 	if (key0 == NULL) {
 		for (yp_item_t *i = conf()->scheme; i->name != NULL; i++) {
 			// Skip non-group item.
@@ -964,12 +1121,26 @@ int conf_io_unset(
 	yp_node_t *node = &ctx->nodes[ctx->current];
 	yp_node_t *parent = node->parent;
 
+	yp_flag_t upd_flags = node->item->flags;
+	conf_io_type_t upd_type = CONF_IO_TNONE;
+
 	conf_io_t io = { NULL };
 
+	// Key1 is not a group identifier.
 	if (parent != NULL) {
+		upd_type = CONF_IO_TCHANGE;
+		upd_flags |= parent->item->flags;
 		io_reset_bin(&io, parent->item, node->item, parent->id,
 		             parent->id_len, node->data, node->data_len);
+	// No key1 but a group identifier or whole group.
 	} else {
+		if (node->id_len != 0) {
+			assert(node->item->type == YP_TGRP &&
+			       (node->item->flags & YP_FMULTI) != 0);
+
+			upd_type = CONF_IO_TUNSET;
+			upd_flags |= node->item->var.g.id->flags;
+		}
 		io_reset_bin(&io, node->item, NULL, node->id, node->id_len,
 		             node->data, node->data_len);
 	}
@@ -980,7 +1151,7 @@ int conf_io_unset(
 		goto unset_error;
 	}
 
-	// Delete the section with all identifiers by default.
+	// Unset the section with all identifiers by default.
 	if ((io.key0->flags & YP_FMULTI) != 0 && io.id_len == 0) {
 		conf_iter_t iter;
 		ret = conf_db_iter_begin(conf(), conf()->io.txn, io.key0->name,
@@ -1003,7 +1174,7 @@ int conf_io_unset(
 				goto unset_error;
 			}
 
-			// Delete the section data.
+			// Unset the section data.
 			ret = unset_section_data(&io);
 			switch (ret) {
 			case KNOT_EOK:
@@ -1021,7 +1192,7 @@ int conf_io_unset(
 		}
 
 		if (io.key1 == NULL) {
-			// Delete all identifiers.
+			// Unset all identifiers.
 			ret = conf_db_iter_begin(conf(), conf()->io.txn,
 			                         io.key0->name, &iter);
 			switch (ret) {
@@ -1047,32 +1218,34 @@ int conf_io_unset(
 				goto unset_error;
 			}
 
-			// Delete the section.
+			// Unset the section.
 			ret = unset_section(io.key0);
 			if (ret != KNOT_EOK) {
 				goto unset_error;
 			}
 		}
 
+		upd_changes(&io, upd_type, upd_flags, true);
+
 		ret = KNOT_EOK;
 		goto unset_error;
 	}
 
-	// Delete the section data.
+	// Unset the section data.
 	ret = unset_section_data(&io);
 	if (ret != KNOT_EOK) {
 		goto unset_error;
 	}
 
 	if (io.key1 == NULL) {
-		// Delete the identifier.
+		// Unset the identifier.
 		if (io.id_len != 0) {
 			ret = conf_db_unset(conf(), conf()->io.txn, io.key0->name,
 			                    NULL, io.id, io.id_len, NULL, 0, false);
 			if (ret != KNOT_EOK) {
 				goto unset_error;
 			}
-		// Delete the section.
+		// Unset the section.
 		} else {
 			ret = unset_section(io.key0);
 			if (ret != KNOT_EOK) {
@@ -1080,6 +1253,10 @@ int conf_io_unset(
 			}
 		}
 	}
+
+	if (ret == KNOT_EOK) {
+		upd_changes(&io, upd_type, upd_flags, false);
+	}
 unset_error:
 	yp_scheme_check_deinit(ctx);
 
@@ -1171,6 +1348,80 @@ check_section_error:
 	return ret;
 }
 
+static int check_iter_section(
+	const yp_item_t *item,
+	conf_io_t *io)
+{
+	// Iterate over all identifiers.
+	conf_iter_t iter;
+	int ret = conf_db_iter_begin(conf(), conf()->io.txn, item->name, &iter);
+	switch (ret) {
+	case KNOT_EOK:
+		break;
+	case KNOT_ENOENT:
+		return KNOT_EOK;
+	default:
+		return ret;
+	}
+
+	while (ret == KNOT_EOK) {
+		size_t id_len;
+		const uint8_t *id;
+		ret = conf_db_iter_id(conf(), &iter, &id, &id_len);
+		if (ret != KNOT_EOK) {
+			conf_db_iter_finish(conf(), &iter);
+			return ret;
+		}
+
+		// Check specific section item.
+		ret = check_section(item, id, id_len, io);
+		if (ret != KNOT_EOK) {
+			conf_db_iter_finish(conf(), &iter);
+			return ret;
+		}
+
+		ret = conf_db_iter_next(conf(), &iter);
+	}
+	if (ret != KNOT_EOF) {
+		return ret;
+	}
+
+	return KNOT_EOK;
+}
+
+static int check_zone_section(
+	const yp_item_t *item,
+	conf_io_t *io)
+{
+	assert(item->flags & CONF_IO_FZONE);
+
+	if (conf()->io.zones == NULL) {
+		return KNOT_EOK;
+	}
+
+	hattrie_iter_t *it = hattrie_iter_begin(conf()->io.zones);
+	for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
+		size_t id_len;
+		const uint8_t *id = (const uint8_t *)hattrie_iter_key(it, &id_len);
+
+		conf_io_type_t type = (conf_io_type_t)(*hattrie_iter_val(it));
+		if (type == CONF_IO_TUNSET) {
+			// Nothing to check.
+			continue;
+		}
+
+		// Check specific zone.
+		int ret = check_section(item, id, id_len, io);
+		if (ret != KNOT_EOK) {
+			hattrie_iter_free(it);
+			return ret;
+		}
+	}
+	hattrie_iter_free(it);
+
+	return KNOT_EOK;
+}
+
 int conf_io_check(
 	conf_io_t *io)
 {
@@ -1199,41 +1450,25 @@ int conf_io_check(
 			if (ret != KNOT_EOK) {
 				goto check_error;
 			}
-
-			continue;
-		}
-
-		// Iterate over all identifiers.
-		conf_iter_t iter;
-		ret = conf_db_iter_begin(conf(), conf()->io.txn, item->name, &iter);
-		switch (ret) {
-		case KNOT_EOK:
-			break;
-		case KNOT_ENOENT:
 			continue;
-		default:
-			goto check_error;
 		}
 
-		while (ret == KNOT_EOK) {
-			const uint8_t *id;
-			size_t id_len;
-			ret = conf_db_iter_id(conf(), &iter, &id, &id_len);
-			if (ret != KNOT_EOK) {
-				conf_db_iter_finish(conf(), &iter);
-				goto check_error;
+		// The zone section has an optimized check.
+		if (item->flags & CONF_IO_FZONE) {
+			// Full check by default.
+			if (!(conf()->io.flags & CONF_IO_FACTIVE)) {
+				ret = check_iter_section(item, io);
+			// Full check if all zones changed.
+			} else if (conf()->io.flags & CONF_IO_FCHECK_ZONES) {
+				ret = check_iter_section(item, io);
+			// Optimized check for specific zones.
+			} else {
+				ret = check_zone_section(item, io);
 			}
-
-			// Check group with identifiers.
-			ret = check_section(item, id, id_len, io);
-			if (ret != KNOT_EOK) {
-				conf_db_iter_finish(conf(), &iter);
-				goto check_error;
-			}
-
-			ret = conf_db_iter_next(conf(), &iter);
+		} else {
+			ret = check_iter_section(item, io);
 		}
-		if (ret != KNOT_EOF) {
+		if (ret != KNOT_EOK) {
 			goto check_error;
 		}
 	}
diff --git a/src/knot/conf/confio.h b/src/knot/conf/confio.h
index 49c09c396921508ba8519141d71b4e1bd0eeb8ff..cf3a043a151c226ad0bc5fd6a70a957e1b234ad3 100644
--- a/src/knot/conf/confio.h
+++ b/src/knot/conf/confio.h
@@ -27,6 +27,29 @@
 
 #include "knot/conf/conf.h"
 
+/*! Configuration schema additional flags for dynamic changes. */
+#define CONF_IO_FACTIVE		YP_FUSR1  /*!< Active confio transaction indicator. */
+#define CONF_IO_FZONE		YP_FUSR2  /*!< Zone section indicator. */
+#define CONF_IO_FREF		YP_FUSR3  /*!< Possibly referenced id from a zone. */
+#define CONF_IO_FDIFF_ZONES	YP_FUSR4  /*!< All zones config has changed. */
+#define CONF_IO_FCHECK_ZONES	YP_FUSR5  /*!< All zones config needs to check. */
+#define CONF_IO_FRLD_SRV	YP_FUSR6  /*!< Reload server. */
+#define CONF_IO_FRLD_LOG	YP_FUSR7  /*!< Reload logging. */
+#define CONF_IO_FRLD_MOD	YP_FUSR8  /*!< Reload global modules. */
+#define CONF_IO_FRLD_ZONE	YP_FUSR9  /*!< Reload a specific zone. */
+#define CONF_IO_FRLD_ZONES	YP_FUSR10 /*!< Reload all zones. */
+#define CONF_IO_FRLD_ALL	(CONF_IO_FRLD_SRV | CONF_IO_FRLD_LOG | \
+				 CONF_IO_FRLD_MOD | CONF_IO_FRLD_ZONES)
+
+/*! Zone configuration change type. */
+typedef enum {
+	CONF_IO_TNONE   = 0,      /*!< Unspecified. */
+	CONF_IO_TSET    = 1 << 0, /*!< Zone added. */
+	CONF_IO_TUNSET  = 1 << 1, /*!< Zone removed. */
+	CONF_IO_TCHANGE = 1 << 2, /*!< Zone has changed configuration. */
+	CONF_IO_TRELOAD = 1 << 3, /*!< Zone must be reloaded. */
+} conf_io_type_t;
+
 /*! Configuration interface output. */
 typedef struct conf_io conf_io_t;
 struct conf_io {
@@ -165,7 +188,6 @@ int conf_io_get(
  * \param[in] key1  Item name (NULL to add identifier only).
  * \param[in] id    Section identifier name (NULL to consider all section identifiers).
  * \param[in] data  Item data to set/add.
- * \param[out] io   Operation output (callback error output).
  *
  * \return Error code, KNOT_EOK if success.
  */
@@ -173,8 +195,7 @@ int conf_io_set(
 	const char *key0,
 	const char *key1,
 	const char *id,
-	const char *data,
-	conf_io_t *io
+	const char *data
 );
 
 /*!
diff --git a/src/knot/conf/migration.c b/src/knot/conf/migration.c
new file mode 100644
index 0000000000000000000000000000000000000000..08099ce3e4bf2b9f66977ef4b54c3e4818d0424f
--- /dev/null
+++ b/src/knot/conf/migration.c
@@ -0,0 +1,133 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "knot/common/log.h"
+#include "knot/conf/migration.h"
+#include "knot/conf/confdb.h"
+
+static void try_unset(conf_t *conf, knot_db_txn_t *txn, yp_name_t *key0, yp_name_t *key1)
+{
+	int ret = conf_db_unset(conf, txn, key0, key1, NULL, 0, NULL, 0, true);
+	if (ret != KNOT_EOK && ret != KNOT_ENOENT) {
+		log_warning("conf, migration, failed to unset '%s%s%s' (%s)",
+		            key0 + 1,
+		            (key1 != NULL) ? "/"      : "",
+		            (key1 != NULL) ? key1 + 1 : "",
+		            knot_strerror(ret));
+	}
+}
+
+#define check_set(conf, txn, key0, key1, id, id_len, data, data_len) \
+	ret = conf_db_set(conf, txn, key0, key1, id, id_len, data, data_len); \
+	if (ret != KNOT_EOK && ret != KNOT_CONF_EREDEFINE) { \
+		log_error("conf, migration, failed to set '%s%s%s' (%s)", \
+		          key0 + 1, \
+		          (key1 != NULL) ? "/"      : "", \
+		          (key1 != NULL) ? key1 + 1 : "", \
+		          knot_strerror(ret)); \
+		return ret; \
+	}
+
+static int migrate_rrl(
+	conf_t *conf,
+	knot_db_txn_t *txn)
+{
+	#define MOD_RRL		"\x07""mod-rrl"
+	#define MOD_RATE_LIMIT	"\x0A""rate-limit"
+	#define MOD_SLIP	"\x04""slip"
+	#define MOD_TBL_SIZE	"\x0A""table-size"
+	#define MOD_WHITELIST	"\x09""whitelist"
+
+	const uint8_t *id = CONF_DEFAULT_ID + 1;
+	const size_t id_len = CONF_DEFAULT_ID[0];
+	const uint8_t *dflt_rrl = (const uint8_t *)MOD_RRL "default\0";
+	const size_t dflt_rrl_len = 16;
+
+	conf_val_t val;
+	int ret = conf_db_get(conf, txn, C_SRV, C_RATE_LIMIT, NULL, 0, &val);
+
+	// Migrate old configuration if RRL enabled.
+	if (ret == KNOT_EOK && conf_int(&val) > 0) {
+		log_notice("config, migrating RRL configuration from server to mod-rrl");
+
+		// Create equivalent mod-rrl configuration.
+		check_set(conf, txn, MOD_RRL, C_ID, id, id_len, NULL, 0);
+		check_set(conf, txn, MOD_RRL, MOD_RATE_LIMIT, id, id_len,
+		          val.data, val.len);
+
+		conf_db_get(conf, txn, C_SRV, C_RATE_LIMIT_SLIP, NULL, 0, &val);
+		if (val.code == KNOT_EOK) {
+			conf_val(&val);
+			check_set(conf, txn, MOD_RRL, MOD_SLIP, id, id_len,
+			          val.data, val.len);
+		}
+
+		conf_db_get(conf, txn, C_SRV, C_RATE_LIMIT_TBL_SIZE, NULL, 0, &val);
+		if (val.code == KNOT_EOK) {
+			conf_val(&val);
+			check_set(conf, txn, MOD_RRL, MOD_TBL_SIZE, id, id_len,
+			          val.data, val.len);
+		}
+
+		conf_db_get(conf, txn, C_SRV, C_RATE_LIMIT_WHITELIST, NULL, 0, &val);
+		while (val.code == KNOT_EOK) {
+			conf_val(&val);
+			check_set(conf, txn, MOD_RRL, MOD_WHITELIST, id, id_len,
+			          val.data, val.len);
+			conf_val_next(&val);
+		}
+
+		// Create default template and assing global module.
+		check_set(conf, txn, C_TPL, C_ID, id, id_len, NULL, 0);
+		check_set(conf, txn, C_TPL, C_GLOBAL_MODULE, id, id_len,
+		          dflt_rrl, dflt_rrl_len);
+	}
+
+	// Drop old RRL configuration.
+	try_unset(conf, txn, C_SRV, C_RATE_LIMIT);
+	try_unset(conf, txn, C_SRV, C_RATE_LIMIT_SLIP);
+	try_unset(conf, txn, C_SRV, C_RATE_LIMIT_TBL_SIZE);
+	try_unset(conf, txn, C_SRV, C_RATE_LIMIT_WHITELIST);
+
+	return KNOT_EOK;
+}
+
+int conf_migrate(
+	conf_t *conf)
+{
+	if (conf == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	knot_db_txn_t txn;
+	int ret = conf->api->txn_begin(conf->db, &txn, 0);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	ret = migrate_rrl(conf, &txn);
+	if (ret != KNOT_EOK) {
+		conf->api->txn_abort(&txn);
+		return ret;
+	}
+
+	ret = conf->api->txn_commit(&txn);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	return conf_refresh_txn(conf);
+}
diff --git a/src/knot/conf/migration.h b/src/knot/conf/migration.h
new file mode 100644
index 0000000000000000000000000000000000000000..dd7912f70d09cd5bd1e2fa6a50a2f37efc467159
--- /dev/null
+++ b/src/knot/conf/migration.h
@@ -0,0 +1,30 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "knot/conf/base.h"
+
+/*!
+ * Migrates from an old configuration schema.
+ *
+ * \param[in] conf  Configuration.
+ *
+ * \return Error code, KNOT_EOK if success.
+ */
+int conf_migrate(
+	conf_t *conf
+);
diff --git a/src/knot/conf/scheme.c b/src/knot/conf/scheme.c
index 2a074fa4c0e416d11dd50137994e4e6672b35c7d..1dfd68ea96f6507ff45b1f814388939a524dbbd3 100644
--- a/src/knot/conf/scheme.c
+++ b/src/knot/conf/scheme.c
@@ -20,29 +20,42 @@
 #include <stdint.h>
 
 #include "knot/conf/scheme.h"
+#include "knot/conf/confio.h"
 #include "knot/conf/tools.h"
 #include "knot/common/log.h"
-#include "knot/server/rrl.h"
 #include "knot/updates/acl.h"
 #include "libknot/rrtype/opt.h"
 #include "dnssec/lib/dnssec/tsig.h"
 #include "dnssec/lib/dnssec/key.h"
 
-#include "knot/modules/synth_record.h"
-#include "knot/modules/dnsproxy.h"
-#include "knot/modules/online_sign/module.h"
+#include "knot/modules/rrl/rrl.h"
+#include "knot/modules/stats/stats.h"
+#include "knot/modules/synth_record/synth_record.h"
+#include "knot/modules/dnsproxy/dnsproxy.h"
+#include "knot/modules/online_sign/online_sign.h"
 #ifdef HAVE_ROSEDB
-#include "knot/modules/rosedb.h"
+#include "knot/modules/rosedb/rosedb.h"
 #endif
 #if USE_DNSTAP
-#include "knot/modules/dnstap.h"
+#include "knot/modules/dnstap/dnstap.h"
 #endif
-#include "knot/modules/whoami.h"
-#include "knot/modules/noudp.h"
+#include "knot/modules/whoami/whoami.h"
+#include "knot/modules/noudp/noudp.h"
 
 #define HOURS(x)	((x) * 3600)
 #define DAYS(x)		((x) * HOURS(24))
 
+#define KILO(x)		(1024LLU * (x))
+#define MEGA(x)		(KILO(1024) * (x))
+#define GIGA(x)		(MEGA(1024) * (x))
+#define TERA(x)		(GIGA(1024) * (x))
+
+#define VIRT_MEM_TOP_32BIT	GIGA(2)
+#define VIRT_MEM_LIMIT(x)	(((sizeof(void *) < 8) && ((x) > VIRT_MEM_TOP_32BIT)) \
+				 ? VIRT_MEM_TOP_32BIT : (x))
+
+#define FMOD		(YP_FMULTI | CONF_IO_FRLD_MOD | CONF_IO_FRLD_ZONES)
+
 static const knot_lookup_t keystore_backends[] = {
 	{ KEYSTORE_BACKEND_PEM,    "pem" },
 	{ KEYSTORE_BACKEND_PKCS11, "pkcs11" },
@@ -118,13 +131,14 @@ static const yp_item_t desc_server[] = {
 	{ C_MAX_IPV6_UDP_PAYLOAD, YP_TINT,  YP_VINT = { KNOT_EDNS_MIN_UDP_PAYLOAD,
 	                                                KNOT_EDNS_MAX_UDP_PAYLOAD,
 	                                                4096, YP_SSIZE } },
+	{ C_LISTEN,               YP_TADDR, YP_VADDR = { 53 }, YP_FMULTI },
+	{ C_COMMENT,              YP_TSTR,  YP_VNONE },
+	/* Obsolete items. */
 	{ C_RATE_LIMIT,           YP_TINT,  YP_VINT = { 0, INT32_MAX, 0 } },
-	{ C_RATE_LIMIT_SLIP,      YP_TINT,  YP_VINT = { 0, RRL_SLIP_MAX, 1 } },
+	{ C_RATE_LIMIT_SLIP,      YP_TINT,  YP_VINT = { 0, 100, 1 } },
 	{ C_RATE_LIMIT_TBL_SIZE,  YP_TINT,  YP_VINT = { 1, INT32_MAX, 393241 } },
 	{ C_RATE_LIMIT_WHITELIST, YP_TDATA, YP_VDATA = { 0, NULL, addr_range_to_bin,
 	                                                 addr_range_to_txt }, YP_FMULTI },
-	{ C_LISTEN,               YP_TADDR, YP_VADDR = { 53 }, YP_FMULTI },
-	{ C_COMMENT,              YP_TSTR,  YP_VNONE },
 	{ NULL }
 };
 
@@ -138,37 +152,57 @@ static const yp_item_t desc_control[] = {
 static const yp_item_t desc_log[] = {
 	{ C_TARGET,  YP_TSTR, YP_VNONE },
 	{ C_SERVER,  YP_TOPT, YP_VOPT = { log_severities, 0 } },
+	{ C_CTL,     YP_TOPT, YP_VOPT = { log_severities, 0 } },
 	{ C_ZONE,    YP_TOPT, YP_VOPT = { log_severities, 0 } },
 	{ C_ANY,     YP_TOPT, YP_VOPT = { log_severities, 0 } },
 	{ C_COMMENT, YP_TSTR, YP_VNONE },
 	{ NULL }
 };
 
+static const yp_item_t desc_stats[] = {
+	{ C_TIMER,  YP_TINT,  YP_VINT = { 1, UINT32_MAX, 0, YP_STIME } },
+	{ C_FILE,   YP_TSTR,  YP_VSTR = { "stats.yaml" } },
+	{ C_APPEND, YP_TBOOL, YP_VNONE },
+	{ NULL }
+};
+
 static const yp_item_t desc_keystore[] = {
 	{ C_ID,      YP_TSTR, YP_VNONE },
-	{ C_BACKEND, YP_TOPT, YP_VOPT = { keystore_backends, KEYSTORE_BACKEND_PEM } },
-	{ C_CONFIG,  YP_TSTR, YP_VSTR = { "keys" } },
+	{ C_BACKEND, YP_TOPT, YP_VOPT = { keystore_backends, KEYSTORE_BACKEND_PEM },
+	                      CONF_IO_FRLD_ZONES },
+	{ C_CONFIG,  YP_TSTR, YP_VSTR = { "keys" }, CONF_IO_FRLD_ZONES },
 	{ C_COMMENT, YP_TSTR, YP_VNONE },
 	{ NULL }
 };
 
 static const yp_item_t desc_policy[] = {
-	{ C_ID,                  YP_TSTR,  YP_VNONE },
-	{ C_KEYSTORE,            YP_TREF,  YP_VREF = { C_KEYSTORE }, YP_FNONE, { check_ref_dflt } },
-	{ C_MANUAL,              YP_TBOOL, YP_VNONE },
+	{ C_ID,                  YP_TSTR,  YP_VNONE, CONF_IO_FREF },
+	{ C_KEYSTORE,            YP_TREF,  YP_VREF = { C_KEYSTORE }, CONF_IO_FRLD_ZONES,
+	                                   { check_ref_dflt } },
+	{ C_MANUAL,              YP_TBOOL, YP_VNONE, CONF_IO_FRLD_ZONES },
+	{ C_SINGLE_TYPE_SIGNING, YP_TBOOL, YP_VNONE, CONF_IO_FRLD_ZONES },
 	{ C_ALG,                 YP_TOPT,  YP_VOPT = { dnssec_key_algs,
-	                                               DNSSEC_KEY_ALGORITHM_ECDSA_P256_SHA256 } },
-	{ C_KSK_SIZE,            YP_TINT,  YP_VINT = { 0, UINT16_MAX, YP_NIL, YP_SSIZE } },
-	{ C_ZSK_SIZE,            YP_TINT,  YP_VINT = { 0, UINT16_MAX, YP_NIL, YP_SSIZE } },
-	{ C_DNSKEY_TTL,          YP_TINT,  YP_VINT = { 0, UINT32_MAX, 0, YP_STIME } },
-	{ C_ZSK_LIFETIME,        YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(30), YP_STIME } },
-	{ C_RRSIG_LIFETIME,      YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(14), YP_STIME } },
-	{ C_RRSIG_REFRESH,       YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(7), YP_STIME } },
-	{ C_NSEC3,               YP_TBOOL, YP_VNONE },
-	{ C_NSEC3_ITER,          YP_TINT,  YP_VINT = { 0, UINT16_MAX, 10 } },
-	{ C_NSEC3_SALT_LEN,      YP_TINT,  YP_VINT = { 0, UINT8_MAX, 8 } },
-	{ C_NSEC3_SALT_LIFETIME, YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(30), YP_STIME } },
-	{ C_PROPAG_DELAY,        YP_TINT,  YP_VINT = { 0, UINT32_MAX, HOURS(1), YP_STIME } },
+	                                               DNSSEC_KEY_ALGORITHM_ECDSA_P256_SHA256 },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_KSK_SIZE,            YP_TINT,  YP_VINT = { 0, UINT16_MAX, YP_NIL, YP_SSIZE },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_ZSK_SIZE,            YP_TINT,  YP_VINT = { 0, UINT16_MAX, YP_NIL, YP_SSIZE },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_DNSKEY_TTL,          YP_TINT,  YP_VINT = { 0, UINT32_MAX, 0, YP_STIME },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_ZSK_LIFETIME,        YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(30), YP_STIME },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_PROPAG_DELAY,        YP_TINT,  YP_VINT = { 0, UINT32_MAX, HOURS(1), YP_STIME },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_RRSIG_LIFETIME,      YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(14), YP_STIME },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_RRSIG_REFRESH,       YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(7), YP_STIME },
+	                                   CONF_IO_FRLD_ZONES },
+	{ C_NSEC3,               YP_TBOOL, YP_VNONE, CONF_IO_FRLD_ZONES },
+	{ C_NSEC3_ITER,          YP_TINT,  YP_VINT = { 0, UINT16_MAX, 10 }, CONF_IO_FRLD_ZONES },
+	{ C_NSEC3_SALT_LEN,      YP_TINT,  YP_VINT = { 0, UINT8_MAX, 8 }, CONF_IO_FRLD_ZONES },
+	{ C_NSEC3_SALT_LIFETIME, YP_TINT,  YP_VINT = { 1, UINT32_MAX, DAYS(30), YP_STIME },
+	                                   CONF_IO_FRLD_ZONES },
 	{ C_COMMENT,             YP_TSTR,  YP_VNONE },
 	{ NULL }
 };
@@ -182,7 +216,7 @@ static const yp_item_t desc_key[] = {
 };
 
 static const yp_item_t desc_acl[] = {
-	{ C_ID,      YP_TSTR,  YP_VNONE },
+	{ C_ID,      YP_TSTR,  YP_VNONE, CONF_IO_FREF },
 	{ C_ADDR,    YP_TDATA, YP_VDATA = { 0, NULL, addr_range_to_bin,
 	                                    addr_range_to_txt }, YP_FMULTI },
 	{ C_KEY,     YP_TREF,  YP_VREF = { C_KEY }, YP_FMULTI, { check_ref } },
@@ -193,7 +227,7 @@ static const yp_item_t desc_acl[] = {
 };
 
 static const yp_item_t desc_remote[] = {
-	{ C_ID,      YP_TSTR,  YP_VNONE },
+	{ C_ID,      YP_TSTR,  YP_VNONE, CONF_IO_FREF },
 	{ C_ADDR,    YP_TADDR, YP_VADDR = { 53 }, YP_FMULTI },
 	{ C_VIA,     YP_TADDR, YP_VNONE, YP_FMULTI },
 	{ C_KEY,     YP_TREF,  YP_VREF = { C_KEY }, YP_FNONE, { check_ref } },
@@ -201,72 +235,84 @@ static const yp_item_t desc_remote[] = {
 	{ NULL }
 };
 
-#define ZONE_ITEMS \
-	{ C_FILE,                YP_TSTR,  YP_VNONE }, \
-	{ C_STORAGE,             YP_TSTR,  YP_VSTR = { STORAGE_DIR } }, \
+#define ZONE_ITEMS(FLAGS) \
+	{ C_STORAGE,             YP_TSTR,  YP_VSTR = { STORAGE_DIR }, FLAGS }, \
+	{ C_FILE,                YP_TSTR,  YP_VNONE, FLAGS }, \
 	{ C_MASTER,              YP_TREF,  YP_VREF = { C_RMT }, YP_FMULTI, { check_ref } }, \
 	{ C_DDNS_MASTER,         YP_TREF,  YP_VREF = { C_RMT }, YP_FNONE, { check_ref } }, \
 	{ C_NOTIFY,              YP_TREF,  YP_VREF = { C_RMT }, YP_FMULTI, { check_ref } }, \
 	{ C_ACL,                 YP_TREF,  YP_VREF = { C_ACL }, YP_FMULTI, { check_ref } }, \
-	{ C_SEM_CHECKS,          YP_TBOOL, YP_VNONE }, \
+	{ C_SEM_CHECKS,          YP_TBOOL, YP_VNONE, FLAGS }, \
 	{ C_DISABLE_ANY,         YP_TBOOL, YP_VNONE }, \
 	{ C_ZONEFILE_SYNC,       YP_TINT,  YP_VINT = { -1, INT32_MAX, 0, YP_STIME } }, \
 	{ C_IXFR_DIFF,           YP_TBOOL, YP_VNONE }, \
-	{ C_MAX_JOURNAL_SIZE,    YP_TINT,  YP_VINT = { 0, INT64_MAX, INT64_MAX, YP_SSIZE } }, \
-	{ C_MAX_ZONE_SIZE,       YP_TINT,  YP_VINT = { 0, INT64_MAX, INT64_MAX, YP_SSIZE } }, \
-	{ C_KASP_DB,             YP_TSTR,  YP_VSTR = { "keys" } }, \
-	{ C_DNSSEC_SIGNING,      YP_TBOOL, YP_VNONE }, \
-	{ C_DNSSEC_POLICY,       YP_TREF,  YP_VREF = { C_POLICY }, YP_FNONE, { check_ref_dflt } }, \
+	{ C_MAX_ZONE_SIZE,       YP_TINT,  YP_VINT = { 0, INT64_MAX, INT64_MAX, YP_SSIZE }, FLAGS }, \
+	{ C_MAX_JOURNAL_USAGE,   YP_TINT,  YP_VINT = { KILO(40), INT64_MAX, MEGA(100), YP_SSIZE } }, \
+	{ C_MAX_JOURNAL_DEPTH,   YP_TINT,  YP_VINT = { 2, INT64_MAX, INT64_MAX } }, \
+	{ C_KASP_DB,             YP_TSTR,  YP_VSTR = { "keys" }, FLAGS }, \
+	{ C_DNSSEC_SIGNING,      YP_TBOOL, YP_VNONE, FLAGS }, \
+	{ C_DNSSEC_POLICY,       YP_TREF,  YP_VREF = { C_POLICY }, FLAGS, { check_ref_dflt } }, \
 	{ C_SERIAL_POLICY,       YP_TOPT,  YP_VOPT = { serial_policies, SERIAL_POLICY_INCREMENT } }, \
 	{ C_REQUEST_EDNS_OPTION, YP_TDATA, YP_VDATA = { 0, NULL, edns_opt_to_bin, edns_opt_to_txt } }, \
 	{ C_MODULE,              YP_TDATA, YP_VDATA = { 0, NULL, mod_id_to_bin, mod_id_to_txt }, \
-	                                   YP_FMULTI, { check_modref } }, \
-	{ C_COMMENT,             YP_TSTR,  YP_VNONE },
+	                                   YP_FMULTI | FLAGS, { check_modref } }, \
+	{ C_COMMENT,             YP_TSTR,  YP_VNONE }, \
+	/* Obsolete, old journal items. */ \
+	{ C_JOURNAL,             YP_TSTR,  YP_VNONE, FLAGS }, \
+	{ C_MAX_JOURNAL_SIZE,    YP_TINT,  YP_VINT = { 0, INT64_MAX, INT64_MAX, YP_SSIZE }, FLAGS }, \
 
 static const yp_item_t desc_template[] = {
-	{ C_ID, YP_TSTR, YP_VNONE },
-	ZONE_ITEMS
-	{ C_TIMER_DB,            YP_TSTR,  YP_VSTR = { "timers" } }, \
-	{ C_GLOBAL_MODULE,       YP_TDATA, YP_VDATA = { 0, NULL, mod_id_to_bin, mod_id_to_txt }, \
-	                                   YP_FMULTI, { check_modref } }, \
+	{ C_ID, YP_TSTR, YP_VNONE, CONF_IO_FREF },
+	ZONE_ITEMS(CONF_IO_FRLD_ZONES)
+	{ C_TIMER_DB,            YP_TSTR,  YP_VSTR = { "timers" }, CONF_IO_FRLD_ZONES },
+	{ C_GLOBAL_MODULE,       YP_TDATA, YP_VDATA = { 0, NULL, mod_id_to_bin, mod_id_to_txt },
+	                                   YP_FMULTI | CONF_IO_FRLD_MOD, { check_modref } },
+	{ C_JOURNAL_DB,          YP_TSTR,  YP_VSTR = { "journal" }, CONF_IO_FRLD_SRV },
+	{ C_MAX_JOURNAL_DB_SIZE, YP_TINT,  YP_VINT = { JOURNAL_MIN_FSLIMIT, VIRT_MEM_LIMIT(TERA(100)),
+	                                               VIRT_MEM_LIMIT(GIGA(20)), YP_SSIZE },
+	                                               CONF_IO_FRLD_SRV },
 	{ NULL }
 };
 
 static const yp_item_t desc_zone[] = {
-	{ C_DOMAIN, YP_TDNAME, YP_VNONE },
-	{ C_TPL,    YP_TREF,   YP_VREF = { C_TPL }, YP_FNONE, { check_ref } },
-	ZONE_ITEMS
+	{ C_DOMAIN, YP_TDNAME, YP_VNONE, CONF_IO_FRLD_ZONE },
+	{ C_TPL,    YP_TREF,   YP_VREF = { C_TPL }, CONF_IO_FRLD_ZONE, { check_ref } },
+	ZONE_ITEMS(CONF_IO_FRLD_ZONE)
 	{ NULL }
 };
 
 const yp_item_t conf_scheme[] = {
-	{ C_SRV,      YP_TGRP, YP_VGRP = { desc_server } },
+	{ C_SRV,      YP_TGRP, YP_VGRP = { desc_server }, CONF_IO_FRLD_SRV, { check_server } },
 	{ C_CTL,      YP_TGRP, YP_VGRP = { desc_control } },
-	{ C_LOG,      YP_TGRP, YP_VGRP = { desc_log }, YP_FMULTI },
+	{ C_LOG,      YP_TGRP, YP_VGRP = { desc_log }, YP_FMULTI | CONF_IO_FRLD_LOG },
+	{ C_STATS,    YP_TGRP, YP_VGRP = { desc_stats }, CONF_IO_FRLD_SRV },
 	{ C_KEYSTORE, YP_TGRP, YP_VGRP = { desc_keystore }, YP_FMULTI, { check_keystore } },
 	{ C_POLICY,   YP_TGRP, YP_VGRP = { desc_policy }, YP_FMULTI, { check_policy } },
 	{ C_KEY,      YP_TGRP, YP_VGRP = { desc_key }, YP_FMULTI, { check_key } },
 	{ C_ACL,      YP_TGRP, YP_VGRP = { desc_acl }, YP_FMULTI, { check_acl } },
 	{ C_RMT,      YP_TGRP, YP_VGRP = { desc_remote }, YP_FMULTI, { check_remote } },
 /* MODULES */
-	{ C_MOD_SYNTH_RECORD, YP_TGRP, YP_VGRP = { scheme_mod_synth_record }, YP_FMULTI,
-	                                         { check_mod_synth_record } },
-	{ C_MOD_DNSPROXY,     YP_TGRP, YP_VGRP = { scheme_mod_dnsproxy }, YP_FMULTI,
-	                                         { check_mod_dnsproxy } },
+	{ C_MOD_RRL,          YP_TGRP, YP_VGRP = { scheme_mod_rrl }, FMOD,
+	                                         { check_mod_rrl } },
+	{ C_MOD_STATS,        YP_TGRP, YP_VGRP = { scheme_mod_stats }, FMOD },
+	{ C_MOD_SYNTH_RECORD, YP_TGRP, YP_VGRP = { scheme_mod_synth_record }, FMOD,
+	                               { check_mod_synth_record } },
+	{ C_MOD_DNSPROXY,     YP_TGRP, YP_VGRP = { scheme_mod_dnsproxy }, FMOD,
+	                               { check_mod_dnsproxy } },
 #if HAVE_ROSEDB
-	{ C_MOD_ROSEDB,       YP_TGRP, YP_VGRP = { scheme_mod_rosedb }, YP_FMULTI,
-	                                         { check_mod_rosedb } },
+	{ C_MOD_ROSEDB,       YP_TGRP, YP_VGRP = { scheme_mod_rosedb }, FMOD,
+	                               { check_mod_rosedb } },
 #endif
 #if USE_DNSTAP
-	{ C_MOD_DNSTAP,       YP_TGRP, YP_VGRP = { scheme_mod_dnstap }, YP_FMULTI,
-	                                         { check_mod_dnstap } },
+	{ C_MOD_DNSTAP,       YP_TGRP, YP_VGRP = { scheme_mod_dnstap }, FMOD,
+	                               { check_mod_dnstap } },
 #endif
-	{ C_MOD_ONLINE_SIGN,  YP_TGRP, YP_VGRP = { scheme_mod_online_sign }, YP_FMULTI },
-	{ C_MOD_WHOAMI,       YP_TGRP, YP_VGRP = { scheme_mod_whoami }, YP_FMULTI },
-	{ C_MOD_NOUDP,        YP_TGRP, YP_VGRP = { scheme_mod_noudp }, YP_FMULTI },
+	{ C_MOD_ONLINE_SIGN,  YP_TGRP, YP_VGRP = { scheme_mod_online_sign }, FMOD },
+	{ C_MOD_WHOAMI,       YP_TGRP, YP_VGRP = { scheme_mod_whoami }, FMOD },
+	{ C_MOD_NOUDP,        YP_TGRP, YP_VGRP = { scheme_mod_noudp }, FMOD },
 /***********/
-	{ C_TPL,      YP_TGRP, YP_VGRP = { desc_template }, YP_FMULTI, { check_template } },
-	{ C_ZONE,     YP_TGRP, YP_VGRP = { desc_zone }, YP_FMULTI, { check_zone } },
-	{ C_INCL,     YP_TSTR, YP_VNONE, YP_FNONE, { include_file } },
+	{ C_TPL,  YP_TGRP, YP_VGRP = { desc_template }, YP_FMULTI, { check_template } },
+	{ C_ZONE, YP_TGRP, YP_VGRP = { desc_zone }, YP_FMULTI | CONF_IO_FZONE, { check_zone } },
+	{ C_INCL, YP_TSTR, YP_VNONE, CONF_IO_FDIFF_ZONES | CONF_IO_FRLD_ALL, { include_file } },
 	{ NULL }
 };
diff --git a/src/knot/conf/scheme.h b/src/knot/conf/scheme.h
index 963763a90558bf64ef5e6995ef73629f493ec9d3..89dba2cab4241319d79a0280d3808216b5d02ad5 100644
--- a/src/knot/conf/scheme.h
+++ b/src/knot/conf/scheme.h
@@ -33,6 +33,7 @@
 #define C_ADDR			"\x07""address"
 #define C_ALG			"\x09""algorithm"
 #define C_ANY			"\x03""any"
+#define C_APPEND		"\x06""append"
 #define C_ASYNC_START		"\x0B""async-start"
 #define C_BACKEND		"\x07""backend"
 #define C_BG_WORKERS		"\x12""background-workers"
@@ -52,6 +53,8 @@
 #define C_IDENT			"\x08""identity"
 #define C_INCL			"\x07""include"
 #define C_IXFR_DIFF		"\x15""ixfr-from-differences"
+#define C_JOURNAL		"\x07""journal" /* obsolete, old journal compat */
+#define C_JOURNAL_DB		"\x0A""journal-db"
 #define C_KASP_DB		"\x07""kasp-db"
 #define C_KEY			"\x03""key"
 #define C_KEYSTORE		"\x08""keystore"
@@ -60,7 +63,10 @@
 #define C_LOG			"\x03""log"
 #define C_MANUAL		"\x06""manual"
 #define C_MASTER		"\x06""master"
-#define C_MAX_JOURNAL_SIZE	"\x10""max-journal-size"
+#define C_MAX_JOURNAL_SIZE	"\x10""max-journal-size" /* obsolete, old journal compat */
+#define C_MAX_JOURNAL_DB_SIZE	"\x13""max-journal-db-size"
+#define C_MAX_JOURNAL_USAGE	"\x11""max-journal-usage"
+#define C_MAX_JOURNAL_DEPTH	"\x11""max-journal-depth"
 #define C_MAX_TCP_CLIENTS	"\x0F""max-tcp-clients"
 #define C_MAX_UDP_PAYLOAD	"\x0F""max-udp-payload"
 #define C_MAX_ZONE_SIZE		"\x0D""max-zone-size"
@@ -89,7 +95,10 @@
 #define C_SEM_CHECKS		"\x0F""semantic-checks"
 #define C_SERIAL_POLICY		"\x0D""serial-policy"
 #define C_SERVER		"\x06""server"
+#define C_SINGLE_TYPE_SIGNING	"\x13""single-type-signing"
 #define C_SRV			"\x06""server"
+#define C_STATS			"\x0A""statistics"
+#define C_TIMER			"\x05""timer"
 #define C_STORAGE		"\x07""storage"
 #define C_TARGET		"\x06""target"
 #define C_TCP_HSHAKE_TIMEOUT	"\x15""tcp-handshake-timeout"
diff --git a/src/knot/conf/tools.c b/src/knot/conf/tools.c
index ad6469766ed8910924abe457face9306e48c7c1e..a3c88f4a660ee814ef605876b3b7f04cd99f7504 100644
--- a/src/knot/conf/tools.c
+++ b/src/knot/conf/tools.c
@@ -34,6 +34,7 @@
 #include "knot/conf/conf.h"
 #include "knot/conf/scheme.h"
 #include "knot/common/log.h"
+#include "knot/nameserver/query_module.h"
 #include "libknot/errcode.h"
 #include "libknot/yparser/yptrafo.h"
 #include "contrib/wire_ctx.h"
@@ -77,33 +78,31 @@ int mod_id_to_bin(
 
 	// Check for "mod_name/mod_id" format.
 	const uint8_t *pos = (uint8_t *)strchr((char *)in->position, '/');
-	if (pos == NULL || pos >= stop) {
-		return KNOT_EINVAL;
-	}
-
-	// Check for missing module name.
 	if (pos == in->position) {
+		// Missing module name.
+		return KNOT_EINVAL;
+	} else if (pos >= stop - 1) {
+		// Missing module identifier after slash.
 		return KNOT_EINVAL;
 	}
 
 	// Write mod_name in the yp_name_t format.
-	uint8_t name_len = pos - in->position;
+	uint8_t name_len = (pos != NULL) ? (pos - in->position) :
+	                                   wire_ctx_available(in);
 	wire_ctx_write_u8(out, name_len);
 	wire_ctx_write(out, in->position, name_len);
 	wire_ctx_skip(in, name_len);
 
-	// Skip the separator.
-	wire_ctx_skip(in, sizeof(uint8_t));
-
-	// Check for missing id.
-	if (wire_ctx_available(in) == 0) {
-		return KNOT_EINVAL;
-	}
+	// Check for mod_id.
+	if (pos != NULL) {
+		// Skip the separator.
+		wire_ctx_skip(in, sizeof(uint8_t));
 
-	// Write mod_id as a zero terminated string.
-	int ret = yp_str_to_bin(in, out, stop);
-	if (ret != KNOT_EOK) {
-		return ret;
+		// Write mod_id as a zero terminated string.
+		int ret = yp_str_to_bin(in, out, stop);
+		if (ret != KNOT_EOK) {
+			return ret;
+		}
 	}
 
 	YP_CHECK_RET;
@@ -119,13 +118,16 @@ int mod_id_to_txt(
 	wire_ctx_write(out, in->position, name_len);
 	wire_ctx_skip(in, name_len);
 
-	// Write the separator.
-	wire_ctx_write_u8(out, '/');
+	// Check for mod_id.
+	if (wire_ctx_available(in) > 0) {
+		// Write the separator.
+		wire_ctx_write_u8(out, '/');
 
-	// Write mod_id.
-	int ret = yp_str_to_txt(in, out);
-	if (ret != KNOT_EOK) {
-		return ret;
+		// Write mod_id.
+		int ret = yp_str_to_txt(in, out);
+		if (ret != KNOT_EOK) {
+			return ret;
+		}
 	}
 
 	YP_CHECK_RET;
@@ -332,6 +334,16 @@ int check_modref(
 	const uint8_t *id = args->data + 1 + args->data[0];
 	size_t id_len = args->data_len - 1 - args->data[0];
 
+	// Check if the module requires some configuration.
+	if (id_len == 0) {
+		static_module_t *mod = find_module(mod_name);
+		if (mod == NULL) {
+			return KNOT_EINVAL;
+		}
+
+		return mod->opt_conf ? KNOT_EOK : KNOT_YP_ENOID;
+	}
+
 	// Try to find a module with the id.
 	if (!conf_rawid_exists_txn(args->conf, args->txn, mod_name, id, id_len)) {
 		args->err_str = "invalid module reference";
@@ -341,6 +353,40 @@ int check_modref(
 	return KNOT_EOK;
 }
 
+int check_server(
+	conf_check_t *args)
+{
+	bool present = false;
+
+	conf_val_t val;
+	val = conf_get_txn(args->conf, args->txn, C_SRV, C_RATE_LIMIT);
+	if (val.code == KNOT_EOK) {
+		present = true;
+	}
+
+	val = conf_get_txn(args->conf, args->txn, C_SRV, C_RATE_LIMIT_SLIP);
+	if (val.code == KNOT_EOK) {
+		present = true;
+	}
+
+	val = conf_get_txn(args->conf, args->txn, C_SRV, C_RATE_LIMIT_TBL_SIZE);
+	if (val.code == KNOT_EOK) {
+		present = true;
+	}
+
+	val = conf_get_txn(args->conf, args->txn, C_SRV, C_RATE_LIMIT_WHITELIST);
+	if (val.code == KNOT_EOK) {
+		present = true;
+	}
+
+	if (present) {
+		CONF_LOG(LOG_NOTICE, "obsolete RRL configuration in the server, "
+		                     "use module mod-rrl instead");
+	}
+
+	return KNOT_EOK;
+}
+
 int check_keystore(
 	conf_check_t *args)
 {
@@ -449,24 +495,19 @@ int check_template(
 		return KNOT_EOK;
 	}
 
-	// Check global-module.
-	conf_val_t g_module = conf_rawid_get_txn(args->conf, args->txn, C_TPL,
-	                                         C_GLOBAL_MODULE, args->id,
-	                                         args->id_len);
-
-	if (g_module.code == KNOT_EOK) {
-		args->err_str = "global module in non-default template";
-		return KNOT_EINVAL;
-	}
-
-	// Check timer-db.
-	conf_val_t timer_db = conf_rawid_get_txn(args->conf, args->txn, C_TPL,
-	                                         C_TIMER_DB, args->id, args->id_len);
+	conf_val_t val;
+	#define CHECK_DFLT(item, name) \
+		val = conf_rawid_get_txn(args->conf, args->txn, C_TPL, item, \
+		                         args->id, args->id_len); \
+		if (val.code == KNOT_EOK) { \
+			args->err_str = name " in non-default template"; \
+			return KNOT_EINVAL; \
+		}
 
-	if (timer_db.code == KNOT_EOK) {
-		args->err_str = "timer database location in non-default template";
-		return KNOT_EINVAL;
-	}
+	CHECK_DFLT(C_TIMER_DB, "timer database");
+	CHECK_DFLT(C_GLOBAL_MODULE, "global module");
+	CHECK_DFLT(C_JOURNAL_DB, "journal database path");
+	CHECK_DFLT(C_MAX_JOURNAL_DB_SIZE, "journal database maximum size");
 
 	return KNOT_EOK;
 }
@@ -491,8 +532,8 @@ int check_zone(
 	                                       C_DNSSEC_POLICY, args->id);
 	if (conf_bool(&signing) && policy.code != KNOT_EOK) {
 		CONF_LOG(LOG_NOTICE, "DNSSEC policy settings in KASP database "
-		         "is obsolete and will be removed in the next major release. "
-		         "Use zone.dnssec-policy in server configuration instead.");
+		         "is obsolete and will be removed in the next major release, "
+		         "use zone.dnssec-policy in server configuration instead");
 	}
 
 	return KNOT_EOK;
diff --git a/src/knot/conf/tools.h b/src/knot/conf/tools.h
index 8378a0b42d0d5a6617fa2991d2b349011b1be036..041d360e5efa4d1841d28fde4e487913f82564bf 100644
--- a/src/knot/conf/tools.h
+++ b/src/knot/conf/tools.h
@@ -84,6 +84,10 @@ int check_modref(
 	conf_check_t *args
 );
 
+int check_server(
+	conf_check_t *args
+);
+
 int check_keystore(
 	conf_check_t *args
 );
diff --git a/src/knot/ctl/commands.c b/src/knot/ctl/commands.c
index 4148a6be7a1a751c8b5b485927eadf8de614fa0b..91a0ef670984c9a92c91307681b59ea804ca8ea8 100644
--- a/src/knot/ctl/commands.c
+++ b/src/knot/ctl/commands.c
@@ -18,16 +18,20 @@
 #include <unistd.h>
 
 #include "knot/common/log.h"
+#include "knot/common/stats.h"
 #include "knot/conf/confio.h"
 #include "knot/ctl/commands.h"
 #include "knot/events/handlers.h"
+#include "knot/nameserver/query_module.h"
 #include "knot/updates/zone-update.h"
+#include "knot/zone/timers.h"
 #include "libknot/libknot.h"
 #include "libknot/yparser/yptrafo.h"
 #include "contrib/macros.h"
 #include "contrib/mempattern.h"
 #include "contrib/string.h"
 #include "zscanner/scanner.h"
+#include "contrib/strtonum.h"
 
 void ctl_log_data(knot_ctl_data_t *data)
 {
@@ -40,15 +44,25 @@ void ctl_log_data(knot_ctl_data_t *data)
 	const char *item = (*data)[KNOT_CTL_IDX_ITEM];
 	const char *id = (*data)[KNOT_CTL_IDX_ID];
 
+	if (section == NULL) {
+		return;
+	}
+
 	if (zone != NULL) {
-		log_debug("control, zone '%s'", zone);
-	} else if (section != NULL) {
-		log_debug("control, item '%s%s%s%s%s%s'", section,
-		          (id   != NULL ? "["  : ""),
-		          (id   != NULL ? id   : ""),
-		          (id   != NULL ? "]"  : ""),
-		          (item != NULL ? "."  : ""),
-		          (item != NULL ? item : ""));
+		log_ctl_zone_str_debug(zone,
+		              "control, item '%s%s%s%s%s%s'", section,
+		              (id   != NULL ? "["  : ""),
+		              (id   != NULL ? id   : ""),
+		              (id   != NULL ? "]"  : ""),
+		              (item != NULL ? "."  : ""),
+		              (item != NULL ? item : ""));
+	} else {
+		log_ctl_debug("control, item '%s%s%s%s%s%s'", section,
+		              (id   != NULL ? "["  : ""),
+		              (id   != NULL ? id   : ""),
+		              (id   != NULL ? "]"  : ""),
+		              (item != NULL ? "."  : ""),
+		              (item != NULL ? item : ""));
 	}
 }
 
@@ -61,7 +75,7 @@ static void send_error(ctl_args_t *args, const char *msg)
 
 	int ret = knot_ctl_send(args->ctl, KNOT_CTL_TYPE_DATA, &data);
 	if (ret != KNOT_EOK) {
-		log_debug("control, failed to send error (%s)", knot_strerror(ret));
+		log_ctl_debug("control, failed to send error (%s)", knot_strerror(ret));
 	}
 }
 
@@ -107,8 +121,8 @@ static int zones_apply(ctl_args_t *args, int (*fcn)(zone_t *, ctl_args_t *))
 			ret = fcn(zone, args);
 		}
 		if (ret != KNOT_EOK) {
-			log_zone_str_debug(args->data[KNOT_CTL_IDX_ZONE],
-			                   "control, (%s)", knot_strerror(ret));
+			log_ctl_zone_str_error(args->data[KNOT_CTL_IDX_ZONE],
+			                       "control, error (%s)", knot_strerror(ret));
 			send_error(args, knot_strerror(ret));
 		}
 
@@ -338,6 +352,11 @@ static int zone_txn_commit(zone_t *zone, ctl_args_t *args)
 
 	int ret = zone_update_commit(conf(), zone->control_update);
 	if (ret != KNOT_EOK) {
+		/* Invalidate the transaction if aborted. */
+		if (zone->control_update->zone == NULL) {
+			free(zone->control_update);
+			zone->control_update = NULL;
+		}
 		return ret;
 	}
 
@@ -548,7 +567,7 @@ static int zone_read(zone_t *zone, ctl_args_t *args)
 
 		ret = send_node((zone_node_t *)node, ctx);
 	} else if (zone->contents != NULL) {
-		ret = zone_contents_tree_apply_inorder(zone->contents, send_node, ctx);
+		ret = zone_contents_apply(zone->contents, send_node, ctx);
 	}
 
 zone_read_failed:
@@ -645,8 +664,7 @@ static int send_changeset_part(changeset_t *ch, send_ctx_t *ctx, bool from)
 
 	// Send other records.
 	changeset_iter_t it;
-	int ret = from ? changeset_iter_rem(&it, ch, true) :
-	                 changeset_iter_add(&it, ch, true);
+	int ret = from ? changeset_iter_rem(&it, ch) : changeset_iter_add(&it, ch);
 	if (ret != KNOT_EOK) {
 		return ret;
 	}
@@ -903,6 +921,9 @@ static int zone_purge(zone_t *zone, ctl_args_t *args)
 	// Abort possible editing transaction.
 	(void)zone_txn_abort(zone, args);
 
+	// Purge the zone timers.
+	memset(&zone->timers, 0, sizeof(zone->timers));
+
 	// Expire the zone.
 	event_expire(conf(), zone);
 
@@ -912,15 +933,157 @@ static int zone_purge(zone_t *zone, ctl_args_t *args)
 	free(zonefile);
 
 	// Purge the zone journal.
-	char *journalfile = conf_journalfile(conf(), zone->name);
-	(void)unlink(journalfile);
-	free(journalfile);
+	if (journal_open(zone->journal, zone->journal_db, zone->name) == KNOT_EOK) {
+		(void)scrape_journal(zone->journal);
+	}
+
+	return KNOT_EOK;
+}
+
+static int send_stats_ctr(mod_ctr_t *ctr, ctl_args_t *args, knot_ctl_data_t *data)
+{
+	char index[128];
+	char value[32];
+
+	if (ctr->count == 1) {
+		int ret = snprintf(value, sizeof(value), "%"PRIu64, ctr->counter);
+		if (ret <= 0 || ret >= sizeof(value)) {
+			return ret;
+		}
 
-	// TODO: Purge the zone timers (after zone events refactoring).
+		(*data)[KNOT_CTL_IDX_ID] = NULL;
+		(*data)[KNOT_CTL_IDX_DATA] = value;
+
+		ret = knot_ctl_send(args->ctl, KNOT_CTL_TYPE_DATA, data);
+		if (ret != KNOT_EOK) {
+			return ret;
+		}
+	} else {
+		bool force = ctl_has_flag(args->data[KNOT_CTL_IDX_FLAGS],
+		                          CTL_FLAG_FORCE);
+
+		for (uint32_t i = 0; i < ctr->count; i++) {
+			// Skip empty counters.
+			if (ctr->counters[i] == 0 && !force) {
+				continue;
+			}
+
+			int ret;
+			if (ctr->idx_to_str) {
+				char *str = ctr->idx_to_str(i, ctr->count);
+				if (str == NULL) {
+					continue;
+				}
+				ret = snprintf(index, sizeof(index), "%s", str);
+				free(str);
+			} else {
+				ret = snprintf(index, sizeof(index), "%u", i);
+			}
+			if (ret <= 0 || ret >= sizeof(index)) {
+				return ret;
+			}
+
+			ret = snprintf(value, sizeof(value),  "%"PRIu64,
+			               ctr->counters[i]);
+			if (ret <= 0 || ret >= sizeof(value)) {
+				return ret;
+			}
+
+			(*data)[KNOT_CTL_IDX_ID] = index;
+			(*data)[KNOT_CTL_IDX_DATA] = value;
+
+			knot_ctl_type_t type = (i == 0) ? KNOT_CTL_TYPE_DATA :
+			                                  KNOT_CTL_TYPE_EXTRA;
+			ret = knot_ctl_send(args->ctl, type, data);
+			if (ret != KNOT_EOK) {
+				return ret;
+			}
+		}
+	}
 
 	return KNOT_EOK;
 }
 
+static int modules_stats(list_t *query_modules, ctl_args_t *args, knot_dname_t *zone)
+{
+	if (query_modules == NULL) {
+		return KNOT_EOK;
+	}
+
+	const char *section = args->data[KNOT_CTL_IDX_SECTION];
+	const char *item = args->data[KNOT_CTL_IDX_ITEM];
+
+	char name[KNOT_DNAME_TXT_MAXLEN + 1] = { 0 };
+	knot_ctl_data_t data = { 0 };
+
+	bool section_found = (section == NULL) ? true : false;
+	bool item_found = (item == NULL) ? true : false;
+
+	struct query_module *mod = NULL;
+	WALK_LIST(mod, *query_modules) {
+		// Skip modules without statistics.
+		if (mod->stats_count == 0) {
+			continue;
+		}
+
+		// Check for specific module.
+		if (section != NULL) {
+			if (section_found) {
+				break;
+			} else if (strcasecmp(mod->id->name + 1, section) == 0) {
+				section_found = true;
+			} else {
+				continue;
+			}
+		}
+
+		data[KNOT_CTL_IDX_SECTION] = mod->id->name + 1;
+
+		for (int i = 0; i < mod->stats_count; i++) {
+			mod_ctr_t *ctr = mod->stats + i;
+
+			// Skip empty counter.
+			if (ctr->name == NULL) {
+				continue;
+			}
+
+			// Check for specific counter.
+			if (item != NULL) {
+				if (item_found) {
+					break;
+				} else if (strcasecmp(ctr->name, item) == 0) {
+					item_found = true;
+				} else {
+					continue;
+				}
+			}
+
+			// Prepare zone name if not already prepared.
+			if (zone != NULL && name[0] == '\0') {
+				if (knot_dname_to_str(name, zone, sizeof(name)) == NULL) {
+					return KNOT_EINVAL;
+				}
+				data[KNOT_CTL_IDX_ZONE] = name;
+			}
+
+			data[KNOT_CTL_IDX_ITEM] = ctr->name;
+
+			// Send the counters.
+			int ret = send_stats_ctr(ctr, args, &data);
+			if (ret != KNOT_EOK) {
+				return ret;
+			}
+		}
+	}
+
+	return (section_found && item_found) ? KNOT_EOK : KNOT_ENOENT;
+}
+
+static int zone_stats(zone_t *zone, ctl_args_t *args)
+{
+	return modules_stats(&zone->query_modules, args, zone->name);
+}
+
 static int ctl_zone(ctl_args_t *args, ctl_cmd_t cmd)
 {
 	switch (cmd) {
@@ -954,6 +1117,8 @@ static int ctl_zone(ctl_args_t *args, ctl_cmd_t cmd)
 		return zones_apply(args, zone_txn_unset);
 	case CTL_ZONE_PURGE:
 		return zones_apply(args, zone_purge);
+	case CTL_ZONE_STATS:
+		return zones_apply(args, zone_stats);
 	default:
 		assert(0);
 		return KNOT_EINVAL;
@@ -972,7 +1137,7 @@ static int ctl_server(ctl_args_t *args, ctl_cmd_t cmd)
 		ret = KNOT_CTL_ESTOP;
 		break;
 	case CTL_RELOAD:
-		ret = server_reload(args->server, conf()->filename, true);
+		ret = server_reload(args->server);
 		if (ret != KNOT_EOK) {
 			send_error(args, knot_strerror(ret));
 		}
@@ -985,6 +1150,69 @@ static int ctl_server(ctl_args_t *args, ctl_cmd_t cmd)
 	return ret;
 }
 
+static int ctl_stats(ctl_args_t *args, ctl_cmd_t cmd)
+{
+	const char *section = args->data[KNOT_CTL_IDX_SECTION];
+	const char *item = args->data[KNOT_CTL_IDX_ITEM];
+
+	bool found = (section == NULL) ? true : false;
+
+	// Process server metrics.
+	if (section == NULL || strcasecmp(section, "server") == 0) {
+		char value[32];
+		knot_ctl_data_t data = {
+			[KNOT_CTL_IDX_SECTION] = "server",
+			[KNOT_CTL_IDX_DATA] = value
+		};
+
+		for (const stats_item_t *i = server_stats; i->name != NULL; i++) {
+			if (item != NULL) {
+				if (found) {
+					break;
+				} else if (strcmp(i->name, item) == 0) {
+					found = true;
+				} else {
+					continue;
+				}
+			} else {
+				found = true;
+			}
+
+			data[KNOT_CTL_IDX_ITEM] = i->name;
+			int ret = snprintf(value, sizeof(value), "%"PRIu64,
+			                   i->val(args->server));
+			if (ret <= 0 || ret >= sizeof(value)) {
+				send_error(args, knot_strerror(ret));
+				return ret;
+			}
+
+			ret = knot_ctl_send(args->ctl, KNOT_CTL_TYPE_DATA, &data);
+			if (ret != KNOT_EOK) {
+				send_error(args, knot_strerror(ret));
+				return ret;
+			}
+		}
+	}
+
+	// Process modules metrics.
+	if (section == NULL || strncasecmp(section, "mod-", strlen("mod-")) == 0) {
+		int ret = modules_stats(&conf()->query_modules, args, NULL);
+		if (ret != KNOT_EOK) {
+			send_error(args, knot_strerror(ret));
+			return ret;
+		}
+
+		found = true;
+	}
+
+	if (!found) {
+		send_error(args, knot_strerror(KNOT_EINVAL));
+		return KNOT_EINVAL;
+	}
+
+	return KNOT_EOK;
+}
+
 static int send_block_data(conf_io_t *io, knot_ctl_data_t *data)
 {
 	knot_ctl_t *ctl = (knot_ctl_t *)io->misc;
@@ -1125,7 +1353,7 @@ static int ctl_conf_txn(ctl_args_t *args, ctl_cmd_t cmd)
 			break;
 		}
 
-		ret = server_reload(args->server, NULL, false);
+		ret = server_reload(args->server);
 		break;
 	default:
 		assert(0);
@@ -1188,11 +1416,6 @@ static int ctl_conf_read(ctl_args_t *args, ctl_cmd_t cmd)
 
 static int ctl_conf_modify(ctl_args_t *args, ctl_cmd_t cmd)
 {
-	conf_io_t io = {
-		.fcn = send_block,
-		.misc = args->ctl
-	};
-
 	// Start child transaction.
 	int ret = conf_io_begin(true);
 	if (ret != KNOT_EOK) {
@@ -1208,7 +1431,7 @@ static int ctl_conf_modify(ctl_args_t *args, ctl_cmd_t cmd)
 
 		switch (cmd) {
 		case CTL_CONF_SET:
-			ret = conf_io_set(key0, key1, id, data, &io);
+			ret = conf_io_set(key0, key1, id, data);
 			break;
 		case CTL_CONF_UNSET:
 			ret = conf_io_unset(key0, key1, id, data);
@@ -1254,6 +1477,7 @@ static const desc_t cmd_table[] = {
 	[CTL_STATUS]          = { "status",          ctl_server },
 	[CTL_STOP]            = { "stop",            ctl_server },
 	[CTL_RELOAD]          = { "reload",          ctl_server },
+	[CTL_STATS]           = { "stats",           ctl_stats },
 
 	[CTL_ZONE_STATUS]     = { "zone-status",     ctl_zone },
 	[CTL_ZONE_RELOAD]     = { "zone-reload",     ctl_zone },
@@ -1271,6 +1495,7 @@ static const desc_t cmd_table[] = {
 	[CTL_ZONE_SET]        = { "zone-set",        ctl_zone },
 	[CTL_ZONE_UNSET]      = { "zone-unset",      ctl_zone },
 	[CTL_ZONE_PURGE]      = { "zone-purge",      ctl_zone },
+	[CTL_ZONE_STATS]      = { "zone-stats",	     ctl_zone },
 
 	[CTL_CONF_LIST]       = { "conf-list",       ctl_conf_read },
 	[CTL_CONF_READ]       = { "conf-read",       ctl_conf_read },
diff --git a/src/knot/ctl/commands.h b/src/knot/ctl/commands.h
index 204bb17d604f0ed572fcd60415baf7037e304074..430fc8212281ba6883c34e0cd86c445ae9a50ff4 100644
--- a/src/knot/ctl/commands.h
+++ b/src/knot/ctl/commands.h
@@ -38,6 +38,7 @@ typedef enum {
 	CTL_STATUS,
 	CTL_STOP,
 	CTL_RELOAD,
+	CTL_STATS,
 
 	CTL_ZONE_STATUS,
 	CTL_ZONE_RELOAD,
@@ -45,6 +46,7 @@ typedef enum {
 	CTL_ZONE_RETRANSFER,
 	CTL_ZONE_FLUSH,
 	CTL_ZONE_SIGN,
+	CTL_ZONE_STATS,
 
 	CTL_ZONE_READ,
 	CTL_ZONE_BEGIN,
diff --git a/src/knot/ctl/process.c b/src/knot/ctl/process.c
index 30eeca106e98a386143750a7df7aa9814b23c2a3..d845bed91e27276ee99cf3ea0f5d4a54ac97c111 100644
--- a/src/knot/ctl/process.c
+++ b/src/knot/ctl/process.c
@@ -42,8 +42,8 @@ int ctl_process(knot_ctl_t *ctl, server_t *server)
 		// Receive data unit.
 		int ret = knot_ctl_receive(args.ctl, &args.type, &args.data);
 		if (ret != KNOT_EOK) {
-			log_debug("control, failed to receive (%s)",
-			          knot_strerror(ret));
+			log_ctl_debug("control, failed to receive (%s)",
+			              knot_strerror(ret));
 			mp_delete(args.mm.ctx);
 			return ret;
 		}
@@ -73,16 +73,22 @@ int ctl_process(knot_ctl_t *ctl, server_t *server)
 		}
 
 		const char *cmd_name = args.data[KNOT_CTL_IDX_CMD];
+		const char *zone_name = args.data[KNOT_CTL_IDX_ZONE];
 
 		ctl_cmd_t cmd = ctl_str_to_cmd(cmd_name);
 		if (cmd != CTL_NONE) {
-			log_info("control, received command '%s'", cmd_name);
+			if (zone_name != NULL) {
+				log_ctl_zone_str_info(zone_name,
+				             "control, received command '%s'", cmd_name);
+			} else {
+				log_ctl_info("control, received command '%s'", cmd_name);
+			}
 			ctl_log_data(&args.data);
 		} else if (cmd_name != NULL){
-			log_debug("control, invalid command '%s'", cmd_name);
+			log_ctl_debug("control, invalid command '%s'", cmd_name);
 			continue;
 		} else {
-			log_debug("control, empty command");
+			log_ctl_debug("control, empty command");
 			continue;
 		}
 
@@ -94,16 +100,16 @@ int ctl_process(knot_ctl_t *ctl, server_t *server)
 		case KNOT_CTL_ESTOP:
 			break;
 		default:
-			log_debug("control, command '%s' (%s)", cmd_name,
-			          knot_strerror(cmd_ret));
+			log_ctl_debug("control, command '%s' (%s)", cmd_name,
+			              knot_strerror(cmd_ret));
 			break;
 		}
 
 		// Finalize the answer block.
 		ret = knot_ctl_send(ctl, KNOT_CTL_TYPE_BLOCK, NULL);
 		if (ret != KNOT_EOK) {
-			log_debug("control, failed to reply (%s)",
-			          knot_strerror(ret));
+			log_ctl_debug("control, failed to reply (%s)",
+			              knot_strerror(ret));
 		}
 
 		// Stop if required.
@@ -111,8 +117,8 @@ int ctl_process(knot_ctl_t *ctl, server_t *server)
 			// Finalize the answer message.
 			ret = knot_ctl_send(ctl, KNOT_CTL_TYPE_END, NULL);
 			if (ret != KNOT_EOK) {
-				log_debug("control, failed to reply (%s)",
-				          knot_strerror(ret));
+				log_ctl_debug("control, failed to reply (%s)",
+				              knot_strerror(ret));
 			}
 
 			mp_delete(args.mm.ctx);
diff --git a/src/knot/dnssec/context.c b/src/knot/dnssec/context.c
index 020f87aa06a9ebc43746307bac7badfc54464dde..bd080fff989971d51190025274293d2af54bd58b 100644
--- a/src/knot/dnssec/context.c
+++ b/src/knot/dnssec/context.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -59,6 +59,9 @@ static int policy_load(void *ctx, dnssec_kasp_policy_t *policy)
 	val = conf_rawid_get(conf(), C_POLICY, C_MANUAL, id, id_len);
 	policy->manual = conf_bool(&val);
 
+	val = conf_rawid_get(conf(), C_POLICY, C_SINGLE_TYPE_SIGNING, id, id_len);
+	policy->singe_type_signing = conf_bool(&val);
+
 	val = conf_rawid_get(conf(), C_POLICY, C_ALG, id, id_len);
 	policy->algorithm = conf_opt(&val);
 
@@ -78,6 +81,9 @@ static int policy_load(void *ctx, dnssec_kasp_policy_t *policy)
 	val = conf_rawid_get(conf(), C_POLICY, C_ZSK_LIFETIME, id, id_len);
 	policy->zsk_lifetime = conf_int(&val);
 
+	val = conf_rawid_get(conf(), C_POLICY, C_PROPAG_DELAY, id, id_len);
+	policy->propagation_delay = conf_int(&val);
+
 	val = conf_rawid_get(conf(), C_POLICY, C_RRSIG_LIFETIME, id, id_len);
 	policy->rrsig_lifetime = conf_int(&val);
 
@@ -96,9 +102,6 @@ static int policy_load(void *ctx, dnssec_kasp_policy_t *policy)
 	val = conf_rawid_get(conf(), C_POLICY, C_NSEC3_SALT_LIFETIME, id, id_len);
 	policy->nsec3_salt_lifetime = conf_int(&val);
 
-	val = conf_rawid_get(conf(), C_POLICY, C_PROPAG_DELAY, id, id_len);
-	policy->propagation_delay = conf_int(&val);
-
 	return DNSSEC_EOK;
 }
 
@@ -200,6 +203,12 @@ int kdnssec_kasp_init(kdnssec_ctx_t *ctx, const char *kasp_path, const char *zon
 		return r;
 	}
 
+	// Overide policy name if provided.
+	if (ctx->policy_name != NULL) {
+		free(ctx->zone->policy);
+		ctx->zone->policy = strdup(ctx->policy_name);
+	}
+
 	r = dnssec_kasp_policy_load(ctx->kasp, ctx->zone->policy, &ctx->policy);
 	if (r != DNSSEC_EOK) {
 		return r;
@@ -215,6 +224,7 @@ void kdnssec_ctx_deinit(kdnssec_ctx_t *ctx)
 		return;
 	}
 
+	free(ctx->policy_name);
 	dnssec_keystore_deinit(ctx->keystore);
 	dnssec_kasp_policy_free(ctx->policy);
 	dnssec_kasp_zone_free(ctx->zone);
@@ -223,26 +233,29 @@ void kdnssec_ctx_deinit(kdnssec_ctx_t *ctx)
 	memset(ctx, 0, sizeof(*ctx));
 }
 
-int kdnssec_ctx_init(kdnssec_ctx_t *ctx, const knot_dname_t *zone_name)
+int kdnssec_ctx_init(kdnssec_ctx_t *ctx, const knot_dname_t *zone_name,
+                     conf_val_t *policy, bool disable_legacy)
 {
 	if (ctx == NULL || zone_name == NULL) {
 		return KNOT_EINVAL;
 	}
 
-	// Check for legacy configuration.
-	conf_val_t val = conf_zone_get(conf(), C_DNSSEC_POLICY, zone_name);
-	bool legacy = val.code != KNOT_EOK;
-
-	kdnssec_ctx_t new_ctx = {
-		.legacy = legacy
-	};
-
 	char zone_str[KNOT_DNAME_TXT_MAXLEN + 1];
 	if (knot_dname_to_str(zone_str, zone_name, sizeof(zone_str)) == NULL) {
 		return KNOT_ENOMEM;
 	}
 
-	val = conf_zone_get(conf(), C_STORAGE, zone_name);
+	kdnssec_ctx_t new_ctx = { 0 };
+
+	if (!disable_legacy && policy->code != KNOT_EOK) {
+		new_ctx.legacy = true;
+	}
+
+	if (conf_str(policy) != NULL) {
+		new_ctx.policy_name = strdup(conf_str(policy));
+	}
+
+	conf_val_t val = conf_zone_get(conf(), C_STORAGE, zone_name);
 	char *storage = conf_abs_path(&val, NULL);
 	val = conf_zone_get(conf(), C_KASP_DB, zone_name);
 	char *kasp_path = conf_abs_path(&val, storage);
diff --git a/src/knot/dnssec/context.h b/src/knot/dnssec/context.h
index b6fe72fcfaa1e66b3916bf3caebd565e6c4a365e..ad944a45c091c02b653b0104611ed9455067f7aa 100644
--- a/src/knot/dnssec/context.h
+++ b/src/knot/dnssec/context.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -21,6 +21,7 @@
 #include <dnssec/kasp.h>
 #include <dnssec/keystore.h>
 
+#include "knot/conf/conf.h"
 #include "libknot/dname.h"
 
 /*!
@@ -30,6 +31,8 @@ struct kdnssec_ctx {
 	time_t now;
 
 	bool legacy;
+	char *policy_name;
+
 	dnssec_kasp_t *kasp;
 	dnssec_kasp_zone_t *zone;
 	dnssec_kasp_policy_t *policy;
@@ -57,10 +60,13 @@ int kdnssec_kasp_init(kdnssec_ctx_t *ctx, const char *kasp_path, const char *zon
 /*!
  * \brief Initialize DNSSEC signing context.
  *
- * \param ctx        Signing context to be initialized.
- * \param zone_name  Name of the zone.
+ * \param ctx             Signing context to be initialized.
+ * \param zone_name       Name of the zone.
+ * \param policy          DNSSEC policy configuration reference.
+ * \param disable_legacy  Disable legacy detection indication.
  */
-int kdnssec_ctx_init(kdnssec_ctx_t *ctx, const knot_dname_t *zone_name);
+int kdnssec_ctx_init(kdnssec_ctx_t *ctx, const knot_dname_t *zone_name,
+                     conf_val_t *policy, bool disable_legacy);
 
 /*!
  * \brief Cleanup DNSSEC signing context.
diff --git a/src/knot/dnssec/nsec-chain.c b/src/knot/dnssec/nsec-chain.c
index 5ddd1b1a24f75a6140151acdb340f51a2ab313e5..18a8390c00975ada8fa81cb39b1b88a255dce43c 100644
--- a/src/knot/dnssec/nsec-chain.c
+++ b/src/knot/dnssec/nsec-chain.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -162,9 +162,7 @@ int knot_nsec_chain_iterate_create(zone_tree_t *nodes,
 	assert(nodes);
 	assert(callback);
 
-	bool sorted = true;
-	hattrie_iter_t *it = hattrie_iter_begin(nodes, sorted);
-
+	hattrie_iter_t *it = hattrie_iter_begin(nodes);
 	if (!it) {
 		return KNOT_ENOMEM;
 	}
diff --git a/src/knot/dnssec/nsec3-chain.c b/src/knot/dnssec/nsec3-chain.c
index 3cecf2b4358f1ac58c31850fae29604747e78c91..ee65ef8bc82ba7bed3e728ca8069e96d42e7fce4 100644
--- a/src/knot/dnssec/nsec3-chain.c
+++ b/src/knot/dnssec/nsec3-chain.c
@@ -112,7 +112,7 @@ static int shallow_copy_signature(const zone_node_t *from, zone_node_t *to)
 /*!
  * \brief Reuse signatatures by shallow copying them from one tree to another.
  */
-static int copy_signatures(const zone_tree_t *from, zone_tree_t *to)
+static int copy_signatures(zone_tree_t *from, zone_tree_t *to)
 {
 	if (zone_tree_is_empty(from)) {
 		return KNOT_EOK;
@@ -120,8 +120,7 @@ static int copy_signatures(const zone_tree_t *from, zone_tree_t *to)
 
 	assert(to);
 
-	bool sorted = false;
-	hattrie_iter_t *it = hattrie_iter_begin(from, sorted);
+	hattrie_iter_t *it = hattrie_iter_begin(from);
 
 	for (/* NOP */; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 		zone_node_t *node_from = (zone_node_t *)*hattrie_iter_val(it);
@@ -155,8 +154,7 @@ static void free_nsec3_tree(zone_tree_t *nodes)
 {
 	assert(nodes);
 
-	bool sorted = false;
-	hattrie_iter_t *it = hattrie_iter_begin(nodes, sorted);
+	hattrie_iter_t *it = hattrie_iter_begin(nodes);
 	for (/* NOP */; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 		zone_node_t *node = (zone_node_t *)*hattrie_iter_val(it);
 		// newly allocated NSEC3 nodes
@@ -430,8 +428,7 @@ static int create_nsec3_nodes(const zone_contents_t *zone,
 
 	int result = KNOT_EOK;
 
-	const bool sorted = false;
-	hattrie_iter_t *it = hattrie_iter_begin(zone->nodes, sorted);
+	hattrie_iter_t *it = hattrie_iter_begin(zone->nodes);
 	while (!hattrie_iter_finished(it)) {
 		zone_node_t *node = (zone_node_t *)*hattrie_iter_val(it);
 
@@ -469,9 +466,6 @@ static int create_nsec3_nodes(const zone_contents_t *zone,
 
 	hattrie_iter_free(it);
 
-	/* Rebuild index over nsec3 nodes. */
-	hattrie_build_index(nsec3_nodes);
-
 	return result;
 }
 
diff --git a/src/knot/dnssec/zone-events.c b/src/knot/dnssec/zone-events.c
index 5bb87bc8e33d92d226b86e4027d4ed8d214647cc..aa3abc1bd7e7309ba08f11b9a969e2ce33a78356 100644
--- a/src/knot/dnssec/zone-events.c
+++ b/src/knot/dnssec/zone-events.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -38,7 +38,9 @@ static int sign_init(const zone_contents_t *zone, int flags, kdnssec_ctx_t *ctx)
 
 	const knot_dname_t *zone_name = zone->apex->owner;
 
-	int r = kdnssec_ctx_init(ctx, zone_name);
+	conf_val_t policy = conf_zone_get(conf(), C_DNSSEC_POLICY, zone_name);
+
+	int r = kdnssec_ctx_init(ctx, zone_name, &policy, false);
 	if (r != KNOT_EOK) {
 		return r;
 	}
@@ -77,9 +79,13 @@ static dnssec_event_ctx_t kctx2ctx(const kdnssec_ctx_t *kctx)
 	return ctx;
 }
 
-static int sign_process_events(const knot_dname_t *zone_name,
-                               const kdnssec_ctx_t *kctx)
+int knot_dnssec_sign_process_events(const kdnssec_ctx_t *kctx,
+                                    const knot_dname_t *zone_name)
 {
+	if (kctx == NULL || zone_name == NULL) {
+		return KNOT_EINVAL;
+	}
+
 	dnssec_event_t event = { 0 };
 	dnssec_event_ctx_t ctx = kctx2ctx(kctx);
 
@@ -166,7 +172,7 @@ int knot_dnssec_zone_sign(zone_contents_t *zone, changeset_t *out_ch,
 		goto done;
 	}
 
-	result = sign_process_events(zone_name, &ctx);
+	result = knot_dnssec_sign_process_events(&ctx, zone_name);
 	if (result != KNOT_EOK) {
 		log_zone_error(zone_name, "DNSSEC, failed to process events (%s)",
 		               knot_strerror(result));
diff --git a/src/knot/dnssec/zone-events.h b/src/knot/dnssec/zone-events.h
index e163eb8be8342c690fa1481c270fb0bcc895b8b6..3a661d819c887044d66023175a46df01f266ad04 100644
--- a/src/knot/dnssec/zone-events.h
+++ b/src/knot/dnssec/zone-events.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2013 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -13,23 +13,12 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-/*!
- * \file zone-events.h
- *
- * \author Jan Vcelak <jan.vcelak@nic.cz>
- * \author Lubos Slovak <lubos.slovak@nic.cz>
- * \author Jan Kadlec <jan.kadlec@nic.cz>
- *
- * \brief DNSSEC operations triggered on zone events.
- *
- * \addtogroup dnssec
- * @{
- */
 
 #pragma once
 
 #include "knot/zone/zone.h"
 #include "knot/updates/changesets.h"
+#include "knot/dnssec/context.h"
 
 enum zone_sign_flags {
 	ZONE_SIGN_NONE = 0,
@@ -39,6 +28,17 @@ enum zone_sign_flags {
 
 typedef enum zone_sign_flags zone_sign_flags_t;
 
+/*!
+ * \brief Generate/rollover keys in keystore as needed.
+ *
+ * \param kctx       Pointers to the keytore, policy, etc.
+ * \param zone_name  Zone name.
+ *
+ * \return Error code, KNOT_EOK if successful.
+ */
+int knot_dnssec_sign_process_events(const kdnssec_ctx_t *kctx,
+                                    const knot_dname_t *zone_name);
+
 /*!
  * \brief DNSSEC resign zone, store new records into changeset. Valid signatures
  *        and NSEC(3) records will not be changed.
@@ -67,5 +67,3 @@ int knot_dnssec_sign_changeset(const zone_contents_t *zone,
                                const changeset_t *in_ch,
                                changeset_t *out_ch,
                                uint32_t *refresh_at);
-
-/*! @} */
diff --git a/src/knot/dnssec/zone-nsec.c b/src/knot/dnssec/zone-nsec.c
index b090a4cb6df1839f99815480b011c09f81018416..07b042c52f5299c04228157d93785677d866497c 100644
--- a/src/knot/dnssec/zone-nsec.c
+++ b/src/knot/dnssec/zone-nsec.c
@@ -97,7 +97,7 @@ static int mark_removed_nsec3(const zone_contents_t *zone, changeset_t *ch)
 	}
 
 	changeset_iter_t itt;
-	changeset_iter_rem(&itt, ch, false);
+	changeset_iter_rem(&itt, ch);
 
 	knot_rrset_t rr = changeset_iter_next(&itt);
 	while (!knot_rrset_empty(&rr)) {
diff --git a/src/knot/dnssec/zone-sign.c b/src/knot/dnssec/zone-sign.c
index 8a6652e81939e8953363470373ee37b68afec305..0f79051ab09a21bcccd8d80c6f4f038bc1444d1a 100644
--- a/src/knot/dnssec/zone-sign.c
+++ b/src/knot/dnssec/zone-sign.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -1239,7 +1239,7 @@ int knot_zone_sign_changeset(const zone_contents_t *zone,
 		.zone_keys = zone_keys,
 		.dnssec_ctx = dnssec_ctx,
 		.changeset = out_ch,
-		.signed_tree = hattrie_create()
+		.signed_tree = hattrie_create(NULL)
 	};
 
 	if (args.signed_tree == NULL) {
@@ -1247,7 +1247,7 @@ int knot_zone_sign_changeset(const zone_contents_t *zone,
 
 	}
 	changeset_iter_t itt;
-	changeset_iter_all(&itt, in_ch, false);
+	changeset_iter_all(&itt, in_ch);
 
 	knot_rrset_t rr = changeset_iter_next(&itt);
 	while (!knot_rrset_empty(&rr)) {
@@ -1275,7 +1275,7 @@ int knot_zone_sign_nsecs_in_changeset(const zone_keyset_t *zone_keys,
 	}
 
 	changeset_iter_t itt;
-	changeset_iter_add(&itt, changeset, false);
+	changeset_iter_add(&itt, changeset);
 
 	knot_rrset_t rr = changeset_iter_next(&itt);
 	while (!knot_rrset_empty(&rr)) {
diff --git a/src/knot/events/handlers/notify.c b/src/knot/events/handlers/notify.c
index f99e12dfc57eec1d8a6ee45ba97ef3c1d93c9cb9..baf57ad1d985defab36144c1fd7e6208e504f7b1 100644
--- a/src/knot/events/handlers/notify.c
+++ b/src/knot/events/handlers/notify.c
@@ -31,7 +31,6 @@ struct notify_data {
 	const knot_rrset_t *soa;
 	const struct sockaddr *remote;
 	struct query_edns_data edns;
-	uint16_t response_rcode;
 };
 
 static int notify_begin(knot_layer_t *layer, void *params)
@@ -64,13 +63,6 @@ static int notify_produce(knot_layer_t *layer, knot_pkt_t *pkt)
 
 static int notify_consume(knot_layer_t *layer, knot_pkt_t *pkt)
 {
-	struct notify_data *data = layer->data;
-
-	data->response_rcode = knot_pkt_get_ext_rcode(pkt);
-	if (data->response_rcode != KNOT_RCODE_NOERROR) {
-		return KNOT_STATE_FAIL;
-	}
-
 	return KNOT_STATE_DONE;
 }
 
@@ -80,8 +72,12 @@ static const knot_layer_api_t NOTIFY_API = {
 	.consume = notify_consume,
 };
 
+#define NOTIFY_LOG(priority, zone, remote, fmt, ...) \
+	ns_log(priority, zone, LOG_OPERATION_NOTIFY, LOG_DIRECTION_OUT, remote, \
+	       fmt, ## __VA_ARGS__)
+
 static int send_notify(conf_t *conf, zone_t *zone, const knot_rrset_t *soa,
-                       const conf_remote_t *slave, int timeout, uint16_t *rcode)
+                       const conf_remote_t *slave, int timeout)
 {
 	struct notify_data data = {
 		.zone = zone->name,
@@ -110,35 +106,23 @@ static int send_notify(conf_t *conf, zone_t *zone, const knot_rrset_t *soa,
 	}
 
 	int ret = knot_requestor_exec(&requestor, req, timeout);
-	knot_request_free(req, NULL);
-	knot_requestor_clear(&requestor);
-
-	*rcode = data.response_rcode;
-
-	return ret;
-}
-
-#define NOTIFY_LOG(priority, zone, remote, fmt, ...) \
-	ns_log(priority, zone, LOG_OPERATION_NOTIFY, LOG_DIRECTION_OUT, remote, \
-	       fmt, ## __VA_ARGS__)
-
-static void log_notify_result(int ret, uint16_t rcode, const knot_dname_t *zone,
-                              const struct sockaddr_storage *_remote, uint32_t serial)
-{
-	const struct sockaddr *remote = (struct sockaddr *)_remote;
 
 	if (ret == KNOT_EOK) {
-		NOTIFY_LOG(LOG_INFO, zone, remote, "serial %u", serial);
-	} else if (rcode == 0) {
-		NOTIFY_LOG(LOG_WARNING, zone, remote, "failed (%s)", knot_strerror(ret));
+		NOTIFY_LOG(LOG_INFO, zone->name, dst,
+		           "serial %d", knot_soa_serial(&soa->rrs));
+	} else if (knot_pkt_ext_rcode(req->resp) == 0) {
+		NOTIFY_LOG(LOG_WARNING, zone->name, dst,
+		           "failed (%s)", knot_strerror(ret));
 	} else {
-		const knot_lookup_t *lut = knot_lookup_by_id(knot_rcode_names, rcode);
-		if (lut) {
-			NOTIFY_LOG(LOG_WARNING, zone, remote, "server responded with %s", lut->name);
-		} else {
-			NOTIFY_LOG(LOG_WARNING, zone, remote, "server responded with RCODE %u", rcode);
-		}
+		NOTIFY_LOG(LOG_WARNING, zone->name, dst,
+		           "server responded withi error '%s",
+		           knot_pkt_ext_rcode_name(req->resp));
 	}
+
+	knot_request_free(req, NULL);
+	knot_requestor_clear(&requestor);
+
+	return ret;
 }
 
 int event_notify(conf_t *conf, zone_t *zone)
@@ -152,7 +136,6 @@ int event_notify(conf_t *conf, zone_t *zone)
 	// NOTIFY content
 	int timeout = conf->cache.srv_tcp_reply_timeout * 1000;
 	knot_rrset_t soa = node_rrset(zone->contents->apex, KNOT_RRTYPE_SOA);
-	uint32_t serial = zone_contents_serial(zone->contents);
 
 	// send NOTIFY to each remote, use working address
 	conf_val_t notify = conf_zone_get(conf, C_NOTIFY, zone->name);
@@ -161,10 +144,8 @@ int event_notify(conf_t *conf, zone_t *zone)
 		size_t addr_count = conf_val_count(&addr);
 
 		for (int i = 0; i < addr_count; i++) {
-			uint16_t rcode = 0;
 			conf_remote_t slave = conf_remote(conf, &notify, i);
-			int ret = send_notify(conf, zone, &soa, &slave, timeout, &rcode);
-			log_notify_result(ret, rcode, zone->name, &slave.addr, serial);
+			int ret = send_notify(conf, zone, &soa, &slave, timeout);
 			if (ret == KNOT_EOK) {
 				break;
 			}
diff --git a/src/knot/events/handlers/refresh.c b/src/knot/events/handlers/refresh.c
index 57eaefd6a017043911d3af97c202648ce824896d..054933815c83d584d2f6f1017bfd46e004df86b8 100644
--- a/src/knot/events/handlers/refresh.c
+++ b/src/knot/events/handlers/refresh.c
@@ -116,12 +116,6 @@ struct refresh_data {
 	knot_mm_t *mm; // TODO: This used to be used in IXFR. Remove or reuse.
 };
 
-static const char *rcode_name(uint16_t rcode)
-{
-	const knot_lookup_t *lut = knot_lookup_by_id(knot_rcode_names, rcode);
-	return lut ? lut->name : "unknown RCODE";
-}
-
 static bool serial_is_current(uint32_t local_serial, uint32_t remote_serial)
 {
 	return serial_compare(local_serial, remote_serial) >= 0;
@@ -270,10 +264,10 @@ static int axfr_consume(knot_pkt_t *pkt, struct refresh_data *data)
 	assert(data);
 
 	// Check RCODE
-	uint16_t rcode = knot_pkt_get_ext_rcode(pkt);
-	if (rcode != KNOT_RCODE_NOERROR) {
+	if (knot_pkt_ext_rcode(pkt) != KNOT_RCODE_NOERROR) {
 		AXFRIN_LOG(LOG_WARNING, data->zone->name, data->remote,
-		           "server responded with %s", rcode_name(rcode));
+		           "server responded with error '%s'",
+		           knot_pkt_ext_rcode_name(pkt));
 		return KNOT_STATE_FAIL;
 	}
 
@@ -595,13 +589,10 @@ static int ixfr_consume(knot_pkt_t *pkt, struct refresh_data *data)
 	assert(data);
 
 	// Check RCODE
-	uint8_t rcode = knot_wire_get_rcode(pkt->wire);
-	if (rcode != KNOT_RCODE_NOERROR) {
-		const knot_lookup_t *lut = knot_lookup_by_id(knot_rcode_names, rcode);
-		if (lut != NULL) {
-			IXFRIN_LOG(LOG_WARNING, data->zone->name, data->remote,
-			           "server responded with %s", lut->name);
-		}
+	if (knot_pkt_ext_rcode(pkt) != KNOT_RCODE_NOERROR) {
+		IXFRIN_LOG(LOG_WARNING, data->zone->name, data->remote,
+		           "server responded with error '%s'",
+		           knot_pkt_ext_rcode_name(pkt));
 		return KNOT_STATE_FAIL;
 	}
 
@@ -669,10 +660,10 @@ static int soa_query_consume(knot_layer_t *layer, knot_pkt_t *pkt)
 {
 	struct refresh_data *data = layer->data;
 
-	uint16_t rcode = knot_pkt_get_ext_rcode(pkt);
-	if (rcode != KNOT_RCODE_NOERROR) {
+	if (knot_pkt_ext_rcode(pkt) != KNOT_RCODE_NOERROR) {
 		REFRESH_LOG(LOG_WARNING, data->zone->name, data->remote,
-		            "server responded with %s", rcode_name(rcode));
+		            "server responded with error '%s'",
+		            knot_pkt_ext_rcode_name(pkt));
 		return KNOT_STATE_FAIL;
 	}
 
diff --git a/src/knot/journal/journal.c b/src/knot/journal/journal.c
new file mode 100644
index 0000000000000000000000000000000000000000..efcb1b4ec012e5fc1de22d676c183b788a931845
--- /dev/null
+++ b/src/knot/journal/journal.c
@@ -0,0 +1,1823 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <limits.h>
+#include <sys/stat.h>
+#include <stdarg.h>
+
+#include "knot/journal/journal.h"
+#include "knot/zone/serial.h"
+#include "knot/common/log.h"
+#include "contrib/files.h"
+#include "contrib/endian.h"
+
+/*! \brief Journal version. */
+#define JOURNAL_VERSION	"1.0"
+/*! \brief Changeset chunk size. */
+#define CHUNK_MAX	(70 * 1024)
+/*! \brief Max number of concurrent DB readers. */
+#define JOURNAL_MAX_READERS 630
+
+/*! \brief Various metadata DB key strings. Also hardcoded in macro txn_commit()! */
+#define MDKEY_GLOBAL_VERSION			"version"
+#define MDKEY_GLOBAL_JOURNAL_COUNT		"journal_count"
+#define MDKEY_GLOBAL_LAST_TOTAL_OCCUPIED	"last_total_occupied"
+#define MDKEY_GLOBAL_LAST_INSERTER_ZONE		"last_inserter_zone"
+#define MDKEY_PERZONE_OCCUPIED			"occupied"
+#define MDKEY_PERZONE_FLAGS			"flags"
+
+/*! \brief The number of unused bytes in DB key. */
+#define DB_KEY_UNUSED_ZERO (4)
+
+/*! \brief Metadata inserted on the beginning of each chunk:
+ * uint32_t serial_to + uint32_t chunk_count + 24B unused */
+#define JOURNAL_HEADER_SIZE (32)
+
+enum {
+	LAST_FLUSHED_VALID  = 1 << 0, /* "last flush is valid" flag. */
+	SERIAL_TO_VALID     = 1 << 1, /* "last serial_to is valid" flag. */
+	MERGED_SERIAL_VALID = 1 << 2, /* "serial_from" of merged changeset. */
+	DIRTY_SERIAL_VALID  = 1 << 3, /* "dirty_serial" is present in the DB. */
+};
+
+static bool journal_flush_allowed(journal_t *j) {
+	conf_val_t val = conf_zone_get(conf(), C_ZONEFILE_SYNC, j->zone);
+	return conf_int(&val) >= 0;
+}
+
+static bool journal_merge_allowed(journal_t *j) {
+	return !journal_flush_allowed(j); // TODO think of other behaviour, e.g. setting
+}
+
+static size_t journal_max_usage(journal_t *j)
+{
+	conf_val_t val = conf_zone_get(conf(), C_MAX_JOURNAL_USAGE, j->zone);
+	return conf_int(&val);
+}
+
+static size_t journal_max_changesets(journal_t *j)
+{
+	conf_val_t val = conf_zone_get(conf(), C_MAX_JOURNAL_DEPTH, j->zone);
+	return conf_int(&val);
+}
+
+static float journal_tofree_factor(journal_t *j)
+{
+	return 2.0f;
+}
+
+static float journal_minfree_factor(journal_t *j)
+{
+	return 0.33f;
+}
+
+static float journal_max_txn(journal_t *j)
+{
+	return 0.05f;
+}
+
+/*
+ * ***************************** PART I *******************************
+ *
+ *  Transaction manipulation functions
+ *
+ * ********************************************************************
+ */
+
+typedef struct {
+	uint32_t first_serial;    // Serial_from of the first changeset.
+	uint32_t last_serial;     // Serial_from of the last changeset.
+	uint32_t last_serial_to;  // Serial_to of the last changeset.
+	uint32_t last_flushed;    // Serial_from of the last flushed (or merged) chengeset.
+	uint32_t merged_serial;   // "serial_from" of merged changeset.
+	uint32_t dirty_serial;    // Serial_from of an incompletely inserted changeset which shall be deleted (see DB_MAX_INSERT_TXN).
+	uint32_t changeset_count; // Number of changesets in this journal.
+	uint32_t flags;           // LAST_FLUSHED_VALID, SERIAL_TO_VALID, MERGED_SERIAL_VALID.
+} metadata_t;
+
+typedef struct {
+	journal_t *j;
+	knot_db_txn_t *txn;
+	int ret;
+
+	bool is_rw;
+
+	knot_db_iter_t *iter;
+
+	knot_db_val_t key;
+	knot_db_val_t val;
+	uint8_t key_raw[512];
+
+	metadata_t shadow_md;
+} txn_t;
+
+static void md_get(txn_t *txn, const knot_dname_t *zone, const char *mdkey, uint32_t *res);
+static void md_set(txn_t *txn, const knot_dname_t *zone, const char *mdkey, uint32_t val);
+
+static void txn_init(txn_t *txn, knot_db_txn_t *db_txn, journal_t *j)
+{
+	txn->j = j;
+	txn->txn = db_txn;
+	txn->ret = KNOT_ESEMCHECK;
+	txn->iter = NULL;
+	txn->key.len = 0;
+	txn->key.data = &txn->key_raw;
+	txn->val.len = 0;
+	txn->val.data = NULL;
+}
+
+#define local_txn_t(txn_name, journal) \
+	knot_db_txn_t __db_txn_ ## txn_name; \
+	txn_t __local_txn_ ## txn_name; \
+	txn_t *txn_name = &__local_txn_ ## txn_name; \
+	txn_init(txn_name, &__db_txn_ ## txn_name, (journal))
+
+/*
+ * Structure of the DB key:
+ * Metadata:
+ * | [ zone_name | \0 ] | unused zero 4B | metadata_key | \0 |
+ *
+ * Changeset:
+ * | zone_name | \0 | unused zero 4B | (be32)serial_from | (be32)chunk_index |
+ *
+ * Structure of the changeset:
+ * | (be32)serial_to | (be32)#of_chunks | unused zero 24B | serialized_changeset...
+ *
+ */
+
+static void txn_key_str(txn_t *txn, const knot_dname_t *zone, const char *key)
+{
+	size_t zone_size = 0;
+	if (zone != NULL) zone_size = knot_dname_size(zone);
+	txn->key.len = zone_size + DB_KEY_UNUSED_ZERO + strlen(key) + 1;
+	if (txn->key.len > 512) {
+		txn->ret = KNOT_ERROR;
+		return;
+	}
+	if (zone != NULL) memcpy(txn->key.data, zone, zone_size);
+	memset(txn->key.data + zone_size, 0, DB_KEY_UNUSED_ZERO);
+	strcpy(txn->key.data + zone_size + DB_KEY_UNUSED_ZERO, key);
+}
+
+static void txn_key_2u32(txn_t *txn, const knot_dname_t *zone, uint32_t key1, uint32_t key2)
+{
+	size_t zone_size = 0;
+	if (zone != NULL) zone_size = knot_dname_size(zone);
+	txn->key.len = zone_size + DB_KEY_UNUSED_ZERO + 2*sizeof(uint32_t);
+	if (txn->key.len > 512) {
+		txn->ret = KNOT_ERROR;
+		return;
+	}
+	if (zone != NULL) memcpy(txn->key.data, zone, zone_size);
+	memset(txn->key.data + zone_size, 0, DB_KEY_UNUSED_ZERO);
+	uint32_t key_be1 = htobe32(key1);
+	uint32_t key_be2 = htobe32(key2);
+	memcpy(txn->key.data + zone_size + DB_KEY_UNUSED_ZERO, &key_be1, sizeof(uint32_t));
+	memcpy(txn->key.data + zone_size + DB_KEY_UNUSED_ZERO + sizeof(uint32_t),
+	       &key_be2, sizeof(uint32_t));
+}
+
+static int txn_cmpkey(txn_t *txn, knot_db_val_t *key2)
+{
+	if (txn->key.len != key2->len) {
+		return (txn->key.len < key2->len ? -1 : 1);
+	}
+	if (key2->len == 0) {
+		return 0;
+	}
+	return memcmp(txn->key.data, key2->data, key2->len);
+}
+
+static void txn_val_u32(txn_t *txn, uint32_t *res)
+{
+	if (txn->ret != KNOT_EOK) {
+		return;
+	}
+	if (txn->val.len != sizeof(uint32_t)) {
+		txn->ret = KNOT_EMALF;
+	}
+	uint32_t beval;
+	memcpy(&beval, (uint32_t *)txn->val.data, sizeof(beval));
+	*res = be32toh(beval);
+}
+
+#define txn_begin_md(md) md_get(txn, txn->j->zone, #md, &txn->shadow_md.md)
+#define txn_commit_md(md) md_set(txn, txn->j->zone, #md, txn->shadow_md.md)
+
+#define txn_check(txn) if ((txn)->ret != KNOT_EOK) return
+#define txn_check_ret(txn) if ((txn)->ret != KNOT_EOK) return ((txn)->ret)
+#define txn_ret(txn) return ((txn)->ret == KNOT_ESEMCHECK ? KNOT_EOK : (txn)->ret)
+
+#define txn_finished_ok(txn) ((txn)->ret == KNOT_ESEMCHECK || (txn)->ret == KNOT_EOK)
+
+static void txn_begin(txn_t *txn, bool write_allowed)
+{
+	if (txn->ret != KNOT_ESEMCHECK) {
+		txn->ret = KNOT_EINVAL;
+		return;
+	}
+
+	txn->ret = txn->j->db->db_api->txn_begin(txn->j->db->db, txn->txn,
+	                                         (write_allowed ? 0 : KNOT_DB_RDONLY));
+
+	txn->is_rw = write_allowed;
+
+	txn_begin_md(first_serial);
+	txn_begin_md(last_serial);
+	txn_begin_md(last_serial_to);
+	txn_begin_md(last_flushed);
+	txn_begin_md(merged_serial);
+	txn_begin_md(dirty_serial);
+	txn_begin_md(changeset_count);
+	txn_begin_md(flags);
+}
+
+static void txn_find_force(txn_t *txn)
+{
+	if (txn->ret == KNOT_EOK) {
+		txn->ret = txn->j->db->db_api->find(txn->txn, &txn->key, &txn->val, 0);
+	}
+}
+
+static int txn_find(txn_t *txn)
+{
+	if (txn->ret != KNOT_EOK) {
+		return 0;
+	}
+	txn_find_force(txn);
+	if (txn->ret == KNOT_ENOENT) {
+		txn->ret = KNOT_EOK;
+		return 0;
+	}
+	return (txn->ret == KNOT_EOK ? 1 : 0);
+}
+
+static void txn_insert(txn_t *txn)
+{
+	if (txn->ret == KNOT_EOK) {
+		txn->ret = txn->j->db->db_api->insert(txn->txn, &txn->key, &txn->val, 0);
+	}
+}
+
+static void txn_del(txn_t *txn)
+{
+	if (txn->ret == KNOT_EOK) {
+		txn->ret = txn->j->db->db_api->del(txn->txn, &txn->key);
+	}
+}
+
+static void txn_iter_begin(txn_t *txn)
+{
+	txn_check(txn);
+	txn->iter = txn->j->db->db_api->iter_begin(txn->txn, KNOT_DB_FIRST);
+	if (txn->iter == NULL) {
+		txn->ret = KNOT_ENOMEM;
+	}
+}
+
+#define txn_check_iter if (txn->iter == NULL && txn->ret == KNOT_EOK) txn->ret = KNOT_EINVAL; \
+                       if (txn->ret != KNOT_EOK) return;
+
+static void txn_iter_seek(txn_t *txn)
+{
+	txn_check_iter
+	txn->iter = txn->j->db->db_api->iter_seek(txn->iter, &txn->key, 0);
+	if (txn->iter == NULL) {
+		txn->ret = KNOT_ENOENT;
+	}
+}
+
+static void txn_iter_key(txn_t *txn, knot_db_val_t *at_key)
+{
+	txn_check_iter
+	txn->ret = txn->j->db->db_api->iter_key(txn->iter, at_key);
+}
+
+static void txn_iter_val(txn_t *txn)
+{
+	txn_check_iter
+	txn->ret = txn->j->db->db_api->iter_val(txn->iter, &txn->val);
+}
+
+static void txn_iter_next(txn_t *txn)
+{
+	txn_check_iter
+	txn->iter = txn->j->db->db_api->iter_next(txn->iter);
+	if (txn->iter == NULL) {
+		txn->ret = KNOT_ENOENT;
+	}
+}
+
+static void txn_iter_finish(txn_t *txn)
+{
+	if (txn->iter != NULL) {
+		txn->j->db->db_api->iter_finish(txn->iter);
+	}
+	txn->iter = NULL;
+}
+
+static void txn_abort(txn_t *txn)
+{
+	if (txn->ret == KNOT_ESEMCHECK) {
+		return;
+	}
+	txn_iter_finish(txn);
+	txn->j->db->db_api->txn_abort(txn->txn);
+	if (txn->ret == KNOT_EOK) {
+		txn->ret = KNOT_ESEMCHECK;
+	}
+}
+
+static void txn_commit(txn_t *txn)
+{
+	if (txn->is_rw) {
+		txn_commit_md(first_serial);
+		txn_commit_md(last_serial);
+		txn_commit_md(last_serial_to);
+		txn_commit_md(last_flushed);
+		txn_commit_md(merged_serial);
+		txn_commit_md(dirty_serial);
+		txn_commit_md(changeset_count);
+		txn_commit_md(flags);
+	}
+
+	if (txn->ret != KNOT_EOK) {
+		txn_abort(txn);
+		return;
+	}
+
+	txn_iter_finish(txn);
+	txn->ret = txn->j->db->db_api->txn_commit(txn->txn);
+
+	if (txn->ret == KNOT_EOK) {
+		txn->ret = KNOT_ESEMCHECK;
+	}
+	txn_abort(txn); // no effect if all ok
+}
+
+static void txn_restart(txn_t *txn)
+{
+	txn_commit(txn);
+	if (txn->ret == KNOT_ESEMCHECK) {
+		txn_begin(txn, txn->is_rw);
+	}
+}
+
+static void txn_reuse(txn_t **txn, txn_t *to_reuse, bool write_allowed)
+{
+	if (to_reuse == NULL) {
+		txn_begin(*txn, write_allowed);
+	}
+	else {
+		*txn = to_reuse;
+	}
+}
+
+static void txn_unreuse(txn_t **txn, txn_t *reused)
+{
+	if (reused == NULL) {
+		txn_commit(*txn);
+	}
+}
+
+#define reuse_txn(name, journal, to_reuse, wa) local_txn_t(name, journal); txn_reuse(&name, to_reuse, wa)
+#define unreuse_txn(name, reused) txn_unreuse(&name, reused)
+
+/*
+ * ***************************** PART II ******************************
+ *
+ *  DB metadata manip. and Chunk metadata headers
+ *
+ * ********************************************************************
+ */
+
+static void md_get(txn_t *txn, const knot_dname_t *zone, const char *mdkey, uint32_t *res)
+{
+	txn_check(txn);
+	txn_key_str(txn, zone, mdkey);
+	uint32_t res1 = 0;
+	if (txn_find(txn)) {
+		txn_val_u32(txn, &res1);
+	}
+	*res = res1;
+}
+
+// allocates res
+static void md_get_common_last_inserter_zone(txn_t *txn, knot_dname_t **res)
+{
+	txn_check(txn);
+	txn_key_str(txn, NULL, MDKEY_GLOBAL_LAST_INSERTER_ZONE);
+	if (txn_find(txn)) {
+		*res = knot_dname_copy(txn->val.data, NULL);
+	}
+	else {
+		*res = NULL;
+	}
+}
+
+static int md_set_common_last_inserter_zone(txn_t *txn, knot_dname_t *zone)
+{
+	txn_check_ret(txn);
+	txn_key_str(txn, NULL, MDKEY_GLOBAL_LAST_INSERTER_ZONE);
+	txn->val.len = knot_dname_size(zone);
+	txn->val.data = zone;
+	txn_insert(txn);
+	return txn->ret;
+}
+
+static void md_get_common_last_occupied(txn_t *txn, size_t *res)
+{
+	uint32_t sres = 0;
+	md_get(txn, NULL, MDKEY_GLOBAL_LAST_TOTAL_OCCUPIED, &sres);
+	*res = (size_t) sres;
+}
+
+static void md_set(txn_t *txn, const knot_dname_t *zone, const char *mdkey, uint32_t val)
+{
+	txn_key_str(txn, zone, mdkey);
+	uint32_t val1 = htobe32(val);
+	txn->val.len = sizeof(uint32_t);
+	txn->val.data = &val1;
+	txn_insert(txn);
+}
+
+static bool md_flag(txn_t *txn, int flag)
+{
+	return (txn->shadow_md.flags & flag);
+}
+
+/*! \brief Marks metadata as flushed */
+static void md_flush(txn_t *txn)
+{
+	if (md_flag(txn, SERIAL_TO_VALID)) {
+		txn->shadow_md.last_flushed = txn->shadow_md.last_serial;
+		txn->shadow_md.flags |= LAST_FLUSHED_VALID;
+	}
+}
+
+static int md_flushed(txn_t *txn)
+{
+	return (!md_flag(txn, SERIAL_TO_VALID) ||
+		(md_flag(txn, LAST_FLUSHED_VALID) &&
+		 serial_compare(txn->shadow_md.last_flushed, txn->shadow_md.last_serial) == 0));
+}
+
+static void make_header(knot_db_val_t *to, uint32_t serial_to, int chunk_count)
+{
+	assert(to->len >= JOURNAL_HEADER_SIZE);
+	assert(chunk_count > 0);
+
+	uint32_t be_serial_to = htobe32(serial_to);
+	uint32_t be_chunk_count = htobe32((uint32_t)chunk_count);
+
+	memcpy(to->data, &be_serial_to, sizeof(be_serial_to));
+	memcpy(to->data + sizeof(be_serial_to), &be_chunk_count, sizeof(be_chunk_count));
+	memset(to->data + sizeof(be_serial_to) + sizeof(be_chunk_count), 0,
+	       JOURNAL_HEADER_SIZE - sizeof(be_serial_to) - sizeof(be_chunk_count));
+}
+
+/*! \brief read properties from chunk header "from". All the output params are optional */
+static void unmake_header(const knot_db_val_t *from, uint32_t *serial_to,
+			  int *chunk_count, size_t *header_size)
+{
+	assert(from->len >= JOURNAL_HEADER_SIZE);
+
+	uint32_t be_serial_to, be_chunk_count;
+	if (serial_to != NULL) {
+		memcpy(&be_serial_to, from->data, sizeof(be_serial_to));
+		*serial_to = be32toh(be_serial_to);
+	}
+	if (chunk_count != NULL) {
+		memcpy(&be_chunk_count, from->data + sizeof(be_serial_to), sizeof(be_chunk_count));
+		assert(be32toh(be_chunk_count) <= INT_MAX);
+		*chunk_count = (int)be32toh(be_chunk_count);
+	}
+	if (header_size != NULL) {
+		*header_size = JOURNAL_HEADER_SIZE;
+	}
+}
+
+static int first_digit(char * of)
+{
+	return atoi(of);
+}
+
+static void md_update_journal_count(txn_t * txn, int change_amount)
+{
+	uint32_t jcnt = 0;
+	md_get(txn, NULL, MDKEY_GLOBAL_JOURNAL_COUNT, &jcnt);
+	md_set(txn, NULL, MDKEY_GLOBAL_JOURNAL_COUNT, jcnt + change_amount);
+}
+
+static int initial_md_check(journal_t *j, bool *dirty_present)
+{
+	*dirty_present = 0;
+
+	bool something_updated = false;
+
+	local_txn_t(txn, j);
+	txn_begin(txn, true);
+	txn_key_str(txn, NULL, MDKEY_GLOBAL_VERSION);
+	if (!txn_find(txn)) {
+		txn->val.len = strlen(JOURNAL_VERSION) + 1;
+		txn->val.data = JOURNAL_VERSION;
+		txn_insert(txn);
+		something_updated = true;
+	}
+	else {
+		char * jver = txn->val.data;
+		if (first_digit(jver) != first_digit(JOURNAL_VERSION)) {
+			txn_abort(txn);
+			return KNOT_ENOTSUP;
+		}
+	}
+	txn_key_str(txn, j->zone, MDKEY_PERZONE_FLAGS);
+	if (!txn_find(txn)) {
+		md_update_journal_count(txn, +1);
+		something_updated = true;
+	}
+	*dirty_present = md_flag(txn, DIRTY_SERIAL_VALID);
+
+	if (something_updated) {
+		txn_commit(txn);
+	}
+	else { // abort to gain up speed when opening a lot of zones
+		txn_abort(txn);
+	}
+
+	txn_ret(txn);
+}
+
+/*
+ * **************************** PART III ******************************
+ *
+ *  DB iteration
+ *
+ * ********************************************************************
+ */
+
+enum {
+	JOURNAL_ITERATION_CHUNKS,     // call the iteration callback for each chunk read, with just the chunk in ctx->val
+	JOURNAL_ITERATION_CHANGESETS  // call the iteration callback after the last chunk of a changeset read, with all its chunks in ctx->val
+};
+
+typedef struct {
+	txn_t *txn;		// DB txn not to be touched by callback, just contains journal pointer
+	uint32_t serial;	// serial-from of current changeset
+	uint32_t serial_to;	// serial-to of current changeset
+	const int method;	// JOURNAL_ITERATION_CHUNKS or JOURNAL_ITERATION_CHANGESETS, to be set by the caller of iterate()
+	int chunk_index;	// index of current chunk
+	int chunk_count;	// # of chunks of current changeset
+	knot_db_val_t *val;	// one val if JOURNAL_ITERATION_CHUNKS; chunk_count vals if JOURNAL_ITERATION_CHANGESETS
+	knot_db_iter_t *iter;	// DB iteration context, not to be touched by callback
+	void *iter_context;	// anything to send to the callback by the caller of iterate(), untouched by iterate()
+} iteration_ctx_t;
+
+/*!
+ * \brief Move iter to next changeset chunk.
+ *
+ * Try optimisticly fast move to next DB item. But the changeset can be out of order,
+ * so if we don't succeed (different serial or end of DB), we lookup next serial slowly.
+ */
+static void get_iter_next(txn_t *txn, uint32_t expect_serial, int expect_chunk)
+{
+	knot_db_val_t other_key = { 0 };
+
+	txn_check(txn);
+	txn_iter_next(txn);
+	txn_iter_key(txn, &other_key);
+	txn_key_2u32(txn, txn->j->zone, expect_serial, (uint32_t)expect_chunk);
+	if (txn->ret == KNOT_ENOENT ||
+	    (txn->ret == KNOT_EOK && txn_cmpkey(txn, &other_key) != 0)) {
+			txn_iter_seek(txn);
+	}
+}
+
+typedef int (*iteration_cb_t)(iteration_ctx_t *ctx);
+
+static int iterate(journal_t *j, txn_t *_txn, iteration_cb_t cb, int method,
+                   void *iter_context, uint32_t first, uint32_t last)
+{
+	reuse_txn(txn, j, _txn, true);
+
+	iteration_ctx_t ctx = {
+		.method = method,
+		.iter_context = iter_context,
+		.txn = txn,
+		.serial = first,
+		.chunk_index = 0
+	};
+
+	knot_db_val_t *vals = NULL;
+
+	txn_iter_begin(txn);
+
+	txn_key_2u32(txn, j->zone, ctx.serial, ctx.chunk_index);
+	txn_iter_seek(txn);
+
+	ctx.val = &txn->val;
+
+	while (true) {
+		txn_iter_val(txn);
+		if (txn->ret != KNOT_EOK) {
+			break;
+		}
+
+		unmake_header(&txn->val, &ctx.serial_to, &ctx.chunk_count, NULL);
+
+		if (method == JOURNAL_ITERATION_CHANGESETS) {
+			if (ctx.chunk_index == 0) {
+				if (vals != NULL) free(vals);
+				vals = malloc(ctx.chunk_count * sizeof(knot_db_val_t));
+				if (vals == NULL) {
+					txn->ret = KNOT_ENOMEM;
+					break;
+				}
+				ctx.val = vals;
+			}
+			memcpy(vals + ctx.chunk_index, &txn->val, sizeof(knot_db_val_t));
+		}
+
+		if (method == JOURNAL_ITERATION_CHUNKS) {
+			txn->ret = cb(&ctx);
+		}
+
+		if (ctx.chunk_index == ctx.chunk_count - 1) { // hit last chunk of current changeset
+			if (method == JOURNAL_ITERATION_CHANGESETS) {
+				txn->ret = cb(&ctx);
+			}
+
+			if (ctx.serial == last) {
+				break; // standard loop exit here
+			}
+
+			ctx.serial = ctx.serial_to;
+			ctx.chunk_index = 0;
+		}
+		else {
+			ctx.chunk_index++;
+		}
+
+		get_iter_next(txn, ctx.serial, ctx.chunk_index);
+	}
+
+	if (vals != NULL) {
+		free(vals);
+	}
+	txn_iter_finish(txn);
+
+	unreuse_txn(txn, _txn);
+
+	txn_ret(txn);
+}
+
+/*
+ * ***************************** PART IV ******************************
+ *
+ *  Reading changesets
+ *
+ * ********************************************************************
+ */
+
+/*! \brief Deserialize changeset from chunks (in vals) */
+static int vals_to_changeset(knot_db_val_t *vals, int nvals,
+                             const knot_dname_t *zone_name, changeset_t **ch)
+{
+	uint8_t *valps[nvals];
+	size_t vallens[nvals];
+	for (int i = 0; i < nvals; i++) {
+		valps[i] = vals[i].data + JOURNAL_HEADER_SIZE;
+		vallens[i] = vals[i].len - JOURNAL_HEADER_SIZE;
+	}
+
+	changeset_t *t_ch = changeset_new(zone_name);
+	if (t_ch == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	int ret = changeset_deserialize(t_ch, valps, vallens, nvals);
+
+	if (ret != KNOT_EOK) {
+		changeset_free(t_ch);
+		return ret;
+	}
+	*ch = t_ch;
+	return KNOT_EOK;
+}
+
+static int load_one_itercb(iteration_ctx_t *ctx)
+{
+	changeset_t *ch = NULL, **targ = ctx->iter_context;
+	if (*targ != NULL) {
+		return KNOT_EINVAL;
+	}
+
+	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch);
+	if (ret == KNOT_EOK) *targ = ch;
+	return ret;
+}
+
+static int load_list_itercb(iteration_ctx_t *ctx)
+{
+	changeset_t *ch = NULL;
+	list_t *chlist = *(list_t **) ctx->iter_context;
+
+	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch);
+
+	if (ret == KNOT_EOK) {
+		add_tail(chlist, &ch->n);
+	}
+	return ret;
+}
+
+/*! \brief Load one changeset (with serial) from DB */
+static int load_one(journal_t *j, txn_t *_txn, uint32_t serial, changeset_t **ch)
+{
+	reuse_txn(txn, j, _txn, false);
+	changeset_t *rch = NULL;
+	iterate(j, txn, load_one_itercb, JOURNAL_ITERATION_CHANGESETS, &rch, serial, serial);
+	unreuse_txn(txn, _txn);
+	if (txn_finished_ok(txn)) {
+		if (rch == NULL) txn->ret = KNOT_ENOENT;
+		else *ch = rch;
+	}
+	txn_ret(txn);
+}
+
+static int load_merged_changeset(journal_t *j, txn_t *_txn, changeset_t **mch,
+                                 const uint32_t *only_if_serial)
+{
+	assert(*mch == NULL);
+
+	reuse_txn(txn, j, _txn, false);
+	txn_check_ret(txn);
+	uint32_t ms = txn->shadow_md.merged_serial, fl = txn->shadow_md.flags;
+
+	if ((fl & MERGED_SERIAL_VALID) &&
+	    (only_if_serial == NULL || serial_compare(ms, *only_if_serial) == 0)) {
+		load_one(j, txn, ms, mch);
+	}
+	unreuse_txn(txn, _txn);
+
+	txn_ret(txn);
+}
+
+/*! \brief API: load all changesets since "from" serial into dst. */
+int journal_load_changesets(journal_t *j, list_t *dst, uint32_t from)
+{
+	if (j == NULL || j->db == NULL || dst == NULL) return KNOT_EINVAL;
+
+	local_txn_t(txn, j);
+	txn_begin(txn, false);
+
+	changeset_t *mch = NULL;
+	load_merged_changeset(j, txn, &mch, &from);
+	if (mch != NULL) {
+		add_tail(dst, &mch->n);
+		from = knot_soa_serial(&mch->soa_to->rrs);
+	}
+
+	uint32_t ls = txn->shadow_md.last_serial;
+	iterate(j, txn, load_list_itercb, JOURNAL_ITERATION_CHANGESETS, &dst, from, ls);
+	txn_commit(txn);
+
+	txn_ret(txn);
+}
+
+/*
+ * ***************************** PART V *******************************
+ *
+ *  Deleting changesets
+ *
+ * ********************************************************************
+ */
+
+typedef struct {
+	size_t freed_approx;
+	size_t to_be_freed;
+} delete_status_t;
+
+static int del_upto_itercb(iteration_ctx_t *ctx)
+{
+	txn_key_2u32(ctx->txn, ctx->txn->j->zone, ctx->serial, ctx->chunk_index);
+	txn_del(ctx->txn);
+	txn_check_ret(ctx->txn);
+
+	// one whole changeset has been deleted => update metadata.
+	// We are sure that the deleted changeset is first at this time.
+	// If it's not merged changeset, point first_serial to next one
+	if (ctx->chunk_index == ctx->chunk_count - 1) {
+		if (!md_flag(ctx->txn, MERGED_SERIAL_VALID) ||
+		    serial_compare(ctx->txn->shadow_md.merged_serial,ctx->serial) != 0) {
+			ctx->txn->shadow_md.first_serial = ctx->serial_to;
+			ctx->txn->shadow_md.changeset_count--;
+		}
+		if (serial_compare(ctx->txn->shadow_md.last_flushed, ctx->serial) == 0) {
+			ctx->txn->shadow_md.flags &= ~LAST_FLUSHED_VALID;
+		}
+		if (serial_compare(ctx->txn->shadow_md.last_serial,  ctx->serial) == 0) {
+			ctx->txn->shadow_md.flags &= ~SERIAL_TO_VALID;
+		}
+		if (serial_compare(ctx->txn->shadow_md.merged_serial,ctx->serial) == 0) {
+			ctx->txn->shadow_md.flags &= ~MERGED_SERIAL_VALID;
+		}
+	}
+	return KNOT_EOK;
+}
+
+/*! \brief Delete from beginning of DB up to "last" changeset including.
+ * Please ensure (dbfirst == j->metadata.first_serial) */
+static int delete_upto(journal_t *j, txn_t *txn, uint32_t dbfirst, uint32_t last)
+{
+	return iterate(j, txn, del_upto_itercb, JOURNAL_ITERATION_CHUNKS, NULL, dbfirst, last);
+}
+
+static int delete_merged_changeset(journal_t *j, txn_t *t)
+{
+	reuse_txn(txn, j, t, true);
+	txn_check_ret(txn);
+	if (!md_flag(txn, MERGED_SERIAL_VALID)) {
+		txn->ret = KNOT_ENOENT;
+	}
+	else {
+		delete_upto(j, txn, txn->shadow_md.merged_serial, txn->shadow_md.merged_serial);
+	}
+	unreuse_txn(txn, t);
+	txn_ret(txn);
+}
+
+static int drop_journal(journal_t *j, txn_t *_txn)
+{
+	reuse_txn(txn, j, _txn, true);
+	txn_check_ret(txn);
+	if (md_flag(txn, MERGED_SERIAL_VALID)) {
+		delete_merged_changeset(j, txn);
+	}
+	if (md_flag(txn, SERIAL_TO_VALID)) {
+		delete_upto(j, txn, txn->shadow_md.first_serial, txn->shadow_md.last_serial);
+	}
+	unreuse_txn(txn, _txn);
+	txn_ret(txn);
+}
+
+static int del_tofree_itercb(iteration_ctx_t *ctx)
+{
+	delete_status_t *ds = ctx->iter_context;
+
+	if (ds->to_be_freed == 0) {
+		return KNOT_EOK; // all done, just running through the rest of records w/o change
+	}
+
+	txn_key_2u32(ctx->txn, ctx->txn->j->zone, ctx->serial, ctx->chunk_index);
+	txn_del(ctx->txn);
+	txn_check_ret(ctx->txn);
+
+	ds->freed_approx += /*4096 + */ctx->val->len;
+
+	// when whole changeset deleted, check target and update metadata
+	if (ctx->chunk_index == ctx->chunk_count - 1) {
+		ctx->txn->shadow_md.first_serial = ctx->serial_to;
+		ctx->txn->shadow_md.changeset_count--;
+		if (serial_compare(ctx->txn->shadow_md.last_flushed, ctx->serial) == 0) {
+			ctx->txn->shadow_md.flags &= ~LAST_FLUSHED_VALID;
+			ds->to_be_freed = 0; // prevents deleting unflushed changesets
+		}
+		if (serial_compare(ctx->txn->shadow_md.last_serial, ctx->serial) == 0) {
+			ctx->txn->shadow_md.flags &= ~SERIAL_TO_VALID;
+		}
+		if (ds->freed_approx >= ds->to_be_freed) {
+			ds->to_be_freed = 0;
+		}
+	}
+
+	return KNOT_EOK;
+}
+
+/*!
+ * \brief Deletes from j->db oldest changesets to free up space
+ *
+ * It tries deleting olny flushed changesets, preserves all unflushed ones.
+ *
+ * \retval KNOT_EOK if no error, even if too little or nothing deleted (check really_freed for result); KNOT_E* if error
+ */
+static int delete_tofree(journal_t *j, txn_t *_txn, size_t to_be_freed, size_t *really_freed)
+{
+	reuse_txn(txn, j, _txn, true);
+	txn_check_ret(txn);
+
+	if (!md_flag(txn, LAST_FLUSHED_VALID)) {
+		*really_freed = 0;
+		return KNOT_EOK;
+	}
+	delete_status_t ds = { .freed_approx = 0, .to_be_freed = to_be_freed };
+	iterate(j, txn, del_tofree_itercb, JOURNAL_ITERATION_CHUNKS, &ds,
+	        txn->shadow_md.first_serial, txn->shadow_md.last_serial);
+	unreuse_txn(txn, _txn);
+
+	if (txn_finished_ok(txn)) *really_freed = ds.freed_approx;
+	txn_ret(txn);
+}
+
+static int del_count_itercb(iteration_ctx_t *ctx)
+{
+	delete_status_t *ds = ctx->iter_context;
+	if (ds->freed_approx >= ds->to_be_freed) {
+		return KNOT_EOK;
+	}
+	txn_key_2u32(ctx->txn, ctx->txn->j->zone, ctx->serial, ctx->chunk_index);
+	txn_del(ctx->txn);
+	txn_check_ret(ctx->txn);
+
+	// when whole changeset deleted, check target and update metadata
+	if (ctx->chunk_index == ctx->chunk_count - 1) {
+		ctx->txn->shadow_md.first_serial = ctx->serial_to;
+		ctx->txn->shadow_md.changeset_count--;
+		if (serial_compare(ctx->txn->shadow_md.last_flushed, ctx->serial) == 0) {
+			ctx->txn->shadow_md.flags &= ~LAST_FLUSHED_VALID;
+			ds->to_be_freed = ds->freed_approx; // prevents deleting unflushed changesets
+		}
+		if (serial_compare(ctx->txn->shadow_md.last_serial, ctx->serial) == 0) {
+			ctx->txn->shadow_md.flags &= ~SERIAL_TO_VALID;
+		}
+		ds->freed_approx++;
+	}
+	return KNOT_EOK;
+}
+
+/*!
+ * \brief Deletes specified number of changesets
+ *
+ * It tries deleting olny flushed changesets, preserves all unflushed ones.
+ *
+ * \retval KNOT_EOK if no error, even if too little or nothing deleted (check really_deleted for result)
+ * \return KNOT_E* if error
+ */
+static int delete_count(journal_t *j, txn_t *_txn, size_t to_be_deleted, size_t *really_deleted)
+{
+	reuse_txn(txn, j, _txn, true);
+	txn_check_ret(txn);
+
+	if (!md_flag(txn, LAST_FLUSHED_VALID)) {
+		*really_deleted = 0;
+		return KNOT_EOK;
+	}
+	delete_status_t ds = { .freed_approx = 0, .to_be_freed = to_be_deleted };
+	iterate(j, txn, del_count_itercb, JOURNAL_ITERATION_CHUNKS, &ds,
+	        txn->shadow_md.first_serial, txn->shadow_md.last_serial);
+	unreuse_txn(txn, _txn);
+
+	if (txn_finished_ok(txn)) *really_deleted = ds.freed_approx;
+	txn_ret(txn);
+}
+
+static int delete_dirty_serial(journal_t *j, txn_t *_txn)
+{
+	reuse_txn(txn, j, _txn, true);
+	txn_check_ret(txn);
+
+	if (!md_flag(txn, DIRTY_SERIAL_VALID)) return KNOT_EOK;
+
+	uint32_t ds = txn->shadow_md.dirty_serial, chunk = 0;
+
+	txn_key_2u32(txn, j->zone, ds, chunk);
+	while (txn_find(txn)) {
+		txn_del(txn);
+		txn_key_2u32(txn, j->zone, ds, ++chunk);
+	}
+	unreuse_txn(txn, _txn);
+	if (txn_finished_ok(txn)) {
+		txn->shadow_md.flags &= ~DIRTY_SERIAL_VALID;
+	}
+	txn_ret(txn);
+}
+
+/*
+ * ***************************** PART VI ******************************
+ *
+ *  Writing changesets
+ *
+ * ********************************************************************
+ */
+
+static int merge_itercb(iteration_ctx_t *ctx)
+{
+	changeset_t *ch = NULL, *mch = *(changeset_t **)ctx->iter_context;
+
+	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch);
+	if (ret == KNOT_EOK) {
+		ret = changeset_merge(mch, ch);
+		changeset_free(ch);
+	}
+	return ret;
+}
+
+static int merge_unflushed_changesets(journal_t *j, txn_t *_txn, changeset_t **mch)
+{
+	reuse_txn(txn, j, _txn, false);
+	txn_check_ret(txn);
+	*mch = NULL;
+	if (md_flushed(txn)) {
+		goto m_u_ch_end;
+	}
+	bool was_merged = md_flag(txn, MERGED_SERIAL_VALID);
+	bool was_flushed = md_flag(txn, LAST_FLUSHED_VALID);
+	uint32_t from = was_merged ? txn->shadow_md.merged_serial :
+	                             (was_flushed ? txn->shadow_md.last_flushed :
+	                                            txn->shadow_md.first_serial);
+	txn->ret = load_one(j, txn, from, mch);
+	if (!was_merged && was_flushed && txn->ret == KNOT_EOK) {
+		from = knot_soa_serial(&(*mch)->soa_to->rrs);
+		changeset_free(*mch);
+		*mch = NULL;
+		txn->ret = load_one(j, txn, from, mch);
+	}
+	if (txn->ret != KNOT_EOK) {
+		goto m_u_ch_end;
+	}
+	from = knot_soa_serial(&(*mch)->soa_to->rrs);
+
+	txn->ret = iterate(j, txn, merge_itercb, JOURNAL_ITERATION_CHANGESETS,
+	                   mch, from, txn->shadow_md.last_serial);
+
+m_u_ch_end:
+	unreuse_txn(txn, _txn);
+	if (!txn_finished_ok(txn) && *mch != NULL) {
+		changeset_free(*mch);
+		*mch = NULL;
+	}
+	txn_ret(txn);
+}
+
+// uses local context, e.g.: j, txn, changesets, nchs, serialized_size_total, store_changeset_cleanup, inserting_merged
+#define try_flush \
+	if (!md_flushed(txn)) { \
+		if (journal_merge_allowed(j)) { \
+			changeset_t *merged; \
+			merge_unflushed_changesets(j, txn, &merged); \
+			add_tail(changesets, &merged->n); \
+			nchs++; \
+			serialized_size_total += changeset_serialized_size(merged); \
+			md_flush(txn); \
+			inserting_merged = true; \
+		} \
+		else { \
+			txn->ret = KNOT_EBUSY; \
+			goto store_changeset_cleanup; \
+		} \
+	}
+
+static int store_changesets(journal_t *j, list_t *changesets)
+{
+	// PART 1 : initializers, compute serialized_sizes, transaction start
+	changeset_t *ch;
+
+	size_t nchs = 0, serialized_size_total = 0, inserted_size = 0, insert_txn_count = 1;
+
+	uint8_t *allchunks = NULL;
+	uint8_t **chunkptrs = NULL;
+	size_t *chunksizes = NULL;
+	knot_db_val_t *vals = NULL;
+
+	int inserting_merged = false;
+
+	WALK_LIST(ch, *changesets) {
+		nchs++;
+		serialized_size_total += changeset_serialized_size(ch);
+	}
+
+	local_txn_t(txn, j);
+	txn_begin(txn, true);
+
+	// if you're tempted to add dirty_serial deletion somewhere here, you're wrong. Don't do it.
+
+	// PART 2 : recalculating the previous insert's occupy change
+	size_t occupied_last, occupied_now;
+	md_get_common_last_occupied(txn, &occupied_last);
+	occupied_now = knot_db_lmdb_get_usage(j->db->db);
+	md_set(txn, NULL, MDKEY_GLOBAL_LAST_TOTAL_OCCUPIED, occupied_now);
+	if (occupied_now != occupied_last) {
+		knot_dname_t *last_zone = NULL;
+		uint32_t lz_occupied;
+		md_get_common_last_inserter_zone(txn, &last_zone);
+		md_get(txn, last_zone, MDKEY_PERZONE_OCCUPIED, &lz_occupied);
+		lz_occupied += occupied_now - occupied_last;
+		md_set(txn, last_zone, MDKEY_PERZONE_OCCUPIED, lz_occupied);
+		free(last_zone);
+	}
+	md_set_common_last_inserter_zone(txn, j->zone);
+
+	// PART 3 : check if we exceeded designed occupation and delete some
+	uint32_t occupied = 0, occupied_max;
+	md_get(txn, j->zone, MDKEY_PERZONE_OCCUPIED, &occupied);
+	occupied_max = journal_max_usage(j);
+	occupied += serialized_size_total;
+	if (occupied > occupied_max) {
+		size_t freed;
+		size_t tofree = (occupied - occupied_max) * journal_tofree_factor(j);
+		size_t free_min = tofree * journal_minfree_factor(j);
+		delete_tofree(j, txn, tofree, &freed);
+		if (freed < free_min) {
+			tofree -= freed;
+			free_min -= freed;
+			try_flush
+			delete_tofree(j, txn, tofree, &freed);
+			if (freed < free_min) {
+				txn->ret = KNOT_ESPACE;
+				log_zone_warning(j->zone, "journal: unable to make free space for insert");
+				goto store_changeset_cleanup;
+			}
+		}
+	}
+
+	// PART 3.5 : check if we exceeded history depth
+	long over_limit = (long)txn->shadow_md.changeset_count - journal_max_changesets(j) +
+			  list_size(changesets) - (inserting_merged ? 1 : 0);
+	if (over_limit > 0) {
+		size_t deled;
+		delete_count(j, txn, over_limit, &deled);
+		over_limit -= deled;
+		if (over_limit > 0) {
+			try_flush
+			delete_count(j, txn, over_limit, &deled);
+			// ignore further errors here, the limit is not so important
+		}
+	}
+
+	// PART 4: continuity and duplicity check
+	changeset_t * chs_head = (HEAD(*changesets));
+	uint32_t serial = knot_soa_serial(&chs_head->soa_from->rrs);
+	if (md_flag(txn, SERIAL_TO_VALID) && serial_compare(txn->shadow_md.last_serial_to, serial) != 0) {
+		log_zone_warning(j->zone, "discontinuity in chages history (%u -> %u), dropping older changesets",
+		                 txn->shadow_md.last_serial_to, serial);
+		try_flush
+		drop_journal(j, txn);
+		txn_restart(txn);
+	}
+	WALK_LIST(ch, *changesets) {
+		uint32_t serial_to = knot_soa_serial(&ch->soa_to->rrs);
+		if (inserting_merged && ch == TAIL(*changesets)) {
+			continue;
+		}
+		txn_key_2u32(txn, j->zone, serial_to, 0);
+		if (txn_find(txn)) {
+			log_zone_warning(j->zone, "duplicite changeset serial (%u), dropping older changesets",
+			                 serial_to);
+			try_flush
+			delete_upto(j, txn, txn->shadow_md.first_serial, serial_to);
+			txn_restart(txn);
+		}
+	}
+
+	// PART 5: serializing into chunks
+	WALK_LIST(ch, *changesets) {
+		if (txn->ret != KNOT_EOK) {
+			break;
+		}
+
+		// Twice chsize seems like enough room to store all chunks together.
+		size_t maxchunks = changeset_serialized_size(ch) * 2 / CHUNK_MAX + 1, chunks;
+		allchunks = malloc(maxchunks * CHUNK_MAX);
+		chunkptrs = malloc(maxchunks * sizeof(uint8_t *));
+		chunksizes = malloc(maxchunks * sizeof(size_t));
+		vals = malloc(maxchunks * sizeof(knot_db_val_t));
+		if (allchunks == NULL || chunkptrs == NULL || chunksizes == NULL || vals == NULL) {
+			txn->ret = KNOT_ENOMEM;
+			break;
+		}
+		for (int i = 0; i < maxchunks; i++) {
+			chunkptrs[i] = allchunks + i*CHUNK_MAX + JOURNAL_HEADER_SIZE;
+		}
+		txn->ret = changeset_serialize(ch, chunkptrs, CHUNK_MAX - JOURNAL_HEADER_SIZE,
+		                               maxchunks, chunksizes, &chunks);
+		if (txn->ret != KNOT_EOK) {
+			break;
+		}
+
+		uint32_t serial = knot_soa_serial(&ch->soa_from->rrs);
+		uint32_t serial_to = knot_soa_serial(&ch->soa_to->rrs);
+
+		for (int i = 0; i < chunks; i++) {
+			vals[i].data = allchunks + i*CHUNK_MAX;
+			vals[i].len = JOURNAL_HEADER_SIZE + chunksizes[i];
+			make_header(vals + i, serial_to, chunks);
+		}
+
+	// PART 6: inserting vals into db
+		for (int i = 0; i < chunks; i++) {
+			if (txn->ret != KNOT_EOK) break;
+			txn_key_2u32(txn, j->zone, serial, i);
+			txn->val = vals[i];
+			txn_insert(txn);
+			inserted_size += (vals+i)->len;
+			if ((float)inserted_size > journal_max_txn(j) * (float)j->db->fslimit) { // insert txn too large
+				inserted_size = 0;
+				txn->shadow_md.dirty_serial = serial;
+				txn->shadow_md.flags |= DIRTY_SERIAL_VALID;
+				txn_restart(txn);
+				insert_txn_count++;
+				txn->shadow_md.flags &= ~DIRTY_SERIAL_VALID;
+			}
+		}
+
+	// PART 7: metadata update
+		if (txn->ret != KNOT_EOK) {
+			break;
+		}
+		if (inserting_merged && ch == TAIL(*changesets)) {
+			txn->shadow_md.flags |= MERGED_SERIAL_VALID;
+			txn->shadow_md.merged_serial = serial;
+		}
+		else {
+			if (!md_flag(txn, SERIAL_TO_VALID)) {
+				txn->shadow_md.first_serial = serial;
+			}
+			txn->shadow_md.flags |= SERIAL_TO_VALID;
+			txn->shadow_md.last_serial = serial;
+			txn->shadow_md.last_serial_to = serial_to;
+			txn->shadow_md.changeset_count++;
+		}
+
+		free(allchunks);
+		free(chunkptrs);
+		free(chunksizes);
+		free(vals);
+		allchunks = NULL;
+		chunkptrs = NULL;
+		chunksizes = NULL;
+		vals = NULL;
+	}
+
+	// PART X : finalization and cleanup
+
+store_changeset_cleanup:
+
+	txn_commit(txn);
+
+	if (txn->ret != KNOT_ESEMCHECK) {
+		local_txn_t(ddtxn, j);
+		txn_begin(ddtxn, true);
+		if (md_flag(ddtxn, DIRTY_SERIAL_VALID)) {
+			delete_dirty_serial(j, ddtxn);
+		}
+		txn_commit(ddtxn);
+	}
+
+	if (allchunks != NULL) free(allchunks);
+	if (chunkptrs != NULL) free(chunkptrs);
+	if (chunksizes != NULL) free(chunksizes);
+	if (vals != NULL) free(vals);
+
+	changeset_t *dbgchst = TAIL(*changesets);
+
+	if (inserting_merged) {
+		// free the merged changeset
+		rem_node(&dbgchst->n);
+		changeset_free(dbgchst);
+	}
+
+	txn_ret(txn);
+}
+#undef try_flush
+
+int journal_store_changeset(journal_t *journal, changeset_t *ch)
+{
+	if (journal == NULL || journal->db == NULL || ch == NULL) return KNOT_EINVAL;
+
+	changeset_t *ch_shallowcopy = malloc(sizeof(changeset_t));
+	if (ch_shallowcopy == NULL) {
+		return KNOT_ENOMEM;
+	}
+	memcpy(ch_shallowcopy, ch, sizeof(changeset_t)); // we need to copy the changeset_t sructure not to break ch->n
+
+	list_t list;
+	init_list(&list);
+	add_tail(&list, &ch_shallowcopy->n);
+	int ret = store_changesets(journal, &list);
+
+	free(ch_shallowcopy);
+	return ret;
+}
+
+int journal_store_changesets(journal_t *journal, list_t *src)
+{
+	if (journal == NULL || journal->db == NULL || src == NULL) return KNOT_EINVAL;
+	return store_changesets(journal, src);
+}
+
+/*
+ * **************************** PART VII ******************************
+ *
+ *  Journal initialization and global manipulation
+ *
+ * ********************************************************************
+ */
+
+journal_t *journal_new()
+{
+	journal_t *j = malloc(sizeof(*j));
+	if (j != NULL) {
+		memset(j, 0, sizeof(*j));
+	}
+	return j;
+}
+
+void journal_free(journal_t **j)
+{
+	if (j == NULL || *j == NULL) return;
+
+	if ((*j)->zone != NULL) {
+		free((knot_dname_t *)(*j)->zone);
+	}
+	free(*j);
+	*j = NULL;
+}
+
+static int open_journal_db_unsafe(journal_db_t **db)
+{
+	if ((*db)->db != NULL) return KNOT_EOK;
+
+	struct knot_db_lmdb_opts opts = KNOT_DB_LMDB_OPTS_INITIALIZER;
+	opts.path = (*db)->path;
+	opts.mapsize = (*db)->fslimit;
+	opts.maxdbs = 1;
+	opts.maxreaders = JOURNAL_MAX_READERS;
+
+	int ret = (*db)->db_api->init(&(*db)->db, NULL, &opts);
+	if (ret != KNOT_EOK) {
+		(*db)->db = NULL;
+		return ret;
+	}
+
+	size_t real_fslimit = knot_db_lmdb_get_mapsize((*db)->db);
+	(*db)->fslimit = real_fslimit;
+
+	return KNOT_EOK;
+}
+
+static int open_journal_db(journal_db_t **db)
+{
+	if (*db == NULL) return KNOT_EINVAL;
+	pthread_mutex_lock(&(*db)->db_mutex);
+	int ret = open_journal_db_unsafe(db);
+	pthread_mutex_unlock(&(*db)->db_mutex);
+	return ret;
+}
+
+/*! \brief Open/create the journal based on the filesystem path to LMDB directory */
+int journal_open(journal_t *j, journal_db_t **db, const knot_dname_t *zone_name)
+{
+	int ret = KNOT_EOK;
+
+	if (j == NULL || (*db) == NULL) return KNOT_EINVAL;
+	if (j->db != NULL) {
+		return KNOT_EOK;
+	}
+
+	// open shared journal DB if not already
+	if ((*db)->db == NULL) {
+		ret = open_journal_db(db);
+	}
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+	j->db = *db;
+
+	j->zone = knot_dname_copy(zone_name, NULL);
+	if (j->zone == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	bool dirty_serial_valid;
+	ret = initial_md_check(j, &dirty_serial_valid);
+
+	if (ret == KNOT_EOK && dirty_serial_valid) {
+		delete_dirty_serial(j, NULL);
+	}
+
+	return ret;
+}
+
+void journal_close(journal_t *j)
+{
+	j->db = NULL;
+	free(j->zone);
+	j->zone = NULL;
+}
+
+int journal_db_init(journal_db_t **db, const char *lmdb_dir_path, size_t lmdb_fslimit)
+{
+	if (*db != NULL) {
+		return KNOT_EOK;
+	}
+	*db = malloc(sizeof(journal_db_t));
+	if (*db == NULL) {
+		return KNOT_ENOMEM;
+	}
+	journal_db_t dbinit = {
+		.db = NULL,
+		.db_api = knot_db_lmdb_api(),
+		.path = strdup(lmdb_dir_path),
+		.fslimit = ((lmdb_fslimit < JOURNAL_MIN_FSLIMIT) ? JOURNAL_MIN_FSLIMIT : lmdb_fslimit)
+	};
+	memcpy(*db, &dbinit, sizeof(journal_db_t));
+	pthread_mutex_init(&(*db)->db_mutex, NULL);
+	return KNOT_EOK;
+}
+
+static void destroy_journal_db(journal_db_t **db)
+{
+	assert((*db)->db == NULL);
+
+	pthread_mutex_destroy(&(*db)->db_mutex);
+	free((*db)->path);
+	free((*db));
+	*db = NULL;
+}
+
+void journal_db_close(journal_db_t **db)
+{
+	if (db == NULL || *db == NULL) {
+		return;
+	}
+
+	pthread_mutex_lock(&(*db)->db_mutex);
+	if ((*db)->db != NULL) {
+		(*db)->db_api->deinit((*db)->db);
+		(*db)->db = NULL;
+	}
+	pthread_mutex_unlock(&(*db)->db_mutex);
+
+	destroy_journal_db(db);
+}
+
+int journal_flush(journal_t *journal)
+{
+	if (journal == NULL || journal->db == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	local_txn_t(txn, journal);
+	txn_begin(txn, true);
+	md_flush(txn);
+	txn_commit(txn);
+	txn_ret(txn);
+}
+
+bool journal_exists(journal_db_t **db, knot_dname_t *zone_name)
+{
+	if (db == NULL || *db == NULL || zone_name == NULL) {
+		return false;
+	}
+
+	if ((*db)->db == NULL) {
+		struct stat st;
+		if (stat((*db)->path, &st) != 0 || st.st_size == 0) {
+			return false;
+		}
+		int ret = open_journal_db(db);
+		if (ret != KNOT_EOK) {
+			return false;
+		}
+	}
+
+	journal_t fake_journal = { .db = *db, .zone = zone_name };
+	local_txn_t(txn, &fake_journal);
+	txn_begin(txn, false);
+	txn_key_str(txn, zone_name, MDKEY_PERZONE_FLAGS);
+	int res = txn_find(txn);
+	txn_abort(txn);
+
+	return (res == 1);
+}
+
+static knot_db_val_t *dbval_copy(const knot_db_val_t *from)
+{
+	knot_db_val_t *to = malloc(sizeof(knot_db_val_t) + from->len);
+	if (to != NULL) {
+		memcpy(to, from, sizeof(knot_db_val_t));
+		to->data = to + 1; // == ((uit8_t *)to) + sizeof(knot_db_val_t)
+		memcpy(to->data, from->data, from->len);
+	}
+	return to;
+} // TODO think of moving this fun into different place/lib
+
+int scrape_journal(journal_t *j)
+{
+	if (j->db == NULL) return KNOT_EINVAL;
+	local_txn_t(txn, j);
+	txn_begin(txn, true);
+	txn_check_ret(txn);
+
+	knot_db_val_t key = { .len = 0, .data = "" };
+
+	list_t to_del;
+	init_list(&to_del);
+
+	txn_iter_begin(txn);
+	while (txn->ret == KNOT_EOK && txn->iter != NULL) {
+		txn_iter_key(txn, &key);
+		if (knot_dname_is_equal((const knot_dname_t *) key.data, j->zone)) {
+			knot_db_val_t * inskey = dbval_copy(&key);
+			if (inskey == NULL) {
+				txn->ret = KNOT_ENOMEM;
+				goto scrape_end;
+			}
+			ptrlist_add(&to_del, inskey, NULL);
+		}
+		txn_iter_next(txn);
+	}
+	if (txn->ret == KNOT_ENOENT) {
+		txn->ret = KNOT_EOK;
+	}
+	txn_iter_finish(txn);
+
+	ptrnode_t *del_one;
+	if (txn->ret == KNOT_EOK) {
+		WALK_LIST(del_one, to_del) {
+			txn->ret = j->db->db_api->del(txn->txn, (knot_db_val_t *)del_one->d);
+		}
+		md_update_journal_count(txn, -1);
+		txn->ret = j->db->db_api->txn_commit(txn->txn);
+	}
+scrape_end:
+
+	WALK_LIST(del_one, to_del) {
+		free(del_one->d);
+	}
+
+	ptrlist_free(&to_del, NULL);
+
+	return txn->ret;
+}
+
+void journal_metadata_info(journal_t *j, bool *is_empty, uint32_t *serial_from, uint32_t *serial_to)
+{
+	// NOTE: there is NEVER the situation that only merged changeset would be present and no common changeset in db.
+
+	if (j == NULL || j->db == NULL) {
+		*is_empty = true;
+		return;
+	}
+
+	local_txn_t(txn, j);
+	txn_begin(txn, false);
+	txn_check(txn);
+
+	*is_empty = !md_flag(txn, SERIAL_TO_VALID);
+	*serial_from = txn->shadow_md.first_serial;
+	*serial_to = txn->shadow_md.last_serial_to;
+
+	if (md_flag(txn, MERGED_SERIAL_VALID)) {
+		*serial_from = txn->shadow_md.merged_serial;
+	}
+	txn_abort(txn);
+}
+
+int journal_db_list_zones(journal_db_t **db, list_t *zones)
+{
+	uint32_t expected_count;
+
+	if (list_size(zones) > 0) {
+		return KNOT_EINVAL;
+	}
+
+	if ((*db)->db == NULL) {
+		int ret = open_journal_db(db);
+		if (ret != KNOT_EOK) {
+			return ret;
+		}
+	}
+
+	journal_t fake_journal = { .db = *db, .zone = (knot_dname_t *)"" };
+	local_txn_t(txn, &fake_journal);
+	txn_begin(txn, false);
+	md_get(txn, NULL, MDKEY_GLOBAL_JOURNAL_COUNT, &expected_count);
+	txn_check_ret(txn);
+
+	knot_db_val_t key;
+	txn_iter_begin(txn);
+	while (txn->ret == KNOT_EOK && txn->iter != NULL) {
+		txn_iter_key(txn, &key);
+
+		int metaflag_len = strlen(MDKEY_PERZONE_FLAGS);
+		char *compare_metaflag = key.data;
+		compare_metaflag += key.len - 1;
+		if (txn->ret == KNOT_EOK && *compare_metaflag == '\0') {
+			compare_metaflag -= metaflag_len;
+			if (strcmp(compare_metaflag, MDKEY_PERZONE_FLAGS) == 0) {
+				char *found_zone = knot_dname_to_str_alloc((const knot_dname_t *)key.data);
+				ptrlist_add(zones, found_zone, NULL);
+			}
+		}
+		txn_iter_next(txn);
+	}
+	if (txn->ret == KNOT_ENOENT) {
+		txn->ret = KNOT_EOK;
+	}
+	txn_iter_finish(txn);
+	txn_abort(txn);
+	if (list_size(zones) < 1) {
+		txn->ret = KNOT_ENOENT;
+	}
+	if (list_size(zones) != expected_count) {
+		txn->ret = KNOT_EMALF;
+	}
+	txn_ret(txn);
+}
+
+/*
+ * *************************** PART VIII ******************************
+ *
+ *  Journal check
+ *
+ * ********************************************************************
+ */
+
+static void _jch_print(const knot_dname_t *zname, int warn_level, const char *format, ...)
+{
+	static char buf[512];
+	strcpy(buf, "journal check: ");
+
+	va_list args;
+	va_start(args, format);
+	vsprintf(buf + strlen(buf), format, args);
+	va_end(args);
+
+	switch (warn_level) {
+	case JOURNAL_CHECK_INFO:
+		log_zone_info(zname, "%s", buf);
+		break;
+	case JOURNAL_CHECK_WARN:
+		log_zone_error(zname, "%s", buf);
+		break;
+	default:
+		break;
+	}
+}
+
+#define jch_print(wl, fmt_args...) if ((wl) <= warn_level) _jch_print(j->zone, wl, fmt_args)
+#define jch_info(fmt_args...) jch_print(JOURNAL_CHECK_INFO, fmt_args)
+#define jch_warn(fmt_args...) jch_print((allok = 0, JOURNAL_CHECK_WARN), fmt_args)
+#define jch_txn(comment, fatal) do { if (txn->ret != KNOT_EOK && txn->ret != KNOT_ESEMCHECK) { \
+                                     jch_warn("failed transaction: %s (%s)", (comment), knot_strerror(txn->ret)); \
+                                     if (fatal) return txn->ret; } } while (0)
+
+int journal_check(journal_t *j, journal_check_level warn_level)
+{
+	int ret, allok = 1;
+	changeset_t *ch = NULL;
+	uint32_t sfrom, sto;
+	uint32_t first_unflushed;
+	uint32_t chcount;
+
+	jch_info("started");
+
+	if (j->db == NULL) {
+		jch_warn("is not open");
+		return KNOT_ESEMCHECK;
+	}
+
+	local_txn_t(txn, j);
+	txn_begin(txn, true);
+	jch_txn("begin", true);
+
+	jch_info("metadata: flags >> %d << fs %u ls %u lst %u lf %u ms %u ds %u cnt %u",
+	         txn->shadow_md.flags, txn->shadow_md.first_serial, txn->shadow_md.last_serial,
+	         txn->shadow_md.last_serial_to, txn->shadow_md.last_flushed, txn->shadow_md.merged_serial,
+	         txn->shadow_md.dirty_serial, txn->shadow_md.changeset_count);
+
+	chcount = txn->shadow_md.changeset_count;
+	first_unflushed = txn->shadow_md.first_serial;
+
+	if (md_flag(txn, DIRTY_SERIAL_VALID)) {
+		jch_warn("there is some post-crash mess in the DB");
+	}
+
+	if (!md_flag(txn, SERIAL_TO_VALID)) {
+		if (md_flag(txn, LAST_FLUSHED_VALID)) {
+			jch_warn("journal flagged empty but last_flushed valid");
+		}
+		if (md_flag(txn, MERGED_SERIAL_VALID)) {
+			jch_warn("no other than merged changeset present, this should not happen");
+		}
+		goto check_merged;
+	}
+
+	ret = load_one(j, txn, txn->shadow_md.first_serial, &ch);
+	if (ret != KNOT_EOK) {
+		jch_warn("can't read first changeset %u (%s)",
+		         txn->shadow_md.first_serial, knot_strerror(ret));
+		goto check_merged;
+	}
+
+	sfrom = knot_soa_serial(&ch->soa_from->rrs), sto = knot_soa_serial(&ch->soa_to->rrs);
+	if (serial_compare(txn->shadow_md.first_serial, sfrom) != 0) {
+		jch_warn("first changeset's serial 'from' %u is not ok", sfrom);
+	}
+
+	if (md_flag(txn, LAST_FLUSHED_VALID)) {
+		changeset_free(ch);
+		ret = load_one(j, txn, txn->shadow_md.last_flushed, &ch);
+		if (ret != KNOT_EOK) {
+			jch_warn("can't read last flushed changeset %u (%s)",
+			         txn->shadow_md.last_flushed, knot_strerror(ret));
+		}
+		else {
+			first_unflushed = knot_soa_serial(&ch->soa_to->rrs);
+		}
+	}
+	if (ret == KNOT_EOK) {
+		changeset_free(ch);
+	}
+
+	if (serial_compare(txn->shadow_md.last_serial_to, sto) == 0) {
+		jch_info("there is just one changeset in the journal");
+		goto check_merged;
+	}
+	ret = load_one(j, txn, sto, &ch);
+	if (ret != KNOT_EOK) {
+		jch_warn("can't read second changeset %u (%s)", sto, knot_strerror(ret));
+	}
+	else {
+		sfrom = knot_soa_serial(&ch->soa_from->rrs);
+		if (serial_compare(sfrom, sto) != 0) {
+			jch_warn("second changeset's serial 'from' %u is not ok", sfrom);
+		}
+		changeset_free(ch);
+	}
+
+	sfrom = txn->shadow_md.first_serial;
+	sto = txn->shadow_md.last_serial_to;
+	txn_commit(txn);
+	jch_txn("commit", true);
+
+	list_t l;
+	init_list(&l);
+	ret = journal_load_changesets(j, &l, sfrom);
+	if (ret != KNOT_EOK) {
+		jch_warn("can't read all changesets %u -> %u (%s)", sfrom, sto, knot_strerror(ret));
+		goto check_merged;
+	}
+	jch_info("listed %zu changesets", list_size(&l));
+	if (list_size(&l) != chcount) {
+		jch_warn("expected %u changesets but found %zu", chcount, list_size(&l));
+	}
+
+	ch = HEAD(l);
+	if (serial_compare(sfrom, knot_soa_serial(&ch->soa_from->rrs)) != 0) {
+		jch_warn("first listed changeset's serial 'from' %u is not ok",
+		         knot_soa_serial(&ch->soa_from->rrs));
+	}
+	ch = TAIL(l);
+	if (serial_compare(sto, knot_soa_serial(&ch->soa_to->rrs)) != 0) {
+		jch_warn("last listed changeset's serial 'to' %u is not ok",
+		         knot_soa_serial(&ch->soa_to->rrs));
+	}
+	changesets_free(&l);
+
+check_merged:
+	if (txn->ret != KNOT_ESEMCHECK) txn_abort(txn);
+	txn_begin(txn, false);
+	jch_txn("begin2", true);
+	if (md_flag(txn, MERGED_SERIAL_VALID)) {
+		ch = NULL;
+		ret = load_merged_changeset(j, txn, &ch, NULL);
+		if (ret != KNOT_EOK) {
+			jch_warn("can't read merged changeset (%s)", knot_strerror(ret));
+		}
+		else {
+			sfrom = knot_soa_serial(&ch->soa_from->rrs);
+			sto = knot_soa_serial(&ch->soa_to->rrs);
+			jch_info("merged changeset %u -> %u (size %zu)", sfrom, sto,
+			         changeset_serialized_size(ch));
+			if (serial_compare(sfrom, txn->shadow_md.merged_serial) != 0) {
+				jch_warn("merged changeset's serial 'from' is not ok");
+			}
+			if (serial_compare(sto, first_unflushed) != 0) {
+				jch_warn("merged changeset's serial 'to' is not ok");
+			}
+			changeset_free(ch);
+		}
+	}
+	txn_commit(txn);
+	jch_txn("commit2", true);
+
+	if (allok) {
+		jch_info("passed without errors");
+	}
+
+	return (allok ? KNOT_EOK : KNOT_ERROR);
+}
diff --git a/src/knot/journal/journal.h b/src/knot/journal/journal.h
new file mode 100644
index 0000000000000000000000000000000000000000..e21e6c7307b525822b3218c32aa70dae5320a212
--- /dev/null
+++ b/src/knot/journal/journal.h
@@ -0,0 +1,196 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <pthread.h>
+
+#include "libknot/db/db.h"
+#include "contrib/ucw/lists.h"
+#include "knot/updates/changesets.h"
+#include "knot/journal/serialization.h"
+
+/*! \brief Minimum journal size. */
+#define JOURNAL_MIN_FSLIMIT	(1 * 1024 * 1024)
+
+typedef struct {
+	knot_db_t *db;
+	const knot_db_api_t *db_api;
+	char *path;
+	size_t fslimit;
+	pthread_mutex_t db_mutex; // please delete this once you move DB opening from journal_open to db_init
+} journal_db_t;
+
+typedef struct {
+	journal_db_t *db;
+	knot_dname_t *zone;
+} journal_t;
+
+typedef enum {
+	JOURNAL_CHECK_SILENT = 0, // No logging, just curious for return value.
+	JOURNAL_CHECK_WARN   = 1, // Log journal inconsistencies.
+	JOURNAL_CHECK_INFO   = 2  // Log journal state.
+} journal_check_level;
+
+/*!
+ * \brief Initialize shared journal DB file. The DB will be open on first use.
+ *
+ * \param db             Database to be initialized. Must be (*db == NULL) before!
+ * \param lmdb_dir_path  Path to the directory with DB
+ * \param lmdb_fslimit   Maximum size of DB data file
+ *
+ * \return KNOT_E*
+ */
+int journal_db_init(journal_db_t **db, const char *lmdb_dir_path, size_t lmdb_fslimit);
+
+/*!
+ * \brief Close shared journal DB file.
+ *
+ * \param db DB to close.
+ */
+void journal_db_close(journal_db_t **db);
+
+/*!
+ * \brief List the zones contained in journal DB.
+ *
+ * \param db[in]      Shared journal DB
+ * \param zones[out]  List of strings (char *) of zone names
+ *
+ * \return KNOT_EOK    ok
+ * \retval KNOT_ENOMEM no zones found
+ * \retval KNOT_EMALF  different # of zones found than expected
+ * \retval KNOT_E*     other error
+ */
+int journal_db_list_zones(journal_db_t **db, list_t *zones);
+
+/*!
+ * \brief Allocate a new journal structure.
+ *
+ * \retval new journal instance if successful.
+ * \retval NULL on error.
+ */
+journal_t *journal_new(void);
+
+/*!
+ * \brief Free a journal structure.
+ *
+ * \param journal  A journal structure to free.
+ */
+void journal_free(journal_t **journal);
+
+/*!
+ * \brief Open journal.
+ *
+ * \param j          Journal struct to use.
+ * \param db         Shared journal database
+ * \param zone_name  Name of the zone this journal belongs to.
+ *
+ * \retval KNOT_EOK on success.
+ * \return < KNOT_EOK on other errors.
+ */
+int journal_open(journal_t *j, journal_db_t **db, const knot_dname_t *zone_name);
+
+/*!
+ * \brief Close journal.
+ *
+ * \param journal  Journal to close.
+ */
+void journal_close(journal_t *journal);
+
+/*!
+ * \brief Load changesets from journal.
+ *
+ * \param journal  Journal to load from.
+ * \param dst      Store changesets here.
+ * \param from     Start serial.
+ *
+ * \retval KNOT_EOK on success.
+ * \retval KNOT_ENOENT when the lookup of the first entry fails.
+ * \return < KNOT_EOK on other error.
+ */
+int journal_load_changesets(journal_t *journal, list_t *dst, uint32_t from);
+
+/*!
+ * \brief Store changesets in journal.
+ *
+ * \param journal  Journal to store in.
+ * \param src      Changesets to store.
+ *
+ * \retval KNOT_EOK on success.
+ * \retval KNOT_EBUSY when full, asking zone to flush itself to zonefile
+ *                    to allow cleaning up history and freeing up space
+ * \retval KNOT_ESPACE when full and not able to free up any space
+ * \return < KNOT_EOK on other errors.
+ */
+int journal_store_changesets(journal_t *journal, list_t *src);
+
+/*!
+ * \brief Store changesets in journal.
+ *
+ * \param journal  Journal to store in.
+ * \param change   Changeset to store.
+ *
+ * \retval (same as for journal_store_changesets())
+ */
+int journal_store_changeset(journal_t *journal, changeset_t *change);
+
+/*!
+ * \brief Check if this (zone's) journal is present in shared journal DB.
+ *
+ * \param db         Shared journal DB
+ * \param zone_name  Name of the zone of the journal in question
+ *
+ * \return true or false
+ */
+bool journal_exists(journal_db_t **db, knot_dname_t *zone_name);
+
+/*! \brief Tell the journal that zone has been flushed.
+ *
+ * \param journal  Journal to flush.
+ *
+ * \return KNOT_E*
+ */
+int journal_flush(journal_t *journal);
+
+/*! \brief Remove completely this (zone's) journal from shared journal DB.
+ *
+ * This must be called with opened journal.
+ *
+ * \param j Journal to be deleted
+ *
+ * \return KNOT_E*
+ */
+int scrape_journal(journal_t *j);
+
+/*! \brief Obtain public information from journal metadata
+ *
+ * \param[in]  j            Journal
+ * \param[out] is_empty     True if j contains no changesets
+ * \param[out] serial_from  [if !is_empty] starting serial of changesets history
+ * \param[out] serial_to    [if !is_empty] ending serial of changesets history
+ */
+void journal_metadata_info(journal_t *j, bool *is_empty, uint32_t *serial_from, uint32_t *serial_to);
+
+/*! \brief Check the journal consistency, errors to stderr.
+ *
+ * \param journal     Journal to check.
+ * \param warn_level  Journal check level.
+ *
+ * \return KNOT_E*
+ */
+int journal_check(journal_t *j, journal_check_level warn_level);
+
+/*! @} */
diff --git a/src/knot/journal/old_journal.c b/src/knot/journal/old_journal.c
new file mode 100644
index 0000000000000000000000000000000000000000..bb9366a228c924453a496c330b5ef7dba69fb345
--- /dev/null
+++ b/src/knot/journal/old_journal.c
@@ -0,0 +1,548 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <assert.h>
+
+#include "knot/common/log.h"
+#include "contrib/files.h"
+#include "knot/journal/old_journal.h"
+#include "knot/journal/serialization.h"
+#include "libknot/libknot.h"
+
+static int deserialize_rr(knot_rrset_t *rrset, const uint8_t *stream, uint32_t rdata_size)
+{
+	uint32_t ttl;
+	memcpy(&ttl, stream, sizeof(uint32_t));
+	return knot_rrset_add_rdata(rrset, stream + sizeof(uint32_t),
+	                            rdata_size - sizeof(uint32_t), ttl, NULL);
+}
+
+static int rrset_deserialize(const uint8_t *stream, size_t *stream_size,
+                             knot_rrset_t *rrset)
+{
+	if (stream == NULL || stream_size == NULL || rrset == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	if (sizeof(uint64_t) > *stream_size) {
+		return KNOT_ESPACE;
+	}
+	uint64_t rrset_length = 0;
+	memcpy(&rrset_length, stream, sizeof(uint64_t));
+	if (rrset_length > *stream_size) {
+		return KNOT_ESPACE;
+	}
+
+	size_t offset = sizeof(uint64_t);
+	uint16_t rdata_count = 0;
+	memcpy(&rdata_count, stream + offset, sizeof(uint16_t));
+	offset += sizeof(uint16_t);
+	/* Read owner from the stream. */
+	unsigned owner_size = knot_dname_size(stream + offset);
+	knot_dname_t *owner = knot_dname_copy_part(stream + offset, owner_size, NULL);
+	assert(owner);
+	offset += owner_size;
+	/* Read type. */
+	uint16_t type = 0;
+	memcpy(&type, stream + offset, sizeof(uint16_t));
+	offset += sizeof(uint16_t);
+	/* Read class. */
+	uint16_t rclass = 0;
+	memcpy(&rclass, stream + offset, sizeof(uint16_t));
+	offset += sizeof(uint16_t);
+
+	/* Create new RRSet. */
+	knot_rrset_init(rrset, owner, type, rclass);
+
+	/* Read RRs. */
+	for (uint16_t i = 0; i < rdata_count; i++) {
+		/*
+		 * There's always size of rdata in the beginning.
+		 * Needed because of remainders.
+		 */
+		uint32_t rdata_size = 0;
+		memcpy(&rdata_size, stream + offset, sizeof(uint32_t));
+		offset += sizeof(uint32_t);
+		int ret = deserialize_rr(rrset, stream + offset, rdata_size);
+		if (ret != KNOT_EOK) {
+			knot_rrset_clear(rrset, NULL);
+			return ret;
+		}
+		offset += rdata_size;
+	}
+
+	*stream_size = *stream_size - offset;
+
+	return KNOT_EOK;
+}
+
+
+
+typedef enum {
+	JOURNAL_NULL  = 0 << 0, /*!< Invalid journal entry. */
+	JOURNAL_FREE  = 1 << 0, /*!< Free journal entry. */
+	JOURNAL_VALID = 1 << 1, /*!< Valid journal entry. */
+	JOURNAL_DIRTY = 1 << 2  /*!< Journal entry cannot be evicted. */
+} journal_flag_t;
+
+typedef struct {
+	uint64_t id;    /*!< Node ID. */
+	uint16_t flags; /*!< Node flags. */
+	uint16_t next;  /*!< UNUSED */
+	uint32_t pos;   /*!< Position in journal file. */
+	uint32_t len;   /*!< Entry data length. */
+} journal_node_t;
+
+typedef struct {
+	int fd;
+	char *path;             /*!< Path to journal file. */
+	uint16_t tmark;         /*!< Transaction start mark. */
+	uint16_t max_nodes;     /*!< Number of nodes. */
+	uint16_t qhead;         /*!< Node queue head. */
+	uint16_t qtail;         /*!< Node queue tail. */
+	uint16_t bflags;        /*!< Initial flags for each written node. */
+	size_t fsize;           /*!< Journal file size. */
+	size_t fslimit;         /*!< File size limit. */
+	journal_node_t free;    /*!< Free segment. */
+	journal_node_t *nodes;  /*!< Array of nodes. */
+} old_journal_t;
+
+#define JOURNAL_NCOUNT 1024 /*!< Default node count. */
+#define JOURNAL_MAGIC {'k', 'n', 'o', 't', '1', '5', '2'}
+#define MAGIC_LENGTH 7
+/* HEADER = magic, crc, max_entries, qhead, qtail */
+#define JOURNAL_HSIZE (MAGIC_LENGTH + sizeof(uint32_t) + sizeof(uint16_t) * 3)
+
+/*! \brief Infinite file size limit. */
+#define FSLIMIT_INF (~((size_t)0))
+
+/*! \brief Next node. */
+#define jnode_next(j, i) (((i) + 1) % (j)->max_nodes)
+
+/*! \brief Previous node. */
+#define jnode_prev(j, i) (((i) == 0) ? (j)->max_nodes - 1 : (i) - 1)
+
+/*! \bref Starting node data position. */
+#define jnode_base_pos(max_nodes) (JOURNAL_HSIZE + (max_nodes + 1) * sizeof(journal_node_t))
+
+static inline int sfread(void *dst, size_t len, int fd)
+{
+	return read(fd, dst, len) == len;
+}
+
+/*! \brief Return 'serial_from' part of the key. */
+static inline uint32_t journal_key_from(uint64_t k)
+{
+	return (uint32_t)(k & ((uint64_t)0x00000000ffffffff));
+}
+
+/*! \brief Compare function to match entries with starting serial. */
+static inline int journal_key_from_cmp(uint64_t k, uint64_t from)
+{
+	return ((uint64_t)journal_key_from(k)) - from;
+}
+
+/*! \brief Open journal file for r/w (returns error if not exists). */
+static int old_journal_open_file(old_journal_t *j)
+{
+	assert(j != NULL);
+
+	int ret = KNOT_EOK;
+	j->fd = open(j->path, O_RDWR);
+	if (j->fd < 0) {
+		return knot_map_errno();
+	}
+
+	/* File lock. */
+	struct flock lock = { .l_type = F_WRLCK, .l_whence = SEEK_SET,
+	                      .l_start  = 0, .l_len = 0, .l_pid = 0 };
+	/* Attempt to lock. */
+	ret = fcntl(j->fd, F_SETLKW, &lock);
+	if (ret < 0) {
+		return knot_map_errno();
+	}
+
+	/* Read magic bytes. */
+	const char magic_req[MAGIC_LENGTH] = JOURNAL_MAGIC;
+	char magic[MAGIC_LENGTH];
+	if (!sfread(magic, MAGIC_LENGTH, j->fd)) {
+		goto open_file_error;
+	}
+	if (memcmp(magic, magic_req, MAGIC_LENGTH) != 0) {
+		log_warning("old journal '%s', version too old", j->path);
+		close(j->fd);
+		j->fd = -1;
+		return KNOT_ENOTSUP;
+	}
+
+	/* Skip CRC */
+	if (lseek(j->fd, MAGIC_LENGTH + sizeof(uint32_t), SEEK_SET) < 0) {
+		goto open_file_error;
+	}
+
+	/* Get journal file size. */
+	struct stat st;
+	if (fstat(j->fd, &st) < 0) {
+		goto open_file_error;
+	}
+
+	/* Set file size. */
+	j->fsize = st.st_size;
+
+	/* Read maximum number of entries. */
+	if (!sfread(&j->max_nodes, sizeof(uint16_t), j->fd)) {
+		goto open_file_error;
+	}
+
+	/* Allocate nodes. */
+	const size_t node_len = sizeof(journal_node_t);
+	j->nodes = malloc(j->max_nodes * node_len);
+	if (j->nodes == NULL) {
+		goto open_file_error;
+	} else {
+		memset(j->nodes, 0, j->max_nodes * node_len);
+	}
+
+	/* Load node queue state. */
+	j->qhead = j->qtail = 0;
+	if (!sfread(&j->qhead, sizeof(uint16_t), j->fd)) {
+		goto open_file_error;
+	}
+
+	/* Load queue tail. */
+	if (!sfread(&j->qtail, sizeof(uint16_t), j->fd)) {
+		goto open_file_error;
+	}
+
+	/* Load empty segment descriptor. */
+	if (!sfread(&j->free, node_len, j->fd)) {
+		goto open_file_error;
+	}
+
+	/* Read journal descriptors table. */
+	if (!sfread(j->nodes, j->max_nodes * node_len, j->fd)) {
+		goto open_file_error;
+	}
+
+	/* Save file lock and return. */
+	return KNOT_EOK;
+
+	/* Unlock and close file and return error. */
+open_file_error:
+	free(j->nodes);
+	j->nodes = NULL;
+	close(j->fd);
+	j->fd = -1;
+	return KNOT_ERROR;
+}
+
+/*! \brief Close journal file. */
+static int old_journal_close_file(old_journal_t *journal)
+{
+	/* Close file. */
+	if (journal->fd > 0) {
+		close(journal->fd);
+		journal->fd = -1;
+	}
+
+	/* Free nodes. */
+	free(journal->nodes);
+	journal->nodes = NULL;
+
+	return KNOT_EOK;
+}
+
+static int old_journal_close(old_journal_t *journal)
+{
+	/* Check journal. */
+	if (journal == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	/* Close file. */
+	old_journal_close_file(journal);
+
+	/* Free allocated resources. */
+	free(journal->path);
+	free(journal);
+
+	return KNOT_EOK;
+}
+
+static int old_journal_open(old_journal_t **journal, const char *path, size_t fslimit)
+{
+	if (journal == NULL || path == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	old_journal_t *j = malloc(sizeof(*j));
+	if (j == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	memset(j, 0, sizeof(*j));
+	j->bflags = JOURNAL_DIRTY;
+	j->fd = -1;
+
+	j->fslimit = fslimit;
+
+	/* Copy path. */
+	j->path = strdup(path);
+	if (j->path == NULL) {
+		free(j);
+		return KNOT_ENOMEM;
+	}
+
+	/* Open journal file. */
+	int ret = old_journal_open_file(j);
+	if (ret != KNOT_EOK) {
+		log_error("old journal '%s', failed to open (%s)", path,
+		          knot_strerror(ret));
+		old_journal_close(j);
+		return ret;
+	}
+
+	*journal = j;
+
+	return KNOT_EOK;
+}
+
+typedef int (*journal_cmp_t)(uint64_t k1, uint64_t k2);
+
+static int old_journal_fetch(old_journal_t *journal, uint64_t id,
+		  journal_cmp_t cf, journal_node_t** dst)
+{
+	if (journal == NULL || dst == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	size_t i = jnode_prev(journal, journal->qtail);
+	size_t endp = jnode_prev(journal, journal->qhead);
+	for(; i != endp; i = jnode_prev(journal, i)) {
+		journal_node_t *n = journal->nodes + i;
+
+		/* Skip invalid nodes. */
+		if (!(n->flags & JOURNAL_VALID)) {
+			continue;
+		}
+
+		if (cf(n->id, id) == 0) {
+			*dst = journal->nodes + i;
+			return KNOT_EOK;
+		}
+	}
+
+	return KNOT_ENOENT;
+}
+
+static int old_journal_read_node(old_journal_t *journal, journal_node_t *n, char *dst)
+{
+	/* Check valid flag. */
+	if (!(n->flags & JOURNAL_VALID)) {
+		return KNOT_EINVAL;
+	}
+
+	/* Seek journal node. */
+	int seek_ret = lseek(journal->fd, n->pos, SEEK_SET);
+
+	/* Read journal node content. */
+	if (seek_ret < 0 || !sfread(dst, n->len, journal->fd)) {
+		return KNOT_ERROR;
+	}
+
+	return KNOT_EOK;
+}
+
+bool old_journal_exists(const char *path)
+{
+	if (path == NULL) {
+		return false;
+	}
+	struct stat st;
+	return stat(path, &st) == 0;
+}
+
+/*! \brief No doc here. Moved from zones.h (@mvavrusa) */
+static int changesets_unpack(changeset_t *chs)
+{
+	/* Read changeset flags. */
+	if (chs->data == NULL) {
+		return KNOT_EMALF;
+	}
+	size_t remaining = chs->size;
+
+	/* Read initial changeset RRSet - SOA. */
+	uint8_t *stream = chs->data + (chs->size - remaining);
+	knot_rrset_t rrset;
+	int ret = rrset_deserialize(stream, &remaining, &rrset);
+	if (ret != KNOT_EOK) {
+		return KNOT_EMALF;
+	}
+
+	assert(rrset.type == KNOT_RRTYPE_SOA);
+	chs->soa_from = knot_rrset_copy(&rrset, NULL);
+	knot_rrset_clear(&rrset, NULL);
+	if (chs->soa_from == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	/* Read remaining RRSets */
+	bool in_remove_section = true;
+	while (remaining > 0) {
+
+		/* Parse next RRSet. */
+		stream = chs->data + (chs->size - remaining);
+		knot_rrset_init_empty(&rrset);
+		ret = rrset_deserialize(stream, &remaining, &rrset);
+		if (ret != KNOT_EOK) {
+			return KNOT_EMALF;
+		}
+
+		/* Check for next SOA. */
+		if (rrset.type == KNOT_RRTYPE_SOA) {
+			/* Move to ADD section if in REMOVE. */
+			if (in_remove_section) {
+				chs->soa_to = knot_rrset_copy(&rrset, NULL);
+				if (chs->soa_to == NULL) {
+					ret = KNOT_ENOMEM;
+					break;
+				}
+				in_remove_section = false;
+			} else {
+				/* Final SOA, no-op. */
+				;
+			}
+		} else {
+			/* Remove RRSets. */
+			if (in_remove_section) {
+				ret = changeset_add_removal(chs, &rrset, 0);
+			} else {
+				/* Add RRSets. */
+				ret = changeset_add_addition(chs, &rrset, 0);
+			}
+		}
+		knot_rrset_clear(&rrset, NULL);
+		if (ret != KNOT_EOK) {
+			break;
+		}
+	}
+	return ret;
+}
+
+/*! \brief Helper for iterating journal (this is temporary until #80) */
+typedef int (*journal_apply_t)(old_journal_t *, journal_node_t *, const knot_dname_t *, list_t *);
+static int old_journal_walk(const char *fn, uint32_t from, uint32_t to,
+			journal_apply_t cb, const knot_dname_t *zone, list_t *chgs)
+{
+	/* Open journal for reading. */
+	old_journal_t *journal = NULL;
+	int ret = old_journal_open(&journal, fn, FSLIMIT_INF);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+	/* Read entries from starting serial until finished. */
+	uint32_t found_to = from;
+	journal_node_t *n = 0;
+	ret = old_journal_fetch(journal, from, journal_key_from_cmp, &n);
+	if (ret != KNOT_EOK) {
+		goto finish;
+	}
+
+	size_t i = n - journal->nodes;
+	assert(i < journal->max_nodes);
+
+	for (; i != journal->qtail; i = jnode_next(journal, i)) {
+		journal_node_t *n = journal->nodes + i;
+
+		if (!(n->flags & JOURNAL_VALID)) {
+			continue;
+		}
+		if (to == found_to) {
+			break;
+		}
+		ret = cb(journal, n, zone, chgs);
+		if (ret != KNOT_EOK) {
+			break;
+		}
+	}
+
+finish:
+	old_journal_close(journal);
+	return ret;
+}
+
+static int load_changeset(old_journal_t *journal, journal_node_t *n,
+                          const knot_dname_t *zone, list_t *chgs)
+{
+	changeset_t *ch = changeset_new(zone);
+	if (ch == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	/* Initialize changeset. */
+	ch->data = malloc(n->len);
+	if (!ch->data) {
+		return KNOT_ENOMEM;
+	}
+
+	/* Read journal entry. */
+	int ret = old_journal_read_node(journal, n, (char*)ch->data);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	/* Update changeset binary size. */
+	ch->size = n->len;
+
+	/* Insert into changeset list. */
+	add_tail(chgs, &ch->n);
+
+	return KNOT_EOK;
+}
+
+int old_journal_load_changesets(const char *path, const knot_dname_t *zone,
+                                list_t *dst, uint32_t from, uint32_t to)
+{
+	int ret = old_journal_walk(path, from, to, &load_changeset, zone, dst);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	assert(dst != NULL);
+
+	changeset_t* chs = NULL;
+	WALK_LIST(chs, *dst) {
+		ret = changesets_unpack(chs);
+		if (ret != KNOT_EOK) {
+			return ret;
+		}
+	}
+
+	/* Check for complete history. */
+	changeset_t *last = TAIL(*dst);
+	if (to != knot_soa_serial(&last->soa_to->rrs)) {
+		return KNOT_ERANGE;
+	}
+
+	return KNOT_EOK;
+}
diff --git a/src/knot/journal/old_journal.h b/src/knot/journal/old_journal.h
new file mode 100644
index 0000000000000000000000000000000000000000..57e07dda69c5d0f0194f71e75fa1932c490d4e89
--- /dev/null
+++ b/src/knot/journal/old_journal.h
@@ -0,0 +1,46 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <stdint.h>
+
+#include "contrib/ucw/lists.h"
+
+/*!
+ * \brief Check if the journal file is used or not.
+ *
+ * \param path Journal file.
+ *
+ * \return true or false
+ */
+bool old_journal_exists(const char *path);
+
+/*!
+ * \brief Load changesets from journal.
+ *
+ * \param path Path to journal file.
+ * \param zone Corresponding zone.
+ * \param dst Store changesets here.
+ * \param from Start serial.
+ * \param to End serial.
+ *
+ * \retval KNOT_EOK on success.
+ * \retval KNOT_ERANGE if given entry was not found.
+ * \return < KNOT_EOK on error.
+ */
+int old_journal_load_changesets(const char *path, const knot_dname_t *zone,
+                                list_t *dst, uint32_t from, uint32_t to);
diff --git a/src/knot/journal/serialization.c b/src/knot/journal/serialization.c
new file mode 100644
index 0000000000000000000000000000000000000000..38fa302cc540bd03e9f38e5081454392baea8c52
--- /dev/null
+++ b/src/knot/journal/serialization.c
@@ -0,0 +1,332 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <assert.h>
+
+#include "knot/journal/serialization.h"
+#include "libknot/libknot.h"
+#include "contrib/wire_ctx.h"
+
+#define SERIALIZE_RRSET_INIT (-1)
+#define SERIALIZE_RRSET_DONE ((1L<<16)+1)
+
+static int serialize_rrset(wire_ctx_t *wire, const knot_rrset_t *rrset, long *phase)
+{
+	assert(wire != NULL && rrset != NULL && phase != NULL);
+	assert(*phase >= SERIALIZE_RRSET_INIT && *phase < SERIALIZE_RRSET_DONE);
+
+	if (*phase == SERIALIZE_RRSET_INIT) {
+		// write owner, type, class, rrcnt
+		int size = knot_dname_to_wire(wire->position, rrset->owner,
+		                              wire_ctx_available(wire));
+		if (size < 0 || wire_ctx_available(wire) < size + 3 * sizeof(uint16_t)) {
+			return KNOT_EOK;
+		}
+		wire_ctx_skip(wire, size);
+		wire_ctx_write_u16(wire, rrset->type);
+		wire_ctx_write_u16(wire, rrset->rclass);
+		wire_ctx_write_u16(wire, rrset->rrs.rr_count);
+		(*phase)++;
+	}
+
+	for ( ; *phase < rrset->rrs.rr_count; (*phase)++) {
+		const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, *phase);
+		assert(rr);
+		uint16_t rdlen = knot_rdata_rdlen(rr);
+		if (wire_ctx_available(wire) < sizeof(uint32_t) + sizeof(uint16_t) + rdlen) {
+			return KNOT_EOK;
+		}
+		wire_ctx_write_u32(wire, knot_rdata_ttl(rr));
+		wire_ctx_write_u16(wire, rdlen);
+		wire_ctx_write(wire, knot_rdata_data(rr), rdlen);
+	}
+
+	*phase = SERIALIZE_RRSET_DONE;
+	return KNOT_EOK;
+}
+
+static int deserialize_rrset(wire_ctx_t *wire, knot_rrset_t *rrset, long *phase)
+{
+	assert(wire != NULL && rrset != NULL && phase != NULL);
+	assert(*phase >= SERIALIZE_RRSET_INIT && *phase < SERIALIZE_RRSET_DONE);
+
+	if (*phase == SERIALIZE_RRSET_INIT && wire_ctx_available(wire) > 0) {
+		// Read owner, rtype, rclass and RR count.
+		int size = knot_dname_size(wire->position);
+		if (size < 0) {
+			return size;
+		}
+		knot_dname_t *owner = knot_dname_copy_part(wire->position, size, NULL);
+		if (owner == NULL || wire_ctx_available(wire) < size + 3 * sizeof(uint16_t)) {
+			return KNOT_EMALF;
+		}
+		wire_ctx_skip(wire, size);
+		uint16_t type = wire_ctx_read_u16(wire);
+		uint16_t rclass = wire_ctx_read_u16(wire);
+		uint16_t rrcount = wire_ctx_read_u16(wire);
+		(*phase) = rrcount;
+		if (wire->error != KNOT_EOK) {
+			return wire->error;
+		}
+		knot_rrset_init(rrset, owner, type, rclass);
+	}
+
+	for ( ; *phase > 0 && wire_ctx_available(wire) > 0; (*phase)--) {
+		uint32_t ttl = wire_ctx_read_u32(wire);
+		uint32_t rdata_size = wire_ctx_read_u16(wire);
+		if (wire->error != KNOT_EOK ||
+		    wire_ctx_available(wire) < rdata_size ||
+		    knot_rrset_add_rdata(rrset, wire->position, rdata_size,
+		                         ttl, NULL) != KNOT_EOK) {
+			knot_rrset_clear(rrset, NULL);
+			return KNOT_EMALF;
+		}
+		wire_ctx_skip(wire, rdata_size);
+	}
+
+	if (*phase == 0) {
+		*phase = SERIALIZE_RRSET_DONE;
+	}
+	return KNOT_EOK;
+}
+
+static int serialize_rrset_chunks(wire_ctx_t *wire, const knot_rrset_t *rrset,
+                                  uint8_t *dst_chunks[], size_t chunk_size,
+                                  size_t chunks_count, size_t *chunks_real_sizes,
+                                  size_t *cur_chunk)
+{
+	long phase = SERIALIZE_RRSET_INIT;
+	while (1) {
+		int ret = serialize_rrset(wire, rrset, &phase);
+		if (ret != KNOT_EOK || phase == SERIALIZE_RRSET_DONE) {
+			return ret;
+		}
+		// now the rrset didn't fit whole to this chunk
+		if (*cur_chunk >= chunks_count - 1) {
+			return KNOT_ESPACE;
+		}
+		if (wire->error != KNOT_EOK) {
+			return wire->error;
+		}
+		chunks_real_sizes[*cur_chunk] = wire_ctx_offset(wire);
+		(*cur_chunk)++;
+		*wire = wire_ctx_init(dst_chunks[*cur_chunk], chunk_size);
+	}
+}
+
+static int deserialize_rrset_chunks(wire_ctx_t *wire, knot_rrset_t *rrset,
+                                    uint8_t *src_chunks[], const size_t *chunk_sizes,
+                                    size_t chunks_count, size_t *cur_chunk)
+{
+	long phase = SERIALIZE_RRSET_INIT;
+	while (1) {
+		int ret = deserialize_rrset(wire, rrset, &phase);
+		if (ret != KNOT_EOK || phase == SERIALIZE_RRSET_DONE) {
+			return ret;
+		}
+		// now the rrset wasn't whole on this chunk
+		if (*cur_chunk >= chunks_count - 1) {
+			return KNOT_EMALF;
+		}
+		if (wire->error != KNOT_EOK) {
+			return wire->error;
+		}
+		(*cur_chunk)++;
+		assert(chunk_sizes[*cur_chunk] > 0);
+		*wire = wire_ctx_init(src_chunks[*cur_chunk], chunk_sizes[*cur_chunk]);
+	}
+}
+
+static uint64_t rrset_binary_size(const knot_rrset_t *rrset)
+{
+	if (rrset == NULL || rrset->rrs.rr_count == 0) {
+		return 0;
+	}
+
+	// Owner size + type + class + RR count.
+	uint64_t size = knot_dname_size(rrset->owner) + 3 * sizeof(uint16_t);
+
+	// RRs.
+	for (uint16_t i = 0; i < rrset->rrs.rr_count; i++) {
+		const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, i);
+		assert(rr);
+
+		// TTL + RR size + RR.
+		size += sizeof(uint32_t) + sizeof(uint16_t) + knot_rdata_rdlen(rr);
+	}
+
+	return size;
+}
+
+size_t changeset_serialized_size(const changeset_t *ch)
+{
+	if (ch == NULL) {
+		return 0;
+	}
+
+	size_t soa_from_size = rrset_binary_size(ch->soa_from);
+	size_t soa_to_size = rrset_binary_size(ch->soa_to);
+
+	changeset_iter_t it;
+	changeset_iter_all(&it, ch);
+
+	size_t change_size = 0;
+	knot_rrset_t rrset = changeset_iter_next(&it);
+	while (!knot_rrset_empty(&rrset)) {
+		change_size += rrset_binary_size(&rrset);
+		rrset = changeset_iter_next(&it);
+	}
+
+	changeset_iter_clear(&it);
+
+	return soa_from_size + soa_to_size + change_size;
+}
+
+int changeset_serialize(const changeset_t *ch, uint8_t *dst_chunks[],
+                        size_t chunk_size, size_t chunks_count, size_t *chunks_real_sizes,
+                        size_t *chunks_real_count)
+{
+	if (ch == NULL || dst_chunks == NULL || chunk_size == 0 || chunks_count == 0 ||
+	    chunks_real_sizes == NULL || chunks_real_count == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	for (int i = 0; i < chunks_count; i++) {
+		chunks_real_sizes[i] = 0;
+	}
+
+	wire_ctx_t wire = wire_ctx_init(dst_chunks[0], chunk_size);
+	size_t cur_chunk = 0;
+
+	// Serialize SOA 'from'.
+	int ret = serialize_rrset_chunks(&wire, ch->soa_from, dst_chunks, chunk_size,
+	                                 chunks_count, chunks_real_sizes, &cur_chunk);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	// Serialize RRSets from the 'rem' section.
+	changeset_iter_t it;
+	ret = changeset_iter_rem(&it, ch);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	knot_rrset_t rrset = changeset_iter_next(&it);
+	while (!knot_rrset_empty(&rrset)) {
+		ret = serialize_rrset_chunks(&wire, &rrset, dst_chunks, chunk_size,
+		                             chunks_count, chunks_real_sizes, &cur_chunk);
+		if (ret != KNOT_EOK) {
+			changeset_iter_clear(&it);
+			return ret;
+		}
+		rrset = changeset_iter_next(&it);
+	}
+	changeset_iter_clear(&it);
+
+	// Serialize SOA 'to'.
+	ret = serialize_rrset_chunks(&wire, ch->soa_to, dst_chunks, chunk_size,
+	                             chunks_count, chunks_real_sizes, &cur_chunk);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	// Serialize RRSets from the 'add' section.
+	ret = changeset_iter_add(&it, ch);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	rrset = changeset_iter_next(&it);
+	while (!knot_rrset_empty(&rrset)) {
+		ret = serialize_rrset_chunks(&wire, &rrset, dst_chunks, chunk_size,
+		                             chunks_count, chunks_real_sizes, &cur_chunk);
+		if (ret != KNOT_EOK) {
+			changeset_iter_clear(&it);
+
+			return ret;
+		}
+		rrset = changeset_iter_next(&it);
+	}
+	changeset_iter_clear(&it);
+
+	chunks_real_sizes[cur_chunk] = wire_ctx_offset(&wire);
+	*chunks_real_count = cur_chunk + 1;
+
+	return wire.error;
+}
+
+int changeset_deserialize(changeset_t *ch, uint8_t *src_chunks[],
+                          const size_t *chunks_sizes, size_t chunks_count)
+{
+	if (ch == NULL || src_chunks == NULL || chunks_sizes == NULL ||
+	    chunks_count == 0) {
+		return KNOT_EINVAL;
+	}
+
+	size_t cur_chunk = 0;
+	wire_ctx_t wire = wire_ctx_init_const(src_chunks[0], chunks_sizes[0]);
+
+	// Deserialize SOA 'from'.
+	knot_rrset_t rrset;
+	int ret = deserialize_rrset_chunks(&wire, &rrset, src_chunks, chunks_sizes, chunks_count, &cur_chunk);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+	assert(rrset.type == KNOT_RRTYPE_SOA);
+
+	ch->soa_from = knot_rrset_copy(&rrset, NULL);
+	knot_rrset_clear(&rrset, NULL);
+	if (ch->soa_from == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	// Read remaining RRSets.
+	bool in_remove_section = true;
+	while (cur_chunk < chunks_count - 1 || wire_ctx_available(&wire) > 0) {
+		// Parse next RRSet.
+		ret = deserialize_rrset_chunks(&wire, &rrset, src_chunks, chunks_sizes, chunks_count, &cur_chunk);
+		if (ret != KNOT_EOK) {
+			break;
+		}
+
+		// Check for next (and also last) SOA.
+		if (rrset.type == KNOT_RRTYPE_SOA) {
+			// Move to ADD section if in REMOVE.
+			assert(in_remove_section);
+			in_remove_section = false;
+
+			ch->soa_to = knot_rrset_copy(&rrset, NULL);
+			if (ch->soa_to == NULL) {
+				ret = KNOT_ENOMEM;
+			}
+		} else {
+			if (in_remove_section) {
+				ret = changeset_add_removal(ch, &rrset, 0);
+			} else {
+				ret = changeset_add_addition(ch, &rrset, 0);
+			}
+		}
+
+		knot_rrset_clear(&rrset, NULL);
+
+		if (ret != KNOT_EOK) {
+			return ret;
+		}
+	}
+
+	return wire.error;
+}
diff --git a/src/knot/journal/serialization.h b/src/knot/journal/serialization.h
new file mode 100644
index 0000000000000000000000000000000000000000..0558bd72c5452dca20ce5b2fc36a67687c0160a5
--- /dev/null
+++ b/src/knot/journal/serialization.h
@@ -0,0 +1,59 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <stdint.h>
+#include "libknot/rrset.h"
+#include "knot/updates/changesets.h"
+
+/*!
+ * \brief Returns size of changeset in serialized form.
+ *
+ * \param[in] ch  Changeset whose size we want to compute.
+ *
+ * \return Size of the changeset.
+ */
+size_t changeset_serialized_size(const changeset_t *ch);
+
+/*!
+ * \brief Serializes given changeset into chunked area.
+ *
+ * \param[in]  ch                 The changeset.
+ * \param[in]  dst_chunks         The chunks to serialize into.
+ * \param[in]  chunk_size         Maximum size of each chunk.
+ * \param[in]  chunks_count       Maximum number of used chunks.
+ * \param[out] chunks_real_sizes  Real size of each chunk after serialization, or zeros for unused chunks.
+ * \param[out] chunks_real_count  Real # of chunks after serialization. Can be wrong if error returned!
+ *
+ * \retval KNOT_E*
+ */
+int changeset_serialize(const changeset_t *ch, uint8_t *dst_chunks[],
+                        size_t chunk_size, size_t chunks_count, size_t *chunks_real_sizes,
+                        size_t *chunks_real_count);
+
+/*!
+ * \brief Deserializes chunked area into ch
+ *
+ * \param[out] ch            The changeset.
+ * \param[in]  src_chunks    The chunks to deserialize.
+ * \param[in]  chunks_sizes  The size of each chunk.
+ * \param[in]  chunks_count  The number of chunks.
+ *
+ * \retval KNOT_E*
+ */
+int changeset_deserialize(changeset_t *ch, uint8_t *src_chunks[],
+                          const size_t *chunks_sizes, size_t chunks_count);
diff --git a/src/knot/modules/dnsproxy.c b/src/knot/modules/dnsproxy/dnsproxy.c
similarity index 78%
rename from src/knot/modules/dnsproxy.c
rename to src/knot/modules/dnsproxy/dnsproxy.c
index 14929f4f8977b96f16b58d7ef768eed33dfcdedb..fad149a30b651d75579b6f494dbcdf387a20d020 100644
--- a/src/knot/modules/dnsproxy.c
+++ b/src/knot/modules/dnsproxy/dnsproxy.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,21 +14,21 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "knot/query/requestor.h"
-#include "knot/common/log.h"
-#include "knot/modules/dnsproxy.h"
-#include "knot/query/capture.h"
-#include "knot/nameserver/process_query.h"
 #include "contrib/mempattern.h"
 #include "contrib/net.h"
+#include "knot/modules/dnsproxy/dnsproxy.h"
+#include "knot/query/capture.h"
+#include "knot/query/requestor.h"
 
 /* Module configuration scheme. */
 #define MOD_REMOTE		"\x06""remote"
+#define MOD_TIMEOUT		"\x07""timeout"
 #define MOD_CATCH_NXDOMAIN	"\x0E""catch-nxdomain"
 
 const yp_item_t scheme_mod_dnsproxy[] = {
 	{ C_ID,               YP_TSTR,  YP_VNONE },
 	{ MOD_REMOTE,         YP_TREF,  YP_VREF = { C_RMT }, YP_FNONE, { check_ref } },
+	{ MOD_TIMEOUT,        YP_TINT,  YP_VINT = { 0, INT32_MAX, 500 } },
 	{ MOD_CATCH_NXDOMAIN, YP_TBOOL, YP_VNONE },
 	{ C_COMMENT,          YP_TSTR,  YP_VNONE },
 	{ NULL }
@@ -46,19 +46,18 @@ int check_mod_dnsproxy(conf_check_t *args)
 	return KNOT_EOK;
 }
 
-struct dnsproxy {
+typedef struct {
 	conf_remote_t remote;
 	bool catch_nxdomain;
-};
+	int timeout;
+} dnsproxy_t;
 
 static int dnsproxy_fwd(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
 {
-	if (pkt == NULL || qdata == NULL || ctx == NULL) {
-		return KNOT_STATE_FAIL;
-	}
+	assert(pkt && qdata && ctx);
 
 	/* Forward only queries ending with REFUSED (no zone) or NXDOMAIN (if configured) */
-	struct dnsproxy *proxy = ctx;
+	dnsproxy_t *proxy = ctx;
 	if (!(qdata->rcode == KNOT_RCODE_REFUSED ||
 	     (qdata->rcode == KNOT_RCODE_NXDOMAIN && proxy->catch_nxdomain))) {
 		return state;
@@ -88,8 +87,7 @@ static int dnsproxy_fwd(int state, knot_pkt_t *pkt, struct query_data *qdata, vo
 	}
 
 	/* Forward request. */
-	int timeout = 1000 * conf()->cache.srv_tcp_reply_timeout;
-	ret = knot_requestor_exec(&re, req, timeout);
+	ret = knot_requestor_exec(&re, req, proxy->timeout);
 
 	knot_request_free(req, re.mm);
 	knot_requestor_clear(&re);
@@ -103,36 +101,34 @@ static int dnsproxy_fwd(int state, knot_pkt_t *pkt, struct query_data *qdata, vo
 	return KNOT_STATE_DONE;
 }
 
-int dnsproxy_load(struct query_plan *plan, struct query_module *self,
-                  const knot_dname_t *zone)
+int dnsproxy_load(struct query_module *self)
 {
-	if (plan == NULL || self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
-	struct dnsproxy *proxy = mm_alloc(self->mm, sizeof(struct dnsproxy));
+	dnsproxy_t *proxy = mm_alloc(self->mm, sizeof(*proxy));
 	if (proxy == NULL) {
 		return KNOT_ENOMEM;
 	}
-	memset(proxy, 0, sizeof(struct dnsproxy));
 
 	conf_val_t val = conf_mod_get(self->config, MOD_REMOTE, self->id);
 	proxy->remote = conf_remote(self->config, &val, 0);
 
+	val = conf_mod_get(self->config, MOD_TIMEOUT, self->id);
+	proxy->timeout = conf_int(&val);
+
 	val = conf_mod_get(self->config, MOD_CATCH_NXDOMAIN, self->id);
 	proxy->catch_nxdomain = conf_bool(&val);
 
 	self->ctx = proxy;
 
-	return query_plan_step(plan, QPLAN_END, dnsproxy_fwd, self->ctx);
+	return query_module_step(self, QPLAN_END, dnsproxy_fwd);
 }
 
-int dnsproxy_unload(struct query_module *self)
+void dnsproxy_unload(struct query_module *self)
 {
-	if (self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
-	mm_free(self->mm, self->ctx);
-	return KNOT_EOK;
+	dnsproxy_t *ctx = self->ctx;
+
+	mm_free(self->mm, ctx);
 }
diff --git a/src/knot/modules/dnsproxy.h b/src/knot/modules/dnsproxy/dnsproxy.h
similarity index 74%
rename from src/knot/modules/dnsproxy.h
rename to src/knot/modules/dnsproxy/dnsproxy.h
index 8a6e675420489a4e1861087a25a09fb4be4468d8..b2b49d10755705928e560c28cd3e27f73082ecc6 100644
--- a/src/knot/modules/dnsproxy.h
+++ b/src/knot/modules/dnsproxy/dnsproxy.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,19 +14,9 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /*!
- * \file
- *
- * \brief DNS proxy module
- *
- * Accepted configurations:
- *  * "<address>"
- *
  * Module forwards all unsatisfied queries to the specified server in
  * order to solve them, and then sends the response back, i.e. a tiny
  * DNS proxy.
- *
- * \addtogroup query_processing
- * @{
  */
 
 #pragma once
@@ -39,8 +29,5 @@ extern const yp_item_t scheme_mod_dnsproxy[];
 int check_mod_dnsproxy(conf_check_t *args);
 
 /*! \brief Module interface. */
-int dnsproxy_load(struct query_plan *plan, struct query_module *self,
-                  const knot_dname_t *zone);
-int dnsproxy_unload(struct query_module *self);
-
-/*! @} */
+int dnsproxy_load(struct query_module *self);
+void dnsproxy_unload(struct query_module *self);
diff --git a/src/knot/modules/dnstap.c b/src/knot/modules/dnstap/dnstap.c
similarity index 87%
rename from src/knot/modules/dnstap.c
rename to src/knot/modules/dnstap/dnstap.c
index 796a9a5cf8af6315d0dac56e4c0e5da6e85be810..8efd66a4bf7d22e0a6e05ad9290a79dfecf8106c 100644
--- a/src/knot/modules/dnstap.c
+++ b/src/knot/modules/dnstap/dnstap.c
@@ -16,16 +16,13 @@
 
 #include <sys/stat.h>
 
-#include "knot/common/log.h"
-#include "knot/modules/dnstap.h"
-#include "knot/nameserver/process_query.h"
+#include "contrib/dnstap/dnstap.h"
 #include "contrib/dnstap/dnstap.pb-c.h"
-#include "contrib/dnstap/writer.h"
 #include "contrib/dnstap/message.h"
-#include "contrib/dnstap/dnstap.h"
+#include "contrib/dnstap/writer.h"
 #include "contrib/mempattern.h"
 #include "contrib/time.h"
-#include "libknot/libknot.h"
+#include "knot/modules/dnstap/dnstap.h"
 
 /* Module configuration scheme. */
 #define MOD_SINK	"\x04""sink"
@@ -68,11 +65,13 @@ typedef struct {
 static int log_message(int state, const knot_pkt_t *pkt, struct query_data *qdata,
                        dnstap_ctx_t *ctx)
 {
-	if (pkt == NULL || qdata == NULL || ctx == NULL) {
-		return KNOT_STATE_FAIL;
+	assert(pkt && qdata && ctx);
+
+	/* Skip empty packet. */
+	if (pkt->size == 0) {
+		return state;
 	}
 
-	int ret = KNOT_ERROR;
 	struct fstrm_iothr_queue *ioq =
 		fstrm_iothr_get_input_queue_idx(ctx->iothread, qdata->param->thread_id);
 
@@ -94,17 +93,17 @@ static int log_message(int state, const knot_pkt_t *pkt, struct query_data *qdat
 
 	/* Create a dnstap message. */
 	Dnstap__Message msg;
-	ret = dt_message_fill(&msg, msgtype,
-	                      (const struct sockaddr *)qdata->param->remote,
-	                      NULL, /* todo: fill me! */
-	                      protocol,
-	                      pkt->wire, pkt->size, &tv, &tv);
+	int ret = dt_message_fill(&msg, msgtype,
+	                          (const struct sockaddr *)qdata->param->remote,
+	                          NULL, /* todo: fill me! */
+	                          protocol, pkt->wire, pkt->size, &tv, &tv);
 	if (ret != KNOT_EOK) {
-		return KNOT_STATE_FAIL;
+		return state;
 	}
+
 	Dnstap__Dnstap dnstap = DNSTAP__DNSTAP__INIT;
 	dnstap.type = DNSTAP__DNSTAP__TYPE__MESSAGE;
-	dnstap.message = (Dnstap__Message *)&msg;
+	dnstap.message = &msg;
 
 	/* Set message version and identity. */
 	if (ctx->identity_len > 0) {
@@ -123,7 +122,7 @@ static int log_message(int state, const knot_pkt_t *pkt, struct query_data *qdat
 	size_t size = 0;
 	dt_pack(&dnstap, &frame, &size);
 	if (frame == NULL) {
-		return KNOT_STATE_FAIL;
+		return state;
 	}
 
 	/* Submit a request. */
@@ -131,7 +130,7 @@ static int log_message(int state, const knot_pkt_t *pkt, struct query_data *qdat
 	                                   fstrm_free_wrapper, NULL);
 	if (res != fstrm_res_success) {
 		free(frame);
-		state = KNOT_STATE_FAIL;
+		return state;
 	}
 
 	return state;
@@ -141,9 +140,7 @@ static int log_message(int state, const knot_pkt_t *pkt, struct query_data *qdat
 static int dnstap_message_log_query(int state, knot_pkt_t *pkt, struct query_data *qdata,
                                     void *ctx)
 {
-	if (qdata == NULL) {
-		return KNOT_STATE_FAIL;
-	}
+	assert(qdata);
 
 	return log_message(state, qdata->query, qdata, ctx);
 }
@@ -223,12 +220,9 @@ static struct fstrm_writer* dnstap_writer(const char *path)
 	return dnstap_file_writer(path);
 }
 
-int dnstap_load(struct query_plan *plan, struct query_module *self,
-                const knot_dname_t *zone)
+int dnstap_load(struct query_module *self)
 {
-	if (plan == NULL || self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
 	/* Create dnstap context. */
 	dnstap_ctx_t *ctx = mm_alloc(self->mm, sizeof(*ctx));
@@ -292,10 +286,10 @@ int dnstap_load(struct query_plan *plan, struct query_module *self,
 
 	/* Hook to the query plan. */
 	if (log_queries) {
-		query_plan_step(plan, QPLAN_BEGIN, dnstap_message_log_query, self->ctx);
+		query_module_step(self, QPLAN_BEGIN, dnstap_message_log_query);
 	}
 	if (log_responses) {
-		query_plan_step(plan, QPLAN_END, dnstap_message_log_response, self->ctx);
+		query_module_step(self, QPLAN_END, dnstap_message_log_response);
 	}
 
 	return KNOT_EOK;
@@ -309,11 +303,9 @@ fail:
 	return KNOT_ENOMEM;
 }
 
-int dnstap_unload(struct query_module *self)
+void dnstap_unload(struct query_module *self)
 {
-	if (self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
 	dnstap_ctx_t *ctx = self->ctx;
 
@@ -321,6 +313,4 @@ int dnstap_unload(struct query_module *self)
 	free(ctx->identity);
 	free(ctx->version);
 	mm_free(self->mm, ctx);
-
-	return KNOT_EOK;
 }
diff --git a/src/knot/modules/dnstap.h b/src/knot/modules/dnstap/dnstap.h
similarity index 75%
rename from src/knot/modules/dnstap.h
rename to src/knot/modules/dnstap/dnstap.h
index 25df3c1dfc68e645718c171512e0cb73b74010d6..5873c8050bda16c3c5d63268299209e6827cf7ea 100644
--- a/src/knot/modules/dnstap.h
+++ b/src/knot/modules/dnstap/dnstap.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -13,12 +13,6 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-/*!
- * \file
- *
- * \addtogroup query_processing
- * @{
- */
 
 #pragma once
 
@@ -30,8 +24,5 @@ extern const yp_item_t scheme_mod_dnstap[];
 int check_mod_dnstap(conf_check_t *args);
 
 /*! \brief Module interface. */
-int dnstap_load(struct query_plan *plan, struct query_module *self,
-                const knot_dname_t *zone);
-int dnstap_unload(struct query_module *self);
-
-/*! @} */
+int dnstap_load(struct query_module *self);
+void dnstap_unload(struct query_module *self);
diff --git a/src/knot/modules/noudp.c b/src/knot/modules/noudp/noudp.c
similarity index 78%
rename from src/knot/modules/noudp.c
rename to src/knot/modules/noudp/noudp.c
index 8c4cb069f48c972463910e3893557e960111ff49..706fe7d2faec5cb7fc3f206846ca5455fab732fe 100644
--- a/src/knot/modules/noudp.c
+++ b/src/knot/modules/noudp/noudp.c
@@ -14,8 +14,7 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "knot/modules/noudp.h"
-#include "knot/nameserver/process_query.h"
+#include "knot/modules/noudp/noudp.h"
 
 const yp_item_t scheme_mod_noudp[] = {
 	{ C_ID, YP_TSTR, YP_VNONE },
@@ -29,6 +28,8 @@ static bool is_udp(struct query_data *qdata)
 
 int noudp_begin(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
 {
+	assert(pkt && qdata);
+
 	if (is_udp(qdata)) {
 		knot_wire_set_tc(pkt->wire);
 		return KNOT_STATE_DONE;
@@ -37,15 +38,14 @@ int noudp_begin(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
 	return state;
 }
 
-int noudp_load(struct query_plan *plan, struct query_module *self,
-               const knot_dname_t *zone)
+int noudp_load(struct query_module *self)
 {
-	query_plan_step(plan, QPLAN_BEGIN, noudp_begin, NULL);
+	query_module_step(self, QPLAN_BEGIN, noudp_begin);
 
 	return KNOT_EOK;
 }
 
-int noudp_unload(struct query_module *self)
+void noudp_unload(struct query_module *self)
 {
-	return KNOT_EOK;
+	return;
 }
diff --git a/src/knot/modules/noudp.h b/src/knot/modules/noudp/noudp.h
similarity index 84%
rename from src/knot/modules/noudp.h
rename to src/knot/modules/noudp/noudp.h
index 02242e00519266779bda77ea25940035b5221e4f..a2c3681c7534ddff54271ae05a19c58b73a66b06 100644
--- a/src/knot/modules/noudp.h
+++ b/src/knot/modules/noudp/noudp.h
@@ -22,7 +22,5 @@
 
 extern const yp_item_t scheme_mod_noudp[];
 
-int noudp_load(struct query_plan *plan, struct query_module *self,
-               const knot_dname_t *zone);
-
-int noudp_unload(struct query_module *self);
+int noudp_load(struct query_module *self);
+void noudp_unload(struct query_module *self);
diff --git a/src/knot/modules/online_sign/module.c b/src/knot/modules/online_sign/online_sign.c
similarity index 77%
rename from src/knot/modules/online_sign/module.c
rename to src/knot/modules/online_sign/online_sign.c
index c7a08cf0fa62973102cd0e0830f5ae20d219b6dd..6b03de852909a8ab5fdf82d13e8a416b3a34967f 100644
--- a/src/knot/modules/online_sign/module.c
+++ b/src/knot/modules/online_sign/online_sign.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -15,22 +15,25 @@
 */
 
 #include <assert.h>
+#include <stddef.h>
 
-#include "knot/common/log.h"
+#include "dnssec/error.h"
 
-#include "knot/dnssec/rrset-sign.h"
-#include "knot/modules/online_sign/module.h"
+#include "contrib/string.h"
+#include "knot/modules/online_sign/online_sign.h"
 #include "knot/modules/online_sign/nsec_next.h"
-#include "knot/nameserver/internet.h"
-#include "knot/nameserver/process_query.h"
+#include "knot/dnssec/rrset-sign.h"
+#include "knot/dnssec/zone-keys.h"
+#include "knot/dnssec/zone-events.h"
 
-#include "libknot/dname.h"
-#include "contrib/string.h"
+#define MOD_POLICY	C_POLICY
 
-#include "dnssec/error.h"
-#include "dnssec/kasp.h"
-#include "dnssec/sign.h"
-#include "dnssec/nsec.h"
+const yp_item_t scheme_mod_online_sign[] = {
+	{ C_ID,       YP_TSTR, YP_VNONE },
+	{ MOD_POLICY, YP_TREF, YP_VREF = { C_POLICY }, YP_FNONE, { check_ref_dflt } },
+	{ C_COMMENT,  YP_TSTR, YP_VNONE },
+	{ NULL }
+};
 
 #define module_zone_error(zone, msg...) \
 	MODULE_ZONE_ERR(C_MOD_ONLINE_SIGN, zone, msg)
@@ -72,16 +75,10 @@ static const uint16_t NSEC_FORCE_TYPES[] = {
 	0
 };
 
-const yp_item_t scheme_mod_online_sign[] = {
-	{ C_ID, YP_TSTR, YP_VNONE },
-	{ NULL }
-};
-
-struct online_sign_ctx {
+typedef struct {
 	dnssec_key_t *key;
-};
-
-typedef struct online_sign_ctx online_sign_ctx_t;
+	uint32_t rrsig_lifetime;
+} online_sign_ctx_t;
 
 static bool want_dnssec(struct query_data *qdata)
 {
@@ -255,7 +252,7 @@ static knot_rrset_t *sign_rrset(const knot_dname_t *owner,
 	// compatible context
 
 	dnssec_kasp_policy_t policy = {
-		.rrsig_lifetime = RRSIG_LIFETIME
+		.rrsig_lifetime = module_ctx->rrsig_lifetime
 	};
 
 	kdnssec_ctx_t ksign_ctx = {
@@ -429,63 +426,26 @@ static int synth_answer(int state, knot_pkt_t *pkt, struct query_data *qdata, vo
 	return state;
 }
 
-static int get_online_key(dnssec_key_t **key_ptr, const knot_dname_t *zone_name,
-                          const char *kasp_path)
+static int get_online_key(dnssec_key_t **key_ptr, struct query_module *module)
 {
-	dnssec_kasp_t *kasp = NULL;
-	dnssec_kasp_zone_t *zone = NULL;
-	dnssec_kasp_policy_t *policy = NULL;
-	dnssec_kasp_keystore_t *kasp_keystore = NULL;
-	dnssec_keystore_t *keystore = NULL;
+	kdnssec_ctx_t kctx = { 0 };
 
-	// KASP database
+	conf_val_t policy = conf_mod_get(module->config, MOD_POLICY, module->id);
 
-	int r = dnssec_kasp_init_dir(&kasp);
+	int r = kdnssec_ctx_init(&kctx, module->zone, &policy, true);
 	if (r != DNSSEC_EOK) {
 		goto fail;
 	}
 
-	r = dnssec_kasp_open(kasp, kasp_path);
-	if (r != DNSSEC_EOK) {
-		goto fail;
-	}
-
-	// KASP zone
+	// Force Singe-Type signing scheme.
+	kctx.policy->singe_type_signing = true;
 
-	char *zone_str = knot_dname_to_str_alloc(zone_name);
-	if (!zone_str) {
-		r = KNOT_ENOMEM;
-		goto fail;
-	}
-
-	r = dnssec_kasp_zone_load(kasp, zone_str, &zone);
-	free(zone_str);
+	r = knot_dnssec_sign_process_events(&kctx, module->zone);
 	if (r != DNSSEC_EOK) {
 		goto fail;
 	}
 
-	// KASP keystore
-
-	const char *policy_id = dnssec_kasp_zone_get_policy(zone);
-	r = dnssec_kasp_policy_load(kasp, policy_id, &policy);
-	if (r != DNSSEC_EOK) {
-		goto fail;
-	}
-
-	r = dnssec_kasp_keystore_load(kasp, policy->keystore, &kasp_keystore);
-	if (r != DNSSEC_EOK) {
-		goto fail;
-	}
-
-	r = dnssec_kasp_keystore_open(kasp, kasp_keystore->backend,
-	                              kasp_keystore->config, &keystore);
-	if (r != DNSSEC_EOK) {
-		goto fail;
-	}
-
-	// DNSSEC key
-
-	dnssec_list_t *list = dnssec_kasp_zone_get_keys(zone);
+	dnssec_list_t *list = dnssec_kasp_zone_get_keys(kctx.zone);
 	assert(list);
 	dnssec_item_t *item = dnssec_list_nth(list, 0);
 	if (!item) {
@@ -502,7 +462,7 @@ static int get_online_key(dnssec_key_t **key_ptr, const knot_dname_t *zone_name,
 		goto fail;
 	}
 
-	r = dnssec_key_import_keystore(key, keystore, kasp_key->id);
+	r = dnssec_key_import_keystore(key, kctx.keystore, kasp_key->id);
 	if (r != DNSSEC_EOK) {
 		dnssec_key_free(key);
 		goto fail;
@@ -511,11 +471,7 @@ static int get_online_key(dnssec_key_t **key_ptr, const knot_dname_t *zone_name,
 	*key_ptr = key;
 
 fail:
-	dnssec_keystore_deinit(keystore);
-	dnssec_kasp_keystore_free(kasp_keystore);
-	dnssec_kasp_policy_free(policy);
-	dnssec_kasp_zone_free(zone);
-	dnssec_kasp_deinit(kasp);
+	kdnssec_ctx_deinit(&kctx);
 
 	return r;
 }
@@ -527,85 +483,70 @@ static void online_sign_ctx_free(online_sign_ctx_t *ctx)
 	free(ctx);
 }
 
-static int online_sign_ctx_new(online_sign_ctx_t **ctx_ptr,
-                               const knot_dname_t *zone, const char *kasp_path)
+static int online_sign_ctx_new(online_sign_ctx_t **ctx_ptr, struct query_module *module)
 {
 	online_sign_ctx_t *ctx = calloc(1, sizeof(*ctx));
 	if (!ctx) {
 		return KNOT_ENOMEM;
 	}
 
-	int r = get_online_key(&ctx->key, zone, kasp_path);
+	int r = get_online_key(&ctx->key, module);
 	if (r != KNOT_EOK) {
 		online_sign_ctx_free(ctx);
 		return r;
 	}
 
+	ctx->rrsig_lifetime = RRSIG_LIFETIME;
+	conf_val_t policy = conf_mod_get(module->config, MOD_POLICY, module->id);
+	if (policy.code == KNOT_EOK) {
+		conf_val_t val = conf_id_get(module->config, C_POLICY, C_RRSIG_LIFETIME, &policy);
+		if (val.code == KNOT_EOK) {
+			ctx->rrsig_lifetime = conf_int(&val);
+		}
+	}
+
 	*ctx_ptr = ctx;
 
 	return KNOT_EOK;
 }
 
-static char *conf_kasp_path(const knot_dname_t *zone)
-{
-	conf_val_t val = { 0 };
-
-	val = conf_zone_get(conf(), C_STORAGE, zone);
-	char *storage = conf_abs_path(&val, NULL);
-	val = conf_zone_get(conf(), C_KASP_DB, zone);
-	char *kasp_db = conf_abs_path(&val, storage);
-	free(storage);
-
-	return kasp_db;
-}
-
-int online_sign_load(struct query_plan *plan, struct query_module *module,
-                     const knot_dname_t *zone)
+int online_sign_load(struct query_module *module)
 {
-	assert(plan);
 	assert(module);
-	assert(zone);
+	assert(module->zone);
 
-	conf_val_t val = conf_zone_get(conf(), C_DNSSEC_SIGNING, zone);
+	conf_val_t val = conf_zone_get(module->config, C_DNSSEC_SIGNING, module->zone);
 	if (conf_bool(&val)) {
-		module_zone_error(zone, "incompatible with automatic signing");
+		module_zone_error(module->zone, "incompatible with automatic signing");
 		return KNOT_ENOTSUP;
 	}
 
-	char *kasp_path = conf_kasp_path(zone);
-	if (!kasp_path) {
-		module_zone_error(zone, "KASP database is not configured");
-		return KNOT_ERROR;
-	}
-
 	online_sign_ctx_t *ctx = NULL;
-	int r = online_sign_ctx_new(&ctx, zone, kasp_path);
-	free(kasp_path);
+	int r = online_sign_ctx_new(&ctx, module);
 	if (r != KNOT_EOK) {
-		module_zone_error(zone, "failed to initialize signing key (%s)",
+		module_zone_error(module->zone, "failed to initialize signing key (%s)",
 		                  dnssec_strerror(r));
 		return KNOT_ERROR;
 	}
 
-	query_plan_step(plan, QPLAN_ANSWER, synth_answer, ctx);
-	query_plan_step(plan, QPLAN_ANSWER, sign_section, ctx);
+	module->ctx = ctx;
 
-	query_plan_step(plan, QPLAN_AUTHORITY, synth_authority, ctx);
-	query_plan_step(plan, QPLAN_AUTHORITY, sign_section, ctx);
+	query_module_step(module, QPLAN_ANSWER, synth_answer);
+	query_module_step(module, QPLAN_ANSWER, sign_section);
 
-	query_plan_step(plan, QPLAN_ADDITIONAL, sign_section, ctx);
+	query_module_step(module, QPLAN_AUTHORITY, synth_authority);
+	query_module_step(module, QPLAN_AUTHORITY, sign_section);
 
-	module->ctx = ctx;
+	query_module_step(module, QPLAN_ADDITIONAL, sign_section);
 
 	return KNOT_EOK;
 }
 
-int online_sign_unload(struct query_module *module)
+void online_sign_unload(struct query_module *module)
 {
 	assert(module);
 
-	online_sign_ctx_free(module->ctx);
-	module->ctx = NULL;
+	online_sign_ctx_t *ctx = module->ctx;
 
-	return KNOT_EOK;
+	online_sign_ctx_free(ctx);
 }
diff --git a/src/knot/modules/online_sign/module.h b/src/knot/modules/online_sign/online_sign.h
similarity index 77%
rename from src/knot/modules/online_sign/module.h
rename to src/knot/modules/online_sign/online_sign.h
index 0cbdfb18be8db24ba3ec731f4d453a84385e6efd..c2b04dfaae8ce6353adec4d7d6f53eaa84a12cab 100644
--- a/src/knot/modules/online_sign/module.h
+++ b/src/knot/modules/online_sign/online_sign.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -21,6 +21,5 @@
 #define C_MOD_ONLINE_SIGN "\x0f""mod-online-sign"
 extern const yp_item_t scheme_mod_online_sign[];
 
-int online_sign_load(struct query_plan *plan, struct query_module *self,
-                     const knot_dname_t *zone);
-int online_sign_unload(struct query_module *self);
+int online_sign_load(struct query_module *self);
+void online_sign_unload(struct query_module *self);
diff --git a/src/knot/modules/rosedb.c b/src/knot/modules/rosedb/rosedb.c
similarity index 95%
rename from src/knot/modules/rosedb.c
rename to src/knot/modules/rosedb/rosedb.c
index ebef9a3dfddc1f173b3e7d3d6c042ad1408fa016..6a1de5d8fc400d296f3427611a1ea589e59c2a75 100644
--- a/src/knot/modules/rosedb.c
+++ b/src/knot/modules/rosedb/rosedb.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -17,13 +17,10 @@
 #include <lmdb.h>
 
 #include "dnssec/random.h"
-#include "knot/common/log.h"
-#include "knot/modules/rosedb.h"
-#include "knot/nameserver/process_query.h"
-#include "libknot/libknot.h"
 #include "contrib/mempattern.h"
 #include "contrib/net.h"
 #include "contrib/wire.h"
+#include "knot/modules/rosedb/rosedb.h"
 
 /* Module configuration scheme. */
 #define MOD_DBDIR		"\x05""dbdir"
@@ -588,11 +585,10 @@ static int rosedb_query_txn(MDB_txn *txn, MDB_dbi dbi, knot_pkt_t *pkt, struct q
 	return ret;
 }
 
-static int rosedb_query(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
+static int rosedb_query(int state, knot_pkt_t *pkt, struct query_data *qdata,
+                        void *ctx)
 {
-	if (pkt == NULL || qdata == NULL || ctx == NULL) {
-		return KNOT_STATE_FAIL;
-	}
+	assert(pkt && qdata && ctx);
 
 	struct cache *cache = ctx;
 
@@ -613,12 +609,9 @@ static int rosedb_query(int state, knot_pkt_t *pkt, struct query_data *qdata, vo
 	return KNOT_STATE_DONE;
 }
 
-int rosedb_load(struct query_plan *plan, struct query_module *self,
-                const knot_dname_t *zone)
+int rosedb_load(struct query_module *self)
 {
-	if (plan == NULL || self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
 	conf_val_t val = conf_mod_get(self->config, MOD_DBDIR, self->id);
 	struct cache *cache = cache_open(conf_str(&val), 0, self->mm);
@@ -629,15 +622,14 @@ int rosedb_load(struct query_plan *plan, struct query_module *self,
 
 	self->ctx = cache;
 
-	return query_plan_step(plan, QPLAN_BEGIN, rosedb_query, self->ctx);
+	return query_module_step(self, QPLAN_BEGIN, rosedb_query);
 }
 
-int rosedb_unload(struct query_module *self)
+void rosedb_unload(struct query_module *self)
 {
-	if (self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
-	cache_close(self->ctx);
-	return KNOT_EOK;
+	struct cache *cache = self->ctx;
+
+	cache_close(cache);
 }
diff --git a/src/knot/modules/rosedb.h b/src/knot/modules/rosedb/rosedb.h
similarity index 73%
rename from src/knot/modules/rosedb.h
rename to src/knot/modules/rosedb/rosedb.h
index 2a74eed841b1c55541e8b5f2d29563deab485a34..eef7778d4d6563697b6f513d55b47017201c75cd 100644
--- a/src/knot/modules/rosedb.h
+++ b/src/knot/modules/rosedb/rosedb.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,18 +14,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /*!
- * \file
- *
- * \brief Static resource records
- *
- * Accepted configurations:
- *  * "<path_to_database>"
- *
  * The module provides a mean to override responses for certain queries before
  * the record is searched in the available zones.
- *
- * \addtogroup query_processing
- * @{
  */
 
 #pragma once
@@ -38,8 +28,5 @@ extern const yp_item_t scheme_mod_rosedb[];
 int check_mod_rosedb(conf_check_t *args);
 
 /*! \brief Module interface. */
-int rosedb_load(struct query_plan *plan, struct query_module *self,
-                const knot_dname_t *zone);
-int rosedb_unload(struct query_module *self);
-
-/*! @} */
+int rosedb_load(struct query_module *self);
+void rosedb_unload(struct query_module *self);
diff --git a/src/knot/modules/rosedb_tool.c b/src/knot/modules/rosedb/rosedb_tool.c
similarity index 98%
rename from src/knot/modules/rosedb_tool.c
rename to src/knot/modules/rosedb/rosedb_tool.c
index 1d0edd7bcd570c0e2976c5de5839a4dc9ed7a61d..86d41b020cd00698effbcb5ffd5e1645f963c517 100644
--- a/src/knot/modules/rosedb_tool.c
+++ b/src/knot/modules/rosedb/rosedb_tool.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -19,10 +19,9 @@
 #include <getopt.h>
 
 #include "contrib/getline.h"
-#include "knot/modules/rosedb.c"
-#include "zscanner/scanner.h"
-#include "libknot/libknot.h"
 #include "contrib/string.h"
+#include "zscanner/scanner.h"
+#include "knot/modules/rosedb/rosedb.c"
 
 static int rosedb_add(struct cache *cache, MDB_txn *txn, int argc, char *argv[]);
 static int rosedb_del(struct cache *cache, MDB_txn *txn, int argc, char *argv[]);
diff --git a/src/knot/server/rrl.c b/src/knot/modules/rrl/functions.c
similarity index 91%
rename from src/knot/server/rrl.c
rename to src/knot/modules/rrl/functions.c
index 27026f8a09a7500ca57d06a2378abbcb2816be32..b048a46efbd24d7fd0b56ceeb8d41cb64bb3c3bd 100644
--- a/src/knot/server/rrl.c
+++ b/src/knot/modules/rrl/functions.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -17,13 +17,11 @@
 #include <assert.h>
 #include <time.h>
 
-#include "dnssec/random.h"
-#include "knot/common/log.h"
-#include "knot/server/rrl.h"
-#include "knot/zone/zone.h"
-#include "libknot/libknot.h"
 #include "contrib/murmurhash3/murmurhash3.h"
 #include "contrib/sockaddr.h"
+#include "dnssec/random.h"
+#include "knot/modules/rrl/functions.h"
+#include "knot/common/log.h"
 
 /* Hopscotch defines. */
 #define HOP_LEN (sizeof(unsigned)*8)
@@ -33,7 +31,6 @@
 #define RRL_V4_PREFIX ((uint32_t)0x00ffffff)         /* /24 */
 #define RRL_V6_PREFIX ((uint64_t)0x00ffffffffffffff) /* /56 */
 /* Defaults */
-#define RRL_DEFAULT_RATE 100
 #define RRL_CAPACITY 4 /* N seconds. */
 #define RRL_SSTART 2 /* 1/Nth of the rate for slow start */
 #define RRL_PSIZE_LARGE 1024
@@ -60,16 +57,16 @@ struct cls_name {
 };
 
 static const struct cls_name rrl_cls_names[] = {
-        {CLS_NORMAL,  "POSITIVE" },
-        {CLS_ERROR,   "ERROR" },
-        {CLS_NXDOMAIN,"NXDOMAIN"},
-        {CLS_EMPTY,   "EMPTY"},
-        {CLS_LARGE,   "LARGE"},
-        {CLS_WILDCARD,"WILDCARD"},
-        {CLS_ANY,     "ANY"},
-        {CLS_DNSSEC,  "DNSSEC"},
-        {CLS_NULL,    "NULL"},
-        {CLS_NULL,    NULL}
+	{ CLS_NORMAL,   "POSITIVE" },
+	{ CLS_ERROR,    "ERROR" },
+	{ CLS_NXDOMAIN, "NXDOMAIN"},
+	{ CLS_EMPTY,    "EMPTY"},
+	{ CLS_LARGE,    "LARGE"},
+	{ CLS_WILDCARD, "WILDCARD"},
+	{ CLS_ANY,      "ANY"},
+	{ CLS_DNSSEC,   "DNSSEC"},
+	{ CLS_NULL,     "NULL"},
+	{ CLS_NULL,     NULL}
 };
 
 static inline const char *rrl_clsstr(int code)
@@ -134,15 +131,12 @@ static uint8_t rrl_clsid(rrl_req_t *p)
 	return ret;
 }
 
-static int rrl_clsname(char *dst, size_t maxlen, uint8_t cls,
-                       rrl_req_t *req, const zone_t *zone)
+static int rrl_clsname(char *dst, size_t maxlen, uint8_t cls, rrl_req_t *req,
+                       const knot_dname_t *name)
 {
-	/* Fallback zone (for errors etc.) */
-	const knot_dname_t *dn = (const knot_dname_t *)"\x00";
-
-	/* Found associated zone. */
-	if (zone != NULL) {
-		dn = zone->name;
+	if (name == NULL) {
+		/* Fallback for errors etc. */
+		name = (const knot_dname_t *)"\x00";
 	}
 
 	switch (cls) {
@@ -153,17 +147,17 @@ static int rrl_clsname(char *dst, size_t maxlen, uint8_t cls,
 	default:
 		/* Use QNAME */
 		if (req->query) {
-			dn = knot_pkt_qname(req->query);
+			name = knot_pkt_qname(req->query);
 		}
 		break;
 	}
 
 	/* Write to wire */
-	return knot_dname_to_wire((uint8_t *)dst, dn, maxlen);
+	return knot_dname_to_wire((uint8_t *)dst, name, maxlen);
 }
 
 static int rrl_classify(char *dst, size_t maxlen, const struct sockaddr_storage *a,
-                        rrl_req_t *p, const zone_t *z, uint32_t seed)
+                        rrl_req_t *p, const knot_dname_t *z, uint32_t seed)
 {
 	if (!dst || !p || !a || maxlen == 0) {
 		return KNOT_EINVAL;
@@ -295,7 +289,7 @@ static void rrl_log_state(const struct sockaddr_storage *ss, uint16_t flags, uin
 		what = "enters";
 	}
 
-	log_notice("rate limiting, address '%s' class '%s' %s limiting",
+	log_notice("mod-rrl, address '%s' class '%s' %s limiting",
 	           addr_str, rrl_clsstr(cls), what);
 #endif
 }
@@ -375,7 +369,7 @@ int rrl_setlocks(rrl_table_t *rrl, unsigned granularity)
 }
 
 rrl_item_t *rrl_hash(rrl_table_t *t, const struct sockaddr_storage *a, rrl_req_t *p,
-                     const zone_t *zone, uint32_t stamp, int *lock)
+                     const knot_dname_t *zone, uint32_t stamp, int *lock)
 {
 	char buf[RRL_CLSBLK_MAXLEN];
 	int len = rrl_classify(buf, sizeof(buf), a, p, zone, t->seed);
@@ -391,7 +385,8 @@ rrl_item_t *rrl_hash(rrl_table_t *t, const struct sockaddr_storage *a, rrl_req_t
 	/* Find an exact match in <id, id + HOP_LEN). */
 	uint16_t *qname = (uint16_t *)(buf + sizeof(uint8_t) + sizeof(uint64_t));
 	rrl_item_t match = {
-	        0, *((uint64_t *)(buf + 1)), t->rate,    /* hop, netblk, ntok */
+	        0, *((uint64_t *)(buf + 1)),             /* hop, netblk */
+		t->rate * RRL_CAPACITY,                  /* ntok */
 	        buf[0], RRL_BF_NULL,                     /* cls, flags */
 	        hash((char *)(qname + 1), *qname), stamp /* qname, time */
 	};
@@ -437,7 +432,7 @@ rrl_item_t *rrl_hash(rrl_table_t *t, const struct sockaddr_storage *a, rrl_req_t
 }
 
 int rrl_query(rrl_table_t *rrl, const struct sockaddr_storage *a, rrl_req_t *req,
-              const zone_t *zone)
+              const knot_dname_t *zone)
 {
 	if (!rrl || !req || !a) {
 		return KNOT_EINVAL;
diff --git a/src/knot/server/rrl.h b/src/knot/modules/rrl/functions.h
similarity index 81%
rename from src/knot/server/rrl.h
rename to src/knot/modules/rrl/functions.h
index 6d01ff0b0c70e77178a5c64a64776d404098bbca..a81fa02da59cae7a48d12aaba7e4f58a1b58a55b 100644
--- a/src/knot/server/rrl.h
+++ b/src/knot/modules/rrl/functions.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -13,22 +13,14 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-/*!
- * \file rrl.h
- *
- * \author Marek Vavrusa <marek.vavusa@nic.cz>
- *
- * \brief Response-rate limiting API.
- *
- * \addtogroup network
- * @{
- */
 
 #pragma once
 
 #include <stdint.h>
 #include <pthread.h>
 #include <sys/socket.h>
+
+#include "libknot/dname.h"
 #include "libknot/packet/pkt.h"
 
 /* Defaults */
@@ -41,19 +33,17 @@ enum {
 	RRL_WILDCARD  = 1 << 1  /*!< Query to wildcard name. */
 };
 
-struct zone;
-
 /*!
  * \brief RRL hash bucket.
  */
-typedef struct rrl_item {
+typedef struct {
 	unsigned hop;        /* Hop bitmap. */
 	uint64_t netblk;     /* Prefix associated. */
-	uint16_t ntok;       /* Tokens available */
-	uint8_t  cls;        /* Bucket class */
-	uint8_t  flags;      /* Flags */
-	uint32_t qname;      /* imputed(QNAME) hash */
-	uint32_t time;       /* Timestamp */
+	uint16_t ntok;       /* Tokens available. */
+	uint8_t  cls;        /* Bucket class. */
+	uint8_t  flags;      /* Flags. */
+	uint32_t qname;      /* imputed(QNAME) hash. */
+	uint32_t time;       /* Timestamp. */
 } rrl_item_t;
 
 /*!
@@ -68,20 +58,20 @@ typedef struct rrl_item {
  * As of now lock K for bucket N is calculated as K = N % (num_buckets).
  */
 
-typedef struct rrl_table {
-	uint32_t rate;       /* Configured RRL limit */
+typedef struct {
+	uint32_t rate;       /* Configured RRL limit. */
 	uint32_t seed;       /* Pseudorandom seed for hashing. */
 	pthread_mutex_t ll;
-	pthread_mutex_t *lk;      /* Table locks. */
+	pthread_mutex_t *lk; /* Table locks. */
 	unsigned lk_count;   /* Table lock count (granularity). */
-	size_t size;         /* Number of buckets */
-	rrl_item_t arr[];    /* Buckets */
+	size_t size;         /* Number of buckets. */
+	rrl_item_t arr[];    /* Buckets. */
 } rrl_table_t;
 
 /*!
  * \brief RRL request descriptor.
  */
-typedef struct rrl_req {
+typedef struct {
 	const uint8_t *w;
 	uint16_t len;
 	unsigned flags;
@@ -128,13 +118,13 @@ int rrl_setlocks(rrl_table_t *rrl, unsigned granularity);
  * \param t RRL table.
  * \param a Source address.
  * \param p RRL request.
- * \param zone Relate zone.
+ * \param zone Relate zone name.
  * \param stamp Timestamp (current time).
  * \param lock Held lock.
  * \return assigned bucket
  */
-rrl_item_t* rrl_hash(rrl_table_t *t, const struct sockaddr_storage *a, rrl_req_t *p,
-                     const struct zone *zone, uint32_t stamp, int* lock);
+rrl_item_t *rrl_hash(rrl_table_t *t, const struct sockaddr_storage *a, rrl_req_t *p,
+                     const knot_dname_t *zone, uint32_t stamp, int *lock);
 
 /*!
  * \brief Query the RRL table for accept or deny, when the rate limit is reached.
@@ -142,12 +132,12 @@ rrl_item_t* rrl_hash(rrl_table_t *t, const struct sockaddr_storage *a, rrl_req_t
  * \param rrl RRL table.
  * \param a Source address.
  * \param req RRL request (containing resp., flags and question).
- * \param zone Zone related to the response (or NULL).
+ * \param zone Zone name related to the response (or NULL).
  * \retval KNOT_EOK if passed.
  * \retval KNOT_ELIMIT when the limit is reached.
  */
 int rrl_query(rrl_table_t *rrl, const struct sockaddr_storage *a, rrl_req_t *req,
-              const struct zone *zone);
+              const knot_dname_t *zone);
 
 /*!
  * \brief Roll a dice whether answer slips or not.
@@ -187,5 +177,3 @@ int rrl_lock(rrl_table_t *rrl, int lk_id);
  * \retval KNOT_ERROR
  */
 int rrl_unlock(rrl_table_t *rrl, int lk_id);
-
-/*! @} */
diff --git a/src/knot/modules/rrl/rrl.c b/src/knot/modules/rrl/rrl.c
new file mode 100644
index 0000000000000000000000000000000000000000..a511d3260171260d7bb465902e74cbeedfffdec8
--- /dev/null
+++ b/src/knot/modules/rrl/rrl.c
@@ -0,0 +1,228 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "contrib/sockaddr.h"
+#include "contrib/mempattern.h"
+#include "knot/modules/rrl/rrl.h"
+#include "knot/modules/rrl/functions.h"
+
+/* Module configuration scheme. */
+#define MOD_RATE_LIMIT		"\x0A""rate-limit"
+#define MOD_SLIP		"\x04""slip"
+#define MOD_TBL_SIZE		"\x0A""table-size"
+#define MOD_WHITELIST		"\x09""whitelist"
+
+const yp_item_t scheme_mod_rrl[] = {
+	{ C_ID,           YP_TSTR,  YP_VNONE },
+	{ MOD_RATE_LIMIT, YP_TINT,  YP_VINT = { 1, INT32_MAX } },
+	{ MOD_SLIP,       YP_TINT,  YP_VINT = { 0, RRL_SLIP_MAX, 1 } },
+	{ MOD_TBL_SIZE,	  YP_TINT,  YP_VINT = { 1, INT32_MAX, 393241 } },
+	{ MOD_WHITELIST,  YP_TDATA, YP_VDATA = { 0, NULL, addr_range_to_bin,
+	                                         addr_range_to_txt }, YP_FMULTI },
+	{ C_COMMENT,      YP_TSTR,  YP_VNONE },
+	{ NULL }
+};
+
+int check_mod_rrl(conf_check_t *args)
+{
+	conf_val_t rl = conf_rawid_get_txn(args->conf, args->txn, C_MOD_RRL,
+	                                   MOD_RATE_LIMIT, args->id, args->id_len);
+	if (rl.code != KNOT_EOK) {
+		args->err_str = "no rate limit specified";
+		return KNOT_EINVAL;
+	}
+
+	return KNOT_EOK;
+}
+
+typedef struct {
+	mod_ctr_t *counters;
+	rrl_table_t *rrl;
+	int slip;
+	conf_val_t whitelist;
+} rrl_ctx_t;
+
+static const knot_dname_t *name_from_rrsig(const knot_rrset_t *rr)
+{
+	if (rr == NULL) {
+		return NULL;
+	}
+	if (rr->type != KNOT_RRTYPE_RRSIG) {
+		return NULL;
+	}
+
+	// This is a signature.
+	return knot_rrsig_signer_name(&rr->rrs, 0);
+}
+
+static const knot_dname_t *name_from_authrr(const knot_rrset_t *rr)
+{
+	if (rr == NULL) {
+		return NULL;
+	}
+	if (rr->type != KNOT_RRTYPE_NS && rr->type != KNOT_RRTYPE_SOA) {
+		return NULL;
+	}
+
+	// This is a valid authority RR.
+	return rr->owner;
+}
+
+static int ratelimit_apply(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
+{
+	assert(pkt && qdata && ctx);
+
+	rrl_ctx_t *context = ctx;
+
+	// Rate limit is not applied to TCP connections.
+	if (!(qdata->param->proc_flags & NS_QUERY_LIMIT_SIZE)) {
+		return state;
+	}
+
+	// Exempt clients.
+	if (conf_addr_range_match(&context->whitelist, qdata->param->remote)) {
+		return state;
+	}
+
+	rrl_req_t req = {
+		.w = pkt->wire,
+		.query = qdata->query
+	};
+
+	if (!EMPTY_LIST(qdata->wildcards)) {
+		req.flags = RRL_WILDCARD;
+	}
+
+	// Take the zone name if known.
+	const knot_dname_t *zone_name = (qdata->zone != NULL) ? qdata->zone->name : NULL;
+
+	// Take the signer name as zone name if there is an RRSIG.
+	if (zone_name == NULL) {
+		const knot_pktsection_t *ans = knot_pkt_section(pkt, KNOT_ANSWER);
+		for (int i = 0; i < ans->count; i++) {
+			zone_name = name_from_rrsig(knot_pkt_rr(ans, i));
+			if (zone_name != NULL) {
+				break;
+			}
+		}
+	}
+
+	// Take the NS or SOA owner name if there is no RRSIG.
+	if (zone_name == NULL) {
+		const knot_pktsection_t *auth = knot_pkt_section(pkt, KNOT_AUTHORITY);
+		for (int i = 0; i < auth->count; i++) {
+			zone_name = name_from_authrr(knot_pkt_rr(auth, i));
+			if (zone_name != NULL) {
+				break;
+			}
+		}
+	}
+
+	if (rrl_query(context->rrl, qdata->param->remote, &req, zone_name) == KNOT_EOK) {
+		// Rate limiting not applied.
+		return state;
+	}
+
+	if (context->slip > 0 && rrl_slip_roll(context->slip)) {
+		// Slip the answer.
+		mod_ctr_incr(context->counters, 0, 1);
+		qdata->err_truncated = true;
+		return KNOT_STATE_FAIL;
+	} else {
+		// Drop the answer.
+		mod_ctr_incr(context->counters, 1, 1);
+		pkt->size = 0;
+		return KNOT_STATE_DONE;
+	}
+}
+
+static void ctx_free(knot_mm_t *mm, rrl_ctx_t *ctx)
+{
+	assert(ctx);
+
+	rrl_destroy(ctx->rrl);
+	mm_free(mm, ctx);
+}
+
+int rrl_load(struct query_module *self)
+{
+	assert(self);
+
+	// Create RRL context.
+	rrl_ctx_t *ctx = mm_alloc(self->mm, sizeof(rrl_ctx_t));
+	if (ctx == NULL) {
+		return KNOT_ENOMEM;
+	}
+	memset(ctx, 0, sizeof(*ctx));
+
+	// Create table.
+	conf_val_t val = conf_mod_get(self->config, MOD_TBL_SIZE, self->id);
+	ctx->rrl = rrl_create(conf_int(&val));
+	if (ctx->rrl == NULL) {
+		ctx_free(self->mm, ctx);
+		return KNOT_ENOMEM;
+	}
+
+	// Set locks.
+	int ret = rrl_setlocks(ctx->rrl, RRL_LOCK_GRANULARITY);
+	if (ret != KNOT_EOK) {
+		ctx_free(self->mm, ctx);
+		return ret;
+	}
+
+	// Set rate limit.
+	val = conf_mod_get(self->config, MOD_RATE_LIMIT, self->id);
+	ret = rrl_setrate(ctx->rrl, conf_int(&val));
+	if (ret != KNOT_EOK) {
+		ctx_free(self->mm, ctx);
+		return ret;
+	}
+
+	// Get whitelist.
+	val = conf_mod_get(self->config, MOD_WHITELIST, self->id);
+	ctx->whitelist = val;
+
+	// Get slip.
+	val = conf_mod_get(self->config, MOD_SLIP, self->id);
+	ctx->slip = conf_int(&val);
+
+	// Set up statistics counters.
+	ret = mod_stats_add(self, "slipped", 1, NULL);
+	if (ret != KNOT_EOK) {
+		ctx_free(self->mm, ctx);
+		return ret;
+	}
+
+	ret = mod_stats_add(self, "dropped", 1, NULL);
+	if (ret != KNOT_EOK) {
+		ctx_free(self->mm, ctx);
+		return ret;
+	}
+
+	ctx->counters = self->stats;
+	self->ctx = ctx;
+
+	return query_module_step(self, QPLAN_END, ratelimit_apply);
+}
+
+void rrl_unload(struct query_module *self)
+{
+	assert(self);
+
+	rrl_ctx_t *ctx = self->ctx;
+
+	ctx_free(self->mm, ctx);
+}
diff --git a/src/knot/modules/rrl/rrl.h b/src/knot/modules/rrl/rrl.h
new file mode 100644
index 0000000000000000000000000000000000000000..47987f723ec6daa84a11d3fa0a082b1a500768ed
--- /dev/null
+++ b/src/knot/modules/rrl/rrl.h
@@ -0,0 +1,28 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "knot/nameserver/query_module.h"
+
+/*! \brief Module scheme. */
+#define C_MOD_RRL "\x07""mod-rrl"
+extern const yp_item_t scheme_mod_rrl[];
+int check_mod_rrl(conf_check_t *args);
+
+/*! \brief Module interface. */
+int rrl_load(struct query_module *self);
+void rrl_unload(struct query_module *self);
diff --git a/src/knot/modules/stats/stats.c b/src/knot/modules/stats/stats.c
new file mode 100644
index 0000000000000000000000000000000000000000..0b52de330c193f039f7126bda0d0f9520d036231
--- /dev/null
+++ b/src/knot/modules/stats/stats.c
@@ -0,0 +1,566 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "contrib/mempattern.h"
+#include "libknot/libknot.h"
+#include "knot/modules/stats/stats.h"
+#include "knot/nameserver/xfr.h"
+
+#define MOD_PROTOCOL	"\x10""request-protocol"
+#define MOD_OPERATION	"\x10""server-operation"
+#define MOD_REQ_BYTES	"\x0D""request-bytes"
+#define MOD_RESP_BYTES	"\x0E""response-bytes"
+#define MOD_EDNS	"\x0D""edns-presence"
+#define MOD_FLAG	"\x0D""flag-presence"
+#define MOD_RCODE	"\x0D""response-code"
+#define MOD_NODATA	"\x0C""reply-nodata"
+#define MOD_QTYPE	"\x0A""query-type"
+#define MOD_QSIZE	"\x0A""query-size"
+#define MOD_RSIZE	"\x0A""reply-size"
+
+#define OTHER		"other"
+
+const yp_item_t scheme_mod_stats[] = {
+	{ C_ID,           YP_TSTR,  YP_VNONE },
+	{ MOD_PROTOCOL,   YP_TBOOL, YP_VBOOL = { true } },
+	{ MOD_OPERATION,  YP_TBOOL, YP_VBOOL = { true } },
+	{ MOD_REQ_BYTES,  YP_TBOOL, YP_VBOOL = { true } },
+	{ MOD_RESP_BYTES, YP_TBOOL, YP_VBOOL = { true } },
+	{ MOD_EDNS,       YP_TBOOL, YP_VNONE },
+	{ MOD_FLAG,       YP_TBOOL, YP_VNONE },
+	{ MOD_RCODE,      YP_TBOOL, YP_VBOOL = { true } },
+	{ MOD_NODATA,     YP_TBOOL, YP_VNONE },
+	{ MOD_QTYPE,      YP_TBOOL, YP_VNONE },
+	{ MOD_QSIZE,      YP_TBOOL, YP_VNONE },
+	{ MOD_RSIZE,      YP_TBOOL, YP_VNONE },
+	{ C_COMMENT,      YP_TSTR,  YP_VNONE },
+	{ NULL }
+};
+
+enum {
+	CTR_PROTOCOL,
+	CTR_OPERATION,
+	CTR_REQ_BYTES,
+	CTR_RESP_BYTES,
+	CTR_EDNS,
+	CTR_FLAG,
+	CTR_RCODE,
+	CTR_NODATA,
+	CTR_QTYPE,
+	CTR_QSIZE,
+	CTR_RSIZE,
+};
+
+typedef struct {
+	mod_ctr_t *counters;
+	bool protocol;
+	bool operation;
+	bool req_bytes;
+	bool resp_bytes;
+	bool edns;
+	bool flag;
+	bool rcode;
+	bool nodata;
+	bool qtype;
+	bool qsize;
+	bool rsize;
+} stats_t;
+
+typedef struct {
+	yp_name_t *conf_name;
+	size_t conf_offset;
+	uint32_t count;
+	mod_idx_to_str_f fcn;
+} ctr_desc_t;
+
+enum {
+	OPERATION_QUERY = 0,
+	OPERATION_UPDATE,
+	OPERATION_NOTIFY,
+	OPERATION_AXFR,
+	OPERATION_IXFR,
+	OPERATION_INVALID,
+	OPERATION__COUNT
+};
+
+static char *operation_to_str(uint32_t idx, uint32_t count)
+{
+	switch (idx) {
+	case OPERATION_QUERY:   return strdup("query");
+	case OPERATION_UPDATE:  return strdup("update");
+	case OPERATION_NOTIFY:  return strdup("notify");
+	case OPERATION_AXFR:    return strdup("axfr");
+	case OPERATION_IXFR:    return strdup("ixfr");
+	case OPERATION_INVALID: return strdup("invalid");
+	default:                assert(0); return NULL;
+	}
+}
+
+enum {
+	PROTOCOL_UDP4 = 0,
+	PROTOCOL_TCP4,
+	PROTOCOL_UDP6,
+	PROTOCOL_TCP6,
+	PROTOCOL__COUNT
+};
+
+static char *protocol_to_str(uint32_t idx, uint32_t count)
+{
+	switch (idx) {
+	case PROTOCOL_UDP4: return strdup("udp4");
+	case PROTOCOL_TCP4: return strdup("tcp4");
+	case PROTOCOL_UDP6: return strdup("udp6");
+	case PROTOCOL_TCP6: return strdup("tcp6");
+	default:            assert(0); return NULL;
+	}
+}
+
+enum {
+	REQ_BYTES_QUERY = 0,
+	REQ_BYTES_UPDATE,
+	REQ_BYTES_OTHER,
+	REQ_BYTES__COUNT
+};
+
+static char *req_bytes_to_str(uint32_t idx, uint32_t count)
+{
+	switch (idx) {
+	case REQ_BYTES_QUERY:  return strdup("query");
+	case REQ_BYTES_UPDATE: return strdup("update");
+	case REQ_BYTES_OTHER:  return strdup(OTHER);
+	default:               assert(0); return NULL;
+	}
+}
+
+enum {
+	RESP_BYTES_REPLY = 0,
+	RESP_BYTES_TRANSFER,
+	RESP_BYTES_OTHER,
+	RESP_BYTES__COUNT
+};
+
+static char *resp_bytes_to_str(uint32_t idx, uint32_t count)
+{
+	switch (idx) {
+	case RESP_BYTES_REPLY:    return strdup("reply");
+	case RESP_BYTES_TRANSFER: return strdup("transfer");
+	case RESP_BYTES_OTHER:    return strdup(OTHER);
+	default:                  assert(0); return NULL;
+	}
+}
+
+enum {
+	EDNS_REQ = 0,
+	EDNS_RESP,
+	EDNS__COUNT
+};
+
+static char *edns_to_str(uint32_t idx, uint32_t count)
+{
+	switch (idx) {
+	case EDNS_REQ:  return strdup("request");
+	case EDNS_RESP: return strdup("response");
+	default:        assert(0); return NULL;
+	}
+}
+
+enum {
+	FLAG_DO = 0,
+	FLAG_TC,
+	FLAG__COUNT
+};
+
+static char *flag_to_str(uint32_t idx, uint32_t count)
+{
+	switch (idx) {
+	case FLAG_TC: return strdup("TC");
+	case FLAG_DO: return strdup("DO");
+	default:      assert(0); return NULL;
+	}
+}
+
+enum {
+	NODATA_A = 0,
+	NODATA_AAAA,
+	NODATA_OTHER,
+	NODATA__COUNT
+};
+
+static char *nodata_to_str(uint32_t idx, uint32_t count)
+{
+	switch (idx) {
+	case NODATA_A:     return strdup("A");
+	case NODATA_AAAA:  return strdup("AAAA");
+	case NODATA_OTHER: return strdup(OTHER);
+	default:           assert(0); return NULL;
+	}
+}
+
+#define RCODE_BADSIG	15 // Unassigned code internally used for BADSIG.
+#define RCODE_OTHER	(KNOT_RCODE_BADCOOKIE + 1) // Other RCODES.
+
+static char *rcode_to_str(uint32_t idx, uint32_t count)
+{
+	const knot_lookup_t *rcode = NULL;
+
+	switch (idx) {
+	case RCODE_BADSIG:
+		rcode = knot_lookup_by_id(knot_tsig_rcode_names, KNOT_RCODE_BADSIG);
+		break;
+	case RCODE_OTHER:
+		return strdup(OTHER);
+	default:
+		rcode = knot_lookup_by_id(knot_rcode_names, idx);
+		break;
+	}
+
+	if (rcode != NULL) {
+		return strdup(rcode->name);
+	} else {
+		return NULL;
+	}
+}
+
+enum {
+	QTYPE_OTHER  =   0,
+	QTYPE_MIN1   =   1,
+	QTYPE_MAX1   =  65,
+	QTYPE_MIN2   =  99,
+	QTYPE_MAX2   = 110,
+	QTYPE_MIN3   = 255,
+	QTYPE_MAX3   = 260,
+	QTYPE_SHIFT2 = QTYPE_MIN2 - QTYPE_MAX1 - 1,
+	QTYPE_SHIFT3 = QTYPE_SHIFT2 + QTYPE_MIN3 - QTYPE_MAX2 - 1,
+	QTYPE__COUNT = QTYPE_MAX3 - QTYPE_SHIFT3 + 1
+};
+
+static char *qtype_to_str(uint32_t idx, uint32_t count)
+{
+	if (idx == QTYPE_OTHER) {
+		return strdup(OTHER);
+	}
+
+	uint16_t qtype;
+
+	if (idx <= QTYPE_MAX1) {
+		qtype = idx;
+		assert(qtype >= QTYPE_MIN1 && qtype <= QTYPE_MAX1);
+	} else if (idx <= QTYPE_MAX2 - QTYPE_SHIFT2) {
+		qtype = idx + QTYPE_SHIFT2;
+		assert(qtype >= QTYPE_MIN2 && qtype <= QTYPE_MAX2);
+	} else {
+		qtype = idx + QTYPE_SHIFT3;
+		assert(qtype >= QTYPE_MIN3 && qtype <= QTYPE_MAX3);
+	}
+
+	char str[32];
+	if (knot_rrtype_to_string(qtype, str, sizeof(str)) < 0) {
+		return NULL;
+	} else {
+		return strdup(str);
+	}
+}
+
+#define BUCKET_SIZE	16
+
+static char *size_to_str(uint32_t idx, uint32_t count)
+{
+	char str[16];
+
+	int ret;
+	if (idx < count - 1) {
+		ret = snprintf(str, sizeof(str), "%u-%u", idx * BUCKET_SIZE,
+		               (idx + 1) * BUCKET_SIZE - 1);
+	} else {
+		ret = snprintf(str, sizeof(str), "%u-65535", idx * BUCKET_SIZE);
+	}
+
+	if (ret <= 0 || (size_t)ret >= sizeof(str)) {
+		return NULL;
+	} else {
+		return strdup(str);
+	}
+}
+
+static char *qsize_to_str(uint32_t idx, uint32_t count) {
+	return size_to_str(idx, count);
+}
+
+static char *rsize_to_str(uint32_t idx, uint32_t count) {
+	return size_to_str(idx, count);
+}
+
+static const ctr_desc_t ctr_descs[] = {
+	#define item(macro, name, count) \
+		[CTR_##macro] = { MOD_##macro, offsetof(stats_t, name), (count), name##_to_str }
+	item(PROTOCOL,   protocol,   PROTOCOL__COUNT),
+	item(OPERATION,  operation,  OPERATION__COUNT),
+	item(REQ_BYTES,  req_bytes,  REQ_BYTES__COUNT),
+	item(RESP_BYTES, resp_bytes, RESP_BYTES__COUNT),
+	item(EDNS,       edns,       EDNS__COUNT),
+	item(FLAG,       flag,       FLAG__COUNT),
+	item(RCODE,      rcode,      RCODE_OTHER + 1),
+	item(NODATA,     nodata,     NODATA__COUNT),
+	item(QTYPE,      qtype,      QTYPE__COUNT),
+	item(QSIZE,      qsize,      288 / BUCKET_SIZE + 1),
+	item(RSIZE,      rsize,      4096 / BUCKET_SIZE + 1),
+	{ NULL }
+};
+
+static int update_counters(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
+{
+	assert(pkt && qdata && ctx);
+
+	stats_t *stats = ctx;
+
+	uint16_t operation;
+	unsigned xfr_packets = 0;
+
+	// Get the server operation.
+	switch (qdata->packet_type) {
+	case KNOT_QUERY_NORMAL:
+		operation = OPERATION_QUERY;
+		break;
+	case KNOT_QUERY_UPDATE:
+		operation = OPERATION_UPDATE;
+		break;
+	case KNOT_QUERY_NOTIFY:
+		operation = OPERATION_NOTIFY;
+		break;
+	case KNOT_QUERY_AXFR:
+		operation = OPERATION_AXFR;
+		if (qdata->ext != NULL) {
+			xfr_packets = ((struct xfr_proc *)qdata->ext)->stats.messages;
+		}
+		break;
+	case KNOT_QUERY_IXFR:
+		operation = OPERATION_IXFR;
+		if (qdata->ext != NULL) {
+			xfr_packets = ((struct xfr_proc *)qdata->ext)->stats.messages;
+		}
+		break;
+	default:
+		operation = OPERATION_INVALID;
+		break;
+	}
+
+	// Count request bytes.
+	if (stats->req_bytes) {
+		switch (operation) {
+		case OPERATION_QUERY:
+			mod_ctrs_incr(stats->counters, CTR_REQ_BYTES,
+			              REQ_BYTES_QUERY, qdata->query->size);
+			break;
+		case OPERATION_UPDATE:
+			mod_ctrs_incr(stats->counters, CTR_REQ_BYTES,
+			              REQ_BYTES_UPDATE, qdata->query->size);
+			break;
+		default:
+			if (xfr_packets <= 1) {
+				mod_ctrs_incr(stats->counters, CTR_REQ_BYTES,
+				              REQ_BYTES_OTHER, qdata->query->size);
+			}
+			break;
+		}
+	}
+
+	// Count response bytes.
+	if (stats->resp_bytes) {
+		switch (operation) {
+		case OPERATION_QUERY:
+			mod_ctrs_incr(stats->counters, CTR_RESP_BYTES,
+			              RESP_BYTES_REPLY, pkt->size);
+			break;
+		case OPERATION_AXFR:
+		case OPERATION_IXFR:
+			mod_ctrs_incr(stats->counters, CTR_RESP_BYTES,
+			              RESP_BYTES_TRANSFER, pkt->size);
+			break;
+		default:
+			mod_ctrs_incr(stats->counters, CTR_RESP_BYTES,
+			              RESP_BYTES_OTHER, pkt->size);
+			break;
+		}
+	}
+
+	// Get the extended response code.
+	uint16_t rcode = qdata->rcode;
+	if (qdata->rcode_tsig != KNOT_RCODE_NOERROR) {
+		rcode = qdata->rcode_tsig;
+	}
+
+	// Count the response code.
+	if (stats->rcode && pkt->size > 0) {
+		if (xfr_packets <= 1 || rcode != KNOT_RCODE_NOERROR) {
+			if (xfr_packets > 1) {
+				assert(rcode != KNOT_RCODE_NOERROR);
+				// Ignore the leading XFR message NOERROR.
+				mod_ctrs_decr(stats->counters, CTR_RCODE,
+				              KNOT_RCODE_NOERROR, 1);
+			}
+
+			if (qdata->rcode_tsig == KNOT_RCODE_BADSIG) {
+				mod_ctrs_incr(stats->counters, CTR_RCODE,
+				              RCODE_BADSIG, 1);
+			} else {
+				mod_ctrs_incr(stats->counters, CTR_RCODE,
+				              rcode, 1);
+			}
+		}
+	}
+
+	// Return if non-first transfer message.
+	if (xfr_packets > 1) {
+		return state;
+	}
+
+	// Count the server opearation.
+	if (stats->operation) {
+		mod_ctrs_incr(stats->counters, CTR_OPERATION, operation, 1);
+	}
+
+	// Count the request protocol.
+	if (stats->protocol) {
+		if (qdata->param->remote->ss_family == AF_INET) {
+			if (qdata->param->proc_flags & NS_QUERY_LIMIT_SIZE) {
+				mod_ctrs_incr(stats->counters, CTR_PROTOCOL,
+				              PROTOCOL_UDP4, 1);
+			} else {
+				mod_ctrs_incr(stats->counters, CTR_PROTOCOL,
+				              PROTOCOL_TCP4, 1);
+			}
+		} else {
+			if (qdata->param->proc_flags & NS_QUERY_LIMIT_SIZE) {
+				mod_ctrs_incr(stats->counters, CTR_PROTOCOL,
+				              PROTOCOL_UDP6, 1);
+			} else {
+				mod_ctrs_incr(stats->counters, CTR_PROTOCOL,
+				              PROTOCOL_TCP6, 1);
+			}
+		}
+	}
+
+	// Count EDNS occurrences.
+	if (stats->edns) {
+		if (qdata->query->opt_rr != NULL) {
+			mod_ctrs_incr(stats->counters, CTR_EDNS, EDNS_REQ, 1);
+		}
+		if (pkt->opt_rr != NULL && pkt->size > 0) {
+			mod_ctrs_incr(stats->counters, CTR_EDNS, EDNS_RESP, 1);
+		}
+	}
+
+	// Count interesting message header flags.
+	if (stats->flag) {
+		if (pkt->size > 0 && knot_wire_get_tc(pkt->wire)) {
+			mod_ctrs_incr(stats->counters, CTR_FLAG, FLAG_TC, 1);
+		}
+		if (pkt->opt_rr != NULL && knot_edns_do(pkt->opt_rr)) {
+			mod_ctrs_incr(stats->counters, CTR_FLAG, FLAG_DO, 1);
+		}
+	}
+
+	// Return if not query operation.
+	if (operation != OPERATION_QUERY) {
+		return state;
+	}
+
+	// Count NODATA reply (RFC 2308, Section 2.2).
+	if (stats->nodata && rcode == KNOT_RCODE_NOERROR && pkt->size > 0 &&
+	    knot_wire_get_ancount(pkt->wire) == 0 && !knot_wire_get_tc(pkt->wire) &&
+	    (knot_wire_get_nscount(pkt->wire) == 0 ||
+	     knot_pkt_rr(knot_pkt_section(pkt, KNOT_AUTHORITY), 0)->type == KNOT_RRTYPE_SOA)) {
+		switch (knot_pkt_qtype(qdata->query)) {
+		case KNOT_RRTYPE_A:
+			mod_ctrs_incr(stats->counters, CTR_NODATA, NODATA_A, 1);
+			break;
+		case KNOT_RRTYPE_AAAA:
+			mod_ctrs_incr(stats->counters, CTR_NODATA, NODATA_AAAA, 1);
+			break;
+		default:
+			mod_ctrs_incr(stats->counters, CTR_NODATA, NODATA_OTHER, 1);
+			break;
+		}
+	}
+
+	// Count the query type.
+	if (stats->qtype) {
+		uint16_t qtype = knot_pkt_qtype(qdata->query);
+
+		uint16_t idx;
+		switch (qtype) {
+		case QTYPE_MIN1 ... QTYPE_MAX1: idx = qtype; break;
+		case QTYPE_MIN2 ... QTYPE_MAX2: idx = qtype - QTYPE_SHIFT2; break;
+		case QTYPE_MIN3 ... QTYPE_MAX3: idx = qtype - QTYPE_SHIFT3; break;
+		default:                        idx = QTYPE_OTHER; break;
+		}
+
+		mod_ctrs_incr(stats->counters, CTR_QTYPE, idx, 1);
+	}
+
+	// Count the query size.
+	if (stats->qsize) {
+		mod_ctrs_incr(stats->counters, CTR_QSIZE,
+		              qdata->query->size / BUCKET_SIZE, 1);
+	}
+
+	// Count the reply size.
+	if (stats->rsize && pkt->size > 0) {
+		mod_ctrs_incr(stats->counters, CTR_RSIZE,
+		              pkt->size / BUCKET_SIZE, 1);
+	}
+
+	return state;
+}
+
+int stats_load(struct query_module *self)
+{
+	assert(self);
+
+	stats_t *stats = mm_alloc(self->mm, sizeof(*stats));
+	if (stats == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	for (const ctr_desc_t *desc = ctr_descs; desc->conf_name != NULL; desc++) {
+		conf_val_t val = conf_mod_get(self->config, desc->conf_name, self->id);
+		bool enabled = conf_bool(&val);
+
+		// Initialize corresponding configuration item.
+		*(bool *)((uint8_t *)stats + desc->conf_offset) = enabled;
+
+		int ret = mod_stats_add(self, enabled ? desc->conf_name + 1 : NULL,
+		                        desc->count, desc->fcn);
+		if (ret != KNOT_EOK) {
+			mm_free(self->mm, stats);
+			return ret;
+		}
+	}
+
+	stats->counters = self->stats;
+	self->ctx = stats;
+
+	return query_module_step(self, QPLAN_END, update_counters);
+}
+
+void stats_unload(struct query_module *self)
+{
+	assert(self);
+
+	stats_t *stats = self->ctx;
+
+	mm_free(self->mm, stats);
+}
diff --git a/src/knot/modules/stats/stats.h b/src/knot/modules/stats/stats.h
new file mode 100644
index 0000000000000000000000000000000000000000..0755d854f41a00520467db9d711e3fd838d199bc
--- /dev/null
+++ b/src/knot/modules/stats/stats.h
@@ -0,0 +1,27 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "knot/nameserver/query_module.h"
+
+/*! \brief Module scheme. */
+#define C_MOD_STATS "\x09""mod-stats"
+extern const yp_item_t scheme_mod_stats[];
+
+/*! \brief Module interface. */
+int stats_load(struct query_module *self);
+void stats_unload(struct query_module *self);
diff --git a/src/knot/modules/synth_record.c b/src/knot/modules/synth_record/synth_record.c
similarity index 94%
rename from src/knot/modules/synth_record.c
rename to src/knot/modules/synth_record/synth_record.c
index e3166f7c88672fa2eae0a15519b0ad7162d6aac2..62db19037b9891b04246079e5956c1a043381695 100644
--- a/src/knot/modules/synth_record.c
+++ b/src/knot/modules/synth_record/synth_record.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,14 +14,10 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "knot/modules/synth_record.h"
-#include "knot/nameserver/process_query.h"
-#include "knot/nameserver/internet.h"
-#include "knot/common/log.h"
-#include "libknot/descriptor.h"
 #include "contrib/mempattern.h"
 #include "contrib/net.h"
 #include "contrib/sockaddr.h"
+#include "knot/modules/synth_record/synth_record.h"
 
 /* Module configuration scheme. */
 #define MOD_NET		"\x07""network"
@@ -389,11 +385,10 @@ static int template_match(int state, synth_template_t *tpl, knot_pkt_t *pkt, str
 	return HIT;
 }
 
-static int solve_synth_record(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx)
+static int solve_synth_record(int state, knot_pkt_t *pkt, struct query_data *qdata,
+                              void *ctx)
 {
-	if (pkt == NULL || qdata == NULL || ctx == NULL) {
-		return ERROR;
-	}
+	assert(pkt && qdata && ctx);
 
 	/* Applicable when search in zone fails. */
 	if (state != MISS) {
@@ -404,12 +399,9 @@ static int solve_synth_record(int state, knot_pkt_t *pkt, struct query_data *qda
 	return template_match(state, (synth_template_t *)ctx, pkt, qdata);
 }
 
-int synth_record_load(struct query_plan *plan, struct query_module *self,
-                      const knot_dname_t *zone)
+int synth_record_load(struct query_module *self)
 {
-	if (plan == NULL || self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
 	/* Create synthesis template. */
 	struct synth_template *tpl = mm_alloc(self->mm, sizeof(struct synth_template));
@@ -448,18 +440,16 @@ int synth_record_load(struct query_plan *plan, struct query_module *self,
 
 	self->ctx = tpl;
 
-	return query_plan_step(plan, QPLAN_ANSWER, solve_synth_record, self->ctx);
+	return query_module_step(self, QPLAN_ANSWER, solve_synth_record);
 }
 
-int synth_record_unload(struct query_module *self)
+void synth_record_unload(struct query_module *self)
 {
-	if (self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
+
+	synth_template_t *tpl = self->ctx;
 
-	synth_template_t *tpl = (synth_template_t *)self->ctx;
 	free(tpl->zone);
 	free(tpl->prefix);
 	mm_free(self->mm, tpl);
-	return KNOT_EOK;
 }
diff --git a/src/knot/modules/synth_record.h b/src/knot/modules/synth_record/synth_record.h
similarity index 68%
rename from src/knot/modules/synth_record.h
rename to src/knot/modules/synth_record/synth_record.h
index 68784669d2a900c6d866b3d52925b4865dee6ece..adbe513afa475d676f296b071cd98333d11ae10b 100644
--- a/src/knot/modules/synth_record.h
+++ b/src/knot/modules/synth_record/synth_record.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2013 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,19 +14,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /*!
- * \file
- *
- * \brief Synthetic records module
- *
- * Accepted configurations:
- *  * "forward <prefix> <ttl> <address>/<netblock>"
- *  * "reverse <prefix> <zone> <ttl> <address>/<netblock>"
- *
  * Module synthetises forward/reverse records based on a template when
  * the queried record can't be found in the zone contents.
- *
- * \addtogroup query_processing
- * @{
  */
 
 #pragma once
@@ -39,8 +28,5 @@ extern const yp_item_t scheme_mod_synth_record[];
 int check_mod_synth_record(conf_check_t *args);
 
 /*! \brief Module interface. */
-int synth_record_load(struct query_plan *plan, struct query_module *self,
-                      const knot_dname_t *zone);
-int synth_record_unload(struct query_module *self);
-
-/*! @} */
+int synth_record_load(struct query_module *self);
+void synth_record_unload(struct query_module *self);
diff --git a/src/knot/modules/whoami.c b/src/knot/modules/whoami/whoami.c
similarity index 82%
rename from src/knot/modules/whoami.c
rename to src/knot/modules/whoami/whoami.c
index c7c5dda5fea21f3c646d0a1f3292ea72b0775c65..27e75892246f79e3b06c453f36d4bb8294e8296d 100644
--- a/src/knot/modules/whoami.c
+++ b/src/knot/modules/whoami/whoami.c
@@ -14,10 +14,7 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "knot/modules/whoami.h"
-#include "knot/nameserver/process_query.h"
-#include "knot/nameserver/internet.h"
-#include "libknot/libknot.h"
+#include "knot/modules/whoami/whoami.h"
 
 const yp_item_t scheme_mod_whoami[] = {
 	{ C_ID,         YP_TSTR, YP_VNONE },
@@ -30,13 +27,9 @@ static int whoami_query(int state, knot_pkt_t *pkt, struct query_data *qdata, vo
 	knot_rrset_t *rrset = NULL;
 
 	/* Sanity checks. */
-	if (pkt == NULL ||
-	    qdata == NULL ||
-	    qdata->query == NULL ||
-	    qdata->param == NULL || qdata->param->remote == NULL ||
-	    qdata->zone == NULL || qdata->zone->name == NULL ||
-	    qdata->zone->contents == NULL || qdata->zone->contents->apex == NULL)
-	{
+	assert(pkt && qdata);
+	if (qdata->zone == NULL || qdata->zone->contents == NULL ||
+	    qdata->zone->contents->apex == NULL) {
 		return ERROR;
 	}
 
@@ -129,26 +122,17 @@ static int whoami_query(int state, knot_pkt_t *pkt, struct query_data *qdata, vo
 	return HIT;
 }
 
-int whoami_load(struct query_plan *plan, struct query_module *self,
-                const knot_dname_t *zone)
+int whoami_load(struct query_module *self)
 {
-	/* Sanity checks. */
-	if (plan == NULL || self == NULL) {
-		return KNOT_EINVAL;
-	}
+	assert(self);
 
 	/* Hook to the query plan. */
-	query_plan_step(plan, QPLAN_ANSWER, whoami_query, NULL);
+	query_module_step(self, QPLAN_ANSWER, whoami_query);
 
 	return KNOT_EOK;
 }
 
-int whoami_unload(struct query_module *self)
+void whoami_unload(struct query_module *self)
 {
-	/* Sanity check. */
-	if (self == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	return KNOT_EOK;
+	return;
 }
diff --git a/src/knot/modules/whoami.h b/src/knot/modules/whoami/whoami.h
similarity index 77%
rename from src/knot/modules/whoami.h
rename to src/knot/modules/whoami/whoami.h
index 5b922e76af9f84864fdaa822c771e49e17d08cb4..d450a9c7927b0c6a5cf74e44785da2679f91acb5 100644
--- a/src/knot/modules/whoami.h
+++ b/src/knot/modules/whoami/whoami.h
@@ -14,15 +14,6 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-/*!
- * \file
- *
- * \brief whoami module
- *
- * \addtogroup query_processing
- * @{
- */
-
 #pragma once
 
 #include "knot/nameserver/query_module.h"
@@ -32,8 +23,5 @@
 extern const yp_item_t scheme_mod_whoami[];
 
 /*! \brief Module interface. */
-int whoami_load(struct query_plan *plan, struct query_module *self,
-                const knot_dname_t *zone);
-int whoami_unload(struct query_module *self);
-
-/*! @} */
+int whoami_load(struct query_module *self);
+void whoami_unload(struct query_module *self);
diff --git a/src/knot/nameserver/axfr.c b/src/knot/nameserver/axfr.c
index f74b7d08015bdd75fc930550019ea926cd4bc22b..b13c58cc5480b3103634575a0dd921361dbd693a 100644
--- a/src/knot/nameserver/axfr.c
+++ b/src/knot/nameserver/axfr.c
@@ -78,7 +78,7 @@ static int axfr_process_node_tree(knot_pkt_t *pkt, const void *item,
 	struct axfr_proc *axfr = (struct axfr_proc*)state;
 
 	if (axfr->i == NULL) {
-		axfr->i = hattrie_iter_begin(item, true);
+		axfr->i = hattrie_iter_begin((hattrie_t *)item);
 	}
 
 	/* Put responses. */
diff --git a/src/knot/nameserver/internet.c b/src/knot/nameserver/internet.c
index c91f71a6c39ae9a58b515c3429255d0c9e72d356..b6a5912733b32b8df6be5226d9023914cd6b83d5 100644
--- a/src/knot/nameserver/internet.c
+++ b/src/knot/nameserver/internet.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2013 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -15,26 +15,14 @@
  */
 
 #include "libknot/libknot.h"
-#include "libknot/descriptor.h"
-#include "libknot/rrtype/rdname.h"
-#include "libknot/rrtype/soa.h"
 #include "knot/common/log.h"
-#include "knot/dnssec/rrset-sign.h"
+#include "knot/query/query.h"
 #include "knot/nameserver/internet.h"
 #include "knot/nameserver/nsec_proofs.h"
 #include "knot/nameserver/process_query.h"
-#include "knot/query/query.h"
 #include "knot/nameserver/query_module.h"
 #include "knot/zone/serial.h"
-#include "knot/zone/zonedb.h"
 #include "contrib/mempattern.h"
-#include "contrib/sockaddr.h"
-
-/*! \brief Kind of additional record. */
-enum additional_kind {
-	ADDITIONAL_OPTIONAL = 0,
-	ADDITIONAL_MANDATORY,
-};
 
 /*! \brief Check if given node was already visited. */
 static int wildcard_has_visited(struct query_data *qdata, const zone_node_t *node)
@@ -134,47 +122,6 @@ static bool have_dnssec(struct query_data *qdata)
 	       zone_contents_is_signed(qdata->zone->contents);
 }
 
-/*! \brief Synthesize RRSIG for given parameters, store in 'qdata' for later use */
-static int put_rrsig(const knot_dname_t *sig_owner, uint16_t type,
-                     const knot_rrset_t *rrsigs,
-                     knot_rrinfo_t *rrinfo,
-                     struct query_data *qdata)
-{
-	knot_rdataset_t synth_rrs;
-	knot_rdataset_init(&synth_rrs);
-	int ret = knot_synth_rrsig(type, &rrsigs->rrs, &synth_rrs, qdata->mm);
-	if (ret == KNOT_ENOENT) {
-		// No signature
-		return KNOT_EOK;
-	}
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	/* Create rrsig info structure. */
-	struct rrsig_info *info = mm_alloc(qdata->mm, sizeof(struct rrsig_info));
-	if (info == NULL) {
-		knot_rdataset_clear(&synth_rrs, qdata->mm);
-		return KNOT_ENOMEM;
-	}
-
-	/* Store RRSIG into info structure. */
-	knot_dname_t *owner_copy = knot_dname_copy(sig_owner, qdata->mm);
-	if (owner_copy == NULL) {
-		mm_free(qdata->mm, info);
-		knot_rdataset_clear(&synth_rrs, qdata->mm);
-		return KNOT_ENOMEM;
-	}
-	knot_rrset_init(&info->synth_rrsig, owner_copy, rrsigs->type, rrsigs->rclass);
-	/* Store filtered signature. */
-	info->synth_rrsig.rrs = synth_rrs;
-
-	info->rrinfo = rrinfo;
-	add_tail(&qdata->rrsigs, &info->n);
-
-	return KNOT_EOK;
-}
-
 /*! \brief This is a wildcard-covered or any other terminal node for QNAME.
  *         e.g. positive answer.
  */
@@ -206,7 +153,8 @@ static int put_answer(knot_pkt_t *pkt, uint16_t type, struct query_data *qdata)
 		}
 		for (unsigned i = 0; i < qdata->node->rrset_count; ++i) {
 			rrset = node_rrset_at(qdata->node, i);
-			ret = ns_put_rr(pkt, &rrset, NULL, compr_hint, 0, qdata);
+			ret = process_query_put_rr(pkt, qdata, &rrset, NULL,
+			                           compr_hint, 0);
 			if (ret != KNOT_EOK) {
 				break;
 			}
@@ -217,7 +165,8 @@ static int put_answer(knot_pkt_t *pkt, uint16_t type, struct query_data *qdata)
 		rrset = node_rrset(qdata->node, type);
 		if (!knot_rrset_empty(&rrset)) {
 			knot_rrset_t rrsigs = node_rrset(qdata->node, KNOT_RRTYPE_RRSIG);
-			ret = ns_put_rr(pkt, &rrset, &rrsigs, compr_hint, 0, qdata);
+			ret = process_query_put_rr(pkt, qdata, &rrset, &rrsigs,
+			                           compr_hint, 0);
 		}
 		break;
 	}
@@ -257,7 +206,8 @@ static int put_authority_soa(knot_pkt_t *pkt, struct query_data *qdata,
 		soa_rrset = copy;
 	}
 
-	ret = ns_put_rr(pkt, &soa_rrset, &rrsigs, KNOT_COMPR_HINT_NONE, flags, qdata);
+	ret = process_query_put_rr(pkt, qdata, &soa_rrset, &rrsigs,
+	                           KNOT_COMPR_HINT_NONE, flags);
 	if (ret != KNOT_EOK && (flags & KNOT_PF_FREE)) {
 		knot_rrset_clear(&soa_rrset, &pkt->mm);
 	}
@@ -276,52 +226,47 @@ static int put_delegation(knot_pkt_t *pkt, struct query_data *qdata)
 	/* Insert NS record. */
 	knot_rrset_t rrset = node_rrset(qdata->node, KNOT_RRTYPE_NS);
 	knot_rrset_t rrsigs = node_rrset(qdata->node, KNOT_RRTYPE_RRSIG);
-	return ns_put_rr(pkt, &rrset, &rrsigs, KNOT_COMPR_HINT_NONE, 0, qdata);
+	return process_query_put_rr(pkt, qdata, &rrset, &rrsigs,
+	                            KNOT_COMPR_HINT_NONE, 0);
 }
 
 /*! \brief Put additional records for given RR. */
 static int put_additional(knot_pkt_t *pkt, const knot_rrset_t *rr,
-                          struct query_data *qdata, knot_rrinfo_t *info,
-                          int state, enum additional_kind kind)
+                          struct query_data *qdata, knot_rrinfo_t *info, int state)
 {
+	if (rr->additional == NULL) {
+		return KNOT_EOK;
+	}
+
 	/* Valid types for ADDITIONALS insertion. */
 	/* \note Not resolving CNAMEs as MX/NS name must not be an alias. (RFC2181/10.3) */
-	static const uint16_t ar_type_list[] = {KNOT_RRTYPE_A, KNOT_RRTYPE_AAAA};
+	static const uint16_t ar_type_list[] = { KNOT_RRTYPE_A, KNOT_RRTYPE_AAAA };
 	static const int ar_type_count = 2;
 
 	int ret = KNOT_EOK;
 
-	/* All RRs should have additional node cached or NULL. */
-	for (uint16_t i = 0; i < rr->rrs.rr_count; i++) {
-		const zone_node_t *node = rr->additional[i];
-		if (node == NULL) {
-			continue;
-		}
-
-		bool is_notauth = (node->flags & (NODE_FLAGS_DELEG | NODE_FLAGS_NONAUTH));
-		bool is_glue = is_notauth &&
-		               state == DELEG && rr->type == KNOT_RRTYPE_NS &&
-		               knot_dname_in(rr->owner, node->owner);
+	additional_t *additional = (additional_t *)rr->additional;
 
-		/* Non-authoritative node allowed only as a glue. */
-		if (is_notauth && !is_glue) {
-			continue;
-		}
+	/* Iterate over the additionals. */
+	for (uint16_t i = 0; i < additional->count; i++) {
+		glue_t *glue = &additional->glues[i];
+		uint32_t flags = KNOT_PF_NULL;
 
-		/* Glue is required as per RFC 1034 Section 4.3.2 step 3b. */
-		if (kind != (is_glue ? ADDITIONAL_MANDATORY : ADDITIONAL_OPTIONAL)) {
-			continue;
+		/* Optional glue doesn't cause truncation. (RFC 1034/4.3.2 step 3b). */
+		if (state != DELEG || glue->optional) {
+			flags |= KNOT_PF_NOTRUNC;
 		}
 
-		uint32_t flags = KNOT_PF_CHECKDUP | (is_glue ? 0 : KNOT_PF_NOTRUNC);
-		uint16_t hint = knot_pkt_compr_hint(info, KNOT_COMPR_HINT_RDATA + i);
-		knot_rrset_t rrsigs = node_rrset(node, KNOT_RRTYPE_RRSIG);
+		uint16_t hint = knot_pkt_compr_hint(info, KNOT_COMPR_HINT_RDATA +
+		                                    glue->ns_pos);
+		knot_rrset_t rrsigs = node_rrset(glue->node, KNOT_RRTYPE_RRSIG);
 		for (int k = 0; k < ar_type_count; ++k) {
-			knot_rrset_t additional = node_rrset(node, ar_type_list[k]);
-			if (knot_rrset_empty(&additional)) {
+			knot_rrset_t rrset = node_rrset(glue->node, ar_type_list[k]);
+			if (knot_rrset_empty(&rrset)) {
 				continue;
 			}
-			ret = ns_put_rr(pkt, &additional, &rrsigs, hint, flags, qdata);
+			ret = process_query_put_rr(pkt, qdata, &rrset, &rrsigs,
+			                           hint, flags);
 			if (ret != KNOT_EOK) {
 				break;
 			}
@@ -336,7 +281,6 @@ static int follow_cname(knot_pkt_t *pkt, uint16_t rrtype, struct query_data *qda
 	const zone_node_t *cname_node = qdata->node;
 	knot_rrset_t cname_rr = node_rrset(qdata->node, rrtype);
 	knot_rrset_t rrsigs = node_rrset(qdata->node, KNOT_RRTYPE_RRSIG);
-	int ret = KNOT_EOK;
 
 	assert(!knot_rrset_empty(&cname_rr));
 
@@ -345,7 +289,7 @@ static int follow_cname(knot_pkt_t *pkt, uint16_t rrtype, struct query_data *qda
 
 	/* Now, try to put CNAME to answer. */
 	uint16_t rr_count_before = pkt->rrset_count;
-	ret = ns_put_rr(pkt, &cname_rr, &rrsigs, 0, flags, qdata);
+	int ret = process_query_put_rr(pkt, qdata, &cname_rr, &rrsigs, 0, flags);
 	switch (ret) {
 	case KNOT_EOK:    break;
 	case KNOT_ESPACE: return TRUNC;
@@ -365,13 +309,13 @@ static int follow_cname(knot_pkt_t *pkt, uint16_t rrtype, struct query_data *qda
 			return ERROR;
 		}
 		knot_rrset_t dname_rr = cname_rr;
-		ret = dname_cname_synth(&dname_rr, qdata->name, &cname_rr,
-		                        &pkt->mm);
+		int ret = dname_cname_synth(&dname_rr, qdata->name, &cname_rr,
+		                            &pkt->mm);
 		if (ret != KNOT_EOK) {
 			qdata->rcode = KNOT_RCODE_SERVFAIL;
 			return ERROR;
 		}
-		ret = ns_put_rr(pkt, &cname_rr, NULL, 0, KNOT_PF_FREE, qdata);
+		ret = process_query_put_rr(pkt, qdata, &cname_rr, NULL, 0, KNOT_PF_FREE);
 		switch (ret) {
 		case KNOT_EOK:    break;
 		case KNOT_ESPACE: return TRUNC;
@@ -444,8 +388,8 @@ static int name_not_found(knot_pkt_t *pkt, struct query_data *qdata)
 	if (qdata->encloser->flags & NODE_FLAGS_WILDCARD_CHILD) {
 		/* Find wildcard child in the zone. */
 		const zone_node_t *wildcard_node =
-		                zone_contents_find_wildcard_child(
-		                        qdata->zone->contents, qdata->encloser);
+			zone_contents_find_wildcard_child(
+				qdata->zone->contents, qdata->encloser);
 
 		qdata->node = wildcard_node;
 		assert(qdata->node != NULL);
@@ -468,9 +412,16 @@ static int name_not_found(knot_pkt_t *pkt, struct query_data *qdata)
 		return follow_cname(pkt, KNOT_RRTYPE_DNAME, qdata);
 	}
 
+	/* Look up an authoritative encloser or its parent. */
+	const zone_node_t *node = qdata->encloser;
+	while (node->rrset_count == 0 || node->flags & NODE_FLAGS_NONAUTH) {
+		node = node->parent;
+		assert(node);
+	}
+
 	/* Name is below delegation. */
-	if ((qdata->encloser->flags & NODE_FLAGS_DELEG)) {
-		qdata->node = qdata->encloser;
+	if ((node->flags & NODE_FLAGS_DELEG)) {
+		qdata->node = node;
 		return DELEG;
 	}
 
@@ -480,10 +431,10 @@ static int name_not_found(knot_pkt_t *pkt, struct query_data *qdata)
 static int solve_name(int state, knot_pkt_t *pkt, struct query_data *qdata)
 {
 	int ret = zone_contents_find_dname(qdata->zone->contents, qdata->name,
-	                                        &qdata->node, &qdata->encloser,
-	                                        &qdata->previous);
+	                                   &qdata->node, &qdata->encloser,
+	                                   &qdata->previous);
 
-	switch(ret) {
+	switch (ret) {
 	case ZONE_NAME_FOUND:
 		return name_found(pkt, qdata);
 	case ZONE_NAME_NOT_FOUND:
@@ -523,7 +474,7 @@ static int solve_answer_dnssec(int state, knot_pkt_t *pkt, struct query_data *qd
 
 	/* RFC4035, section 3.1 RRSIGs for RRs in ANSWER are mandatory. */
 	int ret = nsec_append_rrsigs(pkt, qdata, false);
-	switch(ret) {
+	switch (ret) {
 	case KNOT_ESPACE: return TRUNC;
 	case KNOT_EOK:    return state;
 	default:          return ERROR;
@@ -609,47 +560,28 @@ static int solve_authority_dnssec(int state, knot_pkt_t *pkt, struct query_data
 	}
 }
 
-static int solve_additional_kind(int state, knot_pkt_t *pkt, struct query_data *qdata,
-                                 enum additional_kind kind)
+static int solve_additional(int state, knot_pkt_t *pkt, struct query_data *qdata,
+                            void *ctx)
 {
 	int ret = KNOT_EOK;
 
-	/* Only glue can be mandatory. */
-	if (kind == ADDITIONAL_MANDATORY && state != DELEG) {
-		return ret;
-	}
-
 	/* Scan all RRs in ANSWER/AUTHORITY. */
 	for (uint16_t i = 0; i < pkt->rrset_count; ++i) {
 		knot_rrset_t *rr = &pkt->rr[i];
 		knot_rrinfo_t *info = &pkt->rr_info[i];
 
 		/* Skip types for which it doesn't apply. */
-		if (!knot_rrtype_additional_needed(pkt->rr[i].type)) {
+		if (!knot_rrtype_additional_needed(rr->type)) {
 			continue;
 		}
 
 		/* Put additional records for given type. */
-		ret = put_additional(pkt, rr, qdata, info, state, kind);
+		ret = put_additional(pkt, rr, qdata, info, state);
 		if (ret != KNOT_EOK) {
 			break;
 		}
 	}
 
-	return ret;
-}
-
-static int solve_additional(int state, knot_pkt_t *pkt,
-                            struct query_data *qdata, void *ctx)
-{
-	int ret = KNOT_EOK;
-
-	/* First mandatory, then optional. */
-	ret = solve_additional_kind(state, pkt, qdata, ADDITIONAL_MANDATORY);
-	if (ret == KNOT_EOK) {
-		ret = solve_additional_kind(state, pkt, qdata, ADDITIONAL_OPTIONAL);
-	}
-
 	/* Evaluate final state. */
 	switch (ret) {
 	case KNOT_EOK:    return state; /* Keep current state. */
@@ -673,84 +605,24 @@ static int solve_additional_dnssec(int state, knot_pkt_t *pkt, struct query_data
 	}
 }
 
-int ns_put_rr(knot_pkt_t *pkt, const knot_rrset_t *rr,
-              const knot_rrset_t *rrsigs, uint16_t compr_hint,
-              uint32_t flags, struct query_data *qdata)
-{
-	if (rr->rrs.rr_count < 1) {
-		return KNOT_EMALF;
-	}
-
-	/* Wildcard expansion applies only for answers. */
-	bool expand = false;
-	if (pkt->current == KNOT_ANSWER) {
-		/* Expand if RR is wildcard & we didn't query for wildcard. */
-		expand = (knot_dname_is_wildcard(rr->owner) && !knot_dname_is_wildcard(qdata->name));
-	}
-
-	/* If we already have compressed name on the wire and compression hint,
-	 * we can just insert RRSet and fake synthesis by using compression
-	 * hint. */
-	int ret = KNOT_EOK;
-	knot_rrset_t to_add;
-	if (compr_hint == KNOT_COMPR_HINT_NONE && expand) {
-		knot_dname_t *qname_cpy = knot_dname_copy(qdata->name, &pkt->mm);
-		if (qname_cpy == NULL) {
-			return KNOT_ENOMEM;
-		}
-		knot_rrset_init(&to_add, qname_cpy, rr->type, rr->rclass);
-		int ret = knot_rdataset_copy(&to_add.rrs, &rr->rrs, &pkt->mm);
-		if (ret != KNOT_EOK) {
-			knot_dname_free(&qname_cpy, &pkt->mm);
-		}
-		to_add.additional = rr->additional;
-		flags |= KNOT_PF_FREE;
-	} else {
-		to_add = *rr;
-	}
-
-	uint16_t prev_count = pkt->rrset_count;
-	ret = knot_pkt_put(pkt, compr_hint, &to_add, flags);
-	if (ret != KNOT_EOK && (flags & KNOT_PF_FREE)) {
-		knot_rrset_clear(&to_add, &pkt->mm);
-		return ret;
-	}
-
-	const bool inserted = (prev_count != pkt->rrset_count);
-	if (inserted &&
-	    !knot_rrset_empty(rrsigs) && rr->type != KNOT_RRTYPE_RRSIG) {
-		// Get rrinfo of just inserted RR.
-		knot_rrinfo_t *rrinfo = &pkt->rr_info[pkt->rrset_count - 1];
-		ret = put_rrsig(rr->owner, rr->type, rrsigs, rrinfo, qdata);
-	}
-
-	return ret;
-}
-
 /*! \brief Helper for internet_query repetitive code. */
 #define SOLVE_STEP(solver, state, context) \
-	state = (solver)(state, response, qdata, context); \
+	state = (solver)(state, pkt, qdata, context); \
 	if (state == TRUNC) { \
 		return KNOT_STATE_DONE; \
 	} else if (state == ERROR) { \
 		return KNOT_STATE_FAIL; \
 	}
 
-static int answer_query(struct query_plan *plan, knot_pkt_t *response, struct query_data *qdata)
+static int answer_query(knot_pkt_t *pkt, struct query_data *qdata)
 {
 	int state = BEGIN;
+	struct query_plan *plan = qdata->zone->query_plan;
 	struct query_plan *global_plan = conf()->query_plan;
 	struct query_step *step = NULL;
 
-	/* Before query processing code. */
-	if (plan != NULL) {
-		WALK_LIST(step, plan->stage[QPLAN_BEGIN]) {
-			SOLVE_STEP(step->process, state, step->ctx);
-		}
-	}
-
 	/* Resolve ANSWER. */
-	knot_pkt_begin(response, KNOT_ANSWER);
+	knot_pkt_begin(pkt, KNOT_ANSWER);
 	if (global_plan != NULL) {
 		WALK_LIST(step, global_plan->stage[QPLAN_ANSWER]) {
 			SOLVE_STEP(step->process, state, step->ctx);
@@ -765,7 +637,7 @@ static int answer_query(struct query_plan *plan, knot_pkt_t *response, struct qu
 	}
 
 	/* Resolve AUTHORITY. */
-	knot_pkt_begin(response, KNOT_AUTHORITY);
+	knot_pkt_begin(pkt, KNOT_AUTHORITY);
 	if (global_plan != NULL) {
 		WALK_LIST(step, global_plan->stage[QPLAN_AUTHORITY]) {
 			SOLVE_STEP(step->process, state, step->ctx);
@@ -780,7 +652,7 @@ static int answer_query(struct query_plan *plan, knot_pkt_t *response, struct qu
 	}
 
 	/* Resolve ADDITIONAL. */
-	knot_pkt_begin(response, KNOT_ADDITIONAL);
+	knot_pkt_begin(pkt, KNOT_ADDITIONAL);
 	if (global_plan != NULL) {
 		WALK_LIST(step, global_plan->stage[QPLAN_ADDITIONAL]) {
 			SOLVE_STEP(step->process, state, step->ctx);
@@ -794,22 +666,15 @@ static int answer_query(struct query_plan *plan, knot_pkt_t *response, struct qu
 		}
 	}
 
-	/* After query processing code. */
-	if (plan != NULL) {
-		WALK_LIST(step, plan->stage[QPLAN_END]) {
-			SOLVE_STEP(step->process, state, step->ctx);
-		}
-	}
-
 	/* Write resulting RCODE. */
-	knot_wire_set_rcode(response->wire, qdata->rcode);
+	knot_wire_set_rcode(pkt->wire, qdata->rcode);
 
 	return KNOT_STATE_DONE;
 }
 
-int internet_process_query(knot_pkt_t *response, struct query_data *qdata)
+int internet_process_query(knot_pkt_t *pkt, struct query_data *qdata)
 {
-	if (response == NULL || qdata == NULL) {
+	if (pkt == NULL || qdata == NULL) {
 		return KNOT_STATE_FAIL;
 	}
 
@@ -822,7 +687,7 @@ int internet_process_query(knot_pkt_t *response, struct query_data *qdata)
 		NS_NEED_AUTH(qdata, qdata->zone->name, ACL_ACTION_NONE);
 
 		/* Reserve space for TSIG. */
-		knot_pkt_reserve(response, knot_tsig_wire_maxsize(&qdata->sign.tsig_key));
+		knot_pkt_reserve(pkt, knot_tsig_wire_maxsize(&qdata->sign.tsig_key));
 	}
 
 	NS_NEED_ZONE_CONTENTS(qdata, KNOT_RCODE_SERVFAIL); /* Expired */
@@ -830,5 +695,5 @@ int internet_process_query(knot_pkt_t *response, struct query_data *qdata)
 	/* Get answer to QNAME. */
 	qdata->name = knot_pkt_qname(qdata->query);
 
-	return answer_query(qdata->zone->query_plan, response, qdata);
+	return answer_query(pkt, qdata);
 }
diff --git a/src/knot/nameserver/internet.h b/src/knot/nameserver/internet.h
index 0d438386ed189f7ff1ecae46374e4e61b4315d39..49de2cfb01a3d587dcebafe689413d2c6a4030b5 100644
--- a/src/knot/nameserver/internet.h
+++ b/src/knot/nameserver/internet.h
@@ -13,22 +13,13 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-/*!
- * \file
- *
- * \brief IN zone lookup.
- *
- * \addtogroup query_processing
- * @{
- */
 
 #pragma once
 
 #include "libknot/packet/pkt.h"
-#include "knot/query/layer.h"
 
-/* Query data (from query processing). */
 struct query_data;
+struct answer_data;
 
 /*! \brief Internet query processing states. */
 enum {
@@ -45,10 +36,10 @@ enum {
 /*!
  * \brief Answer query from an IN class zone.
  *
- * \retval FAIL if it encountered an error.
- * \retval DONE if finished.
+ * \retval KNOT_STATE_FAIL if it encountered an error.
+ * \retval KNOT_STATE_DONE if finished.
  */
-int internet_process_query(knot_pkt_t *resp, struct query_data *qdata);
+int internet_process_query(knot_pkt_t *pkt, struct query_data *qdata);
 
 /*!
  * \brief Puts RRSet to packet, will store its RRSIG for later use.
@@ -105,9 +96,8 @@ int ns_put_rr(knot_pkt_t *pkt, const knot_rrset_t *rr,
 		} \
 	}
 
+/*! \brief Require maximum number of unsigned messages. */
 #define NS_NEED_TSIG_SIGNED(tsig_ctx, max_unsigned) \
 	if (tsig_unsigned_count(tsig_ctx) > max_unsigned) { \
 		return KNOT_STATE_FAIL; \
 	}
-
-/*! @} */
diff --git a/src/knot/nameserver/ixfr.c b/src/knot/nameserver/ixfr.c
index d044b9ad525a51f4d69e1afe307e96fd66328413..a618e70129beed358be6e449824d2049ece48f84 100644
--- a/src/knot/nameserver/ixfr.c
+++ b/src/knot/nameserver/ixfr.c
@@ -93,7 +93,7 @@ static int ixfr_process_changeset(knot_pkt_t *pkt, const void *item,
 	/* Put REMOVE RRSets. */
 	if (ixfr->state == IXFR_DEL) {
 		if (iter_empty(ixfr)) {
-			ret = changeset_iter_rem(&ixfr->cur, chgset, false);
+			ret = changeset_iter_rem(&ixfr->cur, chgset);
 			if (ret != KNOT_EOK) {
 				return ret;
 			}
@@ -115,7 +115,7 @@ static int ixfr_process_changeset(knot_pkt_t *pkt, const void *item,
 	/* Put Add RRSets. */
 	if (ixfr->state == IXFR_ADD) {
 		if (iter_empty(ixfr)) {
-			ret = changeset_iter_add(&ixfr->cur, chgset, false);
+			ret = changeset_iter_add(&ixfr->cur, chgset);
 			if (ret != KNOT_EOK) {
 				return ret;
 			}
@@ -139,7 +139,7 @@ static int ixfr_process_changeset(knot_pkt_t *pkt, const void *item,
 #undef IXFR_SAFE_PUT
 
 /*! \brief Loads IXFRs from journal. */
-static int ixfr_load_chsets(list_t *chgsets, const zone_t *zone,
+static int ixfr_load_chsets(list_t *chgsets, zone_t *zone,
                             const knot_rrset_t *their_soa)
 {
 	assert(chgsets);
@@ -153,12 +153,7 @@ static int ixfr_load_chsets(list_t *chgsets, const zone_t *zone,
 		return KNOT_EUPTODATE;
 	}
 
-	char *path = conf_journalfile(conf(), zone->name);
-	pthread_mutex_lock((pthread_mutex_t *)&zone->journal_lock);
-	ret = journal_load_changesets(path, zone, chgsets, serial_from, serial_to);
-	pthread_mutex_unlock((pthread_mutex_t *)&zone->journal_lock);
-	free(path);
-
+	ret = zone_changes_load(conf(), zone, chgsets, serial_from);
 	if (ret != KNOT_EOK) {
 		changesets_free(chgsets);
 	}
diff --git a/src/knot/nameserver/nsec_proofs.c b/src/knot/nameserver/nsec_proofs.c
index 3edcbf2de2f3e51776709d3846c411e19a537942..8cc6330a69835701418b986a0ef24d49b0eb6850 100644
--- a/src/knot/nameserver/nsec_proofs.c
+++ b/src/knot/nameserver/nsec_proofs.c
@@ -173,8 +173,8 @@ static int put_nxt_from_node(const zone_node_t *node,
 
 	knot_rrset_t rrsigs = node_rrset(node, KNOT_RRTYPE_RRSIG);
 
-	return ns_put_rr(resp, &rrset, &rrsigs, KNOT_COMPR_HINT_NONE,
-	                 KNOT_PF_CHECKDUP, qdata);
+	return process_query_put_rr(resp, qdata, &rrset, &rrsigs,
+	                            KNOT_COMPR_HINT_NONE, KNOT_PF_CHECKDUP);
 }
 
 /*!
@@ -439,7 +439,7 @@ static int put_nsec_nxdomain(const zone_contents_t *zone,
 /*!
  * \brief Put NSEC3s for NXDOMAIN error into the response.
  *
- * Adds up to three NSEC3 records. We have to proove that some parent name
+ * Adds up to three NSEC3 records. We have to prove that some parent name
  * exists (closest encloser proof) and that no wildcard expansion is possible
  * bellow that closest encloser.
  *
@@ -667,7 +667,8 @@ int nsec_prove_dp_security(knot_pkt_t *pkt, struct query_data *qdata)
 	knot_rrset_t rrset = node_rrset(qdata->node, KNOT_RRTYPE_DS);
 	if (!knot_rrset_empty(&rrset)) {
 		knot_rrset_t rrsigs = node_rrset(qdata->node, KNOT_RRTYPE_RRSIG);
-		return ns_put_rr(pkt, &rrset, &rrsigs, KNOT_COMPR_HINT_NONE, 0, qdata);
+		return process_query_put_rr(pkt, qdata, &rrset, &rrsigs,
+		                            KNOT_COMPR_HINT_NONE, 0);
 	}
 
 	// Alternatively prove that DS doesn't exist.
diff --git a/src/knot/nameserver/process_query.c b/src/knot/nameserver/process_query.c
index af18d495e5753f934adcf9c66f8a18feaf578482..38bc3672008d598c6f481b2b64a3d7446d3e7615 100644
--- a/src/knot/nameserver/process_query.c
+++ b/src/knot/nameserver/process_query.c
@@ -18,6 +18,7 @@
 
 #include "dnssec/tsig.h"
 #include "knot/common/log.h"
+#include "knot/dnssec/rrset-sign.h"
 #include "knot/nameserver/process_query.h"
 #include "knot/nameserver/query_module.h"
 #include "knot/nameserver/chaos.h"
@@ -122,32 +123,18 @@ static int process_query_in(knot_layer_t *ctx, knot_pkt_t *pkt)
 static int query_internet(knot_pkt_t *pkt, knot_layer_t *ctx)
 {
 	struct query_data *data = QUERY_DATA(ctx);
-	int next_state = KNOT_STATE_FAIL;
 
 	switch(data->packet_type) {
-	case KNOT_QUERY_NORMAL:
-		next_state = internet_process_query(pkt, data);
-		break;
-	case KNOT_QUERY_NOTIFY:
-		next_state = notify_process_query(pkt, data);
-		break;
-	case KNOT_QUERY_AXFR:
-		next_state = axfr_process_query(pkt, data);
-		break;
-	case KNOT_QUERY_IXFR:
-		next_state = ixfr_process_query(pkt, data);
-		break;
-	case KNOT_QUERY_UPDATE:
-		next_state = update_process_query(pkt, data);
-		break;
+	case KNOT_QUERY_NORMAL: return internet_process_query(pkt, data);
+	case KNOT_QUERY_NOTIFY: return notify_process_query(pkt, data);
+	case KNOT_QUERY_AXFR:   return axfr_process_query(pkt, data);
+	case KNOT_QUERY_IXFR:   return ixfr_process_query(pkt, data);
+	case KNOT_QUERY_UPDATE: return update_process_query(pkt, data);
 	default:
 		/* Nothing else is supported. */
 		data->rcode = KNOT_RCODE_NOTIMPL;
-		next_state = KNOT_STATE_FAIL;
-		break;
+		return KNOT_STATE_FAIL;
 	}
-
-	return next_state;
 }
 
 /*!
@@ -321,6 +308,7 @@ static int prepare_answer(const knot_pkt_t *query, knot_pkt_t *resp, knot_layer_
 	if (ret != KNOT_EOK) {
 		return ret;
 	}
+	knot_wire_clear_cd(resp->wire);
 
 	/* Query MUST carry a question. */
 	const knot_dname_t *qname = knot_pkt_qname(query);
@@ -373,24 +361,21 @@ static int prepare_answer(const knot_pkt_t *query, knot_pkt_t *resp, knot_layer_
 	return ret;
 }
 
-static int set_rcode_to_packet(knot_pkt_t *pkt, struct query_data *qdata)
+static void set_rcode_to_packet(knot_pkt_t *pkt, struct query_data *qdata)
 {
-	int ret = KNOT_EOK;
 	uint8_t ext_rcode = KNOT_EDNS_RCODE_HI(qdata->rcode);
 
 	if (ext_rcode != 0) {
 		/* No OPT RR and Ext RCODE results in SERVFAIL. */
 		if (qdata->opt_rr_pos == NULL) {
-			qdata->rcode = KNOT_RCODE_SERVFAIL;
-			ret = KNOT_ERROR;
-		} else {
-			knot_edns_set_ext_rcode_wire(qdata->opt_rr_pos, ext_rcode);
+			knot_wire_set_rcode(pkt->wire, KNOT_RCODE_SERVFAIL);
+			return;
 		}
+
+		knot_edns_set_ext_rcode_wire(qdata->opt_rr_pos, ext_rcode);
 	}
 
 	knot_wire_set_rcode(pkt->wire, KNOT_EDNS_RCODE_LO(qdata->rcode));
-
-	return ret;
 }
 
 static int process_query_err(knot_layer_t *ctx, knot_pkt_t *pkt)
@@ -401,9 +386,15 @@ static int process_query_err(knot_layer_t *ctx, knot_pkt_t *pkt)
 	/* Initialize response from query packet. */
 	knot_pkt_t *query = qdata->query;
 	knot_pkt_init_response(pkt, query);
+	knot_wire_clear_cd(pkt->wire);
+
+	/* Set TC bit if required. */
+	if (qdata->err_truncated) {
+		knot_wire_set_tc(pkt->wire);
+	}
 
 	/* Restore original QNAME. */
-	process_query_qname_case_restore(qdata, pkt);
+	process_query_qname_case_restore(pkt, qdata);
 
 	/* Add OPT and TSIG (best effort, send reply anyway if fails). */
 	if (pkt->current != KNOT_ADDITIONAL) {
@@ -412,64 +403,31 @@ static int process_query_err(knot_layer_t *ctx, knot_pkt_t *pkt)
 
 	/* Put OPT RR to the additional section. */
 	if (answer_edns_reserve(pkt, qdata) == KNOT_EOK) {
-		(void) answer_edns_put(pkt, qdata);
+		(void)answer_edns_put(pkt, qdata);
+	} else {
+		qdata->rcode = KNOT_RCODE_SERVFAIL;
 	}
 
 	/* Set final RCODE to packet. */
-	(void) set_rcode_to_packet(pkt, qdata);
+	set_rcode_to_packet(pkt, qdata);
 
 	/* Transaction security (if applicable). */
-	(void) process_query_sign_response(pkt, qdata);
+	(void)process_query_sign_response(pkt, qdata);
 
 	return KNOT_STATE_DONE;
 }
 
-/*!
- * \brief Apply rate limit.
- */
-static int ratelimit_apply(int state, knot_pkt_t *pkt, knot_layer_t *ctx)
-{
-	/* Check if rate limiting applies. */
-	struct query_data *qdata = QUERY_DATA(ctx);
-	server_t *server = qdata->param->server;
-	if (server->rrl == NULL) {
-		return state;
-	}
-
-	/* Exempt clients. */
-	conf_val_t *whitelist = &conf()->cache.srv_rate_limit_whitelist;
-	if (conf_addr_range_match(whitelist, qdata->param->remote)) {
-		return state;
-	}
-
-	rrl_req_t rrl_rq = {0};
-	rrl_rq.w = pkt->wire;
-	rrl_rq.query = qdata->query;
-	if (!EMPTY_LIST(qdata->wildcards)) {
-		rrl_rq.flags = RRL_WILDCARD;
-	}
-	if (rrl_query(server->rrl, qdata->param->remote,
-	              &rrl_rq, qdata->zone) == KNOT_EOK) {
-		/* Rate limiting not applied. */
-		return state;
+/*! \brief Helper for repetitive code. */
+#define PROCESS_STAGE(plan, query_stage, step, next_state, qdata) \
+	if (plan != NULL) { \
+		WALK_LIST(step, plan->stage[query_stage]) { \
+			next_state = step->process(next_state, pkt, qdata, step->ctx); \
+			if (next_state == KNOT_STATE_FAIL) { \
+				next_state = process_query_err(ctx, pkt); \
+			} \
+		} \
 	}
 
-	/* Now it is slip or drop. */
-	int slip = conf()->cache.srv_rate_limit_slip;
-	if (slip > 0 && rrl_slip_roll(slip)) {
-		/* Answer slips. */
-		if (process_query_err(ctx, pkt) != KNOT_STATE_DONE) {
-			return KNOT_STATE_FAIL;
-		}
-		knot_wire_set_tc(pkt->wire);
-	} else {
-		/* Drop answer. */
-		pkt->size = 0;
-	}
-
-	return KNOT_STATE_DONE;
-}
-
 static int process_query_out(knot_layer_t *ctx, knot_pkt_t *pkt)
 {
 	assert(pkt && ctx);
@@ -478,34 +436,33 @@ static int process_query_out(knot_layer_t *ctx, knot_pkt_t *pkt)
 
 	struct query_data *qdata = QUERY_DATA(ctx);
 	struct query_plan *plan = conf()->query_plan;
+	struct query_plan *zone_plan = NULL;
 	struct query_step *step = NULL;
 
+	int next_state = KNOT_STATE_PRODUCE;
+
 	/* Check parse state. */
 	knot_pkt_t *query = qdata->query;
-	int next_state = KNOT_STATE_PRODUCE;
 	if (query->parsed < query->size) {
-		knot_pkt_clear(pkt);
 		qdata->rcode = KNOT_RCODE_FORMERR;
 		next_state = KNOT_STATE_FAIL;
 		goto finish;
 	}
 
-	/*
-	 * Preprocessing.
-	 */
-
+	/* Preprocessing. */
 	if (prepare_answer(query, pkt, ctx) != KNOT_EOK) {
 		next_state = KNOT_STATE_FAIL;
 		goto finish;
 	}
 
-	/* Before query processing code. */
-	if (plan) {
-		WALK_LIST(step, plan->stage[QPLAN_BEGIN]) {
-			next_state = step->process(next_state, pkt, qdata, step->ctx);
-		}
+	if (qdata->zone != NULL && qdata->zone->query_plan != NULL) {
+		zone_plan = qdata->zone->query_plan;
 	}
 
+	/* Before query processing code. */
+	PROCESS_STAGE(plan, QPLAN_BEGIN, step, next_state, qdata);
+	PROCESS_STAGE(zone_plan, QPLAN_BEGIN, step, next_state, qdata);
+
 	/* Answer based on qclass. */
 	if (next_state != KNOT_STATE_DONE) {
 		switch (knot_pkt_qclass(pkt)) {
@@ -523,14 +480,11 @@ static int process_query_out(knot_layer_t *ctx, knot_pkt_t *pkt)
 		}
 	}
 
-	/*
-	 * Postprocessing.
-	 */
-
+	/* Postprocessing. */
 	if (next_state == KNOT_STATE_DONE || next_state == KNOT_STATE_PRODUCE) {
 
 		/* Restore original QNAME. */
-		process_query_qname_case_restore(qdata, pkt);
+		process_query_qname_case_restore(pkt, qdata);
 
 		if (pkt->current != KNOT_ADDITIONAL) {
 			knot_pkt_begin(pkt, KNOT_ADDITIONAL);
@@ -545,34 +499,28 @@ static int process_query_out(knot_layer_t *ctx, knot_pkt_t *pkt)
 		/* Transaction security (if applicable). */
 		if (process_query_sign_response(pkt, qdata) != KNOT_EOK) {
 			next_state = KNOT_STATE_FAIL;
+			goto finish;
 		}
 	}
 
 finish:
-	/* Default RCODE is SERVFAIL if not specified otherwise. */
-	if (next_state == KNOT_STATE_FAIL && qdata->rcode == KNOT_RCODE_NOERROR) {
-		qdata->rcode = KNOT_RCODE_SERVFAIL;
-	}
-
-	/* Store Extended RCODE - divide between header and OPT if possible. */
-	if (next_state != KNOT_STATE_FAIL) {
-		if (set_rcode_to_packet(pkt, qdata) != KNOT_EOK) {
-			next_state = KNOT_STATE_FAIL;
+	/* Error processing. */
+	switch (next_state) {
+	case KNOT_STATE_FAIL:
+		/* Default RCODE is SERVFAIL if not otherwise specified. */
+		if (qdata->rcode == KNOT_RCODE_NOERROR) {
+			qdata->rcode = KNOT_RCODE_SERVFAIL;
 		}
+		process_query_err(ctx, pkt);
+		break;
+	default:
+		/* Store Extended RCODE - divide between header and OPT. */
+		set_rcode_to_packet(pkt, qdata);
 	}
-	/* In case of NS_PROC_FAIL, RCODE is set in the error-processing function. */
 
 	/* After query processing code. */
-	if (plan) {
-		WALK_LIST(step, plan->stage[QPLAN_END]) {
-			next_state = step->process(next_state, pkt, qdata, step->ctx);
-		}
-	}
-
-	/* Rate limits (if applicable). */
-	if (qdata->param->proc_flags & NS_QUERY_LIMIT_RATE) {
-		next_state = ratelimit_apply(next_state, pkt, ctx);
-	}
+	PROCESS_STAGE(zone_plan, QPLAN_END, step, next_state, qdata);
+	PROCESS_STAGE(plan, QPLAN_END, step, next_state, qdata);
 
 	rcu_read_unlock();
 
@@ -616,7 +564,7 @@ bool process_query_acl_check(conf_t *conf, const knot_dname_t *zone_name,
 		free(key_name);
 
 		qdata->rcode = KNOT_RCODE_NOTAUTH;
-		qdata->rcode_tsig = KNOT_TSIG_ERR_BADKEY;
+		qdata->rcode_tsig = KNOT_RCODE_BADKEY;
 		return false;
 	}
 
@@ -642,7 +590,7 @@ int process_query_verify(struct query_data *qdata)
 	ctx->tsig_digestlen = knot_tsig_rdata_mac_length(query->tsig_rr);
 
 	/* Checking query. */
-	process_query_qname_case_restore(qdata, query);
+	process_query_qname_case_restore(query, qdata);
 	int ret = knot_tsig_server_check(query->tsig_rr, query->wire,
 	                                 query->size, &ctx->tsig_key);
 	process_query_qname_case_lower(query);
@@ -654,15 +602,15 @@ int process_query_verify(struct query_data *qdata)
 		break;
 	case KNOT_TSIG_EBADKEY:
 		qdata->rcode = KNOT_RCODE_NOTAUTH;
-		qdata->rcode_tsig = KNOT_TSIG_ERR_BADKEY;
+		qdata->rcode_tsig = KNOT_RCODE_BADKEY;
 		break;
 	case KNOT_TSIG_EBADSIG:
 		qdata->rcode = KNOT_RCODE_NOTAUTH;
-		qdata->rcode_tsig = KNOT_TSIG_ERR_BADSIG;
+		qdata->rcode_tsig = KNOT_RCODE_BADSIG;
 		break;
 	case KNOT_TSIG_EBADTIME:
 		qdata->rcode = KNOT_RCODE_NOTAUTH;
-		qdata->rcode_tsig = KNOT_TSIG_ERR_BADTIME;
+		qdata->rcode_tsig = KNOT_RCODE_BADTIME;
 		ctx->tsig_time_signed = knot_tsig_rdata_time_signed(query->tsig_rr);
 		break;
 	case KNOT_EMALF:
@@ -729,7 +677,7 @@ fail:
 	return ret;
 }
 
-void process_query_qname_case_restore(struct query_data *qdata, knot_pkt_t *pkt)
+void process_query_qname_case_restore(knot_pkt_t *pkt, struct query_data *qdata)
 {
 	/* If original QNAME is empty, Query is either unparsed or for root domain.
 	 * Either way, letter case doesn't matter. */
@@ -745,6 +693,102 @@ int process_query_qname_case_lower(knot_pkt_t *pkt)
 	return knot_dname_to_lower(qname);
 }
 
+/*! \brief Synthesize RRSIG for given parameters, store in 'qdata' for later use */
+static int put_rrsig(const knot_dname_t *sig_owner, uint16_t type,
+                     const knot_rrset_t *rrsigs, knot_rrinfo_t *rrinfo,
+                     struct query_data *qdata)
+{
+	knot_rdataset_t synth_rrs;
+	knot_rdataset_init(&synth_rrs);
+	int ret = knot_synth_rrsig(type, &rrsigs->rrs, &synth_rrs, qdata->mm);
+	if (ret == KNOT_ENOENT) {
+		// No signature
+		return KNOT_EOK;
+	}
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	/* Create rrsig info structure. */
+	struct rrsig_info *info = mm_alloc(qdata->mm, sizeof(struct rrsig_info));
+	if (info == NULL) {
+		knot_rdataset_clear(&synth_rrs, qdata->mm);
+		return KNOT_ENOMEM;
+	}
+
+	/* Store RRSIG into info structure. */
+	knot_dname_t *owner_copy = knot_dname_copy(sig_owner, qdata->mm);
+	if (owner_copy == NULL) {
+		mm_free(qdata->mm, info);
+		knot_rdataset_clear(&synth_rrs, qdata->mm);
+		return KNOT_ENOMEM;
+	}
+	knot_rrset_init(&info->synth_rrsig, owner_copy, rrsigs->type, rrsigs->rclass);
+	/* Store filtered signature. */
+	info->synth_rrsig.rrs = synth_rrs;
+
+	info->rrinfo = rrinfo;
+	add_tail(&qdata->rrsigs, &info->n);
+
+	return KNOT_EOK;
+}
+
+int process_query_put_rr(knot_pkt_t *pkt, struct query_data *qdata,
+                         const knot_rrset_t *rr, const knot_rrset_t *rrsigs,
+                         uint16_t compr_hint, uint32_t flags)
+{
+	if (rr->rrs.rr_count < 1) {
+		return KNOT_EMALF;
+	}
+
+	/* Wildcard expansion applies only for answers. */
+	bool expand = false;
+	if (pkt->current == KNOT_ANSWER) {
+		/* Expand if RR is wildcard & we didn't query for wildcard. */
+		expand = (knot_dname_is_wildcard(rr->owner) && !knot_dname_is_wildcard(qdata->name));
+	}
+
+	int ret = KNOT_EOK;
+
+	/* If we already have compressed name on the wire and compression hint,
+	 * we can just insert RRSet and fake synthesis by using compression
+	 * hint. */
+	knot_rrset_t to_add;
+	if (compr_hint == KNOT_COMPR_HINT_NONE && expand) {
+		knot_dname_t *qname_cpy = knot_dname_copy(qdata->name, &pkt->mm);
+		if (qname_cpy == NULL) {
+			return KNOT_ENOMEM;
+		}
+		knot_rrset_init(&to_add, qname_cpy, rr->type, rr->rclass);
+		ret = knot_rdataset_copy(&to_add.rrs, &rr->rrs, &pkt->mm);
+		if (ret != KNOT_EOK) {
+			knot_dname_free(&qname_cpy, &pkt->mm);
+			return ret;
+		}
+		to_add.additional = rr->additional;
+		flags |= KNOT_PF_FREE;
+	} else {
+		to_add = *rr;
+	}
+
+	uint16_t prev_count = pkt->rrset_count;
+	ret = knot_pkt_put(pkt, compr_hint, &to_add, flags);
+	if (ret != KNOT_EOK && (flags & KNOT_PF_FREE)) {
+		knot_rrset_clear(&to_add, &pkt->mm);
+		return ret;
+	}
+
+	const bool inserted = (prev_count != pkt->rrset_count);
+	if (inserted &&
+	    !knot_rrset_empty(rrsigs) && rr->type != KNOT_RRTYPE_RRSIG) {
+		// Get rrinfo of just inserted RR.
+		knot_rrinfo_t *rrinfo = &pkt->rr_info[pkt->rrset_count - 1];
+		ret = put_rrsig(rr->owner, rr->type, rrsigs, rrinfo, qdata);
+	}
+
+	return ret;
+}
+
 /*! \brief Module implementation. */
 const knot_layer_api_t *process_query_layer(void)
 {
diff --git a/src/knot/nameserver/process_query.h b/src/knot/nameserver/process_query.h
index 7f4e3a43c70d5568f8f40881d3ebdcfcd7f79b16..a2f6cded1272d4a6285c37b88eb3f7f4b0ec5f15 100644
--- a/src/knot/nameserver/process_query.h
+++ b/src/knot/nameserver/process_query.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -13,14 +13,6 @@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-/*!
- * \file
- *
- * \brief Query processor.
- *
- * \addtogroup query_processing
- * @{
- */
 
 #pragma once
 
@@ -37,8 +29,7 @@ enum process_query_flag {
 	NS_QUERY_NO_AXFR    = 1 << 0, /* Don't process AXFR */
 	NS_QUERY_NO_IXFR    = 1 << 1, /* Don't process IXFR */
 	NS_QUERY_LIMIT_ANY  = 1 << 2, /* Limit ANY QTYPE (respond with TC=1) */
-	NS_QUERY_LIMIT_RATE = 1 << 3, /* Apply rate limits. */
-	NS_QUERY_LIMIT_SIZE = 1 << 4  /* Apply UDP size limit. */
+	NS_QUERY_LIMIT_SIZE = 1 << 3  /* Apply UDP size limit. */
 };
 
 /* Module load parameters. */
@@ -59,6 +50,7 @@ struct query_data {
 	const zone_t *zone;   /*!< Zone from which is answered. */
 	list_t wildcards;     /*!< Visited wildcards. */
 	list_t rrsigs;        /*!< Section RRSIGs. */
+	bool err_truncated;   /*!< Set TC bit if error reply. */
 
 	/* Current processed name and nodes. */
 	const zone_node_t *node, *encloser, *previous;
@@ -133,10 +125,10 @@ int process_query_sign_response(knot_pkt_t *pkt, struct query_data *qdata);
 /*!
  * \brief Restore QNAME letter case.
  *
- * \param qdata  Query data.
  * \param pkt    Incoming message.
+ * \param qdata  Query data.
  */
-void process_query_qname_case_restore(struct query_data *qdata, knot_pkt_t *pkt);
+void process_query_qname_case_restore(knot_pkt_t *pkt, struct query_data *qdata);
 
 /*!
  * \brief Convert QNAME to lowercase format for processing.
@@ -145,4 +137,18 @@ void process_query_qname_case_restore(struct query_data *qdata, knot_pkt_t *pkt)
  */
 int process_query_qname_case_lower(knot_pkt_t *pkt);
 
-/*! @} */
+/*!
+ * \brief Puts RRSet to packet, will store its RRSIG for later use.
+ *
+ * \param pkt         Packet to store RRSet into.
+ * \param qdata       Query data structure.
+ * \param rr          RRSet to be stored.
+ * \param rrsigs      RRSIGs to be stored.
+ * \param compr_hint  Compression hint.
+ * \param flags       Flags.
+ *
+ * \return KNOT_E*
+ */
+int process_query_put_rr(knot_pkt_t *pkt, struct query_data *qdata,
+                         const knot_rrset_t *rr, const knot_rrset_t *rrsigs,
+                         uint16_t compr_hint, uint32_t flags);
diff --git a/src/knot/nameserver/query_module.c b/src/knot/nameserver/query_module.c
index f60069d7947c874d912ed7d0d3b24421b07e9de2..55b41433bed4af975d0d808f7d92f2bf184d6fe3 100644
--- a/src/knot/nameserver/query_module.c
+++ b/src/knot/nameserver/query_module.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,45 +14,41 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <assert.h>
+
 #include "knot/nameserver/query_module.h"
-#include "libknot/libknot.h"
 #include "contrib/mempattern.h"
-#include "contrib/openbsd/strlcpy.h"
 
-/* Compiled-in module headers. */
-#include "knot/modules/synth_record.h"
-#include "knot/modules/dnsproxy.h"
-#include "knot/modules/online_sign/module.h"
+#include "knot/modules/rrl/rrl.h"
+#include "knot/modules/stats/stats.h"
+#include "knot/modules/synth_record/synth_record.h"
+#include "knot/modules/dnsproxy/dnsproxy.h"
+#include "knot/modules/online_sign/online_sign.h"
 #ifdef HAVE_ROSEDB
-#include "knot/modules/rosedb.h"
+#include "knot/modules/rosedb/rosedb.h"
 #endif
 #if USE_DNSTAP
-#include "knot/modules/dnstap.h"
+#include "knot/modules/dnstap/dnstap.h"
 #endif
-#include "knot/modules/whoami.h"
-#include "knot/modules/noudp.h"
-
-typedef struct static_module {
-	const yp_name_t *name;
-	qmodule_load_t load;
-	qmodule_unload_t unload;
-	unsigned scope;
-} static_module_t;
+#include "knot/modules/whoami/whoami.h"
+#include "knot/modules/noudp/noudp.h"
 
 /*! \note All modules should be dynamically loaded later on. */
 static_module_t MODULES[] = {
-        { C_MOD_SYNTH_RECORD, &synth_record_load, &synth_record_unload, MOD_SCOPE_ANY },
-        { C_MOD_DNSPROXY,     &dnsproxy_load,     &dnsproxy_unload,     MOD_SCOPE_ANY },
-        { C_MOD_ONLINE_SIGN,  &online_sign_load,  &online_sign_unload,  MOD_SCOPE_ZONE },
+	{ C_MOD_RRL,          &rrl_load,          &rrl_unload,          MOD_SCOPE_ANY },
+	{ C_MOD_SYNTH_RECORD, &synth_record_load, &synth_record_unload, MOD_SCOPE_ANY },
+	{ C_MOD_DNSPROXY,     &dnsproxy_load,     &dnsproxy_unload,     MOD_SCOPE_ANY },
+	{ C_MOD_ONLINE_SIGN,  &online_sign_load,  &online_sign_unload,  MOD_SCOPE_ZONE, true },
+	{ C_MOD_STATS,        &stats_load,        &stats_unload,        MOD_SCOPE_ANY, true },
 #ifdef HAVE_ROSEDB
-        { C_MOD_ROSEDB,       &rosedb_load,       &rosedb_unload,       MOD_SCOPE_ANY },
+	{ C_MOD_ROSEDB,       &rosedb_load,       &rosedb_unload,       MOD_SCOPE_ANY },
 #endif
 #if USE_DNSTAP
-        { C_MOD_DNSTAP,       &dnstap_load,       &dnstap_unload,       MOD_SCOPE_ANY },
+	{ C_MOD_DNSTAP,       &dnstap_load,       &dnstap_unload,       MOD_SCOPE_ANY },
 #endif
-        { C_MOD_WHOAMI,       &whoami_load,       &whoami_unload,       MOD_SCOPE_ANY },
-	{ C_MOD_NOUDP,        &noudp_load,        &noudp_unload,        MOD_SCOPE_ANY },
-        { NULL }
+	{ C_MOD_WHOAMI,       &whoami_load,       &whoami_unload,       MOD_SCOPE_ANY, true },
+	{ C_MOD_NOUDP,        &noudp_load,        &noudp_unload,        MOD_SCOPE_ANY, true },
+	{ NULL }
 };
 
 struct query_plan *query_plan_create(knot_mm_t *mm)
@@ -114,7 +110,73 @@ int query_plan_step(struct query_plan *plan, int stage, qmodule_process_t proces
 	return KNOT_EOK;
 }
 
-static static_module_t *find_module(const yp_name_t *name)
+int query_module_step(struct query_module *module, int stage, qmodule_process_t process)
+{
+	return query_plan_step(module->plan, stage, process, module->ctx);
+}
+
+int mod_stats_add(struct query_module *module, const char *name, uint32_t count,
+                  mod_idx_to_str_f idx)
+{
+	if (module == NULL || count < 1) {
+		return KNOT_EINVAL;
+	}
+
+	mod_ctr_t *stats = NULL;
+	if (module->stats == NULL) {
+		assert(module->stats_count == 0);
+		stats = mm_alloc(module->mm, sizeof(*stats));
+		if (stats == NULL) {
+			return KNOT_ENOMEM;
+		}
+		module->stats = stats;
+	} else {
+		assert(module->stats_count > 0);
+		size_t old_size = module->stats_count * sizeof(*stats);
+		size_t new_size = old_size + sizeof(*stats);
+		stats = mm_realloc(module->mm, module->stats, new_size, old_size);
+		if (stats == NULL) {
+			mod_stats_free(module);
+			return KNOT_ENOMEM;
+		}
+		module->stats = stats;
+		stats += module->stats_count;
+	}
+
+	module->stats_count++;
+
+	if (count > 1) {
+		size_t size = count * sizeof(((mod_ctr_t *)0)->counter);
+		stats->counters = mm_alloc(module->mm, size);
+		if (stats->counters == NULL) {
+			mod_stats_free(module);
+			return KNOT_ENOMEM;
+		}
+		memset(stats->counters, 0, size);
+		stats->idx_to_str = idx;
+	}
+	stats->name = name;
+	stats->count = count;
+
+	return KNOT_EOK;
+}
+
+void mod_stats_free(struct query_module *module)
+{
+	if (module == NULL || module->stats == NULL) {
+		return;
+	}
+
+	for (int i = 0; i < module->stats_count; i++) {
+		if (module->stats[i].count > 1) {
+			mm_free(module->mm, module->stats[i].counters);
+		}
+	}
+
+	mm_free(module->mm, module->stats);
+}
+
+static_module_t *find_module(const yp_name_t *name)
 {
 	/* Search for the module by name. */
 	static_module_t *module = NULL;
@@ -130,9 +192,10 @@ static static_module_t *find_module(const yp_name_t *name)
 }
 
 struct query_module *query_module_open(conf_t *config, conf_mod_id_t *mod_id,
+                                       struct query_plan *plan, const knot_dname_t *zone,
                                        knot_mm_t *mm)
 {
-	if (config == NULL || mod_id == NULL) {
+	if (config == NULL || mod_id == NULL || plan == NULL) {
 		return NULL;
 	}
 
@@ -149,8 +212,10 @@ struct query_module *query_module_open(conf_t *config, conf_mod_id_t *mod_id,
 	}
 	memset(module, 0, sizeof(struct query_module));
 
+	module->plan = plan;
 	module->mm = mm;
 	module->config = config;
+	module->zone = zone;
 	module->id = mod_id;
 	module->load = found->load;
 	module->unload = found->unload;
@@ -165,6 +230,7 @@ void query_module_close(struct query_module *module)
 		return;
 	}
 
+	mod_stats_free(module);
 	conf_free_mod_id(module->id);
 	mm_free(module->mm, module);
 }
diff --git a/src/knot/nameserver/query_module.h b/src/knot/nameserver/query_module.h
index 599afb73b20f2eecf3069f07563336a913ed9e83..a8e8c41292d35d8b020ea33755fbbc078f95b186 100644
--- a/src/knot/nameserver/query_module.h
+++ b/src/knot/nameserver/query_module.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -39,8 +39,11 @@
 #pragma once
 
 #include "libknot/libknot.h"
+#include "knot/common/log.h"
 #include "knot/conf/conf.h"
 #include "knot/conf/tools.h"
+#include "knot/nameserver/process_query.h"
+#include "knot/nameserver/internet.h"
 #include "contrib/ucw/lists.h"
 
 #define MODULE_ERR(mod, msg, ...) \
@@ -74,10 +77,32 @@ struct query_module;
 struct query_plan;
 
 /* Module callback required API. */
-typedef int (*qmodule_load_t)(struct query_plan *plan, struct query_module *self, const knot_dname_t *zone);
-typedef int (*qmodule_unload_t)(struct query_module *self);
+typedef int (*qmodule_load_t)(struct query_module *self);
+typedef void (*qmodule_unload_t)(struct query_module *self);
 typedef int (*qmodule_process_t)(int state, knot_pkt_t *pkt, struct query_data *qdata, void *ctx);
 
+typedef struct static_module {
+	const yp_name_t *name;
+	qmodule_load_t load;
+	qmodule_unload_t unload;
+	unsigned scope;
+	bool opt_conf;
+} static_module_t;
+
+typedef char* (*mod_idx_to_str_f)(uint32_t idx, uint32_t count);
+
+typedef struct {
+	const char *name;
+	union {
+		uint64_t counter;
+		struct {
+			uint64_t *counters;
+			mod_idx_to_str_f idx_to_str;
+		};
+	};
+	uint32_t count;
+} mod_ctr_t;
+
 /*!
  * Query module is a dynamically loadable unit that can alter query processing plan.
  * Module requires load and unload callback handlers and is provided with a context
@@ -85,15 +110,66 @@ typedef int (*qmodule_process_t)(int state, knot_pkt_t *pkt, struct query_data *
  */
 struct query_module {
 	node_t node;
+	struct query_plan *plan;
 	knot_mm_t *mm;
 	void *ctx;
 	conf_t *config;
+	const knot_dname_t *zone;
 	conf_mod_id_t *id;
 	qmodule_load_t load;
 	qmodule_unload_t unload;
+	mod_ctr_t *stats;
+	uint32_t stats_count;
 	unsigned scope;
 };
 
+int mod_stats_add(struct query_module *module, const char *name, uint32_t count,
+                  mod_idx_to_str_f idx);
+
+void mod_stats_free(struct query_module *module);
+
+inline static void mod_ctr_incr(mod_ctr_t *stats, uint32_t idx, uint64_t val)
+{
+	mod_ctr_t *ctr = stats + idx;
+	assert(ctr->count == 1);
+
+	__atomic_add_fetch(&ctr->counter, val, __ATOMIC_RELAXED);
+}
+
+inline static void mod_ctr_decr(mod_ctr_t *stats, uint32_t idx, uint64_t val)
+{
+	mod_ctr_t *ctr = stats + idx;
+	assert(ctr->count == 1);
+
+	__atomic_sub_fetch(&ctr->counter, val, __ATOMIC_RELAXED);
+}
+
+inline static void mod_ctrs_incr(mod_ctr_t *stats, uint32_t idx, uint32_t offset, uint64_t val)
+{
+	mod_ctr_t *ctr = stats + idx;
+	assert(ctr->count > 1);
+
+	// Increment the last counter if offset overflows.
+	if (offset < ctr->count) {
+		__atomic_add_fetch(&ctr->counters[offset], val, __ATOMIC_RELAXED);
+	} else {
+		__atomic_add_fetch(&ctr->counters[ctr->count - 1], val, __ATOMIC_RELAXED);
+	}
+}
+
+inline static void mod_ctrs_decr(mod_ctr_t *stats, uint32_t idx, uint32_t offset, uint64_t val)
+{
+	mod_ctr_t *ctr = stats + idx;
+	assert(ctr->count > 1);
+
+	// Increment the last counter if offset overflows.
+	if (offset < ctr->count) {
+		__atomic_sub_fetch(&ctr->counters[offset], val, __ATOMIC_RELAXED);
+	} else {
+		__atomic_sub_fetch(&ctr->counters[ctr->count - 1], val, __ATOMIC_RELAXED);
+	}
+}
+
 /*! \brief Single processing step in query processing. */
 struct query_step {
 	node_t node;
@@ -110,6 +186,8 @@ struct query_plan {
 	list_t stage[QUERY_PLAN_STAGES];
 };
 
+static_module_t *find_module(const yp_name_t *name);
+
 /*! \brief Create an empty query plan. */
 struct query_plan *query_plan_create(knot_mm_t *mm);
 
@@ -120,8 +198,11 @@ void query_plan_free(struct query_plan *plan);
 int query_plan_step(struct query_plan *plan, int stage, qmodule_process_t process,
                     void *ctx);
 
+int query_module_step(struct query_module *module, int stage, qmodule_process_t process);
+
 /*! \brief Open query module identified by name. */
 struct query_module *query_module_open(conf_t *config, conf_mod_id_t *mod_id,
+                                       struct query_plan *plan, const knot_dname_t *zone,
                                        knot_mm_t *mm);
 
 /*! \brief Close query module. */
diff --git a/src/knot/nameserver/update.c b/src/knot/nameserver/update.c
index 2cffec82418fd6cdc546cd0d49cfd49a058f95a7..d878c1a17f2cfe953bc875295c16845be5264a06 100644
--- a/src/knot/nameserver/update.c
+++ b/src/knot/nameserver/update.c
@@ -124,7 +124,7 @@ static int process_bulk(zone_t *zone, list_t *requests, zone_update_t *up)
 			return ret;
 		}
 
-		process_query_qname_case_restore(&qdata, req->query);
+		process_query_qname_case_restore(req->query, &qdata);
 	}
 
 	return KNOT_EOK;
@@ -418,7 +418,7 @@ int update_process_query(knot_pkt_t *pkt, struct query_data *qdata)
 	NS_NEED_ZONE_CONTENTS(qdata, KNOT_RCODE_SERVFAIL);
 
 	/* Restore original QNAME for DDNS ACL checks. */
-	process_query_qname_case_restore(qdata, qdata->query);
+	process_query_qname_case_restore(qdata->query, qdata);
 	/* Store update into DDNS queue. */
 	int ret = zone_update_enqueue(zone, qdata->query, qdata->param);
 	if (ret != KNOT_EOK) {
diff --git a/src/knot/server/journal.c b/src/knot/server/journal.c
deleted file mode 100644
index 00d27cc0a63ed42c2ffb2c704ac230869c665329..0000000000000000000000000000000000000000
--- a/src/knot/server/journal.c
+++ /dev/null
@@ -1,1042 +0,0 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
-
-    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
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <assert.h>
-
-#include "knot/common/log.h"
-#include "knot/server/journal.h"
-#include "knot/server/serialization.h"
-#include "knot/zone/zone.h"
-#include "libknot/libknot.h"
-#include "libknot/rrtype/soa.h"
-
-/*! \brief Infinite file size limit. */
-#define FSLIMIT_INF (~((size_t)0))
-
-/*! \brief Next node. */
-#define jnode_next(j, i) (((i) + 1) % (j)->max_nodes)
-
-/*! \brief Previous node. */
-#define jnode_prev(j, i) (((i) == 0) ? (j)->max_nodes - 1 : (i) - 1)
-
-/*! \bref Starting node data position. */
-#define jnode_base_pos(max_nodes) (JOURNAL_HSIZE + (max_nodes + 1) * sizeof(journal_node_t))
-
-static const uint32_t CRC_PLACEHOLDER = 0;
-
-static inline int sfread(void *dst, size_t len, int fd)
-{
-	return read(fd, dst, len) == len;
-}
-
-static inline int sfwrite(const void *src, size_t len, int fd)
-{
-	return write(fd, src, len) == len;
-}
-
-/*! \brief Equality compare function. */
-static inline int journal_cmp_eq(uint64_t k1, uint64_t k2)
-{
-	if (k1 > k2) return 1;
-	if (k1 < k2) return -1;
-	return 0;
-}
-
-/*! \brief Return 'serial_from' part of the key. */
-static inline uint32_t journal_key_from(uint64_t k)
-{
-	/*      64    32       0
-	 * key = [TO   |   FROM]
-	 * Need: Least significant 32 bits.
-	 */
-	return (uint32_t)(k & ((uint64_t)0x00000000ffffffff));
-}
-
-/*----------------------------------------------------------------------------*/
-
-/*! \brief Compare function to match entries with starting serial. */
-static inline int journal_key_from_cmp(uint64_t k, uint64_t from)
-{
-	/*      64    32       0
-	 * key = [TO   |   FROM]
-	 * Need: Least significant 32 bits.
-	 */
-	return ((uint64_t)journal_key_from(k)) - from;
-}
-
-/*! \brief Make key for journal from serials. */
-static inline uint64_t ixfrdb_key_make(uint32_t from, uint32_t to)
-{
-	/*      64    32       0
-	 * key = [TO   |   FROM]
-	 */
-	return (((uint64_t)to) << ((uint64_t)32)) | ((uint64_t)from);
-}
-
-/*! \brief Create new journal. */
-static int journal_create_file(const char *fn, uint16_t max_nodes)
-{
-	if (fn == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* File lock. */
-	struct flock fl = { .l_type = F_WRLCK, .l_whence = SEEK_SET,
-	                    .l_start = 0, .l_len = 0, .l_pid = getpid() };
-
-	/* Create journal file. */
-	int fd = open(fn, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP);
-	if (fd < 0) {
-		return knot_map_errno();
-	}
-
-	/* Lock. */
-	if (fcntl(fd, F_SETLKW, &fl) == -1) {
-		close(fd);
-		remove(fn);
-		return KNOT_ERROR;
-	}
-
-	/* Create journal header. */
-	const char magic[MAGIC_LENGTH] = JOURNAL_MAGIC;
-	if (!sfwrite(magic, MAGIC_LENGTH, fd)) {
-		close(fd);
-		remove(fn);
-		return KNOT_ERROR;
-	}
-
-	if (!sfwrite(&CRC_PLACEHOLDER, sizeof(CRC_PLACEHOLDER), fd)) {
-		close(fd);
-		remove(fn);
-		return KNOT_ERROR;
-	}
-	if (!sfwrite(&max_nodes, sizeof(uint16_t), fd)) {
-		close(fd);
-		remove(fn);
-		return KNOT_ERROR;
-	}
-
-	/* Create node queue head + tail.
-	 * qhead points to least recent node
-	 * qtail points to next free node
-	 * qhead == qtail means empty queue
-	 */
-	uint16_t zval = 0;
-	if (!sfwrite(&zval, sizeof(uint16_t), fd)) {
-		close(fd);
-		remove(fn);
-		return KNOT_ERROR;
-	}
-
-	if (!sfwrite(&zval, sizeof(uint16_t), fd)) {
-		close(fd);
-		remove(fn);
-		return KNOT_ERROR;
-	}
-
-	/* Create free segment descriptor. */
-	journal_node_t jn;
-	memset(&jn, 0, sizeof(journal_node_t));
-	jn.id = 0;
-	jn.flags = JOURNAL_VALID;
-	jn.pos = jnode_base_pos(max_nodes);
-	jn.len = 0;
-	if (!sfwrite(&jn, sizeof(journal_node_t), fd)) {
-		close(fd);
-		remove(fn);
-		return KNOT_ERROR;
-	}
-
-	/* Create nodes. */
-	memset(&jn, 0, sizeof(journal_node_t));
-	for(uint16_t i = 0; i < max_nodes; ++i) {
-		if (!sfwrite(&jn, sizeof(journal_node_t), fd)) {
-			close(fd);
-			(void)remove(fn);
-			return KNOT_ERROR;
-		}
-	}
-
-	/* Unlock and close. */
-	close(fd);
-
-	/* Journal file created. */
-	return KNOT_EOK;
-}
-
-/*! \brief Open journal file for r/w (returns error if not exists). */
-static int journal_open_file(journal_t *j)
-{
-	assert(j != NULL);
-
-	int ret = KNOT_EOK;
-	j->fd = open(j->path, O_RDWR);
-	if (j->fd < 0) {
-		if (errno != ENOENT) {
-			return knot_map_errno();
-		}
-
-		/* Create new journal file and open if not exists. */
-		ret = journal_create_file(j->path, JOURNAL_NCOUNT);
-		if(ret == KNOT_EOK) {
-			return journal_open_file(j);
-		}
-		return ret;
-	}
-
-	/* File lock. */
-	struct flock lock = { .l_type = F_WRLCK, .l_whence = SEEK_SET,
-	                      .l_start  = 0, .l_len = 0, .l_pid = 0 };
-	/* Attempt to lock. */
-	ret = fcntl(j->fd, F_SETLKW, &lock);
-	if (ret < 0) {
-		return knot_map_errno();
-	}
-
-	/* Read magic bytes. */
-	const char magic_req[MAGIC_LENGTH] = JOURNAL_MAGIC;
-	char magic[MAGIC_LENGTH];
-	if (!sfread(magic, MAGIC_LENGTH, j->fd)) {
-		goto open_file_error;
-	}
-	if (memcmp(magic, magic_req, MAGIC_LENGTH) != 0) {
-		log_warning("journal '%s', version too old, purging", j->path);
-		close(j->fd);
-		j->fd = -1;
-		ret = journal_create_file(j->path, JOURNAL_NCOUNT);
-		if(ret == KNOT_EOK) {
-			return journal_open_file(j);
-		}
-		return ret;
-	}
-
-	/* Skip CRC */
-	if (lseek(j->fd, MAGIC_LENGTH + sizeof(CRC_PLACEHOLDER), SEEK_SET) < 0) {
-		goto open_file_error;
-	}
-
-	/* Get journal file size. */
-	struct stat st;
-	if (fstat(j->fd, &st) < 0) {
-		goto open_file_error;
-	}
-
-	/* Set file size. */
-	j->fsize = st.st_size;
-
-	/* Read maximum number of entries. */
-	if (!sfread(&j->max_nodes, sizeof(uint16_t), j->fd)) {
-		goto open_file_error;
-	}
-
-	/* Check max_nodes, but this is riddiculous. */
-	if (j->max_nodes == 0) {
-		goto open_file_error;
-	}
-
-	/* Check minimum fsize limit. */
-	size_t fslimit_min = jnode_base_pos(j->max_nodes) + 1024; /* At least 1K block */
-	if (j->fslimit < fslimit_min) {
-		log_error("journal '%s', filesize limit smaller than '%zu'", j->path, fslimit_min);
-		goto open_file_error;
-	}
-
-	/* Allocate nodes. */
-	const size_t node_len = sizeof(journal_node_t);
-	j->nodes = malloc(j->max_nodes * node_len);
-	if (j->nodes == NULL) {
-		goto open_file_error;
-	} else {
-		memset(j->nodes, 0, j->max_nodes * node_len);
-	}
-
-	/* Load node queue state. */
-	j->qhead = j->qtail = 0;
-	if (!sfread(&j->qhead, sizeof(uint16_t), j->fd)) {
-		goto open_file_error;
-	}
-
-	/* Load queue tail. */
-	if (!sfread(&j->qtail, sizeof(uint16_t), j->fd)) {
-		goto open_file_error;
-	}
-
-	/* Check head + tail */
-	if (j->qtail >= j->max_nodes || j->qhead >= j->max_nodes) {
-		goto open_file_error;
-	}
-
-	/* Load empty segment descriptor. */
-	if (!sfread(&j->free, node_len, j->fd)) {
-		goto open_file_error;
-	}
-
-	/* Read journal descriptors table. */
-	if (!sfread(j->nodes, j->max_nodes * node_len, j->fd)) {
-		goto open_file_error;
-	}
-
-	/* Save file lock and return. */
-	return KNOT_EOK;
-
-	/* Unlock and close file and return error. */
-open_file_error:
-	free(j->nodes);
-	j->nodes = NULL;
-	close(j->fd);
-	j->fd = -1;
-	return KNOT_ERROR;
-}
-
-/*! \brief Close journal file. */
-static int journal_close_file(journal_t *journal)
-{
-	/* Check journal. */
-	if (journal == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* Close file. */
-	if (journal->fd > 0) {
-		close(journal->fd);
-		journal->fd = -1;
-	}
-
-	/* Free nodes. */
-	free(journal->nodes);
-	journal->nodes = NULL;
-
-	return KNOT_EOK;
-}
-
-/*!  \brief Sync node state to permanent storage. */
-static int journal_update(journal_t *journal, journal_node_t *n)
-{
-	if (journal == NULL || n == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* Calculate node offset. */
-	const size_t node_len = sizeof(journal_node_t);
-	size_t i = n - journal->nodes;
-	assert(i < journal->max_nodes);
-
-	/* Calculate node position in permanent storage. */
-	long jn_fpos = JOURNAL_HSIZE + (i + 1) * node_len;
-
-	/* Write back. */
-	int seek_ret = lseek(journal->fd, jn_fpos, SEEK_SET);
-	if (seek_ret < 0 || !sfwrite(n, node_len, journal->fd)) {
-		return KNOT_ERROR;
-	}
-
-	return KNOT_EOK;
-}
-
-int journal_write_in(journal_t *j, journal_node_t **rn, uint64_t id, size_t len)
-{
-	const size_t node_len = sizeof(journal_node_t);
-	*rn = NULL;
-
-	/* Count rewinds. */
-	bool already_rewound = false;
-
-	/* Evict occupied nodes if necessary. */
-	while (j->free.len < len || jnode_next(j, j->qtail) == j->qhead) {
-
-		/* Increase free segment if on the end of file. */
-		bool is_empty = (j->qtail == j->qhead);
-		journal_node_t *head = j->nodes + j->qhead;
-		journal_node_t *last = j->nodes + jnode_prev(j, j->qtail);
-		if (is_empty || (head->pos <= last->pos && j->free.pos > last->pos)) {
-
-			/* Grow journal file until the size limit. */
-			if(j->free.pos + len < j->fslimit  && jnode_next(j, j->qtail) != j->qhead) {
-				size_t diff = len - j->free.len;
-				j->fsize += diff; /* Appending increases file size. */
-				j->free.len += diff;
-				continue;
-
-			} else if (!already_rewound) {
-				/*  Rewind if resize is needed, but the limit is reached. */
-				j->free.pos = jnode_base_pos(j->max_nodes);
-				j->free.len = 0;
-				if (!is_empty) {
-					j->free.len = head->pos - j->free.pos;
-				}
-				already_rewound = true;
-			} else {
-				/* Already rewound, but couldn't collect enough free space. */
-				return KNOT_ESPACE;
-			}
-
-			/* Continue until enough free space is collected. */
-			continue;
-		}
-
-		/* Check if it has been synced to disk. */
-		if ((head->flags & JOURNAL_DIRTY) && (head->flags & JOURNAL_VALID)) {
-			return KNOT_EBUSY;
-		}
-
-		/* Write back evicted node. */
-		head->flags = JOURNAL_FREE;
-		int seek_ret = lseek(j->fd, JOURNAL_HSIZE + (j->qhead + 1) * node_len, SEEK_SET);
-		if (seek_ret < 0 || !sfwrite(head, node_len, j->fd)) {
-			return KNOT_ERROR;
-		}
-
-		/* Write back query state. */
-		j->qhead = (j->qhead + 1) % j->max_nodes;
-		uint16_t qstate[2] = {j->qhead, j->qtail};
-		seek_ret = lseek(j->fd, JOURNAL_HSIZE - 2 * sizeof(uint16_t), SEEK_SET);
-		if (seek_ret < 0 || !sfwrite(qstate, 2 * sizeof(uint16_t), j->fd)) {
-			return KNOT_ERROR;
-		}
-
-		/* Increase free segment. */
-		j->free.len += head->len;
-	}
-
-	/* Invalidate tail node and write back. */
-	journal_node_t *n = j->nodes + j->qtail;
-	n->id = id;
-	n->pos = j->free.pos;
-	n->len = len;
-	n->flags = JOURNAL_FREE;
-	journal_update(j, n);
-	*rn = n;
-	return KNOT_EOK;
-}
-
-int journal_write_out(journal_t *journal, journal_node_t *n)
-{
-	/* Mark node as valid and write back. */
-	uint16_t jnext = (journal->qtail + 1) % journal->max_nodes;
-	size_t size = n->len;
-	const size_t node_len = sizeof(journal_node_t);
-	n->flags = JOURNAL_VALID | journal->bflags;
-	journal_update(journal, n);
-
-	/* Mark used space. */
-	journal->free.pos += size;
-	journal->free.len -= size;
-
-	/* Write back free segment state. */
-	int seek_ret = lseek(journal->fd, JOURNAL_HSIZE, SEEK_SET);
-	if (seek_ret < 0 || !sfwrite(&journal->free, node_len, journal->fd)) {
-		/* Node is marked valid and failed to shrink free space,
-		 * node will be overwritten on the next write. Return error.
-		 */
-		return KNOT_ERROR;
-	}
-
-	/* Node write successful. */
-	journal->qtail = jnext;
-
-	/* Write back queue state, not essential as it may be recovered.
-	 * qhead - lowest valid node identifier (least recent)
-	 * qtail - highest valid node identifier (most recently used)
-	 */
-	uint16_t qstate[2] = {journal->qhead, journal->qtail};
-	seek_ret = lseek(journal->fd, JOURNAL_HSIZE - 2 * sizeof(uint16_t), SEEK_SET);
-	if (seek_ret < 0 || !sfwrite(qstate, 2 * sizeof(uint16_t), journal->fd)) {
-		return KNOT_ERROR;
-	}
-
-	return KNOT_EOK;
-}
-
-int journal_open(journal_t **journal, const char *path, size_t fslimit)
-{
-	if (journal == NULL || path == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	journal_t *j = malloc(sizeof(*j));
-	if (j == NULL) {
-		return KNOT_ENOMEM;
-	}
-
-	memset(j, 0, sizeof(*j));
-	j->bflags = JOURNAL_DIRTY;
-	j->fd = -1;
-
-	/* Set file size. */
-	if (fslimit == 0) {
-		j->fslimit = FSLIMIT_INF;
-	} else {
-		j->fslimit = fslimit;
-	}
-
-	/* Copy path. */
-	j->path = strdup(path);
-	if (j->path == NULL) {
-		free(j);
-		return KNOT_ENOMEM;
-	}
-
-	/* Open journal file. */
-	int ret = journal_open_file(j);
-	if (ret != KNOT_EOK) {
-		journal_close(j);
-		return ret;
-	}
-
-	*journal = j;
-
-	return KNOT_EOK;
-}
-
-/*!
- * \brief Entry identifier compare function.
- *
- * \retval -n if k1 < k2
- * \retval +n if k1 > k2
- * \retval  0 if k1 == k2
- */
-typedef int (*journal_cmp_t)(uint64_t k1, uint64_t k2);
-
-static int journal_fetch(journal_t *journal, uint64_t id,
-		  journal_cmp_t cf, journal_node_t** dst)
-{
-	if (journal == NULL || dst == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/*! \todo Organize journal descriptors in btree? */
-	size_t i = jnode_prev(journal, journal->qtail);
-	size_t endp = jnode_prev(journal, journal->qhead);
-	for(; i != endp; i = jnode_prev(journal, i)) {
-		journal_node_t *n = journal->nodes + i;
-
-		/* Skip invalid nodes. */
-		if (!(n->flags & JOURNAL_VALID)) {
-			continue;
-		}
-
-		if (cf(n->id, id) == 0) {
-			*dst = journal->nodes + i;
-			return KNOT_EOK;
-		}
-	}
-
-	return KNOT_ENOENT;
-}
-
-static int journal_read_node(journal_t *journal, journal_node_t *n, char *dst)
-{
-	/* Check valid flag. */
-	if (!(n->flags & JOURNAL_VALID)) {
-		return KNOT_EINVAL;
-	}
-
-	/* Seek journal node. */
-	int seek_ret = lseek(journal->fd, n->pos, SEEK_SET);
-
-	/* Read journal node content. */
-	if (seek_ret < 0 || !sfread(dst, n->len, journal->fd)) {
-		return KNOT_ERROR;
-	}
-
-	return KNOT_EOK;
-}
-
-int journal_map(journal_t *journal, uint64_t id, char **dst, size_t size, bool rdonly)
-{
-	if (journal == NULL || dst == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* Check if entry exists. */
-	journal_node_t *n = NULL;
-	int ret = journal_fetch(journal, id, journal_cmp_eq, &n);
-
-	/* Return if read-only, invalidate if rewritten to avoid duplicates. */
-	if (rdonly) {
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
-	} else {
-		/* Prepare journal write. */
-		ret = journal_write_in(journal, &n, id, size);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
-
-		/* Reserve data in permanent storage. */
-		/*! \todo This is only needed when inflating journal file. */
-		if (lseek(journal->fd, n->pos, SEEK_SET) < 0) {
-			return KNOT_ERROR;
-		}
-		char nbuf[4096] = {0};
-		size_t wb = sizeof(nbuf);
-		while (size > 0) {
-			if (size < sizeof(nbuf)) {
-				wb = size;
-			}
-			if (!sfwrite(nbuf, wb, journal->fd)) {
-				return KNOT_ERROR;
-			}
-			size -= wb;
-		}
-	}
-
-	/* Align offset to page size (required). */
-	const size_t ps = sysconf(_SC_PAGESIZE);
-	off_t ps_delta = (n->pos % ps);
-	off_t off = n->pos - ps_delta;
-
-	/* Map file region. */
-	*dst = mmap(NULL, n->len + ps_delta, PROT_READ | PROT_WRITE, MAP_SHARED,
-	            journal->fd, off);
-	if (*dst == ((void*)-1)) {
-		return KNOT_ERROR;
-	}
-
-	/* Advise usage of memory. */
-#ifdef HAVE_MADVISE
-	madvise(*dst, n->len + ps_delta, MADV_SEQUENTIAL);
-#endif
-	/* Correct dst pointer to alignment. */
-	*dst += ps_delta;
-
-	return KNOT_EOK;
-}
-
-int journal_unmap(journal_t *journal, uint64_t id, void *ptr, int finalize)
-{
-	if (journal == NULL || ptr == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* Mapped node is on tail. */
-	/* @todo: This is hack to allow read-only correct unmap. */
-	int ret = KNOT_EOK;
-	journal_node_t *n = journal->nodes + journal->qtail;
-	if (!finalize) {
-		ret = journal_fetch(journal, id, journal_cmp_eq, &n);
-		if (ret != KNOT_EOK) {
-			return KNOT_ENOENT;
-		}
-	}
-	if(n->id != id) {
-		return KNOT_ENOENT;
-	}
-
-	/* Realign memory. */
-	const size_t ps = sysconf(_SC_PAGESIZE);
-	off_t ps_delta = (n->pos % ps);
-	ptr = ((char*)ptr - ps_delta);
-
-	/* Unmap memory. */
-	if (munmap(ptr, n->len + ps_delta) != 0) {
-		return KNOT_ERROR;
-	}
-
-	/* Finalize. */
-	if (finalize) {
-		ret = journal_write_out(journal, n);
-	}
-	return ret;
-}
-
-int journal_close(journal_t *journal)
-{
-	/* Check journal. */
-	if (journal == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* Close file. */
-	journal_close_file(journal);
-
-	/* Free allocated resources. */
-	free(journal->path);
-	free(journal);
-
-	return KNOT_EOK;
-}
-
-bool journal_exists(const char *path)
-{
-	if (path == NULL) {
-		return false;
-	}
-
-	/* Check journal file existence. */
-	struct stat st;
-	return stat(path, &st) == 0;
-}
-
-/*! \brief No doc here. Moved from zones.h (@mvavrusa) */
-static int changesets_unpack(changeset_t *chs)
-{
-
-	/* Read changeset flags. */
-	if (chs->data == NULL) {
-		return KNOT_EMALF;
-	}
-	size_t remaining = chs->size;
-
-	/* Read initial changeset RRSet - SOA. */
-	uint8_t *stream = chs->data + (chs->size - remaining);
-	knot_rrset_t rrset;
-	int ret = rrset_deserialize(stream, &remaining, &rrset);
-	if (ret != KNOT_EOK) {
-		return KNOT_EMALF;
-	}
-
-	assert(rrset.type == KNOT_RRTYPE_SOA);
-	chs->soa_from = knot_rrset_copy(&rrset, NULL);
-	knot_rrset_clear(&rrset, NULL);
-	if (chs->soa_from == NULL) {
-		return KNOT_ENOMEM;
-	}
-
-	/* Read remaining RRSets */
-	bool in_remove_section = true;
-	while (remaining > 0) {
-
-		/* Parse next RRSet. */
-		stream = chs->data + (chs->size - remaining);
-		knot_rrset_init_empty(&rrset);
-		ret = rrset_deserialize(stream, &remaining, &rrset);
-		if (ret != KNOT_EOK) {
-			return KNOT_EMALF;
-		}
-
-		/* Check for next SOA. */
-		if (rrset.type == KNOT_RRTYPE_SOA) {
-			/* Move to ADD section if in REMOVE. */
-			if (in_remove_section) {
-				chs->soa_to = knot_rrset_copy(&rrset, NULL);
-				if (chs->soa_to == NULL) {
-					ret = KNOT_ENOMEM;
-					break;
-				}
-				in_remove_section = false;
-			} else {
-				/* Final SOA, no-op. */
-				;
-			}
-		} else {
-			/* Remove RRSets. */
-			if (in_remove_section) {
-				ret = changeset_add_removal(chs, &rrset, 0);
-			} else {
-				/* Add RRSets. */
-				ret = changeset_add_addition(chs, &rrset, 0);
-			}
-		}
-		knot_rrset_clear(&rrset, NULL);
-		if (ret != KNOT_EOK) {
-			break;
-		}
-	}
-
-	return ret;
-}
-
-static int rrset_write_to_mem(const knot_rrset_t *rr, char **entry,
-                              size_t *remaining) {
-	size_t written = 0;
-	int ret = rrset_serialize(rr, *((uint8_t **)entry),
-	                          &written);
-	if (ret == KNOT_EOK) {
-		assert(written <= *remaining);
-		*remaining -= written;
-		*entry += written;
-	}
-
-	return ret;
-}
-
-static int serialize_and_store_chgset(const changeset_t *chs,
-                                      char *entry, size_t max_size)
-{
-	/* Serialize SOA 'from'. */
-	int ret = rrset_write_to_mem(chs->soa_from, &entry, &max_size);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	changeset_iter_t itt;
-	ret = changeset_iter_rem(&itt, chs, false);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	knot_rrset_t rrset = changeset_iter_next(&itt);
-	while (!knot_rrset_empty(&rrset)) {
-		ret = rrset_write_to_mem(&rrset, &entry, &max_size);
-		if (ret != KNOT_EOK) {
-			changeset_iter_clear(&itt);
-			return ret;
-		}
-		rrset = changeset_iter_next(&itt);
-	}
-	changeset_iter_clear(&itt);
-
-	/* Serialize SOA 'to'. */
-	ret = rrset_write_to_mem(chs->soa_to, &entry, &max_size);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	/* Serialize RRSets from the 'add' section. */
-	ret = changeset_iter_add(&itt, chs, false);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	rrset = changeset_iter_next(&itt);
-	while (!knot_rrset_empty(&rrset)) {
-		ret = rrset_write_to_mem(&rrset, &entry, &max_size);
-		if (ret != KNOT_EOK) {
-			changeset_iter_clear(&itt);
-			return ret;
-		}
-		rrset = changeset_iter_next(&itt);
-	}
-	changeset_iter_clear(&itt);
-
-	return KNOT_EOK;
-}
-
-static int changeset_pack(const changeset_t *chs, journal_t *j)
-{
-	assert(chs != NULL);
-	assert(j != NULL);
-
-	uint64_t k = ixfrdb_key_make(knot_soa_serial(&chs->soa_from->rrs),
-	                             knot_soa_serial(&chs->soa_to->rrs));
-
-	/* Count the size of the entire changeset in serialized form. */
-	size_t entry_size = 0;
-
-	int ret = changeset_binary_size(chs, &entry_size);
-	assert(ret == KNOT_EOK);
-
-	/* Reserve space for the journal entry. */
-	char *journal_entry = NULL;
-	ret = journal_map(j, k, &journal_entry, entry_size, false);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	assert(journal_entry != NULL);
-
-	/* Serialize changeset, saving it bit by bit. */
-	ret = serialize_and_store_chgset(chs, journal_entry, entry_size);
-	/* Unmap the journal entry.
-	 * If successfully written changeset to journal, validate the entry. */
-	int unmap_ret = journal_unmap(j, k, journal_entry, ret == KNOT_EOK);
-	if (ret == KNOT_EOK && unmap_ret != KNOT_EOK) {
-		ret = unmap_ret; /* Propagate the result. */
-	}
-
-	return ret;
-}
-
-/*! \brief Helper for iterating journal (this is temporary until #80) */
-typedef int (*journal_apply_t)(journal_t *, journal_node_t *, const zone_t *, list_t *);
-static int journal_walk(const char *fn, uint32_t from, uint32_t to,
-                        journal_apply_t cb, const zone_t *zone, list_t *chgs)
-{
-	/* Open journal for reading. */
-	journal_t *journal = NULL;
-	int ret = journal_open(&journal, fn, FSLIMIT_INF);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-	/* Read entries from starting serial until finished. */
-	uint32_t found_to = from;
-	journal_node_t *n = 0;
-	ret = journal_fetch(journal, from, journal_key_from_cmp, &n);
-	if (ret != KNOT_EOK) {
-		goto finish;
-	}
-
-	size_t i = n - journal->nodes;
-	assert(i < journal->max_nodes);
-
-	for (; i != journal->qtail; i = jnode_next(journal, i)) {
-		journal_node_t *n = journal->nodes + i;
-
-		/* Skip invalid nodes. */
-		if (!(n->flags & JOURNAL_VALID)) {
-			continue;
-		}
-
-		/* Check for history end. */
-		if (to == found_to) {
-			break;
-		}
-
-		/* Callback. */
-		ret = cb(journal, n, zone, chgs);
-		if (ret != KNOT_EOK) {
-			break;
-		}
-	}
-
-finish:
-	/* Close journal. */
-	journal_close(journal);
-	return ret;
-}
-
-static int load_changeset(journal_t *journal, journal_node_t *n, const zone_t *zone, list_t *chgs)
-{
-	changeset_t *ch = changeset_new(zone->name);
-	if (ch == NULL) {
-		return KNOT_ENOMEM;
-	}
-
-	/* Initialize changeset. */
-	ch->data = malloc(n->len);
-	if (!ch->data) {
-		return KNOT_ENOMEM;
-	}
-
-	/* Read journal entry. */
-	int ret = journal_read_node(journal, n, (char*)ch->data);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	/* Update changeset binary size. */
-	ch->size = n->len;
-
-	/* Insert into changeset list. */
-	add_tail(chgs, &ch->n);
-
-	return KNOT_EOK;
-}
-
-int journal_load_changesets(const char *path, const zone_t *zone, list_t *dst,
-                            uint32_t from, uint32_t to)
-{
-	int ret = journal_walk(path, from, to, &load_changeset, zone, dst);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	/* Unpack binary data. */
-	assert(dst != NULL);
-	/*
-	 * Parses changesets from the binary format stored in chgsets->data
-	 * into the changeset_t structures.
-	 */
-	changeset_t* chs = NULL;
-	WALK_LIST(chs, *dst) {
-		ret = changesets_unpack(chs);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
-	}
-
-	/* Check for complete history. */
-	changeset_t *last = TAIL(*dst);
-	if (to != knot_soa_serial(&last->soa_to->rrs)) {
-		return KNOT_ERANGE;
-	}
-
-	return KNOT_EOK;
-}
-
-int journal_store_changesets(list_t *src, const char *path, size_t size_limit)
-{
-	if (src == NULL || path == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* Open journal for reading. */
-	journal_t *journal = NULL;
-	int ret = journal_open(&journal, path, size_limit);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-	/* Begin writing to journal. */
-	changeset_t *chs = NULL;
-	WALK_LIST(chs, *src) {
-		ret = changeset_pack(chs, journal);
-		if (ret != KNOT_EOK) {
-			break;
-		}
-	}
-
-	journal_close(journal);
-	return ret;
-}
-
-int journal_store_changeset(changeset_t *change, const char *path, size_t size_limit)
-{
-	if (change == NULL || path == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	/* Open journal for reading. */
-	journal_t *journal = NULL;
-	int ret = journal_open(&journal, path, size_limit);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-
-	ret = changeset_pack(change, journal);
-
-	journal_close(journal);
-	return ret;
-}
-
-static void mark_synced(journal_t *journal, journal_node_t *node)
-{
-	/* Check for dirty bit (not synced to permanent storage). */
-	if (node->flags & JOURNAL_DIRTY) {
-		/* Remove dirty bit. */
-		node->flags = node->flags & ~JOURNAL_DIRTY;
-		journal_update(journal, node);
-	}
-}
-
-int journal_mark_synced(const char *path)
-{
-	if (!journal_exists(path)) {
-		return KNOT_EOK;
-	}
-	journal_t *journal = NULL;
-	int ret = journal_open(&journal, path, FSLIMIT_INF);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-	size_t i = journal->qhead;
-	for(; i != journal->qtail; i = jnode_next(journal, i)) {
-		mark_synced(journal, journal->nodes + i);
-	}
-
-	journal_close(journal);
-
-	return KNOT_EOK;
-}
diff --git a/src/knot/server/journal.h b/src/knot/server/journal.h
deleted file mode 100644
index c930bf4152edf16aec56b43a9ad5c3c972ceec7c..0000000000000000000000000000000000000000
--- a/src/knot/server/journal.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
-
-    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
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-/*!
- * \file journal.h
- *
- * \author Marek Vavrusa <marek.vavrusa@nic.cz>
- *
- * \brief Journal for storing transactions on permanent storage.
- *
- * Journal stores entries on a permanent storage.
- * Each written entry is guaranteed to persist until
- * the maximum file size or node count is reached.
- * Entries are removed from the least recent.
- *
- * Journal file structure
- * <pre>
- *  uint16_t node_count
- *  uint16_t node_queue_head
- *  uint16_t node_queue_tail
- *  journal_entry_t free_segment
- *  node_count *journal_entry_t
- *  ...data...
- * </pre>
- * \addtogroup utils
- * @{
- */
-
-#pragma once
-
-#include <stdint.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <stdbool.h>
-#include "knot/updates/changesets.h"
-
-struct zone;
-
-/*!
- * \brief Journal entry flags.
- */
-typedef enum journal_flag_t {
-	JOURNAL_NULL  = 0 << 0, /*!< Invalid journal entry. */
-	JOURNAL_FREE  = 1 << 0, /*!< Free journal entry. */
-	JOURNAL_VALID = 1 << 1, /*!< Valid journal entry. */
-	JOURNAL_DIRTY = 1 << 2  /*!< Journal entry cannot be evicted. */
-} journal_flag_t;
-
-/*!
- * \brief Journal node structure.
- *
- * Each node represents journal entry and points
- * to position of the data in the permanent storage.
- */
-typedef struct journal_node
-{
-	uint64_t id;    /*!< Node ID. */
-	uint16_t flags; /*!< Node flags. */
-	uint16_t next;  /*!< UNUSED */
-	uint32_t pos;   /*!< Position in journal file. */
-	uint32_t len;   /*!< Entry data length. */
-} journal_node_t;
-
-/*!
- * \brief Journal structure.
- *
- * Journal organizes entries as nodes.
- * Nodes are stored in-memory for fast lookup and also
- * backed by a permanent storage.
- * Each journal has a fixed number of nodes.
- *
- */
-typedef struct journal
-{
-	int fd;
-	char *path;             /*!< Path to journal file. */
-	uint16_t tmark;         /*!< Transaction start mark. */
-	uint16_t max_nodes;     /*!< Number of nodes. */
-	uint16_t qhead;         /*!< Node queue head. */
-	uint16_t qtail;         /*!< Node queue tail. */
-	uint16_t bflags;        /*!< Initial flags for each written node. */
-	size_t fsize;           /*!< Journal file size. */
-	size_t fslimit;         /*!< File size limit. */
-	journal_node_t free;    /*!< Free segment. */
-	journal_node_t *nodes;  /*!< Array of nodes. */
-} journal_t;
-
-/*
- * Journal defaults and constants.
- */
-#define JOURNAL_NCOUNT 1024 /*!< Default node count. */
-#define JOURNAL_MAGIC {'k', 'n', 'o', 't', '1', '5', '2'}
-#define MAGIC_LENGTH 7
-/* HEADER = magic, crc, max_entries, qhead, qtail */
-#define JOURNAL_HSIZE (MAGIC_LENGTH + sizeof(uint32_t) + sizeof(uint16_t) * 3)
-
-/*!
- * \brief Open journal.
- *
- * \param journal Returned journal.
- * \param path Journal file name.
- * \param fslimit File size limit (0 for no limit).
- *
- * \retval new journal instance if successful.
- * \retval NULL on error.
- */
-int journal_open(journal_t **journal, const char *path, size_t fslimit);
-
-/*!
- * \brief Map journal entry for read/write.
- *
- * \warning New nodes shouldn't be created until the entry is unmapped.
- *
- * \param journal Associated journal.
- * \param id Entry identifier.
- * \param dst Will contain mapped memory.
- * \param rdonly If read only.
- *
- * \retval KNOT_EOK if successful.
- * \retval KNOT_ESPACE if entry too big.
- * \retval KNOT_ERROR on I/O error.
- */
-int journal_map(journal_t *journal, uint64_t id, char **dst, size_t size, bool rdonly);
-
-/*!
- * \brief Finalize mapped journal entry.
- *
- * \param journal Associated journal.
- * \param id Entry identifier.
- * \param ptr Mapped memory.
- * \param finalize Set to true to finalize node or False to discard it.
- *
- * \retval KNOT_EOK if successful.
- * \retval KNOT_ENOENT if the entry cannot be found.
- * \retval KNOT_ERROR on I/O error.
- */
-int journal_unmap(journal_t *journal, uint64_t id, void *ptr, int finalize);
-
-/*!
- * \brief Close journal file.
- *
- * \param journal Associated journal.
- *
- * \retval KNOT_EOK on success.
- * \retval KNOT_EINVAL on invalid parameter.
- */
-int journal_close(journal_t *journal);
-
-/*!
- * \brief Check if the journal file is used or not.
- *
- * \param path Journal file.
- *
- * \return true or false
- */
-bool journal_exists(const char *path);
-
-/*!
- * \brief Load changesets from journal.
- *
- * \param path Path to journal file.
- * \param zone Corresponding zone.
- * \param dst Store changesets here.
- * \param from Start serial.
- * \param to End serial.
- *
- * \retval KNOT_EOK on success.
- * \retval KNOT_ERANGE if given entry was not found.
- * \return < KNOT_EOK on error.
- */
-int journal_load_changesets(const char *path, const struct zone *zone, list_t *dst,
-                            uint32_t from, uint32_t to);
-
-/*!
- * \brief Store changesets in journal.
- *
- * \param src Changesets to store.
- * \param path Path to journal file.
- * \param size_limit Size limit extracted from configuration.
- *
- * \retval KNOT_EOK on success.
- * \retval KNOT_EBUSY when journal is full.
- * \return < KNOT_EOK on other errors.
- */
-int journal_store_changesets(list_t *src, const char *path, size_t size_limit);
-int journal_store_changeset(changeset_t *change, const char *path, size_t size_limit);
-
-/*! \brief Function for unmarking dirty nodes. */
-/*!
- * \brief Function for unmarking dirty nodes.
- * \param path Path to journal file.
- * \retval KNOT_ENOMEM if journal could not be opened.
- * \retval KNOT_EOK on success.
- */
-int journal_mark_synced(const char *path);
-
-/*! @} */
diff --git a/src/knot/server/serialization.c b/src/knot/server/serialization.c
deleted file mode 100644
index 191e0de463893440c1d1bdc82f6d25db81f92074..0000000000000000000000000000000000000000
--- a/src/knot/server/serialization.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
-
-    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
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <assert.h>
-
-#include "knot/server/serialization.h"
-#include "libknot/libknot.h"
-
-static size_t rr_binary_size(const knot_rrset_t *rrset, size_t rdata_pos)
-{
-	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, rdata_pos);
-	if (rr) {
-		// RR size + TTL
-		return knot_rdata_rdlen(rr) + sizeof(uint32_t);
-	} else {
-		return 0;
-	}
-}
-
-static uint64_t rrset_binary_size(const knot_rrset_t *rrset)
-{
-	if (rrset == NULL || rrset->rrs.rr_count == 0) {
-		return 0;
-	}
-	uint64_t size = sizeof(uint64_t) + // size at the beginning
-	              knot_dname_size(rrset->owner) + // owner data
-	              sizeof(uint16_t) + // type
-	              sizeof(uint16_t) + // class
-	              sizeof(uint16_t);  //RR count
-	uint16_t rdata_count = rrset->rrs.rr_count;
-	for (uint16_t i = 0; i < rdata_count; i++) {
-		/* Space to store length of one RR. */
-		size += sizeof(uint32_t);
-		/* Actual data. */
-		size += rr_binary_size(rrset, i);
-	}
-
-	return size;
-}
-
-static void serialize_rr(const knot_rrset_t *rrset, size_t rdata_pos,
-                         uint8_t *stream)
-{
-	const knot_rdata_t *rr = knot_rdataset_at(&rrset->rrs, rdata_pos);
-	assert(rr);
-	uint32_t ttl = knot_rdata_ttl(rr);
-	memcpy(stream, &ttl, sizeof(uint32_t));
-	memcpy(stream + sizeof(uint32_t), knot_rdata_data(rr), knot_rdata_rdlen(rr));
-}
-
-static int deserialize_rr(knot_rrset_t *rrset, const uint8_t *stream, uint32_t rdata_size)
-{
-	uint32_t ttl;
-	memcpy(&ttl, stream, sizeof(uint32_t));
-	return knot_rrset_add_rdata(rrset, stream + sizeof(uint32_t),
-	                         rdata_size - sizeof(uint32_t), ttl, NULL);
-}
-
-int changeset_binary_size(const changeset_t *chgset, size_t *size)
-{
-	if (chgset == NULL || size == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	size_t soa_from_size = rrset_binary_size(chgset->soa_from);
-	size_t soa_to_size = rrset_binary_size(chgset->soa_to);
-	changeset_iter_t itt;
-	changeset_iter_all(&itt, chgset, false);
-
-	size_t change_size = 0;
-	knot_rrset_t rrset = changeset_iter_next(&itt);
-	while (!knot_rrset_empty(&rrset)) {
-		change_size += rrset_binary_size(&rrset);
-		rrset = changeset_iter_next(&itt);
-	}
-
-	changeset_iter_clear(&itt);
-
-	*size = soa_from_size + soa_to_size + change_size;
-
-	return KNOT_EOK;
-}
-
-int rrset_serialize(const knot_rrset_t *rrset, uint8_t *stream, size_t *size)
-{
-	if (rrset == NULL || rrset->rrs.data == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	uint64_t rrset_length = rrset_binary_size(rrset);
-	memcpy(stream, &rrset_length, sizeof(uint64_t));
-
-	size_t offset = sizeof(uint64_t);
-	/* Save RR count. */
-	const uint16_t rr_count = rrset->rrs.rr_count;
-	memcpy(stream + offset, &rr_count, sizeof(uint16_t));
-	offset += sizeof(uint16_t);
-	/* Save owner. */
-	offset += knot_dname_to_wire(stream + offset, rrset->owner, rrset_length - offset);
-
-	/* Save static data. */
-	memcpy(stream + offset, &rrset->type, sizeof(uint16_t));
-	offset += sizeof(uint16_t);
-	memcpy(stream + offset, &rrset->rclass, sizeof(uint16_t));
-	offset += sizeof(uint16_t);
-
-	/* Copy RDATA. */
-	for (uint16_t i = 0; i < rr_count; i++) {
-		uint32_t knot_rr_size = rr_binary_size(rrset, i);
-		memcpy(stream + offset, &knot_rr_size, sizeof(uint32_t));
-		offset += sizeof(uint32_t);
-		serialize_rr(rrset, i, stream + offset);
-		offset += knot_rr_size;
-	}
-
-	*size = offset;
-	assert(*size == rrset_length);
-	return KNOT_EOK;
-}
-
-int rrset_deserialize(const uint8_t *stream, size_t *stream_size,
-                      knot_rrset_t *rrset)
-{
-	if (stream == NULL || stream_size == NULL ||
-	    rrset == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	if (sizeof(uint64_t) > *stream_size) {
-		return KNOT_ESPACE;
-	}
-	uint64_t rrset_length = 0;
-	memcpy(&rrset_length, stream, sizeof(uint64_t));
-	if (rrset_length > *stream_size) {
-		return KNOT_ESPACE;
-	}
-
-	size_t offset = sizeof(uint64_t);
-	uint16_t rdata_count = 0;
-	memcpy(&rdata_count, stream + offset, sizeof(uint16_t));
-	offset += sizeof(uint16_t);
-	/* Read owner from the stream. */
-	unsigned owner_size = knot_dname_size(stream + offset);
-	knot_dname_t *owner = knot_dname_copy_part(stream + offset, owner_size, NULL);
-	assert(owner);
-	offset += owner_size;
-	/* Read type. */
-	uint16_t type = 0;
-	memcpy(&type, stream + offset, sizeof(uint16_t));
-	offset += sizeof(uint16_t);
-	/* Read class. */
-	uint16_t rclass = 0;
-	memcpy(&rclass, stream + offset, sizeof(uint16_t));
-	offset += sizeof(uint16_t);
-
-	/* Create new RRSet. */
-	knot_rrset_init(rrset, owner, type, rclass);
-
-	/* Read RRs. */
-	for (uint16_t i = 0; i < rdata_count; i++) {
-		/*
-		 * There's always size of rdata in the beginning.
-		 * Needed because of remainders.
-		 */
-		uint32_t rdata_size = 0;
-		memcpy(&rdata_size, stream + offset, sizeof(uint32_t));
-		offset += sizeof(uint32_t);
-		int ret = deserialize_rr(rrset, stream + offset, rdata_size);
-		if (ret != KNOT_EOK) {
-			knot_rrset_clear(rrset, NULL);
-			return ret;
-		}
-		offset += rdata_size;
-	}
-
-	*stream_size = *stream_size - offset;
-
-	return KNOT_EOK;
-}
diff --git a/src/knot/server/serialization.h b/src/knot/server/serialization.h
deleted file mode 100644
index 66b5ddbe4c22a14ee909b7885d9a1655ddb99765..0000000000000000000000000000000000000000
--- a/src/knot/server/serialization.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
-
-    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
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-/*!
- * \file
- *
- * \brief API for changeset serialization.
- *
- * \addtogroup server
- * @{
- */
-
-#pragma once
-
-#include <stdint.h>
-#include "libknot/rrset.h"
-#include "knot/updates/changesets.h"
-
-/*!
- * \brief Returns size of changeset in serialized form.
- *
- * \param chgset  Changeset whose size we want to compute.
- * \param size    Output size parameter.
- *
- * \return KNOT_E*
- */
-int changeset_binary_size(const changeset_t *chgset, size_t *size);
-
-/*!
- * \brief Serializes one RRSet into given stream.
- *
- * \param rrset   RRSet to be serialized.
- * \param stream  Stream to store RRSet into.
- * \param size    Output size of serialized RRSet in the stream.
- *
- * \return KNOT_E*
- */
-int rrset_serialize(const knot_rrset_t *rrset, uint8_t *stream, size_t *size);
-
-/*!
- * \brief Deserializes RRSet from given stream.
- *
- * \param stream       Stream containing serialized RRSet.
- * \param stream_size  Output stream size after RRSet has been deserialized.
- * \param rrset        Output deserialized rrset.
- *
- * \return KNOT_E*
- */
-int rrset_deserialize(const uint8_t *stream, size_t *stream_size,
-                      knot_rrset_t *rrset);
-
-/*! @} */
diff --git a/src/knot/server/server.c b/src/knot/server/server.c
index 6af10c0891ebc906be62b3817563461a77ec6c0e..71dad2cd44ff5a1cddae7bc724b65cb567a34529 100644
--- a/src/knot/server/server.c
+++ b/src/knot/server/server.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -22,6 +22,9 @@
 
 #include "libknot/errcode.h"
 #include "knot/common/log.h"
+#include "knot/common/stats.h"
+#include "knot/conf/confio.h"
+#include "knot/conf/migration.h"
 #include "knot/server/server.h"
 #include "knot/server/udp-handler.h"
 #include "knot/server/tcp-handler.h"
@@ -151,11 +154,11 @@ static int server_init_iface(iface_t *new_if, struct sockaddr_storage *addr, int
 	sockaddr_tostr(addr_str, sizeof(addr_str), (struct sockaddr *)addr);
 
 	int udp_socket_count = 1;
-	int bind_flags = 0;
+	int udp_bind_flags = 0;
 
 #ifdef ENABLE_REUSEPORT
 	udp_socket_count = udp_thread_count;
-	bind_flags |= NET_BIND_MULTIPLE;
+	udp_bind_flags |= NET_BIND_MULTIPLE;
 #endif
 
 	new_if->fd_udp = malloc(udp_socket_count * sizeof(int));
@@ -174,10 +177,10 @@ static int server_init_iface(iface_t *new_if, struct sockaddr_storage *addr, int
 
 	/* Create bound UDP sockets. */
 	for (int i = 0; i < udp_socket_count; i++ ) {
-		int sock = net_bound_socket(SOCK_DGRAM, (struct sockaddr *)addr, bind_flags);
+		int sock = net_bound_socket(SOCK_DGRAM, (struct sockaddr *)addr, udp_bind_flags);
 		if (sock == KNOT_EADDRNOTAVAIL) {
-			bind_flags |= NET_BIND_NONLOCAL;
-			sock = net_bound_socket(SOCK_DGRAM, (struct sockaddr *)addr, bind_flags);
+			udp_bind_flags |= NET_BIND_NONLOCAL;
+			sock = net_bound_socket(SOCK_DGRAM, (struct sockaddr *)addr, udp_bind_flags);
 			if (sock >= 0 && !warn_bind) {
 				log_warning("address '%s' is not available", addr_str);
 				warn_bind = true;
@@ -206,7 +209,7 @@ static int server_init_iface(iface_t *new_if, struct sockaddr_storage *addr, int
 	}
 
 	/* Create bound TCP socket. */
-	int sock = net_bound_socket(SOCK_STREAM, (struct sockaddr *)addr, bind_flags);
+	int sock = net_bound_socket(SOCK_STREAM, (struct sockaddr *)addr, 0);
 	if (sock < 0) {
 		log_error("cannot bind address '%s' (%s)", addr_str,
 		          knot_strerror(sock));
@@ -376,6 +379,17 @@ int server_init(server_t *server, int bg_workers)
 		return KNOT_ENOMEM;
 	}
 
+	char *journal_dir = conf_journalfile(conf());
+	conf_val_t journal_size = conf_default_get(conf(), C_MAX_JOURNAL_DB_SIZE);
+	int ret = journal_db_init(&server->journal_db, journal_dir,
+	                          conf_int(&journal_size));
+	free(journal_dir);
+	if (ret != KNOT_EOK) {
+		worker_pool_destroy(server->workers);
+		evsched_deinit(&server->sched);
+		return ret;
+	}
+
 	return KNOT_EOK;
 }
 
@@ -397,15 +411,15 @@ void server_deinit(server_t *server)
 	/* Free threads and event handlers. */
 	worker_pool_destroy(server->workers);
 
-	/* Free rate limits. */
-	rrl_destroy(server->rrl);
-
 	/* Free zone database. */
 	knot_zonedb_deep_free(&server->zone_db);
 
 	/* Free remaining events. */
 	evsched_deinit(&server->sched);
 
+	/* Close journal database if open. */
+	journal_db_close(&server->journal_db);
+
 	/* Close persistent timers database. */
 	zone_timers_close(server->timers_db);
 
@@ -507,13 +521,44 @@ void server_wait(server_t *server)
 	}
 }
 
-int server_reload(server_t *server, const char *cf, bool refresh_hostname)
+static int reload_conf(conf_t *new_conf)
+{
+	/* Re-import zonefile if specified. */
+	const char *filename = conf()->filename;
+	if (filename != NULL) {
+		log_info("reloading configuration file '%s'", filename);
+
+		/* Import the configuration file. */
+		int ret = conf_import(new_conf, filename, true);
+		if (ret != KNOT_EOK) {
+			log_error("failed to load configuration file (%s)",
+			          knot_strerror(ret));
+			conf_free(new_conf);
+			return ret;
+		}
+	} else {
+		log_info("reloading configuration database");
+	}
+
+	// Migrate from old schema.
+	int ret = conf_migrate(new_conf);
+	if (ret != KNOT_EOK) {
+		log_error("failed to migrate configuration (%s)", knot_strerror(ret));
+	}
+
+	/* Refresh hostname. */
+	conf_refresh_hostname(new_conf);
+
+	return KNOT_EOK;
+}
+
+int server_reload(server_t *server)
 {
 	if (server == NULL) {
 		return KNOT_EINVAL;
 	}
 
-	// Check for no edit mode.
+	/* Check for no edit mode. */
 	if (conf()->io.txn != NULL) {
 		log_warning("reload aborted due to active configuration transaction");
 		return KNOT_TXN_EEXISTS;
@@ -527,38 +572,53 @@ int server_reload(server_t *server, const char *cf, bool refresh_hostname)
 		return ret;
 	}
 
-	if (cf != NULL) {
-		log_info("reloading configuration file '%s'", cf);
+	yp_flag_t flags = conf()->io.flags;
+	bool full = !(flags & CONF_IO_FACTIVE);
+	bool reuse_modules = !full && !(flags & CONF_IO_FRLD_MOD);
 
-		/* Import the configuration file. */
-		ret = conf_import(new_conf, cf, true);
+	/* Reload configuration if full reload. */
+	if (full) {
+		ret = reload_conf(new_conf);
 		if (ret != KNOT_EOK) {
-			log_error("failed to load configuration file (%s)",
-			          knot_strerror(ret));
-			conf_free(new_conf);
 			return ret;
 		}
-	} else {
-		log_info("reloading configuration database");
 	}
 
-	/* Activate global query modules. */
-	conf_activate_modules(new_conf, NULL, &new_conf->query_modules,
-	                      &new_conf->query_plan);
+	/* Load global modules if full reload or required. */
+	if (full || !reuse_modules) {
+		conf_activate_modules(new_conf, NULL, &new_conf->query_modules,
+		                      &new_conf->query_plan);
+	}
 
-	/* Refresh hostname. */
-	if (refresh_hostname) {
-		conf_refresh_hostname(new_conf);
+	conf_update_flag_t upd_flags = full ? CONF_UPD_FNONE : CONF_UPD_FCONFIO;
+	if (reuse_modules) {
+		upd_flags |= CONF_UPD_FMODULES;
 	}
 
 	/* Update to the new config. */
-	conf_update(new_conf);
+	conf_update(new_conf, upd_flags);
 
-	log_reconfigure(conf());
-	server_reconfigure(conf(), server);
-	server_update_zones(conf(), server);
+	/* Reload each component if full reload or a specific one if required. */
+	if (full || (flags & CONF_IO_FRLD_LOG)) {
+		log_reconfigure(conf());
+	}
+	if (full || (flags & CONF_IO_FRLD_SRV)) {
+		server_reconfigure(conf(), server);
+		stats_reconfigure(conf(), server);
+	}
+	if (full || (flags & (CONF_IO_FRLD_ZONES | CONF_IO_FRLD_ZONE))) {
+		server_update_zones(conf(), server);
+	}
 
-	log_info("configuration reloaded");
+	if (full) {
+		log_info("configuration reloaded");
+	} else {
+		// Reset confio reload context.
+		conf()->io.flags = YP_FNONE;
+		if (conf()->io.zones != NULL) {
+			hattrie_clear(conf()->io.zones);
+		}
+	}
 
 	return KNOT_EOK;
 }
@@ -614,37 +674,32 @@ static int reconfigure_threads(conf_t *conf, server_t *server)
 	return reset_handler(server, IO_TCP, conf_tcp_threads(conf), tcp_master);
 }
 
-static int reconfigure_rate_limits(conf_t *conf, server_t *server)
+static int reconfigure_journal_db(conf_t *conf, server_t *server)
 {
-	conf_val_t val = conf_get(conf, C_SRV, C_RATE_LIMIT);
-	int64_t rrl = conf_int(&val);
-
-	/* Rate limiting. */
-	if (!server->rrl && rrl > 0) {
-		val = conf_get(conf, C_SRV, C_RATE_LIMIT_TBL_SIZE);
-		server->rrl = rrl_create(conf_int(&val));
-		if (!server->rrl) {
-			log_error("failed to initialize rate limiting table");
-		} else {
-			rrl_setlocks(server->rrl, RRL_LOCK_GRANULARITY);
+	char *journal_dir = conf_journalfile(conf);
+	conf_val_t journal_size = conf_default_get(conf, C_MAX_JOURNAL_DB_SIZE);
+	bool changed_path = (strcmp(journal_dir, server->journal_db->path) != 0);
+	bool changed_size = (conf_int(&journal_size) != server->journal_db->fslimit);
+	int ret = KNOT_EOK;
+
+	if (server->journal_db->db != NULL) {
+		if (changed_path) {
+			log_warning("journal, ignored reconfiguration of journal DB path (already open)");
+		}
+		if (changed_size) {
+			log_warning("journal, ignored reconfiguration of journal DB max size (already open)");
+		}
+	} else if (changed_path || changed_size) {
+		journal_db_t *newjdb = NULL;
+		ret = journal_db_init(&newjdb, journal_dir, conf_int(&journal_size));
+		if (ret == KNOT_EOK) {
+			journal_db_close(&server->journal_db);
+			server->journal_db = newjdb;
 		}
 	}
-	if (server->rrl) {
-		if (rrl_rate(server->rrl) != rrl) {
-			/* We cannot free it, threads may use it.
-			 * Setting it to <1 will disable rate limiting. */
-			if (rrl < 1) {
-				log_info("rate limiting, disabled");
-			} else {
-				log_info("rate limiting, enabled with %i responses/second",
-					 (int)rrl);
-			}
-			rrl_setrate(server->rrl, rrl);
-
-		} /* At this point, old buckets will converge to new rate. */
-	}
+	free(journal_dir);
 
-	return KNOT_EOK;
+	return ret;
 }
 
 void server_reconfigure(conf_t *conf, server_t *server)
@@ -658,16 +713,16 @@ void server_reconfigure(conf_t *conf, server_t *server)
 		log_info("Knot DNS %s starting", PACKAGE_VERSION);
 	}
 
-	/* Reconfigure rate limits. */
+	/* Reconfigure server threads. */
 	int ret;
-	if ((ret = reconfigure_rate_limits(conf, server)) < 0) {
-		log_error("failed to reconfigure rate limits (%s)",
+	if ((ret = reconfigure_threads(conf, server)) < 0) {
+		log_error("failed to reconfigure server threads (%s)",
 		          knot_strerror(ret));
 	}
 
-	/* Reconfigure server threads. */
-	if ((ret = reconfigure_threads(conf, server)) < 0) {
-		log_error("failed to reconfigure server threads (%s)",
+	/* Reconfigure journal DB. */
+	if ((ret = reconfigure_journal_db(conf, server)) < 0) {
+		log_error("failed to reconfigure journal DB (%s)",
 		          knot_strerror(ret));
 	}
 
diff --git a/src/knot/server/server.h b/src/knot/server/server.h
index 3998672577be3d915c14ee1c1a1770b193ebf994..efbc8de0d81c3925edc91e9ba309cbccacf23510 100644
--- a/src/knot/server/server.h
+++ b/src/knot/server/server.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -34,7 +34,6 @@
 #include "knot/common/fdset.h"
 #include "knot/server/dthreads.h"
 #include "knot/common/ref.h"
-#include "knot/server/rrl.h"
 #include "knot/worker/pool.h"
 #include "knot/zone/zonedb.h"
 #include "contrib/ucw/lists.h"
@@ -96,6 +95,7 @@ typedef struct server {
 	/*! \brief Zone database. */
 	knot_zonedb_t *zone_db;
 	knot_db_t *timers_db;
+	journal_db_t *journal_db;
 
 	/*! \brief I/O handlers. */
 	struct {
@@ -110,10 +110,7 @@ typedef struct server {
 	evsched_t sched;
 
 	/*! \brief List of interfaces. */
-	ifacelist_t* ifaces;
-
-	/*! \brief Rate limiting. */
-	rrl_table_t *rrl;
+	ifacelist_t *ifaces;
 
 } server_t;
 
@@ -155,12 +152,11 @@ void server_wait(server_t *server);
 /*!
  * \brief Reload server configuration.
  *
- * \param server            Server instance.
- * \param cf                Config file path.
- * \param refresh_hostname  Refresh hostname indicator.
- * \return
+ * \param server  Server instance.
+ *
+ * \return Error code, KNOT_EOK if success.
  */
-int server_reload(server_t *server, const char *cf, bool refresh_hostname);
+int server_reload(server_t *server);
 
 /*!
  * \brief Requests server to stop.
@@ -174,7 +170,7 @@ void server_stop(server_t *server);
  *
  * Routine for dynamic server reconfiguration.
  */
-void server_reconfigure(conf_t *conf, server_t *data);
+void server_reconfigure(conf_t *conf, server_t *server);
 
 /*!
  * \brief Reconfigure zone database.
diff --git a/src/knot/server/udp-handler.c b/src/knot/server/udp-handler.c
index 8c47fcc245f33b44121913af5da2ef88a05b2b8b..d2d76998d7260c54771d702cd2b17ff8c34c9871 100644
--- a/src/knot/server/udp-handler.c
+++ b/src/knot/server/udp-handler.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -21,7 +21,6 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#include <sys/syscall.h>
 #include <string.h>
 #include <assert.h>
 #include <sys/param.h>
@@ -50,10 +49,10 @@ enum {
 };
 
 /*! \brief UDP context data. */
-typedef struct udp_context {
-	struct knot_layer layer;     /*!< Query processing layer. */
-	server_t *server;            /*!< Name server structure. */
-	unsigned thread_id;          /*!< Thread identifier. */
+typedef struct {
+	knot_layer_t layer; /*!< Query processing layer. */
+	server_t *server;   /*!< Name server structure. */
+	unsigned thread_id; /*!< Thread identifier. */
 } udp_context_t;
 
 static bool udp_state_active(int state)
@@ -65,19 +64,15 @@ static void udp_handle(udp_context_t *udp, int fd, struct sockaddr_storage *ss,
                        struct iovec *rx, struct iovec *tx)
 {
 	/* Create query processing parameter. */
-	struct process_query_param param = {0};
-	param.remote = ss;
-	param.proc_flags  = NS_QUERY_NO_AXFR|NS_QUERY_NO_IXFR; /* No transfers. */
-	param.proc_flags |= NS_QUERY_LIMIT_SIZE; /* Enforce UDP packet size limit. */
-	param.proc_flags |= NS_QUERY_LIMIT_ANY;  /* Limit ANY over UDP (depends on zone as well). */
-	param.socket = fd;
-	param.server = udp->server;
-	param.thread_id = udp->thread_id;
-
-	/* Rate limit is applied? */
-	if (unlikely(udp->server->rrl != NULL) && udp->server->rrl->rate > 0) {
-		param.proc_flags |= NS_QUERY_LIMIT_RATE;
-	}
+	struct process_query_param param = {
+		.remote = ss,
+		.proc_flags = NS_QUERY_NO_AXFR | NS_QUERY_NO_IXFR | /* No transfers. */
+		              NS_QUERY_LIMIT_SIZE | /* Enforce UDP packet size limit. */
+		              NS_QUERY_LIMIT_ANY,  /* Limit ANY over UDP (depends on zone as well). */
+		.socket = fd,
+		.server = udp->server,
+		.thread_id = udp->thread_id
+	};
 
 	/* Start query processing. */
 	knot_layer_begin(&udp->layer, &param);
@@ -110,15 +105,6 @@ static void udp_handle(udp_context_t *udp, int fd, struct sockaddr_storage *ss,
 	knot_pkt_free(&ans);
 }
 
-/* Check for sendmmsg syscall. */
-#ifdef HAVE_SENDMMSG
-  #define ENABLE_SENDMMSG 1
-#else
-  #ifdef SYS_sendmmsg
-    #define ENABLE_SENDMMSG 1
-  #endif
-#endif
-
 /*! \brief Pointer to selected UDP master implementation. */
 static void* (*_udp_init)(void) = 0;
 static int (*_udp_deinit)(void *) = 0;
@@ -244,49 +230,7 @@ static int udp_recvfrom_send(void *d)
 	return 0;
 }
 
-#ifdef HAVE_RECVMMSG
-
-/*! \brief Pointer to selected UDP send implementation. */
-static int (*_send_mmsg)(int, struct sockaddr *, struct mmsghdr *, size_t) = 0;
-
-/*!
- * \brief Send multiple packets.
- *
- * Basic, sendmsg() based implementation.
- */
-static int udp_sendmsg(int sock, struct sockaddr *addrs, struct mmsghdr *msgs, size_t count)
-{
-	int sent = 0;
-	for (unsigned i = 0; i < count; ++i) {
-		if (sendmsg(sock, &msgs[i].msg_hdr, 0) > 0) {
-			++sent;
-		}
-	}
-
-	return sent;
-}
-
-#ifdef ENABLE_SENDMMSG
-/*! \brief sendmmsg() syscall interface. */
-#ifndef HAVE_SENDMMSG
-static inline int sendmmsg(int fd, struct mmsghdr *mmsg, unsigned vlen,
-                           unsigned flags)
-{
-	return syscall(SYS_sendmmsg, fd, mmsg, vlen, flags, NULL);
-}
-#endif /* HAVE_SENDMMSG */
-
-/*!
- * \brief Send multiple packets.
- *
- * sendmmsg() implementation.
- */
-static int udp_sendmmsg(int sock, struct sockaddr *_, struct mmsghdr *msgs, size_t count)
-{
-	UNUSED(_);
-	return sendmmsg(sock, msgs, count, 0);
-}
-#endif /* ENABLE_SENDMMSG */
+#ifdef ENABLE_RECVMMSG
 
 /* UDP recvmmsg() request struct. */
 struct udp_recvmmsg {
@@ -362,7 +306,7 @@ static int udp_recvmmsg_handle(udp_context_t *ctx, void *d)
 		struct iovec *tx = rq->msgs[TX][i].msg_hdr.msg_iov;
 		rx->iov_len = rq->msgs[RX][i].msg_len; /* Received bytes. */
 
-		udp_pktinfo_handle(&rq->msgs[RX][i].msg_hdr,&rq->msgs[TX][i].msg_hdr);
+		udp_pktinfo_handle(&rq->msgs[RX][i].msg_hdr, &rq->msgs[TX][i].msg_hdr);
 
 		udp_handle(ctx, rq->fd, rq->addrs + i, rx, tx);
 		rq->msgs[TX][i].msg_len = tx->iov_len;
@@ -379,7 +323,7 @@ static int udp_recvmmsg_handle(udp_context_t *ctx, void *d)
 static int udp_recvmmsg_send(void *d)
 {
 	struct udp_recvmmsg *rq = (struct udp_recvmmsg *)d;
-	int rc = _send_mmsg(rq->fd, (struct sockaddr *)rq->addrs, rq->msgs[TX], rq->rcvd);
+	int rc = sendmmsg(rq->fd, rq->msgs[TX], rq->rcvd, 0);
 	for (unsigned i = 0; i < rq->rcvd; ++i) {
 		/* Reset buffer size and address len. */
 		struct iovec *rx = rq->msgs[RX][i].msg_hdr.msg_iov;
@@ -394,38 +338,25 @@ static int udp_recvmmsg_send(void *d)
 	}
 	return rc;
 }
-#endif /* HAVE_RECVMMSG */
+#endif /* ENABLE_RECVMMSG */
 
 /*! \brief Initialize UDP master routine on run-time. */
 void __attribute__ ((constructor)) udp_master_init(void)
 {
 	/* Initialize defaults. */
-	_udp_init = udp_recvfrom_init;
+	_udp_init =   udp_recvfrom_init;
 	_udp_deinit = udp_recvfrom_deinit;
-	_udp_recv = udp_recvfrom_recv;
-	_udp_send = udp_recvfrom_send;
+	_udp_recv =   udp_recvfrom_recv;
 	_udp_handle = udp_recvfrom_handle;
-
-	/* Optimized functions. */
-#ifdef HAVE_RECVMMSG
-	recvmmsg(0, NULL, 0, 0, 0);
-	if (errno != ENOSYS) {
-		_udp_init = udp_recvmmsg_init;
-		_udp_deinit = udp_recvmmsg_deinit;
-		_udp_recv = udp_recvmmsg_recv;
-		_udp_send = udp_recvmmsg_send;
-		_udp_handle = udp_recvmmsg_handle;
-	}
-
-	/* Check for sendmmsg() support. */
-	_send_mmsg = udp_sendmsg;
-#ifdef ENABLE_SENDMMSG
-	sendmmsg(0, 0, 0, 0); /* Just check if syscall exists */
-	if (errno != ENOSYS) {
-		_send_mmsg = udp_sendmmsg;
-	}
-#endif /* ENABLE_SENDMMSG */
-#endif /* HAVE_RECVMMSG */
+	_udp_send =   udp_recvfrom_send;
+
+#ifdef ENABLE_RECVMMSG
+	_udp_init =   udp_recvmmsg_init;
+	_udp_deinit = udp_recvmmsg_deinit;
+	_udp_recv =   udp_recvmmsg_recv;
+	_udp_handle = udp_recvmmsg_handle;
+	_udp_send =   udp_recvmmsg_send;
+#endif /* ENABLE_RECVMMSG */
 }
 
 /*! \brief Get interface UDP descriptor for a given thread. */
diff --git a/src/knot/updates/apply.c b/src/knot/updates/apply.c
index acbdcc87a7b8b8be81cfe7cf31bd96eaba522160..52efcefc20c6793e576ab60c5176d5cfa30b89bf 100644
--- a/src/knot/updates/apply.c
+++ b/src/knot/updates/apply.c
@@ -51,10 +51,8 @@ static int free_additional(zone_node_t **node, void *data)
 
 	for (uint16_t i = 0; i < (*node)->rrset_count; ++i) {
 		struct rr_data *data = &(*node)->rrs[i];
-		if (data->additional) {
-			free(data->additional);
-			data->additional = NULL;
-		}
+		additional_clear(data->additional);
+		data->additional = NULL;
 	}
 
 	return KNOT_EOK;
@@ -149,7 +147,7 @@ static bool can_remove(const zone_node_t *node, const knot_rrset_t *rr)
 static int apply_remove(apply_ctx_t *ctx, changeset_t *chset)
 {
 	changeset_iter_t itt;
-	changeset_iter_rem(&itt, chset, false);
+	changeset_iter_rem(&itt, chset);
 
 	knot_rrset_t rr = changeset_iter_next(&itt);
 	while (!knot_rrset_empty(&rr)) {
@@ -170,7 +168,7 @@ static int apply_remove(apply_ctx_t *ctx, changeset_t *chset)
 static int apply_add(apply_ctx_t *ctx, changeset_t *chset)
 {
 	changeset_iter_t itt;
-	changeset_iter_add(&itt, chset, false);
+	changeset_iter_add(&itt, chset);
 
 	knot_rrset_t rr = changeset_iter_next(&itt);
 	while(!knot_rrset_empty(&rr)) {
@@ -380,7 +378,7 @@ int apply_replace_soa(apply_ctx_t *ctx, changeset_t *chset)
 
 	// Check for SOA with proper serial but different rdata.
 	if (node_rrtype_exists(contents->apex, KNOT_RRTYPE_SOA)) {
-		return KNOT_EINVAL;
+		return KNOT_ESOAINVAL;
 	}
 
 	return apply_add_rr(ctx, chset->soa_to);
@@ -475,17 +473,11 @@ int apply_changesets_directly(apply_ctx_t *ctx, list_t *chsets)
 	WALK_LIST(set, *chsets) {
 		int ret = apply_single(ctx, set);
 		if (ret != KNOT_EOK) {
-			update_rollback(ctx);
 			return ret;
 		}
 	}
 
-	int ret = zone_contents_adjust_full(ctx->contents);
-	if (ret != KNOT_EOK) {
-		update_rollback(ctx);
-	}
-
-	return ret;
+	return zone_contents_adjust_full(ctx->contents);
 }
 
 int apply_changeset_directly(apply_ctx_t *ctx, changeset_t *ch)
diff --git a/src/knot/updates/apply.h b/src/knot/updates/apply.h
index 317f2b37f590a663f1f13742b24ad3e97ab54c8c..187eb28f6effe0cff7533ebc93e8665fb8acdbf0 100644
--- a/src/knot/updates/apply.h
+++ b/src/knot/updates/apply.h
@@ -129,6 +129,8 @@ int apply_changeset(apply_ctx_t *ctx, zone_contents_t *old_contents,
 /*!
  * \brief Applies changesets directly to the zone, without copying it.
  *
+ * \warning Modified zone is in inconsitent state after error and should be freed.
+ *
  * \param ctx     Apply context.
  * \param chsets  List of changesets to be applied to the zone.
  *
diff --git a/src/knot/updates/changesets.c b/src/knot/updates/changesets.c
index 50a8c882ce27831acd2a057fdb87e2afa16d90ae..f68cf36bc6f6ba73d188fc5f241a0334c5a98a9e 100644
--- a/src/knot/updates/changesets.c
+++ b/src/knot/updates/changesets.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -23,8 +23,6 @@
 #include "contrib/macros.h"
 #include "contrib/mempattern.h"
 
-/* -------------------- Changeset iterator helpers -------------------------- */
-
 static int handle_soa(knot_rrset_t **soa, const knot_rrset_t *rrset)
 {
 	assert(soa);
@@ -64,9 +62,8 @@ static void cleanup_iter_list(list_t *l)
 	init_list(l);
 }
 
-/*! \brief Inits changeset iterator with given HAT-tries. */
-static int changeset_iter_init(changeset_iter_t *ch_it,
-                               const changeset_t *ch, bool sorted, size_t tries, ...)
+/*! \brief Inits changeset iterator with given tries. */
+static int changeset_iter_init(changeset_iter_t *ch_it, size_t tries, ...)
 {
 	memset(ch_it, 0, sizeof(*ch_it));
 	init_list(&ch_it->iters);
@@ -76,19 +73,21 @@ static int changeset_iter_init(changeset_iter_t *ch_it,
 
 	for (size_t i = 0; i < tries; ++i) {
 		hattrie_t *t = va_arg(args, hattrie_t *);
-		if (t) {
-			if (sorted) {
-				hattrie_build_index(t);
-			}
-			hattrie_iter_t *it = hattrie_iter_begin(t, sorted);
-			if (it == NULL) {
-				cleanup_iter_list(&ch_it->iters);
-				return KNOT_ENOMEM;
-			}
-			if (ptrlist_add(&ch_it->iters, it, NULL) == NULL) {
-				cleanup_iter_list(&ch_it->iters);
-				return KNOT_ENOMEM;
-			}
+		if (t == NULL) {
+			continue;
+		}
+
+		hattrie_iter_t *it = hattrie_iter_begin(t);
+		if (it == NULL) {
+			cleanup_iter_list(&ch_it->iters);
+			va_end(args);
+			return KNOT_ENOMEM;
+		}
+
+		if (ptrlist_add(&ch_it->iters, it, NULL) == NULL) {
+			cleanup_iter_list(&ch_it->iters);
+			va_end(args);
+			return KNOT_ENOMEM;
 		}
 	}
 
@@ -175,8 +174,6 @@ static void check_redundancy(zone_contents_t *counterpart, const knot_rrset_t *r
 	return;
 }
 
-/* ------------------------------- API -------------------------------------- */
-
 int changeset_init(changeset_t *ch, const knot_dname_t *apex)
 {
 	memset(ch, 0, sizeof(changeset_t));
@@ -221,7 +218,7 @@ bool changeset_empty(const changeset_t *ch)
 	}
 
 	changeset_iter_t itt;
-	changeset_iter_all(&itt, ch, false);
+	changeset_iter_all(&itt, ch);
 
 	knot_rrset_t rr = changeset_iter_next(&itt);
 	changeset_iter_clear(&itt);
@@ -236,7 +233,7 @@ size_t changeset_size(const changeset_t *ch)
 	}
 
 	changeset_iter_t itt;
-	changeset_iter_all(&itt, ch, false);
+	changeset_iter_all(&itt, ch);
 
 	size_t size = 0;
 	knot_rrset_t rr = changeset_iter_next(&itt);
@@ -353,7 +350,7 @@ int changeset_remove_removal(changeset_t *ch, const knot_rrset_t *rrset)
 int changeset_merge(changeset_t *ch1, const changeset_t *ch2)
 {
 	changeset_iter_t itt;
-	changeset_iter_add(&itt, ch2, false);
+	changeset_iter_add(&itt, ch2);
 
 	knot_rrset_t rrset = changeset_iter_next(&itt);
 	while (!knot_rrset_empty(&rrset)) {
@@ -366,7 +363,7 @@ int changeset_merge(changeset_t *ch1, const changeset_t *ch2)
 	}
 	changeset_iter_clear(&itt);
 
-	changeset_iter_rem(&itt, ch2, false);
+	changeset_iter_rem(&itt, ch2);
 
 	rrset = changeset_iter_next(&itt);
 	while (!knot_rrset_empty(&rrset)) {
@@ -438,22 +435,19 @@ void changeset_free(changeset_t *ch)
 	free(ch);
 }
 
-int changeset_iter_add(changeset_iter_t *itt, const changeset_t *ch, bool sorted)
+int changeset_iter_add(changeset_iter_t *itt, const changeset_t *ch)
 {
-	return changeset_iter_init(itt, ch, sorted, 2,
-	                           ch->add->nodes, ch->add->nsec3_nodes);
+	return changeset_iter_init(itt, 2, ch->add->nodes, ch->add->nsec3_nodes);
 }
 
-int changeset_iter_rem(changeset_iter_t *itt, const changeset_t *ch, bool sorted)
+int changeset_iter_rem(changeset_iter_t *itt, const changeset_t *ch)
 {
-	return changeset_iter_init(itt, ch, sorted, 2,
-	                           ch->remove->nodes, ch->remove->nsec3_nodes);
+	return changeset_iter_init(itt, 2, ch->remove->nodes, ch->remove->nsec3_nodes);
 }
 
-int changeset_iter_all(changeset_iter_t *itt, const changeset_t *ch, bool sorted)
+int changeset_iter_all(changeset_iter_t *itt, const changeset_t *ch)
 {
-	return changeset_iter_init(itt, ch, sorted, 4,
-	                           ch->add->nodes, ch->add->nsec3_nodes,
+	return changeset_iter_init(itt, 4, ch->add->nodes, ch->add->nsec3_nodes,
 	                           ch->remove->nodes, ch->remove->nsec3_nodes);
 }
 
diff --git a/src/knot/updates/changesets.h b/src/knot/updates/changesets.h
index efb40f8e7f547ffada1a0a31a6b19c5954580126..e38e41cc92bc204dd76b7c5d796841045df7e550 100644
--- a/src/knot/updates/changesets.h
+++ b/src/knot/updates/changesets.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -134,7 +134,7 @@ int changeset_remove_addition(changeset_t *ch, const knot_rrset_t *rrset);
 int changeset_remove_removal(changeset_t *ch, const knot_rrset_t *rrset);
 
 /*!
- * \brief Merges two changesets together. Legacy, to be removed with new zone API.
+ * \brief Merges two changesets together.
  *
  * \param ch1  Merge into this changeset.
  * \param ch2  Merge this changeset.
@@ -174,35 +174,32 @@ void changeset_free(changeset_t *ch);
 /*!
  * \brief Inits changeset iteration structure with changeset additions.
  *
- * \param itt     Iterator to init.
- * \param ch      Changeset to use.
- * \param sorted  Sort the iteration?
+ * \param itt  Iterator to init.
+ * \param ch   Changeset to use.
  *
  * \return KNOT_E*
  */
-int changeset_iter_add(changeset_iter_t *itt, const changeset_t *ch, bool sorted);
+int changeset_iter_add(changeset_iter_t *itt, const changeset_t *ch);
 
 /*!
  * \brief Inits changeset iteration structure with changeset removals.
  *
- * \param itt     Iterator to init.
- * \param ch      Changeset to use.
- * \param sorted  Sort the iteration?
+ * \param itt  Iterator to init.
+ * \param ch   Changeset to use.
  *
  * \return KNOT_E*
  */
-int changeset_iter_rem(changeset_iter_t *itt, const changeset_t *ch, bool sorted);
+int changeset_iter_rem(changeset_iter_t *itt, const changeset_t *ch);
 
 /*!
  * \brief Inits changeset iteration structure with changeset additions and removals.
  *
- * \param itt     Iterator to init.
- * \param ch      Changeset to use.
- * \param sorted  Sort the iteration?
+ * \param itt  Iterator to init.
+ * \param ch   Changeset to use.
  *
  * \return KNOT_E*
  */
-int changeset_iter_all(changeset_iter_t *itt, const changeset_t *ch, bool sorted);
+int changeset_iter_all(changeset_iter_t *itt, const changeset_t *ch);
 
 /*!
  * \brief Gets next RRSet from changeset iterator.
diff --git a/src/knot/updates/ddns.c b/src/knot/updates/ddns.c
index 96643d1cdaf9dec29a15755ed5dd80eef4ae8dda..b4fc24f8556b9c9fdbb386d1b430d0b63f536726 100644
--- a/src/knot/updates/ddns.c
+++ b/src/knot/updates/ddns.c
@@ -174,6 +174,24 @@ static bool rrset_empty(const knot_rrset_t *rrset)
 	return false;
 }
 
+/*< \brief Returns true if DDNS should deny updating DNSSEC-related record. */
+static bool is_dnssec_protected(uint16_t type, bool is_apex)
+{
+	switch (type) {
+	case KNOT_RRTYPE_RRSIG:
+	case KNOT_RRTYPE_NSEC:
+	case KNOT_RRTYPE_NSEC3:
+	case KNOT_RRTYPE_CDNSKEY:
+	case KNOT_RRTYPE_CDS:
+		return true;
+	case KNOT_RRTYPE_DNSKEY:
+	case KNOT_RRTYPE_NSEC3PARAM:
+		return is_apex;
+	default:
+		return false;
+	}
+}
+
 /*!< \brief Checks prereq for given packet RR. */
 static int process_prereq(const knot_rrset_t *rrset, uint16_t qclass,
                           zone_update_t *update, uint16_t *rcode,
@@ -505,13 +523,14 @@ static int process_rem_rrset(const knot_rrset_t *rrset,
                              const zone_node_t *node,
                              zone_update_t *update)
 {
-	if (rrset->type == KNOT_RRTYPE_SOA || knot_rrtype_is_dnssec(rrset->type)) {
+	bool is_apex = node_rrtype_exists(node, KNOT_RRTYPE_SOA);
+
+	if (rrset->type == KNOT_RRTYPE_SOA || is_dnssec_protected(rrset->type, is_apex)) {
 		// Ignore SOA and DNSSEC removals.
 		return KNOT_EOK;
 	}
 
-	if (node_rrtype_exists(node, KNOT_RRTYPE_SOA) &&
-	    rrset->type == KNOT_RRTYPE_NS) {
+	if (is_apex && rrset->type == KNOT_RRTYPE_NS) {
 		// Ignore NS apex RRSet removals.
 		return KNOT_EOK;
 	}
@@ -614,12 +633,13 @@ static int check_update(const knot_rrset_t *rrset, const knot_pkt_t *query,
 	const knot_dname_t *owner = rrset->owner;
 	const knot_dname_t *qname = knot_pkt_qname(query);
 	const bool is_sub = knot_dname_is_sub(owner, qname);
-	if (!is_sub && !knot_dname_is_equal(owner, qname)) {
+	const bool is_apex = knot_dname_is_equal(owner, qname);
+	if (!is_sub && !is_apex) {
 		*rcode = KNOT_RCODE_NOTZONE;
 		return KNOT_EOUTOFZONE;
 	}
 
-	if (knot_rrtype_is_dnssec(rrset->type)) {
+	if (is_dnssec_protected(rrset->type, is_apex)) {
 		*rcode = KNOT_RCODE_REFUSED;
 		log_warning("DDNS, refusing to update DNSSEC-related record");
 		return KNOT_EDENIED;
diff --git a/src/knot/updates/zone-update.c b/src/knot/updates/zone-update.c
index d9e20bbc9fd15222cf0d2fc29b661f0bb9cbd3c8..d8da3c403aee7a18ef8a770e60d0a219c53c118e 100644
--- a/src/knot/updates/zone-update.c
+++ b/src/knot/updates/zone-update.c
@@ -48,8 +48,8 @@ static int init_incremental(zone_update_t *update, zone_t *zone)
 	update->change.soa_from =
 		node_create_rrset(update->zone->contents->apex, KNOT_RRTYPE_SOA);
 	if (update->change.soa_from == NULL) {
-		changeset_clear(&update->change);
 		zone_contents_free(&update->new_cont);
+		changeset_clear(&update->change);
 		return KNOT_ENOMEM;
 	}
 
@@ -129,7 +129,7 @@ const zone_node_t *zone_update_get_apex(zone_update_t *update)
 uint32_t zone_update_current_serial(zone_update_t *update)
 {
 	const zone_node_t *apex = zone_update_get_apex(update);
-	if (apex) {
+	if (apex != NULL) {
 		return knot_soa_serial(node_rdataset(apex, KNOT_RRTYPE_SOA));
 	} else {
 		return 0;
@@ -495,17 +495,13 @@ static int commit_incremental(conf_t *conf, zone_update_t *update,
 		conf_val_t val = conf_zone_get(conf, C_SERIAL_POLICY, update->zone->name);
 		ret = set_new_soa(update, conf_opt(&val));
 		if (ret != KNOT_EOK) {
-			update_rollback(&update->a_ctx);
-			update_free_zone(&new_contents);
-			changeset_clear(&update->change);
+			zone_update_clear(update);
 			return ret;
 		}
 
 		ret = apply_replace_soa(&update->a_ctx, &update->change);
 		if (ret != KNOT_EOK) {
-			update_rollback(&update->a_ctx);
-			update_free_zone(&new_contents);
-			changeset_clear(&update->change);
+			zone_update_clear(update);
 			return ret;
 		}
 	}
@@ -517,25 +513,19 @@ static int commit_incremental(conf_t *conf, zone_update_t *update,
 	if (dnssec_enable) {
 		ret = apply_prepare_to_sign(&update->a_ctx);
 		if (ret != KNOT_EOK) {
-			update_rollback(&update->a_ctx);
-			update_free_zone(&new_contents);
-			changeset_clear(&update->change);
+			zone_update_clear(update);
 			return ret;
 		}
 
 		ret = sign_update(update, new_contents);
 		if (ret != KNOT_EOK) {
-			update_rollback(&update->a_ctx);
-			update_free_zone(&new_contents);
-			changeset_clear(&update->change);
+			zone_update_clear(update);
 			return ret;
 		}
 	} else {
 		ret = apply_finalize(&update->a_ctx);
 		if (ret != KNOT_EOK) {
-			update_rollback(&update->a_ctx);
-			update_free_zone(&new_contents);
-			changeset_clear(&update->change);
+			zone_update_clear(update);
 			return ret;
 		}
 	}
@@ -543,8 +533,7 @@ static int commit_incremental(conf_t *conf, zone_update_t *update,
 	/* Write changes to journal if all went well. (DNSSEC merged) */
 	ret = zone_change_store(conf, update->zone, &update->change);
 	if (ret != KNOT_EOK) {
-		update_rollback(&update->a_ctx);
-		update_free_zone(&new_contents);
+		/* Recoverable error. */
 		return ret;
 	}
 
@@ -565,7 +554,11 @@ static int commit_full(conf_t *conf, zone_update_t *update, zone_contents_t **co
 		return KNOT_ESEMCHECK;
 	}
 
-	zone_contents_adjust_full(update->new_cont);
+	int ret = zone_contents_adjust_full(update->new_cont);
+	if (ret != KNOT_EOK) {
+		zone_update_clear(update);
+		return ret;
+	}
 
 	conf_val_t val = conf_zone_get(conf, C_DNSSEC_SIGNING, update->zone->name);
 	bool dnssec_enable = (update->flags & UPDATE_SIGN) && conf_bool(&val);
@@ -574,13 +567,13 @@ static int commit_full(conf_t *conf, zone_update_t *update, zone_contents_t **co
 	if (dnssec_enable) {
 		int ret = sign_update(update, update->new_cont);
 		if (ret != KNOT_EOK) {
-			update_rollback(&update->a_ctx);
+			zone_update_clear(update);
 			return ret;
 		}
 	}
 
-	update_cleanup(&update->a_ctx);
 	*contents_out = update->new_cont;
+
 	return KNOT_EOK;
 }
 
@@ -594,41 +587,41 @@ int zone_update_commit(conf_t *conf, zone_update_t *update)
 	zone_contents_t *new_contents = NULL;
 	if (update->flags & UPDATE_INCREMENTAL) {
 		ret = commit_incremental(conf, update, &new_contents);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
 	} else {
 		ret = commit_full(conf, update, &new_contents);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
+	}
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	/* If there is anything to change. */
+	if (new_contents == NULL) {
+		return KNOT_EOK;
 	}
 
+	/* Check the zone size. */
 	conf_val_t val = conf_zone_get(conf, C_MAX_ZONE_SIZE, update->zone->name);
 	int64_t size_limit = conf_int(&val);
 
-	if (new_contents != NULL && new_contents->size > size_limit) {
+	if (new_contents->size > size_limit) {
+		/* Recoverable error. */
 		return KNOT_EZONESIZE;
 	}
 
-	/* If there is anything to change */
-	if (new_contents != NULL) {
-		/* Switch zone contents. */
-		zone_contents_t *old_contents = zone_switch_contents(update->zone,
-		                                                     new_contents);
-
-		/* Sync RCU. */
-		synchronize_rcu();
-		if (update->flags & UPDATE_FULL) {
-			zone_contents_deep_free(&old_contents);
-			update->new_cont = NULL;
-		} else if (update->flags & UPDATE_INCREMENTAL) {
-			update_cleanup(&update->a_ctx);
-			update_free_zone(&old_contents);
-			update->new_cont = NULL;
-			changeset_clear(&update->change);
-		}
+	/* Switch zone contents. */
+	zone_contents_t *old_contents = zone_switch_contents(update->zone,
+	                                                     new_contents);
+
+	/* Sync RCU. */
+	synchronize_rcu();
+	if (update->flags & UPDATE_FULL) {
+		zone_contents_deep_free(&old_contents);
+	} else if (update->flags & UPDATE_INCREMENTAL) {
+		update_free_zone(&old_contents);
+		changeset_clear(&update->change);
 	}
+	update_cleanup(&update->a_ctx);
+	update->new_cont = NULL;
 
 	return KNOT_EOK;
 }
@@ -636,15 +629,12 @@ int zone_update_commit(conf_t *conf, zone_update_t *update)
 static int iter_init_tree_iters(zone_update_iter_t *it, zone_update_t *update,
                                 bool nsec3)
 {
-	zone_tree_t *tree;
-
 	/* Set zone iterator. */
 	zone_contents_t *_contents = update->new_cont;
 
 	/* Begin iteration. We can safely assume _contents is a valid pointer. */
-	tree = nsec3 ? _contents->nsec3_nodes : _contents->nodes;
-	hattrie_build_index(tree);
-	it->tree_it = hattrie_iter_begin(nsec3 ? _contents->nsec3_nodes : _contents->nodes, true);
+	zone_tree_t *tree = nsec3 ? _contents->nsec3_nodes : _contents->nodes;
+	it->tree_it = hattrie_iter_begin(tree);
 	if (it->tree_it == NULL) {
 		return KNOT_ENOMEM;
 	}
diff --git a/src/knot/zone/contents.c b/src/knot/zone/contents.c
index 3343db9c88d4e945c9455ee144a3f1bd2605a492..0b53747f47bb4fefd74e2c57dd1fdf7d77281718 100644
--- a/src/knot/zone/contents.c
+++ b/src/knot/zone/contents.c
@@ -114,22 +114,23 @@ static int create_nsec3_name(const zone_contents_t *zone,
 }
 
 /*! \brief Link pointers to additional nodes for this RRSet. */
-static int discover_additionals(struct rr_data *rr_data, zone_contents_t *zone)
+static int discover_additionals(const knot_dname_t *owner, struct rr_data *rr_data,
+                                zone_contents_t *zone)
 {
 	assert(rr_data != NULL);
 
-	const knot_rdataset_t *rrs = &rr_data->rrs;
+	/* Drop possible previous additional nodes. */
+	additional_clear(rr_data->additional);
 
-	/* Create new additional nodes. */
+	const knot_rdataset_t *rrs = &rr_data->rrs;
 	uint16_t rdcount = rrs->rr_count;
-	if (rr_data->additional) {
-		free(rr_data->additional);
-	}
-	rr_data->additional = malloc(rdcount * sizeof(zone_node_t *));
-	if (rr_data->additional == NULL) {
-		return KNOT_ENOMEM;
-	}
 
+	uint16_t mandatory_count = 0;
+	uint16_t others_count = 0;
+	glue_t mandatory[rdcount];
+	glue_t others[rdcount];
+
+	/* Scan new additional nodes. */
 	for (uint16_t i = 0; i < rdcount; i++) {
 		const knot_dname_t *dname = knot_rdata_name(rrs, i, rr_data->type);
 		const zone_node_t *node = NULL, *encloser = NULL, *prev = NULL;
@@ -143,7 +144,44 @@ static int discover_additionals(struct rr_data *rr_data, zone_contents_t *zone)
 			assert(node != NULL);
 		}
 
-		rr_data->additional[i] = (zone_node_t *)node;
+		if (node == NULL) {
+			continue;
+		}
+
+		glue_t *glue;
+		if ((node->flags & (NODE_FLAGS_DELEG | NODE_FLAGS_NONAUTH)) &&
+		    rr_data->type == KNOT_RRTYPE_NS &&
+		    knot_dname_in(owner, node->owner)) {
+			glue = &mandatory[mandatory_count++];
+			glue->optional = false;
+		} else {
+			glue = &others[others_count++];
+			glue->optional = true;
+		}
+		glue->node = node;
+		glue->ns_pos = i;
+	}
+
+	/* Store sorted additionals by the type, mandatory first. */
+	size_t total_count = mandatory_count + others_count;
+	if (total_count > 0) {
+		rr_data->additional = malloc(sizeof(additional_t));
+		if (rr_data->additional == NULL) {
+			return KNOT_ENOMEM;
+		}
+		rr_data->additional->count = total_count;
+
+		size_t size = total_count * sizeof(glue_t);
+		rr_data->additional->glues = malloc(size);
+		if (rr_data->additional->glues == NULL) {
+			free(rr_data->additional);
+			return KNOT_ENOMEM;
+		}
+
+		size_t mandatory_size = mandatory_count * sizeof(glue_t);
+		memcpy(rr_data->additional->glues, mandatory, mandatory_size);
+		memcpy(rr_data->additional->glues + mandatory_count, others,
+		       size - mandatory_size);
 	}
 
 	return KNOT_EOK;
@@ -305,7 +343,7 @@ static int adjust_additional(zone_node_t **tnode, void *data)
 	for(uint16_t i = 0; i < node->rrset_count; ++i) {
 		struct rr_data *rr_data = &node->rrs[i];
 		if (knot_rrtype_additional_needed(rr_data->type)) {
-			int ret = discover_additionals(rr_data, args->zone);
+			int ret = discover_additionals(node->owner, rr_data, args->zone);
 			if (ret != KNOT_EOK) {
 				return ret;
 			}
@@ -614,7 +652,7 @@ static int remove_rr(zone_contents_t *z, const knot_rrset_t *rr,
 
 static int recreate_normal_tree(const zone_contents_t *z, zone_contents_t *out)
 {
-	out->nodes = hattrie_dup(z->nodes, NULL);
+	out->nodes = hattrie_create(NULL);
 	if (out->nodes == NULL) {
 		return KNOT_ENOMEM;
 	}
@@ -634,7 +672,7 @@ static int recreate_normal_tree(const zone_contents_t *z, zone_contents_t *out)
 
 	out->apex = apex_cpy;
 
-	hattrie_iter_t *itt = hattrie_iter_begin(z->nodes, true);
+	hattrie_iter_t *itt = hattrie_iter_begin(z->nodes);
 	if (itt == NULL) {
 		return KNOT_ENOMEM;
 	}
@@ -662,19 +700,18 @@ static int recreate_normal_tree(const zone_contents_t *z, zone_contents_t *out)
 	}
 
 	hattrie_iter_free(itt);
-	hattrie_build_index(out->nodes);
 
 	return KNOT_EOK;
 }
 
 static int recreate_nsec3_tree(const zone_contents_t *z, zone_contents_t *out)
 {
-	out->nsec3_nodes = hattrie_dup(z->nsec3_nodes, NULL);
+	out->nsec3_nodes = hattrie_create(NULL);
 	if (out->nsec3_nodes == NULL) {
 		return KNOT_ENOMEM;
 	}
 
-	hattrie_iter_t *itt = hattrie_iter_begin(z->nsec3_nodes, false);
+	hattrie_iter_t *itt = hattrie_iter_begin(z->nsec3_nodes);
 	if (itt == NULL) {
 		return KNOT_ENOMEM;
 	}
@@ -697,7 +734,6 @@ static int recreate_nsec3_tree(const zone_contents_t *z, zone_contents_t *out)
 	}
 
 	hattrie_iter_free(itt);
-	hattrie_build_index(out->nsec3_nodes);
 
 	return KNOT_EOK;
 }
@@ -914,8 +950,7 @@ static int adjust_nodes(zone_tree_t *nodes, zone_adjust_arg_t *adjust_arg,
 	adjust_arg->first_node = NULL;
 	adjust_arg->previous_node = NULL;
 
-	hattrie_build_index(nodes);
-	int ret = zone_tree_apply_inorder(nodes, callback, adjust_arg);
+	int ret = zone_tree_apply(nodes, callback, adjust_arg);
 
 	if (adjust_arg->first_node) {
 		adjust_arg->first_node->prev = adjust_arg->previous_node;
@@ -1001,10 +1036,10 @@ int zone_contents_adjust_full(zone_contents_t *contents)
 	return contents_adjust(contents, true);
 }
 
-int zone_contents_tree_apply_inorder(zone_contents_t *zone,
-                                     zone_contents_apply_cb_t function, void *data)
+int zone_contents_apply(zone_contents_t *contents,
+                        zone_contents_apply_cb_t function, void *data)
 {
-	if (zone == NULL) {
+	if (contents == NULL) {
 		return KNOT_EINVAL;
 	}
 
@@ -1013,13 +1048,13 @@ int zone_contents_tree_apply_inorder(zone_contents_t *zone,
 		.data = data
 	};
 
-	return zone_tree_apply_inorder(zone->nodes, tree_apply_cb, &f);
+	return zone_tree_apply(contents->nodes, tree_apply_cb, &f);
 }
 
-int zone_contents_nsec3_apply_inorder(zone_contents_t *zone,
-                                      zone_contents_apply_cb_t function, void *data)
+int zone_contents_nsec3_apply(zone_contents_t *contents,
+                              zone_contents_apply_cb_t function, void *data)
 {
-	if (zone == NULL) {
+	if (contents == NULL) {
 		return KNOT_EINVAL;
 	}
 
@@ -1028,7 +1063,7 @@ int zone_contents_nsec3_apply_inorder(zone_contents_t *zone,
 		.data = data
 	};
 
-	return zone_tree_apply_inorder(zone->nsec3_nodes, tree_apply_cb, &f);
+	return zone_tree_apply(contents->nsec3_nodes, tree_apply_cb, &f);
 }
 
 int zone_contents_shallow_copy(const zone_contents_t *from, zone_contents_t **to)
@@ -1130,6 +1165,6 @@ bool zone_contents_is_empty(const zone_contents_t *zone)
 size_t zone_contents_measure_size(zone_contents_t *zone)
 {
 	zone->size = 0;
-	zone_contents_tree_apply_inorder(zone, measure_size, &zone->size);
+	zone_contents_apply(zone, measure_size, &zone->size);
 	return zone->size;
 }
diff --git a/src/knot/zone/contents.h b/src/knot/zone/contents.h
index 22fbf801b1a96bf779be3321f29bd9745fd6f72d..83aafe705f3eb1a0f3c48e0f950baae6524aa9e5 100644
--- a/src/knot/zone/contents.h
+++ b/src/knot/zone/contents.h
@@ -193,37 +193,23 @@ int zone_contents_adjust_full(zone_contents_t *contents);
 /*!
  * \brief Applies the given function to each regular node in the zone.
  *
- * This function uses in-order depth-first forward traversal, i.e. the function
- * is first recursively applied to left subtree, then to the root and then to
- * the right subtree.
- *
- * \note This implies that the zone is stored in a binary tree. Is there a way
- *       to make this traversal independent on the underlying structure?
- *
- * \param zone Nodes of this zone will be used as parameters for the function.
+ * \param contents Nodes of this zone will be used as parameters for the function.
  * \param function Function to be applied to each node of the zone.
  * \param data Arbitrary data to be passed to the function.
  */
-int zone_contents_tree_apply_inorder(zone_contents_t *zone,
-                                     zone_contents_apply_cb_t function, void *data);
+int zone_contents_apply(zone_contents_t *contents,
+                        zone_contents_apply_cb_t function, void *data);
 
 /*!
  * \brief Applies the given function to each NSEC3 node in the zone.
  *
- * This function uses in-order depth-first forward traversal, i.e. the function
- * is first recursively applied to left subtree, then to the root and then to
- * the right subtree.
- *
- * \note This implies that the zone is stored in a binary tree. Is there a way
- *       to make this traversal independent on the underlying structure?
- *
- * \param zone NSEC3 nodes of this zone will be used as parameters for the
- *             function.
+ * \param contents NSEC3 nodes of this zone will be used as parameters for the
+ *                 function.
  * \param function Function to be applied to each node of the zone.
  * \param data Arbitrary data to be passed to the function.
  */
-int zone_contents_nsec3_apply_inorder(zone_contents_t *zone,
-                                      zone_contents_apply_cb_t function, void *data);
+int zone_contents_nsec3_apply(zone_contents_t *contents,
+                              zone_contents_apply_cb_t function, void *data);
 
 /*!
  * \brief Creates a shallow copy of the zone (no stored data are copied).
diff --git a/src/knot/zone/node.c b/src/knot/zone/node.c
index 8fb1b9d3e71e6cb7663b936511c875356494d26b..0fdc16ba8f8152dfade7f3bf664f8580a59a2a4f 100644
--- a/src/knot/zone/node.c
+++ b/src/knot/zone/node.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -19,11 +19,21 @@
 #include "libknot/rrtype/rrsig.h"
 #include "contrib/mempattern.h"
 
+void additional_clear(additional_t *additional)
+{
+	if (additional == NULL) {
+		return;
+	}
+
+	free(additional->glues);
+	free(additional);
+}
+
 /*! \brief Clears allocated data in RRSet entry. */
 static void rr_data_clear(struct rr_data *data, knot_mm_t *mm)
 {
 	knot_rdataset_clear(&data->rrs, mm);
-	free(data->additional);
+	additional_clear(data->additional);
 }
 
 /*! \brief Clears allocated data in RRSet entry. */
diff --git a/src/knot/zone/node.h b/src/knot/zone/node.h
index 9ed19273efe5318d531465ed526bfe5b4af25454..97df8b1b4e20712963cd3434af723d02a780ebeb 100644
--- a/src/knot/zone/node.h
+++ b/src/knot/zone/node.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -54,11 +54,24 @@ typedef struct zone_node {
 	uint8_t flags; /*!< \ref node_flags enum. */
 } zone_node_t;
 
+/*!< \brief Glue node context. */
+typedef struct {
+	const zone_node_t *node; /*!< Glue node. */
+	uint16_t ns_pos; /*!< Corresponding NS record position (for compression). */
+	bool optional; /*!< Optional glue indicator. */
+} glue_t;
+
+/*!< \brief Additional data. */
+typedef struct {
+	glue_t *glues; /*!< Glue data. */
+	uint16_t count; /*!< Number of glue nodes. */
+} additional_t;
+
 /*!< \brief Structure storing RR data. */
 struct rr_data {
-	uint16_t type; /*!< \brief RR type of data. */
-	knot_rdataset_t rrs; /*!< \brief Data of given type. */
-	zone_node_t **additional; /*!< \brief Additional nodes with glues. */
+	uint16_t type; /*!< RR type of data. */
+	knot_rdataset_t rrs; /*!< Data of given type. */
+	additional_t *additional; /*!< Additional nodes with glues. */
 };
 
 /*! \brief Flags used to mark nodes with some property. */
@@ -77,6 +90,13 @@ enum node_flags {
 	NODE_FLAGS_WILDCARD_CHILD =  1 << 4
 };
 
+/*!
+ * \brief Clears additional structure.
+ *
+ * \param additional  Additional to clear.
+ */
+void additional_clear(additional_t *additional);
+
 /*!
  * \brief Creates and initializes new node structure.
  *
diff --git a/src/knot/zone/semantic-check.c b/src/knot/zone/semantic-check.c
index 382524b450f198e7f048772ab94fa991bd854d63..43ca35c94400db3ad6d7f17694f4e6af8c84f941 100644
--- a/src/knot/zone/semantic-check.c
+++ b/src/knot/zone/semantic-check.c
@@ -409,7 +409,7 @@ static int check_rrsig(const zone_node_t *node, semchecks_data_t *data)
 static void bitmap_add_all_node_rrsets(dnssec_nsec_bitmap_t *bitmap,
                                        const zone_node_t *node)
 {
-	bool deleg = node->flags && NODE_FLAGS_DELEG;
+	bool deleg = node->flags & NODE_FLAGS_DELEG;
 	for (int i = 0; i < node->rrset_count; i++) {
 		knot_rrset_t rr = node_rrset_at(node, i);
 		if (deleg && (rr.type != KNOT_RRTYPE_NS &&
@@ -823,6 +823,7 @@ int zone_do_sem_checks(zone_contents_t *zone, bool optional,
 		.fatal_error = false,
 		.level = MANDATORY,
 		};
+
 	if (optional) {
 		data.level |= OPTIONAL;
 		if (zone_contents_is_signed(zone)) {
@@ -834,9 +835,7 @@ int zone_do_sem_checks(zone_contents_t *zone, bool optional,
 		}
 	}
 
-	int ret = zone_contents_tree_apply_inorder(zone, do_checks_in_tree,
-	                                           &data);
-
+	int ret = zone_contents_apply(zone, do_checks_in_tree, &data);
 	if (ret != KNOT_EOK) {
 		return ret;
 	}
diff --git a/src/knot/zone/zone-dump.c b/src/knot/zone/zone-dump.c
index a08d93f1cc94fb01cc7b50e168cdc866deb42477..f72ea66c27c9188d658a76d08b2761fb6ec1eaa7 100644
--- a/src/knot/zone/zone-dump.c
+++ b/src/knot/zone/zone-dump.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -33,6 +33,7 @@ typedef struct {
 	bool     dump_nsec;
 	const knot_dname_t *origin;
 	const knot_dump_style_t *style;
+	const char *first_comment;
 } dump_params_t;
 
 static int apex_node_dump_text(zone_node_t *node, dump_params_t *params)
@@ -42,9 +43,10 @@ static int apex_node_dump_text(zone_node_t *node, dump_params_t *params)
 
 	// Dump SOA record as a first.
 	if (!params->dump_nsec) {
-		if (knot_rrset_txt_dump(&soa, params->buf, params->buflen,
-		                        &soa_style) < 0) {
-			return KNOT_ENOMEM;
+		int ret = knot_rrset_txt_dump(&soa, &params->buf, &params->buflen,
+		                              &soa_style);
+		if (ret < 0) {
+			return ret;
 		}
 		params->rr_count += soa.rrs.rr_count;
 		fprintf(params->file, "%s", params->buf);
@@ -65,9 +67,10 @@ static int apex_node_dump_text(zone_node_t *node, dump_params_t *params)
 			break;
 		}
 
-		if (knot_rrset_txt_dump(&rrset, params->buf, params->buflen,
-		                        params->style) < 0) {
-			return KNOT_ENOMEM;
+		int ret = knot_rrset_txt_dump(&rrset, &params->buf, &params->buflen,
+		                              params->style);
+		if (ret < 0) {
+			return ret;
 		}
 		params->rr_count +=  rrset.rrs.rr_count;
 		fprintf(params->file, "%s", params->buf);
@@ -114,9 +117,16 @@ static int node_dump_text(zone_node_t *node, void *data)
 			break;
 		}
 
-		if (knot_rrset_txt_dump(&rrset, params->buf, params->buflen,
-		                        params->style) < 0) {
-			return KNOT_ENOMEM;
+		// Dump block comment if available.
+		if (params->first_comment != NULL) {
+			fprintf(params->file, "%s", params->first_comment);
+			params->first_comment = NULL;
+		}
+
+		int ret = knot_rrset_txt_dump(&rrset, &params->buf, &params->buflen,
+		                              params->style);
+		if (ret < 0) {
+			return ret;
 		}
 		params->rr_count += rrset.rrs.rr_count;
 		fprintf(params->file, "%s", params->buf);
@@ -126,7 +136,7 @@ static int node_dump_text(zone_node_t *node, void *data)
 	return KNOT_EOK;
 }
 
-int zone_dump_text(zone_contents_t *zone, FILE *file)
+int zone_dump_text(zone_contents_t *zone, FILE *file, bool comments)
 {
 	if (zone == NULL || file == NULL) {
 		return KNOT_EINVAL;
@@ -138,89 +148,79 @@ int zone_dump_text(zone_contents_t *zone, FILE *file)
 		return KNOT_ENOMEM;
 	}
 
-	fprintf(file, ";; Zone dump (Knot DNS %s)\n", PACKAGE_VERSION);
+	if (comments) {
+		fprintf(file, ";; Zone dump (Knot DNS %s)\n", PACKAGE_VERSION);
+	}
 
 	// Set structure with parameters.
 	zone_node_t *apex = zone->apex;
-	dump_params_t params;
-	params.file = file;
-	params.buf = buf;
-	params.buflen = DUMP_BUF_LEN;
-	params.rr_count = 0;
-	params.origin = apex->owner;
-	params.style = &KNOT_DUMP_STYLE_DEFAULT;
-
-	int ret;
+	dump_params_t params = {
+		.file = file,
+		.buf = buf,
+		.buflen = DUMP_BUF_LEN,
+		.rr_count = 0,
+		.origin = apex->owner,
+		.style = &KNOT_DUMP_STYLE_DEFAULT,
+		.dump_rrsig = false,
+		.dump_nsec = false
+	};
+
+	// Dump standard zone records without RRSIGS.
+	int ret = zone_contents_apply(zone, node_dump_text, &params);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
 
-	// Dump standard zone records without rrsigs.
-	params.dump_rrsig = false;
+	// Dump RRSIG records if available.
+	params.dump_rrsig = true;
 	params.dump_nsec = false;
-	ret = zone_contents_tree_apply_inorder(zone, node_dump_text, &params);
+	params.first_comment = comments ? ";; DNSSEC signatures\n" : NULL;
+	ret = zone_contents_apply(zone, node_dump_text, &params);
 	if (ret != KNOT_EOK) {
 		return ret;
 	}
 
-	// Dump DNSSEC signatures if secured.
-	if (zone_contents_is_signed(zone)) {
-		fprintf(file, ";; DNSSEC signatures\n");
-
-		// Dump rrsig records.
-		params.dump_rrsig = true;
-		params.dump_nsec = false;
-		ret = zone_contents_tree_apply_inorder(zone, node_dump_text,
-		                                       &params);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
+	// Dump NSEC chain if available.
+	params.dump_rrsig = false;
+	params.dump_nsec = true;
+	params.first_comment = comments ? ";; DNSSEC NSEC chain\n" : NULL;
+	ret = zone_contents_apply(zone, node_dump_text, &params);
+	if (ret != KNOT_EOK) {
+		return ret;
 	}
 
 	// Dump NSEC3 chain if available.
-	if (knot_is_nsec3_enabled(zone)) {
-		fprintf(file, ";; DNSSEC NSEC3 chain\n");
-
-		params.dump_rrsig = false;
-		params.dump_nsec = true;
-		ret = zone_contents_nsec3_apply_inorder(zone, node_dump_text,
-		                                        &params);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
-
-		fprintf(file, ";; DNSSEC NSEC3 signatures\n");
-
-		params.dump_rrsig = true;
-		params.dump_nsec = false;
-		ret = zone_contents_nsec3_apply_inorder(zone, node_dump_text,
-		                                        &params);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
-	} else if (zone_contents_is_signed(zone)) {
-		fprintf(file, ";; DNSSEC NSEC chain\n");
-
-		// Dump nsec records.
-		params.dump_rrsig = false;
-		params.dump_nsec = true;
-		ret = zone_contents_tree_apply_inorder(zone, node_dump_text,
-		                                       &params);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
+	params.dump_rrsig = false;
+	params.dump_nsec = true;
+	params.first_comment = comments ? ";; DNSSEC NSEC3 chain\n" : NULL;
+	ret = zone_contents_nsec3_apply(zone, node_dump_text, &params);
+	if (ret != KNOT_EOK) {
+		return ret;
 	}
 
-	// Create formated date-time string.
-	time_t now = time(NULL);
-	struct tm tm;
-	localtime_r(&now, &tm);
-	char date[64];
-	strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S %Z", &tm);
+	params.dump_rrsig = true;
+	params.dump_nsec = false;
+	params.first_comment = comments ? ";; DNSSEC NSEC3 signatures\n" : NULL;
+	ret = zone_contents_nsec3_apply(zone, node_dump_text, &params);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
 
-	// Dump trailing statistics.
-	fprintf(file, ";; Written %"PRIu64" records\n"
-	              ";; Time %s\n",
-	        params.rr_count, date);
+	if (comments) {
+		// Create formatted date-time string.
+		time_t now = time(NULL);
+		struct tm tm;
+		localtime_r(&now, &tm);
+		char date[64];
+		strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S %Z", &tm);
+
+		// Dump trailing statistics.
+		fprintf(file, ";; Written %"PRIu64" records\n"
+		              ";; Time %s\n",
+	        	params.rr_count, date);
+	}
 
-	free(buf);
+	free(params.buf); // params.buf may be != buf because of knot_rrset_txt_dump_dynamic()
 
 	return KNOT_EOK;
 }
diff --git a/src/knot/zone/zone-dump.h b/src/knot/zone/zone-dump.h
index cde1f5e8695e62cb12e9effdf85ecb11d11b84ef..e9d8be83ce4ab5056e8492a8e962e4752c137cd8 100644
--- a/src/knot/zone/zone-dump.h
+++ b/src/knot/zone/zone-dump.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -29,12 +29,13 @@
 /*!
  * \brief Dumps given zone to text file.
  *
- * \param zone Zone to be saved.
- * \param file File to write to.
+ * \param zone      Zone to be saved.
+ * \param file      File to write to.
+ * \param comments  Add separating comments indicator.
  *
  * \retval KNOT_EOK on success.
  * \retval < 0 if error.
  */
-int zone_dump_text(zone_contents_t *zone, FILE *file);
+int zone_dump_text(zone_contents_t *zone, FILE *file, bool comments);
 
 /*! @} */
diff --git a/src/knot/zone/zone-load.c b/src/knot/zone/zone-load.c
index c683c7f41bc14884f81bca1093dfe5ea3cc2f9cd..129c65f18468e4a076b4a0f4ca17b5590e9fec1d 100644
--- a/src/knot/zone/zone-load.c
+++ b/src/knot/zone/zone-load.c
@@ -15,7 +15,8 @@
 */
 
 #include "knot/common/log.h"
-#include "knot/server/journal.h"
+#include "knot/journal/journal.h"
+#include "knot/journal/old_journal.h"
 #include "knot/zone/zone-diff.h"
 #include "knot/zone/zone-load.h"
 #include "knot/zone/zonefile.h"
@@ -90,41 +91,96 @@ int zone_load_check(conf_t *conf, zone_contents_t *contents)
 	return KNOT_EOK;
 }
 
+/*!
+ * \brief If old journal exists, warn the user and append the changes to chgs
+ *
+ * \todo Remove in the future together with journal/old_journal.[ch] and conf_old_journalfile()
+ */
+static void try_old_journal(conf_t *conf, zone_t *zone, uint32_t zone_c_serial, list_t *chgs)
+{
+	list_t old_chgs;
+	init_list(&old_chgs);
+
+	// fetch old journal name
+	char *jfile = conf_old_journalfile(conf, zone->name);
+	if (jfile == NULL) {
+		return;
+	}
+
+	if (!old_journal_exists(jfile)) {
+		goto toj_end;
+	}
+	log_zone_notice(zone->name, "journal, obsolete exists, file '%s'", jfile);
+
+	// determine serial to load from
+	if (!EMPTY_LIST(*chgs)) {
+		changeset_t *lastch = TAIL(*chgs);
+		zone_c_serial = knot_soa_serial(&lastch->soa_to->rrs);
+	}
+
+	// load changesets from old journal
+	int ret = old_journal_load_changesets(jfile, zone->name, &old_chgs,
+	                                      zone_c_serial, zone_c_serial - 1);
+	if (ret != KNOT_ERANGE && ret != KNOT_ENOENT && ret != KNOT_EOK) {
+		log_zone_warning(zone->name, "journal, failed to load obsolete history (%s)",
+		                 knot_strerror(ret));
+		goto toj_end;
+	}
+
+	if (EMPTY_LIST(old_chgs)) {
+		goto toj_end;
+	}
+	log_zone_notice(zone->name, "journal, loaded obsolete history since serial '%u'",
+	                zone_c_serial);
+
+	// store them to new journal
+	ret = zone_changes_store(conf, zone, &old_chgs);
+	if (ret != KNOT_EOK) {
+		log_zone_warning(zone->name, "journal, failed to store obsolete history (%s)",
+		                 knot_strerror(ret));
+		goto toj_end;
+	}
+
+	// append them to chgs
+	changeset_t *ch, *nxt;
+	WALK_LIST_DELSAFE(ch, nxt, old_chgs) {
+		rem_node(&ch->n);
+		add_tail(chgs, &ch->n);
+	}
+
+toj_end:
+	changesets_free(&old_chgs);
+	free(jfile);
+}
+
 int zone_load_journal(conf_t *conf, zone_t *zone, zone_contents_t *contents)
 {
 	if (conf == NULL || zone == NULL || contents == NULL) {
 		return KNOT_EINVAL;
 	}
 
-	/* Check if journal is used and zone is not empty. */
-	char *journal_name = conf_journalfile(conf, zone->name);
-	if (!journal_exists(journal_name) ||
-	    zone_contents_is_empty(contents)) {
-		free(journal_name);
+	/* Check if journal is used (later in zone_changes_load() and zone is not empty. */
+	if (zone_contents_is_empty(contents)) {
 		return KNOT_EOK;
 	}
 
 	/* Fetch SOA serial. */
 	uint32_t serial = zone_contents_serial(contents);
 
-	/*! \todo Check what should be the upper bound. */
+	/* Load journal */
 	list_t chgs;
 	init_list(&chgs);
+	int ret = zone_changes_load(conf, zone, &chgs, serial);
+	if (ret != KNOT_EOK && ret != KNOT_ENOENT) {
+		changesets_free(&chgs);
+		return ret;
+	}
 
-	pthread_mutex_lock(&zone->journal_lock);
-	int ret = journal_load_changesets(journal_name, zone, &chgs, serial,
-	                                  serial - 1);
-	pthread_mutex_unlock(&zone->journal_lock);
-	free(journal_name);
+	/* Load old journal (to be obsoleted) */
+	try_old_journal(conf, zone, serial, &chgs);
 
-	if ((ret != KNOT_EOK && ret != KNOT_ERANGE) || EMPTY_LIST(chgs)) {
-		changesets_free(&chgs);
-		/* Absence of records is not an error. */
-		if (ret == KNOT_ENOENT) {
-			return KNOT_EOK;
-		} else {
-			return ret;
-		}
+	if (EMPTY_LIST(chgs)) {
+		return KNOT_EOK;
 	}
 
 	/* Apply changesets. */
@@ -136,7 +192,7 @@ int zone_load_journal(conf_t *conf, zone_t *zone, zone_contents_t *contents)
 		log_zone_info(zone->name, "changes from journal applied %u -> %u",
 		              serial, zone_contents_serial(contents));
 	} else {
-		log_zone_error(zone->name, "changes from journal applied %u -> %u (%s)",
+		log_zone_error(zone->name, "failed to apply journal changes %u -> %u (%s)",
 		               serial, zone_contents_serial(contents),
 		               knot_strerror(ret));
 	}
diff --git a/src/knot/zone/zone-load.h b/src/knot/zone/zone-load.h
index 5ee80dc6509af7dca3523d70570fbcf00ddaae74..ccd81adc1547835f5b28244fd10bfc694c4c4600 100644
--- a/src/knot/zone/zone-load.h
+++ b/src/knot/zone/zone-load.h
@@ -42,6 +42,8 @@ int zone_load_check(conf_t *conf, zone_contents_t *contents);
 /*!
  * \brief Update zone contents from the journal.
  *
+ * \warning If error, the zone is in inconsitent state and should be freed.
+ *
  * \param conf
  * \param zone
  * \param contents
diff --git a/src/knot/zone/zone-tree.c b/src/knot/zone/zone-tree.c
index dbcc9f68988cf55d240f9c10534df6b08cceae85..47a559bfab881c672bf2ba80c3e70264c7b7c097 100644
--- a/src/knot/zone/zone-tree.c
+++ b/src/knot/zone/zone-tree.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -24,17 +24,21 @@
 
 zone_tree_t* zone_tree_create()
 {
-	return hattrie_create();
+	return hattrie_create(NULL);
 }
 
-size_t zone_tree_weight(const zone_tree_t* tree)
+size_t zone_tree_count(const zone_tree_t *tree)
 {
+	if (tree == NULL) {
+		return 0;
+	}
+
 	return hattrie_weight(tree);
 }
 
 int zone_tree_is_empty(const zone_tree_t *tree)
 {
-	return zone_tree_weight(tree) == 0;
+	return zone_tree_count(tree) == 0;
 }
 
 int zone_tree_insert(zone_tree_t *tree, zone_node_t *node)
@@ -96,22 +100,23 @@ int zone_tree_get_less_or_equal(zone_tree_t *tree,
 	if (fval) {
 		*found = (zone_node_t *)(*fval);
 	}
+
 	int exact_match = 0;
-	if (ret == 0) {
+	if (ret == KNOT_EOK) {
 		if (fval) {
 			*previous = (*found)->prev;
 		}
 		exact_match = 1;
-	} else if (ret < 0) {
+	} else if (ret == 1) {
 		*previous = *found;
 		*found = NULL;
-	} else if (ret > 0) {
+	} else {
 		/* Previous should be the rightmost node.
 		 * For regular zone it is the node left of apex, but for some
 		 * cases like NSEC3, there is no such sort of thing (name wise).
 		 */
 		/*! \todo We could store rightmost node in zonetree probably. */
-		hattrie_iter_t *i = hattrie_iter_begin(tree, 1);
+		hattrie_iter_t *i = hattrie_iter_begin(tree);
 		*previous = *(zone_node_t **)hattrie_iter_val(i); /* leftmost */
 		*previous = (*previous)->prev; /* rightmost */
 		*found = NULL;
@@ -143,7 +148,7 @@ int zone_tree_remove(zone_tree_t *tree,
 		*removed = (zone_node_t *)(*rval);
 	}
 
-	hattrie_del(tree, (char*)lf+1, *lf);
+	hattrie_del(tree, (char*)lf+1, *lf, NULL);
 	return KNOT_EOK;
 }
 
@@ -186,36 +191,7 @@ int zone_tree_delete_empty_node(zone_tree_t *tree, zone_node_t *node)
 	return KNOT_EOK;
 }
 
-int zone_tree_apply_inorder(zone_tree_t *tree,
-                            zone_tree_apply_cb_t function,
-                            void *data)
-{
-	if (function == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	if (zone_tree_is_empty(tree)) {
-		return KNOT_EOK;
-	}
-
-	int result = KNOT_EOK;
-
-	hattrie_iter_t *i = hattrie_iter_begin(tree, 1);
-	while(!hattrie_iter_finished(i)) {
-		result = function((zone_node_t **)hattrie_iter_val(i), data);
-		if (result != KNOT_EOK) {
-			break;
-		}
-		hattrie_iter_next(i);
-	}
-	hattrie_iter_free(i);
-
-	return result;
-}
-
-int zone_tree_apply(zone_tree_t *tree,
-                    zone_tree_apply_cb_t function,
-                    void *data)
+int zone_tree_apply(zone_tree_t *tree, zone_tree_apply_cb_t function, void *data)
 {
 	if (function == NULL) {
 		return KNOT_EINVAL;
@@ -225,7 +201,7 @@ int zone_tree_apply(zone_tree_t *tree,
 		return KNOT_EOK;
 	}
 
-	return hattrie_apply_rev(tree, (int (*)(value_t*,void*))function, data);
+	return hattrie_apply_rev(tree, (int (*)(value_t *, void *))function, data);
 }
 
 void zone_tree_free(zone_tree_t **tree)
diff --git a/src/knot/zone/zone-tree.h b/src/knot/zone/zone-tree.h
index ad20590182cee77d442f8d72d351a88c965e7085..ee742b63d55aa9db3cb1f7a05361914c2f948b74 100644
--- a/src/knot/zone/zone-tree.h
+++ b/src/knot/zone/zone-tree.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -42,11 +42,11 @@ typedef int (*zone_tree_apply_cb_t)(zone_node_t **node, void *data);
 zone_tree_t* zone_tree_create(void);
 
 /*!
- * \brief Return weight of the zone tree (number of nodes).
+ * \brief Return number of nodes in the zone tree.
  * \param tree Zone tree.
  * \return number of nodes in tree.
  */
-size_t zone_tree_weight(const zone_tree_t* tree);
+size_t zone_tree_count(const zone_tree_t *tree);
 
 /*!
  * \brief Checks if the zone tree is empty.
@@ -130,29 +130,7 @@ int zone_tree_remove(zone_tree_t *tree,
 int zone_tree_delete_empty_node(zone_tree_t *tree, zone_node_t *node);
 
 /*!
- * \brief Applies the given function to each node in the zone.
- *
- * This function uses in-order depth-first forward traversal, i.e. the function
- * is first recursively applied to left subtree, then to the root and then to
- * the right subtree.
- *
- * \note This implies that the zone is stored in a binary tree. Is there a way
- *       to make this traversal independent on the underlying structure?
- *
- * \param tree Zone tree to apply the function to.
- * \param function Function to be applied to each node of the zone.
- * \param data Arbitrary data to be passed to the function.
- *
- * \retval KNOT_EOK
- * \retval KNOT_EINVAL
- */
-int zone_tree_apply_inorder(zone_tree_t *tree,
-                            zone_tree_apply_cb_t function,
-                            void *data);
-
-/*!
- * \brief Applies the given function to each node in the zone. No
- *        specific order is maintained.
+ * \brief Applies the given function to each node in the zone in order.
  *
  * \param tree Zone tree to apply the function to.
  * \param function Function to be applied to each node of the zone.
@@ -161,8 +139,7 @@ int zone_tree_apply_inorder(zone_tree_t *tree,
  * \retval KNOT_EOK
  * \retval KNOT_EINVAL
  */
-int zone_tree_apply(zone_tree_t *tree,
-                    zone_tree_apply_cb_t function, void *data);
+int zone_tree_apply(zone_tree_t *tree, zone_tree_apply_cb_t function, void *data);
 
 /*!
  * \brief Destroys the zone tree, not touching the saved data.
diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c
index f39ce28d373dc88c6bfcb649da3d5af920af722c..ece749f3d90134b76064f6a542c7da4f87ee7b24 100644
--- a/src/knot/zone/zone.c
+++ b/src/knot/zone/zone.c
@@ -33,15 +33,113 @@
 #include "contrib/ucw/lists.h"
 #include "contrib/ucw/mempool.h"
 
-#define JOURNAL_SUFFIX	".diff.db"
+#define JOURNAL_LOCK_MUTEX (&zone->journal_lock)
+#define JOURNAL_LOCK_RW pthread_mutex_lock(JOURNAL_LOCK_MUTEX);
+#define JOURNAL_UNLOCK_RW pthread_mutex_unlock(JOURNAL_LOCK_MUTEX);
 
-static void free_ddns_queue(zone_t *z)
+static void free_ddns_queue(zone_t *zone)
 {
 	ptrnode_t *node = NULL, *nxt = NULL;
-	WALK_LIST_DELSAFE(node, nxt, z->ddns_queue) {
+	WALK_LIST_DELSAFE(node, nxt, zone->ddns_queue) {
 		knot_request_free(node->d, NULL);
 	}
-	ptrlist_free(&z->ddns_queue, NULL);
+	ptrlist_free(&zone->ddns_queue, NULL);
+}
+
+/*! \brief Open journal for zone. */
+static int open_journal(zone_t *zone)
+{
+	assert(zone);
+
+	int ret = journal_open(zone->journal, zone->journal_db, zone->name);
+	if (ret != KNOT_EOK) {
+		log_zone_error(zone->name, "failed to open journal '%s'",
+		               (*zone->journal_db)->path);
+	}
+
+	return ret;
+}
+
+/*! \brief Close the zone journal. */
+static void close_journal(zone_t *zone)
+{
+	assert(zone);
+	journal_close(zone->journal);
+}
+
+static int flush_journal(conf_t *conf, zone_t *zone)
+{
+	/*! @note Function expects nobody will change zone contents meanwile. */
+
+	assert(zone);
+
+	bool force = zone->flags & ZONE_FORCE_FLUSH;
+	zone->flags &= ~ZONE_FORCE_FLUSH;
+
+	if (zone_contents_is_empty(zone->contents)) {
+		return KNOT_EINVAL;
+	}
+
+	/* Check for disabled zonefile synchronization. */
+	conf_val_t val = conf_zone_get(conf, C_ZONEFILE_SYNC, zone->name);
+	if (conf_int(&val) < 0 && !force) {
+		return KNOT_EOK;
+	}
+
+	/* Check for difference against zonefile serial. */
+	zone_contents_t *contents = zone->contents;
+	uint32_t serial_to = zone_contents_serial(contents);
+	if (!force && zone->zonefile.exists && zone->zonefile.serial == serial_to) {
+		return KNOT_EOK; /* No differences. */
+	}
+
+	char *zonefile = conf_zonefile(conf, zone->name);
+
+	/* Synchronize journal. */
+	int ret = zonefile_write(zonefile, contents);
+	if (ret != KNOT_EOK) {
+		log_zone_warning(zone->name, "failed to update zone file (%s)",
+		                 knot_strerror(ret));
+		free(zonefile);
+		return ret;
+	}
+
+	if (zone->zonefile.exists) {
+		log_zone_info(zone->name, "zone file updated, serial %u -> %u",
+		              zone->zonefile.serial, serial_to);
+	} else {
+		log_zone_info(zone->name, "zone file updated, serial %u",
+		              serial_to);
+	}
+
+	/* Update zone version. */
+	struct stat st;
+	if (stat(zonefile, &st) < 0) {
+		log_zone_warning(zone->name, "failed to update zone file (%s)",
+		                 knot_strerror(knot_map_errno()));
+		free(zonefile);
+		return KNOT_EACCES;
+	}
+
+	free(zonefile);
+
+	/* Update zone file serial and journal. */
+	zone->zonefile.exists = true;
+	zone->zonefile.mtime = st.st_mtime;
+	zone->zonefile.serial = serial_to;
+
+	/* Flush journal. */
+	if (zone->journal && journal_exists(zone->journal_db, zone->name)) {
+		ret = journal_flush(zone->journal);
+		if (ret != KNOT_EOK) {
+			return ret;
+		}
+	}
+
+	/* Trim extra heap. */
+	mem_trim();
+
+	return ret;
 }
 
 zone_t* zone_new(const knot_dname_t *name)
@@ -58,6 +156,14 @@ zone_t* zone_new(const knot_dname_t *name)
 		return NULL;
 	}
 
+	// Journal
+	zone->journal = journal_new();
+	if (zone->journal == NULL) {
+		knot_dname_free(&zone->name, NULL);
+		free(zone);
+		return NULL;
+	}
+
 	// DDNS
 	pthread_mutex_init(&zone->ddns_lock, NULL);
 	zone->ddns_queue_size = 0;
@@ -97,10 +203,14 @@ void zone_free(zone_t **zone_ptr)
 
 	zone_t *zone = *zone_ptr;
 
+	close_journal(zone);
+
 	zone_events_deinit(zone);
 
 	knot_dname_free(&zone->name, NULL);
 
+	journal_free(&zone->journal);
+
 	free_ddns_queue(zone);
 	pthread_mutex_destroy(&zone->ddns_lock);
 	pthread_mutex_destroy(&zone->journal_lock);
@@ -127,24 +237,23 @@ int zone_change_store(conf_t *conf, zone_t *zone, changeset_t *change)
 		return KNOT_EINVAL;
 	}
 
-	conf_val_t val = conf_zone_get(conf, C_MAX_JOURNAL_SIZE, zone->name);
-	int64_t ixfr_fslimit = conf_int(&val);
-	char *journal_file = conf_journalfile(conf, zone->name);
+	JOURNAL_LOCK_RW
 
-	pthread_mutex_lock(&zone->journal_lock);
-	int ret = journal_store_changeset(change, journal_file, ixfr_fslimit);
-	if (ret == KNOT_EBUSY) {
-		log_zone_notice(zone->name, "journal is full, flushing");
+	int ret = open_journal(zone);
+	if (ret == KNOT_EOK) {
+		ret = journal_store_changeset(zone->journal, change);
+		if (ret == KNOT_EBUSY) {
+			log_zone_notice(zone->name, "journal is full, flushing");
 
-		/* Transaction rolled back, journal released, we may flush. */
-		ret = zone_flush_journal(conf, zone);
-		if (ret == KNOT_EOK) {
-			ret = journal_store_changeset(change, journal_file, ixfr_fslimit);
+			/* Transaction rolled back, journal released, we may flush. */
+			ret = flush_journal(conf, zone);
+			if (ret == KNOT_EOK) {
+				ret = journal_store_changeset(zone->journal, change);
+			}
 		}
 	}
-	pthread_mutex_unlock(&zone->journal_lock);
 
-	free(journal_file);
+	JOURNAL_UNLOCK_RW
 
 	return ret;
 }
@@ -155,32 +264,68 @@ int zone_changes_store(conf_t *conf, zone_t *zone, list_t *chgs)
 		return KNOT_EINVAL;
 	}
 
-	conf_val_t val = conf_zone_get(conf, C_MAX_JOURNAL_SIZE, zone->name);
-	int64_t ixfr_fslimit = conf_int(&val);
-	char *journal_file = conf_journalfile(conf, zone->name);
+	JOURNAL_LOCK_RW
 
-	pthread_mutex_lock(&zone->journal_lock);
-	int ret = journal_store_changesets(chgs, journal_file, ixfr_fslimit);
-	if (ret == KNOT_EBUSY) {
-		log_zone_notice(zone->name, "journal is full, flushing");
+	int ret = open_journal(zone);
+	if (ret == KNOT_EOK) {
+		ret = journal_store_changesets(zone->journal, chgs);
+		if (ret == KNOT_EBUSY) {
+			log_zone_notice(zone->name, "journal is full, flushing");
 
-		/*
-		 * TODO: Check zone_flush_journal() outside event_flush()
-		 *
-		 * zone->timers.last flush needs to be updated and flush
-		 * event rescheduled
-		 */
+			/*
+			 * TODO: Check where zone_flush_journal is used beyond
+			 * event_flush(). zone->timers.last flush needs to be
+			 * updated and flush event rescheduled.
+			 *
+			 * The code bellow does only half of it.
+			 */
 
-		/* Transaction rolled back, journal released, we may flush. */
-		ret = zone_flush_journal(conf, zone);
-		if (ret == KNOT_EOK) {
-			ret = journal_store_changesets(chgs, journal_file, ixfr_fslimit);
+			/* Transaction rolled back, journal released, we may flush. */
+			ret = flush_journal(conf, zone);
+			if (ret == KNOT_EOK) {
+				zone->timers.last_flush = time(NULL);
+				ret = journal_store_changesets(zone->journal, chgs);
+			}
 		}
+	}
+
+	JOURNAL_UNLOCK_RW
+
+	return ret;
+}
 
+int zone_changes_load(conf_t *conf, zone_t *zone, list_t *dst, uint32_t from)
+{
+	if (conf == NULL || zone == NULL || dst == NULL) {
+		return KNOT_EINVAL;
 	}
-	pthread_mutex_unlock(&zone->journal_lock);
 
-	free(journal_file);
+	int ret = KNOT_ENOENT;
+
+	if (journal_exists(zone->journal_db, zone->name)) {
+		ret = open_journal(zone);
+	}
+
+	if (ret == KNOT_EOK) {
+		ret = journal_load_changesets(zone->journal, dst, from);
+	}
+
+	return ret;
+}
+
+int zone_flush_journal(conf_t *conf, zone_t *zone)
+{
+	if (conf == NULL || zone == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	JOURNAL_LOCK_RW
+
+	// NO open_journal() here.
+
+	int ret = flush_journal(conf, zone);
+
+	JOURNAL_UNLOCK_RW
 
 	return ret;
 }
@@ -343,76 +488,6 @@ int zone_master_try(conf_t *conf, zone_t *zone, zone_master_cb callback,
 	return success ? KNOT_EOK : KNOT_ENOMASTER;
 }
 
-int zone_flush_journal(conf_t *conf, zone_t *zone)
-{
-	if (conf == NULL || zone == NULL || zone_contents_is_empty(zone->contents)) {
-		return KNOT_EINVAL;
-	}
-
-	bool force = zone->flags & ZONE_FORCE_FLUSH;
-	zone->flags &= ~ZONE_FORCE_FLUSH;
-
-	/* Check for disabled zonefile synchronization. */
-	conf_val_t val = conf_zone_get(conf, C_ZONEFILE_SYNC, zone->name);
-	if (conf_int(&val) < 0 && !force) {
-		return KNOT_EOK;
-	}
-
-	/* Check for difference against zonefile serial. */
-	zone_contents_t *contents = zone->contents;
-	uint32_t serial_to = zone_contents_serial(contents);
-	if (!force && zone->zonefile.exists && zone->zonefile.serial == serial_to) {
-		log_zone_info(zone->name, "zone file up-to-date, serial %u",
-		              zone->zonefile.serial);
-		return KNOT_EOK;
-	}
-
-	char *zonefile = conf_zonefile(conf, zone->name);
-
-	/* Synchronize journal. */
-	int ret = zonefile_write(zonefile, contents);
-	if (ret != KNOT_EOK) {
-		log_zone_warning(zone->name, "zone file update failed (%s)",
-		                 knot_strerror(ret));
-		free(zonefile);
-		return ret;
-	}
-
-	if (zone->zonefile.exists) {
-		log_zone_info(zone->name, "zone file updated, serial %u -> %u",
-		              zone->zonefile.serial, serial_to);
-	} else {
-		log_zone_info(zone->name, "zone file updated, serial none -> %u",
-		              serial_to);
-	}
-
-	/* Update zone version. */
-	struct stat st;
-	if (stat(zonefile, &st) < 0) {
-		log_zone_warning(zone->name, "zone file update failed (%s)",
-		                 knot_strerror(knot_map_errno()));
-		free(zonefile);
-		return KNOT_EACCES;
-	}
-
-	free(zonefile);
-
-	char *journal_file = conf_journalfile(conf, zone->name);
-
-	/* Update zone file serial and journal. */
-	zone->zonefile.exists = true;
-	zone->zonefile.mtime = st.st_mtime;
-	zone->zonefile.serial = serial_to;
-	journal_mark_synced(journal_file);
-
-	free(journal_file);
-
-	/* Trim extra heap. */
-	mem_trim();
-
-	return ret;
-}
-
 int zone_update_enqueue(zone_t *zone, knot_pkt_t *pkt, struct process_query_param *param)
 {
 	if (zone == NULL || pkt == NULL || param == NULL) {
diff --git a/src/knot/zone/zone.h b/src/knot/zone/zone.h
index f3b9d97ff14639f6b433429a63b2a553114ea055..01020bbe9a76ec2fdff98595be4d17981467fc71 100644
--- a/src/knot/zone/zone.h
+++ b/src/knot/zone/zone.h
@@ -29,7 +29,8 @@
 #include <stdint.h>
 
 #include "knot/conf/conf.h"
-#include "knot/server/journal.h"
+#include "knot/conf/confio.h"
+#include "knot/journal/journal.h"
 #include "knot/events/events.h"
 #include "knot/zone/contents.h"
 #include "knot/zone/timers.h"
@@ -57,6 +58,9 @@ typedef struct zone
 	zone_contents_t *contents;
 	zone_flag_t flags;
 
+	/*! \brief Dynamic configuration zone change type. */
+	conf_io_type_t change_type;
+
 	/*! \brief Zonefile parameters. */
 	struct {
 		time_t mtime;
@@ -76,9 +80,15 @@ typedef struct zone
 	/*! \brief Control update context. */
 	struct zone_update *control_update;
 
+	/*! \brief Journal structure. */
+	journal_t *journal;
+
 	/*! \brief Journal access lock. */
 	pthread_mutex_t journal_lock;
 
+	/*! \brief Ptr to journal DB (in struct server) */
+	journal_db_t **journal_db;
+
 	/*! \brief Preferred master lock. */
 	pthread_mutex_t preferred_lock;
 	/*! \brief Preferred master for remote operation. */
@@ -119,8 +129,13 @@ void zone_control_clear(zone_t *zone);
  * \ref #223 New zone API
  * \todo get rid of this
  */
-int zone_changes_store(conf_t *conf, zone_t *zone, list_t *chgs);
 int zone_change_store(conf_t *conf, zone_t *zone, changeset_t *change);
+int zone_changes_store(conf_t *conf, zone_t *zone, list_t *chgs);
+int zone_changes_load(conf_t *conf, zone_t *zone, list_t *dst, uint32_t from);
+
+/*! \brief Synchronize zone file with journal. */
+int zone_flush_journal(conf_t *conf, zone_t *zone);
+
 /*!
  * \brief Atomically switch the content of the zone.
  */
@@ -156,8 +171,6 @@ typedef int (*zone_master_cb)(conf_t *conf, zone_t *zone, const conf_remote_t *r
 int zone_master_try(conf_t *conf, zone_t *zone, zone_master_cb callback,
                     void *callback_data, const char *err_str);
 
-/*! \brief Synchronize zone file with journal. */
-int zone_flush_journal(conf_t *conf, zone_t *zone);
 
 /*! \brief Enqueue UPDATE request for processing. */
 int zone_update_enqueue(zone_t *zone, knot_pkt_t *pkt, struct process_query_param *param);
diff --git a/src/knot/zone/zonedb-load.c b/src/knot/zone/zonedb-load.c
index af94f34d988af25f27bf5d8dd7a1be23b59bedfa..2935502e8f74cda6f0e5840d17fb92783d715be5 100644
--- a/src/knot/zone/zonedb-load.c
+++ b/src/knot/zone/zonedb-load.c
@@ -32,7 +32,7 @@
  */
 typedef enum {
 	ZONE_STATUS_NOT_FOUND = 0,  //!< Zone file does not exist.
-	ZONE_STATUS_BOOSTRAP,       //!< Zone file does not exist, can boostrap.
+	ZONE_STATUS_BOOTSTRAP,      //!< Zone file does not exist, can bootstrap.
 	ZONE_STATUS_FOUND_NEW,      //!< Zone file exists, not loaded yet.
 	ZONE_STATUS_FOUND_CURRENT,  //!< Zone file exists, same as loaded.
 	ZONE_STATUS_FOUND_UPDATED,  //!< Zone file exists, newer than loaded.
@@ -64,7 +64,7 @@ static zone_status_t zone_file_status(conf_t *conf, const zone_t *old_zone,
 			return ZONE_STATUS_FOUND_CURRENT;
 		} else {
 			return zone_load_can_bootstrap(conf, name) ?
-			       ZONE_STATUS_BOOSTRAP : ZONE_STATUS_NOT_FOUND;
+			       ZONE_STATUS_BOOTSTRAP : ZONE_STATUS_NOT_FOUND;
 		}
 	} else {
 		if (old_zone == NULL) {
@@ -91,7 +91,7 @@ static void log_zone_load_info(const zone_t *zone, zone_status_t status)
 
 	switch (status) {
 	case ZONE_STATUS_NOT_FOUND:     action = "not found";            break;
-	case ZONE_STATUS_BOOSTRAP:      action = "will be bootstrapped"; break;
+	case ZONE_STATUS_BOOTSTRAP:     action = "will be bootstrapped"; break;
 	case ZONE_STATUS_FOUND_NEW:     action = "will be loaded";       break;
 	case ZONE_STATUS_FOUND_CURRENT: action = "is up-to-date";        break;
 	case ZONE_STATUS_FOUND_UPDATED: action = "will be reloaded";     break;
@@ -114,6 +114,8 @@ static zone_t *create_zone_from(const knot_dname_t *name, server_t *server)
 		return NULL;
 	}
 
+	zone->journal_db = &server->journal_db;
+
 	int result = zone_events_setup(zone, server->workers, &server->sched,
 	                               server->timers_db);
 	if (result != KNOT_EOK) {
@@ -227,14 +229,14 @@ static zone_t *create_zone_new(conf_t *conf, const knot_dname_t *name,
 	zone_status_t zstatus = zone_file_status(conf, NULL, name);
 	if (zone_expired(zone)) {
 		assert(zone_is_slave(conf, zone));
-		zstatus = ZONE_STATUS_BOOSTRAP;
+		zstatus = ZONE_STATUS_BOOTSTRAP;
 	}
 
 	switch (zstatus) {
 	case ZONE_STATUS_FOUND_NEW:
 		replan_load_new(zone);
 		break;
-	case ZONE_STATUS_BOOSTRAP:
+	case ZONE_STATUS_BOOTSTRAP:
 		replan_load_bootstrap(conf, zone);
 		break;
 	case ZONE_STATUS_NOT_FOUND:
@@ -271,6 +273,27 @@ static zone_t *create_zone(conf_t *conf, const knot_dname_t *name, server_t *ser
 	}
 }
 
+static void mark_changed_zones(knot_zonedb_t *zonedb, hattrie_t *changed)
+{
+	if (changed == NULL) {
+		return;
+	}
+
+	hattrie_iter_t *it = hattrie_iter_begin(changed);
+	for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
+		const knot_dname_t *name =
+			(const knot_dname_t *)hattrie_iter_key(it, NULL);
+
+		zone_t *zone = knot_zonedb_find(zonedb, name);
+		if (zone != NULL) {
+			conf_io_type_t type = (conf_io_type_t)(*hattrie_iter_val(it));
+			assert(!(type & CONF_IO_TSET));
+			zone->change_type = type;
+		}
+	}
+	hattrie_iter_free(it);
+}
+
 /*!
  * \brief Create new zone database.
  *
@@ -293,13 +316,31 @@ static knot_zonedb_t *create_zonedb(conf_t *conf, server_t *server)
 		return NULL;
 	}
 
+	bool full = !(conf->io.flags & CONF_IO_FACTIVE) ||
+	            (conf->io.flags & CONF_IO_FRLD_ZONES);
+
+	/* Mark changed zones. */
+	if (!full) {
+		mark_changed_zones(server->zone_db, conf->io.zones);
+	}
+
 	for (conf_iter_t iter = conf_iter(conf, C_ZONE); iter.code == KNOT_EOK;
 	     conf_iter_next(conf, &iter)) {
 		conf_val_t id = conf_iter_id(conf, &iter);
-		zone_t *old_zone = knot_zonedb_find(db_old, conf_dname(&id));
-		zone_t *zone = create_zone(conf, conf_dname(&id), server, old_zone);
-		if (!zone) {
-			log_zone_error(id.data, "zone cannot be created");
+		const knot_dname_t *name = conf_dname(&id);
+
+		zone_t *old_zone = knot_zonedb_find(db_old, name);
+		if (old_zone != NULL && !full) {
+			/* Reuse unchanged zone. */
+			if (!(old_zone->change_type & CONF_IO_TRELOAD)) {
+				knot_zonedb_insert(db_new, old_zone);
+				continue;
+			}
+		}
+
+		zone_t *zone = create_zone(conf, name, server, old_zone);
+		if (zone == NULL) {
+			log_zone_error(name, "zone cannot be created");
 			continue;
 		}
 
@@ -318,30 +359,52 @@ static knot_zonedb_t *create_zonedb(conf_t *conf, server_t *server)
  * \note Zone content may be preserved in the new zone database, in this case
  *       new and old zone share the contents. Shared content is not freed.
  *
- * \param db_new New zone database.
- * \param db_old Old zone database.
+ * \param conf    New server configuration.
+ * \param db_old  Old zone database to remove.
+ * \param db_new  New zone database for comparison if full reload.
   */
-static void remove_old_zonedb(const knot_zonedb_t *db_new, knot_zonedb_t *db_old)
+static void remove_old_zonedb(conf_t *conf, knot_zonedb_t *db_old,
+                              knot_zonedb_t *db_new)
 {
 	if (db_old == NULL) {
 		return;
 	}
 
+	bool full = !(conf->io.flags & CONF_IO_FACTIVE) ||
+	            (conf->io.flags & CONF_IO_FRLD_ZONES);
+
 	knot_zonedb_iter_t it;
-	knot_zonedb_iter_begin(db_new, &it);
+	knot_zonedb_iter_begin(db_old, &it);
 
-	while(!knot_zonedb_iter_finished(&it)) {
-		zone_t *new_zone = knot_zonedb_iter_val(&it);
-		zone_t *old_zone = knot_zonedb_find(db_old, new_zone->name);
+	while (!knot_zonedb_iter_finished(&it)) {
+		zone_t *zone = knot_zonedb_iter_val(&it);
 
-		if (old_zone) {
-			old_zone->contents = NULL;
+		if (full) {
+			/* Check if reloaded (reused contents). */
+			if (knot_zonedb_find(db_new, zone->name)) {
+				zone->contents = NULL;
+			}
+			/* Completely new zone. */
+		} else {
+			/* Check if reloaded (reused contents). */
+			if (zone->change_type & CONF_IO_TRELOAD) {
+				zone->contents = NULL;
+				zone_free(&zone);
+			/* Check if removed (drop also contents). */
+			} else if (zone->change_type & CONF_IO_TUNSET) {
+				zone_free(&zone);
+			}
+			/* Completely reused zone. */
 		}
 
 		knot_zonedb_iter_next(&it);
 	}
 
-	knot_zonedb_deep_free(&db_old);
+	if (full) {
+		knot_zonedb_deep_free(&db_old);
+	} else {
+		knot_zonedb_free(&db_old);
+	}
 }
 
 static bool zone_exists(const knot_dname_t *zone, void *data)
@@ -356,7 +419,6 @@ static bool zone_exists(const knot_dname_t *zone, void *data)
 
 void zonedb_reload(conf_t *conf, server_t *server)
 {
-	/* Check parameters */
 	if (conf == NULL || server == NULL) {
 		return;
 	}
@@ -385,10 +447,6 @@ void zonedb_reload(conf_t *conf, server_t *server)
 		            knot_strerror(ret));
 	}
 
-	/*
-	 * Remove all zones present in the new DB from the old DB.
-	 * No new thread can access these zones in the old DB, as the
-	 * databases are already switched.
-	 */
-	remove_old_zonedb(db_new, db_old);
+	/* Remove old zone DB. */
+	remove_old_zonedb(conf, db_old, db_new);
 }
diff --git a/src/knot/zone/zonedb.c b/src/knot/zone/zonedb.c
index c7e85d23511eed3be123f1072c9c09ab2ac43fac..0b638e684df8f418e582830c799ec0425162394d 100644
--- a/src/knot/zone/zonedb.c
+++ b/src/knot/zone/zonedb.c
@@ -28,16 +28,10 @@ static void discard_zone(zone_t *zone)
 {
 	// Don't flush if removed zone (no previous configuration available).
 	if (conf_rawid_exists(conf(), C_ZONE, zone->name, knot_dname_size(zone->name))) {
-		char *journal_file = conf_journalfile(conf(), zone->name);
-
-		/* Flush if bootstrapped or if the journal doesn't exist. */
-		if (!zone->zonefile.exists || !journal_exists(journal_file)) {
-			pthread_mutex_lock(&zone->journal_lock);
+		// Flush if bootstrapped or if the journal doesn't exist.
+		if (!zone->zonefile.exists || !journal_exists(zone->journal_db, zone->name)) {
 			zone_flush_journal(conf(), zone);
-			pthread_mutex_unlock(&zone->journal_lock);
 		}
-
-		free(journal_file);
 	}
 
 	zone_free(&zone);
diff --git a/src/knot/zone/zonefile.c b/src/knot/zone/zonefile.c
index f6d2694f7b883c5fc4ed1095562304b4452bf450..e87ce569437ccff34c359053554a554ed4e8a928 100644
--- a/src/knot/zone/zonefile.c
+++ b/src/knot/zone/zonefile.c
@@ -26,8 +26,8 @@
 #include <inttypes.h>
 
 #include "libknot/libknot.h"
+#include "contrib/files.h"
 #include "contrib/macros.h"
-#include "contrib/string.h"
 #include "knot/common/log.h"
 #include "knot/dnssec/zone-nsec.h"
 #include "knot/zone/semantic-check.h"
@@ -298,73 +298,6 @@ int zonefile_exists(const char *path, time_t *mtime)
 	return KNOT_EOK;
 }
 
-/*! \brief Open a temporary zonefile. */
-static int open_tmp_filename(const char *name, char **tmp_name, FILE **file)
-{
-	int ret;
-
-	*tmp_name = sprintf_alloc("%s.XXXXXX", name);
-	if (*tmp_name == NULL) {
-		ret = KNOT_ENOMEM;
-		goto open_tmp_failed;
-	}
-
-	int fd = mkstemp(*tmp_name);
-	if (fd < 0) {
-		ret = knot_map_errno();
-		goto open_tmp_failed;
-	}
-
-	if (fchmod(fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0) {
-		ret = knot_map_errno();
-		close(fd);
-		unlink(*tmp_name);
-		goto open_tmp_failed;
-	}
-
-	*file = fdopen(fd, "w");
-	if (*file == NULL) {
-		ret = knot_map_errno();
-		close(fd);
-		unlink(*tmp_name);
-		goto open_tmp_failed;
-	}
-
-	return KNOT_EOK;
-open_tmp_failed:
-	free(*tmp_name);
-	*tmp_name = NULL;
-
-	assert(ret != KNOT_EOK);
-	return ret;
-}
-
-/*! \brief Prepare a directory for the file. */
-static int make_path(const char *path, mode_t mode)
-{
-	if (path == NULL) {
-		return KNOT_EINVAL;
-	}
-
-	char *dir = strdup(path);
-	if (dir == NULL) {
-		return KNOT_ENOMEM;
-	}
-
-	for (char *p = strchr(dir + 1, '/'); p != NULL; p = strchr(p + 1, '/')) {
-		*p = '\0';
-		if (mkdir(dir, mode) == -1 && errno != EEXIST) {
-			free(dir);
-			return knot_map_errno();
-		}
-		*p = '/';
-	}
-
-	free(dir);
-
-	return KNOT_EOK;
-}
-
 int zonefile_write(const char *path, zone_contents_t *zone)
 {
 	if (!zone || !path) {
@@ -378,12 +311,12 @@ int zonefile_write(const char *path, zone_contents_t *zone)
 
 	FILE *file = NULL;
 	char *tmp_name = NULL;
-	ret = open_tmp_filename(path, &tmp_name, &file);
+	ret = open_tmp_file(path, &tmp_name, &file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
 	if (ret != KNOT_EOK) {
 		return ret;
 	}
 
-	ret = zone_dump_text(zone, file);
+	ret = zone_dump_text(zone, file, true);
 	fclose(file);
 	if (ret != KNOT_EOK) {
 		unlink(tmp_name);
diff --git a/src/libknot/codes.c b/src/libknot/codes.c
index 916e089c534374f3d4de3921c0984043385c8dba..55f20fb35eba74acb4e238fbaf89c2fc6cb8d017 100644
--- a/src/libknot/codes.c
+++ b/src/libknot/codes.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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,36 +30,31 @@ const knot_lookup_t knot_opcode_names[] = {
 
 _public_
 const knot_lookup_t knot_rcode_names[] = {
-	{ KNOT_RCODE_NOERROR,  "NOERROR" },
-	{ KNOT_RCODE_FORMERR,  "FORMERR" },
-	{ KNOT_RCODE_SERVFAIL, "SERVFAIL" },
-	{ KNOT_RCODE_NXDOMAIN, "NXDOMAIN" },
-	{ KNOT_RCODE_NOTIMPL,  "NOTIMPL" },
-	{ KNOT_RCODE_REFUSED,  "REFUSED" },
-	{ KNOT_RCODE_YXDOMAIN, "YXDOMAIN" },
-	{ KNOT_RCODE_YXRRSET,  "YXRRSET" },
-	{ KNOT_RCODE_NXRRSET,  "NXRRSET" },
-	{ KNOT_RCODE_NOTAUTH,  "NOTAUTH" },
-	{ KNOT_RCODE_NOTZONE,  "NOTZONE" },
-	{ KNOT_RCODE_BADVERS,  "BADVERS" },
+	{ KNOT_RCODE_NOERROR,   "NOERROR" },
+	{ KNOT_RCODE_FORMERR,   "FORMERR" },
+	{ KNOT_RCODE_SERVFAIL,  "SERVFAIL" },
+	{ KNOT_RCODE_NXDOMAIN,  "NXDOMAIN" },
+	{ KNOT_RCODE_NOTIMPL,   "NOTIMPL" },
+	{ KNOT_RCODE_REFUSED,   "REFUSED" },
+	{ KNOT_RCODE_YXDOMAIN,  "YXDOMAIN" },
+	{ KNOT_RCODE_YXRRSET,   "YXRRSET" },
+	{ KNOT_RCODE_NXRRSET,   "NXRRSET" },
+	{ KNOT_RCODE_NOTAUTH,   "NOTAUTH" },
+	{ KNOT_RCODE_NOTZONE,   "NOTZONE" },
+	{ KNOT_RCODE_BADVERS,   "BADVERS" },
+	{ KNOT_RCODE_BADKEY,    "BADKEY" },
+	{ KNOT_RCODE_BADTIME,   "BADTIME" },
+	{ KNOT_RCODE_BADMODE,   "BADMODE" },
+	{ KNOT_RCODE_BADNAME,   "BADNAME" },
+	{ KNOT_RCODE_BADALG,    "BADALG" },
+	{ KNOT_RCODE_BADTRUNC,  "BADTRUNC" },
 	{ KNOT_RCODE_BADCOOKIE, "BADCOOKIE" },
 	{ 0, NULL }
 };
 
 _public_
-const knot_lookup_t knot_tsig_err_names[] = {
-	{ KNOT_TSIG_ERR_BADSIG,   "BADSIG" },
-	{ KNOT_TSIG_ERR_BADKEY,   "BADKEY" },
-	{ KNOT_TSIG_ERR_BADTIME,  "BADTIME" },
-	{ KNOT_TSIG_ERR_BADTRUNC, "BADTRUNC" },
-	{ 0, NULL }
-};
-
-_public_
-const knot_lookup_t knot_tkey_err_names[] = {
-	{ KNOT_TKEY_ERR_BADMODE,  "BADMODE" },
-	{ KNOT_TKEY_ERR_BADNAME,  "BADNAME" },
-	{ KNOT_TKEY_ERR_BADALG,   "BADALG" },
+const knot_lookup_t knot_tsig_rcode_names[] = {
+	{ KNOT_RCODE_BADSIG, "BADSIG" },
 	{ 0, NULL }
 };
 
@@ -76,6 +71,8 @@ const knot_lookup_t knot_dnssec_alg_names[] = {
 	{ KNOT_DNSSEC_ALG_ECC_GOST,           "ECC_GOST" },
 	{ KNOT_DNSSEC_ALG_ECDSAP256SHA256,    "ECDSAP256SHA256" },
 	{ KNOT_DNSSEC_ALG_ECDSAP384SHA384,    "ECDSAP384SHA384" },
+	{ KNOT_DNSSEC_ALG_ED25519,            "ED25519" },
+	{ KNOT_DNSSEC_ALG_ED448,              "ED448" },
 	{ KNOT_DNSSEC_ALG_INDIRECT,           "INDIRECT" },
 	{ KNOT_DNSSEC_ALG_PRIVATEDNS,         "PRIVATEDNS" },
 	{ KNOT_DNSSEC_ALG_PRIVATEOID,         "PRIVATEOID" },
diff --git a/src/libknot/codes.h b/src/libknot/codes.h
index 9b62074c793144ed08720190b11338f323e6ce26..c5cf323498b7510c6fe6b71817b14f28957f5403 100644
--- a/src/libknot/codes.h
+++ b/src/libknot/codes.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -37,14 +37,9 @@ extern const knot_lookup_t knot_opcode_names[];
 extern const knot_lookup_t knot_rcode_names[];
 
 /*!
- * \brief TSIG error names.
+ * \brief TSIG exceptions to reply code names.
  */
-extern const knot_lookup_t knot_tsig_err_names[];
-
-/*!
- * \brief TKEY error names.
- */
-extern const knot_lookup_t knot_tkey_err_names[];
+extern const knot_lookup_t knot_tsig_rcode_names[];
 
 /*!
  * \brief DNSSEC algorithm names.
diff --git a/src/libknot/consts.h b/src/libknot/consts.h
index bcf8bec961b4bab7a5980d0212cb74a3c594d03d..7df39e507246007f4faf4f871b36e74bc2593b69 100644
--- a/src/libknot/consts.h
+++ b/src/libknot/consts.h
@@ -69,10 +69,6 @@ typedef enum {
  * \brief DNS reply codes (RCODEs).
  *
  * http://www.iana.org/assignments/dns-parameters/dns-parameters.xml
- *
- * \note Here, only RCODEs present in Header or as an Extended RCODE in
- *       OPT + Header are listed. Other codes are used in dedicated fields of
- *       other RRs.
  */
 typedef enum {
 	KNOT_RCODE_NOERROR   =  0, /*!< No error. */
@@ -87,31 +83,16 @@ typedef enum {
 	KNOT_RCODE_NOTAUTH   =  9, /*!< Server not authoritative. / Query not authorized. */
 	KNOT_RCODE_NOTZONE   = 10, /*!< Name is not inside zone. */
 	KNOT_RCODE_BADVERS   = 16, /*!< Bad OPT Version. */
+	KNOT_RCODE_BADSIG    = 16, /*!< (TSIG) Signature failure. */
+	KNOT_RCODE_BADKEY    = 17, /*!< (TSIG) Key is not supported. */
+	KNOT_RCODE_BADTIME   = 18, /*!< (TSIG) Signature out of time window. */
+	KNOT_RCODE_BADMODE   = 19, /*!< (TKEY) Bad mode. */
+	KNOT_RCODE_BADNAME   = 20, /*!< (TKEY) Duplicate key name. */
+	KNOT_RCODE_BADALG    = 21, /*!< (TKEY) Algorithm not supported. */
+	KNOT_RCODE_BADTRUNC  = 22, /*!< (TSIG) Bad truncation. */
 	KNOT_RCODE_BADCOOKIE = 23  /*!< Bad/missing server cookie. */
 } knot_rcode_t;
 
-/*!
- * \brief TSIG error codes to be set in the TSIG RR's RDATA.
- *
- * Defined in RFC 2845 and RFC 4635.
- * See also https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml
- */
-typedef enum {
-	KNOT_TSIG_ERR_BADSIG   = 16, /*!< TSIG signature failed. */
-	KNOT_TSIG_ERR_BADKEY   = 17, /*!< Key is not supported. */
-	KNOT_TSIG_ERR_BADTIME  = 18, /*!< Signature out of time window. */
-	KNOT_TSIG_ERR_BADTRUNC = 22  /*!< Bad truncation. */
-} knot_tsig_error_t;
-
-/*!
- * \brief TKEY error codes. (Defined in RFC 2930.)
- */
-typedef enum {
-	KNOT_TKEY_ERR_BADMODE  = 19, /*!< Bad TKEY mode. */
-	KNOT_TKEY_ERR_BADNAME  = 20, /*!< Duplicate key name. */
-	KNOT_TKEY_ERR_BADALG   = 21  /*!< Algorithm not supported. */
-} knot_tkey_error_t;
-
 /*!
  * \brief DNS packet section identifiers.
  */
@@ -165,6 +146,9 @@ typedef enum {
 	KNOT_DNSSEC_ALG_ECDSAP256SHA256    =  13,
 	KNOT_DNSSEC_ALG_ECDSAP384SHA384    =  14,
 
+	KNOT_DNSSEC_ALG_ED25519            =  15,
+	KNOT_DNSSEC_ALG_ED448              =  16,
+
 	KNOT_DNSSEC_ALG_INDIRECT           = 252,
 	KNOT_DNSSEC_ALG_PRIVATEDNS         = 253,
 	KNOT_DNSSEC_ALG_PRIVATEOID         = 254
diff --git a/src/libknot/control/control.c b/src/libknot/control/control.c
index 0b578b8486348bed4121e9718983ae70a595e97e..8591519f50a8040e6805f8103f6c3fff20c3407c 100644
--- a/src/libknot/control/control.c
+++ b/src/libknot/control/control.c
@@ -491,7 +491,7 @@ static int receive_item_value(knot_ctl_t *ctx, char **value)
 	if (*value == NULL) {
 		return KNOT_ENOMEM;
 	}
-	wire_ctx_read(w, (uint8_t *)*value, data_len);
+	wire_ctx_read(w, *value, data_len);
 	if (w->error != KNOT_EOK) {
 		return w->error;
 	}
diff --git a/src/libknot/db/db_lmdb.c b/src/libknot/db/db_lmdb.c
index 286718ba31a38f3a2dfe356e6976179a4a3e59c1..3f437532d98182c5d670b1fb6059fbf96c07ed36 100644
--- a/src/libknot/db/db_lmdb.c
+++ b/src/libknot/db/db_lmdb.c
@@ -34,6 +34,8 @@
 
 _public_ const unsigned KNOT_DB_LMDB_NOTLS = MDB_NOTLS;
 _public_ const unsigned KNOT_DB_LMDB_RDONLY = MDB_RDONLY;
+_public_ const unsigned KNOT_DB_LMDB_INTEGERKEY = MDB_INTEGERKEY;
+_public_ const unsigned KNOT_DB_LMDB_NOSYNC = MDB_NOSYNC;
 
 struct lmdb_env
 {
@@ -61,7 +63,11 @@ static int lmdb_error_to_knot(int error)
 		return KNOT_ENOENT;
 	}
 
-	if (error == MDB_MAP_FULL || error == MDB_TXN_FULL || error == ENOSPC) {
+	if (error == MDB_TXN_FULL) {
+		return KNOT_ELIMIT;
+	}
+
+	if (error == MDB_MAP_FULL || error == ENOSPC) {
 		return KNOT_ESPACE;
 	}
 
@@ -134,6 +140,12 @@ static int dbase_open_env(struct lmdb_env *env, struct knot_db_lmdb_opts *opts)
 		return lmdb_error_to_knot(ret);
 	}
 
+	ret = mdb_env_set_maxreaders(mdb_env, opts->maxreaders);
+	if (ret != MDB_SUCCESS) {
+		mdb_env_close(mdb_env);
+		return lmdb_error_to_knot(ret);
+	}
+
 #ifdef __OpenBSD__
 	/*
 	 * Enforce that MDB_WRITEMAP is set.
@@ -180,7 +192,7 @@ static int dbase_open(struct lmdb_env *env, struct knot_db_lmdb_opts *opts)
 		return lmdb_error_to_knot(ret);
 	}
 
-	ret = mdb_dbi_open(txn, opts->dbname, opts->flags.db, &env->dbi);
+	ret = mdb_dbi_open(txn, opts->dbname, opts->flags.db | MDB_CREATE, &env->dbi);
 	if (ret != MDB_SUCCESS) {
 		mdb_txn_abort(txn);
 		mdb_env_close(env->env);
@@ -465,25 +477,6 @@ static int insert(knot_db_txn_t *txn, knot_db_val_t *key, knot_db_val_t *val, un
 		mdb_flags |= MDB_RESERVE;
 	}
 
-	/* Reserve some pages for clearing */
-	MDB_stat stat;
-	MDB_stat stat_free;
-	MDB_envinfo info;
-	if (mdb_stat(txn->txn, env->dbi, &stat) != MDB_SUCCESS ||
-	    mdb_stat(txn->txn, 0, &stat_free) != MDB_SUCCESS ||
-	    mdb_env_info(env->env, &info) != MDB_SUCCESS) {
-		return KNOT_ERROR;
-	}
-	/* Count head room pages */
-	size_t max_pages = (info.me_mapsize / stat.ms_psize) - info.me_last_pgno - 2;
-	/* Add free leaf pages, allow worst-case headroom for branch pages */
-	max_pages += stat_free.ms_leaf_pages - stat.ms_branch_pages;
-	/* The freelist must be able to hold db tree pages */
-	size_t used_pages = stat.ms_branch_pages + stat.ms_overflow_pages;
-	if (used_pages + 1 >= max_pages) {
-		return KNOT_ESPACE;
-	}
-
 	int ret = mdb_put(txn->txn, env->dbi, &db_key, &data, mdb_flags);
 	if (ret != MDB_SUCCESS) {
 		return lmdb_error_to_knot(ret);
@@ -510,6 +503,37 @@ static int del(knot_db_txn_t *txn, knot_db_val_t *key)
 	return KNOT_EOK;
 }
 
+_public_
+size_t knot_db_lmdb_get_mapsize(knot_db_t *db)
+{
+	struct lmdb_env *env = db;
+	MDB_envinfo info;
+	if (mdb_env_info(env->env, &info) != MDB_SUCCESS) {
+		return 0;
+	}
+
+	return info.me_mapsize;
+}
+
+// you should SUM all the usages of DBs sharing one mapsize
+_public_
+size_t knot_db_lmdb_get_usage(knot_db_t *db)
+{
+	struct lmdb_env *env = db;
+	knot_db_txn_t txn;
+	knot_db_lmdb_txn_begin(db, &txn, NULL, KNOT_DB_RDONLY);
+	MDB_stat st;
+	if (mdb_stat(txn.txn, env->dbi, &st) != MDB_SUCCESS) {
+		txn_abort(&txn);
+		return 0;
+	}
+	txn_abort(&txn);
+
+	size_t pgs_used = st.ms_branch_pages + st.ms_leaf_pages + st.ms_overflow_pages + st.ms_entries;
+
+	return (pgs_used * st.ms_psize);
+}
+
 _public_
 const knot_db_api_t *knot_db_lmdb_api(void)
 {
diff --git a/src/libknot/db/db_lmdb.h b/src/libknot/db/db_lmdb.h
index 95dcde5a22475a61f7ea39713fe959513af20b3e..959904764642185764d4ad6be4e7e189b4e1a7b1 100644
--- a/src/libknot/db/db_lmdb.h
+++ b/src/libknot/db/db_lmdb.h
@@ -24,6 +24,8 @@
 /* LMDB specific flags. */
 extern const unsigned KNOT_DB_LMDB_NOTLS;
 extern const unsigned KNOT_DB_LMDB_RDONLY;
+extern const unsigned KNOT_DB_LMDB_INTEGERKEY;
+extern const unsigned KNOT_DB_LMDB_NOSYNC;
 
 /* Native options. */
 struct knot_db_lmdb_opts {
@@ -31,6 +33,7 @@ struct knot_db_lmdb_opts {
 	const char *dbname;   /*!< Database name (or NULL). */
 	size_t mapsize;       /*!< Environment map size. */
 	unsigned maxdbs;      /*!< Maximum number of databases in the env. */
+	unsigned maxreaders;  /*!< Maximum number of concurrent readers */
 	struct {
 		unsigned env; /*!< Environment flags. */
 		unsigned db;  /*!< Database flags. */
@@ -42,6 +45,7 @@ struct knot_db_lmdb_opts {
 	NULL, NULL, \
 	KNOT_DB_LMDB_MAPSIZE, \
 	0, \
+	126, /* = contrib/lmdb/mdb.c DEFAULT_READERS */ \
 	{ 0, 0 } \
 }
 
@@ -51,3 +55,5 @@ const knot_db_api_t *knot_db_lmdb_api(void);
 int knot_db_lmdb_txn_begin(knot_db_t *db, knot_db_txn_t *txn, knot_db_txn_t *parent,
                            unsigned flags);
 int knot_db_lmdb_iter_del(knot_db_iter_t *iter);
+size_t knot_db_lmdb_get_mapsize(knot_db_t *db);
+size_t knot_db_lmdb_get_usage(knot_db_t *db);
diff --git a/src/libknot/db/db_trie.c b/src/libknot/db/db_trie.c
index c0dc82df890ebe7a400aebbc47316654fd6bac6b..8f1141812dc1f817f4ff32e01f43bdc5e9b6762d 100644
--- a/src/libknot/db/db_trie.c
+++ b/src/libknot/db/db_trie.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -20,6 +20,7 @@
 #include "libknot/errcode.h"
 #include "libknot/db/db_trie.h"
 #include "contrib/hat-trie/hat-trie.h"
+#include "contrib/macros.h"
 #include "contrib/mempattern.h"
 
 static int init(knot_db_t **db, knot_mm_t *mm, void *arg)
@@ -29,7 +30,8 @@ static int init(knot_db_t **db, knot_mm_t *mm, void *arg)
 	}
 
 	struct knot_db_trie_opts *opts = arg;
-	hattrie_t *trie = hattrie_create_n(opts->bucket_size, mm);
+	UNUSED(opts);
+	hattrie_t *trie = hattrie_create(mm);
 	if (!trie) {
 		return KNOT_ENOMEM;
 	}
@@ -53,12 +55,6 @@ static int txn_begin(knot_db_t *db, knot_db_txn_t *txn, unsigned flags)
 
 static int txn_commit(knot_db_txn_t *txn)
 {
-	/* Rebuild order index only for WR transactions. */
-	if ((size_t)txn->txn & KNOT_DB_RDONLY) {
-		return KNOT_EOK;
-	}
-
-	hattrie_build_index((hattrie_t *)txn->db);
 	return KNOT_EOK;
 }
 
@@ -108,12 +104,11 @@ static int insert(knot_db_txn_t *txn, knot_db_val_t *key, knot_db_val_t *val, un
 
 static int del(knot_db_txn_t *txn, knot_db_val_t *key)
 {
-	return hattrie_del((hattrie_t *)txn->db, key->data, key->len);
+	return hattrie_del((hattrie_t *)txn->db, key->data, key->len, NULL);
 }
 
 static knot_db_iter_t *iter_begin(knot_db_txn_t *txn, unsigned flags)
 {
-	bool is_sorted = (flags & KNOT_DB_SORTED);
 	flags &= ~KNOT_DB_SORTED;
 
 	/* No operations other than begin are supported right now. */
@@ -121,7 +116,7 @@ static knot_db_iter_t *iter_begin(knot_db_txn_t *txn, unsigned flags)
 		return NULL;
 	}
 
-	return hattrie_iter_begin((hattrie_t *)txn->db, is_sorted);
+	return hattrie_iter_begin((hattrie_t *)txn->db);
 }
 
 static knot_db_iter_t *iter_seek(knot_db_iter_t *iter, knot_db_val_t *key, unsigned flags)
diff --git a/src/libknot/db/db_trie.h b/src/libknot/db/db_trie.h
index d28b8f3343d031bd493c6fd137afbdab519355de..a7a24e490847e711298ca84e5332230fd2a7556b 100644
--- a/src/libknot/db/db_trie.h
+++ b/src/libknot/db/db_trie.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -18,17 +18,14 @@
 
 #include "libknot/db/db.h"
 
-/* Defines */
-#define KNOT_DB_TRIE_BUCKET_SIZE  253 /* 1 page per bucket, see hat-trie.h */
-
 /* Native options. */
 struct knot_db_trie_opts {
-	unsigned bucket_size; /*!< Trie bucket size. */
+	unsigned unused;
 };
 
 /* Default options. */
 #define KNOT_DB_TRIE_OPTS_INITIALIZER { \
-	KNOT_DB_TRIE_BUCKET_SIZE \
+	0 \
 }
 
 const knot_db_api_t *knot_db_trie_api(void);
diff --git a/src/libknot/errcode.h b/src/libknot/errcode.h
index 040f2af25dec639234cfd73bda0b0eb1b9758cc1..251912ebb150da7acd6cdb7ad5fb7dd0a27b0507 100644
--- a/src/libknot/errcode.h
+++ b/src/libknot/errcode.h
@@ -89,6 +89,7 @@ enum knot_error {
 	KNOT_EOF,
 	KNOT_ESYSTEM,
 	KNOT_EFILE,
+	KNOT_ESOAINVAL,
 
 	/* Control states. */
 	KNOT_CTL_ESTOP,
diff --git a/src/libknot/error.c b/src/libknot/error.c
index a963ed1d2c7d61b167c2128c71567b5995daebbc..d32c2e20a7e5c8e36f8524de0e2a0db436d3e228 100644
--- a/src/libknot/error.c
+++ b/src/libknot/error.c
@@ -88,6 +88,7 @@ static const struct error errors[] = {
 	{ KNOT_EOF,          "end of file" },
 	{ KNOT_ESYSTEM,      "system error" },
 	{ KNOT_EFILE,        "file error" },
+	{ KNOT_ESOAINVAL,    "SOA mismatch" },
 
 	/* Control states. */
 	{ KNOT_CTL_ESTOP,     "stopping server" },
diff --git a/src/libknot/packet/pkt.c b/src/libknot/packet/pkt.c
index 67661d504e69a340862c718ea2d9011d8d239b3f..ed29a2b4e65c6c6e63f18e2011414037b92bb4dc 100644
--- a/src/libknot/packet/pkt.c
+++ b/src/libknot/packet/pkt.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -20,6 +20,7 @@
 
 #include "libknot/attribute.h"
 #include "libknot/packet/pkt.h"
+#include "libknot/codes.h"
 #include "libknot/descriptor.h"
 #include "libknot/errcode.h"
 #include "libknot/rrtype/tsig.h"
@@ -332,6 +333,7 @@ int knot_pkt_init_response(knot_pkt_t *pkt, const knot_pkt_t *query)
 
 	/* Clear payload. */
 	knot_pkt_clear_payload(pkt);
+
 	return KNOT_EOK;
 }
 
@@ -402,7 +404,6 @@ int knot_pkt_reclaim(knot_pkt_t *pkt, uint16_t size)
 	} else {
 		return KNOT_ERANGE;
 	}
-
 }
 
 _public_
@@ -438,7 +439,6 @@ uint16_t knot_pkt_type(const knot_pkt_t *pkt)
 	return ret;
 }
 
-/*----------------------------------------------------------------------------*/
 _public_
 uint16_t knot_pkt_question_size(const knot_pkt_t *pkt)
 {
@@ -449,7 +449,6 @@ uint16_t knot_pkt_question_size(const knot_pkt_t *pkt)
 	return pkt->qname_size + 2 * sizeof(uint16_t);
 }
 
-/*----------------------------------------------------------------------------*/
 _public_
 const knot_dname_t *knot_pkt_qname(const knot_pkt_t *pkt)
 {
@@ -460,7 +459,6 @@ const knot_dname_t *knot_pkt_qname(const knot_pkt_t *pkt)
 	return pkt->wire + KNOT_WIRE_HEADER_SIZE;
 }
 
-/*----------------------------------------------------------------------------*/
 _public_
 uint16_t knot_pkt_qtype(const knot_pkt_t *pkt)
 {
@@ -472,7 +470,6 @@ uint16_t knot_pkt_qtype(const knot_pkt_t *pkt)
 	return wire_read_u16(pkt->wire + off);
 }
 
-/*----------------------------------------------------------------------------*/
 _public_
 uint16_t knot_pkt_qclass(const knot_pkt_t *pkt)
 {
@@ -487,17 +484,17 @@ uint16_t knot_pkt_qclass(const knot_pkt_t *pkt)
 _public_
 int knot_pkt_begin(knot_pkt_t *pkt, knot_section_t section_id)
 {
-	if (pkt == NULL) {
+	if (pkt == NULL || section_id < pkt->current) {
 		return KNOT_EINVAL;
 	}
 
-	/* Cannot step to lower section. */
-	assert(section_id >= pkt->current);
-	pkt->current = section_id;
-
-	/* Remember watermark. */
+	/* Remember watermark but not on repeated calls. */
 	pkt->sections[section_id].pkt = pkt;
-	pkt->sections[section_id].pos = pkt->rrset_count;
+	if (section_id > pkt->current) {
+		pkt->sections[section_id].pos = pkt->rrset_count;
+	}
+
+	pkt->current = section_id;
 
 	return KNOT_EOK;
 }
@@ -563,8 +560,7 @@ int knot_pkt_put(knot_pkt_t *pkt, uint16_t compr_hint, const knot_rrset_t *rr,
 	memcpy(pkt->rr + pkt->rrset_count, rr, sizeof(knot_rrset_t));
 
 	/* Check for double insertion. */
-	if ((flags & KNOT_PF_CHECKDUP) &&
-	    pkt_contains(pkt, rr)) {
+	if ((flags & KNOT_PF_CHECKDUP) && pkt_contains(pkt, rr)) {
 		return KNOT_EOK; /*! \todo return rather a number of added RRs */
 	}
 
@@ -584,7 +580,7 @@ int knot_pkt_put(knot_pkt_t *pkt, uint16_t compr_hint, const knot_rrset_t *rr,
 	if (ret < 0) {
 		/* Truncate packet if required. */
 		if (ret == KNOT_ESPACE && !(flags & KNOT_PF_NOTRUNC)) {
-				knot_wire_set_tc(pkt->wire);
+			knot_wire_set_tc(pkt->wire);
 		}
 		return ret;
 	}
@@ -722,7 +718,7 @@ static int check_rr_constraints(knot_pkt_t *pkt, knot_rrset_t *rr, size_t rr_siz
                                 unsigned flags)
 {
 	/* Check RR constraints. */
-	switch(rr->type) {
+	switch (rr->type) {
 	case KNOT_RRTYPE_TSIG:
 		CHECK_AR_CONSTRAINTS(pkt, rr, tsig_rr, knot_tsig_rdata_is_ok);
 
@@ -865,18 +861,56 @@ int knot_pkt_parse_payload(knot_pkt_t *pkt, unsigned flags)
 }
 
 _public_
-uint16_t knot_pkt_get_ext_rcode(const knot_pkt_t *pkt)
+uint16_t knot_pkt_ext_rcode(const knot_pkt_t *pkt)
 {
 	if (pkt == NULL) {
 		return 0;
 	}
 
-	uint8_t rcode = knot_wire_get_rcode(pkt->wire);
+	/* Get header RCODE. */
+	uint16_t rcode = knot_wire_get_rcode(pkt->wire);
 
-	if (pkt->opt_rr) {
+	/* Update to extended RCODE if EDNS is available. */
+	if (pkt->opt_rr != NULL) {
 		uint8_t opt_rcode = knot_edns_get_ext_rcode(pkt->opt_rr);
-		return knot_edns_whole_rcode(opt_rcode, rcode);
+		rcode = knot_edns_whole_rcode(opt_rcode, rcode);
+	}
+
+	/* Return if not NOTAUTH. */
+	if (rcode != KNOT_RCODE_NOTAUTH) {
+		return rcode;
+	}
+
+	/* Get TSIG RCODE. */
+	uint16_t tsig_rcode = KNOT_RCODE_NOERROR;
+	if (pkt->tsig_rr != NULL) {
+		tsig_rcode = knot_tsig_rdata_error(pkt->tsig_rr);
+	}
+
+	/* Return proper RCODE. */
+	if (tsig_rcode != KNOT_RCODE_NOERROR) {
+		return tsig_rcode;
 	} else {
 		return rcode;
 	}
 }
+
+_public_
+const char *knot_pkt_ext_rcode_name(const knot_pkt_t *pkt)
+{
+	if (pkt == NULL) {
+		return "";
+	}
+
+	uint16_t rcode = knot_pkt_ext_rcode(pkt);
+
+	const knot_lookup_t *item = NULL;
+	if (pkt->tsig_rr != NULL) {
+		item = knot_lookup_by_id(knot_tsig_rcode_names, rcode);
+	}
+	if (item == NULL) {
+		item = knot_lookup_by_id(knot_rcode_names, rcode);
+	}
+
+	return (item != NULL) ? item->name : "";
+}
diff --git a/src/libknot/packet/pkt.h b/src/libknot/packet/pkt.h
index 6fdf8f49ee71b817572f257c8db80c56cf8c719f..462ded2b77f19a760edfdfbf3e8cbda081c5fa6a 100644
--- a/src/libknot/packet/pkt.h
+++ b/src/libknot/packet/pkt.h
@@ -214,7 +214,7 @@ uint16_t knot_pkt_qclass(const knot_pkt_t *pkt);
  *
  * \param pkt
  * \param section_id
- * \return KNOT_EOK
+ * \return KNOT_EOK or KNOT_EINVAL
  */
 int knot_pkt_begin(knot_pkt_t *pkt, knot_section_t section_id);
 
@@ -318,17 +318,27 @@ int knot_pkt_parse_section(knot_pkt_t *pkt, unsigned flags);
 int knot_pkt_parse_payload(knot_pkt_t *pkt, unsigned flags);
 
 /*!
- * \brief Get the Extended RCODE from the packet.
+ * \brief Get packet extended RCODE.
  *
- * Extended RCODE is created by using the Extended RCODE field from OPT RR as
- * higher 8 bits and the RCODE from DNS Header as the lower 4 bits, resulting
- * in a 12-bit unsigned integer. (See RFC 6891, Section 6.1.3).
+ * Extended RCODE is created by considering TSIG RCODE, EDNS RCODE and
+ * DNS Header RCODE. (See RFC 6895, Section 2.3).
  *
  * \param pkt Packet to get the response code from.
  *
  * \return Whole extended RCODE (0 if pkt == NULL).
  */
-uint16_t knot_pkt_get_ext_rcode(const knot_pkt_t *pkt);
+uint16_t knot_pkt_ext_rcode(const knot_pkt_t *pkt);
+
+/*!
+ * \brief Get packet extended RCODE name.
+ *
+ * The packet parameter is important as the name depends on TSIG.
+ *
+ * \param pkt Packet to get the response code from.
+ *
+ * \return RCODE name (or empty string if not known).
+ */
+const char *knot_pkt_ext_rcode_name(const knot_pkt_t *pkt);
 
 /*!
  * \brief Checks if there is an OPT RR in the packet.
diff --git a/src/libknot/packet/wire.h b/src/libknot/packet/wire.h
index b318756eaa8ee1796301f8d397f232d166e47a7c..d778e8926ce5519d3bade58f2b61b57e55fa868a 100644
--- a/src/libknot/packet/wire.h
+++ b/src/libknot/packet/wire.h
@@ -276,7 +276,7 @@ static inline void knot_wire_set_rd(uint8_t *packet)
  *
  * \param packet Wire format of the packet.
  */
-static inline void knot_wire_flags_clear_rd(uint8_t *packet)
+static inline void knot_wire_clear_rd(uint8_t *packet)
 {
 	*(packet + KNOT_WIRE_OFFSET_FLAGS1) &= ~KNOT_WIRE_RD_MASK;
 }
@@ -588,7 +588,7 @@ static inline void knot_wire_flags_set_rd(uint8_t *flags1)
  *
  * \param flags1 First byte of DNS header flags.
  */
-static inline void knot_wire_flags_flags_clear_rd(uint8_t *flags1)
+static inline void knot_wire_flags_clear_rd(uint8_t *flags1)
 {
 	*flags1 &= ~KNOT_WIRE_RD_MASK;
 }
diff --git a/src/libknot/rdataset.c b/src/libknot/rdataset.c
index e62aee9d05fcd7b3d24bd49eba441827a7d1a1b7..cd3cf76f882f5bfc7c8112dc167e37bd826e3fc5 100644
--- a/src/libknot/rdataset.c
+++ b/src/libknot/rdataset.c
@@ -193,14 +193,8 @@ size_t knot_rdataset_size(const knot_rdataset_t *rrs)
 		return 0;
 	}
 
-	size_t total_size = 0;
-	for (size_t i = 0; i < rrs->rr_count; ++i) {
-		const knot_rdata_t *rr = knot_rdataset_at(rrs, i);
-		assert(rr);
-		total_size += knot_rdata_array_size(knot_rdata_rdlen(rr));
-	}
-
-	return total_size;
+	const knot_rdata_t *rr_end = rr_seek(rrs->data, rrs->rr_count);
+	return rr_end - rrs->data;
 }
 
 _public_
diff --git a/src/libknot/rrset-dump.c b/src/libknot/rrset-dump.c
index 560c4c5a47fd28807079596f13da47c052949ac2..4849ab91d07d43e1ab811a8b3a09ab793fefe03c 100644
--- a/src/libknot/rrset-dump.c
+++ b/src/libknot/rrset-dump.c
@@ -39,6 +39,8 @@
 #include "contrib/wire.h"
 #include "contrib/wire_ctx.h"
 
+#define RRSET_DUMP_LIMIT (2 * 1024 * 1024)
+
 #define TAB_WIDTH		8
 #define BLOCK_WIDTH		40
 #define BLOCK_INDENT		"\n\t\t\t\t"
@@ -1243,7 +1245,7 @@ static void wire_tsig_rcode_to_str(rrset_dump_params_t *p)
 {
 	uint16_t data;
 	size_t   in_len = sizeof(data);
-	const char *rcode_str = "NULL";
+	const char *rcode_str = "Unknown";
 
 	// Check input size.
 	if (in_len > p->in_max) {
@@ -1255,9 +1257,10 @@ static void wire_tsig_rcode_to_str(rrset_dump_params_t *p)
 
 	// Find RCODE name.
 	const knot_lookup_t *rcode = NULL;
-	rcode = knot_lookup_by_id((data >= ((knot_lookup_t *)knot_tsig_err_names)->id) ?
-	                          knot_tsig_err_names : knot_rcode_names,
-	                          data);
+	rcode = knot_lookup_by_id(knot_tsig_rcode_names, data);
+	if (rcode == NULL) {
+		rcode = knot_lookup_by_id(knot_rcode_names, data);
+	}
 	if (rcode != NULL) {
 		rcode_str = rcode->name;
 	}
@@ -1315,6 +1318,12 @@ static size_t dnskey_len(const uint8_t *rdata,
 	case KNOT_DNSSEC_ALG_ECDSAP384SHA384:
 		// RFC 6605.
 		return 384;
+	case KNOT_DNSSEC_ALG_ED25519:
+		// RFC TBD, an Ed25519 public key consists of a 32-octet value.
+		return 256;
+	case KNOT_DNSSEC_ALG_ED448:
+		// RFC TBD, an Ed448 public key consists of a 57-octet value.
+		return 456;
 	default:
 		return 0;
 	}
@@ -1991,26 +2000,26 @@ int knot_rrset_txt_dump_header(const knot_rrset_t      *rrset,
 	return len;
 }
 
-_public_
-int knot_rrset_txt_dump(const knot_rrset_t      *rrset,
-                        char                    *dst,
-                        const size_t            maxlen,
-                        const knot_dump_style_t *style)
+static int rrset_txt_dump(const knot_rrset_t      *rrset,
+                          char                    *dst,
+                          const size_t            maxlen,
+                          const knot_dump_style_t *style)
 {
 	if (rrset == NULL || dst == NULL || style == NULL) {
 		return KNOT_EINVAL;
 	}
 
 	size_t len = 0;
-	int    ret;
+
+	dst[0] = '\0';
 
 	// Loop over rdata in rrset.
 	uint16_t rr_count = rrset->rrs.rr_count;
 	for (uint16_t i = 0; i < rr_count; i++) {
 		// Dump rdata owner, class, ttl and type.
 		const knot_rdata_t *rr_data = knot_rdataset_at(&rrset->rrs, i);
-		ret = knot_rrset_txt_dump_header(rrset, knot_rdata_ttl(rr_data),
-		                                 dst + len, maxlen - len, style);
+		int ret = knot_rrset_txt_dump_header(rrset, knot_rdata_ttl(rr_data),
+		                                     dst + len, maxlen - len, style);
 		if (ret < 0) {
 			return KNOT_ESPACE;
 		}
@@ -2034,3 +2043,35 @@ int knot_rrset_txt_dump(const knot_rrset_t      *rrset,
 
 	return len;
 }
+
+_public_
+int knot_rrset_txt_dump(const knot_rrset_t      *rrset,
+                        char                    **dst,
+                        size_t                  *dst_size,
+                        const knot_dump_style_t *style)
+{
+	if (dst == NULL || dst_size == NULL) {
+		return KNOT_EINVAL;
+	}
+
+	while (1) {
+		int ret = rrset_txt_dump(rrset, *dst, *dst_size, style);
+		if (ret != KNOT_ESPACE) {
+			return ret;
+		}
+
+		size_t new_dst_size = 2 * (*dst_size);
+		if (new_dst_size > RRSET_DUMP_LIMIT) {
+			return KNOT_ESPACE;
+		}
+
+		char * new_dst = malloc(new_dst_size);
+		if (new_dst == NULL) {
+			return KNOT_ENOMEM;
+		}
+
+		free(*dst);
+		*dst = new_dst;
+		*dst_size = new_dst_size;
+	}
+}
diff --git a/src/libknot/rrset-dump.h b/src/libknot/rrset-dump.h
index 41e02342f1857c25e7f3456450ed2ba9420f0bbc..bd9ef8c06d10e30aa9daea4737a020b54f8586ca 100644
--- a/src/libknot/rrset-dump.h
+++ b/src/libknot/rrset-dump.h
@@ -90,19 +90,19 @@ int knot_rrset_txt_dump_data(const knot_rrset_t      *rrset,
                              const knot_dump_style_t *style);
 
 /*!
- * \brief Dumps rrset.
+ * \brief Dumps rrset, re-allocates dst to double (4x, 8x, ...) if too small.
  *
  * \param rrset		RRset to dump.
  * \param dst		Output buffer.
- * \param maxlen	Output buffer size.
+ * \param dst_size	Output buffer size (changed if *dst re-allocated).
  * \param style		Output style.
  *
  * \retval output length	if success.
  * \retval < 0			if error.
  */
 int knot_rrset_txt_dump(const knot_rrset_t      *rrset,
-                        char                    *dst,
-                        const size_t            maxlen,
+                        char                    **dst,
+                        size_t                  *dst_size,
                         const knot_dump_style_t *style);
 
 /*! @} */
diff --git a/src/libknot/rrset.h b/src/libknot/rrset.h
index b2d60a498f7bb3cf412d2ba1bd789ce0f67d9c1b..afe3b37b4f3fa4e58e149ca0ea9d5250df577bcd 100644
--- a/src/libknot/rrset.h
+++ b/src/libknot/rrset.h
@@ -42,7 +42,7 @@ struct knot_rrset {
 	uint16_t rclass;      /*!< CLASS of the RRSet. */
 	knot_rdataset_t rrs;  /*!< RRSet's RRs */
 	/* Optional fields. */
-	struct zone_node **additional; /*!< Additional records. */
+	void *additional;     /*!< Additional records. */
 };
 
 typedef struct knot_rrset knot_rrset_t;
diff --git a/src/libknot/rrtype/opt.h b/src/libknot/rrtype/opt.h
index a8845aaf180333c3dbbe07966e615daf29afc5bd..e87e70c6d29aef08adf0c397f3ce2427f08e42b4 100644
--- a/src/libknot/rrtype/opt.h
+++ b/src/libknot/rrtype/opt.h
@@ -411,7 +411,7 @@ size_t knot_edns_client_subnet_size(const knot_edns_client_subnet_t *ecs);
  * \param option_len  EDNS option data buffer size.
  * \param ecs         EDNS Client Subnet data.
  *
- * \return Error code, KNOT_EOK if sucessful.
+ * \return Error code, KNOT_EOK if successful.
  */
 int knot_edns_client_subnet_write(uint8_t *option, size_t option_len,
                                   const knot_edns_client_subnet_t *ecs);
@@ -423,7 +423,7 @@ int knot_edns_client_subnet_write(uint8_t *option, size_t option_len,
  * \param[in]  option      EDNS option data.
  * \param[in]  option_len  EDNS option size.
  *
- * \return Error code, KNOT_EOK if sucessful.
+ * \return Error code, KNOT_EOK if successful.
  */
 int knot_edns_client_subnet_parse(knot_edns_client_subnet_t *ecs,
                                   const uint8_t *option, size_t option_len);
@@ -434,7 +434,7 @@ int knot_edns_client_subnet_parse(knot_edns_client_subnet_t *ecs,
  * \param ecs   ECS structure to set address into.
  * \param addr  Address to be set.
  *
- * \return Error code. KNOT_EOK if succesful.
+ * \return Error code. KNOT_EOK if successful.
  */
 int knot_edns_client_subnet_set_addr(knot_edns_client_subnet_t *ecs,
                                      const struct sockaddr_storage *addr);
diff --git a/src/libknot/rrtype/tsig.c b/src/libknot/rrtype/tsig.c
index a46650e39a20dce2c90ae1ae7b31f972e080ae70..c0c714930f6b97afaafe448bab81429efca156bd 100644
--- a/src/libknot/rrtype/tsig.c
+++ b/src/libknot/rrtype/tsig.c
@@ -141,7 +141,7 @@ int knot_tsig_create_rdata(knot_rrset_t *rr, const knot_dname_t *alg,
 	/* We already checked rr and know rdlen > 0, no need to check rest. */
 	int alg_len = knot_dname_size(alg);
 	size_t rdlen = alg_len + TSIG_FIXED_RDLEN + maclen;
-	if (tsig_err != KNOT_TSIG_ERR_BADTIME) {
+	if (tsig_err != KNOT_RCODE_BADTIME) {
 		rdlen -= TSIG_OTHER_MAXLEN;
 	}
 	uint8_t rd[rdlen];
diff --git a/src/libknot/tsig-op.c b/src/libknot/tsig-op.c
index dab1c3dcdec85862ba8a9921a20cfaff2584018c..3fde0f7c6a9bd153b1289add7f85cdca9cfb1bf7 100644
--- a/src/libknot/tsig-op.c
+++ b/src/libknot/tsig-op.c
@@ -368,7 +368,7 @@ int knot_tsig_sign(uint8_t *msg, size_t *msg_len, size_t msg_max_len,
 
 	/* Create rdata for TSIG RR. */
 	uint16_t rdata_rcode = 0;
-	if (tsig_rcode == KNOT_TSIG_ERR_BADTIME)
+	if (tsig_rcode == KNOT_RCODE_BADTIME)
 		rdata_rcode = tsig_rcode;
 
 	const uint8_t *alg_name = dnssec_tsig_algorithm_to_dname(key->algorithm);
@@ -376,7 +376,7 @@ int knot_tsig_sign(uint8_t *msg, size_t *msg_len, size_t msg_max_len,
 	knot_tsig_create_rdata(tmp_tsig, alg_name, alg_size, rdata_rcode);
 
 	/* Distinguish BADTIME response. */
-	if (tsig_rcode == KNOT_TSIG_ERR_BADTIME) {
+	if (tsig_rcode == KNOT_RCODE_BADTIME) {
 		/* Set client's time signed into the time signed field. */
 		knot_tsig_rdata_set_time_signed(tmp_tsig, request_time_signed);
 
@@ -675,7 +675,7 @@ int knot_tsig_add(uint8_t *msg, size_t *msg_len, size_t msg_max_len,
 		return KNOT_ENOMEM;
 	}
 
-	assert(tsig_rcode != KNOT_TSIG_ERR_BADTIME);
+	assert(tsig_rcode != KNOT_RCODE_BADTIME);
 	knot_tsig_create_rdata(tmp_tsig, knot_tsig_rdata_alg_name(tsig_rr), 0, tsig_rcode);
 	knot_tsig_rdata_set_time_signed(tmp_tsig, knot_tsig_rdata_time_signed(tsig_rr));
 
diff --git a/src/libknot/tsig-op.h b/src/libknot/tsig-op.h
index 4826d7273e0fdcd261e2b807f3db41036cad1f58..3127d21e2336e96c8a3d84967a7f79fe8fe428f0 100644
--- a/src/libknot/tsig-op.h
+++ b/src/libknot/tsig-op.h
@@ -38,7 +38,7 @@
  * the message size.
  *
  * \note This function does not save the new digest to the 'digest' parameter
- *       unless everything went OK. This allows to sent the same buffer to
+ *       unless everything went OK. This allows sending the same buffer to
  *       the 'request_mac' and 'digest' parameters.
  *
  * \param msg Message to be signed.
@@ -72,7 +72,7 @@ int knot_tsig_sign(uint8_t *msg, size_t *msg_len, size_t msg_max_len,
  * the message size.
  *
  * \note This function does not save the new digest to the 'digest' parameter
- *       unless everything went OK. This allows to sent the same buffer to
+ *       unless everything went OK. This allows sending the same buffer to
  *       the 'request_mac' and 'digest' parameters.
  *
  * \param msg Message to be signed.
@@ -173,7 +173,7 @@ int knot_tsig_append(uint8_t *msg, size_t *msg_len, size_t msg_max_len,
  *  \todo Proper documentation.
  */
 static inline bool knot_tsig_can_sign(uint16_t tsig_rcode) {
-	return (tsig_rcode == KNOT_RCODE_NOERROR || tsig_rcode == KNOT_TSIG_ERR_BADTIME);
+	return tsig_rcode == KNOT_RCODE_NOERROR || tsig_rcode == KNOT_RCODE_BADTIME;
 }
 
 /*! @} */
diff --git a/src/libknot/yparser/ypscheme.h b/src/libknot/yparser/ypscheme.h
index 269cdb5c608fa9f79fd1cb1f7a97a8e735d87f44..19a70b0fab579dfa920458f8b38447d53986799b 100644
--- a/src/libknot/yparser/ypscheme.h
+++ b/src/libknot/yparser/ypscheme.h
@@ -83,8 +83,24 @@ typedef enum {
 
 /*! Scheme item flags. */
 typedef enum {
-	YP_FNONE  = 0,     /*!< Unspecified. */
-	YP_FMULTI = 1 << 0 /*!< Multivalued item. */
+	YP_FNONE  = 0,       /*!< Unspecified. */
+	YP_FMULTI = 1 <<  0, /*!< Multivalued item. */
+	YP_FUSR1  = 1 <<  1, /*!< User-defined flag1. */
+	YP_FUSR2  = 1 <<  2, /*!< User-defined flag2. */
+	YP_FUSR3  = 1 <<  3, /*!< User-defined flag3. */
+	YP_FUSR4  = 1 <<  4, /*!< User-defined flag4. */
+	YP_FUSR5  = 1 <<  5, /*!< User-defined flag5. */
+	YP_FUSR6  = 1 <<  6, /*!< User-defined flag6. */
+	YP_FUSR7  = 1 <<  7, /*!< User-defined flag7. */
+	YP_FUSR8  = 1 <<  8, /*!< User-defined flag8. */
+	YP_FUSR9  = 1 <<  9, /*!< User-defined flag9. */
+	YP_FUSR10 = 1 << 10, /*!< User-defined flag10. */
+	YP_FUSR11 = 1 << 11, /*!< User-defined flag11. */
+	YP_FUSR12 = 1 << 12, /*!< User-defined flag12. */
+	YP_FUSR13 = 1 << 13, /*!< User-defined flag13. */
+	YP_FUSR14 = 1 << 14, /*!< User-defined flag14. */
+	YP_FUSR15 = 1 << 15, /*!< User-defined flag15. */
+	YP_FUSR16 = 1 << 16, /*!< User-defined flag16. */
 } yp_flag_t;
 
 /*! Scheme item style. */
diff --git a/src/libknot/yparser/yptrafo.c b/src/libknot/yparser/yptrafo.c
index 5c1b9aa4acc721d438f92f999c40cb6c033e4a9b..d87f34714e25c4be5f57cf13e7a6fd7862fa48f9 100644
--- a/src/libknot/yparser/yptrafo.c
+++ b/src/libknot/yparser/yptrafo.c
@@ -409,7 +409,7 @@ int yp_addr_noport_to_txt(
 		}
 		break;
 	case 4:
-		wire_ctx_read(in, (uint8_t *)&(addr4.s_addr), sizeof(addr4.s_addr));
+		wire_ctx_read(in, &(addr4.s_addr), sizeof(addr4.s_addr));
 		if (inet_ntop(AF_INET, &addr4, (char *)out->position,
 		    wire_ctx_available(out)) == NULL) {
 			return KNOT_EINVAL;
@@ -417,7 +417,7 @@ int yp_addr_noport_to_txt(
 		wire_ctx_skip(out, strlen((char *)out->position));
 		break;
 	case 6:
-		wire_ctx_read(in, (uint8_t *)&(addr6.s6_addr), sizeof(addr6.s6_addr));
+		wire_ctx_read(in, &(addr6.s6_addr), sizeof(addr6.s6_addr));
 		if (inet_ntop(AF_INET6, &addr6, (char *)out->position,
 		    wire_ctx_available(out)) == NULL) {
 			return KNOT_EINVAL;
diff --git a/src/utils/common/exec.c b/src/utils/common/exec.c
index 1a8713211da9de6ff9cc773e5a288ea78935cbcc..695b3ab089290de2620e7cc7b9744424be0be7e3 100644
--- a/src/utils/common/exec.c
+++ b/src/utils/common/exec.c
@@ -48,24 +48,21 @@ static knot_lookup_t rtypes[] = {
 	{ 0, NULL }
 };
 
-static void print_header(const knot_pkt_t *packet, const style_t *style,
-                         const uint16_t ext_rcode)
+static void print_header(const knot_pkt_t *packet, const style_t *style)
 {
 	char flags[64] = "";
-	uint8_t opcode_id;
 	const char *rcode_str = "Unknown";
 	const char *opcode_str = "Unknown";
-	const knot_lookup_t *rcode, *opcode;
 
-	// Get RCODE from Header and check for Extended RCODE from OPT RR.
-	rcode = knot_lookup_by_id(knot_rcode_names, ext_rcode);
-	if (rcode != NULL) {
-		rcode_str = rcode->name;
+	// Get extended RCODE.
+	const char *code_name = knot_pkt_ext_rcode_name(packet);
+	if (code_name[0] != '\0') {
+		rcode_str = code_name;
 	}
 
 	// Get OPCODE.
-	opcode_id = knot_wire_get_opcode(packet->wire);
-	opcode = knot_lookup_by_id(knot_opcode_names, opcode_id);
+	uint8_t code = knot_wire_get_opcode(packet->wire);
+	const knot_lookup_t *opcode = knot_lookup_by_id(knot_opcode_names, code);
 	if (opcode != NULL) {
 		opcode_str = opcode->name;
 	}
@@ -143,7 +140,7 @@ static void print_footer(const size_t total_len,
 		exec_time = time(NULL);
 	}
 
-	// Create formated date-time string.
+	// Create formatted date-time string.
 	localtime_r(&exec_time, &tm);
 	strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S %Z", &tm);
 
@@ -198,29 +195,28 @@ static void print_edns_client_subnet(const uint8_t *data, const uint16_t len)
 	printf("%s/%u/%u\n", addr_str, ecs.source_len, ecs.scope_len);
 }
 
-static void print_section_opt(const knot_rrset_t *rr, const uint8_t rcode)
+static void print_section_opt(const knot_pkt_t *packet)
 {
-	uint8_t ercode = knot_edns_get_ext_rcode(rr);
-	uint16_t ext_rcode_id = knot_edns_whole_rcode(ercode, rcode);
-	const char *ext_rcode_str = "Unused";
-	const knot_lookup_t *ext_rcode;
+	const char *ercode_str = "Unknown";
 
+	uint16_t ercode = knot_edns_get_ext_rcode(packet->opt_rr);
 	if (ercode > 0) {
-		ext_rcode = knot_lookup_by_id(knot_rcode_names, ext_rcode_id);
-		if (ext_rcode != NULL) {
-			ext_rcode_str = ext_rcode->name;
-		} else {
-			ext_rcode_str = "Unknown";
-		}
+		ercode = knot_edns_whole_rcode(ercode,
+		                               knot_wire_get_rcode(packet->wire));
+	}
+
+	const knot_lookup_t *item = knot_lookup_by_id(knot_rcode_names, ercode);
+	if (item != NULL) {
+		ercode_str = item->name;
 	}
 
 	printf("Version: %u; flags: %s; UDP size: %u B; ext-rcode: %s\n",
-	       knot_edns_get_version(rr),
-	       (knot_edns_do(rr) != 0) ? "do" : "",
-	       knot_edns_get_payload(rr),
-	       ext_rcode_str);
+	       knot_edns_get_version(packet->opt_rr),
+	       (knot_edns_do(packet->opt_rr) != 0) ? "do" : "",
+	       knot_edns_get_payload(packet->opt_rr),
+	       ercode_str);
 
-	knot_rdata_t *rdata = knot_rdataset_at(&rr->rrs, 0);
+	knot_rdata_t *rdata = knot_rdataset_at(&packet->opt_rr->rrs, 0);
 	wire_ctx_t wire = wire_ctx_init_const(knot_rdata_data(rdata),
 	                                      knot_rdata_rdlen(rdata));
 
@@ -306,21 +302,10 @@ static void print_section_full(const knot_rrset_t *rrsets,
 			continue;
 		}
 
-		while (knot_rrset_txt_dump(&rrsets[i], buf, buflen,
-		                           &(style->style)) < 0) {
-			buflen += 4096;
-			// Oversize protection.
-			if (buflen > 100000) {
+		if (knot_rrset_txt_dump(&rrsets[i], &buf, &buflen,
+		                        &(style->style)) < 0) {
 				WARN("can't print whole section\n");
 				break;
-			}
-
-			char *newbuf = realloc(buf, buflen);
-			if (newbuf == NULL) {
-				WARN("can't print whole section\n");
-				break;
-			}
-			buf = newbuf;
 		}
 		printf("%s", buf);
 	}
@@ -421,27 +406,26 @@ static void print_section_host(const knot_rrset_t *rrsets,
 	free(buf);
 }
 
-static void print_error_host(const uint16_t   code,
-                             const knot_pkt_t *packet,
-                             const style_t    *style)
+static void print_error_host(const knot_pkt_t *packet, const style_t *style)
 {
-	const char *rcode_str = "Unknown";
 	char type[32] = "Unknown";
-	char *owner;
-	const knot_lookup_t *rcode;
+	const char *rcode_str = "Unknown";
 
-	owner = knot_dname_to_str_alloc(knot_pkt_qname(packet));
-	if (style->style.ascii_to_idn != NULL) {
-		style->style.ascii_to_idn(&owner);
+	knot_rrtype_to_string(knot_pkt_qtype(packet), type, sizeof(type));
+
+	// Get extended RCODE.
+	const char *code_name = knot_pkt_ext_rcode_name(packet);
+	if (code_name[0] != '\0') {
+		rcode_str = code_name;
 	}
 
-	rcode = knot_lookup_by_id(knot_rcode_names, code);
-	if (rcode != NULL) {
-		rcode_str = rcode->name;
+	// Get record owner.
+	char *owner = knot_dname_to_str_alloc(knot_pkt_qname(packet));
+	if (style->style.ascii_to_idn != NULL) {
+		style->style.ascii_to_idn(&owner);
 	}
-	knot_rrtype_to_string(knot_pkt_qtype(packet), type, sizeof(type));
 
-	if (code == KNOT_RCODE_NOERROR) {
+	if (knot_pkt_ext_rcode(packet) == KNOT_RCODE_NOERROR) {
 		printf("Host %s has no %s record\n", owner, type);
 	} else {
 		printf("Host %s type %s error: %s\n", owner, type, rcode_str);
@@ -465,7 +449,7 @@ knot_pkt_t *create_empty_packet(const uint16_t max_size)
 	return packet;
 }
 
-void print_header_xfr(const knot_pkt_t *packet, const style_t  *style)
+void print_header_xfr(const knot_pkt_t *packet, const style_t *style)
 {
 	if (style == NULL) {
 		DBG_NULL;
@@ -504,8 +488,7 @@ void print_data_xfr(const knot_pkt_t *packet,
 		return;
 	}
 
-	const knot_pktsection_t *answers = knot_pkt_section(packet,
-	                                                    KNOT_ANSWER);
+	const knot_pktsection_t *answers = knot_pkt_section(packet, KNOT_ANSWER);
 
 	switch (style->format) {
 	case FORMAT_DIG:
@@ -571,9 +554,6 @@ void print_packet(const knot_pkt_t *packet,
 	uint16_t nscount = knot_wire_get_nscount(packet->wire);
 	uint16_t arcount = knot_wire_get_arcount(packet->wire);
 
-	// Get Extended RCODE from the packet.
-	uint16_t rcode = knot_pkt_get_ext_rcode(packet);
-
 	// Disable additionals printing if there are no other records.
 	// OPT record may be placed anywhere within additionals!
 	if (knot_pkt_has_edns(packet) && arcount == 1) {
@@ -585,14 +565,13 @@ void print_packet(const knot_pkt_t *packet,
 		if (net != NULL) {
 			print_tls(&net->tls);
 		}
-		print_header(packet, style, rcode);
+		print_header(packet, style);
 	}
 
 	// Print EDNS section.
 	if (style->show_edns && knot_pkt_has_edns(packet)) {
 		printf("\n;; EDNS PSEUDOSECTION:\n;; ");
-		print_section_opt(packet->opt_rr,
-		                  knot_wire_get_rcode(packet->wire));
+		print_section_opt(packet);
 	}
 
 	// Print DNS sections.
@@ -606,7 +585,7 @@ void print_packet(const knot_pkt_t *packet,
 		if (ancount > 0) {
 			print_section_host(knot_pkt_rr(answers, 0), ancount, style);
 		} else {
-			print_error_host(rcode, packet, style);
+			print_error_host(packet, style);
 		}
 		break;
 	case FORMAT_NSUPDATE:
diff --git a/src/utils/common/lookup.c b/src/utils/common/lookup.c
index 57d8bc497e06e65afdea55ddca7fe9d55de3988c..7e84962c352735b914b09f79567e2d353be5ac76 100644
--- a/src/utils/common/lookup.c
+++ b/src/utils/common/lookup.c
@@ -29,7 +29,7 @@ int lookup_init(lookup_t *lookup)
 	memset(lookup, 0, sizeof(*lookup));
 
 	mm_ctx_mempool(&lookup->mm, MM_DEFAULT_BLKSIZE);
-	lookup->trie = hattrie_create_n(TRIE_BUCKET_SIZE, &lookup->mm);
+	lookup->trie = hattrie_create(&lookup->mm);
 	if (lookup->trie == NULL) {
 		mp_delete(lookup->mm.ctx);
 		return KNOT_ENOMEM;
@@ -89,15 +89,6 @@ int lookup_insert(lookup_t *lookup, const char *str, void *data)
 	return KNOT_EOK;
 }
 
-void lookup_index(lookup_t *lookup)
-{
-	if (lookup == NULL) {
-		return;
-	}
-
-	hattrie_build_index(lookup->trie);
-}
-
 static int set_key(lookup_t *lookup, char **dst, const char *key, size_t key_len)
 {
 	if (*dst != NULL) {
@@ -127,7 +118,7 @@ int lookup_search(lookup_t *lookup, const char *str, size_t str_len)
 	reset_output(lookup);
 
 	size_t new_len = 0;
-	hattrie_iter_t *it = hattrie_iter_begin(lookup->trie, true);
+	hattrie_iter_t *it = hattrie_iter_begin(lookup->trie);
 	for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 		size_t len;
 		const char *key = hattrie_iter_key(it, &len);
@@ -214,12 +205,12 @@ void lookup_list(lookup_t *lookup)
 		return;
 	}
 
-	lookup->iter.it = hattrie_iter_begin(lookup->trie, true);
+	lookup->iter.it = hattrie_iter_begin(lookup->trie);
 	while (!hattrie_iter_finished(lookup->iter.it)) {
 		size_t len;
 		const char *key = hattrie_iter_key(lookup->iter.it, &len);
 
-		if (strcmp(key, lookup->iter.first_key) == 0) {
+		if (memcmp(key, lookup->iter.first_key, len) == 0) {
 			int ret = set_key(lookup, &lookup->found.key, key, len);
 			if (ret == KNOT_EOK) {
 				lookup->found.data = *hattrie_iter_val(lookup->iter.it);
diff --git a/src/utils/common/lookup.h b/src/utils/common/lookup.h
index e5f01a591f1c2099d18085f7b68ccdf3ce708317..3bd33084c2d0dc79939c9bb2d1194eef27de33a0 100644
--- a/src/utils/common/lookup.h
+++ b/src/utils/common/lookup.h
@@ -82,13 +82,6 @@ void lookup_deinit(lookup_t *lookup);
  */
 int lookup_insert(lookup_t *lookup, const char *str, void *data);
 
-/*!
- * Indexes the lookup container.
- *
- * \param[in] lookup  Lookup context.
- */
-void lookup_index(lookup_t *lookup);
-
 /*!
  * Searches the lookup container for the given key.
  *
diff --git a/src/utils/common/params.h b/src/utils/common/params.h
index 2cb667003bdc4750ea10804579efc943a0560c00..d09549b0f9c05cae8a4c58bfa03e328d7497111f 100644
--- a/src/utils/common/params.h
+++ b/src/utils/common/params.h
@@ -133,7 +133,7 @@ char *name_from_idn(const char *idn_name);
 /*!
  * \brief Transforms ASCII punycode to localized IDN string.
  *
- * If an error occures or IDN support is missing, this function does nothing.
+ * If an error occurs or IDN support is missing, this function does nothing.
  *
  * \param idn_name	ASCII name to transform and replace with IDN name.
  */
diff --git a/src/utils/common/sign.c b/src/utils/common/sign.c
index d3e0387306f1c126a46f3c6fb4eb370833a0688b..8e0cc8ab24dd5c9d6e2b355582f852e180eb20d9 100644
--- a/src/utils/common/sign.c
+++ b/src/utils/common/sign.c
@@ -92,13 +92,13 @@ int verify_packet(const knot_pkt_t *pkt, const sign_context_t *sign_ctx)
 	}
 
 	switch (knot_tsig_rdata_error(pkt->tsig_rr)) {
-	case KNOT_TSIG_ERR_BADSIG:
+	case KNOT_RCODE_BADSIG:
 		return KNOT_TSIG_EBADSIG;
-	case KNOT_TSIG_ERR_BADKEY:
+	case KNOT_RCODE_BADKEY:
 		return KNOT_TSIG_EBADKEY;
-	case KNOT_TSIG_ERR_BADTIME:
+	case KNOT_RCODE_BADTIME:
 		return KNOT_TSIG_EBADTIME;
-	case KNOT_TSIG_ERR_BADTRUNC:
+	case KNOT_RCODE_BADTRUNC:
 		return KNOT_TSIG_EBADTRUNC;
 	default:
 		return KNOT_EOK;
diff --git a/src/utils/kdig/kdig_exec.c b/src/utils/kdig/kdig_exec.c
index 3bc31098d8392282a90ae43d83fafd652ce9f2f5..a62382b9e4d53e96b02ea683cb580589d3b0d246 100644
--- a/src/utils/kdig/kdig_exec.c
+++ b/src/utils/kdig/kdig_exec.c
@@ -885,17 +885,9 @@ static int process_xfr_packet(const knot_pkt_t      *query,
 			}
 
 			// Check for error reply.
-			uint16_t rcode = knot_pkt_get_ext_rcode(reply);
-			if (rcode != KNOT_RCODE_NOERROR) {
-				const char *rcode_str = "Unknown";
-
-				const knot_lookup_t *code =
-					knot_lookup_by_id(knot_rcode_names, rcode);
-				if (code != NULL) {
-					rcode_str = code->name;
-				}
-
-				ERR("server replied %s\n", rcode_str);
+			if (knot_pkt_ext_rcode(reply) != KNOT_RCODE_NOERROR) {
+				ERR("server replied with error '%s'\n",
+				    knot_pkt_ext_rcode_name(reply));
 				knot_pkt_free(&reply);
 				net_close(net);
 				return 0;
diff --git a/src/utils/keymgr/cmdparse/parameter.c b/src/utils/keymgr/cmdparse/parameter.c
index 94425fd0a0188cbb3db472cdbc8fdda65c054b84..350e173b8be65b05009705086d233de367bfe94d 100644
--- a/src/utils/keymgr/cmdparse/parameter.c
+++ b/src/utils/keymgr/cmdparse/parameter.c
@@ -41,7 +41,7 @@ static const parameter_t *param_match(const parameter_t *params, const char *sea
 		}
 
 		if (match) {
-			error("Ambigious parameter '%s' ('%s' or '%s').",
+			error("Ambiguous parameter '%s' ('%s' or '%s').",
 			      search, match->name, p->name);
 			return NULL;
 		}
diff --git a/src/utils/keymgr/keymgr.c b/src/utils/keymgr/keymgr.c
index b7a7080b233ffb34a70467785d85af3293ac3817..c8c149eba87d6eff457e9b97ed8962282dc138b7 100644
--- a/src/utils/keymgr/keymgr.c
+++ b/src/utils/keymgr/keymgr.c
@@ -20,12 +20,15 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 
 #include <dnssec/crypto.h>
 #include <dnssec/error.h>
 #include <dnssec/kasp.h>
 #include <dnssec/keystore.h>
 #include <dnssec/tsig.h>
+#include <dnssec/key.h>
+#include <dnssec/keystate.h>
 
 #include "cmdparse/command.h"
 #include "cmdparse/parameter.h"
@@ -45,6 +48,9 @@
 
 #define MANUAL_POLICY "default_manual"
 
+static const uint16_t DNSKEY_FLAGS_KSK = 257;
+static const uint16_t DNSKEY_FLAGS_ZSK = 256;
+
 /* -- global options ------------------------------------------------------- */
 
 static options_t options = { 0 };
@@ -262,6 +268,30 @@ static bool empty_filter(const char *filter)
 typedef bool (*list_match_cb)(const void *item, const char *filter);
 typedef void (*list_print_cb)(const void *item);
 
+key_state_t str_to_keystate(const char *filter) {
+	if (!filter) {
+		return DNSSEC_KEY_STATE_INVALID;
+	}
+
+	if (strcmp(filter, "+removed") == 0) {
+		return DNSSEC_KEY_STATE_REMOVED;
+	}
+
+	if (strcmp(filter, "+retired") == 0) {
+		return DNSSEC_KEY_STATE_RETIRED;
+	}
+
+	if (strcmp(filter, "+active") == 0) {
+		return DNSSEC_KEY_STATE_ACTIVE;
+	}
+
+	if (strcmp(filter, "+published") == 0) {
+		return DNSSEC_KEY_STATE_PUBLISHED;
+	}
+
+	return DNSSEC_KEY_STATE_INVALID;
+}
+
 /*!
  * Iterate over a list and print each matching item.
  *
@@ -290,6 +320,61 @@ static int print_list(dnssec_list_t *list, const char *filter,
 	return found;
 }
 
+/*!
+ * Iterate over a list and print each matching item.
+ *
+ * \param list    List to walk through.
+ * \param filter  Limits printed keys to given state.
+ * \param print   Item print callback.
+ *
+ * \return Number of printed items.
+ */
+static int print_list_filtered(dnssec_list_t *list, const char *filter1,
+                               const char *filter2, list_print_cb print)
+{
+	assert(list);
+	uint16_t flag = 0;
+	bool first_valid = true;
+
+	key_state_t state = str_to_keystate(filter1);
+	if (state == DNSSEC_KEY_STATE_INVALID) {
+		first_valid = false;
+		state = str_to_keystate(filter2);
+		if (filter2 && state == DNSSEC_KEY_STATE_INVALID) {
+			error("Invalid filters.");
+			return DNSSEC_ERROR;
+		}
+	}
+
+	const char *flag_def = (first_valid ? filter2 : filter1);
+
+	if (flag_def && !strcmp(flag_def, "+ksk")) {
+		flag = DNSKEY_FLAGS_KSK;
+	} else if (flag_def && !strcmp(flag_def, "+zsk")) {
+		flag = DNSKEY_FLAGS_ZSK;
+	}
+
+	if ((!first_valid || filter2) && !flag) {
+		error("Invalid filters.");
+		return DNSSEC_ERROR;
+	}
+
+	int found = 0;
+	time_t current = time(NULL);
+	dnssec_list_foreach(item, list) {
+		dnssec_kasp_key_t *key = dnssec_item_get(item);
+		const void *value = dnssec_item_get(item);
+		uint16_t flags = dnssec_key_get_flags(key->key);
+		if ((state == DNSSEC_KEY_STATE_INVALID ||
+		     dnssec_get_key_state(key, current) == state) &&
+			(flags == flag || flag == 0)) {
+			print(value);
+			found+=1;
+		}
+	}
+	return found;
+}
+
 /* -- key matching --------------------------------------------------------- */
 
 /*!
@@ -835,15 +920,14 @@ static int cmd_zone_remove(int argc, char *argv[])
  */
 static int cmd_zone_key_list(int argc, char *argv[])
 {
-	if (argc < 1 || argc > 2) {
+	if (argc < 1 || argc > 3) {
 		error("Zone name and optional filter has to be specified.");
 		return 1;
 	}
 
 	const char *zone_name = argv[0];
-	const char *filter = (argc == 2 ? argv[1] : NULL);
-
-	// list the keys
+	const char *filter1 = (argc >= 2 ? argv[1] : NULL);
+	const char *filter2 = (argc == 3 ? argv[2] : NULL);
 
 	_cleanup_kasp_ dnssec_kasp_t *kasp = get_zone_kasp(zone_name);
 	if (!kasp) {
@@ -856,7 +940,18 @@ static int cmd_zone_key_list(int argc, char *argv[])
 	}
 
 	dnssec_list_t *zone_keys = dnssec_kasp_zone_get_keys(zone);
-	int count = print_list(zone_keys, filter, item_match_key, item_print_key);
+	int count = 0;
+	/* No filter */
+	if ((!filter1 || filter1[0] != '+') && !filter2) {
+		count = print_list(zone_keys, filter1, item_match_key, item_print_key);
+	/* with filters */
+	} else if (filter1 && filter1[0] == '+' && (!filter2 || filter2[0] == '+')) {
+		count = print_list_filtered(zone_keys, filter1, filter2, item_print_key);
+	} else {
+		error("Invalid argument combination");
+		return 1;
+	}
+
 	if (count == 0) {
 		error("No matching zone key found.");
 		return 1;
@@ -973,12 +1068,6 @@ static int cmd_zone_key_ds(int argc, char *argv[])
 	_cleanup_zone_ dnssec_kasp_zone_t *zone = get_zone(kasp, zone_name);
 	dnssec_list_t *keys = dnssec_kasp_zone_get_keys(zone);
 
-	dnssec_kasp_key_t *key = NULL;
-	int r = search_unique_key(keys, key_name, &key);
-	if (r != DNSSEC_EOK) {
-		return 1;
-	}
-
 	static const dnssec_key_digest_t digests[] = {
 		DNSSEC_KEY_DIGEST_SHA1,
 		DNSSEC_KEY_DIGEST_SHA256,
@@ -986,8 +1075,47 @@ static int cmd_zone_key_ds(int argc, char *argv[])
 		0
 	};
 
-	for (const dnssec_key_digest_t *d = digests; *d != 0; d++) {
-		create_and_print_ds(key->key, *d);
+	dnssec_kasp_key_t *key = NULL;
+
+	key_state_t state = str_to_keystate(key_name);
+	if (state == DNSSEC_KEY_STATE_INVALID) {
+		if (key_name[0] == '+') {
+			error("Wrong filter");
+			return 1;
+		}
+
+		int r = search_unique_key(keys, key_name, &key);
+		if (r != DNSSEC_EOK) {
+			return 1;
+		}
+
+		for (const dnssec_key_digest_t *d = digests; *d != 0; d++) {
+			create_and_print_ds(key->key, *d);
+		}
+	} else if (state == DNSSEC_KEY_STATE_ACTIVE || state == DNSSEC_KEY_STATE_PUBLISHED) {
+		int found = 0;
+		time_t current = time(NULL);
+
+		dnssec_list_foreach(item, keys) {
+			key = dnssec_item_get(item);
+			uint16_t flags = dnssec_key_get_flags(key->key);
+			const void *value = dnssec_item_get(item);
+			if (dnssec_get_key_state(key, current) == state && flags == DNSKEY_FLAGS_KSK) {
+				found++;
+				item_print_key(value);
+				for (const dnssec_key_digest_t *d = digests; *d != 0; d++) {
+					create_and_print_ds(key->key, *d);
+				}
+			}
+		}
+
+		if (found == 0) {
+			error ("No key matching filter.");
+			return 1;
+		}
+	} else { // if onther state than active or published
+		error("Wrong filter.");
+		return 1;
 	}
 
 	return 0;
@@ -1087,7 +1215,7 @@ static int cmd_zone_key_generate(int argc, char *argv[])
 		return 1;
 	}
 
-	uint16_t flags = config.is_ksk ? 257 : 256;
+	uint16_t flags = config.is_ksk ? DNSKEY_FLAGS_KSK : DNSKEY_FLAGS_ZSK;
 
 	dnssec_key_t *dnskey = NULL;
 	dnssec_key_new(&dnskey);
diff --git a/src/utils/keymgr/options.c b/src/utils/keymgr/options.c
index dbb67ddf4bccf1b00e30fc56f4cfda07a7fc7c00..a5281cebc05eb54355883bb295851b7c9d74fad5 100644
--- a/src/utils/keymgr/options.c
+++ b/src/utils/keymgr/options.c
@@ -102,7 +102,7 @@ static int options_init_modern(options_t *options)
 	}
 
 	// Update to the new config.
-	conf_update(new_conf);
+	conf_update(new_conf, CONF_UPD_FNONE);
 
 	return DNSSEC_EOK;
 }
@@ -127,7 +127,7 @@ void options_cleanup(options_t *options)
 	}
 
 	if (!options->legacy) {
-		conf_update(NULL);
+		conf_update(NULL, CONF_UPD_FNONE);
 	}
 
 	free(options->kasp_dir);
diff --git a/src/utils/kjournalprint/main.c b/src/utils/kjournalprint/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..2daa52bcd36b9c3d636df8f80cc99b18812ef141
--- /dev/null
+++ b/src/utils/kjournalprint/main.c
@@ -0,0 +1,265 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <getopt.h>
+
+#include "libknot/libknot.h"
+#include "knot/journal/journal.h"
+#include "knot/zone/zone-dump.h"
+#include "utils/common/exec.h"
+#include "contrib/strtonum.h"
+
+#define PROGRAM_NAME	"kjournalprint"
+
+#define RED		"\x1B[31m"
+#define GRN		"\x1B[32m"
+#define YLW		"\x1B[93m"
+#define RESET		"\x1B[0m"
+
+static void print_help(void)
+{
+	printf("Usage: %s [parameter] <journal_db> <zone_name>\n"
+	       "\n"
+	       "Parameters:\n"
+	       " -l, --limit <num>  Read only <num> newest changes.\n"
+	       " -n, --no-color     Get output without terminal coloring.\n"
+	       " -z, --zone-list    Instead of reading jurnal, display the list\n"
+	       "                    of zones in the DB (<zone_name> not needed).\n",
+	       PROGRAM_NAME);
+}
+
+static inline char *get_rrset(knot_rrset_t *rrset, char **buff, size_t *len)
+{
+	int ret = knot_rrset_txt_dump(rrset, buff, len, &KNOT_DUMP_STYLE_DEFAULT);
+	return (ret > 0) ? *buff : "Corrupted or missing!\n";
+}
+
+int print_journal(char *path, knot_dname_t *name, uint32_t limit, bool color)
+{
+	list_t db;
+	init_list(&db);
+
+	size_t buflen = 8192;
+	char *buff = malloc(buflen);
+	if (buff == NULL) {
+		return KNOT_ENOMEM;
+	}
+
+	journal_db_t *jdb = NULL;
+	journal_t *j = journal_new();
+	int ret;
+
+	ret = journal_db_init(&jdb, path, 1);
+	if (ret != KNOT_EOK) {
+		journal_free(&j);
+		free(buff);
+		return ret;
+	}
+
+	if (!journal_exists(&jdb, name)) {
+		fprintf(stderr, "This zone does not exist in DB %s\n", path);
+		ret = KNOT_ENOENT;
+	}
+
+	if (ret == KNOT_EOK) {
+		ret = journal_open(j, &jdb, name);
+	}
+	if (ret != KNOT_EOK) {
+		journal_free(&j);
+		journal_db_close(&jdb);
+		free(buff);
+		return ret;
+	}
+
+	bool is_empty;
+	uint32_t serial_from, serial_to;
+	journal_metadata_info(j, &is_empty, &serial_from, &serial_to);
+	if (is_empty) {
+		ret = KNOT_ENOENT;
+		goto pj_finally;
+	}
+
+	ret = journal_load_changesets(j, &db, serial_from);
+	if (ret != KNOT_EOK) {
+		goto pj_finally;
+	}
+
+	changeset_t *chs = NULL;
+
+	size_t db_remains = list_size(&db);
+
+	WALK_LIST(chs, db) {
+		if (--db_remains >= limit && limit > 0) {
+			continue;
+		}
+
+		printf(color ? YLW : "");
+		printf(";; Changes between zone versions: %u -> %u\n",
+		       knot_soa_serial(&chs->soa_from->rrs),
+		       knot_soa_serial(&chs->soa_to->rrs));
+
+		// Removed.
+		printf(color ? RED : "");
+		printf(";; Removed\n");
+		printf("%s", get_rrset(chs->soa_from, &buff, &buflen));
+		zone_dump_text(chs->remove, stdout, false);
+
+		// Added.
+		printf(color ? GRN : "");
+		printf(";; Added\n");
+		printf("%s", get_rrset(chs->soa_to, &buff, &buflen));
+		zone_dump_text(chs->add, stdout, false);
+		printf(color ? RESET : "");
+	}
+
+	changesets_free(&db);
+
+pj_finally:
+	free(buff);
+	journal_close(j);
+	journal_free(&j);
+	journal_db_close(&jdb);
+
+	return ret;
+}
+
+int list_zones(char *path)
+{
+	journal_db_t *jdb = NULL;
+	int ret = journal_db_init(&jdb, path, 1);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	list_t zones;
+	init_list(&zones);
+	ret = journal_db_list_zones(&jdb, &zones);
+	if (ret == KNOT_EOK) {
+		ptrnode_t *zn;
+		WALK_LIST(zn, zones) {
+			printf("%s\n", (char *)zn->d);
+			free(zn->d);
+		}
+		ptrlist_free(&zones, NULL);
+	}
+
+	journal_db_close(&jdb);
+	return ret;
+}
+
+int main(int argc, char *argv[])
+{
+	uint32_t limit = 0;
+	bool color = true, justlist = false;
+
+	struct option opts[] = {
+		{ "limit",     required_argument, NULL, 'l' },
+		{ "no-color",  no_argument,       NULL, 'n' },
+		{ "zone-list", no_argument,       NULL, 'z' },
+		{ "help",      no_argument,       NULL, 'h' },
+		{ "version",   no_argument,       NULL, 'V' },
+		{ NULL }
+	};
+
+	int opt = 0;
+	while ((opt = getopt_long(argc, argv, "l:nzhV", opts, NULL)) != -1) {
+		switch (opt) {
+		case 'l':
+			if (str_to_u32(optarg, &limit) != KNOT_EOK) {
+				print_help();
+				return EXIT_FAILURE;
+			}
+			break;
+		case 'n':
+			color = false;
+			break;
+		case 'z':
+			justlist = true;
+			break;
+		case 'h':
+			print_help();
+			return EXIT_SUCCESS;
+		case 'V':
+			print_version(PROGRAM_NAME);
+			return EXIT_SUCCESS;
+		default:
+			print_help();
+			return EXIT_FAILURE;
+		}
+	}
+
+	char *db = NULL;
+	knot_dname_t *name = NULL;
+
+	switch (argc - optind) {
+	case 2:
+		name = knot_dname_from_str_alloc(argv[optind + 1]);
+		// FALLTHROUGH
+	case 1:
+		db = argv[optind];
+		break;
+	default:
+		print_help();
+		return EXIT_FAILURE;
+	}
+
+	if (db == NULL) {
+		fprintf(stderr, "Journal DB path not specified\n");
+		return EXIT_FAILURE;
+	}
+
+	if (justlist) {
+		int ret = list_zones(db);
+		switch (ret) {
+		case KNOT_ENOENT:
+			printf("No zones in journal DB\n");
+			// FALLTHROUGH
+		case KNOT_EOK:
+			return EXIT_SUCCESS;
+		case KNOT_EMALF:
+			fprintf(stderr, "The journal DB is broken\n");
+			return EXIT_FAILURE;
+		default:
+			fprintf(stderr, "Failed to load zone list (%s)\n", knot_strerror(ret));
+			return EXIT_FAILURE;
+		}
+	}
+
+	if (name == NULL) {
+		fprintf(stderr, "Zone not specified\n");
+		return EXIT_FAILURE;
+	}
+
+	int ret = print_journal(db, name, limit, color);
+	free(name);
+
+	switch (ret) {
+	case KNOT_ENOENT:
+		printf("The journal is empty\n");
+		break;
+	case KNOT_EOUTOFZONE:
+		fprintf(stderr, "The specified journal DB does not contain the specified zone\n");
+		return EXIT_FAILURE;
+	case KNOT_EOK:
+		break;
+	default:
+		fprintf(stderr, "Failed to load changesets (%s)\n", knot_strerror(ret));
+		return EXIT_FAILURE;
+	}
+
+	return EXIT_SUCCESS;
+}
diff --git a/src/utils/knot1to2/cf-lex.c b/src/utils/knot1to2/cf-lex.c
index b50c1ee35c816cc39b084cae31940edf38d105af..4d42ef08525dfa8af8cec4b7ae469a651942a2ab 100644
--- a/src/utils/knot1to2/cf-lex.c
+++ b/src/utils/knot1to2/cf-lex.c
@@ -197,7 +197,7 @@ typedef size_t yy_size_t;
      */
     #define  YY_LESS_LINENO(n) \
             do { \
-                yy_size_t yyl;\
+                int yyl;\
                 for ( yyl = n; yyl < yyleng; ++yyl )\
                     if ( yytext[yyl] == '\n' )\
                         --yylineno;\
@@ -215,7 +215,7 @@ typedef size_t yy_size_t;
 	do \
 		{ \
 		/* Undo effects of setting up yytext. */ \
-        yy_size_t yyless_macro_arg = (n); \
+        int yyless_macro_arg = (n); \
         YY_LESS_LINENO(yyless_macro_arg);\
 		*yy_cp = yyg->yy_hold_char; \
 		YY_RESTORE_YY_MORE_OFFSET \
@@ -243,7 +243,7 @@ struct yy_buffer_state
 	/* Number of characters read into yy_ch_buf, not including EOB
 	 * characters.
 	 */
-	yy_size_t yy_n_chars;
+	int yy_n_chars;
 
 	/* Whether we "own" the buffer - i.e., we know we created it,
 	 * and can realloc() it to grow it, and should free() it to
@@ -930,7 +930,7 @@ struct yyguts_t
     size_t yy_buffer_stack_max; /**< capacity of stack. */
     YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
     char yy_hold_char;
-    yy_size_t yy_n_chars;
+    int yy_n_chars;
     yy_size_t yyleng_r;
     char *yy_c_buf_p;
     int yy_init;
@@ -2170,9 +2170,9 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 	else
 		ret_val = EOB_ACT_CONTINUE_SCAN;
 
-	if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+	if ((int) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
 		/* Extend the array by 50%, plus the number we really need. */
-		yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+		int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
 		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) cf_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
 		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
 			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
@@ -2572,7 +2572,7 @@ static void cf_ensure_buffer_stack (yyscan_t yyscanner)
 		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
 		 * immediate realloc on the next call.
          */
-		num_to_alloc = 1; // After all that talk, this was set to 1 anyways...
+		num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
 		yyg->yy_buffer_stack = (struct yy_buffer_state**)cf_alloc
 								(num_to_alloc * sizeof(struct yy_buffer_state*)
 								, yyscanner);
@@ -2710,7 +2710,7 @@ static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
 	do \
 		{ \
 		/* Undo effects of setting up yytext. */ \
-        yy_size_t yyless_macro_arg = (n); \
+        int yyless_macro_arg = (n); \
         YY_LESS_LINENO(yyless_macro_arg);\
 		yytext[yyleng] = yyg->yy_hold_char; \
 		yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
diff --git a/src/utils/knot1to2/cf-parse.tab.c b/src/utils/knot1to2/cf-parse.tab.c
index 380d3867ed617fca02aeab2c7452087760533834..636066e8a656c694d690d53347ea3ff641a045f0 100644
--- a/src/utils/knot1to2/cf-parse.tab.c
+++ b/src/utils/knot1to2/cf-parse.tab.c
@@ -284,7 +284,7 @@ static void acl_next(void *scanner, const char *value)
 
 	if (extra->run == S_FIRST) {
 		if (trie != NULL) {
-			hattrie_iter_t *it = hattrie_iter_begin(*trie, false);
+			hattrie_iter_t *it = hattrie_iter_begin(*trie);
 			for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 				size_t len = 0;
 				const char *data = hattrie_iter_key(it, &len);
@@ -306,7 +306,7 @@ static void acl_next(void *scanner, const char *value)
 
 	if (trie != NULL) {
 		bool init = true;
-		hattrie_iter_t *it = hattrie_iter_begin(*trie, false);
+		hattrie_iter_t *it = hattrie_iter_begin(*trie);
 		for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 			size_t len = 0;
 			const char *data = hattrie_iter_key(it, &len);
@@ -383,7 +383,7 @@ static void grp_init(void *scanner, const char *name)
 		hattrie_t **trie = (hattrie_t **)hattrie_get(extra->share->groups,
 		                                             name, strlen(name));
 		if (*trie == NULL) {
-			*trie = hattrie_create();
+			*trie = hattrie_create(NULL);
 		}
 		extra->current_trie = *trie;
 	}
diff --git a/src/utils/knot1to2/cf-parse.y b/src/utils/knot1to2/cf-parse.y
index 855761fa9475ea26498a0b810fa7ca75447b8a74..7c0732500b5820daadfccbefa70a06112e430b0d 100644
--- a/src/utils/knot1to2/cf-parse.y
+++ b/src/utils/knot1to2/cf-parse.y
@@ -228,7 +228,7 @@ static void acl_next(void *scanner, const char *value)
 
 	if (extra->run == S_FIRST) {
 		if (trie != NULL) {
-			hattrie_iter_t *it = hattrie_iter_begin(*trie, false);
+			hattrie_iter_t *it = hattrie_iter_begin(*trie);
 			for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 				size_t len = 0;
 				const char *data = hattrie_iter_key(it, &len);
@@ -250,7 +250,7 @@ static void acl_next(void *scanner, const char *value)
 
 	if (trie != NULL) {
 		bool init = true;
-		hattrie_iter_t *it = hattrie_iter_begin(*trie, false);
+		hattrie_iter_t *it = hattrie_iter_begin(*trie);
 		for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 			size_t len = 0;
 			const char *data = hattrie_iter_key(it, &len);
@@ -327,7 +327,7 @@ static void grp_init(void *scanner, const char *name)
 		hattrie_t **trie = (hattrie_t **)hattrie_get(extra->share->groups,
 		                                             name, strlen(name));
 		if (*trie == NULL) {
-			*trie = hattrie_create();
+			*trie = hattrie_create(NULL);
 		}
 		extra->current_trie = *trie;
 	}
diff --git a/src/utils/knot1to2/main.c b/src/utils/knot1to2/main.c
index 06624ce6c137cc823f2c28748284834c7fa93c6e..e01540814e1b5173bd544c463ad79bc4646a6854 100644
--- a/src/utils/knot1to2/main.c
+++ b/src/utils/knot1to2/main.c
@@ -75,12 +75,12 @@ static int convert(const char *file_out, const char *file_in)
 
 	share_t share = {
 		.out = out,
-		.ifaces = hattrie_create(),
-		.groups = hattrie_create(),
-		.remotes = hattrie_create(),
-		.acl_xfer = hattrie_create(),
-		.acl_notify = hattrie_create(),
-		.acl_update = hattrie_create()
+		.ifaces = hattrie_create(NULL),
+		.groups = hattrie_create(NULL),
+		.remotes = hattrie_create(NULL),
+		.acl_xfer = hattrie_create(NULL),
+		.acl_notify = hattrie_create(NULL),
+		.acl_update = hattrie_create(NULL)
 	};
 
 	// Parse the input file multiple times to get some context.
@@ -93,7 +93,7 @@ static int convert(const char *file_out, const char *file_in)
 	}
 
 	// Remove ifaces data.
-	hattrie_iter_t *it = hattrie_iter_begin(share.ifaces, false);
+	hattrie_iter_t *it = hattrie_iter_begin(share.ifaces);
 	for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 		char *data = *hattrie_iter_val(it);
 		free(data);
@@ -101,7 +101,7 @@ static int convert(const char *file_out, const char *file_in)
 	hattrie_iter_free(it);
 
 	// Remove groups data.
-	it = hattrie_iter_begin(share.groups, false);
+	it = hattrie_iter_begin(share.groups);
 	for (; !hattrie_iter_finished(it); hattrie_iter_next(it)) {
 		hattrie_t *trie = *hattrie_iter_val(it);
 		hattrie_free(trie);
diff --git a/src/utils/knotc/commands.c b/src/utils/knotc/commands.c
index 6fb776855a735488099f92f37116b0e3361f0d98..afcd8fe1e48783e37c2dfb960d434ab1dbcddc86 100644
--- a/src/utils/knotc/commands.c
+++ b/src/utils/knotc/commands.c
@@ -36,6 +36,7 @@
 #define CMD_STATUS		"status"
 #define CMD_STOP		"stop"
 #define CMD_RELOAD		"reload"
+#define CMD_STATS		"stats"
 
 #define CMD_ZONE_CHECK		"zone-check"
 #define CMD_ZONE_MEMSTATS	"zone-memstats"
@@ -55,6 +56,7 @@
 #define CMD_ZONE_SET		"zone-set"
 #define CMD_ZONE_UNSET		"zone-unset"
 #define CMD_ZONE_PURGE		"zone-purge"
+#define CMD_ZONE_STATS		"zone-stats"
 
 #define CMD_CONF_INIT		"conf-init"
 #define CMD_CONF_CHECK		"conf-check"
@@ -270,26 +272,43 @@ static void format_data(ctl_cmd_t cmd, knot_ctl_type_t data_type,
 	case CTL_ZONE_GET:
 	case CTL_ZONE_SET:
 	case CTL_ZONE_UNSET:
-		if (data_type == KNOT_CTL_TYPE_DATA) {
-			printf("%s%s%s%s%s%s%s%s%s%s%s%s%s",
-			       (!(*empty)     ? "\n"       : ""),
-			       (error != NULL ? "error: (" : ""),
-			       (error != NULL ? error      : ""),
-			       (error != NULL ? ") "       : ""),
-			       (zone  != NULL ? "["        : ""),
-			       (zone  != NULL ? zone       : ""),
-			       (zone  != NULL ? "] "       : ""),
-			       (sign  != NULL ? sign       : ""),
-			       (owner != NULL ? owner      : ""),
-			       (ttl   != NULL ? " "        : ""),
-			       (ttl   != NULL ? ttl        : ""),
-			       (type  != NULL ? " "        : ""),
-			       (type  != NULL ? type       : ""));
-			*empty = false;
-		}
-		if (value != NULL) {
-			printf(" %s", value);
-		}
+		printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+		       (!(*empty)     ? "\n"       : ""),
+		       (error != NULL ? "error: (" : ""),
+		       (error != NULL ? error      : ""),
+		       (error != NULL ? ") "       : ""),
+		       (zone  != NULL ? "["        : ""),
+		       (zone  != NULL ? zone       : ""),
+		       (zone  != NULL ? "] "       : ""),
+		       (sign  != NULL ? sign       : ""),
+		       (owner != NULL ? owner      : ""),
+		       (ttl   != NULL ? " "        : ""),
+		       (ttl   != NULL ? ttl        : ""),
+		       (type  != NULL ? " "        : ""),
+		       (type  != NULL ? type       : ""),
+		       (value != NULL ? " "        : ""),
+		       (value != NULL ? value      : ""));
+		*empty = false;
+		break;
+	case CTL_STATS:
+	case CTL_ZONE_STATS:
+		printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+		       (!(*empty)     ? "\n"       : ""),
+		       (error != NULL ? "error: (" : ""),
+		       (error != NULL ? error      : ""),
+		       (error != NULL ? ") "       : ""),
+		       (zone  != NULL ? "["        : ""),
+		       (zone  != NULL ? zone       : ""),
+		       (zone  != NULL ? "] "       : ""),
+		       (key0  != NULL ? key0       : ""),
+		       (key1  != NULL ? "."        : ""),
+		       (key1  != NULL ? key1       : ""),
+		       (id    != NULL ? "["        : ""),
+		       (id    != NULL ? id         : ""),
+		       (id    != NULL ? "]"        : ""),
+		       (value != NULL ? " = "      : ""),
+		       (value != NULL ? value      : ""));
+		*empty = false;
 		break;
 	default:
 		assert(0);
@@ -334,6 +353,8 @@ static void format_block(ctl_cmd_t cmd, bool failed, bool empty)
 	case CTL_CONF_READ:
 	case CTL_CONF_DIFF:
 	case CTL_CONF_GET:
+	case CTL_ZONE_STATS:
+	case CTL_STATS:
 		printf("%s", empty ? "" : "\n");
 		break;
 	default:
@@ -409,6 +430,75 @@ static int cmd_ctl(cmd_args_t *args)
 	return ctl_receive(args);
 }
 
+static int set_stats_items(cmd_args_t *args, knot_ctl_data_t *data)
+{
+	int min_args, max_args;
+	switch (args->desc->cmd) {
+	case CTL_STATS:      min_args = 0; max_args = 1; break;
+	case CTL_ZONE_STATS: min_args = 1; max_args = 2; break;
+	default:
+		assert(0);
+		return KNOT_EINVAL;
+	}
+
+	// Check the number of arguments.
+	int ret = check_args(args, min_args, max_args);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	int idx = 0;
+
+	// Set ZONE name.
+	if (args->argc > idx && args->desc->cmd == CTL_ZONE_STATS) {
+		if (strcmp(args->argv[idx], "--") != 0) {
+			(*data)[KNOT_CTL_IDX_ZONE] = args->argv[idx];
+		}
+		idx++;
+	}
+
+	if (args->argc > idx) {
+		(*data)[KNOT_CTL_IDX_SECTION] = args->argv[idx];
+
+		char *item = strchr(args->argv[idx], '.');
+		if (item != NULL) {
+			// Separate section and item.
+			*item++ = '\0';
+			(*data)[KNOT_CTL_IDX_ITEM] = item;
+		}
+	}
+
+	return KNOT_EOK;
+}
+
+static int cmd_stats_ctl(cmd_args_t *args)
+{
+	knot_ctl_data_t data = {
+		[KNOT_CTL_IDX_CMD] = ctl_cmd_to_str(args->desc->cmd),
+		[KNOT_CTL_IDX_FLAGS] = args->force ? CTL_FLAG_FORCE : NULL
+	};
+
+	int ret = set_stats_items(args, &data);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
+	ret = knot_ctl_send(args->ctl, KNOT_CTL_TYPE_DATA, &data);
+	if (ret != KNOT_EOK) {
+		log_error(CTL_LOG_STR" (%s)", knot_strerror(ret));
+		return ret;
+	}
+
+	// Finish the input block.
+	ret = knot_ctl_send(args->ctl, KNOT_CTL_TYPE_BLOCK, NULL);
+	if (ret != KNOT_EOK) {
+		log_error(CTL_LOG_STR" (%s)", knot_strerror(ret));
+		return ret;
+	}
+
+	return ctl_receive(args);
+}
+
 static int zone_exec(cmd_args_t *args, int (*fcn)(const knot_dname_t *, void *),
                      void *data)
 {
@@ -481,7 +571,7 @@ static int zone_memstats(const knot_dname_t *dname, void *data)
 
 	// Init memory estimation context.
 	zone_estim_t est = {
-		.node_table = hattrie_create_n(TRIE_BUCKET_SIZE, &mem_ctx),
+		.node_table = hattrie_create(&mem_ctx),
 	};
 
 	char buff[KNOT_DNAME_TXT_MAXLEN + 1];
@@ -516,16 +606,12 @@ static int zone_memstats(const knot_dname_t *dname, void *data)
 	zs_deinit(zs);
 	free(zs);
 
-	// Only size of ahtables inside trie's nodes is missing.
-	assert(est.htable_size == 0);
-	est.htable_size = estimator_trie_htable_memsize(est.node_table);
-
 	// Cleanup.
 	hattrie_apply_rev(est.node_table, estimator_free_trie_node, NULL);
 	hattrie_free(est.node_table);
 
 	double zone_size = (est.rdata_size + est.node_size + est.dname_size +
-	                    est.htable_size + malloc_size) / (1024.0 * 1024.0);
+	                    malloc_size) / (1024.0 * 1024.0);
 
 	log_zone_info(dname, "%zu records, %.1f MiB memory",
 	              est.record_count, zone_size);
@@ -874,6 +960,7 @@ const cmd_desc_t cmd_table[] = {
 	{ CMD_STATUS,          cmd_ctl,           CTL_STATUS },
 	{ CMD_STOP,            cmd_ctl,           CTL_STOP },
 	{ CMD_RELOAD,          cmd_ctl,           CTL_RELOAD },
+	{ CMD_STATS,           cmd_stats_ctl,     CTL_STATS },
 
 	{ CMD_ZONE_CHECK,      cmd_zone_check,    CTL_NONE,            CMD_FOPT_ZONE | CMD_FREAD },
 	{ CMD_ZONE_MEMSTATS,   cmd_zone_memstats, CTL_NONE,            CMD_FOPT_ZONE | CMD_FREAD },
@@ -893,6 +980,7 @@ const cmd_desc_t cmd_table[] = {
 	{ CMD_ZONE_SET,        cmd_zone_node_ctl, CTL_ZONE_SET,        CMD_FREQ_ZONE },
 	{ CMD_ZONE_UNSET,      cmd_zone_node_ctl, CTL_ZONE_UNSET,      CMD_FREQ_ZONE },
 	{ CMD_ZONE_PURGE,      cmd_zone_ctl,      CTL_ZONE_PURGE,      CMD_FREQ_ZONE },
+	{ CMD_ZONE_STATS,      cmd_stats_ctl,     CTL_ZONE_STATS,      CMD_FREQ_ZONE },
 
 	{ CMD_CONF_INIT,       cmd_conf_init,     CTL_NONE,            CMD_FWRITE },
 	{ CMD_CONF_CHECK,      cmd_conf_check,    CTL_NONE,            CMD_FREAD },
@@ -916,6 +1004,7 @@ static const cmd_help_t cmd_help_table[] = {
 	{ CMD_STATUS,          "",                                       "Check if the server is running." },
 	{ CMD_STOP,            "",                                       "Stop the server if running." },
 	{ CMD_RELOAD,          "",                                       "Reload the server configuration and modified zones." },
+	{ CMD_STATS,           "[<module>[.<counter>]]",                 "Show global statistics counter(s)." },
 	{ "",                  "",                                       "" },
 	{ CMD_ZONE_CHECK,      "[<zone>...]",                            "Check if the zone can be loaded. (*)" },
 	{ CMD_ZONE_MEMSTATS,   "[<zone>...]",                            "Estimate memory use for the zone. (*)" },
@@ -934,7 +1023,8 @@ static const cmd_help_t cmd_help_table[] = {
 	{ CMD_ZONE_GET,        "<zone> [<owner> [<type>]]",              "Get zone data within the transaction." },
 	{ CMD_ZONE_SET,        "<zone>  <owner> [<ttl>] <type> <rdata>", "Add zone record within the transaction." },
 	{ CMD_ZONE_UNSET,      "<zone>  <owner> [<type> [<rdata>]]",     "Remove zone data within the transaction." },
-	{ CMD_ZONE_PURGE,      "<zone>...",                              "Purge zone data, zone file, and zone journal." },
+	{ CMD_ZONE_PURGE,      "<zone>...",                              "Purge zone data, file, journal, and timers." },
+	{ CMD_ZONE_STATS,      "<zone> [<module>[.<counter>]]",          "Show zone statistics counter(s)."},
 	{ "",                  "",                                       "" },
 	{ CMD_CONF_INIT,       "",                                       "Initialize the confdb. (*)" },
 	{ CMD_CONF_CHECK,      "",                                       "Check the server configuration. (*)" },
diff --git a/src/utils/knotc/estimator.c b/src/utils/knotc/estimator.c
index 12966f249161a181d7b6db5ae70364bace3f8917..574c99eb74a2a50a707d6ffa06bba0e81bd9833d 100644
--- a/src/utils/knotc/estimator.c
+++ b/src/utils/knotc/estimator.c
@@ -134,39 +134,6 @@ void estimator_free(void *p)
 	free(p);
 }
 
-static int get_htable_size(void *t, void *d)
-{
-	hhash_t *table = (hhash_t *)t;
-	size_t *size = (size_t *)d;
-
-	/* Size of the empty table. */
-	*size += add_overhead(sizeof(hhash_t) + table->size * sizeof(hhelem_t));
-
-	/* Allocated keys. */
-	uint16_t key_len = 0;
-	hhash_iter_t it;
-	hhash_iter_begin(table, &it, false);
-	while (!hhash_iter_finished(&it)) {
-		(void)hhash_iter_key(&it, &key_len);
-		*size += add_overhead(sizeof(value_t) + sizeof(uint16_t) + key_len);
-		hhash_iter_next(&it);
-	}
-
-	return KNOT_EOK;
-}
-
-size_t estimator_trie_htable_memsize(hattrie_t *table)
-{
-	/*
-	 * Iterate through trie's node, and get stats from each htable.
-	 * Space taken up by the trie itself is measured using malloc wrapper.
-	 * (Even for large zones, space taken by trie itself is very small)
-	 */
-	size_t size = 0;
-	hattrie_apply_rev_ahtable(table, get_htable_size, &size);
-	return size;
-}
-
 void estimator_rrset_memsize_wrap(zs_scanner_t *scanner)
 {
 	rrset_memsize(scanner->process.data, scanner);
diff --git a/src/utils/knotc/estimator.h b/src/utils/knotc/estimator.h
index 154a77649fb0eedf5046536aef0584f32c54c2a7..af9ae648ba1642bbc7cb3aff9c6056a6feae5af0 100644
--- a/src/utils/knotc/estimator.h
+++ b/src/utils/knotc/estimator.h
@@ -35,7 +35,6 @@ typedef struct {
 	size_t rdata_size;     /*!< Estimated RDATA size. */
 	size_t dname_size;     /*!< Estimated DNAME size. */
 	size_t node_size;      /*!< Estimated node size. */
-	size_t htable_size;    /*!< Estimated ahtable size. */
 	size_t record_count;   /*!< Total record count for zone. */
 } zone_estim_t;
 
@@ -57,13 +56,6 @@ void *estimator_malloc(void *ctx, size_t len);
  */
 void estimator_free(void *p);
 
-/*!
- * \brief Goes through trie's ahtables and estimates their memory requirements.
- *
- * \param table Trie to traverse.
- */
-size_t estimator_trie_htable_memsize(hattrie_t *table);
-
 /*!
  * \brief For use with scanner - counts memsize of RRSets.
  *
diff --git a/src/utils/knotc/interactive.c b/src/utils/knotc/interactive.c
index 576491c4c74f082fb38976e4c5043b0aaed46f3e..54ef8ea40d1c20a56f5d1976b92070a1841f266c 100644
--- a/src/utils/knotc/interactive.c
+++ b/src/utils/knotc/interactive.c
@@ -44,7 +44,6 @@ static void cmds_lookup(EditLine *el, const char *str, size_t str_len)
 		}
 	}
 
-	lookup_index(&lookup);
 	lookup_complete(&lookup, str, str_len, el, true);
 
 cmds_lookup_finish:
@@ -73,7 +72,6 @@ static void local_zones_lookup(EditLine *el, const char *str, size_t str_len)
 		}
 	}
 
-	lookup_index(&lookup);
 	lookup_complete(&lookup, str, str_len, el, true);
 
 local_zones_lookup_finish:
@@ -173,7 +171,6 @@ static void id_lookup(EditLine *el, const char *str, size_t str_len,
 		}
 	}
 
-	lookup_index(&lookup);
 	lookup_complete(&lookup, str, str_len, el, add_space);
 
 id_lookup_finish:
@@ -229,7 +226,6 @@ static void list_lookup(EditLine *el, const char *section, const char *item)
 		}
 	}
 
-	lookup_index(&lookup);
 	lookup_complete(&lookup, item, strlen(item), el, section != NULL);
 
 list_lookup_finish:
@@ -345,7 +341,7 @@ static unsigned char complete(EditLine *el, int ch)
 	}
 
 complete_exit:
-	conf_update(NULL);
+	conf_update(NULL, CONF_UPD_FNONE);
 	tok_reset(tok);
 	tok_end(tok);
 
diff --git a/src/utils/knotc/main.c b/src/utils/knotc/main.c
index 1c33226779ffd82853cebaee1dba443d3a9b0209..fd1e40398dfe3d6616614108e46f00e792c2bd38 100644
--- a/src/utils/knotc/main.c
+++ b/src/utils/knotc/main.c
@@ -111,12 +111,13 @@ int main(int argc, char **argv)
 
 	/* Set up simplified logging just to stdout/stderr. */
 	log_init();
-	log_levels_set(LOGT_STDOUT, LOG_ANY, LOG_MASK(LOG_INFO) | LOG_MASK(LOG_NOTICE));
-	log_levels_set(LOGT_STDERR, LOG_ANY, LOG_UPTO(LOG_WARNING));
-	log_levels_set(LOGT_SYSLOG, LOG_ANY, 0);
-	log_flag_set(LOG_FNO_TIMESTAMP | LOG_FNO_INFO);
+	log_levels_set(LOG_TARGET_STDOUT, LOG_SOURCE_ANY,
+	               LOG_MASK(LOG_INFO) | LOG_MASK(LOG_NOTICE));
+	log_levels_set(LOG_TARGET_STDERR, LOG_SOURCE_ANY, LOG_UPTO(LOG_WARNING));
+	log_levels_set(LOG_TARGET_SYSLOG, LOG_SOURCE_ANY, 0);
+	log_flag_set(LOG_FLAG_NOTIMESTAMP | LOG_FLAG_NOINFO);
 	if (params.verbose) {
-		log_levels_add(LOGT_STDOUT, LOG_ANY, LOG_MASK(LOG_DEBUG));
+		log_levels_add(LOG_TARGET_STDOUT, LOG_SOURCE_ANY, LOG_MASK(LOG_DEBUG));
 	}
 
 	int ret;
diff --git a/src/utils/knotc/process.c b/src/utils/knotc/process.c
index 48f48deadc3ea5bfb2de203a42df200b3c99a1e6..ef31c7af73a18b4d50b3b6c2b2e0c349f6aff8f5 100644
--- a/src/utils/knotc/process.c
+++ b/src/utils/knotc/process.c
@@ -53,8 +53,8 @@ int set_config(const cmd_desc_t *desc, params_t *params)
 	struct stat st;
 	bool import = false;
 	if (flags == CMD_FNONE && params->socket != NULL) {
-		import = false;
-		params->confdb = NULL;
+		/* Control operation, known socket, skip configuration. */
+		return KNOT_EOK;
 	} else if (params->confdb != NULL) {
 		import = false;
 	} else if (flags == CMD_FWRITE) {
@@ -105,7 +105,7 @@ int set_config(const cmd_desc_t *desc, params_t *params)
 	}
 
 	/* Update to the new config. */
-	conf_update(new_conf);
+	conf_update(new_conf, CONF_UPD_FNONE);
 
 	return KNOT_EOK;
 }
@@ -216,7 +216,7 @@ int process_cmd(int argc, const char **argv, params_t *params)
 	/* Set control interface if necessary. */
 	ret = set_ctl(&args.ctl, desc, params);
 	if (ret != KNOT_EOK) {
-		conf_update(NULL);
+		conf_update(NULL, CONF_UPD_FNONE);
 		return ret;
 	}
 
@@ -225,7 +225,7 @@ int process_cmd(int argc, const char **argv, params_t *params)
 
 	/* Cleanup */
 	unset_ctl(args.ctl);
-	conf_update(NULL);
+	conf_update(NULL, CONF_UPD_FNONE);
 
 	return ret;
 }
diff --git a/src/utils/knotd/main.c b/src/utils/knotd/main.c
index 0df24766012f5ba672cef5b54d7e087437dc2131..4563ff9928c63bb89a96aa7da6675b474ba5b0b6 100644
--- a/src/utils/knotd/main.c
+++ b/src/utils/knotd/main.c
@@ -15,6 +15,7 @@
  */
 
 #include <dirent.h>
+#include <fcntl.h>
 #include <poll.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -36,8 +37,10 @@
 #include "libknot/libknot.h"
 #include "knot/ctl/process.h"
 #include "knot/conf/conf.h"
+#include "knot/conf/migration.h"
 #include "knot/common/log.h"
 #include "knot/common/process.h"
+#include "knot/common/stats.h"
 #include "knot/server/server.h"
 #include "knot/server/tcp-handler.h"
 #include "knot/zone/timers.h"
@@ -214,28 +217,34 @@ static void setup_capabilities(void)
 }
 
 /*! \brief Event loop listening for signals and remote commands. */
-static void event_loop(server_t *server, char *socket)
+static void event_loop(server_t *server, const char *socket)
 {
+	knot_ctl_t *ctl = knot_ctl_alloc();
+	if (ctl == NULL) {
+		log_fatal("control, failed to initialize (%s)",
+		          knot_strerror(KNOT_ENOMEM));
+		return;
+	}
+
+	// Set control timeout.
+	knot_ctl_set_timeout(ctl, conf()->cache.ctl_timeout);
+
 	/* Get control socket configuration. */
-	char *listen = socket;
+	char *listen;
 	if (socket == NULL) {
 		conf_val_t listen_val = conf_get(conf(), C_CTL, C_LISTEN);
 		conf_val_t rundir_val = conf_get(conf(), C_SRV, C_RUNDIR);
 		char *rundir = conf_abs_path(&rundir_val, NULL);
 		listen = conf_abs_path(&listen_val, rundir);
 		free(rundir);
+	} else {
+		listen = strdup(socket);
 	}
-
-	knot_ctl_t *ctl = knot_ctl_alloc();
-	if (ctl == NULL) {
-		log_fatal("control, failed to initialize (%s)",
-		          knot_strerror(KNOT_ENOMEM));
+	if (listen == NULL) {
+		log_fatal("control, empty socket path");
 		return;
 	}
 
-	// Set control timeout.
-	knot_ctl_set_timeout(ctl, conf()->cache.ctl_timeout);
-
 	log_info("control, binding to '%s'", listen);
 
 	/* Bind the control socket. */
@@ -244,12 +253,10 @@ static void event_loop(server_t *server, char *socket)
 		knot_ctl_free(ctl);
 		log_fatal("control, failed to bind socket '%s' (%s)",
 		          listen, knot_strerror(ret));
-		return;
-	}
-
-	if (socket == NULL) {
 		free(listen);
+		return;
 	}
+	free(listen);
 
 	enable_signals();
 
@@ -261,7 +268,7 @@ static void event_loop(server_t *server, char *socket)
 		}
 		if (sig_req_reload) {
 			sig_req_reload = false;
-			server_reload(server, conf()->filename, true);
+			server_reload(server);
 		}
 
 		// Update control timeout.
@@ -353,12 +360,18 @@ static int set_config(const char *confdb, const char *config)
 		}
 	}
 
+	// Migrate from old schema.
+	ret = conf_migrate(new_conf);
+	if (ret != KNOT_EOK) {
+		log_error("failed to migrate configuration (%s)", knot_strerror(ret));
+	}
+
 	/* Activate global query modules. */
 	conf_activate_modules(new_conf, NULL, &new_conf->query_modules,
 	                      &new_conf->query_plan);
 
 	/* Update to the new config. */
-	conf_update(new_conf);
+	conf_update(new_conf, CONF_UPD_FNONE);
 
 	return KNOT_EOK;
 }
@@ -456,7 +469,7 @@ int main(int argc, char **argv)
 	/* Initialize logging subsystem. */
 	log_init();
 	if (verbose) {
-		log_levels_add(LOGT_STDOUT, LOG_ANY, LOG_MASK(LOG_DEBUG));
+		log_levels_add(LOG_TARGET_STDOUT, LOG_SOURCE_ANY, LOG_MASK(LOG_DEBUG));
 	}
 
 	/* Set up the configuration */
@@ -530,6 +543,8 @@ int main(int argc, char **argv)
 		log_warning("no zones loaded");
 	}
 
+	stats_reconfigure(conf(), &server);
+
 	/* Start it up. */
 	log_info("starting server");
 	conf_val_t async_val = conf_get(conf(), C_SRV, C_ASYNC_START);
@@ -537,6 +552,7 @@ int main(int argc, char **argv)
 	if (ret != KNOT_EOK) {
 		log_fatal("failed to start server (%s)", knot_strerror(ret));
 		server_wait(&server);
+		stats_deinit();
 		server_deinit(&server);
 		rcu_unregister_thread();
 		pid_cleanup();
@@ -558,6 +574,7 @@ int main(int argc, char **argv)
 	/* Teardown server. */
 	server_stop(&server);
 	server_wait(&server);
+	stats_deinit();
 
 	// TODO: will be very slow, each write is in separate transation
 	log_info("updating zone timers database");
diff --git a/src/utils/knsupdate/knsupdate_exec.c b/src/utils/knsupdate/knsupdate_exec.c
index d62a86f8ded5d91a12dd7129228995d49a3e1580..5e70e99625027d1fcd0c86b359f80c033cb2f197 100644
--- a/src/utils/knsupdate/knsupdate_exec.c
+++ b/src/utils/knsupdate/knsupdate_exec.c
@@ -892,16 +892,10 @@ int cmd_send(const char* lp, knsupdate_params_t *params)
 	knsupdate_reset(params);
 
 	/* Check return code. */
-	uint8_t rc = knot_wire_get_rcode(params->answer->wire);
-	if (rc != KNOT_RCODE_NOERROR) {
-		const char *rcode_str = "Unknown";
-		const knot_lookup_t *rcode = knot_lookup_by_id(knot_rcode_names, rc);
-		if (rcode != NULL) {
-			rcode_str = rcode->name;
-		}
-
+	if (knot_pkt_ext_rcode(params->answer) != KNOT_RCODE_NOERROR) {
 		print_packet(params->answer, NULL, 0, -1, 0, true, &params->style);
-		ERR("update failed with '%s'\n", rcode_str);
+		ERR("update failed with error '%s'\n",
+		    knot_pkt_ext_rcode_name(params->answer));
 		ret = KNOT_ERROR;
 	} else {
 		DBG("update success\n");
diff --git a/src/utils/kzonecheck/main.c b/src/utils/kzonecheck/main.c
index e350405f7529eafb4b7ed17ed2d2e3e1f4d0febf..eaffe42acba69b512de302995c87ebaba6494717 100644
--- a/src/utils/kzonecheck/main.c
+++ b/src/utils/kzonecheck/main.c
@@ -28,23 +28,21 @@
 
 static void print_help(void)
 {
-	printf("Usage: %s [parameters] <zonefile>\n"
+	printf("Usage: %s [parameters] <filename>\n"
 	       "\n"
 	       "Parameters:\n"
-	       " -o, --origin <zone_origin>           Zone name\n"
-	       "                                      (default filename or\n"
-	       "                                      filename without trailing .zone)\n"
-	       " -v, --verbose                        Enable debug output.\n"
-	       " -h, --help                           Print the program help.\n"
-	       " -V, --version                        Print the program version.\n"
+	       " -o, --origin <zone_origin>  Zone name.\n"
+	       "                              (default filename or filename without .zone)\n"
+	       " -v, --verbose               Enable debug output.\n"
+	       " -h, --help                  Print the program help.\n"
+	       " -V, --version               Print the program version.\n"
 	       "\n",
 	       PROGRAM_NAME);
 }
 
 int main(int argc, char *argv[])
 {
-	char *filename = NULL;
-	char *zonename = NULL;
+	const char *origin = NULL;
 	bool verbose = false;
 	FILE *outfile = stdout;
 
@@ -58,11 +56,11 @@ int main(int argc, char *argv[])
 	};
 
 	/* Parse command line arguments */
-	int opt = 0, li = 0;
-	while ((opt = getopt_long(argc, argv, "o:vVh", opts, &li)) != -1) {
+	int opt = 0;
+	while ((opt = getopt_long(argc, argv, "o:vVh", opts, NULL)) != -1) {
 		switch (opt) {
 		case 'o':
-			zonename = strdup(optarg);
+			origin = optarg;
 			break;
 		case 'v':
 			verbose = true;
@@ -86,25 +84,30 @@ int main(int argc, char *argv[])
 		return EXIT_FAILURE;
 	}
 
-	filename = argv[optind];
+	char *filename = argv[optind];
 
-	if (zonename == NULL) {
-		/* Get zone name from file name */
+	char *zonename;
+	if (origin == NULL) {
+		/* Get zone name from file name. */
 		const char *ext = ".zone";
 		zonename = basename(filename);
 		if (strcmp(zonename + strlen(zonename) - strlen(ext), ext) == 0) {
 			zonename = strndup(zonename, strlen(zonename) - strlen(ext));
+		} else {
+			zonename = strdup(zonename);
 		}
+	} else {
+		zonename = strdup(origin);
 	}
 
 	/* TODO: Remove logging from zone loading. */
 	log_init();
-	log_levels_set(LOGT_STDOUT, LOG_ANY, LOG_MASK(LOG_ERR));
-	log_levels_set(LOGT_STDERR, LOG_ANY, 0);
-	log_levels_set(LOGT_SYSLOG, LOG_ANY, 0);
-	log_flag_set(LOG_FNO_TIMESTAMP | LOG_FNO_INFO);
+	log_levels_set(LOG_TARGET_STDOUT, LOG_SOURCE_ANY, LOG_MASK(LOG_ERR));
+	log_levels_set(LOG_TARGET_STDERR, LOG_SOURCE_ANY, 0);
+	log_levels_set(LOG_TARGET_SYSLOG, LOG_SOURCE_ANY, 0);
+	log_flag_set(LOG_FLAG_NOTIMESTAMP | LOG_FLAG_NOINFO);
 	if (verbose) {
-		log_levels_add(LOGT_STDOUT, LOG_ANY, LOG_MASK(LOG_DEBUG));
+		log_levels_add(LOG_TARGET_STDOUT, LOG_SOURCE_ANY, LOG_MASK(LOG_DEBUG));
 	}
 
 	knot_dname_t *dname = knot_dname_from_str_alloc(zonename);
@@ -117,7 +120,7 @@ int main(int argc, char *argv[])
 	switch (ret) {
 	case KNOT_EOK:
 		if (verbose) {
-			fprintf(outfile, "No sematic error found.\n");
+			fprintf(outfile, "No semantic error found.\n");
 		}
 		return EXIT_SUCCESS;
 	case KNOT_ESEMCHECK:
diff --git a/src/zscanner/scanner.c.g2 b/src/zscanner/scanner.c.g2
index 60250a7703e966a8128e4ad0249d0c82627c32a1..da8946c2b8d81a61a4932f858b9feef832953e03 100644
--- a/src/zscanner/scanner.c.g2
+++ b/src/zscanner/scanner.c.g2
@@ -97,7 +97,7 @@ int zs_init(
 	memset(s, 0, sizeof(*s));
 
 	// Nonzero initial scanner state.
-	s->cs = 1111;
+	s->cs = 1120;
 
 	// Reset the file descriptor.
 	s->file.descriptor = -1;
@@ -346,7 +346,7 @@ static void parse(
 
 _again:
 	switch ( cs ) {
-		case 1111: goto st1111;
+		case 1120: goto st1120;
 		case 0: goto st0;
 		case 1: goto st1;
 		case 2: goto st2;
@@ -360,7 +360,7 @@ _again:
 		case 10: goto st10;
 		case 11: goto st11;
 		case 12: goto st12;
-		case 1112: goto st1112;
+		case 1121: goto st1121;
 		case 13: goto st13;
 		case 14: goto st14;
 		case 15: goto st15;
@@ -488,7 +488,7 @@ _again:
 		case 137: goto st137;
 		case 138: goto st138;
 		case 139: goto st139;
-		case 1113: goto st1113;
+		case 1122: goto st1122;
 		case 140: goto st140;
 		case 141: goto st141;
 		case 142: goto st142;
@@ -499,7 +499,7 @@ _again:
 		case 147: goto st147;
 		case 148: goto st148;
 		case 149: goto st149;
-		case 1114: goto st1114;
+		case 1123: goto st1123;
 		case 150: goto st150;
 		case 151: goto st151;
 		case 152: goto st152;
@@ -508,11 +508,11 @@ _again:
 		case 155: goto st155;
 		case 156: goto st156;
 		case 157: goto st157;
-		case 1115: goto st1115;
+		case 1124: goto st1124;
 		case 158: goto st158;
 		case 159: goto st159;
 		case 160: goto st160;
-		case 1116: goto st1116;
+		case 1125: goto st1125;
 		case 161: goto st161;
 		case 162: goto st162;
 		case 163: goto st163;
@@ -524,12 +524,12 @@ _again:
 		case 169: goto st169;
 		case 170: goto st170;
 		case 171: goto st171;
-		case 1117: goto st1117;
+		case 1126: goto st1126;
 		case 172: goto st172;
 		case 173: goto st173;
 		case 174: goto st174;
 		case 175: goto st175;
-		case 1118: goto st1118;
+		case 1127: goto st1127;
 		case 176: goto st176;
 		case 177: goto st177;
 		case 178: goto st178;
@@ -546,7 +546,7 @@ _again:
 		case 189: goto st189;
 		case 190: goto st190;
 		case 191: goto st191;
-		case 1119: goto st1119;
+		case 1128: goto st1128;
 		case 192: goto st192;
 		case 193: goto st193;
 		case 194: goto st194;
@@ -563,7 +563,7 @@ _again:
 		case 205: goto st205;
 		case 206: goto st206;
 		case 207: goto st207;
-		case 1120: goto st1120;
+		case 1129: goto st1129;
 		case 208: goto st208;
 		case 209: goto st209;
 		case 210: goto st210;
@@ -619,10 +619,10 @@ _again:
 		case 260: goto st260;
 		case 261: goto st261;
 		case 262: goto st262;
-		case 1121: goto st1121;
+		case 1130: goto st1130;
 		case 263: goto st263;
 		case 264: goto st264;
-		case 1122: goto st1122;
+		case 1131: goto st1131;
 		case 265: goto st265;
 		case 266: goto st266;
 		case 267: goto st267;
@@ -632,8 +632,8 @@ _again:
 		case 271: goto st271;
 		case 272: goto st272;
 		case 273: goto st273;
-		case 1123: goto st1123;
-		case 1124: goto st1124;
+		case 1132: goto st1132;
+		case 1133: goto st1133;
 		case 274: goto st274;
 		case 275: goto st275;
 		case 276: goto st276;
@@ -648,7 +648,7 @@ _again:
 		case 285: goto st285;
 		case 286: goto st286;
 		case 287: goto st287;
-		case 1125: goto st1125;
+		case 1134: goto st1134;
 		case 288: goto st288;
 		case 289: goto st289;
 		case 290: goto st290;
@@ -659,7 +659,7 @@ _again:
 		case 295: goto st295;
 		case 296: goto st296;
 		case 297: goto st297;
-		case 1126: goto st1126;
+		case 1135: goto st1135;
 		case 298: goto st298;
 		case 299: goto st299;
 		case 300: goto st300;
@@ -674,7 +674,7 @@ _again:
 		case 309: goto st309;
 		case 310: goto st310;
 		case 311: goto st311;
-		case 1127: goto st1127;
+		case 1136: goto st1136;
 		case 312: goto st312;
 		case 313: goto st313;
 		case 314: goto st314;
@@ -682,7 +682,7 @@ _again:
 		case 316: goto st316;
 		case 317: goto st317;
 		case 318: goto st318;
-		case 1128: goto st1128;
+		case 1137: goto st1137;
 		case 319: goto st319;
 		case 320: goto st320;
 		case 321: goto st321;
@@ -692,9 +692,9 @@ _again:
 		case 325: goto st325;
 		case 326: goto st326;
 		case 327: goto st327;
-		case 1129: goto st1129;
-		case 1130: goto st1130;
-		case 1131: goto st1131;
+		case 1138: goto st1138;
+		case 1139: goto st1139;
+		case 1140: goto st1140;
 		case 328: goto st328;
 		case 329: goto st329;
 		case 330: goto st330;
@@ -703,12 +703,12 @@ _again:
 		case 333: goto st333;
 		case 334: goto st334;
 		case 335: goto st335;
-		case 1132: goto st1132;
-		case 1133: goto st1133;
+		case 1141: goto st1141;
+		case 1142: goto st1142;
 		case 336: goto st336;
 		case 337: goto st337;
 		case 338: goto st338;
-		case 1134: goto st1134;
+		case 1143: goto st1143;
 		case 339: goto st339;
 		case 340: goto st340;
 		case 341: goto st341;
@@ -838,29 +838,29 @@ _again:
 		case 465: goto st465;
 		case 466: goto st466;
 		case 467: goto st467;
-		case 1135: goto st1135;
-		case 1136: goto st1136;
-		case 1137: goto st1137;
+		case 1144: goto st1144;
+		case 1145: goto st1145;
+		case 1146: goto st1146;
 		case 468: goto st468;
 		case 469: goto st469;
 		case 470: goto st470;
 		case 471: goto st471;
 		case 472: goto st472;
-		case 1138: goto st1138;
+		case 1147: goto st1147;
 		case 473: goto st473;
 		case 474: goto st474;
 		case 475: goto st475;
 		case 476: goto st476;
-		case 1139: goto st1139;
-		case 1140: goto st1140;
-		case 1141: goto st1141;
+		case 1148: goto st1148;
+		case 1149: goto st1149;
+		case 1150: goto st1150;
 		case 477: goto st477;
 		case 478: goto st478;
-		case 1142: goto st1142;
+		case 1151: goto st1151;
 		case 479: goto st479;
 		case 480: goto st480;
 		case 481: goto st481;
-		case 1143: goto st1143;
+		case 1152: goto st1152;
 		case 482: goto st482;
 		case 483: goto st483;
 		case 484: goto st484;
@@ -956,7 +956,6 @@ _again:
 		case 574: goto st574;
 		case 575: goto st575;
 		case 576: goto st576;
-		case 1144: goto st1144;
 		case 577: goto st577;
 		case 578: goto st578;
 		case 579: goto st579;
@@ -966,6 +965,7 @@ _again:
 		case 583: goto st583;
 		case 584: goto st584;
 		case 585: goto st585;
+		case 1153: goto st1153;
 		case 586: goto st586;
 		case 587: goto st587;
 		case 588: goto st588;
@@ -998,10 +998,8 @@ _again:
 		case 615: goto st615;
 		case 616: goto st616;
 		case 617: goto st617;
-		case 1145: goto st1145;
 		case 618: goto st618;
 		case 619: goto st619;
-		case 1146: goto st1146;
 		case 620: goto st620;
 		case 621: goto st621;
 		case 622: goto st622;
@@ -1009,14 +1007,15 @@ _again:
 		case 624: goto st624;
 		case 625: goto st625;
 		case 626: goto st626;
+		case 1154: goto st1154;
 		case 627: goto st627;
 		case 628: goto st628;
+		case 1155: goto st1155;
 		case 629: goto st629;
 		case 630: goto st630;
 		case 631: goto st631;
 		case 632: goto st632;
 		case 633: goto st633;
-		case 1147: goto st1147;
 		case 634: goto st634;
 		case 635: goto st635;
 		case 636: goto st636;
@@ -1026,6 +1025,7 @@ _again:
 		case 640: goto st640;
 		case 641: goto st641;
 		case 642: goto st642;
+		case 1156: goto st1156;
 		case 643: goto st643;
 		case 644: goto st644;
 		case 645: goto st645;
@@ -1039,39 +1039,39 @@ _again:
 		case 653: goto st653;
 		case 654: goto st654;
 		case 655: goto st655;
-		case 1148: goto st1148;
 		case 656: goto st656;
 		case 657: goto st657;
 		case 658: goto st658;
 		case 659: goto st659;
 		case 660: goto st660;
-		case 1149: goto st1149;
 		case 661: goto st661;
 		case 662: goto st662;
 		case 663: goto st663;
 		case 664: goto st664;
+		case 1157: goto st1157;
 		case 665: goto st665;
-		case 1150: goto st1150;
 		case 666: goto st666;
 		case 667: goto st667;
 		case 668: goto st668;
 		case 669: goto st669;
+		case 1158: goto st1158;
 		case 670: goto st670;
-		case 1151: goto st1151;
-		case 1152: goto st1152;
-		case 1153: goto st1153;
 		case 671: goto st671;
 		case 672: goto st672;
-		case 1154: goto st1154;
 		case 673: goto st673;
 		case 674: goto st674;
+		case 1159: goto st1159;
 		case 675: goto st675;
 		case 676: goto st676;
 		case 677: goto st677;
 		case 678: goto st678;
 		case 679: goto st679;
+		case 1160: goto st1160;
+		case 1161: goto st1161;
+		case 1162: goto st1162;
 		case 680: goto st680;
 		case 681: goto st681;
+		case 1163: goto st1163;
 		case 682: goto st682;
 		case 683: goto st683;
 		case 684: goto st684;
@@ -1090,35 +1090,35 @@ _again:
 		case 697: goto st697;
 		case 698: goto st698;
 		case 699: goto st699;
-		case 1155: goto st1155;
-		case 1156: goto st1156;
-		case 1157: goto st1157;
 		case 700: goto st700;
 		case 701: goto st701;
 		case 702: goto st702;
-		case 1158: goto st1158;
-		case 1159: goto st1159;
 		case 703: goto st703;
 		case 704: goto st704;
 		case 705: goto st705;
 		case 706: goto st706;
-		case 1160: goto st1160;
-		case 1161: goto st1161;
 		case 707: goto st707;
 		case 708: goto st708;
+		case 1164: goto st1164;
+		case 1165: goto st1165;
+		case 1166: goto st1166;
 		case 709: goto st709;
 		case 710: goto st710;
-		case 1162: goto st1162;
-		case 1163: goto st1163;
 		case 711: goto st711;
+		case 1167: goto st1167;
+		case 1168: goto st1168;
 		case 712: goto st712;
 		case 713: goto st713;
 		case 714: goto st714;
 		case 715: goto st715;
+		case 1169: goto st1169;
+		case 1170: goto st1170;
 		case 716: goto st716;
 		case 717: goto st717;
 		case 718: goto st718;
 		case 719: goto st719;
+		case 1171: goto st1171;
+		case 1172: goto st1172;
 		case 720: goto st720;
 		case 721: goto st721;
 		case 722: goto st722;
@@ -1135,7 +1135,6 @@ _again:
 		case 733: goto st733;
 		case 734: goto st734;
 		case 735: goto st735;
-		case 1164: goto st1164;
 		case 736: goto st736;
 		case 737: goto st737;
 		case 738: goto st738;
@@ -1145,13 +1144,13 @@ _again:
 		case 742: goto st742;
 		case 743: goto st743;
 		case 744: goto st744;
+		case 1173: goto st1173;
 		case 745: goto st745;
 		case 746: goto st746;
 		case 747: goto st747;
 		case 748: goto st748;
 		case 749: goto st749;
 		case 750: goto st750;
-		case 1165: goto st1165;
 		case 751: goto st751;
 		case 752: goto st752;
 		case 753: goto st753;
@@ -1161,11 +1160,11 @@ _again:
 		case 757: goto st757;
 		case 758: goto st758;
 		case 759: goto st759;
+		case 1174: goto st1174;
 		case 760: goto st760;
 		case 761: goto st761;
 		case 762: goto st762;
 		case 763: goto st763;
-		case 1166: goto st1166;
 		case 764: goto st764;
 		case 765: goto st765;
 		case 766: goto st766;
@@ -1175,27 +1174,25 @@ _again:
 		case 770: goto st770;
 		case 771: goto st771;
 		case 772: goto st772;
+		case 1175: goto st1175;
 		case 773: goto st773;
 		case 774: goto st774;
-		case 1167: goto st1167;
-		case 1168: goto st1168;
 		case 775: goto st775;
 		case 776: goto st776;
 		case 777: goto st777;
-		case 1169: goto st1169;
 		case 778: goto st778;
 		case 779: goto st779;
 		case 780: goto st780;
 		case 781: goto st781;
 		case 782: goto st782;
 		case 783: goto st783;
+		case 1176: goto st1176;
+		case 1177: goto st1177;
 		case 784: goto st784;
 		case 785: goto st785;
 		case 786: goto st786;
+		case 1178: goto st1178;
 		case 787: goto st787;
-		case 1170: goto st1170;
-		case 1171: goto st1171;
-		case 1172: goto st1172;
 		case 788: goto st788;
 		case 789: goto st789;
 		case 790: goto st790;
@@ -1205,11 +1202,11 @@ _again:
 		case 794: goto st794;
 		case 795: goto st795;
 		case 796: goto st796;
+		case 1179: goto st1179;
+		case 1180: goto st1180;
+		case 1181: goto st1181;
 		case 797: goto st797;
 		case 798: goto st798;
-		case 1173: goto st1173;
-		case 1174: goto st1174;
-		case 1175: goto st1175;
 		case 799: goto st799;
 		case 800: goto st800;
 		case 801: goto st801;
@@ -1219,30 +1216,33 @@ _again:
 		case 805: goto st805;
 		case 806: goto st806;
 		case 807: goto st807;
+		case 1182: goto st1182;
+		case 1183: goto st1183;
+		case 1184: goto st1184;
 		case 808: goto st808;
 		case 809: goto st809;
 		case 810: goto st810;
-		case 1176: goto st1176;
 		case 811: goto st811;
 		case 812: goto st812;
 		case 813: goto st813;
-		case 1177: goto st1177;
-		case 1178: goto st1178;
 		case 814: goto st814;
-		case 1179: goto st1179;
-		case 1180: goto st1180;
 		case 815: goto st815;
-		case 1181: goto st1181;
-		case 1182: goto st1182;
 		case 816: goto st816;
 		case 817: goto st817;
 		case 818: goto st818;
 		case 819: goto st819;
+		case 1185: goto st1185;
 		case 820: goto st820;
 		case 821: goto st821;
 		case 822: goto st822;
+		case 1186: goto st1186;
+		case 1187: goto st1187;
 		case 823: goto st823;
+		case 1188: goto st1188;
+		case 1189: goto st1189;
 		case 824: goto st824;
+		case 1190: goto st1190;
+		case 1191: goto st1191;
 		case 825: goto st825;
 		case 826: goto st826;
 		case 827: goto st827;
@@ -1276,7 +1276,6 @@ _again:
 		case 855: goto st855;
 		case 856: goto st856;
 		case 857: goto st857;
-		case 1183: goto st1183;
 		case 858: goto st858;
 		case 859: goto st859;
 		case 860: goto st860;
@@ -1286,6 +1285,7 @@ _again:
 		case 864: goto st864;
 		case 865: goto st865;
 		case 866: goto st866;
+		case 1192: goto st1192;
 		case 867: goto st867;
 		case 868: goto st868;
 		case 869: goto st869;
@@ -1416,7 +1416,6 @@ _again:
 		case 994: goto st994;
 		case 995: goto st995;
 		case 996: goto st996;
-		case 1184: goto st1184;
 		case 997: goto st997;
 		case 998: goto st998;
 		case 999: goto st999;
@@ -1425,22 +1424,23 @@ _again:
 		case 1002: goto st1002;
 		case 1003: goto st1003;
 		case 1004: goto st1004;
-		case 1185: goto st1185;
 		case 1005: goto st1005;
+		case 1193: goto st1193;
 		case 1006: goto st1006;
 		case 1007: goto st1007;
 		case 1008: goto st1008;
 		case 1009: goto st1009;
-		case 1186: goto st1186;
 		case 1010: goto st1010;
 		case 1011: goto st1011;
 		case 1012: goto st1012;
 		case 1013: goto st1013;
+		case 1194: goto st1194;
 		case 1014: goto st1014;
 		case 1015: goto st1015;
 		case 1016: goto st1016;
 		case 1017: goto st1017;
 		case 1018: goto st1018;
+		case 1195: goto st1195;
 		case 1019: goto st1019;
 		case 1020: goto st1020;
 		case 1021: goto st1021;
@@ -1450,7 +1450,6 @@ _again:
 		case 1025: goto st1025;
 		case 1026: goto st1026;
 		case 1027: goto st1027;
-		case 1187: goto st1187;
 		case 1028: goto st1028;
 		case 1029: goto st1029;
 		case 1030: goto st1030;
@@ -1460,6 +1459,7 @@ _again:
 		case 1034: goto st1034;
 		case 1035: goto st1035;
 		case 1036: goto st1036;
+		case 1196: goto st1196;
 		case 1037: goto st1037;
 		case 1038: goto st1038;
 		case 1039: goto st1039;
@@ -1470,7 +1470,6 @@ _again:
 		case 1044: goto st1044;
 		case 1045: goto st1045;
 		case 1046: goto st1046;
-		case 1188: goto st1188;
 		case 1047: goto st1047;
 		case 1048: goto st1048;
 		case 1049: goto st1049;
@@ -1480,15 +1479,13 @@ _again:
 		case 1053: goto st1053;
 		case 1054: goto st1054;
 		case 1055: goto st1055;
+		case 1197: goto st1197;
 		case 1056: goto st1056;
 		case 1057: goto st1057;
 		case 1058: goto st1058;
 		case 1059: goto st1059;
 		case 1060: goto st1060;
 		case 1061: goto st1061;
-		case 1189: goto st1189;
-		case 1190: goto st1190;
-		case 1191: goto st1191;
 		case 1062: goto st1062;
 		case 1063: goto st1063;
 		case 1064: goto st1064;
@@ -1496,9 +1493,11 @@ _again:
 		case 1066: goto st1066;
 		case 1067: goto st1067;
 		case 1068: goto st1068;
-		case 1192: goto st1192;
 		case 1069: goto st1069;
 		case 1070: goto st1070;
+		case 1198: goto st1198;
+		case 1199: goto st1199;
+		case 1200: goto st1200;
 		case 1071: goto st1071;
 		case 1072: goto st1072;
 		case 1073: goto st1073;
@@ -1506,11 +1505,11 @@ _again:
 		case 1075: goto st1075;
 		case 1076: goto st1076;
 		case 1077: goto st1077;
+		case 1201: goto st1201;
 		case 1078: goto st1078;
 		case 1079: goto st1079;
 		case 1080: goto st1080;
 		case 1081: goto st1081;
-		case 1193: goto st1193;
 		case 1082: goto st1082;
 		case 1083: goto st1083;
 		case 1084: goto st1084;
@@ -1518,32 +1517,42 @@ _again:
 		case 1086: goto st1086;
 		case 1087: goto st1087;
 		case 1088: goto st1088;
-		case 1194: goto st1194;
 		case 1089: goto st1089;
 		case 1090: goto st1090;
+		case 1202: goto st1202;
 		case 1091: goto st1091;
 		case 1092: goto st1092;
 		case 1093: goto st1093;
 		case 1094: goto st1094;
-		case 1195: goto st1195;
 		case 1095: goto st1095;
 		case 1096: goto st1096;
 		case 1097: goto st1097;
+		case 1203: goto st1203;
 		case 1098: goto st1098;
 		case 1099: goto st1099;
 		case 1100: goto st1100;
-		case 1196: goto st1196;
 		case 1101: goto st1101;
 		case 1102: goto st1102;
 		case 1103: goto st1103;
+		case 1204: goto st1204;
 		case 1104: goto st1104;
 		case 1105: goto st1105;
 		case 1106: goto st1106;
 		case 1107: goto st1107;
 		case 1108: goto st1108;
-		case 1197: goto st1197;
 		case 1109: goto st1109;
+		case 1205: goto st1205;
 		case 1110: goto st1110;
+		case 1111: goto st1111;
+		case 1112: goto st1112;
+		case 1113: goto st1113;
+		case 1114: goto st1114;
+		case 1115: goto st1115;
+		case 1116: goto st1116;
+		case 1117: goto st1117;
+		case 1206: goto st1206;
+		case 1118: goto st1118;
+		case 1119: goto st1119;
 	default: break;
 	}
 
@@ -1556,7 +1565,7 @@ tr20:
 	{
 		s->line_counter++;
 	}
-	goto st1111;
+	goto st1120;
 tr83:
 	{
 		if (rdata_tail - s->r_data > UINT16_MAX) {
@@ -1574,34 +1583,34 @@ tr83:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1111; goto _out;}
+					{p++; cs = 1120; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1111; goto _out;}
+			p--; {p++; cs = 1120; goto _out;}
 		}
 	}
 	{
 		s->line_counter++;
 	}
-	goto st1111;
-tr3373:
-	cs = 1111;
+	goto st1120;
+tr3384:
+	cs = 1120;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	{
 		s->line_counter++;
 	}
 	goto _again;
-st1111:
+st1120:
 	if ( ++p == pe )
-		goto _test_eof1111;
-case 1111:
+		goto _test_eof1120;
+case 1120:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -1615,28 +1624,28 @@ case 1111:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3312;
-		case 32: goto tr3312;
+		case 9: goto tr3323;
+		case 32: goto tr3323;
 		case 36: goto st150;
-		case 40: goto tr3314;
-		case 41: goto tr3315;
-		case 42: goto tr3316;
-		case 92: goto tr3316;
-		case 95: goto tr3316;
+		case 40: goto tr3325;
+		case 41: goto tr3326;
+		case 42: goto tr3327;
+		case 92: goto tr3327;
+		case 95: goto tr3327;
 		case 778: goto tr20;
 		case 827: goto st149;
-		case 1034: goto tr3317;
-		case 1083: goto tr3318;
+		case 1034: goto tr3328;
+		case 1083: goto tr3329;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr3316;
+			goto tr3327;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr3316;
+			goto tr3327;
 	} else
-		goto tr3316;
-	goto tr3311;
+		goto tr3327;
+	goto tr3322;
 tr0:
 	{
 		WARN(ZS_BAD_NUMBER);
@@ -2155,13 +2164,13 @@ tr1559:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr1670:
+tr1681:
 	{
 		WARN(ZS_BAD_CERT_TYPE);
 		p--; {goto st261;}
 	}
 	goto st0;
-tr1723:
+tr1734:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
@@ -2171,7 +2180,7 @@ tr1723:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr1746:
+tr1757:
 	{
 		WARN(ZS_BAD_NUMBER);
 		p--; {goto st261;}
@@ -2181,7 +2190,7 @@ tr1746:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr1765:
+tr1776:
 	{
 		WARN(ZS_BAD_TIME_UNIT);
 		p--; {goto st261;}
@@ -2195,7 +2204,7 @@ tr1765:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr1913:
+tr1924:
 	{
 		s->long_string = false;
 	}
@@ -2204,7 +2213,7 @@ tr1913:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr1934:
+tr1945:
 	{
 		WARN(ZS_BAD_LOC_DATA);
 		p--; {goto st261;}
@@ -2214,7 +2223,7 @@ tr1934:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2291:
+tr2302:
 	{
 		WARN(ZS_BAD_APL);
 		p--; {goto st261;}
@@ -2224,7 +2233,7 @@ tr2291:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2306:
+tr2317:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
@@ -2238,7 +2247,7 @@ tr2306:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2349:
+tr2360:
 	{
 		WARN(ZS_BAD_HEX_CHAR);
 		p--; {goto st261;}
@@ -2248,7 +2257,7 @@ tr2349:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2406:
+tr2417:
 	{
 		WARN(ZS_BAD_GATEWAY);
 		p--; {goto st261;}
@@ -2258,7 +2267,7 @@ tr2406:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2421:
+tr2432:
 	{
 		WARN(ZS_BAD_NUMBER);
 		p--; {goto st261;}
@@ -2272,7 +2281,7 @@ tr2421:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2435:
+tr2446:
 	{
 		WARN(ZS_BAD_GATEWAY);
 		p--; {goto st261;}
@@ -2286,7 +2295,7 @@ tr2435:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2458:
+tr2469:
 	{
 		WARN(ZS_BAD_GATEWAY_KEY);
 		p--; {goto st261;}
@@ -2296,7 +2305,7 @@ tr2458:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2472:
+tr2483:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
@@ -2310,7 +2319,7 @@ tr2472:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2479:
+tr2490:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
@@ -2328,7 +2337,7 @@ tr2479:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2584:
+tr2595:
 	{
 		WARN(ZS_UNSUPPORTED_TYPE);
 		p--; {goto st261;}
@@ -2338,7 +2347,7 @@ tr2584:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr2638:
+tr2649:
 	{
 		WARN(ZS_BAD_TIMESTAMP_CHAR);
 		p--; {goto st261;}
@@ -2348,7 +2357,7 @@ tr2638:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3001:
+tr3012:
 	{
 		WARN(ZS_BAD_NUMBER);
 		p--; {goto st261;}
@@ -2362,7 +2371,7 @@ tr3001:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3096:
+tr3107:
 	{
 		WARN(ZS_BAD_BASE32HEX_CHAR);
 		p--; {goto st261;}
@@ -2372,7 +2381,7 @@ tr3096:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3239:
+tr3250:
 	{
 		WARN(ZS_BAD_HEX_CHAR);
 		p--; {goto st261;}
@@ -2386,7 +2395,7 @@ tr3239:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3245:
+tr3256:
 	{
 		WARN(ZS_BAD_CHAR_COLON);
 		p--; {goto st261;}
@@ -2400,7 +2409,7 @@ tr3245:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3249:
+tr3260:
 	{
 		WARN(ZS_BAD_CHAR_DASH);
 		p--; {goto st261;}
@@ -2414,7 +2423,7 @@ tr3249:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3311:
+tr3322:
 	{
 		s->r_owner_length = 0;
 		WARN(ZS_BAD_OWNER);
@@ -2425,7 +2434,7 @@ tr3311:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3329:
+tr3340:
 	{
 		s->r_owner_length = 0;
 		WARN(ZS_BAD_OWNER);
@@ -2440,7 +2449,7 @@ tr3329:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3350:
+tr3361:
 	{
 		s->r_owner_length = 0;
 		WARN(ZS_BAD_OWNER);
@@ -2459,7 +2468,7 @@ tr3350:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3367:
+tr3378:
 	{
 		s->r_owner_length = 0;
 		WARN(ZS_BAD_OWNER);
@@ -2474,7 +2483,7 @@ tr3367:
 		p--; {goto st261;}
 	}
 	goto st0;
-tr3390:
+tr3401:
 	{
 		s->r_owner_length = 0;
 		WARN(ZS_BAD_OWNER);
@@ -2518,7 +2527,7 @@ tr3:
 		s->multiline = false;
 	}
 	goto st1;
-tr3312:
+tr3323:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -2526,7 +2535,7 @@ tr3312:
 		}
 	}
 	goto st1;
-tr3314:
+tr3325:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -2541,7 +2550,7 @@ tr3314:
 		s->multiline = true;
 	}
 	goto st1;
-tr3315:
+tr3326:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -2556,7 +2565,7 @@ tr3315:
 		s->multiline = false;
 	}
 	goto st1;
-tr3377:
+tr3388:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -2571,7 +2580,7 @@ tr3377:
 		}
 	}
 	goto st1;
-tr3378:
+tr3389:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -2586,12 +2595,12 @@ tr3378:
 		}
 	}
 	goto st1;
-tr3368:
+tr3379:
 	cs = 1;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	{
@@ -2601,12 +2610,12 @@ tr3368:
 		}
 	}
 	goto _again;
-tr3370:
+tr3381:
 	cs = 1;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	{
@@ -2623,12 +2632,12 @@ tr3370:
 		s->multiline = true;
 	}
 	goto _again;
-tr3371:
+tr3382:
 	cs = 1;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	{
@@ -4922,76 +4931,76 @@ tr66:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5003,76 +5012,76 @@ tr69:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5085,76 +5094,76 @@ tr86:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5223,76 +5232,76 @@ tr144:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5308,76 +5317,76 @@ tr161:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5393,76 +5402,76 @@ tr169:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5478,76 +5487,76 @@ tr179:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5563,76 +5572,76 @@ tr190:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5648,76 +5657,76 @@ tr204:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5733,76 +5742,76 @@ tr216:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5818,76 +5827,76 @@ tr227:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5903,76 +5912,76 @@ tr235:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -5988,76 +5997,76 @@ tr248:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6073,76 +6082,76 @@ tr257:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6158,76 +6167,76 @@ tr269:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6243,76 +6252,76 @@ tr310:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6328,76 +6337,76 @@ tr321:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6413,76 +6422,76 @@ tr329:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6498,76 +6507,76 @@ tr342:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6583,76 +6592,76 @@ tr351:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6668,76 +6677,76 @@ tr360:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6753,76 +6762,76 @@ tr368:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6838,76 +6847,76 @@ tr381:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -6923,76 +6932,76 @@ tr389:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7008,76 +7017,76 @@ tr403:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7093,76 +7102,76 @@ tr412:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7178,76 +7187,76 @@ tr421:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7263,76 +7272,76 @@ tr431:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7348,76 +7357,76 @@ tr440:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7433,76 +7442,76 @@ tr452:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7518,76 +7527,76 @@ tr462:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7603,76 +7612,76 @@ tr473:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7688,76 +7697,76 @@ tr484:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7773,76 +7782,76 @@ tr492:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7858,76 +7867,76 @@ tr505:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -7943,76 +7952,76 @@ tr514:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8028,76 +8037,76 @@ tr523:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8113,76 +8122,76 @@ tr534:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8198,76 +8207,76 @@ tr547:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8283,76 +8292,76 @@ tr556:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8375,76 +8384,76 @@ tr570:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8460,76 +8469,76 @@ tr580:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8545,76 +8554,76 @@ tr787:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8630,76 +8639,76 @@ tr798:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -8715,76 +8724,76 @@ tr807:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 6; goto st616;}
+			{stack[top++] = 6; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 6; goto st618;}
+			{stack[top++] = 6; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 6; goto st620;}
+			{stack[top++] = 6; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 6; goto st652;}
+			{stack[top++] = 6; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 6; goto st657;}
+			{stack[top++] = 6; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 6; goto st662;}
+			{stack[top++] = 6; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 6; goto st667;}
+			{stack[top++] = 6; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 6; goto st671;}
+			{stack[top++] = 6; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 6; goto st673;}
+			{stack[top++] = 6; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 6; goto st728;}
+			{stack[top++] = 6; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 6; goto st739;}
+			{stack[top++] = 6; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 6; goto st756;}
+			{stack[top++] = 6; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 6; goto st767;}
+			{stack[top++] = 6; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 6; goto st778;}
+			{stack[top++] = 6; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 6; goto st791;}
+			{stack[top++] = 6; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 6; goto st801;}
+			{stack[top++] = 6; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 6; goto st840;}
+			{stack[top++] = 6; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 6; goto st994;}
+			{stack[top++] = 6; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 6; goto st997;}
+			{stack[top++] = 6; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 6; goto st1008;}
+			{stack[top++] = 6; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 6; goto st1010;}
+			{stack[top++] = 6; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 6; goto st1039;}
+			{stack[top++] = 6; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 6; goto st1052;}
+			{stack[top++] = 6; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 6; goto st1070;}
+			{stack[top++] = 6; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 6; goto st1065;}
+			{stack[top++] = 6; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 6; goto st1083;}
+			{stack[top++] = 6; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 6; goto st1089;}
+			{stack[top++] = 6; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 6; goto st1095;}
+			{stack[top++] = 6; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 6; goto st1103;}
+			{stack[top++] = 6; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9199,76 +9208,76 @@ tr67:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9283,76 +9292,76 @@ tr77:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9371,76 +9380,76 @@ tr145:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9459,76 +9468,76 @@ tr162:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9547,76 +9556,76 @@ tr170:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9635,76 +9644,76 @@ tr180:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9723,76 +9732,76 @@ tr191:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9811,76 +9820,76 @@ tr205:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9899,76 +9908,76 @@ tr217:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -9987,76 +9996,76 @@ tr228:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10075,76 +10084,76 @@ tr236:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10163,76 +10172,76 @@ tr249:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10251,76 +10260,76 @@ tr258:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10339,76 +10348,76 @@ tr270:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10427,76 +10436,76 @@ tr311:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10515,76 +10524,76 @@ tr322:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10603,76 +10612,76 @@ tr330:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10691,76 +10700,76 @@ tr343:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10779,76 +10788,76 @@ tr352:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10867,76 +10876,76 @@ tr361:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -10955,76 +10964,76 @@ tr369:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11043,76 +11052,76 @@ tr382:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11131,76 +11140,76 @@ tr390:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11219,76 +11228,76 @@ tr404:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11307,76 +11316,76 @@ tr413:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11395,76 +11404,76 @@ tr422:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11483,76 +11492,76 @@ tr432:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11571,76 +11580,76 @@ tr441:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11659,76 +11668,76 @@ tr453:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11747,76 +11756,76 @@ tr463:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11835,76 +11844,76 @@ tr474:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -11923,76 +11932,76 @@ tr485:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12011,76 +12020,76 @@ tr493:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12099,76 +12108,76 @@ tr506:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12187,76 +12196,76 @@ tr515:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12275,76 +12284,76 @@ tr524:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12363,76 +12372,76 @@ tr535:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12451,76 +12460,76 @@ tr548:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12539,76 +12548,76 @@ tr557:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12634,76 +12643,76 @@ tr571:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12722,76 +12731,76 @@ tr581:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12810,76 +12819,76 @@ tr788:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12898,76 +12907,76 @@ tr799:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -12986,76 +12995,76 @@ tr808:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 11; goto st616;}
+			{stack[top++] = 11; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 11; goto st618;}
+			{stack[top++] = 11; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 11; goto st620;}
+			{stack[top++] = 11; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 11; goto st652;}
+			{stack[top++] = 11; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 11; goto st657;}
+			{stack[top++] = 11; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 11; goto st662;}
+			{stack[top++] = 11; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 11; goto st667;}
+			{stack[top++] = 11; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 11; goto st671;}
+			{stack[top++] = 11; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 11; goto st673;}
+			{stack[top++] = 11; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 11; goto st728;}
+			{stack[top++] = 11; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 11; goto st739;}
+			{stack[top++] = 11; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 11; goto st756;}
+			{stack[top++] = 11; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 11; goto st767;}
+			{stack[top++] = 11; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 11; goto st778;}
+			{stack[top++] = 11; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 11; goto st791;}
+			{stack[top++] = 11; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 11; goto st801;}
+			{stack[top++] = 11; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 11; goto st840;}
+			{stack[top++] = 11; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 11; goto st994;}
+			{stack[top++] = 11; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 11; goto st997;}
+			{stack[top++] = 11; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 11; goto st1008;}
+			{stack[top++] = 11; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 11; goto st1010;}
+			{stack[top++] = 11; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 11; goto st1039;}
+			{stack[top++] = 11; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 11; goto st1052;}
+			{stack[top++] = 11; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 11; goto st1070;}
+			{stack[top++] = 11; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 11; goto st1065;}
+			{stack[top++] = 11; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 11; goto st1083;}
+			{stack[top++] = 11; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 11; goto st1089;}
+			{stack[top++] = 11; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 11; goto st1095;}
+			{stack[top++] = 11; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 11; goto st1103;}
+			{stack[top++] = 11; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -13164,15 +13173,15 @@ tr95:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1112; goto _out;}
+					{p++; cs = 1121; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1112; goto _out;}
+			p--; {p++; cs = 1121; goto _out;}
 		}
 	}
-	goto st1112;
+	goto st1121;
 tr705:
 	{ s->r_type = KNOT_RRTYPE_A; }
 	{
@@ -13197,19 +13206,19 @@ tr705:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1112; goto _out;}
+					{p++; cs = 1121; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1112; goto _out;}
+			p--; {p++; cs = 1121; goto _out;}
 		}
 	}
-	goto st1112;
-st1112:
+	goto st1121;
+st1121:
 	if ( ++p == pe )
-		goto _test_eof1112;
-case 1112:
+		goto _test_eof1121;
+case 1121:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -13227,23 +13236,23 @@ case 1112:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr3319;
-		case 32: goto tr3319;
-		case 36: goto tr3320;
-		case 40: goto tr3321;
-		case 41: goto tr3322;
-		case 42: goto tr3323;
+		case 9: goto tr3330;
+		case 32: goto tr3330;
+		case 36: goto tr3331;
+		case 40: goto tr3332;
+		case 41: goto tr3333;
+		case 42: goto tr3334;
 		case 58: goto tr69;
-		case 92: goto tr3324;
-		case 95: goto tr3323;
+		case 92: goto tr3335;
+		case 95: goto tr3334;
 		case 1802: goto tr20;
 		case 1851: goto st149;
-		case 2058: goto tr3325;
-		case 2107: goto tr3326;
+		case 2058: goto tr3336;
+		case 2107: goto tr3337;
 		case 2314: goto tr118;
 		case 2363: goto tr119;
-		case 2570: goto tr3327;
-		case 2619: goto tr3328;
+		case 2570: goto tr3338;
+		case 2619: goto tr3339;
 	}
 	if ( _widec < 60 ) {
 		if ( _widec < 11 ) {
@@ -13251,19 +13260,19 @@ case 1112:
 				goto tr69;
 		} else if ( _widec > 44 ) {
 			if ( 45 <= _widec && _widec <= 57 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else if ( _widec > 63 ) {
 		if ( _widec < 91 ) {
 			if ( 64 <= _widec && _widec <= 90 )
-				goto tr3323;
+				goto tr3334;
 		} else if ( _widec > 96 ) {
 			if ( _widec > 122 ) {
 				if ( 123 <= _widec )
 					goto tr69;
 			} else if ( _widec >= 97 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else
@@ -13287,7 +13296,7 @@ tr99:
 		s->multiline = false;
 	}
 	goto st13;
-tr3319:
+tr3330:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -13295,7 +13304,7 @@ tr3319:
 		}
 	}
 	goto st13;
-tr3321:
+tr3332:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -13310,7 +13319,7 @@ tr3321:
 		}
 	}
 	goto st13;
-tr3322:
+tr3333:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -13425,76 +13434,76 @@ tr100:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 14; goto st616;}
+			{stack[top++] = 14; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 14; goto st618;}
+			{stack[top++] = 14; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 14; goto st620;}
+			{stack[top++] = 14; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 14; goto st652;}
+			{stack[top++] = 14; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 14; goto st657;}
+			{stack[top++] = 14; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 14; goto st662;}
+			{stack[top++] = 14; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 14; goto st667;}
+			{stack[top++] = 14; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 14; goto st671;}
+			{stack[top++] = 14; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 14; goto st673;}
+			{stack[top++] = 14; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 14; goto st728;}
+			{stack[top++] = 14; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 14; goto st739;}
+			{stack[top++] = 14; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 14; goto st756;}
+			{stack[top++] = 14; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 14; goto st767;}
+			{stack[top++] = 14; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 14; goto st778;}
+			{stack[top++] = 14; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 14; goto st791;}
+			{stack[top++] = 14; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 14; goto st801;}
+			{stack[top++] = 14; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 14; goto st840;}
+			{stack[top++] = 14; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 14; goto st994;}
+			{stack[top++] = 14; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 14; goto st997;}
+			{stack[top++] = 14; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 14; goto st1008;}
+			{stack[top++] = 14; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 14; goto st1010;}
+			{stack[top++] = 14; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 14; goto st1039;}
+			{stack[top++] = 14; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 14; goto st1052;}
+			{stack[top++] = 14; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 14; goto st1070;}
+			{stack[top++] = 14; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 14; goto st1065;}
+			{stack[top++] = 14; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 14; goto st1083;}
+			{stack[top++] = 14; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 14; goto st1089;}
+			{stack[top++] = 14; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 14; goto st1095;}
+			{stack[top++] = 14; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 14; goto st1103;}
+			{stack[top++] = 14; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -13761,76 +13770,76 @@ tr68:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -13842,76 +13851,76 @@ tr78:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -13927,76 +13936,76 @@ tr146:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14012,76 +14021,76 @@ tr163:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14097,76 +14106,76 @@ tr171:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14182,76 +14191,76 @@ tr181:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14267,76 +14276,76 @@ tr192:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14352,161 +14361,161 @@ tr206:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
-		case KNOT_RRTYPE_TXT:
-		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
-		case KNOT_RRTYPE_AAAA:
 			{stack[top++] = 19; goto st671;}
-		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
-		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
-		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
-		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
-		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
-		case KNOT_RRTYPE_DS:
-		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
-		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
-		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
-		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
-		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
-		case KNOT_RRTYPE_KEY:
-		case KNOT_RRTYPE_DNSKEY:
-		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
-		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
-		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
-		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
-		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
-		case KNOT_RRTYPE_NID:
-		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
-		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
-		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
-		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
-		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
-		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
-		default:
-			WARN(ZS_CANNOT_TEXT_DATA);
-			{goto st261;}
-		}
-	}
-	goto st19;
-tr218:
-	{ s->r_type = KNOT_RRTYPE_DNAME; }
-	{
-		rdata_tail = s->r_data;
-	}
-	{
-		p--;
-		switch (s->r_type) {
-		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
-		case KNOT_RRTYPE_NS:
-		case KNOT_RRTYPE_CNAME:
-		case KNOT_RRTYPE_PTR:
-		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
-		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
-		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
-		case KNOT_RRTYPE_MINFO:
-		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
-		case KNOT_RRTYPE_MX:
-		case KNOT_RRTYPE_AFSDB:
-		case KNOT_RRTYPE_RT:
-		case KNOT_RRTYPE_KX:
-		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
+		default:
+			WARN(ZS_CANNOT_TEXT_DATA);
+			{goto st261;}
+		}
+	}
+	goto st19;
+tr218:
+	{ s->r_type = KNOT_RRTYPE_DNAME; }
+	{
+		rdata_tail = s->r_data;
+	}
+	{
+		p--;
+		switch (s->r_type) {
+		case KNOT_RRTYPE_A:
+			{stack[top++] = 19; goto st625;}
+		case KNOT_RRTYPE_NS:
+		case KNOT_RRTYPE_CNAME:
+		case KNOT_RRTYPE_PTR:
+		case KNOT_RRTYPE_DNAME:
+			{stack[top++] = 19; goto st627;}
+		case KNOT_RRTYPE_SOA:
+			{stack[top++] = 19; goto st629;}
+		case KNOT_RRTYPE_HINFO:
+			{stack[top++] = 19; goto st661;}
+		case KNOT_RRTYPE_MINFO:
+		case KNOT_RRTYPE_RP:
+			{stack[top++] = 19; goto st666;}
+		case KNOT_RRTYPE_MX:
+		case KNOT_RRTYPE_AFSDB:
+		case KNOT_RRTYPE_RT:
+		case KNOT_RRTYPE_KX:
+		case KNOT_RRTYPE_LP:
+			{stack[top++] = 19; goto st671;}
+		case KNOT_RRTYPE_TXT:
+		case KNOT_RRTYPE_SPF:
+			{stack[top++] = 19; goto st676;}
+		case KNOT_RRTYPE_AAAA:
+			{stack[top++] = 19; goto st680;}
+		case KNOT_RRTYPE_LOC:
+			{stack[top++] = 19; goto st682;}
+		case KNOT_RRTYPE_SRV:
+			{stack[top++] = 19; goto st737;}
+		case KNOT_RRTYPE_NAPTR:
+			{stack[top++] = 19; goto st748;}
+		case KNOT_RRTYPE_CERT:
+			{stack[top++] = 19; goto st765;}
+		case KNOT_RRTYPE_APL:
+			{stack[top++] = 19; goto st776;}
+		case KNOT_RRTYPE_DS:
+		case KNOT_RRTYPE_CDS:
+			{stack[top++] = 19; goto st787;}
+		case KNOT_RRTYPE_SSHFP:
+			{stack[top++] = 19; goto st800;}
+		case KNOT_RRTYPE_IPSECKEY:
+			{stack[top++] = 19; goto st810;}
+		case KNOT_RRTYPE_RRSIG:
+			{stack[top++] = 19; goto st849;}
+		case KNOT_RRTYPE_NSEC:
+			{stack[top++] = 19; goto st1003;}
+		case KNOT_RRTYPE_KEY:
+		case KNOT_RRTYPE_DNSKEY:
+		case KNOT_RRTYPE_CDNSKEY:
+			{stack[top++] = 19; goto st1006;}
+		case KNOT_RRTYPE_DHCID:
+			{stack[top++] = 19; goto st1017;}
+		case KNOT_RRTYPE_NSEC3:
+			{stack[top++] = 19; goto st1019;}
+		case KNOT_RRTYPE_NSEC3PARAM:
+			{stack[top++] = 19; goto st1048;}
+		case KNOT_RRTYPE_TLSA:
+			{stack[top++] = 19; goto st1061;}
+		case KNOT_RRTYPE_NID:
+		case KNOT_RRTYPE_L64:
+			{stack[top++] = 19; goto st1079;}
+		case KNOT_RRTYPE_L32:
+			{stack[top++] = 19; goto st1074;}
+		case KNOT_RRTYPE_EUI48:
+			{stack[top++] = 19; goto st1092;}
+		case KNOT_RRTYPE_EUI64:
+			{stack[top++] = 19; goto st1098;}
+		case KNOT_RRTYPE_URI:
+			{stack[top++] = 19; goto st1104;}
+		case KNOT_RRTYPE_CAA:
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14522,76 +14531,76 @@ tr229:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14607,76 +14616,76 @@ tr237:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14692,76 +14701,76 @@ tr250:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14777,76 +14786,76 @@ tr259:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14862,76 +14871,76 @@ tr271:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -14947,76 +14956,76 @@ tr312:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15032,76 +15041,76 @@ tr323:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15117,76 +15126,76 @@ tr331:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15202,76 +15211,76 @@ tr344:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15287,76 +15296,76 @@ tr353:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15372,76 +15381,76 @@ tr362:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15457,76 +15466,76 @@ tr370:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15542,76 +15551,76 @@ tr383:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15627,76 +15636,76 @@ tr391:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15712,76 +15721,76 @@ tr405:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15797,76 +15806,76 @@ tr414:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15882,76 +15891,76 @@ tr423:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -15967,76 +15976,76 @@ tr433:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16052,76 +16061,76 @@ tr442:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16137,76 +16146,76 @@ tr454:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16222,76 +16231,76 @@ tr464:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16307,76 +16316,76 @@ tr475:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16392,76 +16401,76 @@ tr486:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16477,76 +16486,76 @@ tr494:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16562,76 +16571,76 @@ tr507:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16647,76 +16656,76 @@ tr516:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16732,76 +16741,76 @@ tr525:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16817,76 +16826,76 @@ tr536:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16902,76 +16911,76 @@ tr549:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -16987,76 +16996,76 @@ tr558:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -17079,76 +17088,76 @@ tr572:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -17164,76 +17173,76 @@ tr582:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -17249,76 +17258,76 @@ tr789:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -17334,76 +17343,76 @@ tr800:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -17419,76 +17428,76 @@ tr809:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 19; goto st616;}
+			{stack[top++] = 19; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 19; goto st618;}
+			{stack[top++] = 19; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 19; goto st620;}
+			{stack[top++] = 19; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 19; goto st652;}
+			{stack[top++] = 19; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 19; goto st657;}
+			{stack[top++] = 19; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 19; goto st662;}
+			{stack[top++] = 19; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 19; goto st667;}
+			{stack[top++] = 19; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 19; goto st671;}
+			{stack[top++] = 19; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 19; goto st673;}
+			{stack[top++] = 19; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 19; goto st728;}
+			{stack[top++] = 19; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 19; goto st739;}
+			{stack[top++] = 19; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 19; goto st756;}
+			{stack[top++] = 19; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 19; goto st767;}
+			{stack[top++] = 19; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 19; goto st778;}
+			{stack[top++] = 19; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 19; goto st791;}
+			{stack[top++] = 19; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 19; goto st801;}
+			{stack[top++] = 19; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 19; goto st840;}
+			{stack[top++] = 19; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 19; goto st994;}
+			{stack[top++] = 19; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 19; goto st997;}
+			{stack[top++] = 19; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 19; goto st1008;}
+			{stack[top++] = 19; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 19; goto st1010;}
+			{stack[top++] = 19; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 19; goto st1039;}
+			{stack[top++] = 19; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 19; goto st1052;}
+			{stack[top++] = 19; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 19; goto st1070;}
+			{stack[top++] = 19; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 19; goto st1065;}
+			{stack[top++] = 19; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 19; goto st1083;}
+			{stack[top++] = 19; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 19; goto st1089;}
+			{stack[top++] = 19; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 19; goto st1095;}
+			{stack[top++] = 19; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 19; goto st1103;}
+			{stack[top++] = 19; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -20171,15 +20180,15 @@ tr132:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1113; goto _out;}
+					{p++; cs = 1122; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1113; goto _out;}
+			p--; {p++; cs = 1122; goto _out;}
 		}
 	}
-	goto st1113;
+	goto st1122;
 tr126:
 	{
 		if (s->number64 <= UINT32_MAX) {
@@ -20208,19 +20217,19 @@ tr126:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1113; goto _out;}
+					{p++; cs = 1122; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1113; goto _out;}
+			p--; {p++; cs = 1122; goto _out;}
 		}
 	}
-	goto st1113;
-st1113:
+	goto st1122;
+st1122:
 	if ( ++p == pe )
-		goto _test_eof1113;
-case 1113:
+		goto _test_eof1122;
+case 1122:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -20234,58 +20243,58 @@ case 1113:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3330;
-		case 32: goto tr3330;
+		case 9: goto tr3341;
+		case 32: goto tr3341;
 		case 36: goto st150;
-		case 40: goto tr3331;
-		case 41: goto tr3332;
-		case 42: goto tr3316;
-		case 65: goto tr3333;
-		case 67: goto tr3334;
-		case 68: goto tr3335;
-		case 69: goto tr3336;
-		case 72: goto tr3337;
-		case 73: goto tr3338;
-		case 75: goto tr3339;
-		case 76: goto tr3340;
-		case 77: goto tr3341;
-		case 78: goto tr3342;
-		case 80: goto tr3343;
-		case 82: goto tr3344;
-		case 83: goto tr3345;
-		case 84: goto tr3346;
-		case 85: goto tr3347;
-		case 92: goto tr3316;
-		case 95: goto tr3316;
-		case 97: goto tr3333;
-		case 99: goto tr3334;
-		case 100: goto tr3335;
-		case 101: goto tr3336;
-		case 104: goto tr3337;
-		case 105: goto tr3338;
-		case 107: goto tr3339;
-		case 108: goto tr3340;
-		case 109: goto tr3341;
-		case 110: goto tr3342;
-		case 112: goto tr3343;
-		case 114: goto tr3344;
-		case 115: goto tr3345;
-		case 116: goto tr3346;
-		case 117: goto tr3347;
+		case 40: goto tr3342;
+		case 41: goto tr3343;
+		case 42: goto tr3327;
+		case 65: goto tr3344;
+		case 67: goto tr3345;
+		case 68: goto tr3346;
+		case 69: goto tr3347;
+		case 72: goto tr3348;
+		case 73: goto tr3349;
+		case 75: goto tr3350;
+		case 76: goto tr3351;
+		case 77: goto tr3352;
+		case 78: goto tr3353;
+		case 80: goto tr3354;
+		case 82: goto tr3355;
+		case 83: goto tr3356;
+		case 84: goto tr3357;
+		case 85: goto tr3358;
+		case 92: goto tr3327;
+		case 95: goto tr3327;
+		case 97: goto tr3344;
+		case 99: goto tr3345;
+		case 100: goto tr3346;
+		case 101: goto tr3347;
+		case 104: goto tr3348;
+		case 105: goto tr3349;
+		case 107: goto tr3350;
+		case 108: goto tr3351;
+		case 109: goto tr3352;
+		case 110: goto tr3353;
+		case 112: goto tr3354;
+		case 114: goto tr3355;
+		case 115: goto tr3356;
+		case 116: goto tr3357;
+		case 117: goto tr3358;
 		case 778: goto tr20;
 		case 827: goto st149;
-		case 1034: goto tr3348;
-		case 1083: goto tr3349;
+		case 1034: goto tr3359;
+		case 1083: goto tr3360;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr3316;
+			goto tr3327;
 	} else if ( _widec > 90 ) {
 		if ( 98 <= _widec && _widec <= 122 )
-			goto tr3316;
+			goto tr3327;
 	} else
-		goto tr3316;
-	goto tr3329;
+		goto tr3327;
+	goto tr3340;
 tr584:
 	{
 		if (s->multiline == true) {
@@ -20304,7 +20313,7 @@ tr585:
 		s->multiline = false;
 	}
 	goto st140;
-tr3330:
+tr3341:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -20312,7 +20321,7 @@ tr3330:
 		}
 	}
 	goto st140;
-tr3331:
+tr3342:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -20327,7 +20336,7 @@ tr3331:
 		}
 	}
 	goto st140;
-tr3332:
+tr3343:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -20879,12 +20888,12 @@ case 148:
 	if ( 896 <= _widec && _widec <= 1151 )
 		goto st148;
 	goto tr36;
-tr3374:
+tr3385:
 	cs = 149;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	goto _again;
@@ -20899,7 +20908,7 @@ tr586:
 	{
 		s->line_counter++;
 	}
-	goto st1114;
+	goto st1123;
 tr754:
 	{
 		s->line_counter++;
@@ -20920,15 +20929,15 @@ tr754:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1114; goto _out;}
+					{p++; cs = 1123; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1114; goto _out;}
+			p--; {p++; cs = 1123; goto _out;}
 		}
 	}
-	goto st1114;
+	goto st1123;
 tr749:
 	{
 		s->r_owner_length = s->dname_tmp_length;
@@ -20960,16 +20969,16 @@ tr749:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1114; goto _out;}
+					{p++; cs = 1123; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1114; goto _out;}
+			p--; {p++; cs = 1123; goto _out;}
 		}
 	}
-	goto st1114;
-tr3348:
+	goto st1123;
+tr3359:
 	{
 		s->line_counter++;
 	}
@@ -20979,11 +20988,11 @@ tr3348:
 			p--; {goto st261;}
 		}
 	}
-	goto st1114;
-st1114:
+	goto st1123;
+st1123:
 	if ( ++p == pe )
-		goto _test_eof1114;
-case 1114:
+		goto _test_eof1123;
+case 1123:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -20997,67 +21006,67 @@ case 1114:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3330;
-		case 32: goto tr3330;
+		case 9: goto tr3341;
+		case 32: goto tr3341;
 		case 36: goto st150;
-		case 40: goto tr3331;
-		case 41: goto tr3332;
-		case 42: goto tr3316;
-		case 65: goto tr3352;
-		case 67: goto tr3353;
-		case 68: goto tr3354;
-		case 69: goto tr3355;
-		case 72: goto tr3356;
-		case 73: goto tr3357;
-		case 75: goto tr3358;
-		case 76: goto tr3359;
-		case 77: goto tr3360;
-		case 78: goto tr3361;
-		case 80: goto tr3362;
-		case 82: goto tr3363;
-		case 83: goto tr3364;
-		case 84: goto tr3365;
-		case 85: goto tr3366;
-		case 92: goto tr3316;
-		case 95: goto tr3316;
-		case 97: goto tr3352;
-		case 99: goto tr3353;
-		case 100: goto tr3354;
-		case 101: goto tr3355;
-		case 104: goto tr3356;
-		case 105: goto tr3357;
-		case 107: goto tr3358;
-		case 108: goto tr3359;
-		case 109: goto tr3360;
-		case 110: goto tr3361;
-		case 112: goto tr3362;
-		case 114: goto tr3363;
-		case 115: goto tr3364;
-		case 116: goto tr3365;
-		case 117: goto tr3366;
+		case 40: goto tr3342;
+		case 41: goto tr3343;
+		case 42: goto tr3327;
+		case 65: goto tr3363;
+		case 67: goto tr3364;
+		case 68: goto tr3365;
+		case 69: goto tr3366;
+		case 72: goto tr3367;
+		case 73: goto tr3368;
+		case 75: goto tr3369;
+		case 76: goto tr3370;
+		case 77: goto tr3371;
+		case 78: goto tr3372;
+		case 80: goto tr3373;
+		case 82: goto tr3374;
+		case 83: goto tr3375;
+		case 84: goto tr3376;
+		case 85: goto tr3377;
+		case 92: goto tr3327;
+		case 95: goto tr3327;
+		case 97: goto tr3363;
+		case 99: goto tr3364;
+		case 100: goto tr3365;
+		case 101: goto tr3366;
+		case 104: goto tr3367;
+		case 105: goto tr3368;
+		case 107: goto tr3369;
+		case 108: goto tr3370;
+		case 109: goto tr3371;
+		case 110: goto tr3372;
+		case 112: goto tr3373;
+		case 114: goto tr3374;
+		case 115: goto tr3375;
+		case 116: goto tr3376;
+		case 117: goto tr3377;
 		case 778: goto tr20;
 		case 827: goto st149;
-		case 1034: goto tr3348;
-		case 1083: goto tr3349;
+		case 1034: goto tr3359;
+		case 1083: goto tr3360;
 	}
 	if ( _widec < 48 ) {
 		if ( 45 <= _widec && _widec <= 47 )
-			goto tr3316;
+			goto tr3327;
 	} else if ( _widec > 57 ) {
 		if ( _widec > 90 ) {
 			if ( 98 <= _widec && _widec <= 122 )
-				goto tr3316;
+				goto tr3327;
 		} else if ( _widec >= 64 )
-			goto tr3316;
+			goto tr3327;
 	} else
-		goto tr3351;
-	goto tr3350;
-tr3369:
+		goto tr3362;
+	goto tr3361;
+tr3380:
 	cs = 150;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	goto _again;
@@ -21148,18 +21157,18 @@ case 157:
 		goto tr649;
 	goto tr639;
 tr649:
-	{ p--; {stack[top++] = 1115; goto st305;} }
-	goto st1115;
+	{ p--; {stack[top++] = 1124; goto st305;} }
+	goto st1124;
 tr735:
-	{ p--; {stack[top++] = 1115; goto st293;} }
-	goto st1115;
+	{ p--; {stack[top++] = 1124; goto st293;} }
+	goto st1124;
 tr738:
-	{ p--; {stack[top++] = 1115; goto st284;} }
-	goto st1115;
-st1115:
+	{ p--; {stack[top++] = 1124; goto st284;} }
+	goto st1124;
+st1124:
 	if ( ++p == pe )
-		goto _test_eof1115;
-case 1115:
+		goto _test_eof1124;
+case 1124:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -21173,41 +21182,41 @@ case 1115:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3368;
-		case 32: goto tr3368;
-		case 36: goto tr3369;
-		case 40: goto tr3370;
-		case 41: goto tr3371;
-		case 42: goto tr3372;
-		case 92: goto tr3372;
-		case 95: goto tr3372;
-		case 778: goto tr3373;
-		case 827: goto tr3374;
-		case 1034: goto tr3375;
-		case 1083: goto tr3376;
+		case 9: goto tr3379;
+		case 32: goto tr3379;
+		case 36: goto tr3380;
+		case 40: goto tr3381;
+		case 41: goto tr3382;
+		case 42: goto tr3383;
+		case 92: goto tr3383;
+		case 95: goto tr3383;
+		case 778: goto tr3384;
+		case 827: goto tr3385;
+		case 1034: goto tr3386;
+		case 1083: goto tr3387;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr3372;
+			goto tr3383;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr3372;
+			goto tr3383;
 	} else
-		goto tr3372;
-	goto tr3367;
-tr3316:
+		goto tr3383;
+	goto tr3378;
+tr3327:
 	{
 		s->dname = s->r_owner;
 		s->r_owner_length = 0;
 	}
 	{ p--; {stack[top++] = 158; goto st263;} }
 	goto st158;
-tr3372:
+tr3383:
 	cs = 158;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	{
@@ -21394,7 +21403,7 @@ tr22:
 	{
 		s->line_counter++;
 	}
-	goto st1116;
+	goto st1125;
 tr718:
 	{
 		s->line_counter++;
@@ -21415,15 +21424,15 @@ tr718:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1116; goto _out;}
+					{p++; cs = 1125; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1116; goto _out;}
+			p--; {p++; cs = 1125; goto _out;}
 		}
 	}
-	goto st1116;
+	goto st1125;
 tr743:
 	{
 		s->r_owner_length = s->dname_tmp_length;
@@ -21447,16 +21456,16 @@ tr743:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1116; goto _out;}
+					{p++; cs = 1125; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1116; goto _out;}
+			p--; {p++; cs = 1125; goto _out;}
 		}
 	}
-	goto st1116;
-tr3317:
+	goto st1125;
+tr3328:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -21466,8 +21475,8 @@ tr3317:
 	{
 		s->line_counter++;
 	}
-	goto st1116;
-tr3379:
+	goto st1125;
+tr3390:
 	{
 		s->line_counter++;
 	}
@@ -21477,13 +21486,13 @@ tr3379:
 			p--; {goto st261;}
 		}
 	}
-	goto st1116;
-tr3375:
-	cs = 1116;
+	goto st1125;
+tr3386:
+	cs = 1125;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	{
@@ -21496,7 +21505,7 @@ tr3375:
 		s->line_counter++;
 	}
 	goto _again;
-tr3383:
+tr3394:
 	{
 		if (rdata_tail - s->r_data > UINT16_MAX) {
 			WARN(ZS_RDATA_OVERFLOW);
@@ -21513,12 +21522,12 @@ tr3383:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1116; goto _out;}
+					{p++; cs = 1125; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1116; goto _out;}
+			p--; {p++; cs = 1125; goto _out;}
 		}
 	}
 	{
@@ -21530,8 +21539,8 @@ tr3383:
 			p--; {goto st261;}
 		}
 	}
-	goto st1116;
-tr3407:
+	goto st1125;
+tr3418:
 	{
 		s->line_counter++;
 	}
@@ -21551,12 +21560,12 @@ tr3407:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1116; goto _out;}
+					{p++; cs = 1125; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1116; goto _out;}
+			p--; {p++; cs = 1125; goto _out;}
 		}
 	}
 	{
@@ -21565,11 +21574,11 @@ tr3407:
 			p--; {goto st261;}
 		}
 	}
-	goto st1116;
-st1116:
+	goto st1125;
+st1125:
 	if ( ++p == pe )
-		goto _test_eof1116;
-case 1116:
+		goto _test_eof1125;
+case 1125:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -21583,62 +21592,62 @@ case 1116:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3312;
-		case 32: goto tr3312;
+		case 9: goto tr3323;
+		case 32: goto tr3323;
 		case 36: goto st150;
-		case 40: goto tr3377;
-		case 41: goto tr3378;
-		case 42: goto tr3316;
-		case 65: goto tr3352;
-		case 67: goto tr3353;
-		case 68: goto tr3354;
-		case 69: goto tr3355;
-		case 72: goto tr3356;
-		case 73: goto tr3357;
-		case 75: goto tr3358;
-		case 76: goto tr3359;
-		case 77: goto tr3360;
-		case 78: goto tr3361;
-		case 80: goto tr3362;
-		case 82: goto tr3363;
-		case 83: goto tr3364;
-		case 84: goto tr3365;
-		case 85: goto tr3366;
-		case 92: goto tr3316;
-		case 95: goto tr3316;
-		case 97: goto tr3352;
-		case 99: goto tr3353;
-		case 100: goto tr3354;
-		case 101: goto tr3355;
-		case 104: goto tr3356;
-		case 105: goto tr3357;
-		case 107: goto tr3358;
-		case 108: goto tr3359;
-		case 109: goto tr3360;
-		case 110: goto tr3361;
-		case 112: goto tr3362;
-		case 114: goto tr3363;
-		case 115: goto tr3364;
-		case 116: goto tr3365;
-		case 117: goto tr3366;
+		case 40: goto tr3388;
+		case 41: goto tr3389;
+		case 42: goto tr3327;
+		case 65: goto tr3363;
+		case 67: goto tr3364;
+		case 68: goto tr3365;
+		case 69: goto tr3366;
+		case 72: goto tr3367;
+		case 73: goto tr3368;
+		case 75: goto tr3369;
+		case 76: goto tr3370;
+		case 77: goto tr3371;
+		case 78: goto tr3372;
+		case 80: goto tr3373;
+		case 82: goto tr3374;
+		case 83: goto tr3375;
+		case 84: goto tr3376;
+		case 85: goto tr3377;
+		case 92: goto tr3327;
+		case 95: goto tr3327;
+		case 97: goto tr3363;
+		case 99: goto tr3364;
+		case 100: goto tr3365;
+		case 101: goto tr3366;
+		case 104: goto tr3367;
+		case 105: goto tr3368;
+		case 107: goto tr3369;
+		case 108: goto tr3370;
+		case 109: goto tr3371;
+		case 110: goto tr3372;
+		case 112: goto tr3373;
+		case 114: goto tr3374;
+		case 115: goto tr3375;
+		case 116: goto tr3376;
+		case 117: goto tr3377;
 		case 778: goto tr20;
 		case 827: goto st149;
-		case 1034: goto tr3379;
-		case 1083: goto tr3318;
+		case 1034: goto tr3390;
+		case 1083: goto tr3329;
 	}
 	if ( _widec < 48 ) {
 		if ( 45 <= _widec && _widec <= 47 )
-			goto tr3316;
+			goto tr3327;
 	} else if ( _widec > 57 ) {
 		if ( _widec > 90 ) {
 			if ( 98 <= _widec && _widec <= 122 )
-				goto tr3316;
+				goto tr3327;
 		} else if ( _widec >= 64 )
-			goto tr3316;
+			goto tr3327;
 	} else
-		goto tr3351;
-	goto tr3350;
-tr3351:
+		goto tr3362;
+	goto tr3361;
+tr3362:
 	{
 		s->number64 = 0;
 	}
@@ -22156,7 +22165,7 @@ case 167:
 	if ( 896 <= _widec && _widec <= 1151 )
 		goto st167;
 	goto tr36;
-tr3333:
+tr3344:
 	{
 		s->r_class = s->default_class;
 	}
@@ -22166,7 +22175,7 @@ tr3333:
 	}
 	{ p--; {stack[top++] = 168; goto st263;} }
 	goto st168;
-tr3352:
+tr3363:
 	{
 		s->r_class = s->default_class;
 	}
@@ -22381,76 +22390,76 @@ tr101:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 170; goto st616;}
+			{stack[top++] = 170; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 170; goto st618;}
+			{stack[top++] = 170; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 170; goto st620;}
+			{stack[top++] = 170; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 170; goto st652;}
+			{stack[top++] = 170; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 170; goto st657;}
+			{stack[top++] = 170; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 170; goto st662;}
+			{stack[top++] = 170; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 170; goto st667;}
+			{stack[top++] = 170; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 170; goto st671;}
+			{stack[top++] = 170; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 170; goto st673;}
+			{stack[top++] = 170; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 170; goto st728;}
+			{stack[top++] = 170; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 170; goto st739;}
+			{stack[top++] = 170; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 170; goto st756;}
+			{stack[top++] = 170; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 170; goto st767;}
+			{stack[top++] = 170; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 170; goto st778;}
+			{stack[top++] = 170; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 170; goto st791;}
+			{stack[top++] = 170; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 170; goto st801;}
+			{stack[top++] = 170; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 170; goto st840;}
+			{stack[top++] = 170; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 170; goto st994;}
+			{stack[top++] = 170; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 170; goto st997;}
+			{stack[top++] = 170; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 170; goto st1008;}
+			{stack[top++] = 170; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 170; goto st1010;}
+			{stack[top++] = 170; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 170; goto st1039;}
+			{stack[top++] = 170; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 170; goto st1052;}
+			{stack[top++] = 170; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 170; goto st1070;}
+			{stack[top++] = 170; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 170; goto st1065;}
+			{stack[top++] = 170; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 170; goto st1083;}
+			{stack[top++] = 170; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 170; goto st1089;}
+			{stack[top++] = 170; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 170; goto st1095;}
+			{stack[top++] = 170; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 170; goto st1103;}
+			{stack[top++] = 170; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -22597,76 +22606,76 @@ tr92:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1117; goto st616;}
+			{stack[top++] = 1126; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1117; goto st618;}
+			{stack[top++] = 1126; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1117; goto st620;}
+			{stack[top++] = 1126; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1117; goto st652;}
+			{stack[top++] = 1126; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1117; goto st657;}
+			{stack[top++] = 1126; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1117; goto st662;}
+			{stack[top++] = 1126; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1117; goto st667;}
+			{stack[top++] = 1126; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1117; goto st671;}
+			{stack[top++] = 1126; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1117; goto st673;}
+			{stack[top++] = 1126; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1117; goto st728;}
+			{stack[top++] = 1126; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1117; goto st739;}
+			{stack[top++] = 1126; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1117; goto st756;}
+			{stack[top++] = 1126; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1117; goto st767;}
+			{stack[top++] = 1126; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1117; goto st778;}
+			{stack[top++] = 1126; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1117; goto st791;}
+			{stack[top++] = 1126; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1117; goto st801;}
+			{stack[top++] = 1126; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1117; goto st840;}
+			{stack[top++] = 1126; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1117; goto st994;}
+			{stack[top++] = 1126; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1117; goto st997;}
+			{stack[top++] = 1126; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1117; goto st1008;}
+			{stack[top++] = 1126; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1117; goto st1010;}
+			{stack[top++] = 1126; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1117; goto st1039;}
+			{stack[top++] = 1126; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1117; goto st1052;}
+			{stack[top++] = 1126; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1117; goto st1070;}
+			{stack[top++] = 1126; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1117; goto st1065;}
+			{stack[top++] = 1126; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1117; goto st1083;}
+			{stack[top++] = 1126; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1117; goto st1089;}
+			{stack[top++] = 1126; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1117; goto st1095;}
+			{stack[top++] = 1126; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1117; goto st1103;}
+			{stack[top++] = 1126; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -22688,93 +22697,93 @@ tr92:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1117; goto _out;}
+					{p++; cs = 1126; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1117; goto _out;}
+			p--; {p++; cs = 1126; goto _out;}
 		}
 	}
 	{
 		s->line_counter++;
 	}
-	goto st1117;
+	goto st1126;
 tr118:
 	{
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1117; goto st616;}
+			{stack[top++] = 1126; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1117; goto st618;}
+			{stack[top++] = 1126; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1117; goto st620;}
+			{stack[top++] = 1126; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1117; goto st652;}
+			{stack[top++] = 1126; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1117; goto st657;}
+			{stack[top++] = 1126; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1117; goto st662;}
+			{stack[top++] = 1126; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1117; goto st667;}
+			{stack[top++] = 1126; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1117; goto st671;}
+			{stack[top++] = 1126; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1117; goto st673;}
+			{stack[top++] = 1126; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1117; goto st728;}
+			{stack[top++] = 1126; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1117; goto st739;}
+			{stack[top++] = 1126; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1117; goto st756;}
+			{stack[top++] = 1126; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1117; goto st767;}
+			{stack[top++] = 1126; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1117; goto st778;}
+			{stack[top++] = 1126; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1117; goto st791;}
+			{stack[top++] = 1126; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1117; goto st801;}
+			{stack[top++] = 1126; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1117; goto st840;}
+			{stack[top++] = 1126; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1117; goto st994;}
+			{stack[top++] = 1126; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1117; goto st997;}
+			{stack[top++] = 1126; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1117; goto st1008;}
+			{stack[top++] = 1126; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1117; goto st1010;}
+			{stack[top++] = 1126; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1117; goto st1039;}
+			{stack[top++] = 1126; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1117; goto st1052;}
+			{stack[top++] = 1126; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1117; goto st1070;}
+			{stack[top++] = 1126; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1117; goto st1065;}
+			{stack[top++] = 1126; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1117; goto st1083;}
+			{stack[top++] = 1126; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1117; goto st1089;}
+			{stack[top++] = 1126; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1117; goto st1095;}
+			{stack[top++] = 1126; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1117; goto st1103;}
+			{stack[top++] = 1126; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -22783,7 +22792,7 @@ tr118:
 	{
 		s->line_counter++;
 	}
-	goto st1117;
+	goto st1126;
 tr707:
 	{ s->r_type = KNOT_RRTYPE_A; }
 	{
@@ -22793,76 +22802,76 @@ tr707:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1117; goto st616;}
+			{stack[top++] = 1126; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1117; goto st618;}
+			{stack[top++] = 1126; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1117; goto st620;}
+			{stack[top++] = 1126; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1117; goto st652;}
+			{stack[top++] = 1126; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1117; goto st657;}
+			{stack[top++] = 1126; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1117; goto st662;}
+			{stack[top++] = 1126; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1117; goto st667;}
+			{stack[top++] = 1126; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1117; goto st671;}
+			{stack[top++] = 1126; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1117; goto st673;}
+			{stack[top++] = 1126; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1117; goto st728;}
+			{stack[top++] = 1126; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1117; goto st739;}
+			{stack[top++] = 1126; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1117; goto st756;}
+			{stack[top++] = 1126; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1117; goto st767;}
+			{stack[top++] = 1126; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1117; goto st778;}
+			{stack[top++] = 1126; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1117; goto st791;}
+			{stack[top++] = 1126; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1117; goto st801;}
+			{stack[top++] = 1126; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1117; goto st840;}
+			{stack[top++] = 1126; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1117; goto st994;}
+			{stack[top++] = 1126; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1117; goto st997;}
+			{stack[top++] = 1126; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1117; goto st1008;}
+			{stack[top++] = 1126; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1117; goto st1010;}
+			{stack[top++] = 1126; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1117; goto st1039;}
+			{stack[top++] = 1126; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1117; goto st1052;}
+			{stack[top++] = 1126; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1117; goto st1070;}
+			{stack[top++] = 1126; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1117; goto st1065;}
+			{stack[top++] = 1126; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1117; goto st1083;}
+			{stack[top++] = 1126; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1117; goto st1089;}
+			{stack[top++] = 1126; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1117; goto st1095;}
+			{stack[top++] = 1126; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1117; goto st1103;}
+			{stack[top++] = 1126; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -22884,22 +22893,22 @@ tr707:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1117; goto _out;}
+					{p++; cs = 1126; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1117; goto _out;}
+			p--; {p++; cs = 1126; goto _out;}
 		}
 	}
 	{
 		s->line_counter++;
 	}
-	goto st1117;
-st1117:
+	goto st1126;
+st1126:
 	if ( ++p == pe )
-		goto _test_eof1117;
-case 1117:
+		goto _test_eof1126;
+case 1126:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -22913,27 +22922,27 @@ case 1117:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3380;
-		case 32: goto tr3380;
+		case 9: goto tr3391;
+		case 32: goto tr3391;
 		case 36: goto st150;
-		case 40: goto tr3381;
-		case 41: goto tr3382;
-		case 42: goto tr3316;
-		case 92: goto tr3316;
-		case 95: goto tr3316;
+		case 40: goto tr3392;
+		case 41: goto tr3393;
+		case 42: goto tr3327;
+		case 92: goto tr3327;
+		case 95: goto tr3327;
 		case 778: goto tr83;
 		case 827: goto st8;
-		case 1034: goto tr3383;
-		case 1083: goto tr3384;
+		case 1034: goto tr3394;
+		case 1083: goto tr3395;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr3316;
+			goto tr3327;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr3316;
+			goto tr3327;
 	} else
-		goto tr3316;
+		goto tr3327;
 	goto tr739;
 tr716:
 	{
@@ -22982,7 +22991,7 @@ tr742:
 		s->multiline = false;
 	}
 	goto st172;
-tr3380:
+tr3391:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -22990,7 +22999,7 @@ tr3380:
 		}
 	}
 	goto st172;
-tr3381:
+tr3392:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -23005,7 +23014,7 @@ tr3381:
 		}
 	}
 	goto st172;
-tr3382:
+tr3393:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -23084,7 +23093,7 @@ tr744:
 		s->r_owner_length = s->dname_tmp_length;
 	}
 	goto st173;
-tr3384:
+tr3395:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -23133,76 +23142,76 @@ tr708:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 174; goto st616;}
+			{stack[top++] = 174; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 174; goto st618;}
+			{stack[top++] = 174; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 174; goto st620;}
+			{stack[top++] = 174; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 174; goto st652;}
+			{stack[top++] = 174; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 174; goto st657;}
+			{stack[top++] = 174; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 174; goto st662;}
+			{stack[top++] = 174; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 174; goto st667;}
+			{stack[top++] = 174; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 174; goto st671;}
+			{stack[top++] = 174; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 174; goto st673;}
+			{stack[top++] = 174; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 174; goto st728;}
+			{stack[top++] = 174; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 174; goto st739;}
+			{stack[top++] = 174; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 174; goto st756;}
+			{stack[top++] = 174; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 174; goto st767;}
+			{stack[top++] = 174; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 174; goto st778;}
+			{stack[top++] = 174; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 174; goto st791;}
+			{stack[top++] = 174; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 174; goto st801;}
+			{stack[top++] = 174; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 174; goto st840;}
+			{stack[top++] = 174; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 174; goto st994;}
+			{stack[top++] = 174; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 174; goto st997;}
+			{stack[top++] = 174; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 174; goto st1008;}
+			{stack[top++] = 174; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 174; goto st1010;}
+			{stack[top++] = 174; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 174; goto st1039;}
+			{stack[top++] = 174; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 174; goto st1052;}
+			{stack[top++] = 174; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 174; goto st1070;}
+			{stack[top++] = 174; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 174; goto st1065;}
+			{stack[top++] = 174; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 174; goto st1083;}
+			{stack[top++] = 174; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 174; goto st1089;}
+			{stack[top++] = 174; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 174; goto st1095;}
+			{stack[top++] = 174; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 174; goto st1103;}
+			{stack[top++] = 174; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -23214,76 +23223,76 @@ tr93:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 174; goto st616;}
+			{stack[top++] = 174; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 174; goto st618;}
+			{stack[top++] = 174; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 174; goto st620;}
+			{stack[top++] = 174; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 174; goto st652;}
+			{stack[top++] = 174; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 174; goto st657;}
+			{stack[top++] = 174; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 174; goto st662;}
+			{stack[top++] = 174; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 174; goto st667;}
+			{stack[top++] = 174; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 174; goto st671;}
+			{stack[top++] = 174; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 174; goto st673;}
+			{stack[top++] = 174; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 174; goto st728;}
+			{stack[top++] = 174; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 174; goto st739;}
+			{stack[top++] = 174; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 174; goto st756;}
+			{stack[top++] = 174; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 174; goto st767;}
+			{stack[top++] = 174; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 174; goto st778;}
+			{stack[top++] = 174; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 174; goto st791;}
+			{stack[top++] = 174; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 174; goto st801;}
+			{stack[top++] = 174; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 174; goto st840;}
+			{stack[top++] = 174; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 174; goto st994;}
+			{stack[top++] = 174; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 174; goto st997;}
+			{stack[top++] = 174; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 174; goto st1008;}
+			{stack[top++] = 174; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 174; goto st1010;}
+			{stack[top++] = 174; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 174; goto st1039;}
+			{stack[top++] = 174; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 174; goto st1052;}
+			{stack[top++] = 174; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 174; goto st1070;}
+			{stack[top++] = 174; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 174; goto st1065;}
+			{stack[top++] = 174; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 174; goto st1083;}
+			{stack[top++] = 174; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 174; goto st1089;}
+			{stack[top++] = 174; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 174; goto st1095;}
+			{stack[top++] = 174; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 174; goto st1103;}
+			{stack[top++] = 174; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -23390,76 +23399,76 @@ tr709:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1118; goto st616;}
+			{stack[top++] = 1127; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1118; goto st618;}
+			{stack[top++] = 1127; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1118; goto st620;}
+			{stack[top++] = 1127; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1118; goto st652;}
+			{stack[top++] = 1127; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1118; goto st657;}
+			{stack[top++] = 1127; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1118; goto st662;}
+			{stack[top++] = 1127; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1118; goto st667;}
+			{stack[top++] = 1127; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1118; goto st671;}
+			{stack[top++] = 1127; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1118; goto st673;}
+			{stack[top++] = 1127; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1118; goto st728;}
+			{stack[top++] = 1127; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1118; goto st739;}
+			{stack[top++] = 1127; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1118; goto st756;}
+			{stack[top++] = 1127; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1118; goto st767;}
+			{stack[top++] = 1127; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1118; goto st778;}
+			{stack[top++] = 1127; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1118; goto st791;}
+			{stack[top++] = 1127; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1118; goto st801;}
+			{stack[top++] = 1127; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1118; goto st840;}
+			{stack[top++] = 1127; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1118; goto st994;}
+			{stack[top++] = 1127; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1118; goto st997;}
+			{stack[top++] = 1127; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1118; goto st1008;}
+			{stack[top++] = 1127; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1118; goto st1010;}
+			{stack[top++] = 1127; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1118; goto st1039;}
+			{stack[top++] = 1127; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1118; goto st1052;}
+			{stack[top++] = 1127; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1118; goto st1070;}
+			{stack[top++] = 1127; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1118; goto st1065;}
+			{stack[top++] = 1127; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1118; goto st1083;}
+			{stack[top++] = 1127; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1118; goto st1089;}
+			{stack[top++] = 1127; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1118; goto st1095;}
+			{stack[top++] = 1127; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1118; goto st1103;}
+			{stack[top++] = 1127; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -23481,15 +23490,15 @@ tr709:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1118; goto _out;}
+					{p++; cs = 1127; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1118; goto _out;}
+			p--; {p++; cs = 1127; goto _out;}
 		}
 	}
-	goto st1118;
+	goto st1127;
 tr714:
 	{
 		s->line_counter++;
@@ -23498,76 +23507,76 @@ tr714:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1118; goto st616;}
+			{stack[top++] = 1127; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1118; goto st618;}
+			{stack[top++] = 1127; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1118; goto st620;}
+			{stack[top++] = 1127; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1118; goto st652;}
+			{stack[top++] = 1127; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1118; goto st657;}
+			{stack[top++] = 1127; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1118; goto st662;}
+			{stack[top++] = 1127; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1118; goto st667;}
+			{stack[top++] = 1127; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1118; goto st671;}
+			{stack[top++] = 1127; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1118; goto st673;}
+			{stack[top++] = 1127; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1118; goto st728;}
+			{stack[top++] = 1127; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1118; goto st739;}
+			{stack[top++] = 1127; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1118; goto st756;}
+			{stack[top++] = 1127; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1118; goto st767;}
+			{stack[top++] = 1127; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1118; goto st778;}
+			{stack[top++] = 1127; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1118; goto st791;}
+			{stack[top++] = 1127; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1118; goto st801;}
+			{stack[top++] = 1127; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1118; goto st840;}
+			{stack[top++] = 1127; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1118; goto st994;}
+			{stack[top++] = 1127; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1118; goto st997;}
+			{stack[top++] = 1127; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1118; goto st1008;}
+			{stack[top++] = 1127; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1118; goto st1010;}
+			{stack[top++] = 1127; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1118; goto st1039;}
+			{stack[top++] = 1127; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1118; goto st1052;}
+			{stack[top++] = 1127; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1118; goto st1070;}
+			{stack[top++] = 1127; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1118; goto st1065;}
+			{stack[top++] = 1127; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1118; goto st1083;}
+			{stack[top++] = 1127; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1118; goto st1089;}
+			{stack[top++] = 1127; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1118; goto st1095;}
+			{stack[top++] = 1127; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1118; goto st1103;}
+			{stack[top++] = 1127; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -23589,19 +23598,19 @@ tr714:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1118; goto _out;}
+					{p++; cs = 1127; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1118; goto _out;}
+			p--; {p++; cs = 1127; goto _out;}
 		}
 	}
-	goto st1118;
-st1118:
+	goto st1127;
+st1127:
 	if ( ++p == pe )
-		goto _test_eof1118;
-case 1118:
+		goto _test_eof1127;
+case 1127:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -23619,23 +23628,23 @@ case 1118:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr3385;
-		case 32: goto tr3385;
-		case 36: goto tr3320;
-		case 40: goto tr3386;
-		case 41: goto tr3387;
-		case 42: goto tr3323;
+		case 9: goto tr3396;
+		case 32: goto tr3396;
+		case 36: goto tr3331;
+		case 40: goto tr3397;
+		case 41: goto tr3398;
+		case 42: goto tr3334;
 		case 58: goto tr69;
-		case 92: goto tr3324;
-		case 95: goto tr3323;
+		case 92: goto tr3335;
+		case 95: goto tr3334;
 		case 1802: goto tr83;
 		case 1851: goto st8;
-		case 2058: goto tr3383;
-		case 2107: goto tr3388;
+		case 2058: goto tr3394;
+		case 2107: goto tr3399;
 		case 2314: goto tr92;
 		case 2363: goto tr93;
-		case 2570: goto tr3383;
-		case 2619: goto tr3389;
+		case 2570: goto tr3394;
+		case 2619: goto tr3400;
 	}
 	if ( _widec < 60 ) {
 		if ( _widec < 11 ) {
@@ -23643,19 +23652,19 @@ case 1118:
 				goto tr69;
 		} else if ( _widec > 44 ) {
 			if ( 45 <= _widec && _widec <= 57 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else if ( _widec > 63 ) {
 		if ( _widec < 91 ) {
 			if ( 64 <= _widec && _widec <= 90 )
-				goto tr3323;
+				goto tr3334;
 		} else if ( _widec > 96 ) {
 			if ( _widec > 122 ) {
 				if ( 123 <= _widec )
 					goto tr69;
 			} else if ( _widec >= 97 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else
@@ -23687,76 +23696,76 @@ tr699:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 176; goto st616;}
+			{stack[top++] = 176; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 176; goto st618;}
+			{stack[top++] = 176; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 176; goto st620;}
+			{stack[top++] = 176; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 176; goto st652;}
+			{stack[top++] = 176; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 176; goto st657;}
+			{stack[top++] = 176; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 176; goto st662;}
+			{stack[top++] = 176; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 176; goto st667;}
+			{stack[top++] = 176; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 176; goto st671;}
+			{stack[top++] = 176; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 176; goto st673;}
+			{stack[top++] = 176; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 176; goto st728;}
+			{stack[top++] = 176; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 176; goto st739;}
+			{stack[top++] = 176; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 176; goto st756;}
+			{stack[top++] = 176; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 176; goto st767;}
+			{stack[top++] = 176; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 176; goto st778;}
+			{stack[top++] = 176; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 176; goto st791;}
+			{stack[top++] = 176; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 176; goto st801;}
+			{stack[top++] = 176; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 176; goto st840;}
+			{stack[top++] = 176; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 176; goto st994;}
+			{stack[top++] = 176; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 176; goto st997;}
+			{stack[top++] = 176; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 176; goto st1008;}
+			{stack[top++] = 176; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 176; goto st1010;}
+			{stack[top++] = 176; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 176; goto st1039;}
+			{stack[top++] = 176; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 176; goto st1052;}
+			{stack[top++] = 176; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 176; goto st1070;}
+			{stack[top++] = 176; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 176; goto st1065;}
+			{stack[top++] = 176; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 176; goto st1083;}
+			{stack[top++] = 176; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 176; goto st1089;}
+			{stack[top++] = 176; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 176; goto st1095;}
+			{stack[top++] = 176; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 176; goto st1103;}
+			{stack[top++] = 176; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -23778,83 +23787,83 @@ tr692:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 176; goto st616;}
+			{stack[top++] = 176; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 176; goto st618;}
+			{stack[top++] = 176; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 176; goto st620;}
+			{stack[top++] = 176; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 176; goto st652;}
+			{stack[top++] = 176; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 176; goto st657;}
+			{stack[top++] = 176; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 176; goto st662;}
+			{stack[top++] = 176; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 176; goto st667;}
+			{stack[top++] = 176; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 176; goto st671;}
+			{stack[top++] = 176; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 176; goto st673;}
+			{stack[top++] = 176; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 176; goto st728;}
+			{stack[top++] = 176; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 176; goto st739;}
+			{stack[top++] = 176; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 176; goto st756;}
+			{stack[top++] = 176; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 176; goto st767;}
+			{stack[top++] = 176; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 176; goto st778;}
+			{stack[top++] = 176; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 176; goto st791;}
+			{stack[top++] = 176; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 176; goto st801;}
+			{stack[top++] = 176; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 176; goto st840;}
+			{stack[top++] = 176; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 176; goto st994;}
+			{stack[top++] = 176; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 176; goto st997;}
+			{stack[top++] = 176; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 176; goto st1008;}
+			{stack[top++] = 176; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 176; goto st1010;}
+			{stack[top++] = 176; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 176; goto st1039;}
+			{stack[top++] = 176; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 176; goto st1052;}
+			{stack[top++] = 176; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 176; goto st1070;}
+			{stack[top++] = 176; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 176; goto st1065;}
+			{stack[top++] = 176; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 176; goto st1083;}
+			{stack[top++] = 176; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 176; goto st1089;}
+			{stack[top++] = 176; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 176; goto st1095;}
+			{stack[top++] = 176; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 176; goto st1103;}
+			{stack[top++] = 176; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
 		}
 	}
 	goto st176;
-tr3385:
+tr3396:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -23862,7 +23871,7 @@ tr3385:
 		}
 	}
 	goto st176;
-tr3386:
+tr3397:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -23877,7 +23886,7 @@ tr3386:
 		}
 	}
 	goto st176;
-tr3387:
+tr3398:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -23981,76 +23990,76 @@ tr102:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 177; goto st616;}
+			{stack[top++] = 177; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 177; goto st618;}
+			{stack[top++] = 177; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 177; goto st620;}
+			{stack[top++] = 177; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 177; goto st652;}
+			{stack[top++] = 177; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 177; goto st657;}
+			{stack[top++] = 177; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 177; goto st662;}
+			{stack[top++] = 177; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 177; goto st667;}
+			{stack[top++] = 177; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 177; goto st671;}
+			{stack[top++] = 177; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 177; goto st673;}
+			{stack[top++] = 177; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 177; goto st728;}
+			{stack[top++] = 177; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 177; goto st739;}
+			{stack[top++] = 177; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 177; goto st756;}
+			{stack[top++] = 177; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 177; goto st767;}
+			{stack[top++] = 177; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 177; goto st778;}
+			{stack[top++] = 177; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 177; goto st791;}
+			{stack[top++] = 177; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 177; goto st801;}
+			{stack[top++] = 177; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 177; goto st840;}
+			{stack[top++] = 177; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 177; goto st994;}
+			{stack[top++] = 177; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 177; goto st997;}
+			{stack[top++] = 177; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 177; goto st1008;}
+			{stack[top++] = 177; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 177; goto st1010;}
+			{stack[top++] = 177; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 177; goto st1039;}
+			{stack[top++] = 177; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 177; goto st1052;}
+			{stack[top++] = 177; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 177; goto st1070;}
+			{stack[top++] = 177; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 177; goto st1065;}
+			{stack[top++] = 177; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 177; goto st1083;}
+			{stack[top++] = 177; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 177; goto st1089;}
+			{stack[top++] = 177; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 177; goto st1095;}
+			{stack[top++] = 177; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 177; goto st1103;}
+			{stack[top++] = 177; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24103,76 +24112,76 @@ tr103:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 178; goto st616;}
+			{stack[top++] = 178; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 178; goto st618;}
+			{stack[top++] = 178; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 178; goto st620;}
+			{stack[top++] = 178; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 178; goto st652;}
+			{stack[top++] = 178; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 178; goto st657;}
+			{stack[top++] = 178; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 178; goto st662;}
+			{stack[top++] = 178; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 178; goto st667;}
+			{stack[top++] = 178; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 178; goto st671;}
+			{stack[top++] = 178; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 178; goto st673;}
+			{stack[top++] = 178; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 178; goto st728;}
+			{stack[top++] = 178; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 178; goto st739;}
+			{stack[top++] = 178; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 178; goto st756;}
+			{stack[top++] = 178; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 178; goto st767;}
+			{stack[top++] = 178; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 178; goto st778;}
+			{stack[top++] = 178; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 178; goto st791;}
+			{stack[top++] = 178; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 178; goto st801;}
+			{stack[top++] = 178; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 178; goto st840;}
+			{stack[top++] = 178; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 178; goto st994;}
+			{stack[top++] = 178; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 178; goto st997;}
+			{stack[top++] = 178; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 178; goto st1008;}
+			{stack[top++] = 178; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 178; goto st1010;}
+			{stack[top++] = 178; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 178; goto st1039;}
+			{stack[top++] = 178; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 178; goto st1052;}
+			{stack[top++] = 178; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 178; goto st1070;}
+			{stack[top++] = 178; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 178; goto st1065;}
+			{stack[top++] = 178; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 178; goto st1083;}
+			{stack[top++] = 178; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 178; goto st1089;}
+			{stack[top++] = 178; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 178; goto st1095;}
+			{stack[top++] = 178; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 178; goto st1103;}
+			{stack[top++] = 178; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24223,76 +24232,76 @@ tr104:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 179; goto st616;}
+			{stack[top++] = 179; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 179; goto st618;}
+			{stack[top++] = 179; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 179; goto st620;}
+			{stack[top++] = 179; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 179; goto st652;}
+			{stack[top++] = 179; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 179; goto st657;}
+			{stack[top++] = 179; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 179; goto st662;}
+			{stack[top++] = 179; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 179; goto st667;}
+			{stack[top++] = 179; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 179; goto st671;}
+			{stack[top++] = 179; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 179; goto st673;}
+			{stack[top++] = 179; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 179; goto st728;}
+			{stack[top++] = 179; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 179; goto st739;}
+			{stack[top++] = 179; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 179; goto st756;}
+			{stack[top++] = 179; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 179; goto st767;}
+			{stack[top++] = 179; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 179; goto st778;}
+			{stack[top++] = 179; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 179; goto st791;}
+			{stack[top++] = 179; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 179; goto st801;}
+			{stack[top++] = 179; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 179; goto st840;}
+			{stack[top++] = 179; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 179; goto st994;}
+			{stack[top++] = 179; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 179; goto st997;}
+			{stack[top++] = 179; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 179; goto st1008;}
+			{stack[top++] = 179; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 179; goto st1010;}
+			{stack[top++] = 179; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 179; goto st1039;}
+			{stack[top++] = 179; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 179; goto st1052;}
+			{stack[top++] = 179; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 179; goto st1070;}
+			{stack[top++] = 179; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 179; goto st1065;}
+			{stack[top++] = 179; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 179; goto st1083;}
+			{stack[top++] = 179; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 179; goto st1089;}
+			{stack[top++] = 179; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 179; goto st1095;}
+			{stack[top++] = 179; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 179; goto st1103;}
+			{stack[top++] = 179; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24339,76 +24348,76 @@ tr105:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 180; goto st616;}
+			{stack[top++] = 180; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 180; goto st618;}
+			{stack[top++] = 180; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 180; goto st620;}
+			{stack[top++] = 180; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 180; goto st652;}
+			{stack[top++] = 180; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 180; goto st657;}
+			{stack[top++] = 180; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 180; goto st662;}
+			{stack[top++] = 180; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 180; goto st667;}
+			{stack[top++] = 180; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 180; goto st671;}
+			{stack[top++] = 180; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 180; goto st673;}
+			{stack[top++] = 180; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 180; goto st728;}
+			{stack[top++] = 180; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 180; goto st739;}
+			{stack[top++] = 180; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 180; goto st756;}
+			{stack[top++] = 180; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 180; goto st767;}
+			{stack[top++] = 180; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 180; goto st778;}
+			{stack[top++] = 180; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 180; goto st791;}
+			{stack[top++] = 180; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 180; goto st801;}
+			{stack[top++] = 180; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 180; goto st840;}
+			{stack[top++] = 180; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 180; goto st994;}
+			{stack[top++] = 180; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 180; goto st997;}
+			{stack[top++] = 180; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 180; goto st1008;}
+			{stack[top++] = 180; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 180; goto st1010;}
+			{stack[top++] = 180; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 180; goto st1039;}
+			{stack[top++] = 180; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 180; goto st1052;}
+			{stack[top++] = 180; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 180; goto st1070;}
+			{stack[top++] = 180; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 180; goto st1065;}
+			{stack[top++] = 180; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 180; goto st1083;}
+			{stack[top++] = 180; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 180; goto st1089;}
+			{stack[top++] = 180; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 180; goto st1095;}
+			{stack[top++] = 180; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 180; goto st1103;}
+			{stack[top++] = 180; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24455,76 +24464,76 @@ tr106:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 181; goto st616;}
+			{stack[top++] = 181; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 181; goto st618;}
+			{stack[top++] = 181; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 181; goto st620;}
+			{stack[top++] = 181; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 181; goto st652;}
+			{stack[top++] = 181; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 181; goto st657;}
+			{stack[top++] = 181; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 181; goto st662;}
+			{stack[top++] = 181; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 181; goto st667;}
+			{stack[top++] = 181; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 181; goto st671;}
+			{stack[top++] = 181; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 181; goto st673;}
+			{stack[top++] = 181; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 181; goto st728;}
+			{stack[top++] = 181; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 181; goto st739;}
+			{stack[top++] = 181; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 181; goto st756;}
+			{stack[top++] = 181; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 181; goto st767;}
+			{stack[top++] = 181; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 181; goto st778;}
+			{stack[top++] = 181; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 181; goto st791;}
+			{stack[top++] = 181; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 181; goto st801;}
+			{stack[top++] = 181; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 181; goto st840;}
+			{stack[top++] = 181; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 181; goto st994;}
+			{stack[top++] = 181; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 181; goto st997;}
+			{stack[top++] = 181; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 181; goto st1008;}
+			{stack[top++] = 181; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 181; goto st1010;}
+			{stack[top++] = 181; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 181; goto st1039;}
+			{stack[top++] = 181; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 181; goto st1052;}
+			{stack[top++] = 181; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 181; goto st1070;}
+			{stack[top++] = 181; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 181; goto st1065;}
+			{stack[top++] = 181; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 181; goto st1083;}
+			{stack[top++] = 181; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 181; goto st1089;}
+			{stack[top++] = 181; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 181; goto st1095;}
+			{stack[top++] = 181; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 181; goto st1103;}
+			{stack[top++] = 181; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24573,76 +24582,76 @@ tr107:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 182; goto st616;}
+			{stack[top++] = 182; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 182; goto st618;}
+			{stack[top++] = 182; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 182; goto st620;}
+			{stack[top++] = 182; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 182; goto st652;}
+			{stack[top++] = 182; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 182; goto st657;}
+			{stack[top++] = 182; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 182; goto st662;}
+			{stack[top++] = 182; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 182; goto st667;}
+			{stack[top++] = 182; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 182; goto st671;}
+			{stack[top++] = 182; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 182; goto st673;}
+			{stack[top++] = 182; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 182; goto st728;}
+			{stack[top++] = 182; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 182; goto st739;}
+			{stack[top++] = 182; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 182; goto st756;}
+			{stack[top++] = 182; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 182; goto st767;}
+			{stack[top++] = 182; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 182; goto st778;}
+			{stack[top++] = 182; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 182; goto st791;}
+			{stack[top++] = 182; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 182; goto st801;}
+			{stack[top++] = 182; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 182; goto st840;}
+			{stack[top++] = 182; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 182; goto st994;}
+			{stack[top++] = 182; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 182; goto st997;}
+			{stack[top++] = 182; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 182; goto st1008;}
+			{stack[top++] = 182; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 182; goto st1010;}
+			{stack[top++] = 182; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 182; goto st1039;}
+			{stack[top++] = 182; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 182; goto st1052;}
+			{stack[top++] = 182; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 182; goto st1070;}
+			{stack[top++] = 182; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 182; goto st1065;}
+			{stack[top++] = 182; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 182; goto st1083;}
+			{stack[top++] = 182; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 182; goto st1089;}
+			{stack[top++] = 182; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 182; goto st1095;}
+			{stack[top++] = 182; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 182; goto st1103;}
+			{stack[top++] = 182; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24691,76 +24700,76 @@ tr108:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 183; goto st616;}
+			{stack[top++] = 183; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 183; goto st618;}
+			{stack[top++] = 183; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 183; goto st620;}
+			{stack[top++] = 183; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 183; goto st652;}
+			{stack[top++] = 183; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 183; goto st657;}
+			{stack[top++] = 183; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 183; goto st662;}
+			{stack[top++] = 183; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 183; goto st667;}
+			{stack[top++] = 183; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 183; goto st671;}
+			{stack[top++] = 183; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 183; goto st673;}
+			{stack[top++] = 183; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 183; goto st728;}
+			{stack[top++] = 183; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 183; goto st739;}
+			{stack[top++] = 183; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 183; goto st756;}
+			{stack[top++] = 183; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 183; goto st767;}
+			{stack[top++] = 183; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 183; goto st778;}
+			{stack[top++] = 183; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 183; goto st791;}
+			{stack[top++] = 183; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 183; goto st801;}
+			{stack[top++] = 183; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 183; goto st840;}
+			{stack[top++] = 183; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 183; goto st994;}
+			{stack[top++] = 183; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 183; goto st997;}
+			{stack[top++] = 183; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 183; goto st1008;}
+			{stack[top++] = 183; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 183; goto st1010;}
+			{stack[top++] = 183; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 183; goto st1039;}
+			{stack[top++] = 183; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 183; goto st1052;}
+			{stack[top++] = 183; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 183; goto st1070;}
+			{stack[top++] = 183; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 183; goto st1065;}
+			{stack[top++] = 183; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 183; goto st1083;}
+			{stack[top++] = 183; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 183; goto st1089;}
+			{stack[top++] = 183; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 183; goto st1095;}
+			{stack[top++] = 183; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 183; goto st1103;}
+			{stack[top++] = 183; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24811,76 +24820,76 @@ tr109:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 184; goto st616;}
+			{stack[top++] = 184; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 184; goto st618;}
+			{stack[top++] = 184; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 184; goto st620;}
+			{stack[top++] = 184; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 184; goto st652;}
+			{stack[top++] = 184; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 184; goto st657;}
+			{stack[top++] = 184; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 184; goto st662;}
+			{stack[top++] = 184; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 184; goto st667;}
+			{stack[top++] = 184; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 184; goto st671;}
+			{stack[top++] = 184; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 184; goto st673;}
+			{stack[top++] = 184; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 184; goto st728;}
+			{stack[top++] = 184; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 184; goto st739;}
+			{stack[top++] = 184; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 184; goto st756;}
+			{stack[top++] = 184; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 184; goto st767;}
+			{stack[top++] = 184; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 184; goto st778;}
+			{stack[top++] = 184; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 184; goto st791;}
+			{stack[top++] = 184; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 184; goto st801;}
+			{stack[top++] = 184; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 184; goto st840;}
+			{stack[top++] = 184; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 184; goto st994;}
+			{stack[top++] = 184; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 184; goto st997;}
+			{stack[top++] = 184; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 184; goto st1008;}
+			{stack[top++] = 184; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 184; goto st1010;}
+			{stack[top++] = 184; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 184; goto st1039;}
+			{stack[top++] = 184; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 184; goto st1052;}
+			{stack[top++] = 184; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 184; goto st1070;}
+			{stack[top++] = 184; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 184; goto st1065;}
+			{stack[top++] = 184; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 184; goto st1083;}
+			{stack[top++] = 184; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 184; goto st1089;}
+			{stack[top++] = 184; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 184; goto st1095;}
+			{stack[top++] = 184; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 184; goto st1103;}
+			{stack[top++] = 184; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -24929,76 +24938,76 @@ tr110:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 185; goto st616;}
+			{stack[top++] = 185; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 185; goto st618;}
+			{stack[top++] = 185; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 185; goto st620;}
+			{stack[top++] = 185; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 185; goto st652;}
+			{stack[top++] = 185; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 185; goto st657;}
+			{stack[top++] = 185; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 185; goto st662;}
+			{stack[top++] = 185; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 185; goto st667;}
+			{stack[top++] = 185; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 185; goto st671;}
+			{stack[top++] = 185; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 185; goto st673;}
+			{stack[top++] = 185; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 185; goto st728;}
+			{stack[top++] = 185; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 185; goto st739;}
+			{stack[top++] = 185; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 185; goto st756;}
+			{stack[top++] = 185; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 185; goto st767;}
+			{stack[top++] = 185; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 185; goto st778;}
+			{stack[top++] = 185; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 185; goto st791;}
+			{stack[top++] = 185; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 185; goto st801;}
+			{stack[top++] = 185; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 185; goto st840;}
+			{stack[top++] = 185; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 185; goto st994;}
+			{stack[top++] = 185; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 185; goto st997;}
+			{stack[top++] = 185; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 185; goto st1008;}
+			{stack[top++] = 185; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 185; goto st1010;}
+			{stack[top++] = 185; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 185; goto st1039;}
+			{stack[top++] = 185; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 185; goto st1052;}
+			{stack[top++] = 185; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 185; goto st1070;}
+			{stack[top++] = 185; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 185; goto st1065;}
+			{stack[top++] = 185; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 185; goto st1083;}
+			{stack[top++] = 185; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 185; goto st1089;}
+			{stack[top++] = 185; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 185; goto st1095;}
+			{stack[top++] = 185; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 185; goto st1103;}
+			{stack[top++] = 185; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -25049,76 +25058,76 @@ tr111:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 186; goto st616;}
+			{stack[top++] = 186; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 186; goto st618;}
+			{stack[top++] = 186; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 186; goto st620;}
+			{stack[top++] = 186; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 186; goto st652;}
+			{stack[top++] = 186; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 186; goto st657;}
+			{stack[top++] = 186; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 186; goto st662;}
+			{stack[top++] = 186; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 186; goto st667;}
+			{stack[top++] = 186; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 186; goto st671;}
+			{stack[top++] = 186; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 186; goto st673;}
+			{stack[top++] = 186; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 186; goto st728;}
+			{stack[top++] = 186; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 186; goto st739;}
+			{stack[top++] = 186; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 186; goto st756;}
+			{stack[top++] = 186; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 186; goto st767;}
+			{stack[top++] = 186; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 186; goto st778;}
+			{stack[top++] = 186; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 186; goto st791;}
+			{stack[top++] = 186; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 186; goto st801;}
+			{stack[top++] = 186; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 186; goto st840;}
+			{stack[top++] = 186; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 186; goto st994;}
+			{stack[top++] = 186; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 186; goto st997;}
+			{stack[top++] = 186; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 186; goto st1008;}
+			{stack[top++] = 186; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 186; goto st1010;}
+			{stack[top++] = 186; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 186; goto st1039;}
+			{stack[top++] = 186; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 186; goto st1052;}
+			{stack[top++] = 186; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 186; goto st1070;}
+			{stack[top++] = 186; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 186; goto st1065;}
+			{stack[top++] = 186; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 186; goto st1083;}
+			{stack[top++] = 186; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 186; goto st1089;}
+			{stack[top++] = 186; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 186; goto st1095;}
+			{stack[top++] = 186; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 186; goto st1103;}
+			{stack[top++] = 186; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -25165,76 +25174,76 @@ tr112:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 187; goto st616;}
+			{stack[top++] = 187; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 187; goto st618;}
+			{stack[top++] = 187; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 187; goto st620;}
+			{stack[top++] = 187; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 187; goto st652;}
+			{stack[top++] = 187; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 187; goto st657;}
+			{stack[top++] = 187; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 187; goto st662;}
+			{stack[top++] = 187; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 187; goto st667;}
+			{stack[top++] = 187; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 187; goto st671;}
+			{stack[top++] = 187; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 187; goto st673;}
+			{stack[top++] = 187; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 187; goto st728;}
+			{stack[top++] = 187; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 187; goto st739;}
+			{stack[top++] = 187; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 187; goto st756;}
+			{stack[top++] = 187; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 187; goto st767;}
+			{stack[top++] = 187; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 187; goto st778;}
+			{stack[top++] = 187; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 187; goto st791;}
+			{stack[top++] = 187; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 187; goto st801;}
+			{stack[top++] = 187; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 187; goto st840;}
+			{stack[top++] = 187; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 187; goto st994;}
+			{stack[top++] = 187; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 187; goto st997;}
+			{stack[top++] = 187; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 187; goto st1008;}
+			{stack[top++] = 187; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 187; goto st1010;}
+			{stack[top++] = 187; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 187; goto st1039;}
+			{stack[top++] = 187; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 187; goto st1052;}
+			{stack[top++] = 187; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 187; goto st1070;}
+			{stack[top++] = 187; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 187; goto st1065;}
+			{stack[top++] = 187; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 187; goto st1083;}
+			{stack[top++] = 187; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 187; goto st1089;}
+			{stack[top++] = 187; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 187; goto st1095;}
+			{stack[top++] = 187; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 187; goto st1103;}
+			{stack[top++] = 187; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -25285,76 +25294,76 @@ tr113:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 188; goto st616;}
+			{stack[top++] = 188; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 188; goto st618;}
+			{stack[top++] = 188; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 188; goto st620;}
+			{stack[top++] = 188; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 188; goto st652;}
+			{stack[top++] = 188; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 188; goto st657;}
+			{stack[top++] = 188; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 188; goto st662;}
+			{stack[top++] = 188; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 188; goto st667;}
+			{stack[top++] = 188; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 188; goto st671;}
+			{stack[top++] = 188; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 188; goto st673;}
+			{stack[top++] = 188; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 188; goto st728;}
+			{stack[top++] = 188; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 188; goto st739;}
+			{stack[top++] = 188; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 188; goto st756;}
+			{stack[top++] = 188; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 188; goto st767;}
+			{stack[top++] = 188; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 188; goto st778;}
+			{stack[top++] = 188; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 188; goto st791;}
+			{stack[top++] = 188; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 188; goto st801;}
+			{stack[top++] = 188; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 188; goto st840;}
+			{stack[top++] = 188; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 188; goto st994;}
+			{stack[top++] = 188; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 188; goto st997;}
+			{stack[top++] = 188; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 188; goto st1008;}
+			{stack[top++] = 188; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 188; goto st1010;}
+			{stack[top++] = 188; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 188; goto st1039;}
+			{stack[top++] = 188; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 188; goto st1052;}
+			{stack[top++] = 188; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 188; goto st1070;}
+			{stack[top++] = 188; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 188; goto st1065;}
+			{stack[top++] = 188; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 188; goto st1083;}
+			{stack[top++] = 188; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 188; goto st1089;}
+			{stack[top++] = 188; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 188; goto st1095;}
+			{stack[top++] = 188; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 188; goto st1103;}
+			{stack[top++] = 188; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -25407,76 +25416,76 @@ tr114:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 189; goto st616;}
+			{stack[top++] = 189; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 189; goto st618;}
+			{stack[top++] = 189; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 189; goto st620;}
+			{stack[top++] = 189; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 189; goto st652;}
+			{stack[top++] = 189; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 189; goto st657;}
+			{stack[top++] = 189; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 189; goto st662;}
+			{stack[top++] = 189; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 189; goto st667;}
+			{stack[top++] = 189; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 189; goto st671;}
+			{stack[top++] = 189; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 189; goto st673;}
+			{stack[top++] = 189; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 189; goto st728;}
+			{stack[top++] = 189; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 189; goto st739;}
+			{stack[top++] = 189; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 189; goto st756;}
+			{stack[top++] = 189; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 189; goto st767;}
+			{stack[top++] = 189; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 189; goto st778;}
+			{stack[top++] = 189; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 189; goto st791;}
+			{stack[top++] = 189; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 189; goto st801;}
+			{stack[top++] = 189; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 189; goto st840;}
+			{stack[top++] = 189; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 189; goto st994;}
+			{stack[top++] = 189; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 189; goto st997;}
+			{stack[top++] = 189; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 189; goto st1008;}
+			{stack[top++] = 189; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 189; goto st1010;}
+			{stack[top++] = 189; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 189; goto st1039;}
+			{stack[top++] = 189; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 189; goto st1052;}
+			{stack[top++] = 189; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 189; goto st1070;}
+			{stack[top++] = 189; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 189; goto st1065;}
+			{stack[top++] = 189; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 189; goto st1083;}
+			{stack[top++] = 189; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 189; goto st1089;}
+			{stack[top++] = 189; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 189; goto st1095;}
+			{stack[top++] = 189; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 189; goto st1103;}
+			{stack[top++] = 189; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -25527,76 +25536,76 @@ tr115:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 190; goto st616;}
+			{stack[top++] = 190; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 190; goto st618;}
+			{stack[top++] = 190; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 190; goto st620;}
+			{stack[top++] = 190; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 190; goto st652;}
+			{stack[top++] = 190; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 190; goto st657;}
+			{stack[top++] = 190; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 190; goto st662;}
+			{stack[top++] = 190; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 190; goto st667;}
+			{stack[top++] = 190; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 190; goto st671;}
+			{stack[top++] = 190; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 190; goto st673;}
+			{stack[top++] = 190; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 190; goto st728;}
+			{stack[top++] = 190; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 190; goto st739;}
+			{stack[top++] = 190; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 190; goto st756;}
+			{stack[top++] = 190; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 190; goto st767;}
+			{stack[top++] = 190; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 190; goto st778;}
+			{stack[top++] = 190; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 190; goto st791;}
+			{stack[top++] = 190; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 190; goto st801;}
+			{stack[top++] = 190; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 190; goto st840;}
+			{stack[top++] = 190; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 190; goto st994;}
+			{stack[top++] = 190; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 190; goto st997;}
+			{stack[top++] = 190; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 190; goto st1008;}
+			{stack[top++] = 190; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 190; goto st1010;}
+			{stack[top++] = 190; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 190; goto st1039;}
+			{stack[top++] = 190; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 190; goto st1052;}
+			{stack[top++] = 190; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 190; goto st1070;}
+			{stack[top++] = 190; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 190; goto st1065;}
+			{stack[top++] = 190; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 190; goto st1083;}
+			{stack[top++] = 190; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 190; goto st1089;}
+			{stack[top++] = 190; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 190; goto st1095;}
+			{stack[top++] = 190; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 190; goto st1103;}
+			{stack[top++] = 190; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -25641,7 +25650,7 @@ tr761:
 		rdata_tail = s->r_data;
 	}
 	goto st191;
-tr3388:
+tr3399:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -25685,7 +25694,7 @@ tr116:
 	{
 		s->line_counter++;
 	}
-	goto st1119;
+	goto st1128;
 tr728:
 	{
 		s->line_counter++;
@@ -25706,15 +25715,15 @@ tr728:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1119; goto _out;}
+					{p++; cs = 1128; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1119; goto _out;}
+			p--; {p++; cs = 1128; goto _out;}
 		}
 	}
-	goto st1119;
+	goto st1128;
 tr760:
 	{
 		s->r_owner_length = s->dname_tmp_length;
@@ -25742,16 +25751,16 @@ tr760:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1119; goto _out;}
+					{p++; cs = 1128; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1119; goto _out;}
+			p--; {p++; cs = 1128; goto _out;}
 		}
 	}
-	goto st1119;
-tr3325:
+	goto st1128;
+tr3336:
 	{
 		s->line_counter++;
 	}
@@ -25761,11 +25770,11 @@ tr3325:
 			p--; {goto st261;}
 		}
 	}
-	goto st1119;
-st1119:
+	goto st1128;
+st1128:
 	if ( ++p == pe )
-		goto _test_eof1119;
-case 1119:
+		goto _test_eof1128;
+case 1128:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -25783,53 +25792,53 @@ case 1119:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr3319;
-		case 32: goto tr3319;
-		case 36: goto tr3320;
-		case 40: goto tr3321;
-		case 41: goto tr3322;
-		case 42: goto tr3323;
+		case 9: goto tr3330;
+		case 32: goto tr3330;
+		case 36: goto tr3331;
+		case 40: goto tr3332;
+		case 41: goto tr3333;
+		case 42: goto tr3334;
 		case 58: goto tr69;
-		case 65: goto tr3392;
-		case 67: goto tr3393;
-		case 68: goto tr3394;
-		case 69: goto tr3395;
-		case 72: goto tr3396;
-		case 73: goto tr3397;
-		case 75: goto tr3398;
-		case 76: goto tr3399;
-		case 77: goto tr3400;
-		case 78: goto tr3401;
-		case 80: goto tr3402;
-		case 82: goto tr3403;
-		case 83: goto tr3404;
-		case 84: goto tr3405;
-		case 85: goto tr3406;
-		case 92: goto tr3324;
-		case 95: goto tr3323;
-		case 97: goto tr3392;
-		case 99: goto tr3393;
-		case 100: goto tr3394;
-		case 101: goto tr3395;
-		case 104: goto tr3396;
-		case 105: goto tr3397;
-		case 107: goto tr3398;
-		case 108: goto tr3399;
-		case 109: goto tr3400;
-		case 110: goto tr3401;
-		case 112: goto tr3402;
-		case 114: goto tr3403;
-		case 115: goto tr3404;
-		case 116: goto tr3405;
-		case 117: goto tr3406;
+		case 65: goto tr3403;
+		case 67: goto tr3404;
+		case 68: goto tr3405;
+		case 69: goto tr3406;
+		case 72: goto tr3407;
+		case 73: goto tr3408;
+		case 75: goto tr3409;
+		case 76: goto tr3410;
+		case 77: goto tr3411;
+		case 78: goto tr3412;
+		case 80: goto tr3413;
+		case 82: goto tr3414;
+		case 83: goto tr3415;
+		case 84: goto tr3416;
+		case 85: goto tr3417;
+		case 92: goto tr3335;
+		case 95: goto tr3334;
+		case 97: goto tr3403;
+		case 99: goto tr3404;
+		case 100: goto tr3405;
+		case 101: goto tr3406;
+		case 104: goto tr3407;
+		case 105: goto tr3408;
+		case 107: goto tr3409;
+		case 108: goto tr3410;
+		case 109: goto tr3411;
+		case 110: goto tr3412;
+		case 112: goto tr3413;
+		case 114: goto tr3414;
+		case 115: goto tr3415;
+		case 116: goto tr3416;
+		case 117: goto tr3417;
 		case 1802: goto tr20;
 		case 1851: goto st149;
-		case 2058: goto tr3325;
-		case 2107: goto tr3326;
+		case 2058: goto tr3336;
+		case 2107: goto tr3337;
 		case 2314: goto tr118;
 		case 2363: goto tr119;
-		case 2570: goto tr3327;
-		case 2619: goto tr3328;
+		case 2570: goto tr3338;
+		case 2619: goto tr3339;
 	}
 	if ( _widec < 60 ) {
 		if ( _widec < 11 ) {
@@ -25838,101 +25847,101 @@ case 1119:
 		} else if ( _widec > 44 ) {
 			if ( _widec > 47 ) {
 				if ( 48 <= _widec && _widec <= 57 )
-					goto tr3391;
+					goto tr3402;
 			} else if ( _widec >= 45 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else if ( _widec > 63 ) {
 		if ( _widec < 91 ) {
 			if ( 64 <= _widec && _widec <= 90 )
-				goto tr3323;
+				goto tr3334;
 		} else if ( _widec > 96 ) {
 			if ( _widec > 122 ) {
 				if ( 123 <= _widec )
 					goto tr69;
 			} else if ( _widec >= 98 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else
 		goto tr69;
-	goto tr3390;
-tr3320:
+	goto tr3401;
+tr3331:
 	{
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 192; goto st616;}
+			{stack[top++] = 192; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 192; goto st618;}
+			{stack[top++] = 192; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 192; goto st620;}
+			{stack[top++] = 192; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 192; goto st652;}
+			{stack[top++] = 192; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 192; goto st657;}
+			{stack[top++] = 192; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 192; goto st662;}
+			{stack[top++] = 192; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 192; goto st667;}
+			{stack[top++] = 192; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 192; goto st671;}
+			{stack[top++] = 192; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 192; goto st673;}
+			{stack[top++] = 192; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 192; goto st728;}
+			{stack[top++] = 192; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 192; goto st739;}
+			{stack[top++] = 192; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 192; goto st756;}
+			{stack[top++] = 192; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 192; goto st767;}
+			{stack[top++] = 192; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 192; goto st778;}
+			{stack[top++] = 192; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 192; goto st791;}
+			{stack[top++] = 192; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 192; goto st801;}
+			{stack[top++] = 192; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 192; goto st840;}
+			{stack[top++] = 192; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 192; goto st994;}
+			{stack[top++] = 192; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 192; goto st997;}
+			{stack[top++] = 192; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 192; goto st1008;}
+			{stack[top++] = 192; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 192; goto st1010;}
+			{stack[top++] = 192; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 192; goto st1039;}
+			{stack[top++] = 192; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 192; goto st1052;}
+			{stack[top++] = 192; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 192; goto st1070;}
+			{stack[top++] = 192; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 192; goto st1065;}
+			{stack[top++] = 192; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 192; goto st1083;}
+			{stack[top++] = 192; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 192; goto st1089;}
+			{stack[top++] = 192; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 192; goto st1095;}
+			{stack[top++] = 192; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 192; goto st1103;}
+			{stack[top++] = 192; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -26073,81 +26082,81 @@ case 201:
 	} else if ( (*p) >= 9 )
 		goto tr738;
 	goto tr639;
-tr3323:
+tr3334:
 	{
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 202; goto st616;}
+			{stack[top++] = 202; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 202; goto st618;}
+			{stack[top++] = 202; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 202; goto st620;}
+			{stack[top++] = 202; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 202; goto st652;}
+			{stack[top++] = 202; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 202; goto st657;}
+			{stack[top++] = 202; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 202; goto st662;}
+			{stack[top++] = 202; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 202; goto st667;}
+			{stack[top++] = 202; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 202; goto st671;}
+			{stack[top++] = 202; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 202; goto st673;}
+			{stack[top++] = 202; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 202; goto st728;}
+			{stack[top++] = 202; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 202; goto st739;}
+			{stack[top++] = 202; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 202; goto st756;}
+			{stack[top++] = 202; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 202; goto st767;}
+			{stack[top++] = 202; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 202; goto st778;}
+			{stack[top++] = 202; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 202; goto st791;}
+			{stack[top++] = 202; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 202; goto st801;}
+			{stack[top++] = 202; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 202; goto st840;}
+			{stack[top++] = 202; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 202; goto st994;}
+			{stack[top++] = 202; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 202; goto st997;}
+			{stack[top++] = 202; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 202; goto st1008;}
+			{stack[top++] = 202; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 202; goto st1010;}
+			{stack[top++] = 202; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 202; goto st1039;}
+			{stack[top++] = 202; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 202; goto st1052;}
+			{stack[top++] = 202; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 202; goto st1070;}
+			{stack[top++] = 202; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 202; goto st1065;}
+			{stack[top++] = 202; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 202; goto st1083;}
+			{stack[top++] = 202; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 202; goto st1089;}
+			{stack[top++] = 202; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 202; goto st1095;}
+			{stack[top++] = 202; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 202; goto st1103;}
+			{stack[top++] = 202; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -26186,7 +26195,7 @@ case 202:
 		case 1083: goto tr744;
 	}
 	goto tr739;
-tr3391:
+tr3402:
 	{
 		s->number64 = 0;
 	}
@@ -26208,76 +26217,76 @@ tr3391:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 203; goto st616;}
+			{stack[top++] = 203; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 203; goto st618;}
+			{stack[top++] = 203; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 203; goto st620;}
+			{stack[top++] = 203; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 203; goto st652;}
+			{stack[top++] = 203; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 203; goto st657;}
+			{stack[top++] = 203; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 203; goto st662;}
+			{stack[top++] = 203; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 203; goto st667;}
+			{stack[top++] = 203; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 203; goto st671;}
+			{stack[top++] = 203; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 203; goto st673;}
+			{stack[top++] = 203; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 203; goto st728;}
+			{stack[top++] = 203; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 203; goto st739;}
+			{stack[top++] = 203; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 203; goto st756;}
+			{stack[top++] = 203; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 203; goto st767;}
+			{stack[top++] = 203; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 203; goto st778;}
+			{stack[top++] = 203; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 203; goto st791;}
+			{stack[top++] = 203; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 203; goto st801;}
+			{stack[top++] = 203; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 203; goto st840;}
+			{stack[top++] = 203; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 203; goto st994;}
+			{stack[top++] = 203; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 203; goto st997;}
+			{stack[top++] = 203; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 203; goto st1008;}
+			{stack[top++] = 203; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 203; goto st1010;}
+			{stack[top++] = 203; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 203; goto st1039;}
+			{stack[top++] = 203; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 203; goto st1052;}
+			{stack[top++] = 203; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 203; goto st1070;}
+			{stack[top++] = 203; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 203; goto st1065;}
+			{stack[top++] = 203; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 203; goto st1083;}
+			{stack[top++] = 203; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 203; goto st1089;}
+			{stack[top++] = 203; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 203; goto st1095;}
+			{stack[top++] = 203; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 203; goto st1103;}
+			{stack[top++] = 203; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -26503,7 +26512,7 @@ case 205:
 	} else if ( _widec >= 640 )
 		goto st8;
 	goto tr128;
-tr3392:
+tr3403:
 	{
 		s->r_class = s->default_class;
 	}
@@ -26514,76 +26523,76 @@ tr3392:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 206; goto st616;}
+			{stack[top++] = 206; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 206; goto st618;}
+			{stack[top++] = 206; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 206; goto st620;}
+			{stack[top++] = 206; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 206; goto st652;}
+			{stack[top++] = 206; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 206; goto st657;}
+			{stack[top++] = 206; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 206; goto st662;}
+			{stack[top++] = 206; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 206; goto st667;}
+			{stack[top++] = 206; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 206; goto st671;}
+			{stack[top++] = 206; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 206; goto st673;}
+			{stack[top++] = 206; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 206; goto st728;}
+			{stack[top++] = 206; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 206; goto st739;}
+			{stack[top++] = 206; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 206; goto st756;}
+			{stack[top++] = 206; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 206; goto st767;}
+			{stack[top++] = 206; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 206; goto st778;}
+			{stack[top++] = 206; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 206; goto st791;}
+			{stack[top++] = 206; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 206; goto st801;}
+			{stack[top++] = 206; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 206; goto st840;}
+			{stack[top++] = 206; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 206; goto st994;}
+			{stack[top++] = 206; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 206; goto st997;}
+			{stack[top++] = 206; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 206; goto st1008;}
+			{stack[top++] = 206; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 206; goto st1010;}
+			{stack[top++] = 206; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 206; goto st1039;}
+			{stack[top++] = 206; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 206; goto st1052;}
+			{stack[top++] = 206; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 206; goto st1070;}
+			{stack[top++] = 206; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 206; goto st1065;}
+			{stack[top++] = 206; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 206; goto st1083;}
+			{stack[top++] = 206; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 206; goto st1089;}
+			{stack[top++] = 206; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 206; goto st1095;}
+			{stack[top++] = 206; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 206; goto st1103;}
+			{stack[top++] = 206; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -26781,82 +26790,82 @@ tr120:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1120; goto st616;}
+			{stack[top++] = 1129; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1120; goto st618;}
+			{stack[top++] = 1129; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1120; goto st620;}
+			{stack[top++] = 1129; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1120; goto st652;}
+			{stack[top++] = 1129; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1120; goto st657;}
+			{stack[top++] = 1129; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1120; goto st662;}
+			{stack[top++] = 1129; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1120; goto st667;}
+			{stack[top++] = 1129; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1120; goto st671;}
+			{stack[top++] = 1129; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1120; goto st673;}
+			{stack[top++] = 1129; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1120; goto st728;}
+			{stack[top++] = 1129; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1120; goto st739;}
+			{stack[top++] = 1129; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1120; goto st756;}
+			{stack[top++] = 1129; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1120; goto st767;}
+			{stack[top++] = 1129; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1120; goto st778;}
+			{stack[top++] = 1129; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1120; goto st791;}
+			{stack[top++] = 1129; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1120; goto st801;}
+			{stack[top++] = 1129; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1120; goto st840;}
+			{stack[top++] = 1129; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1120; goto st994;}
+			{stack[top++] = 1129; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1120; goto st997;}
+			{stack[top++] = 1129; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1120; goto st1008;}
+			{stack[top++] = 1129; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1120; goto st1010;}
+			{stack[top++] = 1129; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1120; goto st1039;}
+			{stack[top++] = 1129; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1120; goto st1052;}
+			{stack[top++] = 1129; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1120; goto st1070;}
+			{stack[top++] = 1129; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1120; goto st1065;}
+			{stack[top++] = 1129; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1120; goto st1083;}
+			{stack[top++] = 1129; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1120; goto st1089;}
+			{stack[top++] = 1129; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1120; goto st1095;}
+			{stack[top++] = 1129; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1120; goto st1103;}
+			{stack[top++] = 1129; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
 		}
 	}
-	goto st1120;
+	goto st1129;
 tr767:
 	{
 		s->line_counter++;
@@ -26865,76 +26874,76 @@ tr767:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1120; goto st616;}
+			{stack[top++] = 1129; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1120; goto st618;}
+			{stack[top++] = 1129; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1120; goto st620;}
+			{stack[top++] = 1129; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1120; goto st652;}
+			{stack[top++] = 1129; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1120; goto st657;}
+			{stack[top++] = 1129; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1120; goto st662;}
+			{stack[top++] = 1129; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1120; goto st667;}
+			{stack[top++] = 1129; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1120; goto st671;}
+			{stack[top++] = 1129; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1120; goto st673;}
+			{stack[top++] = 1129; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1120; goto st728;}
+			{stack[top++] = 1129; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1120; goto st739;}
+			{stack[top++] = 1129; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1120; goto st756;}
+			{stack[top++] = 1129; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1120; goto st767;}
+			{stack[top++] = 1129; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1120; goto st778;}
+			{stack[top++] = 1129; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1120; goto st791;}
+			{stack[top++] = 1129; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1120; goto st801;}
+			{stack[top++] = 1129; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1120; goto st840;}
+			{stack[top++] = 1129; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1120; goto st994;}
+			{stack[top++] = 1129; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1120; goto st997;}
+			{stack[top++] = 1129; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1120; goto st1008;}
+			{stack[top++] = 1129; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1120; goto st1010;}
+			{stack[top++] = 1129; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1120; goto st1039;}
+			{stack[top++] = 1129; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1120; goto st1052;}
+			{stack[top++] = 1129; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1120; goto st1070;}
+			{stack[top++] = 1129; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1120; goto st1065;}
+			{stack[top++] = 1129; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1120; goto st1083;}
+			{stack[top++] = 1129; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1120; goto st1089;}
+			{stack[top++] = 1129; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1120; goto st1095;}
+			{stack[top++] = 1129; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1120; goto st1103;}
+			{stack[top++] = 1129; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -26956,15 +26965,15 @@ tr767:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1120; goto _out;}
+					{p++; cs = 1129; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1120; goto _out;}
+			p--; {p++; cs = 1129; goto _out;}
 		}
 	}
-	goto st1120;
+	goto st1129;
 tr762:
 	{
 		s->r_owner_length = s->dname_tmp_length;
@@ -26980,76 +26989,76 @@ tr762:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1120; goto st616;}
+			{stack[top++] = 1129; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1120; goto st618;}
+			{stack[top++] = 1129; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1120; goto st620;}
+			{stack[top++] = 1129; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1120; goto st652;}
+			{stack[top++] = 1129; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1120; goto st657;}
+			{stack[top++] = 1129; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1120; goto st662;}
+			{stack[top++] = 1129; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1120; goto st667;}
+			{stack[top++] = 1129; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1120; goto st671;}
+			{stack[top++] = 1129; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1120; goto st673;}
+			{stack[top++] = 1129; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1120; goto st728;}
+			{stack[top++] = 1129; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1120; goto st739;}
+			{stack[top++] = 1129; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1120; goto st756;}
+			{stack[top++] = 1129; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1120; goto st767;}
+			{stack[top++] = 1129; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1120; goto st778;}
+			{stack[top++] = 1129; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1120; goto st791;}
+			{stack[top++] = 1129; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1120; goto st801;}
+			{stack[top++] = 1129; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1120; goto st840;}
+			{stack[top++] = 1129; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1120; goto st994;}
+			{stack[top++] = 1129; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1120; goto st997;}
+			{stack[top++] = 1129; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1120; goto st1008;}
+			{stack[top++] = 1129; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1120; goto st1010;}
+			{stack[top++] = 1129; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1120; goto st1039;}
+			{stack[top++] = 1129; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1120; goto st1052;}
+			{stack[top++] = 1129; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1120; goto st1070;}
+			{stack[top++] = 1129; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1120; goto st1065;}
+			{stack[top++] = 1129; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1120; goto st1083;}
+			{stack[top++] = 1129; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1120; goto st1089;}
+			{stack[top++] = 1129; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1120; goto st1095;}
+			{stack[top++] = 1129; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1120; goto st1103;}
+			{stack[top++] = 1129; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -27071,16 +27080,16 @@ tr762:
 
 				// Stop the scanner if required.
 				if (s->state == ZS_STATE_STOP) {
-					{p++; cs = 1120; goto _out;}
+					{p++; cs = 1129; goto _out;}
 				}
 			}
 		} else {
 			// Return if external processing.
-			p--; {p++; cs = 1120; goto _out;}
+			p--; {p++; cs = 1129; goto _out;}
 		}
 	}
-	goto st1120;
-tr3327:
+	goto st1129;
+tr3338:
 	{
 		s->line_counter++;
 	}
@@ -27088,76 +27097,76 @@ tr3327:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 1120; goto st616;}
+			{stack[top++] = 1129; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 1120; goto st618;}
+			{stack[top++] = 1129; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 1120; goto st620;}
+			{stack[top++] = 1129; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 1120; goto st652;}
+			{stack[top++] = 1129; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 1120; goto st657;}
+			{stack[top++] = 1129; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 1120; goto st662;}
+			{stack[top++] = 1129; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 1120; goto st667;}
+			{stack[top++] = 1129; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 1120; goto st671;}
+			{stack[top++] = 1129; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 1120; goto st673;}
+			{stack[top++] = 1129; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 1120; goto st728;}
+			{stack[top++] = 1129; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 1120; goto st739;}
+			{stack[top++] = 1129; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 1120; goto st756;}
+			{stack[top++] = 1129; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 1120; goto st767;}
+			{stack[top++] = 1129; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 1120; goto st778;}
+			{stack[top++] = 1129; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 1120; goto st791;}
+			{stack[top++] = 1129; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 1120; goto st801;}
+			{stack[top++] = 1129; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 1120; goto st840;}
+			{stack[top++] = 1129; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 1120; goto st994;}
+			{stack[top++] = 1129; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 1120; goto st997;}
+			{stack[top++] = 1129; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 1120; goto st1008;}
+			{stack[top++] = 1129; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 1120; goto st1010;}
+			{stack[top++] = 1129; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 1120; goto st1039;}
+			{stack[top++] = 1129; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 1120; goto st1052;}
+			{stack[top++] = 1129; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 1120; goto st1070;}
+			{stack[top++] = 1129; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 1120; goto st1065;}
+			{stack[top++] = 1129; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 1120; goto st1083;}
+			{stack[top++] = 1129; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 1120; goto st1089;}
+			{stack[top++] = 1129; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 1120; goto st1095;}
+			{stack[top++] = 1129; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 1120; goto st1103;}
+			{stack[top++] = 1129; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -27169,11 +27178,11 @@ tr3327:
 			p--; {goto st261;}
 		}
 	}
-	goto st1120;
-st1120:
+	goto st1129;
+st1129:
 	if ( ++p == pe )
-		goto _test_eof1120;
-case 1120:
+		goto _test_eof1129;
+case 1129:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -27191,53 +27200,53 @@ case 1120:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr3385;
-		case 32: goto tr3385;
-		case 36: goto tr3320;
-		case 40: goto tr3386;
-		case 41: goto tr3387;
-		case 42: goto tr3323;
+		case 9: goto tr3396;
+		case 32: goto tr3396;
+		case 36: goto tr3331;
+		case 40: goto tr3397;
+		case 41: goto tr3398;
+		case 42: goto tr3334;
 		case 58: goto tr69;
-		case 65: goto tr3392;
-		case 67: goto tr3393;
-		case 68: goto tr3394;
-		case 69: goto tr3395;
-		case 72: goto tr3396;
-		case 73: goto tr3397;
-		case 75: goto tr3398;
-		case 76: goto tr3399;
-		case 77: goto tr3400;
-		case 78: goto tr3401;
-		case 80: goto tr3402;
-		case 82: goto tr3403;
-		case 83: goto tr3404;
-		case 84: goto tr3405;
-		case 85: goto tr3406;
-		case 92: goto tr3324;
-		case 95: goto tr3323;
-		case 97: goto tr3392;
-		case 99: goto tr3393;
-		case 100: goto tr3394;
-		case 101: goto tr3395;
-		case 104: goto tr3396;
-		case 105: goto tr3397;
-		case 107: goto tr3398;
-		case 108: goto tr3399;
-		case 109: goto tr3400;
-		case 110: goto tr3401;
-		case 112: goto tr3402;
-		case 114: goto tr3403;
-		case 115: goto tr3404;
-		case 116: goto tr3405;
-		case 117: goto tr3406;
+		case 65: goto tr3403;
+		case 67: goto tr3404;
+		case 68: goto tr3405;
+		case 69: goto tr3406;
+		case 72: goto tr3407;
+		case 73: goto tr3408;
+		case 75: goto tr3409;
+		case 76: goto tr3410;
+		case 77: goto tr3411;
+		case 78: goto tr3412;
+		case 80: goto tr3413;
+		case 82: goto tr3414;
+		case 83: goto tr3415;
+		case 84: goto tr3416;
+		case 85: goto tr3417;
+		case 92: goto tr3335;
+		case 95: goto tr3334;
+		case 97: goto tr3403;
+		case 99: goto tr3404;
+		case 100: goto tr3405;
+		case 101: goto tr3406;
+		case 104: goto tr3407;
+		case 105: goto tr3408;
+		case 107: goto tr3409;
+		case 108: goto tr3410;
+		case 109: goto tr3411;
+		case 110: goto tr3412;
+		case 112: goto tr3413;
+		case 114: goto tr3414;
+		case 115: goto tr3415;
+		case 116: goto tr3416;
+		case 117: goto tr3417;
 		case 1802: goto tr83;
 		case 1851: goto st8;
-		case 2058: goto tr3407;
-		case 2107: goto tr3388;
+		case 2058: goto tr3418;
+		case 2107: goto tr3399;
 		case 2314: goto tr92;
 		case 2363: goto tr93;
-		case 2570: goto tr3407;
-		case 2619: goto tr3389;
+		case 2570: goto tr3418;
+		case 2619: goto tr3400;
 	}
 	if ( _widec < 60 ) {
 		if ( _widec < 11 ) {
@@ -27246,27 +27255,27 @@ case 1120:
 		} else if ( _widec > 44 ) {
 			if ( _widec > 47 ) {
 				if ( 48 <= _widec && _widec <= 57 )
-					goto tr3391;
+					goto tr3402;
 			} else if ( _widec >= 45 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else if ( _widec > 63 ) {
 		if ( _widec < 91 ) {
 			if ( 64 <= _widec && _widec <= 90 )
-				goto tr3323;
+				goto tr3334;
 		} else if ( _widec > 96 ) {
 			if ( _widec > 122 ) {
 				if ( 123 <= _widec )
 					goto tr69;
 			} else if ( _widec >= 98 )
-				goto tr3323;
+				goto tr3334;
 		} else
 			goto tr69;
 	} else
 		goto tr69;
-	goto tr3390;
-tr3393:
+	goto tr3401;
+tr3404:
 	{
 		s->r_class = s->default_class;
 	}
@@ -27277,76 +27286,76 @@ tr3393:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 208; goto st616;}
+			{stack[top++] = 208; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 208; goto st618;}
+			{stack[top++] = 208; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 208; goto st620;}
+			{stack[top++] = 208; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 208; goto st652;}
+			{stack[top++] = 208; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 208; goto st657;}
+			{stack[top++] = 208; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 208; goto st662;}
+			{stack[top++] = 208; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 208; goto st667;}
+			{stack[top++] = 208; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 208; goto st671;}
+			{stack[top++] = 208; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 208; goto st673;}
+			{stack[top++] = 208; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 208; goto st728;}
+			{stack[top++] = 208; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 208; goto st739;}
+			{stack[top++] = 208; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 208; goto st756;}
+			{stack[top++] = 208; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 208; goto st767;}
+			{stack[top++] = 208; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 208; goto st778;}
+			{stack[top++] = 208; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 208; goto st791;}
+			{stack[top++] = 208; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 208; goto st801;}
+			{stack[top++] = 208; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 208; goto st840;}
+			{stack[top++] = 208; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 208; goto st994;}
+			{stack[top++] = 208; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 208; goto st997;}
+			{stack[top++] = 208; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 208; goto st1008;}
+			{stack[top++] = 208; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 208; goto st1010;}
+			{stack[top++] = 208; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 208; goto st1039;}
+			{stack[top++] = 208; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 208; goto st1052;}
+			{stack[top++] = 208; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 208; goto st1070;}
+			{stack[top++] = 208; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 208; goto st1065;}
+			{stack[top++] = 208; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 208; goto st1083;}
+			{stack[top++] = 208; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 208; goto st1089;}
+			{stack[top++] = 208; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 208; goto st1095;}
+			{stack[top++] = 208; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 208; goto st1103;}
+			{stack[top++] = 208; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -27393,7 +27402,7 @@ case 208:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3394:
+tr3405:
 	{
 		s->r_class = s->default_class;
 	}
@@ -27404,76 +27413,76 @@ tr3394:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 209; goto st616;}
+			{stack[top++] = 209; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 209; goto st618;}
+			{stack[top++] = 209; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 209; goto st620;}
+			{stack[top++] = 209; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 209; goto st652;}
+			{stack[top++] = 209; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 209; goto st657;}
+			{stack[top++] = 209; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 209; goto st662;}
+			{stack[top++] = 209; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 209; goto st667;}
+			{stack[top++] = 209; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 209; goto st671;}
+			{stack[top++] = 209; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 209; goto st673;}
+			{stack[top++] = 209; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 209; goto st728;}
+			{stack[top++] = 209; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 209; goto st739;}
+			{stack[top++] = 209; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 209; goto st756;}
+			{stack[top++] = 209; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 209; goto st767;}
+			{stack[top++] = 209; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 209; goto st778;}
+			{stack[top++] = 209; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 209; goto st791;}
+			{stack[top++] = 209; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 209; goto st801;}
+			{stack[top++] = 209; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 209; goto st840;}
+			{stack[top++] = 209; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 209; goto st994;}
+			{stack[top++] = 209; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 209; goto st997;}
+			{stack[top++] = 209; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 209; goto st1008;}
+			{stack[top++] = 209; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 209; goto st1010;}
+			{stack[top++] = 209; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 209; goto st1039;}
+			{stack[top++] = 209; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 209; goto st1052;}
+			{stack[top++] = 209; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 209; goto st1070;}
+			{stack[top++] = 209; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 209; goto st1065;}
+			{stack[top++] = 209; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 209; goto st1083;}
+			{stack[top++] = 209; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 209; goto st1089;}
+			{stack[top++] = 209; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 209; goto st1095;}
+			{stack[top++] = 209; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 209; goto st1103;}
+			{stack[top++] = 209; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -27518,7 +27527,7 @@ case 209:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3395:
+tr3406:
 	{
 		s->r_class = s->default_class;
 	}
@@ -27529,76 +27538,76 @@ tr3395:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 210; goto st616;}
+			{stack[top++] = 210; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 210; goto st618;}
+			{stack[top++] = 210; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 210; goto st620;}
+			{stack[top++] = 210; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 210; goto st652;}
+			{stack[top++] = 210; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 210; goto st657;}
+			{stack[top++] = 210; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 210; goto st662;}
+			{stack[top++] = 210; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 210; goto st667;}
+			{stack[top++] = 210; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 210; goto st671;}
+			{stack[top++] = 210; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 210; goto st673;}
+			{stack[top++] = 210; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 210; goto st728;}
+			{stack[top++] = 210; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 210; goto st739;}
+			{stack[top++] = 210; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 210; goto st756;}
+			{stack[top++] = 210; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 210; goto st767;}
+			{stack[top++] = 210; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 210; goto st778;}
+			{stack[top++] = 210; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 210; goto st791;}
+			{stack[top++] = 210; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 210; goto st801;}
+			{stack[top++] = 210; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 210; goto st840;}
+			{stack[top++] = 210; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 210; goto st994;}
+			{stack[top++] = 210; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 210; goto st997;}
+			{stack[top++] = 210; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 210; goto st1008;}
+			{stack[top++] = 210; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 210; goto st1010;}
+			{stack[top++] = 210; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 210; goto st1039;}
+			{stack[top++] = 210; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 210; goto st1052;}
+			{stack[top++] = 210; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 210; goto st1070;}
+			{stack[top++] = 210; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 210; goto st1065;}
+			{stack[top++] = 210; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 210; goto st1083;}
+			{stack[top++] = 210; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 210; goto st1089;}
+			{stack[top++] = 210; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 210; goto st1095;}
+			{stack[top++] = 210; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 210; goto st1103;}
+			{stack[top++] = 210; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -27639,7 +27648,7 @@ case 210:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3396:
+tr3407:
 	{
 		s->r_class = s->default_class;
 	}
@@ -27650,76 +27659,76 @@ tr3396:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 211; goto st616;}
+			{stack[top++] = 211; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 211; goto st618;}
+			{stack[top++] = 211; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 211; goto st620;}
+			{stack[top++] = 211; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 211; goto st652;}
+			{stack[top++] = 211; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 211; goto st657;}
+			{stack[top++] = 211; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 211; goto st662;}
+			{stack[top++] = 211; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 211; goto st667;}
+			{stack[top++] = 211; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 211; goto st671;}
+			{stack[top++] = 211; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 211; goto st673;}
+			{stack[top++] = 211; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 211; goto st728;}
+			{stack[top++] = 211; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 211; goto st739;}
+			{stack[top++] = 211; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 211; goto st756;}
+			{stack[top++] = 211; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 211; goto st767;}
+			{stack[top++] = 211; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 211; goto st778;}
+			{stack[top++] = 211; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 211; goto st791;}
+			{stack[top++] = 211; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 211; goto st801;}
+			{stack[top++] = 211; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 211; goto st840;}
+			{stack[top++] = 211; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 211; goto st994;}
+			{stack[top++] = 211; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 211; goto st997;}
+			{stack[top++] = 211; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 211; goto st1008;}
+			{stack[top++] = 211; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 211; goto st1010;}
+			{stack[top++] = 211; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 211; goto st1039;}
+			{stack[top++] = 211; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 211; goto st1052;}
+			{stack[top++] = 211; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 211; goto st1070;}
+			{stack[top++] = 211; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 211; goto st1065;}
+			{stack[top++] = 211; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 211; goto st1083;}
+			{stack[top++] = 211; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 211; goto st1089;}
+			{stack[top++] = 211; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 211; goto st1095;}
+			{stack[top++] = 211; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 211; goto st1103;}
+			{stack[top++] = 211; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -27760,7 +27769,7 @@ case 211:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3397:
+tr3408:
 	{
 		s->r_class = s->default_class;
 	}
@@ -27771,76 +27780,76 @@ tr3397:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 212; goto st616;}
+			{stack[top++] = 212; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 212; goto st618;}
+			{stack[top++] = 212; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 212; goto st620;}
+			{stack[top++] = 212; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 212; goto st652;}
+			{stack[top++] = 212; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 212; goto st657;}
+			{stack[top++] = 212; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 212; goto st662;}
+			{stack[top++] = 212; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 212; goto st667;}
+			{stack[top++] = 212; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 212; goto st671;}
+			{stack[top++] = 212; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 212; goto st673;}
+			{stack[top++] = 212; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 212; goto st728;}
+			{stack[top++] = 212; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 212; goto st739;}
+			{stack[top++] = 212; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 212; goto st756;}
+			{stack[top++] = 212; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 212; goto st767;}
+			{stack[top++] = 212; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 212; goto st778;}
+			{stack[top++] = 212; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 212; goto st791;}
+			{stack[top++] = 212; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 212; goto st801;}
+			{stack[top++] = 212; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 212; goto st840;}
+			{stack[top++] = 212; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 212; goto st994;}
+			{stack[top++] = 212; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 212; goto st997;}
+			{stack[top++] = 212; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 212; goto st1008;}
+			{stack[top++] = 212; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 212; goto st1010;}
+			{stack[top++] = 212; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 212; goto st1039;}
+			{stack[top++] = 212; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 212; goto st1052;}
+			{stack[top++] = 212; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 212; goto st1070;}
+			{stack[top++] = 212; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 212; goto st1065;}
+			{stack[top++] = 212; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 212; goto st1083;}
+			{stack[top++] = 212; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 212; goto st1089;}
+			{stack[top++] = 212; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 212; goto st1095;}
+			{stack[top++] = 212; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 212; goto st1103;}
+			{stack[top++] = 212; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -27883,7 +27892,7 @@ case 212:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3398:
+tr3409:
 	{
 		s->r_class = s->default_class;
 	}
@@ -27894,76 +27903,76 @@ tr3398:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 213; goto st616;}
+			{stack[top++] = 213; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 213; goto st618;}
+			{stack[top++] = 213; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 213; goto st620;}
+			{stack[top++] = 213; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 213; goto st652;}
+			{stack[top++] = 213; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 213; goto st657;}
+			{stack[top++] = 213; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 213; goto st662;}
+			{stack[top++] = 213; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 213; goto st667;}
+			{stack[top++] = 213; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 213; goto st671;}
+			{stack[top++] = 213; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 213; goto st673;}
+			{stack[top++] = 213; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 213; goto st728;}
+			{stack[top++] = 213; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 213; goto st739;}
+			{stack[top++] = 213; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 213; goto st756;}
+			{stack[top++] = 213; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 213; goto st767;}
+			{stack[top++] = 213; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 213; goto st778;}
+			{stack[top++] = 213; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 213; goto st791;}
+			{stack[top++] = 213; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 213; goto st801;}
+			{stack[top++] = 213; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 213; goto st840;}
+			{stack[top++] = 213; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 213; goto st994;}
+			{stack[top++] = 213; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 213; goto st997;}
+			{stack[top++] = 213; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 213; goto st1008;}
+			{stack[top++] = 213; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 213; goto st1010;}
+			{stack[top++] = 213; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 213; goto st1039;}
+			{stack[top++] = 213; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 213; goto st1052;}
+			{stack[top++] = 213; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 213; goto st1070;}
+			{stack[top++] = 213; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 213; goto st1065;}
+			{stack[top++] = 213; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 213; goto st1083;}
+			{stack[top++] = 213; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 213; goto st1089;}
+			{stack[top++] = 213; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 213; goto st1095;}
+			{stack[top++] = 213; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 213; goto st1103;}
+			{stack[top++] = 213; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28006,7 +28015,7 @@ case 213:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3399:
+tr3410:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28017,76 +28026,76 @@ tr3399:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 214; goto st616;}
+			{stack[top++] = 214; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 214; goto st618;}
+			{stack[top++] = 214; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 214; goto st620;}
+			{stack[top++] = 214; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 214; goto st652;}
+			{stack[top++] = 214; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 214; goto st657;}
+			{stack[top++] = 214; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 214; goto st662;}
+			{stack[top++] = 214; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 214; goto st667;}
+			{stack[top++] = 214; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 214; goto st671;}
+			{stack[top++] = 214; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 214; goto st673;}
+			{stack[top++] = 214; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 214; goto st728;}
+			{stack[top++] = 214; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 214; goto st739;}
+			{stack[top++] = 214; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 214; goto st756;}
+			{stack[top++] = 214; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 214; goto st767;}
+			{stack[top++] = 214; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 214; goto st778;}
+			{stack[top++] = 214; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 214; goto st791;}
+			{stack[top++] = 214; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 214; goto st801;}
+			{stack[top++] = 214; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 214; goto st840;}
+			{stack[top++] = 214; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 214; goto st994;}
+			{stack[top++] = 214; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 214; goto st997;}
+			{stack[top++] = 214; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 214; goto st1008;}
+			{stack[top++] = 214; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 214; goto st1010;}
+			{stack[top++] = 214; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 214; goto st1039;}
+			{stack[top++] = 214; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 214; goto st1052;}
+			{stack[top++] = 214; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 214; goto st1070;}
+			{stack[top++] = 214; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 214; goto st1065;}
+			{stack[top++] = 214; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 214; goto st1083;}
+			{stack[top++] = 214; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 214; goto st1089;}
+			{stack[top++] = 214; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 214; goto st1095;}
+			{stack[top++] = 214; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 214; goto st1103;}
+			{stack[top++] = 214; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28131,7 +28140,7 @@ case 214:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3400:
+tr3411:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28142,76 +28151,76 @@ tr3400:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 215; goto st616;}
+			{stack[top++] = 215; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 215; goto st618;}
+			{stack[top++] = 215; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 215; goto st620;}
+			{stack[top++] = 215; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 215; goto st652;}
+			{stack[top++] = 215; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 215; goto st657;}
+			{stack[top++] = 215; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 215; goto st662;}
+			{stack[top++] = 215; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 215; goto st667;}
+			{stack[top++] = 215; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 215; goto st671;}
+			{stack[top++] = 215; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 215; goto st673;}
+			{stack[top++] = 215; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 215; goto st728;}
+			{stack[top++] = 215; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 215; goto st739;}
+			{stack[top++] = 215; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 215; goto st756;}
+			{stack[top++] = 215; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 215; goto st767;}
+			{stack[top++] = 215; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 215; goto st778;}
+			{stack[top++] = 215; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 215; goto st791;}
+			{stack[top++] = 215; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 215; goto st801;}
+			{stack[top++] = 215; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 215; goto st840;}
+			{stack[top++] = 215; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 215; goto st994;}
+			{stack[top++] = 215; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 215; goto st997;}
+			{stack[top++] = 215; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 215; goto st1008;}
+			{stack[top++] = 215; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 215; goto st1010;}
+			{stack[top++] = 215; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 215; goto st1039;}
+			{stack[top++] = 215; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 215; goto st1052;}
+			{stack[top++] = 215; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 215; goto st1070;}
+			{stack[top++] = 215; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 215; goto st1065;}
+			{stack[top++] = 215; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 215; goto st1083;}
+			{stack[top++] = 215; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 215; goto st1089;}
+			{stack[top++] = 215; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 215; goto st1095;}
+			{stack[top++] = 215; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 215; goto st1103;}
+			{stack[top++] = 215; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28254,7 +28263,7 @@ case 215:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3401:
+tr3412:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28265,76 +28274,76 @@ tr3401:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 216; goto st616;}
+			{stack[top++] = 216; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 216; goto st618;}
+			{stack[top++] = 216; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 216; goto st620;}
+			{stack[top++] = 216; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 216; goto st652;}
+			{stack[top++] = 216; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 216; goto st657;}
+			{stack[top++] = 216; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 216; goto st662;}
+			{stack[top++] = 216; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 216; goto st667;}
+			{stack[top++] = 216; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 216; goto st671;}
+			{stack[top++] = 216; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 216; goto st673;}
+			{stack[top++] = 216; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 216; goto st728;}
+			{stack[top++] = 216; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 216; goto st739;}
+			{stack[top++] = 216; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 216; goto st756;}
+			{stack[top++] = 216; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 216; goto st767;}
+			{stack[top++] = 216; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 216; goto st778;}
+			{stack[top++] = 216; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 216; goto st791;}
+			{stack[top++] = 216; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 216; goto st801;}
+			{stack[top++] = 216; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 216; goto st840;}
+			{stack[top++] = 216; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 216; goto st994;}
+			{stack[top++] = 216; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 216; goto st997;}
+			{stack[top++] = 216; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 216; goto st1008;}
+			{stack[top++] = 216; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 216; goto st1010;}
+			{stack[top++] = 216; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 216; goto st1039;}
+			{stack[top++] = 216; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 216; goto st1052;}
+			{stack[top++] = 216; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 216; goto st1070;}
+			{stack[top++] = 216; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 216; goto st1065;}
+			{stack[top++] = 216; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 216; goto st1083;}
+			{stack[top++] = 216; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 216; goto st1089;}
+			{stack[top++] = 216; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 216; goto st1095;}
+			{stack[top++] = 216; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 216; goto st1103;}
+			{stack[top++] = 216; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28379,7 +28388,7 @@ case 216:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3402:
+tr3413:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28390,76 +28399,76 @@ tr3402:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 217; goto st616;}
+			{stack[top++] = 217; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 217; goto st618;}
+			{stack[top++] = 217; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 217; goto st620;}
+			{stack[top++] = 217; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 217; goto st652;}
+			{stack[top++] = 217; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 217; goto st657;}
+			{stack[top++] = 217; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 217; goto st662;}
+			{stack[top++] = 217; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 217; goto st667;}
+			{stack[top++] = 217; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 217; goto st671;}
+			{stack[top++] = 217; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 217; goto st673;}
+			{stack[top++] = 217; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 217; goto st728;}
+			{stack[top++] = 217; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 217; goto st739;}
+			{stack[top++] = 217; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 217; goto st756;}
+			{stack[top++] = 217; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 217; goto st767;}
+			{stack[top++] = 217; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 217; goto st778;}
+			{stack[top++] = 217; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 217; goto st791;}
+			{stack[top++] = 217; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 217; goto st801;}
+			{stack[top++] = 217; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 217; goto st840;}
+			{stack[top++] = 217; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 217; goto st994;}
+			{stack[top++] = 217; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 217; goto st997;}
+			{stack[top++] = 217; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 217; goto st1008;}
+			{stack[top++] = 217; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 217; goto st1010;}
+			{stack[top++] = 217; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 217; goto st1039;}
+			{stack[top++] = 217; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 217; goto st1052;}
+			{stack[top++] = 217; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 217; goto st1070;}
+			{stack[top++] = 217; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 217; goto st1065;}
+			{stack[top++] = 217; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 217; goto st1083;}
+			{stack[top++] = 217; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 217; goto st1089;}
+			{stack[top++] = 217; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 217; goto st1095;}
+			{stack[top++] = 217; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 217; goto st1103;}
+			{stack[top++] = 217; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28500,7 +28509,7 @@ case 217:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3403:
+tr3414:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28511,76 +28520,76 @@ tr3403:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 218; goto st616;}
+			{stack[top++] = 218; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 218; goto st618;}
+			{stack[top++] = 218; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 218; goto st620;}
+			{stack[top++] = 218; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 218; goto st652;}
+			{stack[top++] = 218; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 218; goto st657;}
+			{stack[top++] = 218; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 218; goto st662;}
+			{stack[top++] = 218; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 218; goto st667;}
+			{stack[top++] = 218; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 218; goto st671;}
+			{stack[top++] = 218; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 218; goto st673;}
+			{stack[top++] = 218; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 218; goto st728;}
+			{stack[top++] = 218; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 218; goto st739;}
+			{stack[top++] = 218; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 218; goto st756;}
+			{stack[top++] = 218; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 218; goto st767;}
+			{stack[top++] = 218; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 218; goto st778;}
+			{stack[top++] = 218; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 218; goto st791;}
+			{stack[top++] = 218; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 218; goto st801;}
+			{stack[top++] = 218; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 218; goto st840;}
+			{stack[top++] = 218; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 218; goto st994;}
+			{stack[top++] = 218; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 218; goto st997;}
+			{stack[top++] = 218; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 218; goto st1008;}
+			{stack[top++] = 218; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 218; goto st1010;}
+			{stack[top++] = 218; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 218; goto st1039;}
+			{stack[top++] = 218; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 218; goto st1052;}
+			{stack[top++] = 218; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 218; goto st1070;}
+			{stack[top++] = 218; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 218; goto st1065;}
+			{stack[top++] = 218; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 218; goto st1083;}
+			{stack[top++] = 218; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 218; goto st1089;}
+			{stack[top++] = 218; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 218; goto st1095;}
+			{stack[top++] = 218; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 218; goto st1103;}
+			{stack[top++] = 218; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28625,7 +28634,7 @@ case 218:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3404:
+tr3415:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28636,76 +28645,76 @@ tr3404:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 219; goto st616;}
+			{stack[top++] = 219; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 219; goto st618;}
+			{stack[top++] = 219; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 219; goto st620;}
+			{stack[top++] = 219; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 219; goto st652;}
+			{stack[top++] = 219; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 219; goto st657;}
+			{stack[top++] = 219; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 219; goto st662;}
+			{stack[top++] = 219; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 219; goto st667;}
+			{stack[top++] = 219; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 219; goto st671;}
+			{stack[top++] = 219; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 219; goto st673;}
+			{stack[top++] = 219; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 219; goto st728;}
+			{stack[top++] = 219; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 219; goto st739;}
+			{stack[top++] = 219; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 219; goto st756;}
+			{stack[top++] = 219; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 219; goto st767;}
+			{stack[top++] = 219; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 219; goto st778;}
+			{stack[top++] = 219; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 219; goto st791;}
+			{stack[top++] = 219; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 219; goto st801;}
+			{stack[top++] = 219; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 219; goto st840;}
+			{stack[top++] = 219; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 219; goto st994;}
+			{stack[top++] = 219; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 219; goto st997;}
+			{stack[top++] = 219; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 219; goto st1008;}
+			{stack[top++] = 219; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 219; goto st1010;}
+			{stack[top++] = 219; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 219; goto st1039;}
+			{stack[top++] = 219; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 219; goto st1052;}
+			{stack[top++] = 219; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 219; goto st1070;}
+			{stack[top++] = 219; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 219; goto st1065;}
+			{stack[top++] = 219; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 219; goto st1083;}
+			{stack[top++] = 219; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 219; goto st1089;}
+			{stack[top++] = 219; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 219; goto st1095;}
+			{stack[top++] = 219; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 219; goto st1103;}
+			{stack[top++] = 219; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28752,7 +28761,7 @@ case 219:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3405:
+tr3416:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28763,76 +28772,76 @@ tr3405:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 220; goto st616;}
+			{stack[top++] = 220; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 220; goto st618;}
+			{stack[top++] = 220; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 220; goto st620;}
+			{stack[top++] = 220; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 220; goto st652;}
+			{stack[top++] = 220; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 220; goto st657;}
+			{stack[top++] = 220; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 220; goto st662;}
+			{stack[top++] = 220; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 220; goto st667;}
+			{stack[top++] = 220; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 220; goto st671;}
+			{stack[top++] = 220; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 220; goto st673;}
+			{stack[top++] = 220; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 220; goto st728;}
+			{stack[top++] = 220; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 220; goto st739;}
+			{stack[top++] = 220; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 220; goto st756;}
+			{stack[top++] = 220; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 220; goto st767;}
+			{stack[top++] = 220; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 220; goto st778;}
+			{stack[top++] = 220; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 220; goto st791;}
+			{stack[top++] = 220; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 220; goto st801;}
+			{stack[top++] = 220; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 220; goto st840;}
+			{stack[top++] = 220; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 220; goto st994;}
+			{stack[top++] = 220; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 220; goto st997;}
+			{stack[top++] = 220; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 220; goto st1008;}
+			{stack[top++] = 220; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 220; goto st1010;}
+			{stack[top++] = 220; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 220; goto st1039;}
+			{stack[top++] = 220; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 220; goto st1052;}
+			{stack[top++] = 220; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 220; goto st1070;}
+			{stack[top++] = 220; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 220; goto st1065;}
+			{stack[top++] = 220; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 220; goto st1083;}
+			{stack[top++] = 220; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 220; goto st1089;}
+			{stack[top++] = 220; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 220; goto st1095;}
+			{stack[top++] = 220; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 220; goto st1103;}
+			{stack[top++] = 220; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28877,7 +28886,7 @@ case 220:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3406:
+tr3417:
 	{
 		s->r_class = s->default_class;
 	}
@@ -28888,76 +28897,76 @@ tr3406:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 221; goto st616;}
+			{stack[top++] = 221; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 221; goto st618;}
+			{stack[top++] = 221; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 221; goto st620;}
+			{stack[top++] = 221; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 221; goto st652;}
+			{stack[top++] = 221; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 221; goto st657;}
+			{stack[top++] = 221; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 221; goto st662;}
+			{stack[top++] = 221; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 221; goto st667;}
+			{stack[top++] = 221; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 221; goto st671;}
+			{stack[top++] = 221; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 221; goto st673;}
+			{stack[top++] = 221; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 221; goto st728;}
+			{stack[top++] = 221; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 221; goto st739;}
+			{stack[top++] = 221; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 221; goto st756;}
+			{stack[top++] = 221; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 221; goto st767;}
+			{stack[top++] = 221; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 221; goto st778;}
+			{stack[top++] = 221; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 221; goto st791;}
+			{stack[top++] = 221; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 221; goto st801;}
+			{stack[top++] = 221; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 221; goto st840;}
+			{stack[top++] = 221; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 221; goto st994;}
+			{stack[top++] = 221; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 221; goto st997;}
+			{stack[top++] = 221; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 221; goto st1008;}
+			{stack[top++] = 221; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 221; goto st1010;}
+			{stack[top++] = 221; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 221; goto st1039;}
+			{stack[top++] = 221; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 221; goto st1052;}
+			{stack[top++] = 221; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 221; goto st1070;}
+			{stack[top++] = 221; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 221; goto st1065;}
+			{stack[top++] = 221; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 221; goto st1083;}
+			{stack[top++] = 221; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 221; goto st1089;}
+			{stack[top++] = 221; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 221; goto st1095;}
+			{stack[top++] = 221; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 221; goto st1103;}
+			{stack[top++] = 221; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -28998,7 +29007,7 @@ case 221:
 		case 1083: goto tr744;
 	}
 	goto tr756;
-tr3324:
+tr3335:
 	{
 		s->dname = s->r_owner;
 		s->r_owner_length = 0;
@@ -29050,76 +29059,76 @@ tr768:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 223; goto st616;}
+			{stack[top++] = 223; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 223; goto st618;}
+			{stack[top++] = 223; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 223; goto st620;}
+			{stack[top++] = 223; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 223; goto st652;}
+			{stack[top++] = 223; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 223; goto st657;}
+			{stack[top++] = 223; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 223; goto st662;}
+			{stack[top++] = 223; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 223; goto st667;}
+			{stack[top++] = 223; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 223; goto st671;}
+			{stack[top++] = 223; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 223; goto st673;}
+			{stack[top++] = 223; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 223; goto st728;}
+			{stack[top++] = 223; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 223; goto st739;}
+			{stack[top++] = 223; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 223; goto st756;}
+			{stack[top++] = 223; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 223; goto st767;}
+			{stack[top++] = 223; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 223; goto st778;}
+			{stack[top++] = 223; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 223; goto st791;}
+			{stack[top++] = 223; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 223; goto st801;}
+			{stack[top++] = 223; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 223; goto st840;}
+			{stack[top++] = 223; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 223; goto st994;}
+			{stack[top++] = 223; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 223; goto st997;}
+			{stack[top++] = 223; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 223; goto st1008;}
+			{stack[top++] = 223; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 223; goto st1010;}
+			{stack[top++] = 223; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 223; goto st1039;}
+			{stack[top++] = 223; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 223; goto st1052;}
+			{stack[top++] = 223; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 223; goto st1070;}
+			{stack[top++] = 223; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 223; goto st1065;}
+			{stack[top++] = 223; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 223; goto st1083;}
+			{stack[top++] = 223; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 223; goto st1089;}
+			{stack[top++] = 223; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 223; goto st1095;}
+			{stack[top++] = 223; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 223; goto st1103;}
+			{stack[top++] = 223; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -29142,76 +29151,76 @@ tr770:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 223; goto st616;}
+			{stack[top++] = 223; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 223; goto st618;}
+			{stack[top++] = 223; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 223; goto st620;}
+			{stack[top++] = 223; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 223; goto st652;}
+			{stack[top++] = 223; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 223; goto st657;}
+			{stack[top++] = 223; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 223; goto st662;}
+			{stack[top++] = 223; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 223; goto st667;}
+			{stack[top++] = 223; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 223; goto st671;}
+			{stack[top++] = 223; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 223; goto st673;}
+			{stack[top++] = 223; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 223; goto st728;}
+			{stack[top++] = 223; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 223; goto st739;}
+			{stack[top++] = 223; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 223; goto st756;}
+			{stack[top++] = 223; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 223; goto st767;}
+			{stack[top++] = 223; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 223; goto st778;}
+			{stack[top++] = 223; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 223; goto st791;}
+			{stack[top++] = 223; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 223; goto st801;}
+			{stack[top++] = 223; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 223; goto st840;}
+			{stack[top++] = 223; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 223; goto st994;}
+			{stack[top++] = 223; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 223; goto st997;}
+			{stack[top++] = 223; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 223; goto st1008;}
+			{stack[top++] = 223; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 223; goto st1010;}
+			{stack[top++] = 223; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 223; goto st1039;}
+			{stack[top++] = 223; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 223; goto st1052;}
+			{stack[top++] = 223; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 223; goto st1070;}
+			{stack[top++] = 223; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 223; goto st1065;}
+			{stack[top++] = 223; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 223; goto st1083;}
+			{stack[top++] = 223; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 223; goto st1089;}
+			{stack[top++] = 223; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 223; goto st1095;}
+			{stack[top++] = 223; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 223; goto st1103;}
+			{stack[top++] = 223; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -29234,76 +29243,76 @@ tr771:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 223; goto st616;}
+			{stack[top++] = 223; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 223; goto st618;}
+			{stack[top++] = 223; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 223; goto st620;}
+			{stack[top++] = 223; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 223; goto st652;}
+			{stack[top++] = 223; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 223; goto st657;}
+			{stack[top++] = 223; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 223; goto st662;}
+			{stack[top++] = 223; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 223; goto st667;}
+			{stack[top++] = 223; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 223; goto st671;}
+			{stack[top++] = 223; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 223; goto st673;}
+			{stack[top++] = 223; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 223; goto st728;}
+			{stack[top++] = 223; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 223; goto st739;}
+			{stack[top++] = 223; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 223; goto st756;}
+			{stack[top++] = 223; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 223; goto st767;}
+			{stack[top++] = 223; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 223; goto st778;}
+			{stack[top++] = 223; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 223; goto st791;}
+			{stack[top++] = 223; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 223; goto st801;}
+			{stack[top++] = 223; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 223; goto st840;}
+			{stack[top++] = 223; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 223; goto st994;}
+			{stack[top++] = 223; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 223; goto st997;}
+			{stack[top++] = 223; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 223; goto st1008;}
+			{stack[top++] = 223; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 223; goto st1010;}
+			{stack[top++] = 223; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 223; goto st1039;}
+			{stack[top++] = 223; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 223; goto st1052;}
+			{stack[top++] = 223; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 223; goto st1070;}
+			{stack[top++] = 223; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 223; goto st1065;}
+			{stack[top++] = 223; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 223; goto st1083;}
+			{stack[top++] = 223; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 223; goto st1089;}
+			{stack[top++] = 223; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 223; goto st1095;}
+			{stack[top++] = 223; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 223; goto st1103;}
+			{stack[top++] = 223; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -29322,76 +29331,76 @@ tr772:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 223; goto st616;}
+			{stack[top++] = 223; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 223; goto st618;}
+			{stack[top++] = 223; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 223; goto st620;}
+			{stack[top++] = 223; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 223; goto st652;}
+			{stack[top++] = 223; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 223; goto st657;}
+			{stack[top++] = 223; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 223; goto st662;}
+			{stack[top++] = 223; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 223; goto st667;}
+			{stack[top++] = 223; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 223; goto st671;}
+			{stack[top++] = 223; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 223; goto st673;}
+			{stack[top++] = 223; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 223; goto st728;}
+			{stack[top++] = 223; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 223; goto st739;}
+			{stack[top++] = 223; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 223; goto st756;}
+			{stack[top++] = 223; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 223; goto st767;}
+			{stack[top++] = 223; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 223; goto st778;}
+			{stack[top++] = 223; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 223; goto st791;}
+			{stack[top++] = 223; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 223; goto st801;}
+			{stack[top++] = 223; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 223; goto st840;}
+			{stack[top++] = 223; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 223; goto st994;}
+			{stack[top++] = 223; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 223; goto st997;}
+			{stack[top++] = 223; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 223; goto st1008;}
+			{stack[top++] = 223; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 223; goto st1010;}
+			{stack[top++] = 223; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 223; goto st1039;}
+			{stack[top++] = 223; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 223; goto st1052;}
+			{stack[top++] = 223; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 223; goto st1070;}
+			{stack[top++] = 223; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 223; goto st1065;}
+			{stack[top++] = 223; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 223; goto st1083;}
+			{stack[top++] = 223; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 223; goto st1089;}
+			{stack[top++] = 223; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 223; goto st1095;}
+			{stack[top++] = 223; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 223; goto st1103;}
+			{stack[top++] = 223; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -29466,76 +29475,76 @@ tr773:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 224; goto st616;}
+			{stack[top++] = 224; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 224; goto st618;}
+			{stack[top++] = 224; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 224; goto st620;}
+			{stack[top++] = 224; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 224; goto st652;}
+			{stack[top++] = 224; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 224; goto st657;}
+			{stack[top++] = 224; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 224; goto st662;}
+			{stack[top++] = 224; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 224; goto st667;}
+			{stack[top++] = 224; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 224; goto st671;}
+			{stack[top++] = 224; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 224; goto st673;}
+			{stack[top++] = 224; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 224; goto st728;}
+			{stack[top++] = 224; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 224; goto st739;}
+			{stack[top++] = 224; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 224; goto st756;}
+			{stack[top++] = 224; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 224; goto st767;}
+			{stack[top++] = 224; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 224; goto st778;}
+			{stack[top++] = 224; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 224; goto st791;}
+			{stack[top++] = 224; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 224; goto st801;}
+			{stack[top++] = 224; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 224; goto st840;}
+			{stack[top++] = 224; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 224; goto st994;}
+			{stack[top++] = 224; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 224; goto st997;}
+			{stack[top++] = 224; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 224; goto st1008;}
+			{stack[top++] = 224; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 224; goto st1010;}
+			{stack[top++] = 224; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 224; goto st1039;}
+			{stack[top++] = 224; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 224; goto st1052;}
+			{stack[top++] = 224; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 224; goto st1070;}
+			{stack[top++] = 224; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 224; goto st1065;}
+			{stack[top++] = 224; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 224; goto st1083;}
+			{stack[top++] = 224; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 224; goto st1089;}
+			{stack[top++] = 224; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 224; goto st1095;}
+			{stack[top++] = 224; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 224; goto st1103;}
+			{stack[top++] = 224; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -29685,76 +29694,76 @@ tr727:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 226; goto st616;}
+			{stack[top++] = 226; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 226; goto st618;}
+			{stack[top++] = 226; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 226; goto st620;}
+			{stack[top++] = 226; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 226; goto st652;}
+			{stack[top++] = 226; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 226; goto st657;}
+			{stack[top++] = 226; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 226; goto st662;}
+			{stack[top++] = 226; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 226; goto st667;}
+			{stack[top++] = 226; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 226; goto st671;}
+			{stack[top++] = 226; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 226; goto st673;}
+			{stack[top++] = 226; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 226; goto st728;}
+			{stack[top++] = 226; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 226; goto st739;}
+			{stack[top++] = 226; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 226; goto st756;}
+			{stack[top++] = 226; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 226; goto st767;}
+			{stack[top++] = 226; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 226; goto st778;}
+			{stack[top++] = 226; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 226; goto st791;}
+			{stack[top++] = 226; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 226; goto st801;}
+			{stack[top++] = 226; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 226; goto st840;}
+			{stack[top++] = 226; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 226; goto st994;}
+			{stack[top++] = 226; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 226; goto st997;}
+			{stack[top++] = 226; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 226; goto st1008;}
+			{stack[top++] = 226; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 226; goto st1010;}
+			{stack[top++] = 226; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 226; goto st1039;}
+			{stack[top++] = 226; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 226; goto st1052;}
+			{stack[top++] = 226; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 226; goto st1070;}
+			{stack[top++] = 226; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 226; goto st1065;}
+			{stack[top++] = 226; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 226; goto st1083;}
+			{stack[top++] = 226; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 226; goto st1089;}
+			{stack[top++] = 226; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 226; goto st1095;}
+			{stack[top++] = 226; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 226; goto st1103;}
+			{stack[top++] = 226; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -29773,157 +29782,157 @@ tr763:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 226; goto st616;}
+			{stack[top++] = 226; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 226; goto st618;}
+			{stack[top++] = 226; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 226; goto st620;}
+			{stack[top++] = 226; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 226; goto st652;}
+			{stack[top++] = 226; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 226; goto st657;}
+			{stack[top++] = 226; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 226; goto st662;}
+			{stack[top++] = 226; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 226; goto st667;}
+			{stack[top++] = 226; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 226; goto st671;}
+			{stack[top++] = 226; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 226; goto st673;}
+			{stack[top++] = 226; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 226; goto st728;}
+			{stack[top++] = 226; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 226; goto st739;}
+			{stack[top++] = 226; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 226; goto st756;}
+			{stack[top++] = 226; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 226; goto st767;}
+			{stack[top++] = 226; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 226; goto st778;}
+			{stack[top++] = 226; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 226; goto st791;}
+			{stack[top++] = 226; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 226; goto st801;}
+			{stack[top++] = 226; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 226; goto st840;}
+			{stack[top++] = 226; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 226; goto st994;}
+			{stack[top++] = 226; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 226; goto st997;}
+			{stack[top++] = 226; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 226; goto st1008;}
+			{stack[top++] = 226; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 226; goto st1010;}
+			{stack[top++] = 226; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 226; goto st1039;}
+			{stack[top++] = 226; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 226; goto st1052;}
+			{stack[top++] = 226; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 226; goto st1070;}
+			{stack[top++] = 226; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 226; goto st1065;}
+			{stack[top++] = 226; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 226; goto st1083;}
+			{stack[top++] = 226; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 226; goto st1089;}
+			{stack[top++] = 226; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 226; goto st1095;}
+			{stack[top++] = 226; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 226; goto st1103;}
+			{stack[top++] = 226; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
 		}
 	}
 	goto st226;
-tr3389:
+tr3400:
 	{
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 226; goto st616;}
+			{stack[top++] = 226; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 226; goto st618;}
+			{stack[top++] = 226; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 226; goto st620;}
+			{stack[top++] = 226; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 226; goto st652;}
+			{stack[top++] = 226; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 226; goto st657;}
+			{stack[top++] = 226; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 226; goto st662;}
+			{stack[top++] = 226; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 226; goto st667;}
+			{stack[top++] = 226; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 226; goto st671;}
+			{stack[top++] = 226; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 226; goto st673;}
+			{stack[top++] = 226; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 226; goto st728;}
+			{stack[top++] = 226; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 226; goto st739;}
+			{stack[top++] = 226; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 226; goto st756;}
+			{stack[top++] = 226; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 226; goto st767;}
+			{stack[top++] = 226; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 226; goto st778;}
+			{stack[top++] = 226; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 226; goto st791;}
+			{stack[top++] = 226; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 226; goto st801;}
+			{stack[top++] = 226; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 226; goto st840;}
+			{stack[top++] = 226; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 226; goto st994;}
+			{stack[top++] = 226; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 226; goto st997;}
+			{stack[top++] = 226; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 226; goto st1008;}
+			{stack[top++] = 226; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 226; goto st1010;}
+			{stack[top++] = 226; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 226; goto st1039;}
+			{stack[top++] = 226; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 226; goto st1052;}
+			{stack[top++] = 226; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 226; goto st1070;}
+			{stack[top++] = 226; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 226; goto st1065;}
+			{stack[top++] = 226; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 226; goto st1083;}
+			{stack[top++] = 226; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 226; goto st1089;}
+			{stack[top++] = 226; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 226; goto st1095;}
+			{stack[top++] = 226; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 226; goto st1103;}
+			{stack[top++] = 226; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -30141,7 +30150,7 @@ case 235:
 		case 2619: goto tr809;
 	}
 	goto tr57;
-tr3326:
+tr3337:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -30186,76 +30195,76 @@ tr119:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 237; goto st616;}
+			{stack[top++] = 237; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 237; goto st618;}
+			{stack[top++] = 237; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 237; goto st620;}
+			{stack[top++] = 237; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 237; goto st652;}
+			{stack[top++] = 237; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 237; goto st657;}
+			{stack[top++] = 237; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 237; goto st662;}
+			{stack[top++] = 237; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 237; goto st667;}
+			{stack[top++] = 237; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 237; goto st671;}
+			{stack[top++] = 237; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 237; goto st673;}
+			{stack[top++] = 237; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 237; goto st728;}
+			{stack[top++] = 237; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 237; goto st739;}
+			{stack[top++] = 237; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 237; goto st756;}
+			{stack[top++] = 237; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 237; goto st767;}
+			{stack[top++] = 237; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 237; goto st778;}
+			{stack[top++] = 237; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 237; goto st791;}
+			{stack[top++] = 237; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 237; goto st801;}
+			{stack[top++] = 237; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 237; goto st840;}
+			{stack[top++] = 237; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 237; goto st994;}
+			{stack[top++] = 237; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 237; goto st997;}
+			{stack[top++] = 237; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 237; goto st1008;}
+			{stack[top++] = 237; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 237; goto st1010;}
+			{stack[top++] = 237; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 237; goto st1039;}
+			{stack[top++] = 237; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 237; goto st1052;}
+			{stack[top++] = 237; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 237; goto st1070;}
+			{stack[top++] = 237; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 237; goto st1065;}
+			{stack[top++] = 237; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 237; goto st1083;}
+			{stack[top++] = 237; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 237; goto st1089;}
+			{stack[top++] = 237; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 237; goto st1095;}
+			{stack[top++] = 237; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 237; goto st1103;}
+			{stack[top++] = 237; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -30373,157 +30382,157 @@ tr121:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 239; goto st616;}
+			{stack[top++] = 239; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 239; goto st618;}
+			{stack[top++] = 239; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 239; goto st620;}
+			{stack[top++] = 239; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 239; goto st652;}
+			{stack[top++] = 239; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 239; goto st657;}
+			{stack[top++] = 239; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 239; goto st662;}
+			{stack[top++] = 239; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 239; goto st667;}
+			{stack[top++] = 239; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 239; goto st671;}
+			{stack[top++] = 239; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 239; goto st673;}
+			{stack[top++] = 239; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 239; goto st728;}
+			{stack[top++] = 239; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 239; goto st739;}
+			{stack[top++] = 239; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 239; goto st756;}
+			{stack[top++] = 239; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 239; goto st767;}
+			{stack[top++] = 239; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 239; goto st778;}
+			{stack[top++] = 239; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 239; goto st791;}
+			{stack[top++] = 239; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 239; goto st801;}
+			{stack[top++] = 239; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 239; goto st840;}
+			{stack[top++] = 239; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 239; goto st994;}
+			{stack[top++] = 239; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 239; goto st997;}
+			{stack[top++] = 239; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 239; goto st1008;}
+			{stack[top++] = 239; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 239; goto st1010;}
+			{stack[top++] = 239; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 239; goto st1039;}
+			{stack[top++] = 239; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 239; goto st1052;}
+			{stack[top++] = 239; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 239; goto st1070;}
+			{stack[top++] = 239; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 239; goto st1065;}
+			{stack[top++] = 239; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 239; goto st1083;}
+			{stack[top++] = 239; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 239; goto st1089;}
+			{stack[top++] = 239; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 239; goto st1095;}
+			{stack[top++] = 239; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 239; goto st1103;}
+			{stack[top++] = 239; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
 		}
 	}
 	goto st239;
-tr3328:
+tr3339:
 	{
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 239; goto st616;}
+			{stack[top++] = 239; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 239; goto st618;}
+			{stack[top++] = 239; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 239; goto st620;}
+			{stack[top++] = 239; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 239; goto st652;}
+			{stack[top++] = 239; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 239; goto st657;}
+			{stack[top++] = 239; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 239; goto st662;}
+			{stack[top++] = 239; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 239; goto st667;}
+			{stack[top++] = 239; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 239; goto st671;}
+			{stack[top++] = 239; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 239; goto st673;}
+			{stack[top++] = 239; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 239; goto st728;}
+			{stack[top++] = 239; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 239; goto st739;}
+			{stack[top++] = 239; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 239; goto st756;}
+			{stack[top++] = 239; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 239; goto st767;}
+			{stack[top++] = 239; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 239; goto st778;}
+			{stack[top++] = 239; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 239; goto st791;}
+			{stack[top++] = 239; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 239; goto st801;}
+			{stack[top++] = 239; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 239; goto st840;}
+			{stack[top++] = 239; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 239; goto st994;}
+			{stack[top++] = 239; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 239; goto st997;}
+			{stack[top++] = 239; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 239; goto st1008;}
+			{stack[top++] = 239; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 239; goto st1010;}
+			{stack[top++] = 239; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 239; goto st1039;}
+			{stack[top++] = 239; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 239; goto st1052;}
+			{stack[top++] = 239; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 239; goto st1070;}
+			{stack[top++] = 239; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 239; goto st1065;}
+			{stack[top++] = 239; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 239; goto st1083;}
+			{stack[top++] = 239; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 239; goto st1089;}
+			{stack[top++] = 239; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 239; goto st1095;}
+			{stack[top++] = 239; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 239; goto st1103;}
+			{stack[top++] = 239; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -30617,76 +30626,76 @@ tr710:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 240; goto st616;}
+			{stack[top++] = 240; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 240; goto st618;}
+			{stack[top++] = 240; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 240; goto st620;}
+			{stack[top++] = 240; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 240; goto st652;}
+			{stack[top++] = 240; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 240; goto st657;}
+			{stack[top++] = 240; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 240; goto st662;}
+			{stack[top++] = 240; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 240; goto st667;}
+			{stack[top++] = 240; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 240; goto st671;}
+			{stack[top++] = 240; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 240; goto st673;}
+			{stack[top++] = 240; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 240; goto st728;}
+			{stack[top++] = 240; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 240; goto st739;}
+			{stack[top++] = 240; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 240; goto st756;}
+			{stack[top++] = 240; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 240; goto st767;}
+			{stack[top++] = 240; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 240; goto st778;}
+			{stack[top++] = 240; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 240; goto st791;}
+			{stack[top++] = 240; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 240; goto st801;}
+			{stack[top++] = 240; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 240; goto st840;}
+			{stack[top++] = 240; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 240; goto st994;}
+			{stack[top++] = 240; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 240; goto st997;}
+			{stack[top++] = 240; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 240; goto st1008;}
+			{stack[top++] = 240; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 240; goto st1010;}
+			{stack[top++] = 240; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 240; goto st1039;}
+			{stack[top++] = 240; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 240; goto st1052;}
+			{stack[top++] = 240; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 240; goto st1070;}
+			{stack[top++] = 240; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 240; goto st1065;}
+			{stack[top++] = 240; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 240; goto st1083;}
+			{stack[top++] = 240; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 240; goto st1089;}
+			{stack[top++] = 240; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 240; goto st1095;}
+			{stack[top++] = 240; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 240; goto st1103;}
+			{stack[top++] = 240; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -30698,76 +30707,76 @@ tr94:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 240; goto st616;}
+			{stack[top++] = 240; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 240; goto st618;}
+			{stack[top++] = 240; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 240; goto st620;}
+			{stack[top++] = 240; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 240; goto st652;}
+			{stack[top++] = 240; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 240; goto st657;}
+			{stack[top++] = 240; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 240; goto st662;}
+			{stack[top++] = 240; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 240; goto st667;}
+			{stack[top++] = 240; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 240; goto st671;}
+			{stack[top++] = 240; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 240; goto st673;}
+			{stack[top++] = 240; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 240; goto st728;}
+			{stack[top++] = 240; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 240; goto st739;}
+			{stack[top++] = 240; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 240; goto st756;}
+			{stack[top++] = 240; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 240; goto st767;}
+			{stack[top++] = 240; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 240; goto st778;}
+			{stack[top++] = 240; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 240; goto st791;}
+			{stack[top++] = 240; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 240; goto st801;}
+			{stack[top++] = 240; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 240; goto st840;}
+			{stack[top++] = 240; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 240; goto st994;}
+			{stack[top++] = 240; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 240; goto st997;}
+			{stack[top++] = 240; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 240; goto st1008;}
+			{stack[top++] = 240; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 240; goto st1010;}
+			{stack[top++] = 240; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 240; goto st1039;}
+			{stack[top++] = 240; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 240; goto st1052;}
+			{stack[top++] = 240; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 240; goto st1070;}
+			{stack[top++] = 240; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 240; goto st1065;}
+			{stack[top++] = 240; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 240; goto st1083;}
+			{stack[top++] = 240; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 240; goto st1089;}
+			{stack[top++] = 240; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 240; goto st1095;}
+			{stack[top++] = 240; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 240; goto st1103;}
+			{stack[top++] = 240; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -30885,76 +30894,76 @@ tr700:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 242; goto st616;}
+			{stack[top++] = 242; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 242; goto st618;}
+			{stack[top++] = 242; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 242; goto st620;}
+			{stack[top++] = 242; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 242; goto st652;}
+			{stack[top++] = 242; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 242; goto st657;}
+			{stack[top++] = 242; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 242; goto st662;}
+			{stack[top++] = 242; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 242; goto st667;}
+			{stack[top++] = 242; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 242; goto st671;}
+			{stack[top++] = 242; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 242; goto st673;}
+			{stack[top++] = 242; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 242; goto st728;}
+			{stack[top++] = 242; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 242; goto st739;}
+			{stack[top++] = 242; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 242; goto st756;}
+			{stack[top++] = 242; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 242; goto st767;}
+			{stack[top++] = 242; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 242; goto st778;}
+			{stack[top++] = 242; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 242; goto st791;}
+			{stack[top++] = 242; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 242; goto st801;}
+			{stack[top++] = 242; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 242; goto st840;}
+			{stack[top++] = 242; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 242; goto st994;}
+			{stack[top++] = 242; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 242; goto st997;}
+			{stack[top++] = 242; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 242; goto st1008;}
+			{stack[top++] = 242; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 242; goto st1010;}
+			{stack[top++] = 242; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 242; goto st1039;}
+			{stack[top++] = 242; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 242; goto st1052;}
+			{stack[top++] = 242; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 242; goto st1070;}
+			{stack[top++] = 242; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 242; goto st1065;}
+			{stack[top++] = 242; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 242; goto st1083;}
+			{stack[top++] = 242; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 242; goto st1089;}
+			{stack[top++] = 242; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 242; goto st1095;}
+			{stack[top++] = 242; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 242; goto st1103;}
+			{stack[top++] = 242; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -30973,76 +30982,76 @@ tr693:
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = 242; goto st616;}
+			{stack[top++] = 242; goto st625;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = 242; goto st618;}
+			{stack[top++] = 242; goto st627;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = 242; goto st620;}
+			{stack[top++] = 242; goto st629;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = 242; goto st652;}
+			{stack[top++] = 242; goto st661;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = 242; goto st657;}
+			{stack[top++] = 242; goto st666;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = 242; goto st662;}
+			{stack[top++] = 242; goto st671;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = 242; goto st667;}
+			{stack[top++] = 242; goto st676;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = 242; goto st671;}
+			{stack[top++] = 242; goto st680;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = 242; goto st673;}
+			{stack[top++] = 242; goto st682;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = 242; goto st728;}
+			{stack[top++] = 242; goto st737;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = 242; goto st739;}
+			{stack[top++] = 242; goto st748;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = 242; goto st756;}
+			{stack[top++] = 242; goto st765;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = 242; goto st767;}
+			{stack[top++] = 242; goto st776;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = 242; goto st778;}
+			{stack[top++] = 242; goto st787;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = 242; goto st791;}
+			{stack[top++] = 242; goto st800;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = 242; goto st801;}
+			{stack[top++] = 242; goto st810;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = 242; goto st840;}
+			{stack[top++] = 242; goto st849;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = 242; goto st994;}
+			{stack[top++] = 242; goto st1003;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = 242; goto st997;}
+			{stack[top++] = 242; goto st1006;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = 242; goto st1008;}
+			{stack[top++] = 242; goto st1017;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = 242; goto st1010;}
+			{stack[top++] = 242; goto st1019;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = 242; goto st1039;}
+			{stack[top++] = 242; goto st1048;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = 242; goto st1052;}
+			{stack[top++] = 242; goto st1061;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = 242; goto st1070;}
+			{stack[top++] = 242; goto st1079;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = 242; goto st1065;}
+			{stack[top++] = 242; goto st1074;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = 242; goto st1083;}
+			{stack[top++] = 242; goto st1092;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = 242; goto st1089;}
+			{stack[top++] = 242; goto st1098;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = 242; goto st1095;}
+			{stack[top++] = 242; goto st1104;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = 242; goto st1103;}
+			{stack[top++] = 242; goto st1112;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{goto st261;}
@@ -31100,7 +31109,7 @@ case 242:
 	if ( 896 <= _widec && _widec <= 1151 )
 		goto st241;
 	goto tr79;
-tr3334:
+tr3345:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31110,7 +31119,7 @@ tr3334:
 	}
 	{ p--; {stack[top++] = 243; goto st263;} }
 	goto st243;
-tr3353:
+tr3364:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31156,7 +31165,7 @@ case 243:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3335:
+tr3346:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31166,7 +31175,7 @@ tr3335:
 	}
 	{ p--; {stack[top++] = 244; goto st263;} }
 	goto st244;
-tr3354:
+tr3365:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31210,7 +31219,7 @@ case 244:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3336:
+tr3347:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31220,7 +31229,7 @@ tr3336:
 	}
 	{ p--; {stack[top++] = 245; goto st263;} }
 	goto st245;
-tr3355:
+tr3366:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31260,7 +31269,7 @@ case 245:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3337:
+tr3348:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31270,7 +31279,7 @@ tr3337:
 	}
 	{ p--; {stack[top++] = 246; goto st263;} }
 	goto st246;
-tr3356:
+tr3367:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31310,7 +31319,7 @@ case 246:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3357:
+tr3368:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31352,7 +31361,7 @@ case 247:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3339:
+tr3350:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31362,7 +31371,7 @@ tr3339:
 	}
 	{ p--; {stack[top++] = 248; goto st263;} }
 	goto st248;
-tr3358:
+tr3369:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31404,7 +31413,7 @@ case 248:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3340:
+tr3351:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31414,7 +31423,7 @@ tr3340:
 	}
 	{ p--; {stack[top++] = 249; goto st263;} }
 	goto st249;
-tr3359:
+tr3370:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31458,7 +31467,7 @@ case 249:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3341:
+tr3352:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31468,7 +31477,7 @@ tr3341:
 	}
 	{ p--; {stack[top++] = 250; goto st263;} }
 	goto st250;
-tr3360:
+tr3371:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31510,7 +31519,7 @@ case 250:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3342:
+tr3353:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31520,7 +31529,7 @@ tr3342:
 	}
 	{ p--; {stack[top++] = 251; goto st263;} }
 	goto st251;
-tr3361:
+tr3372:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31564,7 +31573,7 @@ case 251:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3343:
+tr3354:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31574,7 +31583,7 @@ tr3343:
 	}
 	{ p--; {stack[top++] = 252; goto st263;} }
 	goto st252;
-tr3362:
+tr3373:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31614,7 +31623,7 @@ case 252:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3344:
+tr3355:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31624,7 +31633,7 @@ tr3344:
 	}
 	{ p--; {stack[top++] = 253; goto st263;} }
 	goto st253;
-tr3363:
+tr3374:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31668,7 +31677,7 @@ case 253:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3345:
+tr3356:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31678,7 +31687,7 @@ tr3345:
 	}
 	{ p--; {stack[top++] = 254; goto st263;} }
 	goto st254;
-tr3364:
+tr3375:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31724,7 +31733,7 @@ case 254:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3346:
+tr3357:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31734,7 +31743,7 @@ tr3346:
 	}
 	{ p--; {stack[top++] = 255; goto st263;} }
 	goto st255;
-tr3365:
+tr3376:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31778,7 +31787,7 @@ case 255:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3347:
+tr3358:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31788,7 +31797,7 @@ tr3347:
 	}
 	{ p--; {stack[top++] = 256; goto st263;} }
 	goto st256;
-tr3366:
+tr3377:
 	{
 		s->r_class = s->default_class;
 	}
@@ -31828,7 +31837,7 @@ case 256:
 		case 1083: goto tr655;
 	}
 	goto tr822;
-tr3318:
+tr3329:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -31836,12 +31845,12 @@ tr3318:
 		}
 	}
 	goto st257;
-tr3376:
+tr3387:
 	cs = 257;
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		}
 	}
 	{
@@ -31883,7 +31892,7 @@ case 257:
 	} else if ( _widec >= 640 )
 		goto st149;
 	goto tr85;
-tr3349:
+tr3360:
 	{
 		if (s->r_owner_length == 0) {
 			WARN(ZS_BAD_PREVIOUS_OWNER);
@@ -31923,7 +31932,7 @@ case 258:
 	} else if ( _widec >= 640 )
 		goto st149;
 	goto tr128;
-tr3338:
+tr3349:
 	{
 		s->r_class = s->default_class;
 	}
@@ -32044,7 +32053,7 @@ case 262:
 		goto tr826;
 	goto tr825;
 tr824:
-	cs = 1121;
+	cs = 1130;
 	{
 		s->buffer_length = 0;
 	}
@@ -32089,14 +32098,14 @@ tr824:
 	}
 	{
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		} else {
-			{goto st1111;}
+			{goto st1120;}
 		}
 	}
 	goto _again;
 tr826:
-	cs = 1121;
+	cs = 1130;
 	{
 		// Terminate the error context string.
 		s->buffer[s->buffer_length++] = 0;
@@ -32138,16 +32147,16 @@ tr826:
 	}
 	{
 		if (escape) {
-			cs = 1111; {p++; goto _out;}
+			cs = 1120; {p++; goto _out;}
 		} else {
-			{goto st1111;}
+			{goto st1120;}
 		}
 	}
 	goto _again;
-st1121:
+st1130:
 	if ( ++p == pe )
-		goto _test_eof1121;
-case 1121:
+		goto _test_eof1130;
+case 1130:
 	goto st0;
 st263:
 	if ( ++p == pe )
@@ -32287,7 +32296,7 @@ tr832:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1122;
+	goto st1131;
 tr836:
 	{
 		// Enough room for the terminal label is guaranteed (_label_exit).
@@ -32296,7 +32305,7 @@ tr836:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1122;
+	goto st1131;
 tr843:
 	{
 		s->dname_tmp_length++;
@@ -32328,7 +32337,7 @@ tr843:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1122;
+	goto st1131;
 tr847:
 	{
 		// Copy already verified zone origin.
@@ -32341,11 +32350,11 @@ tr847:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1122;
-st1122:
+	goto st1131;
+st1131:
 	if ( ++p == pe )
-		goto _test_eof1122;
-case 1122:
+		goto _test_eof1131;
+case 1131:
 	goto st0;
 tr834:
 	{
@@ -32624,7 +32633,7 @@ tr852:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1123;
+	goto st1132;
 tr858:
 	{
 		rdata_tail++;
@@ -32632,11 +32641,11 @@ tr858:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1123;
-st1123:
+	goto st1132;
+st1132:
 	if ( ++p == pe )
-		goto _test_eof1123;
-case 1123:
+		goto _test_eof1132;
+case 1132:
 	goto st0;
 tr853:
 	{
@@ -32664,7 +32673,7 @@ tr853:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1124;
+	goto st1133;
 tr860:
 	{
 		rdata_tail++;
@@ -32694,11 +32703,11 @@ tr860:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1124;
-st1124:
+	goto st1133;
+st1133:
 	if ( ++p == pe )
-		goto _test_eof1124;
-case 1124:
+		goto _test_eof1133;
+case 1133:
 	switch( (*p) ) {
 		case 32: goto tr852;
 		case 33: goto tr849;
@@ -33288,7 +33297,7 @@ tr890:
 	{
 		s->line_counter++;
 	}
-	goto st1125;
+	goto st1134;
 tr905:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
@@ -33312,11 +33321,11 @@ tr905:
 	{
 		s->line_counter++;
 	}
-	goto st1125;
-st1125:
+	goto st1134;
+st1134:
 	if ( ++p == pe )
-		goto _test_eof1125;
-case 1125:
+		goto _test_eof1134;
+case 1134:
 	goto st0;
 tr906:
 	{
@@ -33908,7 +33917,7 @@ tr925:
 	{
 		s->line_counter++;
 	}
-	goto st1126;
+	goto st1135;
 tr930:
 	{
 		s->zone_origin_length = s->dname_tmp_length;
@@ -33919,11 +33928,11 @@ tr930:
 	{
 		s->line_counter++;
 	}
-	goto st1126;
-st1126:
+	goto st1135;
+st1135:
 	if ( ++p == pe )
-		goto _test_eof1126;
-case 1126:
+		goto _test_eof1135;
+case 1135:
 	goto st0;
 tr926:
 	{
@@ -34642,7 +34651,7 @@ tr950:
 	{
 		s->line_counter++;
 	}
-	goto st1127;
+	goto st1136;
 tr960:
 	{
 		// Extend relative file path.
@@ -34707,7 +34716,7 @@ tr960:
 	{
 		s->line_counter++;
 	}
-	goto st1127;
+	goto st1136;
 tr972:
 	{
 		// Enough room for the terminal label is guaranteed (_label_exit).
@@ -34779,11 +34788,11 @@ tr972:
 	{
 		s->line_counter++;
 	}
-	goto st1127;
-st1127:
+	goto st1136;
+st1136:
 	if ( ++p == pe )
-		goto _test_eof1127;
-case 1127:
+		goto _test_eof1136;
+case 1136:
 	goto st0;
 tr951:
 	{
@@ -35056,11 +35065,11 @@ tr984:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1128;
-st1128:
+	goto st1137;
+st1137:
 	if ( ++p == pe )
-		goto _test_eof1128;
-case 1128:
+		goto _test_eof1137;
+case 1137:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -35407,11 +35416,11 @@ tr1001:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1129;
-st1129:
+	goto st1138;
+st1138:
 	if ( ++p == pe )
-		goto _test_eof1129;
-case 1129:
+		goto _test_eof1138;
+case 1138:
 	goto st0;
 tr1002:
 	{
@@ -35420,11 +35429,11 @@ tr1002:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1130;
-st1130:
+	goto st1139;
+st1139:
 	if ( ++p == pe )
-		goto _test_eof1130;
-case 1130:
+		goto _test_eof1139;
+case 1139:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -35467,11 +35476,11 @@ tr1003:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1131;
-st1131:
+	goto st1140;
+st1140:
 	if ( ++p == pe )
-		goto _test_eof1131;
-case 1131:
+		goto _test_eof1140;
+case 1140:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -37227,7 +37236,7 @@ tr1010:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1033:
 	{
 		for (window = 0; window <= s->last_window; window++) {
@@ -37255,7 +37264,7 @@ tr1033:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1044:
 	{ window_add_bit(KNOT_RRTYPE_A, s); }
 	{
@@ -37284,7 +37293,7 @@ tr1044:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1054:
 	{ window_add_bit(KNOT_RRTYPE_AAAA, s); }
 	{
@@ -37313,7 +37322,7 @@ tr1054:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1067:
 	{ window_add_bit(KNOT_RRTYPE_CAA, s); }
 	{
@@ -37342,7 +37351,7 @@ tr1067:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1081:
 	{ window_add_bit(KNOT_RRTYPE_CDNSKEY, s); }
 	{
@@ -37371,7 +37380,7 @@ tr1081:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1089:
 	{ window_add_bit(KNOT_RRTYPE_CDS, s); }
 	{
@@ -37400,7 +37409,7 @@ tr1089:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1099:
 	{ window_add_bit(KNOT_RRTYPE_CERT, s); }
 	{
@@ -37429,7 +37438,7 @@ tr1099:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1110:
 	{ window_add_bit(KNOT_RRTYPE_CNAME, s); }
 	{
@@ -37458,7 +37467,7 @@ tr1110:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1124:
 	{ window_add_bit(KNOT_RRTYPE_DHCID, s); }
 	{
@@ -37487,7 +37496,7 @@ tr1124:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1136:
 	{ window_add_bit(KNOT_RRTYPE_DNAME, s); }
 	{
@@ -37516,7 +37525,7 @@ tr1136:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1147:
 	{ window_add_bit(KNOT_RRTYPE_DNSKEY, s); }
 	{
@@ -37545,7 +37554,7 @@ tr1147:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1155:
 	{ window_add_bit(KNOT_RRTYPE_DS, s); }
 	{
@@ -37574,7 +37583,7 @@ tr1155:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1168:
 	{ window_add_bit(KNOT_RRTYPE_EUI48, s); }
 	{
@@ -37603,7 +37612,7 @@ tr1168:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1177:
 	{ window_add_bit(KNOT_RRTYPE_EUI64, s); }
 	{
@@ -37632,7 +37641,7 @@ tr1177:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1189:
 	{ window_add_bit(KNOT_RRTYPE_HINFO, s); }
 	{
@@ -37661,7 +37670,7 @@ tr1189:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1204:
 	{ window_add_bit(KNOT_RRTYPE_IPSECKEY, s); }
 	{
@@ -37690,7 +37699,7 @@ tr1204:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1215:
 	{ window_add_bit(KNOT_RRTYPE_KEY, s); }
 	{
@@ -37719,7 +37728,7 @@ tr1215:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1223:
 	{ window_add_bit(KNOT_RRTYPE_KX, s); }
 	{
@@ -37748,7 +37757,7 @@ tr1223:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1236:
 	{ window_add_bit(KNOT_RRTYPE_L32, s); }
 	{
@@ -37777,7 +37786,7 @@ tr1236:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1245:
 	{ window_add_bit(KNOT_RRTYPE_L64, s); }
 	{
@@ -37806,7 +37815,7 @@ tr1245:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1254:
 	{ window_add_bit(KNOT_RRTYPE_LOC, s); }
 	{
@@ -37835,7 +37844,7 @@ tr1254:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1262:
 	{ window_add_bit(KNOT_RRTYPE_LP, s); }
 	{
@@ -37864,7 +37873,7 @@ tr1262:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1275:
 	{ window_add_bit(KNOT_RRTYPE_MINFO, s); }
 	{
@@ -37893,7 +37902,7 @@ tr1275:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1283:
 	{ window_add_bit(KNOT_RRTYPE_MX, s); }
 	{
@@ -37922,7 +37931,7 @@ tr1283:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1297:
 	{ window_add_bit(KNOT_RRTYPE_NAPTR, s); }
 	{
@@ -37951,7 +37960,7 @@ tr1297:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1306:
 	{ window_add_bit(KNOT_RRTYPE_NID, s); }
 	{
@@ -37980,7 +37989,7 @@ tr1306:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1315:
 	{ window_add_bit(KNOT_RRTYPE_NS, s); }
 	{
@@ -38009,7 +38018,7 @@ tr1315:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1325:
 	{ window_add_bit(KNOT_RRTYPE_NSEC, s); }
 	{
@@ -38038,7 +38047,7 @@ tr1325:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1334:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3, s); }
 	{
@@ -38067,7 +38076,7 @@ tr1334:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1346:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3PARAM, s); }
 	{
@@ -38096,7 +38105,7 @@ tr1346:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1356:
 	{ window_add_bit(KNOT_RRTYPE_PTR, s); }
 	{
@@ -38125,7 +38134,7 @@ tr1356:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1367:
 	{ window_add_bit(KNOT_RRTYPE_RP, s); }
 	{
@@ -38154,7 +38163,7 @@ tr1367:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1378:
 	{ window_add_bit(KNOT_RRTYPE_RRSIG, s); }
 	{
@@ -38183,7 +38192,7 @@ tr1378:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1386:
 	{ window_add_bit(KNOT_RRTYPE_RT, s); }
 	{
@@ -38212,7 +38221,7 @@ tr1386:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1399:
 	{ window_add_bit(KNOT_RRTYPE_SOA, s); }
 	{
@@ -38241,7 +38250,7 @@ tr1399:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1408:
 	{ window_add_bit(KNOT_RRTYPE_SPF, s); }
 	{
@@ -38270,7 +38279,7 @@ tr1408:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1417:
 	{ window_add_bit(KNOT_RRTYPE_SRV, s); }
 	{
@@ -38299,7 +38308,7 @@ tr1417:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1428:
 	{ window_add_bit(KNOT_RRTYPE_SSHFP, s); }
 	{
@@ -38328,7 +38337,7 @@ tr1428:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1441:
 	{ window_add_bit(KNOT_RRTYPE_TLSA, s); }
 	{
@@ -38357,7 +38366,7 @@ tr1441:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1450:
 	{ window_add_bit(KNOT_RRTYPE_TXT, s); }
 	{
@@ -38386,7 +38395,7 @@ tr1450:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1462:
 	{
 		if (s->number64 <= UINT16_MAX) {
@@ -38422,7 +38431,7 @@ tr1462:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1472:
 	{ window_add_bit(KNOT_RRTYPE_URI, s); }
 	{
@@ -38451,7 +38460,7 @@ tr1472:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1483:
 	{ window_add_bit(KNOT_RRTYPE_AFSDB, s); }
 	{
@@ -38480,7 +38489,7 @@ tr1483:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
+	goto st1141;
 tr1492:
 	{ window_add_bit(KNOT_RRTYPE_APL, s); }
 	{
@@ -38509,11 +38518,11 @@ tr1492:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1132;
-st1132:
+	goto st1141;
+st1141:
 	if ( ++p == pe )
-		goto _test_eof1132;
-case 1132:
+		goto _test_eof1141;
+case 1141:
 	goto st0;
 tr1011:
 	{
@@ -38549,7 +38558,7 @@ tr1011:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1034:
 	{
 		s->line_counter++;
@@ -38580,7 +38589,7 @@ tr1034:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1045:
 	{ window_add_bit(KNOT_RRTYPE_A, s); }
 	{
@@ -38612,7 +38621,7 @@ tr1045:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1055:
 	{ window_add_bit(KNOT_RRTYPE_AAAA, s); }
 	{
@@ -38644,7 +38653,7 @@ tr1055:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1068:
 	{ window_add_bit(KNOT_RRTYPE_CAA, s); }
 	{
@@ -38676,7 +38685,7 @@ tr1068:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1082:
 	{ window_add_bit(KNOT_RRTYPE_CDNSKEY, s); }
 	{
@@ -38708,7 +38717,7 @@ tr1082:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1090:
 	{ window_add_bit(KNOT_RRTYPE_CDS, s); }
 	{
@@ -38740,7 +38749,7 @@ tr1090:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1100:
 	{ window_add_bit(KNOT_RRTYPE_CERT, s); }
 	{
@@ -38772,7 +38781,7 @@ tr1100:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1111:
 	{ window_add_bit(KNOT_RRTYPE_CNAME, s); }
 	{
@@ -38804,7 +38813,7 @@ tr1111:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1125:
 	{ window_add_bit(KNOT_RRTYPE_DHCID, s); }
 	{
@@ -38836,7 +38845,7 @@ tr1125:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1137:
 	{ window_add_bit(KNOT_RRTYPE_DNAME, s); }
 	{
@@ -38868,7 +38877,7 @@ tr1137:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1148:
 	{ window_add_bit(KNOT_RRTYPE_DNSKEY, s); }
 	{
@@ -38900,7 +38909,7 @@ tr1148:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1156:
 	{ window_add_bit(KNOT_RRTYPE_DS, s); }
 	{
@@ -38932,7 +38941,7 @@ tr1156:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1169:
 	{ window_add_bit(KNOT_RRTYPE_EUI48, s); }
 	{
@@ -38964,7 +38973,7 @@ tr1169:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1178:
 	{ window_add_bit(KNOT_RRTYPE_EUI64, s); }
 	{
@@ -38996,7 +39005,7 @@ tr1178:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1190:
 	{ window_add_bit(KNOT_RRTYPE_HINFO, s); }
 	{
@@ -39028,7 +39037,7 @@ tr1190:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1205:
 	{ window_add_bit(KNOT_RRTYPE_IPSECKEY, s); }
 	{
@@ -39060,7 +39069,7 @@ tr1205:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1216:
 	{ window_add_bit(KNOT_RRTYPE_KEY, s); }
 	{
@@ -39092,7 +39101,7 @@ tr1216:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1224:
 	{ window_add_bit(KNOT_RRTYPE_KX, s); }
 	{
@@ -39124,7 +39133,7 @@ tr1224:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1237:
 	{ window_add_bit(KNOT_RRTYPE_L32, s); }
 	{
@@ -39156,7 +39165,7 @@ tr1237:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1246:
 	{ window_add_bit(KNOT_RRTYPE_L64, s); }
 	{
@@ -39188,7 +39197,7 @@ tr1246:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1255:
 	{ window_add_bit(KNOT_RRTYPE_LOC, s); }
 	{
@@ -39220,7 +39229,7 @@ tr1255:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1263:
 	{ window_add_bit(KNOT_RRTYPE_LP, s); }
 	{
@@ -39252,7 +39261,7 @@ tr1263:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1276:
 	{ window_add_bit(KNOT_RRTYPE_MINFO, s); }
 	{
@@ -39284,7 +39293,7 @@ tr1276:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1284:
 	{ window_add_bit(KNOT_RRTYPE_MX, s); }
 	{
@@ -39316,7 +39325,7 @@ tr1284:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1298:
 	{ window_add_bit(KNOT_RRTYPE_NAPTR, s); }
 	{
@@ -39348,7 +39357,7 @@ tr1298:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1307:
 	{ window_add_bit(KNOT_RRTYPE_NID, s); }
 	{
@@ -39380,7 +39389,7 @@ tr1307:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1316:
 	{ window_add_bit(KNOT_RRTYPE_NS, s); }
 	{
@@ -39412,7 +39421,7 @@ tr1316:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1326:
 	{ window_add_bit(KNOT_RRTYPE_NSEC, s); }
 	{
@@ -39444,7 +39453,7 @@ tr1326:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1335:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3, s); }
 	{
@@ -39476,7 +39485,7 @@ tr1335:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1347:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3PARAM, s); }
 	{
@@ -39508,7 +39517,7 @@ tr1347:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1357:
 	{ window_add_bit(KNOT_RRTYPE_PTR, s); }
 	{
@@ -39540,7 +39549,7 @@ tr1357:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1368:
 	{ window_add_bit(KNOT_RRTYPE_RP, s); }
 	{
@@ -39572,7 +39581,7 @@ tr1368:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1379:
 	{ window_add_bit(KNOT_RRTYPE_RRSIG, s); }
 	{
@@ -39604,7 +39613,7 @@ tr1379:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1387:
 	{ window_add_bit(KNOT_RRTYPE_RT, s); }
 	{
@@ -39636,7 +39645,7 @@ tr1387:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1400:
 	{ window_add_bit(KNOT_RRTYPE_SOA, s); }
 	{
@@ -39668,7 +39677,7 @@ tr1400:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1409:
 	{ window_add_bit(KNOT_RRTYPE_SPF, s); }
 	{
@@ -39700,7 +39709,7 @@ tr1409:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1418:
 	{ window_add_bit(KNOT_RRTYPE_SRV, s); }
 	{
@@ -39732,7 +39741,7 @@ tr1418:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1429:
 	{ window_add_bit(KNOT_RRTYPE_SSHFP, s); }
 	{
@@ -39764,7 +39773,7 @@ tr1429:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1442:
 	{ window_add_bit(KNOT_RRTYPE_TLSA, s); }
 	{
@@ -39796,7 +39805,7 @@ tr1442:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1451:
 	{ window_add_bit(KNOT_RRTYPE_TXT, s); }
 	{
@@ -39828,7 +39837,7 @@ tr1451:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1463:
 	{
 		if (s->number64 <= UINT16_MAX) {
@@ -39867,7 +39876,7 @@ tr1463:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1473:
 	{ window_add_bit(KNOT_RRTYPE_URI, s); }
 	{
@@ -39899,7 +39908,7 @@ tr1473:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1484:
 	{ window_add_bit(KNOT_RRTYPE_AFSDB, s); }
 	{
@@ -39931,7 +39940,7 @@ tr1484:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
+	goto st1142;
 tr1493:
 	{ window_add_bit(KNOT_RRTYPE_APL, s); }
 	{
@@ -39963,11 +39972,11 @@ tr1493:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1133;
-st1133:
+	goto st1142;
+st1142:
 	if ( ++p == pe )
-		goto _test_eof1133;
-case 1133:
+		goto _test_eof1142;
+case 1142:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -40115,7 +40124,7 @@ tr1012:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1035:
 	{
 		for (window = 0; window <= s->last_window; window++) {
@@ -40143,7 +40152,7 @@ tr1035:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1046:
 	{ window_add_bit(KNOT_RRTYPE_A, s); }
 	{
@@ -40172,7 +40181,7 @@ tr1046:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1056:
 	{ window_add_bit(KNOT_RRTYPE_AAAA, s); }
 	{
@@ -40201,7 +40210,7 @@ tr1056:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1069:
 	{ window_add_bit(KNOT_RRTYPE_CAA, s); }
 	{
@@ -40230,7 +40239,7 @@ tr1069:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1083:
 	{ window_add_bit(KNOT_RRTYPE_CDNSKEY, s); }
 	{
@@ -40259,7 +40268,7 @@ tr1083:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1091:
 	{ window_add_bit(KNOT_RRTYPE_CDS, s); }
 	{
@@ -40288,7 +40297,7 @@ tr1091:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1101:
 	{ window_add_bit(KNOT_RRTYPE_CERT, s); }
 	{
@@ -40317,7 +40326,7 @@ tr1101:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1112:
 	{ window_add_bit(KNOT_RRTYPE_CNAME, s); }
 	{
@@ -40346,7 +40355,7 @@ tr1112:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1126:
 	{ window_add_bit(KNOT_RRTYPE_DHCID, s); }
 	{
@@ -40375,7 +40384,7 @@ tr1126:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1138:
 	{ window_add_bit(KNOT_RRTYPE_DNAME, s); }
 	{
@@ -40404,7 +40413,7 @@ tr1138:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1149:
 	{ window_add_bit(KNOT_RRTYPE_DNSKEY, s); }
 	{
@@ -40433,7 +40442,7 @@ tr1149:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1157:
 	{ window_add_bit(KNOT_RRTYPE_DS, s); }
 	{
@@ -40462,7 +40471,7 @@ tr1157:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1170:
 	{ window_add_bit(KNOT_RRTYPE_EUI48, s); }
 	{
@@ -40491,7 +40500,7 @@ tr1170:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1179:
 	{ window_add_bit(KNOT_RRTYPE_EUI64, s); }
 	{
@@ -40520,7 +40529,7 @@ tr1179:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1191:
 	{ window_add_bit(KNOT_RRTYPE_HINFO, s); }
 	{
@@ -40549,7 +40558,7 @@ tr1191:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1206:
 	{ window_add_bit(KNOT_RRTYPE_IPSECKEY, s); }
 	{
@@ -40578,7 +40587,7 @@ tr1206:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1217:
 	{ window_add_bit(KNOT_RRTYPE_KEY, s); }
 	{
@@ -40607,7 +40616,7 @@ tr1217:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1225:
 	{ window_add_bit(KNOT_RRTYPE_KX, s); }
 	{
@@ -40636,7 +40645,7 @@ tr1225:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1238:
 	{ window_add_bit(KNOT_RRTYPE_L32, s); }
 	{
@@ -40665,7 +40674,7 @@ tr1238:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1247:
 	{ window_add_bit(KNOT_RRTYPE_L64, s); }
 	{
@@ -40694,7 +40703,7 @@ tr1247:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1256:
 	{ window_add_bit(KNOT_RRTYPE_LOC, s); }
 	{
@@ -40723,7 +40732,7 @@ tr1256:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1264:
 	{ window_add_bit(KNOT_RRTYPE_LP, s); }
 	{
@@ -40752,7 +40761,7 @@ tr1264:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1277:
 	{ window_add_bit(KNOT_RRTYPE_MINFO, s); }
 	{
@@ -40781,7 +40790,7 @@ tr1277:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1285:
 	{ window_add_bit(KNOT_RRTYPE_MX, s); }
 	{
@@ -40810,7 +40819,7 @@ tr1285:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1299:
 	{ window_add_bit(KNOT_RRTYPE_NAPTR, s); }
 	{
@@ -40839,7 +40848,7 @@ tr1299:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1308:
 	{ window_add_bit(KNOT_RRTYPE_NID, s); }
 	{
@@ -40868,7 +40877,7 @@ tr1308:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1317:
 	{ window_add_bit(KNOT_RRTYPE_NS, s); }
 	{
@@ -40897,7 +40906,7 @@ tr1317:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1327:
 	{ window_add_bit(KNOT_RRTYPE_NSEC, s); }
 	{
@@ -40926,7 +40935,7 @@ tr1327:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1336:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3, s); }
 	{
@@ -40955,7 +40964,7 @@ tr1336:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1348:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3PARAM, s); }
 	{
@@ -40984,7 +40993,7 @@ tr1348:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1358:
 	{ window_add_bit(KNOT_RRTYPE_PTR, s); }
 	{
@@ -41013,7 +41022,7 @@ tr1358:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1369:
 	{ window_add_bit(KNOT_RRTYPE_RP, s); }
 	{
@@ -41042,7 +41051,7 @@ tr1369:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1380:
 	{ window_add_bit(KNOT_RRTYPE_RRSIG, s); }
 	{
@@ -41071,7 +41080,7 @@ tr1380:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1388:
 	{ window_add_bit(KNOT_RRTYPE_RT, s); }
 	{
@@ -41100,7 +41109,7 @@ tr1388:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1401:
 	{ window_add_bit(KNOT_RRTYPE_SOA, s); }
 	{
@@ -41129,7 +41138,7 @@ tr1401:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1410:
 	{ window_add_bit(KNOT_RRTYPE_SPF, s); }
 	{
@@ -41158,7 +41167,7 @@ tr1410:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1419:
 	{ window_add_bit(KNOT_RRTYPE_SRV, s); }
 	{
@@ -41187,7 +41196,7 @@ tr1419:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1430:
 	{ window_add_bit(KNOT_RRTYPE_SSHFP, s); }
 	{
@@ -41216,7 +41225,7 @@ tr1430:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1443:
 	{ window_add_bit(KNOT_RRTYPE_TLSA, s); }
 	{
@@ -41245,7 +41254,7 @@ tr1443:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1452:
 	{ window_add_bit(KNOT_RRTYPE_TXT, s); }
 	{
@@ -41274,7 +41283,7 @@ tr1452:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1464:
 	{
 		if (s->number64 <= UINT16_MAX) {
@@ -41310,7 +41319,7 @@ tr1464:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1474:
 	{ window_add_bit(KNOT_RRTYPE_URI, s); }
 	{
@@ -41339,7 +41348,7 @@ tr1474:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1485:
 	{ window_add_bit(KNOT_RRTYPE_AFSDB, s); }
 	{
@@ -41368,7 +41377,7 @@ tr1485:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
+	goto st1143;
 tr1494:
 	{ window_add_bit(KNOT_RRTYPE_APL, s); }
 	{
@@ -41397,11 +41406,11 @@ tr1494:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1134;
-st1134:
+	goto st1143;
+st1143:
 	if ( ++p == pe )
-		goto _test_eof1134;
-case 1134:
+		goto _test_eof1143;
+case 1143:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -43929,11 +43938,11 @@ tr1522:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1135;
-st1135:
+	goto st1144;
+st1144:
 	if ( ++p == pe )
-		goto _test_eof1135;
-case 1135:
+		goto _test_eof1144;
+case 1144:
 	goto st0;
 tr1523:
 	{
@@ -43948,11 +43957,11 @@ tr1523:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1136;
-st1136:
+	goto st1145;
+st1145:
 	if ( ++p == pe )
-		goto _test_eof1136;
-case 1136:
+		goto _test_eof1145;
+case 1145:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -44000,11 +44009,11 @@ tr1524:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1137;
-st1137:
+	goto st1146;
+st1146:
 	if ( ++p == pe )
-		goto _test_eof1137;
-case 1137:
+		goto _test_eof1146;
+case 1146:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -44228,7 +44237,7 @@ tr1532:
 			p--; {goto st261;}
 		}
 	}
-	goto st1138;
+	goto st1147;
 tr1533:
 	{
 		p--; {cs = stack[--top];goto _again;}
@@ -44248,7 +44257,7 @@ tr1533:
 		}
 		s->multiline = true;
 	}
-	goto st1138;
+	goto st1147;
 tr1534:
 	{
 		p--; {cs = stack[--top];goto _again;}
@@ -44268,7 +44277,7 @@ tr1534:
 		}
 		s->multiline = false;
 	}
-	goto st1138;
+	goto st1147;
 tr1537:
 	{
 		p--; {cs = stack[--top];goto _again;}
@@ -44284,11 +44293,11 @@ tr1537:
 	{
 		s->line_counter++;
 	}
-	goto st1138;
-st1138:
+	goto st1147;
+st1147:
 	if ( ++p == pe )
-		goto _test_eof1138;
-case 1138:
+		goto _test_eof1147;
+case 1147:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -44555,7 +44564,7 @@ tr1536:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1139;
+	goto st1148;
 tr1551:
 	{
 		if ((rdata_tail - s->r_data) != s->r_data_length) {
@@ -44566,11 +44575,11 @@ tr1551:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1139;
-st1139:
+	goto st1148;
+st1148:
 	if ( ++p == pe )
-		goto _test_eof1139;
-case 1139:
+		goto _test_eof1148;
+case 1148:
 	goto tr1495;
 tr1552:
 	{
@@ -44585,11 +44594,11 @@ tr1552:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1140;
-st1140:
+	goto st1149;
+st1149:
 	if ( ++p == pe )
-		goto _test_eof1140;
-case 1140:
+		goto _test_eof1149;
+case 1149:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -44637,11 +44646,11 @@ tr1553:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1141;
-st1141:
+	goto st1150;
+st1150:
 	if ( ++p == pe )
-		goto _test_eof1141;
-case 1141:
+		goto _test_eof1150;
+case 1150:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -44776,11 +44785,11 @@ tr1538:
 			p--; {goto st261;}
 		}
 	}
-	goto st1142;
-st1142:
+	goto st1151;
+st1151:
 	if ( ++p == pe )
-		goto _test_eof1142;
-case 1142:
+		goto _test_eof1151;
+case 1151:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -44838,14 +44847,14 @@ case 480:
 	switch( (*p) ) {
 		case 68: goto st482;
 		case 69: goto st497;
-		case 73: goto st527;
-		case 80: goto st535;
-		case 82: goto st548;
+		case 73: goto st536;
+		case 80: goto st544;
+		case 82: goto st557;
 		case 100: goto st482;
 		case 101: goto st497;
-		case 105: goto st527;
-		case 112: goto st535;
-		case 114: goto st548;
+		case 105: goto st536;
+		case 112: goto st544;
+		case 114: goto st557;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
 		goto tr1560;
@@ -44915,7 +44924,7 @@ tr1566:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
+	goto st1152;
 tr1570:
 	{
 		*(rdata_tail++) = 2;
@@ -44923,7 +44932,7 @@ tr1570:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
+	goto st1152;
 tr1572:
 	{
 		*(rdata_tail++) = 3;
@@ -44931,7 +44940,7 @@ tr1572:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
+	goto st1152;
 tr1584:
 	{
 		*(rdata_tail++) = 6;
@@ -44939,99 +44948,115 @@ tr1584:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1593:
+	goto st1152;
+tr1594:
 	{
 		*(rdata_tail++) = 12;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1607:
+	goto st1152;
+tr1608:
 	{
 		*(rdata_tail++) = 13;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1616:
+	goto st1152;
+tr1617:
 	{
 		*(rdata_tail++) = 14;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
+	goto st1152;
 tr1624:
 	{
-		*(rdata_tail++) = 252;
+		*(rdata_tail++) = 15;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
+	goto st1152;
+tr1627:
+	{
+		*(rdata_tail++) = 16;
+	}
+	{
+		p--; {cs = stack[--top];goto _again;}
+	}
+	goto st1152;
 tr1635:
+	{
+		*(rdata_tail++) = 252;
+	}
+	{
+		p--; {cs = stack[--top];goto _again;}
+	}
+	goto st1152;
+tr1646:
 	{
 		*(rdata_tail++) = 253;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1638:
+	goto st1152;
+tr1649:
 	{
 		*(rdata_tail++) = 254;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1645:
+	goto st1152;
+tr1656:
 	{
 		*(rdata_tail++) = 1;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1651:
+	goto st1152;
+tr1662:
 	{
 		*(rdata_tail++) = 5;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1663:
+	goto st1152;
+tr1674:
 	{
 		*(rdata_tail++) = 7;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1666:
+	goto st1152;
+tr1677:
 	{
 		*(rdata_tail++) = 8;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-tr1669:
+	goto st1152;
+tr1680:
 	{
 		*(rdata_tail++) = 10;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1143;
-st1143:
+	goto st1152;
+st1152:
 	if ( ++p == pe )
-		goto _test_eof1143;
-case 1143:
+		goto _test_eof1152;
+case 1152:
 	goto st0;
 st482:
 	if ( ++p == pe )
@@ -45186,7 +45211,9 @@ st497:
 case 497:
 	switch( (*p) ) {
 		case 67: goto st498;
+		case 68: goto st527;
 		case 99: goto st498;
+		case 100: goto st527;
 	}
 	goto tr1559;
 st498:
@@ -45248,14 +45275,14 @@ st504:
 		goto _test_eof504;
 case 504:
 	switch( (*p) ) {
-		case 32: goto tr1593;
-		case 59: goto tr1593;
+		case 32: goto tr1594;
+		case 59: goto tr1594;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1593;
+			goto tr1594;
 	} else if ( (*p) >= 9 )
-		goto tr1593;
+		goto tr1594;
 	goto tr1559;
 st505:
 	if ( ++p == pe )
@@ -45360,14 +45387,14 @@ st517:
 		goto _test_eof517;
 case 517:
 	switch( (*p) ) {
-		case 32: goto tr1607;
-		case 59: goto tr1607;
+		case 32: goto tr1608;
+		case 59: goto tr1608;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1607;
+			goto tr1608;
 	} else if ( (*p) >= 9 )
-		goto tr1607;
+		goto tr1608;
 	goto tr1559;
 st518:
 	if ( ++p == pe )
@@ -45436,108 +45463,101 @@ st526:
 		goto _test_eof526;
 case 526:
 	switch( (*p) ) {
-		case 32: goto tr1616;
-		case 59: goto tr1616;
+		case 32: goto tr1617;
+		case 59: goto tr1617;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1616;
+			goto tr1617;
 	} else if ( (*p) >= 9 )
-		goto tr1616;
+		goto tr1617;
 	goto tr1559;
 st527:
 	if ( ++p == pe )
 		goto _test_eof527;
 case 527:
 	switch( (*p) ) {
-		case 78: goto st528;
-		case 110: goto st528;
+		case 50: goto st528;
+		case 52: goto st533;
 	}
 	goto tr1559;
 st528:
 	if ( ++p == pe )
 		goto _test_eof528;
 case 528:
-	switch( (*p) ) {
-		case 68: goto st529;
-		case 100: goto st529;
-	}
+	if ( (*p) == 53 )
+		goto st529;
 	goto tr1559;
 st529:
 	if ( ++p == pe )
 		goto _test_eof529;
 case 529:
-	switch( (*p) ) {
-		case 73: goto st530;
-		case 105: goto st530;
-	}
+	if ( (*p) == 53 )
+		goto st530;
 	goto tr1559;
 st530:
 	if ( ++p == pe )
 		goto _test_eof530;
 case 530:
-	switch( (*p) ) {
-		case 82: goto st531;
-		case 114: goto st531;
-	}
+	if ( (*p) == 49 )
+		goto st531;
 	goto tr1559;
 st531:
 	if ( ++p == pe )
 		goto _test_eof531;
 case 531:
-	switch( (*p) ) {
-		case 69: goto st532;
-		case 101: goto st532;
-	}
+	if ( (*p) == 57 )
+		goto st532;
 	goto tr1559;
 st532:
 	if ( ++p == pe )
 		goto _test_eof532;
 case 532:
 	switch( (*p) ) {
-		case 67: goto st533;
-		case 99: goto st533;
+		case 32: goto tr1624;
+		case 59: goto tr1624;
 	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1624;
+	} else if ( (*p) >= 9 )
+		goto tr1624;
 	goto tr1559;
 st533:
 	if ( ++p == pe )
 		goto _test_eof533;
 case 533:
-	switch( (*p) ) {
-		case 84: goto st534;
-		case 116: goto st534;
-	}
+	if ( (*p) == 52 )
+		goto st534;
 	goto tr1559;
 st534:
 	if ( ++p == pe )
 		goto _test_eof534;
 case 534:
-	switch( (*p) ) {
-		case 32: goto tr1624;
-		case 59: goto tr1624;
-	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1624;
-	} else if ( (*p) >= 9 )
-		goto tr1624;
+	if ( (*p) == 56 )
+		goto st535;
 	goto tr1559;
 st535:
 	if ( ++p == pe )
 		goto _test_eof535;
 case 535:
 	switch( (*p) ) {
-		case 82: goto st536;
-		case 114: goto st536;
+		case 32: goto tr1627;
+		case 59: goto tr1627;
 	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1627;
+	} else if ( (*p) >= 9 )
+		goto tr1627;
 	goto tr1559;
 st536:
 	if ( ++p == pe )
 		goto _test_eof536;
 case 536:
 	switch( (*p) ) {
-		case 73: goto st537;
-		case 105: goto st537;
+		case 78: goto st537;
+		case 110: goto st537;
 	}
 	goto tr1559;
 st537:
@@ -45545,8 +45565,8 @@ st537:
 		goto _test_eof537;
 case 537:
 	switch( (*p) ) {
-		case 86: goto st538;
-		case 118: goto st538;
+		case 68: goto st538;
+		case 100: goto st538;
 	}
 	goto tr1559;
 st538:
@@ -45554,8 +45574,8 @@ st538:
 		goto _test_eof538;
 case 538:
 	switch( (*p) ) {
-		case 65: goto st539;
-		case 97: goto st539;
+		case 73: goto st539;
+		case 105: goto st539;
 	}
 	goto tr1559;
 st539:
@@ -45563,8 +45583,8 @@ st539:
 		goto _test_eof539;
 case 539:
 	switch( (*p) ) {
-		case 84: goto st540;
-		case 116: goto st540;
+		case 82: goto st540;
+		case 114: goto st540;
 	}
 	goto tr1559;
 st540:
@@ -45581,10 +45601,8 @@ st541:
 		goto _test_eof541;
 case 541:
 	switch( (*p) ) {
-		case 68: goto st542;
-		case 79: goto st545;
-		case 100: goto st542;
-		case 111: goto st545;
+		case 67: goto st542;
+		case 99: goto st542;
 	}
 	goto tr1559;
 st542:
@@ -45592,23 +45610,14 @@ st542:
 		goto _test_eof542;
 case 542:
 	switch( (*p) ) {
-		case 78: goto st543;
-		case 110: goto st543;
+		case 84: goto st543;
+		case 116: goto st543;
 	}
 	goto tr1559;
 st543:
 	if ( ++p == pe )
 		goto _test_eof543;
 case 543:
-	switch( (*p) ) {
-		case 83: goto st544;
-		case 115: goto st544;
-	}
-	goto tr1559;
-st544:
-	if ( ++p == pe )
-		goto _test_eof544;
-case 544:
 	switch( (*p) ) {
 		case 32: goto tr1635;
 		case 59: goto tr1635;
@@ -45619,6 +45628,15 @@ case 544:
 	} else if ( (*p) >= 9 )
 		goto tr1635;
 	goto tr1559;
+st544:
+	if ( ++p == pe )
+		goto _test_eof544;
+case 544:
+	switch( (*p) ) {
+		case 82: goto st545;
+		case 114: goto st545;
+	}
+	goto tr1559;
 st545:
 	if ( ++p == pe )
 		goto _test_eof545;
@@ -45633,8 +45651,8 @@ st546:
 		goto _test_eof546;
 case 546:
 	switch( (*p) ) {
-		case 68: goto st547;
-		case 100: goto st547;
+		case 86: goto st547;
+		case 118: goto st547;
 	}
 	goto tr1559;
 st547:
@@ -45642,22 +45660,17 @@ st547:
 		goto _test_eof547;
 case 547:
 	switch( (*p) ) {
-		case 32: goto tr1638;
-		case 59: goto tr1638;
+		case 65: goto st548;
+		case 97: goto st548;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1638;
-	} else if ( (*p) >= 9 )
-		goto tr1638;
 	goto tr1559;
 st548:
 	if ( ++p == pe )
 		goto _test_eof548;
 case 548:
 	switch( (*p) ) {
-		case 83: goto st549;
-		case 115: goto st549;
+		case 84: goto st549;
+		case 116: goto st549;
 	}
 	goto tr1559;
 st549:
@@ -45665,8 +45678,8 @@ st549:
 		goto _test_eof549;
 case 549:
 	switch( (*p) ) {
-		case 65: goto st550;
-		case 97: goto st550;
+		case 69: goto st550;
+		case 101: goto st550;
 	}
 	goto tr1559;
 st550:
@@ -45674,10 +45687,10 @@ st550:
 		goto _test_eof550;
 case 550:
 	switch( (*p) ) {
-		case 77: goto st551;
-		case 83: goto st554;
-		case 109: goto st551;
-		case 115: goto st554;
+		case 68: goto st551;
+		case 79: goto st554;
+		case 100: goto st551;
+		case 111: goto st554;
 	}
 	goto tr1559;
 st551:
@@ -45685,38 +45698,40 @@ st551:
 		goto _test_eof551;
 case 551:
 	switch( (*p) ) {
-		case 68: goto st552;
-		case 100: goto st552;
+		case 78: goto st552;
+		case 110: goto st552;
 	}
 	goto tr1559;
 st552:
 	if ( ++p == pe )
 		goto _test_eof552;
 case 552:
-	if ( (*p) == 53 )
-		goto st553;
+	switch( (*p) ) {
+		case 83: goto st553;
+		case 115: goto st553;
+	}
 	goto tr1559;
 st553:
 	if ( ++p == pe )
 		goto _test_eof553;
 case 553:
 	switch( (*p) ) {
-		case 32: goto tr1645;
-		case 59: goto tr1645;
+		case 32: goto tr1646;
+		case 59: goto tr1646;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1645;
+			goto tr1646;
 	} else if ( (*p) >= 9 )
-		goto tr1645;
+		goto tr1646;
 	goto tr1559;
 st554:
 	if ( ++p == pe )
 		goto _test_eof554;
 case 554:
 	switch( (*p) ) {
-		case 72: goto st555;
-		case 104: goto st555;
+		case 73: goto st555;
+		case 105: goto st555;
 	}
 	goto tr1559;
 st555:
@@ -45724,8 +45739,8 @@ st555:
 		goto _test_eof555;
 case 555:
 	switch( (*p) ) {
-		case 65: goto st556;
-		case 97: goto st556;
+		case 68: goto st556;
+		case 100: goto st556;
 	}
 	goto tr1559;
 st556:
@@ -45733,33 +45748,31 @@ st556:
 		goto _test_eof556;
 case 556:
 	switch( (*p) ) {
-		case 49: goto st557;
-		case 50: goto st569;
-		case 53: goto st572;
+		case 32: goto tr1649;
+		case 59: goto tr1649;
 	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1649;
+	} else if ( (*p) >= 9 )
+		goto tr1649;
 	goto tr1559;
 st557:
 	if ( ++p == pe )
 		goto _test_eof557;
 case 557:
 	switch( (*p) ) {
-		case 32: goto tr1651;
-		case 45: goto st558;
-		case 59: goto tr1651;
+		case 83: goto st558;
+		case 115: goto st558;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1651;
-	} else if ( (*p) >= 9 )
-		goto tr1651;
 	goto tr1559;
 st558:
 	if ( ++p == pe )
 		goto _test_eof558;
 case 558:
 	switch( (*p) ) {
-		case 78: goto st559;
-		case 110: goto st559;
+		case 65: goto st559;
+		case 97: goto st559;
 	}
 	goto tr1559;
 st559:
@@ -45767,8 +45780,10 @@ st559:
 		goto _test_eof559;
 case 559:
 	switch( (*p) ) {
-		case 83: goto st560;
-		case 115: goto st560;
+		case 77: goto st560;
+		case 83: goto st563;
+		case 109: goto st560;
+		case 115: goto st563;
 	}
 	goto tr1559;
 st560:
@@ -45776,40 +45791,47 @@ st560:
 		goto _test_eof560;
 case 560:
 	switch( (*p) ) {
-		case 69: goto st561;
-		case 101: goto st561;
+		case 68: goto st561;
+		case 100: goto st561;
 	}
 	goto tr1559;
 st561:
 	if ( ++p == pe )
 		goto _test_eof561;
 case 561:
-	switch( (*p) ) {
-		case 67: goto st562;
-		case 99: goto st562;
-	}
+	if ( (*p) == 53 )
+		goto st562;
 	goto tr1559;
 st562:
 	if ( ++p == pe )
 		goto _test_eof562;
 case 562:
-	if ( (*p) == 51 )
-		goto st563;
+	switch( (*p) ) {
+		case 32: goto tr1656;
+		case 59: goto tr1656;
+	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1656;
+	} else if ( (*p) >= 9 )
+		goto tr1656;
 	goto tr1559;
 st563:
 	if ( ++p == pe )
 		goto _test_eof563;
 case 563:
-	if ( (*p) == 45 )
-		goto st564;
+	switch( (*p) ) {
+		case 72: goto st564;
+		case 104: goto st564;
+	}
 	goto tr1559;
 st564:
 	if ( ++p == pe )
 		goto _test_eof564;
 case 564:
 	switch( (*p) ) {
-		case 83: goto st565;
-		case 115: goto st565;
+		case 65: goto st565;
+		case 97: goto st565;
 	}
 	goto tr1559;
 st565:
@@ -45817,8 +45839,9 @@ st565:
 		goto _test_eof565;
 case 565:
 	switch( (*p) ) {
-		case 72: goto st566;
-		case 104: goto st566;
+		case 49: goto st566;
+		case 50: goto st578;
+		case 53: goto st581;
 	}
 	goto tr1559;
 st566:
@@ -45826,109 +45849,192 @@ st566:
 		goto _test_eof566;
 case 566:
 	switch( (*p) ) {
-		case 65: goto st567;
-		case 97: goto st567;
+		case 32: goto tr1662;
+		case 45: goto st567;
+		case 59: goto tr1662;
 	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1662;
+	} else if ( (*p) >= 9 )
+		goto tr1662;
 	goto tr1559;
 st567:
 	if ( ++p == pe )
 		goto _test_eof567;
 case 567:
-	if ( (*p) == 49 )
-		goto st568;
+	switch( (*p) ) {
+		case 78: goto st568;
+		case 110: goto st568;
+	}
 	goto tr1559;
 st568:
 	if ( ++p == pe )
 		goto _test_eof568;
 case 568:
 	switch( (*p) ) {
-		case 32: goto tr1663;
-		case 59: goto tr1663;
+		case 83: goto st569;
+		case 115: goto st569;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1663;
-	} else if ( (*p) >= 9 )
-		goto tr1663;
 	goto tr1559;
 st569:
 	if ( ++p == pe )
 		goto _test_eof569;
 case 569:
-	if ( (*p) == 53 )
-		goto st570;
+	switch( (*p) ) {
+		case 69: goto st570;
+		case 101: goto st570;
+	}
 	goto tr1559;
 st570:
 	if ( ++p == pe )
 		goto _test_eof570;
 case 570:
-	if ( (*p) == 54 )
-		goto st571;
+	switch( (*p) ) {
+		case 67: goto st571;
+		case 99: goto st571;
+	}
 	goto tr1559;
 st571:
 	if ( ++p == pe )
 		goto _test_eof571;
 case 571:
-	switch( (*p) ) {
-		case 32: goto tr1666;
-		case 59: goto tr1666;
-	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1666;
-	} else if ( (*p) >= 9 )
-		goto tr1666;
+	if ( (*p) == 51 )
+		goto st572;
 	goto tr1559;
 st572:
 	if ( ++p == pe )
 		goto _test_eof572;
 case 572:
-	if ( (*p) == 49 )
+	if ( (*p) == 45 )
 		goto st573;
 	goto tr1559;
 st573:
 	if ( ++p == pe )
 		goto _test_eof573;
 case 573:
-	if ( (*p) == 50 )
-		goto st574;
+	switch( (*p) ) {
+		case 83: goto st574;
+		case 115: goto st574;
+	}
 	goto tr1559;
 st574:
 	if ( ++p == pe )
 		goto _test_eof574;
 case 574:
 	switch( (*p) ) {
-		case 32: goto tr1669;
-		case 59: goto tr1669;
+		case 72: goto st575;
+		case 104: goto st575;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1669;
-	} else if ( (*p) >= 9 )
-		goto tr1669;
 	goto tr1559;
 st575:
 	if ( ++p == pe )
 		goto _test_eof575;
 case 575:
 	switch( (*p) ) {
-		case 65: goto st577;
-		case 73: goto st583;
-		case 79: goto st600;
-		case 80: goto st603;
-		case 83: goto st609;
-		case 85: goto st613;
-		case 97: goto st577;
-		case 105: goto st583;
-		case 111: goto st600;
-		case 112: goto st603;
-		case 115: goto st609;
-		case 117: goto st613;
+		case 65: goto st576;
+		case 97: goto st576;
+	}
+	goto tr1559;
+st576:
+	if ( ++p == pe )
+		goto _test_eof576;
+case 576:
+	if ( (*p) == 49 )
+		goto st577;
+	goto tr1559;
+st577:
+	if ( ++p == pe )
+		goto _test_eof577;
+case 577:
+	switch( (*p) ) {
+		case 32: goto tr1674;
+		case 59: goto tr1674;
+	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1674;
+	} else if ( (*p) >= 9 )
+		goto tr1674;
+	goto tr1559;
+st578:
+	if ( ++p == pe )
+		goto _test_eof578;
+case 578:
+	if ( (*p) == 53 )
+		goto st579;
+	goto tr1559;
+st579:
+	if ( ++p == pe )
+		goto _test_eof579;
+case 579:
+	if ( (*p) == 54 )
+		goto st580;
+	goto tr1559;
+st580:
+	if ( ++p == pe )
+		goto _test_eof580;
+case 580:
+	switch( (*p) ) {
+		case 32: goto tr1677;
+		case 59: goto tr1677;
+	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1677;
+	} else if ( (*p) >= 9 )
+		goto tr1677;
+	goto tr1559;
+st581:
+	if ( ++p == pe )
+		goto _test_eof581;
+case 581:
+	if ( (*p) == 49 )
+		goto st582;
+	goto tr1559;
+st582:
+	if ( ++p == pe )
+		goto _test_eof582;
+case 582:
+	if ( (*p) == 50 )
+		goto st583;
+	goto tr1559;
+st583:
+	if ( ++p == pe )
+		goto _test_eof583;
+case 583:
+	switch( (*p) ) {
+		case 32: goto tr1680;
+		case 59: goto tr1680;
+	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1680;
+	} else if ( (*p) >= 9 )
+		goto tr1680;
+	goto tr1559;
+st584:
+	if ( ++p == pe )
+		goto _test_eof584;
+case 584:
+	switch( (*p) ) {
+		case 65: goto st586;
+		case 73: goto st592;
+		case 79: goto st609;
+		case 80: goto st612;
+		case 83: goto st618;
+		case 85: goto st622;
+		case 97: goto st586;
+		case 105: goto st592;
+		case 111: goto st609;
+		case 112: goto st612;
+		case 115: goto st618;
+		case 117: goto st622;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1671;
-	goto tr1670;
-tr1671:
+		goto tr1682;
+	goto tr1681;
+tr1682:
 	{
 		s->number64 = 0;
 	}
@@ -45946,8 +46052,8 @@ tr1671:
 			p--; {goto st261;}
 		}
 	}
-	goto st576;
-tr1679:
+	goto st585;
+tr1690:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -45962,25 +46068,25 @@ tr1679:
 			p--; {goto st261;}
 		}
 	}
-	goto st576;
-st576:
+	goto st585;
+st585:
 	if ( ++p == pe )
-		goto _test_eof576;
-case 576:
+		goto _test_eof585;
+case 585:
 	switch( (*p) ) {
-		case 32: goto tr1678;
-		case 59: goto tr1678;
+		case 32: goto tr1689;
+		case 59: goto tr1689;
 	}
 	if ( (*p) < 40 ) {
 		if ( 9 <= (*p) && (*p) <= 10 )
-			goto tr1678;
+			goto tr1689;
 	} else if ( (*p) > 41 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr1679;
+			goto tr1690;
 	} else
-		goto tr1678;
-	goto tr1670;
-tr1678:
+		goto tr1689;
+	goto tr1681;
+tr1689:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -45993,8 +46099,8 @@ tr1678:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1685:
+	goto st1153;
+tr1696:
 	{
 		*((uint16_t *)rdata_tail) = htons(7);
 		rdata_tail += 2;
@@ -46002,8 +46108,8 @@ tr1685:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1694:
+	goto st1153;
+tr1705:
 	{
 		*((uint16_t *)rdata_tail) = htons(8);
 		rdata_tail += 2;
@@ -46011,8 +46117,8 @@ tr1694:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1698:
+	goto st1153;
+tr1709:
 	{
 		*((uint16_t *)rdata_tail) = htons(6);
 		rdata_tail += 2;
@@ -46020,8 +46126,8 @@ tr1698:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1701:
+	goto st1153;
+tr1712:
 	{
 		*((uint16_t *)rdata_tail) = htons(4);
 		rdata_tail += 2;
@@ -46029,8 +46135,8 @@ tr1701:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1705:
+	goto st1153;
+tr1716:
 	{
 		*((uint16_t *)rdata_tail) = htons(5);
 		rdata_tail += 2;
@@ -46038,8 +46144,8 @@ tr1705:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1708:
+	goto st1153;
+tr1719:
 	{
 		*((uint16_t *)rdata_tail) = htons(254);
 		rdata_tail += 2;
@@ -46047,8 +46153,8 @@ tr1708:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1712:
+	goto st1153;
+tr1723:
 	{
 		*((uint16_t *)rdata_tail) = htons(3);
 		rdata_tail += 2;
@@ -46056,8 +46162,8 @@ tr1712:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1715:
+	goto st1153;
+tr1726:
 	{
 		*((uint16_t *)rdata_tail) = htons(1);
 		rdata_tail += 2;
@@ -46065,8 +46171,8 @@ tr1715:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1719:
+	goto st1153;
+tr1730:
 	{
 		*((uint16_t *)rdata_tail) = htons(2);
 		rdata_tail += 2;
@@ -46074,8 +46180,8 @@ tr1719:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-tr1722:
+	goto st1153;
+tr1733:
 	{
 		*((uint16_t *)rdata_tail) = htons(253);
 		rdata_tail += 2;
@@ -46083,240 +46189,133 @@ tr1722:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1144;
-st1144:
+	goto st1153;
+st1153:
 	if ( ++p == pe )
-		goto _test_eof1144;
-case 1144:
+		goto _test_eof1153;
+case 1153:
 	goto st0;
-st577:
-	if ( ++p == pe )
-		goto _test_eof577;
-case 577:
-	switch( (*p) ) {
-		case 67: goto st578;
-		case 99: goto st578;
-	}
-	goto tr1670;
-st578:
-	if ( ++p == pe )
-		goto _test_eof578;
-case 578:
-	switch( (*p) ) {
-		case 80: goto st579;
-		case 112: goto st579;
-	}
-	goto tr1670;
-st579:
-	if ( ++p == pe )
-		goto _test_eof579;
-case 579:
-	switch( (*p) ) {
-		case 75: goto st580;
-		case 107: goto st580;
-	}
-	goto tr1670;
-st580:
-	if ( ++p == pe )
-		goto _test_eof580;
-case 580:
-	switch( (*p) ) {
-		case 73: goto st581;
-		case 105: goto st581;
-	}
-	goto tr1670;
-st581:
-	if ( ++p == pe )
-		goto _test_eof581;
-case 581:
-	switch( (*p) ) {
-		case 88: goto st582;
-		case 120: goto st582;
-	}
-	goto tr1670;
-st582:
-	if ( ++p == pe )
-		goto _test_eof582;
-case 582:
-	switch( (*p) ) {
-		case 32: goto tr1685;
-		case 59: goto tr1685;
-	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1685;
-	} else if ( (*p) >= 9 )
-		goto tr1685;
-	goto tr1670;
-st583:
-	if ( ++p == pe )
-		goto _test_eof583;
-case 583:
-	switch( (*p) ) {
-		case 65: goto st584;
-		case 80: goto st590;
-		case 83: goto st596;
-		case 97: goto st584;
-		case 112: goto st590;
-		case 115: goto st596;
-	}
-	goto tr1670;
-st584:
-	if ( ++p == pe )
-		goto _test_eof584;
-case 584:
-	switch( (*p) ) {
-		case 67: goto st585;
-		case 99: goto st585;
-	}
-	goto tr1670;
-st585:
-	if ( ++p == pe )
-		goto _test_eof585;
-case 585:
-	switch( (*p) ) {
-		case 80: goto st586;
-		case 112: goto st586;
-	}
-	goto tr1670;
 st586:
 	if ( ++p == pe )
 		goto _test_eof586;
 case 586:
 	switch( (*p) ) {
-		case 75: goto st587;
-		case 107: goto st587;
+		case 67: goto st587;
+		case 99: goto st587;
 	}
-	goto tr1670;
+	goto tr1681;
 st587:
 	if ( ++p == pe )
 		goto _test_eof587;
 case 587:
 	switch( (*p) ) {
-		case 73: goto st588;
-		case 105: goto st588;
+		case 80: goto st588;
+		case 112: goto st588;
 	}
-	goto tr1670;
+	goto tr1681;
 st588:
 	if ( ++p == pe )
 		goto _test_eof588;
 case 588:
 	switch( (*p) ) {
-		case 88: goto st589;
-		case 120: goto st589;
+		case 75: goto st589;
+		case 107: goto st589;
 	}
-	goto tr1670;
+	goto tr1681;
 st589:
 	if ( ++p == pe )
 		goto _test_eof589;
 case 589:
 	switch( (*p) ) {
-		case 32: goto tr1694;
-		case 59: goto tr1694;
+		case 73: goto st590;
+		case 105: goto st590;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1694;
-	} else if ( (*p) >= 9 )
-		goto tr1694;
-	goto tr1670;
+	goto tr1681;
 st590:
 	if ( ++p == pe )
 		goto _test_eof590;
 case 590:
 	switch( (*p) ) {
-		case 71: goto st591;
-		case 75: goto st593;
-		case 103: goto st591;
-		case 107: goto st593;
+		case 88: goto st591;
+		case 120: goto st591;
 	}
-	goto tr1670;
+	goto tr1681;
 st591:
 	if ( ++p == pe )
 		goto _test_eof591;
 case 591:
 	switch( (*p) ) {
-		case 80: goto st592;
-		case 112: goto st592;
+		case 32: goto tr1696;
+		case 59: goto tr1696;
 	}
-	goto tr1670;
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1696;
+	} else if ( (*p) >= 9 )
+		goto tr1696;
+	goto tr1681;
 st592:
 	if ( ++p == pe )
 		goto _test_eof592;
 case 592:
 	switch( (*p) ) {
-		case 32: goto tr1698;
-		case 59: goto tr1698;
-	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1698;
-	} else if ( (*p) >= 9 )
-		goto tr1698;
-	goto tr1670;
+		case 65: goto st593;
+		case 80: goto st599;
+		case 83: goto st605;
+		case 97: goto st593;
+		case 112: goto st599;
+		case 115: goto st605;
+	}
+	goto tr1681;
 st593:
 	if ( ++p == pe )
 		goto _test_eof593;
 case 593:
 	switch( (*p) ) {
-		case 73: goto st594;
-		case 105: goto st594;
+		case 67: goto st594;
+		case 99: goto st594;
 	}
-	goto tr1670;
+	goto tr1681;
 st594:
 	if ( ++p == pe )
 		goto _test_eof594;
 case 594:
 	switch( (*p) ) {
-		case 88: goto st595;
-		case 120: goto st595;
+		case 80: goto st595;
+		case 112: goto st595;
 	}
-	goto tr1670;
+	goto tr1681;
 st595:
 	if ( ++p == pe )
 		goto _test_eof595;
 case 595:
 	switch( (*p) ) {
-		case 32: goto tr1701;
-		case 59: goto tr1701;
+		case 75: goto st596;
+		case 107: goto st596;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1701;
-	} else if ( (*p) >= 9 )
-		goto tr1701;
-	goto tr1670;
+	goto tr1681;
 st596:
 	if ( ++p == pe )
 		goto _test_eof596;
 case 596:
 	switch( (*p) ) {
-		case 80: goto st597;
-		case 112: goto st597;
+		case 73: goto st597;
+		case 105: goto st597;
 	}
-	goto tr1670;
+	goto tr1681;
 st597:
 	if ( ++p == pe )
 		goto _test_eof597;
 case 597:
 	switch( (*p) ) {
-		case 75: goto st598;
-		case 107: goto st598;
+		case 88: goto st598;
+		case 120: goto st598;
 	}
-	goto tr1670;
+	goto tr1681;
 st598:
 	if ( ++p == pe )
 		goto _test_eof598;
 case 598:
-	switch( (*p) ) {
-		case 73: goto st599;
-		case 105: goto st599;
-	}
-	goto tr1670;
-st599:
-	if ( ++p == pe )
-		goto _test_eof599;
-case 599:
 	switch( (*p) ) {
 		case 32: goto tr1705;
 		case 59: goto tr1705;
@@ -46326,63 +46325,63 @@ case 599:
 			goto tr1705;
 	} else if ( (*p) >= 9 )
 		goto tr1705;
-	goto tr1670;
+	goto tr1681;
+st599:
+	if ( ++p == pe )
+		goto _test_eof599;
+case 599:
+	switch( (*p) ) {
+		case 71: goto st600;
+		case 75: goto st602;
+		case 103: goto st600;
+		case 107: goto st602;
+	}
+	goto tr1681;
 st600:
 	if ( ++p == pe )
 		goto _test_eof600;
 case 600:
 	switch( (*p) ) {
-		case 73: goto st601;
-		case 105: goto st601;
+		case 80: goto st601;
+		case 112: goto st601;
 	}
-	goto tr1670;
+	goto tr1681;
 st601:
 	if ( ++p == pe )
 		goto _test_eof601;
 case 601:
 	switch( (*p) ) {
-		case 68: goto st602;
-		case 100: goto st602;
+		case 32: goto tr1709;
+		case 59: goto tr1709;
 	}
-	goto tr1670;
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1709;
+	} else if ( (*p) >= 9 )
+		goto tr1709;
+	goto tr1681;
 st602:
 	if ( ++p == pe )
 		goto _test_eof602;
 case 602:
 	switch( (*p) ) {
-		case 32: goto tr1708;
-		case 59: goto tr1708;
+		case 73: goto st603;
+		case 105: goto st603;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1708;
-	} else if ( (*p) >= 9 )
-		goto tr1708;
-	goto tr1670;
+	goto tr1681;
 st603:
 	if ( ++p == pe )
 		goto _test_eof603;
 case 603:
 	switch( (*p) ) {
-		case 71: goto st604;
-		case 75: goto st606;
-		case 103: goto st604;
-		case 107: goto st606;
+		case 88: goto st604;
+		case 120: goto st604;
 	}
-	goto tr1670;
+	goto tr1681;
 st604:
 	if ( ++p == pe )
 		goto _test_eof604;
 case 604:
-	switch( (*p) ) {
-		case 80: goto st605;
-		case 112: goto st605;
-	}
-	goto tr1670;
-st605:
-	if ( ++p == pe )
-		goto _test_eof605;
-case 605:
 	switch( (*p) ) {
 		case 32: goto tr1712;
 		case 59: goto tr1712;
@@ -46392,70 +46391,70 @@ case 605:
 			goto tr1712;
 	} else if ( (*p) >= 9 )
 		goto tr1712;
-	goto tr1670;
+	goto tr1681;
+st605:
+	if ( ++p == pe )
+		goto _test_eof605;
+case 605:
+	switch( (*p) ) {
+		case 80: goto st606;
+		case 112: goto st606;
+	}
+	goto tr1681;
 st606:
 	if ( ++p == pe )
 		goto _test_eof606;
 case 606:
 	switch( (*p) ) {
-		case 73: goto st607;
-		case 105: goto st607;
+		case 75: goto st607;
+		case 107: goto st607;
 	}
-	goto tr1670;
+	goto tr1681;
 st607:
 	if ( ++p == pe )
 		goto _test_eof607;
 case 607:
 	switch( (*p) ) {
-		case 88: goto st608;
-		case 120: goto st608;
+		case 73: goto st608;
+		case 105: goto st608;
 	}
-	goto tr1670;
+	goto tr1681;
 st608:
 	if ( ++p == pe )
 		goto _test_eof608;
 case 608:
 	switch( (*p) ) {
-		case 32: goto tr1715;
-		case 59: goto tr1715;
+		case 32: goto tr1716;
+		case 59: goto tr1716;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1715;
+			goto tr1716;
 	} else if ( (*p) >= 9 )
-		goto tr1715;
-	goto tr1670;
+		goto tr1716;
+	goto tr1681;
 st609:
 	if ( ++p == pe )
 		goto _test_eof609;
 case 609:
 	switch( (*p) ) {
-		case 80: goto st610;
-		case 112: goto st610;
+		case 73: goto st610;
+		case 105: goto st610;
 	}
-	goto tr1670;
+	goto tr1681;
 st610:
 	if ( ++p == pe )
 		goto _test_eof610;
 case 610:
 	switch( (*p) ) {
-		case 75: goto st611;
-		case 107: goto st611;
+		case 68: goto st611;
+		case 100: goto st611;
 	}
-	goto tr1670;
+	goto tr1681;
 st611:
 	if ( ++p == pe )
 		goto _test_eof611;
 case 611:
-	switch( (*p) ) {
-		case 73: goto st612;
-		case 105: goto st612;
-	}
-	goto tr1670;
-st612:
-	if ( ++p == pe )
-		goto _test_eof612;
-case 612:
 	switch( (*p) ) {
 		case 32: goto tr1719;
 		case 59: goto tr1719;
@@ -46465,49 +46464,156 @@ case 612:
 			goto tr1719;
 	} else if ( (*p) >= 9 )
 		goto tr1719;
-	goto tr1670;
+	goto tr1681;
+st612:
+	if ( ++p == pe )
+		goto _test_eof612;
+case 612:
+	switch( (*p) ) {
+		case 71: goto st613;
+		case 75: goto st615;
+		case 103: goto st613;
+		case 107: goto st615;
+	}
+	goto tr1681;
 st613:
 	if ( ++p == pe )
 		goto _test_eof613;
 case 613:
 	switch( (*p) ) {
-		case 82: goto st614;
-		case 114: goto st614;
+		case 80: goto st614;
+		case 112: goto st614;
 	}
-	goto tr1670;
+	goto tr1681;
 st614:
 	if ( ++p == pe )
 		goto _test_eof614;
 case 614:
 	switch( (*p) ) {
-		case 73: goto st615;
-		case 105: goto st615;
+		case 32: goto tr1723;
+		case 59: goto tr1723;
 	}
-	goto tr1670;
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1723;
+	} else if ( (*p) >= 9 )
+		goto tr1723;
+	goto tr1681;
 st615:
 	if ( ++p == pe )
 		goto _test_eof615;
 case 615:
 	switch( (*p) ) {
-		case 32: goto tr1722;
-		case 59: goto tr1722;
+		case 73: goto st616;
+		case 105: goto st616;
 	}
-	if ( (*p) > 10 ) {
-		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1722;
-	} else if ( (*p) >= 9 )
-		goto tr1722;
-	goto tr1670;
+	goto tr1681;
 st616:
 	if ( ++p == pe )
 		goto _test_eof616;
 case 616:
+	switch( (*p) ) {
+		case 88: goto st617;
+		case 120: goto st617;
+	}
+	goto tr1681;
+st617:
+	if ( ++p == pe )
+		goto _test_eof617;
+case 617:
+	switch( (*p) ) {
+		case 32: goto tr1726;
+		case 59: goto tr1726;
+	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1726;
+	} else if ( (*p) >= 9 )
+		goto tr1726;
+	goto tr1681;
+st618:
+	if ( ++p == pe )
+		goto _test_eof618;
+case 618:
+	switch( (*p) ) {
+		case 80: goto st619;
+		case 112: goto st619;
+	}
+	goto tr1681;
+st619:
+	if ( ++p == pe )
+		goto _test_eof619;
+case 619:
+	switch( (*p) ) {
+		case 75: goto st620;
+		case 107: goto st620;
+	}
+	goto tr1681;
+st620:
+	if ( ++p == pe )
+		goto _test_eof620;
+case 620:
+	switch( (*p) ) {
+		case 73: goto st621;
+		case 105: goto st621;
+	}
+	goto tr1681;
+st621:
+	if ( ++p == pe )
+		goto _test_eof621;
+case 621:
+	switch( (*p) ) {
+		case 32: goto tr1730;
+		case 59: goto tr1730;
+	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1730;
+	} else if ( (*p) >= 9 )
+		goto tr1730;
+	goto tr1681;
+st622:
+	if ( ++p == pe )
+		goto _test_eof622;
+case 622:
+	switch( (*p) ) {
+		case 82: goto st623;
+		case 114: goto st623;
+	}
+	goto tr1681;
+st623:
+	if ( ++p == pe )
+		goto _test_eof623;
+case 623:
+	switch( (*p) ) {
+		case 73: goto st624;
+		case 105: goto st624;
+	}
+	goto tr1681;
+st624:
+	if ( ++p == pe )
+		goto _test_eof624;
+case 624:
+	switch( (*p) ) {
+		case 32: goto tr1733;
+		case 59: goto tr1733;
+	}
+	if ( (*p) > 10 ) {
+		if ( 40 <= (*p) && (*p) <= 41 )
+			goto tr1733;
+	} else if ( (*p) >= 9 )
+		goto tr1733;
+	goto tr1681;
+st625:
+	if ( ++p == pe )
+		goto _test_eof625;
+case 625:
 	if ( (*p) == 46 )
-		goto tr1724;
+		goto tr1735;
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1724;
-	goto tr1723;
-tr1724:
+		goto tr1735;
+	goto tr1734;
+tr1735:
 	{
 		s->buffer_length = 0;
 	}
@@ -46520,8 +46626,8 @@ tr1724:
 			p--; {goto st261;}
 		}
 	}
-	goto st617;
-tr1726:
+	goto st626;
+tr1737:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -46531,26 +46637,26 @@ tr1726:
 			p--; {goto st261;}
 		}
 	}
-	goto st617;
-st617:
+	goto st626;
+st626:
 	if ( ++p == pe )
-		goto _test_eof617;
-case 617:
+		goto _test_eof626;
+case 626:
 	switch( (*p) ) {
-		case 32: goto tr1725;
-		case 46: goto tr1726;
-		case 59: goto tr1725;
+		case 32: goto tr1736;
+		case 46: goto tr1737;
+		case 59: goto tr1736;
 	}
 	if ( (*p) < 40 ) {
 		if ( 9 <= (*p) && (*p) <= 10 )
-			goto tr1725;
+			goto tr1736;
 	} else if ( (*p) > 41 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr1726;
+			goto tr1737;
 	} else
-		goto tr1725;
-	goto tr1723;
-tr1725:
+		goto tr1736;
+	goto tr1734;
+tr1736:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -46566,91 +46672,91 @@ tr1725:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1145;
-st1145:
+	goto st1154;
+st1154:
 	if ( ++p == pe )
-		goto _test_eof1145;
-case 1145:
+		goto _test_eof1154;
+case 1154:
 	goto st0;
-st618:
+st627:
 	if ( ++p == pe )
-		goto _test_eof618;
-case 618:
+		goto _test_eof627;
+case 627:
 	switch( (*p) ) {
-		case 42: goto tr1727;
-		case 92: goto tr1727;
-		case 95: goto tr1727;
+		case 42: goto tr1738;
+		case 92: goto tr1738;
+		case 95: goto tr1738;
 	}
 	if ( (*p) < 64 ) {
 		if ( 45 <= (*p) && (*p) <= 57 )
-			goto tr1727;
+			goto tr1738;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr1727;
+			goto tr1738;
 	} else
-		goto tr1727;
+		goto tr1738;
 	goto tr71;
-tr1727:
+tr1738:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 619; goto st263;} }
-	goto st619;
-st619:
+	{ p--; {stack[top++] = 628; goto st263;} }
+	goto st628;
+st628:
 	if ( ++p == pe )
-		goto _test_eof619;
-case 619:
+		goto _test_eof628;
+case 628:
 	switch( (*p) ) {
-		case 32: goto tr1728;
-		case 59: goto tr1728;
+		case 32: goto tr1739;
+		case 59: goto tr1739;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1728;
+			goto tr1739;
 	} else if ( (*p) >= 9 )
-		goto tr1728;
+		goto tr1739;
 	goto tr71;
-tr1728:
+tr1739:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1146;
-st1146:
+	goto st1155;
+st1155:
 	if ( ++p == pe )
-		goto _test_eof1146;
-case 1146:
+		goto _test_eof1155;
+case 1155:
 	goto st0;
-st620:
+st629:
 	if ( ++p == pe )
-		goto _test_eof620;
-case 620:
+		goto _test_eof629;
+case 629:
 	switch( (*p) ) {
-		case 42: goto tr1729;
-		case 92: goto tr1729;
-		case 95: goto tr1729;
+		case 42: goto tr1740;
+		case 92: goto tr1740;
+		case 95: goto tr1740;
 	}
 	if ( (*p) < 64 ) {
 		if ( 45 <= (*p) && (*p) <= 57 )
-			goto tr1729;
+			goto tr1740;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr1729;
+			goto tr1740;
 	} else
-		goto tr1729;
+		goto tr1740;
 	goto tr71;
-tr1729:
+tr1740:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 621; goto st263;} }
-	goto st621;
-st621:
+	{ p--; {stack[top++] = 630; goto st263;} }
+	goto st630;
+st630:
 	if ( ++p == pe )
-		goto _test_eof621;
-case 621:
+		goto _test_eof630;
+case 630:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -46664,15 +46770,15 @@ case 621:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1730;
-		case 32: goto tr1730;
-		case 40: goto tr1731;
-		case 41: goto tr1732;
-		case 1034: goto tr1733;
-		case 1083: goto tr1734;
+		case 9: goto tr1741;
+		case 32: goto tr1741;
+		case 40: goto tr1742;
+		case 41: goto tr1743;
+		case 1034: goto tr1744;
+		case 1083: goto tr1745;
 	}
 	goto tr71;
-tr1736:
+tr1747:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -46680,8 +46786,8 @@ tr1736:
 		}
 		s->multiline = true;
 	}
-	goto st622;
-tr1737:
+	goto st631;
+tr1748:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -46689,18 +46795,18 @@ tr1737:
 		}
 		s->multiline = false;
 	}
-	goto st622;
-tr1739:
+	goto st631;
+tr1750:
 	{
 		s->line_counter++;
 	}
-	goto st622;
-tr1730:
+	goto st631;
+tr1741:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st622;
-tr1731:
+	goto st631;
+tr1742:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -46711,8 +46817,8 @@ tr1731:
 		}
 		s->multiline = true;
 	}
-	goto st622;
-tr1732:
+	goto st631;
+tr1743:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -46723,19 +46829,19 @@ tr1732:
 		}
 		s->multiline = false;
 	}
-	goto st622;
-tr1733:
+	goto st631;
+tr1744:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st622;
-st622:
+	goto st631;
+st631:
 	if ( ++p == pe )
-		goto _test_eof622;
-case 622:
+		goto _test_eof631;
+case 631:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -46749,35 +46855,35 @@ case 622:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st622;
-		case 32: goto st622;
-		case 40: goto tr1736;
-		case 41: goto tr1737;
-		case 42: goto tr1738;
-		case 92: goto tr1738;
-		case 95: goto tr1738;
-		case 1034: goto tr1739;
-		case 1083: goto st651;
+		case 9: goto st631;
+		case 32: goto st631;
+		case 40: goto tr1747;
+		case 41: goto tr1748;
+		case 42: goto tr1749;
+		case 92: goto tr1749;
+		case 95: goto tr1749;
+		case 1034: goto tr1750;
+		case 1083: goto st660;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr1738;
+			goto tr1749;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr1738;
+			goto tr1749;
 	} else
-		goto tr1738;
+		goto tr1749;
 	goto tr71;
-tr1738:
+tr1749:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 623; goto st263;} }
-	goto st623;
-st623:
+	{ p--; {stack[top++] = 632; goto st263;} }
+	goto st632;
+st632:
 	if ( ++p == pe )
-		goto _test_eof623;
-case 623:
+		goto _test_eof632;
+case 632:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -46791,15 +46897,15 @@ case 623:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1741;
-		case 32: goto tr1741;
-		case 40: goto tr1742;
-		case 41: goto tr1743;
-		case 1034: goto tr1744;
-		case 1083: goto tr1745;
+		case 9: goto tr1752;
+		case 32: goto tr1752;
+		case 40: goto tr1753;
+		case 41: goto tr1754;
+		case 1034: goto tr1755;
+		case 1083: goto tr1756;
 	}
 	goto tr71;
-tr1748:
+tr1759:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -46807,8 +46913,8 @@ tr1748:
 		}
 		s->multiline = true;
 	}
-	goto st624;
-tr1749:
+	goto st633;
+tr1760:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -46816,18 +46922,18 @@ tr1749:
 		}
 		s->multiline = false;
 	}
-	goto st624;
-tr1751:
+	goto st633;
+tr1762:
 	{
 		s->line_counter++;
 	}
-	goto st624;
-tr1741:
+	goto st633;
+tr1752:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st624;
-tr1742:
+	goto st633;
+tr1753:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -46838,8 +46944,8 @@ tr1742:
 		}
 		s->multiline = true;
 	}
-	goto st624;
-tr1743:
+	goto st633;
+tr1754:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -46850,19 +46956,19 @@ tr1743:
 		}
 		s->multiline = false;
 	}
-	goto st624;
-tr1744:
+	goto st633;
+tr1755:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st624;
-st624:
+	goto st633;
+st633:
 	if ( ++p == pe )
-		goto _test_eof624;
-case 624:
+		goto _test_eof633;
+case 633:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -46876,17 +46982,17 @@ case 624:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st624;
-		case 32: goto st624;
-		case 40: goto tr1748;
-		case 41: goto tr1749;
-		case 1034: goto tr1751;
-		case 1083: goto st650;
+		case 9: goto st633;
+		case 32: goto st633;
+		case 40: goto tr1759;
+		case 41: goto tr1760;
+		case 1034: goto tr1762;
+		case 1083: goto st659;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1750;
-	goto tr1746;
-tr1750:
+		goto tr1761;
+	goto tr1757;
+tr1761:
 	{
 		s->number64 = 0;
 	}
@@ -46904,8 +47010,8 @@ tr1750:
 			p--; {goto st261;}
 		}
 	}
-	goto st625;
-tr1756:
+	goto st634;
+tr1767:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -46920,11 +47026,11 @@ tr1756:
 			p--; {goto st261;}
 		}
 	}
-	goto st625;
-st625:
+	goto st634;
+st634:
 	if ( ++p == pe )
-		goto _test_eof625;
-case 625:
+		goto _test_eof634;
+case 634:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -46938,17 +47044,17 @@ case 625:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1753;
-		case 32: goto tr1753;
-		case 40: goto tr1754;
-		case 41: goto tr1755;
-		case 1034: goto tr1757;
-		case 1083: goto tr1758;
+		case 9: goto tr1764;
+		case 32: goto tr1764;
+		case 40: goto tr1765;
+		case 41: goto tr1766;
+		case 1034: goto tr1768;
+		case 1083: goto tr1769;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1756;
-	goto tr1746;
-tr1760:
+		goto tr1767;
+	goto tr1757;
+tr1771:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -46956,8 +47062,8 @@ tr1760:
 		}
 		s->multiline = true;
 	}
-	goto st626;
-tr1761:
+	goto st635;
+tr1772:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -46965,13 +47071,13 @@ tr1761:
 		}
 		s->multiline = false;
 	}
-	goto st626;
-tr1763:
+	goto st635;
+tr1774:
 	{
 		s->line_counter++;
 	}
-	goto st626;
-tr1753:
+	goto st635;
+tr1764:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -46981,8 +47087,8 @@ tr1753:
 			p--; {goto st261;}
 		}
 	}
-	goto st626;
-tr1754:
+	goto st635;
+tr1765:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -46999,8 +47105,8 @@ tr1754:
 		}
 		s->multiline = true;
 	}
-	goto st626;
-tr1755:
+	goto st635;
+tr1766:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47017,8 +47123,8 @@ tr1755:
 		}
 		s->multiline = false;
 	}
-	goto st626;
-tr1757:
+	goto st635;
+tr1768:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47031,11 +47137,11 @@ tr1757:
 	{
 		s->line_counter++;
 	}
-	goto st626;
-st626:
+	goto st635;
+st635:
 	if ( ++p == pe )
-		goto _test_eof626;
-case 626:
+		goto _test_eof635;
+case 635:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -47049,17 +47155,17 @@ case 626:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st626;
-		case 32: goto st626;
-		case 40: goto tr1760;
-		case 41: goto tr1761;
-		case 1034: goto tr1763;
-		case 1083: goto st649;
+		case 9: goto st635;
+		case 32: goto st635;
+		case 40: goto tr1771;
+		case 41: goto tr1772;
+		case 1034: goto tr1774;
+		case 1083: goto st658;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1762;
-	goto tr1746;
-tr1762:
+		goto tr1773;
+	goto tr1757;
+tr1773:
 	{
 		s->number64 = 0;
 	}
@@ -47077,8 +47183,8 @@ tr1762:
 			p--; {goto st261;}
 		}
 	}
-	goto st627;
-tr1769:
+	goto st636;
+tr1780:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -47093,11 +47199,11 @@ tr1769:
 			p--; {goto st261;}
 		}
 	}
-	goto st627;
-st627:
+	goto st636;
+st636:
 	if ( ++p == pe )
-		goto _test_eof627;
-case 627:
+		goto _test_eof636;
+case 636:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -47111,27 +47217,27 @@ case 627:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1766;
-		case 32: goto tr1766;
-		case 40: goto tr1767;
-		case 41: goto tr1768;
-		case 68: goto tr1770;
-		case 72: goto tr1771;
-		case 77: goto tr1772;
-		case 83: goto st646;
-		case 87: goto tr1774;
-		case 100: goto tr1770;
-		case 104: goto tr1771;
-		case 109: goto tr1772;
-		case 115: goto st646;
-		case 119: goto tr1774;
-		case 1034: goto tr1775;
-		case 1083: goto tr1776;
+		case 9: goto tr1777;
+		case 32: goto tr1777;
+		case 40: goto tr1778;
+		case 41: goto tr1779;
+		case 68: goto tr1781;
+		case 72: goto tr1782;
+		case 77: goto tr1783;
+		case 83: goto st655;
+		case 87: goto tr1785;
+		case 100: goto tr1781;
+		case 104: goto tr1782;
+		case 109: goto tr1783;
+		case 115: goto st655;
+		case 119: goto tr1785;
+		case 1034: goto tr1786;
+		case 1083: goto tr1787;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1769;
-	goto tr1765;
-tr1778:
+		goto tr1780;
+	goto tr1776;
+tr1789:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -47139,8 +47245,8 @@ tr1778:
 		}
 		s->multiline = true;
 	}
-	goto st628;
-tr1779:
+	goto st637;
+tr1790:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -47148,13 +47254,13 @@ tr1779:
 		}
 		s->multiline = false;
 	}
-	goto st628;
-tr1781:
+	goto st637;
+tr1792:
 	{
 		s->line_counter++;
 	}
-	goto st628;
-tr1766:
+	goto st637;
+tr1777:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47164,8 +47270,8 @@ tr1766:
 			p--; {goto st261;}
 		}
 	}
-	goto st628;
-tr1767:
+	goto st637;
+tr1778:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47182,8 +47288,8 @@ tr1767:
 		}
 		s->multiline = true;
 	}
-	goto st628;
-tr1768:
+	goto st637;
+tr1779:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47200,8 +47306,8 @@ tr1768:
 		}
 		s->multiline = false;
 	}
-	goto st628;
-tr1775:
+	goto st637;
+tr1786:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47214,8 +47320,8 @@ tr1775:
 	{
 		s->line_counter++;
 	}
-	goto st628;
-tr1866:
+	goto st637;
+tr1877:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47233,8 +47339,8 @@ tr1866:
 			p--; {goto st261;}
 		}
 	}
-	goto st628;
-tr1867:
+	goto st637;
+tr1878:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47259,8 +47365,8 @@ tr1867:
 		}
 		s->multiline = true;
 	}
-	goto st628;
-tr1868:
+	goto st637;
+tr1879:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47285,8 +47391,8 @@ tr1868:
 		}
 		s->multiline = false;
 	}
-	goto st628;
-tr1870:
+	goto st637;
+tr1881:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47307,11 +47413,11 @@ tr1870:
 	{
 		s->line_counter++;
 	}
-	goto st628;
-st628:
+	goto st637;
+st637:
 	if ( ++p == pe )
-		goto _test_eof628;
-case 628:
+		goto _test_eof637;
+case 637:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -47325,17 +47431,17 @@ case 628:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st628;
-		case 32: goto st628;
-		case 40: goto tr1778;
-		case 41: goto tr1779;
-		case 1034: goto tr1781;
-		case 1083: goto st645;
+		case 9: goto st637;
+		case 32: goto st637;
+		case 40: goto tr1789;
+		case 41: goto tr1790;
+		case 1034: goto tr1792;
+		case 1083: goto st654;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1780;
-	goto tr1746;
-tr1780:
+		goto tr1791;
+	goto tr1757;
+tr1791:
 	{
 		s->number64 = 0;
 	}
@@ -47353,8 +47459,8 @@ tr1780:
 			p--; {goto st261;}
 		}
 	}
-	goto st629;
-tr1786:
+	goto st638;
+tr1797:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -47369,11 +47475,11 @@ tr1786:
 			p--; {goto st261;}
 		}
 	}
-	goto st629;
-st629:
+	goto st638;
+st638:
 	if ( ++p == pe )
-		goto _test_eof629;
-case 629:
+		goto _test_eof638;
+case 638:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -47387,27 +47493,27 @@ case 629:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1783;
-		case 32: goto tr1783;
-		case 40: goto tr1784;
-		case 41: goto tr1785;
-		case 68: goto tr1787;
-		case 72: goto tr1788;
-		case 77: goto tr1789;
-		case 83: goto st642;
-		case 87: goto tr1791;
-		case 100: goto tr1787;
-		case 104: goto tr1788;
-		case 109: goto tr1789;
-		case 115: goto st642;
-		case 119: goto tr1791;
-		case 1034: goto tr1792;
-		case 1083: goto tr1793;
+		case 9: goto tr1794;
+		case 32: goto tr1794;
+		case 40: goto tr1795;
+		case 41: goto tr1796;
+		case 68: goto tr1798;
+		case 72: goto tr1799;
+		case 77: goto tr1800;
+		case 83: goto st651;
+		case 87: goto tr1802;
+		case 100: goto tr1798;
+		case 104: goto tr1799;
+		case 109: goto tr1800;
+		case 115: goto st651;
+		case 119: goto tr1802;
+		case 1034: goto tr1803;
+		case 1083: goto tr1804;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1786;
-	goto tr1765;
-tr1795:
+		goto tr1797;
+	goto tr1776;
+tr1806:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -47415,8 +47521,8 @@ tr1795:
 		}
 		s->multiline = true;
 	}
-	goto st630;
-tr1796:
+	goto st639;
+tr1807:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -47424,13 +47530,13 @@ tr1796:
 		}
 		s->multiline = false;
 	}
-	goto st630;
-tr1798:
+	goto st639;
+tr1809:
 	{
 		s->line_counter++;
 	}
-	goto st630;
-tr1783:
+	goto st639;
+tr1794:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47440,8 +47546,8 @@ tr1783:
 			p--; {goto st261;}
 		}
 	}
-	goto st630;
-tr1784:
+	goto st639;
+tr1795:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47458,8 +47564,8 @@ tr1784:
 		}
 		s->multiline = true;
 	}
-	goto st630;
-tr1785:
+	goto st639;
+tr1796:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47476,8 +47582,8 @@ tr1785:
 		}
 		s->multiline = false;
 	}
-	goto st630;
-tr1792:
+	goto st639;
+tr1803:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47490,8 +47596,8 @@ tr1792:
 	{
 		s->line_counter++;
 	}
-	goto st630;
-tr1853:
+	goto st639;
+tr1864:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47509,8 +47615,8 @@ tr1853:
 			p--; {goto st261;}
 		}
 	}
-	goto st630;
-tr1854:
+	goto st639;
+tr1865:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47535,8 +47641,8 @@ tr1854:
 		}
 		s->multiline = true;
 	}
-	goto st630;
-tr1855:
+	goto st639;
+tr1866:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47561,8 +47667,8 @@ tr1855:
 		}
 		s->multiline = false;
 	}
-	goto st630;
-tr1857:
+	goto st639;
+tr1868:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47583,11 +47689,11 @@ tr1857:
 	{
 		s->line_counter++;
 	}
-	goto st630;
-st630:
+	goto st639;
+st639:
 	if ( ++p == pe )
-		goto _test_eof630;
-case 630:
+		goto _test_eof639;
+case 639:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -47601,17 +47707,17 @@ case 630:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st630;
-		case 32: goto st630;
-		case 40: goto tr1795;
-		case 41: goto tr1796;
-		case 1034: goto tr1798;
-		case 1083: goto st641;
+		case 9: goto st639;
+		case 32: goto st639;
+		case 40: goto tr1806;
+		case 41: goto tr1807;
+		case 1034: goto tr1809;
+		case 1083: goto st650;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1797;
-	goto tr1746;
-tr1797:
+		goto tr1808;
+	goto tr1757;
+tr1808:
 	{
 		s->number64 = 0;
 	}
@@ -47629,8 +47735,8 @@ tr1797:
 			p--; {goto st261;}
 		}
 	}
-	goto st631;
-tr1803:
+	goto st640;
+tr1814:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -47645,11 +47751,11 @@ tr1803:
 			p--; {goto st261;}
 		}
 	}
-	goto st631;
-st631:
+	goto st640;
+st640:
 	if ( ++p == pe )
-		goto _test_eof631;
-case 631:
+		goto _test_eof640;
+case 640:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -47663,27 +47769,27 @@ case 631:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1800;
-		case 32: goto tr1800;
-		case 40: goto tr1801;
-		case 41: goto tr1802;
-		case 68: goto tr1804;
-		case 72: goto tr1805;
-		case 77: goto tr1806;
-		case 83: goto st638;
-		case 87: goto tr1808;
-		case 100: goto tr1804;
-		case 104: goto tr1805;
-		case 109: goto tr1806;
-		case 115: goto st638;
-		case 119: goto tr1808;
-		case 1034: goto tr1809;
-		case 1083: goto tr1810;
+		case 9: goto tr1811;
+		case 32: goto tr1811;
+		case 40: goto tr1812;
+		case 41: goto tr1813;
+		case 68: goto tr1815;
+		case 72: goto tr1816;
+		case 77: goto tr1817;
+		case 83: goto st647;
+		case 87: goto tr1819;
+		case 100: goto tr1815;
+		case 104: goto tr1816;
+		case 109: goto tr1817;
+		case 115: goto st647;
+		case 119: goto tr1819;
+		case 1034: goto tr1820;
+		case 1083: goto tr1821;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1803;
-	goto tr1765;
-tr1812:
+		goto tr1814;
+	goto tr1776;
+tr1823:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -47691,8 +47797,8 @@ tr1812:
 		}
 		s->multiline = true;
 	}
-	goto st632;
-tr1813:
+	goto st641;
+tr1824:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -47700,13 +47806,13 @@ tr1813:
 		}
 		s->multiline = false;
 	}
-	goto st632;
-tr1815:
+	goto st641;
+tr1826:
 	{
 		s->line_counter++;
 	}
-	goto st632;
-tr1800:
+	goto st641;
+tr1811:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47716,8 +47822,8 @@ tr1800:
 			p--; {goto st261;}
 		}
 	}
-	goto st632;
-tr1801:
+	goto st641;
+tr1812:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47734,8 +47840,8 @@ tr1801:
 		}
 		s->multiline = true;
 	}
-	goto st632;
-tr1802:
+	goto st641;
+tr1813:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47752,8 +47858,8 @@ tr1802:
 		}
 		s->multiline = false;
 	}
-	goto st632;
-tr1809:
+	goto st641;
+tr1820:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47766,8 +47872,8 @@ tr1809:
 	{
 		s->line_counter++;
 	}
-	goto st632;
-tr1840:
+	goto st641;
+tr1851:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47785,8 +47891,8 @@ tr1840:
 			p--; {goto st261;}
 		}
 	}
-	goto st632;
-tr1841:
+	goto st641;
+tr1852:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47811,8 +47917,8 @@ tr1841:
 		}
 		s->multiline = true;
 	}
-	goto st632;
-tr1842:
+	goto st641;
+tr1853:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47837,8 +47943,8 @@ tr1842:
 		}
 		s->multiline = false;
 	}
-	goto st632;
-tr1844:
+	goto st641;
+tr1855:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47859,11 +47965,11 @@ tr1844:
 	{
 		s->line_counter++;
 	}
-	goto st632;
-st632:
+	goto st641;
+st641:
 	if ( ++p == pe )
-		goto _test_eof632;
-case 632:
+		goto _test_eof641;
+case 641:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -47877,17 +47983,17 @@ case 632:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st632;
-		case 32: goto st632;
-		case 40: goto tr1812;
-		case 41: goto tr1813;
-		case 1034: goto tr1815;
-		case 1083: goto st637;
+		case 9: goto st641;
+		case 32: goto st641;
+		case 40: goto tr1823;
+		case 41: goto tr1824;
+		case 1034: goto tr1826;
+		case 1083: goto st646;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1814;
-	goto tr1746;
-tr1814:
+		goto tr1825;
+	goto tr1757;
+tr1825:
 	{
 		s->number64 = 0;
 	}
@@ -47905,8 +48011,8 @@ tr1814:
 			p--; {goto st261;}
 		}
 	}
-	goto st633;
-tr1818:
+	goto st642;
+tr1829:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -47921,35 +48027,35 @@ tr1818:
 			p--; {goto st261;}
 		}
 	}
-	goto st633;
-st633:
+	goto st642;
+st642:
 	if ( ++p == pe )
-		goto _test_eof633;
-case 633:
+		goto _test_eof642;
+case 642:
 	switch( (*p) ) {
-		case 32: goto tr1817;
-		case 59: goto tr1817;
-		case 68: goto tr1819;
-		case 72: goto tr1820;
-		case 77: goto tr1821;
-		case 83: goto st634;
-		case 87: goto tr1823;
-		case 100: goto tr1819;
-		case 104: goto tr1820;
-		case 109: goto tr1821;
-		case 115: goto st634;
-		case 119: goto tr1823;
+		case 32: goto tr1828;
+		case 59: goto tr1828;
+		case 68: goto tr1830;
+		case 72: goto tr1831;
+		case 77: goto tr1832;
+		case 83: goto st643;
+		case 87: goto tr1834;
+		case 100: goto tr1830;
+		case 104: goto tr1831;
+		case 109: goto tr1832;
+		case 115: goto st643;
+		case 119: goto tr1834;
 	}
 	if ( (*p) < 40 ) {
 		if ( 9 <= (*p) && (*p) <= 10 )
-			goto tr1817;
+			goto tr1828;
 	} else if ( (*p) > 41 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr1818;
+			goto tr1829;
 	} else
-		goto tr1817;
-	goto tr1765;
-tr1817:
+		goto tr1828;
+	goto tr1776;
+tr1828:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -47962,8 +48068,8 @@ tr1817:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1147;
-tr1831:
+	goto st1156;
+tr1842:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -47984,13 +48090,13 @@ tr1831:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1147;
-st1147:
+	goto st1156;
+st1156:
 	if ( ++p == pe )
-		goto _test_eof1147;
-case 1147:
+		goto _test_eof1156;
+case 1156:
 	goto st0;
-tr1819:
+tr1830:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -47998,8 +48104,8 @@ tr1819:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st634;
-tr1820:
+	goto st643;
+tr1831:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48007,8 +48113,8 @@ tr1820:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st634;
-tr1821:
+	goto st643;
+tr1832:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48016,8 +48122,8 @@ tr1821:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st634;
-tr1823:
+	goto st643;
+tr1834:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48025,25 +48131,25 @@ tr1823:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st634;
-st634:
+	goto st643;
+st643:
 	if ( ++p == pe )
-		goto _test_eof634;
-case 634:
+		goto _test_eof643;
+case 643:
 	switch( (*p) ) {
-		case 32: goto tr1817;
-		case 59: goto tr1817;
+		case 32: goto tr1828;
+		case 59: goto tr1828;
 	}
 	if ( (*p) < 40 ) {
 		if ( 9 <= (*p) && (*p) <= 10 )
-			goto tr1817;
+			goto tr1828;
 	} else if ( (*p) > 41 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr1824;
+			goto tr1835;
 	} else
-		goto tr1817;
-	goto tr1765;
-tr1825:
+		goto tr1828;
+	goto tr1776;
+tr1836:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -48058,8 +48164,8 @@ tr1825:
 			p--; {goto st261;}
 		}
 	}
-	goto st635;
-tr1824:
+	goto st644;
+tr1835:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -48080,8 +48186,8 @@ tr1824:
 			p--; {goto st261;}
 		}
 	}
-	goto st635;
-tr1832:
+	goto st644;
+tr1843:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -48110,27 +48216,27 @@ tr1832:
 			p--; {goto st261;}
 		}
 	}
-	goto st635;
-st635:
+	goto st644;
+st644:
 	if ( ++p == pe )
-		goto _test_eof635;
-case 635:
+		goto _test_eof644;
+case 644:
 	switch( (*p) ) {
-		case 68: goto tr1826;
-		case 72: goto tr1827;
-		case 77: goto tr1828;
-		case 83: goto st636;
-		case 87: goto tr1830;
-		case 100: goto tr1826;
-		case 104: goto tr1827;
-		case 109: goto tr1828;
-		case 115: goto st636;
-		case 119: goto tr1830;
+		case 68: goto tr1837;
+		case 72: goto tr1838;
+		case 77: goto tr1839;
+		case 83: goto st645;
+		case 87: goto tr1841;
+		case 100: goto tr1837;
+		case 104: goto tr1838;
+		case 109: goto tr1839;
+		case 115: goto st645;
+		case 119: goto tr1841;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1825;
-	goto tr1765;
-tr1826:
+		goto tr1836;
+	goto tr1776;
+tr1837:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -48138,8 +48244,8 @@ tr1826:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st636;
-tr1827:
+	goto st645;
+tr1838:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48147,8 +48253,8 @@ tr1827:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st636;
-tr1828:
+	goto st645;
+tr1839:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48156,8 +48262,8 @@ tr1828:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st636;
-tr1830:
+	goto st645;
+tr1841:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48165,25 +48271,25 @@ tr1830:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st636;
-st636:
+	goto st645;
+st645:
 	if ( ++p == pe )
-		goto _test_eof636;
-case 636:
+		goto _test_eof645;
+case 645:
 	switch( (*p) ) {
-		case 32: goto tr1831;
-		case 59: goto tr1831;
+		case 32: goto tr1842;
+		case 59: goto tr1842;
 	}
 	if ( (*p) < 40 ) {
 		if ( 9 <= (*p) && (*p) <= 10 )
-			goto tr1831;
+			goto tr1842;
 	} else if ( (*p) > 41 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr1832;
+			goto tr1843;
 	} else
-		goto tr1831;
-	goto tr1765;
-tr1810:
+		goto tr1842;
+	goto tr1776;
+tr1821:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -48193,8 +48299,8 @@ tr1810:
 			p--; {goto st261;}
 		}
 	}
-	goto st637;
-tr1845:
+	goto st646;
+tr1856:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -48212,11 +48318,11 @@ tr1845:
 			p--; {goto st261;}
 		}
 	}
-	goto st637;
-st637:
+	goto st646;
+st646:
 	if ( ++p == pe )
-		goto _test_eof637;
-case 637:
+		goto _test_eof646;
+case 646:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -48236,11 +48342,11 @@ case 637:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1815;
+		goto tr1826;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st637;
+		goto st646;
 	goto tr71;
-tr1804:
+tr1815:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -48248,8 +48354,8 @@ tr1804:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st638;
-tr1805:
+	goto st647;
+tr1816:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48257,8 +48363,8 @@ tr1805:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st638;
-tr1806:
+	goto st647;
+tr1817:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48266,8 +48372,8 @@ tr1806:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st638;
-tr1808:
+	goto st647;
+tr1819:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48275,11 +48381,11 @@ tr1808:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st638;
-st638:
+	goto st647;
+st647:
 	if ( ++p == pe )
-		goto _test_eof638;
-case 638:
+		goto _test_eof647;
+case 647:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -48293,17 +48399,17 @@ case 638:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1800;
-		case 32: goto tr1800;
-		case 40: goto tr1801;
-		case 41: goto tr1802;
-		case 1034: goto tr1809;
-		case 1083: goto tr1810;
+		case 9: goto tr1811;
+		case 32: goto tr1811;
+		case 40: goto tr1812;
+		case 41: goto tr1813;
+		case 1034: goto tr1820;
+		case 1083: goto tr1821;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1833;
-	goto tr1765;
-tr1834:
+		goto tr1844;
+	goto tr1776;
+tr1845:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -48318,8 +48424,8 @@ tr1834:
 			p--; {goto st261;}
 		}
 	}
-	goto st639;
-tr1833:
+	goto st648;
+tr1844:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -48340,8 +48446,8 @@ tr1833:
 			p--; {goto st261;}
 		}
 	}
-	goto st639;
-tr1843:
+	goto st648;
+tr1854:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -48370,27 +48476,27 @@ tr1843:
 			p--; {goto st261;}
 		}
 	}
-	goto st639;
-st639:
+	goto st648;
+st648:
 	if ( ++p == pe )
-		goto _test_eof639;
-case 639:
+		goto _test_eof648;
+case 648:
 	switch( (*p) ) {
-		case 68: goto tr1835;
-		case 72: goto tr1836;
-		case 77: goto tr1837;
-		case 83: goto st640;
-		case 87: goto tr1839;
-		case 100: goto tr1835;
-		case 104: goto tr1836;
-		case 109: goto tr1837;
-		case 115: goto st640;
-		case 119: goto tr1839;
+		case 68: goto tr1846;
+		case 72: goto tr1847;
+		case 77: goto tr1848;
+		case 83: goto st649;
+		case 87: goto tr1850;
+		case 100: goto tr1846;
+		case 104: goto tr1847;
+		case 109: goto tr1848;
+		case 115: goto st649;
+		case 119: goto tr1850;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1834;
-	goto tr1765;
-tr1835:
+		goto tr1845;
+	goto tr1776;
+tr1846:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -48398,8 +48504,8 @@ tr1835:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st640;
-tr1836:
+	goto st649;
+tr1847:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48407,8 +48513,8 @@ tr1836:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st640;
-tr1837:
+	goto st649;
+tr1848:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48416,8 +48522,8 @@ tr1837:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st640;
-tr1839:
+	goto st649;
+tr1850:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48425,11 +48531,11 @@ tr1839:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st640;
-st640:
+	goto st649;
+st649:
 	if ( ++p == pe )
-		goto _test_eof640;
-case 640:
+		goto _test_eof649;
+case 649:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -48443,17 +48549,17 @@ case 640:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1840;
-		case 32: goto tr1840;
-		case 40: goto tr1841;
-		case 41: goto tr1842;
-		case 1034: goto tr1844;
-		case 1083: goto tr1845;
+		case 9: goto tr1851;
+		case 32: goto tr1851;
+		case 40: goto tr1852;
+		case 41: goto tr1853;
+		case 1034: goto tr1855;
+		case 1083: goto tr1856;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1843;
-	goto tr1765;
-tr1793:
+		goto tr1854;
+	goto tr1776;
+tr1804:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -48463,8 +48569,8 @@ tr1793:
 			p--; {goto st261;}
 		}
 	}
-	goto st641;
-tr1858:
+	goto st650;
+tr1869:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -48482,11 +48588,11 @@ tr1858:
 			p--; {goto st261;}
 		}
 	}
-	goto st641;
-st641:
+	goto st650;
+st650:
 	if ( ++p == pe )
-		goto _test_eof641;
-case 641:
+		goto _test_eof650;
+case 650:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -48506,11 +48612,11 @@ case 641:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1798;
+		goto tr1809;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st641;
+		goto st650;
 	goto tr71;
-tr1787:
+tr1798:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -48518,8 +48624,8 @@ tr1787:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st642;
-tr1788:
+	goto st651;
+tr1799:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48527,8 +48633,8 @@ tr1788:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st642;
-tr1789:
+	goto st651;
+tr1800:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48536,8 +48642,8 @@ tr1789:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st642;
-tr1791:
+	goto st651;
+tr1802:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48545,11 +48651,11 @@ tr1791:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st642;
-st642:
+	goto st651;
+st651:
 	if ( ++p == pe )
-		goto _test_eof642;
-case 642:
+		goto _test_eof651;
+case 651:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -48563,17 +48669,17 @@ case 642:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1783;
-		case 32: goto tr1783;
-		case 40: goto tr1784;
-		case 41: goto tr1785;
-		case 1034: goto tr1792;
-		case 1083: goto tr1793;
+		case 9: goto tr1794;
+		case 32: goto tr1794;
+		case 40: goto tr1795;
+		case 41: goto tr1796;
+		case 1034: goto tr1803;
+		case 1083: goto tr1804;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1846;
-	goto tr1765;
-tr1847:
+		goto tr1857;
+	goto tr1776;
+tr1858:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -48588,8 +48694,8 @@ tr1847:
 			p--; {goto st261;}
 		}
 	}
-	goto st643;
-tr1846:
+	goto st652;
+tr1857:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -48610,8 +48716,8 @@ tr1846:
 			p--; {goto st261;}
 		}
 	}
-	goto st643;
-tr1856:
+	goto st652;
+tr1867:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -48640,27 +48746,27 @@ tr1856:
 			p--; {goto st261;}
 		}
 	}
-	goto st643;
-st643:
+	goto st652;
+st652:
 	if ( ++p == pe )
-		goto _test_eof643;
-case 643:
+		goto _test_eof652;
+case 652:
 	switch( (*p) ) {
-		case 68: goto tr1848;
-		case 72: goto tr1849;
-		case 77: goto tr1850;
-		case 83: goto st644;
-		case 87: goto tr1852;
-		case 100: goto tr1848;
-		case 104: goto tr1849;
-		case 109: goto tr1850;
-		case 115: goto st644;
-		case 119: goto tr1852;
+		case 68: goto tr1859;
+		case 72: goto tr1860;
+		case 77: goto tr1861;
+		case 83: goto st653;
+		case 87: goto tr1863;
+		case 100: goto tr1859;
+		case 104: goto tr1860;
+		case 109: goto tr1861;
+		case 115: goto st653;
+		case 119: goto tr1863;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1847;
-	goto tr1765;
-tr1848:
+		goto tr1858;
+	goto tr1776;
+tr1859:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -48668,8 +48774,8 @@ tr1848:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st644;
-tr1849:
+	goto st653;
+tr1860:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48677,8 +48783,8 @@ tr1849:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st644;
-tr1850:
+	goto st653;
+tr1861:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48686,8 +48792,8 @@ tr1850:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st644;
-tr1852:
+	goto st653;
+tr1863:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48695,11 +48801,11 @@ tr1852:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st644;
-st644:
+	goto st653;
+st653:
 	if ( ++p == pe )
-		goto _test_eof644;
-case 644:
+		goto _test_eof653;
+case 653:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -48713,17 +48819,17 @@ case 644:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1853;
-		case 32: goto tr1853;
-		case 40: goto tr1854;
-		case 41: goto tr1855;
-		case 1034: goto tr1857;
-		case 1083: goto tr1858;
+		case 9: goto tr1864;
+		case 32: goto tr1864;
+		case 40: goto tr1865;
+		case 41: goto tr1866;
+		case 1034: goto tr1868;
+		case 1083: goto tr1869;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1856;
-	goto tr1765;
-tr1776:
+		goto tr1867;
+	goto tr1776;
+tr1787:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -48733,8 +48839,8 @@ tr1776:
 			p--; {goto st261;}
 		}
 	}
-	goto st645;
-tr1871:
+	goto st654;
+tr1882:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -48752,11 +48858,11 @@ tr1871:
 			p--; {goto st261;}
 		}
 	}
-	goto st645;
-st645:
+	goto st654;
+st654:
 	if ( ++p == pe )
-		goto _test_eof645;
-case 645:
+		goto _test_eof654;
+case 654:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -48776,11 +48882,11 @@ case 645:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1781;
+		goto tr1792;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st645;
+		goto st654;
 	goto tr71;
-tr1770:
+tr1781:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -48788,8 +48894,8 @@ tr1770:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st646;
-tr1771:
+	goto st655;
+tr1782:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48797,8 +48903,8 @@ tr1771:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st646;
-tr1772:
+	goto st655;
+tr1783:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48806,8 +48912,8 @@ tr1772:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st646;
-tr1774:
+	goto st655;
+tr1785:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48815,11 +48921,11 @@ tr1774:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st646;
-st646:
+	goto st655;
+st655:
 	if ( ++p == pe )
-		goto _test_eof646;
-case 646:
+		goto _test_eof655;
+case 655:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -48833,17 +48939,17 @@ case 646:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1766;
-		case 32: goto tr1766;
-		case 40: goto tr1767;
-		case 41: goto tr1768;
-		case 1034: goto tr1775;
-		case 1083: goto tr1776;
+		case 9: goto tr1777;
+		case 32: goto tr1777;
+		case 40: goto tr1778;
+		case 41: goto tr1779;
+		case 1034: goto tr1786;
+		case 1083: goto tr1787;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1859;
-	goto tr1765;
-tr1860:
+		goto tr1870;
+	goto tr1776;
+tr1871:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -48858,8 +48964,8 @@ tr1860:
 			p--; {goto st261;}
 		}
 	}
-	goto st647;
-tr1859:
+	goto st656;
+tr1870:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -48880,8 +48986,8 @@ tr1859:
 			p--; {goto st261;}
 		}
 	}
-	goto st647;
-tr1869:
+	goto st656;
+tr1880:
 	{
 		if (s->number64 + s->number64_tmp < UINT32_MAX) {
 			s->number64 += s->number64_tmp;
@@ -48910,27 +49016,27 @@ tr1869:
 			p--; {goto st261;}
 		}
 	}
-	goto st647;
-st647:
+	goto st656;
+st656:
 	if ( ++p == pe )
-		goto _test_eof647;
-case 647:
+		goto _test_eof656;
+case 656:
 	switch( (*p) ) {
-		case 68: goto tr1861;
-		case 72: goto tr1862;
-		case 77: goto tr1863;
-		case 83: goto st648;
-		case 87: goto tr1865;
-		case 100: goto tr1861;
-		case 104: goto tr1862;
-		case 109: goto tr1863;
-		case 115: goto st648;
-		case 119: goto tr1865;
+		case 68: goto tr1872;
+		case 72: goto tr1873;
+		case 77: goto tr1874;
+		case 83: goto st657;
+		case 87: goto tr1876;
+		case 100: goto tr1872;
+		case 104: goto tr1873;
+		case 109: goto tr1874;
+		case 115: goto st657;
+		case 119: goto tr1876;
 	}
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1860;
-	goto tr1765;
-tr1861:
+		goto tr1871;
+	goto tr1776;
+tr1872:
 	{ if (s->number64 <= (UINT32_MAX / 86400)) {
 	                  s->number64 *= 86400;
 	              } else {
@@ -48938,8 +49044,8 @@ tr1861:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st648;
-tr1862:
+	goto st657;
+tr1873:
 	{ if (s->number64 <= (UINT32_MAX / 3600)) {
 	                  s->number64 *= 3600;
 	              } else {
@@ -48947,8 +49053,8 @@ tr1862:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st648;
-tr1863:
+	goto st657;
+tr1874:
 	{ if (s->number64 <= (UINT32_MAX / 60)) {
 	                  s->number64 *= 60;
 	              } else {
@@ -48956,8 +49062,8 @@ tr1863:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st648;
-tr1865:
+	goto st657;
+tr1876:
 	{ if (s->number64 <= (UINT32_MAX / 604800)) {
 	                  s->number64 *= 604800;
 	              } else {
@@ -48965,11 +49071,11 @@ tr1865:
 	                  p--; {goto st261;}
 	              }
 	            }
-	goto st648;
-st648:
+	goto st657;
+st657:
 	if ( ++p == pe )
-		goto _test_eof648;
-case 648:
+		goto _test_eof657;
+case 657:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -48983,17 +49089,17 @@ case 648:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1866;
-		case 32: goto tr1866;
-		case 40: goto tr1867;
-		case 41: goto tr1868;
-		case 1034: goto tr1870;
-		case 1083: goto tr1871;
+		case 9: goto tr1877;
+		case 32: goto tr1877;
+		case 40: goto tr1878;
+		case 41: goto tr1879;
+		case 1034: goto tr1881;
+		case 1083: goto tr1882;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1869;
-	goto tr1765;
-tr1758:
+		goto tr1880;
+	goto tr1776;
+tr1769:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -49003,11 +49109,11 @@ tr1758:
 			p--; {goto st261;}
 		}
 	}
-	goto st649;
-st649:
+	goto st658;
+st658:
 	if ( ++p == pe )
-		goto _test_eof649;
-case 649:
+		goto _test_eof658;
+case 658:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -49027,19 +49133,19 @@ case 649:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1763;
+		goto tr1774;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st649;
+		goto st658;
 	goto tr71;
-tr1745:
+tr1756:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st650;
-st650:
+	goto st659;
+st659:
 	if ( ++p == pe )
-		goto _test_eof650;
-case 650:
+		goto _test_eof659;
+case 659:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -49059,19 +49165,19 @@ case 650:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1751;
+		goto tr1762;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st650;
+		goto st659;
 	goto tr71;
-tr1734:
+tr1745:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st651;
-st651:
+	goto st660;
+st660:
 	if ( ++p == pe )
-		goto _test_eof651;
-case 651:
+		goto _test_eof660;
+case 660:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -49091,14 +49197,14 @@ case 651:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1739;
+		goto tr1750;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st651;
+		goto st660;
 	goto tr71;
-st652:
+st661:
 	if ( ++p == pe )
-		goto _test_eof652;
-case 652:
+		goto _test_eof661;
+case 661:
 	switch( (*p) ) {
 		case 32: goto tr71;
 		case 59: goto tr71;
@@ -49108,8 +49214,8 @@ case 652:
 			goto tr71;
 	} else if ( (*p) >= 9 )
 		goto tr71;
-	goto tr1872;
-tr1872:
+	goto tr1883;
+tr1883:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -49118,12 +49224,12 @@ tr1872:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 653; goto st272;} }
-	goto st653;
-st653:
+	{ p--; {stack[top++] = 662; goto st272;} }
+	goto st662;
+st662:
 	if ( ++p == pe )
-		goto _test_eof653;
-case 653:
+		goto _test_eof662;
+case 662:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -49137,15 +49243,15 @@ case 653:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1873;
-		case 32: goto tr1873;
-		case 40: goto tr1874;
-		case 41: goto tr1875;
-		case 1034: goto tr1876;
-		case 1083: goto tr1877;
+		case 9: goto tr1884;
+		case 32: goto tr1884;
+		case 40: goto tr1885;
+		case 41: goto tr1886;
+		case 1034: goto tr1887;
+		case 1083: goto tr1888;
 	}
 	goto tr71;
-tr1880:
+tr1891:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -49153,8 +49259,8 @@ tr1880:
 		}
 		s->multiline = true;
 	}
-	goto st654;
-tr1881:
+	goto st663;
+tr1892:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -49162,13 +49268,13 @@ tr1881:
 		}
 		s->multiline = false;
 	}
-	goto st654;
-tr1882:
+	goto st663;
+tr1893:
 	{
 		s->line_counter++;
 	}
-	goto st654;
-tr1873:
+	goto st663;
+tr1884:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49179,8 +49285,8 @@ tr1873:
 			p--; {goto st261;}
 		}
 	}
-	goto st654;
-tr1874:
+	goto st663;
+tr1885:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49198,8 +49304,8 @@ tr1874:
 		}
 		s->multiline = true;
 	}
-	goto st654;
-tr1875:
+	goto st663;
+tr1886:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49217,8 +49323,8 @@ tr1875:
 		}
 		s->multiline = false;
 	}
-	goto st654;
-tr1876:
+	goto st663;
+tr1887:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49232,11 +49338,11 @@ tr1876:
 	{
 		s->line_counter++;
 	}
-	goto st654;
-st654:
+	goto st663;
+st663:
 	if ( ++p == pe )
-		goto _test_eof654;
-case 654:
+		goto _test_eof663;
+case 663:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -49250,23 +49356,23 @@ case 654:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st654;
-		case 32: goto st654;
-		case 40: goto tr1880;
-		case 41: goto tr1881;
-		case 1034: goto tr1882;
-		case 1083: goto st656;
+		case 9: goto st663;
+		case 32: goto st663;
+		case 40: goto tr1891;
+		case 41: goto tr1892;
+		case 1034: goto tr1893;
+		case 1083: goto st665;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr1878;
+			goto tr1889;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr1878;
+			goto tr1889;
 	} else
-		goto tr1878;
+		goto tr1889;
 	goto tr71;
-tr1878:
+tr1889:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -49275,23 +49381,23 @@ tr1878:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 655; goto st272;} }
-	goto st655;
-st655:
+	{ p--; {stack[top++] = 664; goto st272;} }
+	goto st664;
+st664:
 	if ( ++p == pe )
-		goto _test_eof655;
-case 655:
+		goto _test_eof664;
+case 664:
 	switch( (*p) ) {
-		case 32: goto tr1884;
-		case 59: goto tr1884;
+		case 32: goto tr1895;
+		case 59: goto tr1895;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1884;
+			goto tr1895;
 	} else if ( (*p) >= 9 )
-		goto tr1884;
+		goto tr1895;
 	goto tr71;
-tr1884:
+tr1895:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49305,13 +49411,13 @@ tr1884:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1148;
-st1148:
+	goto st1157;
+st1157:
 	if ( ++p == pe )
-		goto _test_eof1148;
-case 1148:
+		goto _test_eof1157;
+case 1157:
 	goto st0;
-tr1877:
+tr1888:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49322,11 +49428,11 @@ tr1877:
 			p--; {goto st261;}
 		}
 	}
-	goto st656;
-st656:
+	goto st665;
+st665:
 	if ( ++p == pe )
-		goto _test_eof656;
-case 656:
+		goto _test_eof665;
+case 665:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -49346,38 +49452,38 @@ case 656:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1882;
+		goto tr1893;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st656;
+		goto st665;
 	goto tr71;
-st657:
+st666:
 	if ( ++p == pe )
-		goto _test_eof657;
-case 657:
+		goto _test_eof666;
+case 666:
 	switch( (*p) ) {
-		case 42: goto tr1885;
-		case 92: goto tr1885;
-		case 95: goto tr1885;
+		case 42: goto tr1896;
+		case 92: goto tr1896;
+		case 95: goto tr1896;
 	}
 	if ( (*p) < 64 ) {
 		if ( 45 <= (*p) && (*p) <= 57 )
-			goto tr1885;
+			goto tr1896;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr1885;
+			goto tr1896;
 	} else
-		goto tr1885;
+		goto tr1896;
 	goto tr71;
-tr1885:
+tr1896:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 658; goto st263;} }
-	goto st658;
-st658:
+	{ p--; {stack[top++] = 667; goto st263;} }
+	goto st667;
+st667:
 	if ( ++p == pe )
-		goto _test_eof658;
-case 658:
+		goto _test_eof667;
+case 667:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -49391,15 +49497,15 @@ case 658:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1886;
-		case 32: goto tr1886;
-		case 40: goto tr1887;
-		case 41: goto tr1888;
-		case 1034: goto tr1889;
-		case 1083: goto tr1890;
+		case 9: goto tr1897;
+		case 32: goto tr1897;
+		case 40: goto tr1898;
+		case 41: goto tr1899;
+		case 1034: goto tr1900;
+		case 1083: goto tr1901;
 	}
 	goto tr71;
-tr1892:
+tr1903:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -49407,8 +49513,8 @@ tr1892:
 		}
 		s->multiline = true;
 	}
-	goto st659;
-tr1893:
+	goto st668;
+tr1904:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -49416,18 +49522,18 @@ tr1893:
 		}
 		s->multiline = false;
 	}
-	goto st659;
-tr1895:
+	goto st668;
+tr1906:
 	{
 		s->line_counter++;
 	}
-	goto st659;
-tr1886:
+	goto st668;
+tr1897:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st659;
-tr1887:
+	goto st668;
+tr1898:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -49438,8 +49544,8 @@ tr1887:
 		}
 		s->multiline = true;
 	}
-	goto st659;
-tr1888:
+	goto st668;
+tr1899:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -49450,19 +49556,19 @@ tr1888:
 		}
 		s->multiline = false;
 	}
-	goto st659;
-tr1889:
+	goto st668;
+tr1900:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st659;
-st659:
+	goto st668;
+st668:
 	if ( ++p == pe )
-		goto _test_eof659;
-case 659:
+		goto _test_eof668;
+case 668:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -49476,67 +49582,67 @@ case 659:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st659;
-		case 32: goto st659;
-		case 40: goto tr1892;
-		case 41: goto tr1893;
-		case 42: goto tr1894;
-		case 92: goto tr1894;
-		case 95: goto tr1894;
-		case 1034: goto tr1895;
-		case 1083: goto st661;
+		case 9: goto st668;
+		case 32: goto st668;
+		case 40: goto tr1903;
+		case 41: goto tr1904;
+		case 42: goto tr1905;
+		case 92: goto tr1905;
+		case 95: goto tr1905;
+		case 1034: goto tr1906;
+		case 1083: goto st670;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr1894;
+			goto tr1905;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr1894;
+			goto tr1905;
 	} else
-		goto tr1894;
+		goto tr1905;
 	goto tr71;
-tr1894:
+tr1905:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 660; goto st263;} }
-	goto st660;
-st660:
+	{ p--; {stack[top++] = 669; goto st263;} }
+	goto st669;
+st669:
 	if ( ++p == pe )
-		goto _test_eof660;
-case 660:
+		goto _test_eof669;
+case 669:
 	switch( (*p) ) {
-		case 32: goto tr1897;
-		case 59: goto tr1897;
+		case 32: goto tr1908;
+		case 59: goto tr1908;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1897;
+			goto tr1908;
 	} else if ( (*p) >= 9 )
-		goto tr1897;
+		goto tr1908;
 	goto tr71;
-tr1897:
+tr1908:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1149;
-st1149:
+	goto st1158;
+st1158:
 	if ( ++p == pe )
-		goto _test_eof1149;
-case 1149:
+		goto _test_eof1158;
+case 1158:
 	goto st0;
-tr1890:
+tr1901:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st661;
-st661:
+	goto st670;
+st670:
 	if ( ++p == pe )
-		goto _test_eof661;
-case 661:
+		goto _test_eof670;
+case 670:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -49556,18 +49662,18 @@ case 661:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1895;
+		goto tr1906;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st661;
+		goto st670;
 	goto tr71;
-st662:
+st671:
 	if ( ++p == pe )
-		goto _test_eof662;
-case 662:
+		goto _test_eof671;
+case 671:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1898;
-	goto tr1746;
-tr1898:
+		goto tr1909;
+	goto tr1757;
+tr1909:
 	{
 		s->number64 = 0;
 	}
@@ -49585,8 +49691,8 @@ tr1898:
 			p--; {goto st261;}
 		}
 	}
-	goto st663;
-tr1902:
+	goto st672;
+tr1913:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -49601,11 +49707,11 @@ tr1902:
 			p--; {goto st261;}
 		}
 	}
-	goto st663;
-st663:
+	goto st672;
+st672:
 	if ( ++p == pe )
-		goto _test_eof663;
-case 663:
+		goto _test_eof672;
+case 672:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -49619,17 +49725,17 @@ case 663:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1899;
-		case 32: goto tr1899;
-		case 40: goto tr1900;
-		case 41: goto tr1901;
-		case 1034: goto tr1903;
-		case 1083: goto tr1904;
+		case 9: goto tr1910;
+		case 32: goto tr1910;
+		case 40: goto tr1911;
+		case 41: goto tr1912;
+		case 1034: goto tr1914;
+		case 1083: goto tr1915;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1902;
-	goto tr1746;
-tr1906:
+		goto tr1913;
+	goto tr1757;
+tr1917:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -49637,8 +49743,8 @@ tr1906:
 		}
 		s->multiline = true;
 	}
-	goto st664;
-tr1907:
+	goto st673;
+tr1918:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -49646,13 +49752,13 @@ tr1907:
 		}
 		s->multiline = false;
 	}
-	goto st664;
-tr1909:
+	goto st673;
+tr1920:
 	{
 		s->line_counter++;
 	}
-	goto st664;
-tr1899:
+	goto st673;
+tr1910:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -49662,8 +49768,8 @@ tr1899:
 			p--; {goto st261;}
 		}
 	}
-	goto st664;
-tr1900:
+	goto st673;
+tr1911:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -49680,8 +49786,8 @@ tr1900:
 		}
 		s->multiline = true;
 	}
-	goto st664;
-tr1901:
+	goto st673;
+tr1912:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -49698,8 +49804,8 @@ tr1901:
 		}
 		s->multiline = false;
 	}
-	goto st664;
-tr1903:
+	goto st673;
+tr1914:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -49712,11 +49818,11 @@ tr1903:
 	{
 		s->line_counter++;
 	}
-	goto st664;
-st664:
+	goto st673;
+st673:
 	if ( ++p == pe )
-		goto _test_eof664;
-case 664:
+		goto _test_eof673;
+case 673:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -49730,59 +49836,59 @@ case 664:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st664;
-		case 32: goto st664;
-		case 40: goto tr1906;
-		case 41: goto tr1907;
-		case 42: goto tr1908;
-		case 92: goto tr1908;
-		case 95: goto tr1908;
-		case 1034: goto tr1909;
-		case 1083: goto st666;
+		case 9: goto st673;
+		case 32: goto st673;
+		case 40: goto tr1917;
+		case 41: goto tr1918;
+		case 42: goto tr1919;
+		case 92: goto tr1919;
+		case 95: goto tr1919;
+		case 1034: goto tr1920;
+		case 1083: goto st675;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr1908;
+			goto tr1919;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr1908;
+			goto tr1919;
 	} else
-		goto tr1908;
+		goto tr1919;
 	goto tr71;
-tr1908:
+tr1919:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 665; goto st263;} }
-	goto st665;
-st665:
+	{ p--; {stack[top++] = 674; goto st263;} }
+	goto st674;
+st674:
 	if ( ++p == pe )
-		goto _test_eof665;
-case 665:
+		goto _test_eof674;
+case 674:
 	switch( (*p) ) {
-		case 32: goto tr1911;
-		case 59: goto tr1911;
+		case 32: goto tr1922;
+		case 59: goto tr1922;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1911;
+			goto tr1922;
 	} else if ( (*p) >= 9 )
-		goto tr1911;
+		goto tr1922;
 	goto tr71;
-tr1911:
+tr1922:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1150;
-st1150:
+	goto st1159;
+st1159:
 	if ( ++p == pe )
-		goto _test_eof1150;
-case 1150:
+		goto _test_eof1159;
+case 1159:
 	goto st0;
-tr1904:
+tr1915:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -49792,11 +49898,11 @@ tr1904:
 			p--; {goto st261;}
 		}
 	}
-	goto st666;
-st666:
+	goto st675;
+st675:
 	if ( ++p == pe )
-		goto _test_eof666;
-case 666:
+		goto _test_eof675;
+case 675:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -49816,25 +49922,25 @@ case 666:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1909;
+		goto tr1920;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st666;
+		goto st675;
 	goto tr71;
-st667:
+st676:
 	if ( ++p == pe )
-		goto _test_eof667;
-case 667:
+		goto _test_eof676;
+case 676:
 	switch( (*p) ) {
-		case 32: goto tr1913;
-		case 59: goto tr1913;
+		case 32: goto tr1924;
+		case 59: goto tr1924;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr1913;
+			goto tr1924;
 	} else if ( (*p) >= 9 )
-		goto tr1913;
-	goto tr1912;
-tr1922:
+		goto tr1924;
+	goto tr1923;
+tr1933:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -49843,9 +49949,9 @@ tr1922:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 668; goto st272;} }
-	goto st668;
-tr1912:
+	{ p--; {stack[top++] = 677; goto st272;} }
+	goto st677;
+tr1923:
 	{
 		s->long_string = true;
 	}
@@ -49857,12 +49963,12 @@ tr1912:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 668; goto st272;} }
-	goto st668;
-st668:
+	{ p--; {stack[top++] = 677; goto st272;} }
+	goto st677;
+st677:
 	if ( ++p == pe )
-		goto _test_eof668;
-case 668:
+		goto _test_eof677;
+case 677:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -49880,19 +49986,19 @@ case 668:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr1914;
-		case 32: goto tr1914;
-		case 40: goto tr1915;
-		case 41: goto tr1916;
-		case 2058: goto tr1917;
-		case 2107: goto tr1918;
-		case 2314: goto tr1919;
-		case 2363: goto tr1919;
-		case 2570: goto tr1920;
-		case 2619: goto tr1921;
-	}
-	goto tr1913;
-tr1924:
+		case 9: goto tr1925;
+		case 32: goto tr1925;
+		case 40: goto tr1926;
+		case 41: goto tr1927;
+		case 2058: goto tr1928;
+		case 2107: goto tr1929;
+		case 2314: goto tr1930;
+		case 2363: goto tr1930;
+		case 2570: goto tr1931;
+		case 2619: goto tr1932;
+	}
+	goto tr1924;
+tr1935:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -49900,8 +50006,8 @@ tr1924:
 		}
 		s->multiline = true;
 	}
-	goto st669;
-tr1925:
+	goto st678;
+tr1936:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -49909,13 +50015,13 @@ tr1925:
 		}
 		s->multiline = false;
 	}
-	goto st669;
-tr1926:
+	goto st678;
+tr1937:
 	{
 		s->line_counter++;
 	}
-	goto st669;
-tr1914:
+	goto st678;
+tr1925:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49926,8 +50032,8 @@ tr1914:
 			p--; {goto st261;}
 		}
 	}
-	goto st669;
-tr1915:
+	goto st678;
+tr1926:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49945,8 +50051,8 @@ tr1915:
 		}
 		s->multiline = true;
 	}
-	goto st669;
-tr1916:
+	goto st678;
+tr1927:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49964,8 +50070,8 @@ tr1916:
 		}
 		s->multiline = false;
 	}
-	goto st669;
-tr1917:
+	goto st678;
+tr1928:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -49979,11 +50085,11 @@ tr1917:
 	{
 		s->line_counter++;
 	}
-	goto st669;
-st669:
+	goto st678;
+st678:
 	if ( ++p == pe )
-		goto _test_eof669;
-case 669:
+		goto _test_eof678;
+case 678:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50001,27 +50107,27 @@ case 669:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st669;
-		case 32: goto st669;
-		case 40: goto tr1924;
-		case 41: goto tr1925;
-		case 2058: goto tr1926;
-		case 2107: goto st670;
-		case 2314: goto tr1928;
-		case 2363: goto tr1928;
-		case 2570: goto tr1929;
-		case 2619: goto tr1930;
+		case 9: goto st678;
+		case 32: goto st678;
+		case 40: goto tr1935;
+		case 41: goto tr1936;
+		case 2058: goto tr1937;
+		case 2107: goto st679;
+		case 2314: goto tr1939;
+		case 2363: goto tr1939;
+		case 2570: goto tr1940;
+		case 2619: goto tr1941;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr1922;
+			goto tr1933;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr1922;
+			goto tr1933;
 	} else
-		goto tr1922;
-	goto tr1913;
-tr1918:
+		goto tr1933;
+	goto tr1924;
+tr1929:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -50032,11 +50138,11 @@ tr1918:
 			p--; {goto st261;}
 		}
 	}
-	goto st670;
-st670:
+	goto st679;
+st679:
 	if ( ++p == pe )
-		goto _test_eof670;
-case 670:
+		goto _test_eof679;
+case 679:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -50056,11 +50162,11 @@ case 670:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1926;
+		goto tr1937;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st670;
-	goto tr1913;
-tr1919:
+		goto st679;
+	goto tr1924;
+tr1930:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -50077,21 +50183,21 @@ tr1919:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1151;
-tr1928:
+	goto st1160;
+tr1939:
 	{
 		s->long_string = false;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1151;
-st1151:
+	goto st1160;
+st1160:
 	if ( ++p == pe )
-		goto _test_eof1151;
-case 1151:
+		goto _test_eof1160;
+case 1160:
 	goto st0;
-tr1920:
+tr1931:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -50111,8 +50217,8 @@ tr1920:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1152;
-tr1929:
+	goto st1161;
+tr1940:
 	{
 		s->line_counter++;
 	}
@@ -50122,11 +50228,11 @@ tr1929:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1152;
-st1152:
+	goto st1161;
+st1161:
 	if ( ++p == pe )
-		goto _test_eof1152;
-case 1152:
+		goto _test_eof1161;
+case 1161:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50144,27 +50250,27 @@ case 1152:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st669;
-		case 32: goto st669;
-		case 40: goto tr1924;
-		case 41: goto tr1925;
-		case 2058: goto tr1926;
-		case 2107: goto st670;
-		case 2314: goto tr1928;
-		case 2363: goto tr1928;
-		case 2570: goto tr1929;
-		case 2619: goto tr1930;
+		case 9: goto st678;
+		case 32: goto st678;
+		case 40: goto tr1935;
+		case 41: goto tr1936;
+		case 2058: goto tr1937;
+		case 2107: goto st679;
+		case 2314: goto tr1939;
+		case 2363: goto tr1939;
+		case 2570: goto tr1940;
+		case 2619: goto tr1941;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr1922;
+			goto tr1933;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr1922;
+			goto tr1933;
 	} else
-		goto tr1922;
-	goto tr1913;
-tr1921:
+		goto tr1933;
+	goto tr1924;
+tr1932:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -50181,19 +50287,19 @@ tr1921:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1153;
-tr1930:
+	goto st1162;
+tr1941:
 	{
 		s->long_string = false;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1153;
-st1153:
+	goto st1162;
+st1162:
 	if ( ++p == pe )
-		goto _test_eof1153;
-case 1153:
+		goto _test_eof1162;
+case 1162:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -50213,26 +50319,26 @@ case 1153:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1926;
+		goto tr1937;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st670;
-	goto tr1913;
-st671:
+		goto st679;
+	goto tr1924;
+st680:
 	if ( ++p == pe )
-		goto _test_eof671;
-case 671:
+		goto _test_eof680;
+case 680:
 	if ( (*p) == 46 )
-		goto tr1931;
+		goto tr1942;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 58 )
-			goto tr1931;
+			goto tr1942;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr1931;
+			goto tr1942;
 	} else
-		goto tr1931;
-	goto tr1723;
-tr1931:
+		goto tr1942;
+	goto tr1734;
+tr1942:
 	{
 		s->buffer_length = 0;
 	}
@@ -50245,8 +50351,8 @@ tr1931:
 			p--; {goto st261;}
 		}
 	}
-	goto st672;
-tr1933:
+	goto st681;
+tr1944:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -50256,32 +50362,32 @@ tr1933:
 			p--; {goto st261;}
 		}
 	}
-	goto st672;
-st672:
+	goto st681;
+st681:
 	if ( ++p == pe )
-		goto _test_eof672;
-case 672:
+		goto _test_eof681;
+case 681:
 	switch( (*p) ) {
-		case 32: goto tr1932;
-		case 46: goto tr1933;
-		case 59: goto tr1932;
+		case 32: goto tr1943;
+		case 46: goto tr1944;
+		case 59: goto tr1943;
 	}
 	if ( (*p) < 48 ) {
 		if ( (*p) > 10 ) {
 			if ( 40 <= (*p) && (*p) <= 41 )
-				goto tr1932;
+				goto tr1943;
 		} else if ( (*p) >= 9 )
-			goto tr1932;
+			goto tr1943;
 	} else if ( (*p) > 58 ) {
 		if ( (*p) > 70 ) {
 			if ( 97 <= (*p) && (*p) <= 102 )
-				goto tr1933;
+				goto tr1944;
 		} else if ( (*p) >= 65 )
-			goto tr1933;
+			goto tr1944;
 	} else
-		goto tr1933;
-	goto tr1723;
-tr1932:
+		goto tr1944;
+	goto tr1734;
+tr1943:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -50297,20 +50403,20 @@ tr1932:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1154;
-st1154:
+	goto st1163;
+st1163:
 	if ( ++p == pe )
-		goto _test_eof1154;
-case 1154:
+		goto _test_eof1163;
+case 1163:
 	goto st0;
-st673:
+st682:
 	if ( ++p == pe )
-		goto _test_eof673;
-case 673:
+		goto _test_eof682;
+case 682:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr1935;
-	goto tr1934;
-tr1939:
+		goto tr1946;
+	goto tr1945;
+tr1950:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -50325,8 +50431,8 @@ tr1939:
 			p--; {goto st261;}
 		}
 	}
-	goto st674;
-tr1935:
+	goto st683;
+tr1946:
 	{
 		memset(&(s->loc), 0, sizeof(s->loc));
 		// Defaults.
@@ -50354,11 +50460,11 @@ tr1935:
 			p--; {goto st261;}
 		}
 	}
-	goto st674;
-st674:
+	goto st683;
+st683:
 	if ( ++p == pe )
-		goto _test_eof674;
-case 674:
+		goto _test_eof683;
+case 683:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50372,17 +50478,17 @@ case 674:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1936;
-		case 32: goto tr1936;
-		case 40: goto tr1937;
-		case 41: goto tr1938;
-		case 1034: goto tr1940;
-		case 1083: goto tr1941;
+		case 9: goto tr1947;
+		case 32: goto tr1947;
+		case 40: goto tr1948;
+		case 41: goto tr1949;
+		case 1034: goto tr1951;
+		case 1083: goto tr1952;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1939;
-	goto tr1934;
-tr1943:
+		goto tr1950;
+	goto tr1945;
+tr1954:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -50390,8 +50496,8 @@ tr1943:
 		}
 		s->multiline = true;
 	}
-	goto st675;
-tr1944:
+	goto st684;
+tr1955:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -50399,13 +50505,13 @@ tr1944:
 		}
 		s->multiline = false;
 	}
-	goto st675;
-tr1948:
+	goto st684;
+tr1959:
 	{
 		s->line_counter++;
 	}
-	goto st675;
-tr1936:
+	goto st684;
+tr1947:
 	{
 		if (s->number64 <= 90) {
 			s->loc.d1 = (uint32_t)(s->number64);
@@ -50414,8 +50520,8 @@ tr1936:
 			p--; {goto st261;}
 		}
 	}
-	goto st675;
-tr1937:
+	goto st684;
+tr1948:
 	{
 		if (s->number64 <= 90) {
 			s->loc.d1 = (uint32_t)(s->number64);
@@ -50431,8 +50537,8 @@ tr1937:
 		}
 		s->multiline = true;
 	}
-	goto st675;
-tr1938:
+	goto st684;
+tr1949:
 	{
 		if (s->number64 <= 90) {
 			s->loc.d1 = (uint32_t)(s->number64);
@@ -50448,8 +50554,8 @@ tr1938:
 		}
 		s->multiline = false;
 	}
-	goto st675;
-tr1940:
+	goto st684;
+tr1951:
 	{
 		if (s->number64 <= 90) {
 			s->loc.d1 = (uint32_t)(s->number64);
@@ -50461,11 +50567,11 @@ tr1940:
 	{
 		s->line_counter++;
 	}
-	goto st675;
-st675:
+	goto st684;
+st684:
 	if ( ++p == pe )
-		goto _test_eof675;
-case 675:
+		goto _test_eof684;
+case 684:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50479,19 +50585,19 @@ case 675:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st675;
-		case 32: goto st675;
-		case 40: goto tr1943;
-		case 41: goto tr1944;
-		case 78: goto st680;
-		case 83: goto st722;
-		case 1034: goto tr1948;
-		case 1083: goto st727;
+		case 9: goto st684;
+		case 32: goto st684;
+		case 40: goto tr1954;
+		case 41: goto tr1955;
+		case 78: goto st689;
+		case 83: goto st731;
+		case 1034: goto tr1959;
+		case 1083: goto st736;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1945;
-	goto tr1934;
-tr1945:
+		goto tr1956;
+	goto tr1945;
+tr1956:
 	{
 		s->number64 = 0;
 	}
@@ -50509,8 +50615,8 @@ tr1945:
 			p--; {goto st261;}
 		}
 	}
-	goto st676;
-tr1953:
+	goto st685;
+tr1964:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -50525,11 +50631,11 @@ tr1953:
 			p--; {goto st261;}
 		}
 	}
-	goto st676;
-st676:
+	goto st685;
+st685:
 	if ( ++p == pe )
-		goto _test_eof676;
-case 676:
+		goto _test_eof685;
+case 685:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50543,17 +50649,17 @@ case 676:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1950;
-		case 32: goto tr1950;
-		case 40: goto tr1951;
-		case 41: goto tr1952;
-		case 1034: goto tr1954;
-		case 1083: goto tr1955;
+		case 9: goto tr1961;
+		case 32: goto tr1961;
+		case 40: goto tr1962;
+		case 41: goto tr1963;
+		case 1034: goto tr1965;
+		case 1083: goto tr1966;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1953;
-	goto tr1934;
-tr1957:
+		goto tr1964;
+	goto tr1945;
+tr1968:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -50561,8 +50667,8 @@ tr1957:
 		}
 		s->multiline = true;
 	}
-	goto st677;
-tr1958:
+	goto st686;
+tr1969:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -50570,13 +50676,13 @@ tr1958:
 		}
 		s->multiline = false;
 	}
-	goto st677;
-tr1960:
+	goto st686;
+tr1971:
 	{
 		s->line_counter++;
 	}
-	goto st677;
-tr1950:
+	goto st686;
+tr1961:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m1 = (uint32_t)(s->number64);
@@ -50585,8 +50691,8 @@ tr1950:
 			p--; {goto st261;}
 		}
 	}
-	goto st677;
-tr1951:
+	goto st686;
+tr1962:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m1 = (uint32_t)(s->number64);
@@ -50602,8 +50708,8 @@ tr1951:
 		}
 		s->multiline = true;
 	}
-	goto st677;
-tr1952:
+	goto st686;
+tr1963:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m1 = (uint32_t)(s->number64);
@@ -50619,8 +50725,8 @@ tr1952:
 		}
 		s->multiline = false;
 	}
-	goto st677;
-tr1954:
+	goto st686;
+tr1965:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m1 = (uint32_t)(s->number64);
@@ -50632,11 +50738,11 @@ tr1954:
 	{
 		s->line_counter++;
 	}
-	goto st677;
-st677:
+	goto st686;
+st686:
 	if ( ++p == pe )
-		goto _test_eof677;
-case 677:
+		goto _test_eof686;
+case 686:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50650,19 +50756,19 @@ case 677:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st677;
-		case 32: goto st677;
-		case 40: goto tr1957;
-		case 41: goto tr1958;
-		case 78: goto st680;
-		case 83: goto st722;
-		case 1034: goto tr1960;
-		case 1083: goto st726;
+		case 9: goto st686;
+		case 32: goto st686;
+		case 40: goto tr1968;
+		case 41: goto tr1969;
+		case 78: goto st689;
+		case 83: goto st731;
+		case 1034: goto tr1971;
+		case 1083: goto st735;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1959;
-	goto tr1934;
-tr1966:
+		goto tr1970;
+	goto tr1945;
+tr1977:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -50677,8 +50783,8 @@ tr1966:
 			p--; {goto st261;}
 		}
 	}
-	goto st678;
-tr1959:
+	goto st687;
+tr1970:
 	{
 		s->decimals = 3;
 	}
@@ -50702,11 +50808,11 @@ tr1959:
 			p--; {goto st261;}
 		}
 	}
-	goto st678;
-st678:
+	goto st687;
+st687:
 	if ( ++p == pe )
-		goto _test_eof678;
-case 678:
+		goto _test_eof687;
+case 687:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50720,18 +50826,18 @@ case 678:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1962;
-		case 32: goto tr1962;
-		case 40: goto tr1963;
-		case 41: goto tr1964;
-		case 46: goto st724;
-		case 1034: goto tr1967;
-		case 1083: goto tr1968;
+		case 9: goto tr1973;
+		case 32: goto tr1973;
+		case 40: goto tr1974;
+		case 41: goto tr1975;
+		case 46: goto st733;
+		case 1034: goto tr1978;
+		case 1083: goto tr1979;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1966;
-	goto tr1934;
-tr1970:
+		goto tr1977;
+	goto tr1945;
+tr1981:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -50739,8 +50845,8 @@ tr1970:
 		}
 		s->multiline = true;
 	}
-	goto st679;
-tr1971:
+	goto st688;
+tr1982:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -50748,13 +50854,13 @@ tr1971:
 		}
 		s->multiline = false;
 	}
-	goto st679;
-tr1972:
+	goto st688;
+tr1983:
 	{
 		s->line_counter++;
 	}
-	goto st679;
-tr1962:
+	goto st688;
+tr1973:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -50775,8 +50881,8 @@ tr1962:
 			p--; {goto st261;}
 		}
 	}
-	goto st679;
-tr1963:
+	goto st688;
+tr1974:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -50804,8 +50910,8 @@ tr1963:
 		}
 		s->multiline = true;
 	}
-	goto st679;
-tr1964:
+	goto st688;
+tr1975:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -50833,8 +50939,8 @@ tr1964:
 		}
 		s->multiline = false;
 	}
-	goto st679;
-tr1967:
+	goto st688;
+tr1978:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -50858,8 +50964,8 @@ tr1967:
 	{
 		s->line_counter++;
 	}
-	goto st679;
-tr2161:
+	goto st688;
+tr2172:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -50883,8 +50989,8 @@ tr2161:
 			p--; {goto st261;}
 		}
 	}
-	goto st679;
-tr2162:
+	goto st688;
+tr2173:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -50915,8 +51021,8 @@ tr2162:
 		}
 		s->multiline = true;
 	}
-	goto st679;
-tr2163:
+	goto st688;
+tr2174:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -50947,8 +51053,8 @@ tr2163:
 		}
 		s->multiline = false;
 	}
-	goto st679;
-tr2165:
+	goto st688;
+tr2176:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -50975,11 +51081,11 @@ tr2165:
 	{
 		s->line_counter++;
 	}
-	goto st679;
-st679:
+	goto st688;
+st688:
 	if ( ++p == pe )
-		goto _test_eof679;
-case 679:
+		goto _test_eof688;
+case 688:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -50993,20 +51099,20 @@ case 679:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st679;
-		case 32: goto st679;
-		case 40: goto tr1970;
-		case 41: goto tr1971;
-		case 78: goto st680;
-		case 83: goto st722;
-		case 1034: goto tr1972;
-		case 1083: goto st723;
+		case 9: goto st688;
+		case 32: goto st688;
+		case 40: goto tr1981;
+		case 41: goto tr1982;
+		case 78: goto st689;
+		case 83: goto st731;
+		case 1034: goto tr1983;
+		case 1083: goto st732;
 	}
-	goto tr1934;
-st680:
+	goto tr1945;
+st689:
 	if ( ++p == pe )
-		goto _test_eof680;
-case 680:
+		goto _test_eof689;
+case 689:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51020,15 +51126,15 @@ case 680:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st681;
-		case 32: goto st681;
-		case 40: goto tr1975;
-		case 41: goto tr1976;
-		case 1034: goto tr1977;
-		case 1083: goto st721;
-	}
-	goto tr1934;
-tr1975:
+		case 9: goto st690;
+		case 32: goto st690;
+		case 40: goto tr1986;
+		case 41: goto tr1987;
+		case 1034: goto tr1988;
+		case 1083: goto st730;
+	}
+	goto tr1945;
+tr1986:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -51036,8 +51142,8 @@ tr1975:
 		}
 		s->multiline = true;
 	}
-	goto st681;
-tr1976:
+	goto st690;
+tr1987:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -51045,18 +51151,18 @@ tr1976:
 		}
 		s->multiline = false;
 	}
-	goto st681;
-tr1977:
+	goto st690;
+tr1988:
 	{
 		s->line_counter++;
 	}
-	goto st681;
-tr2156:
+	goto st690;
+tr2167:
 	{
 		s->loc.lat_sign = -1;
 	}
-	goto st681;
-tr2157:
+	goto st690;
+tr2168:
 	{
 		s->loc.lat_sign = -1;
 	}
@@ -51067,8 +51173,8 @@ tr2157:
 		}
 		s->multiline = true;
 	}
-	goto st681;
-tr2158:
+	goto st690;
+tr2169:
 	{
 		s->loc.lat_sign = -1;
 	}
@@ -51079,19 +51185,19 @@ tr2158:
 		}
 		s->multiline = false;
 	}
-	goto st681;
-tr2159:
+	goto st690;
+tr2170:
 	{
 		s->loc.lat_sign = -1;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st681;
-st681:
+	goto st690;
+st690:
 	if ( ++p == pe )
-		goto _test_eof681;
-case 681:
+		goto _test_eof690;
+case 690:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51105,17 +51211,17 @@ case 681:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st681;
-		case 32: goto st681;
-		case 40: goto tr1975;
-		case 41: goto tr1976;
-		case 1034: goto tr1977;
-		case 1083: goto st721;
+		case 9: goto st690;
+		case 32: goto st690;
+		case 40: goto tr1986;
+		case 41: goto tr1987;
+		case 1034: goto tr1988;
+		case 1083: goto st730;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1979;
-	goto tr1934;
-tr1979:
+		goto tr1990;
+	goto tr1945;
+tr1990:
 	{
 		s->number64 = 0;
 	}
@@ -51133,8 +51239,8 @@ tr1979:
 			p--; {goto st261;}
 		}
 	}
-	goto st682;
-tr1983:
+	goto st691;
+tr1994:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -51149,11 +51255,11 @@ tr1983:
 			p--; {goto st261;}
 		}
 	}
-	goto st682;
-st682:
+	goto st691;
+st691:
 	if ( ++p == pe )
-		goto _test_eof682;
-case 682:
+		goto _test_eof691;
+case 691:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51167,17 +51273,17 @@ case 682:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1980;
-		case 32: goto tr1980;
-		case 40: goto tr1981;
-		case 41: goto tr1982;
-		case 1034: goto tr1984;
-		case 1083: goto tr1985;
+		case 9: goto tr1991;
+		case 32: goto tr1991;
+		case 40: goto tr1992;
+		case 41: goto tr1993;
+		case 1034: goto tr1995;
+		case 1083: goto tr1996;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1983;
-	goto tr1934;
-tr1987:
+		goto tr1994;
+	goto tr1945;
+tr1998:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -51185,8 +51291,8 @@ tr1987:
 		}
 		s->multiline = true;
 	}
-	goto st683;
-tr1988:
+	goto st692;
+tr1999:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -51194,13 +51300,13 @@ tr1988:
 		}
 		s->multiline = false;
 	}
-	goto st683;
-tr1992:
+	goto st692;
+tr2003:
 	{
 		s->line_counter++;
 	}
-	goto st683;
-tr1980:
+	goto st692;
+tr1991:
 	{
 		if (s->number64 <= 180) {
 			s->loc.d2 = (uint32_t)(s->number64);
@@ -51209,8 +51315,8 @@ tr1980:
 			p--; {goto st261;}
 		}
 	}
-	goto st683;
-tr1981:
+	goto st692;
+tr1992:
 	{
 		if (s->number64 <= 180) {
 			s->loc.d2 = (uint32_t)(s->number64);
@@ -51226,8 +51332,8 @@ tr1981:
 		}
 		s->multiline = true;
 	}
-	goto st683;
-tr1982:
+	goto st692;
+tr1993:
 	{
 		if (s->number64 <= 180) {
 			s->loc.d2 = (uint32_t)(s->number64);
@@ -51243,8 +51349,8 @@ tr1982:
 		}
 		s->multiline = false;
 	}
-	goto st683;
-tr1984:
+	goto st692;
+tr1995:
 	{
 		if (s->number64 <= 180) {
 			s->loc.d2 = (uint32_t)(s->number64);
@@ -51256,11 +51362,11 @@ tr1984:
 	{
 		s->line_counter++;
 	}
-	goto st683;
-st683:
+	goto st692;
+st692:
 	if ( ++p == pe )
-		goto _test_eof683;
-case 683:
+		goto _test_eof692;
+case 692:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51274,19 +51380,19 @@ case 683:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st683;
-		case 32: goto st683;
-		case 40: goto tr1987;
-		case 41: goto tr1988;
-		case 69: goto st688;
-		case 87: goto st715;
-		case 1034: goto tr1992;
-		case 1083: goto st720;
+		case 9: goto st692;
+		case 32: goto st692;
+		case 40: goto tr1998;
+		case 41: goto tr1999;
+		case 69: goto st697;
+		case 87: goto st724;
+		case 1034: goto tr2003;
+		case 1083: goto st729;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1989;
-	goto tr1934;
-tr1989:
+		goto tr2000;
+	goto tr1945;
+tr2000:
 	{
 		s->number64 = 0;
 	}
@@ -51304,8 +51410,8 @@ tr1989:
 			p--; {goto st261;}
 		}
 	}
-	goto st684;
-tr1997:
+	goto st693;
+tr2008:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -51320,11 +51426,11 @@ tr1997:
 			p--; {goto st261;}
 		}
 	}
-	goto st684;
-st684:
+	goto st693;
+st693:
 	if ( ++p == pe )
-		goto _test_eof684;
-case 684:
+		goto _test_eof693;
+case 693:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51338,17 +51444,17 @@ case 684:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1994;
-		case 32: goto tr1994;
-		case 40: goto tr1995;
-		case 41: goto tr1996;
-		case 1034: goto tr1998;
-		case 1083: goto tr1999;
+		case 9: goto tr2005;
+		case 32: goto tr2005;
+		case 40: goto tr2006;
+		case 41: goto tr2007;
+		case 1034: goto tr2009;
+		case 1083: goto tr2010;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr1997;
-	goto tr1934;
-tr2001:
+		goto tr2008;
+	goto tr1945;
+tr2012:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -51356,8 +51462,8 @@ tr2001:
 		}
 		s->multiline = true;
 	}
-	goto st685;
-tr2002:
+	goto st694;
+tr2013:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -51365,13 +51471,13 @@ tr2002:
 		}
 		s->multiline = false;
 	}
-	goto st685;
-tr2004:
+	goto st694;
+tr2015:
 	{
 		s->line_counter++;
 	}
-	goto st685;
-tr1994:
+	goto st694;
+tr2005:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m2 = (uint32_t)(s->number64);
@@ -51380,8 +51486,8 @@ tr1994:
 			p--; {goto st261;}
 		}
 	}
-	goto st685;
-tr1995:
+	goto st694;
+tr2006:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m2 = (uint32_t)(s->number64);
@@ -51397,8 +51503,8 @@ tr1995:
 		}
 		s->multiline = true;
 	}
-	goto st685;
-tr1996:
+	goto st694;
+tr2007:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m2 = (uint32_t)(s->number64);
@@ -51414,8 +51520,8 @@ tr1996:
 		}
 		s->multiline = false;
 	}
-	goto st685;
-tr1998:
+	goto st694;
+tr2009:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m2 = (uint32_t)(s->number64);
@@ -51427,11 +51533,11 @@ tr1998:
 	{
 		s->line_counter++;
 	}
-	goto st685;
-st685:
+	goto st694;
+st694:
 	if ( ++p == pe )
-		goto _test_eof685;
-case 685:
+		goto _test_eof694;
+case 694:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51445,19 +51551,19 @@ case 685:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st685;
-		case 32: goto st685;
-		case 40: goto tr2001;
-		case 41: goto tr2002;
-		case 69: goto st688;
-		case 87: goto st715;
-		case 1034: goto tr2004;
-		case 1083: goto st719;
+		case 9: goto st694;
+		case 32: goto st694;
+		case 40: goto tr2012;
+		case 41: goto tr2013;
+		case 69: goto st697;
+		case 87: goto st724;
+		case 1034: goto tr2015;
+		case 1083: goto st728;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2003;
-	goto tr1934;
-tr2010:
+		goto tr2014;
+	goto tr1945;
+tr2021:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -51472,8 +51578,8 @@ tr2010:
 			p--; {goto st261;}
 		}
 	}
-	goto st686;
-tr2003:
+	goto st695;
+tr2014:
 	{
 		s->decimals = 3;
 	}
@@ -51497,11 +51603,11 @@ tr2003:
 			p--; {goto st261;}
 		}
 	}
-	goto st686;
-st686:
+	goto st695;
+st695:
 	if ( ++p == pe )
-		goto _test_eof686;
-case 686:
+		goto _test_eof695;
+case 695:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51515,18 +51621,18 @@ case 686:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2006;
-		case 32: goto tr2006;
-		case 40: goto tr2007;
-		case 41: goto tr2008;
-		case 46: goto st717;
-		case 1034: goto tr2011;
-		case 1083: goto tr2012;
+		case 9: goto tr2017;
+		case 32: goto tr2017;
+		case 40: goto tr2018;
+		case 41: goto tr2019;
+		case 46: goto st726;
+		case 1034: goto tr2022;
+		case 1083: goto tr2023;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2010;
-	goto tr1934;
-tr2014:
+		goto tr2021;
+	goto tr1945;
+tr2025:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -51534,8 +51640,8 @@ tr2014:
 		}
 		s->multiline = true;
 	}
-	goto st687;
-tr2015:
+	goto st696;
+tr2026:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -51543,13 +51649,13 @@ tr2015:
 		}
 		s->multiline = false;
 	}
-	goto st687;
-tr2016:
+	goto st696;
+tr2027:
 	{
 		s->line_counter++;
 	}
-	goto st687;
-tr2006:
+	goto st696;
+tr2017:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -51570,8 +51676,8 @@ tr2006:
 			p--; {goto st261;}
 		}
 	}
-	goto st687;
-tr2007:
+	goto st696;
+tr2018:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -51599,8 +51705,8 @@ tr2007:
 		}
 		s->multiline = true;
 	}
-	goto st687;
-tr2008:
+	goto st696;
+tr2019:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -51628,8 +51734,8 @@ tr2008:
 		}
 		s->multiline = false;
 	}
-	goto st687;
-tr2011:
+	goto st696;
+tr2022:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -51653,8 +51759,8 @@ tr2011:
 	{
 		s->line_counter++;
 	}
-	goto st687;
-tr2149:
+	goto st696;
+tr2160:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -51678,8 +51784,8 @@ tr2149:
 			p--; {goto st261;}
 		}
 	}
-	goto st687;
-tr2150:
+	goto st696;
+tr2161:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -51710,8 +51816,8 @@ tr2150:
 		}
 		s->multiline = true;
 	}
-	goto st687;
-tr2151:
+	goto st696;
+tr2162:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -51742,8 +51848,8 @@ tr2151:
 		}
 		s->multiline = false;
 	}
-	goto st687;
-tr2153:
+	goto st696;
+tr2164:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -51770,11 +51876,11 @@ tr2153:
 	{
 		s->line_counter++;
 	}
-	goto st687;
-st687:
+	goto st696;
+st696:
 	if ( ++p == pe )
-		goto _test_eof687;
-case 687:
+		goto _test_eof696;
+case 696:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51788,20 +51894,20 @@ case 687:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st687;
-		case 32: goto st687;
-		case 40: goto tr2014;
-		case 41: goto tr2015;
-		case 69: goto st688;
-		case 87: goto st715;
-		case 1034: goto tr2016;
-		case 1083: goto st716;
-	}
-	goto tr1934;
-st688:
+		case 9: goto st696;
+		case 32: goto st696;
+		case 40: goto tr2025;
+		case 41: goto tr2026;
+		case 69: goto st697;
+		case 87: goto st724;
+		case 1034: goto tr2027;
+		case 1083: goto st725;
+	}
+	goto tr1945;
+st697:
 	if ( ++p == pe )
-		goto _test_eof688;
-case 688:
+		goto _test_eof697;
+case 697:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51815,15 +51921,15 @@ case 688:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st689;
-		case 32: goto st689;
-		case 40: goto tr2019;
-		case 41: goto tr2020;
-		case 1034: goto tr2021;
-		case 1083: goto st714;
-	}
-	goto tr1934;
-tr2019:
+		case 9: goto st698;
+		case 32: goto st698;
+		case 40: goto tr2030;
+		case 41: goto tr2031;
+		case 1034: goto tr2032;
+		case 1083: goto st723;
+	}
+	goto tr1945;
+tr2030:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -51831,8 +51937,8 @@ tr2019:
 		}
 		s->multiline = true;
 	}
-	goto st689;
-tr2020:
+	goto st698;
+tr2031:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -51840,18 +51946,18 @@ tr2020:
 		}
 		s->multiline = false;
 	}
-	goto st689;
-tr2021:
+	goto st698;
+tr2032:
 	{
 		s->line_counter++;
 	}
-	goto st689;
-tr2144:
+	goto st698;
+tr2155:
 	{
 		s->loc.long_sign = -1;
 	}
-	goto st689;
-tr2145:
+	goto st698;
+tr2156:
 	{
 		s->loc.long_sign = -1;
 	}
@@ -51862,8 +51968,8 @@ tr2145:
 		}
 		s->multiline = true;
 	}
-	goto st689;
-tr2146:
+	goto st698;
+tr2157:
 	{
 		s->loc.long_sign = -1;
 	}
@@ -51874,19 +51980,19 @@ tr2146:
 		}
 		s->multiline = false;
 	}
-	goto st689;
-tr2147:
+	goto st698;
+tr2158:
 	{
 		s->loc.long_sign = -1;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st689;
-st689:
+	goto st698;
+st698:
 	if ( ++p == pe )
-		goto _test_eof689;
-case 689:
+		goto _test_eof698;
+case 698:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -51900,25 +52006,25 @@ case 689:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st689;
-		case 32: goto st689;
-		case 40: goto tr2019;
-		case 41: goto tr2020;
-		case 45: goto st690;
-		case 1034: goto tr2021;
-		case 1083: goto st714;
+		case 9: goto st698;
+		case 32: goto st698;
+		case 40: goto tr2030;
+		case 41: goto tr2031;
+		case 45: goto st699;
+		case 1034: goto tr2032;
+		case 1083: goto st723;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2024;
-	goto tr1934;
-st690:
+		goto tr2035;
+	goto tr1945;
+st699:
 	if ( ++p == pe )
-		goto _test_eof690;
-case 690:
+		goto _test_eof699;
+case 699:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2025;
-	goto tr1934;
-tr2030:
+		goto tr2036;
+	goto tr1945;
+tr2041:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -51933,8 +52039,8 @@ tr2030:
 			p--; {goto st261;}
 		}
 	}
-	goto st691;
-tr2024:
+	goto st700;
+tr2035:
 	{
 		s->decimals = 2;
 	}
@@ -51958,8 +52064,8 @@ tr2024:
 			p--; {goto st261;}
 		}
 	}
-	goto st691;
-tr2025:
+	goto st700;
+tr2036:
 	{
 		s->loc.alt_sign = -1;
 	}
@@ -51986,11 +52092,11 @@ tr2025:
 			p--; {goto st261;}
 		}
 	}
-	goto st691;
-st691:
+	goto st700;
+st700:
 	if ( ++p == pe )
-		goto _test_eof691;
-case 691:
+		goto _test_eof700;
+case 700:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -52008,23 +52114,92 @@ case 691:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2026;
-		case 32: goto tr2026;
-		case 40: goto tr2027;
-		case 41: goto tr2028;
-		case 46: goto st711;
-		case 109: goto tr2031;
-		case 2058: goto tr2032;
-		case 2107: goto tr2033;
-		case 2314: goto tr2034;
-		case 2363: goto tr2034;
-		case 2570: goto tr2035;
-		case 2619: goto tr2036;
+		case 9: goto tr2037;
+		case 32: goto tr2037;
+		case 40: goto tr2038;
+		case 41: goto tr2039;
+		case 46: goto st720;
+		case 109: goto tr2042;
+		case 2058: goto tr2043;
+		case 2107: goto tr2044;
+		case 2314: goto tr2045;
+		case 2363: goto tr2045;
+		case 2570: goto tr2046;
+		case 2619: goto tr2047;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2030;
-	goto tr1934;
+		goto tr2041;
+	goto tr1945;
+tr2049:
+	{
+		if (s->multiline == true) {
+			ERR(ZS_LEFT_PARENTHESIS);
+			p--; {goto st261;}
+		}
+		s->multiline = true;
+	}
+	goto st701;
+tr2050:
+	{
+		if (s->multiline == false) {
+			ERR(ZS_RIGHT_PARENTHESIS);
+			p--; {goto st261;}
+		}
+		s->multiline = false;
+	}
+	goto st701;
+tr2052:
+	{
+		s->line_counter++;
+	}
+	goto st701;
+tr2037:
+	{
+		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals);
+		} else if (s->decimal_counter <= s->decimals &&
+				 s->number64_tmp < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals - s->decimal_counter);
+			s->number64 += s->number64_tmp * pow(10, s->decimals);
+		} else {
+			WARN(ZS_FLOAT_OVERFLOW);
+			p--; {goto st261;}
+		}
+	}
+	{
+		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
+		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
+		{
+			s->loc.alt = (uint32_t)(s->number64);
+		} else {
+			WARN(ZS_BAD_NUMBER);
+			p--; {goto st261;}
+		}
+	}
+	goto st701;
 tr2038:
+	{
+		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals);
+		} else if (s->decimal_counter <= s->decimals &&
+				 s->number64_tmp < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals - s->decimal_counter);
+			s->number64 += s->number64_tmp * pow(10, s->decimals);
+		} else {
+			WARN(ZS_FLOAT_OVERFLOW);
+			p--; {goto st261;}
+		}
+	}
+	{
+		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
+		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
+		{
+			s->loc.alt = (uint32_t)(s->number64);
+		} else {
+			WARN(ZS_BAD_NUMBER);
+			p--; {goto st261;}
+		}
+	}
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -52032,8 +52207,30 @@ tr2038:
 		}
 		s->multiline = true;
 	}
-	goto st692;
+	goto st701;
 tr2039:
+	{
+		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals);
+		} else if (s->decimal_counter <= s->decimals &&
+				 s->number64_tmp < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals - s->decimal_counter);
+			s->number64 += s->number64_tmp * pow(10, s->decimals);
+		} else {
+			WARN(ZS_FLOAT_OVERFLOW);
+			p--; {goto st261;}
+		}
+	}
+	{
+		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
+		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
+		{
+			s->loc.alt = (uint32_t)(s->number64);
+		} else {
+			WARN(ZS_BAD_NUMBER);
+			p--; {goto st261;}
+		}
+	}
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -52041,13 +52238,38 @@ tr2039:
 		}
 		s->multiline = false;
 	}
-	goto st692;
-tr2041:
+	goto st701;
+tr2043:
+	{
+		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals);
+		} else if (s->decimal_counter <= s->decimals &&
+				 s->number64_tmp < UINT32_MAX) {
+			s->number64 *= pow(10, s->decimals - s->decimal_counter);
+			s->number64 += s->number64_tmp * pow(10, s->decimals);
+		} else {
+			WARN(ZS_FLOAT_OVERFLOW);
+			p--; {goto st261;}
+		}
+	}
+	{
+		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
+		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
+		{
+			s->loc.alt = (uint32_t)(s->number64);
+		} else {
+			WARN(ZS_BAD_NUMBER);
+			p--; {goto st261;}
+		}
+	}
 	{
 		s->line_counter++;
 	}
-	goto st692;
-tr2026:
+	goto st701;
+tr2144:
+	{
+		s->number64_tmp = s->number64;
+	}
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52070,8 +52292,11 @@ tr2026:
 			p--; {goto st261;}
 		}
 	}
-	goto st692;
-tr2027:
+	goto st701;
+tr2145:
+	{
+		s->number64_tmp = s->number64;
+	}
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52101,8 +52326,11 @@ tr2027:
 		}
 		s->multiline = true;
 	}
-	goto st692;
-tr2028:
+	goto st701;
+tr2146:
+	{
+		s->number64_tmp = s->number64;
+	}
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52132,8 +52360,11 @@ tr2028:
 		}
 		s->multiline = false;
 	}
-	goto st692;
-tr2032:
+	goto st701;
+tr2149:
+	{
+		s->number64_tmp = s->number64;
+	}
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52159,136 +52390,11 @@ tr2032:
 	{
 		s->line_counter++;
 	}
-	goto st692;
-tr2133:
-	{
-		s->number64_tmp = s->number64;
-	}
-	{
-		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals);
-		} else if (s->decimal_counter <= s->decimals &&
-				 s->number64_tmp < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals - s->decimal_counter);
-			s->number64 += s->number64_tmp * pow(10, s->decimals);
-		} else {
-			WARN(ZS_FLOAT_OVERFLOW);
-			p--; {goto st261;}
-		}
-	}
-	{
-		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
-		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
-		{
-			s->loc.alt = (uint32_t)(s->number64);
-		} else {
-			WARN(ZS_BAD_NUMBER);
-			p--; {goto st261;}
-		}
-	}
-	goto st692;
-tr2134:
-	{
-		s->number64_tmp = s->number64;
-	}
-	{
-		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals);
-		} else if (s->decimal_counter <= s->decimals &&
-				 s->number64_tmp < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals - s->decimal_counter);
-			s->number64 += s->number64_tmp * pow(10, s->decimals);
-		} else {
-			WARN(ZS_FLOAT_OVERFLOW);
-			p--; {goto st261;}
-		}
-	}
-	{
-		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
-		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
-		{
-			s->loc.alt = (uint32_t)(s->number64);
-		} else {
-			WARN(ZS_BAD_NUMBER);
-			p--; {goto st261;}
-		}
-	}
-	{
-		if (s->multiline == true) {
-			ERR(ZS_LEFT_PARENTHESIS);
-			p--; {goto st261;}
-		}
-		s->multiline = true;
-	}
-	goto st692;
-tr2135:
-	{
-		s->number64_tmp = s->number64;
-	}
-	{
-		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals);
-		} else if (s->decimal_counter <= s->decimals &&
-				 s->number64_tmp < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals - s->decimal_counter);
-			s->number64 += s->number64_tmp * pow(10, s->decimals);
-		} else {
-			WARN(ZS_FLOAT_OVERFLOW);
-			p--; {goto st261;}
-		}
-	}
-	{
-		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
-		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
-		{
-			s->loc.alt = (uint32_t)(s->number64);
-		} else {
-			WARN(ZS_BAD_NUMBER);
-			p--; {goto st261;}
-		}
-	}
-	{
-		if (s->multiline == false) {
-			ERR(ZS_RIGHT_PARENTHESIS);
-			p--; {goto st261;}
-		}
-		s->multiline = false;
-	}
-	goto st692;
-tr2138:
-	{
-		s->number64_tmp = s->number64;
-	}
-	{
-		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals);
-		} else if (s->decimal_counter <= s->decimals &&
-				 s->number64_tmp < UINT32_MAX) {
-			s->number64 *= pow(10, s->decimals - s->decimal_counter);
-			s->number64 += s->number64_tmp * pow(10, s->decimals);
-		} else {
-			WARN(ZS_FLOAT_OVERFLOW);
-			p--; {goto st261;}
-		}
-	}
-	{
-		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
-		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
-		{
-			s->loc.alt = (uint32_t)(s->number64);
-		} else {
-			WARN(ZS_BAD_NUMBER);
-			p--; {goto st261;}
-		}
-	}
-	{
-		s->line_counter++;
-	}
-	goto st692;
-st692:
+	goto st701;
+st701:
 	if ( ++p == pe )
-		goto _test_eof692;
-case 692:
+		goto _test_eof701;
+case 701:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -52306,21 +52412,21 @@ case 692:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st692;
-		case 32: goto st692;
-		case 40: goto tr2038;
-		case 41: goto tr2039;
-		case 2058: goto tr2041;
-		case 2107: goto st710;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2044;
-		case 2619: goto tr2045;
+		case 9: goto st701;
+		case 32: goto st701;
+		case 40: goto tr2049;
+		case 41: goto tr2050;
+		case 2058: goto tr2052;
+		case 2107: goto st719;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2055;
+		case 2619: goto tr2056;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2040;
-	goto tr1934;
-tr2050:
+		goto tr2051;
+	goto tr1945;
+tr2061:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -52335,8 +52441,8 @@ tr2050:
 			p--; {goto st261;}
 		}
 	}
-	goto st693;
-tr2040:
+	goto st702;
+tr2051:
 	{
 		s->decimals = 2;
 	}
@@ -52360,11 +52466,11 @@ tr2040:
 			p--; {goto st261;}
 		}
 	}
-	goto st693;
-st693:
+	goto st702;
+st702:
 	if ( ++p == pe )
-		goto _test_eof693;
-case 693:
+		goto _test_eof702;
+case 702:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -52382,23 +52488,23 @@ case 693:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2046;
-		case 32: goto tr2046;
-		case 40: goto tr2047;
-		case 41: goto tr2048;
-		case 46: goto st707;
-		case 109: goto tr2051;
-		case 2058: goto tr2052;
-		case 2107: goto tr2053;
-		case 2314: goto tr2054;
-		case 2363: goto tr2054;
-		case 2570: goto tr2055;
-		case 2619: goto tr2056;
+		case 9: goto tr2057;
+		case 32: goto tr2057;
+		case 40: goto tr2058;
+		case 41: goto tr2059;
+		case 46: goto st716;
+		case 109: goto tr2062;
+		case 2058: goto tr2063;
+		case 2107: goto tr2064;
+		case 2314: goto tr2065;
+		case 2363: goto tr2065;
+		case 2570: goto tr2066;
+		case 2619: goto tr2067;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2050;
-	goto tr1934;
-tr2058:
+		goto tr2061;
+	goto tr1945;
+tr2069:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -52406,8 +52512,8 @@ tr2058:
 		}
 		s->multiline = true;
 	}
-	goto st694;
-tr2059:
+	goto st703;
+tr2070:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -52415,13 +52521,13 @@ tr2059:
 		}
 		s->multiline = false;
 	}
-	goto st694;
-tr2061:
+	goto st703;
+tr2072:
 	{
 		s->line_counter++;
 	}
-	goto st694;
-tr2046:
+	goto st703;
+tr2057:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52442,8 +52548,8 @@ tr2046:
 			p--; {goto st261;}
 		}
 	}
-	goto st694;
-tr2047:
+	goto st703;
+tr2058:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52471,8 +52577,8 @@ tr2047:
 		}
 		s->multiline = true;
 	}
-	goto st694;
-tr2048:
+	goto st703;
+tr2059:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52500,8 +52606,8 @@ tr2048:
 		}
 		s->multiline = false;
 	}
-	goto st694;
-tr2052:
+	goto st703;
+tr2063:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52525,8 +52631,8 @@ tr2052:
 	{
 		s->line_counter++;
 	}
-	goto st694;
-tr2122:
+	goto st703;
+tr2133:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -52550,8 +52656,8 @@ tr2122:
 			p--; {goto st261;}
 		}
 	}
-	goto st694;
-tr2123:
+	goto st703;
+tr2134:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -52582,8 +52688,8 @@ tr2123:
 		}
 		s->multiline = true;
 	}
-	goto st694;
-tr2124:
+	goto st703;
+tr2135:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -52614,8 +52720,8 @@ tr2124:
 		}
 		s->multiline = false;
 	}
-	goto st694;
-tr2127:
+	goto st703;
+tr2138:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -52642,11 +52748,11 @@ tr2127:
 	{
 		s->line_counter++;
 	}
-	goto st694;
-st694:
+	goto st703;
+st703:
 	if ( ++p == pe )
-		goto _test_eof694;
-case 694:
+		goto _test_eof703;
+case 703:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -52664,21 +52770,21 @@ case 694:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st694;
-		case 32: goto st694;
-		case 40: goto tr2058;
-		case 41: goto tr2059;
-		case 2058: goto tr2061;
-		case 2107: goto st706;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2063;
-		case 2619: goto tr2064;
+		case 9: goto st703;
+		case 32: goto st703;
+		case 40: goto tr2069;
+		case 41: goto tr2070;
+		case 2058: goto tr2072;
+		case 2107: goto st715;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2074;
+		case 2619: goto tr2075;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2060;
-	goto tr1934;
-tr2069:
+		goto tr2071;
+	goto tr1945;
+tr2080:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -52693,8 +52799,8 @@ tr2069:
 			p--; {goto st261;}
 		}
 	}
-	goto st695;
-tr2060:
+	goto st704;
+tr2071:
 	{
 		s->decimals = 2;
 	}
@@ -52718,11 +52824,11 @@ tr2060:
 			p--; {goto st261;}
 		}
 	}
-	goto st695;
-st695:
+	goto st704;
+st704:
 	if ( ++p == pe )
-		goto _test_eof695;
-case 695:
+		goto _test_eof704;
+case 704:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -52740,23 +52846,23 @@ case 695:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2065;
-		case 32: goto tr2065;
-		case 40: goto tr2066;
-		case 41: goto tr2067;
-		case 46: goto st703;
-		case 109: goto tr2070;
-		case 2058: goto tr2071;
-		case 2107: goto tr2072;
-		case 2314: goto tr2073;
-		case 2363: goto tr2073;
-		case 2570: goto tr2074;
-		case 2619: goto tr2075;
+		case 9: goto tr2076;
+		case 32: goto tr2076;
+		case 40: goto tr2077;
+		case 41: goto tr2078;
+		case 46: goto st712;
+		case 109: goto tr2081;
+		case 2058: goto tr2082;
+		case 2107: goto tr2083;
+		case 2314: goto tr2084;
+		case 2363: goto tr2084;
+		case 2570: goto tr2085;
+		case 2619: goto tr2086;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2069;
-	goto tr1934;
-tr2077:
+		goto tr2080;
+	goto tr1945;
+tr2088:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -52764,8 +52870,8 @@ tr2077:
 		}
 		s->multiline = true;
 	}
-	goto st696;
-tr2078:
+	goto st705;
+tr2089:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -52773,13 +52879,13 @@ tr2078:
 		}
 		s->multiline = false;
 	}
-	goto st696;
-tr2080:
+	goto st705;
+tr2091:
 	{
 		s->line_counter++;
 	}
-	goto st696;
-tr2065:
+	goto st705;
+tr2076:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52800,8 +52906,8 @@ tr2065:
 			p--; {goto st261;}
 		}
 	}
-	goto st696;
-tr2066:
+	goto st705;
+tr2077:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52829,8 +52935,8 @@ tr2066:
 		}
 		s->multiline = true;
 	}
-	goto st696;
-tr2067:
+	goto st705;
+tr2078:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52858,8 +52964,8 @@ tr2067:
 		}
 		s->multiline = false;
 	}
-	goto st696;
-tr2071:
+	goto st705;
+tr2082:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -52883,8 +52989,8 @@ tr2071:
 	{
 		s->line_counter++;
 	}
-	goto st696;
-tr2111:
+	goto st705;
+tr2122:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -52908,8 +53014,8 @@ tr2111:
 			p--; {goto st261;}
 		}
 	}
-	goto st696;
-tr2112:
+	goto st705;
+tr2123:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -52940,8 +53046,8 @@ tr2112:
 		}
 		s->multiline = true;
 	}
-	goto st696;
-tr2113:
+	goto st705;
+tr2124:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -52972,8 +53078,8 @@ tr2113:
 		}
 		s->multiline = false;
 	}
-	goto st696;
-tr2116:
+	goto st705;
+tr2127:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53000,11 +53106,11 @@ tr2116:
 	{
 		s->line_counter++;
 	}
-	goto st696;
-st696:
+	goto st705;
+st705:
 	if ( ++p == pe )
-		goto _test_eof696;
-case 696:
+		goto _test_eof705;
+case 705:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -53022,21 +53128,21 @@ case 696:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st696;
-		case 32: goto st696;
-		case 40: goto tr2077;
-		case 41: goto tr2078;
-		case 2058: goto tr2080;
-		case 2107: goto st702;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2082;
-		case 2619: goto tr2083;
+		case 9: goto st705;
+		case 32: goto st705;
+		case 40: goto tr2088;
+		case 41: goto tr2089;
+		case 2058: goto tr2091;
+		case 2107: goto st711;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2093;
+		case 2619: goto tr2094;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2079;
-	goto tr1934;
-tr2088:
+		goto tr2090;
+	goto tr1945;
+tr2099:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -53051,8 +53157,8 @@ tr2088:
 			p--; {goto st261;}
 		}
 	}
-	goto st697;
-tr2079:
+	goto st706;
+tr2090:
 	{
 		s->decimals = 2;
 	}
@@ -53076,11 +53182,11 @@ tr2079:
 			p--; {goto st261;}
 		}
 	}
-	goto st697;
-st697:
+	goto st706;
+st706:
 	if ( ++p == pe )
-		goto _test_eof697;
-case 697:
+		goto _test_eof706;
+case 706:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -53098,23 +53204,23 @@ case 697:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2084;
-		case 32: goto tr2084;
-		case 40: goto tr2085;
-		case 41: goto tr2086;
-		case 46: goto st700;
-		case 109: goto tr2084;
-		case 2058: goto tr2089;
-		case 2107: goto tr2090;
-		case 2314: goto tr2091;
-		case 2363: goto tr2091;
-		case 2570: goto tr2092;
-		case 2619: goto tr2093;
+		case 9: goto tr2095;
+		case 32: goto tr2095;
+		case 40: goto tr2096;
+		case 41: goto tr2097;
+		case 46: goto st709;
+		case 109: goto tr2095;
+		case 2058: goto tr2100;
+		case 2107: goto tr2101;
+		case 2314: goto tr2102;
+		case 2363: goto tr2102;
+		case 2570: goto tr2103;
+		case 2619: goto tr2104;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2088;
-	goto tr1934;
-tr2095:
+		goto tr2099;
+	goto tr1945;
+tr2106:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -53122,8 +53228,8 @@ tr2095:
 		}
 		s->multiline = true;
 	}
-	goto st698;
-tr2096:
+	goto st707;
+tr2107:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -53131,13 +53237,13 @@ tr2096:
 		}
 		s->multiline = false;
 	}
-	goto st698;
-tr2097:
+	goto st707;
+tr2108:
 	{
 		s->line_counter++;
 	}
-	goto st698;
-tr2084:
+	goto st707;
+tr2095:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53158,8 +53264,8 @@ tr2084:
 			p--; {goto st261;}
 		}
 	}
-	goto st698;
-tr2085:
+	goto st707;
+tr2096:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53187,8 +53293,8 @@ tr2085:
 		}
 		s->multiline = true;
 	}
-	goto st698;
-tr2086:
+	goto st707;
+tr2097:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53216,8 +53322,8 @@ tr2086:
 		}
 		s->multiline = false;
 	}
-	goto st698;
-tr2089:
+	goto st707;
+tr2100:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53241,8 +53347,8 @@ tr2089:
 	{
 		s->line_counter++;
 	}
-	goto st698;
-tr2101:
+	goto st707;
+tr2112:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53266,8 +53372,8 @@ tr2101:
 			p--; {goto st261;}
 		}
 	}
-	goto st698;
-tr2102:
+	goto st707;
+tr2113:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53298,8 +53404,8 @@ tr2102:
 		}
 		s->multiline = true;
 	}
-	goto st698;
-tr2103:
+	goto st707;
+tr2114:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53330,8 +53436,8 @@ tr2103:
 		}
 		s->multiline = false;
 	}
-	goto st698;
-tr2105:
+	goto st707;
+tr2116:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53358,11 +53464,11 @@ tr2105:
 	{
 		s->line_counter++;
 	}
-	goto st698;
-st698:
+	goto st707;
+st707:
 	if ( ++p == pe )
-		goto _test_eof698;
-case 698:
+		goto _test_eof707;
+case 707:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -53380,19 +53486,19 @@ case 698:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st698;
-		case 32: goto st698;
-		case 40: goto tr2095;
-		case 41: goto tr2096;
-		case 2058: goto tr2097;
-		case 2107: goto st699;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2099;
-		case 2619: goto tr2100;
-	}
-	goto tr1934;
-tr2090:
+		case 9: goto st707;
+		case 32: goto st707;
+		case 40: goto tr2106;
+		case 41: goto tr2107;
+		case 2058: goto tr2108;
+		case 2107: goto st708;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2110;
+		case 2619: goto tr2111;
+	}
+	goto tr1945;
+tr2101:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53413,8 +53519,8 @@ tr2090:
 			p--; {goto st261;}
 		}
 	}
-	goto st699;
-tr2106:
+	goto st708;
+tr2117:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53438,11 +53544,11 @@ tr2106:
 			p--; {goto st261;}
 		}
 	}
-	goto st699;
-st699:
+	goto st708;
+st708:
 	if ( ++p == pe )
-		goto _test_eof699;
-case 699:
+		goto _test_eof708;
+case 708:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -53462,11 +53568,11 @@ case 699:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2097;
+		goto tr2108;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st699;
-	goto tr1934;
-tr2034:
+		goto st708;
+	goto tr1945;
+tr2045:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53518,8 +53624,8 @@ tr2034:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2043:
+	goto st1164;
+tr2054:
 	{
 		// Write version.
 		*(rdata_tail) = 0;
@@ -53549,8 +53655,8 @@ tr2043:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2054:
+	goto st1164;
+tr2065:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53600,8 +53706,8 @@ tr2054:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2073:
+	goto st1164;
+tr2084:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53651,8 +53757,8 @@ tr2073:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2091:
+	goto st1164;
+tr2102:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -53702,8 +53808,8 @@ tr2091:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2107:
+	goto st1164;
+tr2118:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53756,8 +53862,8 @@ tr2107:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2118:
+	goto st1164;
+tr2129:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53810,8 +53916,8 @@ tr2118:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2129:
+	goto st1164;
+tr2140:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53864,8 +53970,8 @@ tr2129:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-tr2140:
+	goto st1164;
+tr2151:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -53920,13 +54026,13 @@ tr2140:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1155;
-st1155:
+	goto st1164;
+st1164:
 	if ( ++p == pe )
-		goto _test_eof1155;
-case 1155:
+		goto _test_eof1164;
+case 1164:
 	goto st0;
-tr2099:
+tr2110:
 	{
 		s->line_counter++;
 	}
@@ -53959,8 +54065,8 @@ tr2099:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1156;
-tr2092:
+	goto st1165;
+tr2103:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -54013,8 +54119,8 @@ tr2092:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1156;
-tr2108:
+	goto st1165;
+tr2119:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54070,11 +54176,11 @@ tr2108:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1156;
-st1156:
+	goto st1165;
+st1165:
 	if ( ++p == pe )
-		goto _test_eof1156;
-case 1156:
+		goto _test_eof1165;
+case 1165:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -54092,19 +54198,19 @@ case 1156:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st698;
-		case 32: goto st698;
-		case 40: goto tr2095;
-		case 41: goto tr2096;
-		case 2058: goto tr2097;
-		case 2107: goto st699;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2099;
-		case 2619: goto tr2100;
-	}
-	goto tr1934;
-tr2100:
+		case 9: goto st707;
+		case 32: goto st707;
+		case 40: goto tr2106;
+		case 41: goto tr2107;
+		case 2058: goto tr2108;
+		case 2107: goto st708;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2110;
+		case 2619: goto tr2111;
+	}
+	goto tr1945;
+tr2111:
 	{
 		// Write version.
 		*(rdata_tail) = 0;
@@ -54134,8 +54240,8 @@ tr2100:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1157;
-tr2093:
+	goto st1166;
+tr2104:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -54185,8 +54291,8 @@ tr2093:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1157;
-tr2109:
+	goto st1166;
+tr2120:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54239,11 +54345,11 @@ tr2109:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1157;
-st1157:
+	goto st1166;
+st1166:
 	if ( ++p == pe )
-		goto _test_eof1157;
-case 1157:
+		goto _test_eof1166;
+case 1166:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -54263,14 +54369,14 @@ case 1157:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2097;
+		goto tr2108;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st699;
-	goto tr1934;
-st700:
+		goto st708;
+	goto tr1945;
+st709:
 	if ( ++p == pe )
-		goto _test_eof700;
-case 700:
+		goto _test_eof709;
+case 709:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -54288,22 +54394,22 @@ case 700:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2101;
-		case 32: goto tr2101;
-		case 40: goto tr2102;
-		case 41: goto tr2103;
-		case 109: goto tr2101;
-		case 2058: goto tr2105;
-		case 2107: goto tr2106;
-		case 2314: goto tr2107;
-		case 2363: goto tr2107;
-		case 2570: goto tr2108;
-		case 2619: goto tr2109;
+		case 9: goto tr2112;
+		case 32: goto tr2112;
+		case 40: goto tr2113;
+		case 41: goto tr2114;
+		case 109: goto tr2112;
+		case 2058: goto tr2116;
+		case 2107: goto tr2117;
+		case 2314: goto tr2118;
+		case 2363: goto tr2118;
+		case 2570: goto tr2119;
+		case 2619: goto tr2120;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2104;
-	goto tr1934;
-tr2104:
+		goto tr2115;
+	goto tr1945;
+tr2115:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54327,8 +54433,8 @@ tr2104:
 	{
 		s->decimal_counter++;
 	}
-	goto st701;
-tr2110:
+	goto st710;
+tr2121:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -54346,11 +54452,11 @@ tr2110:
 	{
 		s->decimal_counter++;
 	}
-	goto st701;
-st701:
+	goto st710;
+st710:
 	if ( ++p == pe )
-		goto _test_eof701;
-case 701:
+		goto _test_eof710;
+case 710:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -54368,22 +54474,22 @@ case 701:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2084;
-		case 32: goto tr2084;
-		case 40: goto tr2085;
-		case 41: goto tr2086;
-		case 109: goto tr2084;
-		case 2058: goto tr2089;
-		case 2107: goto tr2090;
-		case 2314: goto tr2091;
-		case 2363: goto tr2091;
-		case 2570: goto tr2092;
-		case 2619: goto tr2093;
+		case 9: goto tr2095;
+		case 32: goto tr2095;
+		case 40: goto tr2096;
+		case 41: goto tr2097;
+		case 109: goto tr2095;
+		case 2058: goto tr2100;
+		case 2107: goto tr2101;
+		case 2314: goto tr2102;
+		case 2363: goto tr2102;
+		case 2570: goto tr2103;
+		case 2619: goto tr2104;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2110;
-	goto tr1934;
-tr2072:
+		goto tr2121;
+	goto tr1945;
+tr2083:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -54404,8 +54510,8 @@ tr2072:
 			p--; {goto st261;}
 		}
 	}
-	goto st702;
-tr2117:
+	goto st711;
+tr2128:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54429,11 +54535,11 @@ tr2117:
 			p--; {goto st261;}
 		}
 	}
-	goto st702;
-st702:
+	goto st711;
+st711:
 	if ( ++p == pe )
-		goto _test_eof702;
-case 702:
+		goto _test_eof711;
+case 711:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -54453,11 +54559,11 @@ case 702:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2080;
+		goto tr2091;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st702;
-	goto tr1934;
-tr2082:
+		goto st711;
+	goto tr1945;
+tr2093:
 	{
 		s->line_counter++;
 	}
@@ -54490,8 +54596,8 @@ tr2082:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1158;
-tr2074:
+	goto st1167;
+tr2085:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -54544,8 +54650,8 @@ tr2074:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1158;
-tr2119:
+	goto st1167;
+tr2130:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54601,11 +54707,11 @@ tr2119:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1158;
-st1158:
+	goto st1167;
+st1167:
 	if ( ++p == pe )
-		goto _test_eof1158;
-case 1158:
+		goto _test_eof1167;
+case 1167:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -54623,21 +54729,21 @@ case 1158:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st696;
-		case 32: goto st696;
-		case 40: goto tr2077;
-		case 41: goto tr2078;
-		case 2058: goto tr2080;
-		case 2107: goto st702;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2082;
-		case 2619: goto tr2083;
+		case 9: goto st705;
+		case 32: goto st705;
+		case 40: goto tr2088;
+		case 41: goto tr2089;
+		case 2058: goto tr2091;
+		case 2107: goto st711;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2093;
+		case 2619: goto tr2094;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2079;
-	goto tr1934;
-tr2083:
+		goto tr2090;
+	goto tr1945;
+tr2094:
 	{
 		// Write version.
 		*(rdata_tail) = 0;
@@ -54667,8 +54773,8 @@ tr2083:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1159;
-tr2075:
+	goto st1168;
+tr2086:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -54718,8 +54824,8 @@ tr2075:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1159;
-tr2120:
+	goto st1168;
+tr2131:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54772,11 +54878,11 @@ tr2120:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1159;
-st1159:
+	goto st1168;
+st1168:
 	if ( ++p == pe )
-		goto _test_eof1159;
-case 1159:
+		goto _test_eof1168;
+case 1168:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -54796,14 +54902,14 @@ case 1159:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2080;
+		goto tr2091;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st702;
-	goto tr1934;
-st703:
+		goto st711;
+	goto tr1945;
+st712:
 	if ( ++p == pe )
-		goto _test_eof703;
-case 703:
+		goto _test_eof712;
+case 712:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -54821,22 +54927,22 @@ case 703:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2111;
-		case 32: goto tr2111;
-		case 40: goto tr2112;
-		case 41: goto tr2113;
-		case 109: goto tr2115;
-		case 2058: goto tr2116;
-		case 2107: goto tr2117;
-		case 2314: goto tr2118;
-		case 2363: goto tr2118;
-		case 2570: goto tr2119;
-		case 2619: goto tr2120;
+		case 9: goto tr2122;
+		case 32: goto tr2122;
+		case 40: goto tr2123;
+		case 41: goto tr2124;
+		case 109: goto tr2126;
+		case 2058: goto tr2127;
+		case 2107: goto tr2128;
+		case 2314: goto tr2129;
+		case 2363: goto tr2129;
+		case 2570: goto tr2130;
+		case 2619: goto tr2131;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2114;
-	goto tr1934;
-tr2114:
+		goto tr2125;
+	goto tr1945;
+tr2125:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54860,8 +54966,8 @@ tr2114:
 	{
 		s->decimal_counter++;
 	}
-	goto st704;
-tr2121:
+	goto st713;
+tr2132:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -54879,11 +54985,11 @@ tr2121:
 	{
 		s->decimal_counter++;
 	}
-	goto st704;
-st704:
+	goto st713;
+st713:
 	if ( ++p == pe )
-		goto _test_eof704;
-case 704:
+		goto _test_eof713;
+case 713:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -54901,22 +55007,22 @@ case 704:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2065;
-		case 32: goto tr2065;
-		case 40: goto tr2066;
-		case 41: goto tr2067;
-		case 109: goto tr2070;
-		case 2058: goto tr2071;
-		case 2107: goto tr2072;
-		case 2314: goto tr2073;
-		case 2363: goto tr2073;
-		case 2570: goto tr2074;
-		case 2619: goto tr2075;
+		case 9: goto tr2076;
+		case 32: goto tr2076;
+		case 40: goto tr2077;
+		case 41: goto tr2078;
+		case 109: goto tr2081;
+		case 2058: goto tr2082;
+		case 2107: goto tr2083;
+		case 2314: goto tr2084;
+		case 2363: goto tr2084;
+		case 2570: goto tr2085;
+		case 2619: goto tr2086;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2121;
-	goto tr1934;
-tr2070:
+		goto tr2132;
+	goto tr1945;
+tr2081:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -54937,8 +55043,8 @@ tr2070:
 			p--; {goto st261;}
 		}
 	}
-	goto st705;
-tr2115:
+	goto st714;
+tr2126:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -54962,11 +55068,11 @@ tr2115:
 			p--; {goto st261;}
 		}
 	}
-	goto st705;
-st705:
+	goto st714;
+st714:
 	if ( ++p == pe )
-		goto _test_eof705;
-case 705:
+		goto _test_eof714;
+case 714:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -54984,19 +55090,19 @@ case 705:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st696;
-		case 32: goto st696;
-		case 40: goto tr2077;
-		case 41: goto tr2078;
-		case 2058: goto tr2080;
-		case 2107: goto st702;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2082;
-		case 2619: goto tr2083;
+		case 9: goto st705;
+		case 32: goto st705;
+		case 40: goto tr2088;
+		case 41: goto tr2089;
+		case 2058: goto tr2091;
+		case 2107: goto st711;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2093;
+		case 2619: goto tr2094;
 	}
-	goto tr1934;
-tr2053:
+	goto tr1945;
+tr2064:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -55017,8 +55123,8 @@ tr2053:
 			p--; {goto st261;}
 		}
 	}
-	goto st706;
-tr2128:
+	goto st715;
+tr2139:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -55042,11 +55148,11 @@ tr2128:
 			p--; {goto st261;}
 		}
 	}
-	goto st706;
-st706:
+	goto st715;
+st715:
 	if ( ++p == pe )
-		goto _test_eof706;
-case 706:
+		goto _test_eof715;
+case 715:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -55066,11 +55172,11 @@ case 706:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2061;
+		goto tr2072;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st706;
-	goto tr1934;
-tr2063:
+		goto st715;
+	goto tr1945;
+tr2074:
 	{
 		s->line_counter++;
 	}
@@ -55103,8 +55209,8 @@ tr2063:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1160;
-tr2055:
+	goto st1169;
+tr2066:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -55157,8 +55263,8 @@ tr2055:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1160;
-tr2130:
+	goto st1169;
+tr2141:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -55214,11 +55320,11 @@ tr2130:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1160;
-st1160:
+	goto st1169;
+st1169:
 	if ( ++p == pe )
-		goto _test_eof1160;
-case 1160:
+		goto _test_eof1169;
+case 1169:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -55236,21 +55342,21 @@ case 1160:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st694;
-		case 32: goto st694;
-		case 40: goto tr2058;
-		case 41: goto tr2059;
-		case 2058: goto tr2061;
-		case 2107: goto st706;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2063;
-		case 2619: goto tr2064;
+		case 9: goto st703;
+		case 32: goto st703;
+		case 40: goto tr2069;
+		case 41: goto tr2070;
+		case 2058: goto tr2072;
+		case 2107: goto st715;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2074;
+		case 2619: goto tr2075;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2060;
-	goto tr1934;
-tr2064:
+		goto tr2071;
+	goto tr1945;
+tr2075:
 	{
 		// Write version.
 		*(rdata_tail) = 0;
@@ -55280,8 +55386,8 @@ tr2064:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1161;
-tr2056:
+	goto st1170;
+tr2067:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -55331,8 +55437,8 @@ tr2056:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1161;
-tr2131:
+	goto st1170;
+tr2142:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -55385,11 +55491,11 @@ tr2131:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1161;
-st1161:
+	goto st1170;
+st1170:
 	if ( ++p == pe )
-		goto _test_eof1161;
-case 1161:
+		goto _test_eof1170;
+case 1170:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -55409,14 +55515,14 @@ case 1161:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2061;
+		goto tr2072;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st706;
-	goto tr1934;
-st707:
+		goto st715;
+	goto tr1945;
+st716:
 	if ( ++p == pe )
-		goto _test_eof707;
-case 707:
+		goto _test_eof716;
+case 716:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -55434,22 +55540,22 @@ case 707:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2122;
-		case 32: goto tr2122;
-		case 40: goto tr2123;
-		case 41: goto tr2124;
-		case 109: goto tr2126;
-		case 2058: goto tr2127;
-		case 2107: goto tr2128;
-		case 2314: goto tr2129;
-		case 2363: goto tr2129;
-		case 2570: goto tr2130;
-		case 2619: goto tr2131;
+		case 9: goto tr2133;
+		case 32: goto tr2133;
+		case 40: goto tr2134;
+		case 41: goto tr2135;
+		case 109: goto tr2137;
+		case 2058: goto tr2138;
+		case 2107: goto tr2139;
+		case 2314: goto tr2140;
+		case 2363: goto tr2140;
+		case 2570: goto tr2141;
+		case 2619: goto tr2142;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2125;
-	goto tr1934;
-tr2125:
+		goto tr2136;
+	goto tr1945;
+tr2136:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -55473,8 +55579,8 @@ tr2125:
 	{
 		s->decimal_counter++;
 	}
-	goto st708;
-tr2132:
+	goto st717;
+tr2143:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -55492,11 +55598,11 @@ tr2132:
 	{
 		s->decimal_counter++;
 	}
-	goto st708;
-st708:
+	goto st717;
+st717:
 	if ( ++p == pe )
-		goto _test_eof708;
-case 708:
+		goto _test_eof717;
+case 717:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -55514,22 +55620,22 @@ case 708:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2046;
-		case 32: goto tr2046;
-		case 40: goto tr2047;
-		case 41: goto tr2048;
-		case 109: goto tr2051;
-		case 2058: goto tr2052;
-		case 2107: goto tr2053;
-		case 2314: goto tr2054;
-		case 2363: goto tr2054;
-		case 2570: goto tr2055;
-		case 2619: goto tr2056;
+		case 9: goto tr2057;
+		case 32: goto tr2057;
+		case 40: goto tr2058;
+		case 41: goto tr2059;
+		case 109: goto tr2062;
+		case 2058: goto tr2063;
+		case 2107: goto tr2064;
+		case 2314: goto tr2065;
+		case 2363: goto tr2065;
+		case 2570: goto tr2066;
+		case 2619: goto tr2067;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2132;
-	goto tr1934;
-tr2051:
+		goto tr2143;
+	goto tr1945;
+tr2062:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -55550,8 +55656,8 @@ tr2051:
 			p--; {goto st261;}
 		}
 	}
-	goto st709;
-tr2126:
+	goto st718;
+tr2137:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -55575,11 +55681,11 @@ tr2126:
 			p--; {goto st261;}
 		}
 	}
-	goto st709;
-st709:
+	goto st718;
+st718:
 	if ( ++p == pe )
-		goto _test_eof709;
-case 709:
+		goto _test_eof718;
+case 718:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -55597,19 +55703,19 @@ case 709:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st694;
-		case 32: goto st694;
-		case 40: goto tr2058;
-		case 41: goto tr2059;
-		case 2058: goto tr2061;
-		case 2107: goto st706;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2063;
-		case 2619: goto tr2064;
+		case 9: goto st703;
+		case 32: goto st703;
+		case 40: goto tr2069;
+		case 41: goto tr2070;
+		case 2058: goto tr2072;
+		case 2107: goto st715;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2074;
+		case 2619: goto tr2075;
 	}
-	goto tr1934;
-tr2033:
+	goto tr1945;
+tr2044:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -55632,8 +55738,8 @@ tr2033:
 			p--; {goto st261;}
 		}
 	}
-	goto st710;
-tr2139:
+	goto st719;
+tr2150:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -55659,11 +55765,11 @@ tr2139:
 			p--; {goto st261;}
 		}
 	}
-	goto st710;
-st710:
+	goto st719;
+st719:
 	if ( ++p == pe )
-		goto _test_eof710;
-case 710:
+		goto _test_eof719;
+case 719:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -55683,11 +55789,11 @@ case 710:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2041;
+		goto tr2052;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st710;
-	goto tr1934;
-tr2035:
+		goto st719;
+	goto tr1945;
+tr2046:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -55742,8 +55848,8 @@ tr2035:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1162;
-tr2044:
+	goto st1171;
+tr2055:
 	{
 		s->line_counter++;
 	}
@@ -55776,8 +55882,8 @@ tr2044:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1162;
-tr2141:
+	goto st1171;
+tr2152:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -55835,11 +55941,11 @@ tr2141:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1162;
-st1162:
+	goto st1171;
+st1171:
 	if ( ++p == pe )
-		goto _test_eof1162;
-case 1162:
+		goto _test_eof1171;
+case 1171:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -55857,21 +55963,21 @@ case 1162:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st692;
-		case 32: goto st692;
-		case 40: goto tr2038;
-		case 41: goto tr2039;
-		case 2058: goto tr2041;
-		case 2107: goto st710;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2044;
-		case 2619: goto tr2045;
+		case 9: goto st701;
+		case 32: goto st701;
+		case 40: goto tr2049;
+		case 41: goto tr2050;
+		case 2058: goto tr2052;
+		case 2107: goto st719;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2055;
+		case 2619: goto tr2056;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2040;
-	goto tr1934;
-tr2036:
+		goto tr2051;
+	goto tr1945;
+tr2047:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -55923,8 +56029,8 @@ tr2036:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1163;
-tr2045:
+	goto st1172;
+tr2056:
 	{
 		// Write version.
 		*(rdata_tail) = 0;
@@ -55954,8 +56060,8 @@ tr2045:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1163;
-tr2142:
+	goto st1172;
+tr2153:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -56010,11 +56116,11 @@ tr2142:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1163;
-st1163:
+	goto st1172;
+st1172:
 	if ( ++p == pe )
-		goto _test_eof1163;
-case 1163:
+		goto _test_eof1172;
+case 1172:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56034,14 +56140,14 @@ case 1163:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2041;
+		goto tr2052;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st710;
-	goto tr1934;
-st711:
+		goto st719;
+	goto tr1945;
+st720:
 	if ( ++p == pe )
-		goto _test_eof711;
-case 711:
+		goto _test_eof720;
+case 720:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56059,22 +56165,22 @@ case 711:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2133;
-		case 32: goto tr2133;
-		case 40: goto tr2134;
-		case 41: goto tr2135;
-		case 109: goto tr2137;
-		case 2058: goto tr2138;
-		case 2107: goto tr2139;
-		case 2314: goto tr2140;
-		case 2363: goto tr2140;
-		case 2570: goto tr2141;
-		case 2619: goto tr2142;
+		case 9: goto tr2144;
+		case 32: goto tr2144;
+		case 40: goto tr2145;
+		case 41: goto tr2146;
+		case 109: goto tr2148;
+		case 2058: goto tr2149;
+		case 2107: goto tr2150;
+		case 2314: goto tr2151;
+		case 2363: goto tr2151;
+		case 2570: goto tr2152;
+		case 2619: goto tr2153;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2136;
-	goto tr1934;
-tr2136:
+		goto tr2147;
+	goto tr1945;
+tr2147:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -56098,8 +56204,8 @@ tr2136:
 	{
 		s->decimal_counter++;
 	}
-	goto st712;
-tr2143:
+	goto st721;
+tr2154:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -56117,11 +56223,11 @@ tr2143:
 	{
 		s->decimal_counter++;
 	}
-	goto st712;
-st712:
+	goto st721;
+st721:
 	if ( ++p == pe )
-		goto _test_eof712;
-case 712:
+		goto _test_eof721;
+case 721:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56139,22 +56245,22 @@ case 712:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2026;
-		case 32: goto tr2026;
-		case 40: goto tr2027;
-		case 41: goto tr2028;
-		case 109: goto tr2031;
-		case 2058: goto tr2032;
-		case 2107: goto tr2033;
-		case 2314: goto tr2034;
-		case 2363: goto tr2034;
-		case 2570: goto tr2035;
-		case 2619: goto tr2036;
+		case 9: goto tr2037;
+		case 32: goto tr2037;
+		case 40: goto tr2038;
+		case 41: goto tr2039;
+		case 109: goto tr2042;
+		case 2058: goto tr2043;
+		case 2107: goto tr2044;
+		case 2314: goto tr2045;
+		case 2363: goto tr2045;
+		case 2570: goto tr2046;
+		case 2619: goto tr2047;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2143;
-	goto tr1934;
-tr2031:
+		goto tr2154;
+	goto tr1945;
+tr2042:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -56177,8 +56283,8 @@ tr2031:
 			p--; {goto st261;}
 		}
 	}
-	goto st713;
-tr2137:
+	goto st722;
+tr2148:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -56204,11 +56310,11 @@ tr2137:
 			p--; {goto st261;}
 		}
 	}
-	goto st713;
-st713:
+	goto st722;
+st722:
 	if ( ++p == pe )
-		goto _test_eof713;
-case 713:
+		goto _test_eof722;
+case 722:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56226,27 +56332,27 @@ case 713:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st692;
-		case 32: goto st692;
-		case 40: goto tr2038;
-		case 41: goto tr2039;
-		case 2058: goto tr2041;
-		case 2107: goto st710;
-		case 2314: goto tr2043;
-		case 2363: goto tr2043;
-		case 2570: goto tr2044;
-		case 2619: goto tr2045;
-	}
-	goto tr1934;
-tr2148:
+		case 9: goto st701;
+		case 32: goto st701;
+		case 40: goto tr2049;
+		case 41: goto tr2050;
+		case 2058: goto tr2052;
+		case 2107: goto st719;
+		case 2314: goto tr2054;
+		case 2363: goto tr2054;
+		case 2570: goto tr2055;
+		case 2619: goto tr2056;
+	}
+	goto tr1945;
+tr2159:
 	{
 		s->loc.long_sign = -1;
 	}
-	goto st714;
-st714:
+	goto st723;
+st723:
 	if ( ++p == pe )
-		goto _test_eof714;
-case 714:
+		goto _test_eof723;
+case 723:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56266,14 +56372,14 @@ case 714:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2021;
+		goto tr2032;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st714;
-	goto tr1934;
-st715:
+		goto st723;
+	goto tr1945;
+st724:
 	if ( ++p == pe )
-		goto _test_eof715;
-case 715:
+		goto _test_eof724;
+case 724:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56287,15 +56393,15 @@ case 715:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2144;
-		case 32: goto tr2144;
-		case 40: goto tr2145;
-		case 41: goto tr2146;
-		case 1034: goto tr2147;
-		case 1083: goto tr2148;
+		case 9: goto tr2155;
+		case 32: goto tr2155;
+		case 40: goto tr2156;
+		case 41: goto tr2157;
+		case 1034: goto tr2158;
+		case 1083: goto tr2159;
 	}
-	goto tr1934;
-tr2012:
+	goto tr1945;
+tr2023:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -56316,8 +56422,8 @@ tr2012:
 			p--; {goto st261;}
 		}
 	}
-	goto st716;
-tr2154:
+	goto st725;
+tr2165:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -56341,11 +56447,11 @@ tr2154:
 			p--; {goto st261;}
 		}
 	}
-	goto st716;
-st716:
+	goto st725;
+st725:
 	if ( ++p == pe )
-		goto _test_eof716;
-case 716:
+		goto _test_eof725;
+case 725:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56365,14 +56471,14 @@ case 716:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2016;
+		goto tr2027;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st716;
-	goto tr1934;
-st717:
+		goto st725;
+	goto tr1945;
+st726:
 	if ( ++p == pe )
-		goto _test_eof717;
-case 717:
+		goto _test_eof726;
+case 726:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56386,17 +56492,17 @@ case 717:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2149;
-		case 32: goto tr2149;
-		case 40: goto tr2150;
-		case 41: goto tr2151;
-		case 1034: goto tr2153;
-		case 1083: goto tr2154;
+		case 9: goto tr2160;
+		case 32: goto tr2160;
+		case 40: goto tr2161;
+		case 41: goto tr2162;
+		case 1034: goto tr2164;
+		case 1083: goto tr2165;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2152;
-	goto tr1934;
-tr2152:
+		goto tr2163;
+	goto tr1945;
+tr2163:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -56420,8 +56526,8 @@ tr2152:
 	{
 		s->decimal_counter++;
 	}
-	goto st718;
-tr2155:
+	goto st727;
+tr2166:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -56439,11 +56545,11 @@ tr2155:
 	{
 		s->decimal_counter++;
 	}
-	goto st718;
-st718:
+	goto st727;
+st727:
 	if ( ++p == pe )
-		goto _test_eof718;
-case 718:
+		goto _test_eof727;
+case 727:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56457,17 +56563,17 @@ case 718:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2006;
-		case 32: goto tr2006;
-		case 40: goto tr2007;
-		case 41: goto tr2008;
-		case 1034: goto tr2011;
-		case 1083: goto tr2012;
+		case 9: goto tr2017;
+		case 32: goto tr2017;
+		case 40: goto tr2018;
+		case 41: goto tr2019;
+		case 1034: goto tr2022;
+		case 1083: goto tr2023;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2155;
-	goto tr1934;
-tr1999:
+		goto tr2166;
+	goto tr1945;
+tr2010:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m2 = (uint32_t)(s->number64);
@@ -56476,11 +56582,11 @@ tr1999:
 			p--; {goto st261;}
 		}
 	}
-	goto st719;
-st719:
+	goto st728;
+st728:
 	if ( ++p == pe )
-		goto _test_eof719;
-case 719:
+		goto _test_eof728;
+case 728:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56500,11 +56606,11 @@ case 719:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2004;
+		goto tr2015;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st719;
-	goto tr1934;
-tr1985:
+		goto st728;
+	goto tr1945;
+tr1996:
 	{
 		if (s->number64 <= 180) {
 			s->loc.d2 = (uint32_t)(s->number64);
@@ -56513,11 +56619,11 @@ tr1985:
 			p--; {goto st261;}
 		}
 	}
-	goto st720;
-st720:
+	goto st729;
+st729:
 	if ( ++p == pe )
-		goto _test_eof720;
-case 720:
+		goto _test_eof729;
+case 729:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56537,19 +56643,19 @@ case 720:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1992;
+		goto tr2003;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st720;
-	goto tr1934;
-tr2160:
+		goto st729;
+	goto tr1945;
+tr2171:
 	{
 		s->loc.lat_sign = -1;
 	}
-	goto st721;
-st721:
+	goto st730;
+st730:
 	if ( ++p == pe )
-		goto _test_eof721;
-case 721:
+		goto _test_eof730;
+case 730:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56569,14 +56675,14 @@ case 721:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1977;
+		goto tr1988;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st721;
-	goto tr1934;
-st722:
+		goto st730;
+	goto tr1945;
+st731:
 	if ( ++p == pe )
-		goto _test_eof722;
-case 722:
+		goto _test_eof731;
+case 731:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56590,15 +56696,15 @@ case 722:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2156;
-		case 32: goto tr2156;
-		case 40: goto tr2157;
-		case 41: goto tr2158;
-		case 1034: goto tr2159;
-		case 1083: goto tr2160;
-	}
-	goto tr1934;
-tr1968:
+		case 9: goto tr2167;
+		case 32: goto tr2167;
+		case 40: goto tr2168;
+		case 41: goto tr2169;
+		case 1034: goto tr2170;
+		case 1083: goto tr2171;
+	}
+	goto tr1945;
+tr1979:
 	{
 		if (s->decimal_counter == 0 && s->number64 < UINT32_MAX) {
 			s->number64 *= pow(10, s->decimals);
@@ -56619,8 +56725,8 @@ tr1968:
 			p--; {goto st261;}
 		}
 	}
-	goto st723;
-tr2166:
+	goto st732;
+tr2177:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -56644,11 +56750,11 @@ tr2166:
 			p--; {goto st261;}
 		}
 	}
-	goto st723;
-st723:
+	goto st732;
+st732:
 	if ( ++p == pe )
-		goto _test_eof723;
-case 723:
+		goto _test_eof732;
+case 732:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56668,14 +56774,14 @@ case 723:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1972;
+		goto tr1983;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st723;
-	goto tr1934;
-st724:
+		goto st732;
+	goto tr1945;
+st733:
 	if ( ++p == pe )
-		goto _test_eof724;
-case 724:
+		goto _test_eof733;
+case 733:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56689,17 +56795,17 @@ case 724:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2161;
-		case 32: goto tr2161;
-		case 40: goto tr2162;
-		case 41: goto tr2163;
-		case 1034: goto tr2165;
-		case 1083: goto tr2166;
+		case 9: goto tr2172;
+		case 32: goto tr2172;
+		case 40: goto tr2173;
+		case 41: goto tr2174;
+		case 1034: goto tr2176;
+		case 1083: goto tr2177;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2164;
-	goto tr1934;
-tr2164:
+		goto tr2175;
+	goto tr1945;
+tr2175:
 	{
 		s->number64_tmp = s->number64;
 	}
@@ -56723,8 +56829,8 @@ tr2164:
 	{
 		s->decimal_counter++;
 	}
-	goto st725;
-tr2167:
+	goto st734;
+tr2178:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -56742,11 +56848,11 @@ tr2167:
 	{
 		s->decimal_counter++;
 	}
-	goto st725;
-st725:
+	goto st734;
+st734:
 	if ( ++p == pe )
-		goto _test_eof725;
-case 725:
+		goto _test_eof734;
+case 734:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56760,17 +56866,17 @@ case 725:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr1962;
-		case 32: goto tr1962;
-		case 40: goto tr1963;
-		case 41: goto tr1964;
-		case 1034: goto tr1967;
-		case 1083: goto tr1968;
+		case 9: goto tr1973;
+		case 32: goto tr1973;
+		case 40: goto tr1974;
+		case 41: goto tr1975;
+		case 1034: goto tr1978;
+		case 1083: goto tr1979;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2167;
-	goto tr1934;
-tr1955:
+		goto tr2178;
+	goto tr1945;
+tr1966:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m1 = (uint32_t)(s->number64);
@@ -56779,11 +56885,11 @@ tr1955:
 			p--; {goto st261;}
 		}
 	}
-	goto st726;
-st726:
+	goto st735;
+st735:
 	if ( ++p == pe )
-		goto _test_eof726;
-case 726:
+		goto _test_eof735;
+case 735:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56803,11 +56909,11 @@ case 726:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1960;
+		goto tr1971;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st726;
-	goto tr1934;
-tr1941:
+		goto st735;
+	goto tr1945;
+tr1952:
 	{
 		if (s->number64 <= 90) {
 			s->loc.d1 = (uint32_t)(s->number64);
@@ -56816,11 +56922,11 @@ tr1941:
 			p--; {goto st261;}
 		}
 	}
-	goto st727;
-st727:
+	goto st736;
+st736:
 	if ( ++p == pe )
-		goto _test_eof727;
-case 727:
+		goto _test_eof736;
+case 736:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -56840,18 +56946,18 @@ case 727:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr1948;
+		goto tr1959;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st727;
-	goto tr1934;
-st728:
+		goto st736;
+	goto tr1945;
+st737:
 	if ( ++p == pe )
-		goto _test_eof728;
-case 728:
+		goto _test_eof737;
+case 737:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2168;
-	goto tr1746;
-tr2168:
+		goto tr2179;
+	goto tr1757;
+tr2179:
 	{
 		s->number64 = 0;
 	}
@@ -56869,8 +56975,8 @@ tr2168:
 			p--; {goto st261;}
 		}
 	}
-	goto st729;
-tr2172:
+	goto st738;
+tr2183:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -56885,11 +56991,11 @@ tr2172:
 			p--; {goto st261;}
 		}
 	}
-	goto st729;
-st729:
+	goto st738;
+st738:
 	if ( ++p == pe )
-		goto _test_eof729;
-case 729:
+		goto _test_eof738;
+case 738:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -56903,17 +57009,17 @@ case 729:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2169;
-		case 32: goto tr2169;
-		case 40: goto tr2170;
-		case 41: goto tr2171;
-		case 1034: goto tr2173;
-		case 1083: goto tr2174;
+		case 9: goto tr2180;
+		case 32: goto tr2180;
+		case 40: goto tr2181;
+		case 41: goto tr2182;
+		case 1034: goto tr2184;
+		case 1083: goto tr2185;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2172;
-	goto tr1746;
-tr2176:
+		goto tr2183;
+	goto tr1757;
+tr2187:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -56921,8 +57027,8 @@ tr2176:
 		}
 		s->multiline = true;
 	}
-	goto st730;
-tr2177:
+	goto st739;
+tr2188:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -56930,13 +57036,13 @@ tr2177:
 		}
 		s->multiline = false;
 	}
-	goto st730;
-tr2179:
+	goto st739;
+tr2190:
 	{
 		s->line_counter++;
 	}
-	goto st730;
-tr2169:
+	goto st739;
+tr2180:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -56946,8 +57052,8 @@ tr2169:
 			p--; {goto st261;}
 		}
 	}
-	goto st730;
-tr2170:
+	goto st739;
+tr2181:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -56964,8 +57070,8 @@ tr2170:
 		}
 		s->multiline = true;
 	}
-	goto st730;
-tr2171:
+	goto st739;
+tr2182:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -56982,8 +57088,8 @@ tr2171:
 		}
 		s->multiline = false;
 	}
-	goto st730;
-tr2173:
+	goto st739;
+tr2184:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -56996,11 +57102,11 @@ tr2173:
 	{
 		s->line_counter++;
 	}
-	goto st730;
-st730:
+	goto st739;
+st739:
 	if ( ++p == pe )
-		goto _test_eof730;
-case 730:
+		goto _test_eof739;
+case 739:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57014,17 +57120,17 @@ case 730:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st730;
-		case 32: goto st730;
-		case 40: goto tr2176;
-		case 41: goto tr2177;
-		case 1034: goto tr2179;
-		case 1083: goto st738;
+		case 9: goto st739;
+		case 32: goto st739;
+		case 40: goto tr2187;
+		case 41: goto tr2188;
+		case 1034: goto tr2190;
+		case 1083: goto st747;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2178;
-	goto tr1746;
-tr2178:
+		goto tr2189;
+	goto tr1757;
+tr2189:
 	{
 		s->number64 = 0;
 	}
@@ -57042,8 +57148,8 @@ tr2178:
 			p--; {goto st261;}
 		}
 	}
-	goto st731;
-tr2184:
+	goto st740;
+tr2195:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -57058,11 +57164,11 @@ tr2184:
 			p--; {goto st261;}
 		}
 	}
-	goto st731;
-st731:
+	goto st740;
+st740:
 	if ( ++p == pe )
-		goto _test_eof731;
-case 731:
+		goto _test_eof740;
+case 740:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57076,17 +57182,17 @@ case 731:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2181;
-		case 32: goto tr2181;
-		case 40: goto tr2182;
-		case 41: goto tr2183;
-		case 1034: goto tr2185;
-		case 1083: goto tr2186;
+		case 9: goto tr2192;
+		case 32: goto tr2192;
+		case 40: goto tr2193;
+		case 41: goto tr2194;
+		case 1034: goto tr2196;
+		case 1083: goto tr2197;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2184;
-	goto tr1746;
-tr2188:
+		goto tr2195;
+	goto tr1757;
+tr2199:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -57094,8 +57200,8 @@ tr2188:
 		}
 		s->multiline = true;
 	}
-	goto st732;
-tr2189:
+	goto st741;
+tr2200:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -57103,13 +57209,13 @@ tr2189:
 		}
 		s->multiline = false;
 	}
-	goto st732;
-tr2191:
+	goto st741;
+tr2202:
 	{
 		s->line_counter++;
 	}
-	goto st732;
-tr2181:
+	goto st741;
+tr2192:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57119,8 +57225,8 @@ tr2181:
 			p--; {goto st261;}
 		}
 	}
-	goto st732;
-tr2182:
+	goto st741;
+tr2193:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57137,8 +57243,8 @@ tr2182:
 		}
 		s->multiline = true;
 	}
-	goto st732;
-tr2183:
+	goto st741;
+tr2194:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57155,8 +57261,8 @@ tr2183:
 		}
 		s->multiline = false;
 	}
-	goto st732;
-tr2185:
+	goto st741;
+tr2196:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57169,11 +57275,11 @@ tr2185:
 	{
 		s->line_counter++;
 	}
-	goto st732;
-st732:
+	goto st741;
+st741:
 	if ( ++p == pe )
-		goto _test_eof732;
-case 732:
+		goto _test_eof741;
+case 741:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57187,17 +57293,17 @@ case 732:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st732;
-		case 32: goto st732;
-		case 40: goto tr2188;
-		case 41: goto tr2189;
-		case 1034: goto tr2191;
-		case 1083: goto st737;
+		case 9: goto st741;
+		case 32: goto st741;
+		case 40: goto tr2199;
+		case 41: goto tr2200;
+		case 1034: goto tr2202;
+		case 1083: goto st746;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2190;
-	goto tr1746;
-tr2190:
+		goto tr2201;
+	goto tr1757;
+tr2201:
 	{
 		s->number64 = 0;
 	}
@@ -57215,8 +57321,8 @@ tr2190:
 			p--; {goto st261;}
 		}
 	}
-	goto st733;
-tr2196:
+	goto st742;
+tr2207:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -57231,11 +57337,11 @@ tr2196:
 			p--; {goto st261;}
 		}
 	}
-	goto st733;
-st733:
+	goto st742;
+st742:
 	if ( ++p == pe )
-		goto _test_eof733;
-case 733:
+		goto _test_eof742;
+case 742:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57249,17 +57355,17 @@ case 733:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2193;
-		case 32: goto tr2193;
-		case 40: goto tr2194;
-		case 41: goto tr2195;
-		case 1034: goto tr2197;
-		case 1083: goto tr2198;
+		case 9: goto tr2204;
+		case 32: goto tr2204;
+		case 40: goto tr2205;
+		case 41: goto tr2206;
+		case 1034: goto tr2208;
+		case 1083: goto tr2209;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2196;
-	goto tr1746;
-tr2200:
+		goto tr2207;
+	goto tr1757;
+tr2211:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -57267,8 +57373,8 @@ tr2200:
 		}
 		s->multiline = true;
 	}
-	goto st734;
-tr2201:
+	goto st743;
+tr2212:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -57276,13 +57382,13 @@ tr2201:
 		}
 		s->multiline = false;
 	}
-	goto st734;
-tr2203:
+	goto st743;
+tr2214:
 	{
 		s->line_counter++;
 	}
-	goto st734;
-tr2193:
+	goto st743;
+tr2204:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57292,8 +57398,8 @@ tr2193:
 			p--; {goto st261;}
 		}
 	}
-	goto st734;
-tr2194:
+	goto st743;
+tr2205:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57310,8 +57416,8 @@ tr2194:
 		}
 		s->multiline = true;
 	}
-	goto st734;
-tr2195:
+	goto st743;
+tr2206:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57328,8 +57434,8 @@ tr2195:
 		}
 		s->multiline = false;
 	}
-	goto st734;
-tr2197:
+	goto st743;
+tr2208:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57342,11 +57448,11 @@ tr2197:
 	{
 		s->line_counter++;
 	}
-	goto st734;
-st734:
+	goto st743;
+st743:
 	if ( ++p == pe )
-		goto _test_eof734;
-case 734:
+		goto _test_eof743;
+case 743:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57360,59 +57466,59 @@ case 734:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st734;
-		case 32: goto st734;
-		case 40: goto tr2200;
-		case 41: goto tr2201;
-		case 42: goto tr2202;
-		case 92: goto tr2202;
-		case 95: goto tr2202;
-		case 1034: goto tr2203;
-		case 1083: goto st736;
+		case 9: goto st743;
+		case 32: goto st743;
+		case 40: goto tr2211;
+		case 41: goto tr2212;
+		case 42: goto tr2213;
+		case 92: goto tr2213;
+		case 95: goto tr2213;
+		case 1034: goto tr2214;
+		case 1083: goto st745;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr2202;
+			goto tr2213;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2202;
+			goto tr2213;
 	} else
-		goto tr2202;
+		goto tr2213;
 	goto tr71;
-tr2202:
+tr2213:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 735; goto st263;} }
-	goto st735;
-st735:
+	{ p--; {stack[top++] = 744; goto st263;} }
+	goto st744;
+st744:
 	if ( ++p == pe )
-		goto _test_eof735;
-case 735:
+		goto _test_eof744;
+case 744:
 	switch( (*p) ) {
-		case 32: goto tr2205;
-		case 59: goto tr2205;
+		case 32: goto tr2216;
+		case 59: goto tr2216;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr2205;
+			goto tr2216;
 	} else if ( (*p) >= 9 )
-		goto tr2205;
+		goto tr2216;
 	goto tr71;
-tr2205:
+tr2216:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1164;
-st1164:
+	goto st1173;
+st1173:
 	if ( ++p == pe )
-		goto _test_eof1164;
-case 1164:
+		goto _test_eof1173;
+case 1173:
 	goto st0;
-tr2198:
+tr2209:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57422,11 +57528,11 @@ tr2198:
 			p--; {goto st261;}
 		}
 	}
-	goto st736;
-st736:
+	goto st745;
+st745:
 	if ( ++p == pe )
-		goto _test_eof736;
-case 736:
+		goto _test_eof745;
+case 745:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -57446,11 +57552,11 @@ case 736:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2203;
+		goto tr2214;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st736;
+		goto st745;
 	goto tr71;
-tr2186:
+tr2197:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57460,11 +57566,11 @@ tr2186:
 			p--; {goto st261;}
 		}
 	}
-	goto st737;
-st737:
+	goto st746;
+st746:
 	if ( ++p == pe )
-		goto _test_eof737;
-case 737:
+		goto _test_eof746;
+case 746:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -57484,11 +57590,11 @@ case 737:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2191;
+		goto tr2202;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st737;
+		goto st746;
 	goto tr71;
-tr2174:
+tr2185:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57498,11 +57604,11 @@ tr2174:
 			p--; {goto st261;}
 		}
 	}
-	goto st738;
-st738:
+	goto st747;
+st747:
 	if ( ++p == pe )
-		goto _test_eof738;
-case 738:
+		goto _test_eof747;
+case 747:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -57522,18 +57628,18 @@ case 738:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2179;
+		goto tr2190;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st738;
+		goto st747;
 	goto tr71;
-st739:
+st748:
 	if ( ++p == pe )
-		goto _test_eof739;
-case 739:
+		goto _test_eof748;
+case 748:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2206;
-	goto tr1746;
-tr2206:
+		goto tr2217;
+	goto tr1757;
+tr2217:
 	{
 		s->number64 = 0;
 	}
@@ -57551,8 +57657,8 @@ tr2206:
 			p--; {goto st261;}
 		}
 	}
-	goto st740;
-tr2210:
+	goto st749;
+tr2221:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -57567,11 +57673,11 @@ tr2210:
 			p--; {goto st261;}
 		}
 	}
-	goto st740;
-st740:
+	goto st749;
+st749:
 	if ( ++p == pe )
-		goto _test_eof740;
-case 740:
+		goto _test_eof749;
+case 749:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57585,17 +57691,17 @@ case 740:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2207;
-		case 32: goto tr2207;
-		case 40: goto tr2208;
-		case 41: goto tr2209;
-		case 1034: goto tr2211;
-		case 1083: goto tr2212;
+		case 9: goto tr2218;
+		case 32: goto tr2218;
+		case 40: goto tr2219;
+		case 41: goto tr2220;
+		case 1034: goto tr2222;
+		case 1083: goto tr2223;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2210;
-	goto tr1746;
-tr2214:
+		goto tr2221;
+	goto tr1757;
+tr2225:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -57603,8 +57709,8 @@ tr2214:
 		}
 		s->multiline = true;
 	}
-	goto st741;
-tr2215:
+	goto st750;
+tr2226:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -57612,13 +57718,13 @@ tr2215:
 		}
 		s->multiline = false;
 	}
-	goto st741;
-tr2217:
+	goto st750;
+tr2228:
 	{
 		s->line_counter++;
 	}
-	goto st741;
-tr2207:
+	goto st750;
+tr2218:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57628,8 +57734,8 @@ tr2207:
 			p--; {goto st261;}
 		}
 	}
-	goto st741;
-tr2208:
+	goto st750;
+tr2219:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57646,8 +57752,8 @@ tr2208:
 		}
 		s->multiline = true;
 	}
-	goto st741;
-tr2209:
+	goto st750;
+tr2220:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57664,8 +57770,8 @@ tr2209:
 		}
 		s->multiline = false;
 	}
-	goto st741;
-tr2211:
+	goto st750;
+tr2222:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57678,11 +57784,11 @@ tr2211:
 	{
 		s->line_counter++;
 	}
-	goto st741;
-st741:
+	goto st750;
+st750:
 	if ( ++p == pe )
-		goto _test_eof741;
-case 741:
+		goto _test_eof750;
+case 750:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57696,17 +57802,17 @@ case 741:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st741;
-		case 32: goto st741;
-		case 40: goto tr2214;
-		case 41: goto tr2215;
-		case 1034: goto tr2217;
-		case 1083: goto st755;
+		case 9: goto st750;
+		case 32: goto st750;
+		case 40: goto tr2225;
+		case 41: goto tr2226;
+		case 1034: goto tr2228;
+		case 1083: goto st764;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2216;
-	goto tr1746;
-tr2216:
+		goto tr2227;
+	goto tr1757;
+tr2227:
 	{
 		s->number64 = 0;
 	}
@@ -57724,8 +57830,8 @@ tr2216:
 			p--; {goto st261;}
 		}
 	}
-	goto st742;
-tr2222:
+	goto st751;
+tr2233:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -57740,11 +57846,11 @@ tr2222:
 			p--; {goto st261;}
 		}
 	}
-	goto st742;
-st742:
+	goto st751;
+st751:
 	if ( ++p == pe )
-		goto _test_eof742;
-case 742:
+		goto _test_eof751;
+case 751:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57758,17 +57864,17 @@ case 742:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2219;
-		case 32: goto tr2219;
-		case 40: goto tr2220;
-		case 41: goto tr2221;
-		case 1034: goto tr2223;
-		case 1083: goto tr2224;
+		case 9: goto tr2230;
+		case 32: goto tr2230;
+		case 40: goto tr2231;
+		case 41: goto tr2232;
+		case 1034: goto tr2234;
+		case 1083: goto tr2235;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2222;
-	goto tr1746;
-tr2227:
+		goto tr2233;
+	goto tr1757;
+tr2238:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -57776,8 +57882,8 @@ tr2227:
 		}
 		s->multiline = true;
 	}
-	goto st743;
-tr2228:
+	goto st752;
+tr2239:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -57785,13 +57891,13 @@ tr2228:
 		}
 		s->multiline = false;
 	}
-	goto st743;
-tr2229:
+	goto st752;
+tr2240:
 	{
 		s->line_counter++;
 	}
-	goto st743;
-tr2219:
+	goto st752;
+tr2230:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57801,8 +57907,8 @@ tr2219:
 			p--; {goto st261;}
 		}
 	}
-	goto st743;
-tr2220:
+	goto st752;
+tr2231:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57819,8 +57925,8 @@ tr2220:
 		}
 		s->multiline = true;
 	}
-	goto st743;
-tr2221:
+	goto st752;
+tr2232:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57837,8 +57943,8 @@ tr2221:
 		}
 		s->multiline = false;
 	}
-	goto st743;
-tr2223:
+	goto st752;
+tr2234:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -57851,11 +57957,11 @@ tr2223:
 	{
 		s->line_counter++;
 	}
-	goto st743;
-st743:
+	goto st752;
+st752:
 	if ( ++p == pe )
-		goto _test_eof743;
-case 743:
+		goto _test_eof752;
+case 752:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57869,23 +57975,23 @@ case 743:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st743;
-		case 32: goto st743;
-		case 40: goto tr2227;
-		case 41: goto tr2228;
-		case 1034: goto tr2229;
-		case 1083: goto st754;
+		case 9: goto st752;
+		case 32: goto st752;
+		case 40: goto tr2238;
+		case 41: goto tr2239;
+		case 1034: goto tr2240;
+		case 1083: goto st763;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr2225;
+			goto tr2236;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr2225;
+			goto tr2236;
 	} else
-		goto tr2225;
+		goto tr2236;
 	goto tr71;
-tr2225:
+tr2236:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -57894,12 +58000,12 @@ tr2225:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 744; goto st272;} }
-	goto st744;
-st744:
+	{ p--; {stack[top++] = 753; goto st272;} }
+	goto st753;
+st753:
 	if ( ++p == pe )
-		goto _test_eof744;
-case 744:
+		goto _test_eof753;
+case 753:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -57913,15 +58019,15 @@ case 744:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2231;
-		case 32: goto tr2231;
-		case 40: goto tr2232;
-		case 41: goto tr2233;
-		case 1034: goto tr2234;
-		case 1083: goto tr2235;
+		case 9: goto tr2242;
+		case 32: goto tr2242;
+		case 40: goto tr2243;
+		case 41: goto tr2244;
+		case 1034: goto tr2245;
+		case 1083: goto tr2246;
 	}
 	goto tr71;
-tr2238:
+tr2249:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -57929,8 +58035,8 @@ tr2238:
 		}
 		s->multiline = true;
 	}
-	goto st745;
-tr2239:
+	goto st754;
+tr2250:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -57938,13 +58044,13 @@ tr2239:
 		}
 		s->multiline = false;
 	}
-	goto st745;
-tr2240:
+	goto st754;
+tr2251:
 	{
 		s->line_counter++;
 	}
-	goto st745;
-tr2231:
+	goto st754;
+tr2242:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -57955,8 +58061,8 @@ tr2231:
 			p--; {goto st261;}
 		}
 	}
-	goto st745;
-tr2232:
+	goto st754;
+tr2243:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -57974,8 +58080,8 @@ tr2232:
 		}
 		s->multiline = true;
 	}
-	goto st745;
-tr2233:
+	goto st754;
+tr2244:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -57993,9 +58099,9 @@ tr2233:
 		}
 		s->multiline = false;
 	}
-	goto st745;
-tr2234:
-	{
+	goto st754;
+tr2245:
+	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
 		if (s->item_length <= MAX_ITEM_LENGTH) {
@@ -58008,11 +58114,11 @@ tr2234:
 	{
 		s->line_counter++;
 	}
-	goto st745;
-st745:
+	goto st754;
+st754:
 	if ( ++p == pe )
-		goto _test_eof745;
-case 745:
+		goto _test_eof754;
+case 754:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58026,23 +58132,23 @@ case 745:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st745;
-		case 32: goto st745;
-		case 40: goto tr2238;
-		case 41: goto tr2239;
-		case 1034: goto tr2240;
-		case 1083: goto st753;
+		case 9: goto st754;
+		case 32: goto st754;
+		case 40: goto tr2249;
+		case 41: goto tr2250;
+		case 1034: goto tr2251;
+		case 1083: goto st762;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr2236;
+			goto tr2247;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr2236;
+			goto tr2247;
 	} else
-		goto tr2236;
+		goto tr2247;
 	goto tr71;
-tr2236:
+tr2247:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -58051,12 +58157,12 @@ tr2236:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 746; goto st272;} }
-	goto st746;
-st746:
+	{ p--; {stack[top++] = 755; goto st272;} }
+	goto st755;
+st755:
 	if ( ++p == pe )
-		goto _test_eof746;
-case 746:
+		goto _test_eof755;
+case 755:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58070,15 +58176,15 @@ case 746:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2242;
-		case 32: goto tr2242;
-		case 40: goto tr2243;
-		case 41: goto tr2244;
-		case 1034: goto tr2245;
-		case 1083: goto tr2246;
+		case 9: goto tr2253;
+		case 32: goto tr2253;
+		case 40: goto tr2254;
+		case 41: goto tr2255;
+		case 1034: goto tr2256;
+		case 1083: goto tr2257;
 	}
 	goto tr71;
-tr2249:
+tr2260:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -58086,8 +58192,8 @@ tr2249:
 		}
 		s->multiline = true;
 	}
-	goto st747;
-tr2250:
+	goto st756;
+tr2261:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -58095,13 +58201,13 @@ tr2250:
 		}
 		s->multiline = false;
 	}
-	goto st747;
-tr2251:
+	goto st756;
+tr2262:
 	{
 		s->line_counter++;
 	}
-	goto st747;
-tr2242:
+	goto st756;
+tr2253:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58112,8 +58218,8 @@ tr2242:
 			p--; {goto st261;}
 		}
 	}
-	goto st747;
-tr2243:
+	goto st756;
+tr2254:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58131,8 +58237,8 @@ tr2243:
 		}
 		s->multiline = true;
 	}
-	goto st747;
-tr2244:
+	goto st756;
+tr2255:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58150,8 +58256,8 @@ tr2244:
 		}
 		s->multiline = false;
 	}
-	goto st747;
-tr2245:
+	goto st756;
+tr2256:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58165,11 +58271,11 @@ tr2245:
 	{
 		s->line_counter++;
 	}
-	goto st747;
-st747:
+	goto st756;
+st756:
 	if ( ++p == pe )
-		goto _test_eof747;
-case 747:
+		goto _test_eof756;
+case 756:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58183,23 +58289,23 @@ case 747:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st747;
-		case 32: goto st747;
-		case 40: goto tr2249;
-		case 41: goto tr2250;
-		case 1034: goto tr2251;
-		case 1083: goto st752;
+		case 9: goto st756;
+		case 32: goto st756;
+		case 40: goto tr2260;
+		case 41: goto tr2261;
+		case 1034: goto tr2262;
+		case 1083: goto st761;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr2247;
+			goto tr2258;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr2247;
+			goto tr2258;
 	} else
-		goto tr2247;
+		goto tr2258;
 	goto tr71;
-tr2247:
+tr2258:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -58208,12 +58314,12 @@ tr2247:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 748; goto st272;} }
-	goto st748;
-st748:
+	{ p--; {stack[top++] = 757; goto st272;} }
+	goto st757;
+st757:
 	if ( ++p == pe )
-		goto _test_eof748;
-case 748:
+		goto _test_eof757;
+case 757:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58227,15 +58333,15 @@ case 748:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2253;
-		case 32: goto tr2253;
-		case 40: goto tr2254;
-		case 41: goto tr2255;
-		case 1034: goto tr2256;
-		case 1083: goto tr2257;
+		case 9: goto tr2264;
+		case 32: goto tr2264;
+		case 40: goto tr2265;
+		case 41: goto tr2266;
+		case 1034: goto tr2267;
+		case 1083: goto tr2268;
 	}
 	goto tr71;
-tr2259:
+tr2270:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -58243,8 +58349,8 @@ tr2259:
 		}
 		s->multiline = true;
 	}
-	goto st749;
-tr2260:
+	goto st758;
+tr2271:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -58252,13 +58358,13 @@ tr2260:
 		}
 		s->multiline = false;
 	}
-	goto st749;
-tr2262:
+	goto st758;
+tr2273:
 	{
 		s->line_counter++;
 	}
-	goto st749;
-tr2253:
+	goto st758;
+tr2264:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58269,8 +58375,8 @@ tr2253:
 			p--; {goto st261;}
 		}
 	}
-	goto st749;
-tr2254:
+	goto st758;
+tr2265:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58288,8 +58394,8 @@ tr2254:
 		}
 		s->multiline = true;
 	}
-	goto st749;
-tr2255:
+	goto st758;
+tr2266:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58307,8 +58413,8 @@ tr2255:
 		}
 		s->multiline = false;
 	}
-	goto st749;
-tr2256:
+	goto st758;
+tr2267:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58322,11 +58428,11 @@ tr2256:
 	{
 		s->line_counter++;
 	}
-	goto st749;
-st749:
+	goto st758;
+st758:
 	if ( ++p == pe )
-		goto _test_eof749;
-case 749:
+		goto _test_eof758;
+case 758:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58340,59 +58446,59 @@ case 749:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st749;
-		case 32: goto st749;
-		case 40: goto tr2259;
-		case 41: goto tr2260;
-		case 42: goto tr2261;
-		case 92: goto tr2261;
-		case 95: goto tr2261;
-		case 1034: goto tr2262;
-		case 1083: goto st751;
+		case 9: goto st758;
+		case 32: goto st758;
+		case 40: goto tr2270;
+		case 41: goto tr2271;
+		case 42: goto tr2272;
+		case 92: goto tr2272;
+		case 95: goto tr2272;
+		case 1034: goto tr2273;
+		case 1083: goto st760;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr2261;
+			goto tr2272;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2261;
+			goto tr2272;
 	} else
-		goto tr2261;
+		goto tr2272;
 	goto tr71;
-tr2261:
+tr2272:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 750; goto st263;} }
-	goto st750;
-st750:
+	{ p--; {stack[top++] = 759; goto st263;} }
+	goto st759;
+st759:
 	if ( ++p == pe )
-		goto _test_eof750;
-case 750:
+		goto _test_eof759;
+case 759:
 	switch( (*p) ) {
-		case 32: goto tr2264;
-		case 59: goto tr2264;
+		case 32: goto tr2275;
+		case 59: goto tr2275;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr2264;
+			goto tr2275;
 	} else if ( (*p) >= 9 )
-		goto tr2264;
+		goto tr2275;
 	goto tr71;
-tr2264:
+tr2275:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1165;
-st1165:
+	goto st1174;
+st1174:
 	if ( ++p == pe )
-		goto _test_eof1165;
-case 1165:
+		goto _test_eof1174;
+case 1174:
 	goto st0;
-tr2257:
+tr2268:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58403,11 +58509,11 @@ tr2257:
 			p--; {goto st261;}
 		}
 	}
-	goto st751;
-st751:
+	goto st760;
+st760:
 	if ( ++p == pe )
-		goto _test_eof751;
-case 751:
+		goto _test_eof760;
+case 760:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -58427,11 +58533,11 @@ case 751:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2262;
+		goto tr2273;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st751;
+		goto st760;
 	goto tr71;
-tr2246:
+tr2257:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58442,11 +58548,11 @@ tr2246:
 			p--; {goto st261;}
 		}
 	}
-	goto st752;
-st752:
+	goto st761;
+st761:
 	if ( ++p == pe )
-		goto _test_eof752;
-case 752:
+		goto _test_eof761;
+case 761:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -58466,11 +58572,11 @@ case 752:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2251;
+		goto tr2262;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st752;
+		goto st761;
 	goto tr71;
-tr2235:
+tr2246:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -58481,11 +58587,11 @@ tr2235:
 			p--; {goto st261;}
 		}
 	}
-	goto st753;
-st753:
+	goto st762;
+st762:
 	if ( ++p == pe )
-		goto _test_eof753;
-case 753:
+		goto _test_eof762;
+case 762:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -58505,11 +58611,11 @@ case 753:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2240;
+		goto tr2251;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st753;
+		goto st762;
 	goto tr71;
-tr2224:
+tr2235:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -58519,11 +58625,11 @@ tr2224:
 			p--; {goto st261;}
 		}
 	}
-	goto st754;
-st754:
+	goto st763;
+st763:
 	if ( ++p == pe )
-		goto _test_eof754;
-case 754:
+		goto _test_eof763;
+case 763:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -58543,11 +58649,11 @@ case 754:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2229;
+		goto tr2240;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st754;
+		goto st763;
 	goto tr71;
-tr2212:
+tr2223:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -58557,11 +58663,11 @@ tr2212:
 			p--; {goto st261;}
 		}
 	}
-	goto st755;
-st755:
+	goto st764;
+st764:
 	if ( ++p == pe )
-		goto _test_eof755;
-case 755:
+		goto _test_eof764;
+case 764:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -58581,30 +58687,30 @@ case 755:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2217;
+		goto tr2228;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st755;
+		goto st764;
 	goto tr71;
-st756:
+st765:
 	if ( ++p == pe )
-		goto _test_eof756;
-case 756:
+		goto _test_eof765;
+case 765:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr2265;
+			goto tr2276;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr2265;
+			goto tr2276;
 	} else
-		goto tr2265;
+		goto tr2276;
 	goto tr71;
-tr2265:
-	{ p--; {stack[top++] = 757; goto st575;} }
-	goto st757;
-st757:
+tr2276:
+	{ p--; {stack[top++] = 766; goto st584;} }
+	goto st766;
+st766:
 	if ( ++p == pe )
-		goto _test_eof757;
-case 757:
+		goto _test_eof766;
+case 766:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58618,15 +58724,15 @@ case 757:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st758;
-		case 32: goto st758;
-		case 40: goto tr2267;
-		case 41: goto tr2268;
-		case 1034: goto tr2269;
-		case 1083: goto st766;
+		case 9: goto st767;
+		case 32: goto st767;
+		case 40: goto tr2278;
+		case 41: goto tr2279;
+		case 1034: goto tr2280;
+		case 1083: goto st775;
 	}
 	goto tr71;
-tr2267:
+tr2278:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -58634,8 +58740,8 @@ tr2267:
 		}
 		s->multiline = true;
 	}
-	goto st758;
-tr2268:
+	goto st767;
+tr2279:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -58643,16 +58749,16 @@ tr2268:
 		}
 		s->multiline = false;
 	}
-	goto st758;
-tr2269:
+	goto st767;
+tr2280:
 	{
 		s->line_counter++;
 	}
-	goto st758;
-st758:
+	goto st767;
+st767:
 	if ( ++p == pe )
-		goto _test_eof758;
-case 758:
+		goto _test_eof767;
+case 767:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58666,17 +58772,17 @@ case 758:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st758;
-		case 32: goto st758;
-		case 40: goto tr2267;
-		case 41: goto tr2268;
-		case 1034: goto tr2269;
-		case 1083: goto st766;
+		case 9: goto st767;
+		case 32: goto st767;
+		case 40: goto tr2278;
+		case 41: goto tr2279;
+		case 1034: goto tr2280;
+		case 1083: goto st775;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2271;
-	goto tr1746;
-tr2271:
+		goto tr2282;
+	goto tr1757;
+tr2282:
 	{
 		s->number64 = 0;
 	}
@@ -58694,8 +58800,8 @@ tr2271:
 			p--; {goto st261;}
 		}
 	}
-	goto st759;
-tr2275:
+	goto st768;
+tr2286:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -58710,11 +58816,11 @@ tr2275:
 			p--; {goto st261;}
 		}
 	}
-	goto st759;
-st759:
+	goto st768;
+st768:
 	if ( ++p == pe )
-		goto _test_eof759;
-case 759:
+		goto _test_eof768;
+case 768:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58728,17 +58834,17 @@ case 759:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2272;
-		case 32: goto tr2272;
-		case 40: goto tr2273;
-		case 41: goto tr2274;
-		case 1034: goto tr2276;
-		case 1083: goto tr2277;
+		case 9: goto tr2283;
+		case 32: goto tr2283;
+		case 40: goto tr2284;
+		case 41: goto tr2285;
+		case 1034: goto tr2287;
+		case 1083: goto tr2288;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2275;
-	goto tr1746;
-tr2279:
+		goto tr2286;
+	goto tr1757;
+tr2290:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -58746,8 +58852,8 @@ tr2279:
 		}
 		s->multiline = true;
 	}
-	goto st760;
-tr2280:
+	goto st769;
+tr2291:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -58755,13 +58861,13 @@ tr2280:
 		}
 		s->multiline = false;
 	}
-	goto st760;
-tr2282:
+	goto st769;
+tr2293:
 	{
 		s->line_counter++;
 	}
-	goto st760;
-tr2272:
+	goto st769;
+tr2283:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -58771,8 +58877,8 @@ tr2272:
 			p--; {goto st261;}
 		}
 	}
-	goto st760;
-tr2273:
+	goto st769;
+tr2284:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -58789,8 +58895,8 @@ tr2273:
 		}
 		s->multiline = true;
 	}
-	goto st760;
-tr2274:
+	goto st769;
+tr2285:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -58807,8 +58913,8 @@ tr2274:
 		}
 		s->multiline = false;
 	}
-	goto st760;
-tr2276:
+	goto st769;
+tr2287:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -58821,11 +58927,11 @@ tr2276:
 	{
 		s->line_counter++;
 	}
-	goto st760;
-st760:
+	goto st769;
+st769:
 	if ( ++p == pe )
-		goto _test_eof760;
-case 760:
+		goto _test_eof769;
+case 769:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58839,29 +58945,29 @@ case 760:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st760;
-		case 32: goto st760;
-		case 40: goto tr2279;
-		case 41: goto tr2280;
-		case 1034: goto tr2282;
-		case 1083: goto st765;
+		case 9: goto st769;
+		case 32: goto st769;
+		case 40: goto tr2290;
+		case 41: goto tr2291;
+		case 1034: goto tr2293;
+		case 1083: goto st774;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2281;
+			goto tr2292;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2281;
+			goto tr2292;
 	} else
-		goto tr2281;
+		goto tr2292;
 	goto tr71;
-tr2281:
-	{ p--; {stack[top++] = 761; goto st480;} }
-	goto st761;
-st761:
+tr2292:
+	{ p--; {stack[top++] = 770; goto st480;} }
+	goto st770;
+st770:
 	if ( ++p == pe )
-		goto _test_eof761;
-case 761:
+		goto _test_eof770;
+case 770:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58875,15 +58981,15 @@ case 761:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st762;
-		case 32: goto st762;
-		case 40: goto tr2285;
-		case 41: goto tr2286;
-		case 1034: goto tr2287;
-		case 1083: goto st764;
+		case 9: goto st771;
+		case 32: goto st771;
+		case 40: goto tr2296;
+		case 41: goto tr2297;
+		case 1034: goto tr2298;
+		case 1083: goto st773;
 	}
 	goto tr71;
-tr2285:
+tr2296:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -58891,8 +58997,8 @@ tr2285:
 		}
 		s->multiline = true;
 	}
-	goto st762;
-tr2286:
+	goto st771;
+tr2297:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -58900,16 +59006,16 @@ tr2286:
 		}
 		s->multiline = false;
 	}
-	goto st762;
-tr2287:
+	goto st771;
+tr2298:
 	{
 		s->line_counter++;
 	}
-	goto st762;
-st762:
+	goto st771;
+st771:
 	if ( ++p == pe )
-		goto _test_eof762;
-case 762:
+		goto _test_eof771;
+case 771:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58923,30 +59029,30 @@ case 762:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st762;
-		case 32: goto st762;
-		case 40: goto tr2285;
-		case 41: goto tr2286;
-		case 43: goto tr2289;
-		case 1034: goto tr2287;
-		case 1083: goto st764;
+		case 9: goto st771;
+		case 32: goto st771;
+		case 40: goto tr2296;
+		case 41: goto tr2297;
+		case 43: goto tr2300;
+		case 1034: goto tr2298;
+		case 1083: goto st773;
 	}
 	if ( _widec < 65 ) {
 		if ( 47 <= _widec && _widec <= 57 )
-			goto tr2289;
+			goto tr2300;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2289;
+			goto tr2300;
 	} else
-		goto tr2289;
+		goto tr2300;
 	goto tr71;
-tr2289:
-	{ p--; {stack[top++] = 763; goto st322;} }
-	goto st763;
-st763:
+tr2300:
+	{ p--; {stack[top++] = 772; goto st322;} }
+	goto st772;
+st772:
 	if ( ++p == pe )
-		goto _test_eof763;
-case 763:
+		goto _test_eof772;
+case 772:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -58960,24 +59066,24 @@ case 763:
  !s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 1546: goto tr2290;
-		case 1595: goto tr2290;
+		case 1546: goto tr2301;
+		case 1595: goto tr2301;
 	}
 	goto tr71;
-tr2290:
+tr2301:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1166;
-st1166:
+	goto st1175;
+st1175:
 	if ( ++p == pe )
-		goto _test_eof1166;
-case 1166:
+		goto _test_eof1175;
+case 1175:
 	goto st0;
-st764:
+st773:
 	if ( ++p == pe )
-		goto _test_eof764;
-case 764:
+		goto _test_eof773;
+case 773:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -58997,11 +59103,11 @@ case 764:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2287;
+		goto tr2298;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st764;
+		goto st773;
 	goto tr71;
-tr2277:
+tr2288:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -59011,11 +59117,11 @@ tr2277:
 			p--; {goto st261;}
 		}
 	}
-	goto st765;
-st765:
+	goto st774;
+st774:
 	if ( ++p == pe )
-		goto _test_eof765;
-case 765:
+		goto _test_eof774;
+case 774:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -59035,14 +59141,14 @@ case 765:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2282;
+		goto tr2293;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st765;
+		goto st774;
 	goto tr71;
-st766:
+st775:
 	if ( ++p == pe )
-		goto _test_eof766;
-case 766:
+		goto _test_eof775;
+case 775:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -59062,11 +59168,11 @@ case 766:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2269;
+		goto tr2280;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st766;
+		goto st775;
 	goto tr71;
-tr2294:
+tr2305:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -59074,8 +59180,8 @@ tr2294:
 		}
 		s->multiline = true;
 	}
-	goto st767;
-tr2295:
+	goto st776;
+tr2306:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -59083,13 +59189,13 @@ tr2295:
 		}
 		s->multiline = false;
 	}
-	goto st767;
-tr2298:
+	goto st776;
+tr2309:
 	{
 		s->line_counter++;
 	}
-	goto st767;
-tr2311:
+	goto st776;
+tr2322:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59135,8 +59241,8 @@ tr2311:
 		memcpy(rdata_tail, s->buffer, len);
 		rdata_tail += len;
 	}
-	goto st767;
-tr2312:
+	goto st776;
+tr2323:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59189,8 +59295,8 @@ tr2312:
 		}
 		s->multiline = true;
 	}
-	goto st767;
-tr2313:
+	goto st776;
+tr2324:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59243,8 +59349,8 @@ tr2313:
 		}
 		s->multiline = false;
 	}
-	goto st767;
-tr2315:
+	goto st776;
+tr2326:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59293,11 +59399,11 @@ tr2315:
 	{
 		s->line_counter++;
 	}
-	goto st767;
-st767:
+	goto st776;
+st776:
 	if ( ++p == pe )
-		goto _test_eof767;
-case 767:
+		goto _test_eof776;
+case 776:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -59315,68 +59421,68 @@ case 767:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st767;
-		case 32: goto st767;
-		case 33: goto tr2293;
-		case 40: goto tr2294;
-		case 41: goto tr2295;
-		case 49: goto tr2296;
-		case 50: goto tr2297;
-		case 2058: goto tr2298;
-		case 2107: goto st774;
-		case 2314: goto tr2300;
-		case 2363: goto tr2300;
-		case 2570: goto tr2301;
-		case 2619: goto tr2302;
-	}
-	goto tr2291;
-tr2293:
+		case 9: goto st776;
+		case 32: goto st776;
+		case 33: goto tr2304;
+		case 40: goto tr2305;
+		case 41: goto tr2306;
+		case 49: goto tr2307;
+		case 50: goto tr2308;
+		case 2058: goto tr2309;
+		case 2107: goto st783;
+		case 2314: goto tr2311;
+		case 2363: goto tr2311;
+		case 2570: goto tr2312;
+		case 2619: goto tr2313;
+	}
+	goto tr2302;
+tr2304:
 	{
 		memset(&(s->apl), 0, sizeof(s->apl));
 	}
 	{
 		s->apl.excl_flag = 128; // dec 128  = bin 10000000.
 	}
-	goto st768;
-st768:
+	goto st777;
+st777:
 	if ( ++p == pe )
-		goto _test_eof768;
-case 768:
+		goto _test_eof777;
+case 777:
 	switch( (*p) ) {
-		case 49: goto tr2303;
-		case 50: goto tr2304;
+		case 49: goto tr2314;
+		case 50: goto tr2315;
 	}
-	goto tr2291;
-tr2296:
+	goto tr2302;
+tr2307:
 	{
 		memset(&(s->apl), 0, sizeof(s->apl));
 	}
 	{
 		s->apl.addr_family = 1;
 	}
-	goto st769;
-tr2303:
+	goto st778;
+tr2314:
 	{
 		s->apl.addr_family = 1;
 	}
-	goto st769;
-st769:
+	goto st778;
+st778:
 	if ( ++p == pe )
-		goto _test_eof769;
-case 769:
+		goto _test_eof778;
+case 778:
 	if ( (*p) == 58 )
-		goto st770;
-	goto tr2291;
-st770:
+		goto st779;
+	goto tr2302;
+st779:
 	if ( ++p == pe )
-		goto _test_eof770;
-case 770:
+		goto _test_eof779;
+case 779:
 	if ( (*p) == 46 )
-		goto tr2307;
+		goto tr2318;
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2307;
-	goto tr2306;
-tr2307:
+		goto tr2318;
+	goto tr2317;
+tr2318:
 	{
 		s->buffer_length = 0;
 	}
@@ -59389,8 +59495,8 @@ tr2307:
 			p--; {goto st261;}
 		}
 	}
-	goto st771;
-tr2308:
+	goto st780;
+tr2319:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -59400,17 +59506,17 @@ tr2308:
 			p--; {goto st261;}
 		}
 	}
-	goto st771;
-st771:
+	goto st780;
+st780:
 	if ( ++p == pe )
-		goto _test_eof771;
-case 771:
+		goto _test_eof780;
+case 780:
 	if ( (*p) == 47 )
-		goto tr2309;
+		goto tr2320;
 	if ( 46 <= (*p) && (*p) <= 57 )
-		goto tr2308;
-	goto tr2306;
-tr2309:
+		goto tr2319;
+	goto tr2317;
+tr2320:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -59419,8 +59525,8 @@ tr2309:
 			p--; {goto st261;}
 		}
 	}
-	goto st772;
-tr2323:
+	goto st781;
+tr2334:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -59429,15 +59535,15 @@ tr2323:
 			p--; {goto st261;}
 		}
 	}
-	goto st772;
-st772:
+	goto st781;
+st781:
 	if ( ++p == pe )
-		goto _test_eof772;
-case 772:
+		goto _test_eof781;
+case 781:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2310;
-	goto tr2291;
-tr2310:
+		goto tr2321;
+	goto tr2302;
+tr2321:
 	{
 		s->number64 = 0;
 	}
@@ -59455,8 +59561,8 @@ tr2310:
 			p--; {goto st261;}
 		}
 	}
-	goto st773;
-tr2314:
+	goto st782;
+tr2325:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -59471,11 +59577,11 @@ tr2314:
 			p--; {goto st261;}
 		}
 	}
-	goto st773;
-st773:
+	goto st782;
+st782:
 	if ( ++p == pe )
-		goto _test_eof773;
-case 773:
+		goto _test_eof782;
+case 782:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -59493,21 +59599,21 @@ case 773:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto tr2311;
-		case 32: goto tr2311;
-		case 40: goto tr2312;
-		case 41: goto tr2313;
-		case 2058: goto tr2315;
-		case 2107: goto tr2316;
-		case 2314: goto tr2317;
-		case 2363: goto tr2317;
-		case 2570: goto tr2318;
-		case 2619: goto tr2319;
+		case 9: goto tr2322;
+		case 32: goto tr2322;
+		case 40: goto tr2323;
+		case 41: goto tr2324;
+		case 2058: goto tr2326;
+		case 2107: goto tr2327;
+		case 2314: goto tr2328;
+		case 2363: goto tr2328;
+		case 2570: goto tr2329;
+		case 2619: goto tr2330;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2314;
-	goto tr2291;
-tr2316:
+		goto tr2325;
+	goto tr2302;
+tr2327:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59553,11 +59659,11 @@ tr2316:
 		memcpy(rdata_tail, s->buffer, len);
 		rdata_tail += len;
 	}
-	goto st774;
-st774:
+	goto st783;
+st783:
 	if ( ++p == pe )
-		goto _test_eof774;
-case 774:
+		goto _test_eof783;
+case 783:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -59577,16 +59683,16 @@ case 774:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2298;
+		goto tr2309;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st774;
+		goto st783;
 	goto tr71;
-tr2300:
+tr2311:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1167;
-tr2317:
+	goto st1176;
+tr2328:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59635,21 +59741,21 @@ tr2317:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1167;
-st1167:
+	goto st1176;
+st1176:
 	if ( ++p == pe )
-		goto _test_eof1167;
-case 1167:
+		goto _test_eof1176;
+case 1176:
 	goto st0;
-tr2301:
+tr2312:
 	{
 		s->line_counter++;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1168;
-tr2318:
+	goto st1177;
+tr2329:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59701,11 +59807,11 @@ tr2318:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1168;
-st1168:
+	goto st1177;
+st1177:
 	if ( ++p == pe )
-		goto _test_eof1168;
-case 1168:
+		goto _test_eof1177;
+case 1177:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -59723,57 +59829,57 @@ case 1168:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st767;
-		case 32: goto st767;
-		case 33: goto tr2293;
-		case 40: goto tr2294;
-		case 41: goto tr2295;
-		case 49: goto tr2296;
-		case 50: goto tr2297;
-		case 2058: goto tr2298;
-		case 2107: goto st774;
-		case 2314: goto tr2300;
-		case 2363: goto tr2300;
-		case 2570: goto tr2301;
-		case 2619: goto tr2302;
-	}
-	goto tr2291;
-tr2297:
+		case 9: goto st776;
+		case 32: goto st776;
+		case 33: goto tr2304;
+		case 40: goto tr2305;
+		case 41: goto tr2306;
+		case 49: goto tr2307;
+		case 50: goto tr2308;
+		case 2058: goto tr2309;
+		case 2107: goto st783;
+		case 2314: goto tr2311;
+		case 2363: goto tr2311;
+		case 2570: goto tr2312;
+		case 2619: goto tr2313;
+	}
+	goto tr2302;
+tr2308:
 	{
 		memset(&(s->apl), 0, sizeof(s->apl));
 	}
 	{
 		s->apl.addr_family = 2;
 	}
-	goto st775;
-tr2304:
+	goto st784;
+tr2315:
 	{
 		s->apl.addr_family = 2;
 	}
-	goto st775;
-st775:
+	goto st784;
+st784:
 	if ( ++p == pe )
-		goto _test_eof775;
-case 775:
+		goto _test_eof784;
+case 784:
 	if ( (*p) == 58 )
-		goto st776;
-	goto tr2291;
-st776:
+		goto st785;
+	goto tr2302;
+st785:
 	if ( ++p == pe )
-		goto _test_eof776;
-case 776:
+		goto _test_eof785;
+case 785:
 	if ( (*p) == 46 )
-		goto tr2321;
+		goto tr2332;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 58 )
-			goto tr2321;
+			goto tr2332;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr2321;
+			goto tr2332;
 	} else
-		goto tr2321;
-	goto tr2306;
-tr2321:
+		goto tr2332;
+	goto tr2317;
+tr2332:
 	{
 		s->buffer_length = 0;
 	}
@@ -59786,8 +59892,8 @@ tr2321:
 			p--; {goto st261;}
 		}
 	}
-	goto st777;
-tr2322:
+	goto st786;
+tr2333:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -59797,28 +59903,28 @@ tr2322:
 			p--; {goto st261;}
 		}
 	}
-	goto st777;
-st777:
+	goto st786;
+st786:
 	if ( ++p == pe )
-		goto _test_eof777;
-case 777:
+		goto _test_eof786;
+case 786:
 	if ( (*p) == 47 )
-		goto tr2323;
+		goto tr2334;
 	if ( (*p) < 65 ) {
 		if ( 46 <= (*p) && (*p) <= 58 )
-			goto tr2322;
+			goto tr2333;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr2322;
+			goto tr2333;
 	} else
-		goto tr2322;
-	goto tr2306;
-tr2302:
+		goto tr2333;
+	goto tr2317;
+tr2313:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1169;
-tr2319:
+	goto st1178;
+tr2330:
 	{
 		if ((s->apl.addr_family == 1 && s->number64 <= 32) ||
 		    (s->apl.addr_family == 2 && s->number64 <= 128)) {
@@ -59867,11 +59973,11 @@ tr2319:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1169;
-st1169:
+	goto st1178;
+st1178:
 	if ( ++p == pe )
-		goto _test_eof1169;
-case 1169:
+		goto _test_eof1178;
+case 1178:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -59891,18 +59997,18 @@ case 1169:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2298;
+		goto tr2309;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st774;
+		goto st783;
 	goto tr71;
-st778:
+st787:
 	if ( ++p == pe )
-		goto _test_eof778;
-case 778:
+		goto _test_eof787;
+case 787:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2324;
-	goto tr1746;
-tr2324:
+		goto tr2335;
+	goto tr1757;
+tr2335:
 	{
 		s->number64 = 0;
 	}
@@ -59920,8 +60026,8 @@ tr2324:
 			p--; {goto st261;}
 		}
 	}
-	goto st779;
-tr2328:
+	goto st788;
+tr2339:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -59936,11 +60042,11 @@ tr2328:
 			p--; {goto st261;}
 		}
 	}
-	goto st779;
-st779:
+	goto st788;
+st788:
 	if ( ++p == pe )
-		goto _test_eof779;
-case 779:
+		goto _test_eof788;
+case 788:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -59954,17 +60060,17 @@ case 779:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2325;
-		case 32: goto tr2325;
-		case 40: goto tr2326;
-		case 41: goto tr2327;
-		case 1034: goto tr2329;
-		case 1083: goto tr2330;
+		case 9: goto tr2336;
+		case 32: goto tr2336;
+		case 40: goto tr2337;
+		case 41: goto tr2338;
+		case 1034: goto tr2340;
+		case 1083: goto tr2341;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2328;
-	goto tr1746;
-tr2332:
+		goto tr2339;
+	goto tr1757;
+tr2343:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -59972,8 +60078,8 @@ tr2332:
 		}
 		s->multiline = true;
 	}
-	goto st780;
-tr2333:
+	goto st789;
+tr2344:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -59981,13 +60087,13 @@ tr2333:
 		}
 		s->multiline = false;
 	}
-	goto st780;
-tr2335:
+	goto st789;
+tr2346:
 	{
 		s->line_counter++;
 	}
-	goto st780;
-tr2325:
+	goto st789;
+tr2336:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -59997,8 +60103,8 @@ tr2325:
 			p--; {goto st261;}
 		}
 	}
-	goto st780;
-tr2326:
+	goto st789;
+tr2337:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -60015,8 +60121,8 @@ tr2326:
 		}
 		s->multiline = true;
 	}
-	goto st780;
-tr2327:
+	goto st789;
+tr2338:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -60033,8 +60139,8 @@ tr2327:
 		}
 		s->multiline = false;
 	}
-	goto st780;
-tr2329:
+	goto st789;
+tr2340:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -60047,11 +60153,11 @@ tr2329:
 	{
 		s->line_counter++;
 	}
-	goto st780;
-st780:
+	goto st789;
+st789:
 	if ( ++p == pe )
-		goto _test_eof780;
-case 780:
+		goto _test_eof789;
+case 789:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60065,29 +60171,29 @@ case 780:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st780;
-		case 32: goto st780;
-		case 40: goto tr2332;
-		case 41: goto tr2333;
-		case 1034: goto tr2335;
-		case 1083: goto st790;
+		case 9: goto st789;
+		case 32: goto st789;
+		case 40: goto tr2343;
+		case 41: goto tr2344;
+		case 1034: goto tr2346;
+		case 1083: goto st799;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2334;
+			goto tr2345;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2334;
+			goto tr2345;
 	} else
-		goto tr2334;
+		goto tr2345;
 	goto tr71;
-tr2334:
-	{ p--; {stack[top++] = 781; goto st480;} }
-	goto st781;
-st781:
+tr2345:
+	{ p--; {stack[top++] = 790; goto st480;} }
+	goto st790;
+st790:
 	if ( ++p == pe )
-		goto _test_eof781;
-case 781:
+		goto _test_eof790;
+case 790:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60101,15 +60207,15 @@ case 781:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st782;
-		case 32: goto st782;
-		case 40: goto tr2338;
-		case 41: goto tr2339;
-		case 1034: goto tr2340;
-		case 1083: goto st789;
+		case 9: goto st791;
+		case 32: goto st791;
+		case 40: goto tr2349;
+		case 41: goto tr2350;
+		case 1034: goto tr2351;
+		case 1083: goto st798;
 	}
 	goto tr71;
-tr2338:
+tr2349:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -60117,8 +60223,8 @@ tr2338:
 		}
 		s->multiline = true;
 	}
-	goto st782;
-tr2339:
+	goto st791;
+tr2350:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -60126,16 +60232,16 @@ tr2339:
 		}
 		s->multiline = false;
 	}
-	goto st782;
-tr2340:
+	goto st791;
+tr2351:
 	{
 		s->line_counter++;
 	}
-	goto st782;
-st782:
+	goto st791;
+st791:
 	if ( ++p == pe )
-		goto _test_eof782;
-case 782:
+		goto _test_eof791;
+case 791:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60149,17 +60255,17 @@ case 782:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st782;
-		case 32: goto st782;
-		case 40: goto tr2338;
-		case 41: goto tr2339;
-		case 1034: goto tr2340;
-		case 1083: goto st789;
+		case 9: goto st791;
+		case 32: goto st791;
+		case 40: goto tr2349;
+		case 41: goto tr2350;
+		case 1034: goto tr2351;
+		case 1083: goto st798;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2342;
-	goto tr1746;
-tr2342:
+		goto tr2353;
+	goto tr1757;
+tr2353:
 	{
 		s->number64 = 0;
 	}
@@ -60177,8 +60283,8 @@ tr2342:
 			p--; {goto st261;}
 		}
 	}
-	goto st783;
-tr2346:
+	goto st792;
+tr2357:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -60193,11 +60299,11 @@ tr2346:
 			p--; {goto st261;}
 		}
 	}
-	goto st783;
-st783:
+	goto st792;
+st792:
 	if ( ++p == pe )
-		goto _test_eof783;
-case 783:
+		goto _test_eof792;
+case 792:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60211,17 +60317,17 @@ case 783:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2343;
-		case 32: goto tr2343;
-		case 40: goto tr2344;
-		case 41: goto tr2345;
-		case 1034: goto tr2347;
-		case 1083: goto tr2348;
+		case 9: goto tr2354;
+		case 32: goto tr2354;
+		case 40: goto tr2355;
+		case 41: goto tr2356;
+		case 1034: goto tr2358;
+		case 1083: goto tr2359;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2346;
-	goto tr1746;
-tr2351:
+		goto tr2357;
+	goto tr1757;
+tr2362:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -60229,8 +60335,8 @@ tr2351:
 		}
 		s->multiline = true;
 	}
-	goto st784;
-tr2352:
+	goto st793;
+tr2363:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -60238,13 +60344,13 @@ tr2352:
 		}
 		s->multiline = false;
 	}
-	goto st784;
-tr2354:
+	goto st793;
+tr2365:
 	{
 		s->line_counter++;
 	}
-	goto st784;
-tr2343:
+	goto st793;
+tr2354:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60254,8 +60360,8 @@ tr2343:
 			p--; {goto st261;}
 		}
 	}
-	goto st784;
-tr2344:
+	goto st793;
+tr2355:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60272,8 +60378,8 @@ tr2344:
 		}
 		s->multiline = true;
 	}
-	goto st784;
-tr2345:
+	goto st793;
+tr2356:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60290,8 +60396,8 @@ tr2345:
 		}
 		s->multiline = false;
 	}
-	goto st784;
-tr2347:
+	goto st793;
+tr2358:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60304,11 +60410,11 @@ tr2347:
 	{
 		s->line_counter++;
 	}
-	goto st784;
-st784:
+	goto st793;
+st793:
 	if ( ++p == pe )
-		goto _test_eof784;
-case 784:
+		goto _test_eof793;
+case 793:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60322,23 +60428,23 @@ case 784:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st784;
-		case 32: goto st784;
-		case 40: goto tr2351;
-		case 41: goto tr2352;
-		case 1034: goto tr2354;
-		case 1083: goto st788;
+		case 9: goto st793;
+		case 32: goto st793;
+		case 40: goto tr2362;
+		case 41: goto tr2363;
+		case 1034: goto tr2365;
+		case 1083: goto st797;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2353;
+			goto tr2364;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2353;
+			goto tr2364;
 	} else
-		goto tr2353;
-	goto tr2349;
-tr2353:
+		goto tr2364;
+	goto tr2360;
+tr2364:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -60347,21 +60453,21 @@ tr2353:
 			p--; {goto st261;}
 		}
 	}
-	goto st785;
-st785:
+	goto st794;
+st794:
 	if ( ++p == pe )
-		goto _test_eof785;
-case 785:
+		goto _test_eof794;
+case 794:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr2356;
+			goto tr2367;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr2356;
+			goto tr2367;
 	} else
-		goto tr2356;
-	goto tr2349;
-tr2358:
+		goto tr2367;
+	goto tr2360;
+tr2369:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -60369,8 +60475,8 @@ tr2358:
 		}
 		s->multiline = true;
 	}
-	goto st786;
-tr2359:
+	goto st795;
+tr2370:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -60378,22 +60484,22 @@ tr2359:
 		}
 		s->multiline = false;
 	}
-	goto st786;
-tr2360:
+	goto st795;
+tr2371:
 	{
 		s->line_counter++;
 	}
-	goto st786;
-tr2356:
+	goto st795;
+tr2367:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st786;
-st786:
+	goto st795;
+st795:
 	if ( ++p == pe )
-		goto _test_eof786;
-case 786:
+		goto _test_eof795;
+case 795:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60411,30 +60517,30 @@ case 786:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st786;
-		case 32: goto st786;
-		case 40: goto tr2358;
-		case 41: goto tr2359;
-		case 2058: goto tr2360;
-		case 2107: goto st787;
-		case 2314: goto tr2362;
-		case 2363: goto tr2362;
-		case 2570: goto tr2363;
-		case 2619: goto tr2364;
+		case 9: goto st795;
+		case 32: goto st795;
+		case 40: goto tr2369;
+		case 41: goto tr2370;
+		case 2058: goto tr2371;
+		case 2107: goto st796;
+		case 2314: goto tr2373;
+		case 2363: goto tr2373;
+		case 2570: goto tr2374;
+		case 2619: goto tr2375;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2353;
+			goto tr2364;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2353;
+			goto tr2364;
 	} else
-		goto tr2353;
-	goto tr2349;
-st787:
+		goto tr2364;
+	goto tr2360;
+st796:
 	if ( ++p == pe )
-		goto _test_eof787;
-case 787:
+		goto _test_eof796;
+case 796:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -60454,32 +60560,32 @@ case 787:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2360;
+		goto tr2371;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st787;
-	goto tr2349;
-tr2362:
+		goto st796;
+	goto tr2360;
+tr2373:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1170;
-st1170:
+	goto st1179;
+st1179:
 	if ( ++p == pe )
-		goto _test_eof1170;
-case 1170:
+		goto _test_eof1179;
+case 1179:
 	goto st0;
-tr2363:
+tr2374:
 	{
 		s->line_counter++;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1171;
-st1171:
+	goto st1180;
+st1180:
 	if ( ++p == pe )
-		goto _test_eof1171;
-case 1171:
+		goto _test_eof1180;
+case 1180:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60497,35 +60603,35 @@ case 1171:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st786;
-		case 32: goto st786;
-		case 40: goto tr2358;
-		case 41: goto tr2359;
-		case 2058: goto tr2360;
-		case 2107: goto st787;
-		case 2314: goto tr2362;
-		case 2363: goto tr2362;
-		case 2570: goto tr2363;
-		case 2619: goto tr2364;
+		case 9: goto st795;
+		case 32: goto st795;
+		case 40: goto tr2369;
+		case 41: goto tr2370;
+		case 2058: goto tr2371;
+		case 2107: goto st796;
+		case 2314: goto tr2373;
+		case 2363: goto tr2373;
+		case 2570: goto tr2374;
+		case 2619: goto tr2375;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2353;
+			goto tr2364;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2353;
+			goto tr2364;
 	} else
-		goto tr2353;
-	goto tr2349;
-tr2364:
+		goto tr2364;
+	goto tr2360;
+tr2375:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1172;
-st1172:
+	goto st1181;
+st1181:
 	if ( ++p == pe )
-		goto _test_eof1172;
-case 1172:
+		goto _test_eof1181;
+case 1181:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -60545,11 +60651,11 @@ case 1172:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2360;
+		goto tr2371;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st787;
-	goto tr2349;
-tr2348:
+		goto st796;
+	goto tr2360;
+tr2359:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60559,11 +60665,11 @@ tr2348:
 			p--; {goto st261;}
 		}
 	}
-	goto st788;
-st788:
+	goto st797;
+st797:
 	if ( ++p == pe )
-		goto _test_eof788;
-case 788:
+		goto _test_eof797;
+case 797:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -60583,14 +60689,14 @@ case 788:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2354;
+		goto tr2365;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st788;
+		goto st797;
 	goto tr71;
-st789:
+st798:
 	if ( ++p == pe )
-		goto _test_eof789;
-case 789:
+		goto _test_eof798;
+case 798:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -60610,11 +60716,11 @@ case 789:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2340;
+		goto tr2351;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st789;
+		goto st798;
 	goto tr71;
-tr2330:
+tr2341:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -60624,11 +60730,11 @@ tr2330:
 			p--; {goto st261;}
 		}
 	}
-	goto st790;
-st790:
+	goto st799;
+st799:
 	if ( ++p == pe )
-		goto _test_eof790;
-case 790:
+		goto _test_eof799;
+case 799:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -60648,18 +60754,18 @@ case 790:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2335;
+		goto tr2346;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st790;
+		goto st799;
 	goto tr71;
-st791:
+st800:
 	if ( ++p == pe )
-		goto _test_eof791;
-case 791:
+		goto _test_eof800;
+case 800:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2365;
-	goto tr1746;
-tr2365:
+		goto tr2376;
+	goto tr1757;
+tr2376:
 	{
 		s->number64 = 0;
 	}
@@ -60677,8 +60783,8 @@ tr2365:
 			p--; {goto st261;}
 		}
 	}
-	goto st792;
-tr2369:
+	goto st801;
+tr2380:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -60693,11 +60799,11 @@ tr2369:
 			p--; {goto st261;}
 		}
 	}
-	goto st792;
-st792:
+	goto st801;
+st801:
 	if ( ++p == pe )
-		goto _test_eof792;
-case 792:
+		goto _test_eof801;
+case 801:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60711,17 +60817,17 @@ case 792:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2366;
-		case 32: goto tr2366;
-		case 40: goto tr2367;
-		case 41: goto tr2368;
-		case 1034: goto tr2370;
-		case 1083: goto tr2371;
+		case 9: goto tr2377;
+		case 32: goto tr2377;
+		case 40: goto tr2378;
+		case 41: goto tr2379;
+		case 1034: goto tr2381;
+		case 1083: goto tr2382;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2369;
-	goto tr1746;
-tr2373:
+		goto tr2380;
+	goto tr1757;
+tr2384:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -60729,8 +60835,8 @@ tr2373:
 		}
 		s->multiline = true;
 	}
-	goto st793;
-tr2374:
+	goto st802;
+tr2385:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -60738,13 +60844,13 @@ tr2374:
 		}
 		s->multiline = false;
 	}
-	goto st793;
-tr2376:
+	goto st802;
+tr2387:
 	{
 		s->line_counter++;
 	}
-	goto st793;
-tr2366:
+	goto st802;
+tr2377:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60754,8 +60860,8 @@ tr2366:
 			p--; {goto st261;}
 		}
 	}
-	goto st793;
-tr2367:
+	goto st802;
+tr2378:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60772,8 +60878,8 @@ tr2367:
 		}
 		s->multiline = true;
 	}
-	goto st793;
-tr2368:
+	goto st802;
+tr2379:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60790,8 +60896,8 @@ tr2368:
 		}
 		s->multiline = false;
 	}
-	goto st793;
-tr2370:
+	goto st802;
+tr2381:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60804,11 +60910,11 @@ tr2370:
 	{
 		s->line_counter++;
 	}
-	goto st793;
-st793:
+	goto st802;
+st802:
 	if ( ++p == pe )
-		goto _test_eof793;
-case 793:
+		goto _test_eof802;
+case 802:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60822,17 +60928,17 @@ case 793:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st793;
-		case 32: goto st793;
-		case 40: goto tr2373;
-		case 41: goto tr2374;
-		case 1034: goto tr2376;
-		case 1083: goto st800;
+		case 9: goto st802;
+		case 32: goto st802;
+		case 40: goto tr2384;
+		case 41: goto tr2385;
+		case 1034: goto tr2387;
+		case 1083: goto st809;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2375;
-	goto tr1746;
-tr2375:
+		goto tr2386;
+	goto tr1757;
+tr2386:
 	{
 		s->number64 = 0;
 	}
@@ -60850,8 +60956,8 @@ tr2375:
 			p--; {goto st261;}
 		}
 	}
-	goto st794;
-tr2381:
+	goto st803;
+tr2392:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -60866,11 +60972,11 @@ tr2381:
 			p--; {goto st261;}
 		}
 	}
-	goto st794;
-st794:
+	goto st803;
+st803:
 	if ( ++p == pe )
-		goto _test_eof794;
-case 794:
+		goto _test_eof803;
+case 803:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60884,17 +60990,17 @@ case 794:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2378;
-		case 32: goto tr2378;
-		case 40: goto tr2379;
-		case 41: goto tr2380;
-		case 1034: goto tr2382;
-		case 1083: goto tr2383;
+		case 9: goto tr2389;
+		case 32: goto tr2389;
+		case 40: goto tr2390;
+		case 41: goto tr2391;
+		case 1034: goto tr2393;
+		case 1083: goto tr2394;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2381;
-	goto tr1746;
-tr2385:
+		goto tr2392;
+	goto tr1757;
+tr2396:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -60902,8 +61008,8 @@ tr2385:
 		}
 		s->multiline = true;
 	}
-	goto st795;
-tr2386:
+	goto st804;
+tr2397:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -60911,13 +61017,13 @@ tr2386:
 		}
 		s->multiline = false;
 	}
-	goto st795;
-tr2388:
+	goto st804;
+tr2399:
 	{
 		s->line_counter++;
 	}
-	goto st795;
-tr2378:
+	goto st804;
+tr2389:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60927,8 +61033,8 @@ tr2378:
 			p--; {goto st261;}
 		}
 	}
-	goto st795;
-tr2379:
+	goto st804;
+tr2390:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60945,8 +61051,8 @@ tr2379:
 		}
 		s->multiline = true;
 	}
-	goto st795;
-tr2380:
+	goto st804;
+tr2391:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60963,8 +61069,8 @@ tr2380:
 		}
 		s->multiline = false;
 	}
-	goto st795;
-tr2382:
+	goto st804;
+tr2393:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -60977,11 +61083,11 @@ tr2382:
 	{
 		s->line_counter++;
 	}
-	goto st795;
-st795:
+	goto st804;
+st804:
 	if ( ++p == pe )
-		goto _test_eof795;
-case 795:
+		goto _test_eof804;
+case 804:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -60995,23 +61101,23 @@ case 795:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st795;
-		case 32: goto st795;
-		case 40: goto tr2385;
-		case 41: goto tr2386;
-		case 1034: goto tr2388;
-		case 1083: goto st799;
+		case 9: goto st804;
+		case 32: goto st804;
+		case 40: goto tr2396;
+		case 41: goto tr2397;
+		case 1034: goto tr2399;
+		case 1083: goto st808;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2387;
+			goto tr2398;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2387;
+			goto tr2398;
 	} else
-		goto tr2387;
-	goto tr2349;
-tr2387:
+		goto tr2398;
+	goto tr2360;
+tr2398:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -61020,21 +61126,21 @@ tr2387:
 			p--; {goto st261;}
 		}
 	}
-	goto st796;
-st796:
+	goto st805;
+st805:
 	if ( ++p == pe )
-		goto _test_eof796;
-case 796:
+		goto _test_eof805;
+case 805:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr2390;
+			goto tr2401;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr2390;
+			goto tr2401;
 	} else
-		goto tr2390;
-	goto tr2349;
-tr2392:
+		goto tr2401;
+	goto tr2360;
+tr2403:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -61042,8 +61148,8 @@ tr2392:
 		}
 		s->multiline = true;
 	}
-	goto st797;
-tr2393:
+	goto st806;
+tr2404:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -61051,22 +61157,22 @@ tr2393:
 		}
 		s->multiline = false;
 	}
-	goto st797;
-tr2394:
+	goto st806;
+tr2405:
 	{
 		s->line_counter++;
 	}
-	goto st797;
-tr2390:
+	goto st806;
+tr2401:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st797;
-st797:
+	goto st806;
+st806:
 	if ( ++p == pe )
-		goto _test_eof797;
-case 797:
+		goto _test_eof806;
+case 806:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61084,30 +61190,30 @@ case 797:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st797;
-		case 32: goto st797;
-		case 40: goto tr2392;
-		case 41: goto tr2393;
-		case 2058: goto tr2394;
-		case 2107: goto st798;
-		case 2314: goto tr2396;
-		case 2363: goto tr2396;
-		case 2570: goto tr2397;
-		case 2619: goto tr2398;
+		case 9: goto st806;
+		case 32: goto st806;
+		case 40: goto tr2403;
+		case 41: goto tr2404;
+		case 2058: goto tr2405;
+		case 2107: goto st807;
+		case 2314: goto tr2407;
+		case 2363: goto tr2407;
+		case 2570: goto tr2408;
+		case 2619: goto tr2409;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2387;
+			goto tr2398;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2387;
+			goto tr2398;
 	} else
-		goto tr2387;
-	goto tr2349;
-st798:
+		goto tr2398;
+	goto tr2360;
+st807:
 	if ( ++p == pe )
-		goto _test_eof798;
-case 798:
+		goto _test_eof807;
+case 807:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -61127,32 +61233,32 @@ case 798:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2394;
+		goto tr2405;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st798;
-	goto tr2349;
-tr2396:
+		goto st807;
+	goto tr2360;
+tr2407:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1173;
-st1173:
+	goto st1182;
+st1182:
 	if ( ++p == pe )
-		goto _test_eof1173;
-case 1173:
+		goto _test_eof1182;
+case 1182:
 	goto st0;
-tr2397:
+tr2408:
 	{
 		s->line_counter++;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1174;
-st1174:
+	goto st1183;
+st1183:
 	if ( ++p == pe )
-		goto _test_eof1174;
-case 1174:
+		goto _test_eof1183;
+case 1183:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61170,35 +61276,35 @@ case 1174:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st797;
-		case 32: goto st797;
-		case 40: goto tr2392;
-		case 41: goto tr2393;
-		case 2058: goto tr2394;
-		case 2107: goto st798;
-		case 2314: goto tr2396;
-		case 2363: goto tr2396;
-		case 2570: goto tr2397;
-		case 2619: goto tr2398;
+		case 9: goto st806;
+		case 32: goto st806;
+		case 40: goto tr2403;
+		case 41: goto tr2404;
+		case 2058: goto tr2405;
+		case 2107: goto st807;
+		case 2314: goto tr2407;
+		case 2363: goto tr2407;
+		case 2570: goto tr2408;
+		case 2619: goto tr2409;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2387;
+			goto tr2398;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2387;
+			goto tr2398;
 	} else
-		goto tr2387;
-	goto tr2349;
-tr2398:
+		goto tr2398;
+	goto tr2360;
+tr2409:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1175;
-st1175:
+	goto st1184;
+st1184:
 	if ( ++p == pe )
-		goto _test_eof1175;
-case 1175:
+		goto _test_eof1184;
+case 1184:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -61218,11 +61324,11 @@ case 1175:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2394;
+		goto tr2405;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st798;
-	goto tr2349;
-tr2383:
+		goto st807;
+	goto tr2360;
+tr2394:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61232,11 +61338,11 @@ tr2383:
 			p--; {goto st261;}
 		}
 	}
-	goto st799;
-st799:
+	goto st808;
+st808:
 	if ( ++p == pe )
-		goto _test_eof799;
-case 799:
+		goto _test_eof808;
+case 808:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -61256,11 +61362,11 @@ case 799:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2388;
+		goto tr2399;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st799;
+		goto st808;
 	goto tr71;
-tr2371:
+tr2382:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61270,11 +61376,11 @@ tr2371:
 			p--; {goto st261;}
 		}
 	}
-	goto st800;
-st800:
+	goto st809;
+st809:
 	if ( ++p == pe )
-		goto _test_eof800;
-case 800:
+		goto _test_eof809;
+case 809:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -61294,18 +61400,18 @@ case 800:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2376;
+		goto tr2387;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st800;
+		goto st809;
 	goto tr71;
-st801:
+st810:
 	if ( ++p == pe )
-		goto _test_eof801;
-case 801:
+		goto _test_eof810;
+case 810:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2399;
-	goto tr1746;
-tr2399:
+		goto tr2410;
+	goto tr1757;
+tr2410:
 	{
 		s->number64 = 0;
 	}
@@ -61323,8 +61429,8 @@ tr2399:
 			p--; {goto st261;}
 		}
 	}
-	goto st802;
-tr2403:
+	goto st811;
+tr2414:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -61339,11 +61445,11 @@ tr2403:
 			p--; {goto st261;}
 		}
 	}
-	goto st802;
-st802:
+	goto st811;
+st811:
 	if ( ++p == pe )
-		goto _test_eof802;
-case 802:
+		goto _test_eof811;
+case 811:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61357,17 +61463,17 @@ case 802:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2400;
-		case 32: goto tr2400;
-		case 40: goto tr2401;
-		case 41: goto tr2402;
-		case 1034: goto tr2404;
-		case 1083: goto tr2405;
+		case 9: goto tr2411;
+		case 32: goto tr2411;
+		case 40: goto tr2412;
+		case 41: goto tr2413;
+		case 1034: goto tr2415;
+		case 1083: goto tr2416;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2403;
-	goto tr1746;
-tr2408:
+		goto tr2414;
+	goto tr1757;
+tr2419:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -61375,8 +61481,8 @@ tr2408:
 		}
 		s->multiline = true;
 	}
-	goto st803;
-tr2409:
+	goto st812;
+tr2420:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -61384,13 +61490,13 @@ tr2409:
 		}
 		s->multiline = false;
 	}
-	goto st803;
-tr2414:
+	goto st812;
+tr2425:
 	{
 		s->line_counter++;
 	}
-	goto st803;
-tr2400:
+	goto st812;
+tr2411:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61400,8 +61506,8 @@ tr2400:
 			p--; {goto st261;}
 		}
 	}
-	goto st803;
-tr2401:
+	goto st812;
+tr2412:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61418,8 +61524,8 @@ tr2401:
 		}
 		s->multiline = true;
 	}
-	goto st803;
-tr2402:
+	goto st812;
+tr2413:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61436,8 +61542,8 @@ tr2402:
 		}
 		s->multiline = false;
 	}
-	goto st803;
-tr2404:
+	goto st812;
+tr2415:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61450,11 +61556,11 @@ tr2404:
 	{
 		s->line_counter++;
 	}
-	goto st803;
-st803:
+	goto st812;
+st812:
 	if ( ++p == pe )
-		goto _test_eof803;
-case 803:
+		goto _test_eof812;
+case 812:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61468,27 +61574,27 @@ case 803:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st803;
-		case 32: goto st803;
-		case 40: goto tr2408;
-		case 41: goto tr2409;
-		case 48: goto tr2410;
-		case 49: goto tr2411;
-		case 50: goto tr2412;
-		case 51: goto tr2413;
-		case 1034: goto tr2414;
-		case 1083: goto st839;
-	}
-	goto tr2406;
-tr2410:
+		case 9: goto st812;
+		case 32: goto st812;
+		case 40: goto tr2419;
+		case 41: goto tr2420;
+		case 48: goto tr2421;
+		case 49: goto tr2422;
+		case 50: goto tr2423;
+		case 51: goto tr2424;
+		case 1034: goto tr2425;
+		case 1083: goto st848;
+	}
+	goto tr2417;
+tr2421:
 	{
 		*(rdata_tail++) = 0;
 	}
-	goto st804;
-st804:
+	goto st813;
+st813:
 	if ( ++p == pe )
-		goto _test_eof804;
-case 804:
+		goto _test_eof813;
+case 813:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61502,15 +61608,15 @@ case 804:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st805;
-		case 32: goto st805;
-		case 40: goto tr2417;
-		case 41: goto tr2418;
-		case 1034: goto tr2419;
-		case 1083: goto st817;
-	}
-	goto tr2406;
-tr2417:
+		case 9: goto st814;
+		case 32: goto st814;
+		case 40: goto tr2428;
+		case 41: goto tr2429;
+		case 1034: goto tr2430;
+		case 1083: goto st826;
+	}
+	goto tr2417;
+tr2428:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -61518,8 +61624,8 @@ tr2417:
 		}
 		s->multiline = true;
 	}
-	goto st805;
-tr2418:
+	goto st814;
+tr2429:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -61527,16 +61633,16 @@ tr2418:
 		}
 		s->multiline = false;
 	}
-	goto st805;
-tr2419:
+	goto st814;
+tr2430:
 	{
 		s->line_counter++;
 	}
-	goto st805;
-st805:
+	goto st814;
+st814:
 	if ( ++p == pe )
-		goto _test_eof805;
-case 805:
+		goto _test_eof814;
+case 814:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61550,17 +61656,17 @@ case 805:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st805;
-		case 32: goto st805;
-		case 40: goto tr2417;
-		case 41: goto tr2418;
-		case 1034: goto tr2419;
-		case 1083: goto st817;
+		case 9: goto st814;
+		case 32: goto st814;
+		case 40: goto tr2428;
+		case 41: goto tr2429;
+		case 1034: goto tr2430;
+		case 1083: goto st826;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2422;
-	goto tr2421;
-tr2422:
+		goto tr2433;
+	goto tr2432;
+tr2433:
 	{
 		s->number64 = 0;
 	}
@@ -61578,8 +61684,8 @@ tr2422:
 			p--; {goto st261;}
 		}
 	}
-	goto st806;
-tr2426:
+	goto st815;
+tr2437:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -61594,11 +61700,11 @@ tr2426:
 			p--; {goto st261;}
 		}
 	}
-	goto st806;
-st806:
+	goto st815;
+st815:
 	if ( ++p == pe )
-		goto _test_eof806;
-case 806:
+		goto _test_eof815;
+case 815:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61612,17 +61718,17 @@ case 806:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2423;
-		case 32: goto tr2423;
-		case 40: goto tr2424;
-		case 41: goto tr2425;
-		case 1034: goto tr2427;
-		case 1083: goto tr2428;
+		case 9: goto tr2434;
+		case 32: goto tr2434;
+		case 40: goto tr2435;
+		case 41: goto tr2436;
+		case 1034: goto tr2438;
+		case 1083: goto tr2439;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2426;
-	goto tr2421;
-tr2430:
+		goto tr2437;
+	goto tr2432;
+tr2441:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -61630,8 +61736,8 @@ tr2430:
 		}
 		s->multiline = true;
 	}
-	goto st807;
-tr2431:
+	goto st816;
+tr2442:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -61639,13 +61745,13 @@ tr2431:
 		}
 		s->multiline = false;
 	}
-	goto st807;
-tr2433:
+	goto st816;
+tr2444:
 	{
 		s->line_counter++;
 	}
-	goto st807;
-tr2423:
+	goto st816;
+tr2434:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61655,8 +61761,8 @@ tr2423:
 			p--; {goto st261;}
 		}
 	}
-	goto st807;
-tr2424:
+	goto st816;
+tr2435:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61673,8 +61779,8 @@ tr2424:
 		}
 		s->multiline = true;
 	}
-	goto st807;
-tr2425:
+	goto st816;
+tr2436:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61691,8 +61797,8 @@ tr2425:
 		}
 		s->multiline = false;
 	}
-	goto st807;
-tr2427:
+	goto st816;
+tr2438:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -61705,11 +61811,11 @@ tr2427:
 	{
 		s->line_counter++;
 	}
-	goto st807;
-st807:
+	goto st816;
+st816:
 	if ( ++p == pe )
-		goto _test_eof807;
-case 807:
+		goto _test_eof816;
+case 816:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -61723,19 +61829,19 @@ case 807:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st807;
-		case 32: goto st807;
-		case 40: goto tr2430;
-		case 41: goto tr2431;
-		case 46: goto st808;
-		case 1034: goto tr2433;
-		case 1083: goto st816;
-	}
-	goto tr2406;
-st808:
+		case 9: goto st816;
+		case 32: goto st816;
+		case 40: goto tr2441;
+		case 41: goto tr2442;
+		case 46: goto st817;
+		case 1034: goto tr2444;
+		case 1083: goto st825;
+	}
+	goto tr2417;
+st817:
 	if ( ++p == pe )
-		goto _test_eof808;
-case 808:
+		goto _test_eof817;
+case 817:
 	_widec = (*p);
 	if ( (*p) < 32 ) {
 		if ( (*p) > 9 ) {
@@ -61793,43 +61899,43 @@ case 808:
  s->number64 == 0  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 6153: goto st809;
-		case 6176: goto st809;
-		case 6184: goto tr2437;
-		case 6185: goto tr2438;
-		case 6409: goto st812;
-		case 6432: goto st812;
-		case 6440: goto tr2440;
-		case 6441: goto tr2441;
-		case 6665: goto st814;
-		case 6688: goto st814;
-		case 6696: goto tr2443;
-		case 6697: goto tr2444;
-		case 9482: goto tr2445;
-		case 9531: goto tr2445;
-		case 9738: goto tr2445;
-		case 9787: goto tr2445;
-		case 10250: goto tr2446;
-		case 10299: goto st811;
-		case 10506: goto tr2445;
-		case 10555: goto tr2445;
-		case 10762: goto tr2448;
-		case 10811: goto tr2449;
-		case 11274: goto tr2450;
-		case 11323: goto st813;
-		case 11530: goto tr2445;
-		case 11579: goto tr2445;
-		case 11786: goto tr2452;
-		case 11835: goto tr2453;
-		case 12298: goto tr2454;
-		case 12347: goto st815;
-		case 12554: goto tr2445;
-		case 12603: goto tr2445;
-		case 12810: goto tr2456;
-		case 12859: goto tr2457;
-	}
-	goto tr2435;
-tr2437:
+		case 6153: goto st818;
+		case 6176: goto st818;
+		case 6184: goto tr2448;
+		case 6185: goto tr2449;
+		case 6409: goto st821;
+		case 6432: goto st821;
+		case 6440: goto tr2451;
+		case 6441: goto tr2452;
+		case 6665: goto st823;
+		case 6688: goto st823;
+		case 6696: goto tr2454;
+		case 6697: goto tr2455;
+		case 9482: goto tr2456;
+		case 9531: goto tr2456;
+		case 9738: goto tr2456;
+		case 9787: goto tr2456;
+		case 10250: goto tr2457;
+		case 10299: goto st820;
+		case 10506: goto tr2456;
+		case 10555: goto tr2456;
+		case 10762: goto tr2459;
+		case 10811: goto tr2460;
+		case 11274: goto tr2461;
+		case 11323: goto st822;
+		case 11530: goto tr2456;
+		case 11579: goto tr2456;
+		case 11786: goto tr2463;
+		case 11835: goto tr2464;
+		case 12298: goto tr2465;
+		case 12347: goto st824;
+		case 12554: goto tr2456;
+		case 12603: goto tr2456;
+		case 12810: goto tr2467;
+		case 12859: goto tr2468;
+	}
+	goto tr2446;
+tr2448:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -61837,8 +61943,8 @@ tr2437:
 		}
 		s->multiline = true;
 	}
-	goto st809;
-tr2438:
+	goto st818;
+tr2449:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -61846,18 +61952,18 @@ tr2438:
 		}
 		s->multiline = false;
 	}
-	goto st809;
-tr2446:
+	goto st818;
+tr2457:
 	{
 		s->line_counter++;
 	}
-	goto st809;
-tr2562:
+	goto st818;
+tr2573:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st809;
-tr2563:
+	goto st818;
+tr2574:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -61868,8 +61974,8 @@ tr2563:
 		}
 		s->multiline = true;
 	}
-	goto st809;
-tr2564:
+	goto st818;
+tr2575:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -61880,16 +61986,16 @@ tr2564:
 		}
 		s->multiline = false;
 	}
-	goto st809;
-tr2572:
+	goto st818;
+tr2583:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st809;
-tr2481:
+	goto st818;
+tr2492:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -61902,8 +62008,8 @@ tr2481:
 		memcpy(rdata_tail, &(addr4.s_addr), INET4_ADDR_LENGTH);
 		rdata_tail += INET4_ADDR_LENGTH;
 	}
-	goto st809;
-tr2482:
+	goto st818;
+tr2493:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -61923,8 +62029,8 @@ tr2482:
 		}
 		s->multiline = true;
 	}
-	goto st809;
-tr2483:
+	goto st818;
+tr2494:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -61944,8 +62050,8 @@ tr2483:
 		}
 		s->multiline = false;
 	}
-	goto st809;
-tr2491:
+	goto st818;
+tr2502:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -61961,8 +62067,8 @@ tr2491:
 	{
 		s->line_counter++;
 	}
-	goto st809;
-tr2522:
+	goto st818;
+tr2533:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -61975,8 +62081,8 @@ tr2522:
 		memcpy(rdata_tail, &(addr6.s6_addr), INET6_ADDR_LENGTH);
 		rdata_tail += INET6_ADDR_LENGTH;
 	}
-	goto st809;
-tr2523:
+	goto st818;
+tr2534:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -61996,8 +62102,8 @@ tr2523:
 		}
 		s->multiline = true;
 	}
-	goto st809;
-tr2524:
+	goto st818;
+tr2535:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62017,8 +62123,8 @@ tr2524:
 		}
 		s->multiline = false;
 	}
-	goto st809;
-tr2532:
+	goto st818;
+tr2543:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62034,11 +62140,11 @@ tr2532:
 	{
 		s->line_counter++;
 	}
-	goto st809;
-st809:
+	goto st818;
+st818:
 	if ( ++p == pe )
-		goto _test_eof809;
-case 809:
+		goto _test_eof818;
+case 818:
 	_widec = (*p);
 	if ( (*p) < 43 ) {
 		if ( (*p) < 32 ) {
@@ -62110,30 +62216,30 @@ case 809:
  s->number64 != 0  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 3081: goto st809;
-		case 3104: goto st809;
-		case 3112: goto tr2437;
-		case 3113: goto tr2438;
-		case 3115: goto tr2459;
-		case 4106: goto tr2446;
-		case 4155: goto st811;
+		case 3081: goto st818;
+		case 3104: goto st818;
+		case 3112: goto tr2448;
+		case 3113: goto tr2449;
+		case 3115: goto tr2470;
+		case 4106: goto tr2457;
+		case 4155: goto st820;
 	}
 	if ( _widec < 3137 ) {
 		if ( 3119 <= _widec && _widec <= 3129 )
-			goto tr2459;
+			goto tr2470;
 	} else if ( _widec > 3162 ) {
 		if ( 3169 <= _widec && _widec <= 3194 )
-			goto tr2459;
+			goto tr2470;
 	} else
-		goto tr2459;
-	goto tr2458;
-tr2459:
-	{ p--; {stack[top++] = 810; goto st322;} }
-	goto st810;
-st810:
+		goto tr2470;
+	goto tr2469;
+tr2470:
+	{ p--; {stack[top++] = 819; goto st322;} }
+	goto st819;
+st819:
 	if ( ++p == pe )
-		goto _test_eof810;
-case 810:
+		goto _test_eof819;
+case 819:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -62147,16 +62253,16 @@ case 810:
  !s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 1546: goto tr2445;
-		case 1595: goto tr2445;
+		case 1546: goto tr2456;
+		case 1595: goto tr2456;
 	}
-	goto tr2458;
-tr2445:
+	goto tr2469;
+tr2456:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1176;
-tr2490:
+	goto st1185;
+tr2501:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62172,16 +62278,16 @@ tr2490:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1176;
-tr2571:
+	goto st1185;
+tr2582:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1176;
-tr2531:
+	goto st1185;
+tr2542:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62197,18 +62303,18 @@ tr2531:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1176;
-st1176:
+	goto st1185;
+st1185:
 	if ( ++p == pe )
-		goto _test_eof1176;
-case 1176:
+		goto _test_eof1185;
+case 1185:
 	goto st0;
-tr2573:
+tr2584:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st811;
-tr2492:
+	goto st820;
+tr2503:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62221,8 +62327,8 @@ tr2492:
 		memcpy(rdata_tail, &(addr4.s_addr), INET4_ADDR_LENGTH);
 		rdata_tail += INET4_ADDR_LENGTH;
 	}
-	goto st811;
-tr2533:
+	goto st820;
+tr2544:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62235,11 +62341,11 @@ tr2533:
 		memcpy(rdata_tail, &(addr6.s6_addr), INET6_ADDR_LENGTH);
 		rdata_tail += INET6_ADDR_LENGTH;
 	}
-	goto st811;
-st811:
+	goto st820;
+st820:
 	if ( ++p == pe )
-		goto _test_eof811;
-case 811:
+		goto _test_eof820;
+case 820:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -62265,11 +62371,11 @@ case 811:
  s->number64 != 0  ) _widec += 512;
 	}
 	if ( _widec == 4106 )
-		goto tr2446;
+		goto tr2457;
 	if ( 3968 <= _widec && _widec <= 4223 )
-		goto st811;
-	goto tr2458;
-tr2440:
+		goto st820;
+	goto tr2469;
+tr2451:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -62277,8 +62383,8 @@ tr2440:
 		}
 		s->multiline = true;
 	}
-	goto st812;
-tr2441:
+	goto st821;
+tr2452:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -62286,18 +62392,18 @@ tr2441:
 		}
 		s->multiline = false;
 	}
-	goto st812;
-tr2450:
+	goto st821;
+tr2461:
 	{
 		s->line_counter++;
 	}
-	goto st812;
-tr2565:
+	goto st821;
+tr2576:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st812;
-tr2566:
+	goto st821;
+tr2577:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -62308,8 +62414,8 @@ tr2566:
 		}
 		s->multiline = true;
 	}
-	goto st812;
-tr2567:
+	goto st821;
+tr2578:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -62320,16 +62426,16 @@ tr2567:
 		}
 		s->multiline = false;
 	}
-	goto st812;
-tr2576:
+	goto st821;
+tr2587:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st812;
-tr2484:
+	goto st821;
+tr2495:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62342,8 +62448,8 @@ tr2484:
 		memcpy(rdata_tail, &(addr4.s_addr), INET4_ADDR_LENGTH);
 		rdata_tail += INET4_ADDR_LENGTH;
 	}
-	goto st812;
-tr2485:
+	goto st821;
+tr2496:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62363,8 +62469,8 @@ tr2485:
 		}
 		s->multiline = true;
 	}
-	goto st812;
-tr2486:
+	goto st821;
+tr2497:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62384,8 +62490,8 @@ tr2486:
 		}
 		s->multiline = false;
 	}
-	goto st812;
-tr2495:
+	goto st821;
+tr2506:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62401,8 +62507,8 @@ tr2495:
 	{
 		s->line_counter++;
 	}
-	goto st812;
-tr2525:
+	goto st821;
+tr2536:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62415,8 +62521,8 @@ tr2525:
 		memcpy(rdata_tail, &(addr6.s6_addr), INET6_ADDR_LENGTH);
 		rdata_tail += INET6_ADDR_LENGTH;
 	}
-	goto st812;
-tr2526:
+	goto st821;
+tr2537:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62436,8 +62542,8 @@ tr2526:
 		}
 		s->multiline = true;
 	}
-	goto st812;
-tr2527:
+	goto st821;
+tr2538:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62457,8 +62563,8 @@ tr2527:
 		}
 		s->multiline = false;
 	}
-	goto st812;
-tr2536:
+	goto st821;
+tr2547:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62474,11 +62580,11 @@ tr2536:
 	{
 		s->line_counter++;
 	}
-	goto st812;
-st812:
+	goto st821;
+st821:
 	if ( ++p == pe )
-		goto _test_eof812;
-case 812:
+		goto _test_eof821;
+case 821:
 	_widec = (*p);
 	if ( (*p) < 32 ) {
 		if ( (*p) > 9 ) {
@@ -62524,28 +62630,28 @@ case 812:
  s->number64 == 0  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 4617: goto st812;
-		case 4640: goto st812;
-		case 4648: goto tr2440;
-		case 4649: goto tr2441;
-		case 13578: goto tr2445;
-		case 13627: goto tr2445;
-		case 13834: goto tr2445;
-		case 13883: goto tr2445;
-		case 14346: goto tr2450;
-		case 14395: goto st813;
-		case 14602: goto tr2445;
-		case 14651: goto tr2445;
-		case 14858: goto tr2452;
-		case 14907: goto tr2453;
-	}
-	goto tr2458;
-tr2577:
+		case 4617: goto st821;
+		case 4640: goto st821;
+		case 4648: goto tr2451;
+		case 4649: goto tr2452;
+		case 13578: goto tr2456;
+		case 13627: goto tr2456;
+		case 13834: goto tr2456;
+		case 13883: goto tr2456;
+		case 14346: goto tr2461;
+		case 14395: goto st822;
+		case 14602: goto tr2456;
+		case 14651: goto tr2456;
+		case 14858: goto tr2463;
+		case 14907: goto tr2464;
+	}
+	goto tr2469;
+tr2588:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st813;
-tr2496:
+	goto st822;
+tr2507:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62558,8 +62664,8 @@ tr2496:
 		memcpy(rdata_tail, &(addr4.s_addr), INET4_ADDR_LENGTH);
 		rdata_tail += INET4_ADDR_LENGTH;
 	}
-	goto st813;
-tr2537:
+	goto st822;
+tr2548:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62572,11 +62678,11 @@ tr2537:
 		memcpy(rdata_tail, &(addr6.s6_addr), INET6_ADDR_LENGTH);
 		rdata_tail += INET6_ADDR_LENGTH;
 	}
-	goto st813;
-st813:
+	goto st822;
+st822:
 	if ( ++p == pe )
-		goto _test_eof813;
-case 813:
+		goto _test_eof822;
+case 822:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -62602,19 +62708,19 @@ case 813:
  s->number64 == 0  ) _widec += 512;
 	}
 	if ( _widec == 5642 )
-		goto tr2450;
+		goto tr2461;
 	if ( 5504 <= _widec && _widec <= 5759 )
-		goto st813;
-	goto tr2458;
-tr2452:
+		goto st822;
+	goto tr2469;
+tr2463:
 	{
 		s->line_counter++;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1177;
-tr2497:
+	goto st1186;
+tr2508:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62633,8 +62739,8 @@ tr2497:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1177;
-tr2538:
+	goto st1186;
+tr2549:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62653,8 +62759,8 @@ tr2538:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1177;
-tr2578:
+	goto st1186;
+tr2589:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -62664,11 +62770,11 @@ tr2578:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1177;
-st1177:
+	goto st1186;
+st1186:
 	if ( ++p == pe )
-		goto _test_eof1177;
-case 1177:
+		goto _test_eof1186;
+case 1186:
 	_widec = (*p);
 	if ( (*p) < 32 ) {
 		if ( (*p) > 9 ) {
@@ -62714,28 +62820,28 @@ case 1177:
  s->number64 == 0  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 4617: goto st812;
-		case 4640: goto st812;
-		case 4648: goto tr2440;
-		case 4649: goto tr2441;
-		case 13578: goto tr2445;
-		case 13627: goto tr2445;
-		case 13834: goto tr2445;
-		case 13883: goto tr2445;
-		case 14346: goto tr2450;
-		case 14395: goto st813;
-		case 14602: goto tr2445;
-		case 14651: goto tr2445;
-		case 14858: goto tr2452;
-		case 14907: goto tr2453;
-	}
-	goto tr2458;
-tr2453:
+		case 4617: goto st821;
+		case 4640: goto st821;
+		case 4648: goto tr2451;
+		case 4649: goto tr2452;
+		case 13578: goto tr2456;
+		case 13627: goto tr2456;
+		case 13834: goto tr2456;
+		case 13883: goto tr2456;
+		case 14346: goto tr2461;
+		case 14395: goto st822;
+		case 14602: goto tr2456;
+		case 14651: goto tr2456;
+		case 14858: goto tr2463;
+		case 14907: goto tr2464;
+	}
+	goto tr2469;
+tr2464:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1178;
-tr2498:
+	goto st1187;
+tr2509:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62751,16 +62857,16 @@ tr2498:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1178;
-tr2579:
+	goto st1187;
+tr2590:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1178;
-tr2539:
+	goto st1187;
+tr2550:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62776,11 +62882,11 @@ tr2539:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1178;
-st1178:
+	goto st1187;
+st1187:
 	if ( ++p == pe )
-		goto _test_eof1178;
-case 1178:
+		goto _test_eof1187;
+case 1187:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -62806,11 +62912,11 @@ case 1178:
  s->number64 == 0  ) _widec += 512;
 	}
 	if ( _widec == 5642 )
-		goto tr2450;
+		goto tr2461;
 	if ( 5504 <= _widec && _widec <= 5759 )
-		goto st813;
-	goto tr2458;
-tr2443:
+		goto st822;
+	goto tr2469;
+tr2454:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -62818,8 +62924,8 @@ tr2443:
 		}
 		s->multiline = true;
 	}
-	goto st814;
-tr2444:
+	goto st823;
+tr2455:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -62827,18 +62933,18 @@ tr2444:
 		}
 		s->multiline = false;
 	}
-	goto st814;
-tr2454:
+	goto st823;
+tr2465:
 	{
 		s->line_counter++;
 	}
-	goto st814;
-tr2568:
+	goto st823;
+tr2579:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st814;
-tr2569:
+	goto st823;
+tr2580:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -62849,8 +62955,8 @@ tr2569:
 		}
 		s->multiline = true;
 	}
-	goto st814;
-tr2570:
+	goto st823;
+tr2581:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -62861,16 +62967,16 @@ tr2570:
 		}
 		s->multiline = false;
 	}
-	goto st814;
-tr2580:
+	goto st823;
+tr2591:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st814;
-tr2487:
+	goto st823;
+tr2498:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62883,8 +62989,8 @@ tr2487:
 		memcpy(rdata_tail, &(addr4.s_addr), INET4_ADDR_LENGTH);
 		rdata_tail += INET4_ADDR_LENGTH;
 	}
-	goto st814;
-tr2488:
+	goto st823;
+tr2499:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62904,8 +63010,8 @@ tr2488:
 		}
 		s->multiline = true;
 	}
-	goto st814;
-tr2489:
+	goto st823;
+tr2500:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62925,8 +63031,8 @@ tr2489:
 		}
 		s->multiline = false;
 	}
-	goto st814;
-tr2499:
+	goto st823;
+tr2510:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62942,8 +63048,8 @@ tr2499:
 	{
 		s->line_counter++;
 	}
-	goto st814;
-tr2528:
+	goto st823;
+tr2539:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62956,8 +63062,8 @@ tr2528:
 		memcpy(rdata_tail, &(addr6.s6_addr), INET6_ADDR_LENGTH);
 		rdata_tail += INET6_ADDR_LENGTH;
 	}
-	goto st814;
-tr2529:
+	goto st823;
+tr2540:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62977,8 +63083,8 @@ tr2529:
 		}
 		s->multiline = true;
 	}
-	goto st814;
-tr2530:
+	goto st823;
+tr2541:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -62998,8 +63104,8 @@ tr2530:
 		}
 		s->multiline = false;
 	}
-	goto st814;
-tr2540:
+	goto st823;
+tr2551:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63015,11 +63121,11 @@ tr2540:
 	{
 		s->line_counter++;
 	}
-	goto st814;
-st814:
+	goto st823;
+st823:
 	if ( ++p == pe )
-		goto _test_eof814;
-case 814:
+		goto _test_eof823;
+case 823:
 	_widec = (*p);
 	if ( (*p) < 43 ) {
 		if ( (*p) < 32 ) {
@@ -63107,60 +63213,60 @@ case 814:
  s->number64 != 0  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 3115: goto tr2459;
-		case 6153: goto st809;
-		case 6176: goto st809;
-		case 6184: goto tr2437;
-		case 6185: goto tr2438;
-		case 6409: goto st812;
-		case 6432: goto st812;
-		case 6440: goto tr2440;
-		case 6441: goto tr2441;
-		case 6665: goto st814;
-		case 6688: goto st814;
-		case 6696: goto tr2443;
-		case 6697: goto tr2444;
-		case 9482: goto tr2445;
-		case 9531: goto tr2445;
-		case 9738: goto tr2445;
-		case 9787: goto tr2445;
-		case 10250: goto tr2446;
-		case 10299: goto st811;
-		case 10506: goto tr2445;
-		case 10555: goto tr2445;
-		case 10762: goto tr2448;
-		case 10811: goto tr2449;
-		case 11274: goto tr2450;
-		case 11323: goto st813;
-		case 11530: goto tr2445;
-		case 11579: goto tr2445;
-		case 11786: goto tr2452;
-		case 11835: goto tr2453;
-		case 12298: goto tr2454;
-		case 12347: goto st815;
-		case 12554: goto tr2445;
-		case 12603: goto tr2445;
-		case 12810: goto tr2456;
-		case 12859: goto tr2457;
+		case 3115: goto tr2470;
+		case 6153: goto st818;
+		case 6176: goto st818;
+		case 6184: goto tr2448;
+		case 6185: goto tr2449;
+		case 6409: goto st821;
+		case 6432: goto st821;
+		case 6440: goto tr2451;
+		case 6441: goto tr2452;
+		case 6665: goto st823;
+		case 6688: goto st823;
+		case 6696: goto tr2454;
+		case 6697: goto tr2455;
+		case 9482: goto tr2456;
+		case 9531: goto tr2456;
+		case 9738: goto tr2456;
+		case 9787: goto tr2456;
+		case 10250: goto tr2457;
+		case 10299: goto st820;
+		case 10506: goto tr2456;
+		case 10555: goto tr2456;
+		case 10762: goto tr2459;
+		case 10811: goto tr2460;
+		case 11274: goto tr2461;
+		case 11323: goto st822;
+		case 11530: goto tr2456;
+		case 11579: goto tr2456;
+		case 11786: goto tr2463;
+		case 11835: goto tr2464;
+		case 12298: goto tr2465;
+		case 12347: goto st824;
+		case 12554: goto tr2456;
+		case 12603: goto tr2456;
+		case 12810: goto tr2467;
+		case 12859: goto tr2468;
 	}
 	if ( _widec < 3137 ) {
 		if ( 3119 <= _widec && _widec <= 3129 )
-			goto tr2459;
+			goto tr2470;
 	} else if ( _widec > 3162 ) {
 		if ( 3169 <= _widec && _widec <= 3194 )
-			goto tr2459;
+			goto tr2470;
 	} else
-		goto tr2459;
-	goto tr2458;
-tr2448:
+		goto tr2470;
+	goto tr2469;
+tr2459:
 	{
 		s->line_counter++;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1179;
-tr2493:
+	goto st1188;
+tr2504:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63179,8 +63285,8 @@ tr2493:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1179;
-tr2534:
+	goto st1188;
+tr2545:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63199,8 +63305,8 @@ tr2534:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1179;
-tr2574:
+	goto st1188;
+tr2585:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -63210,11 +63316,11 @@ tr2574:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1179;
-st1179:
+	goto st1188;
+st1188:
 	if ( ++p == pe )
-		goto _test_eof1179;
-case 1179:
+		goto _test_eof1188;
+case 1188:
 	_widec = (*p);
 	if ( (*p) < 43 ) {
 		if ( (*p) < 32 ) {
@@ -63286,29 +63392,29 @@ case 1179:
  s->number64 != 0  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 3081: goto st809;
-		case 3104: goto st809;
-		case 3112: goto tr2437;
-		case 3113: goto tr2438;
-		case 3115: goto tr2459;
-		case 4106: goto tr2446;
-		case 4155: goto st811;
+		case 3081: goto st818;
+		case 3104: goto st818;
+		case 3112: goto tr2448;
+		case 3113: goto tr2449;
+		case 3115: goto tr2470;
+		case 4106: goto tr2457;
+		case 4155: goto st820;
 	}
 	if ( _widec < 3137 ) {
 		if ( 3119 <= _widec && _widec <= 3129 )
-			goto tr2459;
+			goto tr2470;
 	} else if ( _widec > 3162 ) {
 		if ( 3169 <= _widec && _widec <= 3194 )
-			goto tr2459;
+			goto tr2470;
 	} else
-		goto tr2459;
-	goto tr2458;
-tr2449:
+		goto tr2470;
+	goto tr2469;
+tr2460:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1180;
-tr2494:
+	goto st1189;
+tr2505:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63324,16 +63430,16 @@ tr2494:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1180;
-tr2575:
+	goto st1189;
+tr2586:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1180;
-tr2535:
+	goto st1189;
+tr2546:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63349,11 +63455,11 @@ tr2535:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1180;
-st1180:
+	goto st1189;
+st1189:
 	if ( ++p == pe )
-		goto _test_eof1180;
-case 1180:
+		goto _test_eof1189;
+case 1189:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -63379,16 +63485,16 @@ case 1180:
  s->number64 != 0  ) _widec += 512;
 	}
 	if ( _widec == 4106 )
-		goto tr2446;
+		goto tr2457;
 	if ( 3968 <= _widec && _widec <= 4223 )
-		goto st811;
-	goto tr2458;
-tr2581:
+		goto st820;
+	goto tr2469;
+tr2592:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st815;
-tr2500:
+	goto st824;
+tr2511:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63401,8 +63507,8 @@ tr2500:
 		memcpy(rdata_tail, &(addr4.s_addr), INET4_ADDR_LENGTH);
 		rdata_tail += INET4_ADDR_LENGTH;
 	}
-	goto st815;
-tr2541:
+	goto st824;
+tr2552:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63415,11 +63521,11 @@ tr2541:
 		memcpy(rdata_tail, &(addr6.s6_addr), INET6_ADDR_LENGTH);
 		rdata_tail += INET6_ADDR_LENGTH;
 	}
-	goto st815;
-st815:
+	goto st824;
+st824:
 	if ( ++p == pe )
-		goto _test_eof815;
-case 815:
+		goto _test_eof824;
+case 824:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -63451,28 +63557,28 @@ case 815:
  s->number64 == 0  ) _widec += 1024;
 	}
 	switch( _widec ) {
-		case 7690: goto tr2446;
-		case 8202: goto tr2450;
-		case 8714: goto tr2454;
+		case 7690: goto tr2457;
+		case 8202: goto tr2461;
+		case 8714: goto tr2465;
 	}
 	if ( _widec < 8064 ) {
 		if ( 7552 <= _widec && _widec <= 7807 )
-			goto st811;
+			goto st820;
 	} else if ( _widec > 8319 ) {
 		if ( 8576 <= _widec && _widec <= 8831 )
-			goto st815;
+			goto st824;
 	} else
-		goto st813;
-	goto tr2458;
-tr2456:
+		goto st822;
+	goto tr2469;
+tr2467:
 	{
 		s->line_counter++;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1181;
-tr2501:
+	goto st1190;
+tr2512:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63491,8 +63597,8 @@ tr2501:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1181;
-tr2542:
+	goto st1190;
+tr2553:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63511,8 +63617,8 @@ tr2542:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1181;
-tr2582:
+	goto st1190;
+tr2593:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -63522,11 +63628,11 @@ tr2582:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1181;
-st1181:
+	goto st1190;
+st1190:
 	if ( ++p == pe )
-		goto _test_eof1181;
-case 1181:
+		goto _test_eof1190;
+case 1190:
 	_widec = (*p);
 	if ( (*p) < 43 ) {
 		if ( (*p) < 32 ) {
@@ -63614,57 +63720,57 @@ case 1181:
  s->number64 != 0  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 3115: goto tr2459;
-		case 6153: goto st809;
-		case 6176: goto st809;
-		case 6184: goto tr2437;
-		case 6185: goto tr2438;
-		case 6409: goto st812;
-		case 6432: goto st812;
-		case 6440: goto tr2440;
-		case 6441: goto tr2441;
-		case 6665: goto st814;
-		case 6688: goto st814;
-		case 6696: goto tr2443;
-		case 6697: goto tr2444;
-		case 9482: goto tr2445;
-		case 9531: goto tr2445;
-		case 9738: goto tr2445;
-		case 9787: goto tr2445;
-		case 10250: goto tr2446;
-		case 10299: goto st811;
-		case 10506: goto tr2445;
-		case 10555: goto tr2445;
-		case 10762: goto tr2448;
-		case 10811: goto tr2449;
-		case 11274: goto tr2450;
-		case 11323: goto st813;
-		case 11530: goto tr2445;
-		case 11579: goto tr2445;
-		case 11786: goto tr2452;
-		case 11835: goto tr2453;
-		case 12298: goto tr2454;
-		case 12347: goto st815;
-		case 12554: goto tr2445;
-		case 12603: goto tr2445;
-		case 12810: goto tr2456;
-		case 12859: goto tr2457;
+		case 3115: goto tr2470;
+		case 6153: goto st818;
+		case 6176: goto st818;
+		case 6184: goto tr2448;
+		case 6185: goto tr2449;
+		case 6409: goto st821;
+		case 6432: goto st821;
+		case 6440: goto tr2451;
+		case 6441: goto tr2452;
+		case 6665: goto st823;
+		case 6688: goto st823;
+		case 6696: goto tr2454;
+		case 6697: goto tr2455;
+		case 9482: goto tr2456;
+		case 9531: goto tr2456;
+		case 9738: goto tr2456;
+		case 9787: goto tr2456;
+		case 10250: goto tr2457;
+		case 10299: goto st820;
+		case 10506: goto tr2456;
+		case 10555: goto tr2456;
+		case 10762: goto tr2459;
+		case 10811: goto tr2460;
+		case 11274: goto tr2461;
+		case 11323: goto st822;
+		case 11530: goto tr2456;
+		case 11579: goto tr2456;
+		case 11786: goto tr2463;
+		case 11835: goto tr2464;
+		case 12298: goto tr2465;
+		case 12347: goto st824;
+		case 12554: goto tr2456;
+		case 12603: goto tr2456;
+		case 12810: goto tr2467;
+		case 12859: goto tr2468;
 	}
 	if ( _widec < 3137 ) {
 		if ( 3119 <= _widec && _widec <= 3129 )
-			goto tr2459;
+			goto tr2470;
 	} else if ( _widec > 3162 ) {
 		if ( 3169 <= _widec && _widec <= 3194 )
-			goto tr2459;
+			goto tr2470;
 	} else
-		goto tr2459;
-	goto tr2458;
-tr2457:
+		goto tr2470;
+	goto tr2469;
+tr2468:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1182;
-tr2502:
+	goto st1191;
+tr2513:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63680,16 +63786,16 @@ tr2502:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1182;
-tr2583:
+	goto st1191;
+tr2594:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1182;
-tr2543:
+	goto st1191;
+tr2554:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -63705,11 +63811,11 @@ tr2543:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1182;
-st1182:
+	goto st1191;
+st1191:
 	if ( ++p == pe )
-		goto _test_eof1182;
-case 1182:
+		goto _test_eof1191;
+case 1191:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -63741,20 +63847,20 @@ case 1182:
  s->number64 == 0  ) _widec += 1024;
 	}
 	switch( _widec ) {
-		case 7690: goto tr2446;
-		case 8202: goto tr2450;
-		case 8714: goto tr2454;
+		case 7690: goto tr2457;
+		case 8202: goto tr2461;
+		case 8714: goto tr2465;
 	}
 	if ( _widec < 8064 ) {
 		if ( 7552 <= _widec && _widec <= 7807 )
-			goto st811;
+			goto st820;
 	} else if ( _widec > 8319 ) {
 		if ( 8576 <= _widec && _widec <= 8831 )
-			goto st815;
+			goto st824;
 	} else
-		goto st813;
-	goto tr2458;
-tr2428:
+		goto st822;
+	goto tr2469;
+tr2439:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -63764,11 +63870,11 @@ tr2428:
 			p--; {goto st261;}
 		}
 	}
-	goto st816;
-st816:
+	goto st825;
+st825:
 	if ( ++p == pe )
-		goto _test_eof816;
-case 816:
+		goto _test_eof825;
+case 825:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -63788,14 +63894,14 @@ case 816:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2433;
+		goto tr2444;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st816;
-	goto tr2406;
-st817:
+		goto st825;
+	goto tr2417;
+st826:
 	if ( ++p == pe )
-		goto _test_eof817;
-case 817:
+		goto _test_eof826;
+case 826:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -63815,19 +63921,19 @@ case 817:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2419;
+		goto tr2430;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st817;
-	goto tr2406;
-tr2411:
+		goto st826;
+	goto tr2417;
+tr2422:
 	{
 		*(rdata_tail++) = 1;
 	}
-	goto st818;
-st818:
+	goto st827;
+st827:
 	if ( ++p == pe )
-		goto _test_eof818;
-case 818:
+		goto _test_eof827;
+case 827:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -63841,15 +63947,15 @@ case 818:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st819;
-		case 32: goto st819;
-		case 40: goto tr2461;
-		case 41: goto tr2462;
-		case 1034: goto tr2463;
-		case 1083: goto st824;
-	}
-	goto tr2406;
-tr2461:
+		case 9: goto st828;
+		case 32: goto st828;
+		case 40: goto tr2472;
+		case 41: goto tr2473;
+		case 1034: goto tr2474;
+		case 1083: goto st833;
+	}
+	goto tr2417;
+tr2472:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -63857,8 +63963,8 @@ tr2461:
 		}
 		s->multiline = true;
 	}
-	goto st819;
-tr2462:
+	goto st828;
+tr2473:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -63866,16 +63972,16 @@ tr2462:
 		}
 		s->multiline = false;
 	}
-	goto st819;
-tr2463:
+	goto st828;
+tr2474:
 	{
 		s->line_counter++;
 	}
-	goto st819;
-st819:
+	goto st828;
+st828:
 	if ( ++p == pe )
-		goto _test_eof819;
-case 819:
+		goto _test_eof828;
+case 828:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -63889,17 +63995,17 @@ case 819:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st819;
-		case 32: goto st819;
-		case 40: goto tr2461;
-		case 41: goto tr2462;
-		case 1034: goto tr2463;
-		case 1083: goto st824;
+		case 9: goto st828;
+		case 32: goto st828;
+		case 40: goto tr2472;
+		case 41: goto tr2473;
+		case 1034: goto tr2474;
+		case 1083: goto st833;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2465;
-	goto tr2421;
-tr2465:
+		goto tr2476;
+	goto tr2432;
+tr2476:
 	{
 		s->number64 = 0;
 	}
@@ -63917,8 +64023,8 @@ tr2465:
 			p--; {goto st261;}
 		}
 	}
-	goto st820;
-tr2469:
+	goto st829;
+tr2480:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -63933,11 +64039,11 @@ tr2469:
 			p--; {goto st261;}
 		}
 	}
-	goto st820;
-st820:
+	goto st829;
+st829:
 	if ( ++p == pe )
-		goto _test_eof820;
-case 820:
+		goto _test_eof829;
+case 829:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -63951,17 +64057,17 @@ case 820:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2466;
-		case 32: goto tr2466;
-		case 40: goto tr2467;
-		case 41: goto tr2468;
-		case 1034: goto tr2470;
-		case 1083: goto tr2471;
+		case 9: goto tr2477;
+		case 32: goto tr2477;
+		case 40: goto tr2478;
+		case 41: goto tr2479;
+		case 1034: goto tr2481;
+		case 1083: goto tr2482;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2469;
-	goto tr2421;
-tr2474:
+		goto tr2480;
+	goto tr2432;
+tr2485:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -63969,8 +64075,8 @@ tr2474:
 		}
 		s->multiline = true;
 	}
-	goto st821;
-tr2475:
+	goto st830;
+tr2486:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -63978,13 +64084,13 @@ tr2475:
 		}
 		s->multiline = false;
 	}
-	goto st821;
-tr2477:
+	goto st830;
+tr2488:
 	{
 		s->line_counter++;
 	}
-	goto st821;
-tr2466:
+	goto st830;
+tr2477:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -63994,8 +64100,8 @@ tr2466:
 			p--; {goto st261;}
 		}
 	}
-	goto st821;
-tr2467:
+	goto st830;
+tr2478:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64012,8 +64118,8 @@ tr2467:
 		}
 		s->multiline = true;
 	}
-	goto st821;
-tr2468:
+	goto st830;
+tr2479:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64030,8 +64136,8 @@ tr2468:
 		}
 		s->multiline = false;
 	}
-	goto st821;
-tr2470:
+	goto st830;
+tr2481:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64044,11 +64150,11 @@ tr2470:
 	{
 		s->line_counter++;
 	}
-	goto st821;
-st821:
+	goto st830;
+st830:
 	if ( ++p == pe )
-		goto _test_eof821;
-case 821:
+		goto _test_eof830;
+case 830:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64062,18 +64168,18 @@ case 821:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st821;
-		case 32: goto st821;
-		case 40: goto tr2474;
-		case 41: goto tr2475;
-		case 46: goto tr2476;
-		case 1034: goto tr2477;
-		case 1083: goto st823;
+		case 9: goto st830;
+		case 32: goto st830;
+		case 40: goto tr2485;
+		case 41: goto tr2486;
+		case 46: goto tr2487;
+		case 1034: goto tr2488;
+		case 1083: goto st832;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2476;
-	goto tr2472;
-tr2476:
+		goto tr2487;
+	goto tr2483;
+tr2487:
 	{
 		s->buffer_length = 0;
 	}
@@ -64086,8 +64192,8 @@ tr2476:
 			p--; {goto st261;}
 		}
 	}
-	goto st822;
-tr2480:
+	goto st831;
+tr2491:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -64097,11 +64203,11 @@ tr2480:
 			p--; {goto st261;}
 		}
 	}
-	goto st822;
-st822:
+	goto st831;
+st831:
 	if ( ++p == pe )
-		goto _test_eof822;
-case 822:
+		goto _test_eof831;
+case 831:
 	_widec = (*p);
 	if ( (*p) < 32 ) {
 		if ( (*p) > 9 ) {
@@ -64159,46 +64265,46 @@ case 822:
  s->number64 == 0  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 46: goto tr2480;
-		case 6153: goto tr2481;
-		case 6176: goto tr2481;
-		case 6184: goto tr2482;
-		case 6185: goto tr2483;
-		case 6409: goto tr2484;
-		case 6432: goto tr2484;
-		case 6440: goto tr2485;
-		case 6441: goto tr2486;
-		case 6665: goto tr2487;
-		case 6688: goto tr2487;
-		case 6696: goto tr2488;
-		case 6697: goto tr2489;
-		case 9482: goto tr2490;
-		case 9531: goto tr2490;
-		case 9738: goto tr2490;
-		case 9787: goto tr2490;
-		case 10250: goto tr2491;
-		case 10299: goto tr2492;
-		case 10506: goto tr2490;
-		case 10555: goto tr2490;
-		case 10762: goto tr2493;
-		case 10811: goto tr2494;
-		case 11274: goto tr2495;
-		case 11323: goto tr2496;
-		case 11530: goto tr2490;
-		case 11579: goto tr2490;
-		case 11786: goto tr2497;
-		case 11835: goto tr2498;
-		case 12298: goto tr2499;
-		case 12347: goto tr2500;
-		case 12554: goto tr2490;
-		case 12603: goto tr2490;
-		case 12810: goto tr2501;
-		case 12859: goto tr2502;
+		case 46: goto tr2491;
+		case 6153: goto tr2492;
+		case 6176: goto tr2492;
+		case 6184: goto tr2493;
+		case 6185: goto tr2494;
+		case 6409: goto tr2495;
+		case 6432: goto tr2495;
+		case 6440: goto tr2496;
+		case 6441: goto tr2497;
+		case 6665: goto tr2498;
+		case 6688: goto tr2498;
+		case 6696: goto tr2499;
+		case 6697: goto tr2500;
+		case 9482: goto tr2501;
+		case 9531: goto tr2501;
+		case 9738: goto tr2501;
+		case 9787: goto tr2501;
+		case 10250: goto tr2502;
+		case 10299: goto tr2503;
+		case 10506: goto tr2501;
+		case 10555: goto tr2501;
+		case 10762: goto tr2504;
+		case 10811: goto tr2505;
+		case 11274: goto tr2506;
+		case 11323: goto tr2507;
+		case 11530: goto tr2501;
+		case 11579: goto tr2501;
+		case 11786: goto tr2508;
+		case 11835: goto tr2509;
+		case 12298: goto tr2510;
+		case 12347: goto tr2511;
+		case 12554: goto tr2501;
+		case 12603: goto tr2501;
+		case 12810: goto tr2512;
+		case 12859: goto tr2513;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2480;
-	goto tr2479;
-tr2471:
+		goto tr2491;
+	goto tr2490;
+tr2482:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64208,11 +64314,11 @@ tr2471:
 			p--; {goto st261;}
 		}
 	}
-	goto st823;
-st823:
+	goto st832;
+st832:
 	if ( ++p == pe )
-		goto _test_eof823;
-case 823:
+		goto _test_eof832;
+case 832:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -64232,14 +64338,14 @@ case 823:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2477;
+		goto tr2488;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st823;
-	goto tr2406;
-st824:
+		goto st832;
+	goto tr2417;
+st833:
 	if ( ++p == pe )
-		goto _test_eof824;
-case 824:
+		goto _test_eof833;
+case 833:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -64259,19 +64365,19 @@ case 824:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2463;
+		goto tr2474;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st824;
-	goto tr2406;
-tr2412:
+		goto st833;
+	goto tr2417;
+tr2423:
 	{
 		*(rdata_tail++) = 2;
 	}
-	goto st825;
-st825:
+	goto st834;
+st834:
 	if ( ++p == pe )
-		goto _test_eof825;
-case 825:
+		goto _test_eof834;
+case 834:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64285,15 +64391,15 @@ case 825:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st826;
-		case 32: goto st826;
-		case 40: goto tr2504;
-		case 41: goto tr2505;
-		case 1034: goto tr2506;
-		case 1083: goto st831;
-	}
-	goto tr2406;
-tr2504:
+		case 9: goto st835;
+		case 32: goto st835;
+		case 40: goto tr2515;
+		case 41: goto tr2516;
+		case 1034: goto tr2517;
+		case 1083: goto st840;
+	}
+	goto tr2417;
+tr2515:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -64301,8 +64407,8 @@ tr2504:
 		}
 		s->multiline = true;
 	}
-	goto st826;
-tr2505:
+	goto st835;
+tr2516:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -64310,16 +64416,16 @@ tr2505:
 		}
 		s->multiline = false;
 	}
-	goto st826;
-tr2506:
+	goto st835;
+tr2517:
 	{
 		s->line_counter++;
 	}
-	goto st826;
-st826:
+	goto st835;
+st835:
 	if ( ++p == pe )
-		goto _test_eof826;
-case 826:
+		goto _test_eof835;
+case 835:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64333,17 +64439,17 @@ case 826:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st826;
-		case 32: goto st826;
-		case 40: goto tr2504;
-		case 41: goto tr2505;
-		case 1034: goto tr2506;
-		case 1083: goto st831;
+		case 9: goto st835;
+		case 32: goto st835;
+		case 40: goto tr2515;
+		case 41: goto tr2516;
+		case 1034: goto tr2517;
+		case 1083: goto st840;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2508;
-	goto tr2421;
-tr2508:
+		goto tr2519;
+	goto tr2432;
+tr2519:
 	{
 		s->number64 = 0;
 	}
@@ -64361,8 +64467,8 @@ tr2508:
 			p--; {goto st261;}
 		}
 	}
-	goto st827;
-tr2512:
+	goto st836;
+tr2523:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -64377,11 +64483,11 @@ tr2512:
 			p--; {goto st261;}
 		}
 	}
-	goto st827;
-st827:
+	goto st836;
+st836:
 	if ( ++p == pe )
-		goto _test_eof827;
-case 827:
+		goto _test_eof836;
+case 836:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64395,17 +64501,17 @@ case 827:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2509;
-		case 32: goto tr2509;
-		case 40: goto tr2510;
-		case 41: goto tr2511;
-		case 1034: goto tr2513;
-		case 1083: goto tr2514;
+		case 9: goto tr2520;
+		case 32: goto tr2520;
+		case 40: goto tr2521;
+		case 41: goto tr2522;
+		case 1034: goto tr2524;
+		case 1083: goto tr2525;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2512;
-	goto tr2421;
-tr2516:
+		goto tr2523;
+	goto tr2432;
+tr2527:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -64413,8 +64519,8 @@ tr2516:
 		}
 		s->multiline = true;
 	}
-	goto st828;
-tr2517:
+	goto st837;
+tr2528:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -64422,13 +64528,13 @@ tr2517:
 		}
 		s->multiline = false;
 	}
-	goto st828;
-tr2519:
+	goto st837;
+tr2530:
 	{
 		s->line_counter++;
 	}
-	goto st828;
-tr2509:
+	goto st837;
+tr2520:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64438,8 +64544,8 @@ tr2509:
 			p--; {goto st261;}
 		}
 	}
-	goto st828;
-tr2510:
+	goto st837;
+tr2521:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64456,8 +64562,8 @@ tr2510:
 		}
 		s->multiline = true;
 	}
-	goto st828;
-tr2511:
+	goto st837;
+tr2522:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64474,8 +64580,8 @@ tr2511:
 		}
 		s->multiline = false;
 	}
-	goto st828;
-tr2513:
+	goto st837;
+tr2524:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64488,11 +64594,11 @@ tr2513:
 	{
 		s->line_counter++;
 	}
-	goto st828;
-st828:
+	goto st837;
+st837:
 	if ( ++p == pe )
-		goto _test_eof828;
-case 828:
+		goto _test_eof837;
+case 837:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64506,24 +64612,24 @@ case 828:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st828;
-		case 32: goto st828;
-		case 40: goto tr2516;
-		case 41: goto tr2517;
-		case 46: goto tr2518;
-		case 1034: goto tr2519;
-		case 1083: goto st830;
+		case 9: goto st837;
+		case 32: goto st837;
+		case 40: goto tr2527;
+		case 41: goto tr2528;
+		case 46: goto tr2529;
+		case 1034: goto tr2530;
+		case 1083: goto st839;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 58 )
-			goto tr2518;
+			goto tr2529;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2518;
+			goto tr2529;
 	} else
-		goto tr2518;
-	goto tr2472;
-tr2518:
+		goto tr2529;
+	goto tr2483;
+tr2529:
 	{
 		s->buffer_length = 0;
 	}
@@ -64536,8 +64642,8 @@ tr2518:
 			p--; {goto st261;}
 		}
 	}
-	goto st829;
-tr2521:
+	goto st838;
+tr2532:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -64547,11 +64653,11 @@ tr2521:
 			p--; {goto st261;}
 		}
 	}
-	goto st829;
-st829:
+	goto st838;
+st838:
 	if ( ++p == pe )
-		goto _test_eof829;
-case 829:
+		goto _test_eof838;
+case 838:
 	_widec = (*p);
 	if ( (*p) < 32 ) {
 		if ( (*p) > 9 ) {
@@ -64609,52 +64715,52 @@ case 829:
  s->number64 == 0  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 46: goto tr2521;
-		case 6153: goto tr2522;
-		case 6176: goto tr2522;
-		case 6184: goto tr2523;
-		case 6185: goto tr2524;
-		case 6409: goto tr2525;
-		case 6432: goto tr2525;
-		case 6440: goto tr2526;
-		case 6441: goto tr2527;
-		case 6665: goto tr2528;
-		case 6688: goto tr2528;
-		case 6696: goto tr2529;
-		case 6697: goto tr2530;
-		case 9482: goto tr2531;
-		case 9531: goto tr2531;
-		case 9738: goto tr2531;
-		case 9787: goto tr2531;
-		case 10250: goto tr2532;
-		case 10299: goto tr2533;
-		case 10506: goto tr2531;
-		case 10555: goto tr2531;
-		case 10762: goto tr2534;
-		case 10811: goto tr2535;
-		case 11274: goto tr2536;
-		case 11323: goto tr2537;
-		case 11530: goto tr2531;
-		case 11579: goto tr2531;
-		case 11786: goto tr2538;
-		case 11835: goto tr2539;
-		case 12298: goto tr2540;
-		case 12347: goto tr2541;
-		case 12554: goto tr2531;
-		case 12603: goto tr2531;
-		case 12810: goto tr2542;
-		case 12859: goto tr2543;
+		case 46: goto tr2532;
+		case 6153: goto tr2533;
+		case 6176: goto tr2533;
+		case 6184: goto tr2534;
+		case 6185: goto tr2535;
+		case 6409: goto tr2536;
+		case 6432: goto tr2536;
+		case 6440: goto tr2537;
+		case 6441: goto tr2538;
+		case 6665: goto tr2539;
+		case 6688: goto tr2539;
+		case 6696: goto tr2540;
+		case 6697: goto tr2541;
+		case 9482: goto tr2542;
+		case 9531: goto tr2542;
+		case 9738: goto tr2542;
+		case 9787: goto tr2542;
+		case 10250: goto tr2543;
+		case 10299: goto tr2544;
+		case 10506: goto tr2542;
+		case 10555: goto tr2542;
+		case 10762: goto tr2545;
+		case 10811: goto tr2546;
+		case 11274: goto tr2547;
+		case 11323: goto tr2548;
+		case 11530: goto tr2542;
+		case 11579: goto tr2542;
+		case 11786: goto tr2549;
+		case 11835: goto tr2550;
+		case 12298: goto tr2551;
+		case 12347: goto tr2552;
+		case 12554: goto tr2542;
+		case 12603: goto tr2542;
+		case 12810: goto tr2553;
+		case 12859: goto tr2554;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 58 )
-			goto tr2521;
+			goto tr2532;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr2521;
+			goto tr2532;
 	} else
-		goto tr2521;
-	goto tr2479;
-tr2514:
+		goto tr2532;
+	goto tr2490;
+tr2525:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64664,11 +64770,11 @@ tr2514:
 			p--; {goto st261;}
 		}
 	}
-	goto st830;
-st830:
+	goto st839;
+st839:
 	if ( ++p == pe )
-		goto _test_eof830;
-case 830:
+		goto _test_eof839;
+case 839:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -64688,14 +64794,14 @@ case 830:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2519;
+		goto tr2530;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st830;
-	goto tr2406;
-st831:
+		goto st839;
+	goto tr2417;
+st840:
 	if ( ++p == pe )
-		goto _test_eof831;
-case 831:
+		goto _test_eof840;
+case 840:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -64715,19 +64821,19 @@ case 831:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2506;
+		goto tr2517;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st831;
-	goto tr2406;
-tr2413:
+		goto st840;
+	goto tr2417;
+tr2424:
 	{
 		*(rdata_tail++) = 3;
 	}
-	goto st832;
-st832:
+	goto st841;
+st841:
 	if ( ++p == pe )
-		goto _test_eof832;
-case 832:
+		goto _test_eof841;
+case 841:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64741,15 +64847,15 @@ case 832:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st833;
-		case 32: goto st833;
-		case 40: goto tr2545;
-		case 41: goto tr2546;
-		case 1034: goto tr2547;
-		case 1083: goto st838;
-	}
-	goto tr2406;
-tr2545:
+		case 9: goto st842;
+		case 32: goto st842;
+		case 40: goto tr2556;
+		case 41: goto tr2557;
+		case 1034: goto tr2558;
+		case 1083: goto st847;
+	}
+	goto tr2417;
+tr2556:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -64757,8 +64863,8 @@ tr2545:
 		}
 		s->multiline = true;
 	}
-	goto st833;
-tr2546:
+	goto st842;
+tr2557:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -64766,16 +64872,16 @@ tr2546:
 		}
 		s->multiline = false;
 	}
-	goto st833;
-tr2547:
+	goto st842;
+tr2558:
 	{
 		s->line_counter++;
 	}
-	goto st833;
-st833:
+	goto st842;
+st842:
 	if ( ++p == pe )
-		goto _test_eof833;
-case 833:
+		goto _test_eof842;
+case 842:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64789,17 +64895,17 @@ case 833:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st833;
-		case 32: goto st833;
-		case 40: goto tr2545;
-		case 41: goto tr2546;
-		case 1034: goto tr2547;
-		case 1083: goto st838;
+		case 9: goto st842;
+		case 32: goto st842;
+		case 40: goto tr2556;
+		case 41: goto tr2557;
+		case 1034: goto tr2558;
+		case 1083: goto st847;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2549;
-	goto tr2421;
-tr2549:
+		goto tr2560;
+	goto tr2432;
+tr2560:
 	{
 		s->number64 = 0;
 	}
@@ -64817,8 +64923,8 @@ tr2549:
 			p--; {goto st261;}
 		}
 	}
-	goto st834;
-tr2553:
+	goto st843;
+tr2564:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -64833,11 +64939,11 @@ tr2553:
 			p--; {goto st261;}
 		}
 	}
-	goto st834;
-st834:
+	goto st843;
+st843:
 	if ( ++p == pe )
-		goto _test_eof834;
-case 834:
+		goto _test_eof843;
+case 843:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64851,17 +64957,17 @@ case 834:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2550;
-		case 32: goto tr2550;
-		case 40: goto tr2551;
-		case 41: goto tr2552;
-		case 1034: goto tr2554;
-		case 1083: goto tr2555;
+		case 9: goto tr2561;
+		case 32: goto tr2561;
+		case 40: goto tr2562;
+		case 41: goto tr2563;
+		case 1034: goto tr2565;
+		case 1083: goto tr2566;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2553;
-	goto tr2421;
-tr2557:
+		goto tr2564;
+	goto tr2432;
+tr2568:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -64869,8 +64975,8 @@ tr2557:
 		}
 		s->multiline = true;
 	}
-	goto st835;
-tr2558:
+	goto st844;
+tr2569:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -64878,13 +64984,13 @@ tr2558:
 		}
 		s->multiline = false;
 	}
-	goto st835;
-tr2560:
+	goto st844;
+tr2571:
 	{
 		s->line_counter++;
 	}
-	goto st835;
-tr2550:
+	goto st844;
+tr2561:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64894,8 +65000,8 @@ tr2550:
 			p--; {goto st261;}
 		}
 	}
-	goto st835;
-tr2551:
+	goto st844;
+tr2562:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64912,8 +65018,8 @@ tr2551:
 		}
 		s->multiline = true;
 	}
-	goto st835;
-tr2552:
+	goto st844;
+tr2563:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64930,8 +65036,8 @@ tr2552:
 		}
 		s->multiline = false;
 	}
-	goto st835;
-tr2554:
+	goto st844;
+tr2565:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -64944,11 +65050,11 @@ tr2554:
 	{
 		s->line_counter++;
 	}
-	goto st835;
-st835:
+	goto st844;
+st844:
 	if ( ++p == pe )
-		goto _test_eof835;
-case 835:
+		goto _test_eof844;
+case 844:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -64962,35 +65068,35 @@ case 835:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st835;
-		case 32: goto st835;
-		case 40: goto tr2557;
-		case 41: goto tr2558;
-		case 42: goto tr2559;
-		case 92: goto tr2559;
-		case 95: goto tr2559;
-		case 1034: goto tr2560;
-		case 1083: goto st837;
+		case 9: goto st844;
+		case 32: goto st844;
+		case 40: goto tr2568;
+		case 41: goto tr2569;
+		case 42: goto tr2570;
+		case 92: goto tr2570;
+		case 95: goto tr2570;
+		case 1034: goto tr2571;
+		case 1083: goto st846;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr2559;
+			goto tr2570;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2559;
+			goto tr2570;
 	} else
-		goto tr2559;
-	goto tr2406;
-tr2559:
+		goto tr2570;
+	goto tr2417;
+tr2570:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 836; goto st263;} }
-	goto st836;
-st836:
+	{ p--; {stack[top++] = 845; goto st263;} }
+	goto st845;
+st845:
 	if ( ++p == pe )
-		goto _test_eof836;
-case 836:
+		goto _test_eof845;
+case 845:
 	_widec = (*p);
 	if ( (*p) < 32 ) {
 		if ( (*p) > 9 ) {
@@ -65048,43 +65154,43 @@ case 836:
  s->number64 == 0  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 6153: goto tr2562;
-		case 6176: goto tr2562;
-		case 6184: goto tr2563;
-		case 6185: goto tr2564;
-		case 6409: goto tr2565;
-		case 6432: goto tr2565;
-		case 6440: goto tr2566;
-		case 6441: goto tr2567;
-		case 6665: goto tr2568;
-		case 6688: goto tr2568;
-		case 6696: goto tr2569;
-		case 6697: goto tr2570;
-		case 9482: goto tr2571;
-		case 9531: goto tr2571;
-		case 9738: goto tr2571;
-		case 9787: goto tr2571;
-		case 10250: goto tr2572;
-		case 10299: goto tr2573;
-		case 10506: goto tr2571;
-		case 10555: goto tr2571;
-		case 10762: goto tr2574;
-		case 10811: goto tr2575;
-		case 11274: goto tr2576;
-		case 11323: goto tr2577;
-		case 11530: goto tr2571;
-		case 11579: goto tr2571;
-		case 11786: goto tr2578;
-		case 11835: goto tr2579;
-		case 12298: goto tr2580;
-		case 12347: goto tr2581;
-		case 12554: goto tr2571;
-		case 12603: goto tr2571;
-		case 12810: goto tr2582;
-		case 12859: goto tr2583;
-	}
-	goto tr2435;
-tr2555:
+		case 6153: goto tr2573;
+		case 6176: goto tr2573;
+		case 6184: goto tr2574;
+		case 6185: goto tr2575;
+		case 6409: goto tr2576;
+		case 6432: goto tr2576;
+		case 6440: goto tr2577;
+		case 6441: goto tr2578;
+		case 6665: goto tr2579;
+		case 6688: goto tr2579;
+		case 6696: goto tr2580;
+		case 6697: goto tr2581;
+		case 9482: goto tr2582;
+		case 9531: goto tr2582;
+		case 9738: goto tr2582;
+		case 9787: goto tr2582;
+		case 10250: goto tr2583;
+		case 10299: goto tr2584;
+		case 10506: goto tr2582;
+		case 10555: goto tr2582;
+		case 10762: goto tr2585;
+		case 10811: goto tr2586;
+		case 11274: goto tr2587;
+		case 11323: goto tr2588;
+		case 11530: goto tr2582;
+		case 11579: goto tr2582;
+		case 11786: goto tr2589;
+		case 11835: goto tr2590;
+		case 12298: goto tr2591;
+		case 12347: goto tr2592;
+		case 12554: goto tr2582;
+		case 12603: goto tr2582;
+		case 12810: goto tr2593;
+		case 12859: goto tr2594;
+	}
+	goto tr2446;
+tr2566:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -65094,11 +65200,11 @@ tr2555:
 			p--; {goto st261;}
 		}
 	}
-	goto st837;
-st837:
+	goto st846;
+st846:
 	if ( ++p == pe )
-		goto _test_eof837;
-case 837:
+		goto _test_eof846;
+case 846:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -65118,14 +65224,14 @@ case 837:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2560;
+		goto tr2571;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st837;
-	goto tr2406;
-st838:
+		goto st846;
+	goto tr2417;
+st847:
 	if ( ++p == pe )
-		goto _test_eof838;
-case 838:
+		goto _test_eof847;
+case 847:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -65145,11 +65251,11 @@ case 838:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2547;
+		goto tr2558;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st838;
-	goto tr2406;
-tr2405:
+		goto st847;
+	goto tr2417;
+tr2416:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -65159,11 +65265,11 @@ tr2405:
 			p--; {goto st261;}
 		}
 	}
-	goto st839;
-st839:
+	goto st848;
+st848:
 	if ( ++p == pe )
-		goto _test_eof839;
-case 839:
+		goto _test_eof848;
+case 848:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -65183,51 +65289,51 @@ case 839:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2414;
+		goto tr2425;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st839;
+		goto st848;
 	goto tr71;
-st840:
+st849:
 	if ( ++p == pe )
-		goto _test_eof840;
-case 840:
+		goto _test_eof849;
+case 849:
 	switch( (*p) ) {
-		case 65: goto st841;
-		case 67: goto st875;
-		case 68: goto st892;
-		case 69: goto st906;
-		case 72: goto st913;
-		case 73: goto st918;
-		case 75: goto st926;
-		case 76: goto st930;
-		case 77: goto st938;
-		case 78: goto st944;
-		case 80: goto st960;
-		case 82: goto st963;
-		case 83: goto st970;
-		case 84: goto st981;
-		case 85: goto st991;
-		case 97: goto st841;
-		case 99: goto st875;
-		case 100: goto st892;
-		case 101: goto st906;
-		case 104: goto st913;
-		case 105: goto st918;
-		case 107: goto st926;
-		case 108: goto st930;
-		case 109: goto st938;
-		case 110: goto st944;
-		case 112: goto st960;
-		case 114: goto st963;
-		case 115: goto st970;
-		case 116: goto st981;
-		case 117: goto st991;
-	}
-	goto tr2584;
-st841:
+		case 65: goto st850;
+		case 67: goto st884;
+		case 68: goto st901;
+		case 69: goto st915;
+		case 72: goto st922;
+		case 73: goto st927;
+		case 75: goto st935;
+		case 76: goto st939;
+		case 77: goto st947;
+		case 78: goto st953;
+		case 80: goto st969;
+		case 82: goto st972;
+		case 83: goto st979;
+		case 84: goto st990;
+		case 85: goto st1000;
+		case 97: goto st850;
+		case 99: goto st884;
+		case 100: goto st901;
+		case 101: goto st915;
+		case 104: goto st922;
+		case 105: goto st927;
+		case 107: goto st935;
+		case 108: goto st939;
+		case 109: goto st947;
+		case 110: goto st953;
+		case 112: goto st969;
+		case 114: goto st972;
+		case 115: goto st979;
+		case 116: goto st990;
+		case 117: goto st1000;
+	}
+	goto tr2595;
+st850:
 	if ( ++p == pe )
-		goto _test_eof841;
-case 841:
+		goto _test_eof850;
+case 850:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -65241,21 +65347,21 @@ case 841:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2600;
-		case 32: goto tr2600;
-		case 40: goto tr2601;
-		case 41: goto tr2602;
-		case 65: goto st866;
-		case 70: goto st869;
-		case 80: goto st873;
-		case 97: goto st866;
-		case 102: goto st869;
-		case 112: goto st873;
-		case 1034: goto tr2606;
-		case 1083: goto tr2607;
-	}
-	goto tr2584;
-tr2609:
+		case 9: goto tr2611;
+		case 32: goto tr2611;
+		case 40: goto tr2612;
+		case 41: goto tr2613;
+		case 65: goto st875;
+		case 70: goto st878;
+		case 80: goto st882;
+		case 97: goto st875;
+		case 102: goto st878;
+		case 112: goto st882;
+		case 1034: goto tr2617;
+		case 1083: goto tr2618;
+	}
+	goto tr2595;
+tr2620:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -65263,8 +65369,8 @@ tr2609:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2610:
+	goto st851;
+tr2621:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -65272,13 +65378,13 @@ tr2610:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2612:
+	goto st851;
+tr2623:
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr3003:
+	goto st851;
+tr3014:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -65288,8 +65394,8 @@ tr3003:
 			p--; {goto st261;}
 		}
 	}
-	goto st842;
-tr3004:
+	goto st851;
+tr3015:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -65306,8 +65412,8 @@ tr3004:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr3005:
+	goto st851;
+tr3016:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -65324,8 +65430,8 @@ tr3005:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr3007:
+	goto st851;
+tr3018:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -65338,11 +65444,11 @@ tr3007:
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2600:
+	goto st851;
+tr2611:
 	{ type_num(KNOT_RRTYPE_A, &rdata_tail); }
-	goto st842;
-tr2601:
+	goto st851;
+tr2612:
 	{ type_num(KNOT_RRTYPE_A, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65351,8 +65457,8 @@ tr2601:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2602:
+	goto st851;
+tr2613:
 	{ type_num(KNOT_RRTYPE_A, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65361,17 +65467,17 @@ tr2602:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2606:
+	goto st851;
+tr2617:
 	{ type_num(KNOT_RRTYPE_A, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2695:
+	goto st851;
+tr2706:
 	{ type_num(KNOT_RRTYPE_AAAA, &rdata_tail); }
-	goto st842;
-tr2696:
+	goto st851;
+tr2707:
 	{ type_num(KNOT_RRTYPE_AAAA, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65380,8 +65486,8 @@ tr2696:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2697:
+	goto st851;
+tr2708:
 	{ type_num(KNOT_RRTYPE_AAAA, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65390,17 +65496,17 @@ tr2697:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2698:
+	goto st851;
+tr2709:
 	{ type_num(KNOT_RRTYPE_AAAA, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2703:
+	goto st851;
+tr2714:
 	{ type_num(KNOT_RRTYPE_AFSDB, &rdata_tail); }
-	goto st842;
-tr2704:
+	goto st851;
+tr2715:
 	{ type_num(KNOT_RRTYPE_AFSDB, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65409,8 +65515,8 @@ tr2704:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2705:
+	goto st851;
+tr2716:
 	{ type_num(KNOT_RRTYPE_AFSDB, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65419,17 +65525,17 @@ tr2705:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2706:
+	goto st851;
+tr2717:
 	{ type_num(KNOT_RRTYPE_AFSDB, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2709:
+	goto st851;
+tr2720:
 	{ type_num(KNOT_RRTYPE_APL, &rdata_tail); }
-	goto st842;
-tr2710:
+	goto st851;
+tr2721:
 	{ type_num(KNOT_RRTYPE_APL, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65438,8 +65544,8 @@ tr2710:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2711:
+	goto st851;
+tr2722:
 	{ type_num(KNOT_RRTYPE_APL, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65448,17 +65554,17 @@ tr2711:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2712:
+	goto st851;
+tr2723:
 	{ type_num(KNOT_RRTYPE_APL, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2719:
+	goto st851;
+tr2730:
 	{ type_num(KNOT_RRTYPE_CAA, &rdata_tail); }
-	goto st842;
-tr2720:
+	goto st851;
+tr2731:
 	{ type_num(KNOT_RRTYPE_CAA, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65467,8 +65573,8 @@ tr2720:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2721:
+	goto st851;
+tr2732:
 	{ type_num(KNOT_RRTYPE_CAA, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65477,17 +65583,17 @@ tr2721:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2722:
+	goto st851;
+tr2733:
 	{ type_num(KNOT_RRTYPE_CAA, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2730:
+	goto st851;
+tr2741:
 	{ type_num(KNOT_RRTYPE_CDNSKEY, &rdata_tail); }
-	goto st842;
-tr2731:
+	goto st851;
+tr2742:
 	{ type_num(KNOT_RRTYPE_CDNSKEY, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65496,8 +65602,8 @@ tr2731:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2732:
+	goto st851;
+tr2743:
 	{ type_num(KNOT_RRTYPE_CDNSKEY, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65506,17 +65612,17 @@ tr2732:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2733:
+	goto st851;
+tr2744:
 	{ type_num(KNOT_RRTYPE_CDNSKEY, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2735:
+	goto st851;
+tr2746:
 	{ type_num(KNOT_RRTYPE_CDS, &rdata_tail); }
-	goto st842;
-tr2736:
+	goto st851;
+tr2747:
 	{ type_num(KNOT_RRTYPE_CDS, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65525,8 +65631,8 @@ tr2736:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2737:
+	goto st851;
+tr2748:
 	{ type_num(KNOT_RRTYPE_CDS, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65535,17 +65641,17 @@ tr2737:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2738:
+	goto st851;
+tr2749:
 	{ type_num(KNOT_RRTYPE_CDS, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2742:
+	goto st851;
+tr2753:
 	{ type_num(KNOT_RRTYPE_CERT, &rdata_tail); }
-	goto st842;
-tr2743:
+	goto st851;
+tr2754:
 	{ type_num(KNOT_RRTYPE_CERT, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65554,8 +65660,8 @@ tr2743:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2744:
+	goto st851;
+tr2755:
 	{ type_num(KNOT_RRTYPE_CERT, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65564,17 +65670,17 @@ tr2744:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2745:
+	goto st851;
+tr2756:
 	{ type_num(KNOT_RRTYPE_CERT, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2750:
+	goto st851;
+tr2761:
 	{ type_num(KNOT_RRTYPE_CNAME, &rdata_tail); }
-	goto st842;
-tr2751:
+	goto st851;
+tr2762:
 	{ type_num(KNOT_RRTYPE_CNAME, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65583,8 +65689,8 @@ tr2751:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2752:
+	goto st851;
+tr2763:
 	{ type_num(KNOT_RRTYPE_CNAME, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65593,17 +65699,17 @@ tr2752:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2753:
+	goto st851;
+tr2764:
 	{ type_num(KNOT_RRTYPE_CNAME, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2761:
+	goto st851;
+tr2772:
 	{ type_num(KNOT_RRTYPE_DHCID, &rdata_tail); }
-	goto st842;
-tr2762:
+	goto st851;
+tr2773:
 	{ type_num(KNOT_RRTYPE_DHCID, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65612,8 +65718,8 @@ tr2762:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2763:
+	goto st851;
+tr2774:
 	{ type_num(KNOT_RRTYPE_DHCID, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65622,17 +65728,17 @@ tr2763:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2764:
+	goto st851;
+tr2775:
 	{ type_num(KNOT_RRTYPE_DHCID, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2770:
+	goto st851;
+tr2781:
 	{ type_num(KNOT_RRTYPE_DNAME, &rdata_tail); }
-	goto st842;
-tr2771:
+	goto st851;
+tr2782:
 	{ type_num(KNOT_RRTYPE_DNAME, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65641,8 +65747,8 @@ tr2771:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2772:
+	goto st851;
+tr2783:
 	{ type_num(KNOT_RRTYPE_DNAME, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65651,17 +65757,17 @@ tr2772:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2773:
+	goto st851;
+tr2784:
 	{ type_num(KNOT_RRTYPE_DNAME, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2778:
+	goto st851;
+tr2789:
 	{ type_num(KNOT_RRTYPE_DNSKEY, &rdata_tail); }
-	goto st842;
-tr2779:
+	goto st851;
+tr2790:
 	{ type_num(KNOT_RRTYPE_DNSKEY, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65670,8 +65776,8 @@ tr2779:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2780:
+	goto st851;
+tr2791:
 	{ type_num(KNOT_RRTYPE_DNSKEY, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65680,17 +65786,17 @@ tr2780:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2781:
+	goto st851;
+tr2792:
 	{ type_num(KNOT_RRTYPE_DNSKEY, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2783:
+	goto st851;
+tr2794:
 	{ type_num(KNOT_RRTYPE_DS, &rdata_tail); }
-	goto st842;
-tr2784:
+	goto st851;
+tr2795:
 	{ type_num(KNOT_RRTYPE_DS, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65699,8 +65805,8 @@ tr2784:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2785:
+	goto st851;
+tr2796:
 	{ type_num(KNOT_RRTYPE_DS, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65709,17 +65815,17 @@ tr2785:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2786:
+	goto st851;
+tr2797:
 	{ type_num(KNOT_RRTYPE_DS, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2793:
+	goto st851;
+tr2804:
 	{ type_num(KNOT_RRTYPE_EUI48, &rdata_tail); }
-	goto st842;
-tr2794:
+	goto st851;
+tr2805:
 	{ type_num(KNOT_RRTYPE_EUI48, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65728,8 +65834,8 @@ tr2794:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2795:
+	goto st851;
+tr2806:
 	{ type_num(KNOT_RRTYPE_EUI48, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65738,17 +65844,17 @@ tr2795:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2796:
+	goto st851;
+tr2807:
 	{ type_num(KNOT_RRTYPE_EUI48, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2799:
+	goto st851;
+tr2810:
 	{ type_num(KNOT_RRTYPE_EUI64, &rdata_tail); }
-	goto st842;
-tr2800:
+	goto st851;
+tr2811:
 	{ type_num(KNOT_RRTYPE_EUI64, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65757,8 +65863,8 @@ tr2800:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2801:
+	goto st851;
+tr2812:
 	{ type_num(KNOT_RRTYPE_EUI64, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65767,17 +65873,17 @@ tr2801:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2802:
+	goto st851;
+tr2813:
 	{ type_num(KNOT_RRTYPE_EUI64, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2808:
+	goto st851;
+tr2819:
 	{ type_num(KNOT_RRTYPE_HINFO, &rdata_tail); }
-	goto st842;
-tr2809:
+	goto st851;
+tr2820:
 	{ type_num(KNOT_RRTYPE_HINFO, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65786,8 +65892,8 @@ tr2809:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2810:
+	goto st851;
+tr2821:
 	{ type_num(KNOT_RRTYPE_HINFO, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65796,17 +65902,17 @@ tr2810:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2811:
+	goto st851;
+tr2822:
 	{ type_num(KNOT_RRTYPE_HINFO, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2820:
+	goto st851;
+tr2831:
 	{ type_num(KNOT_RRTYPE_IPSECKEY, &rdata_tail); }
-	goto st842;
-tr2821:
+	goto st851;
+tr2832:
 	{ type_num(KNOT_RRTYPE_IPSECKEY, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65815,8 +65921,8 @@ tr2821:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2822:
+	goto st851;
+tr2833:
 	{ type_num(KNOT_RRTYPE_IPSECKEY, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65825,17 +65931,17 @@ tr2822:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2823:
+	goto st851;
+tr2834:
 	{ type_num(KNOT_RRTYPE_IPSECKEY, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2828:
+	goto st851;
+tr2839:
 	{ type_num(KNOT_RRTYPE_KEY, &rdata_tail); }
-	goto st842;
-tr2829:
+	goto st851;
+tr2840:
 	{ type_num(KNOT_RRTYPE_KEY, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65844,8 +65950,8 @@ tr2829:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2830:
+	goto st851;
+tr2841:
 	{ type_num(KNOT_RRTYPE_KEY, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65854,17 +65960,17 @@ tr2830:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2831:
+	goto st851;
+tr2842:
 	{ type_num(KNOT_RRTYPE_KEY, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2833:
+	goto st851;
+tr2844:
 	{ type_num(KNOT_RRTYPE_KX, &rdata_tail); }
-	goto st842;
-tr2834:
+	goto st851;
+tr2845:
 	{ type_num(KNOT_RRTYPE_KX, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65873,8 +65979,8 @@ tr2834:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2835:
+	goto st851;
+tr2846:
 	{ type_num(KNOT_RRTYPE_KX, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65883,17 +65989,17 @@ tr2835:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2836:
+	goto st851;
+tr2847:
 	{ type_num(KNOT_RRTYPE_KX, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2843:
+	goto st851;
+tr2854:
 	{ type_num(KNOT_RRTYPE_L32, &rdata_tail); }
-	goto st842;
-tr2844:
+	goto st851;
+tr2855:
 	{ type_num(KNOT_RRTYPE_L32, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65902,8 +66008,8 @@ tr2844:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2845:
+	goto st851;
+tr2856:
 	{ type_num(KNOT_RRTYPE_L32, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65912,17 +66018,17 @@ tr2845:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2846:
+	goto st851;
+tr2857:
 	{ type_num(KNOT_RRTYPE_L32, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2849:
+	goto st851;
+tr2860:
 	{ type_num(KNOT_RRTYPE_L64, &rdata_tail); }
-	goto st842;
-tr2850:
+	goto st851;
+tr2861:
 	{ type_num(KNOT_RRTYPE_L64, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65931,8 +66037,8 @@ tr2850:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2851:
+	goto st851;
+tr2862:
 	{ type_num(KNOT_RRTYPE_L64, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65941,17 +66047,17 @@ tr2851:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2852:
+	goto st851;
+tr2863:
 	{ type_num(KNOT_RRTYPE_L64, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2855:
+	goto st851;
+tr2866:
 	{ type_num(KNOT_RRTYPE_LOC, &rdata_tail); }
-	goto st842;
-tr2856:
+	goto st851;
+tr2867:
 	{ type_num(KNOT_RRTYPE_LOC, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65960,8 +66066,8 @@ tr2856:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2857:
+	goto st851;
+tr2868:
 	{ type_num(KNOT_RRTYPE_LOC, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65970,17 +66076,17 @@ tr2857:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2858:
+	goto st851;
+tr2869:
 	{ type_num(KNOT_RRTYPE_LOC, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2860:
+	goto st851;
+tr2871:
 	{ type_num(KNOT_RRTYPE_LP, &rdata_tail); }
-	goto st842;
-tr2861:
+	goto st851;
+tr2872:
 	{ type_num(KNOT_RRTYPE_LP, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -65989,8 +66095,8 @@ tr2861:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2862:
+	goto st851;
+tr2873:
 	{ type_num(KNOT_RRTYPE_LP, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -65999,17 +66105,17 @@ tr2862:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2863:
+	goto st851;
+tr2874:
 	{ type_num(KNOT_RRTYPE_LP, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2870:
+	goto st851;
+tr2881:
 	{ type_num(KNOT_RRTYPE_MINFO, &rdata_tail); }
-	goto st842;
-tr2871:
+	goto st851;
+tr2882:
 	{ type_num(KNOT_RRTYPE_MINFO, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66018,8 +66124,8 @@ tr2871:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2872:
+	goto st851;
+tr2883:
 	{ type_num(KNOT_RRTYPE_MINFO, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66028,17 +66134,17 @@ tr2872:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2873:
+	goto st851;
+tr2884:
 	{ type_num(KNOT_RRTYPE_MINFO, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2875:
+	goto st851;
+tr2886:
 	{ type_num(KNOT_RRTYPE_MX, &rdata_tail); }
-	goto st842;
-tr2876:
+	goto st851;
+tr2887:
 	{ type_num(KNOT_RRTYPE_MX, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66047,8 +66153,8 @@ tr2876:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2877:
+	goto st851;
+tr2888:
 	{ type_num(KNOT_RRTYPE_MX, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66057,17 +66163,17 @@ tr2877:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2878:
+	goto st851;
+tr2889:
 	{ type_num(KNOT_RRTYPE_MX, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2886:
+	goto st851;
+tr2897:
 	{ type_num(KNOT_RRTYPE_NAPTR, &rdata_tail); }
-	goto st842;
-tr2887:
+	goto st851;
+tr2898:
 	{ type_num(KNOT_RRTYPE_NAPTR, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66076,8 +66182,8 @@ tr2887:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2888:
+	goto st851;
+tr2899:
 	{ type_num(KNOT_RRTYPE_NAPTR, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66086,17 +66192,17 @@ tr2888:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2889:
+	goto st851;
+tr2900:
 	{ type_num(KNOT_RRTYPE_NAPTR, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2892:
+	goto st851;
+tr2903:
 	{ type_num(KNOT_RRTYPE_NID, &rdata_tail); }
-	goto st842;
-tr2893:
+	goto st851;
+tr2904:
 	{ type_num(KNOT_RRTYPE_NID, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66105,8 +66211,8 @@ tr2893:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2894:
+	goto st851;
+tr2905:
 	{ type_num(KNOT_RRTYPE_NID, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66115,17 +66221,17 @@ tr2894:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2895:
+	goto st851;
+tr2906:
 	{ type_num(KNOT_RRTYPE_NID, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2897:
+	goto st851;
+tr2908:
 	{ type_num(KNOT_RRTYPE_NS, &rdata_tail); }
-	goto st842;
-tr2898:
+	goto st851;
+tr2909:
 	{ type_num(KNOT_RRTYPE_NS, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66134,8 +66240,8 @@ tr2898:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2899:
+	goto st851;
+tr2910:
 	{ type_num(KNOT_RRTYPE_NS, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66144,17 +66250,17 @@ tr2899:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2901:
+	goto st851;
+tr2912:
 	{ type_num(KNOT_RRTYPE_NS, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2904:
+	goto st851;
+tr2915:
 	{ type_num(KNOT_RRTYPE_NSEC, &rdata_tail); }
-	goto st842;
-tr2905:
+	goto st851;
+tr2916:
 	{ type_num(KNOT_RRTYPE_NSEC, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66163,8 +66269,8 @@ tr2905:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2906:
+	goto st851;
+tr2917:
 	{ type_num(KNOT_RRTYPE_NSEC, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66173,17 +66279,17 @@ tr2906:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2908:
+	goto st851;
+tr2919:
 	{ type_num(KNOT_RRTYPE_NSEC, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2910:
+	goto st851;
+tr2921:
 	{ type_num(KNOT_RRTYPE_NSEC3, &rdata_tail); }
-	goto st842;
-tr2911:
+	goto st851;
+tr2922:
 	{ type_num(KNOT_RRTYPE_NSEC3, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66192,8 +66298,8 @@ tr2911:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2912:
+	goto st851;
+tr2923:
 	{ type_num(KNOT_RRTYPE_NSEC3, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66202,17 +66308,17 @@ tr2912:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2914:
+	goto st851;
+tr2925:
 	{ type_num(KNOT_RRTYPE_NSEC3, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2920:
+	goto st851;
+tr2931:
 	{ type_num(KNOT_RRTYPE_NSEC3PARAM, &rdata_tail); }
-	goto st842;
-tr2921:
+	goto st851;
+tr2932:
 	{ type_num(KNOT_RRTYPE_NSEC3PARAM, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66221,8 +66327,8 @@ tr2921:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2922:
+	goto st851;
+tr2933:
 	{ type_num(KNOT_RRTYPE_NSEC3PARAM, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66231,17 +66337,17 @@ tr2922:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2923:
+	goto st851;
+tr2934:
 	{ type_num(KNOT_RRTYPE_NSEC3PARAM, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2927:
+	goto st851;
+tr2938:
 	{ type_num(KNOT_RRTYPE_PTR, &rdata_tail); }
-	goto st842;
-tr2928:
+	goto st851;
+tr2939:
 	{ type_num(KNOT_RRTYPE_PTR, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66250,8 +66356,8 @@ tr2928:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2929:
+	goto st851;
+tr2940:
 	{ type_num(KNOT_RRTYPE_PTR, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66260,17 +66366,17 @@ tr2929:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2930:
+	goto st851;
+tr2941:
 	{ type_num(KNOT_RRTYPE_PTR, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2935:
+	goto st851;
+tr2946:
 	{ type_num(KNOT_RRTYPE_RP, &rdata_tail); }
-	goto st842;
-tr2936:
+	goto st851;
+tr2947:
 	{ type_num(KNOT_RRTYPE_RP, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66279,8 +66385,8 @@ tr2936:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2937:
+	goto st851;
+tr2948:
 	{ type_num(KNOT_RRTYPE_RP, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66289,17 +66395,17 @@ tr2937:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2938:
+	goto st851;
+tr2949:
 	{ type_num(KNOT_RRTYPE_RP, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2943:
+	goto st851;
+tr2954:
 	{ type_num(KNOT_RRTYPE_RRSIG, &rdata_tail); }
-	goto st842;
-tr2944:
+	goto st851;
+tr2955:
 	{ type_num(KNOT_RRTYPE_RRSIG, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66308,8 +66414,8 @@ tr2944:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2945:
+	goto st851;
+tr2956:
 	{ type_num(KNOT_RRTYPE_RRSIG, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66318,17 +66424,17 @@ tr2945:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2946:
+	goto st851;
+tr2957:
 	{ type_num(KNOT_RRTYPE_RRSIG, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2948:
+	goto st851;
+tr2959:
 	{ type_num(KNOT_RRTYPE_RT, &rdata_tail); }
-	goto st842;
-tr2949:
+	goto st851;
+tr2960:
 	{ type_num(KNOT_RRTYPE_RT, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66337,8 +66443,8 @@ tr2949:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2950:
+	goto st851;
+tr2961:
 	{ type_num(KNOT_RRTYPE_RT, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66347,17 +66453,17 @@ tr2950:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2951:
+	goto st851;
+tr2962:
 	{ type_num(KNOT_RRTYPE_RT, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2958:
+	goto st851;
+tr2969:
 	{ type_num(KNOT_RRTYPE_SOA, &rdata_tail); }
-	goto st842;
-tr2959:
+	goto st851;
+tr2970:
 	{ type_num(KNOT_RRTYPE_SOA, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66366,8 +66472,8 @@ tr2959:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2960:
+	goto st851;
+tr2971:
 	{ type_num(KNOT_RRTYPE_SOA, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66376,17 +66482,17 @@ tr2960:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2961:
+	goto st851;
+tr2972:
 	{ type_num(KNOT_RRTYPE_SOA, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2964:
+	goto st851;
+tr2975:
 	{ type_num(KNOT_RRTYPE_SPF, &rdata_tail); }
-	goto st842;
-tr2965:
+	goto st851;
+tr2976:
 	{ type_num(KNOT_RRTYPE_SPF, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66395,8 +66501,8 @@ tr2965:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2966:
+	goto st851;
+tr2977:
 	{ type_num(KNOT_RRTYPE_SPF, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66405,17 +66511,17 @@ tr2966:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2967:
+	goto st851;
+tr2978:
 	{ type_num(KNOT_RRTYPE_SPF, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2970:
+	goto st851;
+tr2981:
 	{ type_num(KNOT_RRTYPE_SRV, &rdata_tail); }
-	goto st842;
-tr2971:
+	goto st851;
+tr2982:
 	{ type_num(KNOT_RRTYPE_SRV, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66424,8 +66530,8 @@ tr2971:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2972:
+	goto st851;
+tr2983:
 	{ type_num(KNOT_RRTYPE_SRV, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66434,17 +66540,17 @@ tr2972:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2973:
+	goto st851;
+tr2984:
 	{ type_num(KNOT_RRTYPE_SRV, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2978:
+	goto st851;
+tr2989:
 	{ type_num(KNOT_RRTYPE_SSHFP, &rdata_tail); }
-	goto st842;
-tr2979:
+	goto st851;
+tr2990:
 	{ type_num(KNOT_RRTYPE_SSHFP, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66453,8 +66559,8 @@ tr2979:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2980:
+	goto st851;
+tr2991:
 	{ type_num(KNOT_RRTYPE_SSHFP, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66463,17 +66569,17 @@ tr2980:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2981:
+	goto st851;
+tr2992:
 	{ type_num(KNOT_RRTYPE_SSHFP, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2988:
+	goto st851;
+tr2999:
 	{ type_num(KNOT_RRTYPE_TLSA, &rdata_tail); }
-	goto st842;
-tr2989:
+	goto st851;
+tr3000:
 	{ type_num(KNOT_RRTYPE_TLSA, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66482,8 +66588,8 @@ tr2989:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2990:
+	goto st851;
+tr3001:
 	{ type_num(KNOT_RRTYPE_TLSA, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66492,17 +66598,17 @@ tr2990:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2991:
+	goto st851;
+tr3002:
 	{ type_num(KNOT_RRTYPE_TLSA, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr2994:
+	goto st851;
+tr3005:
 	{ type_num(KNOT_RRTYPE_TXT, &rdata_tail); }
-	goto st842;
-tr2995:
+	goto st851;
+tr3006:
 	{ type_num(KNOT_RRTYPE_TXT, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66511,8 +66617,8 @@ tr2995:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr2996:
+	goto st851;
+tr3007:
 	{ type_num(KNOT_RRTYPE_TXT, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66521,17 +66627,17 @@ tr2996:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr2997:
+	goto st851;
+tr3008:
 	{ type_num(KNOT_RRTYPE_TXT, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-tr3011:
+	goto st851;
+tr3022:
 	{ type_num(KNOT_RRTYPE_URI, &rdata_tail); }
-	goto st842;
-tr3012:
+	goto st851;
+tr3023:
 	{ type_num(KNOT_RRTYPE_URI, &rdata_tail); }
 	{
 		if (s->multiline == true) {
@@ -66540,8 +66646,8 @@ tr3012:
 		}
 		s->multiline = true;
 	}
-	goto st842;
-tr3013:
+	goto st851;
+tr3024:
 	{ type_num(KNOT_RRTYPE_URI, &rdata_tail); }
 	{
 		if (s->multiline == false) {
@@ -66550,17 +66656,17 @@ tr3013:
 		}
 		s->multiline = false;
 	}
-	goto st842;
-tr3014:
+	goto st851;
+tr3025:
 	{ type_num(KNOT_RRTYPE_URI, &rdata_tail); }
 	{
 		s->line_counter++;
 	}
-	goto st842;
-st842:
+	goto st851;
+st851:
 	if ( ++p == pe )
-		goto _test_eof842;
-case 842:
+		goto _test_eof851;
+case 851:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -66574,29 +66680,29 @@ case 842:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st842;
-		case 32: goto st842;
-		case 40: goto tr2609;
-		case 41: goto tr2610;
-		case 1034: goto tr2612;
-		case 1083: goto st865;
+		case 9: goto st851;
+		case 32: goto st851;
+		case 40: goto tr2620;
+		case 41: goto tr2621;
+		case 1034: goto tr2623;
+		case 1083: goto st874;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr2611;
+			goto tr2622;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2611;
+			goto tr2622;
 	} else
-		goto tr2611;
+		goto tr2622;
 	goto tr71;
-tr2611:
-	{ p--; {stack[top++] = 843; goto st480;} }
-	goto st843;
-st843:
+tr2622:
+	{ p--; {stack[top++] = 852; goto st480;} }
+	goto st852;
+st852:
 	if ( ++p == pe )
-		goto _test_eof843;
-case 843:
+		goto _test_eof852;
+case 852:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -66610,15 +66716,15 @@ case 843:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st844;
-		case 32: goto st844;
-		case 40: goto tr2615;
-		case 41: goto tr2616;
-		case 1034: goto tr2617;
-		case 1083: goto st864;
+		case 9: goto st853;
+		case 32: goto st853;
+		case 40: goto tr2626;
+		case 41: goto tr2627;
+		case 1034: goto tr2628;
+		case 1083: goto st873;
 	}
 	goto tr71;
-tr2615:
+tr2626:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -66626,8 +66732,8 @@ tr2615:
 		}
 		s->multiline = true;
 	}
-	goto st844;
-tr2616:
+	goto st853;
+tr2627:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -66635,16 +66741,16 @@ tr2616:
 		}
 		s->multiline = false;
 	}
-	goto st844;
-tr2617:
+	goto st853;
+tr2628:
 	{
 		s->line_counter++;
 	}
-	goto st844;
-st844:
+	goto st853;
+st853:
 	if ( ++p == pe )
-		goto _test_eof844;
-case 844:
+		goto _test_eof853;
+case 853:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -66658,17 +66764,17 @@ case 844:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st844;
-		case 32: goto st844;
-		case 40: goto tr2615;
-		case 41: goto tr2616;
-		case 1034: goto tr2617;
-		case 1083: goto st864;
+		case 9: goto st853;
+		case 32: goto st853;
+		case 40: goto tr2626;
+		case 41: goto tr2627;
+		case 1034: goto tr2628;
+		case 1083: goto st873;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2619;
-	goto tr1746;
-tr2619:
+		goto tr2630;
+	goto tr1757;
+tr2630:
 	{
 		s->number64 = 0;
 	}
@@ -66686,8 +66792,8 @@ tr2619:
 			p--; {goto st261;}
 		}
 	}
-	goto st845;
-tr2623:
+	goto st854;
+tr2634:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -66702,11 +66808,11 @@ tr2623:
 			p--; {goto st261;}
 		}
 	}
-	goto st845;
-st845:
+	goto st854;
+st854:
 	if ( ++p == pe )
-		goto _test_eof845;
-case 845:
+		goto _test_eof854;
+case 854:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -66720,17 +66826,17 @@ case 845:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2620;
-		case 32: goto tr2620;
-		case 40: goto tr2621;
-		case 41: goto tr2622;
-		case 1034: goto tr2624;
-		case 1083: goto tr2625;
+		case 9: goto tr2631;
+		case 32: goto tr2631;
+		case 40: goto tr2632;
+		case 41: goto tr2633;
+		case 1034: goto tr2635;
+		case 1083: goto tr2636;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2623;
-	goto tr1746;
-tr2627:
+		goto tr2634;
+	goto tr1757;
+tr2638:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -66738,8 +66844,8 @@ tr2627:
 		}
 		s->multiline = true;
 	}
-	goto st846;
-tr2628:
+	goto st855;
+tr2639:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -66747,13 +66853,13 @@ tr2628:
 		}
 		s->multiline = false;
 	}
-	goto st846;
-tr2630:
+	goto st855;
+tr2641:
 	{
 		s->line_counter++;
 	}
-	goto st846;
-tr2620:
+	goto st855;
+tr2631:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -66763,8 +66869,8 @@ tr2620:
 			p--; {goto st261;}
 		}
 	}
-	goto st846;
-tr2621:
+	goto st855;
+tr2632:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -66781,8 +66887,8 @@ tr2621:
 		}
 		s->multiline = true;
 	}
-	goto st846;
-tr2622:
+	goto st855;
+tr2633:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -66799,8 +66905,8 @@ tr2622:
 		}
 		s->multiline = false;
 	}
-	goto st846;
-tr2624:
+	goto st855;
+tr2635:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -66813,11 +66919,11 @@ tr2624:
 	{
 		s->line_counter++;
 	}
-	goto st846;
-st846:
+	goto st855;
+st855:
 	if ( ++p == pe )
-		goto _test_eof846;
-case 846:
+		goto _test_eof855;
+case 855:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -66831,17 +66937,17 @@ case 846:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st846;
-		case 32: goto st846;
-		case 40: goto tr2627;
-		case 41: goto tr2628;
-		case 1034: goto tr2630;
-		case 1083: goto st863;
+		case 9: goto st855;
+		case 32: goto st855;
+		case 40: goto tr2638;
+		case 41: goto tr2639;
+		case 1034: goto tr2641;
+		case 1083: goto st872;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2629;
-	goto tr1746;
-tr2629:
+		goto tr2640;
+	goto tr1757;
+tr2640:
 	{
 		s->number64 = 0;
 	}
@@ -66859,8 +66965,8 @@ tr2629:
 			p--; {goto st261;}
 		}
 	}
-	goto st847;
-tr2635:
+	goto st856;
+tr2646:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -66875,11 +66981,11 @@ tr2635:
 			p--; {goto st261;}
 		}
 	}
-	goto st847;
-st847:
+	goto st856;
+st856:
 	if ( ++p == pe )
-		goto _test_eof847;
-case 847:
+		goto _test_eof856;
+case 856:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -66893,17 +66999,17 @@ case 847:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2632;
-		case 32: goto tr2632;
-		case 40: goto tr2633;
-		case 41: goto tr2634;
-		case 1034: goto tr2636;
-		case 1083: goto tr2637;
+		case 9: goto tr2643;
+		case 32: goto tr2643;
+		case 40: goto tr2644;
+		case 41: goto tr2645;
+		case 1034: goto tr2647;
+		case 1083: goto tr2648;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2635;
-	goto tr1746;
-tr2640:
+		goto tr2646;
+	goto tr1757;
+tr2651:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -66911,8 +67017,8 @@ tr2640:
 		}
 		s->multiline = true;
 	}
-	goto st848;
-tr2641:
+	goto st857;
+tr2652:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -66920,13 +67026,13 @@ tr2641:
 		}
 		s->multiline = false;
 	}
-	goto st848;
-tr2643:
+	goto st857;
+tr2654:
 	{
 		s->line_counter++;
 	}
-	goto st848;
-tr2632:
+	goto st857;
+tr2643:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -66936,8 +67042,8 @@ tr2632:
 			p--; {goto st261;}
 		}
 	}
-	goto st848;
-tr2633:
+	goto st857;
+tr2644:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -66954,8 +67060,8 @@ tr2633:
 		}
 		s->multiline = true;
 	}
-	goto st848;
-tr2634:
+	goto st857;
+tr2645:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -66972,8 +67078,8 @@ tr2634:
 		}
 		s->multiline = false;
 	}
-	goto st848;
-tr2636:
+	goto st857;
+tr2647:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -66986,11 +67092,11 @@ tr2636:
 	{
 		s->line_counter++;
 	}
-	goto st848;
-st848:
+	goto st857;
+st857:
 	if ( ++p == pe )
-		goto _test_eof848;
-case 848:
+		goto _test_eof857;
+case 857:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67004,17 +67110,17 @@ case 848:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st848;
-		case 32: goto st848;
-		case 40: goto tr2640;
-		case 41: goto tr2641;
-		case 1034: goto tr2643;
-		case 1083: goto st862;
+		case 9: goto st857;
+		case 32: goto st857;
+		case 40: goto tr2651;
+		case 41: goto tr2652;
+		case 1034: goto tr2654;
+		case 1083: goto st871;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2642;
-	goto tr2638;
-tr2642:
+		goto tr2653;
+	goto tr2649;
+tr2653:
 	{
 		s->buffer_length = 0;
 	}
@@ -67026,8 +67132,8 @@ tr2642:
 			p--; {goto st261;}
 		}
 	}
-	goto st849;
-tr2648:
+	goto st858;
+tr2659:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -67036,11 +67142,11 @@ tr2648:
 			p--; {goto st261;}
 		}
 	}
-	goto st849;
-st849:
+	goto st858;
+st858:
 	if ( ++p == pe )
-		goto _test_eof849;
-case 849:
+		goto _test_eof858;
+case 858:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67054,17 +67160,17 @@ case 849:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2645;
-		case 32: goto tr2645;
-		case 40: goto tr2646;
-		case 41: goto tr2647;
-		case 1034: goto tr2649;
-		case 1083: goto tr2650;
+		case 9: goto tr2656;
+		case 32: goto tr2656;
+		case 40: goto tr2657;
+		case 41: goto tr2658;
+		case 1034: goto tr2660;
+		case 1083: goto tr2661;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2648;
-	goto tr2638;
-tr2652:
+		goto tr2659;
+	goto tr2649;
+tr2663:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -67072,8 +67178,8 @@ tr2652:
 		}
 		s->multiline = true;
 	}
-	goto st850;
-tr2653:
+	goto st859;
+tr2664:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -67081,13 +67187,13 @@ tr2653:
 		}
 		s->multiline = false;
 	}
-	goto st850;
-tr2655:
+	goto st859;
+tr2666:
 	{
 		s->line_counter++;
 	}
-	goto st850;
-tr2645:
+	goto st859;
+tr2656:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67123,8 +67229,8 @@ tr2645:
 			p--; {goto st261;}
 		}
 	}
-	goto st850;
-tr2646:
+	goto st859;
+tr2657:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67167,8 +67273,8 @@ tr2646:
 		}
 		s->multiline = true;
 	}
-	goto st850;
-tr2647:
+	goto st859;
+tr2658:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67211,8 +67317,8 @@ tr2647:
 		}
 		s->multiline = false;
 	}
-	goto st850;
-tr2649:
+	goto st859;
+tr2660:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67251,11 +67357,11 @@ tr2649:
 	{
 		s->line_counter++;
 	}
-	goto st850;
-st850:
+	goto st859;
+st859:
 	if ( ++p == pe )
-		goto _test_eof850;
-case 850:
+		goto _test_eof859;
+case 859:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67269,17 +67375,17 @@ case 850:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st850;
-		case 32: goto st850;
-		case 40: goto tr2652;
-		case 41: goto tr2653;
-		case 1034: goto tr2655;
-		case 1083: goto st861;
+		case 9: goto st859;
+		case 32: goto st859;
+		case 40: goto tr2663;
+		case 41: goto tr2664;
+		case 1034: goto tr2666;
+		case 1083: goto st870;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2654;
-	goto tr2638;
-tr2654:
+		goto tr2665;
+	goto tr2649;
+tr2665:
 	{
 		s->buffer_length = 0;
 	}
@@ -67291,8 +67397,8 @@ tr2654:
 			p--; {goto st261;}
 		}
 	}
-	goto st851;
-tr2660:
+	goto st860;
+tr2671:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -67301,11 +67407,11 @@ tr2660:
 			p--; {goto st261;}
 		}
 	}
-	goto st851;
-st851:
+	goto st860;
+st860:
 	if ( ++p == pe )
-		goto _test_eof851;
-case 851:
+		goto _test_eof860;
+case 860:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67319,17 +67425,17 @@ case 851:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2657;
-		case 32: goto tr2657;
-		case 40: goto tr2658;
-		case 41: goto tr2659;
-		case 1034: goto tr2661;
-		case 1083: goto tr2662;
+		case 9: goto tr2668;
+		case 32: goto tr2668;
+		case 40: goto tr2669;
+		case 41: goto tr2670;
+		case 1034: goto tr2672;
+		case 1083: goto tr2673;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2660;
-	goto tr2638;
-tr2664:
+		goto tr2671;
+	goto tr2649;
+tr2675:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -67337,8 +67443,8 @@ tr2664:
 		}
 		s->multiline = true;
 	}
-	goto st852;
-tr2665:
+	goto st861;
+tr2676:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -67346,13 +67452,13 @@ tr2665:
 		}
 		s->multiline = false;
 	}
-	goto st852;
-tr2667:
+	goto st861;
+tr2678:
 	{
 		s->line_counter++;
 	}
-	goto st852;
-tr2657:
+	goto st861;
+tr2668:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67388,8 +67494,8 @@ tr2657:
 			p--; {goto st261;}
 		}
 	}
-	goto st852;
-tr2658:
+	goto st861;
+tr2669:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67432,8 +67538,8 @@ tr2658:
 		}
 		s->multiline = true;
 	}
-	goto st852;
-tr2659:
+	goto st861;
+tr2670:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67476,8 +67582,8 @@ tr2659:
 		}
 		s->multiline = false;
 	}
-	goto st852;
-tr2661:
+	goto st861;
+tr2672:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67516,11 +67622,11 @@ tr2661:
 	{
 		s->line_counter++;
 	}
-	goto st852;
-st852:
+	goto st861;
+st861:
 	if ( ++p == pe )
-		goto _test_eof852;
-case 852:
+		goto _test_eof861;
+case 861:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67534,17 +67640,17 @@ case 852:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st852;
-		case 32: goto st852;
-		case 40: goto tr2664;
-		case 41: goto tr2665;
-		case 1034: goto tr2667;
-		case 1083: goto st860;
+		case 9: goto st861;
+		case 32: goto st861;
+		case 40: goto tr2675;
+		case 41: goto tr2676;
+		case 1034: goto tr2678;
+		case 1083: goto st869;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2666;
-	goto tr1746;
-tr2666:
+		goto tr2677;
+	goto tr1757;
+tr2677:
 	{
 		s->number64 = 0;
 	}
@@ -67562,8 +67668,8 @@ tr2666:
 			p--; {goto st261;}
 		}
 	}
-	goto st853;
-tr2672:
+	goto st862;
+tr2683:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -67578,11 +67684,11 @@ tr2672:
 			p--; {goto st261;}
 		}
 	}
-	goto st853;
-st853:
+	goto st862;
+st862:
 	if ( ++p == pe )
-		goto _test_eof853;
-case 853:
+		goto _test_eof862;
+case 862:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67596,17 +67702,17 @@ case 853:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2669;
-		case 32: goto tr2669;
-		case 40: goto tr2670;
-		case 41: goto tr2671;
-		case 1034: goto tr2673;
-		case 1083: goto tr2674;
+		case 9: goto tr2680;
+		case 32: goto tr2680;
+		case 40: goto tr2681;
+		case 41: goto tr2682;
+		case 1034: goto tr2684;
+		case 1083: goto tr2685;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr2672;
-	goto tr1746;
-tr2676:
+		goto tr2683;
+	goto tr1757;
+tr2687:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -67614,8 +67720,8 @@ tr2676:
 		}
 		s->multiline = true;
 	}
-	goto st854;
-tr2677:
+	goto st863;
+tr2688:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -67623,13 +67729,13 @@ tr2677:
 		}
 		s->multiline = false;
 	}
-	goto st854;
-tr2679:
+	goto st863;
+tr2690:
 	{
 		s->line_counter++;
 	}
-	goto st854;
-tr2669:
+	goto st863;
+tr2680:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -67639,8 +67745,8 @@ tr2669:
 			p--; {goto st261;}
 		}
 	}
-	goto st854;
-tr2670:
+	goto st863;
+tr2681:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -67657,8 +67763,8 @@ tr2670:
 		}
 		s->multiline = true;
 	}
-	goto st854;
-tr2671:
+	goto st863;
+tr2682:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -67675,8 +67781,8 @@ tr2671:
 		}
 		s->multiline = false;
 	}
-	goto st854;
-tr2673:
+	goto st863;
+tr2684:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -67689,11 +67795,11 @@ tr2673:
 	{
 		s->line_counter++;
 	}
-	goto st854;
-st854:
+	goto st863;
+st863:
 	if ( ++p == pe )
-		goto _test_eof854;
-case 854:
+		goto _test_eof863;
+case 863:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67707,35 +67813,35 @@ case 854:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st854;
-		case 32: goto st854;
-		case 40: goto tr2676;
-		case 41: goto tr2677;
-		case 42: goto tr2678;
-		case 92: goto tr2678;
-		case 95: goto tr2678;
-		case 1034: goto tr2679;
-		case 1083: goto st859;
+		case 9: goto st863;
+		case 32: goto st863;
+		case 40: goto tr2687;
+		case 41: goto tr2688;
+		case 42: goto tr2689;
+		case 92: goto tr2689;
+		case 95: goto tr2689;
+		case 1034: goto tr2690;
+		case 1083: goto st868;
 	}
 	if ( _widec < 64 ) {
 		if ( 45 <= _widec && _widec <= 57 )
-			goto tr2678;
+			goto tr2689;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2678;
+			goto tr2689;
 	} else
-		goto tr2678;
+		goto tr2689;
 	goto tr71;
-tr2678:
+tr2689:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 855; goto st263;} }
-	goto st855;
-st855:
+	{ p--; {stack[top++] = 864; goto st263;} }
+	goto st864;
+st864:
 	if ( ++p == pe )
-		goto _test_eof855;
-case 855:
+		goto _test_eof864;
+case 864:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67749,15 +67855,15 @@ case 855:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2681;
-		case 32: goto tr2681;
-		case 40: goto tr2682;
-		case 41: goto tr2683;
-		case 1034: goto tr2684;
-		case 1083: goto tr2685;
+		case 9: goto tr2692;
+		case 32: goto tr2692;
+		case 40: goto tr2693;
+		case 41: goto tr2694;
+		case 1034: goto tr2695;
+		case 1083: goto tr2696;
 	}
 	goto tr71;
-tr2687:
+tr2698:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -67765,8 +67871,8 @@ tr2687:
 		}
 		s->multiline = true;
 	}
-	goto st856;
-tr2688:
+	goto st865;
+tr2699:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -67774,18 +67880,18 @@ tr2688:
 		}
 		s->multiline = false;
 	}
-	goto st856;
-tr2690:
+	goto st865;
+tr2701:
 	{
 		s->line_counter++;
 	}
-	goto st856;
-tr2681:
+	goto st865;
+tr2692:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st856;
-tr2682:
+	goto st865;
+tr2693:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -67796,8 +67902,8 @@ tr2682:
 		}
 		s->multiline = true;
 	}
-	goto st856;
-tr2683:
+	goto st865;
+tr2694:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
@@ -67808,19 +67914,19 @@ tr2683:
 		}
 		s->multiline = false;
 	}
-	goto st856;
-tr2684:
+	goto st865;
+tr2695:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
 	{
 		s->line_counter++;
 	}
-	goto st856;
-st856:
+	goto st865;
+st865:
 	if ( ++p == pe )
-		goto _test_eof856;
-case 856:
+		goto _test_eof865;
+case 865:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67834,30 +67940,30 @@ case 856:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st856;
-		case 32: goto st856;
-		case 40: goto tr2687;
-		case 41: goto tr2688;
-		case 43: goto tr2689;
-		case 1034: goto tr2690;
-		case 1083: goto st858;
+		case 9: goto st865;
+		case 32: goto st865;
+		case 40: goto tr2698;
+		case 41: goto tr2699;
+		case 43: goto tr2700;
+		case 1034: goto tr2701;
+		case 1083: goto st867;
 	}
 	if ( _widec < 65 ) {
 		if ( 47 <= _widec && _widec <= 57 )
-			goto tr2689;
+			goto tr2700;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr2689;
+			goto tr2700;
 	} else
-		goto tr2689;
+		goto tr2700;
 	goto tr71;
-tr2689:
-	{ p--; {stack[top++] = 857; goto st322;} }
-	goto st857;
-st857:
+tr2700:
+	{ p--; {stack[top++] = 866; goto st322;} }
+	goto st866;
+st866:
 	if ( ++p == pe )
-		goto _test_eof857;
-case 857:
+		goto _test_eof866;
+case 866:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -67871,29 +67977,29 @@ case 857:
  !s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 1546: goto tr2692;
-		case 1595: goto tr2692;
+		case 1546: goto tr2703;
+		case 1595: goto tr2703;
 	}
 	goto tr71;
-tr2692:
+tr2703:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1183;
-st1183:
+	goto st1192;
+st1192:
 	if ( ++p == pe )
-		goto _test_eof1183;
-case 1183:
+		goto _test_eof1192;
+case 1192:
 	goto st0;
-tr2685:
+tr2696:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	goto st858;
-st858:
+	goto st867;
+st867:
 	if ( ++p == pe )
-		goto _test_eof858;
-case 858:
+		goto _test_eof867;
+case 867:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -67913,11 +68019,11 @@ case 858:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2690;
+		goto tr2701;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st858;
+		goto st867;
 	goto tr71;
-tr2674:
+tr2685:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -67927,11 +68033,11 @@ tr2674:
 			p--; {goto st261;}
 		}
 	}
-	goto st859;
-st859:
+	goto st868;
+st868:
 	if ( ++p == pe )
-		goto _test_eof859;
-case 859:
+		goto _test_eof868;
+case 868:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -67951,11 +68057,11 @@ case 859:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2679;
+		goto tr2690;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st859;
+		goto st868;
 	goto tr71;
-tr2662:
+tr2673:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -67991,11 +68097,11 @@ tr2662:
 			p--; {goto st261;}
 		}
 	}
-	goto st860;
-st860:
+	goto st869;
+st869:
 	if ( ++p == pe )
-		goto _test_eof860;
-case 860:
+		goto _test_eof869;
+case 869:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -68015,11 +68121,11 @@ case 860:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2667;
+		goto tr2678;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st860;
+		goto st869;
 	goto tr71;
-tr2650:
+tr2661:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -68055,11 +68161,11 @@ tr2650:
 			p--; {goto st261;}
 		}
 	}
-	goto st861;
-st861:
+	goto st870;
+st870:
 	if ( ++p == pe )
-		goto _test_eof861;
-case 861:
+		goto _test_eof870;
+case 870:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -68079,11 +68185,11 @@ case 861:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2655;
+		goto tr2666;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st861;
+		goto st870;
 	goto tr71;
-tr2637:
+tr2648:
 	{
 		if (s->number64 <= UINT32_MAX) {
 			*((uint32_t *)rdata_tail) = htonl((uint32_t)(s->number64));
@@ -68093,11 +68199,11 @@ tr2637:
 			p--; {goto st261;}
 		}
 	}
-	goto st862;
-st862:
+	goto st871;
+st871:
 	if ( ++p == pe )
-		goto _test_eof862;
-case 862:
+		goto _test_eof871;
+case 871:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -68117,11 +68223,11 @@ case 862:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2643;
+		goto tr2654;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st862;
+		goto st871;
 	goto tr71;
-tr2625:
+tr2636:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -68131,11 +68237,11 @@ tr2625:
 			p--; {goto st261;}
 		}
 	}
-	goto st863;
-st863:
+	goto st872;
+st872:
 	if ( ++p == pe )
-		goto _test_eof863;
-case 863:
+		goto _test_eof872;
+case 872:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -68155,14 +68261,14 @@ case 863:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2630;
+		goto tr2641;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st863;
+		goto st872;
 	goto tr71;
-st864:
+st873:
 	if ( ++p == pe )
-		goto _test_eof864;
-case 864:
+		goto _test_eof873;
+case 873:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -68182,11 +68288,11 @@ case 864:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2617;
+		goto tr2628;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st864;
+		goto st873;
 	goto tr71;
-tr3008:
+tr3019:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -68196,137 +68302,137 @@ tr3008:
 			p--; {goto st261;}
 		}
 	}
-	goto st865;
-tr2607:
+	goto st874;
+tr2618:
 	{ type_num(KNOT_RRTYPE_A, &rdata_tail); }
-	goto st865;
-tr2699:
+	goto st874;
+tr2710:
 	{ type_num(KNOT_RRTYPE_AAAA, &rdata_tail); }
-	goto st865;
-tr2707:
+	goto st874;
+tr2718:
 	{ type_num(KNOT_RRTYPE_AFSDB, &rdata_tail); }
-	goto st865;
-tr2713:
+	goto st874;
+tr2724:
 	{ type_num(KNOT_RRTYPE_APL, &rdata_tail); }
-	goto st865;
-tr2723:
-	{ type_num(KNOT_RRTYPE_CAA, &rdata_tail); }
-	goto st865;
+	goto st874;
 tr2734:
+	{ type_num(KNOT_RRTYPE_CAA, &rdata_tail); }
+	goto st874;
+tr2745:
 	{ type_num(KNOT_RRTYPE_CDNSKEY, &rdata_tail); }
-	goto st865;
-tr2739:
+	goto st874;
+tr2750:
 	{ type_num(KNOT_RRTYPE_CDS, &rdata_tail); }
-	goto st865;
-tr2746:
+	goto st874;
+tr2757:
 	{ type_num(KNOT_RRTYPE_CERT, &rdata_tail); }
-	goto st865;
-tr2754:
-	{ type_num(KNOT_RRTYPE_CNAME, &rdata_tail); }
-	goto st865;
+	goto st874;
 tr2765:
+	{ type_num(KNOT_RRTYPE_CNAME, &rdata_tail); }
+	goto st874;
+tr2776:
 	{ type_num(KNOT_RRTYPE_DHCID, &rdata_tail); }
-	goto st865;
-tr2774:
+	goto st874;
+tr2785:
 	{ type_num(KNOT_RRTYPE_DNAME, &rdata_tail); }
-	goto st865;
-tr2782:
+	goto st874;
+tr2793:
 	{ type_num(KNOT_RRTYPE_DNSKEY, &rdata_tail); }
-	goto st865;
-tr2787:
+	goto st874;
+tr2798:
 	{ type_num(KNOT_RRTYPE_DS, &rdata_tail); }
-	goto st865;
-tr2797:
+	goto st874;
+tr2808:
 	{ type_num(KNOT_RRTYPE_EUI48, &rdata_tail); }
-	goto st865;
-tr2803:
+	goto st874;
+tr2814:
 	{ type_num(KNOT_RRTYPE_EUI64, &rdata_tail); }
-	goto st865;
-tr2812:
+	goto st874;
+tr2823:
 	{ type_num(KNOT_RRTYPE_HINFO, &rdata_tail); }
-	goto st865;
-tr2824:
+	goto st874;
+tr2835:
 	{ type_num(KNOT_RRTYPE_IPSECKEY, &rdata_tail); }
-	goto st865;
-tr2832:
+	goto st874;
+tr2843:
 	{ type_num(KNOT_RRTYPE_KEY, &rdata_tail); }
-	goto st865;
-tr2837:
+	goto st874;
+tr2848:
 	{ type_num(KNOT_RRTYPE_KX, &rdata_tail); }
-	goto st865;
-tr2847:
+	goto st874;
+tr2858:
 	{ type_num(KNOT_RRTYPE_L32, &rdata_tail); }
-	goto st865;
-tr2853:
+	goto st874;
+tr2864:
 	{ type_num(KNOT_RRTYPE_L64, &rdata_tail); }
-	goto st865;
-tr2859:
+	goto st874;
+tr2870:
 	{ type_num(KNOT_RRTYPE_LOC, &rdata_tail); }
-	goto st865;
-tr2864:
+	goto st874;
+tr2875:
 	{ type_num(KNOT_RRTYPE_LP, &rdata_tail); }
-	goto st865;
-tr2874:
+	goto st874;
+tr2885:
 	{ type_num(KNOT_RRTYPE_MINFO, &rdata_tail); }
-	goto st865;
-tr2879:
-	{ type_num(KNOT_RRTYPE_MX, &rdata_tail); }
-	goto st865;
+	goto st874;
 tr2890:
+	{ type_num(KNOT_RRTYPE_MX, &rdata_tail); }
+	goto st874;
+tr2901:
 	{ type_num(KNOT_RRTYPE_NAPTR, &rdata_tail); }
-	goto st865;
-tr2896:
+	goto st874;
+tr2907:
 	{ type_num(KNOT_RRTYPE_NID, &rdata_tail); }
-	goto st865;
-tr2902:
+	goto st874;
+tr2913:
 	{ type_num(KNOT_RRTYPE_NS, &rdata_tail); }
-	goto st865;
-tr2909:
+	goto st874;
+tr2920:
 	{ type_num(KNOT_RRTYPE_NSEC, &rdata_tail); }
-	goto st865;
-tr2915:
+	goto st874;
+tr2926:
 	{ type_num(KNOT_RRTYPE_NSEC3, &rdata_tail); }
-	goto st865;
-tr2924:
+	goto st874;
+tr2935:
 	{ type_num(KNOT_RRTYPE_NSEC3PARAM, &rdata_tail); }
-	goto st865;
-tr2931:
+	goto st874;
+tr2942:
 	{ type_num(KNOT_RRTYPE_PTR, &rdata_tail); }
-	goto st865;
-tr2939:
+	goto st874;
+tr2950:
 	{ type_num(KNOT_RRTYPE_RP, &rdata_tail); }
-	goto st865;
-tr2947:
+	goto st874;
+tr2958:
 	{ type_num(KNOT_RRTYPE_RRSIG, &rdata_tail); }
-	goto st865;
-tr2952:
+	goto st874;
+tr2963:
 	{ type_num(KNOT_RRTYPE_RT, &rdata_tail); }
-	goto st865;
-tr2962:
+	goto st874;
+tr2973:
 	{ type_num(KNOT_RRTYPE_SOA, &rdata_tail); }
-	goto st865;
-tr2968:
+	goto st874;
+tr2979:
 	{ type_num(KNOT_RRTYPE_SPF, &rdata_tail); }
-	goto st865;
-tr2974:
+	goto st874;
+tr2985:
 	{ type_num(KNOT_RRTYPE_SRV, &rdata_tail); }
-	goto st865;
-tr2982:
+	goto st874;
+tr2993:
 	{ type_num(KNOT_RRTYPE_SSHFP, &rdata_tail); }
-	goto st865;
-tr2992:
+	goto st874;
+tr3003:
 	{ type_num(KNOT_RRTYPE_TLSA, &rdata_tail); }
-	goto st865;
-tr2998:
+	goto st874;
+tr3009:
 	{ type_num(KNOT_RRTYPE_TXT, &rdata_tail); }
-	goto st865;
-tr3015:
+	goto st874;
+tr3026:
 	{ type_num(KNOT_RRTYPE_URI, &rdata_tail); }
-	goto st865;
-st865:
+	goto st874;
+st874:
 	if ( ++p == pe )
-		goto _test_eof865;
-case 865:
+		goto _test_eof874;
+case 874:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -68346,154 +68452,19 @@ case 865:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr2612;
+		goto tr2623;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st865;
+		goto st874;
 	goto tr71;
-st866:
-	if ( ++p == pe )
-		goto _test_eof866;
-case 866:
-	switch( (*p) ) {
-		case 65: goto st867;
-		case 97: goto st867;
-	}
-	goto tr2584;
-st867:
-	if ( ++p == pe )
-		goto _test_eof867;
-case 867:
-	switch( (*p) ) {
-		case 65: goto st868;
-		case 97: goto st868;
-	}
-	goto tr2584;
-st868:
-	if ( ++p == pe )
-		goto _test_eof868;
-case 868:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
-	}
-	switch( _widec ) {
-		case 9: goto tr2695;
-		case 32: goto tr2695;
-		case 40: goto tr2696;
-		case 41: goto tr2697;
-		case 1034: goto tr2698;
-		case 1083: goto tr2699;
-	}
-	goto tr2584;
-st869:
-	if ( ++p == pe )
-		goto _test_eof869;
-case 869:
-	switch( (*p) ) {
-		case 83: goto st870;
-		case 115: goto st870;
-	}
-	goto tr2584;
-st870:
-	if ( ++p == pe )
-		goto _test_eof870;
-case 870:
-	switch( (*p) ) {
-		case 68: goto st871;
-		case 100: goto st871;
-	}
-	goto tr2584;
-st871:
-	if ( ++p == pe )
-		goto _test_eof871;
-case 871:
-	switch( (*p) ) {
-		case 66: goto st872;
-		case 98: goto st872;
-	}
-	goto tr2584;
-st872:
-	if ( ++p == pe )
-		goto _test_eof872;
-case 872:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
-	}
-	switch( _widec ) {
-		case 9: goto tr2703;
-		case 32: goto tr2703;
-		case 40: goto tr2704;
-		case 41: goto tr2705;
-		case 1034: goto tr2706;
-		case 1083: goto tr2707;
-	}
-	goto tr2584;
-st873:
-	if ( ++p == pe )
-		goto _test_eof873;
-case 873:
-	switch( (*p) ) {
-		case 76: goto st874;
-		case 108: goto st874;
-	}
-	goto tr2584;
-st874:
-	if ( ++p == pe )
-		goto _test_eof874;
-case 874:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
-	}
-	switch( _widec ) {
-		case 9: goto tr2709;
-		case 32: goto tr2709;
-		case 40: goto tr2710;
-		case 41: goto tr2711;
-		case 1034: goto tr2712;
-		case 1083: goto tr2713;
-	}
-	goto tr2584;
 st875:
 	if ( ++p == pe )
 		goto _test_eof875;
 case 875:
 	switch( (*p) ) {
 		case 65: goto st876;
-		case 68: goto st878;
-		case 69: goto st885;
-		case 78: goto st888;
 		case 97: goto st876;
-		case 100: goto st878;
-		case 101: goto st885;
-		case 110: goto st888;
 	}
-	goto tr2584;
+	goto tr2595;
 st876:
 	if ( ++p == pe )
 		goto _test_eof876;
@@ -68502,7 +68473,7 @@ case 876:
 		case 65: goto st877;
 		case 97: goto st877;
 	}
-	goto tr2584;
+	goto tr2595;
 st877:
 	if ( ++p == pe )
 		goto _test_eof877;
@@ -68520,61 +68491,75 @@ case 877:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2719;
-		case 32: goto tr2719;
-		case 40: goto tr2720;
-		case 41: goto tr2721;
-		case 1034: goto tr2722;
-		case 1083: goto tr2723;
-	}
-	goto tr2584;
+		case 9: goto tr2706;
+		case 32: goto tr2706;
+		case 40: goto tr2707;
+		case 41: goto tr2708;
+		case 1034: goto tr2709;
+		case 1083: goto tr2710;
+	}
+	goto tr2595;
 st878:
 	if ( ++p == pe )
 		goto _test_eof878;
 case 878:
 	switch( (*p) ) {
-		case 78: goto st879;
-		case 83: goto st884;
-		case 110: goto st879;
-		case 115: goto st884;
+		case 83: goto st879;
+		case 115: goto st879;
 	}
-	goto tr2584;
+	goto tr2595;
 st879:
 	if ( ++p == pe )
 		goto _test_eof879;
 case 879:
 	switch( (*p) ) {
-		case 83: goto st880;
-		case 115: goto st880;
+		case 68: goto st880;
+		case 100: goto st880;
 	}
-	goto tr2584;
+	goto tr2595;
 st880:
 	if ( ++p == pe )
 		goto _test_eof880;
 case 880:
 	switch( (*p) ) {
-		case 75: goto st881;
-		case 107: goto st881;
+		case 66: goto st881;
+		case 98: goto st881;
 	}
-	goto tr2584;
+	goto tr2595;
 st881:
 	if ( ++p == pe )
 		goto _test_eof881;
 case 881:
-	switch( (*p) ) {
-		case 69: goto st882;
-		case 101: goto st882;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
 	}
-	goto tr2584;
+	switch( _widec ) {
+		case 9: goto tr2714;
+		case 32: goto tr2714;
+		case 40: goto tr2715;
+		case 41: goto tr2716;
+		case 1034: goto tr2717;
+		case 1083: goto tr2718;
+	}
+	goto tr2595;
 st882:
 	if ( ++p == pe )
 		goto _test_eof882;
 case 882:
 	switch( (*p) ) {
-		case 89: goto st883;
-		case 121: goto st883;
+		case 76: goto st883;
+		case 108: goto st883;
 	}
-	goto tr2584;
+	goto tr2595;
 st883:
 	if ( ++p == pe )
 		goto _test_eof883;
@@ -68592,61 +68577,42 @@ case 883:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2730;
-		case 32: goto tr2730;
-		case 40: goto tr2731;
-		case 41: goto tr2732;
-		case 1034: goto tr2733;
-		case 1083: goto tr2734;
-	}
-	goto tr2584;
+		case 9: goto tr2720;
+		case 32: goto tr2720;
+		case 40: goto tr2721;
+		case 41: goto tr2722;
+		case 1034: goto tr2723;
+		case 1083: goto tr2724;
+	}
+	goto tr2595;
 st884:
 	if ( ++p == pe )
 		goto _test_eof884;
 case 884:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
+	switch( (*p) ) {
+		case 65: goto st885;
+		case 68: goto st887;
+		case 69: goto st894;
+		case 78: goto st897;
+		case 97: goto st885;
+		case 100: goto st887;
+		case 101: goto st894;
+		case 110: goto st897;
 	}
-	switch( _widec ) {
-		case 9: goto tr2735;
-		case 32: goto tr2735;
-		case 40: goto tr2736;
-		case 41: goto tr2737;
-		case 1034: goto tr2738;
-		case 1083: goto tr2739;
-	}
-	goto tr2584;
+	goto tr2595;
 st885:
 	if ( ++p == pe )
 		goto _test_eof885;
 case 885:
 	switch( (*p) ) {
-		case 82: goto st886;
-		case 114: goto st886;
+		case 65: goto st886;
+		case 97: goto st886;
 	}
-	goto tr2584;
+	goto tr2595;
 st886:
 	if ( ++p == pe )
 		goto _test_eof886;
 case 886:
-	switch( (*p) ) {
-		case 84: goto st887;
-		case 116: goto st887;
-	}
-	goto tr2584;
-st887:
-	if ( ++p == pe )
-		goto _test_eof887;
-case 887:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -68660,32 +68626,43 @@ case 887:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2742;
-		case 32: goto tr2742;
-		case 40: goto tr2743;
-		case 41: goto tr2744;
-		case 1034: goto tr2745;
-		case 1083: goto tr2746;
-	}
-	goto tr2584;
+		case 9: goto tr2730;
+		case 32: goto tr2730;
+		case 40: goto tr2731;
+		case 41: goto tr2732;
+		case 1034: goto tr2733;
+		case 1083: goto tr2734;
+	}
+	goto tr2595;
+st887:
+	if ( ++p == pe )
+		goto _test_eof887;
+case 887:
+	switch( (*p) ) {
+		case 78: goto st888;
+		case 83: goto st893;
+		case 110: goto st888;
+		case 115: goto st893;
+	}
+	goto tr2595;
 st888:
 	if ( ++p == pe )
 		goto _test_eof888;
 case 888:
 	switch( (*p) ) {
-		case 65: goto st889;
-		case 97: goto st889;
+		case 83: goto st889;
+		case 115: goto st889;
 	}
-	goto tr2584;
+	goto tr2595;
 st889:
 	if ( ++p == pe )
 		goto _test_eof889;
 case 889:
 	switch( (*p) ) {
-		case 77: goto st890;
-		case 109: goto st890;
+		case 75: goto st890;
+		case 107: goto st890;
 	}
-	goto tr2584;
+	goto tr2595;
 st890:
 	if ( ++p == pe )
 		goto _test_eof890;
@@ -68694,11 +68671,20 @@ case 890:
 		case 69: goto st891;
 		case 101: goto st891;
 	}
-	goto tr2584;
+	goto tr2595;
 st891:
 	if ( ++p == pe )
 		goto _test_eof891;
 case 891:
+	switch( (*p) ) {
+		case 89: goto st892;
+		case 121: goto st892;
+	}
+	goto tr2595;
+st892:
+	if ( ++p == pe )
+		goto _test_eof892;
+case 892:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -68712,54 +68698,57 @@ case 891:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2750;
-		case 32: goto tr2750;
-		case 40: goto tr2751;
-		case 41: goto tr2752;
-		case 1034: goto tr2753;
-		case 1083: goto tr2754;
-	}
-	goto tr2584;
-st892:
-	if ( ++p == pe )
-		goto _test_eof892;
-case 892:
-	switch( (*p) ) {
-		case 72: goto st893;
-		case 78: goto st897;
-		case 83: goto st905;
-		case 104: goto st893;
-		case 110: goto st897;
-		case 115: goto st905;
-	}
-	goto tr2584;
+		case 9: goto tr2741;
+		case 32: goto tr2741;
+		case 40: goto tr2742;
+		case 41: goto tr2743;
+		case 1034: goto tr2744;
+		case 1083: goto tr2745;
+	}
+	goto tr2595;
 st893:
 	if ( ++p == pe )
 		goto _test_eof893;
 case 893:
-	switch( (*p) ) {
-		case 67: goto st894;
-		case 99: goto st894;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
 	}
-	goto tr2584;
+	switch( _widec ) {
+		case 9: goto tr2746;
+		case 32: goto tr2746;
+		case 40: goto tr2747;
+		case 41: goto tr2748;
+		case 1034: goto tr2749;
+		case 1083: goto tr2750;
+	}
+	goto tr2595;
 st894:
 	if ( ++p == pe )
 		goto _test_eof894;
 case 894:
 	switch( (*p) ) {
-		case 73: goto st895;
-		case 105: goto st895;
+		case 82: goto st895;
+		case 114: goto st895;
 	}
-	goto tr2584;
+	goto tr2595;
 st895:
 	if ( ++p == pe )
 		goto _test_eof895;
 case 895:
 	switch( (*p) ) {
-		case 68: goto st896;
-		case 100: goto st896;
+		case 84: goto st896;
+		case 116: goto st896;
 	}
-	goto tr2584;
+	goto tr2595;
 st896:
 	if ( ++p == pe )
 		goto _test_eof896;
@@ -68777,25 +68766,23 @@ case 896:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2761;
-		case 32: goto tr2761;
-		case 40: goto tr2762;
-		case 41: goto tr2763;
-		case 1034: goto tr2764;
-		case 1083: goto tr2765;
-	}
-	goto tr2584;
+		case 9: goto tr2753;
+		case 32: goto tr2753;
+		case 40: goto tr2754;
+		case 41: goto tr2755;
+		case 1034: goto tr2756;
+		case 1083: goto tr2757;
+	}
+	goto tr2595;
 st897:
 	if ( ++p == pe )
 		goto _test_eof897;
 case 897:
 	switch( (*p) ) {
 		case 65: goto st898;
-		case 83: goto st901;
 		case 97: goto st898;
-		case 115: goto st901;
 	}
-	goto tr2584;
+	goto tr2595;
 st898:
 	if ( ++p == pe )
 		goto _test_eof898;
@@ -68804,7 +68791,7 @@ case 898:
 		case 77: goto st899;
 		case 109: goto st899;
 	}
-	goto tr2584;
+	goto tr2595;
 st899:
 	if ( ++p == pe )
 		goto _test_eof899;
@@ -68813,7 +68800,7 @@ case 899:
 		case 69: goto st900;
 		case 101: goto st900;
 	}
-	goto tr2584;
+	goto tr2595;
 st900:
 	if ( ++p == pe )
 		goto _test_eof900;
@@ -68831,66 +68818,54 @@ case 900:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2770;
-		case 32: goto tr2770;
-		case 40: goto tr2771;
-		case 41: goto tr2772;
-		case 1034: goto tr2773;
-		case 1083: goto tr2774;
-	}
-	goto tr2584;
+		case 9: goto tr2761;
+		case 32: goto tr2761;
+		case 40: goto tr2762;
+		case 41: goto tr2763;
+		case 1034: goto tr2764;
+		case 1083: goto tr2765;
+	}
+	goto tr2595;
 st901:
 	if ( ++p == pe )
 		goto _test_eof901;
 case 901:
 	switch( (*p) ) {
-		case 75: goto st902;
-		case 107: goto st902;
-	}
-	goto tr2584;
+		case 72: goto st902;
+		case 78: goto st906;
+		case 83: goto st914;
+		case 104: goto st902;
+		case 110: goto st906;
+		case 115: goto st914;
+	}
+	goto tr2595;
 st902:
 	if ( ++p == pe )
 		goto _test_eof902;
 case 902:
 	switch( (*p) ) {
-		case 69: goto st903;
-		case 101: goto st903;
+		case 67: goto st903;
+		case 99: goto st903;
 	}
-	goto tr2584;
+	goto tr2595;
 st903:
 	if ( ++p == pe )
 		goto _test_eof903;
 case 903:
 	switch( (*p) ) {
-		case 89: goto st904;
-		case 121: goto st904;
+		case 73: goto st904;
+		case 105: goto st904;
 	}
-	goto tr2584;
+	goto tr2595;
 st904:
 	if ( ++p == pe )
 		goto _test_eof904;
 case 904:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
+	switch( (*p) ) {
+		case 68: goto st905;
+		case 100: goto st905;
 	}
-	switch( _widec ) {
-		case 9: goto tr2778;
-		case 32: goto tr2778;
-		case 40: goto tr2779;
-		case 41: goto tr2780;
-		case 1034: goto tr2781;
-		case 1083: goto tr2782;
-	}
-	goto tr2584;
+	goto tr2595;
 st905:
 	if ( ++p == pe )
 		goto _test_eof905;
@@ -68908,52 +68883,47 @@ case 905:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2783;
-		case 32: goto tr2783;
-		case 40: goto tr2784;
-		case 41: goto tr2785;
-		case 1034: goto tr2786;
-		case 1083: goto tr2787;
-	}
-	goto tr2584;
+		case 9: goto tr2772;
+		case 32: goto tr2772;
+		case 40: goto tr2773;
+		case 41: goto tr2774;
+		case 1034: goto tr2775;
+		case 1083: goto tr2776;
+	}
+	goto tr2595;
 st906:
 	if ( ++p == pe )
 		goto _test_eof906;
 case 906:
 	switch( (*p) ) {
-		case 85: goto st907;
-		case 117: goto st907;
+		case 65: goto st907;
+		case 83: goto st910;
+		case 97: goto st907;
+		case 115: goto st910;
 	}
-	goto tr2584;
+	goto tr2595;
 st907:
 	if ( ++p == pe )
 		goto _test_eof907;
 case 907:
 	switch( (*p) ) {
-		case 73: goto st908;
-		case 105: goto st908;
+		case 77: goto st908;
+		case 109: goto st908;
 	}
-	goto tr2584;
+	goto tr2595;
 st908:
 	if ( ++p == pe )
 		goto _test_eof908;
 case 908:
 	switch( (*p) ) {
-		case 52: goto st909;
-		case 54: goto st911;
+		case 69: goto st909;
+		case 101: goto st909;
 	}
-	goto tr2584;
+	goto tr2595;
 st909:
 	if ( ++p == pe )
 		goto _test_eof909;
 case 909:
-	if ( (*p) == 56 )
-		goto st910;
-	goto tr2584;
-st910:
-	if ( ++p == pe )
-		goto _test_eof910;
-case 910:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -68967,25 +68937,45 @@ case 910:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2793;
-		case 32: goto tr2793;
-		case 40: goto tr2794;
-		case 41: goto tr2795;
-		case 1034: goto tr2796;
-		case 1083: goto tr2797;
-	}
-	goto tr2584;
+		case 9: goto tr2781;
+		case 32: goto tr2781;
+		case 40: goto tr2782;
+		case 41: goto tr2783;
+		case 1034: goto tr2784;
+		case 1083: goto tr2785;
+	}
+	goto tr2595;
+st910:
+	if ( ++p == pe )
+		goto _test_eof910;
+case 910:
+	switch( (*p) ) {
+		case 75: goto st911;
+		case 107: goto st911;
+	}
+	goto tr2595;
 st911:
 	if ( ++p == pe )
 		goto _test_eof911;
 case 911:
-	if ( (*p) == 52 )
-		goto st912;
-	goto tr2584;
+	switch( (*p) ) {
+		case 69: goto st912;
+		case 101: goto st912;
+	}
+	goto tr2595;
 st912:
 	if ( ++p == pe )
 		goto _test_eof912;
 case 912:
+	switch( (*p) ) {
+		case 89: goto st913;
+		case 121: goto st913;
+	}
+	goto tr2595;
+st913:
+	if ( ++p == pe )
+		goto _test_eof913;
+case 913:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -68999,54 +68989,77 @@ case 912:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2799;
-		case 32: goto tr2799;
-		case 40: goto tr2800;
-		case 41: goto tr2801;
-		case 1034: goto tr2802;
-		case 1083: goto tr2803;
-	}
-	goto tr2584;
-st913:
-	if ( ++p == pe )
-		goto _test_eof913;
-case 913:
-	switch( (*p) ) {
-		case 73: goto st914;
-		case 105: goto st914;
-	}
-	goto tr2584;
+		case 9: goto tr2789;
+		case 32: goto tr2789;
+		case 40: goto tr2790;
+		case 41: goto tr2791;
+		case 1034: goto tr2792;
+		case 1083: goto tr2793;
+	}
+	goto tr2595;
 st914:
 	if ( ++p == pe )
 		goto _test_eof914;
 case 914:
-	switch( (*p) ) {
-		case 78: goto st915;
-		case 110: goto st915;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
 	}
-	goto tr2584;
+	switch( _widec ) {
+		case 9: goto tr2794;
+		case 32: goto tr2794;
+		case 40: goto tr2795;
+		case 41: goto tr2796;
+		case 1034: goto tr2797;
+		case 1083: goto tr2798;
+	}
+	goto tr2595;
 st915:
 	if ( ++p == pe )
 		goto _test_eof915;
 case 915:
 	switch( (*p) ) {
-		case 70: goto st916;
-		case 102: goto st916;
+		case 85: goto st916;
+		case 117: goto st916;
 	}
-	goto tr2584;
+	goto tr2595;
 st916:
 	if ( ++p == pe )
 		goto _test_eof916;
 case 916:
 	switch( (*p) ) {
-		case 79: goto st917;
-		case 111: goto st917;
+		case 73: goto st917;
+		case 105: goto st917;
 	}
-	goto tr2584;
+	goto tr2595;
 st917:
 	if ( ++p == pe )
 		goto _test_eof917;
 case 917:
+	switch( (*p) ) {
+		case 52: goto st918;
+		case 54: goto st920;
+	}
+	goto tr2595;
+st918:
+	if ( ++p == pe )
+		goto _test_eof918;
+case 918:
+	if ( (*p) == 56 )
+		goto st919;
+	goto tr2595;
+st919:
+	if ( ++p == pe )
+		goto _test_eof919;
+case 919:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69060,81 +69073,86 @@ case 917:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2808;
-		case 32: goto tr2808;
-		case 40: goto tr2809;
-		case 41: goto tr2810;
-		case 1034: goto tr2811;
-		case 1083: goto tr2812;
-	}
-	goto tr2584;
-st918:
-	if ( ++p == pe )
-		goto _test_eof918;
-case 918:
-	switch( (*p) ) {
-		case 80: goto st919;
-		case 112: goto st919;
-	}
-	goto tr2584;
-st919:
-	if ( ++p == pe )
-		goto _test_eof919;
-case 919:
-	switch( (*p) ) {
-		case 83: goto st920;
-		case 115: goto st920;
-	}
-	goto tr2584;
+		case 9: goto tr2804;
+		case 32: goto tr2804;
+		case 40: goto tr2805;
+		case 41: goto tr2806;
+		case 1034: goto tr2807;
+		case 1083: goto tr2808;
+	}
+	goto tr2595;
 st920:
 	if ( ++p == pe )
 		goto _test_eof920;
 case 920:
-	switch( (*p) ) {
-		case 69: goto st921;
-		case 101: goto st921;
-	}
-	goto tr2584;
+	if ( (*p) == 52 )
+		goto st921;
+	goto tr2595;
 st921:
 	if ( ++p == pe )
 		goto _test_eof921;
 case 921:
-	switch( (*p) ) {
-		case 67: goto st922;
-		case 99: goto st922;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
 	}
-	goto tr2584;
+	switch( _widec ) {
+		case 9: goto tr2810;
+		case 32: goto tr2810;
+		case 40: goto tr2811;
+		case 41: goto tr2812;
+		case 1034: goto tr2813;
+		case 1083: goto tr2814;
+	}
+	goto tr2595;
 st922:
 	if ( ++p == pe )
 		goto _test_eof922;
 case 922:
 	switch( (*p) ) {
-		case 75: goto st923;
-		case 107: goto st923;
+		case 73: goto st923;
+		case 105: goto st923;
 	}
-	goto tr2584;
+	goto tr2595;
 st923:
 	if ( ++p == pe )
 		goto _test_eof923;
 case 923:
 	switch( (*p) ) {
-		case 69: goto st924;
-		case 101: goto st924;
+		case 78: goto st924;
+		case 110: goto st924;
 	}
-	goto tr2584;
+	goto tr2595;
 st924:
 	if ( ++p == pe )
 		goto _test_eof924;
 case 924:
 	switch( (*p) ) {
-		case 89: goto st925;
-		case 121: goto st925;
+		case 70: goto st925;
+		case 102: goto st925;
 	}
-	goto tr2584;
+	goto tr2595;
 st925:
 	if ( ++p == pe )
 		goto _test_eof925;
 case 925:
+	switch( (*p) ) {
+		case 79: goto st926;
+		case 111: goto st926;
+	}
+	goto tr2595;
+st926:
+	if ( ++p == pe )
+		goto _test_eof926;
+case 926:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69148,136 +69166,77 @@ case 925:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2820;
-		case 32: goto tr2820;
-		case 40: goto tr2821;
-		case 41: goto tr2822;
-		case 1034: goto tr2823;
-		case 1083: goto tr2824;
-	}
-	goto tr2584;
-st926:
-	if ( ++p == pe )
-		goto _test_eof926;
-case 926:
-	switch( (*p) ) {
-		case 69: goto st927;
-		case 88: goto st929;
-		case 101: goto st927;
-		case 120: goto st929;
-	}
-	goto tr2584;
+		case 9: goto tr2819;
+		case 32: goto tr2819;
+		case 40: goto tr2820;
+		case 41: goto tr2821;
+		case 1034: goto tr2822;
+		case 1083: goto tr2823;
+	}
+	goto tr2595;
 st927:
 	if ( ++p == pe )
 		goto _test_eof927;
 case 927:
 	switch( (*p) ) {
-		case 89: goto st928;
-		case 121: goto st928;
+		case 80: goto st928;
+		case 112: goto st928;
 	}
-	goto tr2584;
+	goto tr2595;
 st928:
 	if ( ++p == pe )
 		goto _test_eof928;
 case 928:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
+	switch( (*p) ) {
+		case 83: goto st929;
+		case 115: goto st929;
 	}
-	switch( _widec ) {
-		case 9: goto tr2828;
-		case 32: goto tr2828;
-		case 40: goto tr2829;
-		case 41: goto tr2830;
-		case 1034: goto tr2831;
-		case 1083: goto tr2832;
-	}
-	goto tr2584;
+	goto tr2595;
 st929:
 	if ( ++p == pe )
 		goto _test_eof929;
 case 929:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
+	switch( (*p) ) {
+		case 69: goto st930;
+		case 101: goto st930;
 	}
-	switch( _widec ) {
-		case 9: goto tr2833;
-		case 32: goto tr2833;
-		case 40: goto tr2834;
-		case 41: goto tr2835;
-		case 1034: goto tr2836;
-		case 1083: goto tr2837;
-	}
-	goto tr2584;
+	goto tr2595;
 st930:
 	if ( ++p == pe )
 		goto _test_eof930;
 case 930:
 	switch( (*p) ) {
-		case 51: goto st931;
-		case 54: goto st933;
-		case 79: goto st935;
-		case 80: goto st937;
-		case 111: goto st935;
-		case 112: goto st937;
-	}
-	goto tr2584;
+		case 67: goto st931;
+		case 99: goto st931;
+	}
+	goto tr2595;
 st931:
 	if ( ++p == pe )
 		goto _test_eof931;
 case 931:
-	if ( (*p) == 50 )
-		goto st932;
-	goto tr2584;
+	switch( (*p) ) {
+		case 75: goto st932;
+		case 107: goto st932;
+	}
+	goto tr2595;
 st932:
 	if ( ++p == pe )
 		goto _test_eof932;
 case 932:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
+	switch( (*p) ) {
+		case 69: goto st933;
+		case 101: goto st933;
 	}
-	switch( _widec ) {
-		case 9: goto tr2843;
-		case 32: goto tr2843;
-		case 40: goto tr2844;
-		case 41: goto tr2845;
-		case 1034: goto tr2846;
-		case 1083: goto tr2847;
-	}
-	goto tr2584;
+	goto tr2595;
 st933:
 	if ( ++p == pe )
 		goto _test_eof933;
 case 933:
-	if ( (*p) == 52 )
-		goto st934;
-	goto tr2584;
+	switch( (*p) ) {
+		case 89: goto st934;
+		case 121: goto st934;
+	}
+	goto tr2595;
 st934:
 	if ( ++p == pe )
 		goto _test_eof934;
@@ -69295,27 +69254,38 @@ case 934:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2849;
-		case 32: goto tr2849;
-		case 40: goto tr2850;
-		case 41: goto tr2851;
-		case 1034: goto tr2852;
-		case 1083: goto tr2853;
-	}
-	goto tr2584;
+		case 9: goto tr2831;
+		case 32: goto tr2831;
+		case 40: goto tr2832;
+		case 41: goto tr2833;
+		case 1034: goto tr2834;
+		case 1083: goto tr2835;
+	}
+	goto tr2595;
 st935:
 	if ( ++p == pe )
 		goto _test_eof935;
 case 935:
 	switch( (*p) ) {
-		case 67: goto st936;
-		case 99: goto st936;
+		case 69: goto st936;
+		case 88: goto st938;
+		case 101: goto st936;
+		case 120: goto st938;
 	}
-	goto tr2584;
+	goto tr2595;
 st936:
 	if ( ++p == pe )
 		goto _test_eof936;
 case 936:
+	switch( (*p) ) {
+		case 89: goto st937;
+		case 121: goto st937;
+	}
+	goto tr2595;
+st937:
+	if ( ++p == pe )
+		goto _test_eof937;
+case 937:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69329,18 +69299,18 @@ case 936:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2855;
-		case 32: goto tr2855;
-		case 40: goto tr2856;
-		case 41: goto tr2857;
-		case 1034: goto tr2858;
-		case 1083: goto tr2859;
-	}
-	goto tr2584;
-st937:
+		case 9: goto tr2839;
+		case 32: goto tr2839;
+		case 40: goto tr2840;
+		case 41: goto tr2841;
+		case 1034: goto tr2842;
+		case 1083: goto tr2843;
+	}
+	goto tr2595;
+st938:
 	if ( ++p == pe )
-		goto _test_eof937;
-case 937:
+		goto _test_eof938;
+case 938:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69354,56 +69324,38 @@ case 937:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2860;
-		case 32: goto tr2860;
-		case 40: goto tr2861;
-		case 41: goto tr2862;
-		case 1034: goto tr2863;
-		case 1083: goto tr2864;
-	}
-	goto tr2584;
-st938:
-	if ( ++p == pe )
-		goto _test_eof938;
-case 938:
-	switch( (*p) ) {
-		case 73: goto st939;
-		case 88: goto st943;
-		case 105: goto st939;
-		case 120: goto st943;
-	}
-	goto tr2584;
+		case 9: goto tr2844;
+		case 32: goto tr2844;
+		case 40: goto tr2845;
+		case 41: goto tr2846;
+		case 1034: goto tr2847;
+		case 1083: goto tr2848;
+	}
+	goto tr2595;
 st939:
 	if ( ++p == pe )
 		goto _test_eof939;
 case 939:
 	switch( (*p) ) {
-		case 78: goto st940;
-		case 110: goto st940;
+		case 51: goto st940;
+		case 54: goto st942;
+		case 79: goto st944;
+		case 80: goto st946;
+		case 111: goto st944;
+		case 112: goto st946;
 	}
-	goto tr2584;
+	goto tr2595;
 st940:
 	if ( ++p == pe )
 		goto _test_eof940;
 case 940:
-	switch( (*p) ) {
-		case 70: goto st941;
-		case 102: goto st941;
-	}
-	goto tr2584;
+	if ( (*p) == 50 )
+		goto st941;
+	goto tr2595;
 st941:
 	if ( ++p == pe )
 		goto _test_eof941;
 case 941:
-	switch( (*p) ) {
-		case 79: goto st942;
-		case 111: goto st942;
-	}
-	goto tr2584;
-st942:
-	if ( ++p == pe )
-		goto _test_eof942;
-case 942:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69417,14 +69369,21 @@ case 942:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2870;
-		case 32: goto tr2870;
-		case 40: goto tr2871;
-		case 41: goto tr2872;
-		case 1034: goto tr2873;
-		case 1083: goto tr2874;
-	}
-	goto tr2584;
+		case 9: goto tr2854;
+		case 32: goto tr2854;
+		case 40: goto tr2855;
+		case 41: goto tr2856;
+		case 1034: goto tr2857;
+		case 1083: goto tr2858;
+	}
+	goto tr2595;
+st942:
+	if ( ++p == pe )
+		goto _test_eof942;
+case 942:
+	if ( (*p) == 52 )
+		goto st943;
+	goto tr2595;
 st943:
 	if ( ++p == pe )
 		goto _test_eof943;
@@ -69442,58 +69401,52 @@ case 943:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2875;
-		case 32: goto tr2875;
-		case 40: goto tr2876;
-		case 41: goto tr2877;
-		case 1034: goto tr2878;
-		case 1083: goto tr2879;
-	}
-	goto tr2584;
+		case 9: goto tr2860;
+		case 32: goto tr2860;
+		case 40: goto tr2861;
+		case 41: goto tr2862;
+		case 1034: goto tr2863;
+		case 1083: goto tr2864;
+	}
+	goto tr2595;
 st944:
 	if ( ++p == pe )
 		goto _test_eof944;
 case 944:
 	switch( (*p) ) {
-		case 65: goto st945;
-		case 73: goto st949;
-		case 83: goto st951;
-		case 97: goto st945;
-		case 105: goto st949;
-		case 115: goto st951;
-	}
-	goto tr2584;
+		case 67: goto st945;
+		case 99: goto st945;
+	}
+	goto tr2595;
 st945:
 	if ( ++p == pe )
 		goto _test_eof945;
 case 945:
-	switch( (*p) ) {
-		case 80: goto st946;
-		case 112: goto st946;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
 	}
-	goto tr2584;
+	switch( _widec ) {
+		case 9: goto tr2866;
+		case 32: goto tr2866;
+		case 40: goto tr2867;
+		case 41: goto tr2868;
+		case 1034: goto tr2869;
+		case 1083: goto tr2870;
+	}
+	goto tr2595;
 st946:
 	if ( ++p == pe )
 		goto _test_eof946;
 case 946:
-	switch( (*p) ) {
-		case 84: goto st947;
-		case 116: goto st947;
-	}
-	goto tr2584;
-st947:
-	if ( ++p == pe )
-		goto _test_eof947;
-case 947:
-	switch( (*p) ) {
-		case 82: goto st948;
-		case 114: goto st948;
-	}
-	goto tr2584;
-st948:
-	if ( ++p == pe )
-		goto _test_eof948;
-case 948:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69507,48 +69460,52 @@ case 948:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2886;
-		case 32: goto tr2886;
-		case 40: goto tr2887;
-		case 41: goto tr2888;
-		case 1034: goto tr2889;
-		case 1083: goto tr2890;
+		case 9: goto tr2871;
+		case 32: goto tr2871;
+		case 40: goto tr2872;
+		case 41: goto tr2873;
+		case 1034: goto tr2874;
+		case 1083: goto tr2875;
+	}
+	goto tr2595;
+st947:
+	if ( ++p == pe )
+		goto _test_eof947;
+case 947:
+	switch( (*p) ) {
+		case 73: goto st948;
+		case 88: goto st952;
+		case 105: goto st948;
+		case 120: goto st952;
+	}
+	goto tr2595;
+st948:
+	if ( ++p == pe )
+		goto _test_eof948;
+case 948:
+	switch( (*p) ) {
+		case 78: goto st949;
+		case 110: goto st949;
 	}
-	goto tr2584;
+	goto tr2595;
 st949:
 	if ( ++p == pe )
 		goto _test_eof949;
 case 949:
 	switch( (*p) ) {
-		case 68: goto st950;
-		case 100: goto st950;
+		case 70: goto st950;
+		case 102: goto st950;
 	}
-	goto tr2584;
+	goto tr2595;
 st950:
 	if ( ++p == pe )
 		goto _test_eof950;
 case 950:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
+	switch( (*p) ) {
+		case 79: goto st951;
+		case 111: goto st951;
 	}
-	switch( _widec ) {
-		case 9: goto tr2892;
-		case 32: goto tr2892;
-		case 40: goto tr2893;
-		case 41: goto tr2894;
-		case 1034: goto tr2895;
-		case 1083: goto tr2896;
-	}
-	goto tr2584;
+	goto tr2595;
 st951:
 	if ( ++p == pe )
 		goto _test_eof951;
@@ -69566,29 +69523,18 @@ case 951:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2897;
-		case 32: goto tr2897;
-		case 40: goto tr2898;
-		case 41: goto tr2899;
-		case 69: goto st952;
-		case 101: goto st952;
-		case 1034: goto tr2901;
-		case 1083: goto tr2902;
-	}
-	goto tr2584;
+		case 9: goto tr2881;
+		case 32: goto tr2881;
+		case 40: goto tr2882;
+		case 41: goto tr2883;
+		case 1034: goto tr2884;
+		case 1083: goto tr2885;
+	}
+	goto tr2595;
 st952:
 	if ( ++p == pe )
 		goto _test_eof952;
 case 952:
-	switch( (*p) ) {
-		case 67: goto st953;
-		case 99: goto st953;
-	}
-	goto tr2584;
-st953:
-	if ( ++p == pe )
-		goto _test_eof953;
-case 953:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69602,51 +69548,45 @@ case 953:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2904;
-		case 32: goto tr2904;
-		case 40: goto tr2905;
-		case 41: goto tr2906;
-		case 51: goto st954;
-		case 1034: goto tr2908;
-		case 1083: goto tr2909;
-	}
-	goto tr2584;
+		case 9: goto tr2886;
+		case 32: goto tr2886;
+		case 40: goto tr2887;
+		case 41: goto tr2888;
+		case 1034: goto tr2889;
+		case 1083: goto tr2890;
+	}
+	goto tr2595;
+st953:
+	if ( ++p == pe )
+		goto _test_eof953;
+case 953:
+	switch( (*p) ) {
+		case 65: goto st954;
+		case 73: goto st958;
+		case 83: goto st960;
+		case 97: goto st954;
+		case 105: goto st958;
+		case 115: goto st960;
+	}
+	goto tr2595;
 st954:
 	if ( ++p == pe )
 		goto _test_eof954;
 case 954:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
-	}
-	switch( _widec ) {
-		case 9: goto tr2910;
-		case 32: goto tr2910;
-		case 40: goto tr2911;
-		case 41: goto tr2912;
+	switch( (*p) ) {
 		case 80: goto st955;
 		case 112: goto st955;
-		case 1034: goto tr2914;
-		case 1083: goto tr2915;
 	}
-	goto tr2584;
+	goto tr2595;
 st955:
 	if ( ++p == pe )
 		goto _test_eof955;
 case 955:
 	switch( (*p) ) {
-		case 65: goto st956;
-		case 97: goto st956;
+		case 84: goto st956;
+		case 116: goto st956;
 	}
-	goto tr2584;
+	goto tr2595;
 st956:
 	if ( ++p == pe )
 		goto _test_eof956;
@@ -69655,25 +69595,41 @@ case 956:
 		case 82: goto st957;
 		case 114: goto st957;
 	}
-	goto tr2584;
+	goto tr2595;
 st957:
 	if ( ++p == pe )
 		goto _test_eof957;
 case 957:
-	switch( (*p) ) {
-		case 65: goto st958;
-		case 97: goto st958;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
+	}
+	switch( _widec ) {
+		case 9: goto tr2897;
+		case 32: goto tr2897;
+		case 40: goto tr2898;
+		case 41: goto tr2899;
+		case 1034: goto tr2900;
+		case 1083: goto tr2901;
 	}
-	goto tr2584;
+	goto tr2595;
 st958:
 	if ( ++p == pe )
 		goto _test_eof958;
 case 958:
 	switch( (*p) ) {
-		case 77: goto st959;
-		case 109: goto st959;
+		case 68: goto st959;
+		case 100: goto st959;
 	}
-	goto tr2584;
+	goto tr2595;
 st959:
 	if ( ++p == pe )
 		goto _test_eof959;
@@ -69691,32 +69647,50 @@ case 959:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2920;
-		case 32: goto tr2920;
-		case 40: goto tr2921;
-		case 41: goto tr2922;
-		case 1034: goto tr2923;
-		case 1083: goto tr2924;
-	}
-	goto tr2584;
+		case 9: goto tr2903;
+		case 32: goto tr2903;
+		case 40: goto tr2904;
+		case 41: goto tr2905;
+		case 1034: goto tr2906;
+		case 1083: goto tr2907;
+	}
+	goto tr2595;
 st960:
 	if ( ++p == pe )
 		goto _test_eof960;
 case 960:
-	switch( (*p) ) {
-		case 84: goto st961;
-		case 116: goto st961;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
 	}
-	goto tr2584;
+	switch( _widec ) {
+		case 9: goto tr2908;
+		case 32: goto tr2908;
+		case 40: goto tr2909;
+		case 41: goto tr2910;
+		case 69: goto st961;
+		case 101: goto st961;
+		case 1034: goto tr2912;
+		case 1083: goto tr2913;
+	}
+	goto tr2595;
 st961:
 	if ( ++p == pe )
 		goto _test_eof961;
 case 961:
 	switch( (*p) ) {
-		case 82: goto st962;
-		case 114: goto st962;
+		case 67: goto st962;
+		case 99: goto st962;
 	}
-	goto tr2584;
+	goto tr2595;
 st962:
 	if ( ++p == pe )
 		goto _test_eof962;
@@ -69734,31 +69708,19 @@ case 962:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2927;
-		case 32: goto tr2927;
-		case 40: goto tr2928;
-		case 41: goto tr2929;
-		case 1034: goto tr2930;
-		case 1083: goto tr2931;
-	}
-	goto tr2584;
+		case 9: goto tr2915;
+		case 32: goto tr2915;
+		case 40: goto tr2916;
+		case 41: goto tr2917;
+		case 51: goto st963;
+		case 1034: goto tr2919;
+		case 1083: goto tr2920;
+	}
+	goto tr2595;
 st963:
 	if ( ++p == pe )
 		goto _test_eof963;
 case 963:
-	switch( (*p) ) {
-		case 80: goto st964;
-		case 82: goto st965;
-		case 84: goto st969;
-		case 112: goto st964;
-		case 114: goto st965;
-		case 116: goto st969;
-	}
-	goto tr2584;
-st964:
-	if ( ++p == pe )
-		goto _test_eof964;
-case 964:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69772,41 +69734,52 @@ case 964:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2935;
-		case 32: goto tr2935;
-		case 40: goto tr2936;
-		case 41: goto tr2937;
-		case 1034: goto tr2938;
-		case 1083: goto tr2939;
-	}
-	goto tr2584;
+		case 9: goto tr2921;
+		case 32: goto tr2921;
+		case 40: goto tr2922;
+		case 41: goto tr2923;
+		case 80: goto st964;
+		case 112: goto st964;
+		case 1034: goto tr2925;
+		case 1083: goto tr2926;
+	}
+	goto tr2595;
+st964:
+	if ( ++p == pe )
+		goto _test_eof964;
+case 964:
+	switch( (*p) ) {
+		case 65: goto st965;
+		case 97: goto st965;
+	}
+	goto tr2595;
 st965:
 	if ( ++p == pe )
 		goto _test_eof965;
 case 965:
 	switch( (*p) ) {
-		case 83: goto st966;
-		case 115: goto st966;
+		case 82: goto st966;
+		case 114: goto st966;
 	}
-	goto tr2584;
+	goto tr2595;
 st966:
 	if ( ++p == pe )
 		goto _test_eof966;
 case 966:
 	switch( (*p) ) {
-		case 73: goto st967;
-		case 105: goto st967;
+		case 65: goto st967;
+		case 97: goto st967;
 	}
-	goto tr2584;
+	goto tr2595;
 st967:
 	if ( ++p == pe )
 		goto _test_eof967;
 case 967:
 	switch( (*p) ) {
-		case 71: goto st968;
-		case 103: goto st968;
+		case 77: goto st968;
+		case 109: goto st968;
 	}
-	goto tr2584;
+	goto tr2595;
 st968:
 	if ( ++p == pe )
 		goto _test_eof968;
@@ -69824,67 +69797,36 @@ case 968:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2943;
-		case 32: goto tr2943;
-		case 40: goto tr2944;
-		case 41: goto tr2945;
-		case 1034: goto tr2946;
-		case 1083: goto tr2947;
-	}
-	goto tr2584;
+		case 9: goto tr2931;
+		case 32: goto tr2931;
+		case 40: goto tr2932;
+		case 41: goto tr2933;
+		case 1034: goto tr2934;
+		case 1083: goto tr2935;
+	}
+	goto tr2595;
 st969:
 	if ( ++p == pe )
 		goto _test_eof969;
 case 969:
-	_widec = (*p);
-	if ( (*p) > 10 ) {
-		if ( 59 <= (*p) && (*p) <= 59 ) {
-			_widec = (short)(640 + ((*p) - -128));
-			if (
- s->multiline  ) _widec += 256;
-		}
-	} else if ( (*p) >= 10 ) {
-		_widec = (short)(640 + ((*p) - -128));
-		if (
- s->multiline  ) _widec += 256;
+	switch( (*p) ) {
+		case 84: goto st970;
+		case 116: goto st970;
 	}
-	switch( _widec ) {
-		case 9: goto tr2948;
-		case 32: goto tr2948;
-		case 40: goto tr2949;
-		case 41: goto tr2950;
-		case 1034: goto tr2951;
-		case 1083: goto tr2952;
-	}
-	goto tr2584;
+	goto tr2595;
 st970:
 	if ( ++p == pe )
 		goto _test_eof970;
 case 970:
 	switch( (*p) ) {
-		case 79: goto st971;
-		case 80: goto st973;
-		case 82: goto st975;
-		case 83: goto st977;
-		case 111: goto st971;
-		case 112: goto st973;
-		case 114: goto st975;
-		case 115: goto st977;
+		case 82: goto st971;
+		case 114: goto st971;
 	}
-	goto tr2584;
+	goto tr2595;
 st971:
 	if ( ++p == pe )
 		goto _test_eof971;
 case 971:
-	switch( (*p) ) {
-		case 65: goto st972;
-		case 97: goto st972;
-	}
-	goto tr2584;
-st972:
-	if ( ++p == pe )
-		goto _test_eof972;
-case 972:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69898,27 +69840,31 @@ case 972:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2958;
-		case 32: goto tr2958;
-		case 40: goto tr2959;
-		case 41: goto tr2960;
-		case 1034: goto tr2961;
-		case 1083: goto tr2962;
-	}
-	goto tr2584;
-st973:
+		case 9: goto tr2938;
+		case 32: goto tr2938;
+		case 40: goto tr2939;
+		case 41: goto tr2940;
+		case 1034: goto tr2941;
+		case 1083: goto tr2942;
+	}
+	goto tr2595;
+st972:
 	if ( ++p == pe )
-		goto _test_eof973;
-case 973:
+		goto _test_eof972;
+case 972:
 	switch( (*p) ) {
-		case 70: goto st974;
-		case 102: goto st974;
+		case 80: goto st973;
+		case 82: goto st974;
+		case 84: goto st978;
+		case 112: goto st973;
+		case 114: goto st974;
+		case 116: goto st978;
 	}
-	goto tr2584;
-st974:
+	goto tr2595;
+st973:
 	if ( ++p == pe )
-		goto _test_eof974;
-case 974:
+		goto _test_eof973;
+case 973:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69932,27 +69878,45 @@ case 974:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2964;
-		case 32: goto tr2964;
-		case 40: goto tr2965;
-		case 41: goto tr2966;
-		case 1034: goto tr2967;
-		case 1083: goto tr2968;
-	}
-	goto tr2584;
+		case 9: goto tr2946;
+		case 32: goto tr2946;
+		case 40: goto tr2947;
+		case 41: goto tr2948;
+		case 1034: goto tr2949;
+		case 1083: goto tr2950;
+	}
+	goto tr2595;
+st974:
+	if ( ++p == pe )
+		goto _test_eof974;
+case 974:
+	switch( (*p) ) {
+		case 83: goto st975;
+		case 115: goto st975;
+	}
+	goto tr2595;
 st975:
 	if ( ++p == pe )
 		goto _test_eof975;
 case 975:
 	switch( (*p) ) {
-		case 86: goto st976;
-		case 118: goto st976;
+		case 73: goto st976;
+		case 105: goto st976;
 	}
-	goto tr2584;
+	goto tr2595;
 st976:
 	if ( ++p == pe )
 		goto _test_eof976;
 case 976:
+	switch( (*p) ) {
+		case 71: goto st977;
+		case 103: goto st977;
+	}
+	goto tr2595;
+st977:
+	if ( ++p == pe )
+		goto _test_eof977;
+case 977:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -69966,45 +69930,67 @@ case 976:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2970;
-		case 32: goto tr2970;
-		case 40: goto tr2971;
-		case 41: goto tr2972;
-		case 1034: goto tr2973;
-		case 1083: goto tr2974;
-	}
-	goto tr2584;
-st977:
-	if ( ++p == pe )
-		goto _test_eof977;
-case 977:
-	switch( (*p) ) {
-		case 72: goto st978;
-		case 104: goto st978;
-	}
-	goto tr2584;
+		case 9: goto tr2954;
+		case 32: goto tr2954;
+		case 40: goto tr2955;
+		case 41: goto tr2956;
+		case 1034: goto tr2957;
+		case 1083: goto tr2958;
+	}
+	goto tr2595;
 st978:
 	if ( ++p == pe )
 		goto _test_eof978;
 case 978:
-	switch( (*p) ) {
-		case 70: goto st979;
-		case 102: goto st979;
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
 	}
-	goto tr2584;
+	switch( _widec ) {
+		case 9: goto tr2959;
+		case 32: goto tr2959;
+		case 40: goto tr2960;
+		case 41: goto tr2961;
+		case 1034: goto tr2962;
+		case 1083: goto tr2963;
+	}
+	goto tr2595;
 st979:
 	if ( ++p == pe )
 		goto _test_eof979;
 case 979:
 	switch( (*p) ) {
-		case 80: goto st980;
-		case 112: goto st980;
-	}
-	goto tr2584;
+		case 79: goto st980;
+		case 80: goto st982;
+		case 82: goto st984;
+		case 83: goto st986;
+		case 111: goto st980;
+		case 112: goto st982;
+		case 114: goto st984;
+		case 115: goto st986;
+	}
+	goto tr2595;
 st980:
 	if ( ++p == pe )
 		goto _test_eof980;
 case 980:
+	switch( (*p) ) {
+		case 65: goto st981;
+		case 97: goto st981;
+	}
+	goto tr2595;
+st981:
+	if ( ++p == pe )
+		goto _test_eof981;
+case 981:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70018,49 +70004,27 @@ case 980:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2978;
-		case 32: goto tr2978;
-		case 40: goto tr2979;
-		case 41: goto tr2980;
-		case 1034: goto tr2981;
-		case 1083: goto tr2982;
-	}
-	goto tr2584;
-st981:
-	if ( ++p == pe )
-		goto _test_eof981;
-case 981:
-	switch( (*p) ) {
-		case 76: goto st982;
-		case 88: goto st985;
-		case 89: goto st987;
-		case 108: goto st982;
-		case 120: goto st985;
-		case 121: goto st987;
-	}
-	goto tr2584;
+		case 9: goto tr2969;
+		case 32: goto tr2969;
+		case 40: goto tr2970;
+		case 41: goto tr2971;
+		case 1034: goto tr2972;
+		case 1083: goto tr2973;
+	}
+	goto tr2595;
 st982:
 	if ( ++p == pe )
 		goto _test_eof982;
 case 982:
 	switch( (*p) ) {
-		case 83: goto st983;
-		case 115: goto st983;
+		case 70: goto st983;
+		case 102: goto st983;
 	}
-	goto tr2584;
+	goto tr2595;
 st983:
 	if ( ++p == pe )
 		goto _test_eof983;
 case 983:
-	switch( (*p) ) {
-		case 65: goto st984;
-		case 97: goto st984;
-	}
-	goto tr2584;
-st984:
-	if ( ++p == pe )
-		goto _test_eof984;
-case 984:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70074,27 +70038,27 @@ case 984:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2988;
-		case 32: goto tr2988;
-		case 40: goto tr2989;
-		case 41: goto tr2990;
-		case 1034: goto tr2991;
-		case 1083: goto tr2992;
-	}
-	goto tr2584;
-st985:
+		case 9: goto tr2975;
+		case 32: goto tr2975;
+		case 40: goto tr2976;
+		case 41: goto tr2977;
+		case 1034: goto tr2978;
+		case 1083: goto tr2979;
+	}
+	goto tr2595;
+st984:
 	if ( ++p == pe )
-		goto _test_eof985;
-case 985:
+		goto _test_eof984;
+case 984:
 	switch( (*p) ) {
-		case 84: goto st986;
-		case 116: goto st986;
+		case 86: goto st985;
+		case 118: goto st985;
 	}
-	goto tr2584;
-st986:
+	goto tr2595;
+st985:
 	if ( ++p == pe )
-		goto _test_eof986;
-case 986:
+		goto _test_eof985;
+case 985:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70108,40 +70072,182 @@ case 986:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr2994;
-		case 32: goto tr2994;
-		case 40: goto tr2995;
-		case 41: goto tr2996;
-		case 1034: goto tr2997;
-		case 1083: goto tr2998;
-	}
-	goto tr2584;
+		case 9: goto tr2981;
+		case 32: goto tr2981;
+		case 40: goto tr2982;
+		case 41: goto tr2983;
+		case 1034: goto tr2984;
+		case 1083: goto tr2985;
+	}
+	goto tr2595;
+st986:
+	if ( ++p == pe )
+		goto _test_eof986;
+case 986:
+	switch( (*p) ) {
+		case 72: goto st987;
+		case 104: goto st987;
+	}
+	goto tr2595;
 st987:
 	if ( ++p == pe )
 		goto _test_eof987;
 case 987:
 	switch( (*p) ) {
-		case 80: goto st988;
-		case 112: goto st988;
+		case 70: goto st988;
+		case 102: goto st988;
 	}
-	goto tr2584;
+	goto tr2595;
 st988:
 	if ( ++p == pe )
 		goto _test_eof988;
 case 988:
 	switch( (*p) ) {
-		case 69: goto st989;
-		case 101: goto st989;
+		case 80: goto st989;
+		case 112: goto st989;
 	}
-	goto tr2584;
+	goto tr2595;
 st989:
 	if ( ++p == pe )
 		goto _test_eof989;
 case 989:
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
+	}
+	switch( _widec ) {
+		case 9: goto tr2989;
+		case 32: goto tr2989;
+		case 40: goto tr2990;
+		case 41: goto tr2991;
+		case 1034: goto tr2992;
+		case 1083: goto tr2993;
+	}
+	goto tr2595;
+st990:
+	if ( ++p == pe )
+		goto _test_eof990;
+case 990:
+	switch( (*p) ) {
+		case 76: goto st991;
+		case 88: goto st994;
+		case 89: goto st996;
+		case 108: goto st991;
+		case 120: goto st994;
+		case 121: goto st996;
+	}
+	goto tr2595;
+st991:
+	if ( ++p == pe )
+		goto _test_eof991;
+case 991:
+	switch( (*p) ) {
+		case 83: goto st992;
+		case 115: goto st992;
+	}
+	goto tr2595;
+st992:
+	if ( ++p == pe )
+		goto _test_eof992;
+case 992:
+	switch( (*p) ) {
+		case 65: goto st993;
+		case 97: goto st993;
+	}
+	goto tr2595;
+st993:
+	if ( ++p == pe )
+		goto _test_eof993;
+case 993:
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
+	}
+	switch( _widec ) {
+		case 9: goto tr2999;
+		case 32: goto tr2999;
+		case 40: goto tr3000;
+		case 41: goto tr3001;
+		case 1034: goto tr3002;
+		case 1083: goto tr3003;
+	}
+	goto tr2595;
+st994:
+	if ( ++p == pe )
+		goto _test_eof994;
+case 994:
+	switch( (*p) ) {
+		case 84: goto st995;
+		case 116: goto st995;
+	}
+	goto tr2595;
+st995:
+	if ( ++p == pe )
+		goto _test_eof995;
+case 995:
+	_widec = (*p);
+	if ( (*p) > 10 ) {
+		if ( 59 <= (*p) && (*p) <= 59 ) {
+			_widec = (short)(640 + ((*p) - -128));
+			if (
+ s->multiline  ) _widec += 256;
+		}
+	} else if ( (*p) >= 10 ) {
+		_widec = (short)(640 + ((*p) - -128));
+		if (
+ s->multiline  ) _widec += 256;
+	}
+	switch( _widec ) {
+		case 9: goto tr3005;
+		case 32: goto tr3005;
+		case 40: goto tr3006;
+		case 41: goto tr3007;
+		case 1034: goto tr3008;
+		case 1083: goto tr3009;
+	}
+	goto tr2595;
+st996:
+	if ( ++p == pe )
+		goto _test_eof996;
+case 996:
+	switch( (*p) ) {
+		case 80: goto st997;
+		case 112: goto st997;
+	}
+	goto tr2595;
+st997:
+	if ( ++p == pe )
+		goto _test_eof997;
+case 997:
+	switch( (*p) ) {
+		case 69: goto st998;
+		case 101: goto st998;
+	}
+	goto tr2595;
+st998:
+	if ( ++p == pe )
+		goto _test_eof998;
+case 998:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3002;
-	goto tr3001;
-tr3002:
+		goto tr3013;
+	goto tr3012;
+tr3013:
 	{
 		s->number64 = 0;
 	}
@@ -70159,8 +70265,8 @@ tr3002:
 			p--; {goto st261;}
 		}
 	}
-	goto st990;
-tr3006:
+	goto st999;
+tr3017:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -70175,11 +70281,11 @@ tr3006:
 			p--; {goto st261;}
 		}
 	}
-	goto st990;
-st990:
+	goto st999;
+st999:
 	if ( ++p == pe )
-		goto _test_eof990;
-case 990:
+		goto _test_eof999;
+case 999:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70193,38 +70299,38 @@ case 990:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3003;
-		case 32: goto tr3003;
-		case 40: goto tr3004;
-		case 41: goto tr3005;
-		case 1034: goto tr3007;
-		case 1083: goto tr3008;
+		case 9: goto tr3014;
+		case 32: goto tr3014;
+		case 40: goto tr3015;
+		case 41: goto tr3016;
+		case 1034: goto tr3018;
+		case 1083: goto tr3019;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3006;
-	goto tr3001;
-st991:
+		goto tr3017;
+	goto tr3012;
+st1000:
 	if ( ++p == pe )
-		goto _test_eof991;
-case 991:
+		goto _test_eof1000;
+case 1000:
 	switch( (*p) ) {
-		case 82: goto st992;
-		case 114: goto st992;
+		case 82: goto st1001;
+		case 114: goto st1001;
 	}
-	goto tr2584;
-st992:
+	goto tr2595;
+st1001:
 	if ( ++p == pe )
-		goto _test_eof992;
-case 992:
+		goto _test_eof1001;
+case 1001:
 	switch( (*p) ) {
-		case 73: goto st993;
-		case 105: goto st993;
+		case 73: goto st1002;
+		case 105: goto st1002;
 	}
-	goto tr2584;
-st993:
+	goto tr2595;
+st1002:
 	if ( ++p == pe )
-		goto _test_eof993;
-case 993:
+		goto _test_eof1002;
+case 1002:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70238,90 +70344,90 @@ case 993:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3011;
-		case 32: goto tr3011;
-		case 40: goto tr3012;
-		case 41: goto tr3013;
-		case 1034: goto tr3014;
-		case 1083: goto tr3015;
-	}
-	goto tr2584;
-st994:
+		case 9: goto tr3022;
+		case 32: goto tr3022;
+		case 40: goto tr3023;
+		case 41: goto tr3024;
+		case 1034: goto tr3025;
+		case 1083: goto tr3026;
+	}
+	goto tr2595;
+st1003:
 	if ( ++p == pe )
-		goto _test_eof994;
-case 994:
+		goto _test_eof1003;
+case 1003:
 	switch( (*p) ) {
-		case 42: goto tr3016;
-		case 92: goto tr3016;
-		case 95: goto tr3016;
+		case 42: goto tr3027;
+		case 92: goto tr3027;
+		case 95: goto tr3027;
 	}
 	if ( (*p) < 64 ) {
 		if ( 45 <= (*p) && (*p) <= 57 )
-			goto tr3016;
+			goto tr3027;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr3016;
+			goto tr3027;
 	} else
-		goto tr3016;
+		goto tr3027;
 	goto tr71;
-tr3016:
+tr3027:
 	{
 		s->dname = rdata_tail;
 	}
-	{ p--; {stack[top++] = 995; goto st263;} }
-	goto st995;
-st995:
+	{ p--; {stack[top++] = 1004; goto st263;} }
+	goto st1004;
+st1004:
 	if ( ++p == pe )
-		goto _test_eof995;
-case 995:
+		goto _test_eof1004;
+case 1004:
 	switch( (*p) ) {
-		case 32: goto tr3017;
-		case 59: goto tr3017;
+		case 32: goto tr3028;
+		case 59: goto tr3028;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3017;
+			goto tr3028;
 	} else if ( (*p) >= 9 )
-		goto tr3017;
+		goto tr3028;
 	goto tr71;
-tr3017:
+tr3028:
 	{
 		rdata_tail += s->dname_tmp_length;
 	}
-	{ p--; {stack[top++] = 996; goto st329;} }
-	goto st996;
-st996:
+	{ p--; {stack[top++] = 1005; goto st329;} }
+	goto st1005;
+st1005:
 	if ( ++p == pe )
-		goto _test_eof996;
-case 996:
+		goto _test_eof1005;
+case 1005:
 	switch( (*p) ) {
-		case 32: goto tr3018;
-		case 59: goto tr3018;
+		case 32: goto tr3029;
+		case 59: goto tr3029;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3018;
+			goto tr3029;
 	} else if ( (*p) >= 9 )
-		goto tr3018;
+		goto tr3029;
 	goto tr71;
-tr3018:
+tr3029:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1184;
-st1184:
+	goto st1193;
+st1193:
 	if ( ++p == pe )
-		goto _test_eof1184;
-case 1184:
+		goto _test_eof1193;
+case 1193:
 	goto st0;
-st997:
+st1006:
 	if ( ++p == pe )
-		goto _test_eof997;
-case 997:
+		goto _test_eof1006;
+case 1006:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3019;
-	goto tr1746;
-tr3019:
+		goto tr3030;
+	goto tr1757;
+tr3030:
 	{
 		s->number64 = 0;
 	}
@@ -70339,8 +70445,8 @@ tr3019:
 			p--; {goto st261;}
 		}
 	}
-	goto st998;
-tr3023:
+	goto st1007;
+tr3034:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -70355,11 +70461,11 @@ tr3023:
 			p--; {goto st261;}
 		}
 	}
-	goto st998;
-st998:
+	goto st1007;
+st1007:
 	if ( ++p == pe )
-		goto _test_eof998;
-case 998:
+		goto _test_eof1007;
+case 1007:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70373,17 +70479,17 @@ case 998:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3020;
-		case 32: goto tr3020;
-		case 40: goto tr3021;
-		case 41: goto tr3022;
-		case 1034: goto tr3024;
-		case 1083: goto tr3025;
+		case 9: goto tr3031;
+		case 32: goto tr3031;
+		case 40: goto tr3032;
+		case 41: goto tr3033;
+		case 1034: goto tr3035;
+		case 1083: goto tr3036;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3023;
-	goto tr1746;
-tr3027:
+		goto tr3034;
+	goto tr1757;
+tr3038:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -70391,8 +70497,8 @@ tr3027:
 		}
 		s->multiline = true;
 	}
-	goto st999;
-tr3028:
+	goto st1008;
+tr3039:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -70400,13 +70506,13 @@ tr3028:
 		}
 		s->multiline = false;
 	}
-	goto st999;
-tr3030:
+	goto st1008;
+tr3041:
 	{
 		s->line_counter++;
 	}
-	goto st999;
-tr3020:
+	goto st1008;
+tr3031:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -70416,8 +70522,8 @@ tr3020:
 			p--; {goto st261;}
 		}
 	}
-	goto st999;
-tr3021:
+	goto st1008;
+tr3032:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -70434,8 +70540,8 @@ tr3021:
 		}
 		s->multiline = true;
 	}
-	goto st999;
-tr3022:
+	goto st1008;
+tr3033:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -70452,8 +70558,8 @@ tr3022:
 		}
 		s->multiline = false;
 	}
-	goto st999;
-tr3024:
+	goto st1008;
+tr3035:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -70466,11 +70572,11 @@ tr3024:
 	{
 		s->line_counter++;
 	}
-	goto st999;
-st999:
+	goto st1008;
+st1008:
 	if ( ++p == pe )
-		goto _test_eof999;
-case 999:
+		goto _test_eof1008;
+case 1008:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70484,17 +70590,17 @@ case 999:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st999;
-		case 32: goto st999;
-		case 40: goto tr3027;
-		case 41: goto tr3028;
-		case 1034: goto tr3030;
-		case 1083: goto st1007;
+		case 9: goto st1008;
+		case 32: goto st1008;
+		case 40: goto tr3038;
+		case 41: goto tr3039;
+		case 1034: goto tr3041;
+		case 1083: goto st1016;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3029;
-	goto tr1746;
-tr3029:
+		goto tr3040;
+	goto tr1757;
+tr3040:
 	{
 		s->number64 = 0;
 	}
@@ -70512,8 +70618,8 @@ tr3029:
 			p--; {goto st261;}
 		}
 	}
-	goto st1000;
-tr3035:
+	goto st1009;
+tr3046:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -70528,11 +70634,11 @@ tr3035:
 			p--; {goto st261;}
 		}
 	}
-	goto st1000;
-st1000:
+	goto st1009;
+st1009:
 	if ( ++p == pe )
-		goto _test_eof1000;
-case 1000:
+		goto _test_eof1009;
+case 1009:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70546,17 +70652,17 @@ case 1000:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3032;
-		case 32: goto tr3032;
-		case 40: goto tr3033;
-		case 41: goto tr3034;
-		case 1034: goto tr3036;
-		case 1083: goto tr3037;
+		case 9: goto tr3043;
+		case 32: goto tr3043;
+		case 40: goto tr3044;
+		case 41: goto tr3045;
+		case 1034: goto tr3047;
+		case 1083: goto tr3048;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3035;
-	goto tr1746;
-tr3039:
+		goto tr3046;
+	goto tr1757;
+tr3050:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -70564,8 +70670,8 @@ tr3039:
 		}
 		s->multiline = true;
 	}
-	goto st1001;
-tr3040:
+	goto st1010;
+tr3051:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -70573,13 +70679,13 @@ tr3040:
 		}
 		s->multiline = false;
 	}
-	goto st1001;
-tr3042:
+	goto st1010;
+tr3053:
 	{
 		s->line_counter++;
 	}
-	goto st1001;
-tr3032:
+	goto st1010;
+tr3043:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -70589,8 +70695,8 @@ tr3032:
 			p--; {goto st261;}
 		}
 	}
-	goto st1001;
-tr3033:
+	goto st1010;
+tr3044:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -70607,8 +70713,8 @@ tr3033:
 		}
 		s->multiline = true;
 	}
-	goto st1001;
-tr3034:
+	goto st1010;
+tr3045:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -70625,8 +70731,8 @@ tr3034:
 		}
 		s->multiline = false;
 	}
-	goto st1001;
-tr3036:
+	goto st1010;
+tr3047:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -70639,11 +70745,11 @@ tr3036:
 	{
 		s->line_counter++;
 	}
-	goto st1001;
-st1001:
+	goto st1010;
+st1010:
 	if ( ++p == pe )
-		goto _test_eof1001;
-case 1001:
+		goto _test_eof1010;
+case 1010:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70657,29 +70763,29 @@ case 1001:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1001;
-		case 32: goto st1001;
-		case 40: goto tr3039;
-		case 41: goto tr3040;
-		case 1034: goto tr3042;
-		case 1083: goto st1006;
+		case 9: goto st1010;
+		case 32: goto st1010;
+		case 40: goto tr3050;
+		case 41: goto tr3051;
+		case 1034: goto tr3053;
+		case 1083: goto st1015;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3041;
+			goto tr3052;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr3041;
+			goto tr3052;
 	} else
-		goto tr3041;
+		goto tr3052;
 	goto tr71;
-tr3041:
-	{ p--; {stack[top++] = 1002; goto st480;} }
-	goto st1002;
-st1002:
+tr3052:
+	{ p--; {stack[top++] = 1011; goto st480;} }
+	goto st1011;
+st1011:
 	if ( ++p == pe )
-		goto _test_eof1002;
-case 1002:
+		goto _test_eof1011;
+case 1011:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70693,15 +70799,15 @@ case 1002:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1003;
-		case 32: goto st1003;
-		case 40: goto tr3045;
-		case 41: goto tr3046;
-		case 1034: goto tr3047;
-		case 1083: goto st1005;
+		case 9: goto st1012;
+		case 32: goto st1012;
+		case 40: goto tr3056;
+		case 41: goto tr3057;
+		case 1034: goto tr3058;
+		case 1083: goto st1014;
 	}
 	goto tr71;
-tr3045:
+tr3056:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -70709,8 +70815,8 @@ tr3045:
 		}
 		s->multiline = true;
 	}
-	goto st1003;
-tr3046:
+	goto st1012;
+tr3057:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -70718,16 +70824,16 @@ tr3046:
 		}
 		s->multiline = false;
 	}
-	goto st1003;
-tr3047:
+	goto st1012;
+tr3058:
 	{
 		s->line_counter++;
 	}
-	goto st1003;
-st1003:
+	goto st1012;
+st1012:
 	if ( ++p == pe )
-		goto _test_eof1003;
-case 1003:
+		goto _test_eof1012;
+case 1012:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70741,30 +70847,30 @@ case 1003:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1003;
-		case 32: goto st1003;
-		case 40: goto tr3045;
-		case 41: goto tr3046;
-		case 43: goto tr3049;
-		case 1034: goto tr3047;
-		case 1083: goto st1005;
+		case 9: goto st1012;
+		case 32: goto st1012;
+		case 40: goto tr3056;
+		case 41: goto tr3057;
+		case 43: goto tr3060;
+		case 1034: goto tr3058;
+		case 1083: goto st1014;
 	}
 	if ( _widec < 65 ) {
 		if ( 47 <= _widec && _widec <= 57 )
-			goto tr3049;
+			goto tr3060;
 	} else if ( _widec > 90 ) {
 		if ( 97 <= _widec && _widec <= 122 )
-			goto tr3049;
+			goto tr3060;
 	} else
-		goto tr3049;
+		goto tr3060;
 	goto tr71;
-tr3049:
-	{ p--; {stack[top++] = 1004; goto st322;} }
-	goto st1004;
-st1004:
+tr3060:
+	{ p--; {stack[top++] = 1013; goto st322;} }
+	goto st1013;
+st1013:
 	if ( ++p == pe )
-		goto _test_eof1004;
-case 1004:
+		goto _test_eof1013;
+case 1013:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70778,24 +70884,24 @@ case 1004:
  !s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 1546: goto tr3050;
-		case 1595: goto tr3050;
+		case 1546: goto tr3061;
+		case 1595: goto tr3061;
 	}
 	goto tr71;
-tr3050:
+tr3061:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1185;
-st1185:
+	goto st1194;
+st1194:
 	if ( ++p == pe )
-		goto _test_eof1185;
-case 1185:
+		goto _test_eof1194;
+case 1194:
 	goto st0;
-st1005:
+st1014:
 	if ( ++p == pe )
-		goto _test_eof1005;
-case 1005:
+		goto _test_eof1014;
+case 1014:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -70815,11 +70921,11 @@ case 1005:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3047;
+		goto tr3058;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1005;
+		goto st1014;
 	goto tr71;
-tr3037:
+tr3048:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -70829,11 +70935,11 @@ tr3037:
 			p--; {goto st261;}
 		}
 	}
-	goto st1006;
-st1006:
+	goto st1015;
+st1015:
 	if ( ++p == pe )
-		goto _test_eof1006;
-case 1006:
+		goto _test_eof1015;
+case 1015:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -70853,11 +70959,11 @@ case 1006:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3042;
+		goto tr3053;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1006;
+		goto st1015;
 	goto tr71;
-tr3025:
+tr3036:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -70867,11 +70973,11 @@ tr3025:
 			p--; {goto st261;}
 		}
 	}
-	goto st1007;
-st1007:
+	goto st1016;
+st1016:
 	if ( ++p == pe )
-		goto _test_eof1007;
-case 1007:
+		goto _test_eof1016;
+case 1016:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -70891,32 +70997,32 @@ case 1007:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3030;
+		goto tr3041;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1007;
+		goto st1016;
 	goto tr71;
-st1008:
+st1017:
 	if ( ++p == pe )
-		goto _test_eof1008;
-case 1008:
+		goto _test_eof1017;
+case 1017:
 	if ( (*p) == 43 )
-		goto tr3051;
+		goto tr3062;
 	if ( (*p) < 65 ) {
 		if ( 47 <= (*p) && (*p) <= 57 )
-			goto tr3051;
+			goto tr3062;
 	} else if ( (*p) > 90 ) {
 		if ( 97 <= (*p) && (*p) <= 122 )
-			goto tr3051;
+			goto tr3062;
 	} else
-		goto tr3051;
+		goto tr3062;
 	goto tr71;
-tr3051:
-	{ p--; {stack[top++] = 1009; goto st322;} }
-	goto st1009;
-st1009:
+tr3062:
+	{ p--; {stack[top++] = 1018; goto st322;} }
+	goto st1018;
+st1018:
 	if ( ++p == pe )
-		goto _test_eof1009;
-case 1009:
+		goto _test_eof1018;
+case 1018:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -70930,28 +71036,28 @@ case 1009:
  !s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 1546: goto tr3052;
-		case 1595: goto tr3052;
+		case 1546: goto tr3063;
+		case 1595: goto tr3063;
 	}
 	goto tr71;
-tr3052:
+tr3063:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1186;
-st1186:
+	goto st1195;
+st1195:
 	if ( ++p == pe )
-		goto _test_eof1186;
-case 1186:
+		goto _test_eof1195;
+case 1195:
 	goto st0;
-st1010:
+st1019:
 	if ( ++p == pe )
-		goto _test_eof1010;
-case 1010:
+		goto _test_eof1019;
+case 1019:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3053;
-	goto tr1746;
-tr3053:
+		goto tr3064;
+	goto tr1757;
+tr3064:
 	{
 		s->number64 = 0;
 	}
@@ -70969,8 +71075,8 @@ tr3053:
 			p--; {goto st261;}
 		}
 	}
-	goto st1011;
-tr3057:
+	goto st1020;
+tr3068:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -70985,11 +71091,11 @@ tr3057:
 			p--; {goto st261;}
 		}
 	}
-	goto st1011;
-st1011:
+	goto st1020;
+st1020:
 	if ( ++p == pe )
-		goto _test_eof1011;
-case 1011:
+		goto _test_eof1020;
+case 1020:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71003,17 +71109,17 @@ case 1011:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3054;
-		case 32: goto tr3054;
-		case 40: goto tr3055;
-		case 41: goto tr3056;
-		case 1034: goto tr3058;
-		case 1083: goto tr3059;
+		case 9: goto tr3065;
+		case 32: goto tr3065;
+		case 40: goto tr3066;
+		case 41: goto tr3067;
+		case 1034: goto tr3069;
+		case 1083: goto tr3070;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3057;
-	goto tr1746;
-tr3061:
+		goto tr3068;
+	goto tr1757;
+tr3072:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -71021,8 +71127,8 @@ tr3061:
 		}
 		s->multiline = true;
 	}
-	goto st1012;
-tr3062:
+	goto st1021;
+tr3073:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -71030,13 +71136,13 @@ tr3062:
 		}
 		s->multiline = false;
 	}
-	goto st1012;
-tr3064:
+	goto st1021;
+tr3075:
 	{
 		s->line_counter++;
 	}
-	goto st1012;
-tr3054:
+	goto st1021;
+tr3065:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71046,8 +71152,8 @@ tr3054:
 			p--; {goto st261;}
 		}
 	}
-	goto st1012;
-tr3055:
+	goto st1021;
+tr3066:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71064,8 +71170,8 @@ tr3055:
 		}
 		s->multiline = true;
 	}
-	goto st1012;
-tr3056:
+	goto st1021;
+tr3067:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71082,8 +71188,8 @@ tr3056:
 		}
 		s->multiline = false;
 	}
-	goto st1012;
-tr3058:
+	goto st1021;
+tr3069:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71096,11 +71202,11 @@ tr3058:
 	{
 		s->line_counter++;
 	}
-	goto st1012;
-st1012:
+	goto st1021;
+st1021:
 	if ( ++p == pe )
-		goto _test_eof1012;
-case 1012:
+		goto _test_eof1021;
+case 1021:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71114,17 +71220,17 @@ case 1012:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1012;
-		case 32: goto st1012;
-		case 40: goto tr3061;
-		case 41: goto tr3062;
-		case 1034: goto tr3064;
-		case 1083: goto st1038;
+		case 9: goto st1021;
+		case 32: goto st1021;
+		case 40: goto tr3072;
+		case 41: goto tr3073;
+		case 1034: goto tr3075;
+		case 1083: goto st1047;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3063;
-	goto tr1746;
-tr3063:
+		goto tr3074;
+	goto tr1757;
+tr3074:
 	{
 		s->number64 = 0;
 	}
@@ -71142,8 +71248,8 @@ tr3063:
 			p--; {goto st261;}
 		}
 	}
-	goto st1013;
-tr3069:
+	goto st1022;
+tr3080:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -71158,11 +71264,11 @@ tr3069:
 			p--; {goto st261;}
 		}
 	}
-	goto st1013;
-st1013:
+	goto st1022;
+st1022:
 	if ( ++p == pe )
-		goto _test_eof1013;
-case 1013:
+		goto _test_eof1022;
+case 1022:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71176,17 +71282,17 @@ case 1013:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3066;
-		case 32: goto tr3066;
-		case 40: goto tr3067;
-		case 41: goto tr3068;
-		case 1034: goto tr3070;
-		case 1083: goto tr3071;
+		case 9: goto tr3077;
+		case 32: goto tr3077;
+		case 40: goto tr3078;
+		case 41: goto tr3079;
+		case 1034: goto tr3081;
+		case 1083: goto tr3082;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3069;
-	goto tr1746;
-tr3073:
+		goto tr3080;
+	goto tr1757;
+tr3084:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -71194,8 +71300,8 @@ tr3073:
 		}
 		s->multiline = true;
 	}
-	goto st1014;
-tr3074:
+	goto st1023;
+tr3085:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -71203,13 +71309,13 @@ tr3074:
 		}
 		s->multiline = false;
 	}
-	goto st1014;
-tr3076:
+	goto st1023;
+tr3087:
 	{
 		s->line_counter++;
 	}
-	goto st1014;
-tr3066:
+	goto st1023;
+tr3077:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71219,8 +71325,8 @@ tr3066:
 			p--; {goto st261;}
 		}
 	}
-	goto st1014;
-tr3067:
+	goto st1023;
+tr3078:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71237,8 +71343,8 @@ tr3067:
 		}
 		s->multiline = true;
 	}
-	goto st1014;
-tr3068:
+	goto st1023;
+tr3079:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71255,8 +71361,8 @@ tr3068:
 		}
 		s->multiline = false;
 	}
-	goto st1014;
-tr3070:
+	goto st1023;
+tr3081:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -71269,11 +71375,11 @@ tr3070:
 	{
 		s->line_counter++;
 	}
-	goto st1014;
-st1014:
+	goto st1023;
+st1023:
 	if ( ++p == pe )
-		goto _test_eof1014;
-case 1014:
+		goto _test_eof1023;
+case 1023:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71287,17 +71393,17 @@ case 1014:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1014;
-		case 32: goto st1014;
-		case 40: goto tr3073;
-		case 41: goto tr3074;
-		case 1034: goto tr3076;
-		case 1083: goto st1037;
+		case 9: goto st1023;
+		case 32: goto st1023;
+		case 40: goto tr3084;
+		case 41: goto tr3085;
+		case 1034: goto tr3087;
+		case 1083: goto st1046;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3075;
-	goto tr1746;
-tr3075:
+		goto tr3086;
+	goto tr1757;
+tr3086:
 	{
 		s->number64 = 0;
 	}
@@ -71315,8 +71421,8 @@ tr3075:
 			p--; {goto st261;}
 		}
 	}
-	goto st1015;
-tr3081:
+	goto st1024;
+tr3092:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -71331,11 +71437,11 @@ tr3081:
 			p--; {goto st261;}
 		}
 	}
-	goto st1015;
-st1015:
+	goto st1024;
+st1024:
 	if ( ++p == pe )
-		goto _test_eof1015;
-case 1015:
+		goto _test_eof1024;
+case 1024:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71349,17 +71455,17 @@ case 1015:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3078;
-		case 32: goto tr3078;
-		case 40: goto tr3079;
-		case 41: goto tr3080;
-		case 1034: goto tr3082;
-		case 1083: goto tr3083;
+		case 9: goto tr3089;
+		case 32: goto tr3089;
+		case 40: goto tr3090;
+		case 41: goto tr3091;
+		case 1034: goto tr3093;
+		case 1083: goto tr3094;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3081;
-	goto tr1746;
-tr3085:
+		goto tr3092;
+	goto tr1757;
+tr3096:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -71367,8 +71473,8 @@ tr3085:
 		}
 		s->multiline = true;
 	}
-	goto st1016;
-tr3086:
+	goto st1025;
+tr3097:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -71376,13 +71482,13 @@ tr3086:
 		}
 		s->multiline = false;
 	}
-	goto st1016;
-tr3089:
+	goto st1025;
+tr3100:
 	{
 		s->line_counter++;
 	}
-	goto st1016;
-tr3078:
+	goto st1025;
+tr3089:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -71392,8 +71498,8 @@ tr3078:
 			p--; {goto st261;}
 		}
 	}
-	goto st1016;
-tr3079:
+	goto st1025;
+tr3090:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -71410,8 +71516,8 @@ tr3079:
 		}
 		s->multiline = true;
 	}
-	goto st1016;
-tr3080:
+	goto st1025;
+tr3091:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -71428,8 +71534,8 @@ tr3080:
 		}
 		s->multiline = false;
 	}
-	goto st1016;
-tr3082:
+	goto st1025;
+tr3093:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -71442,11 +71548,11 @@ tr3082:
 	{
 		s->line_counter++;
 	}
-	goto st1016;
-st1016:
+	goto st1025;
+st1025:
 	if ( ++p == pe )
-		goto _test_eof1016;
-case 1016:
+		goto _test_eof1025;
+case 1025:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71460,24 +71566,24 @@ case 1016:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1016;
-		case 32: goto st1016;
-		case 40: goto tr3085;
-		case 41: goto tr3086;
-		case 45: goto tr3087;
-		case 1034: goto tr3089;
-		case 1083: goto st1036;
+		case 9: goto st1025;
+		case 32: goto st1025;
+		case 40: goto tr3096;
+		case 41: goto tr3097;
+		case 45: goto tr3098;
+		case 1034: goto tr3100;
+		case 1083: goto st1045;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3088;
+			goto tr3099;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr3088;
+			goto tr3099;
 	} else
-		goto tr3088;
-	goto tr2349;
-tr3087:
+		goto tr3099;
+	goto tr2360;
+tr3098:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -71486,11 +71592,11 @@ tr3087:
 			p--; {goto st261;}
 		}
 	}
-	goto st1017;
-st1017:
+	goto st1026;
+st1026:
 	if ( ++p == pe )
-		goto _test_eof1017;
-case 1017:
+		goto _test_eof1026;
+case 1026:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71504,15 +71610,15 @@ case 1017:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3091;
-		case 32: goto tr3091;
-		case 40: goto tr3092;
-		case 41: goto tr3093;
-		case 1034: goto tr3094;
-		case 1083: goto tr3095;
-	}
-	goto tr2349;
-tr3098:
+		case 9: goto tr3102;
+		case 32: goto tr3102;
+		case 40: goto tr3103;
+		case 41: goto tr3104;
+		case 1034: goto tr3105;
+		case 1083: goto tr3106;
+	}
+	goto tr2360;
+tr3109:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -71520,8 +71626,8 @@ tr3098:
 		}
 		s->multiline = true;
 	}
-	goto st1018;
-tr3099:
+	goto st1027;
+tr3110:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -71529,13 +71635,13 @@ tr3099:
 		}
 		s->multiline = false;
 	}
-	goto st1018;
-tr3101:
+	goto st1027;
+tr3112:
 	{
 		s->line_counter++;
 	}
-	goto st1018;
-tr3091:
+	goto st1027;
+tr3102:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -71546,8 +71652,8 @@ tr3091:
 			p--; {goto st261;}
 		}
 	}
-	goto st1018;
-tr3092:
+	goto st1027;
+tr3103:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -71565,8 +71671,8 @@ tr3092:
 		}
 		s->multiline = true;
 	}
-	goto st1018;
-tr3093:
+	goto st1027;
+tr3104:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -71584,8 +71690,8 @@ tr3093:
 		}
 		s->multiline = false;
 	}
-	goto st1018;
-tr3094:
+	goto st1027;
+tr3105:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -71599,11 +71705,11 @@ tr3094:
 	{
 		s->line_counter++;
 	}
-	goto st1018;
-st1018:
+	goto st1027;
+st1027:
 	if ( ++p == pe )
-		goto _test_eof1018;
-case 1018:
+		goto _test_eof1027;
+case 1027:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -71617,23 +71723,23 @@ case 1018:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1018;
-		case 32: goto st1018;
-		case 40: goto tr3098;
-		case 41: goto tr3099;
-		case 1034: goto tr3101;
-		case 1083: goto st1033;
+		case 9: goto st1027;
+		case 32: goto st1027;
+		case 40: goto tr3109;
+		case 41: goto tr3110;
+		case 1034: goto tr3112;
+		case 1083: goto st1042;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3100;
+			goto tr3111;
 	} else if ( _widec > 86 ) {
 		if ( 97 <= _widec && _widec <= 118 )
-			goto tr3100;
+			goto tr3111;
 	} else
-		goto tr3100;
-	goto tr3096;
-tr3100:
+		goto tr3111;
+	goto tr3107;
+tr3111:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -71650,8 +71756,8 @@ tr3100:
 			p--; {goto st261;}
 		}
 	}
-	goto st1019;
-tr3115:
+	goto st1028;
+tr3126:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_base32hex_to_num[(uint8_t)(*p)];
@@ -71660,21 +71766,21 @@ tr3115:
 			p--; {goto st261;}
 		}
 	}
-	goto st1019;
-st1019:
+	goto st1028;
+st1028:
 	if ( ++p == pe )
-		goto _test_eof1019;
-case 1019:
+		goto _test_eof1028;
+case 1028:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3103;
+			goto tr3114;
 	} else if ( (*p) > 86 ) {
 		if ( 97 <= (*p) && (*p) <= 118 )
-			goto tr3103;
+			goto tr3114;
 	} else
-		goto tr3103;
-	goto tr3096;
-tr3103:
+		goto tr3114;
+	goto tr3107;
+tr3114:
 	{
 		*(rdata_tail++) += second_left_base32hex_to_num[(uint8_t)(*p)];
 
@@ -71685,41 +71791,41 @@ tr3103:
 			p--; {goto st261;}
 		}
 	}
-	goto st1020;
-st1020:
+	goto st1029;
+st1029:
 	if ( ++p == pe )
-		goto _test_eof1020;
-case 1020:
+		goto _test_eof1029;
+case 1029:
 	if ( (*p) == 61 )
-		goto st1031;
+		goto st1040;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3104;
+			goto tr3115;
 	} else if ( (*p) > 86 ) {
 		if ( 97 <= (*p) && (*p) <= 118 )
-			goto tr3104;
+			goto tr3115;
 	} else
-		goto tr3104;
-	goto tr3096;
-tr3104:
+		goto tr3115;
+	goto tr3107;
+tr3115:
 	{
 		*rdata_tail += third_base32hex_to_num[(uint8_t)(*p)];
 	}
-	goto st1021;
-st1021:
+	goto st1030;
+st1030:
 	if ( ++p == pe )
-		goto _test_eof1021;
-case 1021:
+		goto _test_eof1030;
+case 1030:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3106;
+			goto tr3117;
 	} else if ( (*p) > 86 ) {
 		if ( 97 <= (*p) && (*p) <= 118 )
-			goto tr3106;
+			goto tr3117;
 	} else
-		goto tr3106;
-	goto tr3096;
-tr3106:
+		goto tr3117;
+	goto tr3107;
+tr3117:
 	{
 		*(rdata_tail++) += fourth_left_base32hex_to_num[(uint8_t)(*p)];
 
@@ -71730,23 +71836,23 @@ tr3106:
 			p--; {goto st261;}
 		}
 	}
-	goto st1022;
-st1022:
+	goto st1031;
+st1031:
 	if ( ++p == pe )
-		goto _test_eof1022;
-case 1022:
+		goto _test_eof1031;
+case 1031:
 	if ( (*p) == 61 )
-		goto st1030;
+		goto st1039;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3107;
+			goto tr3118;
 	} else if ( (*p) > 86 ) {
 		if ( 97 <= (*p) && (*p) <= 118 )
-			goto tr3107;
+			goto tr3118;
 	} else
-		goto tr3107;
-	goto tr3096;
-tr3107:
+		goto tr3118;
+	goto tr3107;
+tr3118:
 	{
 		*(rdata_tail++) += fifth_left_base32hex_to_num[(uint8_t)(*p)];
 
@@ -71757,41 +71863,41 @@ tr3107:
 			p--; {goto st261;}
 		}
 	}
-	goto st1023;
-st1023:
+	goto st1032;
+st1032:
 	if ( ++p == pe )
-		goto _test_eof1023;
-case 1023:
+		goto _test_eof1032;
+case 1032:
 	if ( (*p) == 61 )
-		goto st1028;
+		goto st1037;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3109;
+			goto tr3120;
 	} else if ( (*p) > 86 ) {
 		if ( 97 <= (*p) && (*p) <= 118 )
-			goto tr3109;
+			goto tr3120;
 	} else
-		goto tr3109;
-	goto tr3096;
-tr3109:
+		goto tr3120;
+	goto tr3107;
+tr3120:
 	{
 		*rdata_tail += sixth_base32hex_to_num[(uint8_t)(*p)];
 	}
-	goto st1024;
-st1024:
+	goto st1033;
+st1033:
 	if ( ++p == pe )
-		goto _test_eof1024;
-case 1024:
+		goto _test_eof1033;
+case 1033:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3111;
+			goto tr3122;
 	} else if ( (*p) > 86 ) {
 		if ( 97 <= (*p) && (*p) <= 118 )
-			goto tr3111;
+			goto tr3122;
 	} else
-		goto tr3111;
-	goto tr3096;
-tr3111:
+		goto tr3122;
+	goto tr3107;
+tr3122:
 	{
 		*(rdata_tail++) += seventh_left_base32hex_to_num[(uint8_t)(*p)];
 
@@ -71802,51 +71908,51 @@ tr3111:
 			p--; {goto st261;}
 		}
 	}
-	goto st1025;
-st1025:
+	goto st1034;
+st1034:
 	if ( ++p == pe )
-		goto _test_eof1025;
-case 1025:
+		goto _test_eof1034;
+case 1034:
 	if ( (*p) == 61 )
-		goto st1026;
+		goto st1035;
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3112;
+			goto tr3123;
 	} else if ( (*p) > 86 ) {
 		if ( 97 <= (*p) && (*p) <= 118 )
-			goto tr3112;
+			goto tr3123;
 	} else
-		goto tr3112;
-	goto tr3096;
-tr3112:
+		goto tr3123;
+	goto tr3107;
+tr3123:
 	{
 		*(rdata_tail++) += eighth_base32hex_to_num[(uint8_t)(*p)];
 	}
-	goto st1026;
-st1026:
+	goto st1035;
+st1035:
 	if ( ++p == pe )
-		goto _test_eof1026;
-case 1026:
+		goto _test_eof1035;
+case 1035:
 	switch( (*p) ) {
-		case 32: goto tr3114;
-		case 59: goto tr3114;
+		case 32: goto tr3125;
+		case 59: goto tr3125;
 	}
 	if ( (*p) < 48 ) {
 		if ( (*p) > 10 ) {
 			if ( 40 <= (*p) && (*p) <= 41 )
-				goto tr3114;
+				goto tr3125;
 		} else if ( (*p) >= 9 )
-			goto tr3114;
+			goto tr3125;
 	} else if ( (*p) > 57 ) {
 		if ( (*p) > 86 ) {
 			if ( 97 <= (*p) && (*p) <= 118 )
-				goto tr3115;
+				goto tr3126;
 		} else if ( (*p) >= 65 )
-			goto tr3115;
+			goto tr3126;
 	} else
-		goto tr3115;
-	goto tr3096;
-tr3114:
+		goto tr3126;
+	goto tr3107;
+tr3125:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -71857,68 +71963,68 @@ tr3114:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 1027; goto st329;} }
-	goto st1027;
-st1027:
+	{ p--; {stack[top++] = 1036; goto st329;} }
+	goto st1036;
+st1036:
 	if ( ++p == pe )
-		goto _test_eof1027;
-case 1027:
+		goto _test_eof1036;
+case 1036:
 	switch( (*p) ) {
-		case 32: goto tr3116;
-		case 59: goto tr3116;
+		case 32: goto tr3127;
+		case 59: goto tr3127;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3116;
+			goto tr3127;
 	} else if ( (*p) >= 9 )
-		goto tr3116;
+		goto tr3127;
 	goto tr71;
-tr3116:
+tr3127:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1187;
-st1187:
+	goto st1196;
+st1196:
 	if ( ++p == pe )
-		goto _test_eof1187;
-case 1187:
+		goto _test_eof1196;
+case 1196:
 	goto st0;
-st1028:
+st1037:
 	if ( ++p == pe )
-		goto _test_eof1028;
-case 1028:
+		goto _test_eof1037;
+case 1037:
 	if ( (*p) == 61 )
-		goto st1029;
-	goto tr3096;
-st1029:
+		goto st1038;
+	goto tr3107;
+st1038:
 	if ( ++p == pe )
-		goto _test_eof1029;
-case 1029:
+		goto _test_eof1038;
+case 1038:
 	if ( (*p) == 61 )
-		goto st1026;
-	goto tr3096;
-st1030:
+		goto st1035;
+	goto tr3107;
+st1039:
 	if ( ++p == pe )
-		goto _test_eof1030;
-case 1030:
+		goto _test_eof1039;
+case 1039:
 	if ( (*p) == 61 )
-		goto st1028;
-	goto tr3096;
-st1031:
+		goto st1037;
+	goto tr3107;
+st1040:
 	if ( ++p == pe )
-		goto _test_eof1031;
-case 1031:
+		goto _test_eof1040;
+case 1040:
 	if ( (*p) == 61 )
-		goto st1032;
-	goto tr3096;
-st1032:
+		goto st1041;
+	goto tr3107;
+st1041:
 	if ( ++p == pe )
-		goto _test_eof1032;
-case 1032:
+		goto _test_eof1041;
+case 1041:
 	if ( (*p) == 61 )
-		goto st1030;
-	goto tr3096;
-tr3095:
+		goto st1039;
+	goto tr3107;
+tr3106:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -71929,11 +72035,11 @@ tr3095:
 			p--; {goto st261;}
 		}
 	}
-	goto st1033;
-st1033:
+	goto st1042;
+st1042:
 	if ( ++p == pe )
-		goto _test_eof1033;
-case 1033:
+		goto _test_eof1042;
+case 1042:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -71953,11 +72059,11 @@ case 1033:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3101;
+		goto tr3112;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1033;
+		goto st1042;
 	goto tr71;
-tr3120:
+tr3131:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -71966,8 +72072,8 @@ tr3120:
 			p--; {goto st261;}
 		}
 	}
-	goto st1034;
-tr3088:
+	goto st1043;
+tr3099:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -71984,30 +72090,30 @@ tr3088:
 			p--; {goto st261;}
 		}
 	}
-	goto st1034;
-st1034:
+	goto st1043;
+st1043:
 	if ( ++p == pe )
-		goto _test_eof1034;
-case 1034:
+		goto _test_eof1043;
+case 1043:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3119;
+			goto tr3130;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3119;
+			goto tr3130;
 	} else
-		goto tr3119;
-	goto tr2349;
-tr3119:
+		goto tr3130;
+	goto tr2360;
+tr3130:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1035;
-st1035:
+	goto st1044;
+st1044:
 	if ( ++p == pe )
-		goto _test_eof1035;
-case 1035:
+		goto _test_eof1044;
+case 1044:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72021,23 +72127,23 @@ case 1035:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3091;
-		case 32: goto tr3091;
-		case 40: goto tr3092;
-		case 41: goto tr3093;
-		case 1034: goto tr3094;
-		case 1083: goto tr3095;
+		case 9: goto tr3102;
+		case 32: goto tr3102;
+		case 40: goto tr3103;
+		case 41: goto tr3104;
+		case 1034: goto tr3105;
+		case 1083: goto tr3106;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3120;
+			goto tr3131;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr3120;
+			goto tr3131;
 	} else
-		goto tr3120;
-	goto tr2349;
-tr3083:
+		goto tr3131;
+	goto tr2360;
+tr3094:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -72047,11 +72153,11 @@ tr3083:
 			p--; {goto st261;}
 		}
 	}
-	goto st1036;
-st1036:
+	goto st1045;
+st1045:
 	if ( ++p == pe )
-		goto _test_eof1036;
-case 1036:
+		goto _test_eof1045;
+case 1045:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -72071,11 +72177,11 @@ case 1036:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3089;
+		goto tr3100;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1036;
+		goto st1045;
 	goto tr71;
-tr3071:
+tr3082:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72085,11 +72191,11 @@ tr3071:
 			p--; {goto st261;}
 		}
 	}
-	goto st1037;
-st1037:
+	goto st1046;
+st1046:
 	if ( ++p == pe )
-		goto _test_eof1037;
-case 1037:
+		goto _test_eof1046;
+case 1046:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -72109,11 +72215,11 @@ case 1037:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3076;
+		goto tr3087;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1037;
+		goto st1046;
 	goto tr71;
-tr3059:
+tr3070:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72123,11 +72229,11 @@ tr3059:
 			p--; {goto st261;}
 		}
 	}
-	goto st1038;
-st1038:
+	goto st1047;
+st1047:
 	if ( ++p == pe )
-		goto _test_eof1038;
-case 1038:
+		goto _test_eof1047;
+case 1047:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -72147,18 +72253,18 @@ case 1038:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3064;
+		goto tr3075;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1038;
+		goto st1047;
 	goto tr71;
-st1039:
+st1048:
 	if ( ++p == pe )
-		goto _test_eof1039;
-case 1039:
+		goto _test_eof1048;
+case 1048:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3121;
-	goto tr1746;
-tr3121:
+		goto tr3132;
+	goto tr1757;
+tr3132:
 	{
 		s->number64 = 0;
 	}
@@ -72176,8 +72282,8 @@ tr3121:
 			p--; {goto st261;}
 		}
 	}
-	goto st1040;
-tr3125:
+	goto st1049;
+tr3136:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -72192,11 +72298,11 @@ tr3125:
 			p--; {goto st261;}
 		}
 	}
-	goto st1040;
-st1040:
+	goto st1049;
+st1049:
 	if ( ++p == pe )
-		goto _test_eof1040;
-case 1040:
+		goto _test_eof1049;
+case 1049:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72210,17 +72316,17 @@ case 1040:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3122;
-		case 32: goto tr3122;
-		case 40: goto tr3123;
-		case 41: goto tr3124;
-		case 1034: goto tr3126;
-		case 1083: goto tr3127;
+		case 9: goto tr3133;
+		case 32: goto tr3133;
+		case 40: goto tr3134;
+		case 41: goto tr3135;
+		case 1034: goto tr3137;
+		case 1083: goto tr3138;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3125;
-	goto tr1746;
-tr3129:
+		goto tr3136;
+	goto tr1757;
+tr3140:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -72228,8 +72334,8 @@ tr3129:
 		}
 		s->multiline = true;
 	}
-	goto st1041;
-tr3130:
+	goto st1050;
+tr3141:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -72237,13 +72343,13 @@ tr3130:
 		}
 		s->multiline = false;
 	}
-	goto st1041;
-tr3132:
+	goto st1050;
+tr3143:
 	{
 		s->line_counter++;
 	}
-	goto st1041;
-tr3122:
+	goto st1050;
+tr3133:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72253,8 +72359,8 @@ tr3122:
 			p--; {goto st261;}
 		}
 	}
-	goto st1041;
-tr3123:
+	goto st1050;
+tr3134:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72271,8 +72377,8 @@ tr3123:
 		}
 		s->multiline = true;
 	}
-	goto st1041;
-tr3124:
+	goto st1050;
+tr3135:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72289,8 +72395,8 @@ tr3124:
 		}
 		s->multiline = false;
 	}
-	goto st1041;
-tr3126:
+	goto st1050;
+tr3137:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72303,11 +72409,11 @@ tr3126:
 	{
 		s->line_counter++;
 	}
-	goto st1041;
-st1041:
+	goto st1050;
+st1050:
 	if ( ++p == pe )
-		goto _test_eof1041;
-case 1041:
+		goto _test_eof1050;
+case 1050:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72321,17 +72427,17 @@ case 1041:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1041;
-		case 32: goto st1041;
-		case 40: goto tr3129;
-		case 41: goto tr3130;
-		case 1034: goto tr3132;
-		case 1083: goto st1051;
+		case 9: goto st1050;
+		case 32: goto st1050;
+		case 40: goto tr3140;
+		case 41: goto tr3141;
+		case 1034: goto tr3143;
+		case 1083: goto st1060;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3131;
-	goto tr1746;
-tr3131:
+		goto tr3142;
+	goto tr1757;
+tr3142:
 	{
 		s->number64 = 0;
 	}
@@ -72349,8 +72455,8 @@ tr3131:
 			p--; {goto st261;}
 		}
 	}
-	goto st1042;
-tr3137:
+	goto st1051;
+tr3148:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -72365,11 +72471,11 @@ tr3137:
 			p--; {goto st261;}
 		}
 	}
-	goto st1042;
-st1042:
+	goto st1051;
+st1051:
 	if ( ++p == pe )
-		goto _test_eof1042;
-case 1042:
+		goto _test_eof1051;
+case 1051:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72383,17 +72489,17 @@ case 1042:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3134;
-		case 32: goto tr3134;
-		case 40: goto tr3135;
-		case 41: goto tr3136;
-		case 1034: goto tr3138;
-		case 1083: goto tr3139;
+		case 9: goto tr3145;
+		case 32: goto tr3145;
+		case 40: goto tr3146;
+		case 41: goto tr3147;
+		case 1034: goto tr3149;
+		case 1083: goto tr3150;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3137;
-	goto tr1746;
-tr3141:
+		goto tr3148;
+	goto tr1757;
+tr3152:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -72401,8 +72507,8 @@ tr3141:
 		}
 		s->multiline = true;
 	}
-	goto st1043;
-tr3142:
+	goto st1052;
+tr3153:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -72410,13 +72516,13 @@ tr3142:
 		}
 		s->multiline = false;
 	}
-	goto st1043;
-tr3144:
+	goto st1052;
+tr3155:
 	{
 		s->line_counter++;
 	}
-	goto st1043;
-tr3134:
+	goto st1052;
+tr3145:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72426,8 +72532,8 @@ tr3134:
 			p--; {goto st261;}
 		}
 	}
-	goto st1043;
-tr3135:
+	goto st1052;
+tr3146:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72444,8 +72550,8 @@ tr3135:
 		}
 		s->multiline = true;
 	}
-	goto st1043;
-tr3136:
+	goto st1052;
+tr3147:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72462,8 +72568,8 @@ tr3136:
 		}
 		s->multiline = false;
 	}
-	goto st1043;
-tr3138:
+	goto st1052;
+tr3149:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72476,11 +72582,11 @@ tr3138:
 	{
 		s->line_counter++;
 	}
-	goto st1043;
-st1043:
+	goto st1052;
+st1052:
 	if ( ++p == pe )
-		goto _test_eof1043;
-case 1043:
+		goto _test_eof1052;
+case 1052:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72494,17 +72600,17 @@ case 1043:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1043;
-		case 32: goto st1043;
-		case 40: goto tr3141;
-		case 41: goto tr3142;
-		case 1034: goto tr3144;
-		case 1083: goto st1050;
+		case 9: goto st1052;
+		case 32: goto st1052;
+		case 40: goto tr3152;
+		case 41: goto tr3153;
+		case 1034: goto tr3155;
+		case 1083: goto st1059;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3143;
-	goto tr1746;
-tr3143:
+		goto tr3154;
+	goto tr1757;
+tr3154:
 	{
 		s->number64 = 0;
 	}
@@ -72522,8 +72628,8 @@ tr3143:
 			p--; {goto st261;}
 		}
 	}
-	goto st1044;
-tr3149:
+	goto st1053;
+tr3160:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -72538,11 +72644,11 @@ tr3149:
 			p--; {goto st261;}
 		}
 	}
-	goto st1044;
-st1044:
+	goto st1053;
+st1053:
 	if ( ++p == pe )
-		goto _test_eof1044;
-case 1044:
+		goto _test_eof1053;
+case 1053:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72556,17 +72662,17 @@ case 1044:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3146;
-		case 32: goto tr3146;
-		case 40: goto tr3147;
-		case 41: goto tr3148;
-		case 1034: goto tr3150;
-		case 1083: goto tr3151;
+		case 9: goto tr3157;
+		case 32: goto tr3157;
+		case 40: goto tr3158;
+		case 41: goto tr3159;
+		case 1034: goto tr3161;
+		case 1083: goto tr3162;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3149;
-	goto tr1746;
-tr3153:
+		goto tr3160;
+	goto tr1757;
+tr3164:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -72574,8 +72680,8 @@ tr3153:
 		}
 		s->multiline = true;
 	}
-	goto st1045;
-tr3154:
+	goto st1054;
+tr3165:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -72583,13 +72689,13 @@ tr3154:
 		}
 		s->multiline = false;
 	}
-	goto st1045;
-tr3157:
+	goto st1054;
+tr3168:
 	{
 		s->line_counter++;
 	}
-	goto st1045;
-tr3146:
+	goto st1054;
+tr3157:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -72599,8 +72705,8 @@ tr3146:
 			p--; {goto st261;}
 		}
 	}
-	goto st1045;
-tr3147:
+	goto st1054;
+tr3158:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -72617,8 +72723,8 @@ tr3147:
 		}
 		s->multiline = true;
 	}
-	goto st1045;
-tr3148:
+	goto st1054;
+tr3159:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -72635,8 +72741,8 @@ tr3148:
 		}
 		s->multiline = false;
 	}
-	goto st1045;
-tr3150:
+	goto st1054;
+tr3161:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -72649,11 +72755,11 @@ tr3150:
 	{
 		s->line_counter++;
 	}
-	goto st1045;
-st1045:
+	goto st1054;
+st1054:
 	if ( ++p == pe )
-		goto _test_eof1045;
-case 1045:
+		goto _test_eof1054;
+case 1054:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72667,24 +72773,24 @@ case 1045:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1045;
-		case 32: goto st1045;
-		case 40: goto tr3153;
-		case 41: goto tr3154;
-		case 45: goto tr3155;
-		case 1034: goto tr3157;
-		case 1083: goto st1049;
+		case 9: goto st1054;
+		case 32: goto st1054;
+		case 40: goto tr3164;
+		case 41: goto tr3165;
+		case 45: goto tr3166;
+		case 1034: goto tr3168;
+		case 1083: goto st1058;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3156;
+			goto tr3167;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr3156;
+			goto tr3167;
 	} else
-		goto tr3156;
-	goto tr2349;
-tr3155:
+		goto tr3167;
+	goto tr2360;
+tr3166:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -72693,22 +72799,22 @@ tr3155:
 			p--; {goto st261;}
 		}
 	}
-	goto st1046;
-st1046:
+	goto st1055;
+st1055:
 	if ( ++p == pe )
-		goto _test_eof1046;
-case 1046:
+		goto _test_eof1055;
+case 1055:
 	switch( (*p) ) {
-		case 32: goto tr3159;
-		case 59: goto tr3159;
+		case 32: goto tr3170;
+		case 59: goto tr3170;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3159;
+			goto tr3170;
 	} else if ( (*p) >= 9 )
-		goto tr3159;
-	goto tr2349;
-tr3159:
+		goto tr3170;
+	goto tr2360;
+tr3170:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -72722,13 +72828,13 @@ tr3159:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1188;
-st1188:
+	goto st1197;
+st1197:
 	if ( ++p == pe )
-		goto _test_eof1188;
-case 1188:
+		goto _test_eof1197;
+case 1197:
 	goto st0;
-tr3161:
+tr3172:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -72737,8 +72843,8 @@ tr3161:
 			p--; {goto st261;}
 		}
 	}
-	goto st1047;
-tr3156:
+	goto st1056;
+tr3167:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -72755,50 +72861,50 @@ tr3156:
 			p--; {goto st261;}
 		}
 	}
-	goto st1047;
-st1047:
+	goto st1056;
+st1056:
 	if ( ++p == pe )
-		goto _test_eof1047;
-case 1047:
+		goto _test_eof1056;
+case 1056:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3160;
+			goto tr3171;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3160;
+			goto tr3171;
 	} else
-		goto tr3160;
-	goto tr2349;
-tr3160:
+		goto tr3171;
+	goto tr2360;
+tr3171:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1048;
-st1048:
+	goto st1057;
+st1057:
 	if ( ++p == pe )
-		goto _test_eof1048;
-case 1048:
+		goto _test_eof1057;
+case 1057:
 	switch( (*p) ) {
-		case 32: goto tr3159;
-		case 59: goto tr3159;
+		case 32: goto tr3170;
+		case 59: goto tr3170;
 	}
 	if ( (*p) < 48 ) {
 		if ( (*p) > 10 ) {
 			if ( 40 <= (*p) && (*p) <= 41 )
-				goto tr3159;
+				goto tr3170;
 		} else if ( (*p) >= 9 )
-			goto tr3159;
+			goto tr3170;
 	} else if ( (*p) > 57 ) {
 		if ( (*p) > 70 ) {
 			if ( 97 <= (*p) && (*p) <= 102 )
-				goto tr3161;
+				goto tr3172;
 		} else if ( (*p) >= 65 )
-			goto tr3161;
+			goto tr3172;
 	} else
-		goto tr3161;
-	goto tr2349;
-tr3151:
+		goto tr3172;
+	goto tr2360;
+tr3162:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -72808,11 +72914,11 @@ tr3151:
 			p--; {goto st261;}
 		}
 	}
-	goto st1049;
-st1049:
+	goto st1058;
+st1058:
 	if ( ++p == pe )
-		goto _test_eof1049;
-case 1049:
+		goto _test_eof1058;
+case 1058:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -72832,11 +72938,11 @@ case 1049:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3157;
+		goto tr3168;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1049;
+		goto st1058;
 	goto tr71;
-tr3139:
+tr3150:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72846,11 +72952,11 @@ tr3139:
 			p--; {goto st261;}
 		}
 	}
-	goto st1050;
-st1050:
+	goto st1059;
+st1059:
 	if ( ++p == pe )
-		goto _test_eof1050;
-case 1050:
+		goto _test_eof1059;
+case 1059:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -72870,11 +72976,11 @@ case 1050:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3144;
+		goto tr3155;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1050;
+		goto st1059;
 	goto tr71;
-tr3127:
+tr3138:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -72884,11 +72990,11 @@ tr3127:
 			p--; {goto st261;}
 		}
 	}
-	goto st1051;
-st1051:
+	goto st1060;
+st1060:
 	if ( ++p == pe )
-		goto _test_eof1051;
-case 1051:
+		goto _test_eof1060;
+case 1060:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -72908,18 +73014,18 @@ case 1051:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3132;
+		goto tr3143;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1051;
+		goto st1060;
 	goto tr71;
-st1052:
+st1061:
 	if ( ++p == pe )
-		goto _test_eof1052;
-case 1052:
+		goto _test_eof1061;
+case 1061:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3162;
-	goto tr1746;
-tr3162:
+		goto tr3173;
+	goto tr1757;
+tr3173:
 	{
 		s->number64 = 0;
 	}
@@ -72937,8 +73043,8 @@ tr3162:
 			p--; {goto st261;}
 		}
 	}
-	goto st1053;
-tr3166:
+	goto st1062;
+tr3177:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -72953,11 +73059,11 @@ tr3166:
 			p--; {goto st261;}
 		}
 	}
-	goto st1053;
-st1053:
+	goto st1062;
+st1062:
 	if ( ++p == pe )
-		goto _test_eof1053;
-case 1053:
+		goto _test_eof1062;
+case 1062:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -72971,17 +73077,17 @@ case 1053:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3163;
-		case 32: goto tr3163;
-		case 40: goto tr3164;
-		case 41: goto tr3165;
-		case 1034: goto tr3167;
-		case 1083: goto tr3168;
+		case 9: goto tr3174;
+		case 32: goto tr3174;
+		case 40: goto tr3175;
+		case 41: goto tr3176;
+		case 1034: goto tr3178;
+		case 1083: goto tr3179;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3166;
-	goto tr1746;
-tr3170:
+		goto tr3177;
+	goto tr1757;
+tr3181:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -72989,8 +73095,8 @@ tr3170:
 		}
 		s->multiline = true;
 	}
-	goto st1054;
-tr3171:
+	goto st1063;
+tr3182:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -72998,13 +73104,13 @@ tr3171:
 		}
 		s->multiline = false;
 	}
-	goto st1054;
-tr3173:
+	goto st1063;
+tr3184:
 	{
 		s->line_counter++;
 	}
-	goto st1054;
-tr3163:
+	goto st1063;
+tr3174:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73014,8 +73120,8 @@ tr3163:
 			p--; {goto st261;}
 		}
 	}
-	goto st1054;
-tr3164:
+	goto st1063;
+tr3175:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73032,8 +73138,8 @@ tr3164:
 		}
 		s->multiline = true;
 	}
-	goto st1054;
-tr3165:
+	goto st1063;
+tr3176:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73050,8 +73156,8 @@ tr3165:
 		}
 		s->multiline = false;
 	}
-	goto st1054;
-tr3167:
+	goto st1063;
+tr3178:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73064,11 +73170,11 @@ tr3167:
 	{
 		s->line_counter++;
 	}
-	goto st1054;
-st1054:
+	goto st1063;
+st1063:
 	if ( ++p == pe )
-		goto _test_eof1054;
-case 1054:
+		goto _test_eof1063;
+case 1063:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73082,17 +73188,17 @@ case 1054:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1054;
-		case 32: goto st1054;
-		case 40: goto tr3170;
-		case 41: goto tr3171;
-		case 1034: goto tr3173;
-		case 1083: goto st1064;
+		case 9: goto st1063;
+		case 32: goto st1063;
+		case 40: goto tr3181;
+		case 41: goto tr3182;
+		case 1034: goto tr3184;
+		case 1083: goto st1073;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3172;
-	goto tr1746;
-tr3172:
+		goto tr3183;
+	goto tr1757;
+tr3183:
 	{
 		s->number64 = 0;
 	}
@@ -73110,8 +73216,8 @@ tr3172:
 			p--; {goto st261;}
 		}
 	}
-	goto st1055;
-tr3178:
+	goto st1064;
+tr3189:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -73126,11 +73232,11 @@ tr3178:
 			p--; {goto st261;}
 		}
 	}
-	goto st1055;
-st1055:
+	goto st1064;
+st1064:
 	if ( ++p == pe )
-		goto _test_eof1055;
-case 1055:
+		goto _test_eof1064;
+case 1064:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73144,17 +73250,17 @@ case 1055:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3175;
-		case 32: goto tr3175;
-		case 40: goto tr3176;
-		case 41: goto tr3177;
-		case 1034: goto tr3179;
-		case 1083: goto tr3180;
+		case 9: goto tr3186;
+		case 32: goto tr3186;
+		case 40: goto tr3187;
+		case 41: goto tr3188;
+		case 1034: goto tr3190;
+		case 1083: goto tr3191;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3178;
-	goto tr1746;
-tr3182:
+		goto tr3189;
+	goto tr1757;
+tr3193:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -73162,8 +73268,8 @@ tr3182:
 		}
 		s->multiline = true;
 	}
-	goto st1056;
-tr3183:
+	goto st1065;
+tr3194:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -73171,13 +73277,13 @@ tr3183:
 		}
 		s->multiline = false;
 	}
-	goto st1056;
-tr3185:
+	goto st1065;
+tr3196:
 	{
 		s->line_counter++;
 	}
-	goto st1056;
-tr3175:
+	goto st1065;
+tr3186:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73187,8 +73293,8 @@ tr3175:
 			p--; {goto st261;}
 		}
 	}
-	goto st1056;
-tr3176:
+	goto st1065;
+tr3187:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73205,8 +73311,8 @@ tr3176:
 		}
 		s->multiline = true;
 	}
-	goto st1056;
-tr3177:
+	goto st1065;
+tr3188:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73223,8 +73329,8 @@ tr3177:
 		}
 		s->multiline = false;
 	}
-	goto st1056;
-tr3179:
+	goto st1065;
+tr3190:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73237,11 +73343,11 @@ tr3179:
 	{
 		s->line_counter++;
 	}
-	goto st1056;
-st1056:
+	goto st1065;
+st1065:
 	if ( ++p == pe )
-		goto _test_eof1056;
-case 1056:
+		goto _test_eof1065;
+case 1065:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73255,17 +73361,17 @@ case 1056:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1056;
-		case 32: goto st1056;
-		case 40: goto tr3182;
-		case 41: goto tr3183;
-		case 1034: goto tr3185;
-		case 1083: goto st1063;
+		case 9: goto st1065;
+		case 32: goto st1065;
+		case 40: goto tr3193;
+		case 41: goto tr3194;
+		case 1034: goto tr3196;
+		case 1083: goto st1072;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3184;
-	goto tr1746;
-tr3184:
+		goto tr3195;
+	goto tr1757;
+tr3195:
 	{
 		s->number64 = 0;
 	}
@@ -73283,8 +73389,8 @@ tr3184:
 			p--; {goto st261;}
 		}
 	}
-	goto st1057;
-tr3190:
+	goto st1066;
+tr3201:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -73299,11 +73405,11 @@ tr3190:
 			p--; {goto st261;}
 		}
 	}
-	goto st1057;
-st1057:
+	goto st1066;
+st1066:
 	if ( ++p == pe )
-		goto _test_eof1057;
-case 1057:
+		goto _test_eof1066;
+case 1066:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73317,17 +73423,17 @@ case 1057:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3187;
-		case 32: goto tr3187;
-		case 40: goto tr3188;
-		case 41: goto tr3189;
-		case 1034: goto tr3191;
-		case 1083: goto tr3192;
+		case 9: goto tr3198;
+		case 32: goto tr3198;
+		case 40: goto tr3199;
+		case 41: goto tr3200;
+		case 1034: goto tr3202;
+		case 1083: goto tr3203;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3190;
-	goto tr1746;
-tr3194:
+		goto tr3201;
+	goto tr1757;
+tr3205:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -73335,8 +73441,8 @@ tr3194:
 		}
 		s->multiline = true;
 	}
-	goto st1058;
-tr3195:
+	goto st1067;
+tr3206:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -73344,13 +73450,13 @@ tr3195:
 		}
 		s->multiline = false;
 	}
-	goto st1058;
-tr3197:
+	goto st1067;
+tr3208:
 	{
 		s->line_counter++;
 	}
-	goto st1058;
-tr3187:
+	goto st1067;
+tr3198:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73360,8 +73466,8 @@ tr3187:
 			p--; {goto st261;}
 		}
 	}
-	goto st1058;
-tr3188:
+	goto st1067;
+tr3199:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73378,8 +73484,8 @@ tr3188:
 		}
 		s->multiline = true;
 	}
-	goto st1058;
-tr3189:
+	goto st1067;
+tr3200:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73396,8 +73502,8 @@ tr3189:
 		}
 		s->multiline = false;
 	}
-	goto st1058;
-tr3191:
+	goto st1067;
+tr3202:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73410,11 +73516,11 @@ tr3191:
 	{
 		s->line_counter++;
 	}
-	goto st1058;
-st1058:
+	goto st1067;
+st1067:
 	if ( ++p == pe )
-		goto _test_eof1058;
-case 1058:
+		goto _test_eof1067;
+case 1067:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73428,23 +73534,23 @@ case 1058:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1058;
-		case 32: goto st1058;
-		case 40: goto tr3194;
-		case 41: goto tr3195;
-		case 1034: goto tr3197;
-		case 1083: goto st1062;
+		case 9: goto st1067;
+		case 32: goto st1067;
+		case 40: goto tr3205;
+		case 41: goto tr3206;
+		case 1034: goto tr3208;
+		case 1083: goto st1071;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3196;
+			goto tr3207;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr3196;
+			goto tr3207;
 	} else
-		goto tr3196;
-	goto tr2349;
-tr3196:
+		goto tr3207;
+	goto tr2360;
+tr3207:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -73453,21 +73559,21 @@ tr3196:
 			p--; {goto st261;}
 		}
 	}
-	goto st1059;
-st1059:
+	goto st1068;
+st1068:
 	if ( ++p == pe )
-		goto _test_eof1059;
-case 1059:
+		goto _test_eof1068;
+case 1068:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3199;
+			goto tr3210;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3199;
+			goto tr3210;
 	} else
-		goto tr3199;
-	goto tr2349;
-tr3201:
+		goto tr3210;
+	goto tr2360;
+tr3212:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -73475,8 +73581,8 @@ tr3201:
 		}
 		s->multiline = true;
 	}
-	goto st1060;
-tr3202:
+	goto st1069;
+tr3213:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -73484,22 +73590,22 @@ tr3202:
 		}
 		s->multiline = false;
 	}
-	goto st1060;
-tr3203:
+	goto st1069;
+tr3214:
 	{
 		s->line_counter++;
 	}
-	goto st1060;
-tr3199:
+	goto st1069;
+tr3210:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1060;
-st1060:
+	goto st1069;
+st1069:
 	if ( ++p == pe )
-		goto _test_eof1060;
-case 1060:
+		goto _test_eof1069;
+case 1069:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73517,30 +73623,30 @@ case 1060:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st1060;
-		case 32: goto st1060;
-		case 40: goto tr3201;
-		case 41: goto tr3202;
-		case 2058: goto tr3203;
-		case 2107: goto st1061;
-		case 2314: goto tr3205;
-		case 2363: goto tr3205;
-		case 2570: goto tr3206;
-		case 2619: goto tr3207;
+		case 9: goto st1069;
+		case 32: goto st1069;
+		case 40: goto tr3212;
+		case 41: goto tr3213;
+		case 2058: goto tr3214;
+		case 2107: goto st1070;
+		case 2314: goto tr3216;
+		case 2363: goto tr3216;
+		case 2570: goto tr3217;
+		case 2619: goto tr3218;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3196;
+			goto tr3207;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr3196;
+			goto tr3207;
 	} else
-		goto tr3196;
-	goto tr2349;
-st1061:
+		goto tr3207;
+	goto tr2360;
+st1070:
 	if ( ++p == pe )
-		goto _test_eof1061;
-case 1061:
+		goto _test_eof1070;
+case 1070:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -73560,32 +73666,32 @@ case 1061:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3203;
+		goto tr3214;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1061;
-	goto tr2349;
-tr3205:
+		goto st1070;
+	goto tr2360;
+tr3216:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1189;
-st1189:
+	goto st1198;
+st1198:
 	if ( ++p == pe )
-		goto _test_eof1189;
-case 1189:
+		goto _test_eof1198;
+case 1198:
 	goto st0;
-tr3206:
+tr3217:
 	{
 		s->line_counter++;
 	}
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1190;
-st1190:
+	goto st1199;
+st1199:
 	if ( ++p == pe )
-		goto _test_eof1190;
-case 1190:
+		goto _test_eof1199;
+case 1199:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73603,35 +73709,35 @@ case 1190:
  !s->multiline  ) _widec += 512;
 	}
 	switch( _widec ) {
-		case 9: goto st1060;
-		case 32: goto st1060;
-		case 40: goto tr3201;
-		case 41: goto tr3202;
-		case 2058: goto tr3203;
-		case 2107: goto st1061;
-		case 2314: goto tr3205;
-		case 2363: goto tr3205;
-		case 2570: goto tr3206;
-		case 2619: goto tr3207;
+		case 9: goto st1069;
+		case 32: goto st1069;
+		case 40: goto tr3212;
+		case 41: goto tr3213;
+		case 2058: goto tr3214;
+		case 2107: goto st1070;
+		case 2314: goto tr3216;
+		case 2363: goto tr3216;
+		case 2570: goto tr3217;
+		case 2619: goto tr3218;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3196;
+			goto tr3207;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr3196;
+			goto tr3207;
 	} else
-		goto tr3196;
-	goto tr2349;
-tr3207:
+		goto tr3207;
+	goto tr2360;
+tr3218:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1191;
-st1191:
+	goto st1200;
+st1200:
 	if ( ++p == pe )
-		goto _test_eof1191;
-case 1191:
+		goto _test_eof1200;
+case 1200:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -73651,11 +73757,11 @@ case 1191:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3203;
+		goto tr3214;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1061;
-	goto tr2349;
-tr3192:
+		goto st1070;
+	goto tr2360;
+tr3203:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73665,11 +73771,11 @@ tr3192:
 			p--; {goto st261;}
 		}
 	}
-	goto st1062;
-st1062:
+	goto st1071;
+st1071:
 	if ( ++p == pe )
-		goto _test_eof1062;
-case 1062:
+		goto _test_eof1071;
+case 1071:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -73689,11 +73795,11 @@ case 1062:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3197;
+		goto tr3208;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1062;
+		goto st1071;
 	goto tr71;
-tr3180:
+tr3191:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73703,11 +73809,11 @@ tr3180:
 			p--; {goto st261;}
 		}
 	}
-	goto st1063;
-st1063:
+	goto st1072;
+st1072:
 	if ( ++p == pe )
-		goto _test_eof1063;
-case 1063:
+		goto _test_eof1072;
+case 1072:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -73727,11 +73833,11 @@ case 1063:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3185;
+		goto tr3196;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1063;
+		goto st1072;
 	goto tr71;
-tr3168:
+tr3179:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -73741,11 +73847,11 @@ tr3168:
 			p--; {goto st261;}
 		}
 	}
-	goto st1064;
-st1064:
+	goto st1073;
+st1073:
 	if ( ++p == pe )
-		goto _test_eof1064;
-case 1064:
+		goto _test_eof1073;
+case 1073:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -73765,18 +73871,18 @@ case 1064:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3173;
+		goto tr3184;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1064;
+		goto st1073;
 	goto tr71;
-st1065:
+st1074:
 	if ( ++p == pe )
-		goto _test_eof1065;
-case 1065:
+		goto _test_eof1074;
+case 1074:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3208;
-	goto tr1746;
-tr3208:
+		goto tr3219;
+	goto tr1757;
+tr3219:
 	{
 		s->number64 = 0;
 	}
@@ -73794,8 +73900,8 @@ tr3208:
 			p--; {goto st261;}
 		}
 	}
-	goto st1066;
-tr3212:
+	goto st1075;
+tr3223:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -73810,11 +73916,11 @@ tr3212:
 			p--; {goto st261;}
 		}
 	}
-	goto st1066;
-st1066:
+	goto st1075;
+st1075:
 	if ( ++p == pe )
-		goto _test_eof1066;
-case 1066:
+		goto _test_eof1075;
+case 1075:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73828,17 +73934,17 @@ case 1066:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3209;
-		case 32: goto tr3209;
-		case 40: goto tr3210;
-		case 41: goto tr3211;
-		case 1034: goto tr3213;
-		case 1083: goto tr3214;
+		case 9: goto tr3220;
+		case 32: goto tr3220;
+		case 40: goto tr3221;
+		case 41: goto tr3222;
+		case 1034: goto tr3224;
+		case 1083: goto tr3225;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3212;
-	goto tr1746;
-tr3216:
+		goto tr3223;
+	goto tr1757;
+tr3227:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -73846,8 +73952,8 @@ tr3216:
 		}
 		s->multiline = true;
 	}
-	goto st1067;
-tr3217:
+	goto st1076;
+tr3228:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -73855,13 +73961,13 @@ tr3217:
 		}
 		s->multiline = false;
 	}
-	goto st1067;
-tr3219:
+	goto st1076;
+tr3230:
 	{
 		s->line_counter++;
 	}
-	goto st1067;
-tr3209:
+	goto st1076;
+tr3220:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -73871,8 +73977,8 @@ tr3209:
 			p--; {goto st261;}
 		}
 	}
-	goto st1067;
-tr3210:
+	goto st1076;
+tr3221:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -73889,8 +73995,8 @@ tr3210:
 		}
 		s->multiline = true;
 	}
-	goto st1067;
-tr3211:
+	goto st1076;
+tr3222:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -73907,8 +74013,8 @@ tr3211:
 		}
 		s->multiline = false;
 	}
-	goto st1067;
-tr3213:
+	goto st1076;
+tr3224:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -73921,11 +74027,11 @@ tr3213:
 	{
 		s->line_counter++;
 	}
-	goto st1067;
-st1067:
+	goto st1076;
+st1076:
 	if ( ++p == pe )
-		goto _test_eof1067;
-case 1067:
+		goto _test_eof1076;
+case 1076:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -73939,18 +74045,18 @@ case 1067:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1067;
-		case 32: goto st1067;
-		case 40: goto tr3216;
-		case 41: goto tr3217;
-		case 46: goto tr3218;
-		case 1034: goto tr3219;
-		case 1083: goto st1069;
+		case 9: goto st1076;
+		case 32: goto st1076;
+		case 40: goto tr3227;
+		case 41: goto tr3228;
+		case 46: goto tr3229;
+		case 1034: goto tr3230;
+		case 1083: goto st1078;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3218;
-	goto tr1723;
-tr3218:
+		goto tr3229;
+	goto tr1734;
+tr3229:
 	{
 		s->buffer_length = 0;
 	}
@@ -73963,8 +74069,8 @@ tr3218:
 			p--; {goto st261;}
 		}
 	}
-	goto st1068;
-tr3222:
+	goto st1077;
+tr3233:
 	{
 		if (s->buffer_length < MAX_RDATA_LENGTH) {
 			s->buffer[s->buffer_length++] = (*p);
@@ -73974,26 +74080,26 @@ tr3222:
 			p--; {goto st261;}
 		}
 	}
-	goto st1068;
-st1068:
+	goto st1077;
+st1077:
 	if ( ++p == pe )
-		goto _test_eof1068;
-case 1068:
+		goto _test_eof1077;
+case 1077:
 	switch( (*p) ) {
-		case 32: goto tr3221;
-		case 46: goto tr3222;
-		case 59: goto tr3221;
+		case 32: goto tr3232;
+		case 46: goto tr3233;
+		case 59: goto tr3232;
 	}
 	if ( (*p) < 40 ) {
 		if ( 9 <= (*p) && (*p) <= 10 )
-			goto tr3221;
+			goto tr3232;
 	} else if ( (*p) > 41 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3222;
+			goto tr3233;
 	} else
-		goto tr3221;
-	goto tr1723;
-tr3221:
+		goto tr3232;
+	goto tr1734;
+tr3232:
 	{
 		s->buffer[s->buffer_length] = 0;
 
@@ -74009,13 +74115,13 @@ tr3221:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1192;
-st1192:
+	goto st1201;
+st1201:
 	if ( ++p == pe )
-		goto _test_eof1192;
-case 1192:
+		goto _test_eof1201;
+case 1201:
 	goto st0;
-tr3214:
+tr3225:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74025,11 +74131,11 @@ tr3214:
 			p--; {goto st261;}
 		}
 	}
-	goto st1069;
-st1069:
+	goto st1078;
+st1078:
 	if ( ++p == pe )
-		goto _test_eof1069;
-case 1069:
+		goto _test_eof1078;
+case 1078:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -74049,18 +74155,18 @@ case 1069:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3219;
+		goto tr3230;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1069;
+		goto st1078;
 	goto tr71;
-st1070:
+st1079:
 	if ( ++p == pe )
-		goto _test_eof1070;
-case 1070:
+		goto _test_eof1079;
+case 1079:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3223;
-	goto tr1746;
-tr3223:
+		goto tr3234;
+	goto tr1757;
+tr3234:
 	{
 		s->number64 = 0;
 	}
@@ -74078,8 +74184,8 @@ tr3223:
 			p--; {goto st261;}
 		}
 	}
-	goto st1071;
-tr3227:
+	goto st1080;
+tr3238:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -74094,11 +74200,11 @@ tr3227:
 			p--; {goto st261;}
 		}
 	}
-	goto st1071;
-st1071:
+	goto st1080;
+st1080:
 	if ( ++p == pe )
-		goto _test_eof1071;
-case 1071:
+		goto _test_eof1080;
+case 1080:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -74112,17 +74218,17 @@ case 1071:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3224;
-		case 32: goto tr3224;
-		case 40: goto tr3225;
-		case 41: goto tr3226;
-		case 1034: goto tr3228;
-		case 1083: goto tr3229;
+		case 9: goto tr3235;
+		case 32: goto tr3235;
+		case 40: goto tr3236;
+		case 41: goto tr3237;
+		case 1034: goto tr3239;
+		case 1083: goto tr3240;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3227;
-	goto tr1746;
-tr3231:
+		goto tr3238;
+	goto tr1757;
+tr3242:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -74130,8 +74236,8 @@ tr3231:
 		}
 		s->multiline = true;
 	}
-	goto st1072;
-tr3232:
+	goto st1081;
+tr3243:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -74139,13 +74245,13 @@ tr3232:
 		}
 		s->multiline = false;
 	}
-	goto st1072;
-tr3234:
+	goto st1081;
+tr3245:
 	{
 		s->line_counter++;
 	}
-	goto st1072;
-tr3224:
+	goto st1081;
+tr3235:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74155,8 +74261,8 @@ tr3224:
 			p--; {goto st261;}
 		}
 	}
-	goto st1072;
-tr3225:
+	goto st1081;
+tr3236:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74173,8 +74279,8 @@ tr3225:
 		}
 		s->multiline = true;
 	}
-	goto st1072;
-tr3226:
+	goto st1081;
+tr3237:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74191,8 +74297,8 @@ tr3226:
 		}
 		s->multiline = false;
 	}
-	goto st1072;
-tr3228:
+	goto st1081;
+tr3239:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74205,11 +74311,11 @@ tr3228:
 	{
 		s->line_counter++;
 	}
-	goto st1072;
-st1072:
+	goto st1081;
+st1081:
 	if ( ++p == pe )
-		goto _test_eof1072;
-case 1072:
+		goto _test_eof1081;
+case 1081:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -74223,23 +74329,23 @@ case 1072:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1072;
-		case 32: goto st1072;
-		case 40: goto tr3231;
-		case 41: goto tr3232;
-		case 1034: goto tr3234;
-		case 1083: goto st1082;
+		case 9: goto st1081;
+		case 32: goto st1081;
+		case 40: goto tr3242;
+		case 41: goto tr3243;
+		case 1034: goto tr3245;
+		case 1083: goto st1091;
 	}
 	if ( _widec < 65 ) {
 		if ( 48 <= _widec && _widec <= 57 )
-			goto tr3233;
+			goto tr3244;
 	} else if ( _widec > 70 ) {
 		if ( 97 <= _widec && _widec <= 102 )
-			goto tr3233;
+			goto tr3244;
 	} else
-		goto tr3233;
-	goto tr2349;
-tr3233:
+		goto tr3244;
+	goto tr2360;
+tr3244:
 	{
 		s->item_length = 0;
 	}
@@ -74251,40 +74357,40 @@ tr3233:
 			p--; {goto st261;}
 		}
 	}
-	goto st1073;
-st1073:
+	goto st1082;
+st1082:
 	if ( ++p == pe )
-		goto _test_eof1073;
-case 1073:
+		goto _test_eof1082;
+case 1082:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3236;
+			goto tr3247;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3236;
+			goto tr3247;
 	} else
-		goto tr3236;
-	goto tr2349;
-tr3236:
+		goto tr3247;
+	goto tr2360;
+tr3247:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1074;
-st1074:
+	goto st1083;
+st1083:
 	if ( ++p == pe )
-		goto _test_eof1074;
-case 1074:
+		goto _test_eof1083;
+case 1083:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3237;
+			goto tr3248;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3237;
+			goto tr3248;
 	} else
-		goto tr3237;
-	goto tr2349;
-tr3237:
+		goto tr3248;
+	goto tr2360;
+tr3248:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -74293,52 +74399,52 @@ tr3237:
 			p--; {goto st261;}
 		}
 	}
-	goto st1075;
-st1075:
+	goto st1084;
+st1084:
 	if ( ++p == pe )
-		goto _test_eof1075;
-case 1075:
+		goto _test_eof1084;
+case 1084:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3238;
+			goto tr3249;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3238;
+			goto tr3249;
 	} else
-		goto tr3238;
-	goto tr2349;
-tr3238:
+		goto tr3249;
+	goto tr2360;
+tr3249:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1076;
-st1076:
+	goto st1085;
+st1085:
 	if ( ++p == pe )
-		goto _test_eof1076;
-case 1076:
+		goto _test_eof1085;
+case 1085:
 	if ( (*p) == 58 )
-		goto tr3240;
-	goto tr3239;
-tr3240:
+		goto tr3251;
+	goto tr3250;
+tr3251:
 	{
 		s->item_length++;
 	}
-	goto st1077;
-st1077:
+	goto st1086;
+st1086:
 	if ( ++p == pe )
-		goto _test_eof1077;
-case 1077:
+		goto _test_eof1086;
+case 1086:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3241;
+			goto tr3252;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3241;
+			goto tr3252;
 	} else
-		goto tr3241;
-	goto tr2349;
-tr3241:
+		goto tr3252;
+	goto tr2360;
+tr3252:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -74347,40 +74453,40 @@ tr3241:
 			p--; {goto st261;}
 		}
 	}
-	goto st1078;
-st1078:
+	goto st1087;
+st1087:
 	if ( ++p == pe )
-		goto _test_eof1078;
-case 1078:
+		goto _test_eof1087;
+case 1087:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3242;
+			goto tr3253;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3242;
+			goto tr3253;
 	} else
-		goto tr3242;
-	goto tr2349;
-tr3242:
+		goto tr3253;
+	goto tr2360;
+tr3253:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1079;
-st1079:
+	goto st1088;
+st1088:
 	if ( ++p == pe )
-		goto _test_eof1079;
-case 1079:
+		goto _test_eof1088;
+case 1088:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3243;
+			goto tr3254;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3243;
+			goto tr3254;
 	} else
-		goto tr3243;
-	goto tr2349;
-tr3243:
+		goto tr3254;
+	goto tr2360;
+tr3254:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -74389,42 +74495,42 @@ tr3243:
 			p--; {goto st261;}
 		}
 	}
-	goto st1080;
-st1080:
+	goto st1089;
+st1089:
 	if ( ++p == pe )
-		goto _test_eof1080;
-case 1080:
+		goto _test_eof1089;
+case 1089:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3244;
+			goto tr3255;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3244;
+			goto tr3255;
 	} else
-		goto tr3244;
-	goto tr2349;
-tr3244:
+		goto tr3255;
+	goto tr2360;
+tr3255:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1081;
-st1081:
+	goto st1090;
+st1090:
 	if ( ++p == pe )
-		goto _test_eof1081;
-case 1081:
+		goto _test_eof1090;
+case 1090:
 	switch( (*p) ) {
-		case 32: goto tr3246;
-		case 58: goto tr3240;
-		case 59: goto tr3246;
+		case 32: goto tr3257;
+		case 58: goto tr3251;
+		case 59: goto tr3257;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3246;
+			goto tr3257;
 	} else if ( (*p) >= 9 )
-		goto tr3246;
-	goto tr3245;
-tr3246:
+		goto tr3257;
+	goto tr3256;
+tr3257:
 	{
 		s->item_length++;
 	}
@@ -74437,13 +74543,13 @@ tr3246:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1193;
-st1193:
+	goto st1202;
+st1202:
 	if ( ++p == pe )
-		goto _test_eof1193;
-case 1193:
+		goto _test_eof1202;
+case 1202:
 	goto st0;
-tr3229:
+tr3240:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74453,11 +74559,11 @@ tr3229:
 			p--; {goto st261;}
 		}
 	}
-	goto st1082;
-st1082:
+	goto st1091;
+st1091:
 	if ( ++p == pe )
-		goto _test_eof1082;
-case 1082:
+		goto _test_eof1091;
+case 1091:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -74477,24 +74583,24 @@ case 1082:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3234;
+		goto tr3245;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1082;
+		goto st1091;
 	goto tr71;
-st1083:
+st1092:
 	if ( ++p == pe )
-		goto _test_eof1083;
-case 1083:
+		goto _test_eof1092;
+case 1092:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3247;
+			goto tr3258;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3247;
+			goto tr3258;
 	} else
-		goto tr3247;
-	goto tr2349;
-tr3247:
+		goto tr3258;
+	goto tr2360;
+tr3258:
 	{
 		s->item_length = 0;
 	}
@@ -74506,52 +74612,52 @@ tr3247:
 			p--; {goto st261;}
 		}
 	}
-	goto st1084;
-st1084:
+	goto st1093;
+st1093:
 	if ( ++p == pe )
-		goto _test_eof1084;
-case 1084:
+		goto _test_eof1093;
+case 1093:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3248;
+			goto tr3259;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3248;
+			goto tr3259;
 	} else
-		goto tr3248;
-	goto tr2349;
-tr3248:
+		goto tr3259;
+	goto tr2360;
+tr3259:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1085;
-st1085:
+	goto st1094;
+st1094:
 	if ( ++p == pe )
-		goto _test_eof1085;
-case 1085:
+		goto _test_eof1094;
+case 1094:
 	if ( (*p) == 45 )
-		goto tr3250;
-	goto tr3249;
-tr3250:
+		goto tr3261;
+	goto tr3260;
+tr3261:
 	{
 		s->item_length++;
 	}
-	goto st1086;
-st1086:
+	goto st1095;
+st1095:
 	if ( ++p == pe )
-		goto _test_eof1086;
-case 1086:
+		goto _test_eof1095;
+case 1095:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3251;
+			goto tr3262;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3251;
+			goto tr3262;
 	} else
-		goto tr3251;
-	goto tr2349;
-tr3251:
+		goto tr3262;
+	goto tr2360;
+tr3262:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -74560,42 +74666,42 @@ tr3251:
 			p--; {goto st261;}
 		}
 	}
-	goto st1087;
-st1087:
+	goto st1096;
+st1096:
 	if ( ++p == pe )
-		goto _test_eof1087;
-case 1087:
+		goto _test_eof1096;
+case 1096:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3252;
+			goto tr3263;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3252;
+			goto tr3263;
 	} else
-		goto tr3252;
-	goto tr2349;
-tr3252:
+		goto tr3263;
+	goto tr2360;
+tr3263:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1088;
-st1088:
+	goto st1097;
+st1097:
 	if ( ++p == pe )
-		goto _test_eof1088;
-case 1088:
+		goto _test_eof1097;
+case 1097:
 	switch( (*p) ) {
-		case 32: goto tr3253;
-		case 45: goto tr3250;
-		case 59: goto tr3253;
+		case 32: goto tr3264;
+		case 45: goto tr3261;
+		case 59: goto tr3264;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3253;
+			goto tr3264;
 	} else if ( (*p) >= 9 )
-		goto tr3253;
-	goto tr3249;
-tr3253:
+		goto tr3264;
+	goto tr3260;
+tr3264:
 	{
 		s->item_length++;
 	}
@@ -74608,26 +74714,26 @@ tr3253:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1194;
-st1194:
+	goto st1203;
+st1203:
 	if ( ++p == pe )
-		goto _test_eof1194;
-case 1194:
+		goto _test_eof1203;
+case 1203:
 	goto st0;
-st1089:
+st1098:
 	if ( ++p == pe )
-		goto _test_eof1089;
-case 1089:
+		goto _test_eof1098;
+case 1098:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3254;
+			goto tr3265;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3254;
+			goto tr3265;
 	} else
-		goto tr3254;
-	goto tr2349;
-tr3254:
+		goto tr3265;
+	goto tr2360;
+tr3265:
 	{
 		s->item_length = 0;
 	}
@@ -74639,52 +74745,52 @@ tr3254:
 			p--; {goto st261;}
 		}
 	}
-	goto st1090;
-st1090:
+	goto st1099;
+st1099:
 	if ( ++p == pe )
-		goto _test_eof1090;
-case 1090:
+		goto _test_eof1099;
+case 1099:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3255;
+			goto tr3266;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3255;
+			goto tr3266;
 	} else
-		goto tr3255;
-	goto tr2349;
-tr3255:
+		goto tr3266;
+	goto tr2360;
+tr3266:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1091;
-st1091:
+	goto st1100;
+st1100:
 	if ( ++p == pe )
-		goto _test_eof1091;
-case 1091:
+		goto _test_eof1100;
+case 1100:
 	if ( (*p) == 45 )
-		goto tr3256;
-	goto tr3249;
-tr3256:
+		goto tr3267;
+	goto tr3260;
+tr3267:
 	{
 		s->item_length++;
 	}
-	goto st1092;
-st1092:
+	goto st1101;
+st1101:
 	if ( ++p == pe )
-		goto _test_eof1092;
-case 1092:
+		goto _test_eof1101;
+case 1101:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3257;
+			goto tr3268;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3257;
+			goto tr3268;
 	} else
-		goto tr3257;
-	goto tr2349;
-tr3257:
+		goto tr3268;
+	goto tr2360;
+tr3268:
 	{
 		if (rdata_tail <= rdata_stop) {
 			*rdata_tail = first_hex_to_num[(uint8_t)(*p)];
@@ -74693,42 +74799,42 @@ tr3257:
 			p--; {goto st261;}
 		}
 	}
-	goto st1093;
-st1093:
+	goto st1102;
+st1102:
 	if ( ++p == pe )
-		goto _test_eof1093;
-case 1093:
+		goto _test_eof1102;
+case 1102:
 	if ( (*p) < 65 ) {
 		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr3258;
+			goto tr3269;
 	} else if ( (*p) > 70 ) {
 		if ( 97 <= (*p) && (*p) <= 102 )
-			goto tr3258;
+			goto tr3269;
 	} else
-		goto tr3258;
-	goto tr2349;
-tr3258:
+		goto tr3269;
+	goto tr2360;
+tr3269:
 	{
 		*rdata_tail += second_hex_to_num[(uint8_t)(*p)];
 		rdata_tail++;
 	}
-	goto st1094;
-st1094:
+	goto st1103;
+st1103:
 	if ( ++p == pe )
-		goto _test_eof1094;
-case 1094:
+		goto _test_eof1103;
+case 1103:
 	switch( (*p) ) {
-		case 32: goto tr3259;
-		case 45: goto tr3256;
-		case 59: goto tr3259;
+		case 32: goto tr3270;
+		case 45: goto tr3267;
+		case 59: goto tr3270;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3259;
+			goto tr3270;
 	} else if ( (*p) >= 9 )
-		goto tr3259;
-	goto tr3249;
-tr3259:
+		goto tr3270;
+	goto tr3260;
+tr3270:
 	{
 		s->item_length++;
 	}
@@ -74741,20 +74847,20 @@ tr3259:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1195;
-st1195:
+	goto st1204;
+st1204:
 	if ( ++p == pe )
-		goto _test_eof1195;
-case 1195:
+		goto _test_eof1204;
+case 1204:
 	goto st0;
-st1095:
+st1104:
 	if ( ++p == pe )
-		goto _test_eof1095;
-case 1095:
+		goto _test_eof1104;
+case 1104:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3260;
-	goto tr1746;
-tr3260:
+		goto tr3271;
+	goto tr1757;
+tr3271:
 	{
 		s->number64 = 0;
 	}
@@ -74772,8 +74878,8 @@ tr3260:
 			p--; {goto st261;}
 		}
 	}
-	goto st1096;
-tr3264:
+	goto st1105;
+tr3275:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -74788,11 +74894,11 @@ tr3264:
 			p--; {goto st261;}
 		}
 	}
-	goto st1096;
-st1096:
+	goto st1105;
+st1105:
 	if ( ++p == pe )
-		goto _test_eof1096;
-case 1096:
+		goto _test_eof1105;
+case 1105:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -74806,17 +74912,17 @@ case 1096:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3261;
-		case 32: goto tr3261;
-		case 40: goto tr3262;
-		case 41: goto tr3263;
-		case 1034: goto tr3265;
-		case 1083: goto tr3266;
+		case 9: goto tr3272;
+		case 32: goto tr3272;
+		case 40: goto tr3273;
+		case 41: goto tr3274;
+		case 1034: goto tr3276;
+		case 1083: goto tr3277;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3264;
-	goto tr1746;
-tr3268:
+		goto tr3275;
+	goto tr1757;
+tr3279:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -74824,8 +74930,8 @@ tr3268:
 		}
 		s->multiline = true;
 	}
-	goto st1097;
-tr3269:
+	goto st1106;
+tr3280:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -74833,13 +74939,13 @@ tr3269:
 		}
 		s->multiline = false;
 	}
-	goto st1097;
-tr3271:
+	goto st1106;
+tr3282:
 	{
 		s->line_counter++;
 	}
-	goto st1097;
-tr3261:
+	goto st1106;
+tr3272:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74849,8 +74955,8 @@ tr3261:
 			p--; {goto st261;}
 		}
 	}
-	goto st1097;
-tr3262:
+	goto st1106;
+tr3273:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74867,8 +74973,8 @@ tr3262:
 		}
 		s->multiline = true;
 	}
-	goto st1097;
-tr3263:
+	goto st1106;
+tr3274:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74885,8 +74991,8 @@ tr3263:
 		}
 		s->multiline = false;
 	}
-	goto st1097;
-tr3265:
+	goto st1106;
+tr3276:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -74899,11 +75005,11 @@ tr3265:
 	{
 		s->line_counter++;
 	}
-	goto st1097;
-st1097:
+	goto st1106;
+st1106:
 	if ( ++p == pe )
-		goto _test_eof1097;
-case 1097:
+		goto _test_eof1106;
+case 1106:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -74917,17 +75023,17 @@ case 1097:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1097;
-		case 32: goto st1097;
-		case 40: goto tr3268;
-		case 41: goto tr3269;
-		case 1034: goto tr3271;
-		case 1083: goto st1102;
+		case 9: goto st1106;
+		case 32: goto st1106;
+		case 40: goto tr3279;
+		case 41: goto tr3280;
+		case 1034: goto tr3282;
+		case 1083: goto st1111;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3270;
-	goto tr1746;
-tr3270:
+		goto tr3281;
+	goto tr1757;
+tr3281:
 	{
 		s->number64 = 0;
 	}
@@ -74945,8 +75051,8 @@ tr3270:
 			p--; {goto st261;}
 		}
 	}
-	goto st1098;
-tr3276:
+	goto st1107;
+tr3287:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -74961,11 +75067,11 @@ tr3276:
 			p--; {goto st261;}
 		}
 	}
-	goto st1098;
-st1098:
+	goto st1107;
+st1107:
 	if ( ++p == pe )
-		goto _test_eof1098;
-case 1098:
+		goto _test_eof1107;
+case 1107:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -74979,17 +75085,17 @@ case 1098:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3273;
-		case 32: goto tr3273;
-		case 40: goto tr3274;
-		case 41: goto tr3275;
-		case 1034: goto tr3277;
-		case 1083: goto tr3278;
+		case 9: goto tr3284;
+		case 32: goto tr3284;
+		case 40: goto tr3285;
+		case 41: goto tr3286;
+		case 1034: goto tr3288;
+		case 1083: goto tr3289;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3276;
-	goto tr1746;
-tr3281:
+		goto tr3287;
+	goto tr1757;
+tr3292:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -74997,8 +75103,8 @@ tr3281:
 		}
 		s->multiline = true;
 	}
-	goto st1099;
-tr3282:
+	goto st1108;
+tr3293:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -75006,13 +75112,13 @@ tr3282:
 		}
 		s->multiline = false;
 	}
-	goto st1099;
-tr3283:
+	goto st1108;
+tr3294:
 	{
 		s->line_counter++;
 	}
-	goto st1099;
-tr3273:
+	goto st1108;
+tr3284:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -75022,8 +75128,8 @@ tr3273:
 			p--; {goto st261;}
 		}
 	}
-	goto st1099;
-tr3274:
+	goto st1108;
+tr3285:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -75040,8 +75146,8 @@ tr3274:
 		}
 		s->multiline = true;
 	}
-	goto st1099;
-tr3275:
+	goto st1108;
+tr3286:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -75058,8 +75164,8 @@ tr3275:
 		}
 		s->multiline = false;
 	}
-	goto st1099;
-tr3277:
+	goto st1108;
+tr3288:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -75072,11 +75178,11 @@ tr3277:
 	{
 		s->line_counter++;
 	}
-	goto st1099;
-st1099:
+	goto st1108;
+st1108:
 	if ( ++p == pe )
-		goto _test_eof1099;
-case 1099:
+		goto _test_eof1108;
+case 1108:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -75090,50 +75196,50 @@ case 1099:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1099;
-		case 32: goto st1099;
-		case 40: goto tr3281;
-		case 41: goto tr3282;
-		case 1034: goto tr3283;
-		case 1083: goto st1101;
+		case 9: goto st1108;
+		case 32: goto st1108;
+		case 40: goto tr3292;
+		case 41: goto tr3293;
+		case 1034: goto tr3294;
+		case 1083: goto st1110;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr3279;
+			goto tr3290;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr3279;
+			goto tr3290;
 	} else
-		goto tr3279;
+		goto tr3290;
 	goto tr71;
-tr3279:
-	{ p--; {stack[top++] = 1100; goto st272;} }
-	goto st1100;
-st1100:
+tr3290:
+	{ p--; {stack[top++] = 1109; goto st272;} }
+	goto st1109;
+st1109:
 	if ( ++p == pe )
-		goto _test_eof1100;
-case 1100:
+		goto _test_eof1109;
+case 1109:
 	switch( (*p) ) {
-		case 32: goto tr3285;
-		case 59: goto tr3285;
+		case 32: goto tr3296;
+		case 59: goto tr3296;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3285;
+			goto tr3296;
 	} else if ( (*p) >= 9 )
-		goto tr3285;
+		goto tr3296;
 	goto tr71;
-tr3285:
+tr3296:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1196;
-st1196:
+	goto st1205;
+st1205:
 	if ( ++p == pe )
-		goto _test_eof1196;
-case 1196:
+		goto _test_eof1205;
+case 1205:
 	goto st0;
-tr3278:
+tr3289:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -75143,11 +75249,11 @@ tr3278:
 			p--; {goto st261;}
 		}
 	}
-	goto st1101;
-st1101:
+	goto st1110;
+st1110:
 	if ( ++p == pe )
-		goto _test_eof1101;
-case 1101:
+		goto _test_eof1110;
+case 1110:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -75167,11 +75273,11 @@ case 1101:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3283;
+		goto tr3294;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1101;
+		goto st1110;
 	goto tr71;
-tr3266:
+tr3277:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			*((uint16_t *)rdata_tail) = htons((uint16_t)(s->number64));
@@ -75181,11 +75287,11 @@ tr3266:
 			p--; {goto st261;}
 		}
 	}
-	goto st1102;
-st1102:
+	goto st1111;
+st1111:
 	if ( ++p == pe )
-		goto _test_eof1102;
-case 1102:
+		goto _test_eof1111;
+case 1111:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -75205,18 +75311,18 @@ case 1102:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3271;
+		goto tr3282;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1102;
+		goto st1111;
 	goto tr71;
-st1103:
+st1112:
 	if ( ++p == pe )
-		goto _test_eof1103;
-case 1103:
+		goto _test_eof1112;
+case 1112:
 	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr3286;
-	goto tr1746;
-tr3286:
+		goto tr3297;
+	goto tr1757;
+tr3297:
 	{
 		s->number64 = 0;
 	}
@@ -75234,8 +75340,8 @@ tr3286:
 			p--; {goto st261;}
 		}
 	}
-	goto st1104;
-tr3290:
+	goto st1113;
+tr3301:
 	{
 		// Overflow check: 10*(s->number64) + fc - '0' <= UINT64_MAX
 		if ((s->number64 < (UINT64_MAX / 10)) ||   // Dominant fast check.
@@ -75250,11 +75356,11 @@ tr3290:
 			p--; {goto st261;}
 		}
 	}
-	goto st1104;
-st1104:
+	goto st1113;
+st1113:
 	if ( ++p == pe )
-		goto _test_eof1104;
-case 1104:
+		goto _test_eof1113;
+case 1113:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -75268,17 +75374,17 @@ case 1104:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3287;
-		case 32: goto tr3287;
-		case 40: goto tr3288;
-		case 41: goto tr3289;
-		case 1034: goto tr3291;
-		case 1083: goto tr3292;
+		case 9: goto tr3298;
+		case 32: goto tr3298;
+		case 40: goto tr3299;
+		case 41: goto tr3300;
+		case 1034: goto tr3302;
+		case 1083: goto tr3303;
 	}
 	if ( 48 <= _widec && _widec <= 57 )
-		goto tr3290;
-	goto tr1746;
-tr3295:
+		goto tr3301;
+	goto tr1757;
+tr3306:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -75286,8 +75392,8 @@ tr3295:
 		}
 		s->multiline = true;
 	}
-	goto st1105;
-tr3296:
+	goto st1114;
+tr3307:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -75295,13 +75401,13 @@ tr3296:
 		}
 		s->multiline = false;
 	}
-	goto st1105;
-tr3297:
+	goto st1114;
+tr3308:
 	{
 		s->line_counter++;
 	}
-	goto st1105;
-tr3287:
+	goto st1114;
+tr3298:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -75311,8 +75417,8 @@ tr3287:
 			p--; {goto st261;}
 		}
 	}
-	goto st1105;
-tr3288:
+	goto st1114;
+tr3299:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -75329,8 +75435,8 @@ tr3288:
 		}
 		s->multiline = true;
 	}
-	goto st1105;
-tr3289:
+	goto st1114;
+tr3300:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -75347,8 +75453,8 @@ tr3289:
 		}
 		s->multiline = false;
 	}
-	goto st1105;
-tr3291:
+	goto st1114;
+tr3302:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -75361,11 +75467,11 @@ tr3291:
 	{
 		s->line_counter++;
 	}
-	goto st1105;
-st1105:
+	goto st1114;
+st1114:
 	if ( ++p == pe )
-		goto _test_eof1105;
-case 1105:
+		goto _test_eof1114;
+case 1114:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -75379,23 +75485,23 @@ case 1105:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1105;
-		case 32: goto st1105;
-		case 40: goto tr3295;
-		case 41: goto tr3296;
-		case 1034: goto tr3297;
-		case 1083: goto st1110;
+		case 9: goto st1114;
+		case 32: goto st1114;
+		case 40: goto tr3306;
+		case 41: goto tr3307;
+		case 1034: goto tr3308;
+		case 1083: goto st1119;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr3293;
+			goto tr3304;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr3293;
+			goto tr3304;
 	} else
-		goto tr3293;
+		goto tr3304;
 	goto tr71;
-tr3293:
+tr3304:
 	{
 		if (rdata_tail <= rdata_stop) {
 			s->item_length_location = rdata_tail++;
@@ -75404,12 +75510,12 @@ tr3293:
 			p--; {goto st261;}
 		}
 	}
-	{ p--; {stack[top++] = 1106; goto st272;} }
-	goto st1106;
-st1106:
+	{ p--; {stack[top++] = 1115; goto st272;} }
+	goto st1115;
+st1115:
 	if ( ++p == pe )
-		goto _test_eof1106;
-case 1106:
+		goto _test_eof1115;
+case 1115:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -75423,15 +75529,15 @@ case 1106:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto tr3299;
-		case 32: goto tr3299;
-		case 40: goto tr3300;
-		case 41: goto tr3301;
-		case 1034: goto tr3302;
-		case 1083: goto tr3303;
+		case 9: goto tr3310;
+		case 32: goto tr3310;
+		case 40: goto tr3311;
+		case 41: goto tr3312;
+		case 1034: goto tr3313;
+		case 1083: goto tr3314;
 	}
 	goto tr71;
-tr3306:
+tr3317:
 	{
 		if (s->multiline == true) {
 			ERR(ZS_LEFT_PARENTHESIS);
@@ -75439,8 +75545,8 @@ tr3306:
 		}
 		s->multiline = true;
 	}
-	goto st1107;
-tr3307:
+	goto st1116;
+tr3318:
 	{
 		if (s->multiline == false) {
 			ERR(ZS_RIGHT_PARENTHESIS);
@@ -75448,13 +75554,13 @@ tr3307:
 		}
 		s->multiline = false;
 	}
-	goto st1107;
-tr3308:
+	goto st1116;
+tr3319:
 	{
 		s->line_counter++;
 	}
-	goto st1107;
-tr3299:
+	goto st1116;
+tr3310:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -75465,8 +75571,8 @@ tr3299:
 			p--; {goto st261;}
 		}
 	}
-	goto st1107;
-tr3300:
+	goto st1116;
+tr3311:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -75484,8 +75590,8 @@ tr3300:
 		}
 		s->multiline = true;
 	}
-	goto st1107;
-tr3301:
+	goto st1116;
+tr3312:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -75503,8 +75609,8 @@ tr3301:
 		}
 		s->multiline = false;
 	}
-	goto st1107;
-tr3302:
+	goto st1116;
+tr3313:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -75518,11 +75624,11 @@ tr3302:
 	{
 		s->line_counter++;
 	}
-	goto st1107;
-st1107:
+	goto st1116;
+st1116:
 	if ( ++p == pe )
-		goto _test_eof1107;
-case 1107:
+		goto _test_eof1116;
+case 1116:
 	_widec = (*p);
 	if ( (*p) > 10 ) {
 		if ( 59 <= (*p) && (*p) <= 59 ) {
@@ -75536,50 +75642,50 @@ case 1107:
  s->multiline  ) _widec += 256;
 	}
 	switch( _widec ) {
-		case 9: goto st1107;
-		case 32: goto st1107;
-		case 40: goto tr3306;
-		case 41: goto tr3307;
-		case 1034: goto tr3308;
-		case 1083: goto st1109;
+		case 9: goto st1116;
+		case 32: goto st1116;
+		case 40: goto tr3317;
+		case 41: goto tr3318;
+		case 1034: goto tr3319;
+		case 1083: goto st1118;
 	}
 	if ( _widec < 11 ) {
 		if ( _widec <= 8 )
-			goto tr3304;
+			goto tr3315;
 	} else if ( _widec > 58 ) {
 		if ( 60 <= _widec )
-			goto tr3304;
+			goto tr3315;
 	} else
-		goto tr3304;
+		goto tr3315;
 	goto tr71;
-tr3304:
-	{ p--; {stack[top++] = 1108; goto st272;} }
-	goto st1108;
-st1108:
+tr3315:
+	{ p--; {stack[top++] = 1117; goto st272;} }
+	goto st1117;
+st1117:
 	if ( ++p == pe )
-		goto _test_eof1108;
-case 1108:
+		goto _test_eof1117;
+case 1117:
 	switch( (*p) ) {
-		case 32: goto tr3310;
-		case 59: goto tr3310;
+		case 32: goto tr3321;
+		case 59: goto tr3321;
 	}
 	if ( (*p) > 10 ) {
 		if ( 40 <= (*p) && (*p) <= 41 )
-			goto tr3310;
+			goto tr3321;
 	} else if ( (*p) >= 9 )
-		goto tr3310;
+		goto tr3321;
 	goto tr71;
-tr3310:
+tr3321:
 	{
 		p--; {cs = stack[--top];goto _again;}
 	}
-	goto st1197;
-st1197:
+	goto st1206;
+st1206:
 	if ( ++p == pe )
-		goto _test_eof1197;
-case 1197:
+		goto _test_eof1206;
+case 1206:
 	goto st0;
-tr3303:
+tr3314:
 	{
 		s->item_length = rdata_tail - s->item_length_location - 1;
 
@@ -75590,11 +75696,11 @@ tr3303:
 			p--; {goto st261;}
 		}
 	}
-	goto st1109;
-st1109:
+	goto st1118;
+st1118:
 	if ( ++p == pe )
-		goto _test_eof1109;
-case 1109:
+		goto _test_eof1118;
+case 1118:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -75614,11 +75720,11 @@ case 1109:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3308;
+		goto tr3319;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1109;
+		goto st1118;
 	goto tr71;
-tr3292:
+tr3303:
 	{
 		if (s->number64 <= UINT8_MAX) {
 			*rdata_tail = (uint8_t)(s->number64);
@@ -75628,11 +75734,11 @@ tr3292:
 			p--; {goto st261;}
 		}
 	}
-	goto st1110;
-st1110:
+	goto st1119;
+st1119:
 	if ( ++p == pe )
-		goto _test_eof1110;
-case 1110:
+		goto _test_eof1119;
+case 1119:
 	_widec = (*p);
 	if ( (*p) < 10 ) {
 		if ( (*p) <= 9 ) {
@@ -75652,12 +75758,12 @@ case 1110:
  s->multiline  ) _widec += 256;
 	}
 	if ( _widec == 1034 )
-		goto tr3297;
+		goto tr3308;
 	if ( 896 <= _widec && _widec <= 1151 )
-		goto st1110;
+		goto st1119;
 	goto tr71;
 	}
-	_test_eof1111: cs = 1111; goto _test_eof;
+	_test_eof1120: cs = 1120; goto _test_eof;
 	_test_eof1: cs = 1; goto _test_eof;
 	_test_eof2: cs = 2; goto _test_eof;
 	_test_eof3: cs = 3; goto _test_eof;
@@ -75670,7 +75776,7 @@ case 1110:
 	_test_eof10: cs = 10; goto _test_eof;
 	_test_eof11: cs = 11; goto _test_eof;
 	_test_eof12: cs = 12; goto _test_eof;
-	_test_eof1112: cs = 1112; goto _test_eof;
+	_test_eof1121: cs = 1121; goto _test_eof;
 	_test_eof13: cs = 13; goto _test_eof;
 	_test_eof14: cs = 14; goto _test_eof;
 	_test_eof15: cs = 15; goto _test_eof;
@@ -75798,7 +75904,7 @@ case 1110:
 	_test_eof137: cs = 137; goto _test_eof;
 	_test_eof138: cs = 138; goto _test_eof;
 	_test_eof139: cs = 139; goto _test_eof;
-	_test_eof1113: cs = 1113; goto _test_eof;
+	_test_eof1122: cs = 1122; goto _test_eof;
 	_test_eof140: cs = 140; goto _test_eof;
 	_test_eof141: cs = 141; goto _test_eof;
 	_test_eof142: cs = 142; goto _test_eof;
@@ -75809,7 +75915,7 @@ case 1110:
 	_test_eof147: cs = 147; goto _test_eof;
 	_test_eof148: cs = 148; goto _test_eof;
 	_test_eof149: cs = 149; goto _test_eof;
-	_test_eof1114: cs = 1114; goto _test_eof;
+	_test_eof1123: cs = 1123; goto _test_eof;
 	_test_eof150: cs = 150; goto _test_eof;
 	_test_eof151: cs = 151; goto _test_eof;
 	_test_eof152: cs = 152; goto _test_eof;
@@ -75818,11 +75924,11 @@ case 1110:
 	_test_eof155: cs = 155; goto _test_eof;
 	_test_eof156: cs = 156; goto _test_eof;
 	_test_eof157: cs = 157; goto _test_eof;
-	_test_eof1115: cs = 1115; goto _test_eof;
+	_test_eof1124: cs = 1124; goto _test_eof;
 	_test_eof158: cs = 158; goto _test_eof;
 	_test_eof159: cs = 159; goto _test_eof;
 	_test_eof160: cs = 160; goto _test_eof;
-	_test_eof1116: cs = 1116; goto _test_eof;
+	_test_eof1125: cs = 1125; goto _test_eof;
 	_test_eof161: cs = 161; goto _test_eof;
 	_test_eof162: cs = 162; goto _test_eof;
 	_test_eof163: cs = 163; goto _test_eof;
@@ -75834,12 +75940,12 @@ case 1110:
 	_test_eof169: cs = 169; goto _test_eof;
 	_test_eof170: cs = 170; goto _test_eof;
 	_test_eof171: cs = 171; goto _test_eof;
-	_test_eof1117: cs = 1117; goto _test_eof;
+	_test_eof1126: cs = 1126; goto _test_eof;
 	_test_eof172: cs = 172; goto _test_eof;
 	_test_eof173: cs = 173; goto _test_eof;
 	_test_eof174: cs = 174; goto _test_eof;
 	_test_eof175: cs = 175; goto _test_eof;
-	_test_eof1118: cs = 1118; goto _test_eof;
+	_test_eof1127: cs = 1127; goto _test_eof;
 	_test_eof176: cs = 176; goto _test_eof;
 	_test_eof177: cs = 177; goto _test_eof;
 	_test_eof178: cs = 178; goto _test_eof;
@@ -75856,7 +75962,7 @@ case 1110:
 	_test_eof189: cs = 189; goto _test_eof;
 	_test_eof190: cs = 190; goto _test_eof;
 	_test_eof191: cs = 191; goto _test_eof;
-	_test_eof1119: cs = 1119; goto _test_eof;
+	_test_eof1128: cs = 1128; goto _test_eof;
 	_test_eof192: cs = 192; goto _test_eof;
 	_test_eof193: cs = 193; goto _test_eof;
 	_test_eof194: cs = 194; goto _test_eof;
@@ -75873,7 +75979,7 @@ case 1110:
 	_test_eof205: cs = 205; goto _test_eof;
 	_test_eof206: cs = 206; goto _test_eof;
 	_test_eof207: cs = 207; goto _test_eof;
-	_test_eof1120: cs = 1120; goto _test_eof;
+	_test_eof1129: cs = 1129; goto _test_eof;
 	_test_eof208: cs = 208; goto _test_eof;
 	_test_eof209: cs = 209; goto _test_eof;
 	_test_eof210: cs = 210; goto _test_eof;
@@ -75929,10 +76035,10 @@ case 1110:
 	_test_eof260: cs = 260; goto _test_eof;
 	_test_eof261: cs = 261; goto _test_eof;
 	_test_eof262: cs = 262; goto _test_eof;
-	_test_eof1121: cs = 1121; goto _test_eof;
+	_test_eof1130: cs = 1130; goto _test_eof;
 	_test_eof263: cs = 263; goto _test_eof;
 	_test_eof264: cs = 264; goto _test_eof;
-	_test_eof1122: cs = 1122; goto _test_eof;
+	_test_eof1131: cs = 1131; goto _test_eof;
 	_test_eof265: cs = 265; goto _test_eof;
 	_test_eof266: cs = 266; goto _test_eof;
 	_test_eof267: cs = 267; goto _test_eof;
@@ -75942,8 +76048,8 @@ case 1110:
 	_test_eof271: cs = 271; goto _test_eof;
 	_test_eof272: cs = 272; goto _test_eof;
 	_test_eof273: cs = 273; goto _test_eof;
-	_test_eof1123: cs = 1123; goto _test_eof;
-	_test_eof1124: cs = 1124; goto _test_eof;
+	_test_eof1132: cs = 1132; goto _test_eof;
+	_test_eof1133: cs = 1133; goto _test_eof;
 	_test_eof274: cs = 274; goto _test_eof;
 	_test_eof275: cs = 275; goto _test_eof;
 	_test_eof276: cs = 276; goto _test_eof;
@@ -75958,7 +76064,7 @@ case 1110:
 	_test_eof285: cs = 285; goto _test_eof;
 	_test_eof286: cs = 286; goto _test_eof;
 	_test_eof287: cs = 287; goto _test_eof;
-	_test_eof1125: cs = 1125; goto _test_eof;
+	_test_eof1134: cs = 1134; goto _test_eof;
 	_test_eof288: cs = 288; goto _test_eof;
 	_test_eof289: cs = 289; goto _test_eof;
 	_test_eof290: cs = 290; goto _test_eof;
@@ -75969,7 +76075,7 @@ case 1110:
 	_test_eof295: cs = 295; goto _test_eof;
 	_test_eof296: cs = 296; goto _test_eof;
 	_test_eof297: cs = 297; goto _test_eof;
-	_test_eof1126: cs = 1126; goto _test_eof;
+	_test_eof1135: cs = 1135; goto _test_eof;
 	_test_eof298: cs = 298; goto _test_eof;
 	_test_eof299: cs = 299; goto _test_eof;
 	_test_eof300: cs = 300; goto _test_eof;
@@ -75984,7 +76090,7 @@ case 1110:
 	_test_eof309: cs = 309; goto _test_eof;
 	_test_eof310: cs = 310; goto _test_eof;
 	_test_eof311: cs = 311; goto _test_eof;
-	_test_eof1127: cs = 1127; goto _test_eof;
+	_test_eof1136: cs = 1136; goto _test_eof;
 	_test_eof312: cs = 312; goto _test_eof;
 	_test_eof313: cs = 313; goto _test_eof;
 	_test_eof314: cs = 314; goto _test_eof;
@@ -75992,7 +76098,7 @@ case 1110:
 	_test_eof316: cs = 316; goto _test_eof;
 	_test_eof317: cs = 317; goto _test_eof;
 	_test_eof318: cs = 318; goto _test_eof;
-	_test_eof1128: cs = 1128; goto _test_eof;
+	_test_eof1137: cs = 1137; goto _test_eof;
 	_test_eof319: cs = 319; goto _test_eof;
 	_test_eof320: cs = 320; goto _test_eof;
 	_test_eof321: cs = 321; goto _test_eof;
@@ -76002,9 +76108,9 @@ case 1110:
 	_test_eof325: cs = 325; goto _test_eof;
 	_test_eof326: cs = 326; goto _test_eof;
 	_test_eof327: cs = 327; goto _test_eof;
-	_test_eof1129: cs = 1129; goto _test_eof;
-	_test_eof1130: cs = 1130; goto _test_eof;
-	_test_eof1131: cs = 1131; goto _test_eof;
+	_test_eof1138: cs = 1138; goto _test_eof;
+	_test_eof1139: cs = 1139; goto _test_eof;
+	_test_eof1140: cs = 1140; goto _test_eof;
 	_test_eof328: cs = 328; goto _test_eof;
 	_test_eof329: cs = 329; goto _test_eof;
 	_test_eof330: cs = 330; goto _test_eof;
@@ -76013,12 +76119,12 @@ case 1110:
 	_test_eof333: cs = 333; goto _test_eof;
 	_test_eof334: cs = 334; goto _test_eof;
 	_test_eof335: cs = 335; goto _test_eof;
-	_test_eof1132: cs = 1132; goto _test_eof;
-	_test_eof1133: cs = 1133; goto _test_eof;
+	_test_eof1141: cs = 1141; goto _test_eof;
+	_test_eof1142: cs = 1142; goto _test_eof;
 	_test_eof336: cs = 336; goto _test_eof;
 	_test_eof337: cs = 337; goto _test_eof;
 	_test_eof338: cs = 338; goto _test_eof;
-	_test_eof1134: cs = 1134; goto _test_eof;
+	_test_eof1143: cs = 1143; goto _test_eof;
 	_test_eof339: cs = 339; goto _test_eof;
 	_test_eof340: cs = 340; goto _test_eof;
 	_test_eof341: cs = 341; goto _test_eof;
@@ -76148,29 +76254,29 @@ case 1110:
 	_test_eof465: cs = 465; goto _test_eof;
 	_test_eof466: cs = 466; goto _test_eof;
 	_test_eof467: cs = 467; goto _test_eof;
-	_test_eof1135: cs = 1135; goto _test_eof;
-	_test_eof1136: cs = 1136; goto _test_eof;
-	_test_eof1137: cs = 1137; goto _test_eof;
+	_test_eof1144: cs = 1144; goto _test_eof;
+	_test_eof1145: cs = 1145; goto _test_eof;
+	_test_eof1146: cs = 1146; goto _test_eof;
 	_test_eof468: cs = 468; goto _test_eof;
 	_test_eof469: cs = 469; goto _test_eof;
 	_test_eof470: cs = 470; goto _test_eof;
 	_test_eof471: cs = 471; goto _test_eof;
 	_test_eof472: cs = 472; goto _test_eof;
-	_test_eof1138: cs = 1138; goto _test_eof;
+	_test_eof1147: cs = 1147; goto _test_eof;
 	_test_eof473: cs = 473; goto _test_eof;
 	_test_eof474: cs = 474; goto _test_eof;
 	_test_eof475: cs = 475; goto _test_eof;
 	_test_eof476: cs = 476; goto _test_eof;
-	_test_eof1139: cs = 1139; goto _test_eof;
-	_test_eof1140: cs = 1140; goto _test_eof;
-	_test_eof1141: cs = 1141; goto _test_eof;
+	_test_eof1148: cs = 1148; goto _test_eof;
+	_test_eof1149: cs = 1149; goto _test_eof;
+	_test_eof1150: cs = 1150; goto _test_eof;
 	_test_eof477: cs = 477; goto _test_eof;
 	_test_eof478: cs = 478; goto _test_eof;
-	_test_eof1142: cs = 1142; goto _test_eof;
+	_test_eof1151: cs = 1151; goto _test_eof;
 	_test_eof479: cs = 479; goto _test_eof;
 	_test_eof480: cs = 480; goto _test_eof;
 	_test_eof481: cs = 481; goto _test_eof;
-	_test_eof1143: cs = 1143; goto _test_eof;
+	_test_eof1152: cs = 1152; goto _test_eof;
 	_test_eof482: cs = 482; goto _test_eof;
 	_test_eof483: cs = 483; goto _test_eof;
 	_test_eof484: cs = 484; goto _test_eof;
@@ -76266,7 +76372,6 @@ case 1110:
 	_test_eof574: cs = 574; goto _test_eof;
 	_test_eof575: cs = 575; goto _test_eof;
 	_test_eof576: cs = 576; goto _test_eof;
-	_test_eof1144: cs = 1144; goto _test_eof;
 	_test_eof577: cs = 577; goto _test_eof;
 	_test_eof578: cs = 578; goto _test_eof;
 	_test_eof579: cs = 579; goto _test_eof;
@@ -76276,6 +76381,7 @@ case 1110:
 	_test_eof583: cs = 583; goto _test_eof;
 	_test_eof584: cs = 584; goto _test_eof;
 	_test_eof585: cs = 585; goto _test_eof;
+	_test_eof1153: cs = 1153; goto _test_eof;
 	_test_eof586: cs = 586; goto _test_eof;
 	_test_eof587: cs = 587; goto _test_eof;
 	_test_eof588: cs = 588; goto _test_eof;
@@ -76308,10 +76414,8 @@ case 1110:
 	_test_eof615: cs = 615; goto _test_eof;
 	_test_eof616: cs = 616; goto _test_eof;
 	_test_eof617: cs = 617; goto _test_eof;
-	_test_eof1145: cs = 1145; goto _test_eof;
 	_test_eof618: cs = 618; goto _test_eof;
 	_test_eof619: cs = 619; goto _test_eof;
-	_test_eof1146: cs = 1146; goto _test_eof;
 	_test_eof620: cs = 620; goto _test_eof;
 	_test_eof621: cs = 621; goto _test_eof;
 	_test_eof622: cs = 622; goto _test_eof;
@@ -76319,14 +76423,15 @@ case 1110:
 	_test_eof624: cs = 624; goto _test_eof;
 	_test_eof625: cs = 625; goto _test_eof;
 	_test_eof626: cs = 626; goto _test_eof;
+	_test_eof1154: cs = 1154; goto _test_eof;
 	_test_eof627: cs = 627; goto _test_eof;
 	_test_eof628: cs = 628; goto _test_eof;
+	_test_eof1155: cs = 1155; goto _test_eof;
 	_test_eof629: cs = 629; goto _test_eof;
 	_test_eof630: cs = 630; goto _test_eof;
 	_test_eof631: cs = 631; goto _test_eof;
 	_test_eof632: cs = 632; goto _test_eof;
 	_test_eof633: cs = 633; goto _test_eof;
-	_test_eof1147: cs = 1147; goto _test_eof;
 	_test_eof634: cs = 634; goto _test_eof;
 	_test_eof635: cs = 635; goto _test_eof;
 	_test_eof636: cs = 636; goto _test_eof;
@@ -76336,6 +76441,7 @@ case 1110:
 	_test_eof640: cs = 640; goto _test_eof;
 	_test_eof641: cs = 641; goto _test_eof;
 	_test_eof642: cs = 642; goto _test_eof;
+	_test_eof1156: cs = 1156; goto _test_eof;
 	_test_eof643: cs = 643; goto _test_eof;
 	_test_eof644: cs = 644; goto _test_eof;
 	_test_eof645: cs = 645; goto _test_eof;
@@ -76349,39 +76455,39 @@ case 1110:
 	_test_eof653: cs = 653; goto _test_eof;
 	_test_eof654: cs = 654; goto _test_eof;
 	_test_eof655: cs = 655; goto _test_eof;
-	_test_eof1148: cs = 1148; goto _test_eof;
 	_test_eof656: cs = 656; goto _test_eof;
 	_test_eof657: cs = 657; goto _test_eof;
 	_test_eof658: cs = 658; goto _test_eof;
 	_test_eof659: cs = 659; goto _test_eof;
 	_test_eof660: cs = 660; goto _test_eof;
-	_test_eof1149: cs = 1149; goto _test_eof;
 	_test_eof661: cs = 661; goto _test_eof;
 	_test_eof662: cs = 662; goto _test_eof;
 	_test_eof663: cs = 663; goto _test_eof;
 	_test_eof664: cs = 664; goto _test_eof;
+	_test_eof1157: cs = 1157; goto _test_eof;
 	_test_eof665: cs = 665; goto _test_eof;
-	_test_eof1150: cs = 1150; goto _test_eof;
 	_test_eof666: cs = 666; goto _test_eof;
 	_test_eof667: cs = 667; goto _test_eof;
 	_test_eof668: cs = 668; goto _test_eof;
 	_test_eof669: cs = 669; goto _test_eof;
+	_test_eof1158: cs = 1158; goto _test_eof;
 	_test_eof670: cs = 670; goto _test_eof;
-	_test_eof1151: cs = 1151; goto _test_eof;
-	_test_eof1152: cs = 1152; goto _test_eof;
-	_test_eof1153: cs = 1153; goto _test_eof;
 	_test_eof671: cs = 671; goto _test_eof;
 	_test_eof672: cs = 672; goto _test_eof;
-	_test_eof1154: cs = 1154; goto _test_eof;
 	_test_eof673: cs = 673; goto _test_eof;
 	_test_eof674: cs = 674; goto _test_eof;
+	_test_eof1159: cs = 1159; goto _test_eof;
 	_test_eof675: cs = 675; goto _test_eof;
 	_test_eof676: cs = 676; goto _test_eof;
 	_test_eof677: cs = 677; goto _test_eof;
 	_test_eof678: cs = 678; goto _test_eof;
 	_test_eof679: cs = 679; goto _test_eof;
+	_test_eof1160: cs = 1160; goto _test_eof;
+	_test_eof1161: cs = 1161; goto _test_eof;
+	_test_eof1162: cs = 1162; goto _test_eof;
 	_test_eof680: cs = 680; goto _test_eof;
 	_test_eof681: cs = 681; goto _test_eof;
+	_test_eof1163: cs = 1163; goto _test_eof;
 	_test_eof682: cs = 682; goto _test_eof;
 	_test_eof683: cs = 683; goto _test_eof;
 	_test_eof684: cs = 684; goto _test_eof;
@@ -76400,35 +76506,35 @@ case 1110:
 	_test_eof697: cs = 697; goto _test_eof;
 	_test_eof698: cs = 698; goto _test_eof;
 	_test_eof699: cs = 699; goto _test_eof;
-	_test_eof1155: cs = 1155; goto _test_eof;
-	_test_eof1156: cs = 1156; goto _test_eof;
-	_test_eof1157: cs = 1157; goto _test_eof;
 	_test_eof700: cs = 700; goto _test_eof;
 	_test_eof701: cs = 701; goto _test_eof;
 	_test_eof702: cs = 702; goto _test_eof;
-	_test_eof1158: cs = 1158; goto _test_eof;
-	_test_eof1159: cs = 1159; goto _test_eof;
 	_test_eof703: cs = 703; goto _test_eof;
 	_test_eof704: cs = 704; goto _test_eof;
 	_test_eof705: cs = 705; goto _test_eof;
 	_test_eof706: cs = 706; goto _test_eof;
-	_test_eof1160: cs = 1160; goto _test_eof;
-	_test_eof1161: cs = 1161; goto _test_eof;
 	_test_eof707: cs = 707; goto _test_eof;
 	_test_eof708: cs = 708; goto _test_eof;
+	_test_eof1164: cs = 1164; goto _test_eof;
+	_test_eof1165: cs = 1165; goto _test_eof;
+	_test_eof1166: cs = 1166; goto _test_eof;
 	_test_eof709: cs = 709; goto _test_eof;
 	_test_eof710: cs = 710; goto _test_eof;
-	_test_eof1162: cs = 1162; goto _test_eof;
-	_test_eof1163: cs = 1163; goto _test_eof;
 	_test_eof711: cs = 711; goto _test_eof;
+	_test_eof1167: cs = 1167; goto _test_eof;
+	_test_eof1168: cs = 1168; goto _test_eof;
 	_test_eof712: cs = 712; goto _test_eof;
 	_test_eof713: cs = 713; goto _test_eof;
 	_test_eof714: cs = 714; goto _test_eof;
 	_test_eof715: cs = 715; goto _test_eof;
+	_test_eof1169: cs = 1169; goto _test_eof;
+	_test_eof1170: cs = 1170; goto _test_eof;
 	_test_eof716: cs = 716; goto _test_eof;
 	_test_eof717: cs = 717; goto _test_eof;
 	_test_eof718: cs = 718; goto _test_eof;
 	_test_eof719: cs = 719; goto _test_eof;
+	_test_eof1171: cs = 1171; goto _test_eof;
+	_test_eof1172: cs = 1172; goto _test_eof;
 	_test_eof720: cs = 720; goto _test_eof;
 	_test_eof721: cs = 721; goto _test_eof;
 	_test_eof722: cs = 722; goto _test_eof;
@@ -76445,7 +76551,6 @@ case 1110:
 	_test_eof733: cs = 733; goto _test_eof;
 	_test_eof734: cs = 734; goto _test_eof;
 	_test_eof735: cs = 735; goto _test_eof;
-	_test_eof1164: cs = 1164; goto _test_eof;
 	_test_eof736: cs = 736; goto _test_eof;
 	_test_eof737: cs = 737; goto _test_eof;
 	_test_eof738: cs = 738; goto _test_eof;
@@ -76455,13 +76560,13 @@ case 1110:
 	_test_eof742: cs = 742; goto _test_eof;
 	_test_eof743: cs = 743; goto _test_eof;
 	_test_eof744: cs = 744; goto _test_eof;
+	_test_eof1173: cs = 1173; goto _test_eof;
 	_test_eof745: cs = 745; goto _test_eof;
 	_test_eof746: cs = 746; goto _test_eof;
 	_test_eof747: cs = 747; goto _test_eof;
 	_test_eof748: cs = 748; goto _test_eof;
 	_test_eof749: cs = 749; goto _test_eof;
 	_test_eof750: cs = 750; goto _test_eof;
-	_test_eof1165: cs = 1165; goto _test_eof;
 	_test_eof751: cs = 751; goto _test_eof;
 	_test_eof752: cs = 752; goto _test_eof;
 	_test_eof753: cs = 753; goto _test_eof;
@@ -76471,11 +76576,11 @@ case 1110:
 	_test_eof757: cs = 757; goto _test_eof;
 	_test_eof758: cs = 758; goto _test_eof;
 	_test_eof759: cs = 759; goto _test_eof;
+	_test_eof1174: cs = 1174; goto _test_eof;
 	_test_eof760: cs = 760; goto _test_eof;
 	_test_eof761: cs = 761; goto _test_eof;
 	_test_eof762: cs = 762; goto _test_eof;
 	_test_eof763: cs = 763; goto _test_eof;
-	_test_eof1166: cs = 1166; goto _test_eof;
 	_test_eof764: cs = 764; goto _test_eof;
 	_test_eof765: cs = 765; goto _test_eof;
 	_test_eof766: cs = 766; goto _test_eof;
@@ -76485,27 +76590,25 @@ case 1110:
 	_test_eof770: cs = 770; goto _test_eof;
 	_test_eof771: cs = 771; goto _test_eof;
 	_test_eof772: cs = 772; goto _test_eof;
+	_test_eof1175: cs = 1175; goto _test_eof;
 	_test_eof773: cs = 773; goto _test_eof;
 	_test_eof774: cs = 774; goto _test_eof;
-	_test_eof1167: cs = 1167; goto _test_eof;
-	_test_eof1168: cs = 1168; goto _test_eof;
 	_test_eof775: cs = 775; goto _test_eof;
 	_test_eof776: cs = 776; goto _test_eof;
 	_test_eof777: cs = 777; goto _test_eof;
-	_test_eof1169: cs = 1169; goto _test_eof;
 	_test_eof778: cs = 778; goto _test_eof;
 	_test_eof779: cs = 779; goto _test_eof;
 	_test_eof780: cs = 780; goto _test_eof;
 	_test_eof781: cs = 781; goto _test_eof;
 	_test_eof782: cs = 782; goto _test_eof;
 	_test_eof783: cs = 783; goto _test_eof;
+	_test_eof1176: cs = 1176; goto _test_eof;
+	_test_eof1177: cs = 1177; goto _test_eof;
 	_test_eof784: cs = 784; goto _test_eof;
 	_test_eof785: cs = 785; goto _test_eof;
 	_test_eof786: cs = 786; goto _test_eof;
+	_test_eof1178: cs = 1178; goto _test_eof;
 	_test_eof787: cs = 787; goto _test_eof;
-	_test_eof1170: cs = 1170; goto _test_eof;
-	_test_eof1171: cs = 1171; goto _test_eof;
-	_test_eof1172: cs = 1172; goto _test_eof;
 	_test_eof788: cs = 788; goto _test_eof;
 	_test_eof789: cs = 789; goto _test_eof;
 	_test_eof790: cs = 790; goto _test_eof;
@@ -76515,11 +76618,11 @@ case 1110:
 	_test_eof794: cs = 794; goto _test_eof;
 	_test_eof795: cs = 795; goto _test_eof;
 	_test_eof796: cs = 796; goto _test_eof;
+	_test_eof1179: cs = 1179; goto _test_eof;
+	_test_eof1180: cs = 1180; goto _test_eof;
+	_test_eof1181: cs = 1181; goto _test_eof;
 	_test_eof797: cs = 797; goto _test_eof;
 	_test_eof798: cs = 798; goto _test_eof;
-	_test_eof1173: cs = 1173; goto _test_eof;
-	_test_eof1174: cs = 1174; goto _test_eof;
-	_test_eof1175: cs = 1175; goto _test_eof;
 	_test_eof799: cs = 799; goto _test_eof;
 	_test_eof800: cs = 800; goto _test_eof;
 	_test_eof801: cs = 801; goto _test_eof;
@@ -76529,30 +76632,33 @@ case 1110:
 	_test_eof805: cs = 805; goto _test_eof;
 	_test_eof806: cs = 806; goto _test_eof;
 	_test_eof807: cs = 807; goto _test_eof;
+	_test_eof1182: cs = 1182; goto _test_eof;
+	_test_eof1183: cs = 1183; goto _test_eof;
+	_test_eof1184: cs = 1184; goto _test_eof;
 	_test_eof808: cs = 808; goto _test_eof;
 	_test_eof809: cs = 809; goto _test_eof;
 	_test_eof810: cs = 810; goto _test_eof;
-	_test_eof1176: cs = 1176; goto _test_eof;
 	_test_eof811: cs = 811; goto _test_eof;
 	_test_eof812: cs = 812; goto _test_eof;
 	_test_eof813: cs = 813; goto _test_eof;
-	_test_eof1177: cs = 1177; goto _test_eof;
-	_test_eof1178: cs = 1178; goto _test_eof;
 	_test_eof814: cs = 814; goto _test_eof;
-	_test_eof1179: cs = 1179; goto _test_eof;
-	_test_eof1180: cs = 1180; goto _test_eof;
 	_test_eof815: cs = 815; goto _test_eof;
-	_test_eof1181: cs = 1181; goto _test_eof;
-	_test_eof1182: cs = 1182; goto _test_eof;
 	_test_eof816: cs = 816; goto _test_eof;
 	_test_eof817: cs = 817; goto _test_eof;
 	_test_eof818: cs = 818; goto _test_eof;
 	_test_eof819: cs = 819; goto _test_eof;
+	_test_eof1185: cs = 1185; goto _test_eof;
 	_test_eof820: cs = 820; goto _test_eof;
 	_test_eof821: cs = 821; goto _test_eof;
 	_test_eof822: cs = 822; goto _test_eof;
+	_test_eof1186: cs = 1186; goto _test_eof;
+	_test_eof1187: cs = 1187; goto _test_eof;
 	_test_eof823: cs = 823; goto _test_eof;
+	_test_eof1188: cs = 1188; goto _test_eof;
+	_test_eof1189: cs = 1189; goto _test_eof;
 	_test_eof824: cs = 824; goto _test_eof;
+	_test_eof1190: cs = 1190; goto _test_eof;
+	_test_eof1191: cs = 1191; goto _test_eof;
 	_test_eof825: cs = 825; goto _test_eof;
 	_test_eof826: cs = 826; goto _test_eof;
 	_test_eof827: cs = 827; goto _test_eof;
@@ -76586,7 +76692,6 @@ case 1110:
 	_test_eof855: cs = 855; goto _test_eof;
 	_test_eof856: cs = 856; goto _test_eof;
 	_test_eof857: cs = 857; goto _test_eof;
-	_test_eof1183: cs = 1183; goto _test_eof;
 	_test_eof858: cs = 858; goto _test_eof;
 	_test_eof859: cs = 859; goto _test_eof;
 	_test_eof860: cs = 860; goto _test_eof;
@@ -76596,6 +76701,7 @@ case 1110:
 	_test_eof864: cs = 864; goto _test_eof;
 	_test_eof865: cs = 865; goto _test_eof;
 	_test_eof866: cs = 866; goto _test_eof;
+	_test_eof1192: cs = 1192; goto _test_eof;
 	_test_eof867: cs = 867; goto _test_eof;
 	_test_eof868: cs = 868; goto _test_eof;
 	_test_eof869: cs = 869; goto _test_eof;
@@ -76726,7 +76832,6 @@ case 1110:
 	_test_eof994: cs = 994; goto _test_eof;
 	_test_eof995: cs = 995; goto _test_eof;
 	_test_eof996: cs = 996; goto _test_eof;
-	_test_eof1184: cs = 1184; goto _test_eof;
 	_test_eof997: cs = 997; goto _test_eof;
 	_test_eof998: cs = 998; goto _test_eof;
 	_test_eof999: cs = 999; goto _test_eof;
@@ -76735,22 +76840,23 @@ case 1110:
 	_test_eof1002: cs = 1002; goto _test_eof;
 	_test_eof1003: cs = 1003; goto _test_eof;
 	_test_eof1004: cs = 1004; goto _test_eof;
-	_test_eof1185: cs = 1185; goto _test_eof;
 	_test_eof1005: cs = 1005; goto _test_eof;
+	_test_eof1193: cs = 1193; goto _test_eof;
 	_test_eof1006: cs = 1006; goto _test_eof;
 	_test_eof1007: cs = 1007; goto _test_eof;
 	_test_eof1008: cs = 1008; goto _test_eof;
 	_test_eof1009: cs = 1009; goto _test_eof;
-	_test_eof1186: cs = 1186; goto _test_eof;
 	_test_eof1010: cs = 1010; goto _test_eof;
 	_test_eof1011: cs = 1011; goto _test_eof;
 	_test_eof1012: cs = 1012; goto _test_eof;
 	_test_eof1013: cs = 1013; goto _test_eof;
+	_test_eof1194: cs = 1194; goto _test_eof;
 	_test_eof1014: cs = 1014; goto _test_eof;
 	_test_eof1015: cs = 1015; goto _test_eof;
 	_test_eof1016: cs = 1016; goto _test_eof;
 	_test_eof1017: cs = 1017; goto _test_eof;
 	_test_eof1018: cs = 1018; goto _test_eof;
+	_test_eof1195: cs = 1195; goto _test_eof;
 	_test_eof1019: cs = 1019; goto _test_eof;
 	_test_eof1020: cs = 1020; goto _test_eof;
 	_test_eof1021: cs = 1021; goto _test_eof;
@@ -76760,7 +76866,6 @@ case 1110:
 	_test_eof1025: cs = 1025; goto _test_eof;
 	_test_eof1026: cs = 1026; goto _test_eof;
 	_test_eof1027: cs = 1027; goto _test_eof;
-	_test_eof1187: cs = 1187; goto _test_eof;
 	_test_eof1028: cs = 1028; goto _test_eof;
 	_test_eof1029: cs = 1029; goto _test_eof;
 	_test_eof1030: cs = 1030; goto _test_eof;
@@ -76770,6 +76875,7 @@ case 1110:
 	_test_eof1034: cs = 1034; goto _test_eof;
 	_test_eof1035: cs = 1035; goto _test_eof;
 	_test_eof1036: cs = 1036; goto _test_eof;
+	_test_eof1196: cs = 1196; goto _test_eof;
 	_test_eof1037: cs = 1037; goto _test_eof;
 	_test_eof1038: cs = 1038; goto _test_eof;
 	_test_eof1039: cs = 1039; goto _test_eof;
@@ -76780,7 +76886,6 @@ case 1110:
 	_test_eof1044: cs = 1044; goto _test_eof;
 	_test_eof1045: cs = 1045; goto _test_eof;
 	_test_eof1046: cs = 1046; goto _test_eof;
-	_test_eof1188: cs = 1188; goto _test_eof;
 	_test_eof1047: cs = 1047; goto _test_eof;
 	_test_eof1048: cs = 1048; goto _test_eof;
 	_test_eof1049: cs = 1049; goto _test_eof;
@@ -76790,15 +76895,13 @@ case 1110:
 	_test_eof1053: cs = 1053; goto _test_eof;
 	_test_eof1054: cs = 1054; goto _test_eof;
 	_test_eof1055: cs = 1055; goto _test_eof;
+	_test_eof1197: cs = 1197; goto _test_eof;
 	_test_eof1056: cs = 1056; goto _test_eof;
 	_test_eof1057: cs = 1057; goto _test_eof;
 	_test_eof1058: cs = 1058; goto _test_eof;
 	_test_eof1059: cs = 1059; goto _test_eof;
 	_test_eof1060: cs = 1060; goto _test_eof;
 	_test_eof1061: cs = 1061; goto _test_eof;
-	_test_eof1189: cs = 1189; goto _test_eof;
-	_test_eof1190: cs = 1190; goto _test_eof;
-	_test_eof1191: cs = 1191; goto _test_eof;
 	_test_eof1062: cs = 1062; goto _test_eof;
 	_test_eof1063: cs = 1063; goto _test_eof;
 	_test_eof1064: cs = 1064; goto _test_eof;
@@ -76806,9 +76909,11 @@ case 1110:
 	_test_eof1066: cs = 1066; goto _test_eof;
 	_test_eof1067: cs = 1067; goto _test_eof;
 	_test_eof1068: cs = 1068; goto _test_eof;
-	_test_eof1192: cs = 1192; goto _test_eof;
 	_test_eof1069: cs = 1069; goto _test_eof;
 	_test_eof1070: cs = 1070; goto _test_eof;
+	_test_eof1198: cs = 1198; goto _test_eof;
+	_test_eof1199: cs = 1199; goto _test_eof;
+	_test_eof1200: cs = 1200; goto _test_eof;
 	_test_eof1071: cs = 1071; goto _test_eof;
 	_test_eof1072: cs = 1072; goto _test_eof;
 	_test_eof1073: cs = 1073; goto _test_eof;
@@ -76816,11 +76921,11 @@ case 1110:
 	_test_eof1075: cs = 1075; goto _test_eof;
 	_test_eof1076: cs = 1076; goto _test_eof;
 	_test_eof1077: cs = 1077; goto _test_eof;
+	_test_eof1201: cs = 1201; goto _test_eof;
 	_test_eof1078: cs = 1078; goto _test_eof;
 	_test_eof1079: cs = 1079; goto _test_eof;
 	_test_eof1080: cs = 1080; goto _test_eof;
 	_test_eof1081: cs = 1081; goto _test_eof;
-	_test_eof1193: cs = 1193; goto _test_eof;
 	_test_eof1082: cs = 1082; goto _test_eof;
 	_test_eof1083: cs = 1083; goto _test_eof;
 	_test_eof1084: cs = 1084; goto _test_eof;
@@ -76828,32 +76933,42 @@ case 1110:
 	_test_eof1086: cs = 1086; goto _test_eof;
 	_test_eof1087: cs = 1087; goto _test_eof;
 	_test_eof1088: cs = 1088; goto _test_eof;
-	_test_eof1194: cs = 1194; goto _test_eof;
 	_test_eof1089: cs = 1089; goto _test_eof;
 	_test_eof1090: cs = 1090; goto _test_eof;
+	_test_eof1202: cs = 1202; goto _test_eof;
 	_test_eof1091: cs = 1091; goto _test_eof;
 	_test_eof1092: cs = 1092; goto _test_eof;
 	_test_eof1093: cs = 1093; goto _test_eof;
 	_test_eof1094: cs = 1094; goto _test_eof;
-	_test_eof1195: cs = 1195; goto _test_eof;
 	_test_eof1095: cs = 1095; goto _test_eof;
 	_test_eof1096: cs = 1096; goto _test_eof;
 	_test_eof1097: cs = 1097; goto _test_eof;
+	_test_eof1203: cs = 1203; goto _test_eof;
 	_test_eof1098: cs = 1098; goto _test_eof;
 	_test_eof1099: cs = 1099; goto _test_eof;
 	_test_eof1100: cs = 1100; goto _test_eof;
-	_test_eof1196: cs = 1196; goto _test_eof;
 	_test_eof1101: cs = 1101; goto _test_eof;
 	_test_eof1102: cs = 1102; goto _test_eof;
 	_test_eof1103: cs = 1103; goto _test_eof;
+	_test_eof1204: cs = 1204; goto _test_eof;
 	_test_eof1104: cs = 1104; goto _test_eof;
 	_test_eof1105: cs = 1105; goto _test_eof;
 	_test_eof1106: cs = 1106; goto _test_eof;
 	_test_eof1107: cs = 1107; goto _test_eof;
 	_test_eof1108: cs = 1108; goto _test_eof;
-	_test_eof1197: cs = 1197; goto _test_eof;
 	_test_eof1109: cs = 1109; goto _test_eof;
+	_test_eof1205: cs = 1205; goto _test_eof;
 	_test_eof1110: cs = 1110; goto _test_eof;
+	_test_eof1111: cs = 1111; goto _test_eof;
+	_test_eof1112: cs = 1112; goto _test_eof;
+	_test_eof1113: cs = 1113; goto _test_eof;
+	_test_eof1114: cs = 1114; goto _test_eof;
+	_test_eof1115: cs = 1115; goto _test_eof;
+	_test_eof1116: cs = 1116; goto _test_eof;
+	_test_eof1117: cs = 1117; goto _test_eof;
+	_test_eof1206: cs = 1206; goto _test_eof;
+	_test_eof1118: cs = 1118; goto _test_eof;
+	_test_eof1119: cs = 1119; goto _test_eof;
 
 	_test_eof: {}
 	if ( p == eof )
@@ -76927,11 +77042,11 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 1115:
+	case 1124:
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; cs = 0; goto _out;}
+			cs = 1120; {p++; cs = 0; goto _out;}
 		}
 	}
 	break;
@@ -77212,11 +77327,6 @@ case 1110:
 	case 572:
 	case 573:
 	case 574:
-	{
-		WARN(ZS_BAD_ALGORITHM);
-		p--; {goto st261;}
-	}
-	break;
 	case 575:
 	case 576:
 	case 577:
@@ -77226,6 +77336,11 @@ case 1110:
 	case 581:
 	case 582:
 	case 583:
+	{
+		WARN(ZS_BAD_ALGORITHM);
+		p--; {goto st261;}
+	}
+	break;
 	case 584:
 	case 585:
 	case 586:
@@ -77258,6 +77373,15 @@ case 1110:
 	case 613:
 	case 614:
 	case 615:
+	case 616:
+	case 617:
+	case 618:
+	case 619:
+	case 620:
+	case 621:
+	case 622:
+	case 623:
+	case 624:
 	{
 		WARN(ZS_BAD_CERT_TYPE);
 		p--; {goto st261;}
@@ -77267,51 +77391,44 @@ case 1110:
 	case 9:
 	case 10:
 	case 241:
-	case 618:
-	case 619:
-	case 620:
-	case 621:
-	case 622:
-	case 623:
-	case 637:
-	case 641:
-	case 645:
-	case 649:
+	case 627:
+	case 628:
+	case 629:
+	case 630:
+	case 631:
+	case 632:
+	case 646:
 	case 650:
-	case 651:
-	case 652:
-	case 653:
 	case 654:
-	case 655:
-	case 656:
-	case 657:
 	case 658:
 	case 659:
 	case 660:
 	case 661:
+	case 662:
+	case 663:
 	case 664:
 	case 665:
 	case 666:
-	case 734:
-	case 735:
-	case 736:
-	case 737:
-	case 738:
+	case 667:
+	case 668:
+	case 669:
+	case 670:
+	case 673:
+	case 674:
+	case 675:
 	case 743:
 	case 744:
 	case 745:
 	case 746:
 	case 747:
-	case 748:
-	case 749:
-	case 750:
-	case 751:
 	case 752:
 	case 753:
 	case 754:
 	case 755:
 	case 756:
 	case 757:
+	case 758:
+	case 759:
 	case 760:
 	case 761:
 	case 762:
@@ -77319,64 +77436,71 @@ case 1110:
 	case 764:
 	case 765:
 	case 766:
+	case 769:
+	case 770:
+	case 771:
+	case 772:
+	case 773:
 	case 774:
-	case 780:
-	case 781:
-	case 788:
+	case 775:
+	case 783:
 	case 789:
 	case 790:
+	case 797:
+	case 798:
 	case 799:
-	case 800:
-	case 839:
-	case 842:
-	case 843:
-	case 854:
-	case 855:
-	case 856:
-	case 857:
-	case 858:
-	case 859:
-	case 860:
-	case 861:
-	case 862:
+	case 808:
+	case 809:
+	case 848:
+	case 851:
+	case 852:
 	case 863:
 	case 864:
 	case 865:
-	case 994:
-	case 995:
-	case 996:
-	case 1001:
-	case 1002:
+	case 866:
+	case 867:
+	case 868:
+	case 869:
+	case 870:
+	case 871:
+	case 872:
+	case 873:
+	case 874:
 	case 1003:
 	case 1004:
 	case 1005:
-	case 1006:
-	case 1007:
-	case 1008:
-	case 1009:
-	case 1027:
-	case 1033:
+	case 1010:
+	case 1011:
+	case 1012:
+	case 1013:
+	case 1014:
+	case 1015:
+	case 1016:
+	case 1017:
+	case 1018:
 	case 1036:
-	case 1037:
-	case 1038:
-	case 1049:
-	case 1050:
-	case 1051:
-	case 1062:
-	case 1063:
-	case 1064:
-	case 1069:
-	case 1082:
-	case 1099:
-	case 1100:
-	case 1101:
-	case 1102:
-	case 1105:
-	case 1106:
-	case 1107:
+	case 1042:
+	case 1045:
+	case 1046:
+	case 1047:
+	case 1058:
+	case 1059:
+	case 1060:
+	case 1071:
+	case 1072:
+	case 1073:
+	case 1078:
+	case 1091:
 	case 1108:
 	case 1109:
 	case 1110:
+	case 1111:
+	case 1114:
+	case 1115:
+	case 1116:
+	case 1117:
+	case 1118:
+	case 1119:
 	{
 		WARN(ZS_BAD_RDATA);
 		p--; {goto st261;}
@@ -77605,74 +77729,74 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 624:
-	case 625:
-	case 626:
-	case 628:
-	case 630:
-	case 632:
-	case 662:
-	case 663:
-	case 728:
-	case 729:
-	case 730:
-	case 731:
-	case 732:
-	case 733:
+	case 633:
+	case 634:
+	case 635:
+	case 637:
+	case 639:
+	case 641:
+	case 671:
+	case 672:
+	case 737:
+	case 738:
 	case 739:
 	case 740:
 	case 741:
 	case 742:
-	case 758:
-	case 759:
-	case 778:
-	case 779:
-	case 782:
-	case 783:
+	case 748:
+	case 749:
+	case 750:
+	case 751:
+	case 767:
+	case 768:
+	case 787:
+	case 788:
 	case 791:
 	case 792:
-	case 793:
-	case 794:
+	case 800:
 	case 801:
 	case 802:
-	case 844:
-	case 845:
-	case 846:
-	case 847:
-	case 852:
+	case 803:
+	case 810:
+	case 811:
 	case 853:
-	case 997:
-	case 998:
-	case 999:
-	case 1000:
-	case 1010:
-	case 1011:
-	case 1012:
-	case 1013:
-	case 1014:
-	case 1015:
-	case 1039:
-	case 1040:
-	case 1041:
-	case 1042:
-	case 1043:
-	case 1044:
+	case 854:
+	case 855:
+	case 856:
+	case 861:
+	case 862:
+	case 1006:
+	case 1007:
+	case 1008:
+	case 1009:
+	case 1019:
+	case 1020:
+	case 1021:
+	case 1022:
+	case 1023:
+	case 1024:
+	case 1048:
+	case 1049:
+	case 1050:
+	case 1051:
 	case 1052:
 	case 1053:
-	case 1054:
-	case 1055:
-	case 1056:
-	case 1057:
+	case 1061:
+	case 1062:
+	case 1063:
+	case 1064:
 	case 1065:
 	case 1066:
-	case 1070:
-	case 1071:
-	case 1095:
-	case 1096:
-	case 1097:
-	case 1098:
-	case 1103:
+	case 1074:
+	case 1075:
+	case 1079:
+	case 1080:
 	case 1104:
+	case 1105:
+	case 1106:
+	case 1107:
+	case 1112:
+	case 1113:
 	{
 		WARN(ZS_BAD_NUMBER);
 		p--; {goto st261;}
@@ -77695,10 +77819,10 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 848:
-	case 849:
-	case 850:
-	case 851:
+	case 857:
+	case 858:
+	case 859:
+	case 860:
 	{
 		WARN(ZS_BAD_TIMESTAMP_CHAR);
 		p--; {goto st261;}
@@ -77720,10 +77844,10 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 667:
-	case 668:
-	case 669:
-	case 670:
+	case 676:
+	case 677:
+	case 678:
+	case 679:
 	{
 		s->long_string = false;
 	}
@@ -77754,12 +77878,12 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 616:
-	case 617:
-	case 671:
-	case 672:
-	case 1067:
-	case 1068:
+	case 625:
+	case 626:
+	case 680:
+	case 681:
+	case 1076:
+	case 1077:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
@@ -77769,12 +77893,12 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 767:
-	case 768:
-	case 769:
-	case 772:
-	case 773:
-	case 775:
+	case 776:
+	case 777:
+	case 778:
+	case 781:
+	case 782:
+	case 784:
 	{
 		WARN(ZS_BAD_APL);
 		p--; {goto st261;}
@@ -77784,42 +77908,42 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 784:
-	case 785:
-	case 786:
-	case 787:
+	case 793:
+	case 794:
 	case 795:
 	case 796:
-	case 797:
-	case 798:
-	case 1016:
-	case 1017:
-	case 1034:
-	case 1035:
-	case 1045:
-	case 1046:
-	case 1047:
-	case 1048:
-	case 1058:
-	case 1059:
-	case 1060:
-	case 1061:
-	case 1072:
-	case 1073:
-	case 1074:
-	case 1075:
-	case 1077:
-	case 1078:
-	case 1079:
-	case 1080:
+	case 804:
+	case 805:
+	case 806:
+	case 807:
+	case 1025:
+	case 1026:
+	case 1043:
+	case 1044:
+	case 1054:
+	case 1055:
+	case 1056:
+	case 1057:
+	case 1067:
+	case 1068:
+	case 1069:
+	case 1070:
+	case 1081:
+	case 1082:
 	case 1083:
 	case 1084:
 	case 1086:
 	case 1087:
+	case 1088:
 	case 1089:
-	case 1090:
 	case 1092:
 	case 1093:
+	case 1095:
+	case 1096:
+	case 1098:
+	case 1099:
+	case 1101:
+	case 1102:
 	{
 		WARN(ZS_BAD_HEX_CHAR);
 		p--; {goto st261;}
@@ -77829,20 +77953,20 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 1018:
-	case 1019:
-	case 1020:
-	case 1021:
-	case 1022:
-	case 1023:
-	case 1024:
-	case 1025:
-	case 1026:
+	case 1027:
 	case 1028:
 	case 1029:
 	case 1030:
 	case 1031:
 	case 1032:
+	case 1033:
+	case 1034:
+	case 1035:
+	case 1037:
+	case 1038:
+	case 1039:
+	case 1040:
+	case 1041:
 	{
 		WARN(ZS_BAD_BASE32HEX_CHAR);
 		p--; {goto st261;}
@@ -77852,21 +77976,21 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 803:
-	case 804:
-	case 807:
+	case 812:
+	case 813:
 	case 816:
-	case 817:
-	case 818:
-	case 823:
-	case 824:
 	case 825:
-	case 830:
-	case 831:
+	case 826:
+	case 827:
 	case 832:
-	case 835:
-	case 837:
-	case 838:
+	case 833:
+	case 834:
+	case 839:
+	case 840:
+	case 841:
+	case 844:
+	case 846:
+	case 847:
 	{
 		WARN(ZS_BAD_GATEWAY);
 		p--; {goto st261;}
@@ -77876,13 +78000,13 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 809:
-	case 810:
-	case 811:
-	case 812:
-	case 813:
-	case 814:
-	case 815:
+	case 818:
+	case 819:
+	case 820:
+	case 821:
+	case 822:
+	case 823:
+	case 824:
 	{
 		WARN(ZS_BAD_GATEWAY_KEY);
 		p--; {goto st261;}
@@ -77892,17 +78016,8 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 840:
-	case 841:
-	case 866:
-	case 867:
-	case 868:
-	case 869:
-	case 870:
-	case 871:
-	case 872:
-	case 873:
-	case 874:
+	case 849:
+	case 850:
 	case 875:
 	case 876:
 	case 877:
@@ -78017,9 +78132,18 @@ case 1110:
 	case 986:
 	case 987:
 	case 988:
+	case 989:
+	case 990:
 	case 991:
 	case 992:
 	case 993:
+	case 994:
+	case 995:
+	case 996:
+	case 997:
+	case 1000:
+	case 1001:
+	case 1002:
 	{
 		WARN(ZS_UNSUPPORTED_TYPE);
 		p--; {goto st261;}
@@ -78029,15 +78153,6 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 673:
-	case 674:
-	case 675:
-	case 676:
-	case 677:
-	case 678:
-	case 679:
-	case 680:
-	case 681:
 	case 682:
 	case 683:
 	case 684:
@@ -78084,6 +78199,15 @@ case 1110:
 	case 725:
 	case 726:
 	case 727:
+	case 728:
+	case 729:
+	case 730:
+	case 731:
+	case 732:
+	case 733:
+	case 734:
+	case 735:
+	case 736:
 	{
 		WARN(ZS_BAD_LOC_DATA);
 		p--; {goto st261;}
@@ -78210,14 +78334,14 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 805:
-	case 806:
-	case 819:
-	case 820:
-	case 826:
-	case 827:
-	case 833:
-	case 834:
+	case 814:
+	case 815:
+	case 828:
+	case 829:
+	case 835:
+	case 836:
+	case 842:
+	case 843:
 	{
 		WARN(ZS_BAD_NUMBER);
 		p--; {goto st261;}
@@ -78231,8 +78355,8 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 989:
-	case 990:
+	case 998:
+	case 999:
 	{
 		WARN(ZS_BAD_NUMBER);
 		p--; {goto st261;}
@@ -78292,22 +78416,22 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 627:
-	case 629:
-	case 631:
-	case 633:
-	case 634:
-	case 635:
 	case 636:
 	case 638:
-	case 639:
 	case 640:
 	case 642:
 	case 643:
 	case 644:
-	case 646:
+	case 645:
 	case 647:
 	case 648:
+	case 649:
+	case 651:
+	case 652:
+	case 653:
+	case 655:
+	case 656:
+	case 657:
 	{
 		WARN(ZS_BAD_TIME_UNIT);
 		p--; {goto st261;}
@@ -78363,10 +78487,10 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 770:
-	case 771:
-	case 776:
-	case 777:
+	case 779:
+	case 780:
+	case 785:
+	case 786:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
@@ -78380,8 +78504,8 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 821:
-	case 828:
+	case 830:
+	case 837:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
@@ -78416,7 +78540,7 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 1076:
+	case 1085:
 	{
 		WARN(ZS_BAD_HEX_CHAR);
 		p--; {goto st261;}
@@ -78430,8 +78554,8 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 808:
-	case 836:
+	case 817:
+	case 845:
 	{
 		WARN(ZS_BAD_GATEWAY);
 		p--; {goto st261;}
@@ -78445,10 +78569,10 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 1085:
-	case 1088:
-	case 1091:
 	case 1094:
+	case 1097:
+	case 1100:
+	case 1103:
 	{
 		WARN(ZS_BAD_CHAR_DASH);
 		p--; {goto st261;}
@@ -78462,7 +78586,7 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 1081:
+	case 1090:
 	{
 		WARN(ZS_BAD_CHAR_COLON);
 		p--; {goto st261;}
@@ -78611,8 +78735,8 @@ case 1110:
 		p--; {goto st261;}
 	}
 	break;
-	case 822:
-	case 829:
+	case 831:
+	case 838:
 	{
 		WARN(ZS_BAD_ADDRESS_CHAR);
 		p--; {goto st261;}
diff --git a/src/zscanner/scanner.c.t0 b/src/zscanner/scanner.c.t0
index 94ef354a05759286538a9acc99bcd928bb382aeb..9e8385459f0e08121f94ee8983cd3265cebfb9c3 100644
--- a/src/zscanner/scanner.c.t0
+++ b/src/zscanner/scanner.c.t0
@@ -98,35 +98,35 @@ static const short _zone_scanner_actions[] = {
 	110, 1, 111, 1, 112, 1, 113, 1,
 	114, 1, 115, 1, 116, 1, 117, 1,
 	118, 1, 119, 1, 121, 1, 122, 1,
-	123, 1, 124, 1, 149, 1, 150, 1,
-	151, 1, 152, 1, 153, 1, 154, 1,
-	155, 1, 156, 1, 157, 1, 158, 1,
-	159, 1, 160, 1, 161, 1, 162, 1,
-	163, 1, 164, 1, 165, 1, 166, 1,
-	167, 1, 168, 1, 169, 1, 170, 1,
-	171, 1, 172, 1, 173, 1, 174, 1,
-	175, 1, 176, 1, 177, 1, 178, 1,
-	179, 1, 180, 1, 181, 1, 182, 1,
-	183, 1, 184, 1, 185, 1, 186, 1,
-	187, 1, 188, 1, 189, 1, 190, 1,
-	191, 1, 192, 1, 193, 1, 194, 1,
-	195, 1, 196, 1, 197, 1, 198, 1,
-	199, 1, 200, 1, 201, 1, 202, 1,
-	203, 1, 204, 1, 205, 1, 206, 1,
-	207, 1, 208, 1, 209, 1, 210, 1,
-	211, 1, 212, 1, 213, 1, 214, 1,
-	215, 1, 216, 1, 217, 1, 218, 1,
-	219, 1, 220, 1, 221, 1, 222, 1,
-	223, 1, 224, 1, 225, 1, 226, 1,
-	227, 1, 228, 1, 229, 1, 230, 1,
-	231, 1, 232, 1, 233, 1, 234, 1,
-	236, 1, 238, 1, 239, 1, 240, 1,
-	241, 1, 248, 1, 249, 1, 254, 1,
-	256, 1, 261, 1, 264, 1, 265, 1,
-	266, 1, 267, 1, 269, 1, 270, 1,
-	271, 1, 273, 2, 0, 43, 2, 1,
-	0, 2, 1, 26, 2, 1, 270, 2,
-	1, 316, 2, 2, 26, 2, 3, 26,
+	123, 1, 124, 1, 151, 1, 152, 1,
+	153, 1, 154, 1, 155, 1, 156, 1,
+	157, 1, 158, 1, 159, 1, 160, 1,
+	161, 1, 162, 1, 163, 1, 164, 1,
+	165, 1, 166, 1, 167, 1, 168, 1,
+	169, 1, 170, 1, 171, 1, 172, 1,
+	173, 1, 174, 1, 175, 1, 176, 1,
+	177, 1, 178, 1, 179, 1, 180, 1,
+	181, 1, 182, 1, 183, 1, 184, 1,
+	185, 1, 186, 1, 187, 1, 188, 1,
+	189, 1, 190, 1, 191, 1, 192, 1,
+	193, 1, 194, 1, 195, 1, 196, 1,
+	197, 1, 198, 1, 199, 1, 200, 1,
+	201, 1, 202, 1, 203, 1, 204, 1,
+	205, 1, 206, 1, 207, 1, 208, 1,
+	209, 1, 210, 1, 211, 1, 212, 1,
+	213, 1, 214, 1, 215, 1, 216, 1,
+	217, 1, 218, 1, 219, 1, 220, 1,
+	221, 1, 222, 1, 223, 1, 224, 1,
+	225, 1, 226, 1, 227, 1, 228, 1,
+	229, 1, 230, 1, 231, 1, 232, 1,
+	233, 1, 234, 1, 235, 1, 236, 1,
+	238, 1, 240, 1, 241, 1, 242, 1,
+	243, 1, 250, 1, 251, 1, 256, 1,
+	258, 1, 263, 1, 266, 1, 267, 1,
+	268, 1, 269, 1, 271, 1, 272, 1,
+	273, 1, 275, 2, 0, 43, 2, 1,
+	0, 2, 1, 26, 2, 1, 272, 2,
+	1, 318, 2, 2, 26, 2, 3, 26,
 	2, 4, 66, 2, 4, 70, 2, 5,
 	6, 2, 9, 10, 2, 12, 13, 2,
 	14, 10, 2, 14, 11, 2, 15, 20,
@@ -135,41 +135,41 @@ static const short _zone_scanner_actions[] = {
 	16, 76, 2, 18, 0, 2, 19, 9,
 	2, 22, 62, 2, 22, 101, 2, 22,
 	112, 2, 23, 0, 2, 23, 1, 2,
-	23, 2, 2, 23, 3, 2, 23, 237,
+	23, 2, 2, 23, 3, 2, 23, 239,
 	2, 24, 21, 2, 25, 1, 2, 25,
 	2, 2, 25, 3, 2, 25, 86, 2,
 	26, 1, 2, 26, 2, 2, 26, 3,
-	2, 27, 4, 2, 27, 269, 2, 27,
-	273, 2, 28, 21, 2, 29, 0, 2,
+	2, 27, 4, 2, 27, 271, 2, 27,
+	275, 2, 28, 21, 2, 29, 0, 2,
 	29, 1, 2, 29, 2, 2, 29, 3,
-	2, 29, 237, 2, 30, 35, 2, 31,
-	30, 2, 32, 66, 2, 32, 254, 2,
-	32, 269, 2, 32, 273, 2, 36, 242,
-	2, 36, 243, 2, 36, 244, 2, 36,
-	245, 2, 36, 246, 2, 36, 247, 2,
+	2, 29, 239, 2, 30, 35, 2, 31,
+	30, 2, 32, 66, 2, 32, 256, 2,
+	32, 271, 2, 32, 275, 2, 36, 244,
+	2, 36, 245, 2, 36, 246, 2, 36,
+	247, 2, 36, 248, 2, 36, 249, 2,
 	39, 0, 2, 39, 1, 2, 39, 2,
 	2, 39, 3, 2, 40, 0, 2, 40,
 	1, 2, 40, 2, 2, 40, 3, 2,
 	41, 0, 2, 41, 1, 2, 41, 2,
-	2, 41, 3, 2, 42, 268, 2, 43,
+	2, 41, 3, 2, 42, 270, 2, 43,
 	1, 2, 43, 2, 2, 43, 3, 2,
 	50, 2, 2, 50, 3, 2, 50, 41,
 	2, 50, 86, 2, 51, 52, 2, 53,
 	1, 2, 53, 2, 2, 53, 3, 2,
-	54, 269, 2, 55, 0, 2, 56, 57,
+	54, 271, 2, 55, 0, 2, 56, 57,
 	2, 58, 59, 2, 60, 0, 2, 60,
-	55, 2, 64, 0, 2, 64, 269, 2,
+	55, 2, 64, 0, 2, 64, 271, 2,
 	68, 19, 2, 72, 62, 2, 73, 2,
 	2, 73, 3, 2, 74, 4, 2, 75,
 	19, 2, 77, 4, 2, 81, 1, 2,
 	81, 26, 2, 83, 84, 2, 85, 1,
 	2, 85, 2, 2, 85, 3, 2, 86,
 	1, 2, 86, 2, 2, 86, 3, 2,
-	87, 88, 2, 89, 269, 2, 90, 91,
+	87, 88, 2, 89, 271, 2, 90, 91,
 	2, 92, 93, 2, 94, 95, 2, 94,
 	96, 2, 94, 97, 2, 98, 99, 2,
-	100, 269, 2, 103, 269, 2, 104, 0,
-	2, 120, 269, 2, 122, 0, 2, 123,
+	100, 271, 2, 103, 271, 2, 104, 0,
+	2, 120, 271, 2, 122, 0, 2, 123,
 	0, 2, 124, 0, 2, 125, 0, 2,
 	126, 0, 2, 127, 0, 2, 128, 0,
 	2, 129, 0, 2, 130, 0, 2, 131,
@@ -178,310 +178,307 @@ static const short _zone_scanner_actions[] = {
 	2, 137, 0, 2, 138, 0, 2, 139,
 	0, 2, 140, 0, 2, 141, 0, 2,
 	142, 0, 2, 143, 0, 2, 144, 0,
-	2, 145, 0, 2, 146, 269, 2, 147,
-	269, 2, 148, 269, 2, 149, 1, 2,
-	149, 2, 2, 149, 3, 2, 150, 1,
-	2, 150, 2, 2, 150, 3, 2, 151,
-	1, 2, 151, 2, 2, 151, 3, 2,
-	152, 1, 2, 152, 2, 2, 152, 3,
-	2, 153, 1, 2, 153, 2, 2, 153,
-	3, 2, 154, 1, 2, 154, 2, 2,
-	154, 3, 2, 155, 1, 2, 155, 2,
-	2, 155, 3, 2, 156, 1, 2, 156,
-	2, 2, 156, 3, 2, 157, 1, 2,
-	157, 2, 2, 157, 3, 2, 158, 1,
-	2, 158, 2, 2, 158, 3, 2, 159,
-	1, 2, 159, 2, 2, 159, 3, 2,
-	160, 1, 2, 160, 2, 2, 160, 3,
-	2, 161, 1, 2, 161, 2, 2, 161,
-	3, 2, 162, 1, 2, 162, 2, 2,
-	162, 3, 2, 163, 1, 2, 163, 2,
-	2, 163, 3, 2, 164, 1, 2, 164,
-	2, 2, 164, 3, 2, 165, 1, 2,
-	165, 2, 2, 165, 3, 2, 166, 1,
-	2, 166, 2, 2, 166, 3, 2, 167,
-	1, 2, 167, 2, 2, 167, 3, 2,
-	168, 1, 2, 168, 2, 2, 168, 3,
-	2, 169, 1, 2, 169, 2, 2, 169,
-	3, 2, 170, 1, 2, 170, 2, 2,
-	170, 3, 2, 171, 1, 2, 171, 2,
-	2, 171, 3, 2, 172, 1, 2, 172,
-	2, 2, 172, 3, 2, 173, 1, 2,
-	173, 2, 2, 173, 3, 2, 174, 1,
-	2, 174, 2, 2, 174, 3, 2, 175,
-	1, 2, 175, 2, 2, 175, 3, 2,
-	176, 1, 2, 176, 2, 2, 176, 3,
-	2, 177, 1, 2, 177, 2, 2, 177,
-	3, 2, 178, 1, 2, 178, 2, 2,
-	178, 3, 2, 179, 1, 2, 179, 2,
-	2, 179, 3, 2, 180, 1, 2, 180,
-	2, 2, 180, 3, 2, 181, 1, 2,
-	181, 2, 2, 181, 3, 2, 182, 1,
-	2, 182, 2, 2, 182, 3, 2, 183,
-	1, 2, 183, 2, 2, 183, 3, 2,
-	184, 1, 2, 184, 2, 2, 184, 3,
-	2, 185, 1, 2, 185, 2, 2, 185,
-	3, 2, 186, 1, 2, 186, 2, 2,
-	186, 3, 2, 187, 1, 2, 187, 2,
-	2, 187, 3, 2, 188, 1, 2, 188,
-	2, 2, 188, 3, 2, 189, 1, 2,
-	189, 2, 2, 189, 3, 2, 190, 1,
-	2, 190, 2, 2, 190, 3, 2, 191,
-	1, 2, 191, 2, 2, 191, 3, 2,
-	192, 1, 2, 192, 2, 2, 192, 3,
-	2, 193, 1, 2, 193, 2, 2, 193,
-	3, 2, 194, 1, 2, 194, 2, 2,
-	194, 3, 2, 195, 1, 2, 195, 2,
-	2, 195, 3, 2, 196, 1, 2, 196,
-	2, 2, 196, 3, 2, 197, 1, 2,
-	197, 2, 2, 197, 3, 2, 198, 1,
-	2, 198, 2, 2, 198, 3, 2, 199,
-	1, 2, 199, 2, 2, 199, 3, 2,
-	200, 1, 2, 200, 2, 2, 200, 3,
-	2, 201, 1, 2, 201, 2, 2, 201,
-	3, 2, 202, 1, 2, 202, 2, 2,
-	202, 3, 2, 203, 1, 2, 203, 2,
-	2, 203, 3, 2, 204, 1, 2, 204,
-	2, 2, 204, 3, 2, 205, 1, 2,
-	205, 2, 2, 205, 3, 2, 206, 1,
-	2, 206, 2, 2, 206, 3, 2, 207,
-	1, 2, 207, 2, 2, 207, 3, 2,
-	208, 1, 2, 208, 2, 2, 208, 3,
-	2, 209, 1, 2, 209, 2, 2, 209,
-	3, 2, 210, 1, 2, 210, 2, 2,
-	210, 3, 2, 211, 1, 2, 211, 2,
-	2, 211, 3, 2, 212, 1, 2, 212,
-	2, 2, 212, 3, 2, 213, 1, 2,
-	213, 2, 2, 213, 3, 2, 214, 1,
-	2, 214, 2, 2, 214, 3, 2, 215,
-	1, 2, 215, 2, 2, 215, 3, 2,
-	216, 1, 2, 216, 2, 2, 216, 3,
-	2, 217, 1, 2, 217, 2, 2, 217,
-	3, 2, 218, 1, 2, 218, 2, 2,
-	218, 3, 2, 219, 1, 2, 219, 2,
-	2, 219, 3, 2, 220, 1, 2, 220,
-	2, 2, 220, 3, 2, 221, 1, 2,
-	221, 2, 2, 221, 3, 2, 222, 1,
-	2, 222, 2, 2, 222, 3, 2, 223,
-	1, 2, 223, 2, 2, 223, 3, 2,
-	224, 1, 2, 224, 2, 2, 224, 3,
-	2, 225, 1, 2, 225, 2, 2, 225,
-	3, 2, 226, 1, 2, 226, 2, 2,
-	226, 3, 2, 227, 1, 2, 227, 2,
-	2, 227, 3, 2, 228, 1, 2, 228,
-	2, 2, 228, 3, 2, 229, 1, 2,
-	229, 2, 2, 229, 3, 2, 230, 1,
-	2, 230, 2, 2, 230, 3, 2, 231,
-	1, 2, 231, 2, 2, 231, 3, 2,
-	232, 1, 2, 232, 2, 2, 232, 3,
-	2, 233, 1, 2, 233, 2, 2, 233,
-	3, 2, 234, 1, 2, 234, 2, 2,
-	234, 3, 2, 235, 0, 2, 238, 1,
-	2, 238, 2, 2, 238, 3, 2, 239,
-	1, 2, 239, 2, 2, 239, 3, 2,
-	240, 1, 2, 240, 2, 2, 240, 3,
-	2, 241, 1, 2, 241, 2, 2, 241,
-	3, 2, 248, 1, 2, 248, 2, 2,
-	248, 3, 2, 249, 1, 2, 249, 2,
-	2, 249, 3, 2, 252, 0, 2, 253,
-	269, 2, 255, 101, 2, 260, 101, 2,
-	269, 4, 2, 270, 1, 2, 270, 26,
-	2, 272, 270, 2, 273, 4, 2, 273,
-	269, 2, 274, 268, 2, 275, 268, 2,
-	276, 268, 2, 277, 268, 2, 278, 268,
-	2, 279, 268, 2, 280, 268, 2, 281,
-	268, 2, 282, 268, 2, 283, 268, 2,
-	284, 268, 2, 285, 268, 2, 286, 268,
-	2, 287, 268, 2, 288, 268, 2, 289,
-	268, 2, 290, 268, 2, 291, 268, 2,
-	292, 268, 2, 293, 268, 2, 294, 268,
-	2, 295, 268, 2, 296, 268, 2, 297,
-	268, 2, 298, 268, 2, 299, 268, 2,
-	300, 268, 2, 301, 268, 2, 302, 268,
-	2, 303, 268, 2, 304, 268, 2, 305,
-	268, 2, 306, 268, 2, 307, 268, 2,
-	308, 268, 2, 309, 268, 2, 310, 268,
-	2, 311, 268, 2, 312, 268, 2, 313,
-	268, 2, 314, 268, 2, 315, 268, 2,
-	316, 1, 3, 0, 43, 1, 3, 0,
-	43, 2, 3, 0, 43, 3, 3, 1,
-	64, 0, 3, 1, 78, 0, 3, 1,
-	104, 0, 3, 1, 235, 0, 3, 1,
-	252, 0, 3, 1, 270, 26, 3, 1,
-	270, 316, 3, 1, 316, 26, 3, 7,
-	1, 8, 3, 11, 17, 0, 3, 16,
-	76, 2, 3, 16, 76, 3, 3, 19,
-	9, 10, 3, 23, 64, 0, 3, 25,
-	1, 86, 3, 25, 1, 316, 3, 25,
-	2, 86, 3, 25, 3, 86, 3, 25,
-	272, 270, 3, 25, 274, 268, 3, 27,
-	82, 4, 3, 27, 269, 4, 3, 27,
-	273, 4, 3, 27, 273, 269, 3, 29,
-	1, 0, 3, 31, 30, 270, 3, 32,
-	146, 269, 3, 32, 148, 269, 3, 32,
-	273, 4, 3, 32, 273, 269, 3, 34,
-	36, 242, 3, 34, 36, 243, 3, 34,
-	36, 244, 3, 34, 36, 245, 3, 34,
-	36, 246, 3, 34, 36, 247, 3, 36,
-	242, 1, 3, 36, 242, 2, 3, 36,
-	242, 3, 3, 36, 243, 1, 3, 36,
-	243, 2, 3, 36, 243, 3, 3, 36,
-	244, 1, 3, 36, 244, 2, 3, 36,
-	244, 3, 3, 36, 245, 1, 3, 36,
-	245, 2, 3, 36, 245, 3, 3, 36,
-	246, 1, 3, 36, 246, 2, 3, 36,
-	246, 3, 3, 36, 247, 1, 3, 36,
-	247, 2, 3, 36, 247, 3, 3, 42,
-	268, 1, 3, 42, 268, 2, 3, 42,
-	268, 3, 3, 42, 268, 270, 3, 44,
-	32, 66, 3, 44, 32, 269, 3, 44,
-	32, 273, 3, 49, 31, 30, 3, 50,
-	41, 0, 3, 50, 41, 1, 3, 50,
-	41, 2, 3, 50, 41, 3, 3, 50,
-	86, 1, 3, 50, 86, 2, 3, 50,
-	86, 3, 3, 60, 55, 0, 3, 61,
-	56, 57, 3, 63, 22, 62, 3, 65,
-	0, 1, 3, 68, 19, 9, 3, 69,
-	0, 1, 3, 75, 19, 9, 3, 78,
-	0, 1, 3, 81, 24, 21, 3, 81,
-	26, 1, 3, 81, 26, 2, 3, 81,
-	26, 3, 3, 83, 24, 21, 3, 83,
-	84, 270, 3, 86, 1, 316, 3, 89,
-	100, 269, 3, 89, 146, 269, 3, 90,
-	91, 0, 3, 90, 91, 1, 3, 90,
-	91, 2, 3, 90, 91, 3, 3, 92,
-	93, 0, 3, 92, 93, 1, 3, 92,
-	93, 2, 3, 92, 93, 3, 3, 98,
-	99, 0, 3, 98, 99, 1, 3, 98,
-	99, 2, 3, 98, 99, 3, 3, 103,
-	105, 254, 3, 103, 263, 269, 3, 146,
-	147, 269, 3, 191, 235, 0, 3, 192,
-	235, 0, 3, 193, 235, 0, 3, 194,
-	235, 0, 3, 195, 235, 0, 3, 196,
-	235, 0, 3, 197, 235, 0, 3, 198,
-	235, 0, 3, 199, 235, 0, 3, 200,
-	235, 0, 3, 201, 235, 0, 3, 202,
-	235, 0, 3, 203, 235, 0, 3, 204,
-	235, 0, 3, 205, 235, 0, 3, 206,
-	235, 0, 3, 207, 235, 0, 3, 208,
-	235, 0, 3, 209, 235, 0, 3, 210,
-	235, 0, 3, 211, 235, 0, 3, 212,
-	235, 0, 3, 213, 235, 0, 3, 214,
-	235, 0, 3, 215, 235, 0, 3, 216,
-	235, 0, 3, 217, 235, 0, 3, 218,
-	235, 0, 3, 219, 235, 0, 3, 220,
-	235, 0, 3, 221, 235, 0, 3, 222,
-	235, 0, 3, 223, 235, 0, 3, 224,
-	235, 0, 3, 225, 235, 0, 3, 226,
-	235, 0, 3, 227, 235, 0, 3, 228,
-	235, 0, 3, 229, 235, 0, 3, 230,
-	235, 0, 3, 231, 235, 0, 3, 232,
-	235, 0, 3, 233, 235, 0, 3, 234,
-	235, 0, 3, 251, 31, 30, 3, 256,
-	257, 0, 3, 256, 258, 0, 3, 259,
-	103, 269, 3, 261, 262, 0, 3, 263,
-	103, 269, 3, 269, 4, 82, 3, 270,
-	24, 21, 3, 270, 316, 1, 3, 273,
-	269, 4, 3, 274, 268, 1, 3, 274,
-	268, 2, 3, 274, 268, 3, 3, 274,
-	268, 270, 3, 275, 268, 1, 3, 275,
-	268, 2, 3, 275, 268, 3, 3, 275,
-	268, 270, 3, 276, 268, 1, 3, 276,
-	268, 2, 3, 276, 268, 3, 3, 276,
-	268, 270, 3, 277, 268, 1, 3, 277,
-	268, 2, 3, 277, 268, 3, 3, 277,
-	268, 270, 3, 278, 268, 1, 3, 278,
-	268, 2, 3, 278, 268, 3, 3, 278,
-	268, 270, 3, 279, 268, 1, 3, 279,
-	268, 2, 3, 279, 268, 3, 3, 279,
-	268, 270, 3, 280, 268, 1, 3, 280,
-	268, 2, 3, 280, 268, 3, 3, 280,
-	268, 270, 3, 281, 268, 1, 3, 281,
-	268, 2, 3, 281, 268, 3, 3, 281,
-	268, 270, 3, 282, 268, 1, 3, 282,
-	268, 2, 3, 282, 268, 3, 3, 282,
-	268, 270, 3, 283, 268, 1, 3, 283,
-	268, 2, 3, 283, 268, 3, 3, 283,
-	268, 270, 3, 284, 268, 1, 3, 284,
-	268, 2, 3, 284, 268, 3, 3, 284,
-	268, 270, 3, 285, 268, 1, 3, 285,
-	268, 2, 3, 285, 268, 3, 3, 285,
-	268, 270, 3, 286, 268, 1, 3, 286,
-	268, 2, 3, 286, 268, 3, 3, 286,
-	268, 270, 3, 287, 268, 1, 3, 287,
-	268, 2, 3, 287, 268, 3, 3, 287,
-	268, 270, 3, 288, 268, 1, 3, 288,
-	268, 2, 3, 288, 268, 3, 3, 288,
-	268, 270, 3, 289, 268, 1, 3, 289,
-	268, 2, 3, 289, 268, 3, 3, 289,
-	268, 270, 3, 290, 268, 1, 3, 290,
-	268, 2, 3, 290, 268, 3, 3, 290,
-	268, 270, 3, 291, 268, 1, 3, 291,
-	268, 2, 3, 291, 268, 3, 3, 291,
-	268, 270, 3, 292, 268, 1, 3, 292,
-	268, 2, 3, 292, 268, 3, 3, 292,
-	268, 270, 3, 293, 268, 1, 3, 293,
-	268, 2, 3, 293, 268, 3, 3, 293,
-	268, 270, 3, 294, 268, 1, 3, 294,
-	268, 2, 3, 294, 268, 3, 3, 294,
-	268, 270, 3, 295, 268, 1, 3, 295,
-	268, 2, 3, 295, 268, 3, 3, 295,
-	268, 270, 3, 296, 268, 1, 3, 296,
-	268, 2, 3, 296, 268, 3, 3, 296,
-	268, 270, 3, 297, 268, 1, 3, 297,
-	268, 2, 3, 297, 268, 3, 3, 297,
-	268, 270, 3, 298, 268, 1, 3, 298,
-	268, 2, 3, 298, 268, 3, 3, 298,
-	268, 270, 3, 299, 268, 1, 3, 299,
-	268, 2, 3, 299, 268, 3, 3, 299,
-	268, 270, 3, 300, 268, 1, 3, 300,
-	268, 2, 3, 300, 268, 3, 3, 300,
-	268, 270, 3, 301, 268, 1, 3, 301,
-	268, 2, 3, 301, 268, 3, 3, 301,
-	268, 270, 3, 302, 268, 1, 3, 302,
-	268, 2, 3, 302, 268, 3, 3, 302,
-	268, 270, 3, 303, 268, 1, 3, 303,
-	268, 2, 3, 303, 268, 3, 3, 303,
-	268, 270, 3, 304, 268, 1, 3, 304,
-	268, 2, 3, 304, 268, 3, 3, 304,
-	268, 270, 3, 305, 268, 1, 3, 305,
-	268, 2, 3, 305, 268, 3, 3, 305,
-	268, 270, 3, 306, 268, 1, 3, 306,
-	268, 2, 3, 306, 268, 3, 3, 306,
-	268, 270, 3, 307, 268, 1, 3, 307,
-	268, 2, 3, 307, 268, 3, 3, 307,
-	268, 270, 3, 308, 268, 1, 3, 308,
-	268, 2, 3, 308, 268, 3, 3, 308,
-	268, 270, 3, 309, 268, 1, 3, 309,
-	268, 2, 3, 309, 268, 3, 3, 309,
-	268, 270, 3, 310, 268, 1, 3, 310,
-	268, 2, 3, 310, 268, 3, 3, 310,
-	268, 270, 3, 311, 268, 1, 3, 311,
-	268, 2, 3, 311, 268, 3, 3, 311,
-	268, 270, 3, 312, 268, 1, 3, 312,
-	268, 2, 3, 312, 268, 3, 3, 312,
-	268, 270, 3, 313, 268, 1, 3, 313,
-	268, 2, 3, 313, 268, 3, 3, 313,
-	268, 270, 3, 314, 268, 1, 3, 314,
-	268, 2, 3, 314, 268, 3, 3, 314,
-	268, 270, 3, 315, 268, 1, 3, 315,
-	268, 2, 3, 315, 268, 3, 3, 315,
-	268, 270, 3, 316, 1, 26, 4, 5,
-	7, 1, 8, 4, 14, 11, 17, 0,
-	4, 16, 69, 0, 1, 4, 23, 1,
-	64, 0, 4, 25, 1, 86, 316, 4,
-	25, 1, 272, 270, 4, 25, 1, 274,
-	268, 4, 25, 2, 272, 270, 4, 25,
-	2, 274, 268, 4, 25, 3, 272, 270,
-	4, 25, 3, 274, 268, 4, 25, 274,
-	268, 270, 4, 27, 32, 273, 4, 4,
-	27, 44, 32, 273, 4, 27, 273, 269,
-	4, 4, 31, 30, 24, 21, 4, 32,
-	273, 269, 4, 4, 34, 31, 30, 35,
-	4, 34, 36, 242, 1, 4, 34, 36,
-	242, 2, 4, 34, 36, 242, 3, 4,
-	34, 36, 243, 1, 4, 34, 36, 243,
-	2, 4, 34, 36, 243, 3, 4, 34,
+	2, 145, 0, 2, 146, 0, 2, 147,
+	0, 2, 148, 271, 2, 149, 271, 2,
+	150, 271, 2, 151, 1, 2, 151, 2,
+	2, 151, 3, 2, 152, 1, 2, 152,
+	2, 2, 152, 3, 2, 153, 1, 2,
+	153, 2, 2, 153, 3, 2, 154, 1,
+	2, 154, 2, 2, 154, 3, 2, 155,
+	1, 2, 155, 2, 2, 155, 3, 2,
+	156, 1, 2, 156, 2, 2, 156, 3,
+	2, 157, 1, 2, 157, 2, 2, 157,
+	3, 2, 158, 1, 2, 158, 2, 2,
+	158, 3, 2, 159, 1, 2, 159, 2,
+	2, 159, 3, 2, 160, 1, 2, 160,
+	2, 2, 160, 3, 2, 161, 1, 2,
+	161, 2, 2, 161, 3, 2, 162, 1,
+	2, 162, 2, 2, 162, 3, 2, 163,
+	1, 2, 163, 2, 2, 163, 3, 2,
+	164, 1, 2, 164, 2, 2, 164, 3,
+	2, 165, 1, 2, 165, 2, 2, 165,
+	3, 2, 166, 1, 2, 166, 2, 2,
+	166, 3, 2, 167, 1, 2, 167, 2,
+	2, 167, 3, 2, 168, 1, 2, 168,
+	2, 2, 168, 3, 2, 169, 1, 2,
+	169, 2, 2, 169, 3, 2, 170, 1,
+	2, 170, 2, 2, 170, 3, 2, 171,
+	1, 2, 171, 2, 2, 171, 3, 2,
+	172, 1, 2, 172, 2, 2, 172, 3,
+	2, 173, 1, 2, 173, 2, 2, 173,
+	3, 2, 174, 1, 2, 174, 2, 2,
+	174, 3, 2, 175, 1, 2, 175, 2,
+	2, 175, 3, 2, 176, 1, 2, 176,
+	2, 2, 176, 3, 2, 177, 1, 2,
+	177, 2, 2, 177, 3, 2, 178, 1,
+	2, 178, 2, 2, 178, 3, 2, 179,
+	1, 2, 179, 2, 2, 179, 3, 2,
+	180, 1, 2, 180, 2, 2, 180, 3,
+	2, 181, 1, 2, 181, 2, 2, 181,
+	3, 2, 182, 1, 2, 182, 2, 2,
+	182, 3, 2, 183, 1, 2, 183, 2,
+	2, 183, 3, 2, 184, 1, 2, 184,
+	2, 2, 184, 3, 2, 185, 1, 2,
+	185, 2, 2, 185, 3, 2, 186, 1,
+	2, 186, 2, 2, 186, 3, 2, 187,
+	1, 2, 187, 2, 2, 187, 3, 2,
+	188, 1, 2, 188, 2, 2, 188, 3,
+	2, 189, 1, 2, 189, 2, 2, 189,
+	3, 2, 190, 1, 2, 190, 2, 2,
+	190, 3, 2, 191, 1, 2, 191, 2,
+	2, 191, 3, 2, 192, 1, 2, 192,
+	2, 2, 192, 3, 2, 193, 1, 2,
+	193, 2, 2, 193, 3, 2, 194, 1,
+	2, 194, 2, 2, 194, 3, 2, 195,
+	1, 2, 195, 2, 2, 195, 3, 2,
+	196, 1, 2, 196, 2, 2, 196, 3,
+	2, 197, 1, 2, 197, 2, 2, 197,
+	3, 2, 198, 1, 2, 198, 2, 2,
+	198, 3, 2, 199, 1, 2, 199, 2,
+	2, 199, 3, 2, 200, 1, 2, 200,
+	2, 2, 200, 3, 2, 201, 1, 2,
+	201, 2, 2, 201, 3, 2, 202, 1,
+	2, 202, 2, 2, 202, 3, 2, 203,
+	1, 2, 203, 2, 2, 203, 3, 2,
+	204, 1, 2, 204, 2, 2, 204, 3,
+	2, 205, 1, 2, 205, 2, 2, 205,
+	3, 2, 206, 1, 2, 206, 2, 2,
+	206, 3, 2, 207, 1, 2, 207, 2,
+	2, 207, 3, 2, 208, 1, 2, 208,
+	2, 2, 208, 3, 2, 209, 1, 2,
+	209, 2, 2, 209, 3, 2, 210, 1,
+	2, 210, 2, 2, 210, 3, 2, 211,
+	1, 2, 211, 2, 2, 211, 3, 2,
+	212, 1, 2, 212, 2, 2, 212, 3,
+	2, 213, 1, 2, 213, 2, 2, 213,
+	3, 2, 214, 1, 2, 214, 2, 2,
+	214, 3, 2, 215, 1, 2, 215, 2,
+	2, 215, 3, 2, 216, 1, 2, 216,
+	2, 2, 216, 3, 2, 217, 1, 2,
+	217, 2, 2, 217, 3, 2, 218, 1,
+	2, 218, 2, 2, 218, 3, 2, 219,
+	1, 2, 219, 2, 2, 219, 3, 2,
+	220, 1, 2, 220, 2, 2, 220, 3,
+	2, 221, 1, 2, 221, 2, 2, 221,
+	3, 2, 222, 1, 2, 222, 2, 2,
+	222, 3, 2, 223, 1, 2, 223, 2,
+	2, 223, 3, 2, 224, 1, 2, 224,
+	2, 2, 224, 3, 2, 225, 1, 2,
+	225, 2, 2, 225, 3, 2, 226, 1,
+	2, 226, 2, 2, 226, 3, 2, 227,
+	1, 2, 227, 2, 2, 227, 3, 2,
+	228, 1, 2, 228, 2, 2, 228, 3,
+	2, 229, 1, 2, 229, 2, 2, 229,
+	3, 2, 230, 1, 2, 230, 2, 2,
+	230, 3, 2, 231, 1, 2, 231, 2,
+	2, 231, 3, 2, 232, 1, 2, 232,
+	2, 2, 232, 3, 2, 233, 1, 2,
+	233, 2, 2, 233, 3, 2, 234, 1,
+	2, 234, 2, 2, 234, 3, 2, 235,
+	1, 2, 235, 2, 2, 235, 3, 2,
+	236, 1, 2, 236, 2, 2, 236, 3,
+	2, 237, 0, 2, 240, 1, 2, 240,
+	2, 2, 240, 3, 2, 241, 1, 2,
+	241, 2, 2, 241, 3, 2, 242, 1,
+	2, 242, 2, 2, 242, 3, 2, 243,
+	1, 2, 243, 2, 2, 243, 3, 2,
+	250, 1, 2, 250, 2, 2, 250, 3,
+	2, 251, 1, 2, 251, 2, 2, 251,
+	3, 2, 254, 0, 2, 255, 271, 2,
+	257, 101, 2, 262, 101, 2, 271, 4,
+	2, 272, 1, 2, 272, 26, 2, 274,
+	272, 2, 275, 4, 2, 275, 271, 2,
+	276, 270, 2, 277, 270, 2, 278, 270,
+	2, 279, 270, 2, 280, 270, 2, 281,
+	270, 2, 282, 270, 2, 283, 270, 2,
+	284, 270, 2, 285, 270, 2, 286, 270,
+	2, 287, 270, 2, 288, 270, 2, 289,
+	270, 2, 290, 270, 2, 291, 270, 2,
+	292, 270, 2, 293, 270, 2, 294, 270,
+	2, 295, 270, 2, 296, 270, 2, 297,
+	270, 2, 298, 270, 2, 299, 270, 2,
+	300, 270, 2, 301, 270, 2, 302, 270,
+	2, 303, 270, 2, 304, 270, 2, 305,
+	270, 2, 306, 270, 2, 307, 270, 2,
+	308, 270, 2, 309, 270, 2, 310, 270,
+	2, 311, 270, 2, 312, 270, 2, 313,
+	270, 2, 314, 270, 2, 315, 270, 2,
+	316, 270, 2, 317, 270, 2, 318, 1,
+	3, 0, 43, 1, 3, 0, 43, 2,
+	3, 0, 43, 3, 3, 1, 64, 0,
+	3, 1, 78, 0, 3, 1, 104, 0,
+	3, 1, 237, 0, 3, 1, 254, 0,
+	3, 1, 272, 26, 3, 1, 272, 318,
+	3, 1, 318, 26, 3, 7, 1, 8,
+	3, 11, 17, 0, 3, 16, 76, 2,
+	3, 16, 76, 3, 3, 19, 9, 10,
+	3, 23, 64, 0, 3, 25, 1, 86,
+	3, 25, 1, 318, 3, 25, 2, 86,
+	3, 25, 3, 86, 3, 25, 274, 272,
+	3, 25, 276, 270, 3, 27, 82, 4,
+	3, 27, 271, 4, 3, 27, 275, 4,
+	3, 27, 275, 271, 3, 29, 1, 0,
+	3, 31, 30, 272, 3, 32, 148, 271,
+	3, 32, 150, 271, 3, 32, 275, 4,
+	3, 32, 275, 271, 3, 34, 36, 244,
+	3, 34, 36, 245, 3, 34, 36, 246,
+	3, 34, 36, 247, 3, 34, 36, 248,
+	3, 34, 36, 249, 3, 36, 244, 1,
+	3, 36, 244, 2, 3, 36, 244, 3,
+	3, 36, 245, 1, 3, 36, 245, 2,
+	3, 36, 245, 3, 3, 36, 246, 1,
+	3, 36, 246, 2, 3, 36, 246, 3,
+	3, 36, 247, 1, 3, 36, 247, 2,
+	3, 36, 247, 3, 3, 36, 248, 1,
+	3, 36, 248, 2, 3, 36, 248, 3,
+	3, 36, 249, 1, 3, 36, 249, 2,
+	3, 36, 249, 3, 3, 42, 270, 1,
+	3, 42, 270, 2, 3, 42, 270, 3,
+	3, 42, 270, 272, 3, 44, 32, 66,
+	3, 44, 32, 271, 3, 44, 32, 275,
+	3, 49, 31, 30, 3, 50, 41, 0,
+	3, 50, 41, 1, 3, 50, 41, 2,
+	3, 50, 41, 3, 3, 50, 86, 1,
+	3, 50, 86, 2, 3, 50, 86, 3,
+	3, 60, 55, 0, 3, 61, 56, 57,
+	3, 63, 22, 62, 3, 65, 0, 1,
+	3, 68, 19, 9, 3, 69, 0, 1,
+	3, 75, 19, 9, 3, 78, 0, 1,
+	3, 81, 24, 21, 3, 81, 26, 1,
+	3, 81, 26, 2, 3, 81, 26, 3,
+	3, 83, 24, 21, 3, 83, 84, 272,
+	3, 86, 1, 318, 3, 89, 100, 271,
+	3, 89, 148, 271, 3, 90, 91, 0,
+	3, 90, 91, 1, 3, 90, 91, 2,
+	3, 90, 91, 3, 3, 92, 93, 0,
+	3, 92, 93, 1, 3, 92, 93, 2,
+	3, 92, 93, 3, 3, 98, 99, 0,
+	3, 98, 99, 1, 3, 98, 99, 2,
+	3, 98, 99, 3, 3, 103, 105, 256,
+	3, 103, 265, 271, 3, 148, 149, 271,
+	3, 193, 237, 0, 3, 194, 237, 0,
+	3, 195, 237, 0, 3, 196, 237, 0,
+	3, 197, 237, 0, 3, 198, 237, 0,
+	3, 199, 237, 0, 3, 200, 237, 0,
+	3, 201, 237, 0, 3, 202, 237, 0,
+	3, 203, 237, 0, 3, 204, 237, 0,
+	3, 205, 237, 0, 3, 206, 237, 0,
+	3, 207, 237, 0, 3, 208, 237, 0,
+	3, 209, 237, 0, 3, 210, 237, 0,
+	3, 211, 237, 0, 3, 212, 237, 0,
+	3, 213, 237, 0, 3, 214, 237, 0,
+	3, 215, 237, 0, 3, 216, 237, 0,
+	3, 217, 237, 0, 3, 218, 237, 0,
+	3, 219, 237, 0, 3, 220, 237, 0,
+	3, 221, 237, 0, 3, 222, 237, 0,
+	3, 223, 237, 0, 3, 224, 237, 0,
+	3, 225, 237, 0, 3, 226, 237, 0,
+	3, 227, 237, 0, 3, 228, 237, 0,
+	3, 229, 237, 0, 3, 230, 237, 0,
+	3, 231, 237, 0, 3, 232, 237, 0,
+	3, 233, 237, 0, 3, 234, 237, 0,
+	3, 235, 237, 0, 3, 236, 237, 0,
+	3, 253, 31, 30, 3, 258, 259, 0,
+	3, 258, 260, 0, 3, 261, 103, 271,
+	3, 263, 264, 0, 3, 265, 103, 271,
+	3, 271, 4, 82, 3, 272, 24, 21,
+	3, 272, 318, 1, 3, 275, 271, 4,
+	3, 276, 270, 1, 3, 276, 270, 2,
+	3, 276, 270, 3, 3, 276, 270, 272,
+	3, 277, 270, 1, 3, 277, 270, 2,
+	3, 277, 270, 3, 3, 277, 270, 272,
+	3, 278, 270, 1, 3, 278, 270, 2,
+	3, 278, 270, 3, 3, 278, 270, 272,
+	3, 279, 270, 1, 3, 279, 270, 2,
+	3, 279, 270, 3, 3, 279, 270, 272,
+	3, 280, 270, 1, 3, 280, 270, 2,
+	3, 280, 270, 3, 3, 280, 270, 272,
+	3, 281, 270, 1, 3, 281, 270, 2,
+	3, 281, 270, 3, 3, 281, 270, 272,
+	3, 282, 270, 1, 3, 282, 270, 2,
+	3, 282, 270, 3, 3, 282, 270, 272,
+	3, 283, 270, 1, 3, 283, 270, 2,
+	3, 283, 270, 3, 3, 283, 270, 272,
+	3, 284, 270, 1, 3, 284, 270, 2,
+	3, 284, 270, 3, 3, 284, 270, 272,
+	3, 285, 270, 1, 3, 285, 270, 2,
+	3, 285, 270, 3, 3, 285, 270, 272,
+	3, 286, 270, 1, 3, 286, 270, 2,
+	3, 286, 270, 3, 3, 286, 270, 272,
+	3, 287, 270, 1, 3, 287, 270, 2,
+	3, 287, 270, 3, 3, 287, 270, 272,
+	3, 288, 270, 1, 3, 288, 270, 2,
+	3, 288, 270, 3, 3, 288, 270, 272,
+	3, 289, 270, 1, 3, 289, 270, 2,
+	3, 289, 270, 3, 3, 289, 270, 272,
+	3, 290, 270, 1, 3, 290, 270, 2,
+	3, 290, 270, 3, 3, 290, 270, 272,
+	3, 291, 270, 1, 3, 291, 270, 2,
+	3, 291, 270, 3, 3, 291, 270, 272,
+	3, 292, 270, 1, 3, 292, 270, 2,
+	3, 292, 270, 3, 3, 292, 270, 272,
+	3, 293, 270, 1, 3, 293, 270, 2,
+	3, 293, 270, 3, 3, 293, 270, 272,
+	3, 294, 270, 1, 3, 294, 270, 2,
+	3, 294, 270, 3, 3, 294, 270, 272,
+	3, 295, 270, 1, 3, 295, 270, 2,
+	3, 295, 270, 3, 3, 295, 270, 272,
+	3, 296, 270, 1, 3, 296, 270, 2,
+	3, 296, 270, 3, 3, 296, 270, 272,
+	3, 297, 270, 1, 3, 297, 270, 2,
+	3, 297, 270, 3, 3, 297, 270, 272,
+	3, 298, 270, 1, 3, 298, 270, 2,
+	3, 298, 270, 3, 3, 298, 270, 272,
+	3, 299, 270, 1, 3, 299, 270, 2,
+	3, 299, 270, 3, 3, 299, 270, 272,
+	3, 300, 270, 1, 3, 300, 270, 2,
+	3, 300, 270, 3, 3, 300, 270, 272,
+	3, 301, 270, 1, 3, 301, 270, 2,
+	3, 301, 270, 3, 3, 301, 270, 272,
+	3, 302, 270, 1, 3, 302, 270, 2,
+	3, 302, 270, 3, 3, 302, 270, 272,
+	3, 303, 270, 1, 3, 303, 270, 2,
+	3, 303, 270, 3, 3, 303, 270, 272,
+	3, 304, 270, 1, 3, 304, 270, 2,
+	3, 304, 270, 3, 3, 304, 270, 272,
+	3, 305, 270, 1, 3, 305, 270, 2,
+	3, 305, 270, 3, 3, 305, 270, 272,
+	3, 306, 270, 1, 3, 306, 270, 2,
+	3, 306, 270, 3, 3, 306, 270, 272,
+	3, 307, 270, 1, 3, 307, 270, 2,
+	3, 307, 270, 3, 3, 307, 270, 272,
+	3, 308, 270, 1, 3, 308, 270, 2,
+	3, 308, 270, 3, 3, 308, 270, 272,
+	3, 309, 270, 1, 3, 309, 270, 2,
+	3, 309, 270, 3, 3, 309, 270, 272,
+	3, 310, 270, 1, 3, 310, 270, 2,
+	3, 310, 270, 3, 3, 310, 270, 272,
+	3, 311, 270, 1, 3, 311, 270, 2,
+	3, 311, 270, 3, 3, 311, 270, 272,
+	3, 312, 270, 1, 3, 312, 270, 2,
+	3, 312, 270, 3, 3, 312, 270, 272,
+	3, 313, 270, 1, 3, 313, 270, 2,
+	3, 313, 270, 3, 3, 313, 270, 272,
+	3, 314, 270, 1, 3, 314, 270, 2,
+	3, 314, 270, 3, 3, 314, 270, 272,
+	3, 315, 270, 1, 3, 315, 270, 2,
+	3, 315, 270, 3, 3, 315, 270, 272,
+	3, 316, 270, 1, 3, 316, 270, 2,
+	3, 316, 270, 3, 3, 316, 270, 272,
+	3, 317, 270, 1, 3, 317, 270, 2,
+	3, 317, 270, 3, 3, 317, 270, 272,
+	3, 318, 1, 26, 4, 5, 7, 1,
+	8, 4, 14, 11, 17, 0, 4, 16,
+	69, 0, 1, 4, 23, 1, 64, 0,
+	4, 25, 1, 86, 318, 4, 25, 1,
+	274, 272, 4, 25, 1, 276, 270, 4,
+	25, 2, 274, 272, 4, 25, 2, 276,
+	270, 4, 25, 3, 274, 272, 4, 25,
+	3, 276, 270, 4, 25, 276, 270, 272,
+	4, 27, 32, 275, 4, 4, 27, 44,
+	32, 275, 4, 27, 275, 271, 4, 4,
+	31, 30, 24, 21, 4, 32, 275, 271,
+	4, 4, 34, 31, 30, 35, 4, 34,
 	36, 244, 1, 4, 34, 36, 244, 2,
 	4, 34, 36, 244, 3, 4, 34, 36,
 	245, 1, 4, 34, 36, 245, 2, 4,
@@ -489,91 +486,95 @@ static const short _zone_scanner_actions[] = {
 	1, 4, 34, 36, 246, 2, 4, 34,
 	36, 246, 3, 4, 34, 36, 247, 1,
 	4, 34, 36, 247, 2, 4, 34, 36,
-	247, 3, 4, 36, 244, 252, 0, 4,
-	36, 245, 252, 0, 4, 36, 246, 252,
-	0, 4, 36, 247, 252, 0, 4, 37,
-	33, 31, 30, 4, 38, 33, 31, 30,
-	4, 42, 268, 1, 270, 4, 44, 32,
-	4, 66, 4, 50, 49, 31, 30, 4,
-	50, 65, 0, 1, 4, 68, 19, 9,
-	10, 4, 73, 78, 0, 1, 4, 75,
-	19, 9, 10, 4, 83, 84, 24, 21,
-	4, 89, 146, 147, 269, 4, 90, 91,
-	1, 0, 4, 92, 93, 1, 0, 4,
-	98, 99, 1, 0, 4, 191, 1, 235,
-	0, 4, 192, 1, 235, 0, 4, 193,
-	1, 235, 0, 4, 194, 1, 235, 0,
-	4, 195, 1, 235, 0, 4, 196, 1,
-	235, 0, 4, 197, 1, 235, 0, 4,
-	198, 1, 235, 0, 4, 199, 1, 235,
-	0, 4, 200, 1, 235, 0, 4, 201,
-	1, 235, 0, 4, 202, 1, 235, 0,
-	4, 203, 1, 235, 0, 4, 204, 1,
-	235, 0, 4, 205, 1, 235, 0, 4,
-	206, 1, 235, 0, 4, 207, 1, 235,
-	0, 4, 208, 1, 235, 0, 4, 209,
-	1, 235, 0, 4, 210, 1, 235, 0,
-	4, 211, 1, 235, 0, 4, 212, 1,
-	235, 0, 4, 213, 1, 235, 0, 4,
-	214, 1, 235, 0, 4, 215, 1, 235,
-	0, 4, 216, 1, 235, 0, 4, 217,
-	1, 235, 0, 4, 218, 1, 235, 0,
-	4, 219, 1, 235, 0, 4, 220, 1,
-	235, 0, 4, 221, 1, 235, 0, 4,
-	222, 1, 235, 0, 4, 223, 1, 235,
-	0, 4, 224, 1, 235, 0, 4, 225,
-	1, 235, 0, 4, 226, 1, 235, 0,
-	4, 227, 1, 235, 0, 4, 228, 1,
-	235, 0, 4, 229, 1, 235, 0, 4,
-	230, 1, 235, 0, 4, 231, 1, 235,
-	0, 4, 232, 1, 235, 0, 4, 233,
-	1, 235, 0, 4, 234, 1, 235, 0,
-	4, 274, 268, 1, 270, 4, 274, 268,
-	1, 316, 4, 275, 268, 1, 270, 4,
-	276, 268, 1, 270, 4, 277, 268, 1,
-	270, 4, 278, 268, 1, 270, 4, 279,
-	268, 1, 270, 4, 280, 268, 1, 270,
-	4, 281, 268, 1, 270, 4, 282, 268,
-	1, 270, 4, 283, 268, 1, 270, 4,
-	284, 268, 1, 270, 4, 285, 268, 1,
-	270, 4, 286, 268, 1, 270, 4, 287,
-	268, 1, 270, 4, 288, 268, 1, 270,
-	4, 289, 268, 1, 270, 4, 290, 268,
-	1, 270, 4, 291, 268, 1, 270, 4,
-	292, 268, 1, 270, 4, 293, 268, 1,
-	270, 4, 294, 268, 1, 270, 4, 295,
-	268, 1, 270, 4, 296, 268, 1, 270,
-	4, 297, 268, 1, 270, 4, 298, 268,
-	1, 270, 4, 299, 268, 1, 270, 4,
-	300, 268, 1, 270, 4, 301, 268, 1,
-	270, 4, 302, 268, 1, 270, 4, 303,
-	268, 1, 270, 4, 304, 268, 1, 270,
-	4, 305, 268, 1, 270, 4, 306, 268,
-	1, 270, 4, 307, 268, 1, 270, 4,
-	308, 268, 1, 270, 4, 309, 268, 1,
-	270, 4, 310, 268, 1, 270, 4, 311,
-	268, 1, 270, 4, 312, 268, 1, 270,
-	4, 313, 268, 1, 270, 4, 314, 268,
-	1, 270, 4, 315, 268, 1, 270, 5,
-	16, 76, 78, 0, 1, 5, 25, 1,
-	274, 268, 270, 5, 25, 1, 274, 268,
-	316, 5, 27, 32, 273, 269, 4, 5,
-	31, 30, 270, 24, 21, 5, 34, 36,
-	244, 252, 0, 5, 34, 36, 245, 252,
-	0, 5, 34, 36, 246, 252, 0, 5,
-	34, 36, 247, 252, 0, 5, 36, 244,
-	1, 252, 0, 5, 36, 245, 1, 252,
-	0, 5, 36, 246, 1, 252, 0, 5,
-	36, 247, 1, 252, 0, 5, 44, 32,
-	273, 269, 4, 5, 83, 84, 270, 24,
-	21, 5, 250, 37, 33, 31, 30, 5,
-	274, 268, 1, 270, 316, 5, 274, 268,
-	270, 316, 1, 6, 25, 1, 274, 268,
-	270, 316, 6, 27, 44, 32, 273, 269,
-	4, 6, 34, 36, 244, 1, 252, 0,
-	6, 34, 36, 245, 1, 252, 0, 6,
-	34, 36, 246, 1, 252, 0, 6, 34,
-	36, 247, 1, 252, 0
+	247, 3, 4, 34, 36, 248, 1, 4,
+	34, 36, 248, 2, 4, 34, 36, 248,
+	3, 4, 34, 36, 249, 1, 4, 34,
+	36, 249, 2, 4, 34, 36, 249, 3,
+	4, 36, 246, 254, 0, 4, 36, 247,
+	254, 0, 4, 36, 248, 254, 0, 4,
+	36, 249, 254, 0, 4, 37, 33, 31,
+	30, 4, 38, 33, 31, 30, 4, 42,
+	270, 1, 272, 4, 44, 32, 4, 66,
+	4, 50, 49, 31, 30, 4, 50, 65,
+	0, 1, 4, 68, 19, 9, 10, 4,
+	73, 78, 0, 1, 4, 75, 19, 9,
+	10, 4, 83, 84, 24, 21, 4, 89,
+	148, 149, 271, 4, 90, 91, 1, 0,
+	4, 92, 93, 1, 0, 4, 98, 99,
+	1, 0, 4, 193, 1, 237, 0, 4,
+	194, 1, 237, 0, 4, 195, 1, 237,
+	0, 4, 196, 1, 237, 0, 4, 197,
+	1, 237, 0, 4, 198, 1, 237, 0,
+	4, 199, 1, 237, 0, 4, 200, 1,
+	237, 0, 4, 201, 1, 237, 0, 4,
+	202, 1, 237, 0, 4, 203, 1, 237,
+	0, 4, 204, 1, 237, 0, 4, 205,
+	1, 237, 0, 4, 206, 1, 237, 0,
+	4, 207, 1, 237, 0, 4, 208, 1,
+	237, 0, 4, 209, 1, 237, 0, 4,
+	210, 1, 237, 0, 4, 211, 1, 237,
+	0, 4, 212, 1, 237, 0, 4, 213,
+	1, 237, 0, 4, 214, 1, 237, 0,
+	4, 215, 1, 237, 0, 4, 216, 1,
+	237, 0, 4, 217, 1, 237, 0, 4,
+	218, 1, 237, 0, 4, 219, 1, 237,
+	0, 4, 220, 1, 237, 0, 4, 221,
+	1, 237, 0, 4, 222, 1, 237, 0,
+	4, 223, 1, 237, 0, 4, 224, 1,
+	237, 0, 4, 225, 1, 237, 0, 4,
+	226, 1, 237, 0, 4, 227, 1, 237,
+	0, 4, 228, 1, 237, 0, 4, 229,
+	1, 237, 0, 4, 230, 1, 237, 0,
+	4, 231, 1, 237, 0, 4, 232, 1,
+	237, 0, 4, 233, 1, 237, 0, 4,
+	234, 1, 237, 0, 4, 235, 1, 237,
+	0, 4, 236, 1, 237, 0, 4, 276,
+	270, 1, 272, 4, 276, 270, 1, 318,
+	4, 277, 270, 1, 272, 4, 278, 270,
+	1, 272, 4, 279, 270, 1, 272, 4,
+	280, 270, 1, 272, 4, 281, 270, 1,
+	272, 4, 282, 270, 1, 272, 4, 283,
+	270, 1, 272, 4, 284, 270, 1, 272,
+	4, 285, 270, 1, 272, 4, 286, 270,
+	1, 272, 4, 287, 270, 1, 272, 4,
+	288, 270, 1, 272, 4, 289, 270, 1,
+	272, 4, 290, 270, 1, 272, 4, 291,
+	270, 1, 272, 4, 292, 270, 1, 272,
+	4, 293, 270, 1, 272, 4, 294, 270,
+	1, 272, 4, 295, 270, 1, 272, 4,
+	296, 270, 1, 272, 4, 297, 270, 1,
+	272, 4, 298, 270, 1, 272, 4, 299,
+	270, 1, 272, 4, 300, 270, 1, 272,
+	4, 301, 270, 1, 272, 4, 302, 270,
+	1, 272, 4, 303, 270, 1, 272, 4,
+	304, 270, 1, 272, 4, 305, 270, 1,
+	272, 4, 306, 270, 1, 272, 4, 307,
+	270, 1, 272, 4, 308, 270, 1, 272,
+	4, 309, 270, 1, 272, 4, 310, 270,
+	1, 272, 4, 311, 270, 1, 272, 4,
+	312, 270, 1, 272, 4, 313, 270, 1,
+	272, 4, 314, 270, 1, 272, 4, 315,
+	270, 1, 272, 4, 316, 270, 1, 272,
+	4, 317, 270, 1, 272, 5, 16, 76,
+	78, 0, 1, 5, 25, 1, 276, 270,
+	272, 5, 25, 1, 276, 270, 318, 5,
+	27, 32, 275, 271, 4, 5, 31, 30,
+	272, 24, 21, 5, 34, 36, 246, 254,
+	0, 5, 34, 36, 247, 254, 0, 5,
+	34, 36, 248, 254, 0, 5, 34, 36,
+	249, 254, 0, 5, 36, 246, 1, 254,
+	0, 5, 36, 247, 1, 254, 0, 5,
+	36, 248, 1, 254, 0, 5, 36, 249,
+	1, 254, 0, 5, 44, 32, 275, 271,
+	4, 5, 83, 84, 272, 24, 21, 5,
+	252, 37, 33, 31, 30, 5, 276, 270,
+	1, 272, 318, 5, 276, 270, 272, 318,
+	1, 6, 25, 1, 276, 270, 272, 318,
+	6, 27, 44, 32, 275, 271, 4, 6,
+	34, 36, 246, 1, 254, 0, 6, 34,
+	36, 247, 1, 254, 0, 6, 34, 36,
+	248, 1, 254, 0, 6, 34, 36, 249,
+	1, 254, 0
 };
 
 static const short _zone_scanner_cond_offsets[] = {
@@ -654,79 +655,80 @@ static const short _zone_scanner_cond_offsets[] = {
 	529, 529, 529, 529, 529, 529, 529, 529,
 	529, 529, 529, 529, 529, 529, 529, 529,
 	529, 529, 529, 529, 529, 529, 529, 529,
-	529, 529, 529, 529, 529, 529, 531, 533,
-	535, 537, 539, 541, 543, 545, 547, 549,
-	551, 553, 553, 553, 553, 553, 556, 558,
-	558, 560, 563, 565, 565, 567, 570, 572,
-	572, 574, 577, 580, 583, 583, 585, 587,
-	587, 590, 590, 592, 594, 594, 597, 597,
-	599, 601, 601, 604, 604, 606, 608, 611,
-	611, 611, 611, 613, 615, 617, 619, 621,
-	623, 625, 627, 629, 631, 633, 635, 637,
-	639, 641, 643, 643, 645, 647, 649, 651,
-	653, 655, 657, 659, 662, 664, 666, 669,
-	671, 673, 675, 678, 680, 682, 684, 687,
-	689, 691, 693, 696, 698, 701, 703, 705,
-	708, 711, 714, 716, 719, 721, 723, 726,
-	729, 729, 731, 733, 735, 737, 739, 741,
-	741, 744, 747, 750, 750, 752, 754, 756,
-	758, 760, 762, 764, 766, 768, 770, 770,
-	773, 776, 779, 782, 785, 785, 787, 789,
-	791, 793, 795, 797, 799, 802, 805, 808,
-	810, 810, 810, 810, 810, 810, 812, 815,
-	815, 815, 815, 815, 817, 819, 821, 823,
-	825, 827, 827, 829, 832, 835, 838, 841,
-	841, 843, 845, 847, 849, 849, 851, 854,
-	857, 860, 860, 862, 864, 866, 868, 870,
-	872, 878, 889, 891, 894, 900, 903, 914,
-	917, 920, 923, 925, 927, 929, 931, 937,
-	940, 943, 945, 947, 949, 951, 957, 960,
-	963, 965, 967, 969, 971, 977, 980, 983,
-	986, 986, 988, 990, 992, 994, 996, 998,
-	1000, 1002, 1004, 1006, 1008, 1010, 1012, 1014,
-	1016, 1018, 1020, 1023, 1026, 1029, 1032, 1035,
-	1038, 1041, 1044, 1044, 1044, 1046, 1046, 1046,
-	1046, 1048, 1048, 1050, 1050, 1050, 1052, 1052,
-	1052, 1052, 1052, 1052, 1054, 1056, 1056, 1056,
-	1058, 1058, 1058, 1058, 1060, 1060, 1060, 1060,
-	1060, 1062, 1062, 1062, 1062, 1064, 1064, 1064,
-	1064, 1066, 1068, 1068, 1068, 1068, 1068, 1070,
-	1070, 1072, 1072, 1072, 1072, 1072, 1074, 1074,
-	1074, 1074, 1074, 1074, 1074, 1074, 1076, 1076,
-	1076, 1078, 1080, 1080, 1080, 1082, 1082, 1084,
-	1084, 1086, 1088, 1088, 1088, 1088, 1088, 1090,
-	1092, 1092, 1092, 1092, 1092, 1094, 1094, 1096,
-	1098, 1098, 1100, 1102, 1102, 1102, 1102, 1102,
-	1104, 1104, 1104, 1106, 1106, 1108, 1108, 1108,
-	1108, 1110, 1112, 1112, 1112, 1114, 1114, 1116,
-	1116, 1118, 1118, 1118, 1118, 1120, 1120, 1120,
-	1120, 1122, 1122, 1124, 1124, 1124, 1124, 1126,
-	1126, 1126, 1128, 1128, 1128, 1128, 1128, 1130,
-	1132, 1134, 1136, 1138, 1140, 1142, 1145, 1148,
-	1151, 1151, 1153, 1153, 1155, 1157, 1159, 1161,
-	1163, 1165, 1167, 1169, 1169, 1169, 1169, 1169,
+	529, 529, 529, 529, 529, 529, 529, 529,
+	529, 529, 529, 529, 529, 529, 529, 531,
+	533, 535, 537, 539, 541, 543, 545, 547,
+	549, 551, 553, 553, 553, 553, 553, 556,
+	558, 558, 560, 563, 565, 565, 567, 570,
+	572, 572, 574, 577, 580, 583, 583, 585,
+	587, 587, 590, 590, 592, 594, 594, 597,
+	597, 599, 601, 601, 604, 604, 606, 608,
+	611, 611, 611, 611, 613, 615, 617, 619,
+	621, 623, 625, 627, 629, 631, 633, 635,
+	637, 639, 641, 643, 643, 645, 647, 649,
+	651, 653, 655, 657, 659, 662, 664, 666,
+	669, 671, 673, 675, 678, 680, 682, 684,
+	687, 689, 691, 693, 696, 698, 701, 703,
+	705, 708, 711, 714, 716, 719, 721, 723,
+	726, 729, 729, 731, 733, 735, 737, 739,
+	741, 741, 744, 747, 750, 750, 752, 754,
+	756, 758, 760, 762, 764, 766, 768, 770,
+	770, 773, 776, 779, 782, 785, 785, 787,
+	789, 791, 793, 795, 797, 799, 802, 805,
+	808, 810, 810, 810, 810, 810, 810, 812,
+	815, 815, 815, 815, 815, 817, 819, 821,
+	823, 825, 827, 827, 829, 832, 835, 838,
+	841, 841, 843, 845, 847, 849, 849, 851,
+	854, 857, 860, 860, 862, 864, 866, 868,
+	870, 872, 878, 889, 891, 894, 900, 903,
+	914, 917, 920, 923, 925, 927, 929, 931,
+	937, 940, 943, 945, 947, 949, 951, 957,
+	960, 963, 965, 967, 969, 971, 977, 980,
+	983, 986, 986, 988, 990, 992, 994, 996,
+	998, 1000, 1002, 1004, 1006, 1008, 1010, 1012,
+	1014, 1016, 1018, 1020, 1023, 1026, 1029, 1032,
+	1035, 1038, 1041, 1044, 1044, 1044, 1046, 1046,
+	1046, 1046, 1048, 1048, 1050, 1050, 1050, 1052,
+	1052, 1052, 1052, 1052, 1052, 1054, 1056, 1056,
+	1056, 1058, 1058, 1058, 1058, 1060, 1060, 1060,
+	1060, 1060, 1062, 1062, 1062, 1062, 1064, 1064,
+	1064, 1064, 1066, 1068, 1068, 1068, 1068, 1068,
+	1070, 1070, 1072, 1072, 1072, 1072, 1072, 1074,
+	1074, 1074, 1074, 1074, 1074, 1074, 1074, 1076,
+	1076, 1076, 1078, 1080, 1080, 1080, 1082, 1082,
+	1084, 1084, 1086, 1088, 1088, 1088, 1088, 1088,
+	1090, 1092, 1092, 1092, 1092, 1092, 1094, 1094,
+	1096, 1098, 1098, 1100, 1102, 1102, 1102, 1102,
+	1102, 1104, 1104, 1104, 1106, 1106, 1108, 1108,
+	1108, 1108, 1110, 1112, 1112, 1112, 1114, 1114,
+	1116, 1116, 1118, 1118, 1118, 1118, 1120, 1120,
+	1120, 1120, 1122, 1122, 1124, 1124, 1124, 1124,
+	1126, 1126, 1126, 1128, 1128, 1128, 1128, 1128,
+	1130, 1132, 1134, 1136, 1138, 1140, 1142, 1145,
+	1148, 1151, 1151, 1153, 1153, 1155, 1157, 1159,
+	1161, 1163, 1165, 1167, 1169, 1169, 1169, 1169,
 	1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169,
-	1169, 1169, 1172, 1172, 1174, 1177, 1180, 1183,
-	1183, 1185, 1187, 1189, 1191, 1193, 1195, 1195,
-	1195, 1195, 1198, 1201, 1204, 1204, 1206, 1208,
-	1210, 1212, 1214, 1216, 1216, 1218, 1221, 1224,
-	1227, 1230, 1230, 1232, 1234, 1234, 1237, 1237,
-	1239, 1241, 1241, 1241, 1241, 1241, 1241, 1241,
-	1241, 1241, 1241, 1244, 1244, 1244, 1244, 1244,
+	1169, 1169, 1169, 1172, 1172, 1174, 1177, 1180,
+	1183, 1183, 1185, 1187, 1189, 1191, 1193, 1195,
+	1195, 1195, 1195, 1198, 1201, 1204, 1204, 1206,
+	1208, 1210, 1212, 1214, 1216, 1216, 1218, 1221,
+	1224, 1227, 1230, 1230, 1232, 1234, 1234, 1237,
+	1237, 1239, 1241, 1241, 1241, 1241, 1241, 1241,
+	1241, 1241, 1241, 1241, 1244, 1244, 1244, 1244,
 	1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244,
-	1244, 1246, 1248, 1250, 1252, 1252, 1255, 1258,
-	1258, 1260, 1262, 1264, 1266, 1266, 1269, 1272,
-	1274, 1276, 1278, 1280, 1282, 1284, 1286, 1288,
-	1290, 1292, 1292, 1292, 1292, 1292, 1292, 1292,
-	1292, 1294, 1294, 1296, 1299, 1299, 1301, 1304,
-	1304, 1306, 1309, 1311, 1311, 1313, 1316, 1319,
+	1244, 1244, 1246, 1248, 1250, 1252, 1252, 1255,
+	1258, 1258, 1260, 1262, 1264, 1266, 1266, 1269,
+	1272, 1274, 1276, 1278, 1280, 1282, 1284, 1286,
+	1288, 1290, 1292, 1292, 1292, 1292, 1292, 1292,
+	1292, 1292, 1294, 1294, 1296, 1299, 1299, 1301,
+	1304, 1304, 1306, 1309, 1311, 1311, 1313, 1316,
 	1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
-	1319, 1321, 1324, 1324, 1324, 1326, 1329, 1331,
-	1334, 1336, 1339, 1341, 1344, 1344, 1344, 1344,
-	1344, 1346, 1349, 1349, 1351, 1354, 1354, 1356,
-	1359, 1359, 1365, 1368, 1379, 1382, 1393, 1396,
-	1396, 1396, 1396, 1396, 1396, 1396, 1396, 1398,
-	1401, 1401, 1401, 1401, 1401, 1401
+	1319, 1319, 1321, 1324, 1324, 1324, 1326, 1329,
+	1331, 1334, 1336, 1339, 1341, 1344, 1344, 1344,
+	1344, 1344, 1346, 1349, 1349, 1351, 1354, 1354,
+	1356, 1359, 1359, 1365, 1368, 1379, 1382, 1393,
+	1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396,
+	1398, 1401, 1401, 1401, 1401, 1401, 1401
 };
 
 static const char _zone_scanner_cond_lengths[] = {
@@ -807,79 +809,80 @@ static const char _zone_scanner_cond_lengths[] = {
 	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, 2, 2, 2,
-	2, 2, 2, 2, 2, 2, 2, 2,
-	2, 0, 0, 0, 0, 3, 2, 0,
-	2, 3, 2, 0, 2, 3, 2, 0,
-	2, 3, 3, 3, 0, 2, 2, 0,
-	3, 0, 2, 2, 0, 3, 0, 2,
-	2, 0, 3, 0, 2, 2, 3, 0,
-	0, 0, 2, 2, 2, 2, 2, 2,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 2, 2,
 	2, 2, 2, 2, 2, 2, 2, 2,
-	2, 2, 0, 2, 2, 2, 2, 2,
-	2, 2, 2, 3, 2, 2, 3, 2,
-	2, 2, 3, 2, 2, 2, 3, 2,
-	2, 2, 3, 2, 3, 2, 2, 3,
-	3, 3, 2, 3, 2, 2, 3, 3,
-	0, 2, 2, 2, 2, 2, 2, 0,
-	3, 3, 3, 0, 2, 2, 2, 2,
-	2, 2, 2, 2, 2, 2, 0, 3,
-	3, 3, 3, 3, 0, 2, 2, 2,
-	2, 2, 2, 2, 3, 3, 3, 2,
-	0, 0, 0, 0, 0, 2, 3, 0,
+	2, 2, 0, 0, 0, 0, 3, 2,
+	0, 2, 3, 2, 0, 2, 3, 2,
+	0, 2, 3, 3, 3, 0, 2, 2,
+	0, 3, 0, 2, 2, 0, 3, 0,
+	2, 2, 0, 3, 0, 2, 2, 3,
 	0, 0, 0, 2, 2, 2, 2, 2,
-	2, 0, 2, 3, 3, 3, 3, 0,
-	2, 2, 2, 2, 0, 2, 3, 3,
+	2, 2, 2, 2, 2, 2, 2, 2,
+	2, 2, 2, 0, 2, 2, 2, 2,
+	2, 2, 2, 2, 3, 2, 2, 3,
+	2, 2, 2, 3, 2, 2, 2, 3,
+	2, 2, 2, 3, 2, 3, 2, 2,
+	3, 3, 3, 2, 3, 2, 2, 3,
 	3, 0, 2, 2, 2, 2, 2, 2,
-	6, 11, 2, 3, 6, 3, 11, 3,
+	0, 3, 3, 3, 0, 2, 2, 2,
+	2, 2, 2, 2, 2, 2, 2, 0,
+	3, 3, 3, 3, 3, 0, 2, 2,
+	2, 2, 2, 2, 2, 3, 3, 3,
+	2, 0, 0, 0, 0, 0, 2, 3,
+	0, 0, 0, 0, 2, 2, 2, 2,
+	2, 2, 0, 2, 3, 3, 3, 3,
+	0, 2, 2, 2, 2, 0, 2, 3,
+	3, 3, 0, 2, 2, 2, 2, 2,
+	2, 6, 11, 2, 3, 6, 3, 11,
+	3, 3, 3, 2, 2, 2, 2, 6,
 	3, 3, 2, 2, 2, 2, 6, 3,
 	3, 2, 2, 2, 2, 6, 3, 3,
-	2, 2, 2, 2, 6, 3, 3, 3,
-	0, 2, 2, 2, 2, 2, 2, 2,
+	3, 0, 2, 2, 2, 2, 2, 2,
 	2, 2, 2, 2, 2, 2, 2, 2,
-	2, 2, 3, 3, 3, 3, 3, 3,
-	3, 3, 0, 0, 2, 0, 0, 0,
-	2, 0, 2, 0, 0, 2, 0, 0,
-	0, 0, 0, 2, 2, 0, 0, 2,
-	0, 0, 0, 2, 0, 0, 0, 0,
+	2, 2, 2, 3, 3, 3, 3, 3,
+	3, 3, 3, 0, 0, 2, 0, 0,
+	0, 2, 0, 2, 0, 0, 2, 0,
+	0, 0, 0, 0, 2, 2, 0, 0,
 	2, 0, 0, 0, 2, 0, 0, 0,
-	2, 2, 0, 0, 0, 0, 2, 0,
-	2, 0, 0, 0, 0, 2, 0, 0,
-	0, 0, 0, 0, 0, 2, 0, 0,
-	2, 2, 0, 0, 2, 0, 2, 0,
-	2, 2, 0, 0, 0, 0, 2, 2,
-	0, 0, 0, 0, 2, 0, 2, 2,
+	0, 2, 0, 0, 0, 2, 0, 0,
 	0, 2, 2, 0, 0, 0, 0, 2,
-	0, 0, 2, 0, 2, 0, 0, 0,
-	2, 2, 0, 0, 2, 0, 2, 0,
-	2, 0, 0, 0, 2, 0, 0, 0,
-	2, 0, 2, 0, 0, 0, 2, 0,
-	0, 2, 0, 0, 0, 0, 2, 2,
-	2, 2, 2, 2, 2, 3, 3, 3,
-	0, 2, 0, 2, 2, 2, 2, 2,
-	2, 2, 2, 0, 0, 0, 0, 0,
+	0, 2, 0, 0, 0, 0, 2, 0,
+	0, 0, 0, 0, 0, 0, 2, 0,
+	0, 2, 2, 0, 0, 2, 0, 2,
+	0, 2, 2, 0, 0, 0, 0, 2,
+	2, 0, 0, 0, 0, 2, 0, 2,
+	2, 0, 2, 2, 0, 0, 0, 0,
+	2, 0, 0, 2, 0, 2, 0, 0,
+	0, 2, 2, 0, 0, 2, 0, 2,
+	0, 2, 0, 0, 0, 2, 0, 0,
+	0, 2, 0, 2, 0, 0, 0, 2,
+	0, 0, 2, 0, 0, 0, 0, 2,
+	2, 2, 2, 2, 2, 2, 3, 3,
+	3, 0, 2, 0, 2, 2, 2, 2,
+	2, 2, 2, 2, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
-	0, 3, 0, 2, 3, 3, 3, 0,
-	2, 2, 2, 2, 2, 2, 0, 0,
-	0, 3, 3, 3, 0, 2, 2, 2,
-	2, 2, 2, 0, 2, 3, 3, 3,
-	3, 0, 2, 2, 0, 3, 0, 2,
-	2, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 3, 0, 0, 0, 0, 0,
+	0, 0, 3, 0, 2, 3, 3, 3,
+	0, 2, 2, 2, 2, 2, 2, 0,
+	0, 0, 3, 3, 3, 0, 2, 2,
+	2, 2, 2, 2, 0, 2, 3, 3,
+	3, 3, 0, 2, 2, 0, 3, 0,
+	2, 2, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 3, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
-	2, 2, 2, 2, 0, 3, 3, 0,
-	2, 2, 2, 2, 0, 3, 3, 2,
+	0, 2, 2, 2, 2, 0, 3, 3,
+	0, 2, 2, 2, 2, 0, 3, 3,
 	2, 2, 2, 2, 2, 2, 2, 2,
-	2, 0, 0, 0, 0, 0, 0, 0,
-	2, 0, 2, 3, 0, 2, 3, 0,
-	2, 3, 2, 0, 2, 3, 3, 0,
-	0, 0, 0, 0, 0, 0, 0, 0,
-	2, 3, 0, 0, 2, 3, 2, 3,
-	2, 3, 2, 3, 0, 0, 0, 0,
-	2, 3, 0, 2, 3, 0, 2, 3,
-	0, 6, 3, 11, 3, 11, 3, 0,
-	0, 0, 0, 0, 0, 0, 2, 3,
-	0, 0, 0, 0, 0, 0
+	2, 2, 0, 0, 0, 0, 0, 0,
+	0, 2, 0, 2, 3, 0, 2, 3,
+	0, 2, 3, 2, 0, 2, 3, 3,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 2, 3, 0, 0, 2, 3, 2,
+	3, 2, 3, 2, 3, 0, 0, 0,
+	0, 2, 3, 0, 2, 3, 0, 2,
+	3, 0, 6, 3, 11, 3, 11, 3,
+	0, 0, 0, 0, 0, 0, 0, 2,
+	3, 0, 0, 0, 0, 0, 0
 };
 
 static const short _zone_scanner_cond_keys[] = {
@@ -1478,94 +1481,95 @@ static const short _zone_scanner_key_offsets[] = {
 	3682, 3692, 3704, 3710, 3726, 3729, 3732, 3740,
 	3743, 3755, 3763, 3767, 3773, 3775, 3782, 3784,
 	3786, 3788, 3790, 3791, 3792, 3794, 3796, 3798,
-	3799, 3805, 3807, 3811, 3812, 3814, 3816, 3818,
-	3820, 3826, 3828, 3830, 3832, 3834, 3835, 3836,
-	3838, 3840, 3842, 3843, 3844, 3845, 3851, 3852,
-	3853, 3855, 3857, 3859, 3860, 3861, 3862, 3868,
-	3870, 3872, 3874, 3876, 3878, 3880, 3882, 3888,
-	3890, 3892, 3894, 3896, 3898, 3900, 3904, 3906,
-	3908, 3914, 3916, 3918, 3924, 3926, 3928, 3932,
-	3934, 3935, 3941, 3943, 3945, 3948, 3955, 3957,
-	3959, 3961, 3963, 3964, 3965, 3967, 3969, 3971,
-	3972, 3978, 3979, 3980, 3986, 3987, 3988, 3994,
-	4008, 4016, 4018, 4020, 4022, 4024, 4026, 4032,
-	4038, 4040, 4042, 4044, 4046, 4048, 4054, 4058,
-	4060, 4066, 4068, 4070, 4076, 4078, 4080, 4082,
-	4088, 4090, 4092, 4098, 4102, 4104, 4110, 4112,
-	4114, 4120, 4122, 4124, 4126, 4132, 4134, 4136,
-	4142, 4145, 4154, 4163, 4169, 4178, 4184, 4199,
-	4205, 4213, 4221, 4229, 4247, 4255, 4273, 4281,
-	4299, 4307, 4325, 4333, 4345, 4353, 4356, 4364,
-	4376, 4384, 4387, 4395, 4407, 4415, 4418, 4426,
-	4438, 4446, 4449, 4452, 4455, 4461, 4467, 4479,
-	4485, 4488, 4497, 4503, 4518, 4524, 4527, 4529,
-	4537, 4552, 4558, 4561, 4567, 4577, 4593, 4596,
-	4603, 4616, 4618, 4626, 4636, 4644, 4654, 4663,
-	4671, 4677, 4685, 4693, 4703, 4711, 4721, 4730,
-	4738, 4744, 4753, 4755, 4769, 4781, 4795, 4807,
-	4821, 4833, 4847, 4857, 4860, 4873, 4886, 4889,
-	4902, 4915, 4925, 4928, 4941, 4954, 4964, 4967,
-	4980, 4993, 5003, 5006, 5012, 5015, 5023, 5031,
-	5034, 5037, 5040, 5046, 5049, 5057, 5065, 5068,
-	5071, 5073, 5081, 5089, 5097, 5105, 5113, 5128,
-	5134, 5137, 5140, 5143, 5145, 5153, 5161, 5169,
-	5181, 5187, 5199, 5205, 5217, 5223, 5238, 5244,
-	5247, 5250, 5253, 5256, 5259, 5265, 5271, 5279,
-	5287, 5299, 5305, 5318, 5320, 5323, 5326, 5329,
-	5342, 5344, 5345, 5348, 5351, 5353, 5365, 5368,
-	5369, 5376, 5383, 5385, 5393, 5405, 5411, 5419,
-	5427, 5439, 5445, 5461, 5464, 5467, 5470, 5473,
-	5475, 5483, 5491, 5499, 5511, 5517, 5533, 5536,
-	5539, 5542, 5544, 5552, 5562, 5568, 5576, 5584,
-	5591, 5625, 5638, 5640, 5643, 5657, 5660, 5701,
-	5710, 5713, 5716, 5722, 5730, 5738, 5747, 5784,
-	5787, 5790, 5796, 5804, 5812, 5825, 5866, 5869,
-	5872, 5878, 5886, 5894, 5909, 5943, 5946, 5949,
-	5952, 5982, 5994, 6006, 6012, 6020, 6028, 6036,
-	6044, 6052, 6060, 6068, 6076, 6084, 6092, 6107,
-	6113, 6126, 6128, 6131, 6134, 6137, 6140, 6143,
-	6146, 6149, 6152, 6154, 6156, 6162, 6164, 6166,
-	6168, 6174, 6176, 6182, 6190, 6192, 6198, 6202,
-	6204, 6206, 6208, 6210, 6216, 6222, 6224, 6226,
-	6232, 6234, 6236, 6238, 6244, 6250, 6252, 6254,
-	6256, 6262, 6266, 6268, 6270, 6276, 6278, 6280,
-	6282, 6288, 6294, 6296, 6298, 6300, 6301, 6307,
-	6308, 6314, 6316, 6318, 6320, 6322, 6328, 6330,
-	6332, 6334, 6336, 6338, 6340, 6342, 6348, 6352,
-	6354, 6360, 6366, 6372, 6373, 6379, 6380, 6386,
-	6388, 6394, 6400, 6404, 6406, 6408, 6410, 6416,
-	6422, 6428, 6430, 6432, 6434, 6440, 6442, 6448,
-	6456, 6458, 6465, 6473, 6475, 6477, 6479, 6481,
-	6487, 6489, 6491, 6497, 6503, 6509, 6511, 6513,
-	6515, 6521, 6527, 6535, 6537, 6543, 6545, 6551,
-	6553, 6559, 6561, 6563, 6565, 6571, 6577, 6579,
-	6581, 6587, 6589, 6595, 6597, 6599, 6601, 6609,
-	6611, 6613, 6619, 6628, 6634, 6640, 6642, 6650,
-	6658, 6666, 6678, 6684, 6697, 6699, 6702, 6705,
-	6708, 6715, 6717, 6719, 6727, 6735, 6743, 6751,
-	6759, 6772, 6778, 6790, 6796, 6803, 6809, 6816,
-	6823, 6829, 6836, 6848, 6854, 6855, 6856, 6857,
-	6858, 6859, 6862, 6868, 6880, 6883, 6886, 6889,
-	6891, 6899, 6907, 6915, 6923, 6931, 6944, 6950,
-	6956, 6968, 6971, 6974, 6977, 6979, 6987, 6995,
-	7003, 7011, 7019, 7031, 7037, 7053, 7056, 7059,
-	7062, 7065, 7067, 7075, 7084, 7093, 7096, 7098,
-	7106, 7118, 7124, 7130, 7136, 7137, 7143, 7149,
-	7155, 7161, 7168, 7171, 7177, 7183, 7184, 7190,
-	7196, 7203, 7209, 7215, 7216, 7222, 7228, 7235,
-	7237, 7245, 7253, 7261, 7273, 7279, 7282, 7285,
-	7287, 7295, 7307, 7313, 7325, 7331, 7334, 7337,
-	7355, 7388, 7436, 7486, 7504, 7554, 7572, 7605,
-	7670, 7735, 7735, 7735, 7735, 7747, 7747, 7747,
-	7747, 7763, 7763, 7780, 7783, 7783, 7823, 7826,
-	7826, 7842, 7845, 7857, 7857, 7873, 7876, 7879,
-	7879, 7879, 7879, 7879, 7879, 7879, 7879, 7879,
-	7879, 7895, 7898, 7898, 7898, 7908, 7911, 7923,
-	7926, 7938, 7941, 7953, 7956, 7956, 7956, 7956,
-	7956, 7969, 7972, 7972, 7988, 7991, 7991, 8007,
-	8010, 8010, 8024, 8027, 8040, 8043, 8084, 8093,
-	8093, 8093, 8093, 8093, 8093, 8093, 8093, 8109,
-	8112, 8112, 8112, 8112, 8112, 8112
+	3799, 3805, 3809, 3813, 3814, 3816, 3818, 3820,
+	3822, 3828, 3830, 3832, 3834, 3836, 3837, 3838,
+	3840, 3842, 3844, 3845, 3846, 3847, 3853, 3854,
+	3855, 3857, 3859, 3861, 3862, 3863, 3864, 3870,
+	3872, 3873, 3874, 3875, 3876, 3882, 3883, 3884,
+	3890, 3892, 3894, 3896, 3898, 3900, 3902, 3904,
+	3910, 3912, 3914, 3916, 3918, 3920, 3922, 3926,
+	3928, 3930, 3936, 3938, 3940, 3946, 3948, 3950,
+	3954, 3956, 3957, 3963, 3965, 3967, 3970, 3977,
+	3979, 3981, 3983, 3985, 3986, 3987, 3989, 3991,
+	3993, 3994, 4000, 4001, 4002, 4008, 4009, 4010,
+	4016, 4030, 4038, 4040, 4042, 4044, 4046, 4048,
+	4054, 4060, 4062, 4064, 4066, 4068, 4070, 4076,
+	4080, 4082, 4088, 4090, 4092, 4098, 4100, 4102,
+	4104, 4110, 4112, 4114, 4120, 4124, 4126, 4132,
+	4134, 4136, 4142, 4144, 4146, 4148, 4154, 4156,
+	4158, 4164, 4167, 4176, 4185, 4191, 4200, 4206,
+	4221, 4227, 4235, 4243, 4251, 4269, 4277, 4295,
+	4303, 4321, 4329, 4347, 4355, 4367, 4375, 4378,
+	4386, 4398, 4406, 4409, 4417, 4429, 4437, 4440,
+	4448, 4460, 4468, 4471, 4474, 4477, 4483, 4489,
+	4501, 4507, 4510, 4519, 4525, 4540, 4546, 4549,
+	4551, 4559, 4574, 4580, 4583, 4589, 4599, 4615,
+	4618, 4625, 4638, 4640, 4648, 4658, 4666, 4676,
+	4685, 4693, 4699, 4707, 4715, 4725, 4733, 4743,
+	4752, 4760, 4766, 4775, 4777, 4791, 4803, 4817,
+	4829, 4843, 4855, 4869, 4879, 4882, 4895, 4908,
+	4911, 4924, 4937, 4947, 4950, 4963, 4976, 4986,
+	4989, 5002, 5015, 5025, 5028, 5034, 5037, 5045,
+	5053, 5056, 5059, 5062, 5068, 5071, 5079, 5087,
+	5090, 5093, 5095, 5103, 5111, 5119, 5127, 5135,
+	5150, 5156, 5159, 5162, 5165, 5167, 5175, 5183,
+	5191, 5203, 5209, 5221, 5227, 5239, 5245, 5260,
+	5266, 5269, 5272, 5275, 5278, 5281, 5287, 5293,
+	5301, 5309, 5321, 5327, 5340, 5342, 5345, 5348,
+	5351, 5364, 5366, 5367, 5370, 5373, 5375, 5387,
+	5390, 5391, 5398, 5405, 5407, 5415, 5427, 5433,
+	5441, 5449, 5461, 5467, 5483, 5486, 5489, 5492,
+	5495, 5497, 5505, 5513, 5521, 5533, 5539, 5555,
+	5558, 5561, 5564, 5566, 5574, 5584, 5590, 5598,
+	5606, 5613, 5647, 5660, 5662, 5665, 5679, 5682,
+	5723, 5732, 5735, 5738, 5744, 5752, 5760, 5769,
+	5806, 5809, 5812, 5818, 5826, 5834, 5847, 5888,
+	5891, 5894, 5900, 5908, 5916, 5931, 5965, 5968,
+	5971, 5974, 6004, 6016, 6028, 6034, 6042, 6050,
+	6058, 6066, 6074, 6082, 6090, 6098, 6106, 6114,
+	6129, 6135, 6148, 6150, 6153, 6156, 6159, 6162,
+	6165, 6168, 6171, 6174, 6176, 6178, 6184, 6186,
+	6188, 6190, 6196, 6198, 6204, 6212, 6214, 6220,
+	6224, 6226, 6228, 6230, 6232, 6238, 6244, 6246,
+	6248, 6254, 6256, 6258, 6260, 6266, 6272, 6274,
+	6276, 6278, 6284, 6288, 6290, 6292, 6298, 6300,
+	6302, 6304, 6310, 6316, 6318, 6320, 6322, 6323,
+	6329, 6330, 6336, 6338, 6340, 6342, 6344, 6350,
+	6352, 6354, 6356, 6358, 6360, 6362, 6364, 6370,
+	6374, 6376, 6382, 6388, 6394, 6395, 6401, 6402,
+	6408, 6410, 6416, 6422, 6426, 6428, 6430, 6432,
+	6438, 6444, 6450, 6452, 6454, 6456, 6462, 6464,
+	6470, 6478, 6480, 6487, 6495, 6497, 6499, 6501,
+	6503, 6509, 6511, 6513, 6519, 6525, 6531, 6533,
+	6535, 6537, 6543, 6549, 6557, 6559, 6565, 6567,
+	6573, 6575, 6581, 6583, 6585, 6587, 6593, 6599,
+	6601, 6603, 6609, 6611, 6617, 6619, 6621, 6623,
+	6631, 6633, 6635, 6641, 6650, 6656, 6662, 6664,
+	6672, 6680, 6688, 6700, 6706, 6719, 6721, 6724,
+	6727, 6730, 6737, 6739, 6741, 6749, 6757, 6765,
+	6773, 6781, 6794, 6800, 6812, 6818, 6825, 6831,
+	6838, 6845, 6851, 6858, 6870, 6876, 6877, 6878,
+	6879, 6880, 6881, 6884, 6890, 6902, 6905, 6908,
+	6911, 6913, 6921, 6929, 6937, 6945, 6953, 6966,
+	6972, 6978, 6990, 6993, 6996, 6999, 7001, 7009,
+	7017, 7025, 7033, 7041, 7053, 7059, 7075, 7078,
+	7081, 7084, 7087, 7089, 7097, 7106, 7115, 7118,
+	7120, 7128, 7140, 7146, 7152, 7158, 7159, 7165,
+	7171, 7177, 7183, 7190, 7193, 7199, 7205, 7206,
+	7212, 7218, 7225, 7231, 7237, 7238, 7244, 7250,
+	7257, 7259, 7267, 7275, 7283, 7295, 7301, 7304,
+	7307, 7309, 7317, 7329, 7335, 7347, 7353, 7356,
+	7359, 7377, 7410, 7458, 7508, 7526, 7576, 7594,
+	7627, 7692, 7757, 7757, 7757, 7757, 7769, 7769,
+	7769, 7769, 7785, 7785, 7802, 7805, 7805, 7845,
+	7848, 7848, 7864, 7867, 7879, 7879, 7895, 7898,
+	7901, 7901, 7901, 7901, 7901, 7901, 7901, 7901,
+	7901, 7901, 7917, 7920, 7920, 7920, 7930, 7933,
+	7945, 7948, 7960, 7963, 7975, 7978, 7978, 7978,
+	7978, 7978, 7991, 7994, 7994, 8010, 8013, 8013,
+	8029, 8032, 8032, 8046, 8049, 8062, 8065, 8106,
+	8115, 8115, 8115, 8115, 8115, 8115, 8115, 8115,
+	8131, 8134, 8134, 8134, 8134, 8134, 8134
 };
 
 static const short _zone_scanner_trans_keys[] = {
@@ -2044,59 +2048,65 @@ static const short _zone_scanner_trans_keys[] = {
 	45, 59, 9, 10, 40, 41, 78, 110,
 	83, 115, 69, 101, 67, 99, 51, 45,
 	83, 115, 72, 104, 65, 97, 49, 32,
-	59, 9, 10, 40, 41, 67, 99, 67,
-	68, 99, 100, 45, 71, 103, 79, 111,
-	83, 115, 84, 116, 32, 59, 9, 10,
-	40, 41, 83, 115, 65, 97, 80, 112,
-	50, 51, 53, 54, 83, 115, 72, 104,
-	65, 97, 50, 53, 54, 32, 59, 9,
-	10, 40, 41, 56, 52, 83, 115, 72,
-	104, 65, 97, 51, 56, 52, 32, 59,
-	9, 10, 40, 41, 78, 110, 68, 100,
-	73, 105, 82, 114, 69, 101, 67, 99,
-	84, 116, 32, 59, 9, 10, 40, 41,
-	82, 114, 73, 105, 86, 118, 65, 97,
-	84, 116, 69, 101, 68, 79, 100, 111,
-	78, 110, 83, 115, 32, 59, 9, 10,
-	40, 41, 73, 105, 68, 100, 32, 59,
+	59, 9, 10, 40, 41, 67, 68, 99,
+	100, 67, 68, 99, 100, 45, 71, 103,
+	79, 111, 83, 115, 84, 116, 32, 59,
 	9, 10, 40, 41, 83, 115, 65, 97,
-	77, 83, 109, 115, 68, 100, 53, 32,
-	59, 9, 10, 40, 41, 72, 104, 65,
-	97, 49, 50, 53, 32, 45, 59, 9,
-	10, 40, 41, 78, 110, 83, 115, 69,
-	101, 67, 99, 51, 45, 83, 115, 72,
-	104, 65, 97, 49, 32, 59, 9, 10,
-	40, 41, 53, 54, 32, 59, 9, 10,
-	40, 41, 49, 50, 32, 59, 9, 10,
-	40, 41, 65, 73, 79, 80, 83, 85,
-	97, 105, 111, 112, 115, 117, 48, 57,
-	32, 59, 9, 10, 40, 41, 48, 57,
-	67, 99, 80, 112, 75, 107, 73, 105,
-	88, 120, 32, 59, 9, 10, 40, 41,
-	65, 80, 83, 97, 112, 115, 67, 99,
-	80, 112, 75, 107, 73, 105, 88, 120,
-	32, 59, 9, 10, 40, 41, 71, 75,
-	103, 107, 80, 112, 32, 59, 9, 10,
-	40, 41, 73, 105, 88, 120, 32, 59,
-	9, 10, 40, 41, 80, 112, 75, 107,
-	73, 105, 32, 59, 9, 10, 40, 41,
+	80, 112, 50, 51, 53, 54, 83, 115,
+	72, 104, 65, 97, 50, 53, 54, 32,
+	59, 9, 10, 40, 41, 56, 52, 83,
+	115, 72, 104, 65, 97, 51, 56, 52,
+	32, 59, 9, 10, 40, 41, 50, 52,
+	53, 53, 49, 57, 32, 59, 9, 10,
+	40, 41, 52, 56, 32, 59, 9, 10,
+	40, 41, 78, 110, 68, 100, 73, 105,
+	82, 114, 69, 101, 67, 99, 84, 116,
+	32, 59, 9, 10, 40, 41, 82, 114,
+	73, 105, 86, 118, 65, 97, 84, 116,
+	69, 101, 68, 79, 100, 111, 78, 110,
+	83, 115, 32, 59, 9, 10, 40, 41,
 	73, 105, 68, 100, 32, 59, 9, 10,
-	40, 41, 71, 75, 103, 107, 80, 112,
+	40, 41, 83, 115, 65, 97, 77, 83,
+	109, 115, 68, 100, 53, 32, 59, 9,
+	10, 40, 41, 72, 104, 65, 97, 49,
+	50, 53, 32, 45, 59, 9, 10, 40,
+	41, 78, 110, 83, 115, 69, 101, 67,
+	99, 51, 45, 83, 115, 72, 104, 65,
+	97, 49, 32, 59, 9, 10, 40, 41,
+	53, 54, 32, 59, 9, 10, 40, 41,
+	49, 50, 32, 59, 9, 10, 40, 41,
+	65, 73, 79, 80, 83, 85, 97, 105,
+	111, 112, 115, 117, 48, 57, 32, 59,
+	9, 10, 40, 41, 48, 57, 67, 99,
+	80, 112, 75, 107, 73, 105, 88, 120,
+	32, 59, 9, 10, 40, 41, 65, 80,
+	83, 97, 112, 115, 67, 99, 80, 112,
+	75, 107, 73, 105, 88, 120, 32, 59,
+	9, 10, 40, 41, 71, 75, 103, 107,
+	80, 112, 32, 59, 9, 10, 40, 41,
+	73, 105, 88, 120, 32, 59, 9, 10,
+	40, 41, 80, 112, 75, 107, 73, 105,
 	32, 59, 9, 10, 40, 41, 73, 105,
-	88, 120, 32, 59, 9, 10, 40, 41,
-	80, 112, 75, 107, 73, 105, 32, 59,
-	9, 10, 40, 41, 82, 114, 73, 105,
-	32, 59, 9, 10, 40, 41, 46, 48,
-	57, 32, 46, 59, 9, 10, 40, 41,
-	48, 57, 42, 92, 95, 45, 57, 64,
-	90, 97, 122, 32, 59, 9, 10, 40,
-	41, 42, 92, 95, 45, 57, 64, 90,
-	97, 122, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 42, 92, 95, 1034,
-	1083, 45, 57, 64, 90, 97, 122, 9,
-	32, 40, 41, 1034, 1083, 9, 32, 40,
-	41, 1034, 1083, 48, 57, 9, 32, 40,
-	41, 1034, 1083, 48, 57, 9, 32, 40,
+	68, 100, 32, 59, 9, 10, 40, 41,
+	71, 75, 103, 107, 80, 112, 32, 59,
+	9, 10, 40, 41, 73, 105, 88, 120,
+	32, 59, 9, 10, 40, 41, 80, 112,
+	75, 107, 73, 105, 32, 59, 9, 10,
+	40, 41, 82, 114, 73, 105, 32, 59,
+	9, 10, 40, 41, 46, 48, 57, 32,
+	46, 59, 9, 10, 40, 41, 48, 57,
+	42, 92, 95, 45, 57, 64, 90, 97,
+	122, 32, 59, 9, 10, 40, 41, 42,
+	92, 95, 45, 57, 64, 90, 97, 122,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 42, 92, 95, 1034, 1083, 45,
+	57, 64, 90, 97, 122, 9, 32, 40,
+	41, 1034, 1083, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 68,
+	72, 77, 83, 87, 100, 104, 109, 115,
+	119, 1034, 1083, 48, 57, 9, 32, 40,
 	41, 1034, 1083, 48, 57, 9, 32, 40,
 	41, 68, 72, 77, 83, 87, 100, 104,
 	109, 115, 119, 1034, 1083, 48, 57, 9,
@@ -2104,66 +2114,66 @@ static const short _zone_scanner_trans_keys[] = {
 	32, 40, 41, 68, 72, 77, 83, 87,
 	100, 104, 109, 115, 119, 1034, 1083, 48,
 	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 68, 72, 77,
-	83, 87, 100, 104, 109, 115, 119, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 32, 59, 68, 72, 77,
-	83, 87, 100, 104, 109, 115, 119, 9,
-	10, 40, 41, 48, 57, 32, 59, 9,
-	10, 40, 41, 48, 57, 68, 72, 77,
-	83, 87, 100, 104, 109, 115, 119, 48,
-	57, 32, 59, 9, 10, 40, 41, 48,
-	57, 1034, 896, 1151, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 68, 72, 77, 83,
-	87, 100, 104, 109, 115, 119, 48, 57,
-	9, 32, 40, 41, 1034, 1083, 48, 57,
-	1034, 896, 1151, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 68, 72, 77, 83, 87,
-	100, 104, 109, 115, 119, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 1034,
+	57, 32, 59, 68, 72, 77, 83, 87,
+	100, 104, 109, 115, 119, 9, 10, 40,
+	41, 48, 57, 32, 59, 9, 10, 40,
+	41, 48, 57, 68, 72, 77, 83, 87,
+	100, 104, 109, 115, 119, 48, 57, 32,
+	59, 9, 10, 40, 41, 48, 57, 1034,
 	896, 1151, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 68, 72, 77, 83, 87, 100,
 	104, 109, 115, 119, 48, 57, 9, 32,
 	40, 41, 1034, 1083, 48, 57, 1034, 896,
-	1151, 1034, 896, 1151, 1034, 896, 1151, 32,
-	59, 9, 10, 40, 41, 9, 32, 40,
-	41, 1034, 1083, 9, 32, 40, 41, 1034,
-	1083, -128, 8, 11, 58, 60, 127, 32,
-	59, 9, 10, 40, 41, 1034, 896, 1151,
-	42, 92, 95, 45, 57, 64, 90, 97,
-	122, 9, 32, 40, 41, 1034, 1083, 9,
+	1151, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 68, 72, 77, 83, 87, 100, 104,
+	109, 115, 119, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 1034, 896, 1151,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	68, 72, 77, 83, 87, 100, 104, 109,
+	115, 119, 48, 57, 9, 32, 40, 41,
+	1034, 1083, 48, 57, 1034, 896, 1151, 1034,
+	896, 1151, 1034, 896, 1151, 32, 59, 9,
+	10, 40, 41, 9, 32, 40, 41, 1034,
+	1083, 9, 32, 40, 41, 1034, 1083, -128,
+	8, 11, 58, 60, 127, 32, 59, 9,
+	10, 40, 41, 1034, 896, 1151, 42, 92,
+	95, 45, 57, 64, 90, 97, 122, 9,
+	32, 40, 41, 1034, 1083, 9, 32, 40,
+	41, 42, 92, 95, 1034, 1083, 45, 57,
+	64, 90, 97, 122, 32, 59, 9, 10,
+	40, 41, 1034, 896, 1151, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
 	32, 40, 41, 42, 92, 95, 1034, 1083,
 	45, 57, 64, 90, 97, 122, 32, 59,
-	9, 10, 40, 41, 1034, 896, 1151, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 42, 92, 95,
-	1034, 1083, 45, 57, 64, 90, 97, 122,
-	32, 59, 9, 10, 40, 41, 1034, 896,
-	1151, 32, 59, 9, 10, 40, 41, 9,
+	9, 10, 40, 41, 1034, 896, 1151, 32,
+	59, 9, 10, 40, 41, 9, 32, 40,
+	41, 2058, 2107, 2314, 2363, 2570, 2619, 9,
 	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
-	2619, 9, 32, 40, 41, 2058, 2107, 2314,
-	2363, 2570, 2619, -128, 8, 11, 58, 60,
-	127, 1034, 896, 1151, 46, 48, 58, 65,
-	70, 97, 102, 32, 46, 59, 9, 10,
-	40, 41, 48, 58, 65, 70, 97, 102,
+	2619, -128, 8, 11, 58, 60, 127, 1034,
+	896, 1151, 46, 48, 58, 65, 70, 97,
+	102, 32, 46, 59, 9, 10, 40, 41,
+	48, 58, 65, 70, 97, 102, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 78, 83, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 78, 83,
 	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	78, 83, 1034, 1083, 48, 57, 9, 32,
-	40, 41, 46, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 78, 83, 1034, 1083, 9,
-	32, 40, 41, 1034, 1083, 9, 32, 40,
-	41, 1034, 1083, 48, 57, 9, 32, 40,
+	46, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 78, 83, 1034, 1083, 9, 32, 40,
+	41, 1034, 1083, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 69,
+	87, 1034, 1083, 48, 57, 9, 32, 40,
 	41, 1034, 1083, 48, 57, 9, 32, 40,
 	41, 69, 87, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 69, 87, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 46, 1034, 1083,
-	48, 57, 9, 32, 40, 41, 69, 87,
-	1034, 1083, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 45, 1034, 1083, 48,
-	57, 48, 57, 9, 32, 40, 41, 46,
+	32, 40, 41, 46, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 69, 87, 1034, 1083,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 45, 1034, 1083, 48, 57, 48,
+	57, 9, 32, 40, 41, 46, 109, 2058,
+	2107, 2314, 2363, 2570, 2619, 48, 57, 9,
+	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
+	2619, 48, 57, 9, 32, 40, 41, 46,
 	109, 2058, 2107, 2314, 2363, 2570, 2619, 48,
 	57, 9, 32, 40, 41, 2058, 2107, 2314,
 	2363, 2570, 2619, 48, 57, 9, 32, 40,
@@ -2172,418 +2182,414 @@ static const short _zone_scanner_trans_keys[] = {
 	2107, 2314, 2363, 2570, 2619, 48, 57, 9,
 	32, 40, 41, 46, 109, 2058, 2107, 2314,
 	2363, 2570, 2619, 48, 57, 9, 32, 40,
-	41, 2058, 2107, 2314, 2363, 2570, 2619, 48,
-	57, 9, 32, 40, 41, 46, 109, 2058,
+	41, 2058, 2107, 2314, 2363, 2570, 2619, 1034,
+	896, 1151, 9, 32, 40, 41, 109, 2058,
 	2107, 2314, 2363, 2570, 2619, 48, 57, 9,
-	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
-	2619, 1034, 896, 1151, 9, 32, 40, 41,
-	109, 2058, 2107, 2314, 2363, 2570, 2619, 48,
-	57, 9, 32, 40, 41, 109, 2058, 2107,
-	2314, 2363, 2570, 2619, 48, 57, 1034, 896,
-	1151, 9, 32, 40, 41, 109, 2058, 2107,
-	2314, 2363, 2570, 2619, 48, 57, 9, 32,
-	40, 41, 109, 2058, 2107, 2314, 2363, 2570,
-	2619, 48, 57, 9, 32, 40, 41, 2058,
-	2107, 2314, 2363, 2570, 2619, 1034, 896, 1151,
-	9, 32, 40, 41, 109, 2058, 2107, 2314,
-	2363, 2570, 2619, 48, 57, 9, 32, 40,
-	41, 109, 2058, 2107, 2314, 2363, 2570, 2619,
-	48, 57, 9, 32, 40, 41, 2058, 2107,
-	2314, 2363, 2570, 2619, 1034, 896, 1151, 9,
+	32, 40, 41, 109, 2058, 2107, 2314, 2363,
+	2570, 2619, 48, 57, 1034, 896, 1151, 9,
 	32, 40, 41, 109, 2058, 2107, 2314, 2363,
 	2570, 2619, 48, 57, 9, 32, 40, 41,
 	109, 2058, 2107, 2314, 2363, 2570, 2619, 48,
 	57, 9, 32, 40, 41, 2058, 2107, 2314,
 	2363, 2570, 2619, 1034, 896, 1151, 9, 32,
+	40, 41, 109, 2058, 2107, 2314, 2363, 2570,
+	2619, 48, 57, 9, 32, 40, 41, 109,
+	2058, 2107, 2314, 2363, 2570, 2619, 48, 57,
+	9, 32, 40, 41, 2058, 2107, 2314, 2363,
+	2570, 2619, 1034, 896, 1151, 9, 32, 40,
+	41, 109, 2058, 2107, 2314, 2363, 2570, 2619,
+	48, 57, 9, 32, 40, 41, 109, 2058,
+	2107, 2314, 2363, 2570, 2619, 48, 57, 9,
+	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
+	2619, 1034, 896, 1151, 9, 32, 40, 41,
+	1034, 1083, 1034, 896, 1151, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 1034, 896, 1151,
+	1034, 896, 1151, 1034, 896, 1151, 9, 32,
 	40, 41, 1034, 1083, 1034, 896, 1151, 9,
 	32, 40, 41, 1034, 1083, 48, 57, 9,
 	32, 40, 41, 1034, 1083, 48, 57, 1034,
-	896, 1151, 1034, 896, 1151, 1034, 896, 1151,
-	9, 32, 40, 41, 1034, 1083, 1034, 896,
-	1151, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 1034, 896, 1151, 1034, 896, 1151, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 42, 92, 95,
-	1034, 1083, 45, 57, 64, 90, 97, 122,
-	32, 59, 9, 10, 40, 41, 1034, 896,
-	1151, 1034, 896, 1151, 1034, 896, 1151, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 9, 32, 40, 41, 1034, 1083, -128,
+	896, 1151, 1034, 896, 1151, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 42, 92, 95, 1034, 1083,
+	45, 57, 64, 90, 97, 122, 32, 59,
+	9, 10, 40, 41, 1034, 896, 1151, 1034,
+	896, 1151, 1034, 896, 1151, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 1034, 1083, -128, 8, 11,
+	58, 60, 127, 9, 32, 40, 41, 1034,
+	1083, 9, 32, 40, 41, 1034, 1083, -128,
 	8, 11, 58, 60, 127, 9, 32, 40,
 	41, 1034, 1083, 9, 32, 40, 41, 1034,
 	1083, -128, 8, 11, 58, 60, 127, 9,
 	32, 40, 41, 1034, 1083, 9, 32, 40,
-	41, 1034, 1083, -128, 8, 11, 58, 60,
-	127, 9, 32, 40, 41, 1034, 1083, 9,
-	32, 40, 41, 42, 92, 95, 1034, 1083,
-	45, 57, 64, 90, 97, 122, 32, 59,
-	9, 10, 40, 41, 1034, 896, 1151, 1034,
-	896, 1151, 1034, 896, 1151, 1034, 896, 1151,
-	1034, 896, 1151, 48, 57, 65, 90, 97,
+	41, 42, 92, 95, 1034, 1083, 45, 57,
+	64, 90, 97, 122, 32, 59, 9, 10,
+	40, 41, 1034, 896, 1151, 1034, 896, 1151,
+	1034, 896, 1151, 1034, 896, 1151, 1034, 896,
+	1151, 48, 57, 65, 90, 97, 122, 9,
+	32, 40, 41, 1034, 1083, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 65, 90, 97,
 	122, 9, 32, 40, 41, 1034, 1083, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
+	32, 40, 41, 43, 1034, 1083, 47, 57,
+	65, 90, 97, 122, 1546, 1595, 1034, 896,
+	1151, 1034, 896, 1151, 1034, 896, 1151, 9,
+	32, 33, 40, 41, 49, 50, 2058, 2107,
+	2314, 2363, 2570, 2619, 49, 50, 58, 46,
+	48, 57, 47, 46, 57, 48, 57, 9,
+	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
+	2619, 48, 57, 1034, 896, 1151, 58, 46,
+	48, 58, 65, 70, 97, 102, 47, 46,
+	58, 65, 70, 97, 102, 48, 57, 9,
 	32, 40, 41, 1034, 1083, 48, 57, 9,
 	32, 40, 41, 1034, 1083, 48, 57, 65,
 	90, 97, 122, 9, 32, 40, 41, 1034,
-	1083, 9, 32, 40, 41, 43, 1034, 1083,
-	47, 57, 65, 90, 97, 122, 1546, 1595,
-	1034, 896, 1151, 1034, 896, 1151, 1034, 896,
-	1151, 9, 32, 33, 40, 41, 49, 50,
-	2058, 2107, 2314, 2363, 2570, 2619, 49, 50,
-	58, 46, 48, 57, 47, 46, 57, 48,
-	57, 9, 32, 40, 41, 2058, 2107, 2314,
-	2363, 2570, 2619, 48, 57, 1034, 896, 1151,
-	58, 46, 48, 58, 65, 70, 97, 102,
-	47, 46, 58, 65, 70, 97, 102, 48,
+	1083, 9, 32, 40, 41, 1034, 1083, 48,
 	57, 9, 32, 40, 41, 1034, 1083, 48,
 	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 65, 90, 97, 122, 9, 32, 40,
-	41, 1034, 1083, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 65, 70, 97, 102, 48,
-	57, 65, 70, 97, 102, 9, 32, 40,
-	41, 2058, 2107, 2314, 2363, 2570, 2619, 48,
-	57, 65, 70, 97, 102, 1034, 896, 1151,
-	1034, 896, 1151, 1034, 896, 1151, 1034, 896,
-	1151, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 65, 70, 97, 102, 48,
-	57, 65, 70, 97, 102, 9, 32, 40,
-	41, 2058, 2107, 2314, 2363, 2570, 2619, 48,
-	57, 65, 70, 97, 102, 1034, 896, 1151,
-	1034, 896, 1151, 1034, 896, 1151, 48, 57,
-	9, 32, 40, 41, 1034, 1083, 48, 57,
-	9, 32, 40, 41, 48, 49, 50, 51,
-	1034, 1083, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 1034, 1083, 48, 57,
-	9, 32, 40, 41, 1034, 1083, 48, 57,
-	9, 32, 40, 41, 46, 1034, 1083, 6153,
-	6176, 6184, 6185, 6409, 6432, 6440, 6441, 6665,
-	6688, 6696, 6697, 9482, 9531, 9738, 9787, 10250,
-	10299, 10506, 10555, 10762, 10811, 11274, 11323, 11530,
-	11579, 11786, 11835, 12298, 12347, 12554, 12603, 12810,
-	12859, 3081, 3104, 3112, 3113, 3115, 4106, 4155,
-	3119, 3129, 3137, 3162, 3169, 3194, 1546, 1595,
-	4106, 3968, 4223, 4617, 4640, 4648, 4649, 13578,
-	13627, 13834, 13883, 14346, 14395, 14602, 14651, 14858,
-	14907, 5642, 5504, 5759, 3115, 6153, 6176, 6184,
+	57, 65, 70, 97, 102, 48, 57, 65,
+	70, 97, 102, 9, 32, 40, 41, 2058,
+	2107, 2314, 2363, 2570, 2619, 48, 57, 65,
+	70, 97, 102, 1034, 896, 1151, 1034, 896,
+	1151, 1034, 896, 1151, 1034, 896, 1151, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 65, 70, 97, 102, 48, 57, 65,
+	70, 97, 102, 9, 32, 40, 41, 2058,
+	2107, 2314, 2363, 2570, 2619, 48, 57, 65,
+	70, 97, 102, 1034, 896, 1151, 1034, 896,
+	1151, 1034, 896, 1151, 48, 57, 9, 32,
+	40, 41, 1034, 1083, 48, 57, 9, 32,
+	40, 41, 48, 49, 50, 51, 1034, 1083,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 1034, 1083, 48, 57, 9, 32,
+	40, 41, 1034, 1083, 48, 57, 9, 32,
+	40, 41, 46, 1034, 1083, 6153, 6176, 6184,
 	6185, 6409, 6432, 6440, 6441, 6665, 6688, 6696,
 	6697, 9482, 9531, 9738, 9787, 10250, 10299, 10506,
 	10555, 10762, 10811, 11274, 11323, 11530, 11579, 11786,
-	11835, 12298, 12347, 12554, 12603, 12810, 12859, 3119,
-	3129, 3137, 3162, 3169, 3194, 7690, 8202, 8714,
-	7552, 7807, 8064, 8319, 8576, 8831, 1034, 896,
+	11835, 12298, 12347, 12554, 12603, 12810, 12859, 3081,
+	3104, 3112, 3113, 3115, 4106, 4155, 3119, 3129,
+	3137, 3162, 3169, 3194, 1546, 1595, 4106, 3968,
+	4223, 4617, 4640, 4648, 4649, 13578, 13627, 13834,
+	13883, 14346, 14395, 14602, 14651, 14858, 14907, 5642,
+	5504, 5759, 3115, 6153, 6176, 6184, 6185, 6409,
+	6432, 6440, 6441, 6665, 6688, 6696, 6697, 9482,
+	9531, 9738, 9787, 10250, 10299, 10506, 10555, 10762,
+	10811, 11274, 11323, 11530, 11579, 11786, 11835, 12298,
+	12347, 12554, 12603, 12810, 12859, 3119, 3129, 3137,
+	3162, 3169, 3194, 7690, 8202, 8714, 7552, 7807,
+	8064, 8319, 8576, 8831, 1034, 896, 1151, 1034,
+	896, 1151, 9, 32, 40, 41, 1034, 1083,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 46, 1034, 1083, 48,
+	57, 46, 6153, 6176, 6184, 6185, 6409, 6432,
+	6440, 6441, 6665, 6688, 6696, 6697, 9482, 9531,
+	9738, 9787, 10250, 10299, 10506, 10555, 10762, 10811,
+	11274, 11323, 11530, 11579, 11786, 11835, 12298, 12347,
+	12554, 12603, 12810, 12859, 48, 57, 1034, 896,
 	1151, 1034, 896, 1151, 9, 32, 40, 41,
 	1034, 1083, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 46, 1034,
-	1083, 48, 57, 46, 6153, 6176, 6184, 6185,
-	6409, 6432, 6440, 6441, 6665, 6688, 6696, 6697,
-	9482, 9531, 9738, 9787, 10250, 10299, 10506, 10555,
-	10762, 10811, 11274, 11323, 11530, 11579, 11786, 11835,
-	12298, 12347, 12554, 12603, 12810, 12859, 48, 57,
+	1083, 48, 58, 65, 70, 97, 102, 46,
+	6153, 6176, 6184, 6185, 6409, 6432, 6440, 6441,
+	6665, 6688, 6696, 6697, 9482, 9531, 9738, 9787,
+	10250, 10299, 10506, 10555, 10762, 10811, 11274, 11323,
+	11530, 11579, 11786, 11835, 12298, 12347, 12554, 12603,
+	12810, 12859, 48, 58, 65, 70, 97, 102,
 	1034, 896, 1151, 1034, 896, 1151, 9, 32,
 	40, 41, 1034, 1083, 9, 32, 40, 41,
 	1034, 1083, 48, 57, 9, 32, 40, 41,
 	1034, 1083, 48, 57, 9, 32, 40, 41,
-	46, 1034, 1083, 48, 58, 65, 70, 97,
-	102, 46, 6153, 6176, 6184, 6185, 6409, 6432,
-	6440, 6441, 6665, 6688, 6696, 6697, 9482, 9531,
-	9738, 9787, 10250, 10299, 10506, 10555, 10762, 10811,
-	11274, 11323, 11530, 11579, 11786, 11835, 12298, 12347,
-	12554, 12603, 12810, 12859, 48, 58, 65, 70,
-	97, 102, 1034, 896, 1151, 1034, 896, 1151,
-	9, 32, 40, 41, 1034, 1083, 9, 32,
-	40, 41, 1034, 1083, 48, 57, 9, 32,
-	40, 41, 1034, 1083, 48, 57, 9, 32,
-	40, 41, 42, 92, 95, 1034, 1083, 45,
-	57, 64, 90, 97, 122, 6153, 6176, 6184,
-	6185, 6409, 6432, 6440, 6441, 6665, 6688, 6696,
-	6697, 9482, 9531, 9738, 9787, 10250, 10299, 10506,
-	10555, 10762, 10811, 11274, 11323, 11530, 11579, 11786,
-	11835, 12298, 12347, 12554, 12603, 12810, 12859, 1034,
-	896, 1151, 1034, 896, 1151, 1034, 896, 1151,
-	65, 67, 68, 69, 72, 73, 75, 76,
-	77, 78, 80, 82, 83, 84, 85, 97,
-	99, 100, 101, 104, 105, 107, 108, 109,
-	110, 112, 114, 115, 116, 117, 9, 32,
-	40, 41, 65, 70, 80, 97, 102, 112,
-	1034, 1083, 9, 32, 40, 41, 1034, 1083,
-	48, 57, 65, 90, 97, 122, 9, 32,
-	40, 41, 1034, 1083, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 9, 32, 40, 41,
 	42, 92, 95, 1034, 1083, 45, 57, 64,
-	90, 97, 122, 9, 32, 40, 41, 1034,
-	1083, 9, 32, 40, 41, 43, 1034, 1083,
-	47, 57, 65, 90, 97, 122, 1546, 1595,
-	1034, 896, 1151, 1034, 896, 1151, 1034, 896,
-	1151, 1034, 896, 1151, 1034, 896, 1151, 1034,
-	896, 1151, 1034, 896, 1151, 1034, 896, 1151,
-	65, 97, 65, 97, 9, 32, 40, 41,
-	1034, 1083, 83, 115, 68, 100, 66, 98,
-	9, 32, 40, 41, 1034, 1083, 76, 108,
-	9, 32, 40, 41, 1034, 1083, 65, 68,
-	69, 78, 97, 100, 101, 110, 65, 97,
-	9, 32, 40, 41, 1034, 1083, 78, 83,
-	110, 115, 83, 115, 75, 107, 69, 101,
-	89, 121, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 1034, 1083, 82, 114,
-	84, 116, 9, 32, 40, 41, 1034, 1083,
-	65, 97, 77, 109, 69, 101, 9, 32,
-	40, 41, 1034, 1083, 72, 78, 83, 104,
-	110, 115, 67, 99, 73, 105, 68, 100,
-	9, 32, 40, 41, 1034, 1083, 65, 83,
-	97, 115, 77, 109, 69, 101, 9, 32,
-	40, 41, 1034, 1083, 75, 107, 69, 101,
-	89, 121, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 1034, 1083, 85, 117,
-	73, 105, 52, 54, 56, 9, 32, 40,
-	41, 1034, 1083, 52, 9, 32, 40, 41,
-	1034, 1083, 73, 105, 78, 110, 70, 102,
-	79, 111, 9, 32, 40, 41, 1034, 1083,
-	80, 112, 83, 115, 69, 101, 67, 99,
-	75, 107, 69, 101, 89, 121, 9, 32,
-	40, 41, 1034, 1083, 69, 88, 101, 120,
-	89, 121, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 1034, 1083, 51, 54,
-	79, 80, 111, 112, 50, 9, 32, 40,
-	41, 1034, 1083, 52, 9, 32, 40, 41,
-	1034, 1083, 67, 99, 9, 32, 40, 41,
+	90, 97, 122, 6153, 6176, 6184, 6185, 6409,
+	6432, 6440, 6441, 6665, 6688, 6696, 6697, 9482,
+	9531, 9738, 9787, 10250, 10299, 10506, 10555, 10762,
+	10811, 11274, 11323, 11530, 11579, 11786, 11835, 12298,
+	12347, 12554, 12603, 12810, 12859, 1034, 896, 1151,
+	1034, 896, 1151, 1034, 896, 1151, 65, 67,
+	68, 69, 72, 73, 75, 76, 77, 78,
+	80, 82, 83, 84, 85, 97, 99, 100,
+	101, 104, 105, 107, 108, 109, 110, 112,
+	114, 115, 116, 117, 9, 32, 40, 41,
+	65, 70, 80, 97, 102, 112, 1034, 1083,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	65, 90, 97, 122, 9, 32, 40, 41,
 	1034, 1083, 9, 32, 40, 41, 1034, 1083,
-	73, 88, 105, 120, 78, 110, 70, 102,
-	79, 111, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 1034, 1083, 65, 73,
-	83, 97, 105, 115, 80, 112, 84, 116,
-	82, 114, 9, 32, 40, 41, 1034, 1083,
-	68, 100, 9, 32, 40, 41, 1034, 1083,
-	9, 32, 40, 41, 69, 101, 1034, 1083,
-	67, 99, 9, 32, 40, 41, 51, 1034,
-	1083, 9, 32, 40, 41, 80, 112, 1034,
-	1083, 65, 97, 82, 114, 65, 97, 77,
-	109, 9, 32, 40, 41, 1034, 1083, 84,
-	116, 82, 114, 9, 32, 40, 41, 1034,
-	1083, 80, 82, 84, 112, 114, 116, 9,
-	32, 40, 41, 1034, 1083, 83, 115, 73,
-	105, 71, 103, 9, 32, 40, 41, 1034,
-	1083, 9, 32, 40, 41, 1034, 1083, 79,
-	80, 82, 83, 111, 112, 114, 115, 65,
-	97, 9, 32, 40, 41, 1034, 1083, 70,
-	102, 9, 32, 40, 41, 1034, 1083, 86,
-	118, 9, 32, 40, 41, 1034, 1083, 72,
-	104, 70, 102, 80, 112, 9, 32, 40,
-	41, 1034, 1083, 76, 88, 89, 108, 120,
-	121, 83, 115, 65, 97, 9, 32, 40,
-	41, 1034, 1083, 84, 116, 9, 32, 40,
-	41, 1034, 1083, 80, 112, 69, 101, 48,
-	57, 9, 32, 40, 41, 1034, 1083, 48,
-	57, 82, 114, 73, 105, 9, 32, 40,
-	41, 1034, 1083, 42, 92, 95, 45, 57,
-	64, 90, 97, 122, 32, 59, 9, 10,
-	40, 41, 32, 59, 9, 10, 40, 41,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
-	48, 57, 65, 90, 97, 122, 9, 32,
-	40, 41, 1034, 1083, 9, 32, 40, 41,
-	43, 1034, 1083, 47, 57, 65, 90, 97,
-	122, 1546, 1595, 1034, 896, 1151, 1034, 896,
-	1151, 1034, 896, 1151, 43, 47, 57, 65,
-	90, 97, 122, 1546, 1595, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
-	32, 40, 41, 45, 1034, 1083, 48, 57,
-	65, 70, 97, 102, 9, 32, 40, 41,
-	1034, 1083, 9, 32, 40, 41, 1034, 1083,
-	48, 57, 65, 86, 97, 118, 48, 57,
-	65, 86, 97, 118, 61, 48, 57, 65,
-	86, 97, 118, 48, 57, 65, 86, 97,
-	118, 61, 48, 57, 65, 86, 97, 118,
-	61, 48, 57, 65, 86, 97, 118, 48,
-	57, 65, 86, 97, 118, 61, 48, 57,
-	65, 86, 97, 118, 32, 59, 9, 10,
-	40, 41, 48, 57, 65, 86, 97, 118,
-	32, 59, 9, 10, 40, 41, 61, 61,
-	61, 61, 61, 1034, 896, 1151, 48, 57,
-	65, 70, 97, 102, 9, 32, 40, 41,
-	1034, 1083, 48, 57, 65, 70, 97, 102,
-	1034, 896, 1151, 1034, 896, 1151, 1034, 896,
-	1151, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 45,
-	1034, 1083, 48, 57, 65, 70, 97, 102,
-	32, 59, 9, 10, 40, 41, 48, 57,
-	65, 70, 97, 102, 32, 59, 9, 10,
-	40, 41, 48, 57, 65, 70, 97, 102,
-	1034, 896, 1151, 1034, 896, 1151, 1034, 896,
-	1151, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 65, 70, 97, 102, 48,
-	57, 65, 70, 97, 102, 9, 32, 40,
-	41, 2058, 2107, 2314, 2363, 2570, 2619, 48,
-	57, 65, 70, 97, 102, 1034, 896, 1151,
-	1034, 896, 1151, 1034, 896, 1151, 1034, 896,
-	1151, 48, 57, 9, 32, 40, 41, 1034,
-	1083, 48, 57, 9, 32, 40, 41, 46,
-	1034, 1083, 48, 57, 32, 46, 59, 9,
-	10, 40, 41, 48, 57, 1034, 896, 1151,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
 	48, 57, 9, 32, 40, 41, 1034, 1083,
-	48, 57, 65, 70, 97, 102, 48, 57,
-	65, 70, 97, 102, 48, 57, 65, 70,
-	97, 102, 48, 57, 65, 70, 97, 102,
-	58, 48, 57, 65, 70, 97, 102, 48,
-	57, 65, 70, 97, 102, 48, 57, 65,
-	70, 97, 102, 48, 57, 65, 70, 97,
-	102, 32, 58, 59, 9, 10, 40, 41,
-	1034, 896, 1151, 48, 57, 65, 70, 97,
-	102, 48, 57, 65, 70, 97, 102, 45,
-	48, 57, 65, 70, 97, 102, 48, 57,
-	65, 70, 97, 102, 32, 45, 59, 9,
-	10, 40, 41, 48, 57, 65, 70, 97,
-	102, 48, 57, 65, 70, 97, 102, 45,
-	48, 57, 65, 70, 97, 102, 48, 57,
-	65, 70, 97, 102, 32, 45, 59, 9,
-	10, 40, 41, 48, 57, 9, 32, 40,
-	41, 1034, 1083, 48, 57, 9, 32, 40,
-	41, 1034, 1083, 48, 57, 9, 32, 40,
-	41, 1034, 1083, 48, 57, 9, 32, 40,
+	48, 57, 9, 32, 40, 41, 1034, 1083,
+	48, 57, 9, 32, 40, 41, 1034, 1083,
+	48, 57, 9, 32, 40, 41, 1034, 1083,
+	48, 57, 9, 32, 40, 41, 42, 92,
+	95, 1034, 1083, 45, 57, 64, 90, 97,
+	122, 9, 32, 40, 41, 1034, 1083, 9,
+	32, 40, 41, 43, 1034, 1083, 47, 57,
+	65, 90, 97, 122, 1546, 1595, 1034, 896,
+	1151, 1034, 896, 1151, 1034, 896, 1151, 1034,
+	896, 1151, 1034, 896, 1151, 1034, 896, 1151,
+	1034, 896, 1151, 1034, 896, 1151, 65, 97,
+	65, 97, 9, 32, 40, 41, 1034, 1083,
+	83, 115, 68, 100, 66, 98, 9, 32,
+	40, 41, 1034, 1083, 76, 108, 9, 32,
+	40, 41, 1034, 1083, 65, 68, 69, 78,
+	97, 100, 101, 110, 65, 97, 9, 32,
+	40, 41, 1034, 1083, 78, 83, 110, 115,
+	83, 115, 75, 107, 69, 101, 89, 121,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 1034, 1083, 82, 114, 84, 116,
+	9, 32, 40, 41, 1034, 1083, 65, 97,
+	77, 109, 69, 101, 9, 32, 40, 41,
+	1034, 1083, 72, 78, 83, 104, 110, 115,
+	67, 99, 73, 105, 68, 100, 9, 32,
+	40, 41, 1034, 1083, 65, 83, 97, 115,
+	77, 109, 69, 101, 9, 32, 40, 41,
+	1034, 1083, 75, 107, 69, 101, 89, 121,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 1034, 1083, 85, 117, 73, 105,
+	52, 54, 56, 9, 32, 40, 41, 1034,
+	1083, 52, 9, 32, 40, 41, 1034, 1083,
+	73, 105, 78, 110, 70, 102, 79, 111,
+	9, 32, 40, 41, 1034, 1083, 80, 112,
+	83, 115, 69, 101, 67, 99, 75, 107,
+	69, 101, 89, 121, 9, 32, 40, 41,
+	1034, 1083, 69, 88, 101, 120, 89, 121,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 1034, 1083, 51, 54, 79, 80,
+	111, 112, 50, 9, 32, 40, 41, 1034,
+	1083, 52, 9, 32, 40, 41, 1034, 1083,
+	67, 99, 9, 32, 40, 41, 1034, 1083,
+	9, 32, 40, 41, 1034, 1083, 73, 88,
+	105, 120, 78, 110, 70, 102, 79, 111,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 1034, 1083, 65, 73, 83, 97,
+	105, 115, 80, 112, 84, 116, 82, 114,
+	9, 32, 40, 41, 1034, 1083, 68, 100,
+	9, 32, 40, 41, 1034, 1083, 9, 32,
+	40, 41, 69, 101, 1034, 1083, 67, 99,
+	9, 32, 40, 41, 51, 1034, 1083, 9,
+	32, 40, 41, 80, 112, 1034, 1083, 65,
+	97, 82, 114, 65, 97, 77, 109, 9,
+	32, 40, 41, 1034, 1083, 84, 116, 82,
+	114, 9, 32, 40, 41, 1034, 1083, 80,
+	82, 84, 112, 114, 116, 9, 32, 40,
+	41, 1034, 1083, 83, 115, 73, 105, 71,
+	103, 9, 32, 40, 41, 1034, 1083, 9,
+	32, 40, 41, 1034, 1083, 79, 80, 82,
+	83, 111, 112, 114, 115, 65, 97, 9,
+	32, 40, 41, 1034, 1083, 70, 102, 9,
+	32, 40, 41, 1034, 1083, 86, 118, 9,
+	32, 40, 41, 1034, 1083, 72, 104, 70,
+	102, 80, 112, 9, 32, 40, 41, 1034,
+	1083, 76, 88, 89, 108, 120, 121, 83,
+	115, 65, 97, 9, 32, 40, 41, 1034,
+	1083, 84, 116, 9, 32, 40, 41, 1034,
+	1083, 80, 112, 69, 101, 48, 57, 9,
+	32, 40, 41, 1034, 1083, 48, 57, 82,
+	114, 73, 105, 9, 32, 40, 41, 1034,
+	1083, 42, 92, 95, 45, 57, 64, 90,
+	97, 122, 32, 59, 9, 10, 40, 41,
+	32, 59, 9, 10, 40, 41, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	65, 90, 97, 122, 9, 32, 40, 41,
+	1034, 1083, 9, 32, 40, 41, 43, 1034,
+	1083, 47, 57, 65, 90, 97, 122, 1546,
+	1595, 1034, 896, 1151, 1034, 896, 1151, 1034,
+	896, 1151, 43, 47, 57, 65, 90, 97,
+	122, 1546, 1595, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
+	41, 45, 1034, 1083, 48, 57, 65, 70,
+	97, 102, 9, 32, 40, 41, 1034, 1083,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	65, 86, 97, 118, 48, 57, 65, 86,
+	97, 118, 61, 48, 57, 65, 86, 97,
+	118, 48, 57, 65, 86, 97, 118, 61,
+	48, 57, 65, 86, 97, 118, 61, 48,
+	57, 65, 86, 97, 118, 48, 57, 65,
+	86, 97, 118, 61, 48, 57, 65, 86,
+	97, 118, 32, 59, 9, 10, 40, 41,
+	48, 57, 65, 86, 97, 118, 32, 59,
+	9, 10, 40, 41, 61, 61, 61, 61,
+	61, 1034, 896, 1151, 48, 57, 65, 70,
+	97, 102, 9, 32, 40, 41, 1034, 1083,
+	48, 57, 65, 70, 97, 102, 1034, 896,
+	1151, 1034, 896, 1151, 1034, 896, 1151, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 45, 1034, 1083,
+	48, 57, 65, 70, 97, 102, 32, 59,
+	9, 10, 40, 41, 48, 57, 65, 70,
+	97, 102, 32, 59, 9, 10, 40, 41,
+	48, 57, 65, 70, 97, 102, 1034, 896,
+	1151, 1034, 896, 1151, 1034, 896, 1151, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 65, 70, 97, 102, 48, 57, 65,
+	70, 97, 102, 9, 32, 40, 41, 2058,
+	2107, 2314, 2363, 2570, 2619, 48, 57, 65,
+	70, 97, 102, 1034, 896, 1151, 1034, 896,
+	1151, 1034, 896, 1151, 1034, 896, 1151, 48,
+	57, 9, 32, 40, 41, 1034, 1083, 48,
+	57, 9, 32, 40, 41, 46, 1034, 1083,
+	48, 57, 32, 46, 59, 9, 10, 40,
+	41, 48, 57, 1034, 896, 1151, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	9, 32, 40, 41, 1034, 1083, 48, 57,
+	65, 70, 97, 102, 48, 57, 65, 70,
+	97, 102, 48, 57, 65, 70, 97, 102,
+	48, 57, 65, 70, 97, 102, 58, 48,
+	57, 65, 70, 97, 102, 48, 57, 65,
+	70, 97, 102, 48, 57, 65, 70, 97,
+	102, 48, 57, 65, 70, 97, 102, 32,
+	58, 59, 9, 10, 40, 41, 1034, 896,
+	1151, 48, 57, 65, 70, 97, 102, 48,
+	57, 65, 70, 97, 102, 45, 48, 57,
+	65, 70, 97, 102, 48, 57, 65, 70,
+	97, 102, 32, 45, 59, 9, 10, 40,
+	41, 48, 57, 65, 70, 97, 102, 48,
+	57, 65, 70, 97, 102, 45, 48, 57,
+	65, 70, 97, 102, 48, 57, 65, 70,
+	97, 102, 32, 45, 59, 9, 10, 40,
+	41, 48, 57, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 9, 32, 40, 41, 1034,
+	1083, -128, 8, 11, 58, 60, 127, 32,
+	59, 9, 10, 40, 41, 1034, 896, 1151,
+	1034, 896, 1151, 48, 57, 9, 32, 40,
+	41, 1034, 1083, 48, 57, 9, 32, 40,
 	41, 1034, 1083, -128, 8, 11, 58, 60,
-	127, 32, 59, 9, 10, 40, 41, 1034,
-	896, 1151, 1034, 896, 1151, 48, 57, 9,
-	32, 40, 41, 1034, 1083, 48, 57, 9,
+	127, 9, 32, 40, 41, 1034, 1083, 9,
 	32, 40, 41, 1034, 1083, -128, 8, 11,
-	58, 60, 127, 9, 32, 40, 41, 1034,
-	1083, 9, 32, 40, 41, 1034, 1083, -128,
-	8, 11, 58, 60, 127, 32, 59, 9,
-	10, 40, 41, 1034, 896, 1151, 1034, 896,
-	1151, 9, 32, 36, 40, 41, 42, 92,
-	95, 778, 827, 1034, 1083, 45, 57, 64,
-	90, 97, 122, 9, 32, 36, 40, 41,
-	42, 58, 92, 95, 1802, 1851, 2058, 2107,
-	2314, 2363, 2570, 2619, -128, 8, 11, 44,
-	45, 57, 60, 63, 64, 90, 91, 96,
-	97, 122, 123, 127, 9, 32, 36, 40,
-	41, 42, 65, 67, 68, 69, 72, 73,
-	75, 76, 77, 78, 80, 82, 83, 84,
-	85, 92, 95, 97, 99, 100, 101, 104,
-	105, 107, 108, 109, 110, 112, 114, 115,
-	116, 117, 778, 827, 1034, 1083, 45, 57,
-	64, 90, 98, 122, 9, 32, 36, 40,
-	41, 42, 65, 67, 68, 69, 72, 73,
-	75, 76, 77, 78, 80, 82, 83, 84,
-	85, 92, 95, 97, 99, 100, 101, 104,
-	105, 107, 108, 109, 110, 112, 114, 115,
-	116, 117, 778, 827, 1034, 1083, 45, 47,
-	48, 57, 64, 90, 98, 122, 9, 32,
-	36, 40, 41, 42, 92, 95, 778, 827,
-	1034, 1083, 45, 57, 64, 90, 97, 122,
-	9, 32, 36, 40, 41, 42, 65, 67,
-	68, 69, 72, 73, 75, 76, 77, 78,
-	80, 82, 83, 84, 85, 92, 95, 97,
-	99, 100, 101, 104, 105, 107, 108, 109,
-	110, 112, 114, 115, 116, 117, 778, 827,
-	1034, 1083, 45, 47, 48, 57, 64, 90,
+	58, 60, 127, 32, 59, 9, 10, 40,
+	41, 1034, 896, 1151, 1034, 896, 1151, 9,
+	32, 36, 40, 41, 42, 92, 95, 778,
+	827, 1034, 1083, 45, 57, 64, 90, 97,
+	122, 9, 32, 36, 40, 41, 42, 58,
+	92, 95, 1802, 1851, 2058, 2107, 2314, 2363,
+	2570, 2619, -128, 8, 11, 44, 45, 57,
+	60, 63, 64, 90, 91, 96, 97, 122,
+	123, 127, 9, 32, 36, 40, 41, 42,
+	65, 67, 68, 69, 72, 73, 75, 76,
+	77, 78, 80, 82, 83, 84, 85, 92,
+	95, 97, 99, 100, 101, 104, 105, 107,
+	108, 109, 110, 112, 114, 115, 116, 117,
+	778, 827, 1034, 1083, 45, 57, 64, 90,
 	98, 122, 9, 32, 36, 40, 41, 42,
-	92, 95, 778, 827, 1034, 1083, 45, 57,
-	64, 90, 97, 122, 9, 32, 36, 40,
-	41, 42, 58, 92, 95, 1802, 1851, 2058,
-	2107, 2314, 2363, 2570, 2619, -128, 8, 11,
-	44, 45, 57, 60, 63, 64, 90, 91,
-	96, 97, 122, 123, 127, 9, 32, 36,
-	40, 41, 42, 58, 65, 67, 68, 69,
+	65, 67, 68, 69, 72, 73, 75, 76,
+	77, 78, 80, 82, 83, 84, 85, 92,
+	95, 97, 99, 100, 101, 104, 105, 107,
+	108, 109, 110, 112, 114, 115, 116, 117,
+	778, 827, 1034, 1083, 45, 47, 48, 57,
+	64, 90, 98, 122, 9, 32, 36, 40,
+	41, 42, 92, 95, 778, 827, 1034, 1083,
+	45, 57, 64, 90, 97, 122, 9, 32,
+	36, 40, 41, 42, 65, 67, 68, 69,
 	72, 73, 75, 76, 77, 78, 80, 82,
 	83, 84, 85, 92, 95, 97, 99, 100,
 	101, 104, 105, 107, 108, 109, 110, 112,
-	114, 115, 116, 117, 1802, 1851, 2058, 2107,
-	2314, 2363, 2570, 2619, -128, 8, 11, 44,
-	45, 47, 48, 57, 60, 63, 64, 90,
-	91, 96, 98, 122, 123, 127, 9, 32,
-	36, 40, 41, 42, 58, 65, 67, 68,
-	69, 72, 73, 75, 76, 77, 78, 80,
-	82, 83, 84, 85, 92, 95, 97, 99,
-	100, 101, 104, 105, 107, 108, 109, 110,
-	112, 114, 115, 116, 117, 1802, 1851, 2058,
-	2107, 2314, 2363, 2570, 2619, -128, 8, 11,
-	44, 45, 47, 48, 57, 60, 63, 64,
-	90, 91, 96, 98, 122, 123, 127, 32,
-	33, 59, 92, 9, 10, 35, 39, 40,
-	41, 42, 126, 9, 32, 40, 41, 42,
-	46, 92, 95, 1034, 1083, 45, 57, 65,
-	90, 97, 122, 9, 32, 40, 41, 43,
-	2058, 2107, 2314, 2363, 2570, 2619, 47, 57,
-	65, 90, 97, 122, 1034, 896, 1151, 9,
-	32, 40, 41, 65, 67, 68, 69, 72,
+	114, 115, 116, 117, 778, 827, 1034, 1083,
+	45, 47, 48, 57, 64, 90, 98, 122,
+	9, 32, 36, 40, 41, 42, 92, 95,
+	778, 827, 1034, 1083, 45, 57, 64, 90,
+	97, 122, 9, 32, 36, 40, 41, 42,
+	58, 92, 95, 1802, 1851, 2058, 2107, 2314,
+	2363, 2570, 2619, -128, 8, 11, 44, 45,
+	57, 60, 63, 64, 90, 91, 96, 97,
+	122, 123, 127, 9, 32, 36, 40, 41,
+	42, 58, 65, 67, 68, 69, 72, 73,
+	75, 76, 77, 78, 80, 82, 83, 84,
+	85, 92, 95, 97, 99, 100, 101, 104,
+	105, 107, 108, 109, 110, 112, 114, 115,
+	116, 117, 1802, 1851, 2058, 2107, 2314, 2363,
+	2570, 2619, -128, 8, 11, 44, 45, 47,
+	48, 57, 60, 63, 64, 90, 91, 96,
+	98, 122, 123, 127, 9, 32, 36, 40,
+	41, 42, 58, 65, 67, 68, 69, 72,
 	73, 75, 76, 77, 78, 80, 82, 83,
-	84, 85, 97, 99, 100, 101, 104, 105,
-	107, 108, 109, 110, 112, 114, 115, 116,
-	117, 2058, 2107, 2314, 2363, 2570, 2619, 1034,
-	896, 1151, 9, 32, 40, 41, 2058, 2107,
-	2314, 2363, 2570, 2619, 48, 57, 65, 70,
-	97, 102, 1034, 896, 1151, 9, 32, 40,
-	41, 1034, 1083, 48, 57, 65, 70, 97,
-	102, 9, 32, 40, 41, 2058, 2107, 2314,
-	2363, 2570, 2619, 48, 57, 65, 70, 97,
-	102, 1034, 896, 1151, 1034, 896, 1151, 9,
-	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
-	2619, -128, 8, 11, 58, 60, 127, 1034,
-	896, 1151, 9, 32, 40, 41, 2058, 2107,
-	2314, 2363, 2570, 2619, 1034, 896, 1151, 9,
+	84, 85, 92, 95, 97, 99, 100, 101,
+	104, 105, 107, 108, 109, 110, 112, 114,
+	115, 116, 117, 1802, 1851, 2058, 2107, 2314,
+	2363, 2570, 2619, -128, 8, 11, 44, 45,
+	47, 48, 57, 60, 63, 64, 90, 91,
+	96, 98, 122, 123, 127, 32, 33, 59,
+	92, 9, 10, 35, 39, 40, 41, 42,
+	126, 9, 32, 40, 41, 42, 46, 92,
+	95, 1034, 1083, 45, 57, 65, 90, 97,
+	122, 9, 32, 40, 41, 43, 2058, 2107,
+	2314, 2363, 2570, 2619, 47, 57, 65, 90,
+	97, 122, 1034, 896, 1151, 9, 32, 40,
+	41, 65, 67, 68, 69, 72, 73, 75,
+	76, 77, 78, 80, 82, 83, 84, 85,
+	97, 99, 100, 101, 104, 105, 107, 108,
+	109, 110, 112, 114, 115, 116, 117, 2058,
+	2107, 2314, 2363, 2570, 2619, 1034, 896, 1151,
+	9, 32, 40, 41, 2058, 2107, 2314, 2363,
+	2570, 2619, 48, 57, 65, 70, 97, 102,
+	1034, 896, 1151, 9, 32, 40, 41, 1034,
+	1083, 48, 57, 65, 70, 97, 102, 9,
 	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
-	2619, 48, 57, 1034, 896, 1151, 9, 32,
-	40, 41, 2058, 2107, 2314, 2363, 2570, 2619,
-	48, 57, 1034, 896, 1151, 9, 32, 40,
+	2619, 48, 57, 65, 70, 97, 102, 1034,
+	896, 1151, 1034, 896, 1151, 9, 32, 40,
+	41, 2058, 2107, 2314, 2363, 2570, 2619, -128,
+	8, 11, 58, 60, 127, 1034, 896, 1151,
+	9, 32, 40, 41, 2058, 2107, 2314, 2363,
+	2570, 2619, 1034, 896, 1151, 9, 32, 40,
 	41, 2058, 2107, 2314, 2363, 2570, 2619, 48,
-	57, 1034, 896, 1151, 9, 32, 33, 40,
-	41, 49, 50, 2058, 2107, 2314, 2363, 2570,
-	2619, 1034, 896, 1151, 9, 32, 40, 41,
+	57, 1034, 896, 1151, 9, 32, 40, 41,
 	2058, 2107, 2314, 2363, 2570, 2619, 48, 57,
-	65, 70, 97, 102, 1034, 896, 1151, 9,
-	32, 40, 41, 2058, 2107, 2314, 2363, 2570,
-	2619, 48, 57, 65, 70, 97, 102, 1034,
-	896, 1151, 4617, 4640, 4648, 4649, 13578, 13627,
-	13834, 13883, 14346, 14395, 14602, 14651, 14858, 14907,
-	5642, 5504, 5759, 3081, 3104, 3112, 3113, 3115,
-	4106, 4155, 3119, 3129, 3137, 3162, 3169, 3194,
-	4106, 3968, 4223, 3115, 6153, 6176, 6184, 6185,
-	6409, 6432, 6440, 6441, 6665, 6688, 6696, 6697,
-	9482, 9531, 9738, 9787, 10250, 10299, 10506, 10555,
-	10762, 10811, 11274, 11323, 11530, 11579, 11786, 11835,
-	12298, 12347, 12554, 12603, 12810, 12859, 3119, 3129,
-	3137, 3162, 3169, 3194, 7690, 8202, 8714, 7552,
-	7807, 8064, 8319, 8576, 8831, 9, 32, 40,
+	1034, 896, 1151, 9, 32, 40, 41, 2058,
+	2107, 2314, 2363, 2570, 2619, 48, 57, 1034,
+	896, 1151, 9, 32, 33, 40, 41, 49,
+	50, 2058, 2107, 2314, 2363, 2570, 2619, 1034,
+	896, 1151, 9, 32, 40, 41, 2058, 2107,
+	2314, 2363, 2570, 2619, 48, 57, 65, 70,
+	97, 102, 1034, 896, 1151, 9, 32, 40,
 	41, 2058, 2107, 2314, 2363, 2570, 2619, 48,
 	57, 65, 70, 97, 102, 1034, 896, 1151,
-	0
+	4617, 4640, 4648, 4649, 13578, 13627, 13834, 13883,
+	14346, 14395, 14602, 14651, 14858, 14907, 5642, 5504,
+	5759, 3081, 3104, 3112, 3113, 3115, 4106, 4155,
+	3119, 3129, 3137, 3162, 3169, 3194, 4106, 3968,
+	4223, 3115, 6153, 6176, 6184, 6185, 6409, 6432,
+	6440, 6441, 6665, 6688, 6696, 6697, 9482, 9531,
+	9738, 9787, 10250, 10299, 10506, 10555, 10762, 10811,
+	11274, 11323, 11530, 11579, 11786, 11835, 12298, 12347,
+	12554, 12603, 12810, 12859, 3119, 3129, 3137, 3162,
+	3169, 3194, 7690, 8202, 8714, 7552, 7807, 8064,
+	8319, 8576, 8831, 9, 32, 40, 41, 2058,
+	2107, 2314, 2363, 2570, 2619, 48, 57, 65,
+	70, 97, 102, 1034, 896, 1151, 0
 };
 
 static const char _zone_scanner_single_lengths[] = {
@@ -2649,94 +2655,95 @@ static const char _zone_scanner_single_lengths[] = {
 	8, 6, 0, 10, 1, 1, 6, 1,
 	10, 2, 4, 2, 2, 3, 2, 2,
 	2, 2, 1, 1, 2, 2, 2, 1,
-	2, 2, 4, 1, 2, 2, 2, 2,
+	2, 4, 4, 1, 2, 2, 2, 2,
 	2, 2, 2, 2, 2, 1, 1, 2,
 	2, 2, 1, 1, 1, 2, 1, 1,
 	2, 2, 2, 1, 1, 1, 2, 2,
+	1, 1, 1, 1, 2, 1, 1, 2,
 	2, 2, 2, 2, 2, 2, 2, 2,
-	2, 2, 2, 2, 2, 4, 2, 2,
-	2, 2, 2, 2, 2, 2, 4, 2,
-	1, 2, 2, 2, 3, 3, 2, 2,
-	2, 2, 1, 1, 2, 2, 2, 1,
-	2, 1, 1, 2, 1, 1, 2, 12,
-	2, 2, 2, 2, 2, 2, 2, 6,
 	2, 2, 2, 2, 2, 2, 4, 2,
+	2, 2, 2, 2, 2, 2, 2, 4,
+	2, 1, 2, 2, 2, 3, 3, 2,
+	2, 2, 2, 1, 1, 2, 2, 2,
+	1, 2, 1, 1, 2, 1, 1, 2,
+	12, 2, 2, 2, 2, 2, 2, 2,
+	6, 2, 2, 2, 2, 2, 2, 4,
 	2, 2, 2, 2, 2, 2, 2, 2,
-	2, 2, 2, 4, 2, 2, 2, 2,
+	2, 2, 2, 2, 4, 2, 2, 2,
 	2, 2, 2, 2, 2, 2, 2, 2,
-	1, 3, 3, 2, 3, 6, 9, 6,
-	6, 6, 6, 16, 6, 16, 6, 16,
-	6, 12, 2, 10, 2, 1, 6, 10,
-	6, 1, 6, 10, 6, 1, 6, 10,
-	6, 1, 1, 1, 2, 6, 6, 2,
-	1, 3, 6, 9, 2, 1, 0, 6,
-	9, 2, 1, 2, 10, 10, 1, 1,
-	3, 0, 6, 8, 6, 8, 7, 8,
-	6, 6, 6, 8, 6, 8, 7, 8,
-	6, 7, 0, 12, 10, 12, 10, 12,
-	10, 12, 10, 1, 11, 11, 1, 11,
-	11, 10, 1, 11, 11, 10, 1, 11,
-	11, 10, 1, 6, 1, 6, 6, 1,
-	1, 1, 6, 1, 6, 6, 1, 1,
-	0, 6, 6, 6, 6, 6, 9, 2,
+	2, 1, 3, 3, 2, 3, 6, 9,
+	6, 6, 6, 6, 16, 6, 16, 6,
+	16, 6, 12, 2, 10, 2, 1, 6,
+	10, 6, 1, 6, 10, 6, 1, 6,
+	10, 6, 1, 1, 1, 2, 6, 6,
+	2, 1, 3, 6, 9, 2, 1, 0,
+	6, 9, 2, 1, 2, 10, 10, 1,
+	1, 3, 0, 6, 8, 6, 8, 7,
+	8, 6, 6, 6, 8, 6, 8, 7,
+	8, 6, 7, 0, 12, 10, 12, 10,
+	12, 10, 12, 10, 1, 11, 11, 1,
+	11, 11, 10, 1, 11, 11, 10, 1,
+	11, 11, 10, 1, 6, 1, 6, 6,
+	1, 1, 1, 6, 1, 6, 6, 1,
+	1, 0, 6, 6, 6, 6, 6, 9,
+	2, 1, 1, 1, 0, 6, 6, 6,
+	6, 6, 6, 6, 6, 6, 9, 2,
+	1, 1, 1, 1, 1, 0, 6, 6,
+	6, 6, 6, 7, 2, 1, 1, 1,
+	13, 2, 1, 1, 1, 0, 10, 1,
 	1, 1, 1, 0, 6, 6, 6, 6,
-	6, 6, 6, 6, 6, 9, 2, 1,
-	1, 1, 1, 1, 0, 6, 6, 6,
-	6, 6, 7, 2, 1, 1, 1, 13,
-	2, 1, 1, 1, 0, 10, 1, 1,
-	1, 1, 0, 6, 6, 6, 6, 6,
-	6, 0, 10, 1, 1, 1, 1, 0,
-	6, 6, 6, 6, 0, 10, 1, 1,
-	1, 0, 6, 10, 6, 6, 6, 7,
-	34, 7, 2, 1, 14, 1, 35, 3,
+	6, 6, 0, 10, 1, 1, 1, 1,
+	0, 6, 6, 6, 6, 0, 10, 1,
+	1, 1, 0, 6, 10, 6, 6, 6,
+	7, 34, 7, 2, 1, 14, 1, 35,
+	3, 1, 1, 6, 6, 6, 7, 35,
 	1, 1, 6, 6, 6, 7, 35, 1,
-	1, 6, 6, 6, 7, 35, 1, 1,
-	6, 6, 6, 9, 34, 1, 1, 1,
-	30, 12, 6, 6, 6, 6, 6, 6,
-	6, 6, 6, 6, 6, 6, 9, 6,
-	7, 2, 1, 1, 1, 1, 1, 1,
-	1, 1, 2, 2, 6, 2, 2, 2,
-	6, 2, 6, 8, 2, 6, 4, 2,
-	2, 2, 2, 6, 6, 2, 2, 6,
-	2, 2, 2, 6, 6, 2, 2, 2,
-	6, 4, 2, 2, 6, 2, 2, 2,
-	6, 6, 2, 2, 2, 1, 6, 1,
-	6, 2, 2, 2, 2, 6, 2, 2,
-	2, 2, 2, 2, 2, 6, 4, 2,
-	6, 6, 6, 1, 6, 1, 6, 2,
-	6, 6, 4, 2, 2, 2, 6, 6,
-	6, 2, 2, 2, 6, 2, 6, 8,
-	2, 7, 8, 2, 2, 2, 2, 6,
-	2, 2, 6, 6, 6, 2, 2, 2,
-	6, 6, 8, 2, 6, 2, 6, 2,
+	1, 6, 6, 6, 9, 34, 1, 1,
+	1, 30, 12, 6, 6, 6, 6, 6,
+	6, 6, 6, 6, 6, 6, 6, 9,
+	6, 7, 2, 1, 1, 1, 1, 1,
+	1, 1, 1, 2, 2, 6, 2, 2,
+	2, 6, 2, 6, 8, 2, 6, 4,
+	2, 2, 2, 2, 6, 6, 2, 2,
 	6, 2, 2, 2, 6, 6, 2, 2,
-	6, 2, 6, 2, 2, 0, 6, 2,
-	2, 6, 3, 2, 2, 0, 6, 6,
-	6, 6, 6, 7, 2, 1, 1, 1,
-	1, 2, 0, 6, 6, 6, 6, 6,
-	7, 6, 6, 0, 1, 0, 1, 1,
-	0, 1, 2, 2, 1, 1, 1, 1,
-	1, 1, 0, 6, 1, 1, 1, 0,
-	6, 6, 6, 6, 6, 7, 2, 0,
-	2, 1, 1, 1, 0, 6, 6, 6,
-	6, 6, 6, 0, 10, 1, 1, 1,
-	1, 0, 6, 7, 3, 1, 0, 6,
-	6, 0, 0, 0, 1, 0, 0, 0,
-	0, 3, 1, 0, 0, 1, 0, 0,
-	3, 0, 0, 1, 0, 0, 3, 0,
-	6, 6, 6, 6, 2, 1, 1, 0,
-	6, 6, 6, 6, 2, 1, 1, 12,
-	17, 42, 42, 12, 42, 12, 17, 47,
-	47, 0, 0, 0, 4, 0, 0, 0,
-	10, 0, 11, 1, 0, 40, 1, 0,
-	10, 1, 6, 0, 10, 1, 1, 0,
-	0, 0, 0, 0, 0, 0, 0, 0,
-	10, 1, 0, 0, 10, 1, 10, 1,
-	10, 1, 10, 1, 0, 0, 0, 0,
-	13, 1, 0, 10, 1, 0, 10, 1,
-	0, 14, 1, 7, 1, 35, 3, 0,
-	0, 0, 0, 0, 0, 0, 10, 1,
-	0, 0, 0, 0, 0, 0
+	2, 6, 4, 2, 2, 6, 2, 2,
+	2, 6, 6, 2, 2, 2, 1, 6,
+	1, 6, 2, 2, 2, 2, 6, 2,
+	2, 2, 2, 2, 2, 2, 6, 4,
+	2, 6, 6, 6, 1, 6, 1, 6,
+	2, 6, 6, 4, 2, 2, 2, 6,
+	6, 6, 2, 2, 2, 6, 2, 6,
+	8, 2, 7, 8, 2, 2, 2, 2,
+	6, 2, 2, 6, 6, 6, 2, 2,
+	2, 6, 6, 8, 2, 6, 2, 6,
+	2, 6, 2, 2, 2, 6, 6, 2,
+	2, 6, 2, 6, 2, 2, 0, 6,
+	2, 2, 6, 3, 2, 2, 0, 6,
+	6, 6, 6, 6, 7, 2, 1, 1,
+	1, 1, 2, 0, 6, 6, 6, 6,
+	6, 7, 6, 6, 0, 1, 0, 1,
+	1, 0, 1, 2, 2, 1, 1, 1,
+	1, 1, 1, 0, 6, 1, 1, 1,
+	0, 6, 6, 6, 6, 6, 7, 2,
+	0, 2, 1, 1, 1, 0, 6, 6,
+	6, 6, 6, 6, 0, 10, 1, 1,
+	1, 1, 0, 6, 7, 3, 1, 0,
+	6, 6, 0, 0, 0, 1, 0, 0,
+	0, 0, 3, 1, 0, 0, 1, 0,
+	0, 3, 0, 0, 1, 0, 0, 3,
+	0, 6, 6, 6, 6, 2, 1, 1,
+	0, 6, 6, 6, 6, 2, 1, 1,
+	12, 17, 42, 42, 12, 42, 12, 17,
+	47, 47, 0, 0, 0, 4, 0, 0,
+	0, 10, 0, 11, 1, 0, 40, 1,
+	0, 10, 1, 6, 0, 10, 1, 1,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 10, 1, 0, 0, 10, 1, 10,
+	1, 10, 1, 10, 1, 0, 0, 0,
+	0, 13, 1, 0, 10, 1, 0, 10,
+	1, 0, 14, 1, 7, 1, 35, 3,
+	0, 0, 0, 0, 0, 0, 0, 10,
+	1, 0, 0, 0, 0, 0, 0
 };
 
 static const char _zone_scanner_range_lengths[] = {
@@ -2806,49 +2813,50 @@ static const char _zone_scanner_range_lengths[] = {
 	2, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 2, 0, 0,
 	0, 0, 0, 0, 0, 0, 2, 0,
-	0, 0, 0, 0, 0, 0, 2, 0,
+	0, 0, 0, 0, 2, 0, 0, 2,
+	0, 0, 0, 0, 0, 0, 0, 2,
 	0, 0, 0, 0, 0, 0, 0, 0,
-	2, 0, 0, 2, 0, 0, 0, 0,
-	0, 2, 0, 0, 0, 2, 0, 0,
+	0, 2, 0, 0, 2, 0, 0, 0,
+	0, 0, 2, 0, 0, 0, 2, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
-	2, 0, 0, 2, 0, 0, 2, 1,
-	3, 0, 0, 0, 0, 0, 2, 0,
-	0, 0, 0, 0, 0, 2, 0, 0,
-	2, 0, 0, 2, 0, 0, 0, 2,
-	0, 0, 2, 0, 0, 2, 0, 0,
-	2, 0, 0, 0, 2, 0, 0, 2,
-	1, 3, 3, 2, 3, 0, 3, 0,
-	1, 1, 1, 1, 1, 1, 1, 1,
-	1, 3, 3, 1, 3, 1, 1, 1,
-	1, 1, 1, 1, 1, 1, 1, 1,
-	1, 1, 1, 1, 2, 0, 3, 2,
-	1, 3, 0, 3, 2, 1, 1, 1,
-	3, 2, 1, 2, 0, 3, 1, 3,
-	5, 1, 1, 1, 1, 1, 1, 0,
-	0, 1, 1, 1, 1, 1, 1, 0,
+	0, 2, 0, 0, 2, 0, 0, 2,
+	1, 3, 0, 0, 0, 0, 0, 2,
+	0, 0, 0, 0, 0, 0, 2, 0,
+	0, 2, 0, 0, 2, 0, 0, 0,
+	2, 0, 0, 2, 0, 0, 2, 0,
+	0, 2, 0, 0, 0, 2, 0, 0,
+	2, 1, 3, 3, 2, 3, 0, 3,
 	0, 1, 1, 1, 1, 1, 1, 1,
-	1, 1, 0, 1, 1, 1, 1, 1,
-	1, 0, 1, 1, 1, 0, 1, 1,
-	1, 0, 1, 0, 1, 1, 1, 1,
-	1, 1, 0, 1, 1, 1, 1, 1,
-	1, 1, 1, 1, 1, 1, 3, 2,
+	1, 1, 3, 3, 1, 3, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 2, 0, 3,
+	2, 1, 3, 0, 3, 2, 1, 1,
+	1, 3, 2, 1, 2, 0, 3, 1,
+	3, 5, 1, 1, 1, 1, 1, 1,
+	0, 0, 1, 1, 1, 1, 1, 1,
+	0, 0, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 0, 1, 1, 1, 1,
+	1, 1, 0, 1, 1, 1, 0, 1,
+	1, 1, 0, 1, 0, 1, 1, 1,
+	1, 1, 1, 0, 1, 1, 1, 1,
 	1, 1, 1, 1, 1, 1, 1, 3,
-	0, 3, 0, 3, 0, 3, 2, 1,
-	1, 1, 1, 1, 3, 0, 1, 1,
-	3, 0, 3, 0, 1, 1, 1, 0,
-	0, 0, 1, 1, 1, 1, 1, 0,
-	3, 3, 1, 1, 3, 0, 1, 1,
-	3, 3, 3, 1, 1, 1, 1, 1,
-	1, 1, 1, 3, 3, 3, 1, 1,
-	1, 1, 1, 0, 0, 1, 1, 0,
-	0, 3, 0, 1, 0, 1, 3, 3,
-	1, 1, 0, 1, 1, 1, 1, 1,
-	1, 0, 1, 1, 3, 3, 1, 1,
-	0, 1, 1, 3, 0, 1, 1, 1,
-	0, 0, 3, 0, 1, 1, 1, 1,
-	1, 1, 1, 1, 1, 1, 3, 0,
-	3, 0, 1, 1, 1, 1, 1, 1,
-	1, 1, 0, 0, 0, 0, 0, 0,
+	2, 1, 1, 1, 1, 1, 1, 1,
+	3, 0, 3, 0, 3, 0, 3, 2,
+	1, 1, 1, 1, 1, 3, 0, 1,
+	1, 3, 0, 3, 0, 1, 1, 1,
+	0, 0, 0, 1, 1, 1, 1, 1,
+	0, 3, 3, 1, 1, 3, 0, 1,
+	1, 3, 3, 3, 1, 1, 1, 1,
+	1, 1, 1, 1, 3, 3, 3, 1,
+	1, 1, 1, 1, 0, 0, 1, 1,
+	0, 0, 3, 0, 1, 0, 1, 3,
+	3, 1, 1, 0, 1, 1, 1, 1,
+	1, 1, 0, 1, 1, 3, 3, 1,
+	1, 0, 1, 1, 3, 0, 1, 1,
+	1, 0, 0, 3, 0, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 3,
+	0, 3, 0, 1, 1, 1, 1, 1,
+	1, 1, 1, 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,
@@ -2863,33 +2871,33 @@ static const char _zone_scanner_range_lengths[] = {
 	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, 1, 1, 0,
-	0, 0, 3, 2, 2, 1, 1, 1,
-	1, 3, 0, 3, 0, 1, 1, 1,
-	3, 0, 1, 1, 1, 1, 1, 1,
-	3, 0, 3, 3, 3, 3, 3, 3,
-	3, 3, 5, 2, 0, 0, 0, 0,
-	0, 1, 3, 3, 1, 1, 1, 1,
-	1, 1, 1, 1, 1, 3, 2, 3,
-	5, 1, 1, 1, 1, 1, 1, 1,
-	1, 1, 3, 3, 3, 1, 1, 1,
-	1, 1, 1, 1, 3, 1, 1, 1,
-	3, 3, 3, 3, 0, 3, 3, 3,
-	3, 2, 1, 3, 3, 0, 3, 3,
-	2, 3, 3, 0, 3, 3, 2, 1,
-	1, 1, 1, 3, 2, 1, 1, 1,
-	1, 3, 0, 3, 2, 1, 1, 3,
-	8, 3, 4, 3, 4, 3, 8, 9,
-	9, 0, 0, 0, 4, 0, 0, 0,
-	3, 0, 3, 1, 0, 0, 1, 0,
-	3, 1, 3, 0, 3, 1, 1, 0,
-	0, 0, 0, 0, 0, 0, 0, 0,
-	3, 1, 0, 0, 0, 1, 1, 1,
-	1, 1, 1, 1, 0, 0, 0, 0,
-	0, 1, 0, 3, 1, 0, 3, 1,
-	0, 0, 1, 3, 1, 3, 3, 0,
-	0, 0, 0, 0, 0, 0, 3, 1,
-	0, 0, 0, 0, 0, 0
+	0, 0, 0, 0, 0, 0, 1, 1,
+	0, 0, 0, 3, 2, 2, 1, 1,
+	1, 1, 3, 0, 3, 0, 1, 1,
+	1, 3, 0, 1, 1, 1, 1, 1,
+	1, 3, 0, 3, 3, 3, 3, 3,
+	3, 3, 3, 5, 2, 0, 0, 0,
+	0, 0, 1, 3, 3, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 3, 2,
+	3, 5, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 3, 3, 3, 1, 1,
+	1, 1, 1, 1, 1, 3, 1, 1,
+	1, 3, 3, 3, 3, 0, 3, 3,
+	3, 3, 2, 1, 3, 3, 0, 3,
+	3, 2, 3, 3, 0, 3, 3, 2,
+	1, 1, 1, 1, 3, 2, 1, 1,
+	1, 1, 3, 0, 3, 2, 1, 1,
+	3, 8, 3, 4, 3, 4, 3, 8,
+	9, 9, 0, 0, 0, 4, 0, 0,
+	0, 3, 0, 3, 1, 0, 0, 1,
+	0, 3, 1, 3, 0, 3, 1, 1,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 3, 1, 0, 0, 0, 1, 1,
+	1, 1, 1, 1, 1, 0, 0, 0,
+	0, 0, 1, 0, 3, 1, 0, 3,
+	1, 0, 0, 1, 3, 1, 3, 3,
+	0, 0, 0, 0, 0, 0, 0, 3,
+	1, 0, 0, 0, 0, 0, 0
 };
 
 static const short _zone_scanner_index_offsets[] = {
@@ -2955,94 +2963,95 @@ static const short _zone_scanner_index_offsets[] = {
 	3927, 3937, 3947, 3951, 3965, 3968, 3971, 3979,
 	3982, 3994, 4000, 4005, 4010, 4013, 4019, 4022,
 	4025, 4028, 4031, 4033, 4035, 4038, 4041, 4044,
-	4046, 4051, 4054, 4059, 4061, 4064, 4067, 4070,
-	4073, 4078, 4081, 4084, 4087, 4090, 4092, 4094,
-	4097, 4100, 4103, 4105, 4107, 4109, 4114, 4116,
-	4118, 4121, 4124, 4127, 4129, 4131, 4133, 4138,
-	4141, 4144, 4147, 4150, 4153, 4156, 4159, 4164,
-	4167, 4170, 4173, 4176, 4179, 4182, 4187, 4190,
-	4193, 4198, 4201, 4204, 4209, 4212, 4215, 4220,
-	4223, 4225, 4230, 4233, 4236, 4240, 4246, 4249,
-	4252, 4255, 4258, 4260, 4262, 4265, 4268, 4271,
-	4273, 4278, 4280, 4282, 4287, 4289, 4291, 4296,
-	4310, 4316, 4319, 4322, 4325, 4328, 4331, 4336,
-	4343, 4346, 4349, 4352, 4355, 4358, 4363, 4368,
-	4371, 4376, 4379, 4382, 4387, 4390, 4393, 4396,
-	4401, 4404, 4407, 4412, 4417, 4420, 4425, 4428,
-	4431, 4436, 4439, 4442, 4445, 4450, 4453, 4456,
-	4461, 4464, 4471, 4478, 4483, 4490, 4497, 4510,
-	4517, 4525, 4533, 4541, 4559, 4567, 4585, 4593,
-	4611, 4619, 4635, 4641, 4653, 4659, 4662, 4670,
-	4682, 4690, 4693, 4701, 4713, 4721, 4724, 4732,
-	4744, 4752, 4755, 4758, 4761, 4766, 4773, 4783,
-	4788, 4791, 4798, 4805, 4818, 4823, 4826, 4828,
-	4836, 4849, 4854, 4857, 4862, 4873, 4887, 4890,
-	4895, 4904, 4906, 4914, 4924, 4932, 4942, 4951,
-	4960, 4967, 4975, 4983, 4993, 5001, 5011, 5020,
-	5029, 5036, 5045, 5047, 5061, 5073, 5087, 5099,
-	5113, 5125, 5139, 5150, 5153, 5166, 5179, 5182,
-	5195, 5208, 5219, 5222, 5235, 5248, 5259, 5262,
-	5275, 5288, 5299, 5302, 5309, 5312, 5320, 5328,
-	5331, 5334, 5337, 5344, 5347, 5355, 5363, 5366,
-	5369, 5371, 5379, 5387, 5395, 5403, 5411, 5424,
-	5429, 5432, 5435, 5438, 5440, 5448, 5456, 5464,
-	5474, 5481, 5491, 5498, 5508, 5515, 5528, 5533,
-	5536, 5539, 5542, 5545, 5548, 5552, 5559, 5567,
-	5575, 5585, 5592, 5603, 5606, 5609, 5612, 5615,
-	5629, 5632, 5634, 5637, 5640, 5642, 5654, 5657,
-	5659, 5664, 5669, 5671, 5679, 5689, 5696, 5704,
-	5712, 5722, 5726, 5740, 5743, 5746, 5749, 5752,
-	5754, 5762, 5770, 5778, 5788, 5792, 5806, 5809,
-	5812, 5815, 5817, 5825, 5836, 5843, 5851, 5859,
-	5867, 5902, 5913, 5916, 5919, 5934, 5937, 5976,
-	5983, 5986, 5989, 5996, 6004, 6012, 6021, 6058,
-	6061, 6064, 6071, 6079, 6087, 6098, 6137, 6140,
-	6143, 6150, 6158, 6166, 6179, 6214, 6217, 6220,
-	6223, 6254, 6267, 6277, 6284, 6292, 6300, 6308,
-	6316, 6324, 6332, 6340, 6348, 6356, 6364, 6377,
-	6384, 6395, 6398, 6401, 6404, 6407, 6410, 6413,
-	6416, 6419, 6422, 6425, 6428, 6435, 6438, 6441,
-	6444, 6451, 6454, 6461, 6470, 6473, 6480, 6485,
-	6488, 6491, 6494, 6497, 6504, 6511, 6514, 6517,
-	6524, 6527, 6530, 6533, 6540, 6547, 6550, 6553,
-	6556, 6563, 6568, 6571, 6574, 6581, 6584, 6587,
-	6590, 6597, 6604, 6607, 6610, 6613, 6615, 6622,
-	6624, 6631, 6634, 6637, 6640, 6643, 6650, 6653,
-	6656, 6659, 6662, 6665, 6668, 6671, 6678, 6683,
-	6686, 6693, 6700, 6707, 6709, 6716, 6718, 6725,
-	6728, 6735, 6742, 6747, 6750, 6753, 6756, 6763,
-	6770, 6777, 6780, 6783, 6786, 6793, 6796, 6803,
-	6812, 6815, 6823, 6832, 6835, 6838, 6841, 6844,
-	6851, 6854, 6857, 6864, 6871, 6878, 6881, 6884,
-	6887, 6894, 6901, 6910, 6913, 6920, 6923, 6930,
-	6933, 6940, 6943, 6946, 6949, 6956, 6963, 6966,
-	6969, 6976, 6979, 6986, 6989, 6992, 6994, 7002,
-	7005, 7008, 7015, 7022, 7027, 7032, 7034, 7042,
-	7050, 7058, 7068, 7075, 7086, 7089, 7092, 7095,
-	7098, 7103, 7106, 7108, 7116, 7124, 7132, 7140,
-	7148, 7159, 7166, 7176, 7180, 7185, 7189, 7194,
-	7199, 7203, 7208, 7216, 7221, 7223, 7225, 7227,
-	7229, 7231, 7234, 7238, 7248, 7251, 7254, 7257,
-	7259, 7267, 7275, 7283, 7291, 7299, 7310, 7315,
-	7319, 7327, 7330, 7333, 7336, 7338, 7346, 7354,
-	7362, 7370, 7378, 7388, 7392, 7406, 7409, 7412,
-	7415, 7418, 7420, 7428, 7437, 7444, 7447, 7449,
-	7457, 7467, 7471, 7475, 7479, 7481, 7485, 7489,
-	7493, 7497, 7503, 7506, 7510, 7514, 7516, 7520,
-	7524, 7530, 7534, 7538, 7540, 7544, 7548, 7554,
-	7556, 7564, 7572, 7580, 7590, 7595, 7598, 7601,
-	7603, 7611, 7621, 7628, 7638, 7643, 7646, 7649,
-	7665, 7691, 7737, 7784, 7800, 7847, 7863, 7889,
-	7946, 8003, 8004, 8005, 8006, 8015, 8016, 8017,
-	8018, 8032, 8033, 8048, 8051, 8052, 8093, 8096,
-	8097, 8111, 8114, 8124, 8125, 8139, 8142, 8145,
-	8146, 8147, 8148, 8149, 8150, 8151, 8152, 8153,
-	8154, 8168, 8171, 8172, 8173, 8184, 8187, 8199,
-	8202, 8214, 8217, 8229, 8232, 8233, 8234, 8235,
-	8236, 8250, 8253, 8254, 8268, 8271, 8272, 8286,
-	8289, 8290, 8305, 8308, 8319, 8322, 8361, 8368,
-	8369, 8370, 8371, 8372, 8373, 8374, 8375, 8389,
-	8392, 8393, 8394, 8395, 8396, 8397
+	4046, 4051, 4056, 4061, 4063, 4066, 4069, 4072,
+	4075, 4080, 4083, 4086, 4089, 4092, 4094, 4096,
+	4099, 4102, 4105, 4107, 4109, 4111, 4116, 4118,
+	4120, 4123, 4126, 4129, 4131, 4133, 4135, 4140,
+	4143, 4145, 4147, 4149, 4151, 4156, 4158, 4160,
+	4165, 4168, 4171, 4174, 4177, 4180, 4183, 4186,
+	4191, 4194, 4197, 4200, 4203, 4206, 4209, 4214,
+	4217, 4220, 4225, 4228, 4231, 4236, 4239, 4242,
+	4247, 4250, 4252, 4257, 4260, 4263, 4267, 4273,
+	4276, 4279, 4282, 4285, 4287, 4289, 4292, 4295,
+	4298, 4300, 4305, 4307, 4309, 4314, 4316, 4318,
+	4323, 4337, 4343, 4346, 4349, 4352, 4355, 4358,
+	4363, 4370, 4373, 4376, 4379, 4382, 4385, 4390,
+	4395, 4398, 4403, 4406, 4409, 4414, 4417, 4420,
+	4423, 4428, 4431, 4434, 4439, 4444, 4447, 4452,
+	4455, 4458, 4463, 4466, 4469, 4472, 4477, 4480,
+	4483, 4488, 4491, 4498, 4505, 4510, 4517, 4524,
+	4537, 4544, 4552, 4560, 4568, 4586, 4594, 4612,
+	4620, 4638, 4646, 4662, 4668, 4680, 4686, 4689,
+	4697, 4709, 4717, 4720, 4728, 4740, 4748, 4751,
+	4759, 4771, 4779, 4782, 4785, 4788, 4793, 4800,
+	4810, 4815, 4818, 4825, 4832, 4845, 4850, 4853,
+	4855, 4863, 4876, 4881, 4884, 4889, 4900, 4914,
+	4917, 4922, 4931, 4933, 4941, 4951, 4959, 4969,
+	4978, 4987, 4994, 5002, 5010, 5020, 5028, 5038,
+	5047, 5056, 5063, 5072, 5074, 5088, 5100, 5114,
+	5126, 5140, 5152, 5166, 5177, 5180, 5193, 5206,
+	5209, 5222, 5235, 5246, 5249, 5262, 5275, 5286,
+	5289, 5302, 5315, 5326, 5329, 5336, 5339, 5347,
+	5355, 5358, 5361, 5364, 5371, 5374, 5382, 5390,
+	5393, 5396, 5398, 5406, 5414, 5422, 5430, 5438,
+	5451, 5456, 5459, 5462, 5465, 5467, 5475, 5483,
+	5491, 5501, 5508, 5518, 5525, 5535, 5542, 5555,
+	5560, 5563, 5566, 5569, 5572, 5575, 5579, 5586,
+	5594, 5602, 5612, 5619, 5630, 5633, 5636, 5639,
+	5642, 5656, 5659, 5661, 5664, 5667, 5669, 5681,
+	5684, 5686, 5691, 5696, 5698, 5706, 5716, 5723,
+	5731, 5739, 5749, 5753, 5767, 5770, 5773, 5776,
+	5779, 5781, 5789, 5797, 5805, 5815, 5819, 5833,
+	5836, 5839, 5842, 5844, 5852, 5863, 5870, 5878,
+	5886, 5894, 5929, 5940, 5943, 5946, 5961, 5964,
+	6003, 6010, 6013, 6016, 6023, 6031, 6039, 6048,
+	6085, 6088, 6091, 6098, 6106, 6114, 6125, 6164,
+	6167, 6170, 6177, 6185, 6193, 6206, 6241, 6244,
+	6247, 6250, 6281, 6294, 6304, 6311, 6319, 6327,
+	6335, 6343, 6351, 6359, 6367, 6375, 6383, 6391,
+	6404, 6411, 6422, 6425, 6428, 6431, 6434, 6437,
+	6440, 6443, 6446, 6449, 6452, 6455, 6462, 6465,
+	6468, 6471, 6478, 6481, 6488, 6497, 6500, 6507,
+	6512, 6515, 6518, 6521, 6524, 6531, 6538, 6541,
+	6544, 6551, 6554, 6557, 6560, 6567, 6574, 6577,
+	6580, 6583, 6590, 6595, 6598, 6601, 6608, 6611,
+	6614, 6617, 6624, 6631, 6634, 6637, 6640, 6642,
+	6649, 6651, 6658, 6661, 6664, 6667, 6670, 6677,
+	6680, 6683, 6686, 6689, 6692, 6695, 6698, 6705,
+	6710, 6713, 6720, 6727, 6734, 6736, 6743, 6745,
+	6752, 6755, 6762, 6769, 6774, 6777, 6780, 6783,
+	6790, 6797, 6804, 6807, 6810, 6813, 6820, 6823,
+	6830, 6839, 6842, 6850, 6859, 6862, 6865, 6868,
+	6871, 6878, 6881, 6884, 6891, 6898, 6905, 6908,
+	6911, 6914, 6921, 6928, 6937, 6940, 6947, 6950,
+	6957, 6960, 6967, 6970, 6973, 6976, 6983, 6990,
+	6993, 6996, 7003, 7006, 7013, 7016, 7019, 7021,
+	7029, 7032, 7035, 7042, 7049, 7054, 7059, 7061,
+	7069, 7077, 7085, 7095, 7102, 7113, 7116, 7119,
+	7122, 7125, 7130, 7133, 7135, 7143, 7151, 7159,
+	7167, 7175, 7186, 7193, 7203, 7207, 7212, 7216,
+	7221, 7226, 7230, 7235, 7243, 7248, 7250, 7252,
+	7254, 7256, 7258, 7261, 7265, 7275, 7278, 7281,
+	7284, 7286, 7294, 7302, 7310, 7318, 7326, 7337,
+	7342, 7346, 7354, 7357, 7360, 7363, 7365, 7373,
+	7381, 7389, 7397, 7405, 7415, 7419, 7433, 7436,
+	7439, 7442, 7445, 7447, 7455, 7464, 7471, 7474,
+	7476, 7484, 7494, 7498, 7502, 7506, 7508, 7512,
+	7516, 7520, 7524, 7530, 7533, 7537, 7541, 7543,
+	7547, 7551, 7557, 7561, 7565, 7567, 7571, 7575,
+	7581, 7583, 7591, 7599, 7607, 7617, 7622, 7625,
+	7628, 7630, 7638, 7648, 7655, 7665, 7670, 7673,
+	7676, 7692, 7718, 7764, 7811, 7827, 7874, 7890,
+	7916, 7973, 8030, 8031, 8032, 8033, 8042, 8043,
+	8044, 8045, 8059, 8060, 8075, 8078, 8079, 8120,
+	8123, 8124, 8138, 8141, 8151, 8152, 8166, 8169,
+	8172, 8173, 8174, 8175, 8176, 8177, 8178, 8179,
+	8180, 8181, 8195, 8198, 8199, 8200, 8211, 8214,
+	8226, 8229, 8241, 8244, 8256, 8259, 8260, 8261,
+	8262, 8263, 8277, 8280, 8281, 8295, 8298, 8299,
+	8313, 8316, 8317, 8332, 8335, 8346, 8349, 8388,
+	8395, 8396, 8397, 8398, 8399, 8400, 8401, 8402,
+	8416, 8419, 8420, 8421, 8422, 8423, 8424
 };
 
 static const short _zone_scanner_indicies[] = {
@@ -3552,556 +3561,560 @@ static const short _zone_scanner_indicies[] = {
 	1559, 1576, 1576, 1559, 1577, 1577, 1559, 1578,
 	1559, 1579, 1559, 1580, 1580, 1559, 1581, 1581,
 	1559, 1582, 1582, 1559, 1583, 1559, 1584, 1584,
-	1584, 1584, 1559, 1585, 1585, 1559, 1586, 1587,
-	1586, 1587, 1559, 1588, 1559, 1589, 1589, 1559,
-	1590, 1590, 1559, 1591, 1591, 1559, 1592, 1592,
-	1559, 1593, 1593, 1593, 1593, 1559, 1594, 1594,
-	1559, 1595, 1595, 1559, 1596, 1596, 1559, 1597,
-	1598, 1559, 1599, 1559, 1600, 1559, 1601, 1601,
-	1559, 1602, 1602, 1559, 1603, 1603, 1559, 1604,
-	1559, 1605, 1559, 1606, 1559, 1607, 1607, 1607,
-	1607, 1559, 1608, 1559, 1609, 1559, 1610, 1610,
-	1559, 1611, 1611, 1559, 1612, 1612, 1559, 1613,
-	1559, 1614, 1559, 1615, 1559, 1616, 1616, 1616,
-	1616, 1559, 1617, 1617, 1559, 1618, 1618, 1559,
-	1619, 1619, 1559, 1620, 1620, 1559, 1621, 1621,
-	1559, 1622, 1622, 1559, 1623, 1623, 1559, 1624,
-	1624, 1624, 1624, 1559, 1625, 1625, 1559, 1626,
-	1626, 1559, 1627, 1627, 1559, 1628, 1628, 1559,
-	1629, 1629, 1559, 1630, 1630, 1559, 1631, 1632,
-	1631, 1632, 1559, 1633, 1633, 1559, 1634, 1634,
-	1559, 1635, 1635, 1635, 1635, 1559, 1636, 1636,
-	1559, 1637, 1637, 1559, 1638, 1638, 1638, 1638,
-	1559, 1639, 1639, 1559, 1640, 1640, 1559, 1641,
-	1642, 1641, 1642, 1559, 1643, 1643, 1559, 1644,
-	1559, 1645, 1645, 1645, 1645, 1559, 1646, 1646,
-	1559, 1647, 1647, 1559, 1648, 1649, 1650, 1559,
-	1651, 1652, 1651, 1651, 1651, 1559, 1653, 1653,
-	1559, 1654, 1654, 1559, 1655, 1655, 1559, 1656,
-	1656, 1559, 1657, 1559, 1658, 1559, 1659, 1659,
-	1559, 1660, 1660, 1559, 1661, 1661, 1559, 1662,
-	1559, 1663, 1663, 1663, 1663, 1559, 1664, 1559,
-	1665, 1559, 1666, 1666, 1666, 1666, 1559, 1667,
-	1559, 1668, 1559, 1669, 1669, 1669, 1669, 1559,
-	1672, 1673, 1674, 1675, 1676, 1677, 1672, 1673,
-	1674, 1675, 1676, 1677, 1671, 1670, 1678, 1678,
-	1678, 1678, 1679, 1670, 1680, 1680, 1670, 1681,
-	1681, 1670, 1682, 1682, 1670, 1683, 1683, 1670,
-	1684, 1684, 1670, 1685, 1685, 1685, 1685, 1670,
-	1686, 1687, 1688, 1686, 1687, 1688, 1670, 1689,
-	1689, 1670, 1690, 1690, 1670, 1691, 1691, 1670,
-	1692, 1692, 1670, 1693, 1693, 1670, 1694, 1694,
-	1694, 1694, 1670, 1695, 1696, 1695, 1696, 1670,
-	1697, 1697, 1670, 1698, 1698, 1698, 1698, 1670,
-	1699, 1699, 1670, 1700, 1700, 1670, 1701, 1701,
-	1701, 1701, 1670, 1702, 1702, 1670, 1703, 1703,
-	1670, 1704, 1704, 1670, 1705, 1705, 1705, 1705,
-	1670, 1706, 1706, 1670, 1707, 1707, 1670, 1708,
-	1708, 1708, 1708, 1670, 1709, 1710, 1709, 1710,
-	1670, 1711, 1711, 1670, 1712, 1712, 1712, 1712,
-	1670, 1713, 1713, 1670, 1714, 1714, 1670, 1715,
-	1715, 1715, 1715, 1670, 1716, 1716, 1670, 1717,
-	1717, 1670, 1718, 1718, 1670, 1719, 1719, 1719,
-	1719, 1670, 1720, 1720, 1670, 1721, 1721, 1670,
-	1722, 1722, 1722, 1722, 1670, 1724, 1724, 1723,
-	1725, 1726, 1725, 1725, 1725, 1726, 1723, 1727,
-	1727, 1727, 1727, 1727, 1727, 71, 1728, 1728,
-	1728, 1728, 71, 1729, 1729, 1729, 1729, 1729,
-	1729, 71, 1730, 1730, 1731, 1732, 1733, 1734,
-	71, 1735, 1735, 1736, 1737, 1738, 1738, 1738,
-	1739, 1740, 1738, 1738, 1738, 71, 1741, 1741,
-	1742, 1743, 1744, 1745, 71, 1747, 1747, 1748,
-	1749, 1751, 1752, 1750, 1746, 1753, 1753, 1754,
-	1755, 1757, 1758, 1756, 1746, 1759, 1759, 1760,
-	1761, 1763, 1764, 1762, 1746, 1766, 1766, 1767,
-	1768, 1770, 1771, 1772, 1773, 1774, 1770, 1771,
-	1772, 1773, 1774, 1775, 1776, 1769, 1765, 1777,
-	1777, 1778, 1779, 1781, 1782, 1780, 1746, 1783,
-	1783, 1784, 1785, 1787, 1788, 1789, 1790, 1791,
-	1787, 1788, 1789, 1790, 1791, 1792, 1793, 1786,
-	1765, 1794, 1794, 1795, 1796, 1798, 1799, 1797,
-	1746, 1800, 1800, 1801, 1802, 1804, 1805, 1806,
-	1807, 1808, 1804, 1805, 1806, 1807, 1808, 1809,
-	1810, 1803, 1765, 1811, 1811, 1812, 1813, 1815,
-	1816, 1814, 1746, 1817, 1817, 1819, 1820, 1821,
-	1822, 1823, 1819, 1820, 1821, 1822, 1823, 1817,
-	1817, 1818, 1765, 1817, 1817, 1817, 1817, 1824,
-	1765, 1826, 1827, 1828, 1829, 1830, 1826, 1827,
-	1828, 1829, 1830, 1825, 1765, 1831, 1831, 1831,
-	1831, 1832, 1765, 1815, 1816, 71, 1800, 1800,
-	1801, 1802, 1809, 1810, 1833, 1765, 1835, 1836,
-	1837, 1838, 1839, 1835, 1836, 1837, 1838, 1839,
-	1834, 1765, 1840, 1840, 1841, 1842, 1844, 1845,
-	1843, 1765, 1798, 1799, 71, 1783, 1783, 1784,
-	1785, 1792, 1793, 1846, 1765, 1848, 1849, 1850,
-	1851, 1852, 1848, 1849, 1850, 1851, 1852, 1847,
-	1765, 1853, 1853, 1854, 1855, 1857, 1858, 1856,
-	1765, 1781, 1782, 71, 1766, 1766, 1767, 1768,
-	1775, 1776, 1859, 1765, 1861, 1862, 1863, 1864,
-	1865, 1861, 1862, 1863, 1864, 1865, 1860, 1765,
-	1866, 1866, 1867, 1868, 1870, 1871, 1869, 1765,
-	1763, 1764, 71, 1751, 1752, 71, 1739, 1740,
-	71, 71, 71, 71, 71, 1872, 1873, 1873,
-	1874, 1875, 1876, 1877, 71, 1879, 1879, 1880,
-	1881, 1882, 1883, 1878, 1878, 1878, 71, 1884,
-	1884, 1884, 1884, 71, 1882, 1883, 71, 1885,
-	1885, 1885, 1885, 1885, 1885, 71, 1886, 1886,
-	1887, 1888, 1889, 1890, 71, 1891, 1891, 1892,
-	1893, 1894, 1894, 1894, 1895, 1896, 1894, 1894,
-	1894, 71, 1897, 1897, 1897, 1897, 71, 1895,
-	1896, 71, 1898, 1746, 1899, 1899, 1900, 1901,
-	1903, 1904, 1902, 1746, 1905, 1905, 1906, 1907,
-	1908, 1908, 1908, 1909, 1910, 1908, 1908, 1908,
-	71, 1911, 1911, 1911, 1911, 71, 1909, 1910,
-	71, 1913, 1913, 1913, 1913, 1912, 1914, 1914,
-	1915, 1916, 1917, 1918, 1919, 1919, 1920, 1921,
-	1913, 1923, 1923, 1924, 1925, 1926, 1927, 1928,
-	1928, 1929, 1930, 1922, 1922, 1922, 1913, 1926,
-	1927, 1913, 1931, 1931, 1931, 1931, 1723, 1932,
-	1933, 1932, 1932, 1932, 1933, 1933, 1933, 1723,
-	1935, 1934, 1936, 1936, 1937, 1938, 1940, 1941,
-	1939, 1934, 1942, 1942, 1943, 1944, 1946, 1947,
-	1948, 1949, 1945, 1934, 1950, 1950, 1951, 1952,
-	1954, 1955, 1953, 1934, 1956, 1956, 1957, 1958,
-	1946, 1947, 1960, 1961, 1959, 1934, 1962, 1962,
-	1963, 1964, 1965, 1967, 1968, 1966, 1934, 1969,
-	1969, 1970, 1971, 1946, 1947, 1972, 1973, 1934,
-	1974, 1974, 1975, 1976, 1977, 1978, 1934, 1974,
-	1974, 1975, 1976, 1977, 1978, 1979, 1934, 1980,
-	1980, 1981, 1982, 1984, 1985, 1983, 1934, 1986,
-	1986, 1987, 1988, 1990, 1991, 1992, 1993, 1989,
-	1934, 1994, 1994, 1995, 1996, 1998, 1999, 1997,
-	1934, 2000, 2000, 2001, 2002, 1990, 1991, 2004,
-	2005, 2003, 1934, 2006, 2006, 2007, 2008, 2009,
-	2011, 2012, 2010, 1934, 2013, 2013, 2014, 2015,
-	1990, 1991, 2016, 2017, 1934, 2018, 2018, 2019,
-	2020, 2021, 2022, 1934, 2018, 2018, 2019, 2020,
-	2023, 2021, 2022, 2024, 1934, 2025, 1934, 2026,
-	2026, 2027, 2028, 2029, 2031, 2032, 2033, 2034,
-	2034, 2035, 2036, 2030, 1934, 2037, 2037, 2038,
-	2039, 2041, 2042, 2043, 2043, 2044, 2045, 2040,
-	1934, 2046, 2046, 2047, 2048, 2049, 2051, 2052,
-	2053, 2054, 2054, 2055, 2056, 2050, 1934, 2057,
-	2057, 2058, 2059, 2061, 2062, 2043, 2043, 2063,
-	2064, 2060, 1934, 2065, 2065, 2066, 2067, 2068,
-	2070, 2071, 2072, 2073, 2073, 2074, 2075, 2069,
-	1934, 2076, 2076, 2077, 2078, 2080, 2081, 2043,
-	2043, 2082, 2083, 2079, 1934, 2084, 2084, 2085,
-	2086, 2087, 2084, 2089, 2090, 2091, 2091, 2092,
-	2093, 2088, 1934, 2094, 2094, 2095, 2096, 2097,
-	2098, 2043, 2043, 2099, 2100, 1934, 2097, 2098,
-	1934, 2101, 2101, 2102, 2103, 2101, 2105, 2106,
-	2107, 2107, 2108, 2109, 2104, 1934, 2084, 2084,
-	2085, 2086, 2084, 2089, 2090, 2091, 2091, 2092,
-	2093, 2110, 1934, 2080, 2081, 1934, 2111, 2111,
-	2112, 2113, 2115, 2116, 2117, 2118, 2118, 2119,
-	2120, 2114, 1934, 2065, 2065, 2066, 2067, 2070,
-	2071, 2072, 2073, 2073, 2074, 2075, 2121, 1934,
-	2076, 2076, 2077, 2078, 2080, 2081, 2043, 2043,
-	2082, 2083, 1934, 2061, 2062, 1934, 2122, 2122,
-	2123, 2124, 2126, 2127, 2128, 2129, 2129, 2130,
-	2131, 2125, 1934, 2046, 2046, 2047, 2048, 2051,
-	2052, 2053, 2054, 2054, 2055, 2056, 2132, 1934,
-	2057, 2057, 2058, 2059, 2061, 2062, 2043, 2043,
-	2063, 2064, 1934, 2041, 2042, 1934, 2133, 2133,
-	2134, 2135, 2137, 2138, 2139, 2140, 2140, 2141,
-	2142, 2136, 1934, 2026, 2026, 2027, 2028, 2031,
-	2032, 2033, 2034, 2034, 2035, 2036, 2143, 1934,
-	2037, 2037, 2038, 2039, 2041, 2042, 2043, 2043,
-	2044, 2045, 1934, 2021, 2022, 1934, 2144, 2144,
-	2145, 2146, 2147, 2148, 1934, 2016, 2017, 1934,
-	2149, 2149, 2150, 2151, 2153, 2154, 2152, 1934,
-	2006, 2006, 2007, 2008, 2011, 2012, 2155, 1934,
-	2004, 2005, 1934, 1992, 1993, 1934, 1977, 1978,
-	1934, 2156, 2156, 2157, 2158, 2159, 2160, 1934,
-	1972, 1973, 1934, 2161, 2161, 2162, 2163, 2165,
-	2166, 2164, 1934, 1962, 1962, 1963, 1964, 1967,
-	1968, 2167, 1934, 1960, 1961, 1934, 1948, 1949,
-	1934, 2168, 1746, 2169, 2169, 2170, 2171, 2173,
-	2174, 2172, 1746, 2175, 2175, 2176, 2177, 2179,
-	2180, 2178, 1746, 2181, 2181, 2182, 2183, 2185,
-	2186, 2184, 1746, 2187, 2187, 2188, 2189, 2191,
-	2192, 2190, 1746, 2193, 2193, 2194, 2195, 2197,
-	2198, 2196, 1746, 2199, 2199, 2200, 2201, 2202,
-	2202, 2202, 2203, 2204, 2202, 2202, 2202, 71,
-	2205, 2205, 2205, 2205, 71, 2203, 2204, 71,
-	2191, 2192, 71, 2179, 2180, 71, 2206, 1746,
-	2207, 2207, 2208, 2209, 2211, 2212, 2210, 1746,
-	2213, 2213, 2214, 2215, 2217, 2218, 2216, 1746,
-	2219, 2219, 2220, 2221, 2223, 2224, 2222, 1746,
-	2226, 2226, 2227, 2228, 2229, 2230, 2225, 2225,
-	2225, 71, 2231, 2231, 2232, 2233, 2234, 2235,
-	71, 2237, 2237, 2238, 2239, 2240, 2241, 2236,
-	2236, 2236, 71, 2242, 2242, 2243, 2244, 2245,
-	2246, 71, 2248, 2248, 2249, 2250, 2251, 2252,
-	2247, 2247, 2247, 71, 2253, 2253, 2254, 2255,
-	2256, 2257, 71, 2258, 2258, 2259, 2260, 2261,
-	2261, 2261, 2262, 2263, 2261, 2261, 2261, 71,
-	2264, 2264, 2264, 2264, 71, 2262, 2263, 71,
-	2251, 2252, 71, 2240, 2241, 71, 2229, 2230,
-	71, 2217, 2218, 71, 2265, 2265, 2265, 71,
-	2266, 2266, 2267, 2268, 2269, 2270, 71, 2266,
-	2266, 2267, 2268, 2269, 2270, 2271, 1746, 2272,
-	2272, 2273, 2274, 2276, 2277, 2275, 1746, 2278,
-	2278, 2279, 2280, 2282, 2283, 2281, 2281, 2281,
-	71, 2284, 2284, 2285, 2286, 2287, 2288, 71,
-	2284, 2284, 2285, 2286, 2289, 2287, 2288, 2289,
-	2289, 2289, 71, 2290, 2290, 71, 2287, 2288,
-	71, 2282, 2283, 71, 2269, 2270, 71, 2292,
-	2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299,
-	2300, 2300, 2301, 2302, 2291, 2303, 2304, 2291,
-	2305, 2291, 2307, 2307, 2306, 2309, 2308, 2306,
-	2310, 2291, 2311, 2311, 2312, 2313, 2315, 2316,
-	2317, 2317, 2318, 2319, 2314, 2291, 2298, 2299,
-	71, 2320, 2291, 2321, 2321, 2321, 2321, 2306,
-	2323, 2322, 2322, 2322, 2306, 2324, 1746, 2325,
-	2325, 2326, 2327, 2329, 2330, 2328, 1746, 2331,
-	2331, 2332, 2333, 2335, 2336, 2334, 2334, 2334,
-	71, 2337, 2337, 2338, 2339, 2340, 2341, 71,
-	2337, 2337, 2338, 2339, 2340, 2341, 2342, 1746,
-	2343, 2343, 2344, 2345, 2347, 2348, 2346, 1746,
-	2350, 2350, 2351, 2352, 2354, 2355, 2353, 2353,
-	2353, 2349, 2356, 2356, 2356, 2349, 2357, 2357,
-	2358, 2359, 2360, 2361, 2362, 2362, 2363, 2364,
-	2353, 2353, 2353, 2349, 2360, 2361, 2349, 2354,
-	2355, 71, 2340, 2341, 71, 2335, 2336, 71,
-	2365, 1746, 2366, 2366, 2367, 2368, 2370, 2371,
-	2369, 1746, 2372, 2372, 2373, 2374, 2376, 2377,
-	2375, 1746, 2378, 2378, 2379, 2380, 2382, 2383,
-	2381, 1746, 2384, 2384, 2385, 2386, 2388, 2389,
-	2387, 2387, 2387, 2349, 2390, 2390, 2390, 2349,
-	2391, 2391, 2392, 2393, 2394, 2395, 2396, 2396,
-	2397, 2398, 2387, 2387, 2387, 2349, 2394, 2395,
-	2349, 2388, 2389, 71, 2376, 2377, 71, 2399,
-	1746, 2400, 2400, 2401, 2402, 2404, 2405, 2403,
-	1746, 2407, 2407, 2408, 2409, 2410, 2411, 2412,
-	2413, 2414, 2415, 2406, 2416, 2416, 2417, 2418,
-	2419, 2420, 2406, 2416, 2416, 2417, 2418, 2419,
-	2420, 2422, 2421, 2423, 2423, 2424, 2425, 2427,
-	2428, 2426, 2421, 2429, 2429, 2430, 2431, 2432,
-	2433, 2434, 2406, 2436, 2436, 2437, 2438, 2439,
-	2439, 2440, 2441, 2442, 2442, 2443, 2444, 2445,
-	2445, 2445, 2445, 2446, 2447, 2445, 2445, 2448,
-	2449, 2450, 2451, 2445, 2445, 2452, 2453, 2454,
-	2455, 2445, 2445, 2456, 2457, 2435, 2436, 2436,
-	2437, 2438, 2459, 2446, 2447, 2459, 2459, 2459,
-	2458, 2445, 2445, 2458, 2446, 2447, 2458, 2439,
-	2439, 2440, 2441, 2445, 2445, 2445, 2445, 2450,
-	2451, 2445, 2445, 2452, 2453, 2458, 2450, 2451,
-	2458, 2459, 2436, 2436, 2437, 2438, 2439, 2439,
-	2440, 2441, 2442, 2442, 2443, 2444, 2445, 2445,
-	2445, 2445, 2446, 2447, 2445, 2445, 2448, 2449,
-	2450, 2451, 2445, 2445, 2452, 2453, 2454, 2455,
-	2445, 2445, 2456, 2457, 2459, 2459, 2459, 2458,
-	2446, 2450, 2454, 2447, 2451, 2455, 2458, 2433,
-	2434, 2406, 2419, 2420, 2406, 2460, 2460, 2461,
-	2462, 2463, 2464, 2406, 2460, 2460, 2461, 2462,
-	2463, 2464, 2465, 2421, 2466, 2466, 2467, 2468,
-	2470, 2471, 2469, 2421, 2473, 2473, 2474, 2475,
-	2476, 2477, 2478, 2476, 2472, 2480, 2481, 2481,
-	2482, 2483, 2484, 2484, 2485, 2486, 2487, 2487,
-	2488, 2489, 2490, 2490, 2490, 2490, 2491, 2492,
-	2490, 2490, 2493, 2494, 2495, 2496, 2490, 2490,
-	2497, 2498, 2499, 2500, 2490, 2490, 2501, 2502,
-	2480, 2479, 2477, 2478, 2406, 2463, 2464, 2406,
-	2503, 2503, 2504, 2505, 2506, 2507, 2406, 2503,
-	2503, 2504, 2505, 2506, 2507, 2508, 2421, 2509,
-	2509, 2510, 2511, 2513, 2514, 2512, 2421, 2515,
-	2515, 2516, 2517, 2518, 2519, 2520, 2518, 2518,
-	2518, 2472, 2521, 2522, 2522, 2523, 2524, 2525,
-	2525, 2526, 2527, 2528, 2528, 2529, 2530, 2531,
-	2531, 2531, 2531, 2532, 2533, 2531, 2531, 2534,
-	2535, 2536, 2537, 2531, 2531, 2538, 2539, 2540,
-	2541, 2531, 2531, 2542, 2543, 2521, 2521, 2521,
-	2479, 2519, 2520, 2406, 2506, 2507, 2406, 2544,
-	2544, 2545, 2546, 2547, 2548, 2406, 2544, 2544,
-	2545, 2546, 2547, 2548, 2549, 2421, 2550, 2550,
-	2551, 2552, 2554, 2555, 2553, 2421, 2556, 2556,
-	2557, 2558, 2559, 2559, 2559, 2560, 2561, 2559,
-	2559, 2559, 2406, 2562, 2562, 2563, 2564, 2565,
-	2565, 2566, 2567, 2568, 2568, 2569, 2570, 2571,
-	2571, 2571, 2571, 2572, 2573, 2571, 2571, 2574,
-	2575, 2576, 2577, 2571, 2571, 2578, 2579, 2580,
-	2581, 2571, 2571, 2582, 2583, 2435, 2560, 2561,
-	2406, 2547, 2548, 2406, 2414, 2415, 71, 2585,
-	2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593,
-	2594, 2595, 2596, 2597, 2598, 2599, 2585, 2586,
-	2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594,
-	2595, 2596, 2597, 2598, 2599, 2584, 2600, 2600,
-	2601, 2602, 2603, 2604, 2605, 2603, 2604, 2605,
-	2606, 2607, 2584, 2608, 2608, 2609, 2610, 2612,
-	2613, 2611, 2611, 2611, 71, 2614, 2614, 2615,
-	2616, 2617, 2618, 71, 2614, 2614, 2615, 2616,
-	2617, 2618, 2619, 1746, 2620, 2620, 2621, 2622,
-	2624, 2625, 2623, 1746, 2626, 2626, 2627, 2628,
-	2630, 2631, 2629, 1746, 2632, 2632, 2633, 2634,
-	2636, 2637, 2635, 1746, 2639, 2639, 2640, 2641,
-	2643, 2644, 2642, 2638, 2645, 2645, 2646, 2647,
-	2649, 2650, 2648, 2638, 2651, 2651, 2652, 2653,
-	2655, 2656, 2654, 2638, 2657, 2657, 2658, 2659,
-	2661, 2662, 2660, 2638, 2663, 2663, 2664, 2665,
-	2667, 2668, 2666, 1746, 2669, 2669, 2670, 2671,
-	2673, 2674, 2672, 1746, 2675, 2675, 2676, 2677,
-	2678, 2678, 2678, 2679, 2680, 2678, 2678, 2678,
-	71, 2681, 2681, 2682, 2683, 2684, 2685, 71,
-	2686, 2686, 2687, 2688, 2689, 2690, 2691, 2689,
-	2689, 2689, 71, 2692, 2692, 71, 2690, 2691,
-	71, 2679, 2680, 71, 2667, 2668, 71, 2655,
-	2656, 71, 2643, 2644, 71, 2630, 2631, 71,
-	2617, 2618, 71, 2612, 2613, 71, 2693, 2693,
-	2584, 2694, 2694, 2584, 2695, 2695, 2696, 2697,
-	2698, 2699, 2584, 2700, 2700, 2584, 2701, 2701,
-	2584, 2702, 2702, 2584, 2703, 2703, 2704, 2705,
-	2706, 2707, 2584, 2708, 2708, 2584, 2709, 2709,
-	2710, 2711, 2712, 2713, 2584, 2714, 2715, 2716,
-	2717, 2714, 2715, 2716, 2717, 2584, 2718, 2718,
-	2584, 2719, 2719, 2720, 2721, 2722, 2723, 2584,
-	2724, 2725, 2724, 2725, 2584, 2726, 2726, 2584,
-	2727, 2727, 2584, 2728, 2728, 2584, 2729, 2729,
-	2584, 2730, 2730, 2731, 2732, 2733, 2734, 2584,
-	2735, 2735, 2736, 2737, 2738, 2739, 2584, 2740,
-	2740, 2584, 2741, 2741, 2584, 2742, 2742, 2743,
-	2744, 2745, 2746, 2584, 2747, 2747, 2584, 2748,
-	2748, 2584, 2749, 2749, 2584, 2750, 2750, 2751,
-	2752, 2753, 2754, 2584, 2755, 2756, 2757, 2755,
-	2756, 2757, 2584, 2758, 2758, 2584, 2759, 2759,
-	2584, 2760, 2760, 2584, 2761, 2761, 2762, 2763,
-	2764, 2765, 2584, 2766, 2767, 2766, 2767, 2584,
-	2768, 2768, 2584, 2769, 2769, 2584, 2770, 2770,
-	2771, 2772, 2773, 2774, 2584, 2775, 2775, 2584,
-	2776, 2776, 2584, 2777, 2777, 2584, 2778, 2778,
-	2779, 2780, 2781, 2782, 2584, 2783, 2783, 2784,
-	2785, 2786, 2787, 2584, 2788, 2788, 2584, 2789,
-	2789, 2584, 2790, 2791, 2584, 2792, 2584, 2793,
-	2793, 2794, 2795, 2796, 2797, 2584, 2798, 2584,
-	2799, 2799, 2800, 2801, 2802, 2803, 2584, 2804,
-	2804, 2584, 2805, 2805, 2584, 2806, 2806, 2584,
-	2807, 2807, 2584, 2808, 2808, 2809, 2810, 2811,
-	2812, 2584, 2813, 2813, 2584, 2814, 2814, 2584,
-	2815, 2815, 2584, 2816, 2816, 2584, 2817, 2817,
-	2584, 2818, 2818, 2584, 2819, 2819, 2584, 2820,
-	2820, 2821, 2822, 2823, 2824, 2584, 2825, 2826,
-	2825, 2826, 2584, 2827, 2827, 2584, 2828, 2828,
-	2829, 2830, 2831, 2832, 2584, 2833, 2833, 2834,
-	2835, 2836, 2837, 2584, 2838, 2839, 2840, 2841,
-	2840, 2841, 2584, 2842, 2584, 2843, 2843, 2844,
-	2845, 2846, 2847, 2584, 2848, 2584, 2849, 2849,
-	2850, 2851, 2852, 2853, 2584, 2854, 2854, 2584,
-	2855, 2855, 2856, 2857, 2858, 2859, 2584, 2860,
-	2860, 2861, 2862, 2863, 2864, 2584, 2865, 2866,
-	2865, 2866, 2584, 2867, 2867, 2584, 2868, 2868,
-	2584, 2869, 2869, 2584, 2870, 2870, 2871, 2872,
-	2873, 2874, 2584, 2875, 2875, 2876, 2877, 2878,
-	2879, 2584, 2880, 2881, 2882, 2880, 2881, 2882,
-	2584, 2883, 2883, 2584, 2884, 2884, 2584, 2885,
-	2885, 2584, 2886, 2886, 2887, 2888, 2889, 2890,
-	2584, 2891, 2891, 2584, 2892, 2892, 2893, 2894,
-	2895, 2896, 2584, 2897, 2897, 2898, 2899, 2900,
-	2900, 2901, 2902, 2584, 2903, 2903, 2584, 2904,
-	2904, 2905, 2906, 2907, 2908, 2909, 2584, 2910,
-	2910, 2911, 2912, 2913, 2913, 2914, 2915, 2584,
-	2916, 2916, 2584, 2917, 2917, 2584, 2918, 2918,
-	2584, 2919, 2919, 2584, 2920, 2920, 2921, 2922,
-	2923, 2924, 2584, 2925, 2925, 2584, 2926, 2926,
-	2584, 2927, 2927, 2928, 2929, 2930, 2931, 2584,
-	2932, 2933, 2934, 2932, 2933, 2934, 2584, 2935,
-	2935, 2936, 2937, 2938, 2939, 2584, 2940, 2940,
-	2584, 2941, 2941, 2584, 2942, 2942, 2584, 2943,
-	2943, 2944, 2945, 2946, 2947, 2584, 2948, 2948,
-	2949, 2950, 2951, 2952, 2584, 2953, 2954, 2955,
-	2956, 2953, 2954, 2955, 2956, 2584, 2957, 2957,
-	2584, 2958, 2958, 2959, 2960, 2961, 2962, 2584,
-	2963, 2963, 2584, 2964, 2964, 2965, 2966, 2967,
-	2968, 2584, 2969, 2969, 2584, 2970, 2970, 2971,
-	2972, 2973, 2974, 2584, 2975, 2975, 2584, 2976,
-	2976, 2584, 2977, 2977, 2584, 2978, 2978, 2979,
-	2980, 2981, 2982, 2584, 2983, 2984, 2985, 2983,
-	2984, 2985, 2584, 2986, 2986, 2584, 2987, 2987,
-	2584, 2988, 2988, 2989, 2990, 2991, 2992, 2584,
-	2993, 2993, 2584, 2994, 2994, 2995, 2996, 2997,
-	2998, 2584, 2999, 2999, 2584, 3000, 3000, 2584,
-	3002, 3001, 3003, 3003, 3004, 3005, 3007, 3008,
-	3006, 3001, 3009, 3009, 2584, 3010, 3010, 2584,
-	3011, 3011, 3012, 3013, 3014, 3015, 2584, 3016,
-	3016, 3016, 3016, 3016, 3016, 71, 3017, 3017,
-	3017, 3017, 71, 3018, 3018, 3018, 3018, 71,
-	3019, 1746, 3020, 3020, 3021, 3022, 3024, 3025,
-	3023, 1746, 3026, 3026, 3027, 3028, 3030, 3031,
-	3029, 1746, 3032, 3032, 3033, 3034, 3036, 3037,
-	3035, 1746, 3038, 3038, 3039, 3040, 3042, 3043,
-	3041, 3041, 3041, 71, 3044, 3044, 3045, 3046,
-	3047, 3048, 71, 3044, 3044, 3045, 3046, 3049,
-	3047, 3048, 3049, 3049, 3049, 71, 3050, 3050,
-	71, 3047, 3048, 71, 3042, 3043, 71, 3030,
-	3031, 71, 3051, 3051, 3051, 3051, 71, 3052,
-	3052, 71, 3053, 1746, 3054, 3054, 3055, 3056,
-	3058, 3059, 3057, 1746, 3060, 3060, 3061, 3062,
-	3064, 3065, 3063, 1746, 3066, 3066, 3067, 3068,
-	3070, 3071, 3069, 1746, 3072, 3072, 3073, 3074,
-	3076, 3077, 3075, 1746, 3078, 3078, 3079, 3080,
-	3082, 3083, 3081, 1746, 3084, 3084, 3085, 3086,
-	3087, 3089, 3090, 3088, 3088, 3088, 2349, 3091,
-	3091, 3092, 3093, 3094, 3095, 2349, 3097, 3097,
-	3098, 3099, 3101, 3102, 3100, 3100, 3100, 3096,
-	3103, 3103, 3103, 3096, 3105, 3104, 3104, 3104,
-	3096, 3106, 3106, 3106, 3096, 3108, 3107, 3107,
-	3107, 3096, 3110, 3109, 3109, 3109, 3096, 3111,
-	3111, 3111, 3096, 3113, 3112, 3112, 3112, 3096,
-	3114, 3114, 3114, 3114, 3115, 3115, 3115, 3096,
-	3116, 3116, 3116, 3116, 71, 3117, 3096, 3113,
-	3096, 3110, 3096, 3118, 3096, 3108, 3096, 3101,
-	3102, 71, 3119, 3119, 3119, 2349, 3091, 3091,
-	3092, 3093, 3094, 3095, 3120, 3120, 3120, 2349,
-	3089, 3090, 71, 3076, 3077, 71, 3064, 3065,
-	71, 3121, 1746, 3122, 3122, 3123, 3124, 3126,
-	3127, 3125, 1746, 3128, 3128, 3129, 3130, 3132,
-	3133, 3131, 1746, 3134, 3134, 3135, 3136, 3138,
-	3139, 3137, 1746, 3140, 3140, 3141, 3142, 3144,
-	3145, 3143, 1746, 3146, 3146, 3147, 3148, 3150,
-	3151, 3149, 1746, 3152, 3152, 3153, 3154, 3155,
-	3157, 3158, 3156, 3156, 3156, 2349, 3159, 3159,
-	3159, 3159, 2349, 3160, 3160, 3160, 2349, 3159,
-	3159, 3159, 3159, 3161, 3161, 3161, 2349, 3157,
-	3158, 71, 3144, 3145, 71, 3132, 3133, 71,
-	3162, 1746, 3163, 3163, 3164, 3165, 3167, 3168,
-	3166, 1746, 3169, 3169, 3170, 3171, 3173, 3174,
-	3172, 1746, 3175, 3175, 3176, 3177, 3179, 3180,
-	3178, 1746, 3181, 3181, 3182, 3183, 3185, 3186,
-	3184, 1746, 3187, 3187, 3188, 3189, 3191, 3192,
-	3190, 1746, 3193, 3193, 3194, 3195, 3197, 3198,
-	3196, 3196, 3196, 2349, 3199, 3199, 3199, 2349,
-	3200, 3200, 3201, 3202, 3203, 3204, 3205, 3205,
-	3206, 3207, 3196, 3196, 3196, 2349, 3203, 3204,
-	2349, 3197, 3198, 71, 3185, 3186, 71, 3173,
-	3174, 71, 3208, 1746, 3209, 3209, 3210, 3211,
-	3213, 3214, 3212, 1746, 3215, 3215, 3216, 3217,
-	3218, 3219, 3220, 3218, 1723, 3221, 3222, 3221,
-	3221, 3221, 3222, 1723, 3219, 3220, 71, 3223,
-	1746, 3224, 3224, 3225, 3226, 3228, 3229, 3227,
-	1746, 3230, 3230, 3231, 3232, 3234, 3235, 3233,
-	3233, 3233, 2349, 3236, 3236, 3236, 2349, 3237,
-	3237, 3237, 2349, 3238, 3238, 3238, 2349, 3240,
-	3239, 3241, 3241, 3241, 2349, 3242, 3242, 3242,
-	2349, 3243, 3243, 3243, 2349, 3244, 3244, 3244,
-	2349, 3246, 3240, 3246, 3246, 3246, 3245, 3234,
-	3235, 71, 3247, 3247, 3247, 2349, 3248, 3248,
-	3248, 2349, 3250, 3249, 3251, 3251, 3251, 2349,
-	3252, 3252, 3252, 2349, 3253, 3250, 3253, 3253,
-	3253, 3249, 3254, 3254, 3254, 2349, 3255, 3255,
-	3255, 2349, 3256, 3249, 3257, 3257, 3257, 2349,
-	3258, 3258, 3258, 2349, 3259, 3256, 3259, 3259,
-	3259, 3249, 3260, 1746, 3261, 3261, 3262, 3263,
-	3265, 3266, 3264, 1746, 3267, 3267, 3268, 3269,
-	3271, 3272, 3270, 1746, 3273, 3273, 3274, 3275,
-	3277, 3278, 3276, 1746, 3280, 3280, 3281, 3282,
-	3283, 3284, 3279, 3279, 3279, 71, 3285, 3285,
-	3285, 3285, 71, 3283, 3284, 71, 3271, 3272,
-	71, 3286, 1746, 3287, 3287, 3288, 3289, 3291,
-	3292, 3290, 1746, 3294, 3294, 3295, 3296, 3297,
-	3298, 3293, 3293, 3293, 71, 3299, 3299, 3300,
-	3301, 3302, 3303, 71, 3305, 3305, 3306, 3307,
-	3308, 3309, 3304, 3304, 3304, 71, 3310, 3310,
-	3310, 3310, 71, 3308, 3309, 71, 3297, 3298,
-	71, 3312, 3312, 3313, 3314, 3315, 3316, 3316,
-	3316, 20, 21, 3317, 3318, 3316, 3316, 3316,
-	3311, 3319, 3319, 3320, 3321, 3322, 3323, 69,
-	3324, 3323, 20, 21, 3325, 3326, 118, 119,
-	3327, 3328, 69, 69, 3323, 69, 3323, 69,
-	3323, 69, 739, 3330, 3330, 3313, 3331, 3332,
-	3316, 3333, 3334, 3335, 3336, 3337, 3338, 3339,
-	3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347,
-	3316, 3316, 3333, 3334, 3335, 3336, 3337, 3338,
-	3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346,
-	3347, 20, 21, 3348, 3349, 3316, 3316, 3316,
-	3329, 3330, 3330, 3313, 3331, 3332, 3316, 3352,
-	3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360,
-	3361, 3362, 3363, 3364, 3365, 3366, 3316, 3316,
-	3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359,
-	3360, 3361, 3362, 3363, 3364, 3365, 3366, 20,
-	21, 3348, 3349, 3316, 3351, 3316, 3316, 3350,
-	3368, 3368, 3369, 3370, 3371, 3372, 3372, 3372,
-	3373, 3374, 3375, 3376, 3372, 3372, 3372, 3367,
-	3312, 3312, 3313, 3377, 3378, 3316, 3352, 3353,
-	3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361,
-	3362, 3363, 3364, 3365, 3366, 3316, 3316, 3352,
-	3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360,
-	3361, 3362, 3363, 3364, 3365, 3366, 20, 21,
-	3379, 3318, 3316, 3351, 3316, 3316, 3350, 3380,
-	3380, 3313, 3381, 3382, 3316, 3316, 3316, 83,
-	84, 3383, 3384, 3316, 3316, 3316, 739, 3385,
-	3385, 3320, 3386, 3387, 3323, 69, 3324, 3323,
-	83, 84, 3383, 3388, 92, 93, 3383, 3389,
-	69, 69, 3323, 69, 3323, 69, 3323, 69,
-	739, 3319, 3319, 3320, 3321, 3322, 3323, 69,
-	3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399,
-	3400, 3401, 3402, 3403, 3404, 3405, 3406, 3324,
-	3323, 3392, 3393, 3394, 3395, 3396, 3397, 3398,
-	3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406,
-	20, 21, 3325, 3326, 118, 119, 3327, 3328,
-	69, 69, 3323, 3391, 69, 3323, 69, 3323,
-	69, 3390, 3385, 3385, 3320, 3386, 3387, 3323,
-	69, 3392, 3393, 3394, 3395, 3396, 3397, 3398,
-	3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406,
-	3324, 3323, 3392, 3393, 3394, 3395, 3396, 3397,
-	3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405,
-	3406, 83, 84, 3407, 3388, 92, 93, 3407,
-	3389, 69, 69, 3323, 3391, 69, 3323, 69,
-	3323, 69, 3390, 661, 661, 661, 852, 849,
-	852, 851, 852, 849, 853, 849, 848, 661,
-	661, 661, 985, 985, 986, 987, 957, 958,
-	959, 957, 988, 989, 957, 957, 957, 963,
-	661, 996, 996, 997, 998, 991, 999, 1000,
-	1001, 1001, 1002, 1003, 991, 991, 991, 990,
-	999, 1000, 990, 661, 1013, 1013, 1014, 1015,
-	1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023,
-	1024, 1025, 1026, 1027, 1028, 1029, 1030, 1016,
-	1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024,
-	1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032,
-	1033, 1033, 1034, 1035, 1004, 1031, 1032, 1004,
-	661, 1517, 1517, 1518, 1519, 1520, 1521, 1522,
-	1522, 1523, 1524, 1513, 1513, 1513, 1509, 1520,
-	1521, 1509, 1539, 1539, 1540, 1541, 1543, 1544,
-	1542, 1542, 1542, 1509, 1495, 1546, 1546, 1547,
-	1548, 1549, 1550, 1551, 1551, 1552, 1553, 1542,
-	1542, 1542, 1509, 1549, 1550, 1509, 1543, 1544,
-	1495, 661, 661, 661, 661, 661, 661, 661,
-	661, 661, 1923, 1923, 1924, 1925, 1926, 1927,
-	1928, 1928, 1929, 1930, 1922, 1922, 1922, 1913,
-	1926, 1927, 1913, 661, 661, 2094, 2094, 2095,
-	2096, 2097, 2098, 2043, 2043, 2099, 2100, 1934,
-	2097, 2098, 1934, 2076, 2076, 2077, 2078, 2080,
-	2081, 2043, 2043, 2082, 2083, 2079, 1934, 2080,
-	2081, 1934, 2057, 2057, 2058, 2059, 2061, 2062,
-	2043, 2043, 2063, 2064, 2060, 1934, 2061, 2062,
-	1934, 2037, 2037, 2038, 2039, 2041, 2042, 2043,
-	2043, 2044, 2045, 2040, 1934, 2041, 2042, 1934,
-	661, 661, 661, 661, 2292, 2292, 2293, 2294,
-	2295, 2296, 2297, 2298, 2299, 2300, 2300, 2301,
-	2302, 2291, 2298, 2299, 71, 661, 2357, 2357,
-	2358, 2359, 2360, 2361, 2362, 2362, 2363, 2364,
-	2353, 2353, 2353, 2349, 2360, 2361, 2349, 661,
-	2391, 2391, 2392, 2393, 2394, 2395, 2396, 2396,
-	2397, 2398, 2387, 2387, 2387, 2349, 2394, 2395,
-	2349, 661, 2439, 2439, 2440, 2441, 2445, 2445,
-	2445, 2445, 2450, 2451, 2445, 2445, 2452, 2453,
-	2458, 2450, 2451, 2458, 2436, 2436, 2437, 2438,
-	2459, 2446, 2447, 2459, 2459, 2459, 2458, 2446,
-	2447, 2458, 2459, 2436, 2436, 2437, 2438, 2439,
-	2439, 2440, 2441, 2442, 2442, 2443, 2444, 2445,
-	2445, 2445, 2445, 2446, 2447, 2445, 2445, 2448,
-	2449, 2450, 2451, 2445, 2445, 2452, 2453, 2454,
-	2455, 2445, 2445, 2456, 2457, 2459, 2459, 2459,
-	2458, 2446, 2450, 2454, 2447, 2451, 2455, 2458,
-	661, 661, 661, 661, 661, 661, 661, 3200,
-	3200, 3201, 3202, 3203, 3204, 3205, 3205, 3206,
-	3207, 3196, 3196, 3196, 2349, 3203, 3204, 2349,
-	661, 661, 661, 661, 661, 661, 0
+	1584, 1584, 1559, 1585, 1586, 1585, 1586, 1559,
+	1587, 1588, 1587, 1588, 1559, 1589, 1559, 1590,
+	1590, 1559, 1591, 1591, 1559, 1592, 1592, 1559,
+	1593, 1593, 1559, 1594, 1594, 1594, 1594, 1559,
+	1595, 1595, 1559, 1596, 1596, 1559, 1597, 1597,
+	1559, 1598, 1599, 1559, 1600, 1559, 1601, 1559,
+	1602, 1602, 1559, 1603, 1603, 1559, 1604, 1604,
+	1559, 1605, 1559, 1606, 1559, 1607, 1559, 1608,
+	1608, 1608, 1608, 1559, 1609, 1559, 1610, 1559,
+	1611, 1611, 1559, 1612, 1612, 1559, 1613, 1613,
+	1559, 1614, 1559, 1615, 1559, 1616, 1559, 1617,
+	1617, 1617, 1617, 1559, 1618, 1619, 1559, 1620,
+	1559, 1621, 1559, 1622, 1559, 1623, 1559, 1624,
+	1624, 1624, 1624, 1559, 1625, 1559, 1626, 1559,
+	1627, 1627, 1627, 1627, 1559, 1628, 1628, 1559,
+	1629, 1629, 1559, 1630, 1630, 1559, 1631, 1631,
+	1559, 1632, 1632, 1559, 1633, 1633, 1559, 1634,
+	1634, 1559, 1635, 1635, 1635, 1635, 1559, 1636,
+	1636, 1559, 1637, 1637, 1559, 1638, 1638, 1559,
+	1639, 1639, 1559, 1640, 1640, 1559, 1641, 1641,
+	1559, 1642, 1643, 1642, 1643, 1559, 1644, 1644,
+	1559, 1645, 1645, 1559, 1646, 1646, 1646, 1646,
+	1559, 1647, 1647, 1559, 1648, 1648, 1559, 1649,
+	1649, 1649, 1649, 1559, 1650, 1650, 1559, 1651,
+	1651, 1559, 1652, 1653, 1652, 1653, 1559, 1654,
+	1654, 1559, 1655, 1559, 1656, 1656, 1656, 1656,
+	1559, 1657, 1657, 1559, 1658, 1658, 1559, 1659,
+	1660, 1661, 1559, 1662, 1663, 1662, 1662, 1662,
+	1559, 1664, 1664, 1559, 1665, 1665, 1559, 1666,
+	1666, 1559, 1667, 1667, 1559, 1668, 1559, 1669,
+	1559, 1670, 1670, 1559, 1671, 1671, 1559, 1672,
+	1672, 1559, 1673, 1559, 1674, 1674, 1674, 1674,
+	1559, 1675, 1559, 1676, 1559, 1677, 1677, 1677,
+	1677, 1559, 1678, 1559, 1679, 1559, 1680, 1680,
+	1680, 1680, 1559, 1683, 1684, 1685, 1686, 1687,
+	1688, 1683, 1684, 1685, 1686, 1687, 1688, 1682,
+	1681, 1689, 1689, 1689, 1689, 1690, 1681, 1691,
+	1691, 1681, 1692, 1692, 1681, 1693, 1693, 1681,
+	1694, 1694, 1681, 1695, 1695, 1681, 1696, 1696,
+	1696, 1696, 1681, 1697, 1698, 1699, 1697, 1698,
+	1699, 1681, 1700, 1700, 1681, 1701, 1701, 1681,
+	1702, 1702, 1681, 1703, 1703, 1681, 1704, 1704,
+	1681, 1705, 1705, 1705, 1705, 1681, 1706, 1707,
+	1706, 1707, 1681, 1708, 1708, 1681, 1709, 1709,
+	1709, 1709, 1681, 1710, 1710, 1681, 1711, 1711,
+	1681, 1712, 1712, 1712, 1712, 1681, 1713, 1713,
+	1681, 1714, 1714, 1681, 1715, 1715, 1681, 1716,
+	1716, 1716, 1716, 1681, 1717, 1717, 1681, 1718,
+	1718, 1681, 1719, 1719, 1719, 1719, 1681, 1720,
+	1721, 1720, 1721, 1681, 1722, 1722, 1681, 1723,
+	1723, 1723, 1723, 1681, 1724, 1724, 1681, 1725,
+	1725, 1681, 1726, 1726, 1726, 1726, 1681, 1727,
+	1727, 1681, 1728, 1728, 1681, 1729, 1729, 1681,
+	1730, 1730, 1730, 1730, 1681, 1731, 1731, 1681,
+	1732, 1732, 1681, 1733, 1733, 1733, 1733, 1681,
+	1735, 1735, 1734, 1736, 1737, 1736, 1736, 1736,
+	1737, 1734, 1738, 1738, 1738, 1738, 1738, 1738,
+	71, 1739, 1739, 1739, 1739, 71, 1740, 1740,
+	1740, 1740, 1740, 1740, 71, 1741, 1741, 1742,
+	1743, 1744, 1745, 71, 1746, 1746, 1747, 1748,
+	1749, 1749, 1749, 1750, 1751, 1749, 1749, 1749,
+	71, 1752, 1752, 1753, 1754, 1755, 1756, 71,
+	1758, 1758, 1759, 1760, 1762, 1763, 1761, 1757,
+	1764, 1764, 1765, 1766, 1768, 1769, 1767, 1757,
+	1770, 1770, 1771, 1772, 1774, 1775, 1773, 1757,
+	1777, 1777, 1778, 1779, 1781, 1782, 1783, 1784,
+	1785, 1781, 1782, 1783, 1784, 1785, 1786, 1787,
+	1780, 1776, 1788, 1788, 1789, 1790, 1792, 1793,
+	1791, 1757, 1794, 1794, 1795, 1796, 1798, 1799,
+	1800, 1801, 1802, 1798, 1799, 1800, 1801, 1802,
+	1803, 1804, 1797, 1776, 1805, 1805, 1806, 1807,
+	1809, 1810, 1808, 1757, 1811, 1811, 1812, 1813,
+	1815, 1816, 1817, 1818, 1819, 1815, 1816, 1817,
+	1818, 1819, 1820, 1821, 1814, 1776, 1822, 1822,
+	1823, 1824, 1826, 1827, 1825, 1757, 1828, 1828,
+	1830, 1831, 1832, 1833, 1834, 1830, 1831, 1832,
+	1833, 1834, 1828, 1828, 1829, 1776, 1828, 1828,
+	1828, 1828, 1835, 1776, 1837, 1838, 1839, 1840,
+	1841, 1837, 1838, 1839, 1840, 1841, 1836, 1776,
+	1842, 1842, 1842, 1842, 1843, 1776, 1826, 1827,
+	71, 1811, 1811, 1812, 1813, 1820, 1821, 1844,
+	1776, 1846, 1847, 1848, 1849, 1850, 1846, 1847,
+	1848, 1849, 1850, 1845, 1776, 1851, 1851, 1852,
+	1853, 1855, 1856, 1854, 1776, 1809, 1810, 71,
+	1794, 1794, 1795, 1796, 1803, 1804, 1857, 1776,
+	1859, 1860, 1861, 1862, 1863, 1859, 1860, 1861,
+	1862, 1863, 1858, 1776, 1864, 1864, 1865, 1866,
+	1868, 1869, 1867, 1776, 1792, 1793, 71, 1777,
+	1777, 1778, 1779, 1786, 1787, 1870, 1776, 1872,
+	1873, 1874, 1875, 1876, 1872, 1873, 1874, 1875,
+	1876, 1871, 1776, 1877, 1877, 1878, 1879, 1881,
+	1882, 1880, 1776, 1774, 1775, 71, 1762, 1763,
+	71, 1750, 1751, 71, 71, 71, 71, 71,
+	1883, 1884, 1884, 1885, 1886, 1887, 1888, 71,
+	1890, 1890, 1891, 1892, 1893, 1894, 1889, 1889,
+	1889, 71, 1895, 1895, 1895, 1895, 71, 1893,
+	1894, 71, 1896, 1896, 1896, 1896, 1896, 1896,
+	71, 1897, 1897, 1898, 1899, 1900, 1901, 71,
+	1902, 1902, 1903, 1904, 1905, 1905, 1905, 1906,
+	1907, 1905, 1905, 1905, 71, 1908, 1908, 1908,
+	1908, 71, 1906, 1907, 71, 1909, 1757, 1910,
+	1910, 1911, 1912, 1914, 1915, 1913, 1757, 1916,
+	1916, 1917, 1918, 1919, 1919, 1919, 1920, 1921,
+	1919, 1919, 1919, 71, 1922, 1922, 1922, 1922,
+	71, 1920, 1921, 71, 1924, 1924, 1924, 1924,
+	1923, 1925, 1925, 1926, 1927, 1928, 1929, 1930,
+	1930, 1931, 1932, 1924, 1934, 1934, 1935, 1936,
+	1937, 1938, 1939, 1939, 1940, 1941, 1933, 1933,
+	1933, 1924, 1937, 1938, 1924, 1942, 1942, 1942,
+	1942, 1734, 1943, 1944, 1943, 1943, 1943, 1944,
+	1944, 1944, 1734, 1946, 1945, 1947, 1947, 1948,
+	1949, 1951, 1952, 1950, 1945, 1953, 1953, 1954,
+	1955, 1957, 1958, 1959, 1960, 1956, 1945, 1961,
+	1961, 1962, 1963, 1965, 1966, 1964, 1945, 1967,
+	1967, 1968, 1969, 1957, 1958, 1971, 1972, 1970,
+	1945, 1973, 1973, 1974, 1975, 1976, 1978, 1979,
+	1977, 1945, 1980, 1980, 1981, 1982, 1957, 1958,
+	1983, 1984, 1945, 1985, 1985, 1986, 1987, 1988,
+	1989, 1945, 1985, 1985, 1986, 1987, 1988, 1989,
+	1990, 1945, 1991, 1991, 1992, 1993, 1995, 1996,
+	1994, 1945, 1997, 1997, 1998, 1999, 2001, 2002,
+	2003, 2004, 2000, 1945, 2005, 2005, 2006, 2007,
+	2009, 2010, 2008, 1945, 2011, 2011, 2012, 2013,
+	2001, 2002, 2015, 2016, 2014, 1945, 2017, 2017,
+	2018, 2019, 2020, 2022, 2023, 2021, 1945, 2024,
+	2024, 2025, 2026, 2001, 2002, 2027, 2028, 1945,
+	2029, 2029, 2030, 2031, 2032, 2033, 1945, 2029,
+	2029, 2030, 2031, 2034, 2032, 2033, 2035, 1945,
+	2036, 1945, 2037, 2037, 2038, 2039, 2040, 2042,
+	2043, 2044, 2045, 2045, 2046, 2047, 2041, 1945,
+	2048, 2048, 2049, 2050, 2052, 2053, 2054, 2054,
+	2055, 2056, 2051, 1945, 2057, 2057, 2058, 2059,
+	2060, 2062, 2063, 2064, 2065, 2065, 2066, 2067,
+	2061, 1945, 2068, 2068, 2069, 2070, 2072, 2073,
+	2054, 2054, 2074, 2075, 2071, 1945, 2076, 2076,
+	2077, 2078, 2079, 2081, 2082, 2083, 2084, 2084,
+	2085, 2086, 2080, 1945, 2087, 2087, 2088, 2089,
+	2091, 2092, 2054, 2054, 2093, 2094, 2090, 1945,
+	2095, 2095, 2096, 2097, 2098, 2095, 2100, 2101,
+	2102, 2102, 2103, 2104, 2099, 1945, 2105, 2105,
+	2106, 2107, 2108, 2109, 2054, 2054, 2110, 2111,
+	1945, 2108, 2109, 1945, 2112, 2112, 2113, 2114,
+	2112, 2116, 2117, 2118, 2118, 2119, 2120, 2115,
+	1945, 2095, 2095, 2096, 2097, 2095, 2100, 2101,
+	2102, 2102, 2103, 2104, 2121, 1945, 2091, 2092,
+	1945, 2122, 2122, 2123, 2124, 2126, 2127, 2128,
+	2129, 2129, 2130, 2131, 2125, 1945, 2076, 2076,
+	2077, 2078, 2081, 2082, 2083, 2084, 2084, 2085,
+	2086, 2132, 1945, 2087, 2087, 2088, 2089, 2091,
+	2092, 2054, 2054, 2093, 2094, 1945, 2072, 2073,
+	1945, 2133, 2133, 2134, 2135, 2137, 2138, 2139,
+	2140, 2140, 2141, 2142, 2136, 1945, 2057, 2057,
+	2058, 2059, 2062, 2063, 2064, 2065, 2065, 2066,
+	2067, 2143, 1945, 2068, 2068, 2069, 2070, 2072,
+	2073, 2054, 2054, 2074, 2075, 1945, 2052, 2053,
+	1945, 2144, 2144, 2145, 2146, 2148, 2149, 2150,
+	2151, 2151, 2152, 2153, 2147, 1945, 2037, 2037,
+	2038, 2039, 2042, 2043, 2044, 2045, 2045, 2046,
+	2047, 2154, 1945, 2048, 2048, 2049, 2050, 2052,
+	2053, 2054, 2054, 2055, 2056, 1945, 2032, 2033,
+	1945, 2155, 2155, 2156, 2157, 2158, 2159, 1945,
+	2027, 2028, 1945, 2160, 2160, 2161, 2162, 2164,
+	2165, 2163, 1945, 2017, 2017, 2018, 2019, 2022,
+	2023, 2166, 1945, 2015, 2016, 1945, 2003, 2004,
+	1945, 1988, 1989, 1945, 2167, 2167, 2168, 2169,
+	2170, 2171, 1945, 1983, 1984, 1945, 2172, 2172,
+	2173, 2174, 2176, 2177, 2175, 1945, 1973, 1973,
+	1974, 1975, 1978, 1979, 2178, 1945, 1971, 1972,
+	1945, 1959, 1960, 1945, 2179, 1757, 2180, 2180,
+	2181, 2182, 2184, 2185, 2183, 1757, 2186, 2186,
+	2187, 2188, 2190, 2191, 2189, 1757, 2192, 2192,
+	2193, 2194, 2196, 2197, 2195, 1757, 2198, 2198,
+	2199, 2200, 2202, 2203, 2201, 1757, 2204, 2204,
+	2205, 2206, 2208, 2209, 2207, 1757, 2210, 2210,
+	2211, 2212, 2213, 2213, 2213, 2214, 2215, 2213,
+	2213, 2213, 71, 2216, 2216, 2216, 2216, 71,
+	2214, 2215, 71, 2202, 2203, 71, 2190, 2191,
+	71, 2217, 1757, 2218, 2218, 2219, 2220, 2222,
+	2223, 2221, 1757, 2224, 2224, 2225, 2226, 2228,
+	2229, 2227, 1757, 2230, 2230, 2231, 2232, 2234,
+	2235, 2233, 1757, 2237, 2237, 2238, 2239, 2240,
+	2241, 2236, 2236, 2236, 71, 2242, 2242, 2243,
+	2244, 2245, 2246, 71, 2248, 2248, 2249, 2250,
+	2251, 2252, 2247, 2247, 2247, 71, 2253, 2253,
+	2254, 2255, 2256, 2257, 71, 2259, 2259, 2260,
+	2261, 2262, 2263, 2258, 2258, 2258, 71, 2264,
+	2264, 2265, 2266, 2267, 2268, 71, 2269, 2269,
+	2270, 2271, 2272, 2272, 2272, 2273, 2274, 2272,
+	2272, 2272, 71, 2275, 2275, 2275, 2275, 71,
+	2273, 2274, 71, 2262, 2263, 71, 2251, 2252,
+	71, 2240, 2241, 71, 2228, 2229, 71, 2276,
+	2276, 2276, 71, 2277, 2277, 2278, 2279, 2280,
+	2281, 71, 2277, 2277, 2278, 2279, 2280, 2281,
+	2282, 1757, 2283, 2283, 2284, 2285, 2287, 2288,
+	2286, 1757, 2289, 2289, 2290, 2291, 2293, 2294,
+	2292, 2292, 2292, 71, 2295, 2295, 2296, 2297,
+	2298, 2299, 71, 2295, 2295, 2296, 2297, 2300,
+	2298, 2299, 2300, 2300, 2300, 71, 2301, 2301,
+	71, 2298, 2299, 71, 2293, 2294, 71, 2280,
+	2281, 71, 2303, 2303, 2304, 2305, 2306, 2307,
+	2308, 2309, 2310, 2311, 2311, 2312, 2313, 2302,
+	2314, 2315, 2302, 2316, 2302, 2318, 2318, 2317,
+	2320, 2319, 2317, 2321, 2302, 2322, 2322, 2323,
+	2324, 2326, 2327, 2328, 2328, 2329, 2330, 2325,
+	2302, 2309, 2310, 71, 2331, 2302, 2332, 2332,
+	2332, 2332, 2317, 2334, 2333, 2333, 2333, 2317,
+	2335, 1757, 2336, 2336, 2337, 2338, 2340, 2341,
+	2339, 1757, 2342, 2342, 2343, 2344, 2346, 2347,
+	2345, 2345, 2345, 71, 2348, 2348, 2349, 2350,
+	2351, 2352, 71, 2348, 2348, 2349, 2350, 2351,
+	2352, 2353, 1757, 2354, 2354, 2355, 2356, 2358,
+	2359, 2357, 1757, 2361, 2361, 2362, 2363, 2365,
+	2366, 2364, 2364, 2364, 2360, 2367, 2367, 2367,
+	2360, 2368, 2368, 2369, 2370, 2371, 2372, 2373,
+	2373, 2374, 2375, 2364, 2364, 2364, 2360, 2371,
+	2372, 2360, 2365, 2366, 71, 2351, 2352, 71,
+	2346, 2347, 71, 2376, 1757, 2377, 2377, 2378,
+	2379, 2381, 2382, 2380, 1757, 2383, 2383, 2384,
+	2385, 2387, 2388, 2386, 1757, 2389, 2389, 2390,
+	2391, 2393, 2394, 2392, 1757, 2395, 2395, 2396,
+	2397, 2399, 2400, 2398, 2398, 2398, 2360, 2401,
+	2401, 2401, 2360, 2402, 2402, 2403, 2404, 2405,
+	2406, 2407, 2407, 2408, 2409, 2398, 2398, 2398,
+	2360, 2405, 2406, 2360, 2399, 2400, 71, 2387,
+	2388, 71, 2410, 1757, 2411, 2411, 2412, 2413,
+	2415, 2416, 2414, 1757, 2418, 2418, 2419, 2420,
+	2421, 2422, 2423, 2424, 2425, 2426, 2417, 2427,
+	2427, 2428, 2429, 2430, 2431, 2417, 2427, 2427,
+	2428, 2429, 2430, 2431, 2433, 2432, 2434, 2434,
+	2435, 2436, 2438, 2439, 2437, 2432, 2440, 2440,
+	2441, 2442, 2443, 2444, 2445, 2417, 2447, 2447,
+	2448, 2449, 2450, 2450, 2451, 2452, 2453, 2453,
+	2454, 2455, 2456, 2456, 2456, 2456, 2457, 2458,
+	2456, 2456, 2459, 2460, 2461, 2462, 2456, 2456,
+	2463, 2464, 2465, 2466, 2456, 2456, 2467, 2468,
+	2446, 2447, 2447, 2448, 2449, 2470, 2457, 2458,
+	2470, 2470, 2470, 2469, 2456, 2456, 2469, 2457,
+	2458, 2469, 2450, 2450, 2451, 2452, 2456, 2456,
+	2456, 2456, 2461, 2462, 2456, 2456, 2463, 2464,
+	2469, 2461, 2462, 2469, 2470, 2447, 2447, 2448,
+	2449, 2450, 2450, 2451, 2452, 2453, 2453, 2454,
+	2455, 2456, 2456, 2456, 2456, 2457, 2458, 2456,
+	2456, 2459, 2460, 2461, 2462, 2456, 2456, 2463,
+	2464, 2465, 2466, 2456, 2456, 2467, 2468, 2470,
+	2470, 2470, 2469, 2457, 2461, 2465, 2458, 2462,
+	2466, 2469, 2444, 2445, 2417, 2430, 2431, 2417,
+	2471, 2471, 2472, 2473, 2474, 2475, 2417, 2471,
+	2471, 2472, 2473, 2474, 2475, 2476, 2432, 2477,
+	2477, 2478, 2479, 2481, 2482, 2480, 2432, 2484,
+	2484, 2485, 2486, 2487, 2488, 2489, 2487, 2483,
+	2491, 2492, 2492, 2493, 2494, 2495, 2495, 2496,
+	2497, 2498, 2498, 2499, 2500, 2501, 2501, 2501,
+	2501, 2502, 2503, 2501, 2501, 2504, 2505, 2506,
+	2507, 2501, 2501, 2508, 2509, 2510, 2511, 2501,
+	2501, 2512, 2513, 2491, 2490, 2488, 2489, 2417,
+	2474, 2475, 2417, 2514, 2514, 2515, 2516, 2517,
+	2518, 2417, 2514, 2514, 2515, 2516, 2517, 2518,
+	2519, 2432, 2520, 2520, 2521, 2522, 2524, 2525,
+	2523, 2432, 2526, 2526, 2527, 2528, 2529, 2530,
+	2531, 2529, 2529, 2529, 2483, 2532, 2533, 2533,
+	2534, 2535, 2536, 2536, 2537, 2538, 2539, 2539,
+	2540, 2541, 2542, 2542, 2542, 2542, 2543, 2544,
+	2542, 2542, 2545, 2546, 2547, 2548, 2542, 2542,
+	2549, 2550, 2551, 2552, 2542, 2542, 2553, 2554,
+	2532, 2532, 2532, 2490, 2530, 2531, 2417, 2517,
+	2518, 2417, 2555, 2555, 2556, 2557, 2558, 2559,
+	2417, 2555, 2555, 2556, 2557, 2558, 2559, 2560,
+	2432, 2561, 2561, 2562, 2563, 2565, 2566, 2564,
+	2432, 2567, 2567, 2568, 2569, 2570, 2570, 2570,
+	2571, 2572, 2570, 2570, 2570, 2417, 2573, 2573,
+	2574, 2575, 2576, 2576, 2577, 2578, 2579, 2579,
+	2580, 2581, 2582, 2582, 2582, 2582, 2583, 2584,
+	2582, 2582, 2585, 2586, 2587, 2588, 2582, 2582,
+	2589, 2590, 2591, 2592, 2582, 2582, 2593, 2594,
+	2446, 2571, 2572, 2417, 2558, 2559, 2417, 2425,
+	2426, 71, 2596, 2597, 2598, 2599, 2600, 2601,
+	2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609,
+	2610, 2596, 2597, 2598, 2599, 2600, 2601, 2602,
+	2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610,
+	2595, 2611, 2611, 2612, 2613, 2614, 2615, 2616,
+	2614, 2615, 2616, 2617, 2618, 2595, 2619, 2619,
+	2620, 2621, 2623, 2624, 2622, 2622, 2622, 71,
+	2625, 2625, 2626, 2627, 2628, 2629, 71, 2625,
+	2625, 2626, 2627, 2628, 2629, 2630, 1757, 2631,
+	2631, 2632, 2633, 2635, 2636, 2634, 1757, 2637,
+	2637, 2638, 2639, 2641, 2642, 2640, 1757, 2643,
+	2643, 2644, 2645, 2647, 2648, 2646, 1757, 2650,
+	2650, 2651, 2652, 2654, 2655, 2653, 2649, 2656,
+	2656, 2657, 2658, 2660, 2661, 2659, 2649, 2662,
+	2662, 2663, 2664, 2666, 2667, 2665, 2649, 2668,
+	2668, 2669, 2670, 2672, 2673, 2671, 2649, 2674,
+	2674, 2675, 2676, 2678, 2679, 2677, 1757, 2680,
+	2680, 2681, 2682, 2684, 2685, 2683, 1757, 2686,
+	2686, 2687, 2688, 2689, 2689, 2689, 2690, 2691,
+	2689, 2689, 2689, 71, 2692, 2692, 2693, 2694,
+	2695, 2696, 71, 2697, 2697, 2698, 2699, 2700,
+	2701, 2702, 2700, 2700, 2700, 71, 2703, 2703,
+	71, 2701, 2702, 71, 2690, 2691, 71, 2678,
+	2679, 71, 2666, 2667, 71, 2654, 2655, 71,
+	2641, 2642, 71, 2628, 2629, 71, 2623, 2624,
+	71, 2704, 2704, 2595, 2705, 2705, 2595, 2706,
+	2706, 2707, 2708, 2709, 2710, 2595, 2711, 2711,
+	2595, 2712, 2712, 2595, 2713, 2713, 2595, 2714,
+	2714, 2715, 2716, 2717, 2718, 2595, 2719, 2719,
+	2595, 2720, 2720, 2721, 2722, 2723, 2724, 2595,
+	2725, 2726, 2727, 2728, 2725, 2726, 2727, 2728,
+	2595, 2729, 2729, 2595, 2730, 2730, 2731, 2732,
+	2733, 2734, 2595, 2735, 2736, 2735, 2736, 2595,
+	2737, 2737, 2595, 2738, 2738, 2595, 2739, 2739,
+	2595, 2740, 2740, 2595, 2741, 2741, 2742, 2743,
+	2744, 2745, 2595, 2746, 2746, 2747, 2748, 2749,
+	2750, 2595, 2751, 2751, 2595, 2752, 2752, 2595,
+	2753, 2753, 2754, 2755, 2756, 2757, 2595, 2758,
+	2758, 2595, 2759, 2759, 2595, 2760, 2760, 2595,
+	2761, 2761, 2762, 2763, 2764, 2765, 2595, 2766,
+	2767, 2768, 2766, 2767, 2768, 2595, 2769, 2769,
+	2595, 2770, 2770, 2595, 2771, 2771, 2595, 2772,
+	2772, 2773, 2774, 2775, 2776, 2595, 2777, 2778,
+	2777, 2778, 2595, 2779, 2779, 2595, 2780, 2780,
+	2595, 2781, 2781, 2782, 2783, 2784, 2785, 2595,
+	2786, 2786, 2595, 2787, 2787, 2595, 2788, 2788,
+	2595, 2789, 2789, 2790, 2791, 2792, 2793, 2595,
+	2794, 2794, 2795, 2796, 2797, 2798, 2595, 2799,
+	2799, 2595, 2800, 2800, 2595, 2801, 2802, 2595,
+	2803, 2595, 2804, 2804, 2805, 2806, 2807, 2808,
+	2595, 2809, 2595, 2810, 2810, 2811, 2812, 2813,
+	2814, 2595, 2815, 2815, 2595, 2816, 2816, 2595,
+	2817, 2817, 2595, 2818, 2818, 2595, 2819, 2819,
+	2820, 2821, 2822, 2823, 2595, 2824, 2824, 2595,
+	2825, 2825, 2595, 2826, 2826, 2595, 2827, 2827,
+	2595, 2828, 2828, 2595, 2829, 2829, 2595, 2830,
+	2830, 2595, 2831, 2831, 2832, 2833, 2834, 2835,
+	2595, 2836, 2837, 2836, 2837, 2595, 2838, 2838,
+	2595, 2839, 2839, 2840, 2841, 2842, 2843, 2595,
+	2844, 2844, 2845, 2846, 2847, 2848, 2595, 2849,
+	2850, 2851, 2852, 2851, 2852, 2595, 2853, 2595,
+	2854, 2854, 2855, 2856, 2857, 2858, 2595, 2859,
+	2595, 2860, 2860, 2861, 2862, 2863, 2864, 2595,
+	2865, 2865, 2595, 2866, 2866, 2867, 2868, 2869,
+	2870, 2595, 2871, 2871, 2872, 2873, 2874, 2875,
+	2595, 2876, 2877, 2876, 2877, 2595, 2878, 2878,
+	2595, 2879, 2879, 2595, 2880, 2880, 2595, 2881,
+	2881, 2882, 2883, 2884, 2885, 2595, 2886, 2886,
+	2887, 2888, 2889, 2890, 2595, 2891, 2892, 2893,
+	2891, 2892, 2893, 2595, 2894, 2894, 2595, 2895,
+	2895, 2595, 2896, 2896, 2595, 2897, 2897, 2898,
+	2899, 2900, 2901, 2595, 2902, 2902, 2595, 2903,
+	2903, 2904, 2905, 2906, 2907, 2595, 2908, 2908,
+	2909, 2910, 2911, 2911, 2912, 2913, 2595, 2914,
+	2914, 2595, 2915, 2915, 2916, 2917, 2918, 2919,
+	2920, 2595, 2921, 2921, 2922, 2923, 2924, 2924,
+	2925, 2926, 2595, 2927, 2927, 2595, 2928, 2928,
+	2595, 2929, 2929, 2595, 2930, 2930, 2595, 2931,
+	2931, 2932, 2933, 2934, 2935, 2595, 2936, 2936,
+	2595, 2937, 2937, 2595, 2938, 2938, 2939, 2940,
+	2941, 2942, 2595, 2943, 2944, 2945, 2943, 2944,
+	2945, 2595, 2946, 2946, 2947, 2948, 2949, 2950,
+	2595, 2951, 2951, 2595, 2952, 2952, 2595, 2953,
+	2953, 2595, 2954, 2954, 2955, 2956, 2957, 2958,
+	2595, 2959, 2959, 2960, 2961, 2962, 2963, 2595,
+	2964, 2965, 2966, 2967, 2964, 2965, 2966, 2967,
+	2595, 2968, 2968, 2595, 2969, 2969, 2970, 2971,
+	2972, 2973, 2595, 2974, 2974, 2595, 2975, 2975,
+	2976, 2977, 2978, 2979, 2595, 2980, 2980, 2595,
+	2981, 2981, 2982, 2983, 2984, 2985, 2595, 2986,
+	2986, 2595, 2987, 2987, 2595, 2988, 2988, 2595,
+	2989, 2989, 2990, 2991, 2992, 2993, 2595, 2994,
+	2995, 2996, 2994, 2995, 2996, 2595, 2997, 2997,
+	2595, 2998, 2998, 2595, 2999, 2999, 3000, 3001,
+	3002, 3003, 2595, 3004, 3004, 2595, 3005, 3005,
+	3006, 3007, 3008, 3009, 2595, 3010, 3010, 2595,
+	3011, 3011, 2595, 3013, 3012, 3014, 3014, 3015,
+	3016, 3018, 3019, 3017, 3012, 3020, 3020, 2595,
+	3021, 3021, 2595, 3022, 3022, 3023, 3024, 3025,
+	3026, 2595, 3027, 3027, 3027, 3027, 3027, 3027,
+	71, 3028, 3028, 3028, 3028, 71, 3029, 3029,
+	3029, 3029, 71, 3030, 1757, 3031, 3031, 3032,
+	3033, 3035, 3036, 3034, 1757, 3037, 3037, 3038,
+	3039, 3041, 3042, 3040, 1757, 3043, 3043, 3044,
+	3045, 3047, 3048, 3046, 1757, 3049, 3049, 3050,
+	3051, 3053, 3054, 3052, 3052, 3052, 71, 3055,
+	3055, 3056, 3057, 3058, 3059, 71, 3055, 3055,
+	3056, 3057, 3060, 3058, 3059, 3060, 3060, 3060,
+	71, 3061, 3061, 71, 3058, 3059, 71, 3053,
+	3054, 71, 3041, 3042, 71, 3062, 3062, 3062,
+	3062, 71, 3063, 3063, 71, 3064, 1757, 3065,
+	3065, 3066, 3067, 3069, 3070, 3068, 1757, 3071,
+	3071, 3072, 3073, 3075, 3076, 3074, 1757, 3077,
+	3077, 3078, 3079, 3081, 3082, 3080, 1757, 3083,
+	3083, 3084, 3085, 3087, 3088, 3086, 1757, 3089,
+	3089, 3090, 3091, 3093, 3094, 3092, 1757, 3095,
+	3095, 3096, 3097, 3098, 3100, 3101, 3099, 3099,
+	3099, 2360, 3102, 3102, 3103, 3104, 3105, 3106,
+	2360, 3108, 3108, 3109, 3110, 3112, 3113, 3111,
+	3111, 3111, 3107, 3114, 3114, 3114, 3107, 3116,
+	3115, 3115, 3115, 3107, 3117, 3117, 3117, 3107,
+	3119, 3118, 3118, 3118, 3107, 3121, 3120, 3120,
+	3120, 3107, 3122, 3122, 3122, 3107, 3124, 3123,
+	3123, 3123, 3107, 3125, 3125, 3125, 3125, 3126,
+	3126, 3126, 3107, 3127, 3127, 3127, 3127, 71,
+	3128, 3107, 3124, 3107, 3121, 3107, 3129, 3107,
+	3119, 3107, 3112, 3113, 71, 3130, 3130, 3130,
+	2360, 3102, 3102, 3103, 3104, 3105, 3106, 3131,
+	3131, 3131, 2360, 3100, 3101, 71, 3087, 3088,
+	71, 3075, 3076, 71, 3132, 1757, 3133, 3133,
+	3134, 3135, 3137, 3138, 3136, 1757, 3139, 3139,
+	3140, 3141, 3143, 3144, 3142, 1757, 3145, 3145,
+	3146, 3147, 3149, 3150, 3148, 1757, 3151, 3151,
+	3152, 3153, 3155, 3156, 3154, 1757, 3157, 3157,
+	3158, 3159, 3161, 3162, 3160, 1757, 3163, 3163,
+	3164, 3165, 3166, 3168, 3169, 3167, 3167, 3167,
+	2360, 3170, 3170, 3170, 3170, 2360, 3171, 3171,
+	3171, 2360, 3170, 3170, 3170, 3170, 3172, 3172,
+	3172, 2360, 3168, 3169, 71, 3155, 3156, 71,
+	3143, 3144, 71, 3173, 1757, 3174, 3174, 3175,
+	3176, 3178, 3179, 3177, 1757, 3180, 3180, 3181,
+	3182, 3184, 3185, 3183, 1757, 3186, 3186, 3187,
+	3188, 3190, 3191, 3189, 1757, 3192, 3192, 3193,
+	3194, 3196, 3197, 3195, 1757, 3198, 3198, 3199,
+	3200, 3202, 3203, 3201, 1757, 3204, 3204, 3205,
+	3206, 3208, 3209, 3207, 3207, 3207, 2360, 3210,
+	3210, 3210, 2360, 3211, 3211, 3212, 3213, 3214,
+	3215, 3216, 3216, 3217, 3218, 3207, 3207, 3207,
+	2360, 3214, 3215, 2360, 3208, 3209, 71, 3196,
+	3197, 71, 3184, 3185, 71, 3219, 1757, 3220,
+	3220, 3221, 3222, 3224, 3225, 3223, 1757, 3226,
+	3226, 3227, 3228, 3229, 3230, 3231, 3229, 1734,
+	3232, 3233, 3232, 3232, 3232, 3233, 1734, 3230,
+	3231, 71, 3234, 1757, 3235, 3235, 3236, 3237,
+	3239, 3240, 3238, 1757, 3241, 3241, 3242, 3243,
+	3245, 3246, 3244, 3244, 3244, 2360, 3247, 3247,
+	3247, 2360, 3248, 3248, 3248, 2360, 3249, 3249,
+	3249, 2360, 3251, 3250, 3252, 3252, 3252, 2360,
+	3253, 3253, 3253, 2360, 3254, 3254, 3254, 2360,
+	3255, 3255, 3255, 2360, 3257, 3251, 3257, 3257,
+	3257, 3256, 3245, 3246, 71, 3258, 3258, 3258,
+	2360, 3259, 3259, 3259, 2360, 3261, 3260, 3262,
+	3262, 3262, 2360, 3263, 3263, 3263, 2360, 3264,
+	3261, 3264, 3264, 3264, 3260, 3265, 3265, 3265,
+	2360, 3266, 3266, 3266, 2360, 3267, 3260, 3268,
+	3268, 3268, 2360, 3269, 3269, 3269, 2360, 3270,
+	3267, 3270, 3270, 3270, 3260, 3271, 1757, 3272,
+	3272, 3273, 3274, 3276, 3277, 3275, 1757, 3278,
+	3278, 3279, 3280, 3282, 3283, 3281, 1757, 3284,
+	3284, 3285, 3286, 3288, 3289, 3287, 1757, 3291,
+	3291, 3292, 3293, 3294, 3295, 3290, 3290, 3290,
+	71, 3296, 3296, 3296, 3296, 71, 3294, 3295,
+	71, 3282, 3283, 71, 3297, 1757, 3298, 3298,
+	3299, 3300, 3302, 3303, 3301, 1757, 3305, 3305,
+	3306, 3307, 3308, 3309, 3304, 3304, 3304, 71,
+	3310, 3310, 3311, 3312, 3313, 3314, 71, 3316,
+	3316, 3317, 3318, 3319, 3320, 3315, 3315, 3315,
+	71, 3321, 3321, 3321, 3321, 71, 3319, 3320,
+	71, 3308, 3309, 71, 3323, 3323, 3324, 3325,
+	3326, 3327, 3327, 3327, 20, 21, 3328, 3329,
+	3327, 3327, 3327, 3322, 3330, 3330, 3331, 3332,
+	3333, 3334, 69, 3335, 3334, 20, 21, 3336,
+	3337, 118, 119, 3338, 3339, 69, 69, 3334,
+	69, 3334, 69, 3334, 69, 739, 3341, 3341,
+	3324, 3342, 3343, 3327, 3344, 3345, 3346, 3347,
+	3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355,
+	3356, 3357, 3358, 3327, 3327, 3344, 3345, 3346,
+	3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354,
+	3355, 3356, 3357, 3358, 20, 21, 3359, 3360,
+	3327, 3327, 3327, 3340, 3341, 3341, 3324, 3342,
+	3343, 3327, 3363, 3364, 3365, 3366, 3367, 3368,
+	3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376,
+	3377, 3327, 3327, 3363, 3364, 3365, 3366, 3367,
+	3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375,
+	3376, 3377, 20, 21, 3359, 3360, 3327, 3362,
+	3327, 3327, 3361, 3379, 3379, 3380, 3381, 3382,
+	3383, 3383, 3383, 3384, 3385, 3386, 3387, 3383,
+	3383, 3383, 3378, 3323, 3323, 3324, 3388, 3389,
+	3327, 3363, 3364, 3365, 3366, 3367, 3368, 3369,
+	3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377,
+	3327, 3327, 3363, 3364, 3365, 3366, 3367, 3368,
+	3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376,
+	3377, 20, 21, 3390, 3329, 3327, 3362, 3327,
+	3327, 3361, 3391, 3391, 3324, 3392, 3393, 3327,
+	3327, 3327, 83, 84, 3394, 3395, 3327, 3327,
+	3327, 739, 3396, 3396, 3331, 3397, 3398, 3334,
+	69, 3335, 3334, 83, 84, 3394, 3399, 92,
+	93, 3394, 3400, 69, 69, 3334, 69, 3334,
+	69, 3334, 69, 739, 3330, 3330, 3331, 3332,
+	3333, 3334, 69, 3403, 3404, 3405, 3406, 3407,
+	3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415,
+	3416, 3417, 3335, 3334, 3403, 3404, 3405, 3406,
+	3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414,
+	3415, 3416, 3417, 20, 21, 3336, 3337, 118,
+	119, 3338, 3339, 69, 69, 3334, 3402, 69,
+	3334, 69, 3334, 69, 3401, 3396, 3396, 3331,
+	3397, 3398, 3334, 69, 3403, 3404, 3405, 3406,
+	3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414,
+	3415, 3416, 3417, 3335, 3334, 3403, 3404, 3405,
+	3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413,
+	3414, 3415, 3416, 3417, 83, 84, 3418, 3399,
+	92, 93, 3418, 3400, 69, 69, 3334, 3402,
+	69, 3334, 69, 3334, 69, 3401, 661, 661,
+	661, 852, 849, 852, 851, 852, 849, 853,
+	849, 848, 661, 661, 661, 985, 985, 986,
+	987, 957, 958, 959, 957, 988, 989, 957,
+	957, 957, 963, 661, 996, 996, 997, 998,
+	991, 999, 1000, 1001, 1001, 1002, 1003, 991,
+	991, 991, 990, 999, 1000, 990, 661, 1013,
+	1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020,
+	1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028,
+	1029, 1030, 1016, 1017, 1018, 1019, 1020, 1021,
+	1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029,
+	1030, 1031, 1032, 1033, 1033, 1034, 1035, 1004,
+	1031, 1032, 1004, 661, 1517, 1517, 1518, 1519,
+	1520, 1521, 1522, 1522, 1523, 1524, 1513, 1513,
+	1513, 1509, 1520, 1521, 1509, 1539, 1539, 1540,
+	1541, 1543, 1544, 1542, 1542, 1542, 1509, 1495,
+	1546, 1546, 1547, 1548, 1549, 1550, 1551, 1551,
+	1552, 1553, 1542, 1542, 1542, 1509, 1549, 1550,
+	1509, 1543, 1544, 1495, 661, 661, 661, 661,
+	661, 661, 661, 661, 661, 1934, 1934, 1935,
+	1936, 1937, 1938, 1939, 1939, 1940, 1941, 1933,
+	1933, 1933, 1924, 1937, 1938, 1924, 661, 661,
+	2105, 2105, 2106, 2107, 2108, 2109, 2054, 2054,
+	2110, 2111, 1945, 2108, 2109, 1945, 2087, 2087,
+	2088, 2089, 2091, 2092, 2054, 2054, 2093, 2094,
+	2090, 1945, 2091, 2092, 1945, 2068, 2068, 2069,
+	2070, 2072, 2073, 2054, 2054, 2074, 2075, 2071,
+	1945, 2072, 2073, 1945, 2048, 2048, 2049, 2050,
+	2052, 2053, 2054, 2054, 2055, 2056, 2051, 1945,
+	2052, 2053, 1945, 661, 661, 661, 661, 2303,
+	2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310,
+	2311, 2311, 2312, 2313, 2302, 2309, 2310, 71,
+	661, 2368, 2368, 2369, 2370, 2371, 2372, 2373,
+	2373, 2374, 2375, 2364, 2364, 2364, 2360, 2371,
+	2372, 2360, 661, 2402, 2402, 2403, 2404, 2405,
+	2406, 2407, 2407, 2408, 2409, 2398, 2398, 2398,
+	2360, 2405, 2406, 2360, 661, 2450, 2450, 2451,
+	2452, 2456, 2456, 2456, 2456, 2461, 2462, 2456,
+	2456, 2463, 2464, 2469, 2461, 2462, 2469, 2447,
+	2447, 2448, 2449, 2470, 2457, 2458, 2470, 2470,
+	2470, 2469, 2457, 2458, 2469, 2470, 2447, 2447,
+	2448, 2449, 2450, 2450, 2451, 2452, 2453, 2453,
+	2454, 2455, 2456, 2456, 2456, 2456, 2457, 2458,
+	2456, 2456, 2459, 2460, 2461, 2462, 2456, 2456,
+	2463, 2464, 2465, 2466, 2456, 2456, 2467, 2468,
+	2470, 2470, 2470, 2469, 2457, 2461, 2465, 2458,
+	2462, 2466, 2469, 661, 661, 661, 661, 661,
+	661, 661, 3211, 3211, 3212, 3213, 3214, 3215,
+	3216, 3216, 3217, 3218, 3207, 3207, 3207, 2360,
+	3214, 3215, 2360, 661, 661, 661, 661, 661,
+	661, 0
 };
 
 static const short _zone_scanner_trans_targs[] = {
 	0, 1, 1, 1, 2, 4, 16, 34,
 	48, 55, 141, 71, 75, 83, 89, 105,
-	108, 115, 126, 136, 1111, 149, 1116, 257,
+	108, 115, 126, 136, 1120, 149, 1125, 257,
 	0, 3, 3, 3, 2, 164, 164, 164,
 	164, 164, 3, 167, 0, 3, 3, 3,
 	4, 16, 34, 48, 55, 60, 71, 75,
@@ -4109,13 +4122,13 @@ static const short _zone_scanner_trans_targs[] = {
 	167, 0, 5, 5, 5, 227, 230, 234,
 	5, 10, 6, 11, 19, 6, 5, 0,
 	5, 5, 9, 5, 10, 11, 19, 0,
-	7, 7, 7, 1111, 8, 0, 6, 6,
-	11, 11, 11, 12, 1117, 174, 240, 1112,
+	7, 7, 7, 1120, 8, 0, 6, 6,
+	11, 11, 11, 12, 1126, 174, 240, 1121,
 	13, 0, 13, 13, 14, 170, 177, 178,
 	179, 180, 181, 182, 183, 184, 185, 186,
-	187, 188, 189, 190, 1119, 236, 1117, 237,
-	1120, 239, 0, 15, 15, 15, 1113, 260,
-	0, 15, 15, 15, 1113, 260, 17, 20,
+	187, 188, 189, 190, 1128, 236, 1126, 237,
+	1129, 239, 0, 15, 15, 15, 1122, 260,
+	0, 15, 15, 15, 1122, 260, 17, 20,
 	27, 30, 18, 5, 5, 5, 5, 10,
 	6, 11, 19, 19, 19, 19, 21, 26,
 	22, 23, 24, 25, 5, 5, 5, 5,
@@ -4172,7 +4185,7 @@ static const short _zone_scanner_trans_targs[] = {
 	134, 0, 135, 0, 5, 5, 5, 135,
 	5, 10, 6, 11, 19, 137, 138, 5,
 	5, 5, 5, 10, 6, 11, 19, 140,
-	140, 140, 1114, 258, 142, 143, 143, 143,
+	140, 140, 1123, 258, 142, 143, 143, 143,
 	143, 148, 143, 143, 143, 144, 4, 16,
 	34, 48, 55, 63, 71, 75, 83, 89,
 	105, 108, 115, 126, 136, 143, 148, 62,
@@ -4180,21 +4193,21 @@ static const short _zone_scanner_trans_targs[] = {
 	62, 139, 146, 146, 147, 147, 147, 147,
 	147, 62, 62, 62, 146, 62, 139, 0,
 	151, 193, 199, 152, 153, 154, 155, 156,
-	157, 1115, 0, 159, 159, 159, 159, 160,
+	157, 1124, 0, 159, 159, 159, 159, 160,
 	159, 159, 159, 159, 160, 0, 0, 162,
 	162, 162, 162, 163, 162, 162, 162, 162,
 	163, 165, 165, 166, 166, 166, 166, 166,
 	3, 3, 3, 165, 3, 167, 0, 169,
 	169, 169, 169, 241, 176, 242, 169, 169,
 	169, 169, 241, 176, 242, 0, 171, 171,
-	171, 1112, 12, 1117, 174, 1118, 240, 171,
-	171, 171, 1118, 172, 172, 172, 1116, 173,
+	171, 1121, 12, 1126, 174, 1127, 240, 171,
+	171, 171, 1127, 172, 172, 172, 1125, 173,
 	175, 175, 175, 176, 176, 176, 191, 226,
-	1119, 0, 194, 195, 196, 197, 198, 1115,
-	200, 201, 1115, 0, 172, 172, 172, 1116,
-	173, 0, 204, 204, 204, 1114, 205, 204,
-	204, 204, 1114, 205, 0, 207, 207, 207,
-	1119, 191, 1120, 226, 207, 207, 207, 1120,
+	1128, 0, 194, 195, 196, 197, 198, 1124,
+	200, 201, 1124, 0, 172, 172, 172, 1125,
+	173, 0, 204, 204, 204, 1123, 205, 204,
+	204, 204, 1123, 205, 0, 207, 207, 207,
+	1128, 191, 1129, 226, 207, 207, 207, 1129,
 	223, 0, 223, 223, 223, 224, 225, 225,
 	225, 226, 226, 226, 228, 229, 5, 5,
 	5, 5, 10, 6, 11, 19, 231, 232,
@@ -4202,798 +4215,802 @@ static const short _zone_scanner_trans_targs[] = {
 	19, 235, 5, 5, 5, 5, 10, 6,
 	11, 19, 238, 238, 238, 239, 239, 239,
 	240, 240, 240, 242, 242, 242, 0, 262,
-	1121, 262, 1121, 0, 264, 270, 271, 266,
-	1122, 264, 265, 266, 1122, 264, 266, 267,
-	0, 268, 269, 1122, 264, 265, 266, 1122,
-	0, 273, 278, 274, 1123, 1124, 275, 0,
-	276, 277, 1123, 273, 1124, 274, 278, 279,
+	1130, 262, 1130, 0, 264, 270, 271, 266,
+	1131, 264, 265, 266, 1131, 264, 266, 267,
+	0, 268, 269, 1131, 264, 265, 266, 1131,
+	0, 273, 278, 274, 1132, 1133, 275, 0,
+	276, 277, 1132, 273, 1133, 274, 278, 279,
 	280, 0, 281, 282, 283, 278, 279, 280,
 	0, 285, 285, 285, 285, 292, 0, 286,
 	0, 287, 287, 287, 286, 289, 289, 289,
-	289, 289, 1125, 288, 0, 290, 0, 290,
+	289, 289, 1134, 288, 0, 290, 0, 290,
 	291, 291, 291, 291, 291, 287, 287, 287,
-	290, 1125, 288, 0, 294, 294, 294, 294,
+	290, 1134, 288, 0, 294, 294, 294, 294,
 	304, 295, 303, 299, 295, 296, 299, 0,
-	297, 297, 297, 295, 299, 1126, 298, 297,
-	297, 297, 1126, 298, 300, 0, 301, 302,
+	297, 297, 297, 295, 299, 1135, 298, 297,
+	297, 297, 1135, 298, 300, 0, 301, 302,
 	295, 296, 299, 306, 306, 306, 306, 321,
-	307, 0, 0, 308, 308, 308, 1127, 312,
+	307, 0, 0, 308, 308, 308, 1136, 312,
 	318, 0, 308, 308, 308, 309, 317, 313,
-	1127, 312, 318, 0, 309, 310, 313, 311,
-	311, 311, 309, 313, 1127, 312, 311, 311,
+	1136, 312, 318, 0, 309, 310, 313, 311,
+	311, 311, 309, 313, 1136, 312, 311, 311,
 	311, 314, 0, 315, 316, 309, 310, 313,
-	1128, 319, 319, 319, 319, 320, 0, 323,
+	1137, 319, 319, 319, 319, 320, 0, 323,
 	324, 325, 328, 326, 326, 326, 326, 326,
-	327, 1129, 1130, 1131, 0, 330, 330, 330,
-	330, 335, 1132, 1133, 1134, 330, 330, 330,
+	327, 1138, 1139, 1140, 0, 330, 330, 330,
+	330, 335, 1141, 1142, 1143, 330, 330, 330,
 	331, 336, 353, 367, 374, 379, 387, 391,
 	399, 405, 421, 424, 431, 442, 452, 330,
-	335, 1132, 1133, 1134, 330, 330, 330, 332,
-	455, 459, 330, 335, 1132, 1133, 1134, 333,
-	334, 330, 330, 330, 330, 335, 1132, 1133,
-	1134, 337, 339, 346, 349, 338, 330, 330,
-	330, 330, 335, 1132, 1133, 1134, 340, 345,
+	335, 1141, 1142, 1143, 330, 330, 330, 332,
+	455, 459, 330, 335, 1141, 1142, 1143, 333,
+	334, 330, 330, 330, 330, 335, 1141, 1142,
+	1143, 337, 339, 346, 349, 338, 330, 330,
+	330, 330, 335, 1141, 1142, 1143, 340, 345,
 	341, 342, 343, 344, 330, 330, 330, 330,
-	335, 1132, 1133, 1134, 330, 330, 330, 330,
-	335, 1132, 1133, 1134, 347, 348, 330, 330,
-	330, 330, 335, 1132, 1133, 1134, 350, 351,
-	352, 330, 330, 330, 330, 335, 1132, 1133,
-	1134, 354, 358, 366, 355, 356, 357, 330,
-	330, 330, 330, 335, 1132, 1133, 1134, 359,
+	335, 1141, 1142, 1143, 330, 330, 330, 330,
+	335, 1141, 1142, 1143, 347, 348, 330, 330,
+	330, 330, 335, 1141, 1142, 1143, 350, 351,
+	352, 330, 330, 330, 330, 335, 1141, 1142,
+	1143, 354, 358, 366, 355, 356, 357, 330,
+	330, 330, 330, 335, 1141, 1142, 1143, 359,
 	362, 360, 361, 330, 330, 330, 330, 335,
-	1132, 1133, 1134, 363, 364, 365, 330, 330,
-	330, 330, 335, 1132, 1133, 1134, 330, 330,
-	330, 330, 335, 1132, 1133, 1134, 368, 369,
+	1141, 1142, 1143, 363, 364, 365, 330, 330,
+	330, 330, 335, 1141, 1142, 1143, 330, 330,
+	330, 330, 335, 1141, 1142, 1143, 368, 369,
 	370, 372, 371, 330, 330, 330, 330, 335,
-	1132, 1133, 1134, 373, 330, 330, 330, 330,
-	335, 1132, 1133, 1134, 375, 376, 377, 378,
-	330, 330, 330, 330, 335, 1132, 1133, 1134,
+	1141, 1142, 1143, 373, 330, 330, 330, 330,
+	335, 1141, 1142, 1143, 375, 376, 377, 378,
+	330, 330, 330, 330, 335, 1141, 1142, 1143,
 	380, 381, 382, 383, 384, 385, 386, 330,
-	330, 330, 330, 335, 1132, 1133, 1134, 388,
-	390, 389, 330, 330, 330, 330, 335, 1132,
-	1133, 1134, 330, 330, 330, 330, 335, 1132,
-	1133, 1134, 392, 394, 396, 398, 393, 330,
-	330, 330, 330, 335, 1132, 1133, 1134, 395,
-	330, 330, 330, 330, 335, 1132, 1133, 1134,
-	397, 330, 330, 330, 330, 335, 1132, 1133,
-	1134, 330, 330, 330, 330, 335, 1132, 1133,
-	1134, 400, 404, 401, 402, 403, 330, 330,
-	330, 330, 335, 1132, 1133, 1134, 330, 330,
-	330, 330, 335, 1132, 1133, 1134, 406, 410,
+	330, 330, 330, 335, 1141, 1142, 1143, 388,
+	390, 389, 330, 330, 330, 330, 335, 1141,
+	1142, 1143, 330, 330, 330, 330, 335, 1141,
+	1142, 1143, 392, 394, 396, 398, 393, 330,
+	330, 330, 330, 335, 1141, 1142, 1143, 395,
+	330, 330, 330, 330, 335, 1141, 1142, 1143,
+	397, 330, 330, 330, 330, 335, 1141, 1142,
+	1143, 330, 330, 330, 330, 335, 1141, 1142,
+	1143, 400, 404, 401, 402, 403, 330, 330,
+	330, 330, 335, 1141, 1142, 1143, 330, 330,
+	330, 330, 335, 1141, 1142, 1143, 406, 410,
 	412, 407, 408, 409, 330, 330, 330, 330,
-	335, 1132, 1133, 1134, 411, 330, 330, 330,
-	330, 335, 1132, 1133, 1134, 330, 330, 330,
-	413, 330, 335, 1132, 1133, 1134, 414, 330,
-	330, 330, 415, 330, 335, 1132, 1133, 1134,
-	330, 330, 330, 416, 330, 335, 1132, 1133,
-	1134, 417, 418, 419, 420, 330, 330, 330,
-	330, 335, 1132, 1133, 1134, 422, 423, 330,
-	330, 330, 330, 335, 1132, 1133, 1134, 425,
-	426, 430, 330, 330, 330, 330, 335, 1132,
-	1133, 1134, 427, 428, 429, 330, 330, 330,
-	330, 335, 1132, 1133, 1134, 330, 330, 330,
-	330, 335, 1132, 1133, 1134, 432, 434, 436,
-	438, 433, 330, 330, 330, 330, 335, 1132,
-	1133, 1134, 435, 330, 330, 330, 330, 335,
-	1132, 1133, 1134, 437, 330, 330, 330, 330,
-	335, 1132, 1133, 1134, 439, 440, 441, 330,
-	330, 330, 330, 335, 1132, 1133, 1134, 443,
+	335, 1141, 1142, 1143, 411, 330, 330, 330,
+	330, 335, 1141, 1142, 1143, 330, 330, 330,
+	413, 330, 335, 1141, 1142, 1143, 414, 330,
+	330, 330, 415, 330, 335, 1141, 1142, 1143,
+	330, 330, 330, 416, 330, 335, 1141, 1142,
+	1143, 417, 418, 419, 420, 330, 330, 330,
+	330, 335, 1141, 1142, 1143, 422, 423, 330,
+	330, 330, 330, 335, 1141, 1142, 1143, 425,
+	426, 430, 330, 330, 330, 330, 335, 1141,
+	1142, 1143, 427, 428, 429, 330, 330, 330,
+	330, 335, 1141, 1142, 1143, 330, 330, 330,
+	330, 335, 1141, 1142, 1143, 432, 434, 436,
+	438, 433, 330, 330, 330, 330, 335, 1141,
+	1142, 1143, 435, 330, 330, 330, 330, 335,
+	1141, 1142, 1143, 437, 330, 330, 330, 330,
+	335, 1141, 1142, 1143, 439, 440, 441, 330,
+	330, 330, 330, 335, 1141, 1142, 1143, 443,
 	446, 448, 444, 445, 330, 330, 330, 330,
-	335, 1132, 1133, 1134, 447, 330, 330, 330,
-	330, 335, 1132, 1133, 1134, 449, 450, 451,
-	330, 330, 330, 451, 330, 335, 1132, 1133,
-	1134, 453, 454, 330, 330, 330, 330, 335,
-	1132, 1133, 1134, 456, 457, 458, 330, 330,
-	330, 330, 335, 1132, 1133, 1134, 460, 330,
-	330, 330, 330, 335, 1132, 1133, 1134, 0,
+	335, 1141, 1142, 1143, 447, 330, 330, 330,
+	330, 335, 1141, 1142, 1143, 449, 450, 451,
+	330, 330, 330, 451, 330, 335, 1141, 1142,
+	1143, 453, 454, 330, 330, 330, 330, 335,
+	1141, 1142, 1143, 456, 457, 458, 330, 330,
+	330, 330, 335, 1141, 1142, 1143, 460, 330,
+	330, 330, 330, 335, 1141, 1142, 1143, 0,
 	462, 462, 462, 462, 469, 0, 463, 464,
 	464, 464, 463, 464, 468, 0, 464, 464,
 	464, 465, 464, 468, 466, 466, 466, 466,
-	466, 467, 1135, 1136, 1137, 471, 471, 471,
-	471, 479, 472, 478, 1138, 1138, 1138, 478,
-	1139, 1138, 1142, 473, 473, 473, 474, 473,
-	477, 475, 475, 475, 475, 475, 476, 1139,
-	1140, 1141, 473, 473, 473, 473, 477, 0,
-	481, 482, 497, 527, 535, 548, 1143, 481,
-	483, 484, 1143, 485, 1143, 486, 487, 488,
+	466, 467, 1144, 1145, 1146, 471, 471, 471,
+	471, 479, 472, 478, 1147, 1147, 1147, 478,
+	1148, 1147, 1151, 473, 473, 473, 474, 473,
+	477, 475, 475, 475, 475, 475, 476, 1148,
+	1149, 1150, 473, 473, 473, 473, 477, 0,
+	481, 482, 497, 536, 544, 557, 1152, 481,
+	483, 484, 1152, 485, 1152, 486, 487, 488,
 	489, 490, 491, 492, 493, 494, 495, 496,
-	1143, 498, 499, 505, 500, 501, 502, 503,
-	504, 1143, 506, 507, 508, 509, 518, 510,
-	511, 512, 513, 514, 515, 516, 517, 1143,
-	519, 520, 521, 522, 523, 524, 525, 526,
-	1143, 528, 529, 530, 531, 532, 533, 534,
-	1143, 536, 537, 538, 539, 540, 541, 542,
-	545, 543, 544, 1143, 546, 547, 1143, 549,
-	550, 551, 554, 552, 553, 1143, 555, 556,
-	557, 569, 572, 1143, 558, 559, 560, 561,
-	562, 563, 564, 565, 566, 567, 568, 1143,
-	570, 571, 1143, 573, 574, 1143, 0, 576,
-	577, 583, 600, 603, 609, 613, 1144, 576,
-	578, 579, 580, 581, 582, 1144, 584, 590,
-	596, 585, 586, 587, 588, 589, 1144, 591,
-	593, 592, 1144, 594, 595, 1144, 597, 598,
-	599, 1144, 601, 602, 1144, 604, 606, 605,
-	1144, 607, 608, 1144, 610, 611, 612, 1144,
-	614, 615, 1144, 0, 617, 1145, 617, 619,
-	1146, 621, 622, 622, 622, 622, 651, 622,
-	622, 622, 623, 622, 651, 624, 624, 624,
-	624, 650, 0, 624, 624, 624, 625, 624,
-	650, 626, 626, 626, 625, 626, 649, 626,
-	626, 626, 627, 626, 649, 0, 628, 628,
-	628, 627, 646, 646, 646, 646, 646, 628,
-	645, 628, 628, 628, 629, 628, 645, 630,
-	630, 630, 629, 642, 642, 642, 642, 642,
-	630, 641, 630, 630, 630, 631, 630, 641,
-	632, 632, 632, 631, 638, 638, 638, 638,
-	638, 632, 637, 632, 632, 632, 633, 632,
-	637, 1147, 633, 634, 634, 634, 634, 634,
-	635, 635, 636, 636, 636, 636, 636, 1147,
-	635, 639, 639, 640, 640, 640, 640, 640,
-	632, 632, 632, 639, 632, 637, 643, 643,
-	644, 644, 644, 644, 644, 630, 630, 630,
-	643, 630, 641, 647, 647, 648, 648, 648,
-	648, 648, 628, 628, 628, 647, 628, 645,
-	653, 654, 654, 654, 654, 656, 655, 654,
-	654, 654, 654, 656, 1148, 658, 659, 659,
-	659, 659, 661, 659, 659, 659, 660, 659,
-	661, 1149, 663, 664, 664, 664, 663, 664,
-	666, 664, 664, 664, 665, 664, 666, 1150,
-	668, 0, 669, 669, 669, 669, 670, 1151,
-	1152, 1153, 668, 669, 669, 669, 669, 670,
-	1151, 1152, 1153, 672, 1154, 672, 0, 674,
-	675, 675, 675, 674, 675, 727, 675, 675,
-	675, 676, 680, 722, 675, 727, 677, 677,
-	677, 676, 677, 726, 677, 677, 677, 678,
-	677, 726, 679, 679, 679, 724, 678, 679,
-	723, 679, 679, 679, 679, 723, 681, 681,
-	681, 681, 721, 682, 683, 683, 683, 682,
-	683, 720, 683, 683, 683, 684, 688, 715,
-	683, 720, 685, 685, 685, 684, 685, 719,
-	685, 685, 685, 686, 685, 719, 687, 687,
-	687, 717, 686, 687, 716, 687, 687, 687,
-	687, 716, 689, 689, 689, 689, 714, 690,
-	691, 691, 692, 692, 692, 711, 691, 713,
-	692, 710, 1155, 1162, 1163, 692, 692, 692,
-	693, 692, 710, 1155, 1162, 1163, 694, 694,
-	694, 707, 693, 709, 694, 706, 1155, 1160,
-	1161, 694, 694, 694, 695, 694, 706, 1160,
-	1161, 696, 696, 696, 703, 695, 705, 696,
-	702, 1155, 1158, 1159, 696, 696, 696, 697,
-	696, 702, 1158, 1159, 698, 698, 698, 700,
-	697, 698, 699, 1155, 1156, 1157, 698, 698,
-	698, 698, 699, 1156, 1157, 698, 698, 698,
-	701, 698, 699, 1155, 1156, 1157, 701, 696,
-	696, 696, 704, 705, 696, 702, 1155, 1158,
-	1159, 704, 694, 694, 694, 708, 709, 694,
-	706, 1155, 1160, 1161, 708, 692, 692, 692,
-	712, 713, 692, 710, 1155, 1162, 1163, 712,
-	689, 689, 689, 689, 714, 687, 687, 687,
-	718, 687, 716, 718, 681, 681, 681, 681,
-	721, 679, 679, 679, 725, 679, 723, 725,
-	729, 730, 730, 730, 729, 730, 738, 730,
-	730, 730, 731, 730, 738, 732, 732, 732,
-	731, 732, 737, 732, 732, 732, 733, 732,
-	737, 734, 734, 734, 733, 734, 736, 734,
-	734, 734, 735, 734, 736, 1164, 740, 741,
-	741, 741, 740, 741, 755, 741, 741, 741,
-	742, 741, 755, 743, 743, 743, 742, 743,
-	754, 744, 743, 743, 743, 743, 754, 745,
-	745, 745, 745, 753, 746, 745, 745, 745,
-	745, 753, 747, 747, 747, 747, 752, 748,
-	747, 747, 747, 747, 752, 749, 749, 749,
-	749, 751, 749, 749, 749, 750, 749, 751,
-	1165, 757, 758, 758, 758, 758, 766, 759,
-	760, 760, 760, 759, 760, 765, 760, 760,
-	760, 761, 760, 765, 762, 762, 762, 762,
-	764, 763, 1166, 0, 767, 768, 767, 767,
-	769, 775, 767, 774, 1167, 1168, 1169, 769,
-	775, 770, 0, 771, 771, 772, 773, 767,
-	767, 767, 773, 767, 774, 1167, 1168, 1169,
-	776, 777, 777, 772, 779, 780, 780, 780,
-	779, 780, 790, 780, 780, 780, 781, 780,
-	790, 782, 782, 782, 782, 789, 783, 784,
-	784, 784, 783, 784, 788, 0, 784, 784,
-	784, 785, 784, 788, 786, 786, 786, 786,
-	786, 787, 1170, 1171, 1172, 792, 793, 793,
-	793, 792, 793, 800, 793, 793, 793, 794,
-	793, 800, 795, 795, 795, 794, 795, 799,
-	795, 795, 795, 796, 795, 799, 797, 797,
-	797, 797, 797, 798, 1173, 1174, 1175, 802,
-	803, 803, 803, 802, 803, 839, 0, 803,
-	803, 803, 804, 818, 825, 832, 803, 839,
-	805, 805, 805, 805, 817, 0, 806, 807,
-	807, 807, 806, 807, 816, 807, 807, 807,
-	808, 807, 816, 0, 809, 809, 809, 812,
-	812, 812, 814, 814, 814, 1176, 809, 811,
-	1179, 1180, 812, 813, 1177, 1178, 814, 815,
-	1181, 1182, 0, 810, 819, 819, 819, 819,
-	824, 820, 821, 821, 821, 820, 821, 823,
-	0, 821, 821, 821, 822, 821, 823, 0,
-	822, 809, 809, 809, 812, 812, 812, 814,
-	814, 814, 1176, 809, 811, 1179, 1180, 812,
-	813, 1177, 1178, 814, 815, 1181, 1182, 826,
-	826, 826, 826, 831, 827, 828, 828, 828,
-	827, 828, 830, 828, 828, 828, 829, 828,
-	830, 829, 809, 809, 809, 812, 812, 812,
-	814, 814, 814, 1176, 809, 811, 1179, 1180,
-	812, 813, 1177, 1178, 814, 815, 1181, 1182,
-	833, 833, 833, 833, 838, 834, 835, 835,
-	835, 834, 835, 837, 835, 835, 835, 836,
-	835, 837, 809, 809, 809, 812, 812, 812,
-	814, 814, 814, 1176, 809, 811, 1179, 1180,
-	812, 813, 1177, 1178, 814, 815, 1181, 1182,
-	0, 841, 875, 892, 906, 913, 918, 926,
-	930, 938, 944, 960, 963, 970, 981, 991,
-	842, 842, 842, 866, 869, 873, 842, 865,
-	842, 842, 842, 843, 842, 865, 844, 844,
-	844, 844, 864, 845, 846, 846, 846, 845,
-	846, 863, 846, 846, 846, 847, 846, 863,
-	848, 848, 848, 847, 848, 862, 0, 848,
-	848, 848, 849, 848, 862, 850, 850, 850,
-	849, 850, 861, 850, 850, 850, 851, 850,
-	861, 852, 852, 852, 851, 852, 860, 852,
-	852, 852, 853, 852, 860, 854, 854, 854,
-	853, 854, 859, 854, 854, 854, 855, 854,
-	859, 856, 856, 856, 856, 858, 856, 856,
-	856, 857, 856, 858, 1183, 867, 868, 842,
-	842, 842, 842, 865, 870, 871, 872, 842,
-	842, 842, 842, 865, 874, 842, 842, 842,
-	842, 865, 876, 878, 885, 888, 877, 842,
-	842, 842, 842, 865, 879, 884, 880, 881,
-	882, 883, 842, 842, 842, 842, 865, 842,
-	842, 842, 842, 865, 886, 887, 842, 842,
-	842, 842, 865, 889, 890, 891, 842, 842,
-	842, 842, 865, 893, 897, 905, 894, 895,
-	896, 842, 842, 842, 842, 865, 898, 901,
-	899, 900, 842, 842, 842, 842, 865, 902,
-	903, 904, 842, 842, 842, 842, 865, 842,
-	842, 842, 842, 865, 907, 908, 909, 911,
-	910, 842, 842, 842, 842, 865, 912, 842,
-	842, 842, 842, 865, 914, 915, 916, 917,
-	842, 842, 842, 842, 865, 919, 920, 921,
-	922, 923, 924, 925, 842, 842, 842, 842,
-	865, 927, 929, 928, 842, 842, 842, 842,
-	865, 842, 842, 842, 842, 865, 931, 933,
-	935, 937, 932, 842, 842, 842, 842, 865,
-	934, 842, 842, 842, 842, 865, 936, 842,
-	842, 842, 842, 865, 842, 842, 842, 842,
-	865, 939, 943, 940, 941, 942, 842, 842,
-	842, 842, 865, 842, 842, 842, 842, 865,
-	945, 949, 951, 946, 947, 948, 842, 842,
-	842, 842, 865, 950, 842, 842, 842, 842,
-	865, 842, 842, 842, 952, 842, 865, 953,
-	842, 842, 842, 954, 842, 865, 842, 842,
-	842, 955, 842, 865, 956, 957, 958, 959,
-	842, 842, 842, 842, 865, 961, 962, 842,
-	842, 842, 842, 865, 964, 965, 969, 842,
-	842, 842, 842, 865, 966, 967, 968, 842,
-	842, 842, 842, 865, 842, 842, 842, 842,
-	865, 971, 973, 975, 977, 972, 842, 842,
-	842, 842, 865, 974, 842, 842, 842, 842,
-	865, 976, 842, 842, 842, 842, 865, 978,
-	979, 980, 842, 842, 842, 842, 865, 982,
-	985, 987, 983, 984, 842, 842, 842, 842,
-	865, 986, 842, 842, 842, 842, 865, 988,
-	989, 0, 990, 842, 842, 842, 990, 842,
-	865, 992, 993, 842, 842, 842, 842, 865,
-	995, 996, 1184, 998, 999, 999, 999, 998,
-	999, 1007, 999, 999, 999, 1000, 999, 1007,
-	1001, 1001, 1001, 1000, 1001, 1006, 1001, 1001,
-	1001, 1002, 1001, 1006, 1003, 1003, 1003, 1003,
-	1005, 1004, 1185, 1009, 1186, 1011, 1012, 1012,
-	1012, 1011, 1012, 1038, 1012, 1012, 1012, 1013,
-	1012, 1038, 1014, 1014, 1014, 1013, 1014, 1037,
-	1014, 1014, 1014, 1015, 1014, 1037, 1016, 1016,
-	1016, 1015, 1016, 1036, 1016, 1016, 1016, 1017,
-	1034, 1016, 1036, 1018, 1018, 1018, 1018, 1033,
-	0, 1018, 1018, 1018, 1019, 1018, 1033, 1020,
-	1021, 1031, 1022, 1023, 1030, 1024, 1028, 1025,
-	1026, 1026, 1027, 1019, 1187, 1029, 1032, 1035,
-	1034, 1040, 1041, 1041, 1041, 1040, 1041, 1051,
-	1041, 1041, 1041, 1042, 1041, 1051, 1043, 1043,
-	1043, 1042, 1043, 1050, 1043, 1043, 1043, 1044,
-	1043, 1050, 1045, 1045, 1045, 1044, 1045, 1049,
-	1045, 1045, 1045, 1046, 1047, 1045, 1049, 1188,
-	1048, 1047, 1053, 1054, 1054, 1054, 1053, 1054,
-	1064, 1054, 1054, 1054, 1055, 1054, 1064, 1056,
-	1056, 1056, 1055, 1056, 1063, 1056, 1056, 1056,
-	1057, 1056, 1063, 1058, 1058, 1058, 1057, 1058,
-	1062, 1058, 1058, 1058, 1059, 1058, 1062, 1060,
-	1060, 1060, 1060, 1060, 1061, 1189, 1190, 1191,
-	1066, 1067, 1067, 1067, 1066, 1067, 1069, 1067,
-	1067, 1067, 1068, 1067, 1069, 1192, 1068, 1071,
-	1072, 1072, 1072, 1071, 1072, 1082, 1072, 1072,
-	1072, 1073, 1072, 1082, 1074, 1075, 1076, 0,
-	1077, 1078, 1079, 1080, 1081, 0, 1193, 1084,
-	1085, 0, 1086, 1087, 1088, 1194, 1090, 1091,
-	1092, 1093, 1094, 1195, 1096, 1097, 1097, 1097,
-	1096, 1097, 1102, 1097, 1097, 1097, 1098, 1097,
-	1102, 1099, 1099, 1099, 1098, 1099, 1101, 1100,
-	1099, 1099, 1099, 1099, 1101, 1196, 1104, 1105,
-	1105, 1105, 1104, 1105, 1110, 1106, 1105, 1105,
-	1105, 1105, 1110, 1107, 1107, 1107, 1107, 1109,
-	1108, 1107, 1107, 1107, 1107, 1109, 1197, 0,
-	1, 150, 1, 1, 158, 1116, 257, 13,
-	192, 13, 13, 202, 222, 1119, 236, 1120,
-	239, 0, 140, 140, 140, 168, 243, 244,
-	245, 246, 259, 248, 249, 250, 251, 252,
-	253, 254, 255, 256, 1114, 258, 0, 161,
-	168, 243, 244, 245, 246, 247, 248, 249,
-	250, 251, 252, 253, 254, 255, 256, 0,
-	1, 150, 1, 1, 158, 1111, 149, 1116,
-	257, 1, 1, 1116, 172, 172, 172, 1116,
-	173, 176, 176, 176, 191, 226, 0, 203,
-	206, 208, 209, 210, 211, 212, 213, 214,
-	215, 216, 217, 218, 219, 220, 221, 1116
+	1152, 498, 527, 499, 505, 500, 501, 502,
+	503, 504, 1152, 506, 507, 508, 509, 518,
+	510, 511, 512, 513, 514, 515, 516, 517,
+	1152, 519, 520, 521, 522, 523, 524, 525,
+	526, 1152, 528, 533, 529, 530, 531, 532,
+	1152, 534, 535, 1152, 537, 538, 539, 540,
+	541, 542, 543, 1152, 545, 546, 547, 548,
+	549, 550, 551, 554, 552, 553, 1152, 555,
+	556, 1152, 558, 559, 560, 563, 561, 562,
+	1152, 564, 565, 566, 578, 581, 1152, 567,
+	568, 569, 570, 571, 572, 573, 574, 575,
+	576, 577, 1152, 579, 580, 1152, 582, 583,
+	1152, 0, 585, 586, 592, 609, 612, 618,
+	622, 1153, 585, 587, 588, 589, 590, 591,
+	1153, 593, 599, 605, 594, 595, 596, 597,
+	598, 1153, 600, 602, 601, 1153, 603, 604,
+	1153, 606, 607, 608, 1153, 610, 611, 1153,
+	613, 615, 614, 1153, 616, 617, 1153, 619,
+	620, 621, 1153, 623, 624, 1153, 0, 626,
+	1154, 626, 628, 1155, 630, 631, 631, 631,
+	631, 660, 631, 631, 631, 632, 631, 660,
+	633, 633, 633, 633, 659, 0, 633, 633,
+	633, 634, 633, 659, 635, 635, 635, 634,
+	635, 658, 635, 635, 635, 636, 635, 658,
+	0, 637, 637, 637, 636, 655, 655, 655,
+	655, 655, 637, 654, 637, 637, 637, 638,
+	637, 654, 639, 639, 639, 638, 651, 651,
+	651, 651, 651, 639, 650, 639, 639, 639,
+	640, 639, 650, 641, 641, 641, 640, 647,
+	647, 647, 647, 647, 641, 646, 641, 641,
+	641, 642, 641, 646, 1156, 642, 643, 643,
+	643, 643, 643, 644, 644, 645, 645, 645,
+	645, 645, 1156, 644, 648, 648, 649, 649,
+	649, 649, 649, 641, 641, 641, 648, 641,
+	646, 652, 652, 653, 653, 653, 653, 653,
+	639, 639, 639, 652, 639, 650, 656, 656,
+	657, 657, 657, 657, 657, 637, 637, 637,
+	656, 637, 654, 662, 663, 663, 663, 663,
+	665, 664, 663, 663, 663, 663, 665, 1157,
+	667, 668, 668, 668, 668, 670, 668, 668,
+	668, 669, 668, 670, 1158, 672, 673, 673,
+	673, 672, 673, 675, 673, 673, 673, 674,
+	673, 675, 1159, 677, 0, 678, 678, 678,
+	678, 679, 1160, 1161, 1162, 677, 678, 678,
+	678, 678, 679, 1160, 1161, 1162, 681, 1163,
+	681, 0, 683, 684, 684, 684, 683, 684,
+	736, 684, 684, 684, 685, 689, 731, 684,
+	736, 686, 686, 686, 685, 686, 735, 686,
+	686, 686, 687, 686, 735, 688, 688, 688,
+	733, 687, 688, 732, 688, 688, 688, 688,
+	732, 690, 690, 690, 690, 730, 691, 692,
+	692, 692, 691, 692, 729, 692, 692, 692,
+	693, 697, 724, 692, 729, 694, 694, 694,
+	693, 694, 728, 694, 694, 694, 695, 694,
+	728, 696, 696, 696, 726, 695, 696, 725,
+	696, 696, 696, 696, 725, 698, 698, 698,
+	698, 723, 699, 700, 700, 701, 701, 701,
+	720, 700, 722, 701, 719, 1164, 1171, 1172,
+	701, 701, 701, 702, 701, 719, 1164, 1171,
+	1172, 703, 703, 703, 716, 702, 718, 703,
+	715, 1164, 1169, 1170, 703, 703, 703, 704,
+	703, 715, 1169, 1170, 705, 705, 705, 712,
+	704, 714, 705, 711, 1164, 1167, 1168, 705,
+	705, 705, 706, 705, 711, 1167, 1168, 707,
+	707, 707, 709, 706, 707, 708, 1164, 1165,
+	1166, 707, 707, 707, 707, 708, 1165, 1166,
+	707, 707, 707, 710, 707, 708, 1164, 1165,
+	1166, 710, 705, 705, 705, 713, 714, 705,
+	711, 1164, 1167, 1168, 713, 703, 703, 703,
+	717, 718, 703, 715, 1164, 1169, 1170, 717,
+	701, 701, 701, 721, 722, 701, 719, 1164,
+	1171, 1172, 721, 698, 698, 698, 698, 723,
+	696, 696, 696, 727, 696, 725, 727, 690,
+	690, 690, 690, 730, 688, 688, 688, 734,
+	688, 732, 734, 738, 739, 739, 739, 738,
+	739, 747, 739, 739, 739, 740, 739, 747,
+	741, 741, 741, 740, 741, 746, 741, 741,
+	741, 742, 741, 746, 743, 743, 743, 742,
+	743, 745, 743, 743, 743, 744, 743, 745,
+	1173, 749, 750, 750, 750, 749, 750, 764,
+	750, 750, 750, 751, 750, 764, 752, 752,
+	752, 751, 752, 763, 753, 752, 752, 752,
+	752, 763, 754, 754, 754, 754, 762, 755,
+	754, 754, 754, 754, 762, 756, 756, 756,
+	756, 761, 757, 756, 756, 756, 756, 761,
+	758, 758, 758, 758, 760, 758, 758, 758,
+	759, 758, 760, 1174, 766, 767, 767, 767,
+	767, 775, 768, 769, 769, 769, 768, 769,
+	774, 769, 769, 769, 770, 769, 774, 771,
+	771, 771, 771, 773, 772, 1175, 0, 776,
+	777, 776, 776, 778, 784, 776, 783, 1176,
+	1177, 1178, 778, 784, 779, 0, 780, 780,
+	781, 782, 776, 776, 776, 782, 776, 783,
+	1176, 1177, 1178, 785, 786, 786, 781, 788,
+	789, 789, 789, 788, 789, 799, 789, 789,
+	789, 790, 789, 799, 791, 791, 791, 791,
+	798, 792, 793, 793, 793, 792, 793, 797,
+	0, 793, 793, 793, 794, 793, 797, 795,
+	795, 795, 795, 795, 796, 1179, 1180, 1181,
+	801, 802, 802, 802, 801, 802, 809, 802,
+	802, 802, 803, 802, 809, 804, 804, 804,
+	803, 804, 808, 804, 804, 804, 805, 804,
+	808, 806, 806, 806, 806, 806, 807, 1182,
+	1183, 1184, 811, 812, 812, 812, 811, 812,
+	848, 0, 812, 812, 812, 813, 827, 834,
+	841, 812, 848, 814, 814, 814, 814, 826,
+	0, 815, 816, 816, 816, 815, 816, 825,
+	816, 816, 816, 817, 816, 825, 0, 818,
+	818, 818, 821, 821, 821, 823, 823, 823,
+	1185, 818, 820, 1188, 1189, 821, 822, 1186,
+	1187, 823, 824, 1190, 1191, 0, 819, 828,
+	828, 828, 828, 833, 829, 830, 830, 830,
+	829, 830, 832, 0, 830, 830, 830, 831,
+	830, 832, 0, 831, 818, 818, 818, 821,
+	821, 821, 823, 823, 823, 1185, 818, 820,
+	1188, 1189, 821, 822, 1186, 1187, 823, 824,
+	1190, 1191, 835, 835, 835, 835, 840, 836,
+	837, 837, 837, 836, 837, 839, 837, 837,
+	837, 838, 837, 839, 838, 818, 818, 818,
+	821, 821, 821, 823, 823, 823, 1185, 818,
+	820, 1188, 1189, 821, 822, 1186, 1187, 823,
+	824, 1190, 1191, 842, 842, 842, 842, 847,
+	843, 844, 844, 844, 843, 844, 846, 844,
+	844, 844, 845, 844, 846, 818, 818, 818,
+	821, 821, 821, 823, 823, 823, 1185, 818,
+	820, 1188, 1189, 821, 822, 1186, 1187, 823,
+	824, 1190, 1191, 0, 850, 884, 901, 915,
+	922, 927, 935, 939, 947, 953, 969, 972,
+	979, 990, 1000, 851, 851, 851, 875, 878,
+	882, 851, 874, 851, 851, 851, 852, 851,
+	874, 853, 853, 853, 853, 873, 854, 855,
+	855, 855, 854, 855, 872, 855, 855, 855,
+	856, 855, 872, 857, 857, 857, 856, 857,
+	871, 0, 857, 857, 857, 858, 857, 871,
+	859, 859, 859, 858, 859, 870, 859, 859,
+	859, 860, 859, 870, 861, 861, 861, 860,
+	861, 869, 861, 861, 861, 862, 861, 869,
+	863, 863, 863, 862, 863, 868, 863, 863,
+	863, 864, 863, 868, 865, 865, 865, 865,
+	867, 865, 865, 865, 866, 865, 867, 1192,
+	876, 877, 851, 851, 851, 851, 874, 879,
+	880, 881, 851, 851, 851, 851, 874, 883,
+	851, 851, 851, 851, 874, 885, 887, 894,
+	897, 886, 851, 851, 851, 851, 874, 888,
+	893, 889, 890, 891, 892, 851, 851, 851,
+	851, 874, 851, 851, 851, 851, 874, 895,
+	896, 851, 851, 851, 851, 874, 898, 899,
+	900, 851, 851, 851, 851, 874, 902, 906,
+	914, 903, 904, 905, 851, 851, 851, 851,
+	874, 907, 910, 908, 909, 851, 851, 851,
+	851, 874, 911, 912, 913, 851, 851, 851,
+	851, 874, 851, 851, 851, 851, 874, 916,
+	917, 918, 920, 919, 851, 851, 851, 851,
+	874, 921, 851, 851, 851, 851, 874, 923,
+	924, 925, 926, 851, 851, 851, 851, 874,
+	928, 929, 930, 931, 932, 933, 934, 851,
+	851, 851, 851, 874, 936, 938, 937, 851,
+	851, 851, 851, 874, 851, 851, 851, 851,
+	874, 940, 942, 944, 946, 941, 851, 851,
+	851, 851, 874, 943, 851, 851, 851, 851,
+	874, 945, 851, 851, 851, 851, 874, 851,
+	851, 851, 851, 874, 948, 952, 949, 950,
+	951, 851, 851, 851, 851, 874, 851, 851,
+	851, 851, 874, 954, 958, 960, 955, 956,
+	957, 851, 851, 851, 851, 874, 959, 851,
+	851, 851, 851, 874, 851, 851, 851, 961,
+	851, 874, 962, 851, 851, 851, 963, 851,
+	874, 851, 851, 851, 964, 851, 874, 965,
+	966, 967, 968, 851, 851, 851, 851, 874,
+	970, 971, 851, 851, 851, 851, 874, 973,
+	974, 978, 851, 851, 851, 851, 874, 975,
+	976, 977, 851, 851, 851, 851, 874, 851,
+	851, 851, 851, 874, 980, 982, 984, 986,
+	981, 851, 851, 851, 851, 874, 983, 851,
+	851, 851, 851, 874, 985, 851, 851, 851,
+	851, 874, 987, 988, 989, 851, 851, 851,
+	851, 874, 991, 994, 996, 992, 993, 851,
+	851, 851, 851, 874, 995, 851, 851, 851,
+	851, 874, 997, 998, 0, 999, 851, 851,
+	851, 999, 851, 874, 1001, 1002, 851, 851,
+	851, 851, 874, 1004, 1005, 1193, 1007, 1008,
+	1008, 1008, 1007, 1008, 1016, 1008, 1008, 1008,
+	1009, 1008, 1016, 1010, 1010, 1010, 1009, 1010,
+	1015, 1010, 1010, 1010, 1011, 1010, 1015, 1012,
+	1012, 1012, 1012, 1014, 1013, 1194, 1018, 1195,
+	1020, 1021, 1021, 1021, 1020, 1021, 1047, 1021,
+	1021, 1021, 1022, 1021, 1047, 1023, 1023, 1023,
+	1022, 1023, 1046, 1023, 1023, 1023, 1024, 1023,
+	1046, 1025, 1025, 1025, 1024, 1025, 1045, 1025,
+	1025, 1025, 1026, 1043, 1025, 1045, 1027, 1027,
+	1027, 1027, 1042, 0, 1027, 1027, 1027, 1028,
+	1027, 1042, 1029, 1030, 1040, 1031, 1032, 1039,
+	1033, 1037, 1034, 1035, 1035, 1036, 1028, 1196,
+	1038, 1041, 1044, 1043, 1049, 1050, 1050, 1050,
+	1049, 1050, 1060, 1050, 1050, 1050, 1051, 1050,
+	1060, 1052, 1052, 1052, 1051, 1052, 1059, 1052,
+	1052, 1052, 1053, 1052, 1059, 1054, 1054, 1054,
+	1053, 1054, 1058, 1054, 1054, 1054, 1055, 1056,
+	1054, 1058, 1197, 1057, 1056, 1062, 1063, 1063,
+	1063, 1062, 1063, 1073, 1063, 1063, 1063, 1064,
+	1063, 1073, 1065, 1065, 1065, 1064, 1065, 1072,
+	1065, 1065, 1065, 1066, 1065, 1072, 1067, 1067,
+	1067, 1066, 1067, 1071, 1067, 1067, 1067, 1068,
+	1067, 1071, 1069, 1069, 1069, 1069, 1069, 1070,
+	1198, 1199, 1200, 1075, 1076, 1076, 1076, 1075,
+	1076, 1078, 1076, 1076, 1076, 1077, 1076, 1078,
+	1201, 1077, 1080, 1081, 1081, 1081, 1080, 1081,
+	1091, 1081, 1081, 1081, 1082, 1081, 1091, 1083,
+	1084, 1085, 0, 1086, 1087, 1088, 1089, 1090,
+	0, 1202, 1093, 1094, 0, 1095, 1096, 1097,
+	1203, 1099, 1100, 1101, 1102, 1103, 1204, 1105,
+	1106, 1106, 1106, 1105, 1106, 1111, 1106, 1106,
+	1106, 1107, 1106, 1111, 1108, 1108, 1108, 1107,
+	1108, 1110, 1109, 1108, 1108, 1108, 1108, 1110,
+	1205, 1113, 1114, 1114, 1114, 1113, 1114, 1119,
+	1115, 1114, 1114, 1114, 1114, 1119, 1116, 1116,
+	1116, 1116, 1118, 1117, 1116, 1116, 1116, 1116,
+	1118, 1206, 0, 1, 150, 1, 1, 158,
+	1125, 257, 13, 192, 13, 13, 202, 222,
+	1128, 236, 1129, 239, 0, 140, 140, 140,
+	168, 243, 244, 245, 246, 259, 248, 249,
+	250, 251, 252, 253, 254, 255, 256, 1123,
+	258, 0, 161, 168, 243, 244, 245, 246,
+	247, 248, 249, 250, 251, 252, 253, 254,
+	255, 256, 0, 1, 150, 1, 1, 158,
+	1120, 149, 1125, 257, 1, 1, 1125, 172,
+	172, 172, 1125, 173, 176, 176, 176, 191,
+	226, 0, 203, 206, 208, 209, 210, 211,
+	212, 213, 214, 215, 216, 217, 218, 219,
+	220, 221, 1125
 };
 
 static const short _zone_scanner_trans_actions[] = {
-	1918, 0, 5, 7, 510, 666, 666, 666,
+	1924, 0, 5, 7, 510, 666, 666, 666,
 	666, 666, 666, 666, 666, 666, 666, 666,
 	666, 666, 666, 666, 3, 0, 3, 0,
-	2046, 103, 681, 684, 41, 55, 53, 51,
+	2052, 103, 681, 684, 41, 55, 53, 51,
 	0, 57, 678, 103, 361, 0, 5, 7,
 	97, 97, 97, 97, 97, 97, 97, 97,
 	97, 97, 97, 97, 97, 97, 97, 3,
-	0, 1662, 1665, 2430, 2434, 0, 0, 0,
-	2426, 1665, 2438, 3592, 2438, 357, 0, 355,
-	5, 7, 0, 3, 0, 372, 357, 1647,
-	0, 5, 7, 1791, 0, 9, 1656, 359,
-	0, 5, 7, 0, 2418, 357, 357, 375,
-	0, 3182, 5, 7, 1906, 2134, 2134, 2134,
-	2134, 2134, 2134, 2134, 2134, 2134, 2134, 2134,
-	2134, 2134, 2134, 2134, 3, 0, 1650, 357,
-	372, 357, 3885, 103, 681, 684, 2138, 103,
-	1659, 0, 5, 7, 375, 0, 0, 0,
-	0, 0, 0, 1788, 3086, 3090, 3082, 1788,
-	3094, 3802, 3094, 0, 5, 7, 0, 0,
-	0, 0, 0, 0, 1761, 2942, 2946, 2938,
-	1761, 2950, 3757, 2950, 1758, 2926, 2930, 2922,
-	1758, 2934, 3752, 2934, 0, 0, 1719, 2718,
-	2722, 2714, 1719, 2726, 3687, 2726, 0, 0,
-	0, 1671, 2462, 2466, 2458, 1671, 2470, 3607,
-	2470, 0, 0, 0, 0, 0, 0, 1746,
-	2862, 2866, 2858, 1746, 2870, 3732, 2870, 0,
-	0, 0, 0, 1722, 2734, 2738, 2730, 1722,
-	2742, 3692, 2742, 0, 0, 0, 1743, 2846,
-	2850, 2842, 1743, 2854, 3727, 2854, 1728, 2766,
-	2770, 2762, 1728, 2774, 3702, 2774, 0, 0,
-	0, 0, 0, 1779, 3038, 3042, 3034, 1779,
-	3046, 3787, 3046, 0, 1782, 3054, 3058, 3050,
-	1782, 3062, 3792, 3062, 0, 0, 0, 0,
-	1680, 2510, 2514, 2506, 1680, 2518, 3622, 2518,
+	0, 1668, 1671, 2436, 2440, 0, 0, 0,
+	2432, 1671, 2444, 3598, 2444, 357, 0, 355,
+	5, 7, 0, 3, 0, 372, 357, 1653,
+	0, 5, 7, 1797, 0, 9, 1662, 359,
+	0, 5, 7, 0, 2424, 357, 357, 375,
+	0, 3188, 5, 7, 1912, 2140, 2140, 2140,
+	2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+	2140, 2140, 2140, 2140, 3, 0, 1656, 357,
+	372, 357, 3891, 103, 681, 684, 2144, 103,
+	1665, 0, 5, 7, 375, 0, 0, 0,
+	0, 0, 0, 1794, 3092, 3096, 3088, 1794,
+	3100, 3808, 3100, 0, 5, 7, 0, 0,
+	0, 0, 0, 0, 1767, 2948, 2952, 2944,
+	1767, 2956, 3763, 2956, 1764, 2932, 2936, 2928,
+	1764, 2940, 3758, 2940, 0, 0, 1725, 2724,
+	2728, 2720, 1725, 2732, 3693, 2732, 0, 0,
+	0, 1677, 2468, 2472, 2464, 1677, 2476, 3613,
+	2476, 0, 0, 0, 0, 0, 0, 1752,
+	2868, 2872, 2864, 1752, 2876, 3738, 2876, 0,
+	0, 0, 0, 1728, 2740, 2744, 2736, 1728,
+	2748, 3698, 2748, 0, 0, 0, 1749, 2852,
+	2856, 2848, 1749, 2860, 3733, 2860, 1734, 2772,
+	2776, 2768, 1734, 2780, 3708, 2780, 0, 0,
+	0, 0, 0, 1785, 3044, 3048, 3040, 1785,
+	3052, 3793, 3052, 0, 1788, 3060, 3064, 3056,
+	1788, 3068, 3798, 3068, 0, 0, 0, 0,
+	1686, 2516, 2520, 2512, 1686, 2524, 3628, 2524,
 	0, 0, 101, 672, 675, 669, 101, 0,
 	5, 7, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
 	0, 3, 0, 0, 0, 0, 0, 0,
-	0, 1734, 2798, 2802, 2794, 1734, 2806, 3712,
-	2806, 0, 0, 0, 1701, 2622, 2626, 2618,
-	1701, 2630, 3657, 2630, 1716, 2702, 2706, 2698,
-	1716, 2710, 3682, 2710, 0, 0, 0, 0,
-	0, 1770, 2990, 2994, 2986, 1770, 2998, 3772,
-	2998, 0, 1773, 3006, 3010, 3002, 1773, 3014,
-	3777, 3014, 0, 1707, 2654, 2658, 2650, 1707,
-	2662, 3667, 2662, 1776, 3022, 3026, 3018, 1776,
-	3030, 3782, 3030, 0, 0, 0, 0, 0,
-	1683, 2526, 2530, 2522, 1683, 2534, 3627, 2534,
-	1686, 2542, 2546, 2538, 1686, 2550, 3632, 2550,
-	0, 0, 0, 0, 0, 0, 1713, 2686,
-	2690, 2682, 1713, 2694, 3677, 2694, 0, 1767,
-	2974, 2978, 2970, 1767, 2982, 3767, 2982, 1668,
-	2446, 2450, 0, 2442, 1668, 2454, 3602, 2454,
-	0, 1740, 2830, 2834, 0, 2826, 1740, 2838,
-	3722, 2838, 1749, 2878, 2882, 0, 2874, 1749,
-	2886, 3737, 2886, 0, 0, 0, 0, 1752,
-	2894, 2898, 2890, 1752, 2902, 3742, 2902, 0,
-	0, 1677, 2494, 2498, 2490, 1677, 2502, 3617,
-	2502, 0, 0, 0, 1692, 2574, 2578, 2570,
-	1692, 2582, 3642, 2582, 0, 0, 0, 1737,
-	2814, 2818, 2810, 1737, 2822, 3717, 2822, 1698,
-	2606, 2610, 2602, 1698, 2614, 3652, 2614, 0,
-	0, 0, 0, 0, 1674, 2478, 2482, 2474,
-	1674, 2486, 3612, 2486, 0, 1764, 2958, 2962,
-	2954, 1764, 2966, 3762, 2966, 0, 1710, 2670,
-	2674, 2666, 1710, 2678, 3672, 2678, 0, 0,
-	0, 1731, 2782, 2786, 2778, 1731, 2790, 3707,
-	2790, 0, 0, 0, 0, 0, 1755, 2910,
-	2914, 2906, 1755, 2918, 3747, 2918, 0, 1689,
-	2558, 2562, 2554, 1689, 2566, 3637, 2566, 0,
-	0, 522, 510, 1922, 579, 2026, 2030, 41,
-	2022, 579, 2034, 3312, 2034, 0, 0, 1785,
-	3070, 3074, 3066, 1785, 3078, 3797, 3078, 0,
+	0, 1740, 2804, 2808, 2800, 1740, 2812, 3718,
+	2812, 0, 0, 0, 1707, 2628, 2632, 2624,
+	1707, 2636, 3663, 2636, 1722, 2708, 2712, 2704,
+	1722, 2716, 3688, 2716, 0, 0, 0, 0,
+	0, 1776, 2996, 3000, 2992, 1776, 3004, 3778,
+	3004, 0, 1779, 3012, 3016, 3008, 1779, 3020,
+	3783, 3020, 0, 1713, 2660, 2664, 2656, 1713,
+	2668, 3673, 2668, 1782, 3028, 3032, 3024, 1782,
+	3036, 3788, 3036, 0, 0, 0, 0, 0,
+	1689, 2532, 2536, 2528, 1689, 2540, 3633, 2540,
+	1692, 2548, 2552, 2544, 1692, 2556, 3638, 2556,
+	0, 0, 0, 0, 0, 0, 1719, 2692,
+	2696, 2688, 1719, 2700, 3683, 2700, 0, 1773,
+	2980, 2984, 2976, 1773, 2988, 3773, 2988, 1674,
+	2452, 2456, 0, 2448, 1674, 2460, 3608, 2460,
+	0, 1746, 2836, 2840, 0, 2832, 1746, 2844,
+	3728, 2844, 1755, 2884, 2888, 0, 2880, 1755,
+	2892, 3743, 2892, 0, 0, 0, 0, 1758,
+	2900, 2904, 2896, 1758, 2908, 3748, 2908, 0,
+	0, 1683, 2500, 2504, 2496, 1683, 2508, 3623,
+	2508, 0, 0, 0, 1698, 2580, 2584, 2576,
+	1698, 2588, 3648, 2588, 0, 0, 0, 1743,
+	2820, 2824, 2816, 1743, 2828, 3723, 2828, 1704,
+	2612, 2616, 2608, 1704, 2620, 3658, 2620, 0,
+	0, 0, 0, 0, 1680, 2484, 2488, 2480,
+	1680, 2492, 3618, 2492, 0, 1770, 2964, 2968,
+	2960, 1770, 2972, 3768, 2972, 0, 1716, 2676,
+	2680, 2672, 1716, 2684, 3678, 2684, 0, 0,
+	0, 1737, 2788, 2792, 2784, 1737, 2796, 3713,
+	2796, 0, 0, 0, 0, 0, 1761, 2916,
+	2920, 2912, 1761, 2924, 3753, 2924, 0, 1695,
+	2564, 2568, 2560, 1695, 2572, 3643, 2572, 0,
+	0, 522, 510, 1928, 579, 2032, 2036, 41,
+	2028, 579, 2040, 3318, 2040, 0, 0, 1791,
+	3076, 3080, 3072, 1791, 3084, 3803, 3084, 0,
 	5, 7, 3, 0, 0, 101, 672, 675,
 	669, 101, 0, 5, 7, 510, 99, 99,
 	99, 99, 99, 99, 99, 99, 99, 99,
 	99, 99, 99, 99, 99, 3, 0, 103,
 	681, 684, 41, 55, 53, 51, 0, 57,
-	678, 103, 2050, 41, 55, 53, 51, 0,
-	57, 600, 2074, 2078, 3322, 2070, 600, 95,
+	678, 103, 2056, 41, 55, 53, 51, 0,
+	57, 600, 2080, 2084, 3328, 2076, 600, 95,
 	91, 91, 91, 0, 0, 0, 0, 0,
 	0, 89, 37, 33, 462, 465, 459, 33,
-	0, 5, 7, 3, 0, 0, 3167, 468,
-	1870, 1874, 1862, 468, 0, 5, 7, 3,
-	0, 2050, 41, 55, 53, 51, 0, 57,
-	600, 2074, 2078, 3322, 2070, 600, 1898, 1882,
-	3142, 3152, 3132, 1882, 3813, 3157, 0, 5,
-	7, 3, 0, 372, 357, 2422, 1665, 2430,
-	2434, 3597, 1665, 3909, 2438, 3903, 2438, 0,
-	5, 7, 1830, 0, 5, 7, 375, 0,
+	0, 5, 7, 3, 0, 0, 3173, 468,
+	1876, 1880, 1868, 468, 0, 5, 7, 3,
+	0, 2056, 41, 55, 53, 51, 0, 57,
+	600, 2080, 2084, 3328, 2076, 600, 1904, 1888,
+	3148, 3158, 3138, 1888, 3819, 3163, 0, 5,
+	7, 3, 0, 372, 357, 2428, 1671, 2436,
+	2440, 3603, 1671, 3915, 2444, 3909, 2444, 0,
+	5, 7, 1836, 0, 5, 7, 375, 0,
 	0, 5, 7, 0, 5, 7, 0, 357,
-	375, 2410, 0, 0, 0, 0, 0, 81,
-	0, 0, 77, 1890, 33, 462, 465, 1866,
-	33, 3922, 468, 1870, 1874, 3122, 468, 0,
-	5, 7, 375, 0, 3172, 1882, 3142, 3152,
-	3819, 1882, 3915, 3157, 0, 5, 7, 1830,
-	1878, 483, 3137, 3147, 3127, 1878, 0, 5,
-	7, 0, 5, 7, 0, 0, 1704, 2638,
-	2642, 2634, 1704, 2646, 3662, 2646, 0, 0,
-	0, 1695, 2590, 2594, 2586, 1695, 2598, 3647,
-	2598, 0, 1725, 2750, 2754, 2746, 1725, 2758,
-	3697, 2758, 0, 5, 7, 0, 5, 7,
+	375, 2416, 0, 0, 0, 0, 0, 81,
+	0, 0, 77, 1896, 33, 462, 465, 1872,
+	33, 3928, 468, 1876, 1880, 3128, 468, 0,
+	5, 7, 375, 0, 3178, 1888, 3148, 3158,
+	3825, 1888, 3921, 3163, 0, 5, 7, 1836,
+	1884, 483, 3143, 3153, 3133, 1884, 0, 5,
+	7, 0, 5, 7, 0, 0, 1710, 2644,
+	2648, 2640, 1710, 2652, 3668, 2652, 0, 0,
+	0, 1701, 2596, 2600, 2592, 1701, 2604, 3653,
+	2604, 0, 1731, 2756, 2760, 2752, 1731, 2764,
+	3703, 2764, 0, 5, 7, 0, 5, 7,
 	0, 5, 7, 0, 5, 7, 486, 390,
-	3102, 11, 1838, 27, 1854, 25, 0, 429,
-	1842, 15, 17, 0, 414, 393, 13, 396,
-	405, 19, 19, 3107, 399, 402, 21, 426,
-	621, 65, 0, 0, 1, 618, 624, 2086,
-	69, 69, 627, 630, 2082, 71, 65, 0,
+	3108, 11, 1844, 27, 1860, 25, 0, 429,
+	1848, 15, 17, 0, 414, 393, 13, 396,
+	405, 19, 19, 3113, 399, 402, 21, 426,
+	621, 65, 0, 0, 1, 618, 624, 2092,
+	69, 69, 627, 630, 2088, 71, 65, 0,
 	0, 67, 624, 69, 69, 630, 71, 71,
 	75, 0, 5, 7, 3, 0, 513, 510,
-	3317, 0, 5, 7, 41, 55, 53, 51,
-	0, 57, 2094, 0, 384, 2050, 2038, 41,
+	3323, 0, 5, 7, 41, 55, 53, 51,
+	0, 57, 2100, 0, 384, 2056, 2044, 41,
 	55, 53, 51, 0, 57, 59, 591, 594,
-	3322, 3327, 59, 79, 0, 5, 7, 3,
-	0, 3332, 639, 2098, 15, 17, 0, 387,
-	23, 417, 420, 393, 13, 3112, 23, 0,
-	5, 7, 2102, 0, 396, 408, 19, 19,
+	3328, 3333, 59, 79, 0, 5, 7, 3,
+	0, 3338, 639, 2104, 15, 17, 0, 387,
+	23, 417, 420, 393, 13, 3118, 23, 0,
+	5, 7, 2108, 0, 396, 408, 19, 19,
 	399, 402, 21, 0, 5, 7, 3, 0,
-	642, 85, 651, 83, 645, 648, 3337, 83,
-	83, 657, 0, 5, 7, 3342, 654, 2106,
-	2110, 0, 0, 87, 15, 17, 0, 423,
-	1846, 1850, 393, 13, 3807, 423, 0, 5,
+	642, 85, 651, 83, 645, 648, 3343, 83,
+	83, 657, 0, 5, 7, 3348, 654, 2112,
+	2116, 0, 0, 87, 15, 17, 0, 423,
+	1852, 1856, 393, 13, 3813, 423, 0, 5,
 	7, 396, 411, 19, 19, 399, 402, 21,
-	1810, 0, 5, 7, 3, 0, 127, 119,
+	1816, 0, 5, 7, 3, 0, 127, 119,
 	121, 123, 0, 125, 0, 5, 7, 3,
-	0, 1, 366, 1, 327, 325, 1572, 1575,
-	1569, 325, 2382, 3587, 2382, 0, 5, 7,
+	0, 1, 366, 1, 327, 325, 1578, 1581,
+	1575, 325, 2388, 3593, 2388, 0, 5, 7,
 	0, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 3,
-	0, 1578, 1818, 1578, 241, 1194, 1197, 0,
-	0, 0, 1191, 241, 2214, 3377, 2214, 0,
-	0, 267, 1311, 1314, 1308, 267, 2266, 3442,
-	2266, 0, 0, 0, 0, 0, 323, 1563,
-	1566, 1560, 323, 2378, 3582, 2378, 0, 0,
-	0, 0, 0, 0, 305, 1482, 1485, 1479,
-	305, 2342, 3537, 2342, 303, 1473, 1476, 1470,
-	303, 2338, 3532, 2338, 0, 0, 277, 1356,
-	1359, 1353, 277, 2286, 3467, 2286, 0, 0,
-	0, 245, 1212, 1215, 1209, 245, 2222, 3387,
-	2222, 0, 0, 0, 0, 0, 0, 295,
-	1437, 1440, 1434, 295, 2322, 3512, 2322, 0,
-	0, 0, 0, 279, 1365, 1368, 1362, 279,
-	2290, 3472, 2290, 0, 0, 0, 293, 1428,
-	1431, 1425, 293, 2318, 3507, 2318, 283, 1383,
-	1386, 1380, 283, 2298, 3482, 2298, 0, 0,
-	0, 0, 0, 317, 1536, 1539, 1533, 317,
-	2366, 3567, 2366, 0, 319, 1545, 1548, 1542,
-	319, 2370, 3572, 2370, 0, 0, 0, 0,
-	251, 1239, 1242, 1236, 251, 2234, 3402, 2234,
+	0, 1584, 1824, 1584, 241, 1200, 1203, 0,
+	0, 0, 1197, 241, 2220, 3383, 2220, 0,
+	0, 267, 1317, 1320, 1314, 267, 2272, 3448,
+	2272, 0, 0, 0, 0, 0, 323, 1569,
+	1572, 1566, 323, 2384, 3588, 2384, 0, 0,
+	0, 0, 0, 0, 305, 1488, 1491, 1485,
+	305, 2348, 3543, 2348, 303, 1479, 1482, 1476,
+	303, 2344, 3538, 2344, 0, 0, 277, 1362,
+	1365, 1359, 277, 2292, 3473, 2292, 0, 0,
+	0, 245, 1218, 1221, 1215, 245, 2228, 3393,
+	2228, 0, 0, 0, 0, 0, 0, 295,
+	1443, 1446, 1440, 295, 2328, 3518, 2328, 0,
+	0, 0, 0, 279, 1371, 1374, 1368, 279,
+	2296, 3478, 2296, 0, 0, 0, 293, 1434,
+	1437, 1431, 293, 2324, 3513, 2324, 283, 1389,
+	1392, 1386, 283, 2304, 3488, 2304, 0, 0,
+	0, 0, 0, 317, 1542, 1545, 1539, 317,
+	2372, 3573, 2372, 0, 319, 1551, 1554, 1548,
+	319, 2376, 3578, 2376, 0, 0, 0, 0,
+	251, 1245, 1248, 1242, 251, 2240, 3408, 2240,
 	0, 0, 0, 0, 0, 0, 0, 287,
-	1401, 1404, 1398, 287, 2306, 3492, 2306, 0,
-	0, 0, 265, 1302, 1305, 1299, 265, 2262,
-	3437, 2262, 275, 1347, 1350, 1344, 275, 2282,
-	3462, 2282, 0, 0, 0, 0, 0, 311,
-	1509, 1512, 1506, 311, 2354, 3552, 2354, 0,
-	313, 1518, 1521, 1515, 313, 2358, 3557, 2358,
-	0, 269, 1320, 1323, 1317, 269, 2270, 3447,
-	2270, 315, 1527, 1530, 1524, 315, 2362, 3562,
-	2362, 0, 0, 0, 0, 0, 253, 1248,
-	1251, 1245, 253, 2238, 3407, 2238, 255, 1257,
-	1260, 1254, 255, 2242, 3412, 2242, 0, 0,
-	0, 0, 0, 0, 273, 1338, 1341, 1335,
-	273, 2278, 3457, 2278, 0, 309, 1500, 1503,
-	1497, 309, 2350, 3547, 2350, 243, 1203, 1206,
-	0, 1200, 243, 2218, 3382, 2218, 0, 291,
-	1419, 1422, 0, 1416, 291, 2314, 3502, 2314,
-	297, 1446, 1449, 0, 1443, 297, 2326, 3517,
-	2326, 0, 0, 0, 0, 299, 1455, 1458,
-	1452, 299, 2330, 3522, 2330, 0, 0, 249,
-	1230, 1233, 1227, 249, 2230, 3397, 2230, 0,
-	0, 0, 259, 1275, 1278, 1272, 259, 2250,
-	3422, 2250, 0, 0, 0, 289, 1410, 1413,
-	1407, 289, 2310, 3497, 2310, 263, 1293, 1296,
-	1290, 263, 2258, 3432, 2258, 0, 0, 0,
-	0, 0, 247, 1221, 1224, 1218, 247, 2226,
-	3392, 2226, 0, 307, 1491, 1494, 1488, 307,
-	2346, 3542, 2346, 0, 271, 1329, 1332, 1326,
-	271, 2274, 3452, 2274, 0, 0, 0, 285,
-	1392, 1395, 1389, 285, 2302, 3487, 2302, 0,
-	0, 0, 0, 0, 301, 1464, 1467, 1461,
-	301, 2334, 3527, 2334, 0, 257, 1266, 1269,
-	1263, 257, 2246, 3417, 2246, 0, 0, 510,
-	239, 1185, 1188, 41, 1182, 239, 2210, 3372,
-	2210, 0, 0, 321, 1554, 1557, 1551, 321,
-	2374, 3577, 2374, 0, 0, 0, 261, 1284,
-	1287, 1281, 261, 2254, 3427, 2254, 0, 281,
-	1374, 1377, 1371, 281, 2294, 3477, 2294, 341,
+	1407, 1410, 1404, 287, 2312, 3498, 2312, 0,
+	0, 0, 265, 1308, 1311, 1305, 265, 2268,
+	3443, 2268, 275, 1353, 1356, 1350, 275, 2288,
+	3468, 2288, 0, 0, 0, 0, 0, 311,
+	1515, 1518, 1512, 311, 2360, 3558, 2360, 0,
+	313, 1524, 1527, 1521, 313, 2364, 3563, 2364,
+	0, 269, 1326, 1329, 1323, 269, 2276, 3453,
+	2276, 315, 1533, 1536, 1530, 315, 2368, 3568,
+	2368, 0, 0, 0, 0, 0, 253, 1254,
+	1257, 1251, 253, 2244, 3413, 2244, 255, 1263,
+	1266, 1260, 255, 2248, 3418, 2248, 0, 0,
+	0, 0, 0, 0, 273, 1344, 1347, 1341,
+	273, 2284, 3463, 2284, 0, 309, 1506, 1509,
+	1503, 309, 2356, 3553, 2356, 243, 1209, 1212,
+	0, 1206, 243, 2224, 3388, 2224, 0, 291,
+	1425, 1428, 0, 1422, 291, 2320, 3508, 2320,
+	297, 1452, 1455, 0, 1449, 297, 2332, 3523,
+	2332, 0, 0, 0, 0, 299, 1461, 1464,
+	1458, 299, 2336, 3528, 2336, 0, 0, 249,
+	1236, 1239, 1233, 249, 2236, 3403, 2236, 0,
+	0, 0, 259, 1281, 1284, 1278, 259, 2256,
+	3428, 2256, 0, 0, 0, 289, 1416, 1419,
+	1413, 289, 2316, 3503, 2316, 263, 1299, 1302,
+	1296, 263, 2264, 3438, 2264, 0, 0, 0,
+	0, 0, 247, 1227, 1230, 1224, 247, 2232,
+	3398, 2232, 0, 307, 1497, 1500, 1494, 307,
+	2352, 3548, 2352, 0, 271, 1335, 1338, 1332,
+	271, 2280, 3458, 2280, 0, 0, 0, 285,
+	1398, 1401, 1395, 285, 2308, 3493, 2308, 0,
+	0, 0, 0, 0, 301, 1470, 1473, 1467,
+	301, 2340, 3533, 2340, 0, 257, 1272, 1275,
+	1269, 257, 2252, 3423, 2252, 0, 0, 510,
+	239, 1191, 1194, 41, 1188, 239, 2216, 3378,
+	2216, 0, 0, 321, 1560, 1563, 1557, 321,
+	2380, 3583, 2380, 0, 0, 0, 261, 1290,
+	1293, 1287, 261, 2260, 3433, 2260, 0, 281,
+	1380, 1383, 1377, 281, 2300, 3483, 2300, 341,
 	0, 5, 7, 3, 0, 516, 510, 49,
-	585, 588, 41, 582, 49, 2198, 0, 5,
+	585, 588, 41, 582, 49, 2204, 0, 5,
 	7, 115, 3, 0, 117, 0, 5, 7,
-	3, 0, 717, 1814, 717, 0, 5, 7,
-	3, 0, 510, 510, 363, 1798, 1802, 41,
-	1, 1794, 363, 0, 5, 7, 115, 3,
+	3, 0, 717, 1820, 717, 0, 5, 7,
+	3, 0, 510, 510, 363, 1804, 1808, 41,
+	1, 1800, 363, 0, 5, 7, 115, 3,
 	0, 117, 0, 5, 7, 3, 0, 717,
-	1814, 717, 49, 585, 588, 582, 49, 347,
+	1820, 717, 49, 585, 588, 582, 49, 347,
 	510, 0, 0, 0, 0, 0, 543, 41,
 	0, 0, 726, 0, 729, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0,
 	735, 0, 0, 0, 0, 0, 0, 0,
-	0, 747, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 750,
-	0, 0, 0, 0, 0, 0, 0, 0,
-	753, 0, 0, 0, 0, 0, 0, 0,
-	756, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 759, 0, 0, 762, 0,
-	0, 0, 0, 0, 0, 723, 0, 0,
-	0, 0, 0, 732, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 738,
-	0, 0, 741, 0, 0, 744, 349, 510,
-	0, 0, 0, 0, 0, 0, 555, 41,
-	0, 0, 0, 0, 0, 783, 0, 0,
-	0, 0, 0, 0, 0, 0, 786, 0,
-	0, 0, 780, 0, 0, 774, 0, 0,
-	0, 777, 0, 0, 792, 0, 0, 0,
-	771, 0, 0, 765, 0, 0, 0, 768,
-	0, 0, 789, 690, 687, 2150, 105, 489,
-	492, 489, 39, 498, 501, 495, 39, 0,
-	5, 7, 489, 3, 0, 39, 498, 501,
-	495, 39, 519, 0, 5, 7, 510, 3,
-	0, 47, 573, 576, 41, 570, 47, 0,
-	5, 7, 510, 3, 0, 2042, 47, 573,
-	576, 41, 55, 53, 51, 0, 57, 570,
-	47, 0, 5, 7, 510, 3, 0, 47,
-	573, 576, 41, 55, 53, 51, 0, 57,
+	0, 0, 747, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	750, 0, 0, 0, 0, 0, 0, 0,
+	0, 753, 0, 0, 0, 0, 0, 0,
+	756, 0, 0, 759, 0, 0, 0, 0,
+	0, 0, 0, 762, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 765, 0,
+	0, 768, 0, 0, 0, 0, 0, 0,
+	723, 0, 0, 0, 0, 0, 732, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 738, 0, 0, 741, 0, 0,
+	744, 349, 510, 0, 0, 0, 0, 0,
+	0, 555, 41, 0, 0, 0, 0, 0,
+	789, 0, 0, 0, 0, 0, 0, 0,
+	0, 792, 0, 0, 0, 786, 0, 0,
+	780, 0, 0, 0, 783, 0, 0, 798,
+	0, 0, 0, 777, 0, 0, 771, 0,
+	0, 0, 774, 0, 0, 795, 690, 687,
+	2156, 105, 489, 492, 489, 39, 498, 501,
+	495, 39, 0, 5, 7, 489, 3, 0,
+	39, 498, 501, 495, 39, 519, 0, 5,
+	7, 510, 3, 0, 47, 573, 576, 41,
 	570, 47, 0, 5, 7, 510, 3, 0,
-	47, 573, 576, 41, 55, 53, 51, 0,
-	57, 570, 47, 0, 5, 7, 510, 3,
-	0, 567, 41, 55, 53, 51, 0, 57,
-	2050, 41, 55, 53, 51, 0, 57, 2054,
-	3322, 2050, 41, 55, 53, 51, 0, 57,
-	597, 2062, 2066, 3322, 2058, 597, 2050, 41,
-	55, 53, 51, 0, 57, 597, 2062, 2066,
-	3322, 2058, 597, 2050, 41, 55, 53, 51,
-	0, 57, 597, 2062, 2066, 3322, 2058, 597,
-	432, 31, 447, 450, 444, 31, 432, 0,
-	5, 7, 3, 0, 441, 489, 39, 498,
-	501, 495, 39, 0, 5, 7, 489, 3,
-	0, 492, 510, 45, 561, 564, 41, 558,
-	45, 0, 5, 7, 489, 3, 0, 492,
-	2090, 636, 31, 447, 450, 444, 31, 1858,
-	3117, 1858, 432, 0, 5, 7, 3, 0,
-	633, 1806, 633, 687, 2166, 105, 1638, 2386,
-	329, 1584, 1587, 41, 1581, 329, 0, 5,
-	7, 510, 0, 0, 3, 0, 333, 1602,
-	1605, 41, 1599, 333, 0, 5, 7, 3307,
-	3, 0, 525, 1954, 1958, 0, 41, 1950,
-	525, 0, 5, 7, 3, 0, 0, 5,
-	7, 3, 0, 510, 331, 1593, 1596, 41,
-	1590, 331, 0, 5, 7, 510, 0, 0,
-	3, 0, 335, 1611, 1614, 41, 1608, 335,
-	0, 5, 7, 3307, 3, 0, 528, 1966,
-	1970, 0, 41, 1962, 528, 0, 5, 7,
-	3, 0, 0, 5, 7, 3, 0, 0,
-	3302, 3897, 531, 1978, 1982, 0, 41, 531,
-	1974, 531, 3282, 3861, 3282, 0, 5, 7,
-	3302, 3, 0, 1635, 1822, 1635, 534, 1990,
-	1994, 0, 41, 534, 1986, 534, 3287, 3867,
-	3287, 0, 5, 7, 3302, 3, 0, 1822,
-	1635, 537, 2002, 2006, 0, 41, 537, 1998,
-	537, 3292, 3873, 3292, 0, 5, 7, 3302,
-	3, 0, 1822, 1635, 540, 2014, 2018, 0,
-	41, 2010, 540, 3297, 3879, 3297, 0, 5,
-	7, 3, 0, 1822, 1635, 1946, 3272, 3277,
-	3187, 3267, 1946, 3855, 3950, 3855, 507, 1942,
-	3257, 3262, 3187, 1942, 3252, 1942, 3849, 3943,
-	3849, 507, 1938, 3242, 3247, 3187, 1938, 3237,
-	1938, 3843, 3936, 3843, 507, 1934, 3227, 3232,
-	3187, 1934, 3222, 1934, 3837, 3929, 3837, 507,
-	339, 1629, 1632, 1626, 339, 1930, 3212, 3217,
-	3187, 3207, 1930, 507, 337, 1620, 1623, 1617,
-	337, 1926, 3197, 3202, 3187, 3192, 1926, 507,
-	510, 45, 561, 564, 41, 558, 45, 0,
-	5, 7, 510, 3, 0, 45, 561, 564,
-	41, 558, 45, 0, 5, 7, 510, 3,
-	0, 45, 561, 564, 41, 558, 45, 0,
-	5, 7, 489, 3, 0, 492, 510, 45,
-	561, 564, 41, 558, 45, 0, 5, 7,
-	510, 3, 0, 45, 561, 564, 41, 558,
-	45, 432, 0, 5, 7, 3, 0, 31,
-	447, 450, 444, 31, 432, 0, 5, 7,
+	2048, 47, 573, 576, 41, 55, 53, 51,
+	0, 57, 570, 47, 0, 5, 7, 510,
+	3, 0, 47, 573, 576, 41, 55, 53,
+	51, 0, 57, 570, 47, 0, 5, 7,
+	510, 3, 0, 47, 573, 576, 41, 55,
+	53, 51, 0, 57, 570, 47, 0, 5,
+	7, 510, 3, 0, 567, 41, 55, 53,
+	51, 0, 57, 2056, 41, 55, 53, 51,
+	0, 57, 2060, 3328, 2056, 41, 55, 53,
+	51, 0, 57, 597, 2068, 2072, 3328, 2064,
+	597, 2056, 41, 55, 53, 51, 0, 57,
+	597, 2068, 2072, 3328, 2064, 597, 2056, 41,
+	55, 53, 51, 0, 57, 597, 2068, 2072,
+	3328, 2064, 597, 432, 31, 447, 450, 444,
+	31, 432, 0, 5, 7, 3, 0, 441,
+	489, 39, 498, 501, 495, 39, 0, 5,
+	7, 489, 3, 0, 492, 510, 45, 561,
+	564, 41, 558, 45, 0, 5, 7, 489,
+	3, 0, 492, 2096, 636, 31, 447, 450,
+	444, 31, 1864, 3123, 1864, 432, 0, 5,
+	7, 3, 0, 633, 1812, 633, 687, 2172,
+	105, 1644, 2392, 329, 1590, 1593, 41, 1587,
+	329, 0, 5, 7, 510, 0, 0, 3,
+	0, 333, 1608, 1611, 41, 1605, 333, 0,
+	5, 7, 3313, 3, 0, 525, 1960, 1964,
+	0, 41, 1956, 525, 0, 5, 7, 3,
+	0, 0, 5, 7, 3, 0, 510, 331,
+	1599, 1602, 41, 1596, 331, 0, 5, 7,
+	510, 0, 0, 3, 0, 335, 1617, 1620,
+	41, 1614, 335, 0, 5, 7, 3313, 3,
+	0, 528, 1972, 1976, 0, 41, 1968, 528,
+	0, 5, 7, 3, 0, 0, 5, 7,
+	3, 0, 0, 3308, 3903, 531, 1984, 1988,
+	0, 41, 531, 1980, 531, 3288, 3867, 3288,
+	0, 5, 7, 3308, 3, 0, 1641, 1828,
+	1641, 534, 1996, 2000, 0, 41, 534, 1992,
+	534, 3293, 3873, 3293, 0, 5, 7, 3308,
+	3, 0, 1828, 1641, 537, 2008, 2012, 0,
+	41, 537, 2004, 537, 3298, 3879, 3298, 0,
+	5, 7, 3308, 3, 0, 1828, 1641, 540,
+	2020, 2024, 0, 41, 2016, 540, 3303, 3885,
+	3303, 0, 5, 7, 3, 0, 1828, 1641,
+	1952, 3278, 3283, 3193, 3273, 1952, 3861, 3956,
+	3861, 507, 1948, 3263, 3268, 3193, 1948, 3258,
+	1948, 3855, 3949, 3855, 507, 1944, 3248, 3253,
+	3193, 1944, 3243, 1944, 3849, 3942, 3849, 507,
+	1940, 3233, 3238, 3193, 1940, 3228, 1940, 3843,
+	3935, 3843, 507, 339, 1635, 1638, 1632, 339,
+	1936, 3218, 3223, 3193, 3213, 1936, 507, 337,
+	1626, 1629, 1623, 337, 1932, 3203, 3208, 3193,
+	3198, 1932, 507, 510, 45, 561, 564, 41,
+	558, 45, 0, 5, 7, 510, 3, 0,
+	45, 561, 564, 41, 558, 45, 0, 5,
+	7, 510, 3, 0, 45, 561, 564, 41,
+	558, 45, 0, 5, 7, 489, 3, 0,
+	492, 510, 45, 561, 564, 41, 558, 45,
+	0, 5, 7, 510, 3, 0, 45, 561,
+	564, 41, 558, 45, 432, 0, 5, 7,
 	3, 0, 31, 447, 450, 444, 31, 432,
 	0, 5, 7, 3, 0, 31, 447, 450,
-	444, 31, 0, 5, 7, 489, 3, 0,
-	492, 353, 0, 5, 7, 3, 0, 510,
+	444, 31, 432, 0, 5, 7, 3, 0,
+	31, 447, 450, 444, 31, 0, 5, 7,
+	489, 3, 0, 492, 353, 0, 5, 7,
+	3, 0, 510, 45, 561, 564, 41, 558,
+	45, 0, 5, 7, 351, 3, 0, 0,
+	5, 7, 3, 0, 129, 1, 711, 0,
+	699, 5, 7, 702, 705, 3, 0, 1,
+	366, 1, 111, 113, 0, 2148, 687, 105,
+	107, 510, 708, 2196, 2200, 41, 2192, 708,
+	2188, 3373, 2188, 0, 687, 105, 109, 510,
 	45, 561, 564, 41, 558, 45, 0, 5,
 	7, 351, 3, 0, 0, 5, 7, 3,
-	0, 129, 1, 711, 0, 699, 5, 7,
-	702, 705, 3, 0, 1, 366, 1, 111,
-	113, 0, 2142, 687, 105, 107, 510, 708,
-	2190, 2194, 41, 2186, 708, 2182, 3367, 2182,
-	0, 687, 105, 109, 510, 45, 561, 564,
-	41, 558, 45, 0, 5, 7, 351, 3,
-	0, 0, 5, 7, 3, 0, 510, 43,
-	549, 552, 41, 546, 43, 714, 0, 5,
-	7, 115, 3, 0, 117, 0, 5, 7,
-	3, 0, 1, 366, 1, 510, 43, 549,
-	552, 41, 546, 43, 0, 5, 7, 510,
-	3, 0, 43, 549, 552, 41, 546, 43,
-	0, 5, 7, 115, 3, 0, 117, 0,
-	5, 7, 3, 0, 1, 366, 1, 510,
-	43, 549, 552, 41, 546, 43, 795, 0,
-	5, 7, 147, 149, 151, 153, 3, 0,
-	0, 5, 7, 3, 0, 1910, 510, 43,
-	549, 552, 41, 546, 43, 0, 5, 7,
-	0, 3, 0, 2206, 0, 5, 7, 0,
-	5, 7, 0, 5, 7, 1, 3, 0,
-	366, 1, 3, 0, 366, 1, 3, 0,
-	366, 1, 798, 129, 0, 5, 7, 3,
 	0, 510, 43, 549, 552, 41, 546, 43,
-	2146, 0, 5, 7, 687, 3, 0, 3352,
-	105, 693, 2158, 2162, 693, 2158, 2162, 693,
-	2158, 2162, 2150, 2154, 693, 3357, 2150, 2154,
-	693, 3357, 2150, 2154, 693, 3357, 2150, 0,
+	714, 0, 5, 7, 115, 3, 0, 117,
+	0, 5, 7, 3, 0, 1, 366, 1,
+	510, 43, 549, 552, 41, 546, 43, 0,
+	5, 7, 510, 3, 0, 43, 549, 552,
+	41, 546, 43, 0, 5, 7, 115, 3,
+	0, 117, 0, 5, 7, 3, 0, 1,
+	366, 1, 510, 43, 549, 552, 41, 546,
+	43, 801, 0, 5, 7, 147, 149, 151,
+	153, 3, 0, 0, 5, 7, 3, 0,
+	1916, 510, 43, 549, 552, 41, 546, 43,
+	0, 5, 7, 0, 3, 0, 2212, 0,
+	5, 7, 0, 5, 7, 0, 5, 7,
+	1, 3, 0, 366, 1, 3, 0, 366,
+	1, 3, 0, 366, 1, 804, 129, 0,
 	5, 7, 3, 0, 510, 43, 549, 552,
-	41, 546, 43, 0, 5, 7, 687, 3,
-	0, 105, 696, 2174, 2178, 696, 2174, 2178,
-	696, 2174, 2178, 2166, 2170, 696, 3362, 2166,
-	2170, 696, 3362, 2166, 2170, 696, 3362, 2166,
-	0, 5, 7, 3, 0, 510, 43, 549,
-	552, 41, 546, 43, 0, 5, 7, 489,
-	3, 0, 39, 498, 501, 39, 498, 501,
-	39, 498, 501, 492, 495, 39, 1902, 492,
-	495, 39, 1902, 492, 495, 39, 1902, 492,
-	801, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0,
-	155, 807, 810, 0, 0, 0, 804, 155,
-	0, 5, 7, 351, 3, 0, 0, 5,
-	7, 3, 0, 510, 43, 549, 552, 41,
-	546, 43, 0, 5, 7, 510, 3, 0,
-	47, 573, 576, 41, 570, 47, 615, 0,
-	5, 7, 603, 3, 0, 63, 609, 612,
-	61, 606, 63, 0, 5, 7, 603, 3,
-	0, 63, 609, 612, 61, 606, 63, 0,
-	5, 7, 510, 3, 0, 45, 561, 564,
-	41, 558, 45, 0, 5, 7, 489, 3,
-	0, 39, 498, 501, 495, 39, 0, 5,
-	7, 129, 3, 0, 1, 0, 0, 181,
-	924, 927, 921, 181, 0, 0, 0, 175,
-	897, 900, 894, 175, 0, 195, 987, 990,
-	984, 195, 0, 0, 0, 0, 0, 237,
-	1176, 1179, 1173, 237, 0, 0, 0, 0,
-	0, 0, 219, 1095, 1098, 1092, 219, 217,
-	1086, 1089, 1083, 217, 0, 0, 191, 969,
-	972, 966, 191, 0, 0, 0, 159, 825,
-	828, 822, 159, 0, 0, 0, 0, 0,
-	0, 209, 1050, 1053, 1047, 209, 0, 0,
-	0, 0, 193, 978, 981, 975, 193, 0,
-	0, 0, 207, 1041, 1044, 1038, 207, 197,
-	996, 999, 993, 197, 0, 0, 0, 0,
-	0, 231, 1149, 1152, 1146, 231, 0, 233,
-	1158, 1161, 1155, 233, 0, 0, 0, 0,
-	165, 852, 855, 849, 165, 0, 0, 0,
-	0, 0, 0, 0, 201, 1014, 1017, 1011,
-	201, 0, 0, 0, 179, 915, 918, 912,
-	179, 189, 960, 963, 957, 189, 0, 0,
-	0, 0, 0, 225, 1122, 1125, 1119, 225,
-	0, 227, 1131, 1134, 1128, 227, 0, 183,
-	933, 936, 930, 183, 229, 1140, 1143, 1137,
-	229, 0, 0, 0, 0, 0, 167, 861,
-	864, 858, 167, 169, 870, 873, 867, 169,
-	0, 0, 0, 0, 0, 0, 187, 951,
-	954, 948, 187, 0, 223, 1113, 1116, 1110,
-	223, 157, 816, 819, 0, 813, 157, 0,
-	205, 1032, 1035, 0, 1029, 205, 211, 1059,
-	1062, 0, 1056, 211, 0, 0, 0, 0,
-	213, 1068, 1071, 1065, 213, 0, 0, 163,
-	843, 846, 840, 163, 0, 0, 0, 173,
-	888, 891, 885, 173, 0, 0, 0, 203,
-	1023, 1026, 1020, 203, 177, 906, 909, 903,
-	177, 0, 0, 0, 0, 0, 161, 834,
-	837, 831, 161, 0, 221, 1104, 1107, 1101,
-	221, 0, 185, 942, 945, 939, 185, 0,
-	0, 0, 199, 1005, 1008, 1002, 199, 0,
-	0, 0, 0, 0, 215, 1077, 1080, 1074,
-	215, 0, 171, 879, 882, 876, 171, 0,
-	0, 1914, 510, 45, 561, 564, 41, 558,
-	45, 0, 0, 235, 1167, 1170, 1164, 235,
-	489, 504, 1, 510, 45, 561, 564, 41,
-	558, 45, 0, 5, 7, 510, 3, 0,
+	41, 546, 43, 2152, 0, 5, 7, 687,
+	3, 0, 3358, 105, 693, 2164, 2168, 693,
+	2164, 2168, 693, 2164, 2168, 2156, 2160, 693,
+	3363, 2156, 2160, 693, 3363, 2156, 2160, 693,
+	3363, 2156, 0, 5, 7, 3, 0, 510,
 	43, 549, 552, 41, 546, 43, 0, 5,
-	7, 351, 3, 0, 0, 5, 7, 3,
-	0, 129, 1, 129, 1, 510, 43, 549,
+	7, 687, 3, 0, 105, 696, 2180, 2184,
+	696, 2180, 2184, 696, 2180, 2184, 2172, 2176,
+	696, 3368, 2172, 2176, 696, 3368, 2172, 2176,
+	696, 3368, 2172, 0, 5, 7, 3, 0,
+	510, 43, 549, 552, 41, 546, 43, 0,
+	5, 7, 489, 3, 0, 39, 498, 501,
+	39, 498, 501, 39, 498, 501, 492, 495,
+	39, 1908, 492, 495, 39, 1908, 492, 495,
+	39, 1908, 492, 807, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 155, 813, 816, 0, 0,
+	0, 810, 155, 0, 5, 7, 351, 3,
+	0, 0, 5, 7, 3, 0, 510, 43,
+	549, 552, 41, 546, 43, 0, 5, 7,
+	510, 3, 0, 47, 573, 576, 41, 570,
+	47, 615, 0, 5, 7, 603, 3, 0,
+	63, 609, 612, 61, 606, 63, 0, 5,
+	7, 603, 3, 0, 63, 609, 612, 61,
+	606, 63, 0, 5, 7, 510, 3, 0,
+	45, 561, 564, 41, 558, 45, 0, 5,
+	7, 489, 3, 0, 39, 498, 501, 495,
+	39, 0, 5, 7, 129, 3, 0, 1,
+	0, 0, 181, 930, 933, 927, 181, 0,
+	0, 0, 175, 903, 906, 900, 175, 0,
+	195, 993, 996, 990, 195, 0, 0, 0,
+	0, 0, 237, 1182, 1185, 1179, 237, 0,
+	0, 0, 0, 0, 0, 219, 1101, 1104,
+	1098, 219, 217, 1092, 1095, 1089, 217, 0,
+	0, 191, 975, 978, 972, 191, 0, 0,
+	0, 159, 831, 834, 828, 159, 0, 0,
+	0, 0, 0, 0, 209, 1056, 1059, 1053,
+	209, 0, 0, 0, 0, 193, 984, 987,
+	981, 193, 0, 0, 0, 207, 1047, 1050,
+	1044, 207, 197, 1002, 1005, 999, 197, 0,
+	0, 0, 0, 0, 231, 1155, 1158, 1152,
+	231, 0, 233, 1164, 1167, 1161, 233, 0,
+	0, 0, 0, 165, 858, 861, 855, 165,
+	0, 0, 0, 0, 0, 0, 0, 201,
+	1020, 1023, 1017, 201, 0, 0, 0, 179,
+	921, 924, 918, 179, 189, 966, 969, 963,
+	189, 0, 0, 0, 0, 0, 225, 1128,
+	1131, 1125, 225, 0, 227, 1137, 1140, 1134,
+	227, 0, 183, 939, 942, 936, 183, 229,
+	1146, 1149, 1143, 229, 0, 0, 0, 0,
+	0, 167, 867, 870, 864, 167, 169, 876,
+	879, 873, 169, 0, 0, 0, 0, 0,
+	0, 187, 957, 960, 954, 187, 0, 223,
+	1119, 1122, 1116, 223, 157, 822, 825, 0,
+	819, 157, 0, 205, 1038, 1041, 0, 1035,
+	205, 211, 1065, 1068, 0, 1062, 211, 0,
+	0, 0, 0, 213, 1074, 1077, 1071, 213,
+	0, 0, 163, 849, 852, 846, 163, 0,
+	0, 0, 173, 894, 897, 891, 173, 0,
+	0, 0, 203, 1029, 1032, 1026, 203, 177,
+	912, 915, 909, 177, 0, 0, 0, 0,
+	0, 161, 840, 843, 837, 161, 0, 221,
+	1110, 1113, 1107, 221, 0, 185, 948, 951,
+	945, 185, 0, 0, 0, 199, 1011, 1014,
+	1008, 199, 0, 0, 0, 0, 0, 215,
+	1083, 1086, 1080, 215, 0, 171, 885, 888,
+	882, 171, 0, 0, 1920, 510, 45, 561,
+	564, 41, 558, 45, 0, 0, 235, 1173,
+	1176, 1170, 235, 489, 504, 1, 510, 45,
+	561, 564, 41, 558, 45, 0, 5, 7,
+	510, 3, 0, 43, 549, 552, 41, 546,
+	43, 0, 5, 7, 351, 3, 0, 0,
+	5, 7, 3, 0, 129, 1, 129, 1,
+	510, 43, 549, 552, 41, 546, 43, 0,
+	5, 7, 510, 3, 0, 43, 549, 552,
+	41, 546, 43, 0, 5, 7, 510, 3,
+	0, 45, 561, 564, 41, 558, 45, 0,
+	5, 7, 29, 435, 3, 0, 31, 447,
+	450, 444, 31, 720, 0, 5, 7, 438,
+	3, 0, 133, 135, 0, 137, 139, 0,
+	141, 0, 143, 145, 0, 453, 131, 1,
+	0, 0, 117, 115, 510, 43, 549, 552,
+	41, 546, 43, 0, 5, 7, 510, 3,
+	0, 43, 549, 552, 41, 546, 43, 0,
+	5, 7, 510, 3, 0, 45, 561, 564,
+	41, 558, 45, 0, 5, 7, 29, 435,
+	3, 0, 441, 117, 115, 510, 43, 549,
 	552, 41, 546, 43, 0, 5, 7, 510,
 	3, 0, 43, 549, 552, 41, 546, 43,
-	0, 5, 7, 510, 3, 0, 45, 561,
-	564, 41, 558, 45, 0, 5, 7, 29,
-	435, 3, 0, 31, 447, 450, 444, 31,
-	720, 0, 5, 7, 438, 3, 0, 133,
-	135, 0, 137, 139, 0, 141, 0, 143,
-	145, 0, 453, 131, 1, 0, 0, 117,
-	115, 510, 43, 549, 552, 41, 546, 43,
 	0, 5, 7, 510, 3, 0, 43, 549,
-	552, 41, 546, 43, 0, 5, 7, 510,
-	3, 0, 45, 561, 564, 41, 558, 45,
-	0, 5, 7, 29, 435, 3, 0, 441,
-	117, 115, 510, 43, 549, 552, 41, 546,
-	43, 0, 5, 7, 510, 3, 0, 43,
-	549, 552, 41, 546, 43, 0, 5, 7,
-	510, 3, 0, 43, 549, 552, 41, 546,
-	43, 0, 5, 7, 115, 3, 0, 117,
-	0, 5, 7, 3, 0, 1, 366, 1,
-	510, 45, 561, 564, 41, 558, 45, 0,
-	5, 7, 687, 3, 0, 2150, 105, 510,
+	552, 41, 546, 43, 0, 5, 7, 115,
+	3, 0, 117, 0, 5, 7, 3, 0,
+	1, 366, 1, 510, 45, 561, 564, 41,
+	558, 45, 0, 5, 7, 687, 3, 0,
+	2156, 105, 510, 45, 561, 564, 41, 558,
+	45, 0, 5, 7, 1650, 3, 0, 117,
+	115, 117, 2208, 345, 115, 117, 115, 117,
+	2412, 2408, 1647, 117, 2404, 343, 115, 117,
+	2396, 1647, 117, 343, 115, 117, 2400, 510,
 	45, 561, 564, 41, 558, 45, 0, 5,
-	7, 1644, 3, 0, 117, 115, 117, 2202,
-	345, 115, 117, 115, 117, 2406, 2402, 1641,
-	117, 2398, 343, 115, 117, 2390, 1641, 117,
-	343, 115, 117, 2394, 510, 45, 561, 564,
-	41, 558, 45, 0, 5, 7, 510, 3,
-	0, 45, 561, 564, 41, 558, 45, 73,
-	0, 5, 7, 3, 0, 1, 510, 43,
-	549, 552, 41, 546, 43, 432, 0, 5,
-	7, 3, 0, 31, 447, 450, 444, 31,
-	73, 0, 5, 7, 3, 0, 1, 480,
-	35, 0, 474, 477, 456, 471, 35, 35,
-	357, 378, 381, 2414, 456, 369, 35, 1826,
-	1653, 1894, 35, 378, 381, 2130, 2130, 2130,
-	2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
-	2130, 2130, 2130, 2130, 369, 35, 3162, 3177,
-	3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347,
-	3347, 3347, 3347, 3347, 3347, 3347, 3347, 1886,
-	663, 93, 2122, 2126, 2114, 660, 93, 2118,
-	663, 378, 381, 369, 35, 378, 381, 3098,
-	35, 35, 378, 381, 35, 1653, 3825, 3831,
-	3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891,
-	3891, 3891, 3891, 3891, 3891, 3891, 3891, 1834
+	7, 510, 3, 0, 45, 561, 564, 41,
+	558, 45, 73, 0, 5, 7, 3, 0,
+	1, 510, 43, 549, 552, 41, 546, 43,
+	432, 0, 5, 7, 3, 0, 31, 447,
+	450, 444, 31, 73, 0, 5, 7, 3,
+	0, 1, 480, 35, 0, 474, 477, 456,
+	471, 35, 35, 357, 378, 381, 2420, 456,
+	369, 35, 1832, 1659, 1900, 35, 378, 381,
+	2136, 2136, 2136, 2136, 2136, 2136, 2136, 2136,
+	2136, 2136, 2136, 2136, 2136, 2136, 2136, 369,
+	35, 3168, 3183, 3353, 3353, 3353, 3353, 3353,
+	3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
+	3353, 3353, 1892, 663, 93, 2128, 2132, 2120,
+	660, 93, 2124, 663, 378, 381, 369, 35,
+	378, 381, 3104, 35, 35, 378, 381, 35,
+	1659, 3831, 3837, 3897, 3897, 3897, 3897, 3897,
+	3897, 3897, 3897, 3897, 3897, 3897, 3897, 3897,
+	3897, 3897, 1840
 };
 
 static const short _zone_scanner_eof_actions[] = {
-	0, 1918, 2046, 361, 1662, 355, 1647, 9,
-	9, 355, 355, 1647, 1647, 3182, 3885, 1659,
-	361, 361, 1662, 1647, 361, 361, 361, 361,
-	361, 1662, 1662, 361, 361, 1662, 361, 361,
-	361, 1662, 361, 361, 361, 361, 1662, 361,
-	361, 361, 1662, 361, 361, 361, 1662, 1662,
-	361, 361, 361, 361, 1662, 361, 1662, 361,
-	361, 361, 361, 1662, 361, 361, 361, 361,
-	361, 361, 361, 361, 361, 361, 1662, 361,
-	361, 1662, 1662, 361, 361, 1662, 361, 1662,
-	361, 1662, 1662, 361, 361, 361, 361, 1662,
-	1662, 361, 361, 361, 361, 1662, 361, 1662,
-	1662, 361, 1662, 1662, 361, 361, 361, 361,
-	1662, 361, 361, 1662, 361, 1662, 361, 361,
-	361, 1662, 1662, 361, 361, 1662, 361, 1662,
-	361, 1662, 361, 361, 361, 1662, 361, 361,
-	361, 1662, 361, 1662, 361, 361, 522, 1922,
-	361, 361, 1662, 361, 1918, 361, 361, 522,
-	2046, 2046, 2046, 2046, 361, 9, 95, 95,
+	0, 1924, 2052, 361, 1668, 355, 1653, 9,
+	9, 355, 355, 1653, 1653, 3188, 3891, 1665,
+	361, 361, 1668, 1653, 361, 361, 361, 361,
+	361, 1668, 1668, 361, 361, 1668, 361, 361,
+	361, 1668, 361, 361, 361, 361, 1668, 361,
+	361, 361, 1668, 361, 361, 361, 1668, 1668,
+	361, 361, 361, 361, 1668, 361, 1668, 361,
+	361, 361, 361, 1668, 361, 361, 361, 361,
+	361, 361, 361, 361, 361, 361, 1668, 361,
+	361, 1668, 1668, 361, 361, 1668, 361, 1668,
+	361, 1668, 1668, 361, 361, 361, 361, 1668,
+	1668, 361, 361, 361, 361, 1668, 361, 1668,
+	1668, 361, 1668, 1668, 361, 361, 361, 361,
+	1668, 361, 361, 1668, 361, 1668, 361, 361,
+	361, 1668, 1668, 361, 361, 1668, 361, 1668,
+	361, 1668, 361, 361, 361, 1668, 361, 361,
+	361, 1668, 361, 1668, 361, 361, 522, 1928,
+	361, 361, 1668, 361, 1924, 361, 361, 522,
+	2052, 2052, 2052, 2052, 361, 9, 95, 95,
 	95, 95, 95, 95, 95, 95, 37, 522,
-	0, 3167, 522, 361, 2046, 2046, 2046, 361,
-	1898, 1922, 2422, 1647, 1918, 9, 1647, 9,
-	3182, 2422, 2422, 2422, 2422, 2422, 2422, 2422,
-	2422, 2422, 2422, 2422, 2422, 2422, 2422, 1647,
-	2410, 95, 95, 95, 95, 95, 95, 95,
-	95, 95, 1890, 3922, 1918, 1659, 3172, 3182,
-	3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172,
-	3172, 3172, 3172, 3172, 3172, 3172, 483, 3182,
-	1647, 9, 1647, 361, 361, 1662, 361, 361,
-	361, 1662, 361, 1662, 1647, 1647, 9, 1647,
-	1647, 355, 1647, 486, 486, 486, 486, 486,
+	0, 3173, 522, 361, 2052, 2052, 2052, 361,
+	1904, 1928, 2428, 1653, 1924, 9, 1653, 9,
+	3188, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+	2428, 2428, 2428, 2428, 2428, 2428, 2428, 1653,
+	2416, 95, 95, 95, 95, 95, 95, 95,
+	95, 95, 1896, 3928, 1924, 1665, 3178, 3188,
+	3178, 3178, 3178, 3178, 3178, 3178, 3178, 3178,
+	3178, 3178, 3178, 3178, 3178, 3178, 483, 3188,
+	1653, 9, 1653, 361, 361, 1668, 361, 361,
+	361, 1668, 361, 1668, 1653, 1653, 9, 1653,
+	1653, 355, 1653, 486, 486, 486, 486, 486,
 	486, 486, 486, 486, 486, 486, 486, 486,
-	486, 9, 1659, 486, 1659, 0, 0, 27,
+	486, 9, 1665, 486, 1665, 0, 0, 27,
 	27, 27, 405, 405, 405, 405, 27, 27,
-	621, 621, 2086, 2086, 2086, 2086, 621, 67,
-	2086, 2086, 2086, 2086, 75, 513, 3317, 384,
-	384, 3317, 2038, 3317, 75, 79, 79, 79,
+	621, 621, 2092, 2092, 2092, 2092, 621, 67,
+	2092, 2092, 2092, 2092, 75, 513, 3323, 384,
+	384, 3323, 2044, 3323, 75, 79, 79, 79,
 	387, 387, 387, 408, 408, 408, 408, 387,
 	79, 0, 85, 651, 657, 87, 657, 9,
 	9, 411, 411, 411, 411, 657, 9, 87,
@@ -5015,8 +5032,10 @@ static const short _zone_scanner_eof_actions[] = {
 	327, 327, 327, 327, 327, 327, 327, 327,
 	327, 327, 327, 327, 327, 327, 327, 327,
 	327, 327, 327, 327, 327, 341, 516, 516,
-	2198, 2198, 2198, 2198, 341, 341, 341, 516,
-	516, 2198, 2198, 2198, 2198, 341, 516, 341,
+	2204, 2204, 2204, 2204, 341, 341, 341, 516,
+	516, 2204, 2204, 2204, 2204, 341, 516, 341,
+	347, 347, 347, 347, 347, 347, 347, 347,
+	347, 347, 347, 347, 347, 347, 347, 347,
 	347, 347, 347, 347, 347, 347, 347, 347,
 	347, 347, 347, 347, 347, 347, 347, 347,
 	347, 347, 347, 347, 347, 347, 347, 347,
@@ -5028,75 +5047,74 @@ static const short _zone_scanner_eof_actions[] = {
 	347, 347, 347, 347, 347, 347, 347, 347,
 	347, 347, 347, 347, 347, 347, 347, 347,
 	347, 347, 347, 347, 347, 347, 347, 347,
-	347, 347, 347, 347, 347, 347, 347, 349,
 	349, 349, 349, 349, 349, 349, 349, 349,
 	349, 349, 349, 349, 349, 349, 349, 349,
 	349, 349, 349, 349, 349, 349, 349, 349,
 	349, 349, 349, 349, 349, 349, 349, 349,
 	349, 349, 349, 349, 349, 349, 349, 349,
-	690, 690, 355, 355, 355, 355, 355, 355,
-	519, 519, 519, 2042, 519, 2042, 519, 2042,
-	519, 2042, 2042, 2042, 2042, 355, 2042, 2042,
-	2042, 355, 2042, 2042, 2042, 355, 2042, 2042,
-	2042, 355, 355, 355, 355, 355, 355, 355,
-	355, 355, 355, 355, 355, 355, 519, 519,
-	355, 355, 355, 636, 636, 636, 636, 690,
-	690, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
-	1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
-	1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
-	1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
-	1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
-	1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
-	1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638,
-	519, 519, 519, 519, 519, 519, 355, 355,
-	355, 355, 355, 519, 519, 519, 519, 355,
+	349, 690, 690, 355, 355, 355, 355, 355,
+	355, 519, 519, 519, 2048, 519, 2048, 519,
+	2048, 519, 2048, 2048, 2048, 2048, 355, 2048,
+	2048, 2048, 355, 2048, 2048, 2048, 355, 2048,
+	2048, 2048, 355, 355, 355, 355, 355, 355,
+	355, 355, 355, 355, 355, 355, 355, 519,
+	519, 355, 355, 355, 636, 636, 636, 636,
+	690, 690, 1644, 1644, 1644, 1644, 1644, 1644,
+	1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644,
+	1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644,
+	1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644,
+	1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644,
+	1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644,
+	1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644,
+	1644, 519, 519, 519, 519, 519, 519, 355,
+	355, 355, 355, 355, 519, 519, 519, 519,
 	355, 355, 355, 355, 355, 355, 355, 355,
-	355, 355, 355, 355, 355, 355, 519, 519,
-	355, 355, 355, 355, 355, 355, 355, 711,
-	711, 711, 2142, 2142, 711, 711, 355, 711,
-	2142, 2142, 519, 519, 355, 355, 519, 519,
-	714, 714, 714, 714, 355, 355, 355, 519,
-	519, 519, 519, 714, 714, 714, 714, 355,
-	355, 519, 519, 795, 795, 1910, 1910, 795,
-	2206, 798, 798, 798, 798, 798, 798, 798,
-	795, 795, 795, 1910, 1910, 2146, 3352, 795,
-	795, 795, 1910, 1910, 2146, 3352, 795, 795,
-	795, 1910, 1910, 795, 2206, 795, 795, 355,
-	801, 801, 355, 355, 519, 519, 519, 519,
-	615, 615, 615, 615, 519, 519, 355, 355,
-	355, 355, 355, 355, 355, 355, 355, 355,
-	355, 355, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 801, 801, 801,
-	801, 801, 801, 801, 801, 1914, 1914, 801,
-	801, 801, 355, 355, 355, 519, 519, 519,
+	355, 355, 355, 355, 355, 355, 355, 519,
 	519, 355, 355, 355, 355, 355, 355, 355,
-	355, 355, 519, 519, 519, 519, 519, 519,
-	714, 714, 720, 720, 720, 720, 720, 720,
-	720, 720, 720, 355, 720, 720, 720, 720,
-	720, 355, 714, 714, 355, 355, 355, 519,
-	519, 519, 519, 519, 519, 714, 714, 714,
-	714, 355, 355, 355, 519, 519, 519, 519,
-	519, 519, 714, 714, 714, 714, 355, 355,
-	355, 519, 519, 690, 690, 355, 519, 519,
-	714, 714, 714, 714, 2202, 714, 714, 714,
-	714, 2406, 355, 714, 714, 2398, 714, 714,
-	2398, 714, 714, 2398, 714, 714, 2398, 519,
-	519, 519, 519, 355, 355, 355, 355, 519,
-	519, 355, 355, 355, 355, 355, 355, 0,
-	0, 0, 0, 93, 0, 0, 0, 0,
+	711, 711, 711, 2148, 2148, 711, 711, 355,
+	711, 2148, 2148, 519, 519, 355, 355, 519,
+	519, 714, 714, 714, 714, 355, 355, 355,
+	519, 519, 519, 519, 714, 714, 714, 714,
+	355, 355, 519, 519, 801, 801, 1916, 1916,
+	801, 2212, 804, 804, 804, 804, 804, 804,
+	804, 801, 801, 801, 1916, 1916, 2152, 3358,
+	801, 801, 801, 1916, 1916, 2152, 3358, 801,
+	801, 801, 1916, 1916, 801, 2212, 801, 801,
+	355, 807, 807, 355, 355, 519, 519, 519,
+	519, 615, 615, 615, 615, 519, 519, 355,
+	355, 355, 355, 355, 355, 355, 355, 355,
+	355, 355, 355, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 807, 807,
+	807, 807, 807, 807, 807, 807, 1920, 1920,
+	807, 807, 807, 355, 355, 355, 519, 519,
+	519, 519, 355, 355, 355, 355, 355, 355,
+	355, 355, 355, 519, 519, 519, 519, 519,
+	519, 714, 714, 720, 720, 720, 720, 720,
+	720, 720, 720, 720, 355, 720, 720, 720,
+	720, 720, 355, 714, 714, 355, 355, 355,
+	519, 519, 519, 519, 519, 519, 714, 714,
+	714, 714, 355, 355, 355, 519, 519, 519,
+	519, 519, 519, 714, 714, 714, 714, 355,
+	355, 355, 519, 519, 690, 690, 355, 519,
+	519, 714, 714, 714, 714, 2208, 714, 714,
+	714, 714, 2412, 355, 714, 714, 2404, 714,
+	714, 2404, 714, 714, 2404, 714, 714, 2404,
+	519, 519, 519, 519, 355, 355, 355, 355,
+	519, 519, 355, 355, 355, 355, 355, 355,
+	0, 0, 0, 0, 93, 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,
@@ -5106,7 +5124,7 @@ static const short _zone_scanner_eof_actions[] = {
 	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
 };
 
 
@@ -5128,7 +5146,7 @@ int zs_init(
 	memset(s, 0, sizeof(*s));
 
 	// Nonzero initial scanner state.
-	s->cs = 1111;
+	s->cs = 1120;
 
 	// Reset the file descriptor.
 	s->file.descriptor = -1;
@@ -5652,9 +5670,9 @@ _match:
 	case 8:
 	{
 		if (escape) {
-			cs = 1111; {p++; goto _out; }
+			cs = 1120; {p++; goto _out; }
 		} else {
-			{cs = 1111; goto _again;}
+			{cs = 1120; goto _again;}
 		}
 	}
 	break;
@@ -6307,7 +6325,7 @@ _match:
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out; }
+			cs = 1120; {p++; goto _out; }
 		}
 	}
 	break;
@@ -6696,224 +6714,234 @@ _match:
 	break;
 	case 133:
 	{
-		*(rdata_tail++) = 252;
+		*(rdata_tail++) = 15;
 	}
 	break;
 	case 134:
 	{
-		*(rdata_tail++) = 253;
+		*(rdata_tail++) = 16;
 	}
 	break;
 	case 135:
 	{
-		*(rdata_tail++) = 254;
+		*(rdata_tail++) = 252;
 	}
 	break;
 	case 136:
+	{
+		*(rdata_tail++) = 253;
+	}
+	break;
+	case 137:
+	{
+		*(rdata_tail++) = 254;
+	}
+	break;
+	case 138:
 	{
 		*((uint16_t *)rdata_tail) = htons(1);
 		rdata_tail += 2;
 	}
 	break;
-	case 137:
+	case 139:
 	{
 		*((uint16_t *)rdata_tail) = htons(2);
 		rdata_tail += 2;
 	}
 	break;
-	case 138:
+	case 140:
 	{
 		*((uint16_t *)rdata_tail) = htons(3);
 		rdata_tail += 2;
 	}
 	break;
-	case 139:
+	case 141:
 	{
 		*((uint16_t *)rdata_tail) = htons(4);
 		rdata_tail += 2;
 	}
 	break;
-	case 140:
+	case 142:
 	{
 		*((uint16_t *)rdata_tail) = htons(5);
 		rdata_tail += 2;
 	}
 	break;
-	case 141:
+	case 143:
 	{
 		*((uint16_t *)rdata_tail) = htons(6);
 		rdata_tail += 2;
 	}
 	break;
-	case 142:
+	case 144:
 	{
 		*((uint16_t *)rdata_tail) = htons(7);
 		rdata_tail += 2;
 	}
 	break;
-	case 143:
+	case 145:
 	{
 		*((uint16_t *)rdata_tail) = htons(8);
 		rdata_tail += 2;
 	}
 	break;
-	case 144:
+	case 146:
 	{
 		*((uint16_t *)rdata_tail) = htons(253);
 		rdata_tail += 2;
 	}
 	break;
-	case 145:
+	case 147:
 	{
 		*((uint16_t *)rdata_tail) = htons(254);
 		rdata_tail += 2;
 	}
 	break;
-	case 146:
+	case 148:
 	{
 		WARN(ZS_BAD_GATEWAY);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 147:
+	case 149:
 	{
 		WARN(ZS_BAD_GATEWAY_KEY);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 148:
+	case 150:
 	{
 		WARN(ZS_UNSUPPORTED_TYPE);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 149:
+	case 151:
 	{ type_num(KNOT_RRTYPE_A, &rdata_tail); }
 	break;
-	case 150:
+	case 152:
 	{ type_num(KNOT_RRTYPE_NS, &rdata_tail); }
 	break;
-	case 151:
+	case 153:
 	{ type_num(KNOT_RRTYPE_CNAME, &rdata_tail); }
 	break;
-	case 152:
+	case 154:
 	{ type_num(KNOT_RRTYPE_SOA, &rdata_tail); }
 	break;
-	case 153:
+	case 155:
 	{ type_num(KNOT_RRTYPE_PTR, &rdata_tail); }
 	break;
-	case 154:
+	case 156:
 	{ type_num(KNOT_RRTYPE_HINFO, &rdata_tail); }
 	break;
-	case 155:
+	case 157:
 	{ type_num(KNOT_RRTYPE_MINFO, &rdata_tail); }
 	break;
-	case 156:
+	case 158:
 	{ type_num(KNOT_RRTYPE_MX, &rdata_tail); }
 	break;
-	case 157:
+	case 159:
 	{ type_num(KNOT_RRTYPE_TXT, &rdata_tail); }
 	break;
-	case 158:
+	case 160:
 	{ type_num(KNOT_RRTYPE_RP, &rdata_tail); }
 	break;
-	case 159:
+	case 161:
 	{ type_num(KNOT_RRTYPE_AFSDB, &rdata_tail); }
 	break;
-	case 160:
+	case 162:
 	{ type_num(KNOT_RRTYPE_RT, &rdata_tail); }
 	break;
-	case 161:
+	case 163:
 	{ type_num(KNOT_RRTYPE_KEY, &rdata_tail); }
 	break;
-	case 162:
+	case 164:
 	{ type_num(KNOT_RRTYPE_AAAA, &rdata_tail); }
 	break;
-	case 163:
+	case 165:
 	{ type_num(KNOT_RRTYPE_LOC, &rdata_tail); }
 	break;
-	case 164:
+	case 166:
 	{ type_num(KNOT_RRTYPE_SRV, &rdata_tail); }
 	break;
-	case 165:
+	case 167:
 	{ type_num(KNOT_RRTYPE_NAPTR, &rdata_tail); }
 	break;
-	case 166:
+	case 168:
 	{ type_num(KNOT_RRTYPE_KX, &rdata_tail); }
 	break;
-	case 167:
+	case 169:
 	{ type_num(KNOT_RRTYPE_CERT, &rdata_tail); }
 	break;
-	case 168:
+	case 170:
 	{ type_num(KNOT_RRTYPE_DNAME, &rdata_tail); }
 	break;
-	case 169:
+	case 171:
 	{ type_num(KNOT_RRTYPE_APL, &rdata_tail); }
 	break;
-	case 170:
+	case 172:
 	{ type_num(KNOT_RRTYPE_DS, &rdata_tail); }
 	break;
-	case 171:
+	case 173:
 	{ type_num(KNOT_RRTYPE_SSHFP, &rdata_tail); }
 	break;
-	case 172:
+	case 174:
 	{ type_num(KNOT_RRTYPE_IPSECKEY, &rdata_tail); }
 	break;
-	case 173:
+	case 175:
 	{ type_num(KNOT_RRTYPE_RRSIG, &rdata_tail); }
 	break;
-	case 174:
+	case 176:
 	{ type_num(KNOT_RRTYPE_NSEC, &rdata_tail); }
 	break;
-	case 175:
+	case 177:
 	{ type_num(KNOT_RRTYPE_DNSKEY, &rdata_tail); }
 	break;
-	case 176:
+	case 178:
 	{ type_num(KNOT_RRTYPE_DHCID, &rdata_tail); }
 	break;
-	case 177:
+	case 179:
 	{ type_num(KNOT_RRTYPE_NSEC3, &rdata_tail); }
 	break;
-	case 178:
+	case 180:
 	{ type_num(KNOT_RRTYPE_NSEC3PARAM, &rdata_tail); }
 	break;
-	case 179:
+	case 181:
 	{ type_num(KNOT_RRTYPE_TLSA, &rdata_tail); }
 	break;
-	case 180:
+	case 182:
 	{ type_num(KNOT_RRTYPE_CDS, &rdata_tail); }
 	break;
-	case 181:
+	case 183:
 	{ type_num(KNOT_RRTYPE_CDNSKEY, &rdata_tail); }
 	break;
-	case 182:
+	case 184:
 	{ type_num(KNOT_RRTYPE_SPF, &rdata_tail); }
 	break;
-	case 183:
+	case 185:
 	{ type_num(KNOT_RRTYPE_NID, &rdata_tail); }
 	break;
-	case 184:
+	case 186:
 	{ type_num(KNOT_RRTYPE_L32, &rdata_tail); }
 	break;
-	case 185:
+	case 187:
 	{ type_num(KNOT_RRTYPE_L64, &rdata_tail); }
 	break;
-	case 186:
+	case 188:
 	{ type_num(KNOT_RRTYPE_LP, &rdata_tail); }
 	break;
-	case 187:
+	case 189:
 	{ type_num(KNOT_RRTYPE_EUI48, &rdata_tail); }
 	break;
-	case 188:
+	case 190:
 	{ type_num(KNOT_RRTYPE_EUI64, &rdata_tail); }
 	break;
-	case 189:
+	case 191:
 	{ type_num(KNOT_RRTYPE_URI, &rdata_tail); }
 	break;
-	case 190:
+	case 192:
 	{ type_num(KNOT_RRTYPE_CAA, &rdata_tail); }
 	break;
-	case 191:
+	case 193:
 	{
 		if (s->number64 <= UINT16_MAX) {
 			window_add_bit(s->number64, s);
@@ -6923,139 +6951,139 @@ _match:
 		}
 	}
 	break;
-	case 192:
+	case 194:
 	{ window_add_bit(KNOT_RRTYPE_A, s); }
 	break;
-	case 193:
+	case 195:
 	{ window_add_bit(KNOT_RRTYPE_NS, s); }
 	break;
-	case 194:
+	case 196:
 	{ window_add_bit(KNOT_RRTYPE_CNAME, s); }
 	break;
-	case 195:
+	case 197:
 	{ window_add_bit(KNOT_RRTYPE_SOA, s); }
 	break;
-	case 196:
+	case 198:
 	{ window_add_bit(KNOT_RRTYPE_PTR, s); }
 	break;
-	case 197:
+	case 199:
 	{ window_add_bit(KNOT_RRTYPE_HINFO, s); }
 	break;
-	case 198:
+	case 200:
 	{ window_add_bit(KNOT_RRTYPE_MINFO, s); }
 	break;
-	case 199:
+	case 201:
 	{ window_add_bit(KNOT_RRTYPE_MX, s); }
 	break;
-	case 200:
+	case 202:
 	{ window_add_bit(KNOT_RRTYPE_TXT, s); }
 	break;
-	case 201:
+	case 203:
 	{ window_add_bit(KNOT_RRTYPE_RP, s); }
 	break;
-	case 202:
+	case 204:
 	{ window_add_bit(KNOT_RRTYPE_AFSDB, s); }
 	break;
-	case 203:
+	case 205:
 	{ window_add_bit(KNOT_RRTYPE_RT, s); }
 	break;
-	case 204:
+	case 206:
 	{ window_add_bit(KNOT_RRTYPE_KEY, s); }
 	break;
-	case 205:
+	case 207:
 	{ window_add_bit(KNOT_RRTYPE_AAAA, s); }
 	break;
-	case 206:
+	case 208:
 	{ window_add_bit(KNOT_RRTYPE_LOC, s); }
 	break;
-	case 207:
+	case 209:
 	{ window_add_bit(KNOT_RRTYPE_SRV, s); }
 	break;
-	case 208:
+	case 210:
 	{ window_add_bit(KNOT_RRTYPE_NAPTR, s); }
 	break;
-	case 209:
+	case 211:
 	{ window_add_bit(KNOT_RRTYPE_KX, s); }
 	break;
-	case 210:
+	case 212:
 	{ window_add_bit(KNOT_RRTYPE_CERT, s); }
 	break;
-	case 211:
+	case 213:
 	{ window_add_bit(KNOT_RRTYPE_DNAME, s); }
 	break;
-	case 212:
+	case 214:
 	{ window_add_bit(KNOT_RRTYPE_APL, s); }
 	break;
-	case 213:
+	case 215:
 	{ window_add_bit(KNOT_RRTYPE_DS, s); }
 	break;
-	case 214:
+	case 216:
 	{ window_add_bit(KNOT_RRTYPE_SSHFP, s); }
 	break;
-	case 215:
+	case 217:
 	{ window_add_bit(KNOT_RRTYPE_IPSECKEY, s); }
 	break;
-	case 216:
+	case 218:
 	{ window_add_bit(KNOT_RRTYPE_RRSIG, s); }
 	break;
-	case 217:
+	case 219:
 	{ window_add_bit(KNOT_RRTYPE_NSEC, s); }
 	break;
-	case 218:
+	case 220:
 	{ window_add_bit(KNOT_RRTYPE_DNSKEY, s); }
 	break;
-	case 219:
+	case 221:
 	{ window_add_bit(KNOT_RRTYPE_DHCID, s); }
 	break;
-	case 220:
+	case 222:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3, s); }
 	break;
-	case 221:
+	case 223:
 	{ window_add_bit(KNOT_RRTYPE_NSEC3PARAM, s); }
 	break;
-	case 222:
+	case 224:
 	{ window_add_bit(KNOT_RRTYPE_TLSA, s); }
 	break;
-	case 223:
+	case 225:
 	{ window_add_bit(KNOT_RRTYPE_CDS, s); }
 	break;
-	case 224:
+	case 226:
 	{ window_add_bit(KNOT_RRTYPE_CDNSKEY, s); }
 	break;
-	case 225:
+	case 227:
 	{ window_add_bit(KNOT_RRTYPE_SPF, s); }
 	break;
-	case 226:
+	case 228:
 	{ window_add_bit(KNOT_RRTYPE_NID, s); }
 	break;
-	case 227:
+	case 229:
 	{ window_add_bit(KNOT_RRTYPE_L32, s); }
 	break;
-	case 228:
+	case 230:
 	{ window_add_bit(KNOT_RRTYPE_L64, s); }
 	break;
-	case 229:
+	case 231:
 	{ window_add_bit(KNOT_RRTYPE_LP, s); }
 	break;
-	case 230:
+	case 232:
 	{ window_add_bit(KNOT_RRTYPE_EUI48, s); }
 	break;
-	case 231:
+	case 233:
 	{ window_add_bit(KNOT_RRTYPE_EUI64, s); }
 	break;
-	case 232:
+	case 234:
 	{ window_add_bit(KNOT_RRTYPE_URI, s); }
 	break;
-	case 233:
+	case 235:
 	{ window_add_bit(KNOT_RRTYPE_CAA, s); }
 	break;
-	case 234:
+	case 236:
 	{
 		memset(s->windows, 0, sizeof(s->windows));
 		s->last_window = -1;
 	}
 	break;
-	case 235:
+	case 237:
 	{
 		for (window = 0; window <= s->last_window; window++) {
 			if ((s->windows[window]).length > 0) {
@@ -7080,16 +7108,16 @@ _match:
 		}
 	}
 	break;
-	case 236:
+	case 238:
 	{
 		WARN(ZS_BAD_BITMAP);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 237:
+	case 239:
 	{ p--; {stack[top++] = cs; cs = 329; goto _again;} }
 	break;
-	case 238:
+	case 240:
 	{
 		if (s->number64 <= 90) {
 			s->loc.d1 = (uint32_t)(s->number64);
@@ -7099,7 +7127,7 @@ _match:
 		}
 	}
 	break;
-	case 239:
+	case 241:
 	{
 		if (s->number64 <= 180) {
 			s->loc.d2 = (uint32_t)(s->number64);
@@ -7109,7 +7137,7 @@ _match:
 		}
 	}
 	break;
-	case 240:
+	case 242:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m1 = (uint32_t)(s->number64);
@@ -7119,7 +7147,7 @@ _match:
 		}
 	}
 	break;
-	case 241:
+	case 243:
 	{
 		if (s->number64 <= 59) {
 			s->loc.m2 = (uint32_t)(s->number64);
@@ -7129,7 +7157,7 @@ _match:
 		}
 	}
 	break;
-	case 242:
+	case 244:
 	{
 		if (s->number64 <= 59999) {
 			s->loc.s1 = (uint32_t)(s->number64);
@@ -7139,7 +7167,7 @@ _match:
 		}
 	}
 	break;
-	case 243:
+	case 245:
 	{
 		if (s->number64 <= 59999) {
 			s->loc.s2 = (uint32_t)(s->number64);
@@ -7149,7 +7177,7 @@ _match:
 		}
 	}
 	break;
-	case 244:
+	case 246:
 	{
 		if ((s->loc.alt_sign ==  1 && s->number64 <= 4284967295) ||
 		    (s->loc.alt_sign == -1 && s->number64 <=   10000000))
@@ -7161,7 +7189,7 @@ _match:
 		}
 	}
 	break;
-	case 245:
+	case 247:
 	{
 		if (s->number64 <= 9000000000ULL) {
 			s->loc.siz = s->number64;
@@ -7171,7 +7199,7 @@ _match:
 		}
 	}
 	break;
-	case 246:
+	case 248:
 	{
 		if (s->number64 <= 9000000000ULL) {
 			s->loc.hp = s->number64;
@@ -7181,7 +7209,7 @@ _match:
 		}
 	}
 	break;
-	case 247:
+	case 249:
 	{
 		if (s->number64 <= 9000000000ULL) {
 			s->loc.vp = s->number64;
@@ -7191,22 +7219,22 @@ _match:
 		}
 	}
 	break;
-	case 248:
+	case 250:
 	{
 		s->loc.lat_sign = -1;
 	}
 	break;
-	case 249:
+	case 251:
 	{
 		s->loc.long_sign = -1;
 	}
 	break;
-	case 250:
+	case 252:
 	{
 		s->loc.alt_sign = -1;
 	}
 	break;
-	case 251:
+	case 253:
 	{
 		memset(&(s->loc), 0, sizeof(s->loc));
 		// Defaults.
@@ -7218,7 +7246,7 @@ _match:
 		s->loc.alt_sign  = 1;
 	}
 	break;
-	case 252:
+	case 254:
 	{
 		// Write version.
 		*(rdata_tail) = 0;
@@ -7246,29 +7274,29 @@ _match:
 		rdata_tail += 4;
 	}
 	break;
-	case 253:
+	case 255:
 	{
 		WARN(ZS_BAD_LOC_DATA);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 254:
+	case 256:
 	{
 		WARN(ZS_BAD_HEX_RDATA);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 255:
+	case 257:
 	{
 		s->item_length = 0;
 	}
 	break;
-	case 256:
+	case 258:
 	{
 		s->item_length++;
 	}
 	break;
-	case 257:
+	case 259:
 	{
 		if (s->item_length != 6) {
 			WARN(ZS_BAD_EUI_LENGTH);
@@ -7276,7 +7304,7 @@ _match:
 		}
 	}
 	break;
-	case 258:
+	case 260:
 	{
 		if (s->item_length != 8) {
 			WARN(ZS_BAD_EUI_LENGTH);
@@ -7284,23 +7312,23 @@ _match:
 		}
 	}
 	break;
-	case 259:
+	case 261:
 	{
 		WARN(ZS_BAD_CHAR_DASH);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 260:
+	case 262:
 	{
 		s->item_length = 0;
 	}
 	break;
-	case 261:
+	case 263:
 	{
 		s->item_length++;
 	}
 	break;
-	case 262:
+	case 264:
 	{
 		if (s->item_length != 4) {
 			WARN(ZS_BAD_L64_LENGTH);
@@ -7308,123 +7336,123 @@ _match:
 		}
 	}
 	break;
-	case 263:
+	case 265:
 	{
 		WARN(ZS_BAD_CHAR_COLON);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 264:
+	case 266:
 	{
 		WARN(ZS_BAD_ALGORITHM);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 265:
+	case 267:
 	{
 		WARN(ZS_BAD_CERT_TYPE);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 266:
+	case 268:
 	{ p--; {stack[top++] = cs; cs = 480; goto _again;} }
 	break;
-	case 267:
-	{ p--; {stack[top++] = cs; cs = 575; goto _again;} }
+	case 269:
+	{ p--; {stack[top++] = cs; cs = 584; goto _again;} }
 	break;
-	case 268:
+	case 270:
 	{
 		rdata_tail = s->r_data;
 	}
 	break;
-	case 269:
+	case 271:
 	{
 		WARN(ZS_BAD_RDATA);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 270:
+	case 272:
 	{
 		p--;
 		switch (s->r_type) {
 		case KNOT_RRTYPE_A:
-			{stack[top++] = cs; cs = 616; goto _again;}
+			{stack[top++] = cs; cs = 625; goto _again;}
 		case KNOT_RRTYPE_NS:
 		case KNOT_RRTYPE_CNAME:
 		case KNOT_RRTYPE_PTR:
 		case KNOT_RRTYPE_DNAME:
-			{stack[top++] = cs; cs = 618; goto _again;}
+			{stack[top++] = cs; cs = 627; goto _again;}
 		case KNOT_RRTYPE_SOA:
-			{stack[top++] = cs; cs = 620; goto _again;}
+			{stack[top++] = cs; cs = 629; goto _again;}
 		case KNOT_RRTYPE_HINFO:
-			{stack[top++] = cs; cs = 652; goto _again;}
+			{stack[top++] = cs; cs = 661; goto _again;}
 		case KNOT_RRTYPE_MINFO:
 		case KNOT_RRTYPE_RP:
-			{stack[top++] = cs; cs = 657; goto _again;}
+			{stack[top++] = cs; cs = 666; goto _again;}
 		case KNOT_RRTYPE_MX:
 		case KNOT_RRTYPE_AFSDB:
 		case KNOT_RRTYPE_RT:
 		case KNOT_RRTYPE_KX:
 		case KNOT_RRTYPE_LP:
-			{stack[top++] = cs; cs = 662; goto _again;}
+			{stack[top++] = cs; cs = 671; goto _again;}
 		case KNOT_RRTYPE_TXT:
 		case KNOT_RRTYPE_SPF:
-			{stack[top++] = cs; cs = 667; goto _again;}
+			{stack[top++] = cs; cs = 676; goto _again;}
 		case KNOT_RRTYPE_AAAA:
-			{stack[top++] = cs; cs = 671; goto _again;}
+			{stack[top++] = cs; cs = 680; goto _again;}
 		case KNOT_RRTYPE_LOC:
-			{stack[top++] = cs; cs = 673; goto _again;}
+			{stack[top++] = cs; cs = 682; goto _again;}
 		case KNOT_RRTYPE_SRV:
-			{stack[top++] = cs; cs = 728; goto _again;}
+			{stack[top++] = cs; cs = 737; goto _again;}
 		case KNOT_RRTYPE_NAPTR:
-			{stack[top++] = cs; cs = 739; goto _again;}
+			{stack[top++] = cs; cs = 748; goto _again;}
 		case KNOT_RRTYPE_CERT:
-			{stack[top++] = cs; cs = 756; goto _again;}
+			{stack[top++] = cs; cs = 765; goto _again;}
 		case KNOT_RRTYPE_APL:
-			{stack[top++] = cs; cs = 767; goto _again;}
+			{stack[top++] = cs; cs = 776; goto _again;}
 		case KNOT_RRTYPE_DS:
 		case KNOT_RRTYPE_CDS:
-			{stack[top++] = cs; cs = 778; goto _again;}
+			{stack[top++] = cs; cs = 787; goto _again;}
 		case KNOT_RRTYPE_SSHFP:
-			{stack[top++] = cs; cs = 791; goto _again;}
+			{stack[top++] = cs; cs = 800; goto _again;}
 		case KNOT_RRTYPE_IPSECKEY:
-			{stack[top++] = cs; cs = 801; goto _again;}
+			{stack[top++] = cs; cs = 810; goto _again;}
 		case KNOT_RRTYPE_RRSIG:
-			{stack[top++] = cs; cs = 840; goto _again;}
+			{stack[top++] = cs; cs = 849; goto _again;}
 		case KNOT_RRTYPE_NSEC:
-			{stack[top++] = cs; cs = 994; goto _again;}
+			{stack[top++] = cs; cs = 1003; goto _again;}
 		case KNOT_RRTYPE_KEY:
 		case KNOT_RRTYPE_DNSKEY:
 		case KNOT_RRTYPE_CDNSKEY:
-			{stack[top++] = cs; cs = 997; goto _again;}
+			{stack[top++] = cs; cs = 1006; goto _again;}
 		case KNOT_RRTYPE_DHCID:
-			{stack[top++] = cs; cs = 1008; goto _again;}
+			{stack[top++] = cs; cs = 1017; goto _again;}
 		case KNOT_RRTYPE_NSEC3:
-			{stack[top++] = cs; cs = 1010; goto _again;}
+			{stack[top++] = cs; cs = 1019; goto _again;}
 		case KNOT_RRTYPE_NSEC3PARAM:
-			{stack[top++] = cs; cs = 1039; goto _again;}
+			{stack[top++] = cs; cs = 1048; goto _again;}
 		case KNOT_RRTYPE_TLSA:
-			{stack[top++] = cs; cs = 1052; goto _again;}
+			{stack[top++] = cs; cs = 1061; goto _again;}
 		case KNOT_RRTYPE_NID:
 		case KNOT_RRTYPE_L64:
-			{stack[top++] = cs; cs = 1070; goto _again;}
+			{stack[top++] = cs; cs = 1079; goto _again;}
 		case KNOT_RRTYPE_L32:
-			{stack[top++] = cs; cs = 1065; goto _again;}
+			{stack[top++] = cs; cs = 1074; goto _again;}
 		case KNOT_RRTYPE_EUI48:
-			{stack[top++] = cs; cs = 1083; goto _again;}
+			{stack[top++] = cs; cs = 1092; goto _again;}
 		case KNOT_RRTYPE_EUI64:
-			{stack[top++] = cs; cs = 1089; goto _again;}
+			{stack[top++] = cs; cs = 1098; goto _again;}
 		case KNOT_RRTYPE_URI:
-			{stack[top++] = cs; cs = 1095; goto _again;}
+			{stack[top++] = cs; cs = 1104; goto _again;}
 		case KNOT_RRTYPE_CAA:
-			{stack[top++] = cs; cs = 1103; goto _again;}
+			{stack[top++] = cs; cs = 1112; goto _again;}
 		default:
 			WARN(ZS_CANNOT_TEXT_DATA);
 			{cs = 261; goto _again;}
 		}
 	}
 	break;
-	case 271:
+	case 273:
 	{
 		switch (s->r_type) {
 		// Next types must not have empty rdata.
@@ -7477,142 +7505,142 @@ _match:
 		}
 	}
 	break;
-	case 272:
+	case 274:
 	{ p--; }
 	break;
-	case 273:
+	case 275:
 	{
 		WARN(ZS_UNSUPPORTED_TYPE);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 274:
+	case 276:
 	{ s->r_type = KNOT_RRTYPE_A; }
 	break;
-	case 275:
+	case 277:
 	{ s->r_type = KNOT_RRTYPE_NS; }
 	break;
-	case 276:
+	case 278:
 	{ s->r_type = KNOT_RRTYPE_CNAME; }
 	break;
-	case 277:
+	case 279:
 	{ s->r_type = KNOT_RRTYPE_SOA; }
 	break;
-	case 278:
+	case 280:
 	{ s->r_type = KNOT_RRTYPE_PTR; }
 	break;
-	case 279:
+	case 281:
 	{ s->r_type = KNOT_RRTYPE_HINFO; }
 	break;
-	case 280:
+	case 282:
 	{ s->r_type = KNOT_RRTYPE_MINFO; }
 	break;
-	case 281:
+	case 283:
 	{ s->r_type = KNOT_RRTYPE_MX; }
 	break;
-	case 282:
+	case 284:
 	{ s->r_type = KNOT_RRTYPE_TXT; }
 	break;
-	case 283:
+	case 285:
 	{ s->r_type = KNOT_RRTYPE_RP; }
 	break;
-	case 284:
+	case 286:
 	{ s->r_type = KNOT_RRTYPE_AFSDB; }
 	break;
-	case 285:
+	case 287:
 	{ s->r_type = KNOT_RRTYPE_RT; }
 	break;
-	case 286:
+	case 288:
 	{ s->r_type = KNOT_RRTYPE_KEY; }
 	break;
-	case 287:
+	case 289:
 	{ s->r_type = KNOT_RRTYPE_AAAA; }
 	break;
-	case 288:
+	case 290:
 	{ s->r_type = KNOT_RRTYPE_LOC; }
 	break;
-	case 289:
+	case 291:
 	{ s->r_type = KNOT_RRTYPE_SRV; }
 	break;
-	case 290:
+	case 292:
 	{ s->r_type = KNOT_RRTYPE_NAPTR; }
 	break;
-	case 291:
+	case 293:
 	{ s->r_type = KNOT_RRTYPE_KX; }
 	break;
-	case 292:
+	case 294:
 	{ s->r_type = KNOT_RRTYPE_CERT; }
 	break;
-	case 293:
+	case 295:
 	{ s->r_type = KNOT_RRTYPE_DNAME; }
 	break;
-	case 294:
+	case 296:
 	{ s->r_type = KNOT_RRTYPE_APL; }
 	break;
-	case 295:
+	case 297:
 	{ s->r_type = KNOT_RRTYPE_DS; }
 	break;
-	case 296:
+	case 298:
 	{ s->r_type = KNOT_RRTYPE_SSHFP; }
 	break;
-	case 297:
+	case 299:
 	{ s->r_type = KNOT_RRTYPE_IPSECKEY; }
 	break;
-	case 298:
+	case 300:
 	{ s->r_type = KNOT_RRTYPE_RRSIG; }
 	break;
-	case 299:
+	case 301:
 	{ s->r_type = KNOT_RRTYPE_NSEC; }
 	break;
-	case 300:
+	case 302:
 	{ s->r_type = KNOT_RRTYPE_DNSKEY; }
 	break;
-	case 301:
+	case 303:
 	{ s->r_type = KNOT_RRTYPE_DHCID; }
 	break;
-	case 302:
+	case 304:
 	{ s->r_type = KNOT_RRTYPE_NSEC3; }
 	break;
-	case 303:
+	case 305:
 	{ s->r_type = KNOT_RRTYPE_NSEC3PARAM; }
 	break;
-	case 304:
+	case 306:
 	{ s->r_type = KNOT_RRTYPE_TLSA; }
 	break;
-	case 305:
+	case 307:
 	{ s->r_type = KNOT_RRTYPE_CDS; }
 	break;
-	case 306:
+	case 308:
 	{ s->r_type = KNOT_RRTYPE_CDNSKEY; }
 	break;
-	case 307:
+	case 309:
 	{ s->r_type = KNOT_RRTYPE_SPF; }
 	break;
-	case 308:
+	case 310:
 	{ s->r_type = KNOT_RRTYPE_NID; }
 	break;
-	case 309:
+	case 311:
 	{ s->r_type = KNOT_RRTYPE_L32; }
 	break;
-	case 310:
+	case 312:
 	{ s->r_type = KNOT_RRTYPE_L64; }
 	break;
-	case 311:
+	case 313:
 	{ s->r_type = KNOT_RRTYPE_LP; }
 	break;
-	case 312:
+	case 314:
 	{ s->r_type = KNOT_RRTYPE_EUI48; }
 	break;
-	case 313:
+	case 315:
 	{ s->r_type = KNOT_RRTYPE_EUI64; }
 	break;
-	case 314:
+	case 316:
 	{ s->r_type = KNOT_RRTYPE_URI; }
 	break;
-	case 315:
+	case 317:
 	{ s->r_type = KNOT_RRTYPE_CAA; }
 	break;
-	case 316:
+	case 318:
 	{
 		if (rdata_tail - s->r_data > UINT16_MAX) {
 			WARN(ZS_RDATA_OVERFLOW);
@@ -7747,7 +7775,7 @@ _again:
 	{
 		NOERR;
 		if (escape) {
-			cs = 1111; {p++; goto _out; }
+			cs = 1120; {p++; goto _out; }
 		}
 	}
 	break;
@@ -7793,73 +7821,73 @@ _again:
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 146:
+	case 148:
 	{
 		WARN(ZS_BAD_GATEWAY);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 147:
+	case 149:
 	{
 		WARN(ZS_BAD_GATEWAY_KEY);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 148:
+	case 150:
 	{
 		WARN(ZS_UNSUPPORTED_TYPE);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 236:
+	case 238:
 	{
 		WARN(ZS_BAD_BITMAP);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 253:
+	case 255:
 	{
 		WARN(ZS_BAD_LOC_DATA);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 254:
+	case 256:
 	{
 		WARN(ZS_BAD_HEX_RDATA);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 259:
+	case 261:
 	{
 		WARN(ZS_BAD_CHAR_DASH);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 263:
+	case 265:
 	{
 		WARN(ZS_BAD_CHAR_COLON);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 264:
+	case 266:
 	{
 		WARN(ZS_BAD_ALGORITHM);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 265:
+	case 267:
 	{
 		WARN(ZS_BAD_CERT_TYPE);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 269:
+	case 271:
 	{
 		WARN(ZS_BAD_RDATA);
 		p--; {cs = 261; goto _again;}
 	}
 	break;
-	case 273:
+	case 275:
 	{
 		WARN(ZS_UNSUPPORTED_TYPE);
 		p--; {cs = 261; goto _again;}
diff --git a/src/zscanner/scanner.h b/src/zscanner/scanner.h
index 361f4da21ff2ab4f5401838d39d44dbcf7bf829f..e1db73f172a776685b87ffbd49e3760c51a5c34b 100644
--- a/src/zscanner/scanner.h
+++ b/src/zscanner/scanner.h
@@ -361,7 +361,7 @@ int zs_parse_record(
  * \brief Launches automatic parsing of the whole input.
  *
  * For each correctly recognized record, the record callback is executed.
- * If any syntax error occures, the error callback is executed.
+ * If any syntax error occurs, the error callback is executed.
  *
  * \note Error code and other information are stored in the scanner context.
  *
diff --git a/src/zscanner/scanner_body.rl b/src/zscanner/scanner_body.rl
index 4f91ffe52fc7c38a168568c391abab14ef448539..bff90813dc4861eb3cfa577becac34e3f98f7fe5 100644
--- a/src/zscanner/scanner_body.rl
+++ b/src/zscanner/scanner_body.rl
@@ -1186,6 +1186,12 @@
 	action _write8_14 {
 		*(rdata_tail++) = 14;
 	}
+	action _write8_15 {
+		*(rdata_tail++) = 15;
+	}
+	action _write8_16 {
+		*(rdata_tail++) = 16;
+	}
 	action _write8_252 {
 		*(rdata_tail++) = 252;
 	}
@@ -1663,6 +1669,8 @@
 		| "ECC-GOST"i           %_write8_12
 		| "ECDSAP256SHA256"i    %_write8_13
 		| "ECDSAP384SHA384"i    %_write8_14
+		| "ED25519"i            %_write8_15
+		| "ED448"i              %_write8_16
 		| "INDIRECT"i           %_write8_252
 		| "PRIVATEDNS"i         %_write8_253
 		| "PRIVATEOID"i         %_write8_254
diff --git a/src/zscanner/tests/data/29_CERT.in b/src/zscanner/tests/data/29_CERT.in
index 5a5daf6ae0d7dcdff8453f56dd73934fa44c0a87..ee70ce24ae328af7595d1546a7bd48fcd6d3ab0f 100644
--- a/src/zscanner/tests/data/29_CERT.in
+++ b/src/zscanner/tests/data/29_CERT.in
@@ -25,6 +25,8 @@ $TTL	1
 @	CERT	0	0	ECC-GOST	AA==		; Algorithm mnemo
 @	CERT	0	0	ECDSAP256SHA256	AA==		; Algorithm mnemo
 @	CERT	0	0	ECDSAP384SHA384	AA==		; Algorithm mnemo
+@	CERT	0	0	ED25519		AA==		; Algorithm mnemo
+@	CERT	0	0	ED448		AA==		; Algorithm mnemo
 @	CERT	0	0	INDIRECT	AA==		; Algorithm mnemo
 @	CERT	0	0	PRIVATEDNS	AA==		; Algorithm mnemo
 @	CERT	0	0	PRIVATEOID	AA==		; Algorithm mnemo
diff --git a/src/zscanner/tests/data/29_CERT.out b/src/zscanner/tests/data/29_CERT.out
index 6bd3674a897c98f04519cf259ad0a23a6eed2934..da2c89771c3f49742149db91404433ce4c060839 100644
--- a/src/zscanner/tests/data/29_CERT.out
+++ b/src/zscanner/tests/data/29_CERT.out
@@ -140,6 +140,18 @@ OWNER=00
 CLASS=0001
 RRTTL=00000001
 RTYPE=0025
+RDATA=000000000F00
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0025
+RDATA=000000001000
+------
+OWNER=00
+CLASS=0001
+RRTTL=00000001
+RTYPE=0025
 RDATA=00000000FC00
 ------
 OWNER=00
diff --git a/src/zscanner/tests/tests.c b/src/zscanner/tests/tests.c
index 85ef1272d077b871ded6ca557607548572b98005..3f0725bf575cd021713114814ff2fa71c9283b3f 100644
--- a/src/zscanner/tests/tests.c
+++ b/src/zscanner/tests/tests.c
@@ -48,6 +48,7 @@ int test__date_to_timestamp(void)
 			 gmtime_r(&ref_timestamp, &result));
 
 		// Get testing timestamp.
+		test_timestamp = 0U; // prevents Wunitialized
 		date_to_timestamp(buffer, &test_timestamp);
 
 		// Some continuous loging.
diff --git a/tests-extra/data/flags.zone b/tests-extra/data/flags.zone
index a71811e1a9ad2efa3a5eee1310f4262d43929453..5bc42585e0aca025503703460062e07ae11ef757 100644
--- a/tests-extra/data/flags.zone
+++ b/tests-extra/data/flags.zone
@@ -19,6 +19,8 @@ mail	A	192.0.2.3
 
 ; Delegation of a subdomain
 sub	NS	ns.sub
+sub	NS	sub
+sub	A	192.0.0.1
 ns.sub	A	192.0.2.4
 
 ; CNAME to A record
@@ -56,7 +58,6 @@ cname-mx-wc	MX	10 cname-wildcard
 ; MX record leading to CNAME (outside zone)
 cname-mx-out	MX	10 cname-out
 
-
 ; DNAME subtree
 dname		DNAME	dname-tree
 dname-tree	A	1.2.3.4
diff --git a/tests-extra/tests/basic/delegation_tc/data/tc.test.zone b/tests-extra/tests/basic/delegation_tc/data/tc.test.zone
index 2b35912fe18c8a057ca47843ca950fa9c83c6e9c..c0d6e9297453165f480a8f02f4402d54fc0b5b00 100644
--- a/tests-extra/tests/basic/delegation_tc/data/tc.test.zone
+++ b/tests-extra/tests/basic/delegation_tc/data/tc.test.zone
@@ -1,5 +1,5 @@
-; File written on Mon Jun 27 16:20:15 2016
-; dnssec_signzone version 9.10.4-P1-RedHat-9.10.4-1.P1.fc24
+; File written on Tue Oct  4 18:49:49 2016
+; dnssec_signzone version 9.10.3-P4-Ubuntu
 tc.test.		60	IN SOA	tc.test. admin.tc.test. (
 					1          ; serial
 					60         ; refresh (1 minute)
@@ -8,61 +8,113 @@ tc.test.		60	IN SOA	tc.test. admin.tc.test. (
 					60         ; minimum (1 minute)
 					)
 			60	RRSIG	SOA 13 2 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					TnjmkPEP/Yy1UuTqzahLYltxhlPmC7zaHqIf
-					XixOb1NTA7iRu3CQ8fydn9drzXvFXlZLx8hJ
-					RdzmPYf/XXPdDQ== )
+					20161103154949 20161004154949 43962 tc.test.
+					CdroAlkr6etDRTiUrtK63XwysxIWy8PBh2bK
+					mIhx3h4HFx29bqeyhiUCZZ7AZwvJMRNSb6vW
+					tIn6ctgo9nJB8g== )
+			60	NS	ns.glue.deleg.tc.test.
 			60	NS	tc.test.
+			60	NS	a1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890a.tc.test.
+			60	NS	b1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890b.tc.test.
 			60	RRSIG	NS 13 2 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					Ixp5MrVn6puk0DM2G3E0Dv1+Ssqn0w4OLsXm
-					L0558mx6XG8e6vjOYab9PMkscYswujF612ET
-					Xh5Jv3ielAQwUA== )
-			60	A	0.0.0.0
-			60	RRSIG	A 13 2 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					lvmzV1EVATXjKdtjdZNykSbz3aG/fMI3UU6Y
-					qjs0xY9lO58UjdifCWRIEclcEj492aqKyhHC
-					TK00LHCoigTXIg== )
+					20161103154949 20161004154949 43962 tc.test.
+					tExlMqyl8AGdpN54tLe51urPTOkUWOh3AN/0
+					adMTHB1/5GOESgv8F+cPrZCGghR2uF3G61Gh
+					TWxZ1NI3hM7gMw== )
 			60	AAAA	::
 			60	RRSIG	AAAA 13 2 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					P8e9gYCeih3z3elNnNc0yN9IM42LmsHL+4Gz
-					sDvbzTHQ6iry4LHrvGmlJ5A5SvtRMFqRVHzh
-					C3RvOZrAR7ZQAw== )
-			60	NSEC	foreign.tc.test. A NS SOA AAAA RRSIG NSEC DNSKEY
+					20161103154949 20161004154949 43962 tc.test.
+					vBNliPGFvWdC9HcPAmftJC6fZmGlC7x2dIWC
+					RL+0U6UVBh+J1AQVI/McHkS/ojj6C/3k/XnI
+					JZhKFfOPm2cahA== )
+			60	NSEC	glue.deleg.tc.test. NS SOA AAAA RRSIG NSEC DNSKEY
 			60	RRSIG	NSEC 13 2 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					jbLlXSKDpBmULul32602Xhfeuzksyr9FJQSX
-					YUPfwKEn9KhEEIqG2H737Q/IrEQ4wXT8OxOq
-					kQldQGuKJzik1w== )
+					20161103154949 20161004154949 43962 tc.test.
+					74SOcgcFwHTcR9vVerLexSsusmRb56Ly+WoX
+					ZtxiMNyjIPHPY6FTvJG9PToQZ9RivENeC1F/
+					ysDIpga+TC3XjQ== )
 			60	DNSKEY	256 3 13 (
-					dmTlwBFWofgOnzvUJxiDncJBTVHnZqfdiGUq
-					/pspqAlSSbloYVWMUJi/VuaO8IkCoxanvbJO
-					14z1nvPngQEdhg==
-					) ; ZSK; alg = ECDSAP256SHA256 ; key id = 64455
+					SWZimv5X53kJSM9SHXaSp13I3SRPB3VsIATS
+					q6WhFs6xqI/RfWJlSmrHRIyXhnMsgMqzP1hc
+					psZoHx9V6JBdQQ==
+					) ; ZSK; alg = ECDSAP256SHA256; key id = 43962
 			60	RRSIG	DNSKEY 13 2 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					QLuwVg0lv7VhnhSDLrdakw1Z0PnY2BPgqory
-					c2zHlw5yqzCIUHD09RcDya4Wcc7MgeVyx8E/
-					ofOayYOx5bOJmw== )
+					20161103154949 20161004154949 43962 tc.test.
+					KWHRVRIP3uXVsGa41jBOAAnTNcrvlSfAiRUp
+					7boGE4kuONxA8Q0OaNV2gk4VoREadz0lgfni
+					2D12paWCMtTtOg== )
+ns.glue.deleg.tc.test.	60	IN AAAA	::
 ns1.glue.tc.test.	60	IN AAAA	::
 ns2.glue.tc.test.	60	IN AAAA	::
 ns1.mixed.tc.test.	60	IN AAAA	::
+glue.deleg.tc.test.	60	IN NS	unreachable.glue.deleg.tc.test.
+			60	DS	0 0 0 (
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					000000000000000000000000000000000000
+					0000000000000000 )
+			60	RRSIG	DS 13 4 60 (
+					20161103154949 20161004154949 43962 tc.test.
+					hy9jX6erUiHKqIxQ8y19z0nmPPLWkyaDZ8m/
+					q0X/xchcDrvGqc/U0MGLnaaN51jf42hq6X3C
+					H6GeHDvz1OqstQ== )
+			60	NSEC	foreign.tc.test. NS DS RRSIG NSEC
+			60	RRSIG	NSEC 13 4 60 (
+					20161103154949 20161004154949 43962 tc.test.
+					PNYj39ndR5DQySdXPBrcZG65I1upHgytrjF0
+					6bScaqcJNEeElS/ig6mwqW35B0oQmwypKsXn
+					am63w/B/RCYccw== )
 ns1.tc.test.		60	IN AAAA	::
 			60	RRSIG	AAAA 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					ZgmxeHyHkfjthPOHeXUtVeOU3jgBZgX0bLvi
-					ea7jLpBSHW4TTjqw//eLv3He6/aX8GLryGAe
-					dMTRQJkTeYF+Cg== )
+					20161103154949 20161004154949 43962 tc.test.
+					gcVt5GtZ6fb4KaqTFUOXuj5fPaHxTNnl3IK7
+					CjZn6/wesLmE3y5wVQhoudQBzum5a2k5rjru
+					6Dh7RMUXoIUEow== )
 			60	NSEC	ns2.tc.test. AAAA RRSIG NSEC
 			60	RRSIG	NSEC 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					NPx5b/hjFJT2xt+CUNQmFHDLF78Ma3VaFZOW
-					ynAJ6CxEVhkowziVihK23suEBHpC4BeS+7lD
-					CJOFDSPBkuisLA== )
-parent.tc.test.		60	IN NS	ns1.tc.test.
-			60	IN NS	ns2.tc.test.
+					20161103154949 20161004154949 43962 tc.test.
+					BAQsRggb/+eQfkp4UXOB3EmcLsv7mmyDS02D
+					PbF+9+PrfH9ls6oXP1wsplZjX+CmegBZLQtZ
+					joPCCJTWRSnxUA== )
+ns2.tc.test.		60	IN AAAA	::
+			60	RRSIG	AAAA 13 3 60 (
+					20161103154949 20161004154949 43962 tc.test.
+					SfwMuwRAtwAtaOSg8S+IRoQzyQcc7T+CFkSx
+					UOndn2wYeoKvoECryvQlPFO67Sp0xeAOXNYN
+					6c5b6o9U9U9Xpw== )
+			60	NSEC	parent.tc.test. AAAA RRSIG NSEC
+			60	RRSIG	NSEC 13 3 60 (
+					20161103154949 20161004154949 43962 tc.test.
+					lgFal01FR1nsoLbZjZk7Dqre5h3ddaaNXUQv
+					2Qp52aJQjLzolVSxDYFdqThSyeR/hR6R4Qz/
+					SSBTePSsIgSyJA== )
+unreachable.tc.test.	60	IN NS	ns1.unreachable.tc.test.
+			60	IN NS	ns2.unreachable.tc.test.
 			60	DS	0 0 0 (
 					000000000000000000000000000000000000
 					000000000000000000000000000000000000
@@ -94,33 +146,21 @@ parent.tc.test.		60	IN NS	ns1.tc.test.
 					000000000000000000000000000000000000
 					0000000000000000 )
 			60	RRSIG	DS 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					wiwEeDbPOIHnMCOyT5bwiLt/LFvtRSTm4qEK
-					B4hnVPNi+vaFum6hzyDeD1Pvk2DBF+GymzMs
-					VcvnJ08KpSVZCA== )
-			60	NSEC	unreachable.tc.test. NS DS RRSIG NSEC
-			60	RRSIG	NSEC 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					u7l8cLKgpeAV//tkeCuC6gskK9C1ecqHjnSc
-					MCKedEcWFDHs1eZZu4Zc/XXBoviTdO0GFSFg
-					Qu3ttGHyCl3fMw== )
-ns2.tc.test.		60	IN AAAA	::
-			60	RRSIG	AAAA 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					FAt/j5NI/hOMhnXyCYKUMpRLLj+x2NDuWGxI
-					Riejg4oFfD/mRyNS3zc+bdxFUg7LkqbGYjog
-					F5IEgTZp12kBXQ== )
-			60	NSEC	parent.tc.test. AAAA RRSIG NSEC
+					20161103154949 20161004154949 43962 tc.test.
+					TJci/N50BFgb+j+dY0uIsmWaWoXtZgPvZX9Y
+					2uvCN2UTT5YgZe7PmvNlpHaf4INR3wPBZTAd
+					NQyo/aSzFDRW6g== )
+			60	NSEC	tc.test. NS DS RRSIG NSEC
 			60	RRSIG	NSEC 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					WzlI2GOO1V4EReUrB11XAMojvmXlfSETsyKb
-					I12crk4J8saxHkWGEDgGdGJKyxUqwTPGzfGt
-					umrufGCjG7rQSg== )
-mixed.tc.test.		60	IN NS	ns1.glue.tc.test.
+					20161103154949 20161004154949 43962 tc.test.
+					NctQNuDiG6dDMZMWzgwb3B0CcHm5ymoSIDGf
+					QwGB5Cm3pSuIeYwUmDxIxQ0TsFqvILTObUXj
+					6L9FpH762qOOzQ== )
+mixed.tc.test.		60	IN NS	ns1.tc.test.
+			60	IN NS	ns1.glue.tc.test.
 			60	IN NS	ns1.mixed.tc.test.
-			60	IN NS	ns2.mixed.tc.test.
 			60	IN NS	ns1.foreign.
-			60	IN NS	ns1.tc.test.
+			60	IN NS	ns2.mixed.tc.test.
 			60	IN NS	mixed.tc.test.
 			60	AAAA	::
 			60	DS	0 0 0 (
@@ -154,18 +194,18 @@ mixed.tc.test.		60	IN NS	ns1.glue.tc.test.
 					000000000000000000000000000000000000
 					0000000000000000 )
 			60	RRSIG	DS 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					EBzF/SidBA4MfNPBYjpySXro2kk7xUbFKMaH
-					oEyPhBPBZmWgj90yUAY99ToeXm89d48THrj8
-					mQGiuIPQqraTew== )
+					20161103154949 20161004154949 43962 tc.test.
+					nxQnxKLM0nb8ofj27x+5bRh8rlXJH0CxdyaH
+					sFNUSCZCgDWLWaCHfnVN72DRBBS8fYqsrRYU
+					/w6WMadeAMjFZQ== )
 			60	NSEC	ns1.tc.test. NS DS RRSIG NSEC
 			60	RRSIG	NSEC 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					VuUqyaNf7AzFOuzxksdXaBMC28gudtTi6ONT
-					FYaE7755Lb+CViJOSOvTxjfW203ZZAQDriyu
-					+MPy+3SWX2mpLA== )
-unreachable.tc.test.	60	IN NS	ns1.unreachable.tc.test.
-			60	IN NS	ns2.unreachable.tc.test.
+					20161103154949 20161004154949 43962 tc.test.
+					sMGpWInz4Nq9FoR2BmV6Rhz7vrFYE9VZ56gU
+					tPokXH6Wq1EkhyHb8pU93L34c3ZmdZq3w3L2
+					Md1d7nbXZB9iLw== )
+foreign.tc.test.	60	IN NS	ns1.foreign.
+			60	IN NS	ns2.foreign.
 			60	DS	0 0 0 (
 					000000000000000000000000000000000000
 					000000000000000000000000000000000000
@@ -197,18 +237,18 @@ unreachable.tc.test.	60	IN NS	ns1.unreachable.tc.test.
 					000000000000000000000000000000000000
 					0000000000000000 )
 			60	RRSIG	DS 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					FcwbELcllvBAwlwdnhbRbvWfIbBG7Zo3dvkR
-					leAn9UHxsvX5VTj1PMfyEbF0GCW2G/aypOxk
-					W1cWRvh6rbhuEQ== )
-			60	NSEC	tc.test. NS DS RRSIG NSEC
+					20161103154949 20161004154949 43962 tc.test.
+					zA+z/aFaPHYnpL2WqdLtzBeJWG1787K/fM9c
+					5lx26R2dU+icIgYp8PvF3kR0JCsEaatJ976P
+					E162l20bRl0FmA== )
+			60	NSEC	glue.tc.test. NS DS RRSIG NSEC
 			60	RRSIG	NSEC 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					2RuLDamP6L3wxnR8KxMGsBXO9Md5SNb454m6
-					h571kM56PSEJUtSCMRN+6d0aw0RHbv1lBAMK
-					5PrSNT79J03hGw== )
-foreign.tc.test.	60	IN NS	ns1.foreign.
-			60	IN NS	ns2.foreign.
+					20161103154949 20161004154949 43962 tc.test.
+					0JIr/XfONM1bfGApeinZ27P0joqQB0pFFtOW
+					qsesrOjzGf6lbcWn6Jj+5w93LO1X2pcaM/10
+					GFcABRrkPIcVuQ== )
+parent.tc.test.		60	IN NS	ns1.tc.test.
+			60	IN NS	ns2.tc.test.
 			60	DS	0 0 0 (
 					000000000000000000000000000000000000
 					000000000000000000000000000000000000
@@ -240,16 +280,16 @@ foreign.tc.test.	60	IN NS	ns1.foreign.
 					000000000000000000000000000000000000
 					0000000000000000 )
 			60	RRSIG	DS 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					qyuZxrODgWdj2TK4mbdCggBu6iW/Yo0Ic6qD
-					mRGXmaaD5cLfGi40M0+Rx/ejQAdjdMw9b8/O
-					Toxk5SPaoRfkBg== )
-			60	NSEC	glue.tc.test. NS DS RRSIG NSEC
+					20161103154949 20161004154949 43962 tc.test.
+					hGh1MErM/Bzq/5Kyy5+QX0uvJU2KipsOu0OK
+					tkSDGZw6wg3H1kmgngODnWqdZjiF6bAigzNl
+					VtmFW84CGNDH8A== )
+			60	NSEC	unreachable.tc.test. NS DS RRSIG NSEC
 			60	RRSIG	NSEC 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					2m9bCBlcybvflAFhMNQ+nWw3BRJy9POCC+X+
-					aakp7pVSz4D210zGZpGko4z0B8ycS9zgIT/C
-					tWlb9Ti39jLmjg== )
+					20161103154949 20161004154949 43962 tc.test.
+					9nz05/2JAHhfGTfST4mQ/7SvKXQisE+VTakO
+					zsq0yV6TCaWAx+jrK/pDm4Ko0wTsDwBBASGn
+					/kZQJ1vJ993VdA== )
 glue.tc.test.		60	IN NS	ns1.glue.tc.test.
 			60	IN NS	ns2.glue.tc.test.
 			60	DS	0 0 0 (
@@ -283,13 +323,13 @@ glue.tc.test.		60	IN NS	ns1.glue.tc.test.
 					000000000000000000000000000000000000
 					0000000000000000 )
 			60	RRSIG	DS 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					+fsRJmG1j6Lmv22PA5Cu6gnKTT945LXfEdX9
-					E01YzT/tt2uvCcB6kKMJBa/Z+tYJvimmB0kJ
-					XT+/EFWfXy75UA== )
+					20161103154949 20161004154949 43962 tc.test.
+					WEwidsGXvEcggup1H5cbfAPVnC1ZW1TDFZks
+					h3ZPY3GpBgHZb0/+0o9l0pC6804zxhBfxSMI
+					g4tNd8Ez+8OUbQ== )
 			60	NSEC	mixed.tc.test. NS DS RRSIG NSEC
 			60	RRSIG	NSEC 13 3 60 (
-					20160727132015 20160627132015 64455 tc.test.
-					hppa5s62Dqg2iofOsnJ6D9Bc8Gg61Um9vAxb
-					P/yGKBKp35m2PJP3iQ9M6WwWUAIiCtxUFCk9
-					W01Xe2Y+OcBHAQ== )
+					20161103154949 20161004154949 43962 tc.test.
+					xT9iBxgZhNMqeyWIQjm1bmiZG0yRU0Z9C2BH
+					gEvl/3vCQoOVlPZRkMvUB8hQideyb8rfwcR4
+					fTtRpkqgK4no4g== )
diff --git a/tests-extra/tests/basic/delegation_tc/data/tc.test.zone.unsigned b/tests-extra/tests/basic/delegation_tc/data/tc.test.zone.unsigned
index b9515a601ec1375ddcbeba1471edec38aee04ee8..2d998f7727aca41ab756fdac331cfb2cc7283e1d 100644
--- a/tests-extra/tests/basic/delegation_tc/data/tc.test.zone.unsigned
+++ b/tests-extra/tests/basic/delegation_tc/data/tc.test.zone.unsigned
@@ -2,10 +2,19 @@ $ORIGIN tc.test.
 $TTL 60
 
 @		SOA	@ admin 1 60 60 1800 60
+
+; local name servers
 		NS	@
-		A	0.0.0.0
+		NS	a1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890a
+		NS	b1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890123456789.1234567890123456789012345678901234567890b
 		AAAA	::
 
+; foreign name server
+		NS	ns.glue.deleg
+ns.glue.deleg	AAAA	::
+glue.deleg	DS	0 0 0 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+glue.deleg	NS	unreachable.glue.deleg
+
 ; delegation with glue
 glue		DS	0 0 0 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 glue		NS	ns1.glue
diff --git a/tests-extra/tests/basic/delegation_tc/test.py b/tests-extra/tests/basic/delegation_tc/test.py
index 877eb2a937460a3bd40c5238c6c8010195e39c12..4b4e7dc23e8fbce230822d0b1b43d7dd93b00a1e 100644
--- a/tests-extra/tests/basic/delegation_tc/test.py
+++ b/tests-extra/tests/basic/delegation_tc/test.py
@@ -13,19 +13,21 @@ t.link(zone, knot)
 t.start()
 
 class DelegationTest:
-    def __init__(self, name):
+    def __init__(self, name, authoritative=False):
         self._name = name
+        self._auth = authoritative
 
     def _get_flags(self, truncated):
-        if truncated:
-            return ("TC", "AA")
+        if self._auth:
+            return ("AA TC", "") if truncated else ("AA", "TC")
         else:
-            return ("", "AA TC")
+            return ("TC", "AA") if truncated else ("", "AA TC")
 
     def run(self, bufsize=None, truncated=False, counts=None):
-        name = "www.%s" % self._name
+        name = "%s%s" % ("" if self._auth else "www.", self._name)
+        rtype = "NS" if self._auth else "A"
         flags, noflags = self._get_flags(truncated)
-        resp = knot.dig(name, "A", udp=True, dnssec=True, bufsize=bufsize)
+        resp = knot.dig(name, rtype, udp=True, dnssec=True, bufsize=bufsize)
         resp.check(rcode="NOERROR", noflags=noflags, flags=flags)
         for section in counts:
             for rtype in counts[section]:
@@ -37,6 +39,35 @@ class DelegationTest:
     def __exit__(self, exc_type, exc_vaue, traceback):
         return False
 
+# Authoritative answer with glue of foreign name server
+
+with DelegationTest("tc.test", authoritative=True) as test:
+    # incomplete answer, no signature
+    test.run(bufsize=592, truncated=True, counts={
+        "answer": {"NS": 4, "RRSIG": 0},
+        "additional": {"AAAA": 0, "RRSIG": 0}}
+    )
+    # complete answer, no additionals
+    test.run(bufsize=695, truncated=False, counts={
+        "answer": {"NS": 4, "RRSIG": 1},
+        "additional": {"AAAA": 0, "RRSIG": 0}}
+    )
+    # complete answer, one optional additional for foreign name server
+    test.run(bufsize=723, truncated=False, counts={
+        "answer": {"NS": 4, "RRSIG": 1},
+        "additional": {"AAAA": 1, "RRSIG": 0}}
+    )
+    # complete answer, all optional additionals
+    test.run(bufsize=751, truncated=False, counts={
+        "answer": {"NS": 4, "RRSIG": 1},
+        "additional": {"AAAA": 2, "RRSIG": 0}}
+    )
+    # complete answer, all optional additionals with signature
+    test.run(bufsize=2000, truncated=False, counts={
+        "answer": {"NS": 4, "RRSIG": 1},
+        "additional": {"AAAA": 2, "RRSIG": 1}}
+    )
+
 # Delegation with glue
 
 with DelegationTest("glue.tc.test") as test:
@@ -61,7 +92,7 @@ with DelegationTest("glue.tc.test") as test:
         "additional": {"AAAA": 1, "RRSIG": 0}}
     )
     # complete delegation, complete glue
-    test.run(bufsize=768, truncated=False, counts={
+    test.run(bufsize=2000, truncated=False, counts={
         "authority": {"NS": 2, "DS": 1, "RRSIG": 1},
         "additional": {"AAAA": 2, "RRSIG": 0}}
     )
@@ -80,10 +111,11 @@ with DelegationTest("unreachable.tc.test") as test:
         "additional": {"AAAA": 0, "RRSIG": 0}}
     )
     # complete delegation, no glue available
-    test.run(bufsize=719, truncated=False, counts={
+    test.run(bufsize=2000, truncated=False, counts={
         "authority": {"NS": 2, "DS": 1, "RRSIG": 1},
         "additional": {"AAAA": 0, "RRSIG": 0}}
     )
+
 # Delegation with foreign name servers
 
 with DelegationTest("foreign.tc.test") as test:
@@ -98,7 +130,7 @@ with DelegationTest("foreign.tc.test") as test:
         "additional": {"AAAA": 0, "RRSIG": 0}}
     )
     # complete delegation, no glue needed
-    test.run(bufsize=722, truncated=False, counts={
+    test.run(bufsize=2000, truncated=False, counts={
         "authority": {"NS": 2, "DS": 1, "RRSIG": 1},
         "additional": {"AAAA": 0, "RRSIG": 0}}
     )
@@ -137,7 +169,7 @@ with DelegationTest("parent.tc.test") as test:
         "additional": {"AAAA": 2, "RRSIG": 1}}
     )
     # complete delegation, all optional additionals with signatures
-    test.run(bufsize=976, truncated=False, counts={
+    test.run(bufsize=2000, truncated=False, counts={
         "authority": {"NS": 2, "DS": 1, "RRSIG": 1},
         "additional": {"AAAA": 2, "RRSIG": 2}}
     )
@@ -176,9 +208,14 @@ with DelegationTest("mixed.tc.test") as test:
         "additional": {"AAAA": 3, "RRSIG": 0}}
     )
     # complete delegation, full glue, optional
-    test.run(bufsize=999, truncated=False, counts={
+    test.run(bufsize=924, truncated=False, counts={
+        "authority": {"NS": 6, "DS": 1, "RRSIG": 1},
+        "additional": {"AAAA": 4, "RRSIG": 0}}
+    )
+    # complete delegation, full glue, optional with signature
+    test.run(bufsize=2000, truncated=False, counts={
         "authority": {"NS": 6, "DS": 1, "RRSIG": 1},
-        "additional": {"AAAA": 3, "RRSIG": 1}}
+        "additional": {"AAAA": 4, "RRSIG": 1}}
     )
 
 t.stop()
diff --git a/tests-extra/tests/basic/flags/test.py b/tests-extra/tests/basic/flags/test.py
index 6370712ea4d425aefca9fa9dc13a0a08f10ea834..4ad7c4cc097ba5fd8404f8ce4de71234b5ac35c0 100644
--- a/tests-extra/tests/basic/flags/test.py
+++ b/tests-extra/tests/basic/flags/test.py
@@ -23,10 +23,10 @@ resp = knot.dig("flags", "NS", flags="RD")
 resp.check(flags="QR AA RD", noflags="TC RA AD CD Z")
 resp.cmp(bind)
 
-# CD flag preservation.
+# CD flag must be cleared (RFC 4035, Section 3.1.6).
 resp = knot.dig("flags", "NS", flags="CD")
-resp.check(flags="QR AA CD", noflags="TC RA AD RD Z")
-resp.cmp(bind)
+resp.check(flags="QR AA", noflags="TC RA AD RD CD Z")
+# Bind preserves CD flag
 
 # TC flag must be cleared
 resp = knot.dig("flags", "NS", flags="TC")
diff --git a/tests-extra/tests/basic/query/test.py b/tests-extra/tests/basic/query/test.py
index 86e0c2dbb44f5175ab7f542c5e726a2b5fbe0e01..89a430eefaa88848b43b61109c63fd136fc87d68 100644
--- a/tests-extra/tests/basic/query/test.py
+++ b/tests-extra/tests/basic/query/test.py
@@ -56,6 +56,11 @@ resp = knot.dig("ns.sub.flags", "A", udp=True)
 resp.check(rcode="NOERROR", flags="QR", noflags="AA TC AD RA")
 resp.cmp(bind, additional=True)
 
+# Positive (REFERRAL, below delegation, ignoring empty-nonterminal during lookup)
+resp = knot.dig("bellow.ns.sub.flags", "A", udp=True)
+resp.check(rcode="NOERROR", flags="QR", noflags="AA TC AD RA")
+resp.cmp(bind, additional=True)
+
 ''' ANY query type. '''
 
 # ANY to SOA record
diff --git a/tests-extra/tests/ctl/basic/test.py b/tests-extra/tests/ctl/basic/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..a7d0043cf5ea2c56c358122657440eeb8c2bc2ca
--- /dev/null
+++ b/tests-extra/tests/ctl/basic/test.py
@@ -0,0 +1,158 @@
+#!/usr/bin/env python3
+
+'''Ctl conf and zone commands test.'''
+
+import os
+
+from dnstest.libknot import libknot
+from dnstest.test import Test
+from dnstest.utils import *
+
+t = Test()
+
+knot = t.server("knot")
+
+ctl = libknot.control.KnotCtl()
+
+ZONE_NAME = "testzone."
+
+t.start()
+
+ctl.connect(os.path.join(knot.dir, "knot.sock"))
+
+# Add new zone.
+ctl.send_block(cmd="conf-begin")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-set", section="zone", item="domain", data=ZONE_NAME)
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-set", section="zone", item="file", identifier=ZONE_NAME,
+               data=os.path.join(knot.dir, ZONE_NAME + "zone"))
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-commit")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-read", section="zone")
+resp = ctl.receive_block()
+
+isset(ZONE_NAME in resp['zone'], "zone configured")
+isset("file" in resp['zone'][ZONE_NAME], "zone.file configured")
+
+# Fill the zone content.
+ctl.send_block(cmd="zone-begin")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-set", zone=ZONE_NAME, owner="@", ttl="3600", rtype="SOA",
+               data="a. b. 1 2 3 4 5")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-set", zone=ZONE_NAME, owner="@", ttl="3600", rtype="A",
+               data="192.168.0.1")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-commit")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-read", zone=ZONE_NAME)
+resp = ctl.receive_block()
+
+isset(ZONE_NAME in resp, "zone content")
+isset("SOA" in resp[ZONE_NAME][ZONE_NAME], "zone SOA presence")
+isset("3600" in resp[ZONE_NAME][ZONE_NAME]["SOA"]["ttl"], "zone SOA ttl")
+isset("a. b. 1 2 3 4 5" in resp[ZONE_NAME][ZONE_NAME]["SOA"]["data"], "zone SOA rdata")
+isset("A" in resp[ZONE_NAME][ZONE_NAME], "zone A presence")
+isset("3600" in resp[ZONE_NAME][ZONE_NAME]["A"]["ttl"], "zone A ttl")
+isset("192.168.0.1" in resp[ZONE_NAME][ZONE_NAME]["A"]["data"], "zone A rdata")
+
+ctl.send(libknot.control.KnotCtlType.END)
+ctl.close()
+
+# Check the zone.
+resp = knot.dig(ZONE_NAME, "SOA")
+resp.check(rcode="NOERROR")
+
+ctl.connect(os.path.join(knot.dir, "knot.sock"))
+
+# Abort remove SOA.
+ctl.send_block(cmd="zone-begin")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-unset", zone=ZONE_NAME, owner="@", rtype="SOA")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-abort")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-read")
+resp = ctl.receive_block()
+
+isset(ZONE_NAME in resp, "zone content")
+isset("SOA" in resp[ZONE_NAME][ZONE_NAME], "zone SOA presence")
+
+# Commit removed A.
+ctl.send_block(cmd="zone-begin")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-unset", zone=ZONE_NAME, owner="@", rtype="A")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-commit")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-read")
+resp = ctl.receive_block()
+
+isset(ZONE_NAME in resp, "zone content")
+isset("A" not in resp[ZONE_NAME][ZONE_NAME], "zone A presence")
+
+# Purge the zone data.
+ctl.send_block(cmd="zone-purge")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="zone-read", section="test-zone")
+resp = ctl.receive_block()
+
+isset(ZONE_NAME not in resp, "zone content")
+
+resp = knot.dig(ZONE_NAME, "SOA")
+resp.check(rcode="SERVFAIL")
+
+# Abort removed zone.
+ctl.send_block(cmd="conf-begin")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-unset", section="zone", item="domain", data=ZONE_NAME)
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-abort")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-read", section="zone")
+resp = ctl.receive_block()
+
+isset(ZONE_NAME in resp["zone"], "zone configured")
+
+# Commit removed zone.
+ctl.send_block(cmd="conf-begin")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-unset", section="zone", item="domain", data=ZONE_NAME)
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-commit")
+resp = ctl.receive_block()
+
+ctl.send_block(cmd="conf-read", section="zone")
+resp = ctl.receive_block()
+
+isset("zone" not in resp, "zone not configured")
+
+ctl.send(libknot.control.KnotCtlType.END)
+ctl.close()
+
+resp = knot.dig(ZONE_NAME, "SOA")
+resp.check(rcode="REFUSED")
+
+t.end()
diff --git a/tests-extra/tests/ddns/basic/test.py b/tests-extra/tests/ddns/basic/test.py
index 17ba2191227f52a15e7e826784f71b3ece725d51..2f5e458993618689dd77a6ce0795976ce68e9ac2 100644
--- a/tests-extra/tests/ddns/basic/test.py
+++ b/tests-extra/tests/ddns/basic/test.py
@@ -515,6 +515,16 @@ def do_refusal_tests(master, zone, dnssec=False):
 
         check_soa(master, prev_soa)
 
+        # Add DNSKEY
+        check_log("non-apex DNSKEY addition")
+        up = master.update(zone)
+        up.add("nonapex.ddns.", "3600", "DNSKEY",
+               "256 3 5 AwEAAbs0AlA6xWQn/lECfGt3S6TaeEmgJfEVVEMh06iNMNWMRHOfbqLF h3N52Ob7trmzlrzGlGLPnAZJvMB8lsFGC5CtaLUBD+4xCh5tl5QifZ+y o+MJvPGlVQI2cs7aMWV9CyFrRmuRcJaSZU2uBz9KFJ955UCq/WIy5KqS 7qaKLzzN")
+        up.send("NOERROR")
+        resp = master.dig("nonapex.ddns.", "DNSKEY")
+        resp.check(rcode="NOERROR",
+                   rdata="256 3 5 AwEAAbs0AlA6xWQn/lECfGt3S6TaeEmgJfEVVEMh06iNMNWMRHOfbqLF h3N52Ob7trmzlrzGlGLPnAZJvMB8lsFGC5CtaLUBD+4xCh5tl5QifZ+y o+MJvPGlVQI2cs7aMWV9CyFrRmuRcJaSZU2uBz9KFJ955UCq/WIy5KqS 7qaKLzzN")
+
 zone = t.zone("ddns.", storage=".")
 
 master_plain = t.server("knot")
diff --git a/tests-extra/tests/dnssec/single_type_signing/test.py b/tests-extra/tests/dnssec/single_type_signing/test.py
index 0860597823b5a78d8289e8e04d5396a2a9c0db13..d76e1a5e89a938bcd22894c7d22fa10bc111780a 100644
--- a/tests-extra/tests/dnssec/single_type_signing/test.py
+++ b/tests-extra/tests/dnssec/single_type_signing/test.py
@@ -8,7 +8,7 @@ from dnstest.test import Test
 t = Test()
 
 knot = t.server("knot")
-zones = t.zone_rnd(4, dnssec=False, records=10)
+zones = t.zone_rnd(5, dnssec=False, records=10)
 t.link(zones, knot)
 t.start()
 
@@ -27,10 +27,15 @@ knot.gen_key(zones[3], ksk=True, alg="RSASHA256", key_len="1024")
 knot.gen_key(zones[3], ksk=False, alg="RSASHA256", key_len="1024")
 knot.gen_key(zones[3], ksk=False, alg="RSASHA512", key_len="1024")
 
-for zone in zones:
+for zone in zones[:-1]:
     knot.dnssec(zone).enable = True
     knot.dnssec(zone).manual = True
 
+# enable automatic Single-Type signing scheme with NSEC3 on the last zone
+knot.dnssec(zones[-1]).enable = True
+knot.dnssec(zones[-1]).nsec3 = True
+knot.dnssec(zones[-1]).single_type_signing = True
+
 knot.gen_confile()
 knot.reload()
 t.sleep(2)
diff --git a/tests-extra/tests/modules/online_sign/test.py b/tests-extra/tests/modules/online_sign/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..6b3097612ae215482e69b2afea74ee7e8a04fd30
--- /dev/null
+++ b/tests-extra/tests/modules/online_sign/test.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+
+'''Check online DNSSEC signing module (just basic checks).'''
+
+import dns.rdatatype
+from dnstest.test import Test
+from dnstest.utils import *
+from dnstest.module import ModOnlineSign
+
+t = Test()
+
+ModOnlineSign.check()
+
+knot = t.server("knot")
+zones = t.zone_rnd(2, dnssec=False, records=5)
+t.link(zones, knot)
+knot.add_module(zones[0], ModOnlineSign())
+knot.add_module(zones[1], ModOnlineSign("RSASHA256"))
+
+def check_zone(zone, dnskey_rdata_start):
+    # Check SOA record.
+    soa1 = knot.dig(zone.name, "SOA", dnssec=True)
+    soa1.check(rcode="NOERROR", flags="QR AA")
+    soa1.check_count(1, "RRSIG")
+
+    t.sleep(1) # Ensure different RRSIGs.
+
+    soa2 = knot.dig(zone.name, "SOA", dnssec=True)
+    soa2.check(rcode="NOERROR", flags="QR AA")
+    soa2.check_count(1, "RRSIG")
+
+    for rrset in soa1.resp.answer:
+        if rrset.rdtype == dns.rdatatype.SOA:
+            if rrset not in soa2.resp.answer:
+                set_err("DIFFERENT SOA")
+                check_log("ERROR: DIFFERENT SOA")
+        elif rrset.rdtype == dns.rdatatype.RRSIG:
+            if rrset in soa2.resp.answer:
+                set_err("UNCHANGED RRSIG")
+                check_log("ERROR: UNCHANGED RRSIG")
+        else:
+            set_err("UNEXPECTED RRSET")
+            check_log("ERROR: UNEXPECTED RRSET")
+            detail_log("%s" % rrset)
+
+    # Check DNSKEY record.
+    resp = knot.dig(zone.name, "DNSKEY", dnssec=True)
+    resp.check(rcode="NOERROR", flags="QR AA")
+    resp.check_count(1, "DNSKEY")
+    resp.check_count(1, "RRSIG")
+
+    for rrset in resp.resp.answer:
+        if rrset.rdtype != dns.rdatatype.DNSKEY:
+            continue
+        else:
+            isset(dnskey_rdata_start in rrset.to_text(), "DNSKEY ALGORITHM")
+
+    # Check NSEC record.
+    resp = knot.dig("nx." + zone.name, "A", dnssec=True)
+    resp.check(rcode="NOERROR", flags="QR AA")
+    resp.check_count(0, section="answer")
+    resp.check_count(1, "SOA", section="authority")
+    resp.check_count(1, "NSEC", section="authority")
+    resp.check_count(2, "RRSIG", section="authority")
+
+t.start()
+knot.zones_wait(zones)
+
+check_zone(zones[0], "256 3 13")
+check_zone(zones[1], "256 3 8")
+
+t.end()
+
diff --git a/tests-extra/tests/modules/rosedb/test.py b/tests-extra/tests/modules/rosedb/test.py
index 2b3775190ff67c4b2633c164c0dd1a6c5f3d12cb..b3a4add728bef034ed52a5c2dd2abd2010a659df 100644
--- a/tests-extra/tests/modules/rosedb/test.py
+++ b/tests-extra/tests/modules/rosedb/test.py
@@ -48,7 +48,7 @@ resp = knot.dig("mail6.example.com", "A")
 resp.check(rcode="NOERROR", noflags="AA")
 compare(resp.count(), 0, "A count")
 
-# Add autority information.
+# Add authority information.
 module.add_record("example.net",     "SOA", "1", "ns1 host 1 3600 60 3600 3600")
 module.add_record("example.net",     "NS",  "2", "ns1.example.net")
 module.add_record("ns1.example.net", "A",   "3", "127.0.0.2")
diff --git a/tests-extra/tests/modules/rrl/test.py b/tests-extra/tests/modules/rrl/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..e4fc4c279fc2a6cce2a0600d7da17747febfd536
--- /dev/null
+++ b/tests-extra/tests/modules/rrl/test.py
@@ -0,0 +1,211 @@
+#!/usr/bin/env python3
+
+'''RRL module functionality test'''
+
+import dns.exception
+import dns.message
+import dns.query
+import os
+import time
+
+from dnstest.libknot import libknot
+from dnstest.test import Test
+from dnstest.module import ModRRL
+from dnstest.utils import *
+
+ctl = libknot.control.KnotCtl()
+
+t = Test(stress=False)
+
+ModRRL.check()
+
+knot = t.server("knot")
+zones = t.zone_rnd(2, dnssec=False, records=1)
+t.link(zones, knot)
+
+def send_queries(server, name, run_time=1.0, query_time=0.05):
+    """
+    Send UDP queries to the server for certain time and get replies statistics.
+    """
+    replied, slipped, dropped = 0, 0, 0
+    start = time.time()
+    while time.time() < start + run_time:
+        try:
+            query = dns.message.make_query(name, "SOA", want_dnssec=False)
+            response = dns.query.udp(query, server.addr, port=server.port, timeout=query_time)
+        except dns.exception.Timeout:
+            response = None
+
+        if response is None:
+            dropped += 1
+        elif response.flags & dns.flags.TC:
+            slipped += 1
+        else:
+            replied += 1
+
+    return dict(replied=replied, slipped=slipped, dropped=dropped)
+
+def check_result(name, res, rate=0, slip=None):
+    """
+    Check response result.
+
+    We cannot send queries in parallel. And we have to give the server some time
+    to respond, especially under valgrind. Therefore we have to be tolerant when
+    counting responses when packets are being dropped.
+    """
+    detail_log("RRL %s" % name)
+    detail_log(", ".join(["%s %d" % (s, res[s]) for s in ["replied", "slipped", "dropped"]]))
+
+    ok = False
+
+    if rate == 0:
+        ok = res["replied"] >= 100 and res["slipped"] == 0 and res["dropped"] == 0
+    elif slip == 0:
+        ok = res["replied"] > 0 and res["replied"] < 100 and \
+             res["slipped"] == 0 and res["dropped"] >= 5
+    elif slip == 1:
+        ok = res["replied"] > 0 and res["replied"] < 100 and \
+             res["slipped"] >= 100 and res["dropped"] == 0
+    else:
+        ok = res["replied"] > 0 and res["replied"] < 100 and \
+             res["slipped"] >= 5 and res["dropped"] >= 5
+
+    if ok:
+        detail_log("success")
+    else:
+        detail_log("error")
+        set_err("RRL ERROR")
+
+def cmp_stats(server, res, zone_name=None):
+    try:
+        ctl = libknot.control.KnotCtl()
+        ctl.connect(os.path.join(server.dir, "knot.sock"))
+
+        if zone_name:
+            ctl.send_block(cmd="zone-stats", section="mod-rrl", zone=zone_name, flags="F")
+        else:
+            ctl.send_block(cmd="stats", section="mod-rrl", flags="F")
+
+        stats = ctl.receive_stats()
+        detail_log(stats)
+
+        if zone_name:
+            ok = int(stats["zone"][zone_name.lower()]["mod-rrl"]["dropped"]) == res["dropped"] and \
+                 int(stats["zone"][zone_name.lower()]["mod-rrl"]["slipped"]) == res["slipped"]
+        else:
+            ok = int(stats["mod-rrl"]["dropped"]) == res["dropped"] and \
+                 int(stats["mod-rrl"]["slipped"]) == res["slipped"]
+
+        if ok:
+            detail_log("stats success")
+        else:
+            detail_log("stats error")
+            set_err("RRL STATS ERROR")
+
+    finally:
+        ctl.send(libknot.control.KnotCtlType.END)
+        ctl.close()
+
+def reconfigure(server, zone, rate_limit, slip, whitelist=None):
+    """
+    Reconfigure server module.
+    """
+    server.clear_modules(None)
+    server.clear_modules(zone)
+    server.add_module(zone, ModRRL(rate_limit=rate_limit, slip=slip, whitelist=whitelist))
+    server.gen_confile()
+    server.reload()
+
+t.start()
+
+knot.zones_wait(zones)
+
+### RRL global module
+
+# Disabled
+res = send_queries(knot, zones[0].name)
+check_result("disabled", res)
+
+# All drop
+reconfigure(knot, None, 5, 0)
+res = send_queries(knot, zones[0].name)
+check_result("global, zone 1, all drop", res, 5, 0)
+cmp_stats(knot, res)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("global, zone 2, all drop", res, 5, 0)
+detail_log(SEP)
+
+# All slip
+reconfigure(knot, None, 5, 1)
+res = send_queries(knot, zones[0].name)
+check_result("global, zone 1, all slip", res, 5, 1)
+cmp_stats(knot, res)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("global, zone 2, all slip", res, 5, 1)
+detail_log(SEP)
+
+# 50% slip
+reconfigure(knot, None, 5, 2)
+res = send_queries(knot, zones[0].name)
+check_result("global, zone 1, 50% slip", res, 5, 2)
+cmp_stats(knot, res)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("global, zone 2, 50% slip", res, 5, 2)
+detail_log(SEP)
+
+# Whitelist
+reconfigure(knot, None, 5, 0, whitelist=knot.addr)
+res = send_queries(knot, zones[0].name)
+cmp_stats(knot, res)
+check_result("global, zone 1, whitelist", res, 0)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("global, zone 2, whitelist", res, 0)
+detail_log(SEP)
+
+### RRL zone module
+
+# All drop
+reconfigure(knot, zones[0], 5, 0)
+res = send_queries(knot, zones[0].name)
+check_result("zone 1, all drop", res, 5, 0)
+cmp_stats(knot, res, zones[0].name)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("zone 2, disabled", res)
+detail_log(SEP)
+
+# All slip
+reconfigure(knot, zones[0], 5, 1)
+res = send_queries(knot, zones[0].name)
+check_result("zone 1, all slip", res, 5, 1)
+cmp_stats(knot, res, zones[0].name)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("zone 2, disabled", res)
+detail_log(SEP)
+
+# 50% slip
+reconfigure(knot, zones[0], 5, 2)
+res = send_queries(knot, zones[0].name)
+check_result("zone 1, 50% slip", res, 5, 2)
+cmp_stats(knot, res, zones[0].name)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("zone 2, disabled", res)
+detail_log(SEP)
+
+# Whitelist
+reconfigure(knot, zones[0], 5, 0, whitelist=knot.addr)
+res = send_queries(knot, zones[0].name)
+check_result("zone 1, whitelist", res, 0)
+cmp_stats(knot, res, zones[0].name)
+time.sleep(2)
+res = send_queries(knot, zones[1].name)
+check_result("zone 2, disabled", res)
+detail_log(SEP)
+
+t.end()
diff --git a/tests-extra/tests/modules/stats/test.py b/tests-extra/tests/modules/stats/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..23c0e6f987543094fdd94cad7ed109d330b07ff1
--- /dev/null
+++ b/tests-extra/tests/modules/stats/test.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python3
+
+''' Check 'stats' query module functionality. '''
+
+import os
+import random
+
+from dnstest.libknot import libknot
+from dnstest.module import ModStats
+from dnstest.test import Test
+from dnstest.utils import *
+
+def check_item(server, section, item, value, idx=None, zone=None):
+    try:
+        ctl = libknot.control.KnotCtl()
+        ctl.connect(os.path.join(server.dir, "knot.sock"))
+
+        if zone:
+            ctl.send_block(cmd="zone-stats", section=section, item=item, zone=zone.name)
+        else:
+            ctl.send_block(cmd="stats", section=section, item=item)
+
+        stats = ctl.receive_stats()
+    finally:
+        ctl.send(libknot.control.KnotCtlType.END)
+        ctl.close()
+
+    if not stats and value == -1:
+        return
+
+    if zone:
+        stats = stats.get("zone").get(zone.name.lower())
+
+    if idx:
+        if value == -1:
+            isset(idx not in stats.get(section).get(item), idx)
+            return
+        else:
+            data = int(stats.get(section).get(item).get(idx))
+    else:
+        data = int(stats.get(section).get(item))
+
+    compare(data, value, "%s.%s" % (section, item))
+
+ModStats.check()
+
+proto = random.choice([4, 6])
+
+t = Test(stress=False, tsig=False, address=proto)
+
+knot = t.server("knot")
+zones = t.zone_rnd(2)
+
+t.link(zones, knot)
+
+knot.add_module(None,     ModStats())
+knot.add_module(zones[0], ModStats())
+knot.add_module(zones[1], ModStats())
+
+t.start()
+t.sleep(1)
+
+check_item(knot, "server", "zone-count", 2)
+
+resp = knot.dig(zones[0].name, "SOA", tries=1, udp=True)
+query_size1 = resp.query_size()
+reply_size1 = resp.response_size()
+
+resp = knot.dig(zones[0].name, "NS", tries=1, udp=False)
+query_size2 = resp.query_size()
+reply_size2 = resp.response_size()
+
+resp = knot.dig(zones[1].name, "TYPE11", tries=1, udp=True)
+query_size3 = resp.query_size()
+reply_size3 = resp.response_size()
+
+# Sucessfull transfer.
+resp = knot.dig(zones[0].name, "AXFR", tries=1)
+resp.check_xfr(rcode="NOERROR")
+xfr_query_size = resp.query_size()
+# Cannot get xfr_reply_size :-/
+
+# Successfull update.
+up = knot.update(zones[1])
+up.add(zones[1].name, "3600", "AAAA", "::1")
+up.send("NOERROR")
+ddns_query_size = up.query_size()
+# Due to DDNS bulk processing, failed RCODE and response-bytes are not incremented!
+
+# Check request protocol metrics.
+check_item(knot, "mod-stats", "request-protocol", 2, "udp%s" % proto)
+check_item(knot, "mod-stats", "request-protocol", 1, "udp%s" % proto, zone=zones[0])
+check_item(knot, "mod-stats", "request-protocol", 1, "udp%s" % proto, zone=zones[1])
+
+check_item(knot, "mod-stats", "request-protocol", 3, "tcp%s" % proto)
+check_item(knot, "mod-stats", "request-protocol", 2, "tcp%s" % proto, zone=zones[0])
+
+# Check request/response bytes metrics.
+check_item(knot, "mod-stats", "request-bytes",  query_size1 + query_size2 + query_size3,
+                                                "query")
+check_item(knot, "mod-stats", "request-bytes",  ddns_query_size, "update")
+check_item(knot, "mod-stats", "request-bytes",  xfr_query_size, "other")
+
+check_item(knot, "mod-stats", "response-bytes", reply_size1 + reply_size2 + reply_size3,
+                                                "reply")
+
+check_item(knot, "mod-stats", "request-bytes",  query_size1 + query_size2, "query",
+                                                zone=zones[0])
+check_item(knot, "mod-stats", "response-bytes", reply_size1 + reply_size2, "reply",
+                                                zone=zones[0])
+
+check_item(knot, "mod-stats", "request-bytes",  query_size3, "query", zone=zones[1])
+check_item(knot, "mod-stats", "response-bytes", reply_size3, "reply", zone=zones[1])
+
+# Check query size metrics (just for global module).
+indices = dict()
+for size in [query_size1, query_size2, query_size3]:
+    idx = "%i-%i" % (int(size / 16) * 16, int(size / 16) * 16 + 15)
+    if idx not in indices:
+        indices[idx] = 1
+    else:
+        indices[idx] += 1;
+for size in indices:
+    check_item(knot, "mod-stats", "query-size", indices[size], idx=size)
+
+# Check reply size metrics (just for global module).
+indices = dict()
+for size in [reply_size1, reply_size2, reply_size3]:
+    idx = "%i-%i" % (int(size / 16) * 16, int(size / 16) * 16 + 15)
+    if idx not in indices:
+        indices[idx] = 1
+    else:
+        indices[idx] += 1;
+for size in indices:
+    check_item(knot, "mod-stats", "reply-size", indices[size], idx=size)
+
+# Check query type metrics.
+check_item(knot, "mod-stats", "query-type",  1, idx="SOA")
+check_item(knot, "mod-stats", "query-type",  1, idx="NS")
+check_item(knot, "mod-stats", "query-type",  1, idx="TYPE11")
+
+check_item(knot, "mod-stats", "query-type",  1, idx="SOA",    zone=zones[0])
+check_item(knot, "mod-stats", "query-type",  1, idx="NS",     zone=zones[0])
+check_item(knot, "mod-stats", "query-type", -1, idx="TYPE11", zone=zones[0])
+
+check_item(knot, "mod-stats", "query-type", -1, idx="SOA",    zone=zones[1])
+check_item(knot, "mod-stats", "query-type", -1, idx="NS",     zone=zones[1])
+check_item(knot, "mod-stats", "query-type",  1, idx="TYPE11", zone=zones[1])
+
+# Check server operation metrics.
+check_item(knot, "mod-stats", "server-operation", 3, idx="query")
+check_item(knot, "mod-stats", "server-operation", 1, idx="axfr")
+check_item(knot, "mod-stats", "server-operation", 1, idx="update")
+
+# Check response code metrics.
+check_item(knot, "mod-stats", "response-code", 4, idx="NOERROR")
+check_item(knot, "mod-stats", "response-code", 3, idx="NOERROR", zone=zones[0])
+check_item(knot, "mod-stats", "response-code", 1, idx="NOERROR", zone=zones[1])
+
+# Check nodata metrics.
+check_item(knot, "mod-stats", "reply-nodata",  1, idx="other")
+check_item(knot, "mod-stats", "reply-nodata", -1, idx="other", zone=zones[0])
+check_item(knot, "mod-stats", "reply-nodata",  1, idx="other", zone=zones[1])
+
+t.end()
diff --git a/tests-extra/tests/records/load/test.py b/tests-extra/tests/records/load/test.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f4dc55216fb50efaa054dddc63cef86c1dd0803
--- /dev/null
+++ b/tests-extra/tests/records/load/test.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+
+'''Test for loading of dumped zone'''
+
+from dnstest.test import Test
+
+t = Test()
+
+master = t.server("bind")
+slave = t.server("knot")
+reference = t.server("bind")
+
+zones = t.zone_rnd(4) + t.zone(".") + t.zone("records.")
+
+t.link(zones, master, slave)
+t.link(zones, reference)
+
+t.start()
+
+# Wait for servers.
+master.zones_wait(zones)
+slave.zones_wait(zones)
+reference.zones_wait(zones)
+
+# Dump zones on slave.
+slave.flush()
+
+# Compare master with reference server
+t.xfr_diff(reference, master, zones)
+
+# Compare slave with reference server
+t.xfr_diff(reference, slave, zones)
+
+# Stop master.
+master.stop()
+
+# Reload dumped zone files.
+slave.stop()
+slave.start()
+
+# Compare reloaded slave with reference server
+slave.zones_wait(zones)
+t.xfr_diff(reference, slave, zones)
+
+t.end()
diff --git a/tests-extra/tests/security/dnsheader/test.py b/tests-extra/tests/security/dnsheader/test.py
index 800464d5e462aa7a9f8a765f98d1811cf89b94da..a32fa736bdb9f74ee236fee739ca3dfab37502c2 100644
--- a/tests-extra/tests/security/dnsheader/test.py
+++ b/tests-extra/tests/security/dnsheader/test.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-'''DNS packet header parsing tests. '''
+'''DNS packet header parsing tests.'''
 
 import socket
 from dnstest.test import Test
@@ -21,11 +21,11 @@ data = '\x00'
 max_len = (12 + 5) # Header + minimal question size
 udp_socket = knot.create_sock(socket.SOCK_DGRAM)
 for i in range(1, max_len):
-	knot.send_raw(data * i, udp_socket)
+    knot.send_raw(data * i, udp_socket)
 udp_socket.close()
 
-# Check if the server is still alive 
-resp = knot.dig("example.com", "SOA", timeout=5, tries=1)
+# Check if the server is still alive
+resp = knot.dig("example.com", "SOA")
 resp.check(rcode="NOERROR")
 
 t.end()
diff --git a/tests-extra/tests/zone/load/test.py b/tests-extra/tests/zone/load/test.py
index 9f4dc55216fb50efaa054dddc63cef86c1dd0803..c40b7581d1a29487cb825557912a6cefe0589241 100644
--- a/tests-extra/tests/zone/load/test.py
+++ b/tests-extra/tests/zone/load/test.py
@@ -1,45 +1,43 @@
 #!/usr/bin/env python3
 
-'''Test for loading of dumped zone'''
+'''Test for slave zone refresh when loading.'''
 
 from dnstest.test import Test
+from dnstest.utils import *
 
 t = Test()
 
-master = t.server("bind")
+master = t.server("knot")
 slave = t.server("knot")
-reference = t.server("bind")
-
-zones = t.zone_rnd(4) + t.zone(".") + t.zone("records.")
+slave.disable_notify = True
 
+zone_del = t.zone_rnd(1, dnssec=False)
+zone_upd = t.zone_rnd(1, dnssec=False)
+zones = zone_del + zone_upd
 t.link(zones, master, slave)
-t.link(zones, reference)
 
 t.start()
 
-# Wait for servers.
-master.zones_wait(zones)
+serial_del_init = master.zone_wait(zone_del)
+serial_upd_init = master.zone_wait(zone_upd)
 slave.zones_wait(zones)
-reference.zones_wait(zones)
-
-# Dump zones on slave.
-slave.flush()
 
-# Compare master with reference server
-t.xfr_diff(reference, master, zones)
+slave.stop()
 
-# Compare slave with reference server
-t.xfr_diff(reference, slave, zones)
+# Update a zonefile on the master.
+master.update_zonefile(zone_upd, random=True)
+master.reload()
 
-# Stop master.
-master.stop()
+# Remove a zonefile on the slave.
+slave.clean(zone=zone_del, timers=False)
 
-# Reload dumped zone files.
-slave.stop()
 slave.start()
 
-# Compare reloaded slave with reference server
-slave.zones_wait(zones)
-t.xfr_diff(reference, slave, zones)
+# Check for immediate zone transfer if deleted.
+slave.zone_wait(zone_del, serial=serial_del_init, equal=True, greater=False)
+
+# Check for untouched zone if retransfer already scheduled.
+serial_upd = slave.zone_wait(zone_upd)
+master.zone_wait(zone_upd, serial_upd, equal=False, greater=True)
 
 t.end()
diff --git a/tests-extra/tools/dnstest/libknot.py b/tests-extra/tools/dnstest/libknot.py
new file mode 100644
index 0000000000000000000000000000000000000000..418b5a8491cda2465879821806f5ea6a59b6d2b2
--- /dev/null
+++ b/tests-extra/tools/dnstest/libknot.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python3
+
+import sys
+
+from dnstest.utils import Skip
+import dnstest.params as params
+
+try:
+    sys.path.append(params.repo_binary("python"))
+    import libknot.control
+    libknot.control.load_lib(params.libknot_lib)
+except:
+    raise Skip("libknot not available")
diff --git a/tests-extra/tools/dnstest/module.py b/tests-extra/tools/dnstest/module.py
index 5b6457754c2e537a2ebbe69671f0cc0604a68c57..47a9cb94c4129ef81f1202689f589df9ce582380 100644
--- a/tests-extra/tools/dnstest/module.py
+++ b/tests-extra/tools/dnstest/module.py
@@ -16,6 +16,8 @@ class KnotModule(object):
     src_name = None
     # Module name in the configuration.
     conf_name = None
+    # Empty configuration
+    empty = False
 
     def __init__(self):
         self.conf_id = "id%s" % type(self).count
@@ -47,9 +49,12 @@ class KnotModule(object):
             raise Skip("Module '%s' not detected" % cls.conf_name)
 
     def get_conf_ref(self):
-        return "%s/%s" % (self.conf_name, self.conf_id)
+        if self.empty:
+            return str(self.conf_name)
+        else:
+            return "%s/%s" % (self.conf_name, self.conf_id)
 
-    def get_conf(self): pass
+    def get_conf(self, conf=None): pass
 
 class ModSynthRecord(KnotModule):
     '''Automatic forward/reverse records module'''
@@ -104,6 +109,36 @@ class ModDnstap(KnotModule):
 
         return conf
 
+class ModRRL(KnotModule):
+    '''RRL module'''
+
+    src_name = "rrl_load"
+    conf_name = "mod-rrl"
+
+    def __init__(self, rate_limit, slip=None, table_size=None, whitelist=None):
+        super().__init__()
+        self.rate_limit = rate_limit
+        self.slip = slip
+        self.table_size = table_size
+        self.whitelist = whitelist
+
+    def get_conf(self, conf=None):
+        if not conf:
+            conf = dnstest.config.KnotConf()
+
+        conf.begin(self.conf_name)
+        conf.id_item("id", self.conf_id)
+        conf.item_str("rate-limit", self.rate_limit)
+        if self.slip or self.slip == 0:
+            conf.item_str("slip", self.slip)
+        if self.table_size:
+            conf.item_str("table-size", self.table_size)
+        if self.whitelist:
+            conf.item_str("whitelist", self.whitelist)
+        conf.end()
+
+        return conf
+
 class ModDnsproxy(KnotModule):
     '''Dnsproxy module'''
 
@@ -139,17 +174,37 @@ class ModWhoami(KnotModule):
 
     src_name = "whoami_load"
     conf_name = "mod-whoami"
+    empty = True
 
     def __init__(self):
         super().__init__()
 
+class ModOnlineSign(KnotModule):
+    '''Online-sign module'''
+
+    src_name = "online_sign_load"
+    conf_name = "mod-online-sign"
+
+    def __init__(self, algorithm=None):
+        super().__init__()
+        self.algorithm = algorithm
+        if not algorithm:
+            self.empty = True
+
     def get_conf(self, conf=None):
         if not conf:
             conf = dnstest.config.KnotConf()
 
-        conf.begin(self.conf_name)
-        conf.id_item("id", self.conf_id)
-        conf.end()
+        if self.algorithm:
+            conf.begin("policy")
+            conf.id_item("id", "%s_%s" % (self.conf_name, self.conf_id))
+            conf.item_str("algorithm", self.algorithm)
+            conf.end()
+
+            conf.begin(self.conf_name)
+            conf.id_item("id", self.conf_id)
+            conf.item_str("policy", "%s_%s" % (self.conf_name, self.conf_id))
+            conf.end()
 
         return conf
 
@@ -185,3 +240,36 @@ class ModRosedb(KnotModule):
             set_err("ROSEDB_TOOL")
             detail_log("!Failed to add a record into rosedb '%s'" % self.dbdir)
             detail_log(SEP)
+
+class ModStats(KnotModule):
+    '''Stats module'''
+
+    src_name = "stats_load"
+    conf_name = "mod-stats"
+
+    def __init__(self):
+        super().__init__()
+
+    def _bool(self, conf, name, value=True):
+        conf.item_str(name, "on" if value else "off")
+
+    def get_conf(self, conf=None):
+        if not conf:
+            conf = dnstest.config.KnotConf()
+
+        conf.begin(self.conf_name)
+        conf.id_item("id", self.conf_id)
+        self._bool(conf, "request-protocol", True)
+        self._bool(conf, "server-operation", True)
+        self._bool(conf, "request-bytes", True)
+        self._bool(conf, "response-bytes", True)
+        self._bool(conf, "edns-presence", True)
+        self._bool(conf, "flag-presence", True)
+        self._bool(conf, "response-code", True)
+        self._bool(conf, "reply-nodata", True)
+        self._bool(conf, "query-type", True)
+        self._bool(conf, "query-size", True)
+        self._bool(conf, "reply-size", True)
+        conf.end()
+
+        return conf
diff --git a/tests-extra/tools/dnstest/params.py b/tests-extra/tools/dnstest/params.py
index 3fc5aefeef47a6ee5142cf35ddf2a83faae6010b..e76e2fb893a36d91971828c2542f0aa8724184c0 100644
--- a/tests-extra/tools/dnstest/params.py
+++ b/tests-extra/tools/dnstest/params.py
@@ -42,15 +42,17 @@ debug = False
 # KNOT_TEST_VALGRIND - valgrind binary if defined.
 valgrind_bin = get_binary("KNOT_TEST_VALGRIND", "valgrind")
 # KNOT_TEST_VALGRIND_FLAGS - valgrind flags.
-# Server settings: "--leak-check=full --track-origins=yes --vgdb=yes --verbose"
+# Server settings: "--leak-check=full --track-origins=yes --vgdb=yes --verbose --trace-children=yes --trace-children-skip=/usr/*sh,/bin/*sh"
 valgrind_flags = get_param("KNOT_TEST_VALGRIND_FLAGS",
-                           "--leak-check=full --show-leak-kinds=all --vgdb=yes --verbose")
+                           "--leak-check=full --show-leak-kinds=all --vgdb=yes --verbose --trace-children=yes --trace-children-skip=/usr/*sh,/bin/*sh")
 # KNOT_TEST_GDB - gdb binary.
 gdb_bin = get_binary("KNOT_TEST_GDB", "gdb")
 # KNOT_TEST_VGDB - vgdb binary.
 vgdb_bin = get_binary("KNOT_TEST_VGDB", "vgdb")
 # KNOT_TEST_LIBTOOL - libtool script.
 libtool_bin = get_binary("KNOT_TEST_LIBTOOL", repo_binary("libtool"))
+# KNOT_TEST_LIBKNOT - libknot library.
+libknot_lib = get_binary("KNOT_TEST_LIBKNOT", repo_binary("src/.libs/libknot.so"))
 # KNOT_TEST_KNOT - Knot binary.
 knot_bin = get_binary("KNOT_TEST_KNOT", repo_binary("src/knotd"))
 # KNOT_TEST_KNOTC - Knot control binary.
diff --git a/tests-extra/tools/dnstest/response.py b/tests-extra/tools/dnstest/response.py
index 2df0effb14de0591f889eb2c12f49a252939a35c..f5ae00d3bba91215be137444173553f7b5c49ba7 100644
--- a/tests-extra/tools/dnstest/response.py
+++ b/tests-extra/tools/dnstest/response.py
@@ -392,3 +392,13 @@ class Response(object):
                 for rr in nsec3_rrs:
                     detail_log("  %s" % rr)
                 detail_log(SEP)
+
+    def query_size(self):
+        '''Return query size.'''
+
+        return len(self.query.to_wire())
+
+    def response_size(self):
+        '''Return response size.'''
+
+        return len(self.resp.to_wire())
diff --git a/tests-extra/tools/dnstest/server.py b/tests-extra/tools/dnstest/server.py
index 4e62662118e1f5177bf29182f83e0d7ca8442de0..3660f8cc824baa39f7c5056d1998949f4430625f 100644
--- a/tests-extra/tools/dnstest/server.py
+++ b/tests-extra/tools/dnstest/server.py
@@ -37,6 +37,7 @@ class ZoneDnssec(object):
     def __init__(self):
         self.enable = None
         self.manual = None
+        self.single_type_signing = None
         self.alg = None
         self.ksk_size = None
         self.zsk_size = None
@@ -64,6 +65,9 @@ class Zone(object):
     def add_module(self, module):
         self.modules.append(module)
 
+    def clear_modules(self):
+        self.modules.clear()
+
     def disable_master(self, new_zone_file):
         self.zfile.remove()
         self.zfile = new_zone_file
@@ -115,8 +119,8 @@ class Server(object):
         self.max_udp6_payload = None
         self.disable_any = None
         self.disable_notify = None
-        self.zonefile_sync = None
-        self.journal_size = None
+        self.zonefile_sync = "1d"
+        self.journal_db_size = 20 * 1024 * 1024
         self.zone_size_limit = None
 
         self.inquirer = None
@@ -661,8 +665,18 @@ class Server(object):
         else:
             self.modules.append(module)
 
+    def clear_modules(self, zone):
+        zone = zone_arg_check(zone)
+
+        if zone:
+            self.zones[zone.name].clear_modules()
+        else:
+            self.modules.clear()
+
     def clean(self, zone=True, timers=True):
         if zone:
+            zone = zone_arg_check(zone)
+
             # Remove all zonefiles.
             if zone is True:
                 for _z in sorted(self.zones):
@@ -1022,6 +1036,7 @@ class Knot(Server):
                 continue
             s.id_item("id", z.name)
             self._bool(s, "manual", z.dnssec.manual)
+            self._bool(s, "single-type-signing", z.dnssec.single_type_signing)
             self._str(s, "algorithm", z.dnssec.alg)
             self._str(s, "ksk_size", z.dnssec.ksk_size)
             self._str(s, "zsk_size", z.dnssec.zsk_size)
@@ -1035,12 +1050,8 @@ class Knot(Server):
         s.id_item("id", "default")
         s.item_str("storage", self.dir)
         s.item_str("kasp-db", self.keydir)
-        if self.zonefile_sync:
-            s.item_str("zonefile-sync", self.zonefile_sync)
-        else:
-            s.item_str("zonefile-sync", "1d")
-        if self.journal_size:
-            s.item_str("max-journal-size", self.journal_size)
+        s.item_str("zonefile-sync", self.zonefile_sync)
+        s.item_str("max-journal-db-size", self.journal_db_size)
         s.item_str("semantic-checks", "on")
         if self.disable_any:
             s.item_str("disable-any", "on")
diff --git a/tests-extra/tools/dnstest/update.py b/tests-extra/tools/dnstest/update.py
index 6532be807dcad4b53f753831ad30757ee9ac2c79..6c9ef5412e304fbb901a3253fbfa245e2c783ee8 100644
--- a/tests-extra/tools/dnstest/update.py
+++ b/tests-extra/tools/dnstest/update.py
@@ -42,3 +42,8 @@ class Update(object):
         if self.upd.keyring and not resp.had_tsig:
             set_err("INVALID RESPONSE")
             check_log("ERROR: Expected TSIG signed response")
+
+    def query_size(self):
+        '''Return update query size.'''
+
+        return len(self.upd.to_wire())
diff --git a/tests-fuzz/.gitignore b/tests-fuzz/.gitignore
index 6ac8bb7422b5301f63d047b6d847582cc3e1480e..c8a7a2024c23271096c4a2efecd8de4fab5f7567 100644
--- a/tests-fuzz/.gitignore
+++ b/tests-fuzz/.gitignore
@@ -4,3 +4,4 @@
 /knotd_stdio
 /packet
 /packet_libfuzzer
+/wrap/main.c
diff --git a/tests-fuzz/Makefile.am b/tests-fuzz/Makefile.am
index 992c87bfd7144960c79b532f332b70e89904080d..1ffb89631ac00a736c508c740a587356a049a990 100644
--- a/tests-fuzz/Makefile.am
+++ b/tests-fuzz/Makefile.am
@@ -1,7 +1,10 @@
 AM_CPPFLAGS = \
-	-include $(top_builddir)/src/config.h \
-	-I$(top_srcdir)/src \
-	-I$(top_srcdir)/src/dnssec/lib
+	-include $(top_builddir)/src/config.h	\
+	-I$(top_srcdir)/src			\
+	-I$(top_srcdir)/src/dnssec/lib		\
+        -DCONFIG_DIR='"${config_dir}"'          \
+        -DSTORAGE_DIR='"${storage_dir}"'        \
+        -DRUN_DIR='"${run_dir}"'
 
 LDADD = \
 	$(top_builddir)/src/libknot.la
@@ -15,10 +18,17 @@ check_PROGRAMS += packet_libfuzzer
 packet_libfuzzer_LDADD = $(LDADD) $(libfuzzer_LIBS) -lstdc++
 endif
 
-knotd_stdio_SOURCES = wrap/server.c wrap/tcp-handler.c wrap/udp-handler.c
+packet_SOURCES = packet.c afl-loop.h
+knotd_stdio_SOURCES = wrap/server.c wrap/tcp-handler.c wrap/udp-handler.c afl-loop.h
+nodist_knotd_stdio_SOURCES = wrap/main.c
 knotd_stdio_CPPFLAGS = $(AM_CPPFLAGS) $(liburcu_CFLAGS)
 knotd_stdio_LDADD = \
-	$(top_builddir)/src/utils/knotd/knotd-main.o \
-	$(top_builddir)/src/libknotd.la $(liburcu_LIBS)
+	$(top_builddir)/src/libknotd.la $(top_builddir)/src/libcontrib.la \
+	$(liburcu_LIBS)
+BUILT_SOURCES = wrap/main.c
+CLEANFILES = wrap/main.c
+wrap/main.c: Makefile $(top_builddir)/src/utils/knotd/main.c
+	echo '#include "afl-loop.h"' > $@
+	$(SED) -e 's/for (;;)/while (__AFL_LOOP(1000))/' $(top_srcdir)/src/utils/knotd/main.c >>$@
 
 check-compile: $(check_PROGRAMS)
diff --git a/tests-fuzz/afl-loop.h b/tests-fuzz/afl-loop.h
new file mode 100644
index 0000000000000000000000000000000000000000..4db002ef2421887f696c487d469768dd036313dd
--- /dev/null
+++ b/tests-fuzz/afl-loop.h
@@ -0,0 +1,4 @@
+#pragma once
+#ifndef __AFL_COMPILER
+#define __AFL_LOOP(x) (0)
+#endif
diff --git a/tests-fuzz/packet.c b/tests-fuzz/packet.c
index bc6fc7ec74ad651ed2a4f8a94b9c9da8184497a2..feb381ec2bd51298de1232a7c06a294dee5c53a1 100644
--- a/tests-fuzz/packet.c
+++ b/tests-fuzz/packet.c
@@ -20,10 +20,11 @@
 #include <signal.h>
 
 #include "libknot/libknot.h"
+#include "afl-loop.h"
 
 int main(void)
 {
-	for(;;) {
+	while (__AFL_LOOP(1000)) {
 		uint8_t buffer[UINT16_MAX + 1] = { 0 };
 		size_t len = fread(buffer, 1, sizeof(buffer), stdin);
 
@@ -32,10 +33,6 @@ int main(void)
 		int r = knot_pkt_parse(pkt, 0);
 		knot_pkt_free(&pkt);
 
-		if (getenv("AFL_PERSISTENT")) {
-			raise(SIGSTOP);
-		} else {
-			return (r == KNOT_EOK ? 0 : 1);
-		}
+		return (r == KNOT_EOK ? 0 : 1);
 	}
 }
diff --git a/tests/.gitignore b/tests/.gitignore
index 6668bb4a63c93ebd3e82a01792ac717695258a5d..e74e5bac1804e3fe02f0c48925fe253eca75ad20 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -5,11 +5,11 @@
 /contrib/test_base32hex
 /contrib/test_base64
 /contrib/test_endian
-/contrib/test_hat-trie
 /contrib/test_heap
 /contrib/test_hhash
 /contrib/test_net
 /contrib/test_net_shortwrite
+/contrib/test_qp-trie
 /contrib/test_sockaddr
 /contrib/test_string
 /contrib/test_strtonum
@@ -37,30 +37,33 @@
 /libknot/test_ypscheme
 /libknot/test_yptrafo
 
-/acl
-/changeset
-/conf
-/conf_tools
-/confdb
-/confio
-/dthreads
-/fdset
-/journal
-/modules/online_sign
-/node
-/process_query
-/query_module
-/requestor
-/rrl
-/semantic_check
-/server
+/modules/test_online_sign
+/modules/test_rrl
+
 /utils/test_cert
 /utils/test_lookup
-/worker_pool
-/worker_queue
-/zone_events
-/zone_serial
-/zone_timers
-/zone_update
-/zonedb
-/ztree
+
+/test_acl
+/test_changeset
+/test_conf
+/test_conf_tools
+/test_confdb
+/test_confio
+/test_dthreads
+/test_fdset
+/test_journal
+/test_node
+/test_process_answer
+/test_process_query
+/test_query_module
+/test_requestor
+/test_semantic_check
+/test_server
+/test_worker_pool
+/test_worker_queue
+/test_zone-tree
+/test_zone-update
+/test_zone_events
+/test_zone_serial
+/test_zone_timers
+/test_zonedb
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3a24add52150b1740f12eeadc5939a871ea2f400..898063bbbdc248aa041d6707fcee298cc8c58296 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -8,17 +8,18 @@ LDADD = \
 	$(top_builddir)/libtap/libtap.la \
 	$(top_builddir)/src/libknot.la \
 	$(top_builddir)/src/libknotd.la \
+	$(top_builddir)/src/libcontrib.la \
 	$(libcrypto_LIBS)
 
 check_PROGRAMS = \
 	contrib/test_base32hex		\
 	contrib/test_base64		\
 	contrib/test_endian		\
-	contrib/test_hat-trie		\
 	contrib/test_heap		\
 	contrib/test_hhash		\
 	contrib/test_net		\
 	contrib/test_net_shortwrite	\
+	contrib/test_qp-trie		\
 	contrib/test_sockaddr		\
 	contrib/test_string		\
 	contrib/test_strtonum		\
@@ -48,32 +49,36 @@ check_PROGRAMS += \
 	libknot/test_yptrafo
 
 check_PROGRAMS += \
-	modules/online_sign		\
+	modules/test_online_sign	\
+	modules/test_rrl
+
+check_PROGRAMS += \
 	utils/test_cert			\
-	utils/test_lookup		\
-	acl				\
-	changeset			\
-	conf				\
-	conf_tools			\
-	confdb				\
-	confio				\
-	dthreads			\
-	fdset				\
-	journal				\
-	node				\
-	process_query			\
-	query_module			\
-	requestor			\
-	rrl				\
-	server				\
-	worker_pool			\
-	worker_queue			\
-	zone_events			\
-	zone_serial			\
-	zone_timers			\
-	zone_update			\
-	zonedb				\
-	ztree
+	utils/test_lookup
+
+check_PROGRAMS += \
+	test_acl			\
+	test_changeset			\
+	test_conf			\
+	test_conf_tools			\
+	test_confdb			\
+	test_confio			\
+	test_dthreads			\
+	test_fdset			\
+	test_journal			\
+	test_node			\
+	test_process_query		\
+	test_query_module		\
+	test_requestor			\
+	test_server			\
+	test_worker_pool		\
+	test_worker_queue		\
+	test_zone-tree			\
+	test_zone-update		\
+	test_zone_events		\
+	test_zone_serial		\
+	test_zone_timers		\
+	test_zonedb
 
 utils_test_lookup_CPPFLAGS = \
 	$(AM_CPPFLAGS) \
@@ -106,8 +111,8 @@ check-local: $(check_PROGRAMS) $(check_SCRIPTS)
 					-L $(top_builddir)/tests/runtests.log \
 					$(check_PROGRAMS) $(check_SCRIPTS)
 
-acl_SOURCES = acl.c test_conf.h
-conf_SOURCES = conf.c test_conf.h
-confdb_SOURCES = confdb.c test_conf.h
-confio_SOURCES = confio.c test_conf.h
-process_query_SOURCES = process_query.c fake_server.h test_conf.h
+test_acl_SOURCES = test_acl.c test_conf.h
+test_conf_SOURCES = test_conf.c test_conf.h
+test_confdb_SOURCES = test_confdb.c test_conf.h
+test_confio_SOURCES = test_confio.c test_conf.h
+test_process_query_SOURCES = test_process_query.c test_server.h test_conf.h
diff --git a/tests/TODO b/tests/TODO
deleted file mode 100644
index bf03e7c3caa3328aea0c8d542b9fb002697bd011..0000000000000000000000000000000000000000
--- a/tests/TODO
+++ /dev/null
@@ -1 +0,0 @@
-- reimplement lives_ok
diff --git a/tests/contrib/test_hat-trie.c b/tests/contrib/test_qp-trie.c
similarity index 66%
rename from tests/contrib/test_hat-trie.c
rename to tests/contrib/test_qp-trie.c
index 33700c844c7dbfa7c868d5623728facff71d8d3f..e1a04c79d7dede24aae385b9bc8aad9b589c9a6c 100644
--- a/tests/contrib/test_hat-trie.c
+++ b/tests/contrib/test_qp-trie.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,13 +14,15 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <stdlib.h>
 #include <string.h>
 #include <time.h>
 #include <tap/basic.h>
 
-#include "contrib/hat-trie/hat-trie.h"
+#include "contrib/qp-trie/qp.h"
 #include "contrib/macros.h"
 #include "contrib/string.h"
+#include "libknot/errcode.h"
 
 /* UCW array sorting defines. */
 #define ASORT_PREFIX(X) str_key_##X
@@ -44,12 +46,12 @@ static char *str_key_rand(size_t len)
 }
 
 /* \brief Check lesser or equal result. */
-static bool str_key_find_leq(hattrie_t *trie, char **keys, size_t i, size_t size)
+static bool str_key_get_leq(trie_t *trie, char **keys, size_t i, size_t size)
 {
 	static char key_buf[KEY_MAXLEN];
 
 	int ret = 0;
-	value_t *val = NULL;
+	trie_val_t *val = NULL;
 	const char *key = keys[i];
 	size_t key_len = strlen(key) + 1;
 	memcpy(key_buf, key, key_len);
@@ -67,14 +69,14 @@ static bool str_key_find_leq(hattrie_t *trie, char **keys, size_t i, size_t size
 	/* Before current key. */
 	key_buf[key_len - 2] -= 1;
 	if (i < first_key_count) {
-		ret = hattrie_find_leq(trie, key_buf, key_len, &val);
-		if (ret != 1) {
+		ret = trie_get_leq(trie, key_buf, key_len, &val);
+		if (ret != KNOT_ENOENT) {
 			diag("%s: leq for key BEFORE %zu/'%s' ret = %d", __func__, i, keys[i], ret);
 			return false; /* No key before first. */
 		}
 	} else {
-		ret = hattrie_find_leq(trie, key_buf, key_len, &val);
-		if (ret > 0 || strcmp(*val, key_buf) > 0) {
+		ret = trie_get_leq(trie, key_buf, key_len, &val);
+		if (ret < KNOT_EOK || strcmp(*val, key_buf) > 0) {
 			diag("%s: '%s' is not before the key %zu/'%s'", __func__, (char*)*val, i, keys[i]);
 			return false; /* Found key must be LEQ than searched. */
 		}
@@ -82,16 +84,16 @@ static bool str_key_find_leq(hattrie_t *trie, char **keys, size_t i, size_t size
 
 	/* Current key. */
 	key_buf[key_len - 2] += 1;
-	ret = hattrie_find_leq(trie, key_buf, key_len, &val);
-	if (! (ret == 0 && val && strcmp(*val, key_buf) == 0)) {
+	ret = trie_get_leq(trie, key_buf, key_len, &val);
+	if (! (ret == KNOT_EOK && val && strcmp(*val, key_buf) == 0)) {
 		diag("%s: leq for key %zu/'%s' ret = %d", __func__, i, keys[i], ret);
 		return false; /* Must find equal match. */
 	}
 
 	/* After the current key. */
 	key_buf[key_len - 2] += 1;
-	ret = hattrie_find_leq(trie, key_buf, key_len, &val);
-	if (! (ret <= 0 && strcmp(*val, key_buf) <= 0)) {
+	ret = trie_get_leq(trie, key_buf, key_len, &val);
+	if (! (ret >= KNOT_EOK && strcmp(*val, key_buf) <= 0)) {
 		diag("%s: leq for key AFTER %zu/'%s' ret = %d %s", __func__, i, keys[i], ret, (char*)*val);
 		return false; /* Every key must have its LEQ match. */
 	}
@@ -116,15 +118,15 @@ int main(int argc, char *argv[])
 	str_key_sort(keys, key_count);
 
 	/* Create trie */
-	value_t *val = NULL;
-	hattrie_t *trie = hattrie_create();
-	ok(trie != NULL, "hattrie: create");
+	trie_val_t *val = NULL;
+	trie_t *trie = trie_create(NULL);
+	ok(trie != NULL, "trie: create");
 
 	/* Insert keys */
 	bool passed = true;
 	size_t inserted = 0;
 	for (unsigned i = 0; i < key_count; ++i) {
-		val = hattrie_get(trie, keys[i], strlen(keys[i]) + 1);
+		val = trie_get_ins(trie, keys[i], strlen(keys[i]) + 1);
 		if (!val) {
 			passed = false;
 			break;
@@ -134,32 +136,29 @@ int main(int argc, char *argv[])
 			++inserted;
 		}
 	}
-	ok(passed, "hattrie: insert");
+	ok(passed, "trie: insert");
 
 	/* Check total insertions against trie weight. */
-	is_int(hattrie_weight(trie), inserted, "hattrie: trie weight matches insertions");
-
-	/* Build order-index. */
-	hattrie_build_index(trie);
+	is_int(trie_weight(trie), inserted, "trie: trie weight matches insertions");
 
 	/* Lookup all keys */
 	passed = true;
 	for (unsigned i = 0; i < key_count; ++i) {
-		val = hattrie_tryget(trie, keys[i], strlen(keys[i]) + 1);
+		val = trie_get_try(trie, keys[i], strlen(keys[i]) + 1);
 		if (val && (*val == keys[i] || strcmp(*val, keys[i]) == 0)) {
 			continue;
 		} else {
-			diag("hattrie: mismatch on element '%u'", i);
+			diag("trie: mismatch on element '%u'", i);
 			passed = false;
 			break;
 		}
 	}
-	ok(passed, "hattrie: lookup all keys");
+	ok(passed, "trie: lookup all keys");
 
 	/* Lesser or equal lookup. */
 	passed = true;
 	for (unsigned i = 0; i < key_count; ++i) {
-		if (!str_key_find_leq(trie, keys, i, key_count)) {
+		if (!str_key_get_leq(trie, keys, i, key_count)) {
 			passed = false;
 			for (int off = -10; off < 10; ++off) {
 				int k = (int)i + off;
@@ -171,34 +170,15 @@ int main(int argc, char *argv[])
 			break;
 		}
 	}
-	ok(passed, "hattrie: find lesser or equal for all keys");
-
-	/* Next lookup. */
-	passed = true;
-	for (unsigned i = 0; i < key_count - 1 && passed; ++i) {
-		value_t *val;
-		hattrie_find_next(trie, keys[i], strlen(keys[i]), &val);
-		passed = val && *val == (void *)keys[(i + 1)];
-	}
-	ok(passed, "hattrie: find next for all keys");
-
-	/* Unsorted iteration */
-	size_t iterated = 0;
-	hattrie_iter_t *it = hattrie_iter_begin(trie, false);
-	while (!hattrie_iter_finished(it)) {
-		++iterated;
-		hattrie_iter_next(it);
-	}
-	is_int(inserted, iterated, "hattrie: unsorted iteration");
-	hattrie_iter_free(it);
+	ok(passed, "trie: find lesser or equal for all keys");
 
 	/* Sorted iteration. */
 	char key_buf[KEY_MAXLEN] = {'\0'};
-	iterated = 0;
-	it = hattrie_iter_begin(trie, true);
-	while (!hattrie_iter_finished(it)) {
+	size_t iterated = 0;
+	trie_it_t *it = trie_it_begin(trie);
+	while (!trie_it_finished(it)) {
 		size_t cur_key_len = 0;
-		const char *cur_key = hattrie_iter_key(it, &cur_key_len);
+		const char *cur_key = trie_it_key(it, &cur_key_len);
 		if (iterated > 0) { /* Only if previous exists. */
 			if (strcmp(key_buf, cur_key) > 0) {
 				diag("'%s' <= '%s' FAIL\n", key_buf, cur_key);
@@ -207,16 +187,16 @@ int main(int argc, char *argv[])
 		}
 		++iterated;
 		memcpy(key_buf, cur_key, cur_key_len);
-		hattrie_iter_next(it);
+		trie_it_next(it);
 	}
-	is_int(inserted, iterated, "hattrie: sorted iteration");
-	hattrie_iter_free(it);
+	is_int(inserted, iterated, "trie: sorted iteration");
+	trie_it_free(it);
 
 	/* Cleanup */
 	for (unsigned i = 0; i < key_count; ++i) {
 		free(keys[i]);
 	}
 	free(keys);
-	hattrie_free(trie);
+	trie_free(trie);
 	return 0;
 }
diff --git a/tests/journal.c b/tests/journal.c
deleted file mode 100644
index e0fc3e4cb5b12faa776eadfc7094e5e433096788..0000000000000000000000000000000000000000
--- a/tests/journal.c
+++ /dev/null
@@ -1,408 +0,0 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
-
-    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
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <assert.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <limits.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <tap/basic.h>
-
-#include "libknot/libknot.h"
-#include "knot/server/journal.h"
-#include "knot/zone/zone.h"
-
-#define RAND_RR_LABEL 16
-#define RAND_RR_PAYLOAD 64
-#define MIN_SOA_SIZE 22
-
-/*! \brief Generate random string with given length. */
-static int randstr(char* dst, size_t len)
-{
-	for (int i = 0; i < len - 1; ++i) {
-		dst[i] = '0' + (int) (('Z'-'0') * (rand() / (RAND_MAX + 1.0)));
-	}
-	dst[len - 1] = '\0';
-
-	return 0;
-}
-
-/*! \brief Init RRSet with type SOA and given serial. */
-static void init_soa(knot_rrset_t *rr, const uint32_t serial, const knot_dname_t *apex)
-{
-	knot_rrset_init(rr, knot_dname_copy(apex, NULL), KNOT_RRTYPE_SOA, KNOT_CLASS_IN);
-
-	assert(serial < 256);
-	uint8_t soa_data[MIN_SOA_SIZE] = { 0, 0, 0, 0, 0, serial };
-	int ret = knot_rrset_add_rdata(rr, soa_data, sizeof(soa_data), 3600, NULL);
-	(void)ret;
-	assert(ret == KNOT_EOK);
-}
-
-/*! \brief Init RRSet with type TXT, random owner and random payload. */
-static void init_random_rr(knot_rrset_t *rr , const knot_dname_t *apex)
-{
-	/* Create random label. */
-	char owner[RAND_RR_LABEL + knot_dname_size(apex)];
-	owner[0] = RAND_RR_LABEL - 1;
-	randstr(owner + 1, RAND_RR_LABEL);
-
-	/* Append zone apex. */
-	memcpy(owner + RAND_RR_LABEL, apex, knot_dname_size(apex));
-	knot_rrset_init(rr, knot_dname_copy((knot_dname_t *)owner, NULL), KNOT_RRTYPE_TXT, KNOT_CLASS_IN);
-
-	/* Create random RDATA. */
-	uint8_t txt[RAND_RR_PAYLOAD + 1];
-	txt[0] = RAND_RR_PAYLOAD - 1;
-	randstr((char *)(txt + 1), RAND_RR_PAYLOAD);
-
-	int ret = knot_rrset_add_rdata(rr, txt, RAND_RR_PAYLOAD, 3600, NULL);
-	(void)ret;
-	assert(ret == KNOT_EOK);
-}
-
-/*! \brief Init changeset with random changes. */
-static void init_random_changeset(changeset_t *ch, const uint32_t from, const uint32_t to, const size_t size, const knot_dname_t *apex)
-{
-	int ret = changeset_init(ch, apex);
-	(void)ret;
-	assert(ret == KNOT_EOK);
-
-	// Add SOAs
-	knot_rrset_t soa;
-	init_soa(&soa, from, apex);
-
-	ch->soa_from = knot_rrset_copy(&soa, NULL);
-	assert(ch->soa_from);
-	knot_rrset_clear(&soa, NULL);
-
-	init_soa(&soa, to, apex);
-	ch->soa_to = knot_rrset_copy(&soa, NULL);
-	assert(ch->soa_to);
-	knot_rrset_clear(&soa, NULL);
-
-	// Add RRs to add section
-	for (size_t i = 0; i < size / 2; ++i) {
-		knot_rrset_t rr;
-		init_random_rr(&rr, apex);
-		int ret = changeset_add_addition(ch, &rr, 0);
-		(void)ret;
-		assert(ret == KNOT_EOK);
-		knot_rrset_clear(&rr, NULL);
-	}
-
-	// Add RRs to remove section
-	for (size_t i = 0; i < size / 2; ++i) {
-		knot_rrset_t rr;
-		init_random_rr(&rr, apex);
-		int ret = changeset_add_removal(ch, &rr, 0);
-		(void)ret;
-		assert(ret == KNOT_EOK);
-		knot_rrset_clear(&rr, NULL);
-	}
-}
-
-/*! \brief Compare two changesets for equality. */
-static bool changesets_eq(const changeset_t *ch1, changeset_t *ch2)
-{
-	if (changeset_size(ch1) != changeset_size(ch2)) {
-		return false;
-	}
-
-	changeset_iter_t it1;
-	changeset_iter_all(&it1, ch1, true);
-	changeset_iter_t it2;
-	changeset_iter_all(&it2, ch2, true);
-
-	knot_rrset_t rr1 = changeset_iter_next(&it1);
-	knot_rrset_t rr2 = changeset_iter_next(&it2);
-	bool ret = true;
-	while (!knot_rrset_empty(&rr1)) {
-		if (!knot_rrset_equal(&rr1, &rr2, KNOT_RRSET_COMPARE_WHOLE)) {
-			ret = false;
-			break;
-		}
-		rr1 = changeset_iter_next(&it1);
-		rr2 = changeset_iter_next(&it2);
-	}
-
-	changeset_iter_clear(&it1);
-	changeset_iter_clear(&it2);
-
-	return ret;
-}
-
-/*! \brief Journal fillup test with size check. */
-static void test_fillup(journal_t *journal, size_t fsize, unsigned iter, size_t chunk_size)
-{
-	int ret = KNOT_EOK;
-	char *mptr = NULL;
-	char *large_entry = malloc(chunk_size);
-	randstr(large_entry, chunk_size);
-	assert(large_entry);
-
-	unsigned i = 0;
-	bool read_passed = true;
-	for (; i < 2 * JOURNAL_NCOUNT; ++i) {
-		uint64_t chk_key = 0xBEBE + i;
-		size_t entry_len = chunk_size/2 + rand() % (chunk_size/2);
-
-		/* Write */
-		ret = journal_map(journal, chk_key, &mptr, entry_len, false);
-		if (ret != KNOT_EOK) {
-			break;
-		}
-		memcpy(mptr, large_entry, entry_len);
-		ret = journal_unmap(journal, chk_key, mptr, 1);
-		if (ret != KNOT_EOK) {
-			diag("journal_unmap = %s", knot_strerror(ret));
-			read_passed = true;
-			break;
-		}
-
-		/* Read */
-		ret = journal_map(journal, chk_key, &mptr, entry_len, true);
-		if (ret == KNOT_EOK) {
-			ret = memcmp(large_entry, mptr, entry_len);
-			if (ret != 0) {
-				diag("integrity check failed");
-				read_passed = false;
-			} else {
-				ret = journal_unmap(journal, chk_key, mptr, 0);
-				if (ret != KNOT_EOK) {
-					diag("journal_unmap(rdonly) = %s", knot_strerror(ret));
-					read_passed = false;
-				}
-			}
-		} else {
-			diag("journal_map(rdonly) = %s", knot_strerror(ret));
-			read_passed = false;
-		}
-
-		if (!read_passed) {
-			break;
-		}
-	}
-	ok(read_passed, "journal: fillup #%u, reading written entries", iter);
-	ok(ret != KNOT_EOK, "journal: fillup #%u (%d entries)", iter, i);
-	free(large_entry);
-
-	/* Check file size. */
-	struct stat st;
-	fstat(journal->fd, &st);
-	ok(st.st_size < fsize + chunk_size, "journal: fillup / size check #%u", iter);
-	if (st.st_size > fsize + chunk_size) {
-		diag("journal: fillup / size check #%u fsize(%zu) > max(%zu)",
-		     iter, (size_t)st.st_size, fsize + chunk_size);
-	}
-}
-
-/*! \brief Test behavior with real changesets. */
-static void test_store_load(const char *jfilename)
-{
-	const size_t filesize = 100 * 1024;
-	uint8_t *apex = (uint8_t *)"\4test";
-
-	/* Create fake zone. */
-	zone_t z = { .name = apex };
-
-	/* Save and load changeset. */
-	changeset_t ch;
-	init_random_changeset(&ch, 0, 1, 128, apex);
-	int ret = journal_store_changeset(&ch, jfilename, filesize);
-	(void)ret;
-	ok(ret == KNOT_EOK, "journal: store changeset");
-	list_t l;
-	init_list(&l);
-	ret = journal_load_changesets(jfilename, &z, &l, 0, 1);
-	ok(ret == KNOT_EOK && changesets_eq(TAIL(l), &ch), "journal: load changeset");
-	changeset_clear(&ch);
-	changesets_free(&l);
-	init_list(&l);
-
-	/* Fill the journal. */
-	ret = KNOT_EOK;
-	uint32_t serial = 1;
-	for (; ret == KNOT_EOK; ++serial) {
-		init_random_changeset(&ch, serial, serial + 1, 128, apex);
-		ret = journal_store_changeset(&ch, jfilename, filesize);
-		changeset_clear(&ch);
-	}
-	ok(ret == KNOT_EBUSY, "journal: overfill with changesets");
-
-	/* Load all changesets stored until now. */
-	serial--;
-	ret = journal_load_changesets(jfilename, &z, &l, 0, serial);
-	changesets_free(&l);
-	ok(ret == KNOT_EOK, "journal: load changesets");
-
-	/* Flush the journal. */
-	ret = journal_mark_synced(jfilename);
-	ok(ret == KNOT_EOK, "journal: flush");
-
-	/* Store next changeset. */
-	init_random_changeset(&ch, serial, serial + 1, 128, apex);
-	ret = journal_store_changeset(&ch, jfilename, filesize);
-		changeset_clear(&ch);
-	ok(ret == KNOT_EOK, "journal: store after flush");
-
-	/* Load all changesets, except the first one that got evicted. */
-	init_list(&l);
-	ret = journal_load_changesets(jfilename, &z, &l, 1, serial + 1);
-	changesets_free(&l);
-	ok(ret == KNOT_EOK, "journal: load changesets after flush");
-}
-
-/*! \brief Test behavior when writing to jurnal and flushing it. */
-static void test_stress(const char *jfilename)
-{
-	uint8_t *apex = (uint8_t *)"\4test";
-	const size_t filesize = 100 * 1024;
-	int ret = KNOT_EOK;
-	uint32_t serial = 0;
-	size_t update_size = 3;
-	for (; ret == KNOT_EOK && serial < 32; ++serial) {
-		changeset_t ch;
-		init_random_changeset(&ch, serial, serial + 1, update_size, apex);
-		update_size *= 1.5;
-		ret = journal_store_changeset(&ch, jfilename, filesize);
-		changeset_clear(&ch);
-		journal_mark_synced(jfilename);
-	}
-	ok(ret == KNOT_ESPACE, "journal: does not overfill under load");
-}
-
-int main(int argc, char *argv[])
-{
-	plan_lazy();
-
-	/* Create tmpdir */
-	size_t fsize = 10 * 1024 * 1024;
-	char *tmpdir = test_tmpdir();
-	char jfilename[256];
-	snprintf(jfilename, sizeof(jfilename), "%s/%s", tmpdir, "journal.XXXXXX");
-
-	/* Create tmpfile. */
-	int tmp_fd = mkstemp(jfilename);
-	ok(tmp_fd >= 0, "journal: create temporary file");
-	if (tmp_fd < 0) {
-		goto skip_all;
-	}
-	close(tmp_fd);
-	remove(jfilename);
-
-	/* Try to open journal with too small fsize. */
-	journal_t *journal = NULL;
-	int ret = journal_open(&journal, jfilename, 1024);
-	ok(ret != KNOT_EOK, "journal: open too small");
-
-	/* Open/create new journal. */
-	ret = journal_open(&journal, jfilename, fsize);
-	ok(ret == KNOT_EOK, "journal: open journal '%s'", jfilename);
-	if (ret != KNOT_EOK) {
-		goto skip_all;
-	}
-
-	/* Write entry and check integrity. */
-	char *mptr = NULL;
-	uint64_t chk_key = 0;
-	char chk_buf[64] = {'\0'};
-	randstr(chk_buf, sizeof(chk_buf));
-	ret = journal_map(journal, chk_key, &mptr, sizeof(chk_buf), false);
-	is_int(KNOT_EOK, ret, "journal: write data (map)");
-	if (ret == KNOT_EOK) {
-		memcpy(mptr, chk_buf, sizeof(chk_buf));
-		ret = journal_unmap(journal, chk_key, mptr, 1);
-		is_int(KNOT_EOK, ret, "journal: write data (unmap)");
-	}
-
-	ret = journal_map(journal, chk_key, &mptr, sizeof(chk_buf), true);
-	is_int(KNOT_EOK, ret, "journal: data integrity check (map)");
-	if (ret == KNOT_EOK) {
-		ret = memcmp(chk_buf, mptr, sizeof(chk_buf));
-		is_int(0, ret, "journal: data integrity check (cmp)");
-		ret = journal_unmap(journal, chk_key, mptr, 0);
-		is_int(KNOT_EOK, ret, "journal: data integrity check (unmap)");
-	}
-
-	/* Reopen log and re-read value. */
-	journal_close(journal);
-	ret = journal_open(&journal, jfilename, fsize);
-	ok(ret == KNOT_EOK, "journal: open journal '%s'", jfilename);
-
-	ret = journal_map(journal, chk_key, &mptr, sizeof(chk_buf), true);
-	if (ret == KNOT_EOK) {
-		ret = memcmp(chk_buf, mptr, sizeof(chk_buf));
-		journal_unmap(journal, chk_key, mptr, 0);
-	}
-	is_int(KNOT_EOK, ret, "journal: data integrity check after close/open");
-
-	/*  Write random data. */
-	ret = KNOT_EOK;
-	for (int i = 0; i < 512; ++i) {
-		chk_key = 0xDEAD0000 + i;
-		ret = journal_map(journal, chk_key, &mptr, sizeof(chk_buf), false);
-		if (ret != KNOT_EOK) {
-			diag("journal_map failed: %s", knot_strerror(ret));
-			break;
-		}
-		randstr(mptr, sizeof(chk_buf));
-		if ((ret = journal_unmap(journal, chk_key, mptr, 1)) != KNOT_EOK) {
-			diag("journal_unmap failed: %s", knot_strerror(ret));
-			break;
-		}
-	}
-	is_int(KNOT_EOK, ret, "journal: sustained mmap r/w");
-
-	/* Overfill (yields ESPACE/EBUSY) */
-	ret = journal_map(journal, chk_key, &mptr, fsize, false);
-	ok(ret != KNOT_EOK, "journal: overfill");
-
-	/* Fillup */
-	size_t sizes[] = {16, 64, 1024, 4096, 512 * 1024, 1024 * 1024 };
-	const int num_sizes = sizeof(sizes)/sizeof(size_t);
-	for (unsigned i = 0; i < 2 * num_sizes; ++i) {
-		/* Journal flush. */
-		journal_close(journal);
-		ret = journal_mark_synced(jfilename);
-		is_int(KNOT_EOK, ret, "journal: flush after fillup #%u", i);
-		ret = journal_open(&journal, jfilename, fsize);
-		ok(ret == KNOT_EOK, "journal: reopen after flush #%u", i);
-		/* Journal fillup. */
-		if (journal) {
-			test_fillup(journal, fsize, i, sizes[i % num_sizes]);
-		}
-	}
-
-	/* Close journal. */
-	journal_close(journal);
-
-	/* Delete journal. */
-	remove(jfilename);
-
-	test_store_load(jfilename);
-	remove(jfilename);
-
-	test_stress(jfilename);
-	remove(jfilename);
-
-	free(tmpdir);
-
-skip_all:
-	return 0;
-}
diff --git a/tests/libknot/test_edns_ecs.c b/tests/libknot/test_edns_ecs.c
index 27e6c9af6ce52cc8743bba3c1d207e158aea6d35..b17a9c4f37fd1264883e8d2b2a93287c4347b56f 100644
--- a/tests/libknot/test_edns_ecs.c
+++ b/tests/libknot/test_edns_ecs.c
@@ -159,6 +159,7 @@ static struct sockaddr_storage addr_init(const char *addr)
 	struct addrinfo hints = { .ai_flags = AI_NUMERICHOST };
 	struct addrinfo *info = NULL;
 	int r = getaddrinfo(addr, NULL, &hints, &info);
+	(void)r;
 	assert(r == 0);
 	memcpy(&sa, info->ai_addr, info->ai_addrlen);
 	freeaddrinfo(info);
diff --git a/tests/modules/online_sign.c b/tests/modules/test_online_sign.c
similarity index 100%
rename from tests/modules/online_sign.c
rename to tests/modules/test_online_sign.c
diff --git a/tests/rrl.c b/tests/modules/test_rrl.c
similarity index 91%
rename from tests/rrl.c
rename to tests/modules/test_rrl.c
index e96d7b9504fec7cca14f0e69b891678300621ff0..c128d51e186fc53970241c8eaeaf4366cdaa459e 100644
--- a/tests/rrl.c
+++ b/tests/modules/test_rrl.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -14,17 +14,13 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <sys/types.h>
-#include <sys/socket.h>
 #include <tap/basic.h>
 
 #include "dnssec/crypto.h"
 #include "dnssec/random.h"
-#include "knot/conf/conf.h"
-#include "knot/server/rrl.h"
-#include "knot/zone/zone.h"
-#include "libknot/descriptor.h"
+#include "libknot/libknot.h"
 #include "contrib/sockaddr.h"
+#include "knot/modules/rrl/functions.h"
 
 /* Enable time-dependent tests. */
 //#define ENABLE_TIMED_TESTS
@@ -50,12 +46,12 @@ struct runnable_data {
 	rrl_table_t *rrl;
 	struct sockaddr_storage *addr;
 	rrl_req_t *rq;
-	zone_t *zone;
+	knot_dname_t *zone;
 };
 
 static void* rrl_runnable(void *arg)
 {
-	struct runnable_data* d = (struct runnable_data*)arg;
+	struct runnable_data *d = (struct runnable_data *)arg;
 	struct sockaddr_storage addr;
 	memcpy(&addr, d->addr, sizeof(struct sockaddr_storage));
 	int lock = -1;
@@ -143,9 +139,7 @@ int main(int argc, char *argv[])
 	is_int(KNOT_EOK, ret, "rrl: setlocks");
 
 	/* 4. N unlimited requests. */
-	knot_dname_t *zone_name = knot_dname_from_str_alloc("rrl.");
-	zone_t *zone = zone_new(zone_name);
-	knot_dname_free(&zone_name, NULL);
+	knot_dname_t *zone = knot_dname_from_str_alloc("rrl.");
 
 	struct sockaddr_storage addr;
 	struct sockaddr_storage addr6;
@@ -199,7 +193,7 @@ int main(int argc, char *argv[])
 	ok(rd.passed, "rrl: hashtable is ~ consistent");
 #endif
 
-	zone_free(&zone);
+	knot_dname_free(&zone, NULL);
 	knot_pkt_free(&query);
 	rrl_destroy(rrl);
 	dnssec_crypto_cleanup();
diff --git a/tests/semantic_check_data/Makefile.inc b/tests/semantic_check_data/Makefile.inc
index 2953ff3d5e787e3bc2f375085779368df422ea0e..6e28f651f1d719373e1add872359b433e32d0e19 100644
--- a/tests/semantic_check_data/Makefile.inc
+++ b/tests/semantic_check_data/Makefile.inc
@@ -1,5 +1,5 @@
 check_SCRIPTS = \
-	semantic_check
+	test_semantic_check
 
 CLEANFILES += $(check_SCRIPTS)
 
@@ -7,10 +7,10 @@ edit = $(SED) \
 	-e 's|@top_srcdir[@]|$(abs_top_srcdir)|g' \
 	-e 's|@top_builddir[@]|$(abs_top_builddir)|g'
 
-semantic_check: $(top_srcdir)/tests/semantic_check.in
-	$(edit) < $(top_srcdir)/tests/semantic_check.in > $(top_builddir)/tests/semantic_check
-	chmod +x $(top_builddir)/tests/semantic_check
+test_semantic_check: $(top_srcdir)/tests/test_semantic_check.in
+	$(edit) < $(top_srcdir)/tests/test_semantic_check.in > $(top_builddir)/tests/test_semantic_check
+	chmod +x $(top_builddir)/tests/test_semantic_check
 
 EXTRA_DIST = \
-	semantic_check.in \
+	test_semantic_check.in \
 	semantic_check_data
diff --git a/tests/acl.c b/tests/test_acl.c
similarity index 100%
rename from tests/acl.c
rename to tests/test_acl.c
diff --git a/tests/changeset.c b/tests/test_changeset.c
similarity index 97%
rename from tests/changeset.c
rename to tests/test_changeset.c
index 210d78e00a15b3df2e25468a9f0144308d4e449d..aa32fe9f47fe13991a0dfd1228d2d4e1787bce6d 100644
--- a/tests/changeset.c
+++ b/tests/test_changeset.c
@@ -80,7 +80,7 @@ int main(int argc, char *argv[])
 
 	// Test add traversal.
 	changeset_iter_t it;
-	ret = changeset_iter_add(&it, ch, true);
+	ret = changeset_iter_add(&it, ch);
 	ok(ret == KNOT_EOK, "changeset: create iter add");
 	// Order: non.terminals.test. TXT, SPF, here.come.more.non.terminals.test. TXT.
 	knot_rrset_t iter = changeset_iter_next(&it);
@@ -100,7 +100,7 @@ int main(int argc, char *argv[])
 	changeset_add_removal(ch, apex_txt_rr, CHANGESET_CHECK);
 
 	// Test remove traversal.
-	ret = changeset_iter_rem(&it, ch, false);
+	ret = changeset_iter_rem(&it, ch);
 	ok(ret == KNOT_EOK, "changeset: create iter rem");
 	iter = changeset_iter_next(&it);
 	ok(knot_rrset_equal(&iter, apex_txt_rr, KNOT_RRSET_COMPARE_WHOLE),
@@ -108,7 +108,7 @@ int main(int argc, char *argv[])
 	changeset_iter_clear(&it);
 
 	// Test all traversal - just count.
-	ret = changeset_iter_all(&it, ch, false);
+	ret = changeset_iter_all(&it, ch);
 	ok(ret == KNOT_EOK, "changest: create iter all");
 	size_t size = 0;
 	iter = changeset_iter_next(&it);
diff --git a/tests/conf.c b/tests/test_conf.c
similarity index 57%
rename from tests/conf.c
rename to tests/test_conf.c
index ea1a8c692a6e91dc90949bc38d7d9058996a8e13..60fa074437f6b3eff1b0282cf4d6860a12e26236 100644
--- a/tests/conf.c
+++ b/tests/test_conf.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -19,11 +19,11 @@
 #include "knot/conf/conf.c"
 #include "test_conf.h"
 
-#define ZONE1	"0/25.2.0.192.in-addr.arpa."
-#define ZONE2	"."
-#define ZONE3	"x."
-#define ZONE4	"abc.ab.a."
-#define ZONEX	"unknown."
+#define ZONE_ARPA	"0/25.2.0.192.in-addr.arpa."
+#define ZONE_ROOT	"."
+#define ZONE_1LABEL	"x."
+#define ZONE_3LABEL	"abc.ab.a."
+#define ZONE_UNKNOWN	"unknown."
 
 static void check_name(const char *zone, const char *name, const char *ref)
 {
@@ -50,11 +50,19 @@ static void check_name_err(const char *zone, const char *name)
 
 static void test_get_filename(void)
 {
+	// Name formatter.
+	char *zone = "abc";
+	check_name(zone, "/%s", "/abc");
+
+	zone = ".";
+	check_name(zone, "/%s", "/");
+
 	// Char formatter.
-	char *zone = "abc.def.gh";
+	zone = "abc.def.g";
 	check_name(zone, "/%c[0]", "/a");
-	check_name(zone, "/%c[9]", "/h");
 	check_name(zone, "/%c[3]", "/.");
+	check_name(zone, "/%c[8]", "/g");
+	check_name(zone, "/%c[9]", "/.");
 	check_name(zone, "/%c[0-1]", "/ab");
 	check_name(zone, "/%c[1-1]", "/b");
 	check_name(zone, "/%c[1-3]", "/bc.");
@@ -64,21 +72,21 @@ static void test_get_filename(void)
 	check_name_err(zone, "/%c[a]");
 	check_name_err(zone, "/%c[:]");
 	check_name_err(zone, "/%c[/]");
-	check_name_err(zone, "/%c[12]");
+	check_name_err(zone, "/%c[10]");
 	check_name_err(zone, "/%c[");
 	check_name_err(zone, "/%c[1");
 	check_name_err(zone, "/%c[1-");
 	check_name_err(zone, "/%c[1-2");
 	check_name_err(zone, "/%c[1-b]");
-	check_name_err(zone, "/%c[9-0]");
+	check_name_err(zone, "/%c[8-0]");
 
 	zone = "abcd";
-	check_name(zone, "/%c[2-9]", "/cd");
+	check_name(zone, "/%c[2-9]", "/cd.");
 	check_name(zone, "/%c[3]", "/d");
-	check_name(zone, "/%c[4]", "/");
+	check_name(zone, "/%c[4]", "/.");
 
 	zone = ".";
-	check_name(zone, "/%c[0]", "/");
+	check_name(zone, "/%c[0]", "/.");
 	check_name(zone, "/%c[1]", "/");
 
 	// Label formatter.
@@ -91,7 +99,7 @@ static void test_get_filename(void)
 	check_name_err(zone, "/%l[0-1]");
 
 	zone = ".";
-	check_name(zone, "/%l[0]", "/.");
+	check_name(zone, "/%l[0]", "/");
 	check_name(zone, "/%l[1]", "/");
 }
 
@@ -100,16 +108,16 @@ static void test_conf_zonefile(void)
 	int ret;
 	char *file;
 
-	knot_dname_t *zone1 = knot_dname_from_str_alloc(ZONE1);
-	ok(zone1 != NULL, "create dname "ZONE1);
-	knot_dname_t *zone2 = knot_dname_from_str_alloc(ZONE2);
-	ok(zone2 != NULL, "create dname "ZONE2);
-	knot_dname_t *zone3 = knot_dname_from_str_alloc(ZONE3);
-	ok(zone3 != NULL, "create dname "ZONE3);
-	knot_dname_t *zone4 = knot_dname_from_str_alloc(ZONE4);
-	ok(zone4 != NULL, "create dname "ZONE4);
-	knot_dname_t *zonex = knot_dname_from_str_alloc(ZONEX);
-	ok(zonex != NULL, "create dname "ZONEX);
+	knot_dname_t *zone_arpa = knot_dname_from_str_alloc(ZONE_ARPA);
+	ok(zone_arpa != NULL, "create dname "ZONE_ARPA);
+	knot_dname_t *zone_root = knot_dname_from_str_alloc(ZONE_ROOT);
+	ok(zone_root != NULL, "create dname "ZONE_ROOT);
+	knot_dname_t *zone_1label = knot_dname_from_str_alloc(ZONE_1LABEL);
+	ok(zone_1label != NULL, "create dname "ZONE_1LABEL);
+	knot_dname_t *zone_3label = knot_dname_from_str_alloc(ZONE_3LABEL);
+	ok(zone_3label != NULL, "create dname "ZONE_3LABEL);
+	knot_dname_t *zone_unknown = knot_dname_from_str_alloc(ZONE_UNKNOWN);
+	ok(zone_unknown != NULL, "create dname "ZONE_UNKNOWN);
 
 	const char *conf_str =
 		"template:\n"
@@ -117,68 +125,68 @@ static void test_conf_zonefile(void)
 		"    storage: /tmp\n"
 		"\n"
 		"zone:\n"
-		"  - domain: "ZONE1"\n"
+		"  - domain: "ZONE_ARPA"\n"
 		"    file: dir/a%%b/%s.suffix/%a\n"
-		"  - domain: "ZONE2"\n"
+		"  - domain: "ZONE_ROOT"\n"
 		"    file: /%s\n"
-		"  - domain: "ZONE3"\n"
+		"  - domain: "ZONE_1LABEL"\n"
 		"    file: /%s\n"
-		"  - domain: "ZONE4"\n";
+		"  - domain: "ZONE_3LABEL"\n";
 
 	ret = test_conf(conf_str, NULL);
 	ok(ret == KNOT_EOK, "Prepare configuration");
 
 	// Relative path with formatters.
-	file = conf_zonefile(conf(), zone1);
-	ok(file != NULL, "Get zonefile path for "ZONE1);
+	file = conf_zonefile(conf(), zone_arpa);
+	ok(file != NULL, "Get zonefile path for "ZONE_ARPA);
 	if (file != NULL) {
 		ok(strcmp(file, "/tmp/dir/a%b/0_25.2.0.192.in-addr.arpa.suffix/") == 0,
-		          "Zonefile path compare for "ZONE1);
+		          "Zonefile path compare for "ZONE_ARPA);
 		free(file);
 	}
 
 	// Absolute path without formatters - root zone.
-	file = conf_zonefile(conf(), zone2);
-	ok(file != NULL, "Get zonefile path for "ZONE2);
+	file = conf_zonefile(conf(), zone_root);
+	ok(file != NULL, "Get zonefile path for "ZONE_ROOT);
 	if (file != NULL) {
-		ok(strcmp(file, "/.") == 0,
-		          "Zonefile path compare for "ZONE2);
+		ok(strcmp(file, "/") == 0,
+		          "Zonefile path compare for "ZONE_ROOT);
 		free(file);
 	}
 
-	// Absolute path without formatters.
-	file = conf_zonefile(conf(), zone3);
-	ok(file != NULL, "Get zonefile path for "ZONE3);
+	// Absolute path without formatters - non-root zone.
+	file = conf_zonefile(conf(), zone_1label);
+	ok(file != NULL, "Get zonefile path for "ZONE_1LABEL);
 	if (file != NULL) {
 		ok(strcmp(file, "/x") == 0,
-		          "Zonefile path compare for "ZONE3);
+		          "Zonefile path compare for "ZONE_1LABEL);
 		free(file);
 	}
 
 	// Default zonefile path.
-	file = conf_zonefile(conf(), zone4);
-	ok(file != NULL, "Get zonefile path for "ZONE4);
+	file = conf_zonefile(conf(), zone_3label);
+	ok(file != NULL, "Get zonefile path for "ZONE_3LABEL);
 	if (file != NULL) {
-		ok(strcmp(file, "/tmp/"ZONE4"zone") == 0,
-		          "Zonefile path compare for "ZONE4);
+		ok(strcmp(file, "/tmp/abc.ab.a.zone") == 0,
+		          "Zonefile path compare for "ZONE_3LABEL);
 		free(file);
 	}
 
 	// Unknown zone zonefile path.
-	file = conf_zonefile(conf(), zonex);
-	ok(file != NULL, "Get zonefile path for "ZONEX);
+	file = conf_zonefile(conf(), zone_unknown);
+	ok(file != NULL, "Get zonefile path for "ZONE_UNKNOWN);
 	if (file != NULL) {
-		ok(strcmp(file, "/tmp/"ZONEX"zone") == 0,
-		          "Zonefile path compare for "ZONEX);
+		ok(strcmp(file, "/tmp/unknown.zone") == 0,
+		          "Zonefile path compare for "ZONE_UNKNOWN);
 		free(file);
 	}
 
 	conf_free(conf());
-	knot_dname_free(&zone1, NULL);
-	knot_dname_free(&zone2, NULL);
-	knot_dname_free(&zone3, NULL);
-	knot_dname_free(&zone4, NULL);
-	knot_dname_free(&zonex, NULL);
+	knot_dname_free(&zone_arpa, NULL);
+	knot_dname_free(&zone_root, NULL);
+	knot_dname_free(&zone_1label, NULL);
+	knot_dname_free(&zone_3label, NULL);
+	knot_dname_free(&zone_unknown, NULL);
 }
 
 int main(int argc, char *argv[])
diff --git a/tests/test_conf.h b/tests/test_conf.h
index a890ad3c1af2522633de340430b40a48cfcfea82..739567a1b7514d70eaae3e9113c2588560c47884 100644
--- a/tests/test_conf.h
+++ b/tests/test_conf.h
@@ -39,7 +39,7 @@ static inline int test_conf(const char *conf_str, const yp_item_t *scheme)
 		return ret;
 	}
 
-	conf_update(new_conf);
+	conf_update(new_conf, CONF_UPD_FNONE);
 
 	return KNOT_EOK;
 }
diff --git a/tests/conf_tools.c b/tests/test_conf_tools.c
similarity index 98%
rename from tests/conf_tools.c
rename to tests/test_conf_tools.c
index e3e450835948802cbe0841ca3bc387e08b9825da..a9f617ae41361f109aca8cbbc0941526b7bd2635 100644
--- a/tests/conf_tools.c
+++ b/tests/test_conf_tools.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -140,7 +140,7 @@ int main(int argc, char *argv[])
 
 	/* Module id tests. */
 	mod_id_test("module/id", "\x06moduleid");
-	mod_id_bad_test("module", KNOT_EINVAL);
+	mod_id_test("module", "\x06module");
 	mod_id_bad_test("module/", KNOT_EINVAL);
 	mod_id_bad_test("/", KNOT_EINVAL);
 	mod_id_bad_test("/id", KNOT_EINVAL);
diff --git a/tests/confdb.c b/tests/test_confdb.c
similarity index 99%
rename from tests/confdb.c
rename to tests/test_confdb.c
index ae1dee64ef1e951d7e236b4831073139de1b52c6..5341229b14c679f8e6385c843b504d3f7ca2e73f 100644
--- a/tests/confdb.c
+++ b/tests/test_confdb.c
@@ -126,6 +126,7 @@ static void check_set(
 	}
 
 	uint8_t section_code, item_code;
+	section_code = 0, item_code = 0; // prevents Wuninitialized
 	ok(db_code(conf, txn, KEY0_ROOT, key0, DB_GET, &section_code) == KNOT_EOK,
 	   "Get DB section code");
 	if (key1 != NULL) {
@@ -418,6 +419,7 @@ static void test_conf_db_iter(conf_t *conf, knot_db_txn_t *txn)
 	while (ret == KNOT_EOK) {
 		const uint8_t *id;
 		size_t id_len;
+		id = NULL, id_len = 0; // prevents Wuinitialized
 		ret = conf_db_iter_id(conf, &iter, &id, &id_len);
 		ok(ret == KNOT_EOK, "Get iteration id");
 		ok(id_len == strlen(names[count]), "Compare iteration id length");
diff --git a/tests/confio.c b/tests/test_confio.c
similarity index 93%
rename from tests/confio.c
rename to tests/test_confio.c
index 7df2f61ba89e5702d9f9f3c44272f5346005d8e1..e4f0b8e4cfb4bbbdaf4f1153fae126431f4fe9d1 100644
--- a/tests/confio.c
+++ b/tests/test_confio.c
@@ -207,19 +207,17 @@ static void test_conf_io_abort(void)
 #if defined(__OpenBSD__)
 	SKIP_OPENBSD
 #else
-	conf_io_t io = { NULL };
-
 	// Test child persistence after subchild abort.
 
 	ok(conf_io_begin(false) == KNOT_EOK, "begin parent txn");
 	char idx[2] = { '0' };
-	ok(conf_io_set("server", "version", NULL, idx, &io) ==
+	ok(conf_io_set("server", "version", NULL, idx) ==
 	   KNOT_EOK, "set single value '%s'", idx);
 
 	for (int i = 1; i < CONF_MAX_TXN_DEPTH; i++) {
 		char idx[2] = { '0' + i };
 		ok(conf_io_begin(true) == KNOT_EOK, "begin child txn %s", idx);
-		ok(conf_io_set("server", "version", NULL, idx, &io) ==
+		ok(conf_io_set("server", "version", NULL, idx) ==
 		   KNOT_EOK, "set single value '%s'", idx);
 	}
 
@@ -239,7 +237,7 @@ static void test_conf_io_abort(void)
 	ok(conf_io_begin(false) == KNOT_EOK, "begin new parent txn");
 	ok(conf_io_begin(true) == KNOT_EOK, "begin child txn");
 	ok(conf_io_begin(true) == KNOT_EOK, "begin subchild txn");
-	ok(conf_io_set("server", "version", NULL, "text", &io) ==
+	ok(conf_io_set("server", "version", NULL, "text") ==
 	   KNOT_EOK, "set single value");
 	ok(conf_io_commit(true) == KNOT_EOK, "commit subchild txn");
 	conf_val_t val = conf_get_txn(conf(), conf()->io.txn, C_SERVER, C_VERSION);
@@ -265,19 +263,17 @@ static void test_conf_io_commit(void)
 #if defined(__OpenBSD__)
 	SKIP_OPENBSD
 #else
-	conf_io_t io = { NULL };
-
 	// Test subchild persistence after commit.
 
 	ok(conf_io_begin(false) == KNOT_EOK, "begin parent txn");
 	char idx[2] = { '0' };
-	ok(conf_io_set("server", "version", NULL, idx, &io) ==
+	ok(conf_io_set("server", "version", NULL, idx) ==
 	   KNOT_EOK, "set single value '%s'", idx);
 
 	for (int i = 1; i < CONF_MAX_TXN_DEPTH; i++) {
 		char idx[2] = { '0' + i };
 		ok(conf_io_begin(true) == KNOT_EOK, "begin child txn %s", idx);
-		ok(conf_io_set("server", "version", NULL, idx, &io) ==
+		ok(conf_io_set("server", "version", NULL, idx) ==
 		   KNOT_EOK, "set single value '%s'", idx);
 	}
 
@@ -319,22 +315,22 @@ static void test_conf_io_check(void)
 	ok(conf_io_begin(false) == KNOT_EOK, "begin txn");
 
 	// Section check.
-	ok(conf_io_set("remote", "id", NULL, "remote1", &io) ==
+	ok(conf_io_set("remote", "id", NULL, "remote1") ==
 	   KNOT_EOK, "set remote id");
 	ok(conf_io_check(&io) ==
 	   KNOT_EINVAL, "check missing remote address");
 	ok(io.error.code == KNOT_EINVAL, "compare error code");
 
-	ok(conf_io_set("remote", "address", "remote1", "1.1.1.1", &io) ==
+	ok(conf_io_set("remote", "address", "remote1", "1.1.1.1") ==
 	   KNOT_EOK, "set remote address");
 	ok(conf_io_check(&io) ==
 	   KNOT_EOK, "check remote address");
 	ok(io.error.code == KNOT_EOK, "compare error code");
 
 	// Item check.
-	ok(conf_io_set("zone", "domain", NULL, ZONE1, &io) ==
+	ok(conf_io_set("zone", "domain", NULL, ZONE1) ==
 	   KNOT_EOK, "set zone domain "ZONE1);
-	ok(conf_io_set("zone", "master", ZONE1, "remote1", &io) ==
+	ok(conf_io_set("zone", "master", ZONE1, "remote1") ==
 	   KNOT_EOK, "set zone master");
 
 	ok(conf_io_check(&io) ==
@@ -352,45 +348,41 @@ static void test_conf_io_check(void)
 
 static void test_conf_io_set(void)
 {
-	conf_io_t io = { NULL };
-
 	// ERR no txn.
-	ok(conf_io_set("server", "version", NULL, "text", &io) ==
+	ok(conf_io_set("server", "version", NULL, "text") ==
 	   KNOT_TXN_ENOTEXISTS, "set without active txn");
 
 	ok(conf_io_begin(false) == KNOT_EOK, "begin txn");
 
 	// ERR.
-	ok(conf_io_set(NULL, NULL, NULL, NULL, &io) ==
+	ok(conf_io_set(NULL, NULL, NULL, NULL) ==
 	   KNOT_EINVAL, "set NULL key0");
-	ok(conf_io_set("", NULL, NULL, NULL, &io) ==
+	ok(conf_io_set("", NULL, NULL, NULL) ==
 	   KNOT_YP_EINVAL_ITEM, "set empty key0");
-	ok(conf_io_set("uknown", NULL, NULL, NULL, &io) ==
+	ok(conf_io_set("uknown", NULL, NULL, NULL) ==
 	   KNOT_YP_EINVAL_ITEM, "set unknown key0");
-	ok(conf_io_set("server", "unknown", NULL, NULL, &io) ==
+	ok(conf_io_set("server", "unknown", NULL, NULL) ==
 	   KNOT_YP_EINVAL_ITEM, "set unknown key1");
-	ok(conf_io_set("include", NULL, NULL, NULL, &io) ==
+	ok(conf_io_set("include", NULL, NULL, NULL) ==
 	   KNOT_YP_ENODATA, "set non-group without data");
-	ok(conf_io_set("server", "rate-limit", NULL, "x", &io) ==
+	ok(conf_io_set("server", "background-workers", NULL, "x") ==
 	   KNOT_EINVAL, "set invalid data");
 
 	// ERR callback
-	ok(io.error.code == KNOT_EOK, "io error check before");
-	ok(conf_io_set("include", NULL, NULL, "invalid", &io) ==
+	ok(conf_io_set("include", NULL, NULL, "invalid") ==
 	   KNOT_EFILE, "set invalid callback value");
-	ok(io.error.code == KNOT_EFILE, "io error check after");
 
 	// Single group, single value.
-	ok(conf_io_set("server", "version", NULL, "text", &io) ==
+	ok(conf_io_set("server", "version", NULL, "text") ==
 	   KNOT_EOK, "set single value");
 	conf_val_t val = conf_get_txn(conf(), conf()->io.txn, C_SERVER, C_VERSION);
 	ok(val.code == KNOT_EOK, "check entry");
 	ok(strcmp(conf_str(&val), "text") == 0, "check entry value");
 
 	// Single group, multi value.
-	ok(conf_io_set("server", "listen", NULL, "1.1.1.1", &io) ==
+	ok(conf_io_set("server", "listen", NULL, "1.1.1.1") ==
 	   KNOT_EOK, "set multivalue 1");
-	ok(conf_io_set("server", "listen", NULL, "1.1.1.2", &io) ==
+	ok(conf_io_set("server", "listen", NULL, "1.1.1.2") ==
 	   KNOT_EOK, "set multivalue 2");
 	val = conf_get_txn(conf(), conf()->io.txn, C_SERVER, C_LISTEN);
 	ok(val.code == KNOT_EOK, "check entry");
@@ -405,24 +397,24 @@ static void test_conf_io_set(void)
 	ok(zone3 != NULL, "create dname "ZONE3);
 
 	// Multi group ids.
-	ok(conf_io_set("zone", "domain", NULL, ZONE1, &io) ==
+	ok(conf_io_set("zone", "domain", NULL, ZONE1) ==
 	   KNOT_EOK, "set zone domain "ZONE1);
-	ok(conf_io_set("zone", NULL, ZONE2, NULL, &io) ==
+	ok(conf_io_set("zone", NULL, ZONE2, NULL) ==
 	   KNOT_EOK, "set zone domain "ZONE2);
 
 	// Multi group, single value.
-	ok(conf_io_set("zone", "file", ZONE1, "name", &io) ==
+	ok(conf_io_set("zone", "file", ZONE1, "name") ==
 	   KNOT_EOK, "set zone file");
 	val = conf_zone_get_txn(conf(), conf()->io.txn, C_FILE, zone1);
 	ok(val.code == KNOT_EOK, "check entry");
 	ok(strcmp(conf_str(&val), "name") == 0, "check entry value");
 
 	// Multi group, single value, bad id.
-	ok(conf_io_set("zone", "file", ZONE3, "name", &io) ==
+	ok(conf_io_set("zone", "file", ZONE3, "name") ==
 	   KNOT_YP_EINVAL_ID, "set zone file");
 
 	// Multi group, single value, all ids.
-	ok(conf_io_set("zone", "comment", NULL, "abc", &io) ==
+	ok(conf_io_set("zone", "comment", NULL, "abc") ==
 	   KNOT_EOK, "set zones comment");
 	val = conf_zone_get_txn(conf(), conf()->io.txn, C_COMMENT, zone1);
 	ok(val.code == KNOT_EOK, "check entry");
@@ -432,9 +424,9 @@ static void test_conf_io_set(void)
 	ok(strcmp(conf_str(&val), "abc") == 0, "check entry value");
 
 	// Prepare different comment.
-	ok(conf_io_set("zone", "domain", NULL, ZONE3, &io) ==
+	ok(conf_io_set("zone", "domain", NULL, ZONE3) ==
 	   KNOT_EOK, "set zone domain "ZONE3);
-	ok(conf_io_set("zone", "comment", ZONE3, "xyz", &io) ==
+	ok(conf_io_set("zone", "comment", ZONE3, "xyz") ==
 	   KNOT_EOK, "set zone comment");
 	val = conf_zone_get_txn(conf(), conf()->io.txn, C_COMMENT, zone3);
 	ok(val.code == KNOT_EOK, "check entry");
@@ -467,7 +459,7 @@ static void test_conf_io_unset(void)
 	   KNOT_YP_EINVAL_ITEM, "unset unknown key1");
 	ok(conf_io_unset("include", NULL, NULL, "file") ==
 	   KNOT_ENOTSUP, "unset non-group item");
-	ok(conf_io_unset("server", "rate-limit", NULL, "x") ==
+	ok(conf_io_unset("server", "background-workers", NULL, "x") ==
 	   KNOT_EINVAL, "unset invalid data");
 
 	// Single group, single value.
@@ -667,7 +659,7 @@ static void test_conf_io_get(void)
 	   KNOT_ENOTSUP, "get non-group item");
 
 	// Update item in the active txn.
-	ok(conf_io_set("server", "version", NULL, "new text", &io) ==
+	ok(conf_io_set("server", "version", NULL, "new text") ==
 	   KNOT_EOK, "set single value");
 
 	// Get new, active txn.
@@ -793,7 +785,7 @@ static void test_conf_io_diff(void)
 	ok(strcmp(ref, out) == 0, "compare result");
 
 	// Update singlevalued item.
-	ok(conf_io_set("server", "version", NULL, "new text", &io) ==
+	ok(conf_io_set("server", "version", NULL, "new text") ==
 	   KNOT_EOK, "set single value");
 
 	*out = '\0';
@@ -805,7 +797,7 @@ static void test_conf_io_diff(void)
 	// Update multivalued item.
 	ok(conf_io_unset("server", "listen", NULL, "1.1.1.1") ==
 	   KNOT_EOK, "unset multivalue");
-	ok(conf_io_set("server", "listen", NULL, "1.1.1.3", &io) ==
+	ok(conf_io_set("server", "listen", NULL, "1.1.1.3") ==
 	   KNOT_EOK, "set multivalue");
 
 	*out = '\0';
@@ -893,7 +885,7 @@ static void test_conf_io_list(void)
 	ok(conf_io_list("server", &io) ==
 	   KNOT_EOK, "list group");
 	ref = "server.version\n"
-	      "server.rate-limit\n"
+	      "server.background-workers\n"
 	      "server.listen\n"
 	      "server.tcp-handshake-timeout\n"
 	      "server.tcp-idle-timeout\n"
@@ -901,14 +893,13 @@ static void test_conf_io_list(void)
 	      "server.max-tcp-clients\n"
 	      "server.max-udp-payload\n"
 	      "server.max-ipv4-udp-payload\n"
-	      "server.max-ipv6-udp-payload\n"
-	      "server.rate-limit-slip";
+	      "server.max-ipv6-udp-payload";
 	ok(strcmp(ref, out) == 0, "compare result");
 }
 
 static const yp_item_t desc_server[] = {
 	{ C_VERSION,              YP_TSTR,  YP_VNONE },
-	{ C_RATE_LIMIT,           YP_TINT,  YP_VNONE },
+	{ C_BG_WORKERS,           YP_TINT,  YP_VNONE },
 	{ C_LISTEN,               YP_TADDR, YP_VNONE, YP_FMULTI },
 	// Required config cache items - assert fix.
 	{ C_TCP_HSHAKE_TIMEOUT,   YP_TINT,  YP_VNONE },
@@ -918,7 +909,6 @@ static const yp_item_t desc_server[] = {
 	{ C_MAX_UDP_PAYLOAD,      YP_TINT,  YP_VNONE },
 	{ C_MAX_IPV4_UDP_PAYLOAD, YP_TINT,  YP_VNONE },
 	{ C_MAX_IPV6_UDP_PAYLOAD, YP_TINT,  YP_VNONE },
-	{ C_RATE_LIMIT_SLIP,	  YP_TINT,  YP_VNONE },
 	{ NULL }
 };
 
diff --git a/tests/dthreads.c b/tests/test_dthreads.c
similarity index 100%
rename from tests/dthreads.c
rename to tests/test_dthreads.c
diff --git a/tests/fdset.c b/tests/test_fdset.c
similarity index 100%
rename from tests/fdset.c
rename to tests/test_fdset.c
diff --git a/tests/test_journal.c b/tests/test_journal.c
new file mode 100644
index 0000000000000000000000000000000000000000..a5ddd87791da3e96f5b1f02fd76959a1a68af229
--- /dev/null
+++ b/tests/test_journal.c
@@ -0,0 +1,705 @@
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+
+    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
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <tap/basic.h>
+#include <tap/files.h>
+
+#include "libknot/libknot.h"
+#include "knot/journal/journal.c"
+#include "knot/zone/zone.h"
+#include "knot/zone/zone-diff.h"
+#include "libknot/rrtype/soa.h"
+#include "test_conf.h"
+
+#define RAND_RR_LABEL 16
+#define RAND_RR_PAYLOAD 64
+#define MIN_SOA_SIZE 22
+
+char *test_dir_name;
+journal_db_t *db;
+journal_t *j;
+const knot_dname_t *apex = (const uint8_t *)"\4test";
+
+static void set_conf(int zonefile_sync, size_t journal_usage)
+{
+	char conf_str[512];
+	snprintf(conf_str, sizeof(conf_str),
+	         "zone:\n"
+	         " - domain: %s\n"
+	         "   zonefile-sync: %d\n"
+	         "   max-journal-usage: %zu\n"
+	         "   max-journal-depth: 1000\n",
+	         (const char *)(apex + 1), zonefile_sync, journal_usage);
+	int ret = test_conf(conf_str, NULL);
+	(void)ret;
+	assert(ret == KNOT_EOK);
+}
+
+static void unset_conf(void)
+{
+	conf_update(NULL, CONF_UPD_FNONE);
+}
+
+/*! \brief Generate random string with given length. */
+static int randstr(char* dst, size_t len)
+{
+	for (int i = 0; i < len - 1; ++i) {
+		dst[i] = '0' + (int) (('Z'-'0') * (rand() / (RAND_MAX + 1.0)));
+	}
+	dst[len - 1] = '\0';
+
+	return 0;
+}
+
+/*! \brief Init RRSet with type SOA and given serial. */
+static void init_soa(knot_rrset_t *rr, const uint32_t serial, const knot_dname_t *apex)
+{
+	knot_rrset_init(rr, knot_dname_copy(apex, NULL), KNOT_RRTYPE_SOA, KNOT_CLASS_IN);
+
+	uint8_t soa_data[MIN_SOA_SIZE] = { 0 };
+	int ret = knot_rrset_add_rdata(rr, soa_data, sizeof(soa_data), 3600, NULL);
+	knot_soa_serial_set(&rr->rrs, serial);
+	(void)ret;
+	assert(ret == KNOT_EOK);
+}
+
+/*! \brief Init RRSet with type TXT, random owner and random payload. */
+static void init_random_rr(knot_rrset_t *rr , const knot_dname_t *apex)
+{
+	/* Create random label. */
+	char owner[RAND_RR_LABEL + knot_dname_size(apex)];
+	owner[0] = RAND_RR_LABEL - 1;
+	randstr(owner + 1, RAND_RR_LABEL);
+
+	/* Append zone apex. */
+	memcpy(owner + RAND_RR_LABEL, apex, knot_dname_size(apex));
+	knot_rrset_init(rr, knot_dname_copy((knot_dname_t *)owner, NULL),
+			KNOT_RRTYPE_TXT, KNOT_CLASS_IN);
+
+	/* Create random RDATA. */
+	uint8_t txt[RAND_RR_PAYLOAD + 1];
+	txt[0] = RAND_RR_PAYLOAD - 1;
+	randstr((char *)(txt + 1), RAND_RR_PAYLOAD);
+
+	int ret = knot_rrset_add_rdata(rr, txt, RAND_RR_PAYLOAD, 3600, NULL);
+	(void)ret;
+	assert(ret == KNOT_EOK);
+}
+
+/*! \brief Init changeset with random changes. */
+static void init_random_changeset(changeset_t *ch, const uint32_t from, const uint32_t to,
+                                  const size_t size, const knot_dname_t *apex)
+{
+	// Add SOAs
+	knot_rrset_t soa;
+	init_soa(&soa, from, apex);
+
+	ch->soa_from = knot_rrset_copy(&soa, NULL);
+	assert(ch->soa_from);
+	knot_rrset_clear(&soa, NULL);
+
+	init_soa(&soa, to, apex);
+	ch->soa_to = knot_rrset_copy(&soa, NULL);
+	assert(ch->soa_to);
+	knot_rrset_clear(&soa, NULL);
+
+	// Add RRs to add section
+	for (size_t i = 0; i < size / 2; ++i) {
+		knot_rrset_t rr;
+		init_random_rr(&rr, apex);
+		int ret = changeset_add_addition(ch, &rr, 0);
+		(void)ret;
+		assert(ret == KNOT_EOK);
+		knot_rrset_clear(&rr, NULL);
+	}
+
+	// Add RRs to remove section
+	for (size_t i = 0; i < size / 2; ++i) {
+		knot_rrset_t rr;
+		init_random_rr(&rr, apex);
+		int ret = changeset_add_removal(ch, &rr, 0);
+		(void)ret;
+		assert(ret == KNOT_EOK);
+		knot_rrset_clear(&rr, NULL);
+	}
+}
+
+static void changeset_set_soa_serials(changeset_t *ch, uint32_t from, uint32_t to,
+				      const knot_dname_t *apex)
+{
+	knot_rrset_t soa;
+
+	init_soa(&soa, from, apex);
+	knot_rrset_free(&ch->soa_from, NULL);
+	ch->soa_from = knot_rrset_copy(&soa, NULL);
+	assert(ch->soa_from);
+	knot_rrset_clear(&soa, NULL);
+
+	init_soa(&soa, to, apex);
+	knot_rrset_free(&ch->soa_to, NULL);
+	ch->soa_to = knot_rrset_copy(&soa, NULL);
+	assert(ch->soa_to);
+	knot_rrset_clear(&soa, NULL);
+}
+
+/*! \brief Compare two changesets for equality. */
+static bool changesets_eq(const changeset_t *ch1, changeset_t *ch2)
+{
+	if (changeset_size(ch1) != changeset_size(ch2)) {
+		return false;
+	}
+
+	changeset_iter_t it1;
+	changeset_iter_all(&it1, ch1);
+	changeset_iter_t it2;
+	changeset_iter_all(&it2, ch2);
+
+	knot_rrset_t rr1 = changeset_iter_next(&it1);
+	knot_rrset_t rr2 = changeset_iter_next(&it2);
+	bool ret = true;
+	while (!knot_rrset_empty(&rr1)) {
+		if (!knot_rrset_equal(&rr1, &rr2, KNOT_RRSET_COMPARE_WHOLE)) {
+			ret = false;
+			break;
+		}
+		rr1 = changeset_iter_next(&it1);
+		rr2 = changeset_iter_next(&it2);
+	}
+
+	changeset_iter_clear(&it1);
+	changeset_iter_clear(&it2);
+
+	return ret;
+}
+
+static bool changesets_list_eq(list_t *l1, list_t *l2)
+{
+	node_t *n = NULL;
+	node_t *k = HEAD(*l2);
+	WALK_LIST(n, *l1) {
+		if (k == NULL) {
+			return false;
+		}
+
+		changeset_t *ch1 = (changeset_t *) n;
+		changeset_t *ch2 = (changeset_t *) k;
+		if (!changesets_eq(ch1, ch2)) {
+			return false;
+		}
+
+		k = k->next;
+	}
+
+	if (k->next != NULL) {
+		return false;
+	}
+
+	return true;
+}
+
+/*! \brief Test a list of changesets for continuity. */
+static bool test_continuity(list_t *l)
+{
+	node_t *n = NULL;
+	uint32_t key1, key2;
+	WALK_LIST(n, *l) {
+		if (n == TAIL(*l)) {
+			break;
+		}
+		changeset_t *ch1 = (changeset_t *) n;
+		changeset_t *ch2 = (changeset_t *) n->next;
+		key1 = knot_soa_serial(&ch1->soa_to->rrs);
+		key2 = knot_soa_serial(&ch2->soa_from->rrs);
+		if (key1 != key2) {
+			return KNOT_EINVAL;
+		}
+	}
+
+	return KNOT_EOK;
+}
+
+static void test_journal_db(void)
+{
+	int ret, ret2 = KNOT_EOK;
+
+	ret = journal_db_init(&db, test_dir_name, 2 * 1024 * 1024);
+	ok(ret == KNOT_EOK, "journal: init db (%d)", ret);
+
+	ret = open_journal_db(&db);
+	ok(ret == KNOT_EOK, "journal: open db (%d)", ret);
+
+	journal_db_close(&db);
+	ok(db == NULL, "journal: close and destroy db");
+
+	ret = journal_db_init(&db, test_dir_name, 4 * 1024 * 1024);
+	if (ret == KNOT_EOK) ret2 = open_journal_db(&db);
+	ok(ret == KNOT_EOK && ret2 == KNOT_EOK, "journal: open with bigger mapsize (%d, %d)", ret, ret2);
+	journal_db_close(&db);
+
+	ret = journal_db_init(&db, test_dir_name, 1024 * 1024);
+	if (ret == KNOT_EOK) ret2 = open_journal_db(&db);
+	ok(ret == KNOT_EOK && ret2 == KNOT_EOK, "journal: open with smaller mapsize (%d, %d)", ret, ret2);
+	journal_db_close(&db);
+}
+
+/*! \brief Test behavior with real changesets. */
+static void test_store_load(void)
+{
+	int ret, ret2 = KNOT_EOK;
+
+	set_conf(1000, 512 * 1024);
+
+	j = journal_new();
+	ok(j != NULL, "journal: new");
+
+	ret = journal_db_init(&db, test_dir_name, 1024 * 1024);
+	if (ret == KNOT_EOK) ret2 = journal_open(j, &db, apex);
+	ok(ret == KNOT_EOK, "journal: open (%d, %d)", ret, ret2);
+
+	/* Save and load changeset. */
+	changeset_t *m_ch = changeset_new(apex);
+	init_random_changeset(m_ch, 0, 1, 128, apex);
+	ret = journal_store_changeset(j, m_ch);
+	ok(ret == KNOT_EOK, "journal: store changeset (%d)", ret);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+	list_t l, k;
+	init_list(&l);
+	init_list(&k);
+	ret = journal_load_changesets(j, &l, 0);
+	add_tail(&k, &m_ch->n);
+	ok(ret == KNOT_EOK && changesets_list_eq(&l, &k), "journal: load changeset (%d)", ret);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+
+	changesets_free(&l);
+	changesets_free(&k);
+
+	/* Flush the journal. */
+	ret = journal_flush(j);
+	ok(ret == KNOT_EOK, "journal: first and simple flush (%d)", ret);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+	init_list(&l);
+	init_list(&k);
+
+	/* Fill the journal. */
+	ret = KNOT_EOK;
+	uint32_t serial = 1;
+	for (; ret == KNOT_EOK; ++serial) {
+		changeset_t *m_ch2 = changeset_new(apex);
+		init_random_changeset(m_ch2, serial, serial + 1, 128, apex);
+		ret = journal_store_changeset(j, m_ch2);
+		if (ret != KNOT_EOK) {
+			changeset_free(m_ch2);
+			break;
+		}
+		add_tail(&k, &m_ch2->n);
+	}
+	ok(ret == KNOT_EBUSY, "journal: overfill with changesets (%d inserted) (%d should= %d)",
+	   serial, ret, KNOT_EBUSY);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+
+	/* Load all changesets stored until now. */
+	ret = journal_load_changesets(j, &l, 1);
+	ok(ret == KNOT_EOK && changesets_list_eq(&l, &k), "journal: load changesets (%d)", ret);
+
+	changesets_free(&l);
+	init_list(&l);
+	ret = journal_load_changesets(j, &l, 1);
+	ok(ret == KNOT_EOK && changesets_list_eq(&l, &k), "journal: re-load changesets (%d)", ret);
+
+	changesets_free(&l);
+	init_list(&l);
+
+	/* Flush the journal. */
+	ret = journal_flush(j);
+	ok(ret == KNOT_EOK, "journal: second flush (%d)", ret);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+
+	/* Test whether the journal kept changesets after flush. */
+	ret = journal_load_changesets(j, &l, 1);
+	ok(ret == KNOT_EOK && changesets_list_eq(&l, &k), "journal: load right after flush (%d)", ret);
+
+	changesets_free(&k);
+	changesets_free(&l);
+	init_list(&k);
+	init_list(&l);
+
+	/* Store next changeset. */
+	changeset_t ch;
+	changeset_init(&ch, apex);
+	init_random_changeset(&ch, serial, serial + 1, 128, apex);
+	ret = journal_store_changeset(j, &ch);
+	changeset_clear(&ch);
+	ok(ret == KNOT_EOK, "journal: store after flush (%d)", ret);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+
+	/* Load last changesets. */
+	init_list(&l);
+	ret = journal_load_changesets(j, &l, serial);
+	changesets_free(&l);
+	ok(ret == KNOT_EOK, "journal: load changesets after flush (%d)", ret);
+
+	/* Flush the journal again. */
+	ret = journal_flush(j);
+	ok(ret == KNOT_EOK, "journal: flush again (%d)", ret);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+
+	/* Fill the journal using a list. */
+	uint32_t m_serial = 1;
+	for (; m_serial < serial / 2; ++m_serial) {
+		changeset_t *m_ch7 = changeset_new(apex);
+		init_random_changeset(m_ch7, m_serial, m_serial + 1, 128, apex);
+		add_tail(&l, &m_ch7->n);
+	}
+	ret = journal_store_changesets(j, &l);
+	ok(ret == KNOT_EOK, "journal: fill with changesets using a list (%d inserted)", m_serial);
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+
+	/* Cleanup. */
+	changesets_free(&l);
+	init_list(&l);
+
+	/* Load all previous changesets. */
+	ret = journal_load_changesets(j, &l, 1);
+	ok(ret == KNOT_EOK && knot_soa_serial(&((changeset_t *)TAIL(l))->soa_to->rrs) == m_serial,
+	   "journal: load all changesets");
+
+	/* Check for changeset ordering. */
+	ok(test_continuity(&l) == KNOT_EOK, "journal: changesets are in order");
+
+	/* Cleanup. */
+	changesets_free(&l);
+	init_list(&l);
+	ret = journal_flush(j);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_flush 0");
+	ret = drop_journal(j, NULL); /* Clear the journal for the collision test */
+	ok(ret == KNOT_EOK, "journal: allways ok drop_journal");
+
+	/* Test for serial number collision handling. We insert changesets
+	 * with valid serial sequence that overflows and then collides with itself.
+	 * The sequence is 0 -> 1 -> 2 -> 2147483647 -> 4294967294 -> 1 which should
+	 * remove changesets 0->1 and 1->2. */
+	ok(EMPTY_LIST(k), "journal: empty list k");
+	ok(EMPTY_LIST(l), "journal: empty list l");
+	changeset_t *m_ch3 = changeset_new(apex);
+	init_random_changeset(m_ch3, 0, 1, 128, apex);
+	ret = journal_store_changeset(j, m_ch3);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_store_changeset 1");
+	changeset_set_soa_serials(m_ch3, 1, 2, apex);
+	ret = journal_store_changeset(j, m_ch3);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_store_changeset 2");
+	changeset_set_soa_serials(m_ch3, 2, 2147483647, apex);
+	add_tail(&k, &m_ch3->n);
+	ret = journal_store_changeset(j, m_ch3);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_store_changeset 3");
+	changeset_t *m_ch4 = changeset_new(apex);
+	init_random_changeset(m_ch4, 2147483647, 4294967294, 128, apex);
+	add_tail(&k, &m_ch4->n);
+	ret = journal_store_changeset(j, m_ch4);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_store_changeset 4");
+	changeset_t *m_ch5 = changeset_new(apex);
+	init_random_changeset(m_ch5, 4294967294, 1, 128, apex);
+	add_tail(&k, &m_ch5->n);
+	ret = journal_store_changeset(j, m_ch5);
+	ok(ret == KNOT_EBUSY, "journal: allways ok journal_store_changeset 5");
+	ret = journal_flush(j);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_flush 1");
+	ret = journal_store_changeset(j, m_ch5);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_store_changeset 6");
+	ret = journal_flush(j);
+	ok(ret == KNOT_EOK, "journal: allways ok journal_flush 2");
+	ret = journal_load_changesets(j, &l, 0);
+	ret2 = journal_load_changesets(j, &l, 1);
+	int ret3 = journal_load_changesets(j, &l, 2);
+	fprintf(stderr, "ret=%d ret2=%d ret3=%d\n", ret, ret2, ret3);
+	ok(ret == KNOT_ENOENT && ret2 == KNOT_ENOENT && ret3 == KNOT_EOK &&
+	   changesets_list_eq(&l, &k), "journal: serial collision");
+	ret = journal_check(j, JOURNAL_CHECK_INFO);
+	ok(ret == KNOT_EOK, "journal check (%d)", ret);
+
+	/* Cleanup. */
+	changesets_free(&l);
+	changesets_free(&k);
+
+	init_list(&l);
+	init_list(&k);
+
+	unset_conf();
+}
+
+const uint8_t *rdA = (const uint8_t *) "\x01\x02\x03\x04";
+const uint8_t *rdB = (const uint8_t *) "\x01\x02\x03\x05";
+const uint8_t *rdC = (const uint8_t *) "\x01\x02\x03\x06";
+
+// frees owner
+static knot_rrset_t * tm_rrset(knot_dname_t * owner, const uint8_t * rdata)
+{
+	knot_rrset_t * rrs = knot_rrset_new(owner, KNOT_RRTYPE_A, KNOT_CLASS_IN, NULL);
+	knot_rrset_add_rdata(rrs, rdata, 4, 3600, NULL);
+	free(owner);
+	return rrs;
+}
+
+static knot_dname_t * tm_owner(const char * prefix, const knot_dname_t *apex)
+{
+	knot_dname_t * ret = malloc(strlen(prefix) + knot_dname_size(apex) + 2);
+	ret[0] = strlen(prefix);
+	strcpy((char *) (ret + 1), prefix);
+	memcpy(ret + ret[0] + 1, apex, knot_dname_size(apex));
+	return ret;
+}
+
+static knot_rrset_t * tm_rrs(const knot_dname_t * apex, int x)
+{
+	static knot_rrset_t * rrsA = NULL;
+	static knot_rrset_t * rrsB = NULL;
+	static knot_rrset_t * rrsC = NULL;
+
+	if (apex == NULL) {
+		knot_rrset_free(&rrsA, NULL);
+		knot_rrset_free(&rrsB, NULL);
+		knot_rrset_free(&rrsC, NULL);
+		rrsA = rrsB = rrsC = NULL;
+		return NULL;
+	}
+
+	if (rrsA == NULL) rrsA = tm_rrset(tm_owner("aaaaaaaaaaaaaaaaa", apex), rdA);
+	if (rrsB == NULL) rrsB = tm_rrset(tm_owner("bbbbbbbbbbbbbbbbb", apex), rdB);
+	if (rrsC == NULL) rrsC = tm_rrset(tm_owner("ccccccccccccccccc", apex), rdC);
+	switch ((x % 3 + 3) % 3) {
+	case 0: return rrsA;
+	case 1: return rrsB;
+	case 2: return rrsC;
+	}
+	assert(0); return NULL;
+}
+
+int tm_rrcnt(const changeset_t * ch, int flg)
+{
+	changeset_iter_t it;
+	int i = 0;
+	if (flg >= 0) changeset_iter_add(&it, ch);
+	else changeset_iter_rem(&it, ch);
+
+	knot_rrset_t rri;
+	while (rri = changeset_iter_next(&it), !knot_rrset_empty(&rri)) i++;
+
+	changeset_iter_clear(&it);
+	return i;
+}
+
+static changeset_t * tm_chs(const knot_dname_t * apex, int x)
+{
+	static changeset_t * chsI = NULL, * chsX = NULL, * chsY = NULL;
+	static uint32_t serial = 0;
+
+	if (apex == NULL) {
+		changeset_free(chsI);
+		changeset_free(chsX);
+		changeset_free(chsY);
+		chsI = chsX = chsY = NULL;
+		return NULL;
+	}
+
+	if (chsI == NULL) {
+		chsI = changeset_new(apex);
+		assert(chsI != NULL);
+		changeset_add_addition(chsI, tm_rrs(apex, 0), 0);
+		changeset_add_addition(chsI, tm_rrs(apex, 1), 0);
+	}
+	if (chsX == NULL) {
+		chsX = changeset_new(apex);
+		assert(chsX != NULL);
+		changeset_add_removal(chsX, tm_rrs(apex, 1), 0);
+		changeset_add_addition(chsX, tm_rrs(apex, 2), 0);
+	}
+	if (chsY == NULL) {
+		chsY = changeset_new(apex);
+		assert(chsY != NULL);
+		changeset_add_removal(chsY, tm_rrs(apex, 2), 0);
+		changeset_add_addition(chsY, tm_rrs(apex, 1), 0);
+	}
+	assert(x >= 0);
+	changeset_t * ret;
+	if (x == 0) ret = chsI;
+	else if (x % 2 == 1) ret = chsX;
+	else ret = chsY;
+
+	changeset_set_soa_serials(ret, serial, serial + 1, apex);
+	serial++;
+
+	return ret;
+}
+
+static int merged_present(void)
+{
+	local_txn_t(txn, j);
+	txn_begin(txn, 0);
+	int res = md_flag(txn, MERGED_SERIAL_VALID);
+	txn_abort(txn);
+	return res;
+}
+
+static void test_merge(void)
+{
+	int i, ret;
+	list_t l;
+
+	// allow merge
+	set_conf(-1, 512 * 1024);
+	ok(journal_merge_allowed(j), "journal: merge allowed");
+
+	ret = drop_journal(j, NULL);
+	ok(ret == KNOT_EOK, "journal: drop_journal must be ok");
+
+	// insert stuff and check the merge
+	for (i = 0; !merged_present(); i++) {
+		ret = journal_store_changeset(j, tm_chs(apex, i));
+		ok(ret == KNOT_EOK, "journal: journal_store_changeset must be ok");
+	}
+	init_list(&l);
+	ret = journal_load_changesets(j, &l, 0);
+	ok(ret == KNOT_EOK, "journal: journal_load_changesets must be ok");
+	ok(list_size(&l) == 2, "journal: read the merged and one following");
+	changeset_t * mch = (changeset_t *)HEAD(l);
+	ok(list_size(&l) >= 1 && tm_rrcnt(mch, 1) == 2, "journal: merged additions # = 2");
+	ok(list_size(&l) >= 1 && tm_rrcnt(mch, -1) == 1, "journal: merged removals # = 1");
+	changesets_free(&l);
+
+	// insert one more and check the #s of results
+	journal_store_changeset(j, tm_chs(apex, i));
+	init_list(&l);
+	ret = journal_load_changesets(j, &l, 0);
+	ok(ret == KNOT_EOK, "journal: journal_load_changesets2 must be ok");
+	ok(list_size(&l) == 3, "journal: read merged together with new changeset");
+	changesets_free(&l);
+	init_list(&l);
+	ret = journal_load_changesets(j, &l, (uint32_t) (i - 3));
+	ok(ret == KNOT_EOK, "journal: journal_load_changesets3 must be ok");
+	ok(list_size(&l) == 4, "journal: read short history of merged/unmerged changesets");
+	changesets_free(&l);
+
+	ret = drop_journal(j, NULL);
+	assert(ret == KNOT_EOK);
+
+	// disallow merge
+	unset_conf();
+	set_conf(1000, 512 * 1024);
+	ok(!journal_merge_allowed(j), "journal: merge disallowed");
+
+	tm_rrs(NULL, 0);
+	tm_chs(NULL, 0);
+	unset_conf();
+}
+
+static void test_stress_base(journal_t *j, size_t update_size, size_t file_size)
+{
+	int ret;
+	uint32_t serial = 0;
+
+	journal_close(j);
+	journal_db_close(&db);
+	db = NULL;
+	ret = journal_db_init(&db, test_dir_name, file_size);
+	assert(ret == KNOT_EOK);
+	ret = open_journal_db(&db);
+	assert(ret == KNOT_EOK);
+	ret = journal_open(j, &db, apex);
+	assert(ret == KNOT_EOK);
+
+	set_conf(1000, file_size / 2);
+
+	changeset_t ch;
+	changeset_init(&ch, apex);
+	init_random_changeset(&ch, serial, serial + 1, update_size, apex);
+
+	for (int i = 1; i <= 6; ++i) {
+		serial = 0;
+		while (true) {
+			changeset_set_soa_serials(&ch, serial, serial + 1, apex);
+			ret = journal_store_changeset(j, &ch);
+
+			if (ret != KNOT_EOK) {
+				fprintf(stderr, "store failed %d serial=%d (espace=%d ebusy=%d)\n",
+				        ret, serial, KNOT_ESPACE, KNOT_EBUSY);
+			}
+
+			if (ret == KNOT_EOK) {
+				serial++;
+			} else {
+				break;
+			}
+		}
+
+		int ret = journal_flush(j);
+		ok(serial > 0 && ret == KNOT_EOK, "journal: pass #%d fillup run (%d inserts)", i, serial);
+	}
+
+	changeset_clear(&ch);
+
+	unset_conf();
+}
+
+/*! \brief Test behavior when writing to jurnal and flushing it. */
+static void test_stress(journal_t *j)
+{
+	printf("stress test: small data\n");
+	test_stress_base(j, 40, 1024 * 1024 / 2);
+
+	printf("stress test: medium data\n");
+	test_stress_base(j, 400, 3 * 1024 * 1024);
+
+	printf("stress test: large data\n");
+	test_stress_base(j, 4000, 10 * 1024 * 1024);
+}
+
+int main(int argc, char *argv[])
+{
+	plan_lazy();
+
+	test_dir_name = test_mkdtemp();
+
+	test_journal_db();
+
+	test_store_load();
+
+	test_merge();
+
+	test_stress(j);
+
+	journal_close(j);
+	journal_free(&j);
+	journal_db_close(&db);
+
+	test_rm_rf(test_dir_name);
+	free(test_dir_name);
+
+	return 0;
+}
diff --git a/tests/node.c b/tests/test_node.c
similarity index 100%
rename from tests/node.c
rename to tests/test_node.c
diff --git a/tests/process_query.c b/tests/test_process_query.c
similarity index 98%
rename from tests/process_query.c
rename to tests/test_process_query.c
index 46e8e10cacc0a6b07786c4827afd3bdf2d42ee25..92d786ee660adf5a2ae59649d24136d0f8509c36 100644
--- a/tests/process_query.c
+++ b/tests/test_process_query.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2013 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2017 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -22,7 +22,7 @@
 #include "libknot/descriptor.h"
 #include "libknot/packet/wire.h"
 #include "knot/nameserver/process_query.h"
-#include "fake_server.h"
+#include "test_server.h"
 #include "contrib/ucw/mempool.h"
 
 /* Basic response check (4 TAP tests). */
diff --git a/tests/query_module.c b/tests/test_query_module.c
similarity index 100%
rename from tests/query_module.c
rename to tests/test_query_module.c
diff --git a/tests/requestor.c b/tests/test_requestor.c
similarity index 100%
rename from tests/requestor.c
rename to tests/test_requestor.c
diff --git a/tests/semantic_check.in b/tests/test_semantic_check.in
similarity index 100%
rename from tests/semantic_check.in
rename to tests/test_semantic_check.in
diff --git a/tests/server.c b/tests/test_server.c
similarity index 91%
rename from tests/server.c
rename to tests/test_server.c
index b2729b5d8777e535e85123e93e53e9e43e8e9076..b476c67a403439fb14a59fa056ac3c84e789d797 100644
--- a/tests/server.c
+++ b/tests/test_server.c
@@ -16,6 +16,7 @@
 
 #include <tap/basic.h>
 #include "knot/server/server.h"
+#include "test_conf.h"
 
 // Signal handler
 static void interrupt_handle(int s)
@@ -30,6 +31,10 @@ int main(int argc, char *argv[])
 	server_t server;
 	int ret = 0;
 
+	/* Some random configuration just to apply the default conf scheme */
+	ret = test_conf("", NULL);
+	assert(ret == KNOT_EOK);
+
 	/* Register service and signal handler */
 	struct sigaction sa;
 	sa.sa_handler = interrupt_handle;
diff --git a/tests/fake_server.h b/tests/test_server.h
similarity index 96%
rename from tests/fake_server.h
rename to tests/test_server.h
index 0088faaa37e36f490adb073c79f66fdd6353f2fc..5223c0916ee4c97cf1e3eea53a3a249e0bf5ea22 100644
--- a/tests/fake_server.h
+++ b/tests/test_server.h
@@ -42,6 +42,7 @@ static inline void create_root_zone(server_t *server, knot_mm_t *mm)
 
 	/* Insert root zone. */
 	zone_t *root = zone_new(ROOT_DNAME);
+	root->journal_db = &server->journal_db;
 	root->contents = zone_contents_new(root->name);
 
 	knot_rrset_t *soa = knot_rrset_new(root->name, KNOT_RRTYPE_SOA, KNOT_CLASS_IN, mm);
@@ -62,11 +63,7 @@ static inline void create_root_zone(server_t *server, knot_mm_t *mm)
 /* Create fake server. */
 static inline int create_fake_server(server_t *server, knot_mm_t *mm)
 {
-	/* Create name server. */
-	int ret = server_init(server, 1);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
+	int ret;
 
 	/* Load test configuration. */
 	const char *conf_str = "server:\n identity: bogus.ns\n version: 0.11\n nsid: ""\n"
@@ -76,6 +73,12 @@ static inline int create_fake_server(server_t *server, knot_mm_t *mm)
 		return ret;
 	}
 
+	/* Create name server. */
+	ret = server_init(server, 1);
+	if (ret != KNOT_EOK) {
+		return ret;
+	}
+
 	/* Insert root zone. */
 	create_root_zone(server, mm);
 
diff --git a/tests/worker_pool.c b/tests/test_worker_pool.c
similarity index 100%
rename from tests/worker_pool.c
rename to tests/test_worker_pool.c
diff --git a/tests/worker_queue.c b/tests/test_worker_queue.c
similarity index 100%
rename from tests/worker_queue.c
rename to tests/test_worker_queue.c
diff --git a/tests/ztree.c b/tests/test_zone-tree.c
similarity index 94%
rename from tests/ztree.c
rename to tests/test_zone-tree.c
index b8b2ef28bcdd4e3ba3ed744298fc1e8270934236..63faaa44b1d3ac0bb5efa139819f744f3f61d1c3 100644
--- a/tests/ztree.c
+++ b/tests/test_zone-tree.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2011 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2016 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     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
@@ -98,9 +98,6 @@ int main(int argc, char *argv[])
 	}
 	ok(passed, "ztree: lookup");
 
-	/* heal index for ordered lookup */
-	hattrie_build_index(t);
-
 	/* 4. ordered lookup */
 	node = NULL;
 	zone_node_t *prev = NULL;
@@ -111,7 +108,7 @@ int main(int argc, char *argv[])
 
 	/* 5. ordered traversal */
 	unsigned i = 0;
-	int ret = zone_tree_apply_inorder(t, ztree_iter_data, &i);
+	int ret = zone_tree_apply(t, ztree_iter_data, &i);
 	ok (ret == KNOT_EOK, "ztree: ordered traversal");
 
 	zone_tree_free(&t);
diff --git a/tests/zone_update.c b/tests/test_zone-update.c
similarity index 95%
rename from tests/zone_update.c
rename to tests/test_zone-update.c
index 661ec3c8dc8746bf27e6fdb4b6cf8bb0b70d47c2..63b72c223dcfbebec3b92fa79248092020b99498 100644
--- a/tests/zone_update.c
+++ b/tests/test_zone-update.c
@@ -21,10 +21,10 @@
 #include "test_conf.h"
 #include "contrib/macros.h"
 #include "contrib/getline.h"
-#include "contrib/openbsd/strlcat.h"
 #include "knot/updates/zone-update.h"
 #include "knot/zone/node.h"
 #include "zscanner/scanner.h"
+#include "knot/server/server.h"
 
 static const char *zone_str1 = "test. 600 IN SOA ns.test. m.test. 1 900 300 4800 900 \n";
 static const char *zone_str2 = "test. IN TXT \"test\"\n";
@@ -287,19 +287,28 @@ int main(int argc, char *argv[])
 	char *temp_dir = test_mkdtemp();
 	ok(temp_dir != NULL, "make temporary directory");
 
-	char conf_str[256] = "zone:\n - domain: test.\n   storage: ";
-	strlcat(conf_str, temp_dir, 256);
-	strlcat(conf_str, "\n", 256);
+	char conf_str[512];
+	snprintf(conf_str, sizeof(conf_str),
+	         "zone:\n"
+	         " - domain: test.\n"
+	         "template:\n"
+	         " - id: default\n"
+	         "   storage: %s\n",
+	         temp_dir);
 
 	/* Load test configuration. */
 	int ret = test_conf(conf_str, NULL);
-	(void)ret;
-	assert(ret == KNOT_EOK);
+	ok(ret == KNOT_EOK, "load configuration");
+
+	server_t server;
+	ret = server_init(&server, 1);
+	ok(ret == KNOT_EOK, "server init");
 
 	/* Set up empty zone */
 	knot_dname_t *apex = knot_dname_from_str_alloc("test");
 	assert(apex);
 	zone_t *zone = zone_new(apex);
+	zone->journal_db = &server.journal_db;
 
 	/* Setup zscanner */
 	zs_scanner_t sc;
@@ -314,6 +323,7 @@ int main(int argc, char *argv[])
 
 	zs_deinit(&sc);
 	zone_free(&zone);
+	server_deinit(&server);
 	knot_dname_free(&apex, NULL);
 	conf_free(conf());
 	test_rm_rf(temp_dir);
diff --git a/tests/zone_events.c b/tests/test_zone_events.c
similarity index 100%
rename from tests/zone_events.c
rename to tests/test_zone_events.c
diff --git a/tests/zone_serial.c b/tests/test_zone_serial.c
similarity index 100%
rename from tests/zone_serial.c
rename to tests/test_zone_serial.c
diff --git a/tests/zone_timers.c b/tests/test_zone_timers.c
similarity index 100%
rename from tests/zone_timers.c
rename to tests/test_zone_timers.c
diff --git a/tests/zonedb.c b/tests/test_zonedb.c
similarity index 100%
rename from tests/zonedb.c
rename to tests/test_zonedb.c
diff --git a/tests/utils/test_lookup.c b/tests/utils/test_lookup.c
index d38afae1a7fde12a351b31af32be3c22bbf45aae..70f7646f96e40c386c2cd4af5d9f3a4bab4a5626 100644
--- a/tests/utils/test_lookup.c
+++ b/tests/utils/test_lookup.c
@@ -63,8 +63,6 @@ static void init(lookup_t *l, const char **table)
 		ok(ret == KNOT_EOK, "Insert '%s'", *table);
 		table++;
 	}
-
-	lookup_index(l);
 }
 
 static void test_search_basic(void)