]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3049] kea-dhcp4 parsing and UTs
authorThomas Markwalder <tmark@isc.org>
Tue, 7 Jan 2025 18:16:09 +0000 (13:16 -0500)
committerThomas Markwalder <tmark@isc.org>
Wed, 22 Jan 2025 15:24:25 +0000 (15:24 +0000)
Fully functional in kea-dhcp4 (excluding doc update and CB support)

/doc/examples/kea4/all-keys.json
    Added entries to a pool

/src/bin/dhcp4/dhcp4_lexer.ll
/src/bin/dhcp4/dhcp4_parser.yy
    Added parameters to pools

/src/bin/dhcp4/dhcp4_srv.cc
    Added comment

/src/bin/dhcp4/tests/config_parser_unittest.cc
    TEST_F(Dhcp4ParserTest, poolDdnsParameters) - new test

/src/bin/dhcp4/tests/fqdn_unittest.cc
    TEST_F(NameDhcpv4SrvTest, poolDdnsParametersTest) - new test

/src/bin/dhcp4/tests/get_config_unittest.cc
    Updated

/src/lib/dhcpsrv/parsers/base_network_parser.*
    Moved DDNS parameter parsing to a function template to allow use
    by any class type

/src/lib/dhcpsrv/parsers/dhcp_parsers.cc
    Added DDNS parameter parsing to PoolParser

/src/lib/dhcpsrv/parsers/simple_parser4.cc
    Added paramters to pool

/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc
    TEST_F(DhcpParserTest, validDdnsParmatersPool4) - new test

17 files changed:
doc/examples/kea4/all-keys.json
doc/sphinx/debug-messages.rst
doc/sphinx/kea-messages.rst
src/bin/dhcp4/dhcp4_lexer.cc
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.cc
src/bin/dhcp4/dhcp4_parser.h
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp4/tests/fqdn_unittest.cc
src/bin/dhcp4/tests/get_config_unittest.cc
src/lib/dhcpsrv/parsers/base_network_parser.cc
src/lib/dhcpsrv/parsers/base_network_parser.h
src/lib/dhcpsrv/parsers/dhcp_parsers.cc
src/lib/dhcpsrv/parsers/simple_parser4.cc
src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc

index 4af0507cd58ed4dedeec153ebc6e247f49ab9628..3d28d78953e1fd5edcfe6d13047a318b6d9a03ad 100644 (file)
 
                                 // List of client classes which must be evaluated when this pool
                                 // is selected for client assignments.
-                                "evaluate-additional-classes": [ "late" ]
+                                "evaluate-additional-classes": [ "late" ],
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-generated-prefix": "mypool",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-override-client-update": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-override-no-update": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-qualifying-suffix": "pool.example.com.",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-replace-client-name": "always",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-send-updates": true,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-update-on-renew": false,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-conflict-resolution-mode": "check-with-dhcid",
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-ttl-percent": 0.55,
+
+                                // Pool-level value. See description at the global level.
+                                // You cannot specify both ddns-ttl and any of ddns-ttl-percent,
+                                // ddns-ttl-min, or ddns-ttl-max. They are mutually exclusive.
+                                // "ddns-ttl": 500,
+
+                                // Pool-evel value. See description at the global level.
+                                "ddns-ttl-min": 10000,
+
+                                // Pool-level value. See description at the global level.
+                                "ddns-ttl-max": 20000,
+
+                                // Pool-level value. See description at the global level.
+                                "hostname-char-replacement": "x",
+
+                                // Pool-level value. See description at the global level.
+                                "hostname-char-set": "[^A-Za-z0-9.-]"
                             },
                             {
                                 // Restricts this pool to allow only clients
index 349b6ae469b75643181a0a6f4eb37485b969ce3d..2596a713566bfae6c4fe0ba178f6296de760d1ef 100644 (file)
@@ -1145,7 +1145,8 @@ Messages printed on debuglevel 55
 - DHCP6_QUERY_DATA
 - DHCP6_RESPONSE_DATA
 - DHCP6_SUBNET_DATA
-- DHCPSRV_DDNS_TTL_PERCENT_TOO_SMALL
+- DHCPSRV_DDNS_TTL_TOO_LARGE
+- DHCPSRV_DDNS_TTL_TOO_SMALL
 - DHCPSRV_MEMFILE_LEASE_LOAD
 - DHCPSRV_QUEUE_NCR
 - DHCP_DDNS_AT_MAX_TRANSACTIONS
index 68cc7aceff4abd17284934a72cd3a2dce45316cf..cb9e3d25080021ef062227876c409e03e3f38d0f 100644 (file)
@@ -8585,19 +8585,19 @@ the database access parameters are changed: in the latter case, the
 server closes the currently open database, and opens a database using
 the new parameters.
 
-DHCPSRV_DDNS_TTL_PERCENT_TOO_SMALL
-==================================
+DHCPSRV_DDNS_TTL_TOO_SMALL
+==========================
 
 .. code-block:: text
 
-    ddns-ttl-percent %1 of lease lifetime %2 is too small, ignoring it
+    %1 of lease life time %2 is %3, using minimum of %4 instead.
 
 Logged at debug log level 55.
 A debug message issued when the DDNS TTL value calculated using the
-ddns-ttl-percent is zero.  Kea will ignore the value and calculate
-the DDNS TTL as though ddsn-ttl-percent were not specified. The
-value of ddns-ttl-percent and the lease lifetime are shown in
-the message details.
+ddns-ttl-percent if specified or (0.33 if not) is too small.  Kea will
+ignore the value and use the minimum (ddns-ttl-min if specified or 600
+seconds if not). The message details include the percentage, the lease
+life time, the calculated TTL, and the value actually used.
 
 DHCPSRV_DHCP4O6_RECEIVED_BAD_PACKET
 ===================================
@@ -10012,6 +10012,16 @@ A debug message issued when one of the registered interval timers
 is unregistered from the Timer Manager. The name of the timer is
 included in the message.
 
+DHCPSRV_UNKNOWN_DB
+==================
+
+.. code-block:: text
+
+    unknown database type: %1
+
+The database access string specified a database type (given in the
+message) that is unknown to the software. This is a configuration error.
+
 ****
 DHCP
 ****
index 3e73a5846eeea795c4d0d7f4b127f911698c3b5c..5206fffaa4fe2a349faa486ef8c70d244738d010 100644 (file)
@@ -2203,27 +2203,27 @@ static const flex_int16_t yy_rule_linenum[242] =
       361,  370,  379,  388,  397,  410,  422,  434,  445,  456,
       467,  478,  489,  500,  511,  522,  533,  544,  553,  562,
       571,  582,  593,  602,  614,  626,  638,  649,  661,  673,
-      685,  696,  707,  716,  725,  734,  745,  754,  763,  774,
-      785,  796,  807,  818,  829,  840,  851,  862,  871,  880,
-      889,  898,  909,  920,  931,  942,  952,  963,  972,  982,
-      996, 1013, 1022, 1031, 1040, 1049, 1058, 1067, 1092, 1117,
-
-     1126, 1136, 1145, 1156, 1167, 1178, 1188, 1197, 1208, 1219,
-     1230, 1241, 1252, 1261, 1270, 1279, 1288, 1297, 1306, 1315,
-     1324, 1333, 1342, 1356, 1367, 1378, 1390, 1399, 1408, 1417,
-     1426, 1436, 1446, 1456, 1466, 1476, 1486, 1495, 1505, 1514,
-     1523, 1532, 1541, 1551, 1560, 1569, 1578, 1587, 1596, 1605,
-     1614, 1623, 1632, 1641, 1650, 1659, 1668, 1677, 1686, 1695,
-     1704, 1713, 1722, 1731, 1740, 1749, 1758, 1767, 1776, 1785,
-     1794, 1803, 1812, 1821, 1830, 1839, 1848, 1857, 1866, 1875,
-     1884, 1893, 1902, 1911, 1920, 1929, 1938, 1947, 1956, 1965,
-     1974, 1983, 1992, 2003, 2014, 2024, 2034, 2044, 2054, 2064,
-
-     2074, 2084, 2094, 2104, 2113, 2122, 2131, 2140, 2151, 2162,
-     2175, 2188, 2201, 2210, 2219, 2228, 2237, 2246, 2255, 2264,
-     2273, 2285, 2294, 2395, 2411, 2460, 2468, 2483, 2484, 2485,
-     2486, 2487, 2488, 2490, 2508, 2521, 2526, 2530, 2532, 2534,
-     2536
+      685,  696,  707,  716,  725,  734,  745,  754,  763,  775,
+      787,  799,  811,  823,  835,  847,  858,  870,  879,  888,
+      897,  906,  918,  930,  942,  954,  964,  975,  984,  994,
+     1008, 1025, 1034, 1043, 1052, 1061, 1070, 1079, 1104, 1129,
+
+     1138, 1148, 1157, 1168, 1179, 1190, 1200, 1209, 1220, 1231,
+     1242, 1253, 1264, 1273, 1282, 1291, 1300, 1309, 1318, 1327,
+     1336, 1345, 1354, 1368, 1379, 1390, 1402, 1411, 1420, 1429,
+     1438, 1448, 1458, 1468, 1478, 1488, 1498, 1507, 1517, 1526,
+     1535, 1544, 1553, 1563, 1572, 1581, 1590, 1599, 1608, 1617,
+     1626, 1635, 1644, 1653, 1662, 1671, 1680, 1689, 1698, 1707,
+     1716, 1725, 1734, 1743, 1752, 1761, 1770, 1779, 1788, 1797,
+     1806, 1815, 1824, 1833, 1842, 1851, 1860, 1869, 1878, 1887,
+     1896, 1905, 1914, 1923, 1932, 1941, 1950, 1959, 1968, 1977,
+     1986, 1995, 2004, 2016, 2028, 2038, 2048, 2058, 2068, 2078,
+
+     2088, 2098, 2108, 2118, 2127, 2136, 2145, 2154, 2165, 2176,
+     2189, 2202, 2215, 2224, 2233, 2242, 2251, 2260, 2269, 2278,
+     2287, 2299, 2308, 2409, 2425, 2474, 2482, 2497, 2498, 2499,
+     2500, 2501, 2502, 2504, 2522, 2535, 2540, 2544, 2546, 2548,
+     2550
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -2235,7 +2235,7 @@ static const flex_int16_t yy_rule_linenum[242] =
 #define YY_RESTORE_YY_MORE_OFFSET
 char *yytext;
 #line 1 "dhcp4_lexer.ll"
-/* Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -3550,6 +3550,7 @@ YY_RULE_SETUP
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_SEND_UPDATES(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-send-updates", driver.loc_);
@@ -3558,12 +3559,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 774 "dhcp4_lexer.ll"
+#line 775 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_NO_UPDATE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-no-update", driver.loc_);
@@ -3572,12 +3574,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 785 "dhcp4_lexer.ll"
+#line 787 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_CLIENT_UPDATE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-client-update", driver.loc_);
@@ -3586,12 +3589,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 796 "dhcp4_lexer.ll"
+#line 799 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_REPLACE_CLIENT_NAME(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-replace-client-name", driver.loc_);
@@ -3600,12 +3604,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 807 "dhcp4_lexer.ll"
+#line 811 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_GENERATED_PREFIX(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-generated-prefix", driver.loc_);
@@ -3614,12 +3619,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 818 "dhcp4_lexer.ll"
+#line 823 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_QUALIFYING_SUFFIX(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-qualifying-suffix", driver.loc_);
@@ -3628,12 +3634,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 829 "dhcp4_lexer.ll"
+#line 835 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_UPDATE_ON_RENEW(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-update-on-renew", driver.loc_);
@@ -3642,7 +3649,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 840 "dhcp4_lexer.ll"
+#line 847 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3656,12 +3663,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 851 "dhcp4_lexer.ll"
+#line 858 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_CONFLICT_RESOLUTION_MODE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-conflict-resolution-mode", driver.loc_);
@@ -3670,7 +3678,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 862 "dhcp4_lexer.ll"
+#line 870 "dhcp4_lexer.ll"
 {
     if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) {
         return isc::dhcp::Dhcp4Parser::make_CHECK_WITH_DHCID(driver.loc_);
@@ -3682,7 +3690,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 871 "dhcp4_lexer.ll"
+#line 879 "dhcp4_lexer.ll"
 {
     if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) {
         return isc::dhcp::Dhcp4Parser::make_NO_CHECK_WITH_DHCID(driver.loc_);
@@ -3694,7 +3702,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 880 "dhcp4_lexer.ll"
+#line 888 "dhcp4_lexer.ll"
 {
     if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) {
         return isc::dhcp::Dhcp4Parser::make_CHECK_EXISTS_WITH_DHCID(driver.loc_);
@@ -3706,7 +3714,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 889 "dhcp4_lexer.ll"
+#line 897 "dhcp4_lexer.ll"
 {
     if (driver.ctx_ == isc::dhcp::Parser4Context::DDNS_CONFLICT_RESOLUTION_MODE) {
         return isc::dhcp::Dhcp4Parser::make_NO_CHECK_WITHOUT_DHCID(driver.loc_);
@@ -3718,12 +3726,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 898 "dhcp4_lexer.ll"
+#line 906 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_PERCENT(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-percent", driver.loc_);
@@ -3732,12 +3741,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 909 "dhcp4_lexer.ll"
+#line 918 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl", driver.loc_);
@@ -3746,12 +3756,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 920 "dhcp4_lexer.ll"
+#line 930 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MIN(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-min", driver.loc_);
@@ -3760,12 +3771,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 931 "dhcp4_lexer.ll"
+#line 942 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MAX(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-max", driver.loc_);
@@ -3774,7 +3786,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 942 "dhcp4_lexer.ll"
+#line 954 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3787,7 +3799,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 952 "dhcp4_lexer.ll"
+#line 964 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3801,7 +3813,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 963 "dhcp4_lexer.ll"
+#line 975 "dhcp4_lexer.ll"
 {
     switch (driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3813,7 +3825,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 972 "dhcp4_lexer.ll"
+#line 984 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3826,7 +3838,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 982 "dhcp4_lexer.ll"
+#line 994 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3843,7 +3855,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 996 "dhcp4_lexer.ll"
+#line 1008 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LEASE_DATABASE:
@@ -3863,7 +3875,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 92:
 YY_RULE_SETUP
-#line 1013 "dhcp4_lexer.ll"
+#line 1025 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DATA:
@@ -3875,7 +3887,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 1022 "dhcp4_lexer.ll"
+#line 1034 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DATA:
@@ -3887,7 +3899,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 1031 "dhcp4_lexer.ll"
+#line 1043 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DATA:
@@ -3899,7 +3911,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 1040 "dhcp4_lexer.ll"
+#line 1052 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -3911,7 +3923,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 1049 "dhcp4_lexer.ll"
+#line 1061 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::POOLS:
@@ -3923,7 +3935,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 1058 "dhcp4_lexer.ll"
+#line 1070 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::POOLS:
@@ -3935,7 +3947,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 1067 "dhcp4_lexer.ll"
+#line 1079 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3963,7 +3975,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 1092 "dhcp4_lexer.ll"
+#line 1104 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -3991,7 +4003,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 1117 "dhcp4_lexer.ll"
+#line 1129 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4003,7 +4015,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 1126 "dhcp4_lexer.ll"
+#line 1138 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4016,7 +4028,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 1136 "dhcp4_lexer.ll"
+#line 1148 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4028,7 +4040,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 1145 "dhcp4_lexer.ll"
+#line 1157 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4042,7 +4054,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 1156 "dhcp4_lexer.ll"
+#line 1168 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4056,7 +4068,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 1167 "dhcp4_lexer.ll"
+#line 1179 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4070,7 +4082,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 1178 "dhcp4_lexer.ll"
+#line 1190 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4083,7 +4095,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 1188 "dhcp4_lexer.ll"
+#line 1200 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4095,7 +4107,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 1197 "dhcp4_lexer.ll"
+#line 1209 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4109,7 +4121,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 1208 "dhcp4_lexer.ll"
+#line 1220 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4123,7 +4135,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 1219 "dhcp4_lexer.ll"
+#line 1231 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4137,7 +4149,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 1230 "dhcp4_lexer.ll"
+#line 1242 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4151,7 +4163,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 1241 "dhcp4_lexer.ll"
+#line 1253 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4165,7 +4177,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 1252 "dhcp4_lexer.ll"
+#line 1264 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4177,7 +4189,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 1261 "dhcp4_lexer.ll"
+#line 1273 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4189,7 +4201,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 1270 "dhcp4_lexer.ll"
+#line 1282 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4201,7 +4213,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 1279 "dhcp4_lexer.ll"
+#line 1291 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4213,7 +4225,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 1288 "dhcp4_lexer.ll"
+#line 1300 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4225,7 +4237,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 1297 "dhcp4_lexer.ll"
+#line 1309 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4237,7 +4249,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 1306 "dhcp4_lexer.ll"
+#line 1318 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4249,7 +4261,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 120:
 YY_RULE_SETUP
-#line 1315 "dhcp4_lexer.ll"
+#line 1327 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4261,7 +4273,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 1324 "dhcp4_lexer.ll"
+#line 1336 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OUTPUT_OPTIONS:
@@ -4273,7 +4285,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 1333 "dhcp4_lexer.ll"
+#line 1345 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LOGGERS:
@@ -4285,7 +4297,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 1342 "dhcp4_lexer.ll"
+#line 1354 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4302,7 +4314,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 1356 "dhcp4_lexer.ll"
+#line 1368 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4316,7 +4328,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 1367 "dhcp4_lexer.ll"
+#line 1379 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4330,7 +4342,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 1378 "dhcp4_lexer.ll"
+#line 1390 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4345,7 +4357,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 1390 "dhcp4_lexer.ll"
+#line 1402 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -4357,7 +4369,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 1399 "dhcp4_lexer.ll"
+#line 1411 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -4369,7 +4381,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 1408 "dhcp4_lexer.ll"
+#line 1420 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -4381,7 +4393,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 1417 "dhcp4_lexer.ll"
+#line 1429 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENT_CLASSES:
@@ -4393,7 +4405,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 131:
 YY_RULE_SETUP
-#line 1426 "dhcp4_lexer.ll"
+#line 1438 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4406,7 +4418,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 1436 "dhcp4_lexer.ll"
+#line 1448 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4419,7 +4431,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 1446 "dhcp4_lexer.ll"
+#line 1458 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4432,7 +4444,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 1456 "dhcp4_lexer.ll"
+#line 1468 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4445,7 +4457,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 1466 "dhcp4_lexer.ll"
+#line 1478 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4458,7 +4470,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 1476 "dhcp4_lexer.ll"
+#line 1488 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOST_RESERVATION_IDENTIFIERS:
@@ -4471,7 +4483,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 137:
 YY_RULE_SETUP
-#line 1486 "dhcp4_lexer.ll"
+#line 1498 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RESERVATIONS:
@@ -4483,7 +4495,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 138:
 YY_RULE_SETUP
-#line 1495 "dhcp4_lexer.ll"
+#line 1507 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4496,7 +4508,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 1505 "dhcp4_lexer.ll"
+#line 1517 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DATA:
@@ -4508,7 +4520,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 1514 "dhcp4_lexer.ll"
+#line 1526 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4520,7 +4532,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 1523 "dhcp4_lexer.ll"
+#line 1535 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4532,7 +4544,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 1532 "dhcp4_lexer.ll"
+#line 1544 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::OPTION_DEF:
@@ -4544,7 +4556,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 1541 "dhcp4_lexer.ll"
+#line 1553 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -4557,7 +4569,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 144:
 YY_RULE_SETUP
-#line 1551 "dhcp4_lexer.ll"
+#line 1563 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RESERVATIONS:
@@ -4569,7 +4581,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 1560 "dhcp4_lexer.ll"
+#line 1572 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::RELAY:
@@ -4581,7 +4593,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 146:
 YY_RULE_SETUP
-#line 1569 "dhcp4_lexer.ll"
+#line 1581 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4593,7 +4605,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 147:
 YY_RULE_SETUP
-#line 1578 "dhcp4_lexer.ll"
+#line 1590 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOOKS_LIBRARIES:
@@ -4605,7 +4617,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 148:
 YY_RULE_SETUP
-#line 1587 "dhcp4_lexer.ll"
+#line 1599 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HOOKS_LIBRARIES:
@@ -4617,7 +4629,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 149:
 YY_RULE_SETUP
-#line 1596 "dhcp4_lexer.ll"
+#line 1608 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4629,7 +4641,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 150:
 YY_RULE_SETUP
-#line 1605 "dhcp4_lexer.ll"
+#line 1617 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4641,7 +4653,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 151:
 YY_RULE_SETUP
-#line 1614 "dhcp4_lexer.ll"
+#line 1626 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4653,7 +4665,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 152:
 YY_RULE_SETUP
-#line 1623 "dhcp4_lexer.ll"
+#line 1635 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4665,7 +4677,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 153:
 YY_RULE_SETUP
-#line 1632 "dhcp4_lexer.ll"
+#line 1644 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4677,7 +4689,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 154:
 YY_RULE_SETUP
-#line 1641 "dhcp4_lexer.ll"
+#line 1653 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4689,7 +4701,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 155:
 YY_RULE_SETUP
-#line 1650 "dhcp4_lexer.ll"
+#line 1662 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::EXPIRED_LEASES_PROCESSING:
@@ -4701,7 +4713,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 156:
 YY_RULE_SETUP
-#line 1659 "dhcp4_lexer.ll"
+#line 1671 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4713,7 +4725,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 157:
 YY_RULE_SETUP
-#line 1668 "dhcp4_lexer.ll"
+#line 1680 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4725,7 +4737,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 158:
 YY_RULE_SETUP
-#line 1677 "dhcp4_lexer.ll"
+#line 1689 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
@@ -4737,7 +4749,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 159:
 YY_RULE_SETUP
-#line 1686 "dhcp4_lexer.ll"
+#line 1698 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
@@ -4749,7 +4761,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 160:
 YY_RULE_SETUP
-#line 1695 "dhcp4_lexer.ll"
+#line 1707 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_MULTI_THREADING:
@@ -4761,7 +4773,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 161:
 YY_RULE_SETUP
-#line 1704 "dhcp4_lexer.ll"
+#line 1716 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4773,7 +4785,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 162:
 YY_RULE_SETUP
-#line 1713 "dhcp4_lexer.ll"
+#line 1725 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -4785,7 +4797,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 163:
 YY_RULE_SETUP
-#line 1722 "dhcp4_lexer.ll"
+#line 1734 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4797,7 +4809,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 164:
 YY_RULE_SETUP
-#line 1731 "dhcp4_lexer.ll"
+#line 1743 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE:
@@ -4809,7 +4821,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 165:
 YY_RULE_SETUP
-#line 1740 "dhcp4_lexer.ll"
+#line 1752 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE:
@@ -4821,7 +4833,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 166:
 YY_RULE_SETUP
-#line 1749 "dhcp4_lexer.ll"
+#line 1761 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET_TYPE:
@@ -4833,7 +4845,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 167:
 YY_RULE_SETUP
-#line 1758 "dhcp4_lexer.ll"
+#line 1770 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4845,7 +4857,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 168:
 YY_RULE_SETUP
-#line 1767 "dhcp4_lexer.ll"
+#line 1779 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4857,7 +4869,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 169:
 YY_RULE_SETUP
-#line 1776 "dhcp4_lexer.ll"
+#line 1788 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4869,7 +4881,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 170:
 YY_RULE_SETUP
-#line 1785 "dhcp4_lexer.ll"
+#line 1797 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4881,7 +4893,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 171:
 YY_RULE_SETUP
-#line 1794 "dhcp4_lexer.ll"
+#line 1806 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTH_TYPE:
@@ -4893,7 +4905,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 172:
 YY_RULE_SETUP
-#line 1803 "dhcp4_lexer.ll"
+#line 1815 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTHENTICATION:
@@ -4905,7 +4917,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 1812 "dhcp4_lexer.ll"
+#line 1824 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTHENTICATION:
@@ -4917,7 +4929,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 174:
 YY_RULE_SETUP
-#line 1821 "dhcp4_lexer.ll"
+#line 1833 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::AUTHENTICATION:
@@ -4929,7 +4941,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 175:
 YY_RULE_SETUP
-#line 1830 "dhcp4_lexer.ll"
+#line 1842 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENTS:
@@ -4941,7 +4953,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 176:
 YY_RULE_SETUP
-#line 1839 "dhcp4_lexer.ll"
+#line 1851 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CLIENTS:
@@ -4953,7 +4965,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 177:
 YY_RULE_SETUP
-#line 1848 "dhcp4_lexer.ll"
+#line 1860 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4965,7 +4977,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 178:
 YY_RULE_SETUP
-#line 1857 "dhcp4_lexer.ll"
+#line 1869 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::CONTROL_SOCKET:
@@ -4977,7 +4989,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 179:
 YY_RULE_SETUP
-#line 1866 "dhcp4_lexer.ll"
+#line 1878 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::HTTP_HEADERS:
@@ -4989,7 +5001,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 180:
 YY_RULE_SETUP
-#line 1875 "dhcp4_lexer.ll"
+#line 1887 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5001,7 +5013,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 181:
 YY_RULE_SETUP
-#line 1884 "dhcp4_lexer.ll"
+#line 1896 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
@@ -5013,7 +5025,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 182:
 YY_RULE_SETUP
-#line 1893 "dhcp4_lexer.ll"
+#line 1905 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
@@ -5025,7 +5037,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 183:
 YY_RULE_SETUP
-#line 1902 "dhcp4_lexer.ll"
+#line 1914 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_QUEUE_CONTROL:
@@ -5037,7 +5049,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 184:
 YY_RULE_SETUP
-#line 1911 "dhcp4_lexer.ll"
+#line 1923 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5049,7 +5061,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 185:
 YY_RULE_SETUP
-#line 1920 "dhcp4_lexer.ll"
+#line 1932 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5061,7 +5073,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 186:
 YY_RULE_SETUP
-#line 1929 "dhcp4_lexer.ll"
+#line 1941 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5073,7 +5085,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 187:
 YY_RULE_SETUP
-#line 1938 "dhcp4_lexer.ll"
+#line 1950 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5085,7 +5097,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 188:
 YY_RULE_SETUP
-#line 1947 "dhcp4_lexer.ll"
+#line 1959 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5097,7 +5109,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 189:
 YY_RULE_SETUP
-#line 1956 "dhcp4_lexer.ll"
+#line 1968 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5109,7 +5121,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 190:
 YY_RULE_SETUP
-#line 1965 "dhcp4_lexer.ll"
+#line 1977 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5121,7 +5133,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 191:
 YY_RULE_SETUP
-#line 1974 "dhcp4_lexer.ll"
+#line 1986 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5133,7 +5145,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 192:
 YY_RULE_SETUP
-#line 1983 "dhcp4_lexer.ll"
+#line 1995 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP_DDNS:
@@ -5145,12 +5157,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 193:
 YY_RULE_SETUP
-#line 1992 "dhcp4_lexer.ll"
+#line 2004 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_SET(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-set", driver.loc_);
@@ -5159,12 +5172,13 @@ YY_RULE_SETUP
        YY_BREAK
 case 194:
 YY_RULE_SETUP
-#line 2003 "dhcp4_lexer.ll"
+#line 2016 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_REPLACEMENT(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-replacement", driver.loc_);
@@ -5173,7 +5187,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 195:
 YY_RULE_SETUP
-#line 2014 "dhcp4_lexer.ll"
+#line 2028 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) {
@@ -5186,7 +5200,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 196:
 YY_RULE_SETUP
-#line 2024 "dhcp4_lexer.ll"
+#line 2038 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_PROTOCOL) {
@@ -5199,7 +5213,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 197:
 YY_RULE_SETUP
-#line 2034 "dhcp4_lexer.ll"
+#line 2048 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::NCR_FORMAT) {
@@ -5212,7 +5226,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 198:
 YY_RULE_SETUP
-#line 2044 "dhcp4_lexer.ll"
+#line 2058 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5225,7 +5239,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 199:
 YY_RULE_SETUP
-#line 2054 "dhcp4_lexer.ll"
+#line 2068 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5238,7 +5252,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 200:
 YY_RULE_SETUP
-#line 2064 "dhcp4_lexer.ll"
+#line 2078 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5251,7 +5265,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 201:
 YY_RULE_SETUP
-#line 2074 "dhcp4_lexer.ll"
+#line 2088 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5264,7 +5278,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 202:
 YY_RULE_SETUP
-#line 2084 "dhcp4_lexer.ll"
+#line 2098 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5277,7 +5291,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 203:
 YY_RULE_SETUP
-#line 2094 "dhcp4_lexer.ll"
+#line 2108 "dhcp4_lexer.ll"
 {
     /* dhcp-ddns value keywords are case insensitive */
     if (driver.ctx_ == isc::dhcp::Parser4Context::REPLACE_CLIENT_NAME) {
@@ -5290,7 +5304,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 204:
 YY_RULE_SETUP
-#line 2104 "dhcp4_lexer.ll"
+#line 2118 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -5302,7 +5316,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 205:
 YY_RULE_SETUP
-#line 2113 "dhcp4_lexer.ll"
+#line 2127 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -5314,7 +5328,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 206:
 YY_RULE_SETUP
-#line 2122 "dhcp4_lexer.ll"
+#line 2136 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:
@@ -5326,7 +5340,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 207:
 YY_RULE_SETUP
-#line 2131 "dhcp4_lexer.ll"
+#line 2145 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5338,7 +5352,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 208:
 YY_RULE_SETUP
-#line 2140 "dhcp4_lexer.ll"
+#line 2154 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5352,7 +5366,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 209:
 YY_RULE_SETUP
-#line 2151 "dhcp4_lexer.ll"
+#line 2165 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5366,7 +5380,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 210:
 YY_RULE_SETUP
-#line 2162 "dhcp4_lexer.ll"
+#line 2176 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5382,7 +5396,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 211:
 YY_RULE_SETUP
-#line 2175 "dhcp4_lexer.ll"
+#line 2189 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5398,7 +5412,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 212:
 YY_RULE_SETUP
-#line 2188 "dhcp4_lexer.ll"
+#line 2202 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5414,7 +5428,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 213:
 YY_RULE_SETUP
-#line 2201 "dhcp4_lexer.ll"
+#line 2215 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5426,7 +5440,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 214:
 YY_RULE_SETUP
-#line 2210 "dhcp4_lexer.ll"
+#line 2224 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5438,7 +5452,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 215:
 YY_RULE_SETUP
-#line 2219 "dhcp4_lexer.ll"
+#line 2233 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5450,7 +5464,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 216:
 YY_RULE_SETUP
-#line 2228 "dhcp4_lexer.ll"
+#line 2242 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5462,7 +5476,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 217:
 YY_RULE_SETUP
-#line 2237 "dhcp4_lexer.ll"
+#line 2251 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5474,7 +5488,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 218:
 YY_RULE_SETUP
-#line 2246 "dhcp4_lexer.ll"
+#line 2260 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5486,7 +5500,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 219:
 YY_RULE_SETUP
-#line 2255 "dhcp4_lexer.ll"
+#line 2269 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5498,7 +5512,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 220:
 YY_RULE_SETUP
-#line 2264 "dhcp4_lexer.ll"
+#line 2278 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::COMPATIBILITY:
@@ -5510,7 +5524,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 221:
 YY_RULE_SETUP
-#line 2273 "dhcp4_lexer.ll"
+#line 2287 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5525,7 +5539,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 222:
 YY_RULE_SETUP
-#line 2285 "dhcp4_lexer.ll"
+#line 2299 "dhcp4_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
@@ -5537,7 +5551,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 223:
 YY_RULE_SETUP
-#line 2294 "dhcp4_lexer.ll"
+#line 2308 "dhcp4_lexer.ll"
 {
     /* A string has been matched. It contains the actual string and single quotes.
        We need to get those quotes out of the way and just use its content, e.g.
@@ -5642,7 +5656,7 @@ YY_RULE_SETUP
 case 224:
 /* rule 224 can match eol */
 YY_RULE_SETUP
-#line 2395 "dhcp4_lexer.ll"
+#line 2409 "dhcp4_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     std::string raw(yytext+1);
@@ -5662,7 +5676,7 @@ YY_RULE_SETUP
 case 225:
 /* rule 225 can match eol */
 YY_RULE_SETUP
-#line 2411 "dhcp4_lexer.ll"
+#line 2425 "dhcp4_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     std::string raw(yytext+1);
@@ -5714,7 +5728,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 226:
 YY_RULE_SETUP
-#line 2460 "dhcp4_lexer.ll"
+#line 2474 "dhcp4_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     std::string raw(yytext+1);
@@ -5725,7 +5739,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 227:
 YY_RULE_SETUP
-#line 2468 "dhcp4_lexer.ll"
+#line 2482 "dhcp4_lexer.ll"
 {
     /* Bad string with an open unicode escape at the end */
     std::string raw(yytext+1);
@@ -5743,37 +5757,37 @@ YY_RULE_SETUP
        YY_BREAK
 case 228:
 YY_RULE_SETUP
-#line 2483 "dhcp4_lexer.ll"
+#line 2497 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
 case 229:
 YY_RULE_SETUP
-#line 2484 "dhcp4_lexer.ll"
+#line 2498 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
 case 230:
 YY_RULE_SETUP
-#line 2485 "dhcp4_lexer.ll"
+#line 2499 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
 case 231:
 YY_RULE_SETUP
-#line 2486 "dhcp4_lexer.ll"
+#line 2500 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
 case 232:
 YY_RULE_SETUP
-#line 2487 "dhcp4_lexer.ll"
+#line 2501 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_COMMA(driver.loc_); }
        YY_BREAK
 case 233:
 YY_RULE_SETUP
-#line 2488 "dhcp4_lexer.ll"
+#line 2502 "dhcp4_lexer.ll"
 { return isc::dhcp::Dhcp4Parser::make_COLON(driver.loc_); }
        YY_BREAK
 case 234:
 YY_RULE_SETUP
-#line 2490 "dhcp4_lexer.ll"
+#line 2504 "dhcp4_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -5794,7 +5808,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 235:
 YY_RULE_SETUP
-#line 2508 "dhcp4_lexer.ll"
+#line 2522 "dhcp4_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -5810,7 +5824,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 236:
 YY_RULE_SETUP
-#line 2521 "dhcp4_lexer.ll"
+#line 2535 "dhcp4_lexer.ll"
 {
     string tmp(yytext);
     return isc::dhcp::Dhcp4Parser::make_BOOLEAN(tmp == "true", driver.loc_);
@@ -5818,33 +5832,33 @@ YY_RULE_SETUP
        YY_BREAK
 case 237:
 YY_RULE_SETUP
-#line 2526 "dhcp4_lexer.ll"
+#line 2540 "dhcp4_lexer.ll"
 {
    return isc::dhcp::Dhcp4Parser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
 case 238:
 YY_RULE_SETUP
-#line 2530 "dhcp4_lexer.ll"
+#line 2544 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
 case 239:
 YY_RULE_SETUP
-#line 2532 "dhcp4_lexer.ll"
+#line 2546 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
 case 240:
 YY_RULE_SETUP
-#line 2534 "dhcp4_lexer.ll"
+#line 2548 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
 case 241:
 YY_RULE_SETUP
-#line 2536 "dhcp4_lexer.ll"
+#line 2550 "dhcp4_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 2538 "dhcp4_lexer.ll"
+#line 2552 "dhcp4_lexer.ll"
 {
     if (driver.states_.empty()) {
         return isc::dhcp::Dhcp4Parser::make_END(driver.loc_);
@@ -5870,10 +5884,10 @@ case YY_STATE_EOF(INITIAL):
        YY_BREAK
 case 242:
 YY_RULE_SETUP
-#line 2561 "dhcp4_lexer.ll"
+#line 2575 "dhcp4_lexer.ll"
 ECHO;
        YY_BREAK
-#line 5877 "dhcp4_lexer.cc"
+#line 5891 "dhcp4_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -6978,7 +6992,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 2561 "dhcp4_lexer.ll"
+#line 2575 "dhcp4_lexer.ll"
 
 
 using namespace isc::dhcp;
index 61733949897f78d1970a767932a0b33c7b80fce6..e07adae61f6812f2933463c710d7a77138ffe4ca 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -764,6 +764,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_SEND_UPDATES(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-send-updates", driver.loc_);
@@ -775,6 +776,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_NO_UPDATE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-no-update", driver.loc_);
@@ -786,6 +788,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_OVERRIDE_CLIENT_UPDATE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-override-client-update", driver.loc_);
@@ -797,6 +800,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_REPLACE_CLIENT_NAME(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-replace-client-name", driver.loc_);
@@ -808,6 +812,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_GENERATED_PREFIX(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-generated-prefix", driver.loc_);
@@ -819,6 +824,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_QUALIFYING_SUFFIX(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-qualifying-suffix", driver.loc_);
@@ -830,6 +836,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_UPDATE_ON_RENEW(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-update-on-renew", driver.loc_);
@@ -852,6 +859,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_CONFLICT_RESOLUTION_MODE(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-conflict-resolution-mode", driver.loc_);
@@ -899,6 +907,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_PERCENT(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-percent", driver.loc_);
@@ -910,6 +919,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl", driver.loc_);
@@ -921,6 +931,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MIN(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-min", driver.loc_);
@@ -932,6 +943,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_DDNS_TTL_MAX(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("ddns-ttl-max", driver.loc_);
@@ -1993,6 +2005,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_SET(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-set", driver.loc_);
@@ -2004,6 +2017,7 @@ ControlCharacterFill            [^"\\]|\\["\\/bfnrtu]
     case isc::dhcp::Parser4Context::DHCP4:
     case isc::dhcp::Parser4Context::SUBNET4:
     case isc::dhcp::Parser4Context::SHARED_NETWORK:
+    case isc::dhcp::Parser4Context::POOLS:
         return isc::dhcp::Dhcp4Parser::make_HOSTNAME_CHAR_REPLACEMENT(driver.loc_);
     default:
         return isc::dhcp::Dhcp4Parser::make_STRING("hostname-char-replacement", driver.loc_);
index 62a38af100f2024f16c31d6175b93b73e79c59c6..ab3f3063fb165b03afc13a8ba08a75a104beb119 100644 (file)
@@ -3493,8 +3493,8 @@ namespace isc { namespace dhcp {
 #line 3494 "dhcp4_parser.cc"
     break;
 
-  case 633: // $@88: %empty
-#line 2218 "dhcp4_parser.yy"
+  case 647: // $@88: %empty
+#line 2232 "dhcp4_parser.yy"
                  {
     ctx.unique("pool", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3502,8 +3502,8 @@ namespace isc { namespace dhcp {
 #line 3503 "dhcp4_parser.cc"
     break;
 
-  case 634: // pool_entry: "pool" $@88 ":" "constant string"
-#line 2221 "dhcp4_parser.yy"
+  case 648: // pool_entry: "pool" $@88 ":" "constant string"
+#line 2235 "dhcp4_parser.yy"
                {
     ElementPtr pool(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pool", pool);
@@ -3512,8 +3512,8 @@ namespace isc { namespace dhcp {
 #line 3513 "dhcp4_parser.cc"
     break;
 
-  case 635: // pool_id: "pool-id" ":" "integer"
-#line 2227 "dhcp4_parser.yy"
+  case 649: // pool_id: "pool-id" ":" "integer"
+#line 2241 "dhcp4_parser.yy"
                                {
     ctx.unique("pool-id", ctx.loc2pos(yystack_[2].location));
     ElementPtr id(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -3522,16 +3522,16 @@ namespace isc { namespace dhcp {
 #line 3523 "dhcp4_parser.cc"
     break;
 
-  case 636: // $@89: %empty
-#line 2233 "dhcp4_parser.yy"
+  case 650: // $@89: %empty
+#line 2247 "dhcp4_parser.yy"
                            {
     ctx.enter(ctx.NO_KEYWORD);
 }
 #line 3531 "dhcp4_parser.cc"
     break;
 
-  case 637: // user_context: "user-context" $@89 ":" map_value
-#line 2235 "dhcp4_parser.yy"
+  case 651: // user_context: "user-context" $@89 ":" map_value
+#line 2249 "dhcp4_parser.yy"
                   {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context = yystack_[0].value.as < ElementPtr > ();
@@ -3557,16 +3557,16 @@ namespace isc { namespace dhcp {
 #line 3558 "dhcp4_parser.cc"
     break;
 
-  case 638: // $@90: %empty
-#line 2258 "dhcp4_parser.yy"
+  case 652: // $@90: %empty
+#line 2272 "dhcp4_parser.yy"
                  {
     ctx.enter(ctx.NO_KEYWORD);
 }
 #line 3566 "dhcp4_parser.cc"
     break;
 
-  case 639: // comment: "comment" $@90 ":" "constant string"
-#line 2260 "dhcp4_parser.yy"
+  case 653: // comment: "comment" $@90 ":" "constant string"
+#line 2274 "dhcp4_parser.yy"
                {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
@@ -3594,8 +3594,8 @@ namespace isc { namespace dhcp {
 #line 3595 "dhcp4_parser.cc"
     break;
 
-  case 640: // $@91: %empty
-#line 2288 "dhcp4_parser.yy"
+  case 654: // $@91: %empty
+#line 2302 "dhcp4_parser.yy"
                            {
     ctx.unique("reservations", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -3606,8 +3606,8 @@ namespace isc { namespace dhcp {
 #line 3607 "dhcp4_parser.cc"
     break;
 
-  case 641: // reservations: "reservations" $@91 ":" "[" reservations_list "]"
-#line 2294 "dhcp4_parser.yy"
+  case 655: // reservations: "reservations" $@91 ":" "[" reservations_list "]"
+#line 2308 "dhcp4_parser.yy"
                                                           {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -3615,16 +3615,16 @@ namespace isc { namespace dhcp {
 #line 3616 "dhcp4_parser.cc"
     break;
 
-  case 646: // not_empty_reservations_list: not_empty_reservations_list ","
-#line 2305 "dhcp4_parser.yy"
+  case 660: // not_empty_reservations_list: not_empty_reservations_list ","
+#line 2319 "dhcp4_parser.yy"
                                                                {
                                ctx.warnAboutExtraCommas(yystack_[0].location);
                                }
 #line 3624 "dhcp4_parser.cc"
     break;
 
-  case 647: // $@92: %empty
-#line 2310 "dhcp4_parser.yy"
+  case 661: // $@92: %empty
+#line 2324 "dhcp4_parser.yy"
                             {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
@@ -3633,8 +3633,8 @@ namespace isc { namespace dhcp {
 #line 3634 "dhcp4_parser.cc"
     break;
 
-  case 648: // reservation: "{" $@92 reservation_params "}"
-#line 2314 "dhcp4_parser.yy"
+  case 662: // reservation: "{" $@92 reservation_params "}"
+#line 2328 "dhcp4_parser.yy"
                                     {
     /// @todo: an identifier parameter is required.
     ctx.stack_.pop_back();
@@ -3642,8 +3642,8 @@ namespace isc { namespace dhcp {
 #line 3643 "dhcp4_parser.cc"
     break;
 
-  case 649: // $@93: %empty
-#line 2319 "dhcp4_parser.yy"
+  case 663: // $@93: %empty
+#line 2333 "dhcp4_parser.yy"
                                 {
     // Parse the reservations list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -3652,8 +3652,8 @@ namespace isc { namespace dhcp {
 #line 3653 "dhcp4_parser.cc"
     break;
 
-  case 650: // sub_reservation: "{" $@93 reservation_params "}"
-#line 2323 "dhcp4_parser.yy"
+  case 664: // sub_reservation: "{" $@93 reservation_params "}"
+#line 2337 "dhcp4_parser.yy"
                                     {
     /// @todo: an identifier parameter is required.
     // parsing completed
@@ -3661,16 +3661,16 @@ namespace isc { namespace dhcp {
 #line 3662 "dhcp4_parser.cc"
     break;
 
-  case 655: // not_empty_reservation_params: not_empty_reservation_params ","
-#line 2334 "dhcp4_parser.yy"
+  case 669: // not_empty_reservation_params: not_empty_reservation_params ","
+#line 2348 "dhcp4_parser.yy"
                                          {
         ctx.warnAboutExtraCommas(yystack_[0].location);
         }
 #line 3670 "dhcp4_parser.cc"
     break;
 
-  case 671: // $@94: %empty
-#line 2357 "dhcp4_parser.yy"
+  case 685: // $@94: %empty
+#line 2371 "dhcp4_parser.yy"
                          {
     ctx.unique("next-server", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3678,8 +3678,8 @@ namespace isc { namespace dhcp {
 #line 3679 "dhcp4_parser.cc"
     break;
 
-  case 672: // next_server: "next-server" $@94 ":" "constant string"
-#line 2360 "dhcp4_parser.yy"
+  case 686: // next_server: "next-server" $@94 ":" "constant string"
+#line 2374 "dhcp4_parser.yy"
                {
     ElementPtr next_server(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("next-server", next_server);
@@ -3688,8 +3688,8 @@ namespace isc { namespace dhcp {
 #line 3689 "dhcp4_parser.cc"
     break;
 
-  case 673: // $@95: %empty
-#line 2366 "dhcp4_parser.yy"
+  case 687: // $@95: %empty
+#line 2380 "dhcp4_parser.yy"
                                  {
     ctx.unique("server-hostname", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3697,8 +3697,8 @@ namespace isc { namespace dhcp {
 #line 3698 "dhcp4_parser.cc"
     break;
 
-  case 674: // server_hostname: "server-hostname" $@95 ":" "constant string"
-#line 2369 "dhcp4_parser.yy"
+  case 688: // server_hostname: "server-hostname" $@95 ":" "constant string"
+#line 2383 "dhcp4_parser.yy"
                {
     ElementPtr srv(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-hostname", srv);
@@ -3707,8 +3707,8 @@ namespace isc { namespace dhcp {
 #line 3708 "dhcp4_parser.cc"
     break;
 
-  case 675: // $@96: %empty
-#line 2375 "dhcp4_parser.yy"
+  case 689: // $@96: %empty
+#line 2389 "dhcp4_parser.yy"
                                {
     ctx.unique("boot-file-name", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3716,8 +3716,8 @@ namespace isc { namespace dhcp {
 #line 3717 "dhcp4_parser.cc"
     break;
 
-  case 676: // boot_file_name: "boot-file-name" $@96 ":" "constant string"
-#line 2378 "dhcp4_parser.yy"
+  case 690: // boot_file_name: "boot-file-name" $@96 ":" "constant string"
+#line 2392 "dhcp4_parser.yy"
                {
     ElementPtr bootfile(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("boot-file-name", bootfile);
@@ -3726,8 +3726,8 @@ namespace isc { namespace dhcp {
 #line 3727 "dhcp4_parser.cc"
     break;
 
-  case 677: // $@97: %empty
-#line 2384 "dhcp4_parser.yy"
+  case 691: // $@97: %empty
+#line 2398 "dhcp4_parser.yy"
                        {
     ctx.unique("ip-address", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3735,8 +3735,8 @@ namespace isc { namespace dhcp {
 #line 3736 "dhcp4_parser.cc"
     break;
 
-  case 678: // ip_address: "ip-address" $@97 ":" "constant string"
-#line 2387 "dhcp4_parser.yy"
+  case 692: // ip_address: "ip-address" $@97 ":" "constant string"
+#line 2401 "dhcp4_parser.yy"
                {
     ElementPtr addr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", addr);
@@ -3745,8 +3745,8 @@ namespace isc { namespace dhcp {
 #line 3746 "dhcp4_parser.cc"
     break;
 
-  case 679: // $@98: %empty
-#line 2393 "dhcp4_parser.yy"
+  case 693: // $@98: %empty
+#line 2407 "dhcp4_parser.yy"
            {
     ctx.unique("duid", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3754,8 +3754,8 @@ namespace isc { namespace dhcp {
 #line 3755 "dhcp4_parser.cc"
     break;
 
-  case 680: // duid: "duid" $@98 ":" "constant string"
-#line 2396 "dhcp4_parser.yy"
+  case 694: // duid: "duid" $@98 ":" "constant string"
+#line 2410 "dhcp4_parser.yy"
                {
     ElementPtr d(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("duid", d);
@@ -3764,8 +3764,8 @@ namespace isc { namespace dhcp {
 #line 3765 "dhcp4_parser.cc"
     break;
 
-  case 681: // $@99: %empty
-#line 2402 "dhcp4_parser.yy"
+  case 695: // $@99: %empty
+#line 2416 "dhcp4_parser.yy"
                        {
     ctx.unique("hw-address", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3773,8 +3773,8 @@ namespace isc { namespace dhcp {
 #line 3774 "dhcp4_parser.cc"
     break;
 
-  case 682: // hw_address: "hw-address" $@99 ":" "constant string"
-#line 2405 "dhcp4_parser.yy"
+  case 696: // hw_address: "hw-address" $@99 ":" "constant string"
+#line 2419 "dhcp4_parser.yy"
                {
     ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hw-address", hw);
@@ -3783,8 +3783,8 @@ namespace isc { namespace dhcp {
 #line 3784 "dhcp4_parser.cc"
     break;
 
-  case 683: // $@100: %empty
-#line 2411 "dhcp4_parser.yy"
+  case 697: // $@100: %empty
+#line 2425 "dhcp4_parser.yy"
                            {
     ctx.unique("client-id", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3792,8 +3792,8 @@ namespace isc { namespace dhcp {
 #line 3793 "dhcp4_parser.cc"
     break;
 
-  case 684: // client_id_value: "client-id" $@100 ":" "constant string"
-#line 2414 "dhcp4_parser.yy"
+  case 698: // client_id_value: "client-id" $@100 ":" "constant string"
+#line 2428 "dhcp4_parser.yy"
                {
     ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-id", hw);
@@ -3802,8 +3802,8 @@ namespace isc { namespace dhcp {
 #line 3803 "dhcp4_parser.cc"
     break;
 
-  case 685: // $@101: %empty
-#line 2420 "dhcp4_parser.yy"
+  case 699: // $@101: %empty
+#line 2434 "dhcp4_parser.yy"
                              {
     ctx.unique("circuit-id", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3811,8 +3811,8 @@ namespace isc { namespace dhcp {
 #line 3812 "dhcp4_parser.cc"
     break;
 
-  case 686: // circuit_id_value: "circuit-id" $@101 ":" "constant string"
-#line 2423 "dhcp4_parser.yy"
+  case 700: // circuit_id_value: "circuit-id" $@101 ":" "constant string"
+#line 2437 "dhcp4_parser.yy"
                {
     ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("circuit-id", hw);
@@ -3821,8 +3821,8 @@ namespace isc { namespace dhcp {
 #line 3822 "dhcp4_parser.cc"
     break;
 
-  case 687: // $@102: %empty
-#line 2429 "dhcp4_parser.yy"
+  case 701: // $@102: %empty
+#line 2443 "dhcp4_parser.yy"
                        {
     ctx.unique("flex-id", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3830,8 +3830,8 @@ namespace isc { namespace dhcp {
 #line 3831 "dhcp4_parser.cc"
     break;
 
-  case 688: // flex_id_value: "flex-id" $@102 ":" "constant string"
-#line 2432 "dhcp4_parser.yy"
+  case 702: // flex_id_value: "flex-id" $@102 ":" "constant string"
+#line 2446 "dhcp4_parser.yy"
                {
     ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flex-id", hw);
@@ -3840,8 +3840,8 @@ namespace isc { namespace dhcp {
 #line 3841 "dhcp4_parser.cc"
     break;
 
-  case 689: // $@103: %empty
-#line 2438 "dhcp4_parser.yy"
+  case 703: // $@103: %empty
+#line 2452 "dhcp4_parser.yy"
                    {
     ctx.unique("hostname", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3849,8 +3849,8 @@ namespace isc { namespace dhcp {
 #line 3850 "dhcp4_parser.cc"
     break;
 
-  case 690: // hostname: "hostname" $@103 ":" "constant string"
-#line 2441 "dhcp4_parser.yy"
+  case 704: // hostname: "hostname" $@103 ":" "constant string"
+#line 2455 "dhcp4_parser.yy"
                {
     ElementPtr host(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname", host);
@@ -3859,8 +3859,8 @@ namespace isc { namespace dhcp {
 #line 3860 "dhcp4_parser.cc"
     break;
 
-  case 691: // $@104: %empty
-#line 2447 "dhcp4_parser.yy"
+  case 705: // $@104: %empty
+#line 2461 "dhcp4_parser.yy"
                                            {
     ctx.unique("client-classes", ctx.loc2pos(yystack_[0].location));
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -3871,8 +3871,8 @@ namespace isc { namespace dhcp {
 #line 3872 "dhcp4_parser.cc"
     break;
 
-  case 692: // reservation_client_classes: "client-classes" $@104 ":" list_strings
-#line 2453 "dhcp4_parser.yy"
+  case 706: // reservation_client_classes: "client-classes" $@104 ":" list_strings
+#line 2467 "dhcp4_parser.yy"
                      {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -3880,8 +3880,8 @@ namespace isc { namespace dhcp {
 #line 3881 "dhcp4_parser.cc"
     break;
 
-  case 693: // $@105: %empty
-#line 2461 "dhcp4_parser.yy"
+  case 707: // $@105: %empty
+#line 2475 "dhcp4_parser.yy"
              {
     ctx.unique("relay", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -3892,8 +3892,8 @@ namespace isc { namespace dhcp {
 #line 3893 "dhcp4_parser.cc"
     break;
 
-  case 694: // relay: "relay" $@105 ":" "{" relay_map "}"
-#line 2467 "dhcp4_parser.yy"
+  case 708: // relay: "relay" $@105 ":" "{" relay_map "}"
+#line 2481 "dhcp4_parser.yy"
                                                 {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -3901,8 +3901,8 @@ namespace isc { namespace dhcp {
 #line 3902 "dhcp4_parser.cc"
     break;
 
-  case 696: // $@106: %empty
-#line 2475 "dhcp4_parser.yy"
+  case 710: // $@106: %empty
+#line 2489 "dhcp4_parser.yy"
                            {
     ctx.unique("ip-addresses", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -3913,8 +3913,8 @@ namespace isc { namespace dhcp {
 #line 3914 "dhcp4_parser.cc"
     break;
 
-  case 697: // ip_addresses: "ip-addresses" $@106 ":" list_strings
-#line 2481 "dhcp4_parser.yy"
+  case 711: // ip_addresses: "ip-addresses" $@106 ":" list_strings
+#line 2495 "dhcp4_parser.yy"
                      {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -3922,8 +3922,8 @@ namespace isc { namespace dhcp {
 #line 3923 "dhcp4_parser.cc"
     break;
 
-  case 698: // $@107: %empty
-#line 2489 "dhcp4_parser.yy"
+  case 712: // $@107: %empty
+#line 2503 "dhcp4_parser.yy"
                                {
     ctx.unique("client-classes", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -3934,8 +3934,8 @@ namespace isc { namespace dhcp {
 #line 3935 "dhcp4_parser.cc"
     break;
 
-  case 699: // client_classes: "client-classes" $@107 ":" "[" client_classes_list "]"
-#line 2495 "dhcp4_parser.yy"
+  case 713: // client_classes: "client-classes" $@107 ":" "[" client_classes_list "]"
+#line 2509 "dhcp4_parser.yy"
                                                             {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -3943,16 +3943,16 @@ namespace isc { namespace dhcp {
 #line 3944 "dhcp4_parser.cc"
     break;
 
-  case 702: // client_classes_list: client_classes_list ","
-#line 2502 "dhcp4_parser.yy"
+  case 716: // client_classes_list: client_classes_list ","
+#line 2516 "dhcp4_parser.yy"
                                                {
                        ctx.warnAboutExtraCommas(yystack_[0].location);
                        }
 #line 3952 "dhcp4_parser.cc"
     break;
 
-  case 703: // $@108: %empty
-#line 2507 "dhcp4_parser.yy"
+  case 717: // $@108: %empty
+#line 2521 "dhcp4_parser.yy"
                                    {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
@@ -3961,8 +3961,8 @@ namespace isc { namespace dhcp {
 #line 3962 "dhcp4_parser.cc"
     break;
 
-  case 704: // client_class_entry: "{" $@108 client_class_params "}"
-#line 2511 "dhcp4_parser.yy"
+  case 718: // client_class_entry: "{" $@108 client_class_params "}"
+#line 2525 "dhcp4_parser.yy"
                                      {
     // The name client class parameter is required.
     ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -3971,16 +3971,16 @@ namespace isc { namespace dhcp {
 #line 3972 "dhcp4_parser.cc"
     break;
 
-  case 709: // not_empty_client_class_params: not_empty_client_class_params ","
-#line 2523 "dhcp4_parser.yy"
+  case 723: // not_empty_client_class_params: not_empty_client_class_params ","
+#line 2537 "dhcp4_parser.yy"
                                           {
         ctx.warnAboutExtraCommas(yystack_[0].location);
         }
 #line 3980 "dhcp4_parser.cc"
     break;
 
-  case 728: // $@109: %empty
-#line 2549 "dhcp4_parser.yy"
+  case 742: // $@109: %empty
+#line 2563 "dhcp4_parser.yy"
                         {
     ctx.unique("test", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -3988,8 +3988,8 @@ namespace isc { namespace dhcp {
 #line 3989 "dhcp4_parser.cc"
     break;
 
-  case 729: // client_class_test: "test" $@109 ":" "constant string"
-#line 2552 "dhcp4_parser.yy"
+  case 743: // client_class_test: "test" $@109 ":" "constant string"
+#line 2566 "dhcp4_parser.yy"
                {
     ElementPtr test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("test", test);
@@ -3998,8 +3998,8 @@ namespace isc { namespace dhcp {
 #line 3999 "dhcp4_parser.cc"
     break;
 
-  case 730: // $@110: %empty
-#line 2558 "dhcp4_parser.yy"
+  case 744: // $@110: %empty
+#line 2572 "dhcp4_parser.yy"
                                           {
     ctx.unique("template-test", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4007,8 +4007,8 @@ namespace isc { namespace dhcp {
 #line 4008 "dhcp4_parser.cc"
     break;
 
-  case 731: // client_class_template_test: "template-test" $@110 ":" "constant string"
-#line 2561 "dhcp4_parser.yy"
+  case 745: // client_class_template_test: "template-test" $@110 ":" "constant string"
+#line 2575 "dhcp4_parser.yy"
                {
     ElementPtr template_test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("template-test", template_test);
@@ -4017,8 +4017,8 @@ namespace isc { namespace dhcp {
 #line 4018 "dhcp4_parser.cc"
     break;
 
-  case 732: // only_if_required: "only-if-required" ":" "boolean"
-#line 2568 "dhcp4_parser.yy"
+  case 746: // only_if_required: "only-if-required" ":" "boolean"
+#line 2582 "dhcp4_parser.yy"
                                                  {
     ctx.unique("only-if-required", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -4027,8 +4027,8 @@ namespace isc { namespace dhcp {
 #line 4028 "dhcp4_parser.cc"
     break;
 
-  case 733: // only_in_additional_list: "only-in-additional-list" ":" "boolean"
-#line 2574 "dhcp4_parser.yy"
+  case 747: // only_in_additional_list: "only-in-additional-list" ":" "boolean"
+#line 2588 "dhcp4_parser.yy"
                                                                {
     ctx.unique("only-in-additional-list", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -4037,8 +4037,8 @@ namespace isc { namespace dhcp {
 #line 4038 "dhcp4_parser.cc"
     break;
 
-  case 734: // dhcp4o6_port: "dhcp4o6-port" ":" "integer"
-#line 2582 "dhcp4_parser.yy"
+  case 748: // dhcp4o6_port: "dhcp4o6-port" ":" "integer"
+#line 2596 "dhcp4_parser.yy"
                                          {
     ctx.unique("dhcp4o6-port", ctx.loc2pos(yystack_[2].location));
     ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4047,8 +4047,8 @@ namespace isc { namespace dhcp {
 #line 4048 "dhcp4_parser.cc"
     break;
 
-  case 735: // $@111: %empty
-#line 2590 "dhcp4_parser.yy"
+  case 749: // $@111: %empty
+#line 2604 "dhcp4_parser.yy"
                                {
     ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location));
     ctx.unique("control-sockets", ctx.loc2pos(yystack_[0].location));
@@ -4060,8 +4060,8 @@ namespace isc { namespace dhcp {
 #line 4061 "dhcp4_parser.cc"
     break;
 
-  case 736: // control_socket: "control-socket" $@111 ":" "{" control_socket_params "}"
-#line 2597 "dhcp4_parser.yy"
+  case 750: // control_socket: "control-socket" $@111 ":" "{" control_socket_params "}"
+#line 2611 "dhcp4_parser.yy"
                                                             {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4069,8 +4069,8 @@ namespace isc { namespace dhcp {
 #line 4070 "dhcp4_parser.cc"
     break;
 
-  case 737: // $@112: %empty
-#line 2602 "dhcp4_parser.yy"
+  case 751: // $@112: %empty
+#line 2616 "dhcp4_parser.yy"
                                  {
     ctx.unique("control-sockets", ctx.loc2pos(yystack_[0].location));
     ctx.unique("control-socket", ctx.loc2pos(yystack_[0].location));
@@ -4082,8 +4082,8 @@ namespace isc { namespace dhcp {
 #line 4083 "dhcp4_parser.cc"
     break;
 
-  case 738: // control_sockets: "control-sockets" $@112 ":" "[" control_socket_list "]"
-#line 2609 "dhcp4_parser.yy"
+  case 752: // control_sockets: "control-sockets" $@112 ":" "[" control_socket_list "]"
+#line 2623 "dhcp4_parser.yy"
                                                             {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4091,16 +4091,16 @@ namespace isc { namespace dhcp {
 #line 4092 "dhcp4_parser.cc"
     break;
 
-  case 743: // not_empty_control_socket_list: not_empty_control_socket_list ","
-#line 2620 "dhcp4_parser.yy"
+  case 757: // not_empty_control_socket_list: not_empty_control_socket_list ","
+#line 2634 "dhcp4_parser.yy"
                                                                    {
                                  ctx.warnAboutExtraCommas(yystack_[0].location);
                                  }
 #line 4100 "dhcp4_parser.cc"
     break;
 
-  case 744: // $@113: %empty
-#line 2625 "dhcp4_parser.yy"
+  case 758: // $@113: %empty
+#line 2639 "dhcp4_parser.yy"
                                      {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
@@ -4109,24 +4109,24 @@ namespace isc { namespace dhcp {
 #line 4110 "dhcp4_parser.cc"
     break;
 
-  case 745: // control_socket_entry: "{" $@113 control_socket_params "}"
-#line 2629 "dhcp4_parser.yy"
+  case 759: // control_socket_entry: "{" $@113 control_socket_params "}"
+#line 2643 "dhcp4_parser.yy"
                                        {
     ctx.stack_.pop_back();
 }
 #line 4118 "dhcp4_parser.cc"
     break;
 
-  case 748: // control_socket_params: control_socket_params ","
-#line 2635 "dhcp4_parser.yy"
+  case 762: // control_socket_params: control_socket_params ","
+#line 2649 "dhcp4_parser.yy"
                                                    {
                           ctx.warnAboutExtraCommas(yystack_[0].location);
                           }
 #line 4126 "dhcp4_parser.cc"
     break;
 
-  case 762: // $@114: %empty
-#line 2655 "dhcp4_parser.yy"
+  case 776: // $@114: %empty
+#line 2669 "dhcp4_parser.yy"
                                  {
     ctx.unique("socket-type", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.CONTROL_SOCKET_TYPE);
@@ -4134,8 +4134,8 @@ namespace isc { namespace dhcp {
 #line 4135 "dhcp4_parser.cc"
     break;
 
-  case 763: // control_socket_type: "socket-type" $@114 ":" control_socket_type_value
-#line 2658 "dhcp4_parser.yy"
+  case 777: // control_socket_type: "socket-type" $@114 ":" control_socket_type_value
+#line 2672 "dhcp4_parser.yy"
                                   {
     ctx.stack_.back()->set("socket-type", yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -4143,26 +4143,26 @@ namespace isc { namespace dhcp {
 #line 4144 "dhcp4_parser.cc"
     break;
 
-  case 764: // control_socket_type_value: "unix"
-#line 2664 "dhcp4_parser.yy"
+  case 778: // control_socket_type_value: "unix"
+#line 2678 "dhcp4_parser.yy"
          { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("unix", ctx.loc2pos(yystack_[0].location))); }
 #line 4150 "dhcp4_parser.cc"
     break;
 
-  case 765: // control_socket_type_value: "http"
-#line 2665 "dhcp4_parser.yy"
+  case 779: // control_socket_type_value: "http"
+#line 2679 "dhcp4_parser.yy"
          { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("http", ctx.loc2pos(yystack_[0].location))); }
 #line 4156 "dhcp4_parser.cc"
     break;
 
-  case 766: // control_socket_type_value: "https"
-#line 2666 "dhcp4_parser.yy"
+  case 780: // control_socket_type_value: "https"
+#line 2680 "dhcp4_parser.yy"
           { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("https", ctx.loc2pos(yystack_[0].location))); }
 #line 4162 "dhcp4_parser.cc"
     break;
 
-  case 767: // $@115: %empty
-#line 2669 "dhcp4_parser.yy"
+  case 781: // $@115: %empty
+#line 2683 "dhcp4_parser.yy"
                                  {
     ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location));
     ctx.unique("socket-address", ctx.loc2pos(yystack_[0].location));
@@ -4171,8 +4171,8 @@ namespace isc { namespace dhcp {
 #line 4172 "dhcp4_parser.cc"
     break;
 
-  case 768: // control_socket_name: "socket-name" $@115 ":" "constant string"
-#line 2673 "dhcp4_parser.yy"
+  case 782: // control_socket_name: "socket-name" $@115 ":" "constant string"
+#line 2687 "dhcp4_parser.yy"
                {
     ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-name", name);
@@ -4181,8 +4181,8 @@ namespace isc { namespace dhcp {
 #line 4182 "dhcp4_parser.cc"
     break;
 
-  case 769: // $@116: %empty
-#line 2679 "dhcp4_parser.yy"
+  case 783: // $@116: %empty
+#line 2693 "dhcp4_parser.yy"
                                        {
     ctx.unique("socket-address", ctx.loc2pos(yystack_[0].location));
     ctx.unique("socket-name", ctx.loc2pos(yystack_[0].location));
@@ -4191,8 +4191,8 @@ namespace isc { namespace dhcp {
 #line 4192 "dhcp4_parser.cc"
     break;
 
-  case 770: // control_socket_address: "socket-address" $@116 ":" "constant string"
-#line 2683 "dhcp4_parser.yy"
+  case 784: // control_socket_address: "socket-address" $@116 ":" "constant string"
+#line 2697 "dhcp4_parser.yy"
                {
     ElementPtr address(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-address", address);
@@ -4201,8 +4201,8 @@ namespace isc { namespace dhcp {
 #line 4202 "dhcp4_parser.cc"
     break;
 
-  case 771: // control_socket_port: "socket-port" ":" "integer"
-#line 2689 "dhcp4_parser.yy"
+  case 785: // control_socket_port: "socket-port" ":" "integer"
+#line 2703 "dhcp4_parser.yy"
                                                {
     ctx.unique("socket-port", ctx.loc2pos(yystack_[2].location));
     ElementPtr port(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4211,8 +4211,8 @@ namespace isc { namespace dhcp {
 #line 4212 "dhcp4_parser.cc"
     break;
 
-  case 772: // cert_required: "cert-required" ":" "boolean"
-#line 2695 "dhcp4_parser.yy"
+  case 786: // cert_required: "cert-required" ":" "boolean"
+#line 2709 "dhcp4_parser.yy"
                                            {
     ctx.unique("cert-required", ctx.loc2pos(yystack_[2].location));
     ElementPtr req(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -4221,8 +4221,8 @@ namespace isc { namespace dhcp {
 #line 4222 "dhcp4_parser.cc"
     break;
 
-  case 773: // $@117: %empty
-#line 2701 "dhcp4_parser.yy"
+  case 787: // $@117: %empty
+#line 2715 "dhcp4_parser.yy"
                            {
     ctx.unique("http-headers", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4233,8 +4233,8 @@ namespace isc { namespace dhcp {
 #line 4234 "dhcp4_parser.cc"
     break;
 
-  case 774: // http_headers: "http-headers" $@117 ":" "[" http_header_list "]"
-#line 2707 "dhcp4_parser.yy"
+  case 788: // http_headers: "http-headers" $@117 ":" "[" http_header_list "]"
+#line 2721 "dhcp4_parser.yy"
                                                          {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4242,16 +4242,16 @@ namespace isc { namespace dhcp {
 #line 4243 "dhcp4_parser.cc"
     break;
 
-  case 779: // not_empty_http_header_list: not_empty_http_header_list ","
-#line 2718 "dhcp4_parser.yy"
+  case 793: // not_empty_http_header_list: not_empty_http_header_list ","
+#line 2732 "dhcp4_parser.yy"
                                                              {
                               ctx.warnAboutExtraCommas(yystack_[0].location);
                               }
 #line 4251 "dhcp4_parser.cc"
     break;
 
-  case 780: // $@118: %empty
-#line 2723 "dhcp4_parser.yy"
+  case 794: // $@118: %empty
+#line 2737 "dhcp4_parser.yy"
                             {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
@@ -4260,24 +4260,24 @@ namespace isc { namespace dhcp {
 #line 4261 "dhcp4_parser.cc"
     break;
 
-  case 781: // http_header: "{" $@118 http_header_params "}"
-#line 2727 "dhcp4_parser.yy"
+  case 795: // http_header: "{" $@118 http_header_params "}"
+#line 2741 "dhcp4_parser.yy"
                                     {
     ctx.stack_.pop_back();
 }
 #line 4269 "dhcp4_parser.cc"
     break;
 
-  case 784: // http_header_params: http_header_params ","
-#line 2733 "dhcp4_parser.yy"
+  case 798: // http_header_params: http_header_params ","
+#line 2747 "dhcp4_parser.yy"
                                              {
                       ctx.warnAboutExtraCommas(yystack_[0].location);
                       }
 #line 4277 "dhcp4_parser.cc"
     break;
 
-  case 790: // $@119: %empty
-#line 2745 "dhcp4_parser.yy"
+  case 804: // $@119: %empty
+#line 2759 "dhcp4_parser.yy"
                     {
     ctx.unique("value", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4285,8 +4285,8 @@ namespace isc { namespace dhcp {
 #line 4286 "dhcp4_parser.cc"
     break;
 
-  case 791: // header_value: "value" $@119 ":" "constant string"
-#line 2748 "dhcp4_parser.yy"
+  case 805: // header_value: "value" $@119 ":" "constant string"
+#line 2762 "dhcp4_parser.yy"
                {
     ElementPtr value(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("value", value);
@@ -4295,8 +4295,8 @@ namespace isc { namespace dhcp {
 #line 4296 "dhcp4_parser.cc"
     break;
 
-  case 792: // $@120: %empty
-#line 2756 "dhcp4_parser.yy"
+  case 806: // $@120: %empty
+#line 2770 "dhcp4_parser.yy"
                                {
     ctx.unique("authentication", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4307,8 +4307,8 @@ namespace isc { namespace dhcp {
 #line 4308 "dhcp4_parser.cc"
     break;
 
-  case 793: // authentication: "authentication" $@120 ":" "{" auth_params "}"
-#line 2762 "dhcp4_parser.yy"
+  case 807: // authentication: "authentication" $@120 ":" "{" auth_params "}"
+#line 2776 "dhcp4_parser.yy"
                                                   {
     // The type parameter is required
     ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
@@ -4318,16 +4318,16 @@ namespace isc { namespace dhcp {
 #line 4319 "dhcp4_parser.cc"
     break;
 
-  case 796: // auth_params: auth_params ","
-#line 2771 "dhcp4_parser.yy"
+  case 810: // auth_params: auth_params ","
+#line 2785 "dhcp4_parser.yy"
                                {
                ctx.warnAboutExtraCommas(yystack_[0].location);
                }
 #line 4327 "dhcp4_parser.cc"
     break;
 
-  case 804: // $@121: %empty
-#line 2785 "dhcp4_parser.yy"
+  case 818: // $@121: %empty
+#line 2799 "dhcp4_parser.yy"
                 {
     ctx.unique("type", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.AUTH_TYPE);
@@ -4335,8 +4335,8 @@ namespace isc { namespace dhcp {
 #line 4336 "dhcp4_parser.cc"
     break;
 
-  case 805: // auth_type: "type" $@121 ":" auth_type_value
-#line 2788 "dhcp4_parser.yy"
+  case 819: // auth_type: "type" $@121 ":" auth_type_value
+#line 2802 "dhcp4_parser.yy"
                         {
     ctx.stack_.back()->set("type", yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -4344,14 +4344,14 @@ namespace isc { namespace dhcp {
 #line 4345 "dhcp4_parser.cc"
     break;
 
-  case 806: // auth_type_value: "basic"
-#line 2793 "dhcp4_parser.yy"
+  case 820: // auth_type_value: "basic"
+#line 2807 "dhcp4_parser.yy"
                        { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("basic", ctx.loc2pos(yystack_[0].location))); }
 #line 4351 "dhcp4_parser.cc"
     break;
 
-  case 807: // $@122: %empty
-#line 2796 "dhcp4_parser.yy"
+  case 821: // $@122: %empty
+#line 2810 "dhcp4_parser.yy"
              {
     ctx.unique("realm", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4359,8 +4359,8 @@ namespace isc { namespace dhcp {
 #line 4360 "dhcp4_parser.cc"
     break;
 
-  case 808: // realm: "realm" $@122 ":" "constant string"
-#line 2799 "dhcp4_parser.yy"
+  case 822: // realm: "realm" $@122 ":" "constant string"
+#line 2813 "dhcp4_parser.yy"
                {
     ElementPtr realm(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("realm", realm);
@@ -4369,8 +4369,8 @@ namespace isc { namespace dhcp {
 #line 4370 "dhcp4_parser.cc"
     break;
 
-  case 809: // $@123: %empty
-#line 2805 "dhcp4_parser.yy"
+  case 823: // $@123: %empty
+#line 2819 "dhcp4_parser.yy"
                      {
     ctx.unique("directory", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4378,8 +4378,8 @@ namespace isc { namespace dhcp {
 #line 4379 "dhcp4_parser.cc"
     break;
 
-  case 810: // directory: "directory" $@123 ":" "constant string"
-#line 2808 "dhcp4_parser.yy"
+  case 824: // directory: "directory" $@123 ":" "constant string"
+#line 2822 "dhcp4_parser.yy"
                {
     ElementPtr directory(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("directory", directory);
@@ -4388,8 +4388,8 @@ namespace isc { namespace dhcp {
 #line 4389 "dhcp4_parser.cc"
     break;
 
-  case 811: // $@124: %empty
-#line 2814 "dhcp4_parser.yy"
+  case 825: // $@124: %empty
+#line 2828 "dhcp4_parser.yy"
                  {
     ctx.unique("clients", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4400,8 +4400,8 @@ namespace isc { namespace dhcp {
 #line 4401 "dhcp4_parser.cc"
     break;
 
-  case 812: // clients: "clients" $@124 ":" "[" clients_list "]"
-#line 2820 "dhcp4_parser.yy"
+  case 826: // clients: "clients" $@124 ":" "[" clients_list "]"
+#line 2834 "dhcp4_parser.yy"
                                                      {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4409,16 +4409,16 @@ namespace isc { namespace dhcp {
 #line 4410 "dhcp4_parser.cc"
     break;
 
-  case 817: // not_empty_clients_list: not_empty_clients_list ","
-#line 2831 "dhcp4_parser.yy"
+  case 831: // not_empty_clients_list: not_empty_clients_list ","
+#line 2845 "dhcp4_parser.yy"
                                                      {
                           ctx.warnAboutExtraCommas(yystack_[0].location);
                           }
 #line 4418 "dhcp4_parser.cc"
     break;
 
-  case 818: // $@125: %empty
-#line 2836 "dhcp4_parser.yy"
+  case 832: // $@125: %empty
+#line 2850 "dhcp4_parser.yy"
                            {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
@@ -4427,24 +4427,24 @@ namespace isc { namespace dhcp {
 #line 4428 "dhcp4_parser.cc"
     break;
 
-  case 819: // basic_auth: "{" $@125 clients_params "}"
-#line 2840 "dhcp4_parser.yy"
+  case 833: // basic_auth: "{" $@125 clients_params "}"
+#line 2854 "dhcp4_parser.yy"
                                 {
     ctx.stack_.pop_back();
 }
 #line 4436 "dhcp4_parser.cc"
     break;
 
-  case 822: // clients_params: clients_params ","
-#line 2846 "dhcp4_parser.yy"
+  case 836: // clients_params: clients_params ","
+#line 2860 "dhcp4_parser.yy"
                                      {
                   ctx.warnAboutExtraCommas(yystack_[0].location);
                   }
 #line 4444 "dhcp4_parser.cc"
     break;
 
-  case 830: // $@126: %empty
-#line 2860 "dhcp4_parser.yy"
+  case 844: // $@126: %empty
+#line 2874 "dhcp4_parser.yy"
                      {
     ctx.unique("user-file", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4452,8 +4452,8 @@ namespace isc { namespace dhcp {
 #line 4453 "dhcp4_parser.cc"
     break;
 
-  case 831: // user_file: "user-file" $@126 ":" "constant string"
-#line 2863 "dhcp4_parser.yy"
+  case 845: // user_file: "user-file" $@126 ":" "constant string"
+#line 2877 "dhcp4_parser.yy"
                {
     ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("user-file", user);
@@ -4462,8 +4462,8 @@ namespace isc { namespace dhcp {
 #line 4463 "dhcp4_parser.cc"
     break;
 
-  case 832: // $@127: %empty
-#line 2869 "dhcp4_parser.yy"
+  case 846: // $@127: %empty
+#line 2883 "dhcp4_parser.yy"
                              {
     ctx.unique("password-file", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4471,8 +4471,8 @@ namespace isc { namespace dhcp {
 #line 4472 "dhcp4_parser.cc"
     break;
 
-  case 833: // password_file: "password-file" $@127 ":" "constant string"
-#line 2872 "dhcp4_parser.yy"
+  case 847: // password_file: "password-file" $@127 ":" "constant string"
+#line 2886 "dhcp4_parser.yy"
                {
     ElementPtr password(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("password-file", password);
@@ -4481,8 +4481,8 @@ namespace isc { namespace dhcp {
 #line 4482 "dhcp4_parser.cc"
     break;
 
-  case 834: // $@128: %empty
-#line 2880 "dhcp4_parser.yy"
+  case 848: // $@128: %empty
+#line 2894 "dhcp4_parser.yy"
                                        {
     ctx.unique("dhcp-queue-control", ctx.loc2pos(yystack_[0].location));
     ElementPtr qc(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4493,8 +4493,8 @@ namespace isc { namespace dhcp {
 #line 4494 "dhcp4_parser.cc"
     break;
 
-  case 835: // dhcp_queue_control: "dhcp-queue-control" $@128 ":" "{" queue_control_params "}"
-#line 2886 "dhcp4_parser.yy"
+  case 849: // dhcp_queue_control: "dhcp-queue-control" $@128 ":" "{" queue_control_params "}"
+#line 2900 "dhcp4_parser.yy"
                                                            {
     // The enable queue parameter is required.
     ctx.require("enable-queue", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
@@ -4504,16 +4504,16 @@ namespace isc { namespace dhcp {
 #line 4505 "dhcp4_parser.cc"
     break;
 
-  case 838: // queue_control_params: queue_control_params ","
-#line 2895 "dhcp4_parser.yy"
+  case 852: // queue_control_params: queue_control_params ","
+#line 2909 "dhcp4_parser.yy"
                                                  {
                         ctx.warnAboutExtraCommas(yystack_[0].location);
                         }
 #line 4513 "dhcp4_parser.cc"
     break;
 
-  case 845: // enable_queue: "enable-queue" ":" "boolean"
-#line 2908 "dhcp4_parser.yy"
+  case 859: // enable_queue: "enable-queue" ":" "boolean"
+#line 2922 "dhcp4_parser.yy"
                                          {
     ctx.unique("enable-queue", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -4522,8 +4522,8 @@ namespace isc { namespace dhcp {
 #line 4523 "dhcp4_parser.cc"
     break;
 
-  case 846: // $@129: %empty
-#line 2914 "dhcp4_parser.yy"
+  case 860: // $@129: %empty
+#line 2928 "dhcp4_parser.yy"
                        {
     ctx.unique("queue-type", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4531,8 +4531,8 @@ namespace isc { namespace dhcp {
 #line 4532 "dhcp4_parser.cc"
     break;
 
-  case 847: // queue_type: "queue-type" $@129 ":" "constant string"
-#line 2917 "dhcp4_parser.yy"
+  case 861: // queue_type: "queue-type" $@129 ":" "constant string"
+#line 2931 "dhcp4_parser.yy"
                {
     ElementPtr qt(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("queue-type", qt);
@@ -4541,8 +4541,8 @@ namespace isc { namespace dhcp {
 #line 4542 "dhcp4_parser.cc"
     break;
 
-  case 848: // capacity: "capacity" ":" "integer"
-#line 2923 "dhcp4_parser.yy"
+  case 862: // capacity: "capacity" ":" "integer"
+#line 2937 "dhcp4_parser.yy"
                                  {
     ctx.unique("capacity", ctx.loc2pos(yystack_[2].location));
     ElementPtr c(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4551,8 +4551,8 @@ namespace isc { namespace dhcp {
 #line 4552 "dhcp4_parser.cc"
     break;
 
-  case 849: // $@130: %empty
-#line 2929 "dhcp4_parser.yy"
+  case 863: // $@130: %empty
+#line 2943 "dhcp4_parser.yy"
                             {
     ctx.unique(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4560,8 +4560,8 @@ namespace isc { namespace dhcp {
 #line 4561 "dhcp4_parser.cc"
     break;
 
-  case 850: // arbitrary_map_entry: "constant string" $@130 ":" value
-#line 2932 "dhcp4_parser.yy"
+  case 864: // arbitrary_map_entry: "constant string" $@130 ":" value
+#line 2946 "dhcp4_parser.yy"
               {
     ctx.stack_.back()->set(yystack_[3].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -4569,8 +4569,8 @@ namespace isc { namespace dhcp {
 #line 4570 "dhcp4_parser.cc"
     break;
 
-  case 851: // $@131: %empty
-#line 2939 "dhcp4_parser.yy"
+  case 865: // $@131: %empty
+#line 2953 "dhcp4_parser.yy"
                      {
     ctx.unique("dhcp-ddns", ctx.loc2pos(yystack_[0].location));
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4581,8 +4581,8 @@ namespace isc { namespace dhcp {
 #line 4582 "dhcp4_parser.cc"
     break;
 
-  case 852: // dhcp_ddns: "dhcp-ddns" $@131 ":" "{" dhcp_ddns_params "}"
-#line 2945 "dhcp4_parser.yy"
+  case 866: // dhcp_ddns: "dhcp-ddns" $@131 ":" "{" dhcp_ddns_params "}"
+#line 2959 "dhcp4_parser.yy"
                                                        {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
@@ -4592,8 +4592,8 @@ namespace isc { namespace dhcp {
 #line 4593 "dhcp4_parser.cc"
     break;
 
-  case 853: // $@132: %empty
-#line 2952 "dhcp4_parser.yy"
+  case 867: // $@132: %empty
+#line 2966 "dhcp4_parser.yy"
                               {
     // Parse the dhcp-ddns map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4602,8 +4602,8 @@ namespace isc { namespace dhcp {
 #line 4603 "dhcp4_parser.cc"
     break;
 
-  case 854: // sub_dhcp_ddns: "{" $@132 dhcp_ddns_params "}"
-#line 2956 "dhcp4_parser.yy"
+  case 868: // sub_dhcp_ddns: "{" $@132 dhcp_ddns_params "}"
+#line 2970 "dhcp4_parser.yy"
                                   {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -4612,16 +4612,16 @@ namespace isc { namespace dhcp {
 #line 4613 "dhcp4_parser.cc"
     break;
 
-  case 857: // dhcp_ddns_params: dhcp_ddns_params ","
-#line 2964 "dhcp4_parser.yy"
+  case 871: // dhcp_ddns_params: dhcp_ddns_params ","
+#line 2978 "dhcp4_parser.yy"
                                          {
                     ctx.warnAboutExtraCommas(yystack_[0].location);
                     }
 #line 4621 "dhcp4_parser.cc"
     break;
 
-  case 869: // enable_updates: "enable-updates" ":" "boolean"
-#line 2982 "dhcp4_parser.yy"
+  case 883: // enable_updates: "enable-updates" ":" "boolean"
+#line 2996 "dhcp4_parser.yy"
                                              {
     ctx.unique("enable-updates", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -4630,8 +4630,8 @@ namespace isc { namespace dhcp {
 #line 4631 "dhcp4_parser.cc"
     break;
 
-  case 870: // $@133: %empty
-#line 2988 "dhcp4_parser.yy"
+  case 884: // $@133: %empty
+#line 3002 "dhcp4_parser.yy"
                      {
     ctx.unique("server-ip", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4639,8 +4639,8 @@ namespace isc { namespace dhcp {
 #line 4640 "dhcp4_parser.cc"
     break;
 
-  case 871: // server_ip: "server-ip" $@133 ":" "constant string"
-#line 2991 "dhcp4_parser.yy"
+  case 885: // server_ip: "server-ip" $@133 ":" "constant string"
+#line 3005 "dhcp4_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-ip", s);
@@ -4649,8 +4649,8 @@ namespace isc { namespace dhcp {
 #line 4650 "dhcp4_parser.cc"
     break;
 
-  case 872: // server_port: "server-port" ":" "integer"
-#line 2997 "dhcp4_parser.yy"
+  case 886: // server_port: "server-port" ":" "integer"
+#line 3011 "dhcp4_parser.yy"
                                        {
     ctx.unique("server-port", ctx.loc2pos(yystack_[2].location));
     ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4659,8 +4659,8 @@ namespace isc { namespace dhcp {
 #line 4660 "dhcp4_parser.cc"
     break;
 
-  case 873: // $@134: %empty
-#line 3003 "dhcp4_parser.yy"
+  case 887: // $@134: %empty
+#line 3017 "dhcp4_parser.yy"
                      {
     ctx.unique("sender-ip", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4668,8 +4668,8 @@ namespace isc { namespace dhcp {
 #line 4669 "dhcp4_parser.cc"
     break;
 
-  case 874: // sender_ip: "sender-ip" $@134 ":" "constant string"
-#line 3006 "dhcp4_parser.yy"
+  case 888: // sender_ip: "sender-ip" $@134 ":" "constant string"
+#line 3020 "dhcp4_parser.yy"
                {
     ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sender-ip", s);
@@ -4678,8 +4678,8 @@ namespace isc { namespace dhcp {
 #line 4679 "dhcp4_parser.cc"
     break;
 
-  case 875: // sender_port: "sender-port" ":" "integer"
-#line 3012 "dhcp4_parser.yy"
+  case 889: // sender_port: "sender-port" ":" "integer"
+#line 3026 "dhcp4_parser.yy"
                                        {
     ctx.unique("sender-port", ctx.loc2pos(yystack_[2].location));
     ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4688,8 +4688,8 @@ namespace isc { namespace dhcp {
 #line 4689 "dhcp4_parser.cc"
     break;
 
-  case 876: // max_queue_size: "max-queue-size" ":" "integer"
-#line 3018 "dhcp4_parser.yy"
+  case 890: // max_queue_size: "max-queue-size" ":" "integer"
+#line 3032 "dhcp4_parser.yy"
                                              {
     ctx.unique("max-queue-size", ctx.loc2pos(yystack_[2].location));
     ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4698,8 +4698,8 @@ namespace isc { namespace dhcp {
 #line 4699 "dhcp4_parser.cc"
     break;
 
-  case 877: // $@135: %empty
-#line 3024 "dhcp4_parser.yy"
+  case 891: // $@135: %empty
+#line 3038 "dhcp4_parser.yy"
                            {
     ctx.unique("ncr-protocol", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NCR_PROTOCOL);
@@ -4707,8 +4707,8 @@ namespace isc { namespace dhcp {
 #line 4708 "dhcp4_parser.cc"
     break;
 
-  case 878: // ncr_protocol: "ncr-protocol" $@135 ":" ncr_protocol_value
-#line 3027 "dhcp4_parser.yy"
+  case 892: // ncr_protocol: "ncr-protocol" $@135 ":" ncr_protocol_value
+#line 3041 "dhcp4_parser.yy"
                            {
     ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as < ElementPtr > ());
     ctx.leave();
@@ -4716,20 +4716,20 @@ namespace isc { namespace dhcp {
 #line 4717 "dhcp4_parser.cc"
     break;
 
-  case 879: // ncr_protocol_value: "udp"
-#line 3033 "dhcp4_parser.yy"
+  case 893: // ncr_protocol_value: "udp"
+#line 3047 "dhcp4_parser.yy"
         { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
 #line 4723 "dhcp4_parser.cc"
     break;
 
-  case 880: // ncr_protocol_value: "tcp"
-#line 3034 "dhcp4_parser.yy"
+  case 894: // ncr_protocol_value: "tcp"
+#line 3048 "dhcp4_parser.yy"
         { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
 #line 4729 "dhcp4_parser.cc"
     break;
 
-  case 881: // $@136: %empty
-#line 3037 "dhcp4_parser.yy"
+  case 895: // $@136: %empty
+#line 3051 "dhcp4_parser.yy"
                        {
     ctx.unique("ncr-format", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NCR_FORMAT);
@@ -4737,8 +4737,8 @@ namespace isc { namespace dhcp {
 #line 4738 "dhcp4_parser.cc"
     break;
 
-  case 882: // ncr_format: "ncr-format" $@136 ":" "JSON"
-#line 3040 "dhcp4_parser.yy"
+  case 896: // ncr_format: "ncr-format" $@136 ":" "JSON"
+#line 3054 "dhcp4_parser.yy"
              {
     ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ncr-format", json);
@@ -4747,8 +4747,8 @@ namespace isc { namespace dhcp {
 #line 4748 "dhcp4_parser.cc"
     break;
 
-  case 883: // $@137: %empty
-#line 3048 "dhcp4_parser.yy"
+  case 897: // $@137: %empty
+#line 3062 "dhcp4_parser.yy"
                                {
     ctx.unique("config-control", ctx.loc2pos(yystack_[0].location));
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4759,8 +4759,8 @@ namespace isc { namespace dhcp {
 #line 4760 "dhcp4_parser.cc"
     break;
 
-  case 884: // config_control: "config-control" $@137 ":" "{" config_control_params "}"
-#line 3054 "dhcp4_parser.yy"
+  case 898: // config_control: "config-control" $@137 ":" "{" config_control_params "}"
+#line 3068 "dhcp4_parser.yy"
                                                             {
     // No config control params are required
     ctx.stack_.pop_back();
@@ -4769,8 +4769,8 @@ namespace isc { namespace dhcp {
 #line 4770 "dhcp4_parser.cc"
     break;
 
-  case 885: // $@138: %empty
-#line 3060 "dhcp4_parser.yy"
+  case 899: // $@138: %empty
+#line 3074 "dhcp4_parser.yy"
                                    {
     // Parse the config-control map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -4779,8 +4779,8 @@ namespace isc { namespace dhcp {
 #line 4780 "dhcp4_parser.cc"
     break;
 
-  case 886: // sub_config_control: "{" $@138 config_control_params "}"
-#line 3064 "dhcp4_parser.yy"
+  case 900: // sub_config_control: "{" $@138 config_control_params "}"
+#line 3078 "dhcp4_parser.yy"
                                        {
     // No config_control params are required
     // parsing completed
@@ -4788,16 +4788,16 @@ namespace isc { namespace dhcp {
 #line 4789 "dhcp4_parser.cc"
     break;
 
-  case 889: // config_control_params: config_control_params ","
-#line 3072 "dhcp4_parser.yy"
+  case 903: // config_control_params: config_control_params ","
+#line 3086 "dhcp4_parser.yy"
                                                    {
                          ctx.warnAboutExtraCommas(yystack_[0].location);
                          }
 #line 4797 "dhcp4_parser.cc"
     break;
 
-  case 892: // $@139: %empty
-#line 3082 "dhcp4_parser.yy"
+  case 906: // $@139: %empty
+#line 3096 "dhcp4_parser.yy"
                                    {
     ctx.unique("config-databases", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4808,8 +4808,8 @@ namespace isc { namespace dhcp {
 #line 4809 "dhcp4_parser.cc"
     break;
 
-  case 893: // config_databases: "config-databases" $@139 ":" "[" database_list "]"
-#line 3088 "dhcp4_parser.yy"
+  case 907: // config_databases: "config-databases" $@139 ":" "[" database_list "]"
+#line 3102 "dhcp4_parser.yy"
                                                       {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4817,8 +4817,8 @@ namespace isc { namespace dhcp {
 #line 4818 "dhcp4_parser.cc"
     break;
 
-  case 894: // config_fetch_wait_time: "config-fetch-wait-time" ":" "integer"
-#line 3093 "dhcp4_parser.yy"
+  case 908: // config_fetch_wait_time: "config-fetch-wait-time" ":" "integer"
+#line 3107 "dhcp4_parser.yy"
                                                              {
     ctx.unique("config-fetch-wait-time", ctx.loc2pos(yystack_[2].location));
     ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4827,8 +4827,8 @@ namespace isc { namespace dhcp {
 #line 4828 "dhcp4_parser.cc"
     break;
 
-  case 895: // $@140: %empty
-#line 3101 "dhcp4_parser.yy"
+  case 909: // $@140: %empty
+#line 3115 "dhcp4_parser.yy"
                  {
     ctx.unique("loggers", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4839,8 +4839,8 @@ namespace isc { namespace dhcp {
 #line 4840 "dhcp4_parser.cc"
     break;
 
-  case 896: // loggers: "loggers" $@140 ":" "[" loggers_entries "]"
-#line 3107 "dhcp4_parser.yy"
+  case 910: // loggers: "loggers" $@140 ":" "[" loggers_entries "]"
+#line 3121 "dhcp4_parser.yy"
                                                          {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4848,16 +4848,16 @@ namespace isc { namespace dhcp {
 #line 4849 "dhcp4_parser.cc"
     break;
 
-  case 899: // loggers_entries: loggers_entries ","
-#line 3116 "dhcp4_parser.yy"
+  case 913: // loggers_entries: loggers_entries ","
+#line 3130 "dhcp4_parser.yy"
                                        {
                    ctx.warnAboutExtraCommas(yystack_[0].location);
                    }
 #line 4857 "dhcp4_parser.cc"
     break;
 
-  case 900: // $@141: %empty
-#line 3122 "dhcp4_parser.yy"
+  case 914: // $@141: %empty
+#line 3136 "dhcp4_parser.yy"
                              {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
@@ -4866,24 +4866,24 @@ namespace isc { namespace dhcp {
 #line 4867 "dhcp4_parser.cc"
     break;
 
-  case 901: // logger_entry: "{" $@141 logger_params "}"
-#line 3126 "dhcp4_parser.yy"
+  case 915: // logger_entry: "{" $@141 logger_params "}"
+#line 3140 "dhcp4_parser.yy"
                                {
     ctx.stack_.pop_back();
 }
 #line 4875 "dhcp4_parser.cc"
     break;
 
-  case 904: // logger_params: logger_params ","
-#line 3132 "dhcp4_parser.yy"
+  case 918: // logger_params: logger_params ","
+#line 3146 "dhcp4_parser.yy"
                                    {
                  ctx.warnAboutExtraCommas(yystack_[0].location);
                  }
 #line 4883 "dhcp4_parser.cc"
     break;
 
-  case 912: // debuglevel: "debuglevel" ":" "integer"
-#line 3146 "dhcp4_parser.yy"
+  case 926: // debuglevel: "debuglevel" ":" "integer"
+#line 3160 "dhcp4_parser.yy"
                                      {
     ctx.unique("debuglevel", ctx.loc2pos(yystack_[2].location));
     ElementPtr dl(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -4892,8 +4892,8 @@ namespace isc { namespace dhcp {
 #line 4893 "dhcp4_parser.cc"
     break;
 
-  case 913: // $@142: %empty
-#line 3152 "dhcp4_parser.yy"
+  case 927: // $@142: %empty
+#line 3166 "dhcp4_parser.yy"
                    {
     ctx.unique("severity", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4901,8 +4901,8 @@ namespace isc { namespace dhcp {
 #line 4902 "dhcp4_parser.cc"
     break;
 
-  case 914: // severity: "severity" $@142 ":" "constant string"
-#line 3155 "dhcp4_parser.yy"
+  case 928: // severity: "severity" $@142 ":" "constant string"
+#line 3169 "dhcp4_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
@@ -4911,8 +4911,8 @@ namespace isc { namespace dhcp {
 #line 4912 "dhcp4_parser.cc"
     break;
 
-  case 915: // $@143: %empty
-#line 3161 "dhcp4_parser.yy"
+  case 929: // $@143: %empty
+#line 3175 "dhcp4_parser.yy"
                                     {
     ctx.unique("output-options", ctx.loc2pos(yystack_[0].location));
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
@@ -4923,8 +4923,8 @@ namespace isc { namespace dhcp {
 #line 4924 "dhcp4_parser.cc"
     break;
 
-  case 916: // output_options_list: "output-options" $@143 ":" "[" output_options_list_content "]"
-#line 3167 "dhcp4_parser.yy"
+  case 930: // output_options_list: "output-options" $@143 ":" "[" output_options_list_content "]"
+#line 3181 "dhcp4_parser.yy"
                                                                     {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -4932,16 +4932,16 @@ namespace isc { namespace dhcp {
 #line 4933 "dhcp4_parser.cc"
     break;
 
-  case 919: // output_options_list_content: output_options_list_content ","
-#line 3174 "dhcp4_parser.yy"
+  case 933: // output_options_list_content: output_options_list_content ","
+#line 3188 "dhcp4_parser.yy"
                                                                {
                                ctx.warnAboutExtraCommas(yystack_[0].location);
                                }
 #line 4941 "dhcp4_parser.cc"
     break;
 
-  case 920: // $@144: %empty
-#line 3179 "dhcp4_parser.yy"
+  case 934: // $@144: %empty
+#line 3193 "dhcp4_parser.yy"
                              {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
@@ -4950,24 +4950,24 @@ namespace isc { namespace dhcp {
 #line 4951 "dhcp4_parser.cc"
     break;
 
-  case 921: // output_entry: "{" $@144 output_params_list "}"
-#line 3183 "dhcp4_parser.yy"
+  case 935: // output_entry: "{" $@144 output_params_list "}"
+#line 3197 "dhcp4_parser.yy"
                                     {
     ctx.stack_.pop_back();
 }
 #line 4959 "dhcp4_parser.cc"
     break;
 
-  case 924: // output_params_list: output_params_list ","
-#line 3189 "dhcp4_parser.yy"
+  case 938: // output_params_list: output_params_list ","
+#line 3203 "dhcp4_parser.yy"
                                              {
                       ctx.warnAboutExtraCommas(yystack_[0].location);
                       }
 #line 4967 "dhcp4_parser.cc"
     break;
 
-  case 930: // $@145: %empty
-#line 3201 "dhcp4_parser.yy"
+  case 944: // $@145: %empty
+#line 3215 "dhcp4_parser.yy"
                {
     ctx.unique("output", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -4975,8 +4975,8 @@ namespace isc { namespace dhcp {
 #line 4976 "dhcp4_parser.cc"
     break;
 
-  case 931: // output: "output" $@145 ":" "constant string"
-#line 3204 "dhcp4_parser.yy"
+  case 945: // output: "output" $@145 ":" "constant string"
+#line 3218 "dhcp4_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
@@ -4985,8 +4985,8 @@ namespace isc { namespace dhcp {
 #line 4986 "dhcp4_parser.cc"
     break;
 
-  case 932: // flush: "flush" ":" "boolean"
-#line 3210 "dhcp4_parser.yy"
+  case 946: // flush: "flush" ":" "boolean"
+#line 3224 "dhcp4_parser.yy"
                            {
     ctx.unique("flush", ctx.loc2pos(yystack_[2].location));
     ElementPtr flush(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -4995,8 +4995,8 @@ namespace isc { namespace dhcp {
 #line 4996 "dhcp4_parser.cc"
     break;
 
-  case 933: // maxsize: "maxsize" ":" "integer"
-#line 3216 "dhcp4_parser.yy"
+  case 947: // maxsize: "maxsize" ":" "integer"
+#line 3230 "dhcp4_parser.yy"
                                {
     ctx.unique("maxsize", ctx.loc2pos(yystack_[2].location));
     ElementPtr maxsize(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -5005,8 +5005,8 @@ namespace isc { namespace dhcp {
 #line 5006 "dhcp4_parser.cc"
     break;
 
-  case 934: // maxver: "maxver" ":" "integer"
-#line 3222 "dhcp4_parser.yy"
+  case 948: // maxver: "maxver" ":" "integer"
+#line 3236 "dhcp4_parser.yy"
                              {
     ctx.unique("maxver", ctx.loc2pos(yystack_[2].location));
     ElementPtr maxver(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
@@ -5015,8 +5015,8 @@ namespace isc { namespace dhcp {
 #line 5016 "dhcp4_parser.cc"
     break;
 
-  case 935: // $@146: %empty
-#line 3228 "dhcp4_parser.yy"
+  case 949: // $@146: %empty
+#line 3242 "dhcp4_parser.yy"
                  {
     ctx.unique("pattern", ctx.loc2pos(yystack_[0].location));
     ctx.enter(ctx.NO_KEYWORD);
@@ -5024,8 +5024,8 @@ namespace isc { namespace dhcp {
 #line 5025 "dhcp4_parser.cc"
     break;
 
-  case 936: // pattern: "pattern" $@146 ":" "constant string"
-#line 3231 "dhcp4_parser.yy"
+  case 950: // pattern: "pattern" $@146 ":" "constant string"
+#line 3245 "dhcp4_parser.yy"
                {
     ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pattern", sev);
@@ -5034,8 +5034,8 @@ namespace isc { namespace dhcp {
 #line 5035 "dhcp4_parser.cc"
     break;
 
-  case 937: // $@147: %empty
-#line 3237 "dhcp4_parser.yy"
+  case 951: // $@147: %empty
+#line 3251 "dhcp4_parser.yy"
                              {
     ctx.unique("compatibility", ctx.loc2pos(yystack_[0].location));
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
@@ -5046,8 +5046,8 @@ namespace isc { namespace dhcp {
 #line 5047 "dhcp4_parser.cc"
     break;
 
-  case 938: // compatibility: "compatibility" $@147 ":" "{" compatibility_params "}"
-#line 3243 "dhcp4_parser.yy"
+  case 952: // compatibility: "compatibility" $@147 ":" "{" compatibility_params "}"
+#line 3257 "dhcp4_parser.yy"
                                                            {
     ctx.stack_.pop_back();
     ctx.leave();
@@ -5055,16 +5055,16 @@ namespace isc { namespace dhcp {
 #line 5056 "dhcp4_parser.cc"
     break;
 
-  case 941: // compatibility_params: compatibility_params ","
-#line 3250 "dhcp4_parser.yy"
+  case 955: // compatibility_params: compatibility_params ","
+#line 3264 "dhcp4_parser.yy"
                                                  {
                         ctx.warnAboutExtraCommas(yystack_[0].location);
                         }
 #line 5064 "dhcp4_parser.cc"
     break;
 
-  case 947: // lenient_option_parsing: "lenient-option-parsing" ":" "boolean"
-#line 3262 "dhcp4_parser.yy"
+  case 961: // lenient_option_parsing: "lenient-option-parsing" ":" "boolean"
+#line 3276 "dhcp4_parser.yy"
                                                              {
     ctx.unique("lenient-option-parsing", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -5073,8 +5073,8 @@ namespace isc { namespace dhcp {
 #line 5074 "dhcp4_parser.cc"
     break;
 
-  case 948: // ignore_dhcp_server_identifier: "ignore-dhcp-server-identifier" ":" "boolean"
-#line 3268 "dhcp4_parser.yy"
+  case 962: // ignore_dhcp_server_identifier: "ignore-dhcp-server-identifier" ":" "boolean"
+#line 3282 "dhcp4_parser.yy"
                                                                    {
     ctx.unique("ignore-dhcp-server-identifier", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -5083,8 +5083,8 @@ namespace isc { namespace dhcp {
 #line 5084 "dhcp4_parser.cc"
     break;
 
-  case 949: // ignore_rai_link_selection: "ignore-rai-link-selection" ":" "boolean"
-#line 3274 "dhcp4_parser.yy"
+  case 963: // ignore_rai_link_selection: "ignore-rai-link-selection" ":" "boolean"
+#line 3288 "dhcp4_parser.yy"
                                                              {
     ctx.unique("ignore-rai-link-selection", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -5093,8 +5093,8 @@ namespace isc { namespace dhcp {
 #line 5094 "dhcp4_parser.cc"
     break;
 
-  case 950: // exclude_first_last_24: "exclude-first-last-24" ":" "boolean"
-#line 3280 "dhcp4_parser.yy"
+  case 964: // exclude_first_last_24: "exclude-first-last-24" ":" "boolean"
+#line 3294 "dhcp4_parser.yy"
                                                            {
     ctx.unique("exclude-first-last-24", ctx.loc2pos(yystack_[2].location));
     ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
@@ -5456,159 +5456,160 @@ namespace isc { namespace dhcp {
   }
 
 
-  const short Dhcp4Parser::yypact_ninf_ = -1393;
+  const short Dhcp4Parser::yypact_ninf_ = -1401;
 
   const signed char Dhcp4Parser::yytable_ninf_ = -1;
 
   const short
   Dhcp4Parser::yypact_[] =
   {
-     664, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,    57,    39,    83,   123,   129,   133,
-     140,   142,   153,   169,   175,   199,   201,   211, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,    39,  -147,    95,   166,    72,   713,
-     536,   581,    -2,   238,   558,   -96,   574,    68, -1393,   105,
-     190,   225,   252,   255, -1393,    46, -1393, -1393, -1393, -1393,
-     308,   309,   321, -1393, -1393, -1393,   325,   342, -1393, -1393,
-   -1393,   359,   369,   376,   379,   390,   413,   424,   425,   427,
-     442,   443, -1393,   465,   466,   469,   479,   481, -1393, -1393,
-   -1393,   484,   485,   487,   488,   489,   491,   492, -1393, -1393,
-   -1393,   495, -1393, -1393, -1393, -1393, -1393,   497,   499,   502,
-   -1393, -1393, -1393, -1393, -1393,   504, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393,   508,   511,   514, -1393, -1393,   515, -1393,
-      52, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393,   517,   518,   520,   522,
-   -1393,   111, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   523, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393,   118, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-     528, -1393, -1393, -1393, -1393, -1393, -1393,   119, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393,   271,   388, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   525,
-   -1393, -1393,   530, -1393, -1393, -1393,   532, -1393, -1393,   529,
-     535, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,   537,   538,   540, -1393, -1393, -1393,
-   -1393, -1393,   531,   543, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   121, -1393,
-   -1393, -1393,   544, -1393,   550, -1393,   552,   555, -1393, -1393,
-   -1393, -1393, -1393,   134, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,   557,   136, -1393, -1393, -1393, -1393,
-      39,    39, -1393,   132,   559, -1393, -1393,   560,   561,   562,
-     329,   334,   335,   565,   567,   570,   347,   343,   575,   576,
-     577,   351,   356,   357,   360,   361,   362,   365,   367,   368,
-     363,   371,   585,   372,   374,   377,   389,   392,   603,   605,
-     608,   394,   397,   401,   404,   406,   407,   410,   616,   636,
-     641,   416,   644,   645,   646,   647,   662,   435,   438,   440,
-     670,   674,   675,   676,   677,   451,   679,   681,   682,   683,
-     684,   685,   689,   461,   462,   463,   693,   696, -1393,   166,
-   -1393,   697,   700,   701,   475,   476,   480,   482,    72, -1393,
-     708,   710,   711,   712,   720,   723,   500,   726,   728,   729,
-     730,   731,   713, -1393,   732,   507,   536, -1393,   735,   736,
-     737,   738,   745,   746,   747,   748, -1393,   581, -1393,   749,
-     750,   524,   752,   753,   763,   541, -1393,   238,   764,   554,
-     556,   579,   765, -1393,   558,   766,   767,   139, -1393,   580,
-     786,   583,   804,   584,   586,   806,   812,   574, -1393,   814,
-     588,    68, -1393, -1393, -1393,   816,   818,   819,   820,   822,
-   -1393, -1393, -1393,   593,   594,   612, -1393, -1393,   831,   836,
-     839, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393,   615, -1393, -1393, -1393, -1393, -1393,  -127,   617,
-     619, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   845,   846,
-     847, -1393,   623,   345,   849,   848,   642, -1393, -1393, -1393,
-     868,   869,   889,   890,   891, -1393,   892,   893,   896,   895,
-     897,   666,   667, -1393, -1393, -1393,   898,   899, -1393,   900,
-     250,   285, -1393, -1393, -1393, -1393, -1393,   678,   680,   686,
-     902,   687,   688, -1393,   900,   900,   900,   690,   906, -1393,
-     691, -1393, -1393,   900,   692,   694,   695,   698,   699,   702,
-     703, -1393,   704,   705, -1393,   706,   707,   709, -1393, -1393,
-     714, -1393, -1393, -1393,   900, -1393,   715,   848, -1393, -1393,
-     716, -1393,   717, -1393, -1393,    18,   722, -1393,   904, -1393,
-   -1393,    39,   166,    68,    72,   326, -1393, -1393, -1393,   817,
-     817,   912, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393,   916,   919,   920, -1393, -1393, -1393, -1393, -1393, -1393,
-     923, -1393, -1393, -1393,   237,   924,   931,   933,   248,   200,
-      47,   934,   230,   574, -1393, -1393,   935,   -98, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   941,
-   -1393, -1393, -1393, -1393, -1393, -1393,   805, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393,   912, -1393,   154,   164,   167, -1393, -1393,   171, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393,   946,   947,   948,   949,
-     950,   951,   952,   953,   954,   955, -1393,   956,   957, -1393,
-   -1393, -1393, -1393, -1393,   180, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   204, -1393,
-     958,   959, -1393, -1393,   960,   962, -1393, -1393,   961,   965,
-   -1393, -1393,   963,   967, -1393, -1393,   966,   968, -1393, -1393,
-   -1393, -1393, -1393, -1393,    55, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393,    86, -1393, -1393,   969,   970, -1393, -1393,   971,
-     975, -1393,   976,   977,   980,   984,   987,   988,   214, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393,   994,   996,   997, -1393,
-     217, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-     999, -1393,  1002, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-     218, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-    1001,  1011, -1393,  1014, -1393,  1020, -1393, -1393, -1393,   256,
-   -1393, -1393, -1393, -1393, -1393,   273, -1393,    98, -1393,  1023,
-    1025,  1028,  1033, -1393,   279, -1393, -1393, -1393, -1393, -1393,
-     733, -1393,  1034,  1038, -1393, -1393,  1040, -1393,  1055, -1393,
-   -1393, -1393,  1058,  1060,   326, -1393,  1065,  1066,  1067,  1073,
-     743,   871,   851,   877,   907,   917,   922,   926,   927,   928,
-    1075,   929,   930,  1146,  1151,  1156,  1159,   817, -1393, -1393,
-     817, -1393,   912,   713, -1393,   916,   238, -1393,   919,   558,
-   -1393,   920,   354, -1393,   923,   237, -1393,   275,   924, -1393,
-     581, -1393,   931,   -96, -1393,   933,   936,   937,   938,   939,
-     940,   942,   248, -1393,   932,   943,   944,   200, -1393,  1160,
-    1162,  1168,   945,  1173,   964,  1174,    47, -1393,    47, -1393,
-     934,   972,  1175,   973,  1176,   230, -1393, -1393,   -52,   935,
-   -1393,   974,   978,   979,   981,   -98, -1393, -1393,  1177,  1179,
-     536, -1393,   941,  1180, -1393, -1393,   983,   985, -1393,   986,
-     989,   990,   991, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393,   358, -1393, -1393,   992,   993,   995,   998,
-   -1393,   290, -1393,   291, -1393,  1178, -1393,  1181, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-     292, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393,  1183,  1184, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,  1182,  1188,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393,  1185, -1393,   312,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393,   302,  1000,  1003, -1393,  1187, -1393,  1190, -1393,
-     316, -1393, -1393,  1004, -1393,    39, -1393, -1393,  1194, -1393,
-   -1393, -1393, -1393, -1393,   320, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393,  1006,   387, -1393,   900,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   354, -1393,
-    1195,  1196,  1007,  1008, -1393,   275, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,   179,  1199, -1393, -1393, -1393,  1197,
-    1012,  1198,   -52, -1393, -1393, -1393, -1393, -1393,  1009,  1016,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-     400, -1393, -1393, -1393, -1393, -1393, -1393,  1186,  1200, -1393,
-    1203, -1393,  1018, -1393, -1393, -1393,  1205,  1206,  1213,  1214,
-     179, -1393,   -19, -1393,  1199,  1217, -1393,  1015,  1019,  1021,
-    1221, -1393, -1393, -1393, -1393, -1393, -1393,   445, -1393, -1393,
-   -1393, -1393,   188, -1393, -1393, -1393, -1393, -1393,  1220,  1225,
-     -19, -1393,   -24,  1217, -1393, -1393,  1226,  1234, -1393,  1022,
-   -1393, -1393,  1240,  1249,  1252, -1393,   446, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,   186, -1393,  1220, -1393,  1254,  1027,
-    1031,  1032,  1260,   -24, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393,   456, -1393, -1393, -1393, -1393,  1035, -1393, -1393,
-   -1393,  1037, -1393,  1264,  1267,   186, -1393, -1393, -1393,  1044,
-    1045, -1393, -1393, -1393
+     508, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,    22,    39,    44,    48,    54,   133,
+     157,   209,   224,   235,   252,   260,   277,   306, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,    39,  -181,   184,   727,    72,   168,
+     368,   211,   123,    78,   305,   -93,   485,    80, -1401,    63,
+     114,   293,   304,   318, -1401,    42, -1401, -1401, -1401, -1401,
+     350,   351,   364, -1401, -1401, -1401,   365,   380, -1401, -1401,
+   -1401,   389,   393,   395,   407,   409,   413,   426,   432,   440,
+     449,   469, -1401,   470,   472,   474,   479,   483, -1401, -1401,
+   -1401,   484,   488,   493,   495,   499,   505,   506, -1401, -1401,
+   -1401,   507, -1401, -1401, -1401, -1401, -1401,   509,   511,   513,
+   -1401, -1401, -1401, -1401, -1401,   515, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401,   516,   522,   525, -1401, -1401,   528, -1401,
+      62, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401,   529,   532,   534,   536,
+   -1401,    98, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,   537, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401,   116, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+     542, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401,   124, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,   378,
+     466, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401,   540, -1401, -1401,   546, -1401, -1401, -1401,
+     547, -1401, -1401,   544,   550, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,   551,   554,
+     556, -1401, -1401, -1401, -1401, -1401,   560,   559, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,   139, -1401, -1401, -1401,   566, -1401,   571, -1401,
+     572,   573, -1401, -1401, -1401, -1401, -1401,   151, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,   574,   154,
+   -1401, -1401, -1401, -1401,    39,    39, -1401,   349,   576, -1401,
+   -1401,   577,   578,   579,   352,   355,   357,   588,   589,   590,
+     374,   362,   592,   596,   602,   377,   379,   383,   386,   387,
+     388,   391,   399,   401,   396,   415,   634,   420,   423,   411,
+     416,   419,   651,   652,   653,   429,   444,   427,   433,   436,
+     447,   450,   661,   676,   678,   453,   681,   698,   699,   707,
+     708,   480,   481,   486,   714,   717,   718,   719,   741,   517,
+     742,   743,   745,   746,   748,   750,   751,   535,   538,   539,
+     763,   765, -1401,   727, -1401,   766,   769,   770,   543,   545,
+     548,   549,    72, -1401,   771,   773,   777,   778,   779,   780,
+     557,   781,   815,   816,   817,   820,   168, -1401,   821,   595,
+     368, -1401,   823,   824,   825,   826,   827,   828,   829,   833,
+   -1401,   211, -1401,   834,   835,   609,   838,   839,   842,   614,
+   -1401,    78,   844,   621,   622,   623,   853, -1401,   305,   857,
+     859,   -42, -1401,   631,   861,   635,   863,   637,   638,   866,
+     867,   485, -1401,   869,   643,    80, -1401, -1401, -1401,   872,
+     871,   873,   874,   877, -1401, -1401, -1401,   649,   655,   656,
+   -1401, -1401,   882,   883,   886, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401,   662, -1401, -1401, -1401,
+   -1401, -1401,   -81,   663,   664, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,   890,   891,   892, -1401,   668,   369,   894,   893,
+     671, -1401, -1401, -1401,   897,   898,   899,   900,   901, -1401,
+     902,   904,   907,   906,   910,   677,   684, -1401, -1401, -1401,
+     913,   912, -1401,   915,   113,   187, -1401, -1401, -1401, -1401,
+   -1401,   691,   692,   693,   919,   701,   702, -1401,   915,   915,
+     915,   703,   927, -1401,   705, -1401, -1401,   915,   706,   710,
+     711,   712,   713,   715,   716, -1401,   720,   721, -1401,   722,
+     723,   724, -1401, -1401,   725, -1401, -1401, -1401,   915, -1401,
+     726,   893, -1401, -1401,   728, -1401,   729, -1401, -1401,    18,
+     744, -1401,   933, -1401, -1401,    39,   727,    80,    72,   247,
+   -1401, -1401, -1401,   647,   647,   937, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401,   940,   941,   942, -1401, -1401,
+   -1401, -1401, -1401, -1401,   954, -1401, -1401, -1401,    88,   955,
+     956,   961,   309,   -50,   798,   962,   161,   485, -1401, -1401,
+     963,    -1, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401,   964, -1401, -1401, -1401, -1401, -1401, -1401,
+     832, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401,   937, -1401,   162,   183,   189,
+   -1401, -1401,   201, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+     968,   969,   973,   974,   975,   976,   977,   978,   979,   980,
+   -1401,   981,   982, -1401, -1401, -1401, -1401, -1401,   216, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,   265, -1401,   983,   984, -1401, -1401,   985,   989,
+   -1401, -1401,   988,   992, -1401, -1401,   996,   995, -1401, -1401,
+     999,  1003, -1401, -1401, -1401, -1401, -1401, -1401,   166, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401,   214, -1401, -1401,  1006,
+    1011, -1401, -1401,  1009,  1014, -1401,  1016,  1017,  1028,  1034,
+    1037,  1039,   290, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+    1042,  1047,  1050, -1401,   296, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,  1051, -1401,  1057, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,   297, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,  1069,  1073, -1401,  1074, -1401,  1079,
+   -1401, -1401, -1401,   307, -1401, -1401, -1401, -1401, -1401,   332,
+   -1401,   303, -1401,  1080,  1081,  1087,  1089, -1401,   382, -1401,
+   -1401, -1401, -1401, -1401,   758, -1401,  1090,  1098, -1401, -1401,
+    1110, -1401,  1118, -1401, -1401, -1401,  1124,  1130,   247, -1401,
+    1135,  1152,  1162,  1168,   943,   946,   950,   949,   953,   958,
+     960,   965,   966,   970,  1181,   959,   971,  1182,  1183,  1190,
+    1191,   647, -1401, -1401,   647, -1401,   937,   168, -1401,   940,
+      78, -1401,   941,   305, -1401,   942,   292, -1401,   954,    88,
+   -1401,  1378,   955, -1401,   211, -1401,   956,   -93, -1401,   961,
+     986,   987,   990,   991,   993,   994,   309, -1401,   997,   998,
+    1000,   -50, -1401,  1195,  1200,  1202,  1001,  1203,  1002,  1204,
+     798, -1401,   798, -1401,   962,  1004,  1205,  1005,  1207,   161,
+   -1401, -1401,   -19,   963, -1401,  1007,  1008,  1010,  1013,    -1,
+   -1401, -1401,  1206,  1210,   368, -1401,   964,  1211, -1401, -1401,
+    1012,  1018, -1401,  1020,  1021,  1023,  1024, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401,   289, -1401, -1401,
+    1025,  1027,  1030,  1032, -1401,   384, -1401,   418, -1401,  1208,
+   -1401,  1212, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,   421, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401,  1215,  1219, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,  1218,  1224, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401,  1220, -1401,   424, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401,   342,  1033,  1035, -1401,
+    1226, -1401,  1209, -1401,   425, -1401, -1401,  1036, -1401,    39,
+   -1401, -1401,  1230, -1401, -1401, -1401, -1401, -1401,   431, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+    1040,   434, -1401,   915, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,   292, -1401,  1234,  1235,  1041,  1043, -1401,  1378,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,    50,  1237,
+   -1401, -1401, -1401,  1243,  1046,  1254,   -19, -1401, -1401, -1401,
+   -1401, -1401,  1048,  1049, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,   435, -1401, -1401, -1401, -1401, -1401,
+   -1401,  1261,  1269, -1401,  1276, -1401,  1052, -1401, -1401, -1401,
+    1281,  1284,  1285,  1286,    50, -1401,   -37, -1401,  1237,  1288,
+   -1401,  1121,  1063,  1066,  1292, -1401, -1401, -1401, -1401, -1401,
+   -1401,   437, -1401, -1401, -1401, -1401,   465, -1401, -1401, -1401,
+   -1401, -1401,  1291,  1296,   -37, -1401,   109,  1288, -1401, -1401,
+    1295,  1299, -1401,  1076, -1401, -1401,  1300,  1306,  1307, -1401,
+     462, -1401, -1401, -1401, -1401, -1401, -1401, -1401,   164, -1401,
+    1291, -1401,  1310,  1070,  1085,  1088,  1314,   109, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401,   464, -1401, -1401, -1401,
+   -1401,  1091, -1401, -1401, -1401,  1093, -1401,  1316,  1320,   164,
+   -1401, -1401, -1401,  1096,  1099, -1401, -1401, -1401
   };
 
   const short
@@ -5619,17 +5620,17 @@ namespace isc { namespace dhcp {
        0,     0,     0,     0,     0,     0,     0,     0,     1,    44,
       36,    32,    31,    28,    29,    30,    35,     3,    33,    34,
       59,     5,    65,     7,   214,     9,   391,    11,   618,    13,
-     649,    15,   533,    17,   542,    19,   581,    21,   353,    23,
-     853,    25,   885,    27,    46,    39,     0,     0,     0,     0,
-       0,   651,     0,   544,   583,     0,     0,     0,    48,     0,
-      47,     0,     0,    40,    61,     0,    63,   883,   199,   232,
-       0,     0,     0,   671,   673,   675,     0,     0,   230,   243,
+     663,    15,   533,    17,   542,    19,   581,    21,   353,    23,
+     867,    25,   899,    27,    46,    39,     0,     0,     0,     0,
+       0,   665,     0,   544,   583,     0,     0,     0,    48,     0,
+      47,     0,     0,    40,    61,     0,    63,   897,   199,   232,
+       0,     0,     0,   685,   687,   689,     0,     0,   230,   243,
      245,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,   153,     0,     0,     0,     0,     0,   164,   171,
      173,     0,     0,     0,     0,     0,     0,     0,   382,   531,
-     572,     0,   156,   177,   471,   636,   638,     0,     0,     0,
-     315,   698,   640,   344,   365,     0,   330,   735,   737,   834,
-     851,   187,   189,     0,     0,     0,   895,   937,     0,   141,
+     572,     0,   156,   177,   471,   650,   652,     0,     0,     0,
+     315,   712,   654,   344,   365,     0,   330,   749,   751,   848,
+     865,   187,   189,     0,     0,     0,   909,   951,     0,   141,
        0,    67,    70,    71,    72,    73,    74,   108,   109,   110,
      111,   112,    75,   104,   137,   138,    93,    94,    95,   116,
      117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
@@ -5640,534 +5641,567 @@ namespace isc { namespace dhcp {
      103,   113,   136,   216,   218,   222,     0,     0,     0,     0,
      213,     0,   201,   204,   205,   206,   207,   208,   209,   210,
      211,   212,   451,   453,   455,   609,   449,   457,     0,   461,
-     463,   465,   459,   693,   448,   396,   397,   398,   399,   400,
+     463,   465,   459,   707,   448,   396,   397,   398,   399,   400,
      425,   426,   427,   428,   429,   446,   415,   416,   430,   431,
      432,   433,   434,   435,   436,   437,   438,   439,   440,   441,
      442,   443,   444,   445,   447,     0,   393,   403,   420,   421,
      422,   404,   406,   407,   408,   409,   411,   412,   413,   405,
-     401,   402,   423,   424,   410,   417,   418,   419,   414,   633,
-       0,   632,   626,   627,   628,   629,   625,     0,   620,   623,
-     624,   630,   631,   691,   677,   679,   681,   685,   683,   689,
-     687,   670,   664,   668,   669,     0,   652,   653,   665,   666,
-     667,   661,   656,   662,   658,   659,   660,   663,   657,     0,
-     562,   289,     0,   566,   564,   569,     0,   558,   559,     0,
-     545,   546,   549,   561,   550,   551,   552,   568,   553,   554,
-     555,   556,   557,   600,     0,     0,     0,   607,   598,   599,
-     602,   603,     0,   584,   585,   588,   589,   590,   591,   592,
-     593,   594,   597,   595,   596,   361,   363,   358,     0,   355,
-     359,   360,     0,   870,     0,   873,     0,     0,   877,   881,
-     868,   866,   867,     0,   855,   858,   859,   860,   861,   862,
-     863,   864,   865,   892,     0,     0,   887,   890,   891,    45,
-      50,     0,    37,    43,     0,    64,    60,     0,     0,     0,
+     401,   402,   423,   424,   410,   417,   418,   419,   414,   647,
+       0,   646,   630,   631,   632,   633,   634,   635,   636,   637,
+     638,   639,   640,   641,   642,   643,   626,   627,   628,   629,
+     625,     0,   620,   623,   624,   644,   645,   705,   691,   693,
+     695,   699,   697,   703,   701,   684,   678,   682,   683,     0,
+     666,   667,   679,   680,   681,   675,   670,   676,   672,   673,
+     674,   677,   671,     0,   562,   289,     0,   566,   564,   569,
+       0,   558,   559,     0,   545,   546,   549,   561,   550,   551,
+     552,   568,   553,   554,   555,   556,   557,   600,     0,     0,
+       0,   607,   598,   599,   602,   603,     0,   584,   585,   588,
+     589,   590,   591,   592,   593,   594,   597,   595,   596,   361,
+     363,   358,     0,   355,   359,   360,     0,   884,     0,   887,
+       0,     0,   891,   895,   882,   880,   881,     0,   869,   872,
+     873,   874,   875,   876,   877,   878,   879,   906,     0,     0,
+     901,   904,   905,    45,    50,     0,    37,    43,     0,    64,
+      60,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        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,    58,    69,    66,     0,     0,     0,     0,     0,
+       0,     0,   203,   215,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   395,   392,     0,     0,
+     622,   619,     0,     0,     0,     0,     0,     0,     0,     0,
+     664,   669,   534,     0,     0,     0,     0,     0,     0,     0,
+     543,   548,     0,     0,     0,     0,     0,   582,   587,     0,
+       0,   357,   354,     0,     0,     0,     0,     0,     0,     0,
+       0,   871,   868,     0,     0,   903,   900,    49,    41,     0,
+       0,     0,     0,     0,   158,   159,   160,     0,     0,     0,
+     197,   198,     0,     0,     0,   142,   143,   144,   145,   146,
+     147,   148,   149,   150,   151,   152,     0,   192,   193,   161,
+     162,   163,     0,     0,     0,   175,   176,   183,   184,   185,
+     186,   191,     0,     0,     0,   155,     0,     0,     0,     0,
+       0,   467,   468,   469,     0,     0,     0,     0,     0,   748,
+       0,     0,     0,     0,     0,     0,     0,   194,   195,   196,
+       0,     0,    68,     0,     0,     0,   226,   227,   228,   229,
+     202,     0,     0,     0,     0,     0,     0,   470,     0,     0,
+       0,     0,     0,   394,     0,   649,   621,     0,     0,     0,
+       0,     0,     0,     0,     0,   668,     0,     0,   560,     0,
+       0,     0,   571,   547,     0,   604,   605,   606,     0,   586,
+       0,     0,   356,   883,     0,   886,     0,   889,   890,     0,
+       0,   870,     0,   908,   902,     0,     0,     0,     0,     0,
+     686,   688,   690,     0,     0,   247,   154,   166,   167,   168,
+     169,   170,   165,   172,   174,   384,   535,   574,   157,   179,
+     180,   181,   182,   178,   473,    38,   651,   653,     0,     0,
+     656,   346,     0,     0,     0,   753,     0,     0,   188,   190,
+       0,     0,    51,   217,   220,   221,   219,   224,   225,   223,
+     452,   454,   456,   611,   450,   458,   462,   464,   466,   460,
+       0,   648,   706,   692,   694,   696,   700,   698,   704,   702,
+     563,   290,   567,   565,   570,   601,   608,   362,   364,   885,
+     888,   893,   894,   892,   896,   247,    42,     0,     0,     0,
+     239,   241,     0,   234,   237,   238,   280,   282,   284,   286,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    58,    69,
-      66,     0,     0,     0,     0,     0,     0,     0,   203,   215,
+     300,     0,     0,   307,   309,   311,   313,   279,     0,   254,
+     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     277,   278,     0,   252,     0,   248,   249,   389,     0,   385,
+     386,   540,     0,   536,   537,   579,     0,   575,   576,   478,
+       0,   474,   475,   325,   326,   327,   328,   329,     0,   317,
+     320,   321,   322,   323,   324,   717,     0,   714,   661,     0,
+     657,   658,   351,     0,   347,   348,     0,     0,     0,     0,
+       0,     0,     0,   367,   370,   371,   372,   373,   374,   375,
+       0,     0,     0,   340,     0,   332,   335,   336,   337,   338,
+     339,   776,   781,   783,     0,   806,     0,   787,   775,   768,
+     769,   770,   773,   774,     0,   760,   763,   764,   765,   766,
+     771,   772,   767,   758,     0,   754,   755,     0,   860,     0,
+     863,   856,   857,     0,   850,   853,   854,   855,   858,     0,
+     914,     0,   911,     0,     0,     0,     0,   960,     0,   953,
+     956,   957,   958,   959,    53,   616,     0,   612,   613,   710,
+       0,   709,     0,    62,   898,   200,     0,     0,   236,   233,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   395,   392,     0,     0,   622,   619,     0,     0,
-       0,     0,     0,     0,     0,     0,   650,   655,   534,     0,
-       0,     0,     0,     0,     0,     0,   543,   548,     0,     0,
-       0,     0,     0,   582,   587,     0,     0,   357,   354,     0,
-       0,     0,     0,     0,     0,     0,     0,   857,   854,     0,
-       0,   889,   886,    49,    41,     0,     0,     0,     0,     0,
-     158,   159,   160,     0,     0,     0,   197,   198,     0,     0,
-       0,   142,   143,   144,   145,   146,   147,   148,   149,   150,
-     151,   152,     0,   192,   193,   161,   162,   163,     0,     0,
-       0,   175,   176,   183,   184,   185,   186,   191,     0,     0,
-       0,   155,     0,     0,     0,     0,     0,   467,   468,   469,
-       0,     0,     0,     0,     0,   734,     0,     0,     0,     0,
-       0,     0,     0,   194,   195,   196,     0,     0,    68,     0,
-       0,     0,   226,   227,   228,   229,   202,     0,     0,     0,
-       0,     0,     0,   470,     0,     0,     0,     0,     0,   394,
-       0,   635,   621,     0,     0,     0,     0,     0,     0,     0,
-       0,   654,     0,     0,   560,     0,     0,     0,   571,   547,
-       0,   604,   605,   606,     0,   586,     0,     0,   356,   869,
-       0,   872,     0,   875,   876,     0,     0,   856,     0,   894,
-     888,     0,     0,     0,     0,     0,   672,   674,   676,     0,
-       0,   247,   154,   166,   167,   168,   169,   170,   165,   172,
-     174,   384,   535,   574,   157,   179,   180,   181,   182,   178,
-     473,    38,   637,   639,     0,     0,   642,   346,     0,     0,
-       0,   739,     0,     0,   188,   190,     0,     0,    51,   217,
-     220,   221,   219,   224,   225,   223,   452,   454,   456,   611,
-     450,   458,   462,   464,   466,   460,     0,   634,   692,   678,
-     680,   682,   686,   684,   690,   688,   563,   290,   567,   565,
-     570,   601,   608,   362,   364,   871,   874,   879,   880,   878,
-     882,   247,    42,     0,     0,     0,   239,   241,     0,   234,
-     237,   238,   280,   282,   284,   286,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   300,     0,     0,   307,
-     309,   311,   313,   279,     0,   254,   257,   258,   259,   260,
-     261,   262,   263,   264,   265,   266,   267,   268,   269,   270,
-     271,   272,   273,   274,   275,   276,   277,   278,     0,   252,
-       0,   248,   249,   389,     0,   385,   386,   540,     0,   536,
-     537,   579,     0,   575,   576,   478,     0,   474,   475,   325,
-     326,   327,   328,   329,     0,   317,   320,   321,   322,   323,
-     324,   703,     0,   700,   647,     0,   643,   644,   351,     0,
-     347,   348,     0,     0,     0,     0,     0,     0,     0,   367,
-     370,   371,   372,   373,   374,   375,     0,     0,     0,   340,
-       0,   332,   335,   336,   337,   338,   339,   762,   767,   769,
-       0,   792,     0,   773,   761,   754,   755,   756,   759,   760,
-       0,   746,   749,   750,   751,   752,   757,   758,   753,   744,
-       0,   740,   741,     0,   846,     0,   849,   842,   843,     0,
-     836,   839,   840,   841,   844,     0,   900,     0,   897,     0,
-       0,     0,     0,   946,     0,   939,   942,   943,   944,   945,
-      53,   616,     0,   612,   613,   696,     0,   695,     0,    62,
-     884,   200,     0,     0,   236,   233,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   256,   231,   244,
-       0,   246,   251,     0,   383,   388,   544,   532,   539,   583,
-     573,   578,     0,   472,   477,   319,   316,   705,   702,   699,
-     651,   641,   646,     0,   345,   350,     0,     0,     0,     0,
-       0,     0,   369,   366,     0,     0,     0,   334,   331,     0,
-       0,     0,     0,     0,     0,     0,   748,   736,     0,   738,
-     743,     0,     0,     0,     0,   838,   835,   852,     0,   899,
-     896,     0,     0,     0,     0,   941,   938,    55,     0,    54,
-       0,   610,   615,     0,   694,   893,     0,     0,   235,     0,
-       0,     0,     0,   288,   291,   292,   293,   294,   295,   296,
-     297,   298,   299,     0,   305,   306,     0,     0,     0,     0,
-     255,     0,   250,     0,   387,     0,   538,     0,   577,   530,
-     502,   503,   504,   486,   487,   507,   508,   509,   510,   511,
-     528,   489,   490,   512,   513,   514,   515,   516,   517,   518,
-     519,   520,   521,   522,   523,   524,   525,   526,   527,   529,
-     483,   484,   485,   498,   499,   500,   501,   495,   496,   497,
-       0,   480,   488,   505,   506,   491,   492,   493,   494,   476,
-     318,   728,   730,     0,     0,   722,   723,   724,   725,   726,
-     727,   715,   716,   720,   721,   717,   718,   719,     0,   706,
-     707,   710,   711,   712,   713,   714,   701,     0,   645,     0,
-     349,   376,   377,   378,   379,   380,   381,   368,   341,   342,
-     343,   333,     0,     0,     0,   771,     0,   772,     0,   747,
-       0,   742,   845,     0,   848,     0,   837,   915,     0,   913,
-     911,   905,   909,   910,     0,   902,   907,   908,   906,   898,
-     947,   948,   949,   950,   940,    52,    57,     0,   614,     0,
-     240,   242,   281,   283,   285,   287,   302,   303,   304,   301,
-     308,   310,   312,   314,   253,   390,   541,   580,   482,   479,
-       0,     0,     0,     0,   704,   709,   648,   352,   764,   765,
-     766,   763,   768,   770,     0,   775,   745,   847,   850,     0,
-       0,     0,   904,   901,    56,   617,   697,   481,     0,     0,
-     732,   733,   708,   804,   807,   809,   811,   803,   802,   801,
-       0,   794,   797,   798,   799,   800,   780,     0,   776,   777,
-       0,   912,     0,   903,   729,   731,     0,     0,     0,     0,
-     796,   793,     0,   774,   779,     0,   914,     0,     0,     0,
-       0,   795,   790,   789,   785,   787,   788,     0,   782,   786,
-     778,   920,     0,   917,   806,   805,   808,   810,   813,     0,
-     784,   781,     0,   919,   916,   818,     0,   814,   815,     0,
-     783,   930,     0,     0,     0,   935,     0,   922,   925,   926,
-     927,   928,   929,   918,     0,   812,   817,   791,     0,     0,
-       0,     0,     0,   924,   921,   830,   832,   829,   823,   825,
-     827,   828,     0,   820,   824,   826,   816,     0,   932,   933,
-     934,     0,   923,     0,     0,   822,   819,   931,   936,     0,
-       0,   821,   831,   833
+       0,   256,   231,   244,     0,   246,   251,     0,   383,   388,
+     544,   532,   539,   583,   573,   578,     0,   472,   477,   319,
+     316,   719,   716,   713,   665,   655,   660,     0,   345,   350,
+       0,     0,     0,     0,     0,     0,   369,   366,     0,     0,
+       0,   334,   331,     0,     0,     0,     0,     0,     0,     0,
+     762,   750,     0,   752,   757,     0,     0,     0,     0,   852,
+     849,   866,     0,   913,   910,     0,     0,     0,     0,   955,
+     952,    55,     0,    54,     0,   610,   615,     0,   708,   907,
+       0,     0,   235,     0,     0,     0,     0,   288,   291,   292,
+     293,   294,   295,   296,   297,   298,   299,     0,   305,   306,
+       0,     0,     0,     0,   255,     0,   250,     0,   387,     0,
+     538,     0,   577,   530,   502,   503,   504,   486,   487,   507,
+     508,   509,   510,   511,   528,   489,   490,   512,   513,   514,
+     515,   516,   517,   518,   519,   520,   521,   522,   523,   524,
+     525,   526,   527,   529,   483,   484,   485,   498,   499,   500,
+     501,   495,   496,   497,     0,   480,   488,   505,   506,   491,
+     492,   493,   494,   476,   318,   742,   744,     0,     0,   736,
+     737,   738,   739,   740,   741,   729,   730,   734,   735,   731,
+     732,   733,     0,   720,   721,   724,   725,   726,   727,   728,
+     715,     0,   659,     0,   349,   376,   377,   378,   379,   380,
+     381,   368,   341,   342,   343,   333,     0,     0,     0,   785,
+       0,   786,     0,   761,     0,   756,   859,     0,   862,     0,
+     851,   929,     0,   927,   925,   919,   923,   924,     0,   916,
+     921,   922,   920,   912,   961,   962,   963,   964,   954,    52,
+      57,     0,   614,     0,   240,   242,   281,   283,   285,   287,
+     302,   303,   304,   301,   308,   310,   312,   314,   253,   390,
+     541,   580,   482,   479,     0,     0,     0,     0,   718,   723,
+     662,   352,   778,   779,   780,   777,   782,   784,     0,   789,
+     759,   861,   864,     0,     0,     0,   918,   915,    56,   617,
+     711,   481,     0,     0,   746,   747,   722,   818,   821,   823,
+     825,   817,   816,   815,     0,   808,   811,   812,   813,   814,
+     794,     0,   790,   791,     0,   926,     0,   917,   743,   745,
+       0,     0,     0,     0,   810,   807,     0,   788,   793,     0,
+     928,     0,     0,     0,     0,   809,   804,   803,   799,   801,
+     802,     0,   796,   800,   792,   934,     0,   931,   820,   819,
+     822,   824,   827,     0,   798,   795,     0,   933,   930,   832,
+       0,   828,   829,     0,   797,   944,     0,     0,     0,   949,
+       0,   936,   939,   940,   941,   942,   943,   932,     0,   826,
+     831,   805,     0,     0,     0,     0,     0,   938,   935,   844,
+     846,   843,   837,   839,   841,   842,     0,   834,   838,   840,
+     830,     0,   946,   947,   948,     0,   937,     0,     0,   836,
+     833,   945,   950,     0,     0,   835,   845,   847
   };
 
   const short
   Dhcp4Parser::yypgoto_[] =
   {
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393,   -59, -1393,  -614, -1393,   564,
-   -1393, -1393, -1393, -1393, -1393, -1393,  -651, -1393, -1393, -1393,
-     -67, -1393, -1393, -1393, -1393, -1393, -1393, -1393,   545,   757,
-      16,    31,    33,   -26,   -13,    13,    41,    44,    51,    54,
-   -1393, -1393, -1393, -1393,    56, -1393, -1393,    59,    62,    64,
-      66,    69,    74, -1393, -1393,    76, -1393,    77, -1393,    79,
-      81,    82, -1393, -1393,    84,    87,    89,    92,    94, -1393,
-      97, -1393,    99, -1393, -1393, -1393, -1393, -1393,    43, -1393,
-   -1393, -1393,   548,   751, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393,   269, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393,   467, -1393,   242, -1393,  -724,   249, -1393, -1393,
-   -1392, -1393, -1386, -1393, -1393, -1393, -1393,   -63, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393,  -756, -1393,  -755, -1393,  -752, -1393, -1393,
-   -1393, -1393, -1393, -1393,   232, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393,   212, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393,   227, -1393, -1393, -1393,   231,   719, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,   228, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1035, -1393, -1393, -1393,   245, -1393, -1393, -1393,   254,
-     760, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1033,
-   -1393,   -29, -1393,   -18, -1393,     5, -1393,    71, -1393,   100,
-     102,   104, -1393, -1393, -1393, -1393, -1393,   251, -1393, -1393,
-       6,   -60, -1393, -1393, -1393, -1393, -1393,   258, -1393, -1393,
-   -1393,   261, -1393,   742, -1393,   -34, -1393, -1393, -1393, -1393,
-   -1393,   -27, -1393, -1393, -1393, -1393, -1393,   -32, -1393, -1393,
-   -1393,   259, -1393, -1393, -1393,   263, -1393,   741, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393,   207, -1393, -1393, -1393,   216,   776, -1393, -1393,
-   -1393,   -44, -1393,     3, -1393,   -56, -1393, -1393, -1393,   262,
-   -1393, -1393, -1393,   268, -1393,   773,   -48, -1393,    -7, -1393,
-      15, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1032, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393,   274, -1393, -1393, -1393,
-      28, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393,   244, -1393,   247,   257, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393,   -20, -1393, -1393,   -53, -1393, -1393, -1393, -1393,
-   -1393,   -15, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393,   -76, -1393, -1393,   -95, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,   260, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393,   578,   769, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393,   620,   768, -1393, -1393, -1393, -1393,
-   -1393, -1393,   267, -1393, -1393,    36, -1393, -1393, -1393, -1393,
-   -1393, -1393,   -25, -1393, -1393,   -62, -1393, -1393, -1393, -1393,
-   -1393, -1393, -1393, -1393, -1393, -1393,   266, -1393, -1393, -1393,
-   -1393
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401,   -59, -1401,  -628, -1401,   605,
+   -1401, -1401, -1401, -1401, -1401, -1401,  -665, -1401, -1401, -1401,
+     -67, -1401, -1401, -1401, -1401, -1401, -1401, -1401,   587,   805,
+      16,    31,    33,   -26,    84,    86,    87,    89,    91,    92,
+   -1401, -1401, -1401, -1401,    94, -1401, -1401,    97,   102,   -13,
+      13,    41,    51, -1401, -1401,    53, -1401,    56, -1401,    59,
+     104,    64, -1401, -1401,    66,    69,    74,    76,    79, -1401,
+      81, -1401,   105, -1401, -1401, -1401, -1401, -1401,    43, -1401,
+   -1401, -1401,   594,   802, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401,   312, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,   512, -1401,   295, -1401,  -738,   298, -1401, -1401,
+   -1400, -1401, -1370, -1401, -1401, -1401, -1401,   -63, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401,  -770, -1401,  -769, -1401,  -766, -1401, -1401,
+   -1401, -1401, -1401, -1401,   279, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401,   255, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401,   275, -1401, -1401, -1401,   280,   767, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,   270, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1049, -1401, -1401, -1401,   300, -1401, -1401, -1401,   310,
+     808, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1047,
+   -1401,   -29, -1401,   -18, -1401,    -4, -1401,     5, -1401,   107,
+     110,   112, -1401, -1401, -1401, -1401, -1401,   301, -1401, -1401,
+      58,   -60, -1401, -1401, -1401, -1401, -1401,   311, -1401, -1401,
+   -1401,   314, -1401,   785, -1401,   -34, -1401, -1401, -1401, -1401,
+   -1401,   -27, -1401, -1401, -1401, -1401, -1401,   -32, -1401, -1401,
+   -1401,   315, -1401, -1401, -1401,   319, -1401,   784, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,   249, -1401, -1401, -1401,   259,   830, -1401, -1401,
+   -1401,   -44, -1401,     3, -1401,   -56, -1401, -1401, -1401,   313,
+   -1401, -1401, -1401,   320, -1401,   814,   -48, -1401,    -7, -1401,
+      15, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1046, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401,   323, -1401, -1401, -1401,
+      68, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401,   316, -1401,   321,   302, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401,    19, -1401, -1401,     1, -1401, -1401, -1401, -1401,
+   -1401,    26, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401,   -22, -1401, -1401,   -41, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,   317, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401,   640,   831, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401,   674,   836, -1401, -1401, -1401, -1401,
+   -1401, -1401,   322, -1401, -1401,    93, -1401, -1401, -1401, -1401,
+   -1401, -1401,    21, -1401, -1401,   -12, -1401, -1401, -1401, -1401,
+   -1401, -1401, -1401, -1401, -1401, -1401,   326, -1401, -1401, -1401,
+   -1401
   };
 
   const short
   Dhcp4Parser::yydefgoto_[] =
   {
        0,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    36,    37,    38,    65,   762,
-      82,    83,    39,    64,    79,    80,   779,  1000,  1108,  1109,
-     853,    41,    66,    85,   444,    86,    43,    67,   160,   161,
+      23,    24,    25,    26,    27,    36,    37,    38,    65,   776,
+      82,    83,    39,    64,    79,    80,   793,  1014,  1122,  1123,
+     867,    41,    66,    85,   458,    86,    43,    67,   160,   161,
      162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
-     172,   173,   472,   174,   175,   492,   176,   177,   178,   179,
-     180,   181,   182,   478,   748,   183,   479,   184,   480,   185,
-     186,   187,   493,   759,   188,   189,   190,   191,   192,   511,
-     193,   512,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   448,   241,   242,    45,    68,   243,   521,   244,   522,
-     782,   245,   523,   785,   246,   247,   248,   249,   203,   458,
-     204,   449,   828,   829,   830,  1012,   831,  1013,   205,   459,
-     206,   460,   880,   881,   882,  1040,   854,   855,   856,  1016,
-     857,  1017,   858,  1018,   859,  1019,   860,   861,   560,   862,
-     863,   864,   865,   866,   867,   868,   869,   870,   871,  1030,
-    1289,   872,   873,   874,  1033,   875,  1034,   876,  1035,   877,
-    1036,   207,   500,   904,   905,   906,   907,   908,   909,   910,
-     208,   506,   940,   941,   942,   943,   944,   209,   503,   919,
-     920,   921,  1063,    59,    75,   408,   409,   410,   575,   411,
-     576,   210,   504,   928,   929,   930,   931,   932,   933,   934,
-     935,   211,   488,   884,   885,   886,  1043,    47,    69,   295,
-     296,   297,   534,   298,   530,   299,   531,   300,   532,   301,
-     535,   302,   540,   303,   537,   304,   538,   305,   539,   212,
-     213,   214,   309,   215,   494,   896,   897,   898,  1052,  1190,
-    1191,   216,   489,    53,    72,   888,   889,   890,  1046,    55,
-      73,   369,   370,   371,   372,   373,   374,   375,   559,   376,
-     563,   377,   562,   378,   379,   564,   380,   217,   490,   892,
-     893,   894,  1049,    57,    74,   392,   393,   394,   395,   396,
-     568,   397,   398,   399,   400,   401,   402,   572,   311,   533,
-    1002,  1003,  1004,  1110,    49,    70,   327,   328,   329,   544,
-     330,   218,   495,   219,   496,   220,   502,   915,   916,   917,
-    1060,    51,    71,   345,   346,   347,   221,   453,   222,   454,
-     223,   455,   351,   549,   352,   550,   353,   551,   354,   553,
-     355,   552,   356,   555,   357,   554,   358,   548,   318,   541,
-    1006,  1007,  1113,   224,   501,   912,   913,  1057,  1218,  1219,
-    1220,  1221,  1222,  1300,  1223,  1301,  1224,  1225,   225,   226,
-     507,   227,   508,   970,   971,   972,  1088,   960,   961,   962,
-    1079,  1311,   963,  1080,   964,  1081,   965,   966,   967,  1085,
-    1347,  1348,  1349,  1362,  1377,  1378,  1379,  1389,   968,  1083,
-    1340,  1341,  1342,  1356,  1385,  1343,  1357,  1344,  1358,  1345,
-    1359,  1396,  1397,  1398,  1414,  1432,  1433,  1434,  1443,  1435,
-    1444,   228,   509,   979,   980,   981,   982,  1092,   983,   984,
-    1094,   229,   510,    61,    76,   423,   424,   425,   426,   580,
-     427,   428,   582,   429,   430,   431,   585,   819,   432,   586,
-     230,   447,    63,    77,   435,   436,   437,   589,   438,   231,
-     516,   987,   988,  1098,  1264,  1265,  1266,  1267,  1321,  1268,
-    1319,  1382,  1383,  1392,  1406,  1407,  1408,  1418,  1409,  1410,
-    1411,  1412,  1422,   232,   517,   994,   995,   996,   997,   998,
-     999
+     172,   173,   486,   174,   175,   506,   176,   177,   178,   179,
+     180,   181,   182,   492,   762,   183,   493,   184,   494,   185,
+     186,   187,   507,   773,   188,   189,   190,   191,   192,   525,
+     193,   526,   194,   195,   196,   197,   198,   199,   200,   201,
+     202,   462,   241,   242,    45,    68,   243,   535,   244,   536,
+     796,   245,   537,   799,   246,   247,   248,   249,   203,   472,
+     204,   463,   842,   843,   844,  1026,   845,  1027,   205,   473,
+     206,   474,   894,   895,   896,  1054,   868,   869,   870,  1030,
+     871,  1031,   872,  1032,   873,  1033,   874,   875,   574,   876,
+     877,   878,   879,   880,   881,   882,   883,   884,   885,  1044,
+    1303,   886,   887,   888,  1047,   889,  1048,   890,  1049,   891,
+    1050,   207,   514,   918,   919,   920,   921,   922,   923,   924,
+     208,   520,   954,   955,   956,   957,   958,   209,   517,   933,
+     934,   935,  1077,    59,    75,   422,   423,   424,   589,   425,
+     590,   210,   518,   942,   943,   944,   945,   946,   947,   948,
+     949,   211,   502,   898,   899,   900,  1057,    47,    69,   295,
+     296,   297,   548,   298,   544,   299,   545,   300,   546,   301,
+     549,   302,   554,   303,   551,   304,   552,   305,   553,   212,
+     213,   214,   309,   215,   508,   910,   911,   912,  1066,  1204,
+    1205,   216,   503,    53,    72,   902,   903,   904,  1060,    55,
+      73,   383,   384,   385,   386,   387,   388,   389,   573,   390,
+     577,   391,   576,   392,   393,   578,   394,   217,   504,   906,
+     907,   908,  1063,    57,    74,   406,   407,   408,   409,   410,
+     582,   411,   412,   413,   414,   415,   416,   586,   311,   547,
+    1016,  1017,  1018,  1124,    49,    70,   341,   342,   343,   558,
+     344,   218,   509,   219,   510,   220,   516,   929,   930,   931,
+    1074,    51,    71,   359,   360,   361,   221,   467,   222,   468,
+     223,   469,   365,   563,   366,   564,   367,   565,   368,   567,
+     369,   566,   370,   569,   371,   568,   372,   562,   318,   555,
+    1020,  1021,  1127,   224,   515,   926,   927,  1071,  1232,  1233,
+    1234,  1235,  1236,  1314,  1237,  1315,  1238,  1239,   225,   226,
+     521,   227,   522,   984,   985,   986,  1102,   974,   975,   976,
+    1093,  1325,   977,  1094,   978,  1095,   979,   980,   981,  1099,
+    1361,  1362,  1363,  1376,  1391,  1392,  1393,  1403,   982,  1097,
+    1354,  1355,  1356,  1370,  1399,  1357,  1371,  1358,  1372,  1359,
+    1373,  1410,  1411,  1412,  1428,  1446,  1447,  1448,  1457,  1449,
+    1458,   228,   523,   993,   994,   995,   996,  1106,   997,   998,
+    1108,   229,   524,    61,    76,   437,   438,   439,   440,   594,
+     441,   442,   596,   443,   444,   445,   599,   833,   446,   600,
+     230,   461,    63,    77,   449,   450,   451,   603,   452,   231,
+     530,  1001,  1002,  1112,  1278,  1279,  1280,  1281,  1335,  1282,
+    1333,  1396,  1397,  1406,  1420,  1421,  1422,  1432,  1423,  1424,
+    1425,  1426,  1436,   232,   531,  1008,  1009,  1010,  1011,  1012,
+    1013
   };
 
   const short
   Dhcp4Parser::yytable_[] =
   {
-     159,   240,   264,   321,   341,    78,   367,   388,   407,   420,
-     368,   389,   359,   314,   955,   956,   878,  1181,   957,  1182,
-    1198,   315,  1428,   348,   250,   312,   331,   343,  1429,   381,
-     403,   761,   421,   792,   793,   794,   817,   310,   326,   342,
-     390,   322,   798,   268,    29,   361,    30,   391,    31,   445,
-     405,   406,   323,  1428,   446,   519,   269,    28,  1055,  1429,
-     520,  1056,   316,   812,   349,   135,   136,   743,   744,   745,
-     746,   251,   313,   332,   344,   324,   382,   404,   361,   422,
-     433,   434,   270,    81,   317,   265,   350,   233,   234,  1058,
-      40,   235,  1059,   129,   236,   237,   238,   239,   135,   136,
-     266,  1099,   267,   761,  1100,    84,   747,   849,   850,   851,
-     271,   439,   294,   272,   528,   989,   990,   991,   992,   529,
-     273,   542,   546,   274,   577,   275,   543,   547,   276,   578,
-      42,   277,   158,   278,   158,   279,    44,   587,   280,   591,
-      46,   325,   588,   281,   592,   282,   283,    48,   284,    50,
-     285,   286,  1257,   287,  1258,  1259,   288,   519,   289,  1372,
-      52,   290,  1009,   291,   135,   136,   292,   591,   293,   306,
-     528,   307,  1010,   308,  1014,  1011,    54,    87,   158,  1015,
-      88,  1401,    56,  1037,  1402,  1403,  1404,  1405,  1038,   135,
-     136,  1393,    89,   440,  1394,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,    58,  1037,    60,   947,
-     818,   158,  1039,   948,   949,   950,   951,  1072,    62,  1333,
-    1077,  1086,  1073,   952,   953,  1078,  1087,   833,   834,   441,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,   110,
-     111,   112,   113,   114,   115,   116,   117,   118,   119,   120,
-     121,   122,   123,   124,   125,   126,   127,   128,   443,  1095,
-     442,   129,   130,  1181,  1096,  1182,  1198,   780,   781,    32,
-      33,    34,    35,   131,   132,   133,   587,   158,   360,   556,
-     134,  1097,  1105,   135,   136,   405,   406,  1106,   137,   138,
-     139,   140,   141,  1037,   542,  1298,   135,   136,  1294,  1295,
-    1299,   142,   158,   135,   136,   783,   784,    93,    94,    95,
-      96,   143,   450,   451,   144,   577,  1141,   135,   136,  1086,
-    1307,   145,   146,  1322,  1316,   452,   147,   148,  1323,   456,
-     955,   956,   955,   956,   957,   361,   957,   362,   363,   101,
-     102,   103,   364,   365,   366,   149,   457,   135,   136,   150,
-    1334,  1335,  1336,   826,   827,   135,   136,   936,   937,   938,
-    1425,  1426,   595,   461,   151,   152,   153,   154,   155,   156,
-     129,   130,   361,   462,   899,   900,   901,   902,   157,   903,
-     463,   593,   594,   464,    91,    92,    93,    94,    95,    96,
-     546,   557,   135,   136,   465,  1325,   158,   922,   923,   924,
-     925,   926,   927,  1360,  1201,  1202,  1203,  1204,  1361,   158,
-     973,   974,   975,  1286,  1287,  1288,   158,   466,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   467,   468,
-     158,   469,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   470,   471,  1390,  1423,
-     130,   361,   159,  1391,  1424,   755,   756,   757,   758,  1445,
-     976,   240,   132,   133,  1446,  1308,  1309,  1310,   158,   473,
-     474,   135,   136,   475,   257,   264,   137,   138,   139,   321,
-     259,   260,   261,   476,   250,   477,   314,   262,   481,   482,
-     341,   483,   484,   485,   315,   486,   487,   263,   312,   491,
-     367,   497,   331,   498,   368,   158,   499,   388,   505,   348,
-     310,   389,   513,   343,   326,   514,   268,   322,   515,   518,
-     420,   524,   525,   381,   526,   342,   527,   536,   323,   269,
-     403,   251,   545,   558,   561,   316,   565,   566,   567,   573,
-     390,   569,   570,   421,   571,   313,   574,   391,   579,   332,
-     349,   324,   151,   152,   581,   270,   583,   317,   265,   584,
-     344,   590,   600,   596,   597,   598,   599,   601,   602,   603,
-     382,   604,   350,   266,   605,   267,   607,   404,   606,   608,
-     609,   610,   611,   271,   158,   294,   272,   612,   613,   622,
-     422,   614,   615,   273,   620,   616,   274,   617,   275,   618,
-     619,   276,   621,   623,   277,   624,   278,   628,   279,   629,
-     625,   280,   630,    93,    94,    95,   281,   325,   282,   283,
-     638,   284,   626,   285,   286,   627,   287,   631,  1326,   288,
-     632,   289,   130,   633,   290,   634,   291,   635,   636,   292,
-     639,   293,   306,   637,   307,   640,   308,   641,   642,   643,
-     644,   645,   319,   135,   136,   361,   383,   362,   363,   384,
-     385,   386,   259,   260,   261,   159,   646,   240,   647,   262,
-     320,   648,   822,   649,   650,   135,   136,   130,   651,   652,
-     653,   654,   655,   656,   387,   657,   658,   659,   660,   661,
-     250,   135,   136,   662,   663,   664,   665,   666,   135,   136,
-     667,   669,   939,   954,   670,   671,   420,   333,   672,   673,
-     993,   674,   677,   675,   678,   679,   680,   334,   335,   336,
-     337,   338,   339,   340,   681,   945,   958,   682,   977,   421,
-     684,   683,   685,   686,   687,   688,   690,   251,   691,   693,
-     694,   695,   696,    91,    92,    93,    94,    95,    96,   697,
-     698,   699,   700,   702,   703,   704,   705,   706,   412,   413,
-     414,   415,   416,   417,   418,   419,   158,   707,   710,   714,
-     716,   717,   946,   959,   708,   978,   422,   101,   102,   103,
-     104,   105,   106,   107,   108,   109,   110,   711,   158,   712,
-     720,   115,   116,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,   127,   158,   252,   253,   254,   722,   130,
-     725,   158,   713,   719,   721,   723,   726,   724,   728,   729,
-     731,   132,   133,   736,   737,   732,   733,   734,   255,   735,
-     135,   136,   256,   257,   258,   137,   138,   139,   739,   259,
-     260,   261,   738,   740,   741,   742,   262,   749,   142,   750,
-     751,   752,   753,   754,   760,    30,   263,   832,   833,   834,
-     835,   836,   837,   838,   839,   840,   841,   842,   843,   844,
-     845,   846,   763,   764,   765,   847,   848,   849,   850,   851,
-     852,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,   766,   767,   774,   775,   768,   769,
-     770,   771,   772,   776,   773,   778,   777,   789,   786,   821,
-     787,   151,   152,   796,   361,   820,   788,   790,   791,   879,
-     795,   797,   799,   883,   800,   801,   887,   891,   802,   803,
-     895,   911,   804,   805,   806,   807,   808,   809,   914,   810,
-     918,   969,   986,   158,   811,   813,   815,   816,  1001,  1005,
-    1020,  1021,  1022,  1023,  1024,  1025,  1026,  1027,  1028,  1029,
-    1031,  1032,  1042,  1107,  1041,  1045,  1044,  1047,  1048,  1050,
-    1051,  1054,  1053,  1062,  1123,  1061,   264,  1064,  1065,   367,
-    1066,  1067,   388,   368,  1068,  1149,   389,   314,  1069,  1180,
-    1205,  1070,  1071,   341,  1210,   315,   407,  1211,  1074,   312,
-    1075,  1076,   381,  1082,  1195,   403,  1084,  1089,  1193,  1215,
-     939,   310,   348,  1213,  1090,   390,   343,   268,  1091,   954,
-    1192,   954,   391,  1183,  1093,  1212,  1153,  1101,   342,  1102,
-     269,  1260,  1103,   945,  1184,  1261,   316,  1104,   993,  1154,
-    1111,  1112,   958,   321,   958,  1196,   313,   158,  1114,   382,
-    1216,   977,   404,   349,  1262,  1194,   270,  1185,   317,   265,
-    1214,  1115,  1116,   344,  1117,  1155,   331,  1197,  1150,  1119,
-    1120,  1121,  1217,  1206,   266,   350,   267,  1122,   326,  1133,
-     946,   322,  1125,  1151,   271,  1152,   294,   272,  1207,   959,
-    1208,   959,   323,  1156,   273,  1179,  1157,   274,   978,   275,
-    1209,  1263,   276,  1158,  1124,   277,  1159,   278,  1160,   279,
-    1126,  1161,   280,   332,  1162,   324,  1163,   281,  1164,   282,
-     283,  1165,   284,  1186,   285,   286,  1166,   287,  1167,  1168,
-     288,  1169,   289,  1170,  1171,   290,  1172,   291,  1127,  1173,
-     292,  1174,   293,   306,  1175,   307,  1176,   308,  1128,  1177,
-    1136,  1178,  1187,  1129,  1188,  1137,  1189,  1130,  1131,  1132,
-    1138,  1135,  1134,  1139,  1242,  1238,  1243,  1231,  1232,  1233,
-    1234,  1235,  1244,  1236,  1239,  1240,  1245,  1246,  1248,  1253,
-    1255,   325,  1276,  1275,  1279,  1384,  1296,  1302,  1303,  1297,
-    1304,  1305,  1363,  1306,  1314,  1315,  1318,  1247,  1320,  1328,
-    1329,  1350,  1352,  1364,  1254,  1252,  1346,  1270,  1365,  1367,
-    1368,  1271,  1272,  1280,  1273,  1281,  1282,  1369,  1370,  1283,
-    1284,  1285,  1290,  1291,  1381,  1292,  1388,  1395,  1293,  1399,
-    1312,  1149,  1415,  1313,  1317,  1180,  1324,  1416,  1205,  1354,
-    1330,  1331,  1210,  1351,  1419,  1211,  1355,  1337,  1366,  1386,
-    1195,  1387,  1417,  1420,  1193,  1260,  1421,  1215,  1437,  1261,
-    1438,  1213,  1439,  1440,  1441,  1447,  1192,  1448,  1449,  1183,
-    1338,  1450,  1153,  1212,  1452,  1453,   668,   823,  1262,   676,
-    1184,   814,   825,  1118,  1142,  1154,  1140,  1200,  1008,  1241,
-    1144,  1196,  1230,  1337,  1229,  1373,   718,  1143,  1216,  1374,
-    1237,  1194,   689,  1185,  1327,  1199,  1146,  1145,  1214,   709,
-    1148,  1155,  1147,  1197,  1150,   715,  1338,  1339,  1375,  1278,
-    1217,  1206,   692,  1373,  1228,  1263,  1277,  1374,  1227,  1151,
-     701,  1152,  1226,  1332,  1251,  1250,  1207,  1400,  1208,  1156,
-    1436,  1179,  1157,  1249,  1380,  1371,  1375,  1427,  1209,  1158,
-    1451,   985,  1159,   824,  1160,  1256,   727,  1161,  1353,   730,
-    1162,  1442,  1163,  1339,  1164,  1376,  1269,  1165,  1413,  1186,
-    1430,  1274,  1166,     0,  1167,  1168,     0,  1169,  1427,  1170,
-    1171,     0,  1172,     0,     0,  1173,     0,  1174,     0,     0,
-    1175,     0,  1176,  1376,     0,  1177,     0,  1178,  1187,     0,
-    1188,  1430,  1189,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,  1431,     0,     0,
+     159,   240,   264,   321,   355,    78,   381,   402,   421,   434,
+     382,   403,   373,   314,   969,   970,   892,  1195,   971,  1196,
+    1212,   315,    28,   362,   250,   312,   345,   357,  1442,   395,
+     417,   775,   435,   806,   807,   808,   831,   310,   340,   356,
+     404,   336,   812,   268,    29,   459,    30,   405,    31,    81,
+     460,    40,   337,   419,   420,    42,   278,   322,  1443,  1442,
+     375,    44,   316,   826,   363,   533,   338,   135,   136,   453,
+     534,   251,   313,   346,   358,   339,   396,   418,   375,   436,
+     135,   136,   279,   323,   317,   265,   364,   233,   234,  1443,
+    1347,   235,   447,   448,   236,   237,   238,   239,   135,   136,
+     266,   542,   267,   775,   419,   420,   543,   950,   951,   952,
+     280,   324,   294,   757,   758,   759,   760,   454,   374,   556,
+     281,   325,   282,   326,   557,   283,   327,   560,   284,   328,
+     794,   795,   561,   286,   329,   287,   330,   158,   288,   331,
+      46,  1386,   591,   289,   332,   290,   333,   592,   291,   334,
+     292,   335,   761,   269,   601,   270,   271,   605,   272,   602,
+     273,   274,   606,   275,    48,   533,   276,   135,   136,  1069,
+    1023,   277,  1070,   285,   293,   375,   306,   376,   377,   307,
+     158,   308,   378,   379,   380,  1271,   605,  1272,  1273,   135,
+     136,  1024,   542,   158,    84,   135,   136,  1025,    91,    92,
+      93,    94,    95,    96,  1028,   847,   848,   797,   798,  1029,
+     832,   158,  1003,  1004,  1005,  1006,    50,  1072,   129,  1051,
+    1073,  1348,  1349,  1350,  1052,   913,   914,   915,   916,   158,
+     917,    52,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,    54,    93,    94,    95,   115,   116,   117,   118,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,    56,
+     252,   253,   254,  1195,   130,  1196,  1212,    58,  1051,    32,
+      33,    34,    35,  1053,   840,   841,   132,   133,   135,   136,
+     158,   135,   136,   255,    60,   135,   136,   256,   257,   258,
+     137,   138,   139,  1086,   259,   260,   261,   455,  1087,  1091,
+    1100,   262,   158,   142,  1092,  1101,  1113,   130,   158,  1114,
+    1109,   263,   456,    62,  1415,  1110,  1155,  1416,  1417,  1418,
+    1419,   457,    91,    92,    93,    94,    95,    96,   135,   136,
+     969,   970,   969,   970,   971,   601,   971,   347,  1439,  1440,
+    1111,   987,   988,   989,  1300,  1301,  1302,   348,   349,   350,
+     351,   352,   353,   354,   464,   465,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   151,   152,   466,   470,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   471,  1119,   570,  1051,   130,   375,
+    1120,   990,  1308,   475,   158,   607,   608,   476,   158,   477,
+     132,   133,   375,   397,   376,   377,   398,   399,   400,   135,
+     136,   478,   257,   479,   137,   138,   139,   480,   259,   260,
+     261,   556,   135,   136,  1312,   262,  1309,   591,  1100,  1313,
+     481,   401,  1321,  1330,  1336,   263,   482,   560,  1374,  1337,
+    1404,   158,  1339,  1375,   483,  1405,   115,   116,   117,   118,
+     119,   120,   121,   484,   123,   124,   125,   126,   936,   937,
+     938,   939,   940,   941,   130,  1437,   159,  1459,  1407,   571,
+    1438,  1408,  1460,   485,   487,   240,   488,   133,   489,   769,
+     770,   771,   772,   490,   319,   135,   136,   491,   495,   264,
+     151,   152,   496,   321,   259,   260,   261,   497,   250,   498,
+     314,   262,   320,   499,   355,  1322,  1323,  1324,   315,   500,
+     501,   505,   312,   511,   381,   512,   345,   513,   382,   519,
+     527,   402,   158,   362,   310,   403,   528,   357,   340,   529,
+     268,   336,   532,   538,   434,   158,   539,   395,   540,   356,
+     541,   550,   337,   278,   417,   251,   559,   322,   572,   316,
+     575,   579,   580,   581,   404,   583,   338,   435,   584,   313,
+     585,   405,   588,   346,   363,   339,   151,   152,   587,   279,
+     593,   317,   265,   323,   358,   595,   597,   598,   604,   609,
+     610,   611,   612,   613,   396,   614,   364,   266,   615,   267,
+     616,   418,   617,   618,   619,   621,   622,   280,   158,   294,
+     623,   324,   135,   136,   436,   620,   624,   281,   625,   282,
+     626,   325,   283,   326,   627,   284,   327,   628,   629,   328,
+     286,   630,   287,   631,   329,   288,   330,   634,  1340,   331,
+     289,   632,   290,   633,   332,   291,   333,   292,   636,   334,
+     269,   335,   270,   271,   639,   272,   635,   273,   274,   640,
+     275,   637,   641,   276,   638,   642,   643,   644,   277,   647,
+     285,   293,   645,   306,   648,   652,   307,   649,   308,   426,
+     427,   428,   429,   430,   431,   432,   433,   646,   650,   159,
+     653,   240,   654,   651,   655,   656,   836,   846,   847,   848,
+     849,   850,   851,   852,   853,   854,   855,   856,   857,   858,
+     859,   860,   657,   658,   250,   861,   862,   863,   864,   865,
+     866,   659,   660,   661,   662,   158,   953,   968,   664,   663,
+     434,   665,   666,   667,  1007,     1,     2,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    87,   959,
+     972,    88,   991,   435,   375,   668,   670,   671,   669,   672,
+     673,   251,   674,    89,   675,   676,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   680,   677,   681,
+     683,   678,   679,   684,   685,   691,   686,   692,   687,   688,
+     689,   693,   694,   695,   696,   698,   960,   973,   697,   992,
+     436,   101,   102,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,   699,
+     700,   701,   129,   130,   702,   704,   705,   707,   708,   709,
+     710,   711,   712,   713,   131,   132,   133,   714,   716,   717,
+     718,   134,   719,   720,   135,   136,   721,   722,   724,   137,
+     138,   139,   140,   141,   725,   726,   727,   728,   863,   864,
+     865,   730,   142,   731,   733,   734,   735,   736,   737,   738,
+     739,   740,   143,   742,   743,   144,   745,   158,   746,   750,
+     747,   748,   145,   146,   749,   751,   752,   147,   148,   753,
+     754,   755,   756,   763,   764,   765,   766,   767,   768,   774,
+      30,   777,   778,   779,   780,   781,   149,   788,   782,   783,
+     150,   784,   785,   786,   789,   135,   136,   787,   790,   791,
+     792,   800,   801,   802,   803,   151,   152,   153,   154,   155,
+     156,   804,   805,   809,   810,   811,   813,   834,   835,   157,
+     814,   815,   816,   817,   893,   818,   819,   897,   901,   905,
+     820,   821,   822,   823,   824,   825,   827,   158,   829,   830,
+     961,   909,   925,   928,   962,   963,   964,   965,   932,   983,
+    1000,  1015,  1034,  1035,   966,   967,  1019,  1036,  1037,  1038,
+    1039,  1040,  1041,  1042,  1043,  1045,  1046,  1056,  1121,  1055,
+     264,  1058,  1059,   381,  1061,  1062,   402,   382,  1065,  1163,
+     403,   314,  1064,  1194,  1219,  1067,  1068,   355,  1224,   315,
+     421,  1225,  1075,   312,  1076,  1078,   395,  1079,  1209,   417,
+    1080,  1081,  1207,  1229,   953,   310,   362,  1227,   158,   404,
+     357,   268,  1082,   968,  1206,   968,   405,  1197,  1083,  1226,
+    1167,  1084,   356,  1085,   278,  1274,  1088,   959,  1198,  1275,
+     316,  1089,  1007,  1177,  1090,  1096,   972,   321,   972,  1210,
+     313,  1098,  1199,   396,  1230,   991,   418,   363,  1276,  1208,
+     279,  1200,   317,   265,  1228,  1103,  1104,   358,  1105,  1178,
+     345,  1211,  1164,  1107,  1115,  1116,  1231,  1220,   266,   364,
+     267,  1117,   340,  1118,   960,   336,  1125,  1165,   280,  1166,
+     294,  1126,  1221,   973,  1222,   973,   337,  1179,   281,  1193,
+     282,   322,   992,   283,  1223,  1277,   284,  1180,  1128,  1181,
+     338,   286,  1182,   287,  1129,  1183,   288,   346,  1130,   339,
+    1185,   289,  1186,   290,  1131,  1187,   291,   323,   292,  1133,
+    1188,   269,  1189,   270,   271,  1190,   272,  1191,   273,   274,
+    1168,   275,  1169,  1170,   276,  1171,  1134,  1172,  1173,   277,
+    1174,   285,   293,  1175,   306,   324,  1135,   307,  1176,   308,
+    1184,  1192,  1136,  1201,  1137,   325,  1202,   326,  1203,  1138,
+     327,  1139,  1140,   328,  1141,  1147,  1150,  1151,   329,  1142,
+     330,  1143,  1148,   331,  1152,  1153,  1144,  1145,   332,  1256,
+     333,  1146,  1149,   334,  1257,   335,  1258,  1260,  1262,  1267,
+    1332,  1269,  1289,  1290,  1329,  1293,  1310,  1245,  1246,  1316,
+    1311,  1247,  1248,  1317,  1249,  1250,  1318,  1319,  1320,  1253,
+    1252,  1254,  1259,  1328,  1334,  1261,  1268,  1266,  1342,  1343,
+    1284,  1285,  1294,  1286,  1360,  1163,  1287,  1364,  1295,  1194,
+    1296,  1297,  1219,  1298,  1299,  1304,  1224,  1305,  1366,  1225,
+    1306,  1351,  1307,  1326,  1209,  1327,  1331,  1377,  1207,  1274,
+    1338,  1229,  1378,  1275,  1344,  1227,  1345,  1365,  1368,  1369,
+    1206,  1379,  1380,  1197,  1352,  1381,  1167,  1226,  1382,  1383,
+    1384,  1398,  1276,  1400,  1198,  1395,  1401,  1402,  1409,  1177,
+    1413,  1429,  1430,  1452,  1433,  1210,  1431,  1351,  1199,  1387,
+    1434,  1435,  1230,  1388,  1451,  1208,  1453,  1200,  1455,  1454,
+    1463,  1461,  1228,  1462,  1464,  1178,  1466,  1211,  1164,  1467,
+    1352,  1353,  1389,   837,  1231,  1220,   828,  1387,   682,  1277,
+    1132,  1388,   839,  1165,   690,  1166,  1255,  1022,  1214,  1154,
+    1221,  1156,  1222,  1179,  1244,  1193,  1251,  1243,   732,  1158,
+    1389,  1441,  1223,  1180,   703,  1181,   723,  1157,  1182,  1213,
+    1341,  1183,   729,  1160,  1159,  1292,  1185,  1353,  1186,  1390,
+    1162,  1187,  1161,  1291,  1444,   715,  1188,  1346,  1189,  1242,
+     706,  1190,  1441,  1191,  1241,  1240,  1168,  1394,  1169,  1170,
+    1385,  1171,  1263,  1172,  1173,  1414,  1174,  1390,  1450,  1175,
+      93,    94,    95,    96,  1176,  1444,  1184,  1192,  1465,  1201,
+    1265,   838,  1202,  1264,  1203,  1456,  1270,   999,  1427,  1367,
+       0,  1445,   741,     0,     0,  1283,     0,     0,     0,     0,
+       0,   744,   101,   102,   103,  1288,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1445,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   129,   130,   375,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   135,   136,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1215,  1216,  1217,
+    1218,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1431
+       0,     0,     0,     0,     0,     0,     0,     0,   158
   };
 
   const short
   Dhcp4Parser::yycheck_[] =
   {
       67,    68,    69,    70,    71,    64,    73,    74,    75,    76,
-      73,    74,    72,    69,   770,   770,   740,  1052,   770,  1052,
-    1052,    69,  1414,    71,    68,    69,    70,    71,  1414,    73,
-      74,   645,    76,   684,   685,   686,    18,    69,    70,    71,
-      74,    70,   693,    69,     5,    97,     7,    74,     9,     3,
-     146,   147,    70,  1445,     8,     3,    69,     0,     3,  1445,
-       8,     6,    69,   714,    71,   117,   118,   194,   195,   196,
-     197,    68,    69,    70,    71,    70,    73,    74,    97,    76,
-      12,    13,    69,   230,    69,    69,    71,    15,    16,     3,
-       7,    19,     6,    95,    22,    23,    24,    25,   117,   118,
-      69,     3,    69,   717,     6,    10,   233,    60,    61,    62,
-      69,     6,    69,    69,     3,   213,   214,   215,   216,     8,
-      69,     3,     3,    69,     3,    69,     8,     8,    69,     8,
-       7,    69,   230,    69,   230,    69,     7,     3,    69,     3,
-       7,    70,     8,    69,     8,    69,    69,     7,    69,     7,
-      69,    69,   204,    69,   206,   207,    69,     3,    69,   178,
-       7,    69,     8,    69,   117,   118,    69,     3,    69,    69,
-       3,    69,     8,    69,     3,     8,     7,    11,   230,     8,
-      14,   205,     7,     3,   208,   209,   210,   211,     8,   117,
-     118,     3,    26,     3,     6,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,     7,     3,     7,   162,
-     192,   230,     8,   166,   167,   168,   169,     3,     7,    40,
-       3,     3,     8,   176,   177,     8,     8,    41,    42,     4,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,     3,     3,
-       8,    95,    96,  1298,     8,  1298,  1298,    17,    18,   230,
-     231,   232,   233,   107,   108,   109,     3,   230,    40,     8,
-     114,     8,     3,   117,   118,   146,   147,     8,   122,   123,
-     124,   125,   126,     3,     3,     3,   117,   118,     8,     8,
-       8,   135,   230,   117,   118,    20,    21,    32,    33,    34,
-      35,   145,     4,     4,   148,     3,  1040,   117,   118,     3,
-       8,   155,   156,     3,     8,     4,   160,   161,     8,     4,
-    1086,  1086,  1088,  1088,  1086,    97,  1088,    99,   100,    64,
-      65,    66,   104,   105,   106,   179,     4,   117,   118,   183,
-     171,   172,   173,    27,    28,   117,   118,   157,   158,   159,
-     174,   175,   230,     4,   198,   199,   200,   201,   202,   203,
-      95,    96,    97,     4,   137,   138,   139,   140,   212,   142,
-       4,   440,   441,     4,    30,    31,    32,    33,    34,    35,
-       3,     3,   117,   118,     4,     8,   230,   149,   150,   151,
-     152,   153,   154,     3,   129,   130,   131,   132,     8,   230,
-     180,   181,   182,    55,    56,    57,   230,     4,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,     4,     4,
-     230,     4,    78,    79,    80,    81,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,     4,     4,     3,     3,
-      96,    97,   519,     8,     8,   110,   111,   112,   113,     3,
-     230,   528,   108,   109,     8,   163,   164,   165,   230,     4,
-       4,   117,   118,     4,   120,   542,   122,   123,   124,   546,
-     126,   127,   128,     4,   528,     4,   542,   133,     4,     4,
-     557,     4,     4,     4,   542,     4,     4,   143,   542,     4,
-     567,     4,   546,     4,   567,   230,     4,   574,     4,   557,
-     542,   574,     4,   557,   546,     4,   542,   546,     4,     4,
-     587,     4,     4,   567,     4,   557,     4,     4,   546,   542,
-     574,   528,     4,     8,     4,   542,     4,     8,     3,     8,
-     574,     4,     4,   587,     4,   542,     3,   574,     4,   546,
-     557,   546,   198,   199,     4,   542,     4,   542,   542,     4,
-     557,     4,   233,     4,     4,     4,     4,   233,   233,     4,
-     567,     4,   557,   542,     4,   542,   233,   574,   231,     4,
-       4,     4,   231,   542,   230,   542,   542,   231,   231,     4,
-     587,   231,   231,   542,   231,   233,   542,   232,   542,   232,
-     232,   542,   231,   231,   542,   231,   542,     4,   542,     4,
-     233,   542,     4,    32,    33,    34,   542,   546,   542,   542,
-       4,   542,   233,   542,   542,   233,   542,   233,  1279,   542,
-     233,   542,    96,   232,   542,   231,   542,   231,   231,   542,
-       4,   542,   542,   233,   542,     4,   542,   231,     4,     4,
-       4,     4,   116,   117,   118,    97,    98,    99,   100,   101,
-     102,   103,   126,   127,   128,   732,     4,   734,   233,   133,
-     134,   233,   731,   233,     4,   117,   118,    96,     4,     4,
-       4,     4,   231,     4,   126,     4,     4,     4,     4,     4,
-     734,   117,   118,     4,   233,   233,   233,     4,   117,   118,
-       4,     4,   769,   770,     4,     4,   773,   126,   233,   233,
-     777,   231,     4,   231,     4,     4,     4,   136,   137,   138,
-     139,   140,   141,   142,     4,   769,   770,     4,   772,   773,
-       4,   231,     4,     4,     4,     4,     4,   734,   231,     4,
-       4,     4,     4,    30,    31,    32,    33,    34,    35,     4,
-       4,     4,     4,     4,     4,   231,     4,     4,   184,   185,
-     186,   187,   188,   189,   190,   191,   230,     4,     4,     4,
-       4,     4,   769,   770,   233,   772,   773,    64,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,   233,   230,   233,
-       4,    78,    79,    80,    81,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,   230,    92,    93,    94,     4,    96,
-       4,   230,   233,   233,   231,   231,     4,   231,     4,   231,
-       4,   108,   109,   230,   230,     7,     7,     7,   115,     7,
-     117,   118,   119,   120,   121,   122,   123,   124,     7,   126,
-     127,   128,   230,     7,     5,   230,   133,   230,   135,   230,
-       5,     5,     5,   230,     5,     7,   143,    40,    41,    42,
+      73,    74,    72,    69,   784,   784,   754,  1066,   784,  1066,
+    1066,    69,     0,    71,    68,    69,    70,    71,  1428,    73,
+      74,   659,    76,   698,   699,   700,    18,    69,    70,    71,
+      74,    70,   707,    69,     5,     3,     7,    74,     9,   230,
+       8,     7,    70,   146,   147,     7,    69,    70,  1428,  1459,
+      97,     7,    69,   728,    71,     3,    70,   117,   118,     6,
+       8,    68,    69,    70,    71,    70,    73,    74,    97,    76,
+     117,   118,    69,    70,    69,    69,    71,    15,    16,  1459,
+      40,    19,    12,    13,    22,    23,    24,    25,   117,   118,
+      69,     3,    69,   731,   146,   147,     8,   157,   158,   159,
+      69,    70,    69,   194,   195,   196,   197,     3,    40,     3,
+      69,    70,    69,    70,     8,    69,    70,     3,    69,    70,
+      17,    18,     8,    69,    70,    69,    70,   230,    69,    70,
+       7,   178,     3,    69,    70,    69,    70,     8,    69,    70,
+      69,    70,   233,    69,     3,    69,    69,     3,    69,     8,
+      69,    69,     8,    69,     7,     3,    69,   117,   118,     3,
+       8,    69,     6,    69,    69,    97,    69,    99,   100,    69,
+     230,    69,   104,   105,   106,   204,     3,   206,   207,   117,
+     118,     8,     3,   230,    10,   117,   118,     8,    30,    31,
+      32,    33,    34,    35,     3,    41,    42,    20,    21,     8,
+     192,   230,   213,   214,   215,   216,     7,     3,    95,     3,
+       6,   171,   172,   173,     8,   137,   138,   139,   140,   230,
+     142,     7,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    73,     7,    32,    33,    34,    78,    79,    80,    81,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,     7,
+      92,    93,    94,  1312,    96,  1312,  1312,     7,     3,   230,
+     231,   232,   233,     8,    27,    28,   108,   109,   117,   118,
+     230,   117,   118,   115,     7,   117,   118,   119,   120,   121,
+     122,   123,   124,     3,   126,   127,   128,     4,     8,     3,
+       3,   133,   230,   135,     8,     8,     3,    96,   230,     6,
+       3,   143,     8,     7,   205,     8,  1054,   208,   209,   210,
+     211,     3,    30,    31,    32,    33,    34,    35,   117,   118,
+    1100,  1100,  1102,  1102,  1100,     3,  1102,   126,   174,   175,
+       8,   180,   181,   182,    55,    56,    57,   136,   137,   138,
+     139,   140,   141,   142,     4,     4,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,   198,   199,     4,     4,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,     4,     3,     8,     3,    96,    97,
+       8,   230,     8,     4,   230,   454,   455,     4,   230,     4,
+     108,   109,    97,    98,    99,   100,   101,   102,   103,   117,
+     118,     4,   120,     4,   122,   123,   124,     4,   126,   127,
+     128,     3,   117,   118,     3,   133,     8,     3,     3,     8,
+       4,   126,     8,     8,     3,   143,     4,     3,     3,     8,
+       3,   230,     8,     8,     4,     8,    78,    79,    80,    81,
+      82,    83,    84,     4,    86,    87,    88,    89,   149,   150,
+     151,   152,   153,   154,    96,     3,   533,     3,     3,     3,
+       8,     6,     8,     4,     4,   542,     4,   109,     4,   110,
+     111,   112,   113,     4,   116,   117,   118,     4,     4,   556,
+     198,   199,     4,   560,   126,   127,   128,     4,   542,     4,
+     556,   133,   134,     4,   571,   163,   164,   165,   556,     4,
+       4,     4,   556,     4,   581,     4,   560,     4,   581,     4,
+       4,   588,   230,   571,   556,   588,     4,   571,   560,     4,
+     556,   560,     4,     4,   601,   230,     4,   581,     4,   571,
+       4,     4,   560,   556,   588,   542,     4,   560,     8,   556,
+       4,     4,     8,     3,   588,     4,   560,   601,     4,   556,
+       4,   588,     3,   560,   571,   560,   198,   199,     8,   556,
+       4,   556,   556,   560,   571,     4,     4,     4,     4,   230,
+       4,     4,     4,     4,   581,   233,   571,   556,   233,   556,
+     233,   588,     4,     4,     4,   233,     4,   556,   230,   556,
+       4,   560,   117,   118,   601,   231,     4,   556,   231,   556,
+     231,   560,   556,   560,   231,   556,   560,   231,   231,   560,
+     556,   233,   556,   232,   560,   556,   560,   231,  1293,   560,
+     556,   232,   556,   232,   560,   556,   560,   556,     4,   560,
+     556,   560,   556,   556,   233,   556,   231,   556,   556,   233,
+     556,   231,   233,   556,   231,     4,     4,     4,   556,   232,
+     556,   556,   233,   556,   231,     4,   556,   231,   556,   184,
+     185,   186,   187,   188,   189,   190,   191,   233,   231,   746,
+       4,   748,     4,   233,   231,     4,   745,    40,    41,    42,
       43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,   230,     5,     5,    58,    59,    60,    61,    62,
-      63,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,     5,     5,   230,   230,     7,     7,
-       7,     5,     7,     5,     7,     5,     7,     5,   230,     5,
-     230,   198,   199,     7,    97,   193,   230,   230,   230,     7,
-     230,   230,   230,     7,   230,   230,     7,     7,   230,   230,
-       7,     7,   230,   230,   230,   230,   230,   230,     7,   230,
-       7,     7,     7,   230,   230,   230,   230,   230,     7,   144,
-       4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,     3,   230,     6,     3,     6,     6,     3,     6,
-       3,     3,     6,     3,   231,     6,  1043,     6,     3,  1046,
-       4,     4,  1049,  1046,     4,  1052,  1049,  1043,     4,  1052,
-    1057,     4,     4,  1060,  1057,  1043,  1063,  1057,     4,  1043,
-       4,     4,  1046,     4,  1052,  1049,     4,     6,  1052,  1057,
-    1077,  1043,  1060,  1057,     3,  1049,  1060,  1043,     4,  1086,
-    1052,  1088,  1049,  1052,     4,  1057,  1052,     4,  1060,     4,
-    1043,  1098,     4,  1077,  1052,  1098,  1043,     4,  1105,  1052,
-       6,     3,  1086,  1110,  1088,  1052,  1043,   230,     8,  1046,
-    1057,  1095,  1049,  1060,  1098,  1052,  1043,  1052,  1043,  1043,
-    1057,     6,     4,  1060,     4,  1052,  1110,  1052,  1052,     4,
-       4,     4,  1057,  1057,  1043,  1060,  1043,     4,  1110,     4,
-    1077,  1110,   231,  1052,  1043,  1052,  1043,  1043,  1057,  1086,
-    1057,  1088,  1110,  1052,  1043,  1052,  1052,  1043,  1095,  1043,
-    1057,  1098,  1043,  1052,   233,  1043,  1052,  1043,  1052,  1043,
-     233,  1052,  1043,  1110,  1052,  1110,  1052,  1043,  1052,  1043,
-    1043,  1052,  1043,  1052,  1043,  1043,  1052,  1043,  1052,  1052,
-    1043,  1052,  1043,  1052,  1052,  1043,  1052,  1043,   231,  1052,
-    1043,  1052,  1043,  1043,  1052,  1043,  1052,  1043,   231,  1052,
-       4,  1052,  1052,   231,  1052,     4,  1052,   231,   231,   231,
-       4,   231,   233,     4,     4,   233,     4,   231,   231,   231,
-     231,   231,     4,   231,   231,   231,   231,     4,     4,     4,
-       4,  1110,     3,     6,     4,   170,     8,     4,     4,     8,
-       8,     3,     6,     8,     7,     5,  1255,   233,     4,     4,
-       4,     4,     4,     3,   231,   233,     7,   233,     5,     4,
-       4,   233,   233,   230,   233,   230,   230,     4,     4,   230,
-     230,   230,   230,   230,     7,   230,     5,     7,   230,     4,
-     230,  1298,     6,   230,   230,  1298,   230,     3,  1305,   230,
-     233,   233,  1305,   231,     4,  1305,   230,  1314,   230,   230,
-    1298,   230,   230,     4,  1298,  1322,     4,  1305,     4,  1322,
-     233,  1305,   231,   231,     4,   230,  1298,   230,     4,  1298,
-    1314,     4,  1298,  1305,   230,   230,   519,   732,  1322,   528,
-    1298,   717,   734,  1014,  1042,  1298,  1037,  1055,   821,  1077,
-    1045,  1298,  1065,  1360,  1063,  1362,   577,  1043,  1305,  1362,
-    1072,  1298,   542,  1298,  1298,  1054,  1048,  1046,  1305,   567,
-    1051,  1298,  1049,  1298,  1298,   574,  1360,  1314,  1362,  1112,
-    1305,  1305,   546,  1390,  1062,  1322,  1110,  1390,  1060,  1298,
-     557,  1298,  1058,  1305,  1090,  1088,  1305,  1390,  1305,  1298,
-    1416,  1298,  1298,  1086,  1364,  1360,  1390,  1414,  1305,  1298,
-    1445,   773,  1298,   733,  1298,  1095,   587,  1298,  1322,   591,
-    1298,  1423,  1298,  1360,  1298,  1362,  1099,  1298,  1393,  1298,
-    1414,  1105,  1298,    -1,  1298,  1298,    -1,  1298,  1445,  1298,
-    1298,    -1,  1298,    -1,    -1,  1298,    -1,  1298,    -1,    -1,
-    1298,    -1,  1298,  1390,    -1,  1298,    -1,  1298,  1298,    -1,
-    1298,  1445,  1298,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1414,    -1,    -1,
+      53,    54,     4,     4,   748,    58,    59,    60,    61,    62,
+      63,     4,     4,   233,   233,   230,   783,   784,     4,   233,
+     787,     4,     4,     4,   791,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,   226,   227,   228,   229,    11,   783,
+     784,    14,   786,   787,    97,     4,     4,     4,   231,     4,
+       4,   748,     4,    26,     4,     4,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,     4,   233,     4,
+       4,   233,   233,     4,     4,     4,   233,     4,   233,   231,
+     231,     4,     4,     4,     4,     4,   783,   784,   231,   786,
+     787,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,     4,
+       4,     4,    95,    96,     4,     4,   231,     4,     4,     4,
+       4,     4,     4,     4,   107,   108,   109,     4,     4,     4,
+     231,   114,     4,     4,   117,   118,     4,   233,     4,   122,
+     123,   124,   125,   126,   233,   233,   233,     4,    60,    61,
+      62,     4,   135,     4,   233,     4,   231,     4,   231,   231,
+       4,     4,   145,     4,   231,   148,     4,   230,     7,   230,
+       7,     7,   155,   156,     7,   230,   230,   160,   161,     7,
+       7,     5,   230,   230,   230,     5,     5,     5,   230,     5,
+       7,   230,     5,     5,     5,     5,   179,   230,     7,     7,
+     183,     7,     5,     7,   230,   117,   118,     7,     5,     7,
+       5,   230,   230,   230,     5,   198,   199,   200,   201,   202,
+     203,   230,   230,   230,     7,   230,   230,   193,     5,   212,
+     230,   230,   230,   230,     7,   230,   230,     7,     7,     7,
+     230,   230,   230,   230,   230,   230,   230,   230,   230,   230,
+     162,     7,     7,     7,   166,   167,   168,   169,     7,     7,
+       7,     7,     4,     4,   176,   177,   144,     4,     4,     4,
+       4,     4,     4,     4,     4,     4,     4,     3,   230,     6,
+    1057,     6,     3,  1060,     6,     3,  1063,  1060,     3,  1066,
+    1063,  1057,     6,  1066,  1071,     6,     3,  1074,  1071,  1057,
+    1077,  1071,     6,  1057,     3,     6,  1060,     3,  1066,  1063,
+       4,     4,  1066,  1071,  1091,  1057,  1074,  1071,   230,  1063,
+    1074,  1057,     4,  1100,  1066,  1102,  1063,  1066,     4,  1071,
+    1066,     4,  1074,     4,  1057,  1112,     4,  1091,  1066,  1112,
+    1057,     4,  1119,  1066,     4,     4,  1100,  1124,  1102,  1066,
+    1057,     4,  1066,  1060,  1071,  1109,  1063,  1074,  1112,  1066,
+    1057,  1066,  1057,  1057,  1071,     6,     3,  1074,     4,  1066,
+    1124,  1066,  1066,     4,     4,     4,  1071,  1071,  1057,  1074,
+    1057,     4,  1124,     4,  1091,  1124,     6,  1066,  1057,  1066,
+    1057,     3,  1071,  1100,  1071,  1102,  1124,  1066,  1057,  1066,
+    1057,  1124,  1109,  1057,  1071,  1112,  1057,  1066,     8,  1066,
+    1124,  1057,  1066,  1057,     6,  1066,  1057,  1124,     4,  1124,
+    1066,  1057,  1066,  1057,     4,  1066,  1057,  1124,  1057,     4,
+    1066,  1057,  1066,  1057,  1057,  1066,  1057,  1066,  1057,  1057,
+    1066,  1057,  1066,  1066,  1057,  1066,     4,  1066,  1066,  1057,
+    1066,  1057,  1057,  1066,  1057,  1124,     4,  1057,  1066,  1057,
+    1066,  1066,     4,  1066,   231,  1124,  1066,  1124,  1066,   233,
+    1124,   231,   233,  1124,   231,     4,     4,     4,  1124,   231,
+    1124,   231,   233,  1124,     4,     4,   231,   231,  1124,     4,
+    1124,   231,   231,  1124,     4,  1124,     4,     4,     4,     4,
+    1269,     4,     6,     3,     5,     4,     8,   231,   231,     4,
+       8,   231,   231,     4,   231,   231,     8,     3,     8,   231,
+     233,   231,   231,     7,     4,   233,   231,   233,     4,     4,
+     233,   233,   230,   233,     7,  1312,   233,     4,   230,  1312,
+     230,   230,  1319,   230,   230,   230,  1319,   230,     4,  1319,
+     230,  1328,   230,   230,  1312,   230,   230,     6,  1312,  1336,
+     230,  1319,     3,  1336,   233,  1319,   233,   231,   230,   230,
+    1312,     5,   230,  1312,  1328,     4,  1312,  1319,     4,     4,
+       4,   170,  1336,   230,  1312,     7,   230,     5,     7,  1312,
+       4,     6,     3,   233,     4,  1312,   230,  1374,  1312,  1376,
+       4,     4,  1319,  1376,     4,  1312,   231,  1312,     4,   231,
+       4,   230,  1319,   230,     4,  1312,   230,  1312,  1312,   230,
+    1374,  1328,  1376,   746,  1319,  1319,   731,  1404,   533,  1336,
+    1028,  1404,   748,  1312,   542,  1312,  1091,   835,  1069,  1051,
+    1319,  1056,  1319,  1312,  1079,  1312,  1086,  1077,   591,  1059,
+    1404,  1428,  1319,  1312,   556,  1312,   581,  1057,  1312,  1068,
+    1312,  1312,   588,  1062,  1060,  1126,  1312,  1374,  1312,  1376,
+    1065,  1312,  1063,  1124,  1428,   571,  1312,  1319,  1312,  1076,
+     560,  1312,  1459,  1312,  1074,  1072,  1312,  1378,  1312,  1312,
+    1374,  1312,  1100,  1312,  1312,  1404,  1312,  1404,  1430,  1312,
+      32,    33,    34,    35,  1312,  1459,  1312,  1312,  1459,  1312,
+    1104,   747,  1312,  1102,  1312,  1437,  1109,   787,  1407,  1336,
+      -1,  1428,   601,    -1,    -1,  1113,    -1,    -1,    -1,    -1,
+      -1,   605,    64,    65,    66,  1119,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1459,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    95,    96,    97,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   129,   130,   131,
+     132,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1445
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   230
   };
 
   const short
@@ -6205,120 +6239,121 @@ namespace isc { namespace dhcp {
      311,   312,   314,   316,   322,   443,   444,   445,   447,   449,
      451,   453,   455,   457,   459,   461,   463,   464,   465,   466,
      501,   522,   535,   537,   539,   550,   552,   554,   572,   116,
-     134,   264,   455,   457,   459,   461,   501,   530,   531,   532,
-     534,   535,   537,   126,   136,   137,   138,   139,   140,   141,
-     142,   264,   501,   535,   537,   547,   548,   549,   550,   552,
-     554,   556,   558,   560,   562,   564,   566,   568,   570,   475,
-      40,    97,    99,   100,   104,   105,   106,   264,   371,   485,
-     486,   487,   488,   489,   490,   491,   493,   495,   497,   498,
-     500,   535,   537,    98,   101,   102,   103,   126,   264,   371,
-     489,   495,   509,   510,   511,   512,   513,   515,   516,   517,
-     518,   519,   520,   535,   537,   146,   147,   264,   419,   420,
-     421,   423,   184,   185,   186,   187,   188,   189,   190,   191,
-     264,   535,   537,   659,   660,   661,   662,   664,   665,   667,
-     668,   669,   672,    12,    13,   678,   679,   680,   682,     6,
-       3,     4,     8,     3,   268,     3,     8,   675,   325,   345,
-       4,     4,     4,   551,   553,   555,     4,     4,   343,   353,
-     355,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,   286,     4,     4,     4,     4,     4,   297,   300,
-     302,     4,     4,     4,     4,     4,     4,     4,   436,   476,
-     502,     4,   289,   306,   468,   536,   538,     4,     4,     4,
-     396,   578,   540,   412,   426,     4,   405,   594,   596,   646,
-     656,   313,   315,     4,     4,     4,   684,   708,     4,     3,
-       8,   331,   333,   336,     4,     4,     4,     4,     3,     8,
-     448,   450,   452,   523,   446,   454,     4,   458,   460,   462,
-     456,   573,     3,     8,   533,     4,     3,     8,   571,   557,
-     559,   561,   565,   563,   569,   567,     8,     3,     8,   492,
-     372,     4,   496,   494,   499,     4,     8,     3,   514,     4,
-       4,     4,   521,     8,     3,   422,   424,     3,     8,     4,
-     663,     4,   666,     4,     4,   670,   673,     3,     8,   681,
-       4,     3,     8,   249,   249,   230,     4,     4,     4,     4,
-     233,   233,   233,     4,     4,     4,   231,   233,     4,     4,
-       4,   231,   231,   231,   231,   231,   233,   232,   232,   232,
-     231,   231,     4,   231,   231,   233,   233,   233,     4,     4,
-       4,   233,   233,   232,   231,   231,   231,   233,     4,     4,
-       4,   231,     4,     4,     4,     4,     4,   233,   233,   233,
-       4,     4,     4,     4,     4,   231,     4,     4,     4,     4,
-       4,     4,     4,   233,   233,   233,     4,     4,   273,     4,
-       4,     4,   233,   233,   231,   231,   327,     4,     4,     4,
-       4,     4,     4,   231,     4,     4,     4,     4,     4,   444,
-       4,   231,   531,     4,     4,     4,     4,     4,     4,     4,
-       4,   549,     4,     4,   231,     4,     4,     4,   233,   487,
-       4,   233,   233,   233,     4,   511,     4,     4,   420,   233,
-       4,   231,     4,   231,   231,     4,     4,   660,     4,   231,
-     679,     4,     7,     7,     7,     7,   230,   230,   230,     7,
-       7,     5,   230,   194,   195,   196,   197,   233,   298,   230,
-     230,     5,     5,     5,   230,   110,   111,   112,   113,   307,
-       5,   251,   253,   230,     5,     5,     5,     5,     7,     7,
-       7,     5,     7,     7,   230,   230,     5,     7,     5,   260,
-      17,    18,   334,    20,    21,   337,   230,   230,   230,     5,
-     230,   230,   260,   260,   260,   230,     7,   230,   260,   230,
-     230,   230,   230,   230,   230,   230,   230,   230,   230,   230,
-     230,   230,   260,   230,   253,   230,   230,    18,   192,   671,
-     193,     5,   249,   272,   678,   326,    27,    28,   346,   347,
-     348,   350,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    58,    59,    60,
-      61,    62,    63,   264,   360,   361,   362,   364,   366,   368,
-     370,   371,   373,   374,   375,   376,   377,   378,   379,   380,
-     381,   382,   385,   386,   387,   389,   391,   393,   360,     7,
-     356,   357,   358,     7,   437,   438,   439,     7,   479,   480,
-     481,     7,   503,   504,   505,     7,   469,   470,   471,   137,
-     138,   139,   140,   142,   397,   398,   399,   400,   401,   402,
-     403,     7,   579,   580,     7,   541,   542,   543,     7,   413,
-     414,   415,   149,   150,   151,   152,   153,   154,   427,   428,
-     429,   430,   431,   432,   433,   434,   157,   158,   159,   264,
-     406,   407,   408,   409,   410,   535,   537,   162,   166,   167,
-     168,   169,   176,   177,   264,   387,   389,   391,   535,   537,
-     601,   602,   603,   606,   608,   610,   611,   612,   622,     7,
-     597,   598,   599,   180,   181,   182,   230,   535,   537,   647,
-     648,   649,   650,   652,   653,   659,     7,   685,   686,   213,
-     214,   215,   216,   264,   709,   710,   711,   712,   713,   714,
-     261,     7,   524,   525,   526,   144,   574,   575,   356,     8,
-       8,     8,   349,   351,     3,     8,   363,   365,   367,   369,
-       4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-     383,     4,     4,   388,   390,   392,   394,     3,     8,     8,
-     359,     6,     3,   440,     6,     3,   482,     6,     3,   506,
-       6,     3,   472,     6,     3,     3,     6,   581,     3,     6,
-     544,     6,     3,   416,     6,     3,     4,     4,     4,     4,
-       4,     4,     3,     8,     4,     4,     4,     3,     8,   604,
-     607,   609,     4,   623,     4,   613,     3,     8,   600,     6,
-       3,     4,   651,     4,   654,     3,     8,     8,   687,     3,
-       6,     4,     4,     4,     4,     3,     8,   230,   262,   263,
-     527,     6,     3,   576,     8,     6,     4,     4,   347,     4,
-       4,     4,     4,   231,   233,   231,   233,   231,   231,   231,
-     231,   231,   231,     4,   233,   231,     4,     4,     4,     4,
-     361,   360,   358,   443,   439,   485,   481,   509,   505,   264,
-     274,   275,   276,   277,   278,   279,   280,   281,   282,   283,
-     288,   291,   292,   293,   294,   295,   296,   299,   301,   303,
-     304,   305,   308,   309,   310,   311,   312,   314,   316,   322,
-     371,   435,   453,   455,   457,   459,   461,   463,   464,   465,
-     473,   474,   501,   535,   537,   550,   552,   554,   572,   471,
-     398,   129,   130,   131,   132,   264,   274,   275,   276,   322,
-     371,   475,   501,   535,   537,   550,   552,   554,   582,   583,
-     584,   585,   586,   588,   590,   591,   580,   547,   543,   419,
-     415,   231,   231,   231,   231,   231,   231,   428,   233,   231,
-     231,   407,     4,     4,     4,   231,     4,   233,     4,   602,
-     601,   599,   233,     4,   231,     4,   648,   204,   206,   207,
-     264,   371,   535,   537,   688,   689,   690,   691,   693,   686,
-     233,   233,   233,   233,   710,     6,     3,   530,   526,     4,
-     230,   230,   230,   230,   230,   230,    55,    56,    57,   384,
-     230,   230,   230,   230,     8,     8,     8,     8,     3,     8,
-     587,   589,     4,     4,     8,     3,     8,     8,   163,   164,
-     165,   605,   230,   230,     7,     5,     8,   230,   249,   694,
-       4,   692,     3,     8,   230,     8,   260,   474,     4,     4,
-     233,   233,   584,    40,   171,   172,   173,   264,   535,   537,
-     624,   625,   626,   629,   631,   633,     7,   614,   615,   616,
-       4,   231,     4,   689,   230,   230,   627,   630,   632,   634,
-       3,     8,   617,     6,     3,     5,   230,     4,     4,     4,
-       4,   625,   178,   264,   371,   535,   537,   618,   619,   620,
-     616,     7,   695,   696,   170,   628,   230,   230,     5,   621,
-       3,     8,   697,     3,     6,     7,   635,   636,   637,     4,
-     619,   205,   208,   209,   210,   211,   698,   699,   700,   702,
-     703,   704,   705,   696,   638,     6,     3,   230,   701,     4,
-       4,     4,   706,     3,     8,   174,   175,   264,   364,   366,
-     535,   537,   639,   640,   641,   643,   637,     4,   233,   231,
-     231,     4,   699,   642,   644,     3,     8,   230,   230,     4,
-       4,   640,   230,   230
+     134,   264,   293,   294,   295,   296,   299,   301,   303,   305,
+     308,   309,   310,   311,   312,   314,   455,   457,   459,   461,
+     501,   530,   531,   532,   534,   535,   537,   126,   136,   137,
+     138,   139,   140,   141,   142,   264,   501,   535,   537,   547,
+     548,   549,   550,   552,   554,   556,   558,   560,   562,   564,
+     566,   568,   570,   475,    40,    97,    99,   100,   104,   105,
+     106,   264,   371,   485,   486,   487,   488,   489,   490,   491,
+     493,   495,   497,   498,   500,   535,   537,    98,   101,   102,
+     103,   126,   264,   371,   489,   495,   509,   510,   511,   512,
+     513,   515,   516,   517,   518,   519,   520,   535,   537,   146,
+     147,   264,   419,   420,   421,   423,   184,   185,   186,   187,
+     188,   189,   190,   191,   264,   535,   537,   659,   660,   661,
+     662,   664,   665,   667,   668,   669,   672,    12,    13,   678,
+     679,   680,   682,     6,     3,     4,     8,     3,   268,     3,
+       8,   675,   325,   345,     4,     4,     4,   551,   553,   555,
+       4,     4,   343,   353,   355,     4,     4,     4,     4,     4,
+       4,     4,     4,     4,     4,     4,   286,     4,     4,     4,
+       4,     4,   297,   300,   302,     4,     4,     4,     4,     4,
+       4,     4,   436,   476,   502,     4,   289,   306,   468,   536,
+     538,     4,     4,     4,   396,   578,   540,   412,   426,     4,
+     405,   594,   596,   646,   656,   313,   315,     4,     4,     4,
+     684,   708,     4,     3,     8,   331,   333,   336,     4,     4,
+       4,     4,     3,     8,   448,   450,   452,   523,   446,   454,
+       4,   458,   460,   462,   456,   573,     3,     8,   533,     4,
+       3,     8,   571,   557,   559,   561,   565,   563,   569,   567,
+       8,     3,     8,   492,   372,     4,   496,   494,   499,     4,
+       8,     3,   514,     4,     4,     4,   521,     8,     3,   422,
+     424,     3,     8,     4,   663,     4,   666,     4,     4,   670,
+     673,     3,     8,   681,     4,     3,     8,   249,   249,   230,
+       4,     4,     4,     4,   233,   233,   233,     4,     4,     4,
+     231,   233,     4,     4,     4,   231,   231,   231,   231,   231,
+     233,   232,   232,   232,   231,   231,     4,   231,   231,   233,
+     233,   233,     4,     4,     4,   233,   233,   232,   231,   231,
+     231,   233,     4,     4,     4,   231,     4,     4,     4,     4,
+       4,   233,   233,   233,     4,     4,     4,     4,     4,   231,
+       4,     4,     4,     4,     4,     4,     4,   233,   233,   233,
+       4,     4,   273,     4,     4,     4,   233,   233,   231,   231,
+     327,     4,     4,     4,     4,     4,     4,   231,     4,     4,
+       4,     4,     4,   444,     4,   231,   531,     4,     4,     4,
+       4,     4,     4,     4,     4,   549,     4,     4,   231,     4,
+       4,     4,   233,   487,     4,   233,   233,   233,     4,   511,
+       4,     4,   420,   233,     4,   231,     4,   231,   231,     4,
+       4,   660,     4,   231,   679,     4,     7,     7,     7,     7,
+     230,   230,   230,     7,     7,     5,   230,   194,   195,   196,
+     197,   233,   298,   230,   230,     5,     5,     5,   230,   110,
+     111,   112,   113,   307,     5,   251,   253,   230,     5,     5,
+       5,     5,     7,     7,     7,     5,     7,     7,   230,   230,
+       5,     7,     5,   260,    17,    18,   334,    20,    21,   337,
+     230,   230,   230,     5,   230,   230,   260,   260,   260,   230,
+       7,   230,   260,   230,   230,   230,   230,   230,   230,   230,
+     230,   230,   230,   230,   230,   230,   260,   230,   253,   230,
+     230,    18,   192,   671,   193,     5,   249,   272,   678,   326,
+      27,    28,   346,   347,   348,   350,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    58,    59,    60,    61,    62,    63,   264,   360,   361,
+     362,   364,   366,   368,   370,   371,   373,   374,   375,   376,
+     377,   378,   379,   380,   381,   382,   385,   386,   387,   389,
+     391,   393,   360,     7,   356,   357,   358,     7,   437,   438,
+     439,     7,   479,   480,   481,     7,   503,   504,   505,     7,
+     469,   470,   471,   137,   138,   139,   140,   142,   397,   398,
+     399,   400,   401,   402,   403,     7,   579,   580,     7,   541,
+     542,   543,     7,   413,   414,   415,   149,   150,   151,   152,
+     153,   154,   427,   428,   429,   430,   431,   432,   433,   434,
+     157,   158,   159,   264,   406,   407,   408,   409,   410,   535,
+     537,   162,   166,   167,   168,   169,   176,   177,   264,   387,
+     389,   391,   535,   537,   601,   602,   603,   606,   608,   610,
+     611,   612,   622,     7,   597,   598,   599,   180,   181,   182,
+     230,   535,   537,   647,   648,   649,   650,   652,   653,   659,
+       7,   685,   686,   213,   214,   215,   216,   264,   709,   710,
+     711,   712,   713,   714,   261,     7,   524,   525,   526,   144,
+     574,   575,   356,     8,     8,     8,   349,   351,     3,     8,
+     363,   365,   367,   369,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,     4,   383,     4,     4,   388,   390,   392,
+     394,     3,     8,     8,   359,     6,     3,   440,     6,     3,
+     482,     6,     3,   506,     6,     3,   472,     6,     3,     3,
+       6,   581,     3,     6,   544,     6,     3,   416,     6,     3,
+       4,     4,     4,     4,     4,     4,     3,     8,     4,     4,
+       4,     3,     8,   604,   607,   609,     4,   623,     4,   613,
+       3,     8,   600,     6,     3,     4,   651,     4,   654,     3,
+       8,     8,   687,     3,     6,     4,     4,     4,     4,     3,
+       8,   230,   262,   263,   527,     6,     3,   576,     8,     6,
+       4,     4,   347,     4,     4,     4,     4,   231,   233,   231,
+     233,   231,   231,   231,   231,   231,   231,     4,   233,   231,
+       4,     4,     4,     4,   361,   360,   358,   443,   439,   485,
+     481,   509,   505,   264,   274,   275,   276,   277,   278,   279,
+     280,   281,   282,   283,   288,   291,   292,   293,   294,   295,
+     296,   299,   301,   303,   304,   305,   308,   309,   310,   311,
+     312,   314,   316,   322,   371,   435,   453,   455,   457,   459,
+     461,   463,   464,   465,   473,   474,   501,   535,   537,   550,
+     552,   554,   572,   471,   398,   129,   130,   131,   132,   264,
+     274,   275,   276,   322,   371,   475,   501,   535,   537,   550,
+     552,   554,   582,   583,   584,   585,   586,   588,   590,   591,
+     580,   547,   543,   419,   415,   231,   231,   231,   231,   231,
+     231,   428,   233,   231,   231,   407,     4,     4,     4,   231,
+       4,   233,     4,   602,   601,   599,   233,     4,   231,     4,
+     648,   204,   206,   207,   264,   371,   535,   537,   688,   689,
+     690,   691,   693,   686,   233,   233,   233,   233,   710,     6,
+       3,   530,   526,     4,   230,   230,   230,   230,   230,   230,
+      55,    56,    57,   384,   230,   230,   230,   230,     8,     8,
+       8,     8,     3,     8,   587,   589,     4,     4,     8,     3,
+       8,     8,   163,   164,   165,   605,   230,   230,     7,     5,
+       8,   230,   249,   694,     4,   692,     3,     8,   230,     8,
+     260,   474,     4,     4,   233,   233,   584,    40,   171,   172,
+     173,   264,   535,   537,   624,   625,   626,   629,   631,   633,
+       7,   614,   615,   616,     4,   231,     4,   689,   230,   230,
+     627,   630,   632,   634,     3,     8,   617,     6,     3,     5,
+     230,     4,     4,     4,     4,   625,   178,   264,   371,   535,
+     537,   618,   619,   620,   616,     7,   695,   696,   170,   628,
+     230,   230,     5,   621,     3,     8,   697,     3,     6,     7,
+     635,   636,   637,     4,   619,   205,   208,   209,   210,   211,
+     698,   699,   700,   702,   703,   704,   705,   696,   638,     6,
+       3,   230,   701,     4,     4,     4,   706,     3,     8,   174,
+     175,   264,   364,   366,   535,   537,   639,   640,   641,   643,
+     637,     4,   233,   231,   231,     4,   699,   642,   644,     3,
+       8,   230,   230,     4,     4,   640,   230,   230
   };
 
   const short
@@ -6387,39 +6422,40 @@ namespace isc { namespace dhcp {
      514,   513,   515,   516,   517,   518,   519,   521,   520,   523,
      522,   524,   524,   525,   525,   525,   527,   526,   529,   528,
      530,   530,   530,   531,   531,   531,   531,   531,   531,   531,
-     531,   531,   531,   533,   532,   534,   536,   535,   538,   537,
-     540,   539,   541,   541,   542,   542,   542,   544,   543,   546,
-     545,   547,   547,   548,   548,   548,   549,   549,   549,   549,
+     531,   531,   531,   531,   531,   531,   531,   531,   531,   531,
+     531,   531,   531,   531,   531,   531,   531,   533,   532,   534,
+     536,   535,   538,   537,   540,   539,   541,   541,   542,   542,
+     542,   544,   543,   546,   545,   547,   547,   548,   548,   548,
      549,   549,   549,   549,   549,   549,   549,   549,   549,   549,
-     549,   551,   550,   553,   552,   555,   554,   557,   556,   559,
-     558,   561,   560,   563,   562,   565,   564,   567,   566,   569,
-     568,   571,   570,   573,   572,   574,   576,   575,   578,   577,
-     579,   579,   579,   581,   580,   582,   582,   583,   583,   583,
+     549,   549,   549,   549,   549,   551,   550,   553,   552,   555,
+     554,   557,   556,   559,   558,   561,   560,   563,   562,   565,
+     564,   567,   566,   569,   568,   571,   570,   573,   572,   574,
+     576,   575,   578,   577,   579,   579,   579,   581,   580,   582,
+     582,   583,   583,   583,   584,   584,   584,   584,   584,   584,
      584,   584,   584,   584,   584,   584,   584,   584,   584,   584,
-     584,   584,   584,   584,   584,   584,   584,   585,   587,   586,
-     589,   588,   590,   591,   592,   594,   593,   596,   595,   597,
-     597,   598,   598,   598,   600,   599,   601,   601,   601,   602,
-     602,   602,   602,   602,   602,   602,   602,   602,   602,   602,
-     602,   602,   604,   603,   605,   605,   605,   607,   606,   609,
-     608,   610,   611,   613,   612,   614,   614,   615,   615,   615,
-     617,   616,   618,   618,   618,   619,   619,   619,   619,   619,
-     621,   620,   623,   622,   624,   624,   624,   625,   625,   625,
-     625,   625,   625,   625,   627,   626,   628,   630,   629,   632,
-     631,   634,   633,   635,   635,   636,   636,   636,   638,   637,
-     639,   639,   639,   640,   640,   640,   640,   640,   640,   640,
-     642,   641,   644,   643,   646,   645,   647,   647,   647,   648,
-     648,   648,   648,   648,   648,   649,   651,   650,   652,   654,
-     653,   656,   655,   658,   657,   659,   659,   659,   660,   660,
-     660,   660,   660,   660,   660,   660,   660,   660,   660,   661,
-     663,   662,   664,   666,   665,   667,   668,   670,   669,   671,
-     671,   673,   672,   675,   674,   677,   676,   678,   678,   678,
-     679,   679,   681,   680,   682,   684,   683,   685,   685,   685,
-     687,   686,   688,   688,   688,   689,   689,   689,   689,   689,
-     689,   689,   690,   692,   691,   694,   693,   695,   695,   695,
-     697,   696,   698,   698,   698,   699,   699,   699,   699,   699,
-     701,   700,   702,   703,   704,   706,   705,   708,   707,   709,
-     709,   709,   710,   710,   710,   710,   710,   711,   712,   713,
-     714
+     584,   585,   587,   586,   589,   588,   590,   591,   592,   594,
+     593,   596,   595,   597,   597,   598,   598,   598,   600,   599,
+     601,   601,   601,   602,   602,   602,   602,   602,   602,   602,
+     602,   602,   602,   602,   602,   602,   604,   603,   605,   605,
+     605,   607,   606,   609,   608,   610,   611,   613,   612,   614,
+     614,   615,   615,   615,   617,   616,   618,   618,   618,   619,
+     619,   619,   619,   619,   621,   620,   623,   622,   624,   624,
+     624,   625,   625,   625,   625,   625,   625,   625,   627,   626,
+     628,   630,   629,   632,   631,   634,   633,   635,   635,   636,
+     636,   636,   638,   637,   639,   639,   639,   640,   640,   640,
+     640,   640,   640,   640,   642,   641,   644,   643,   646,   645,
+     647,   647,   647,   648,   648,   648,   648,   648,   648,   649,
+     651,   650,   652,   654,   653,   656,   655,   658,   657,   659,
+     659,   659,   660,   660,   660,   660,   660,   660,   660,   660,
+     660,   660,   660,   661,   663,   662,   664,   666,   665,   667,
+     668,   670,   669,   671,   671,   673,   672,   675,   674,   677,
+     676,   678,   678,   678,   679,   679,   681,   680,   682,   684,
+     683,   685,   685,   685,   687,   686,   688,   688,   688,   689,
+     689,   689,   689,   689,   689,   689,   690,   692,   691,   694,
+     693,   695,   695,   695,   697,   696,   698,   698,   698,   699,
+     699,   699,   699,   699,   701,   700,   702,   703,   704,   706,
+     705,   708,   707,   709,   709,   709,   710,   710,   710,   710,
+     710,   711,   712,   713,   714
   };
 
   const signed char
@@ -6488,39 +6524,40 @@ namespace isc { namespace dhcp {
        0,     4,     1,     1,     3,     3,     3,     0,     4,     0,
        6,     0,     1,     1,     3,     2,     0,     4,     0,     4,
        1,     3,     2,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     0,     4,     3,     0,     4,     0,     4,
-       0,     6,     0,     1,     1,     3,     2,     0,     4,     0,
-       4,     0,     1,     1,     3,     2,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     0,     4,     0,     4,     0,     4,     0,     4,     0,
-       4,     0,     4,     0,     4,     0,     4,     0,     4,     0,
-       4,     0,     4,     0,     6,     1,     0,     4,     0,     6,
-       1,     3,     2,     0,     4,     0,     1,     1,     3,     2,
+       1,     1,     1,     1,     1,     1,     1,     0,     4,     3,
+       0,     4,     0,     4,     0,     6,     0,     1,     1,     3,
+       2,     0,     4,     0,     4,     0,     1,     1,     3,     2,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     0,     4,
-       0,     4,     3,     3,     3,     0,     6,     0,     6,     0,
-       1,     1,     3,     2,     0,     4,     1,     3,     2,     1,
+       1,     1,     1,     1,     1,     0,     4,     0,     4,     0,
+       4,     0,     4,     0,     4,     0,     4,     0,     4,     0,
+       4,     0,     4,     0,     4,     0,     4,     0,     6,     1,
+       0,     4,     0,     6,     1,     3,     2,     0,     4,     0,
+       1,     1,     3,     2,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     0,     4,     1,     1,     1,     0,     4,     0,
-       4,     3,     3,     0,     6,     0,     1,     1,     3,     2,
-       0,     4,     1,     3,     2,     1,     1,     1,     1,     1,
-       0,     4,     0,     6,     1,     3,     2,     1,     1,     1,
-       1,     1,     1,     1,     0,     4,     1,     0,     4,     0,
-       4,     0,     6,     0,     1,     1,     3,     2,     0,     4,
+       1,     1,     0,     4,     0,     4,     3,     3,     3,     0,
+       6,     0,     6,     0,     1,     1,     3,     2,     0,     4,
        1,     3,     2,     1,     1,     1,     1,     1,     1,     1,
-       0,     4,     0,     4,     0,     6,     1,     3,     2,     1,
-       1,     1,     1,     1,     1,     3,     0,     4,     3,     0,
-       4,     0,     6,     0,     4,     1,     3,     2,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
-       0,     4,     3,     0,     4,     3,     3,     0,     4,     1,
-       1,     0,     4,     0,     6,     0,     4,     1,     3,     2,
-       1,     1,     0,     6,     3,     0,     6,     1,     3,     2,
-       0,     4,     1,     3,     2,     1,     1,     1,     1,     1,
-       1,     1,     3,     0,     4,     0,     6,     1,     3,     2,
-       0,     4,     1,     3,     2,     1,     1,     1,     1,     1,
-       0,     4,     3,     3,     3,     0,     4,     0,     6,     1,
-       3,     2,     1,     1,     1,     1,     1,     3,     3,     3,
-       3
+       1,     1,     1,     1,     1,     1,     0,     4,     1,     1,
+       1,     0,     4,     0,     4,     3,     3,     0,     6,     0,
+       1,     1,     3,     2,     0,     4,     1,     3,     2,     1,
+       1,     1,     1,     1,     0,     4,     0,     6,     1,     3,
+       2,     1,     1,     1,     1,     1,     1,     1,     0,     4,
+       1,     0,     4,     0,     4,     0,     6,     0,     1,     1,
+       3,     2,     0,     4,     1,     3,     2,     1,     1,     1,
+       1,     1,     1,     1,     0,     4,     0,     4,     0,     6,
+       1,     3,     2,     1,     1,     1,     1,     1,     1,     3,
+       0,     4,     3,     0,     4,     0,     6,     0,     4,     1,
+       3,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     3,     0,     4,     3,     0,     4,     3,
+       3,     0,     4,     1,     1,     0,     4,     0,     6,     0,
+       4,     1,     3,     2,     1,     1,     0,     6,     3,     0,
+       6,     1,     3,     2,     0,     4,     1,     3,     2,     1,
+       1,     1,     1,     1,     1,     1,     3,     0,     4,     0,
+       6,     1,     3,     2,     0,     4,     1,     3,     2,     1,
+       1,     1,     1,     1,     0,     4,     3,     3,     3,     0,
+       4,     0,     6,     1,     3,     2,     1,     1,     1,     1,
+       1,     3,     3,     3,     3
   };
 
 
@@ -6800,39 +6837,40 @@ namespace isc { namespace dhcp {
     2110,  2110,  2119,  2121,  2123,  2129,  2135,  2141,  2141,  2155,
     2155,  2168,  2169,  2172,  2173,  2174,  2179,  2179,  2189,  2189,
     2199,  2200,  2201,  2206,  2207,  2208,  2209,  2210,  2211,  2212,
-    2213,  2214,  2215,  2218,  2218,  2227,  2233,  2233,  2258,  2258,
-    2288,  2288,  2299,  2300,  2303,  2304,  2305,  2310,  2310,  2319,
-    2319,  2328,  2329,  2332,  2333,  2334,  2340,  2341,  2342,  2343,
-    2344,  2345,  2346,  2347,  2348,  2349,  2350,  2351,  2352,  2353,
-    2354,  2357,  2357,  2366,  2366,  2375,  2375,  2384,  2384,  2393,
-    2393,  2402,  2402,  2411,  2411,  2420,  2420,  2429,  2429,  2438,
-    2438,  2447,  2447,  2461,  2461,  2472,  2475,  2475,  2489,  2489,
-    2500,  2501,  2502,  2507,  2507,  2517,  2518,  2521,  2522,  2523,
-    2528,  2529,  2530,  2531,  2532,  2533,  2534,  2535,  2536,  2537,
-    2538,  2539,  2540,  2541,  2542,  2543,  2544,  2547,  2549,  2549,
-    2558,  2558,  2568,  2574,  2582,  2590,  2590,  2602,  2602,  2614,
-    2615,  2618,  2619,  2620,  2625,  2625,  2633,  2634,  2635,  2640,
-    2641,  2642,  2643,  2644,  2645,  2646,  2647,  2648,  2649,  2650,
-    2651,  2652,  2655,  2655,  2664,  2665,  2666,  2669,  2669,  2679,
-    2679,  2689,  2695,  2701,  2701,  2712,  2713,  2716,  2717,  2718,
-    2723,  2723,  2731,  2732,  2733,  2738,  2739,  2740,  2741,  2742,
-    2745,  2745,  2756,  2756,  2769,  2770,  2771,  2776,  2777,  2778,
-    2779,  2780,  2781,  2782,  2785,  2785,  2793,  2796,  2796,  2805,
-    2805,  2814,  2814,  2825,  2826,  2829,  2830,  2831,  2836,  2836,
-    2844,  2845,  2846,  2851,  2852,  2853,  2854,  2855,  2856,  2857,
-    2860,  2860,  2869,  2869,  2880,  2880,  2893,  2894,  2895,  2900,
-    2901,  2902,  2903,  2904,  2905,  2908,  2914,  2914,  2923,  2929,
-    2929,  2939,  2939,  2952,  2952,  2962,  2963,  2964,  2969,  2970,
-    2971,  2972,  2973,  2974,  2975,  2976,  2977,  2978,  2979,  2982,
-    2988,  2988,  2997,  3003,  3003,  3012,  3018,  3024,  3024,  3033,
-    3034,  3037,  3037,  3048,  3048,  3060,  3060,  3070,  3071,  3072,
-    3078,  3079,  3082,  3082,  3093,  3101,  3101,  3114,  3115,  3116,
-    3122,  3122,  3130,  3131,  3132,  3137,  3138,  3139,  3140,  3141,
-    3142,  3143,  3146,  3152,  3152,  3161,  3161,  3172,  3173,  3174,
-    3179,  3179,  3187,  3188,  3189,  3194,  3195,  3196,  3197,  3198,
-    3201,  3201,  3210,  3216,  3222,  3228,  3228,  3237,  3237,  3248,
-    3249,  3250,  3255,  3256,  3257,  3258,  3259,  3262,  3268,  3274,
-    3280
+    2213,  2214,  2215,  2216,  2217,  2218,  2219,  2220,  2221,  2222,
+    2223,  2224,  2225,  2226,  2227,  2228,  2229,  2232,  2232,  2241,
+    2247,  2247,  2272,  2272,  2302,  2302,  2313,  2314,  2317,  2318,
+    2319,  2324,  2324,  2333,  2333,  2342,  2343,  2346,  2347,  2348,
+    2354,  2355,  2356,  2357,  2358,  2359,  2360,  2361,  2362,  2363,
+    2364,  2365,  2366,  2367,  2368,  2371,  2371,  2380,  2380,  2389,
+    2389,  2398,  2398,  2407,  2407,  2416,  2416,  2425,  2425,  2434,
+    2434,  2443,  2443,  2452,  2452,  2461,  2461,  2475,  2475,  2486,
+    2489,  2489,  2503,  2503,  2514,  2515,  2516,  2521,  2521,  2531,
+    2532,  2535,  2536,  2537,  2542,  2543,  2544,  2545,  2546,  2547,
+    2548,  2549,  2550,  2551,  2552,  2553,  2554,  2555,  2556,  2557,
+    2558,  2561,  2563,  2563,  2572,  2572,  2582,  2588,  2596,  2604,
+    2604,  2616,  2616,  2628,  2629,  2632,  2633,  2634,  2639,  2639,
+    2647,  2648,  2649,  2654,  2655,  2656,  2657,  2658,  2659,  2660,
+    2661,  2662,  2663,  2664,  2665,  2666,  2669,  2669,  2678,  2679,
+    2680,  2683,  2683,  2693,  2693,  2703,  2709,  2715,  2715,  2726,
+    2727,  2730,  2731,  2732,  2737,  2737,  2745,  2746,  2747,  2752,
+    2753,  2754,  2755,  2756,  2759,  2759,  2770,  2770,  2783,  2784,
+    2785,  2790,  2791,  2792,  2793,  2794,  2795,  2796,  2799,  2799,
+    2807,  2810,  2810,  2819,  2819,  2828,  2828,  2839,  2840,  2843,
+    2844,  2845,  2850,  2850,  2858,  2859,  2860,  2865,  2866,  2867,
+    2868,  2869,  2870,  2871,  2874,  2874,  2883,  2883,  2894,  2894,
+    2907,  2908,  2909,  2914,  2915,  2916,  2917,  2918,  2919,  2922,
+    2928,  2928,  2937,  2943,  2943,  2953,  2953,  2966,  2966,  2976,
+    2977,  2978,  2983,  2984,  2985,  2986,  2987,  2988,  2989,  2990,
+    2991,  2992,  2993,  2996,  3002,  3002,  3011,  3017,  3017,  3026,
+    3032,  3038,  3038,  3047,  3048,  3051,  3051,  3062,  3062,  3074,
+    3074,  3084,  3085,  3086,  3092,  3093,  3096,  3096,  3107,  3115,
+    3115,  3128,  3129,  3130,  3136,  3136,  3144,  3145,  3146,  3151,
+    3152,  3153,  3154,  3155,  3156,  3157,  3160,  3166,  3166,  3175,
+    3175,  3186,  3187,  3188,  3193,  3193,  3201,  3202,  3203,  3208,
+    3209,  3210,  3211,  3212,  3215,  3215,  3224,  3230,  3236,  3242,
+    3242,  3251,  3251,  3262,  3263,  3264,  3269,  3270,  3271,  3272,
+    3273,  3276,  3282,  3288,  3294
   };
 
   void
@@ -6865,9 +6903,9 @@ namespace isc { namespace dhcp {
 
 #line 14 "dhcp4_parser.yy"
 } } // isc::dhcp
-#line 6869 "dhcp4_parser.cc"
+#line 6907 "dhcp4_parser.cc"
 
-#line 3286 "dhcp4_parser.yy"
+#line 3300 "dhcp4_parser.yy"
 
 
 void
index 97ecea2e637d65771f48a543615ea87a0c2572be..45ad5d88696b2e4921da5955231d57b583e4b4af 100644 (file)
@@ -5712,7 +5712,7 @@ switch (yykind)
     /// Constants.
     enum
     {
-      yylast_ = 1448,     ///< Last index in yytable_.
+      yylast_ = 1608,     ///< Last index in yytable_.
       yynnts_ = 481,  ///< Number of nonterminal symbols.
       yyfinal_ = 28 ///< Termination state number.
     };
index 26c2df08f2fdf15dd828833180ee5d8a03d42308..d2b505ad446e3e797052e99ca1142128b11b7585 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC")
+/* Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC")
 
    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -2210,6 +2210,20 @@ pool_param: pool_entry
           | network_client_classes
           | require_client_classes
           | evaluate_additional_classes
+          | ddns_send_updates
+          | ddns_override_no_update
+          | ddns_override_client_update
+          | ddns_replace_client_name
+          | ddns_generated_prefix
+          | ddns_qualifying_suffix
+          | ddns_update_on_renew
+          | ddns_conflict_resolution_mode
+          | ddns_ttl_percent
+          | ddns_ttl
+          | ddns_ttl_min
+          | ddns_ttl_max
+          | hostname_char_set
+          | hostname_char_replacement
           | user_context
           | comment
           | unknown_map_entry
index 435407d2258665bacce557c03ff0811e9dc720fd..86c6bdf7e11719e22c7ebfb864c819b3cae4e9d7 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -3179,6 +3179,8 @@ Dhcpv4Srv::assignLease(Dhcpv4Exchange& ex) {
 
     bool reprocess_client_name = false;
     if (lease) {
+        // Since we have a lease check for pool-level DDNS parameters.
+        // If there are any we need to call processClientName() again.
         auto ddns_params = ex.getContext()->getDdnsParams();
         auto pool = ddns_params->setPoolFromAddress(lease->addr_);
         if (pool) {
index dd1f183f1de43e0db1adb657461b8f918d6ce10b..37d19732b1e637ad00c8e14078112485ea29dfc9 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -8450,4 +8450,125 @@ TEST_F(Dhcp4ParserTest, ddnsTtlMax) {
     EXPECT_EQ(750, subnet->getDdnsTtlMax(Network::Inheritance::GLOBAL).get());
 }
 
+TEST_F(Dhcp4ParserTest, poolDdnsParameters) {
+    string config = R"(
+    {
+        "valid-lifetime": 4000,
+        "subnet4": [{
+            "id": 1,
+            "subnet": "192.0.0.0/16",
+            "pools": [{
+                "pool": "192.0.1.0/24",
+                "ddns-send-updates": true,
+                "ddns-override-no-update": true,
+                "ddns-override-client-update": true,
+                "ddns-replace-client-name": "always",
+                "ddns-generated-prefix": "prefix", 
+                "ddns-qualifying-suffix": "suffix", 
+                "hostname-char-set": "[a-z]",
+                "hostname-char-replacement": "X",
+                "ddns-update-on-renew": true, 
+                "ddns-ttl-percent": 0.5,
+                "ddns-conflict-resolution-mode": "check-with-dhcid",
+                "ddns-ttl-min": 200,
+                "ddns-ttl-max": 500 
+            },
+            {
+                "pool": "192.0.2.0/24",
+                "ddns-ttl": 300
+            }]
+        }]
+    }
+    )";
+
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
+    extractConfig(config);
+
+    ConstElementPtr status;
+    EXPECT_NO_THROW(status = Dhcpv4SrvTest::configure(*srv_, json));
+
+    // returned value should be 0 (success)
+    checkResult(status, 0);
+
+    // Commit it so global inheritance works.
+    CfgMgr::instance().commit();
+
+    ConstSubnet4Ptr subnet = CfgMgr::instance().getCurrentCfg()->
+        getCfgSubnets4()->selectSubnet(IOAddress("192.0.0.0"));
+    ASSERT_TRUE(subnet);
+
+    const PoolCollection pools = subnet->getPools(Lease::TYPE_V4);
+    ASSERT_GE(pools.size(), 2);
+
+    // First pool specifies all but ddns-ttl.
+    PoolPtr pool = pools.at(0);
+    ASSERT_TRUE(pool);
+    
+    ASSERT_FALSE(pool->getDdnsSendUpdates().unspecified());
+    EXPECT_TRUE(pool->getDdnsSendUpdates().get());
+
+    ASSERT_FALSE(pool->getDdnsOverrideNoUpdate().unspecified());
+    EXPECT_TRUE(pool->getDdnsOverrideNoUpdate().get());
+
+    ASSERT_FALSE(pool->getDdnsOverrideClientUpdate().unspecified());
+    EXPECT_TRUE(pool->getDdnsOverrideClientUpdate().get());
+
+    ASSERT_FALSE(pool->getDdnsReplaceClientNameMode().unspecified());
+    EXPECT_EQ(pool->getDdnsReplaceClientNameMode().get(), 
+              D2ClientConfig::RCM_ALWAYS);
+
+    ASSERT_FALSE(pool->getDdnsGeneratedPrefix().unspecified());
+    EXPECT_EQ(pool->getDdnsGeneratedPrefix().get(), "prefix");
+
+    ASSERT_FALSE(pool->getDdnsQualifyingSuffix().unspecified());
+    EXPECT_EQ(pool->getDdnsQualifyingSuffix().get(), "suffix");
+
+    ASSERT_FALSE(pool->getHostnameCharSet().unspecified());
+    EXPECT_EQ(pool->getHostnameCharSet().get(), "[a-z]");
+
+    ASSERT_FALSE(pool->getHostnameCharReplacement().unspecified());
+    EXPECT_EQ(pool->getHostnameCharReplacement().get(), "X");
+
+    ASSERT_FALSE(pool->getDdnsUpdateOnRenew().unspecified());
+    EXPECT_TRUE(pool->getDdnsUpdateOnRenew().get());
+
+    ASSERT_FALSE(pool->getDdnsTtlPercent().unspecified());
+    EXPECT_EQ(pool->getDdnsTtlPercent().get(), 0.5);
+
+    ASSERT_FALSE(pool->getDdnsConflictResolutionMode().unspecified());
+    EXPECT_EQ(pool->getDdnsConflictResolutionMode().get(), "check-with-dhcid");
+
+    ASSERT_TRUE(pool->getDdnsTtl().unspecified());
+
+    ASSERT_FALSE(pool->getDdnsTtlMin().unspecified());
+    EXPECT_EQ(pool->getDdnsTtlMin().get(), 200);
+
+    ASSERT_FALSE(pool->getDdnsTtlMax().unspecified());
+    EXPECT_EQ(pool->getDdnsTtlMax().get(), 500);
+
+    // Second pool only specifies ddns-ttl.
+    pool = pools.at(1);
+    ASSERT_TRUE(pool);
+    
+    ASSERT_TRUE(pool->getDdnsSendUpdates().unspecified());
+    ASSERT_TRUE(pool->getDdnsOverrideNoUpdate().unspecified());
+    ASSERT_TRUE(pool->getDdnsOverrideClientUpdate().unspecified());
+    ASSERT_TRUE(pool->getDdnsReplaceClientNameMode().unspecified());
+    ASSERT_TRUE(pool->getDdnsGeneratedPrefix().unspecified());
+    ASSERT_TRUE(pool->getDdnsQualifyingSuffix().unspecified());
+    ASSERT_TRUE(pool->getHostnameCharSet().unspecified());
+    ASSERT_TRUE(pool->getHostnameCharReplacement().unspecified());
+    ASSERT_TRUE(pool->getDdnsUpdateOnRenew().unspecified());
+    ASSERT_TRUE(pool->getDdnsTtlPercent().unspecified());
+    ASSERT_TRUE(pool->getDdnsConflictResolutionMode().unspecified());
+    ASSERT_TRUE(pool->getDdnsTtlMin().unspecified());
+
+    ASSERT_FALSE(pool->getDdnsTtl().unspecified());
+    EXPECT_EQ(pool->getDdnsTtl().get(), 300);
+
+    ASSERT_TRUE(pool->getDdnsTtlMax().unspecified());
+}
+
+
 }  // namespace
index 8c3c6b4416479866c1f1706e89671a3a8be4ac5d..586cad25e95e45c3c791a926eb2d97a4dadeb3bc 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2013-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2013-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -772,7 +772,7 @@ public:
 
     }
 
-    /// @brief Verifies that DDNS TTL parameters are used when specified. 
+    /// @brief Verifies that DDNS TTL parameters are used when specified.
     ///
     /// @param valid_flt lease life time
     /// @param ddns_ttl_percent expected configured value for ddns-ttl-percent
@@ -786,10 +786,10 @@ public:
                                Optional<uint32_t> ddns_ttl_max = Optional<uint32_t>()) {
 
         std::string config_header = R"(
-        { 
+        {
             "interfaces-config": { "interfaces": [ "*" ] },
             "subnet4": [ {
-                "subnet": "10.0.0.0/24", 
+                "subnet": "10.0.0.0/24",
                 "interface": "eth1",
                 "id": 1,
                 "pools": [ { "pool": "10.0.0.10-10.0.0.10" } ]
@@ -859,13 +859,135 @@ public:
                                 resp->getYiaddr().toText(),
                                 "client1.example.com.", "",
                                 time(NULL), lease->valid_lft_, true,
-                                CHECK_WITH_DHCID, 
-                                ddns_ttl_percent, 
-                                ddns_ttl, 
-                                ddns_ttl_min, 
+                                CHECK_WITH_DHCID,
+                                ddns_ttl_percent,
+                                ddns_ttl,
+                                ddns_ttl_min,
                                 ddns_ttl_max);
     }
 
+    /// @brief Verifies that DDNS parameters specified at the pool level
+    /// are used when specified. We don't verify all of them, just enough
+    /// enough to ensure proper scoping of values.
+    void testPoolDdnsParameters() {
+        std::string config = R"(
+        {
+            "interfaces-config": { "interfaces": [ "*" ] },
+            "dhcp-ddns": { "enable-updates": true },
+            "subnet4": [{
+                "subnet": "10.0.0.0/24",
+                "interface": "eth1",
+                "id": 1,
+                "ddns-qualifying-suffix": "subfix.com",
+                "pools": [{
+                    "pool": "10.0.0.10-10.0.0.10",
+                    "ddns-qualifying-suffix": "poolfix.com",
+                },
+                {
+                    "pool": "10.0.0.11-10.0.0.11"
+                },
+                {
+                    "pool": "10.0.0.12-10.0.0.12",
+                    "ddns-send-updates": false
+                }]
+              }],
+              "valid-lifetime": 400
+        })";
+
+        // Load theconfiguration with D2 enabled.
+        ASSERT_NO_FATAL_FAILURE(configure(config, *srv_));
+        ASSERT_TRUE(CfgMgr::instance().ddnsEnabled());
+
+        // Create a client and get a lease.
+        Dhcp4Client client1(srv_, Dhcp4Client::SELECTING);
+        client1.setIfaceName("eth1");
+        client1.setIfaceIndex(ETH1_INDEX);
+        ASSERT_NO_THROW(client1.includeHostname("client1"));
+
+        // Do the DORA.
+        ASSERT_NO_THROW(client1.doDORA());
+        Pkt4Ptr resp = client1.getContext().response_;
+        ASSERT_TRUE(resp);
+        ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
+
+        // Make sure the lease is in the database and hostname uses the
+        // first pool's qualifying suffix.
+        Lease4Ptr lease = LeaseMgrFactory::instance().getLease4(IOAddress("10.0.0.10"));
+        ASSERT_TRUE(lease);
+        EXPECT_EQ("client1.poolfix.com", lease->hostname_);
+
+        // Verify the hostname option sent in the response.
+        OptionStringPtr hostname;
+        hostname = boost::dynamic_pointer_cast<OptionString>(resp->getOption(DHO_HOST_NAME));
+        ASSERT_TRUE(hostname);
+        EXPECT_EQ("client1.poolfix.com", hostname->getValue());
+
+        // Verify that an NCR was generated correctly.
+        ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize());
+        verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true,
+                                resp->getYiaddr().toText(),
+                                "client1.poolfix.com.", "",
+                                time(NULL), lease->valid_lft_, true,
+                                CHECK_WITH_DHCID);
+
+        // Create another client and get a lease.
+        Dhcp4Client client2(srv_, Dhcp4Client::SELECTING);
+        client2.setIfaceName("eth1");
+        client2.setIfaceIndex(ETH1_INDEX);
+        ASSERT_NO_THROW(client2.includeHostname("client2"));
+
+        // Do the DORA.
+        ASSERT_NO_THROW(client2.doDORA());
+        resp = client2.getContext().response_;
+        ASSERT_TRUE(resp);
+        ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
+
+        // Make sure the lease is in the database and hostname uses the subnet's
+        // qualifying suffix.
+        lease = LeaseMgrFactory::instance().getLease4(IOAddress("10.0.0.11"));
+        ASSERT_TRUE(lease);
+        EXPECT_EQ("client2.subfix.com", lease->hostname_);
+
+        // Verify the hostname option sent in the response.
+        hostname = boost::dynamic_pointer_cast<OptionString>(resp->getOption(DHO_HOST_NAME));
+        ASSERT_TRUE(hostname);
+        EXPECT_EQ("client2.subfix.com", hostname->getValue());
+
+        // Verify that an NCR was generated correctly.
+        ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize());
+        verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true,
+                                resp->getYiaddr().toText(),
+                                "client2.subfix.com.", "",
+                                time(NULL), lease->valid_lft_, true,
+                                CHECK_WITH_DHCID);
+
+        // Create another third client and get a lease.
+        Dhcp4Client client3(srv_, Dhcp4Client::SELECTING);
+        client3.setIfaceName("eth1");
+        client3.setIfaceIndex(ETH1_INDEX);
+        ASSERT_NO_THROW(client3.includeHostname("client3"));
+
+        // Do the DORA.
+        ASSERT_NO_THROW(client3.doDORA());
+        resp = client3.getContext().response_;
+        ASSERT_TRUE(resp);
+        ASSERT_EQ(DHCPACK, static_cast<int>(resp->getType()));
+
+        // Make sure the lease is in the database and hostname uses the subnet suffix.
+        lease = LeaseMgrFactory::instance().getLease4(IOAddress("10.0.0.12"));
+        ASSERT_TRUE(lease);
+        EXPECT_EQ("client3.subfix.com", lease->hostname_);
+
+        // Verify the hostname option sent in the response.
+        hostname = boost::dynamic_pointer_cast<OptionString>(resp->getOption(DHO_HOST_NAME));
+        ASSERT_TRUE(hostname);
+        EXPECT_EQ("client3.subfix.com", hostname->getValue());
+
+        // There should not be an NCR in the queue since the third pool
+        // disables DDNS updates.
+        ASSERT_EQ(0, CfgMgr::instance().getD2ClientMgr().getQueueSize());
+    }
+
     ///@brief Verify that NameChangeRequest holds valid values.
     ///
     /// Pulls the NCR from the top of the send queue and checks its content
@@ -927,7 +1049,7 @@ public:
         // time for equality but rather check that the lease expiration time
         // is not greater than the current time + lease lifetime.
 
-        uint32_t ttl = calculateDdnsTtl(valid_lft, ddns_ttl_percent, 
+        uint32_t ttl = calculateDdnsTtl(valid_lft, ddns_ttl_percent,
                                         ddns_ttl, ddns_ttl_min, ddns_ttl_max);
 
         if (not_strict_expire_check) {
@@ -3072,7 +3194,7 @@ TEST_F(NameDhcpv4SrvTest, ddnsTtlTest) {
     testDdnsTtlParameters(2100,                     // valid lft
                           Optional<double>(),       // percent
                           999,                      // ttl
-                          Optional<uint32_t>(),     // min 
+                          Optional<uint32_t>(),     // min
                           Optional<uint32_t>());    // max
 }
 
@@ -3080,7 +3202,7 @@ TEST_F(NameDhcpv4SrvTest, ddnsTtlTest) {
 TEST_F(NameDhcpv4SrvTest, ddnsTtlMinTest) {
     testDdnsTtlParameters(2100,                     // valid lft
                           Optional<double>(),       // percent
-                          Optional<uint32_t>(),     // ttl 
+                          Optional<uint32_t>(),     // ttl
                           800,                      // ttl-min
                           Optional<uint32_t>());    // ttl-max
 }
@@ -3089,9 +3211,14 @@ TEST_F(NameDhcpv4SrvTest, ddnsTtlMinTest) {
 TEST_F(NameDhcpv4SrvTest, ddnsTtlMaxTest) {
     testDdnsTtlParameters(2100,                     // valid lft
                           Optional<double>(),       // percent
-                          Optional<uint32_t>(),     // ttl 
+                          Optional<uint32_t>(),     // ttl
                           Optional<uint32_t>(),     // ttl-min
-                          500);                     // ttl-max 
+                          500);                     // ttl-max
+}
+
+// Verify pool-level DDNS pararmeters are used.
+TEST_F(NameDhcpv4SrvTest, poolDdnsParametersTest) {
+    testPoolDdnsParameters();
 }
 
 } // end of anonymous namespace
index ee35d08283ff57f30933b156ca2f6bf06973c484..3bb09076160e354817d6ee24dd131b3a91e0afd2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2017-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -2724,6 +2724,38 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 87
+"{\n"
+"        \"subnet4\": [\n"
+"            {\n"
+"                \"id\": 1,\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+"                        \"ddns-generated-prefix\": \"prefix\",\n"
+"                        \"ddns-override-client-update\": true,\n"
+"                        \"ddns-override-no-update\": true,\n"
+"                        \"ddns-qualifying-suffix\": \"suffix\",\n"
+"                        \"ddns-replace-client-name\": \"always\",\n"
+"                        \"ddns-send-updates\": true,\n"
+"                        \"ddns-ttl-max\": 500,\n"
+"                        \"ddns-ttl-min\": 200,\n"
+"                        \"ddns-ttl-percent\": 0.5,\n"
+"                        \"ddns-update-on-renew\": true,\n"
+"                        \"hostname-char-replacement\": \"X\",\n"
+"                        \"hostname-char-set\": \"[a-z]\",\n"
+"                        \"pool\": \"192.0.1.0/24\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"ddns-ttl\": 300,\n"
+"                        \"pool\": \"192.0.2.0/24\"\n"
+"                    }\n"
+"                ],\n"
+"                \"subnet\": \"192.0.0.0/16\"\n"
+"            }\n"
+"        ],\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n"
 };
 
@@ -14119,6 +14151,134 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"t1-percent\": 0.5,\n"
 "        \"t2-percent\": 0.875,\n"
 "        \"valid-lifetime\": 4000\n"
+"    }\n",
+    // CONFIGURATION 87
+"{\n"
+"        \"allocator\": \"iterative\",\n"
+"        \"authoritative\": false,\n"
+"        \"boot-file-name\": \"\",\n"
+"        \"calculate-tee-times\": false,\n"
+"        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+"        \"ddns-generated-prefix\": \"myhost\",\n"
+"        \"ddns-override-client-update\": false,\n"
+"        \"ddns-override-no-update\": false,\n"
+"        \"ddns-qualifying-suffix\": \"\",\n"
+"        \"ddns-replace-client-name\": \"never\",\n"
+"        \"ddns-send-updates\": true,\n"
+"        \"ddns-update-on-renew\": false,\n"
+"        \"decline-probation-period\": 86400,\n"
+"        \"dhcp-ddns\": {\n"
+"            \"enable-updates\": false,\n"
+"            \"max-queue-size\": 1024,\n"
+"            \"ncr-format\": \"JSON\",\n"
+"            \"ncr-protocol\": \"UDP\",\n"
+"            \"sender-ip\": \"0.0.0.0\",\n"
+"            \"sender-port\": 0,\n"
+"            \"server-ip\": \"127.0.0.1\",\n"
+"            \"server-port\": 53001\n"
+"        },\n"
+"        \"dhcp-queue-control\": {\n"
+"            \"capacity\": 64,\n"
+"            \"enable-queue\": false,\n"
+"            \"queue-type\": \"kea-ring4\"\n"
+"        },\n"
+"        \"dhcp4o6-port\": 0,\n"
+"        \"early-global-reservations-lookup\": false,\n"
+"        \"echo-client-id\": true,\n"
+"        \"expired-leases-processing\": {\n"
+"            \"flush-reclaimed-timer-wait-time\": 25,\n"
+"            \"hold-reclaimed-time\": 3600,\n"
+"            \"max-reclaim-leases\": 100,\n"
+"            \"max-reclaim-time\": 250,\n"
+"            \"reclaim-timer-wait-time\": 10,\n"
+"            \"unwarned-reclaim-cycles\": 5\n"
+"        },\n"
+"        \"hooks-libraries\": [ ],\n"
+"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\", \"circuit-id\", \"client-id\" ],\n"
+"        \"hostname-char-replacement\": \"\",\n"
+"        \"hostname-char-set\": \"[^A-Za-z0-9.-]\",\n"
+"        \"interfaces-config\": {\n"
+"            \"interfaces\": [ ],\n"
+"            \"re-detect\": false\n"
+"        },\n"
+"        \"ip-reservations-unique\": true,\n"
+"        \"lease-database\": {\n"
+"            \"type\": \"memfile\"\n"
+"        },\n"
+"        \"match-client-id\": true,\n"
+"        \"multi-threading\": {\n"
+"            \"enable-multi-threading\": true,\n"
+"            \"packet-queue-size\": 64,\n"
+"            \"thread-pool-size\": 0\n"
+"        },\n"
+"        \"next-server\": \"0.0.0.0\",\n"
+"        \"option-data\": [ ],\n"
+"        \"option-def\": [ ],\n"
+"        \"parked-packet-limit\": 256,\n"
+"        \"reservations-global\": false,\n"
+"        \"reservations-in-subnet\": true,\n"
+"        \"reservations-lookup-first\": false,\n"
+"        \"reservations-out-of-pool\": false,\n"
+"        \"sanity-checks\": {\n"
+"            \"extended-info-checks\": \"fix\",\n"
+"            \"lease-checks\": \"warn\"\n"
+"        },\n"
+"        \"server-hostname\": \"\",\n"
+"        \"server-tag\": \"\",\n"
+"        \"shared-networks\": [ ],\n"
+"        \"stash-agent-options\": false,\n"
+"        \"statistic-default-sample-age\": 0,\n"
+"        \"statistic-default-sample-count\": 20,\n"
+"        \"store-extended-info\": false,\n"
+"        \"subnet4\": [\n"
+"            {\n"
+"                \"4o6-interface\": \"\",\n"
+"                \"4o6-interface-id\": \"\",\n"
+"                \"4o6-subnet\": \"\",\n"
+"                \"allocator\": \"iterative\",\n"
+"                \"calculate-tee-times\": false,\n"
+"                \"id\": 1,\n"
+"                \"max-valid-lifetime\": 4000,\n"
+"                \"min-valid-lifetime\": 4000,\n"
+"                \"option-data\": [ ],\n"
+"                \"pools\": [\n"
+"                    {\n"
+"                        \"ddns-conflict-resolution-mode\": \"check-with-dhcid\",\n"
+"                        \"ddns-generated-prefix\": \"prefix\",\n"
+"                        \"ddns-override-client-update\": true,\n"
+"                        \"ddns-override-no-update\": true,\n"
+"                        \"ddns-qualifying-suffix\": \"suffix\",\n"
+"                        \"ddns-replace-client-name\": \"always\",\n"
+"                        \"ddns-send-updates\": true,\n"
+"                        \"ddns-ttl-max\": 500,\n"
+"                        \"ddns-ttl-min\": 200,\n"
+"                        \"ddns-ttl-percent\": 0.5,\n"
+"                        \"ddns-update-on-renew\": true,\n"
+"                        \"hostname-char-replacement\": \"X\",\n"
+"                        \"hostname-char-set\": \"[a-z]\",\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"192.0.1.0/24\"\n"
+"                    },\n"
+"                    {\n"
+"                        \"ddns-ttl\": 300,\n"
+"                        \"option-data\": [ ],\n"
+"                        \"pool\": \"192.0.2.0/24\"\n"
+"                    }\n"
+"                ],\n"
+"                \"relay\": {\n"
+"                    \"ip-addresses\": [ ]\n"
+"                },\n"
+"                \"reservations\": [ ],\n"
+"                \"store-extended-info\": false,\n"
+"                \"subnet\": \"192.0.0.0/16\",\n"
+"                \"t1-percent\": 0.5,\n"
+"                \"t2-percent\": 0.875,\n"
+"                \"valid-lifetime\": 4000\n"
+"            }\n"
+"        ],\n"
+"        \"t1-percent\": 0.5,\n"
+"        \"t2-percent\": 0.875,\n"
+"        \"valid-lifetime\": 4000\n"
 "    }\n"
 };
 
index 4929a5ad36f6275a3d497186b9b3ce05c325712d..e409cc252b0da39746bdcd90bc89ec943981ea12 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2019-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -140,108 +140,7 @@ BaseNetworkParser::parseCacheParams(const ConstElementPtr& network_data,
 void
 BaseNetworkParser::parseDdnsParams(const data::ConstElementPtr& network_data,
                                    NetworkPtr& network) {
-
-    if (network_data->contains("ddns-send-updates")) {
-        network->setDdnsSendUpdates(getBoolean(network_data, "ddns-send-updates"));
-    }
-
-    if (network_data->contains("ddns-override-no-update")) {
-        network->setDdnsOverrideNoUpdate(getBoolean(network_data, "ddns-override-no-update"));
-    }
-
-    if (network_data->contains("ddns-override-client-update")) {
-        network->setDdnsOverrideClientUpdate(getBoolean(network_data, "ddns-override-client-update"));
-    }
-
-    if (network_data->contains("ddns-replace-client-name")) {
-        network->setDdnsReplaceClientNameMode(getAndConvert<D2ClientConfig::ReplaceClientNameMode,
-                                                            D2ClientConfig::stringToReplaceClientNameMode>
-                                                            (network_data, "ddns-replace-client-name",
-                                                             "ReplaceClientName mode"));
-    }
-
-    if (network_data->contains("ddns-generated-prefix")) {
-        network->setDdnsGeneratedPrefix(getString(network_data, "ddns-generated-prefix"));
-    }
-
-    if (network_data->contains("ddns-qualifying-suffix")) {
-        network->setDdnsQualifyingSuffix(getString(network_data, "ddns-qualifying-suffix"));
-    }
-
-    std::string hostname_char_set;
-    if (network_data->contains("hostname-char-set")) {
-        hostname_char_set = getString(network_data, "hostname-char-set");
-        network->setHostnameCharSet(hostname_char_set);
-    }
-
-    std::string hostname_char_replacement;
-    if (network_data->contains("hostname-char-replacement")) {
-        hostname_char_replacement = getString(network_data, "hostname-char-replacement");
-        network->setHostnameCharReplacement(hostname_char_replacement);
-    }
-
-    // We need to validate sanitizer values here so we can detect problems and
-    // cause a configuration.  We don't retain the compilation because it's not
-    // something we can inherit.
-    if (!hostname_char_set.empty()) {
-        try {
-            str::StringSanitizerPtr sanitizer(new str::StringSanitizer(hostname_char_set,
-                                                                       hostname_char_replacement));
-        } catch (const std::exception& ex) {
-            isc_throw(BadValue, "hostname-char-set '" << hostname_char_set
-                      << "' is not a valid regular expression");
-        }
-    }
-
-    if (network_data->contains("ddns-update-on-renew")) {
-        network->setDdnsUpdateOnRenew(getBoolean(network_data, "ddns-update-on-renew"));
-    }
-
-    bool has_ddns_ttl = false;
-    uint32_t ddns_ttl = 0;
-    if (network_data->contains("ddns-ttl")) {
-        ddns_ttl = getInteger(network_data, "ddns-ttl");
-        network->setDdnsTtl(ddns_ttl);
-        has_ddns_ttl = true;
-    }
-
-    if (network_data->contains("ddns-ttl-percent")) {
-        if (has_ddns_ttl) {
-            isc_throw(BadValue, "cannot specify both ddns-ttl-percent and ddns-ttl");
-        }
-
-        network->setDdnsTtlPercent(getDouble(network_data, "ddns-ttl-percent"));
-    }
-
-    uint32_t ddns_ttl_min = 0;
-    if (network_data->contains("ddns-ttl-min")) {
-        if (has_ddns_ttl) {
-            isc_throw(BadValue, "cannot specify both ddns-ttl-min and ddns-ttl");
-        }
-
-        ddns_ttl_min = getInteger(network_data, "ddns-ttl-min");
-        network->setDdnsTtlMin(ddns_ttl_min);
-    }
-
-    if (network_data->contains("ddns-ttl-max")) {
-        if (has_ddns_ttl) {
-            isc_throw(BadValue, "cannot specify both ddns-ttl-max and ddns-ttl");
-        }
-
-        uint32_t ddns_ttl_max = getInteger(network_data, "ddns-ttl-max");
-        if (ddns_ttl_max < ddns_ttl_min) {
-            isc_throw(BadValue, "ddns-ttl-max: " << ddns_ttl_max 
-                      << " must be greater than ddns-ttl-min: " <<  ddns_ttl_min);
-        }
-
-        network->setDdnsTtlMax(ddns_ttl_max);
-    }
-
-    // For backward compatibility, ddns-conflict-resolution-mode is optional.
-    if (network_data->contains("ddns-conflict-resolution-mode")) {
-        network->setDdnsConflictResolutionMode(getString(network_data,
-                                                         "ddns-conflict-resolution-mode"));
-    }
+    parseDdnsParameters(network_data, network);
 }
 
 void
index 73af4b9a12fb698ef4b91665ed1d2cc7f1ba69f1..4b071a1b8452effa934359b54d07a29e2a18cde6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2019-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -146,6 +146,136 @@ public:
     /// @throw DhcpConfigError if both entries are present.
     static void getClientClassesElem(data::ConstElementPtr params,
                                      ClassAdderFunc adder_func);
+
+    /// @brief Parses parameters pertaining to DDNS behavior.
+    ///
+    /// The parsed parameters are:
+    /// - ddns-send-updates
+    /// - ddns-override-no-update
+    /// - ddns-override-client-update
+    /// - ddns-replace-client-name
+    /// - ddns-generated-prefix
+    /// - ddns-qualifying-suffix
+    /// - ddns-use-conflict-resolution (retained for backward compatibility)
+    /// - ddns-update-on-renew
+    /// - ddns-ttl-percent
+    /// - ddns-conflict-resolution-mode
+    ///
+    /// Owner types are expected to have public setters for each of these
+    /// paramters.
+    ///
+    /// @tparam DdnsOwnerPtr pointer to the class type that owns the DDNS parameters  
+    /// @param config configuration element holding the DDNS paramters to parse.
+    /// @param owner Pointer to the DDNS parameter owner object into which parsed values
+    /// should be stored.
+    /// @throw BadValue for various invalid values.
+    template<typename DdnsOwnerTypePtr>
+    void parseDdnsParameters(const data::ConstElementPtr& config,
+                             DdnsOwnerTypePtr owner) {
+
+        if (config->contains("ddns-send-updates")) {
+            owner->setDdnsSendUpdates(getBoolean(config, "ddns-send-updates"));
+        }
+
+        if (config->contains("ddns-override-no-update")) {
+            owner->setDdnsOverrideNoUpdate(getBoolean(config, "ddns-override-no-update"));
+        }
+
+        if (config->contains("ddns-override-client-update")) {
+            owner->setDdnsOverrideClientUpdate(getBoolean(config, "ddns-override-client-update"));
+        }
+
+        if (config->contains("ddns-replace-client-name")) {
+            owner->setDdnsReplaceClientNameMode(getAndConvert<D2ClientConfig::ReplaceClientNameMode,
+                                                              D2ClientConfig::stringToReplaceClientNameMode>
+                                                              (config, "ddns-replace-client-name",
+                                                              "ReplaceClientName mode"));
+        }
+
+        if (config->contains("ddns-generated-prefix")) {
+            owner->setDdnsGeneratedPrefix(getString(config, "ddns-generated-prefix"));
+        }
+
+        if (config->contains("ddns-qualifying-suffix")) {
+            owner->setDdnsQualifyingSuffix(getString(config, "ddns-qualifying-suffix"));
+        }
+
+        std::string hostname_char_set;
+        if (config->contains("hostname-char-set")) {
+            hostname_char_set = getString(config, "hostname-char-set");
+            owner->setHostnameCharSet(hostname_char_set);
+        }
+
+        std::string hostname_char_replacement;
+        if (config->contains("hostname-char-replacement")) {
+            hostname_char_replacement = getString(config, "hostname-char-replacement");
+            owner->setHostnameCharReplacement(hostname_char_replacement);
+        }
+
+        // We need to validate sanitizer values here so we can detect problems and
+        // cause a configuration.  We don't retain the compilation because it's not
+        // something we can inherit.
+        if (!hostname_char_set.empty()) {
+            try {
+                util::str::StringSanitizerPtr sanitizer(
+                    new util::str::StringSanitizer(hostname_char_set,
+                                                   hostname_char_replacement));
+            } catch (const std::exception& ex) {
+                isc_throw(BadValue, "hostname-char-set '" << hostname_char_set
+                          << "' is not a valid regular expression");
+            }
+        }
+
+        if (config->contains("ddns-update-on-renew")) {
+            owner->setDdnsUpdateOnRenew(getBoolean(config, "ddns-update-on-renew"));
+        }
+
+        bool has_ddns_ttl = false;
+        uint32_t ddns_ttl = 0;
+        if (config->contains("ddns-ttl")) {
+            ddns_ttl = getInteger(config, "ddns-ttl");
+            owner->setDdnsTtl(ddns_ttl);
+            has_ddns_ttl = true;
+        }
+
+        if (config->contains("ddns-ttl-percent")) {
+            if (has_ddns_ttl) {
+                isc_throw(BadValue, "cannot specify both ddns-ttl-percent and ddns-ttl");
+            }
+
+            owner->setDdnsTtlPercent(getDouble(config, "ddns-ttl-percent"));
+        }
+
+        uint32_t ddns_ttl_min = 0;
+        if (config->contains("ddns-ttl-min")) {
+            if (has_ddns_ttl) {
+                isc_throw(BadValue, "cannot specify both ddns-ttl-min and ddns-ttl");
+            }
+
+            ddns_ttl_min = getInteger(config, "ddns-ttl-min");
+            owner->setDdnsTtlMin(ddns_ttl_min);
+        }
+
+        if (config->contains("ddns-ttl-max")) {
+            if (has_ddns_ttl) {
+                isc_throw(BadValue, "cannot specify both ddns-ttl-max and ddns-ttl");
+            }
+
+            uint32_t ddns_ttl_max = getInteger(config, "ddns-ttl-max");
+            if (ddns_ttl_max < ddns_ttl_min) {
+                isc_throw(BadValue, "ddns-ttl-max: " << ddns_ttl_max 
+                          << " must be greater than ddns-ttl-min: " <<  ddns_ttl_min);
+            }
+
+            owner->setDdnsTtlMax(ddns_ttl_max);
+        }
+
+        // For backward compatibility, ddns-conflict-resolution-mode is optional.
+        if (config->contains("ddns-conflict-resolution-mode")) {
+            owner->setDdnsConflictResolutionMode(getString(config,
+                                                           "ddns-conflict-resolution-mode"));
+        }
+    }
 };
 
 } // end of namespace isc::dhcp
index 005377533f016e7af1cb59423cb383923e12a880..a0902fecfa9a4716fdf15889b2e06c295f047cf6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2013-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2013-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -537,6 +537,10 @@ PoolParser::parse(PoolStoragePtr pools,
     BaseNetworkParser::getAdditionalClassesElem(pool_structure,
                                                 std::bind(&Pool::addAdditionalClass,
                                                           pool, ph::_1));
+
+    // Parse DDNS behavioral parameters.
+    BaseNetworkParser parser;
+    parser.parseDdnsParameters(pool_structure, pool);
 }
 
 boost::shared_ptr<OptionDataListParser>
index bf0b003289715428f38ce77deedea83d3d4ce99b..151ea5e6bdd66a55bf445416c8e822d300b0362c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2016-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2016-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -332,16 +332,30 @@ const ParamsList SimpleParser4::INHERIT_TO_SUBNET4 = {
 /// list and map types for entries.
 /// Order follows pool_param rules in bison grammar.
 const SimpleKeywords SimpleParser4::POOL4_PARAMETERS = {
-    { "pool",                        Element::string },
-    { "pool-id",                     Element::integer },
-    { "option-data",                 Element::list },
-    { "client-class",                Element::string },
-    { "client-classes",              Element::list },
-    { "require-client-classes",      Element::list },
-    { "evaluate-additional-classes", Element::list },
-    { "user-context",                Element::map },
-    { "comment",                     Element::string },
-    { "metadata",                    Element::map }
+    { "pool",                           Element::string },
+    { "pool-id",                        Element::integer },
+    { "option-data",                    Element::list },
+    { "client-class",                   Element::string },
+    { "client-classes",                 Element::list },
+    { "require-client-classes",         Element::list },
+    { "evaluate-additional-classes",    Element::list },
+    { "user-context",                   Element::map },
+    { "comment",                        Element::string },
+    { "metadata",                       Element::map },
+    { "ddns-send-updates",              Element::boolean },
+    { "ddns-override-no-update",        Element::boolean },
+    { "ddns-override-client-update",    Element::boolean },
+    { "ddns-replace-client-name",       Element::string },
+    { "ddns-generated-prefix",          Element::string },
+    { "ddns-qualifying-suffix",         Element::string },
+    { "hostname-char-set",              Element::string },
+    { "hostname-char-replacement",      Element::string },
+    { "ddns-update-on-renew",           Element::boolean },
+    { "ddns-ttl-percent",               Element::real },
+    { "ddns-conflict-resolution-mode",  Element::string },
+    { "ddns-ttl",                       Element::integer },
+    { "ddns-ttl-min",                   Element::integer },
+    { "ddns-ttl-max",                   Element::integer }
 };
 
 /// @brief This table defines all shared network parameters for DHCPv4.
index af1ef3dacab4b2724e2bf28ff7672ed57702b3c1..5ddbc0175e9b945bcc7aef85dd04ba7bebdfad6c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2025 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -4337,4 +4337,110 @@ TEST_F(DhcpParserTest, invalidDdnsTtlParmatersSubnet6) {
     invalidDdnsTtlParmatersSubnet<Subnet6ConfigParser>(AF_INET6);
 }
 
+// Verifies valid DDNS parameters in v4 pools.  As this uses the
+// same parser as Network derivatives we skip retesting all the
+// invalid permuations. This test ensures all supported
+// parameters can be set. 
+TEST_F(DhcpParserTest, validDdnsParmatersPool4) {
+
+    std::string config =
+       R"^([{
+            "pool": "192.0.1.0/24",
+            "ddns-send-updates": true,
+            "ddns-override-no-update": true,
+            "ddns-override-client-update": true,
+            "ddns-replace-client-name": "always",
+            "ddns-generated-prefix": "prefix", 
+            "ddns-qualifying-suffix": "suffix", 
+            "hostname-char-set": "[a-z]",
+            "hostname-char-replacement": "X",
+            "ddns-update-on-renew": true, 
+            "ddns-ttl-percent": 0.5,
+            "ddns-conflict-resolution-mode": "check-with-dhcid",
+            "ddns-ttl-min": 200,
+            "ddns-ttl-max": 500 
+        },
+        {
+            "pool": "192.0.2.0/24",
+            "ddns-ttl": 300
+        }])^";
+
+    ElementPtr config_element = Element::fromJSON(config);
+
+    PoolStoragePtr pools(new PoolStorage());
+    Pools4ListParser parser;
+    ASSERT_NO_THROW_LOG(parser.parse(pools, config_element));
+
+    // Should have two pools.
+    ASSERT_EQ(pools->size(), 2);
+
+    // First pool specifies all but ddns-ttl.
+    PoolPtr pool  = (*pools)[0];
+    ASSERT_TRUE(pool);
+    
+    ASSERT_FALSE(pool->getDdnsSendUpdates().unspecified());
+    EXPECT_TRUE(pool->getDdnsSendUpdates().get());
+
+    ASSERT_FALSE(pool->getDdnsOverrideNoUpdate().unspecified());
+    EXPECT_TRUE(pool->getDdnsOverrideNoUpdate().get());
+
+    ASSERT_FALSE(pool->getDdnsOverrideClientUpdate().unspecified());
+    EXPECT_TRUE(pool->getDdnsOverrideClientUpdate().get());
+
+    ASSERT_FALSE(pool->getDdnsReplaceClientNameMode().unspecified());
+    EXPECT_EQ(pool->getDdnsReplaceClientNameMode().get(), 
+              D2ClientConfig::RCM_ALWAYS);
+
+    ASSERT_FALSE(pool->getDdnsGeneratedPrefix().unspecified());
+    EXPECT_EQ(pool->getDdnsGeneratedPrefix().get(), "prefix");
+
+    ASSERT_FALSE(pool->getDdnsQualifyingSuffix().unspecified());
+    EXPECT_EQ(pool->getDdnsQualifyingSuffix().get(), "suffix");
+
+    ASSERT_FALSE(pool->getHostnameCharSet().unspecified());
+    EXPECT_EQ(pool->getHostnameCharSet().get(), "[a-z]");
+
+    ASSERT_FALSE(pool->getHostnameCharReplacement().unspecified());
+    EXPECT_EQ(pool->getHostnameCharReplacement().get(), "X");
+
+    ASSERT_FALSE(pool->getDdnsUpdateOnRenew().unspecified());
+    EXPECT_TRUE(pool->getDdnsUpdateOnRenew().get());
+
+    ASSERT_FALSE(pool->getDdnsTtlPercent().unspecified());
+    EXPECT_EQ(pool->getDdnsTtlPercent().get(), 0.5);
+
+    ASSERT_FALSE(pool->getDdnsConflictResolutionMode().unspecified());
+    EXPECT_EQ(pool->getDdnsConflictResolutionMode().get(), "check-with-dhcid");
+
+    ASSERT_TRUE(pool->getDdnsTtl().unspecified());
+
+    ASSERT_FALSE(pool->getDdnsTtlMin().unspecified());
+    EXPECT_EQ(pool->getDdnsTtlMin().get(), 200);
+
+    ASSERT_FALSE(pool->getDdnsTtlMax().unspecified());
+    EXPECT_EQ(pool->getDdnsTtlMax().get(), 500);
+
+    // Second pool only specifies ddns-ttl.
+    pool = (*pools)[1];
+    ASSERT_TRUE(pool);
+    
+    ASSERT_TRUE(pool->getDdnsSendUpdates().unspecified());
+    ASSERT_TRUE(pool->getDdnsOverrideNoUpdate().unspecified());
+    ASSERT_TRUE(pool->getDdnsOverrideClientUpdate().unspecified());
+    ASSERT_TRUE(pool->getDdnsReplaceClientNameMode().unspecified());
+    ASSERT_TRUE(pool->getDdnsGeneratedPrefix().unspecified());
+    ASSERT_TRUE(pool->getDdnsQualifyingSuffix().unspecified());
+    ASSERT_TRUE(pool->getHostnameCharSet().unspecified());
+    ASSERT_TRUE(pool->getHostnameCharReplacement().unspecified());
+    ASSERT_TRUE(pool->getDdnsUpdateOnRenew().unspecified());
+    ASSERT_TRUE(pool->getDdnsTtlPercent().unspecified());
+    ASSERT_TRUE(pool->getDdnsConflictResolutionMode().unspecified());
+    ASSERT_TRUE(pool->getDdnsTtlMin().unspecified());
+
+    ASSERT_FALSE(pool->getDdnsTtl().unspecified());
+    EXPECT_EQ(pool->getDdnsTtl().get(), 300);
+
+    ASSERT_TRUE(pool->getDdnsTtlMax().unspecified());
+}
+
 }  // Anonymous namespace