Sanity check digest in parser so visudo can catch errors.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Apr 2013 19:12:00 +0000 (15:12 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Apr 2013 19:12:00 +0000 (15:12 -0400)
Add base64 support

plugins/sudoers/gram.c
plugins/sudoers/gram.h
plugins/sudoers/gram.y
plugins/sudoers/match.c
plugins/sudoers/toke.c
plugins/sudoers/toke.l

index c4769a444ffc847ec57e10e4b9de9fb66e6c9e45..463c8301899f12a566ca74ad464361f8f6c333fd 100644 (file)
@@ -154,37 +154,38 @@ typedef union {
 #define NETGROUP 261
 #define USERGROUP 262
 #define WORD 263
-#define DEFAULTS 264
-#define DEFAULTS_HOST 265
-#define DEFAULTS_USER 266
-#define DEFAULTS_RUNAS 267
-#define DEFAULTS_CMND 268
-#define NOPASSWD 269
-#define PASSWD 270
-#define NOEXEC 271
-#define EXEC 272
-#define SETENV 273
-#define NOSETENV 274
-#define LOG_INPUT 275
-#define NOLOG_INPUT 276
-#define LOG_OUTPUT 277
-#define NOLOG_OUTPUT 278
-#define ALL 279
-#define COMMENT 280
-#define HOSTALIAS 281
-#define CMNDALIAS 282
-#define USERALIAS 283
-#define RUNASALIAS 284
-#define ERROR 285
-#define TYPE 286
-#define ROLE 287
-#define PRIVS 288
-#define LIMITPRIVS 289
-#define MYSELF 290
-#define SHA224 291
-#define SHA256 292
-#define SHA384 293
-#define SHA512 294
+#define DIGEST 264
+#define DEFAULTS 265
+#define DEFAULTS_HOST 266
+#define DEFAULTS_USER 267
+#define DEFAULTS_RUNAS 268
+#define DEFAULTS_CMND 269
+#define NOPASSWD 270
+#define PASSWD 271
+#define NOEXEC 272
+#define EXEC 273
+#define SETENV 274
+#define NOSETENV 275
+#define LOG_INPUT 276
+#define NOLOG_INPUT 277
+#define LOG_OUTPUT 278
+#define NOLOG_OUTPUT 279
+#define ALL 280
+#define COMMENT 281
+#define HOSTALIAS 282
+#define CMNDALIAS 283
+#define USERALIAS 284
+#define RUNASALIAS 285
+#define ERROR 286
+#define TYPE 287
+#define ROLE 288
+#define PRIVS 289
+#define LIMITPRIVS 290
+#define MYSELF 291
+#define SHA224 292
+#define SHA256 293
+#define SHA384 294
+#define SHA512 295
 #define YYERRCODE 256
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerslhs[] =
@@ -266,22 +267,22 @@ const short sudoerssindex[] =
 short sudoerssindex[] =
 #endif
        {                                    -33,
- -275,    0,    0,    0,    0,  -16,  698,  710,  710,  -19,
-    0,    0, -250, -245, -216, -211, -239,    0,    0,    0,
-  845,  -33,    0,    0,   -6, -209,    0,  -24,    0,    0,
-    0,    0,    0, -225,    0,  -23,    0,  -18,  -18,    0,
-    0,    0, -251,   -1,    2,    4,    6,    0,    0,    0,
-  -17,   -2,   -8,    7,    0,   -3,    8,    0,    9,   10,
-    0,   11,   13,    0,    0,  710,  -15,    0,   15,    0,
- -202, -196, -194,    0,  -16,    0,  698,  -24,  -24,  -24,
-    0, -189, -187, -186, -185,  -19,  -24,    0,  698, -250,
-  -19, -245,  710, -216,  710, -211,    0,   39,  698,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   36,
-    0,   37,    0,   38,    0,   38,    0,  690,    0,   41,
- -238,    0,   86,  -26,   42,   39,   25,   26, -237, -195,
- -197,    0,    0,    0, -254,    0,    0,   49,   86,    0,
-    0, -169, -168,   40,   43,    0, -192, -188,    0,    0,
-    0,   86,   49,    0,    0, -164, -161,  567,    0,    0,
+ -277,    0,    0,    0,    0,  -13,   75,  105,  105,  -15,
+    0,    0, -246, -241, -217, -210, -226,    0,    0,    0,
+   -5,  -33,    0,    0,   -3, -244,    0,    5,    0,    0,
+    0,    0,    0, -237,    0,  -28,    0,  -19,  -19,    0,
+    0,    0, -251,   -7,   -1,    4,    7,    0,    0,    0,
+  -14,  -20,   -2,    8,    0,    6,   11,    0,    9,   13,
+    0,   12,   14,    0,    0,  105,  -11,    0,   18,    0,
+ -203, -200, -188,    0,  -13,    0,   75,    5,    5,    5,
+    0, -187, -185, -184, -183,  -15,    5,    0,   75, -246,
+  -15, -241,  105, -217,  105, -210,    0,   42,   75,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   39,
+    0,   40,    0,   43,    0,   43,    0,   45,    0,   44,
+ -279,    0,  135,   -6,   49,   42,   25,   32, -243, -195,
+ -192,    0,    0,    0, -236,    0,    0,   54,  135,    0,
+    0, -164, -163,   41,   46,    0, -189, -180,    0,    0,
+    0,  135,   54,    0,    0, -159, -158,  585,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
@@ -289,23 +290,23 @@ const short sudoersrindex[] =
 #else
 short sudoersrindex[] =
 #endif
-       {                                    103,
+       {                                    106,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  105,    0,    0,    1,    0,    0,  177,    0,    0,
+    0,  110,    0,    0,    1,    0,    0,  181,    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,  207,    0,    0,  237,    0,    0,  271,
-    0,    0,  300,    0,    0,    0,    0,    0,  329,    0,
-    0,    0,    0,    0,    0,    0,    0,  358,  387,  417,
-    0,    0,    0,    0,    0,    0,  446,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  463,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   30,
-    0,   59,    0,   89,    0,  118,    0,   65,    0,  148,
-  489,    0,   66,   67,    0,  463,    0,    0,  594,  515,
-  541,    0,    0,    0,    0,    0,    0,   68,    0,    0,
-    0,    0,    0,    0,    0,    0,  623,  653,    0,    0,
-    0,    0,   69,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,  211,    0,    0,  241,    0,    0,  271,
+    0,    0,  301,    0,    0,    0,    0,    0,  331,    0,
+    0,    0,    0,    0,    0,    0,    0,  361,  391,  421,
+    0,    0,    0,    0,    0,    0,  451,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  467,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   31,
+    0,   61,    0,   91,    0,  121,    0,   70,    0,  151,
+  495,    0,   71,   72,    0,  467,    0,    0,  615,  525,
+  555,    0,    0,    0,    0,    0,    0,   73,    0,    0,
+    0,    0,    0,    0,    0,    0,  645,  675,    0,    0,
+    0,    0,   74,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,};
 #if defined(__cplusplus) || defined(__STDC__)
@@ -314,131 +315,115 @@ const short sudoersgindex[] =
 short sudoersgindex[] =
 #endif
        {                                      0,
-  -14,    0,   45,    5,   70,   62,  -83,   20,   81,   -5,
-   46,   50,  107,    3,  -27,   -9,  -12,    0,    0,   29,
-    0,    0,    0,   12,   14,    0,  -13,  -11,    0,    0,
-  108,    0,    0,    0,    0,   44,   47,   33,   48,
+  -10,    0,   47,   17,   80,   65,  -84,   27,   92,   -4,
+   48,   62,  112,    2,  -25,   10,   -9,    0,    0,   33,
+    0,    0,    0,    3,   16,    0,  -17,  -12,    0,    0,
+  111,    0,    0,    0,    0,   50,   51,   52,   53,
 };
-#define YYTABLESIZE 1124
+#define YYTABLESIZE 970
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerstable[] =
 #else
 short sudoerstable[] =
 #endif
        {                                      17,
-   19,   36,  109,  132,   24,   40,   41,   53,  133,   26,
-   38,   39,   56,   43,   26,   26,   26,   66,    2,   75,
-   77,    3,    4,    5,  134,   66,   86,   42,   77,   82,
-   43,  139,   29,   19,   30,   31,   72,   32,   73,   11,
-   78,   59,   79,   80,   19,   98,   62,  127,  128,   74,
-  144,  145,   89,   33,   71,   87,   82,   91,   87,   83,
-  100,   84,   82,   85,   90,   92,  101,   94,  102,   93,
-   96,   95,   99,  105,  174,  106,  107,  108,  118,   77,
-   86,   66,  140,  110,  126,  142,  143,   82,   95,  128,
-  127,   87,  152,  154,  155,  114,  145,  116,  162,  144,
-  156,  163,    1,  157,    2,   61,   65,   62,   64,   63,
-  112,  141,   81,   88,   76,   97,   87,   92,  135,  103,
-  124,   95,  104,   65,  161,  151,  153,  122,  117,   70,
-    0,    0,    0,  111,  160,  159,    0,    0,  113,    0,
-    0,  115,  150,  149,    0,    0,   95,   26,    0,    0,
-   92,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   92,   12,    0,    0,    0,
-   26,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   26,    9,    0,    0,   12,
+   19,  109,   36,   24,   26,   40,   41,  127,  128,   38,
+   39,   53,   43,   26,   74,   77,   56,   43,   26,   26,
+   29,  132,   30,   31,   66,   32,  133,   34,   42,   86,
+   82,    2,   77,   19,    3,    4,    5,   66,   66,   72,
+   59,   73,   33,  134,   19,  144,  145,   62,   75,   98,
+   82,  139,   78,   11,   79,   80,   83,   71,   89,  100,
+   87,   84,  101,   82,   85,   90,   91,   87,   92,   93,
+   94,   96,   95,  174,  102,   99,  105,   17,  106,  107,
+  108,  118,   77,   86,  110,  142,   66,  126,   82,  140,
+   95,  127,  143,   87,  114,  128,  116,  152,  154,  155,
+  145,  156,  123,  162,  163,    1,  157,   34,  144,    2,
+   61,   65,   62,   64,   63,  141,   88,  112,   87,  124,
+   92,  103,   81,   95,  104,   76,  161,   97,   65,  153,
+  160,  122,   70,  150,  159,    0,    0,   17,    0,  111,
+    0,    0,  113,    0,  151,  149,  115,  117,   95,    0,
+   26,    0,    0,   92,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  135,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   92,    0,
+   12,    0,    0,   26,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   26,    0,
+    9,    0,    0,   12,    0,    0,    0,    0,    0,    0,
     0,    0,    1,    0,    2,    0,    0,    3,    4,    5,
-    6,    7,    8,    9,   10,   25,   10,   40,   41,    9,
-   25,   25,   25,    0,    0,   11,   12,   13,   14,   15,
-   16,    0,    0,    0,   40,   41,   19,    0,   19,   42,
-    0,   19,   19,   19,   19,   19,   19,   19,   19,   10,
-    8,   44,   45,   46,   47,    0,   42,    0,    0,   19,
-   19,   19,   19,   19,   19,   82,    0,   82,    0,    0,
-   82,   82,   82,   82,   82,   82,   82,   82,    0,   11,
-    0,    0,    0,    8,    0,    0,    0,    0,   82,   82,
-   82,   82,   82,   82,   87,    0,   87,    0,    0,   87,
-   87,   87,   87,   87,   87,   87,   87,    0,    7,    0,
-    0,    0,   11,    0,    0,    0,    0,   87,   87,   87,
-   87,   87,   87,  132,   95,    0,   95,    0,  133,   95,
-   95,   95,   95,   95,   95,   95,   95,   15,    0,    0,
-    0,    7,    0,    0,  134,    0,    0,   95,   95,   95,
-   95,   95,   95,   92,    0,   92,    0,    0,   92,   92,
-   92,   92,   92,   92,   92,   92,   13,    0,    0,    0,
-   15,    0,    0,    0,    0,    0,   92,   92,   92,   92,
-   92,   92,    0,   26,    0,   26,    0,    0,   26,   26,
-   26,   26,   26,   26,   26,   26,   14,    0,    0,   13,
-    0,    0,    0,    0,    0,    0,   26,   26,   26,   26,
-   26,   26,   12,    0,   12,    0,    0,   12,   12,   12,
-   12,   12,   12,   12,   12,   16,    0,    0,    0,   14,
-    0,    0,    0,    0,    0,   12,   12,   12,   12,   12,
-   12,    0,    9,    0,    9,    0,    0,    9,    9,    9,
-    9,    9,    9,    9,    9,    0,    0,    0,   16,    0,
-    0,    0,    0,    0,    0,    9,    9,    9,    9,    9,
-    9,    0,   10,    0,   10,   59,    0,   10,   10,   10,
-   10,   10,   10,   10,   10,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   10,   10,   10,   10,   10,
-   10,   47,    0,    0,    0,    0,    8,    0,    8,    0,
-    0,    8,    8,    8,    8,    8,    8,    8,    8,    0,
-    0,    0,    0,    0,    0,    0,    0,   48,    0,    8,
-    8,    8,    8,    8,    8,   11,    0,   11,    0,    0,
-   11,   11,   11,   11,   11,   11,   11,   11,    0,    0,
-    0,    0,    0,   49,    0,    0,    0,    0,   11,   11,
-   11,   11,   11,   11,    7,    0,    7,    0,    0,    7,
-    7,    7,    7,    7,    7,    7,    7,    0,    0,   43,
-    0,    0,    0,    0,    0,    0,    0,    7,    7,    7,
-    7,    7,    7,   15,    0,   15,    0,    0,   15,   15,
-   15,   15,   15,   15,   15,   15,   54,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   15,   15,   15,   15,
-   15,   15,   13,    0,   13,    0,    0,   13,   13,   13,
-   13,   13,   13,   13,   13,   55,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   13,   13,   13,   13,   13,
-   13,    0,   14,    0,   14,    0,    0,   14,   14,   14,
-   14,   14,   14,   14,   14,   56,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   14,   14,   14,   14,   14,
-   14,   16,    0,   16,    0,    0,   16,   16,   16,   16,
-   16,   16,   16,   16,    0,    0,    0,    0,    0,   59,
-   59,    0,   17,    0,   16,   16,   16,   16,   16,   16,
-   34,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-   59,   59,   17,    0,    0,   47,   47,  123,   59,   59,
-   59,   59,    0,   59,   59,   59,   59,   47,   47,   47,
-   47,   47,   47,   47,   47,   47,   47,   47,    0,    0,
-    0,   48,   48,    0,    0,    0,   47,   47,    0,   47,
-   47,   47,   47,   48,   48,   48,   48,   48,   48,   48,
-   48,   48,   48,   48,    0,    0,    0,   49,   49,    0,
-    0,    0,   48,   48,    0,   48,   48,   48,   48,   49,
-   49,   49,   49,   49,   49,   49,   49,   49,   49,   49,
-    0,    0,    0,   40,   41,    0,    0,    0,   49,   49,
-    0,   49,   49,   49,   49,  164,  165,  166,  167,  168,
-  169,  170,  171,  172,  173,   42,    0,    0,    0,    0,
-   54,   54,    0,    0,    0,    0,    0,   44,   45,   46,
-   47,    0,   54,   54,   54,   54,   54,   54,   54,   54,
-   54,   54,   54,    0,    0,    0,    0,   34,    0,   55,
-   55,    0,    0,    0,   54,   54,   54,   54,   66,    0,
-    0,   55,   55,   55,   55,   55,   55,   55,   55,   55,
-   55,   55,    0,    0,    0,    0,    0,    0,    0,   56,
-   56,    0,    0,   55,   55,   55,   55,    0,    0,    0,
-    0,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-   56,   56,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   56,   56,   56,   56,    2,    0,    0,
-    3,    4,    5,    0,    0,   29,    0,   30,   31,    0,
-   32,    0,    0,    0,    0,    0,    0,    2,   11,    0,
-    3,    4,    5,    0,    0,    0,   33,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,   11,    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,
+   25,    6,    7,    8,    9,   10,   40,   41,    0,   25,
+   10,   40,   41,    9,   25,   25,   11,   12,   13,   14,
+   15,   16,   29,    0,   30,   31,   19,   32,   19,   42,
+    0,   19,   19,   19,   42,   19,   19,   19,   19,   19,
+    8,    0,    0,   10,   33,    0,   44,   45,   46,   47,
+   19,   19,   19,   19,   19,   19,   82,    0,   82,    0,
+    0,   82,   82,   82,    0,   82,   82,   82,   82,   82,
+   11,    0,    2,    8,    0,    3,    4,    5,    0,    0,
+   82,   82,   82,   82,   82,   82,   87,    0,   87,    0,
+    0,   87,   87,   87,   11,   87,   87,   87,   87,   87,
+    7,    0,   29,   11,   30,   31,    0,   32,    0,    0,
+   87,   87,   87,   87,   87,   87,   95,    0,   95,    0,
+    0,   95,   95,   95,   33,   95,   95,   95,   95,   95,
+   15,    0,    2,    7,    0,    3,    4,    5,    0,    0,
+   95,   95,   95,   95,   95,   95,   92,    0,   92,    0,
+    0,   92,   92,   92,   11,   92,   92,   92,   92,   92,
+   13,    0,  132,   15,    0,    0,    0,  133,    0,    0,
+   92,   92,   92,   92,   92,   92,   26,    0,   26,    0,
+    0,   26,   26,   26,  134,   26,   26,   26,   26,   26,
+   14,    0,    0,   13,    0,    0,    0,    0,    0,    0,
+   26,   26,   26,   26,   26,   26,   12,    0,   12,    0,
+    0,   12,   12,   12,    0,   12,   12,   12,   12,   12,
+   16,    0,    0,   14,    0,    0,    0,    0,    0,    0,
+   12,   12,   12,   12,   12,   12,    9,    0,    9,    0,
+    0,    9,    9,    9,    0,    9,    9,    9,    9,    9,
+    0,    0,    0,   16,    0,    0,    0,    0,    0,    0,
+    9,    9,    9,    9,    9,    9,   10,    0,   10,   59,
+    0,   10,   10,   10,    0,   10,   10,   10,   10,   10,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   10,   10,   10,   10,   10,   10,    8,   47,    8,    0,
+    0,    8,    8,    8,    0,    8,    8,    8,    8,    8,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    8,    8,    8,    8,    8,    8,   11,   48,   11,    0,
+    0,   11,   11,   11,    0,   11,   11,   11,   11,   11,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   11,   11,   11,   11,   11,   11,    7,   49,    7,    0,
+    0,    7,    7,    7,    0,    7,    7,    7,    7,    7,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    7,    7,    7,    7,    7,    7,   15,   43,   15,    0,
+    0,   15,   15,   15,    0,   15,   15,   15,   15,   15,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+   15,   15,   15,   15,   15,   15,   13,   54,   13,    0,
+    0,   13,   13,   13,    0,   13,   13,   13,   13,   13,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   29,    0,   30,   31,    0,   32,    0,    0,
+   13,   13,   13,   13,   13,   13,   14,   55,   14,    0,
+    0,   14,   14,   14,    0,   14,   14,   14,   14,   14,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   33,
+   14,   14,   14,   14,   14,   14,   16,   56,   16,    0,
+    0,   16,   16,   16,    0,   16,   16,   16,   16,   16,
+    0,    0,    0,   59,   59,    0,    0,    0,    0,    0,
+   16,   16,   16,   16,   16,   16,   59,   59,   59,   59,
+   59,   59,   59,   59,   59,   59,   59,    0,    0,    0,
+    0,   47,   47,   59,   59,   59,   59,    0,   59,   59,
+   59,   59,    0,    0,   47,   47,   47,   47,   47,   47,
+   47,   47,   47,   47,   47,    0,    0,    0,    0,    0,
+    0,   48,   48,   47,   47,    0,   47,   47,   47,   47,
+    0,    0,    0,    0,   48,   48,   48,   48,   48,   48,
+   48,   48,   48,   48,   48,    0,    0,    0,    0,    0,
+    0,   49,   49,   48,   48,    0,   48,   48,   48,   48,
+    0,    0,    0,    0,   49,   49,   49,   49,   49,   49,
+   49,   49,   49,   49,   49,    0,    0,    0,    0,    0,
+    0,   40,   41,   49,   49,    0,   49,   49,   49,   49,
+    0,    0,    0,    0,  164,  165,  166,  167,  168,  169,
+  170,  171,  172,  173,   42,    0,    0,    0,    0,    0,
+    0,   54,   54,    0,    0,    0,   44,   45,   46,   47,
+    0,    0,    0,    0,   54,   54,   54,   54,   54,   54,
+   54,   54,   54,   54,   54,    0,    0,    0,    0,    0,
+    0,   55,   55,    0,    0,    0,   54,   54,   54,   54,
+    0,    0,    0,    0,   55,   55,   55,   55,   55,   55,
+   55,   55,   55,   55,   55,    0,    0,    0,    0,    0,
+    0,   56,   56,    0,    0,    0,   55,   55,   55,   55,
+    0,    0,    0,    0,   56,   56,   56,   56,   56,   56,
+   56,   56,   56,   56,   56,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   56,   56,   56,   56,
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const short sudoerscheck[] =
@@ -446,125 +431,109 @@ const short sudoerscheck[] =
 short sudoerscheck[] =
 #endif
        {                                      33,
-    0,    7,   86,  258,  280,  257,  258,  258,  263,   33,
-    8,    9,  258,   33,   33,   33,   33,   44,  258,   44,
-   44,  261,  262,  263,  279,   44,   44,  279,   44,    0,
-   33,   58,  258,   33,  260,  261,   43,  263,   45,  279,
-   36,  258,   38,   39,   44,   61,  258,  286,  287,  259,
-  288,  289,   61,  279,   61,   51,   58,   61,    0,   58,
-  263,   58,   33,   58,   58,   58,  263,   58,  263,   61,
-   58,   61,   58,  263,  158,  263,  263,  263,   40,   44,
-   44,   44,   41,   89,   44,   61,   61,   58,    0,  287,
-  286,   33,   44,  263,  263,   93,  289,   95,  263,  288,
-   61,  263,    0,   61,    0,   41,   41,   41,   41,   41,
-   91,  126,   43,   52,   34,   66,   58,    0,   33,   75,
-  118,   33,   77,   17,  152,  135,  139,   99,   96,   22,
-   -1,   -1,   -1,   90,  148,  147,   -1,   -1,   92,   -1,
-   -1,   94,  131,  130,   -1,   -1,   58,    0,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   58,    0,   -1,   -1,   33,
+    0,   86,    7,  281,   33,  257,  258,  287,  288,    8,
+    9,  258,   33,   33,  259,   44,  258,   33,   33,   33,
+  258,  258,  260,  261,   44,  263,  263,   33,  280,   44,
+    0,  258,   44,   33,  261,  262,  263,   44,   44,   43,
+  258,   45,  280,  280,   44,  289,  290,  258,   44,   61,
+   58,   58,   36,  280,   38,   39,   58,   61,   61,  263,
+    0,   58,  263,   33,   58,   58,   61,   51,   58,   61,
+   58,   58,   61,  158,  263,   58,  264,   33,  264,  264,
+  264,   40,   44,   44,   89,   61,   44,   44,   58,   41,
+    0,  287,   61,   33,   93,  288,   95,   44,  263,  263,
+  290,   61,   58,  263,  263,    0,   61,   33,  289,    0,
+   41,   41,   41,   41,   41,  126,   52,   91,   58,  118,
+    0,   75,   43,   33,   77,   34,  152,   66,   17,  139,
+  148,   99,   22,  131,  147,   -1,   -1,   33,   -1,   90,
+   -1,   -1,   92,   -1,  135,  130,   94,   96,   58,   -1,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   -1,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,  259,    0,  257,  258,   33,
-  259,  259,  259,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,   -1,   -1,  257,  258,  256,   -1,  258,  279,
-   -1,  261,  262,  263,  264,  265,  266,  267,  268,   33,
-    0,  291,  292,  293,  294,   -1,  279,   -1,   -1,  279,
-  280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,  268,   -1,    0,
-   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
-  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
-  262,  263,  264,  265,  266,  267,  268,   -1,    0,   -1,
-   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,  281,
-  282,  283,  284,  258,  256,   -1,  258,   -1,  263,  261,
-  262,  263,  264,  265,  266,  267,  268,    0,   -1,   -1,
-   -1,   33,   -1,   -1,  279,   -1,   -1,  279,  280,  281,
-  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,  268,    0,   -1,   -1,   -1,
-   33,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
-  283,  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,  268,    0,   -1,   -1,   33,
-   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
-  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,    0,   -1,   -1,   -1,   33,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   -1,   -1,   -1,   33,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,  256,   -1,  258,   33,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   33,   -1,   -1,   -1,   -1,  256,   -1,  258,   -1,
-   -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   33,   -1,  279,
-  280,  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,
-  261,  262,  263,  264,  265,  266,  267,  268,   -1,   -1,
-   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,  279,  280,
-  281,  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,
-  262,  263,  264,  265,  266,  267,  268,   -1,   -1,   33,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,
-  282,  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,
-  263,  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,
-  283,  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,   -1,  256,   -1,  258,   -1,   -1,  261,  262,  263,
-  264,  265,  266,  267,  268,   33,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  279,  280,  281,  282,  283,
-  284,  256,   -1,  258,   -1,   -1,  261,  262,  263,  264,
-  265,  266,  267,  268,   -1,   -1,   -1,   -1,   -1,  257,
-  258,   -1,   33,   -1,  279,  280,  281,  282,  283,  284,
-   33,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,   33,   -1,   -1,  257,  258,   58,  286,  287,
-  288,  289,   -1,  291,  292,  293,  294,  269,  270,  271,
-  272,  273,  274,  275,  276,  277,  278,  279,   -1,   -1,
-   -1,  257,  258,   -1,   -1,   -1,  288,  289,   -1,  291,
-  292,  293,  294,  269,  270,  271,  272,  273,  274,  275,
-  276,  277,  278,  279,   -1,   -1,   -1,  257,  258,   -1,
-   -1,   -1,  288,  289,   -1,  291,  292,  293,  294,  269,
-  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,
-   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,  288,  289,
-   -1,  291,  292,  293,  294,  269,  270,  271,  272,  273,
-  274,  275,  276,  277,  278,  279,   -1,   -1,   -1,   -1,
-  257,  258,   -1,   -1,   -1,   -1,   -1,  291,  292,  293,
-  294,   -1,  269,  270,  271,  272,  273,  274,  275,  276,
-  277,  278,  279,   -1,   -1,   -1,   -1,   33,   -1,  257,
-  258,   -1,   -1,   -1,  291,  292,  293,  294,   44,   -1,
-   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,
-  258,   -1,   -1,  291,  292,  293,  294,   -1,   -1,   -1,
-   -1,  269,  270,  271,  272,  273,  274,  275,  276,  277,
-  278,  279,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  291,  292,  293,  294,  258,   -1,   -1,
-  261,  262,  263,   -1,   -1,  258,   -1,  260,  261,   -1,
-  263,   -1,   -1,   -1,   -1,   -1,   -1,  258,  279,   -1,
-  261,  262,  263,   -1,   -1,   -1,  279,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  279,   -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,
+  259,  265,  266,  267,  268,  269,  257,  258,   -1,  259,
+    0,  257,  258,   33,  259,  259,  280,  281,  282,  283,
+  284,  285,  258,   -1,  260,  261,  256,  263,  258,  280,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,   -1,   33,  280,   -1,  292,  293,  294,  295,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,   -1,  261,  262,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,  260,  261,   -1,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,   -1,  261,  262,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,  258,   33,   -1,   -1,   -1,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,  280,  265,  266,  267,  268,  269,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+    0,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,   33,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   -1,  258,   33,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  258,   -1,  260,  261,   -1,  263,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  279,
+  280,  281,  282,  283,  284,  285,  256,   33,  258,   -1,
+   -1,  261,  262,  263,   -1,  265,  266,  267,  268,  269,
+   -1,   -1,   -1,  257,  258,   -1,   -1,   -1,   -1,   -1,
+  280,  281,  282,  283,  284,  285,  270,  271,  272,  273,
+  274,  275,  276,  277,  278,  279,  280,   -1,   -1,   -1,
+   -1,  257,  258,  287,  288,  289,  290,   -1,  292,  293,
+  294,  295,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  289,  290,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  289,  290,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  289,  290,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,   -1,   -1,   -1,  292,  293,  294,  295,
+   -1,   -1,   -1,   -1,  270,  271,  272,  273,  274,  275,
+  276,  277,  278,  279,  280,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  292,  293,  294,  295,
 };
 #define YYFINAL 18
 #ifndef YYDEBUG
 #define YYDEBUG 0
 #endif
-#define YYMAXTOKEN 294
+#define YYMAXTOKEN 295
 #if YYDEBUG
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersname[] =
@@ -579,12 +548,12 @@ char *sudoersname[] =
 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-"COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DEFAULTS",
-"DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND","NOPASSWD",
-"PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT","NOLOG_INPUT",
-"LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS",
-"RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS","MYSELF","SHA224",
-"SHA256","SHA384","SHA512",
+"COMMAND","ALIAS","DEFVAR","NTWKADDR","NETGROUP","USERGROUP","WORD","DIGEST",
+"DEFAULTS","DEFAULTS_HOST","DEFAULTS_USER","DEFAULTS_RUNAS","DEFAULTS_CMND",
+"NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT",
+"NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","ALL","COMMENT","HOSTALIAS",
+"CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS",
+"MYSELF","SHA224","SHA256","SHA384","SHA512",
 };
 #if defined(__cplusplus) || defined(__STDC__)
 const char * const sudoersrule[] =
@@ -628,10 +597,10 @@ char *sudoersrule[] =
 "cmndspeclist : cmndspec",
 "cmndspeclist : cmndspeclist ',' cmndspec",
 "cmndspec : runasspec selinux solarisprivs cmndtag digcmnd",
-"digest : SHA224 ':' WORD",
-"digest : SHA256 ':' WORD",
-"digest : SHA384 ':' WORD",
-"digest : SHA512 ':' WORD",
+"digest : SHA224 ':' DIGEST",
+"digest : SHA256 ':' DIGEST",
+"digest : SHA384 ':' DIGEST",
+"digest : SHA512 ':' DIGEST",
 "digcmnd : opcmnd",
 "digcmnd : digest opcmnd",
 "opcmnd : cmnd",
@@ -730,7 +699,7 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 int yystacksize;
-#line 680 "gram.y"
+#line 681 "gram.y"
 void
 sudoerserror(const char *s)
 {
@@ -978,7 +947,7 @@ init_parser(const char *path, bool quiet)
 
     debug_return;
 }
-#line 929 "gram.c"
+#line 898 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1181,127 +1150,127 @@ yyreduce:
     switch (yyn)
     {
 case 1:
-#line 184 "gram.y"
+#line 185 "gram.y"
 { ; }
 break;
 case 5:
-#line 192 "gram.y"
+#line 193 "gram.y"
 {
                            ;
                        }
 break;
 case 6:
-#line 195 "gram.y"
+#line 196 "gram.y"
 {
                            yyerrok;
                        }
 break;
 case 7:
-#line 198 "gram.y"
+#line 199 "gram.y"
 {
                            add_userspec(yyvsp[-1].member, yyvsp[0].privilege);
                        }
 break;
 case 8:
-#line 201 "gram.y"
+#line 202 "gram.y"
 {
                            ;
                        }
 break;
 case 9:
-#line 204 "gram.y"
+#line 205 "gram.y"
 {
                            ;
                        }
 break;
 case 10:
-#line 207 "gram.y"
+#line 208 "gram.y"
 {
                            ;
                        }
 break;
 case 11:
-#line 210 "gram.y"
+#line 211 "gram.y"
 {
                            ;
                        }
 break;
 case 12:
-#line 213 "gram.y"
+#line 214 "gram.y"
 {
                            add_defaults(DEFAULTS, NULL, yyvsp[0].defaults);
                        }
 break;
 case 13:
-#line 216 "gram.y"
+#line 217 "gram.y"
 {
                            add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 14:
-#line 219 "gram.y"
+#line 220 "gram.y"
 {
                            add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 15:
-#line 222 "gram.y"
+#line 223 "gram.y"
 {
                            add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 16:
-#line 225 "gram.y"
+#line 226 "gram.y"
 {
                            add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults);
                        }
 break;
 case 18:
-#line 231 "gram.y"
+#line 232 "gram.y"
 {
                            list_append(yyvsp[-2].defaults, yyvsp[0].defaults);
                            yyval.defaults = yyvsp[-2].defaults;
                        }
 break;
 case 19:
-#line 237 "gram.y"
+#line 238 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, true);
                        }
 break;
 case 20:
-#line 240 "gram.y"
+#line 241 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[0].string, NULL, false);
                        }
 break;
 case 21:
-#line 243 "gram.y"
+#line 244 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true);
                        }
 break;
 case 22:
-#line 246 "gram.y"
+#line 247 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+');
                        }
 break;
 case 23:
-#line 249 "gram.y"
+#line 250 "gram.y"
 {
                            yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-');
                        }
 break;
 case 25:
-#line 255 "gram.y"
+#line 256 "gram.y"
 {
                            list_append(yyvsp[-2].privilege, yyvsp[0].privilege);
                            yyval.privilege = yyvsp[-2].privilege;
                        }
 break;
 case 26:
-#line 261 "gram.y"
+#line 262 "gram.y"
 {
                            struct privilege *p = ecalloc(1, sizeof(*p));
                            list2tq(&p->hostlist, yyvsp[-2].member);
@@ -1312,51 +1281,51 @@ case 26:
                        }
 break;
 case 27:
-#line 271 "gram.y"
+#line 272 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 28:
-#line 275 "gram.y"
+#line 276 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 29:
-#line 281 "gram.y"
+#line 282 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
 case 30:
-#line 284 "gram.y"
+#line 285 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
 case 31:
-#line 287 "gram.y"
+#line 288 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
 case 32:
-#line 290 "gram.y"
+#line 291 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NTWKADDR);
                        }
 break;
 case 33:
-#line 293 "gram.y"
+#line 294 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
 case 35:
-#line 299 "gram.y"
+#line 300 "gram.y"
 {
                            list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec);
 #ifdef HAVE_SELINUX
@@ -1396,7 +1365,7 @@ case 35:
                        }
 break;
 case 36:
-#line 338 "gram.y"
+#line 339 "gram.y"
 {
                            struct cmndspec *cs = ecalloc(1, sizeof(*cs));
                            if (yyvsp[-4].runas != NULL) {
@@ -1427,37 +1396,37 @@ case 36:
                        }
 break;
 case 37:
-#line 368 "gram.y"
+#line 369 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string);
                        }
 break;
 case 38:
-#line 371 "gram.y"
+#line 372 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string);
                        }
 break;
 case 39:
-#line 374 "gram.y"
+#line 375 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string);
                        }
 break;
 case 40:
-#line 377 "gram.y"
+#line 378 "gram.y"
 {
                            yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string);
                        }
 break;
 case 41:
-#line 382 "gram.y"
+#line 383 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                        }
 break;
 case 42:
-#line 385 "gram.y"
+#line 386 "gram.y"
 {
                            /* XXX - yuck */
                            struct sudo_command *c = (struct sudo_command *)(yyvsp[0].member->name);
@@ -1466,127 +1435,127 @@ case 42:
                        }
 break;
 case 43:
-#line 393 "gram.y"
+#line 394 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 44:
-#line 397 "gram.y"
+#line 398 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 45:
-#line 403 "gram.y"
+#line 404 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 46:
-#line 408 "gram.y"
+#line 409 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 47:
-#line 413 "gram.y"
+#line 414 "gram.y"
 {
                            yyval.seinfo.role = NULL;
                            yyval.seinfo.type = NULL;
                        }
 break;
 case 48:
-#line 417 "gram.y"
+#line 418 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[0].string;
                            yyval.seinfo.type = NULL;
                        }
 break;
 case 49:
-#line 421 "gram.y"
+#line 422 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[0].string;
                            yyval.seinfo.role = NULL;
                        }
 break;
 case 50:
-#line 425 "gram.y"
+#line 426 "gram.y"
 {
                            yyval.seinfo.role = yyvsp[-1].string;
                            yyval.seinfo.type = yyvsp[0].string;
                        }
 break;
 case 51:
-#line 429 "gram.y"
+#line 430 "gram.y"
 {
                            yyval.seinfo.type = yyvsp[-1].string;
                            yyval.seinfo.role = yyvsp[0].string;
                        }
 break;
 case 52:
-#line 435 "gram.y"
+#line 436 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 53:
-#line 439 "gram.y"
+#line 440 "gram.y"
 {
                            yyval.string = yyvsp[0].string;
                        }
 break;
 case 54:
-#line 444 "gram.y"
+#line 445 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
 case 55:
-#line 448 "gram.y"
+#line 449 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[0].string;
                            yyval.privinfo.limitprivs = NULL;
                        }
 break;
 case 56:
-#line 452 "gram.y"
+#line 453 "gram.y"
 {
                            yyval.privinfo.privs = NULL;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
 case 57:
-#line 456 "gram.y"
+#line 457 "gram.y"
 {
                            yyval.privinfo.privs = yyvsp[-1].string;
                            yyval.privinfo.limitprivs = yyvsp[0].string;
                        }
 break;
 case 58:
-#line 460 "gram.y"
+#line 461 "gram.y"
 {
                            yyval.privinfo.limitprivs = yyvsp[-1].string;
                            yyval.privinfo.privs = yyvsp[0].string;
                        }
 break;
 case 59:
-#line 466 "gram.y"
+#line 467 "gram.y"
 {
                            yyval.runas = NULL;
                        }
 break;
 case 60:
-#line 469 "gram.y"
+#line 470 "gram.y"
 {
                            yyval.runas = yyvsp[-1].runas;
                        }
 break;
 case 61:
-#line 474 "gram.y"
+#line 475 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = new_member(NULL, MYSELF);
@@ -1594,7 +1563,7 @@ case 61:
                        }
 break;
 case 62:
-#line 479 "gram.y"
+#line 480 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[0].member;
@@ -1602,7 +1571,7 @@ case 62:
                        }
 break;
 case 63:
-#line 484 "gram.y"
+#line 485 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = yyvsp[-2].member;
@@ -1610,7 +1579,7 @@ case 63:
                        }
 break;
 case 64:
-#line 489 "gram.y"
+#line 490 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            /* $$->runasusers = NULL; */
@@ -1618,7 +1587,7 @@ case 64:
                        }
 break;
 case 65:
-#line 494 "gram.y"
+#line 495 "gram.y"
 {
                            yyval.runas = ecalloc(1, sizeof(struct runascontainer));
                            yyval.runas->runasusers = new_member(NULL, MYSELF);
@@ -1626,86 +1595,86 @@ case 65:
                        }
 break;
 case 66:
-#line 501 "gram.y"
+#line 502 "gram.y"
 {
                            yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv =
                                yyval.tag.log_input = yyval.tag.log_output = UNSPEC;
                        }
 break;
 case 67:
-#line 505 "gram.y"
+#line 506 "gram.y"
 {
                            yyval.tag.nopasswd = true;
                        }
 break;
 case 68:
-#line 508 "gram.y"
+#line 509 "gram.y"
 {
                            yyval.tag.nopasswd = false;
                        }
 break;
 case 69:
-#line 511 "gram.y"
+#line 512 "gram.y"
 {
                            yyval.tag.noexec = true;
                        }
 break;
 case 70:
-#line 514 "gram.y"
+#line 515 "gram.y"
 {
                            yyval.tag.noexec = false;
                        }
 break;
 case 71:
-#line 517 "gram.y"
+#line 518 "gram.y"
 {
                            yyval.tag.setenv = true;
                        }
 break;
 case 72:
-#line 520 "gram.y"
+#line 521 "gram.y"
 {
                            yyval.tag.setenv = false;
                        }
 break;
 case 73:
-#line 523 "gram.y"
+#line 524 "gram.y"
 {
                            yyval.tag.log_input = true;
                        }
 break;
 case 74:
-#line 526 "gram.y"
+#line 527 "gram.y"
 {
                            yyval.tag.log_input = false;
                        }
 break;
 case 75:
-#line 529 "gram.y"
+#line 530 "gram.y"
 {
                            yyval.tag.log_output = true;
                        }
 break;
 case 76:
-#line 532 "gram.y"
+#line 533 "gram.y"
 {
                            yyval.tag.log_output = false;
                        }
 break;
 case 77:
-#line 537 "gram.y"
+#line 538 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
 case 78:
-#line 540 "gram.y"
+#line 541 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
 case 79:
-#line 543 "gram.y"
+#line 544 "gram.y"
 {
                            struct sudo_command *c = ecalloc(1, sizeof(*c));
                            c->cmnd = yyvsp[0].command.cmnd;
@@ -1714,7 +1683,7 @@ case 79:
                        }
 break;
 case 82:
-#line 555 "gram.y"
+#line 556 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) {
@@ -1724,14 +1693,14 @@ case 82:
                        }
 break;
 case 84:
-#line 565 "gram.y"
+#line 566 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
 case 87:
-#line 575 "gram.y"
+#line 576 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) {
@@ -1741,14 +1710,14 @@ case 87:
                        }
 break;
 case 89:
-#line 585 "gram.y"
+#line 586 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
 case 92:
-#line 595 "gram.y"
+#line 596 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) {
@@ -1758,7 +1727,7 @@ case 92:
                        }
 break;
 case 95:
-#line 608 "gram.y"
+#line 609 "gram.y"
 {
                            char *s;
                            if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) {
@@ -1768,96 +1737,96 @@ case 95:
                        }
 break;
 case 97:
-#line 618 "gram.y"
+#line 619 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
 case 98:
-#line 624 "gram.y"
+#line 625 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 99:
-#line 628 "gram.y"
+#line 629 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 100:
-#line 634 "gram.y"
+#line 635 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
 case 101:
-#line 637 "gram.y"
+#line 638 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
 case 102:
-#line 640 "gram.y"
+#line 641 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, NETGROUP);
                        }
 break;
 case 103:
-#line 643 "gram.y"
+#line 644 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, USERGROUP);
                        }
 break;
 case 104:
-#line 646 "gram.y"
+#line 647 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
 case 106:
-#line 652 "gram.y"
+#line 653 "gram.y"
 {
                            list_append(yyvsp[-2].member, yyvsp[0].member);
                            yyval.member = yyvsp[-2].member;
                        }
 break;
 case 107:
-#line 658 "gram.y"
+#line 659 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = false;
                        }
 break;
 case 108:
-#line 662 "gram.y"
+#line 663 "gram.y"
 {
                            yyval.member = yyvsp[0].member;
                            yyval.member->negated = true;
                        }
 break;
 case 109:
-#line 668 "gram.y"
+#line 669 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, ALIAS);
                        }
 break;
 case 110:
-#line 671 "gram.y"
+#line 672 "gram.y"
 {
                            yyval.member = new_member(NULL, ALL);
                        }
 break;
 case 111:
-#line 674 "gram.y"
+#line 675 "gram.y"
 {
                            yyval.member = new_member(yyvsp[0].string, WORD);
                        }
 break;
-#line 1808 "gram.c"
+#line 1777 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index 6bd3267ec94964a48554ecbef68a0f127914e3b2..e11062dc34a05539b4168683a4a0d7862a5c0ccf 100644 (file)
@@ -5,37 +5,38 @@
 #define NETGROUP 261
 #define USERGROUP 262
 #define WORD 263
-#define DEFAULTS 264
-#define DEFAULTS_HOST 265
-#define DEFAULTS_USER 266
-#define DEFAULTS_RUNAS 267
-#define DEFAULTS_CMND 268
-#define NOPASSWD 269
-#define PASSWD 270
-#define NOEXEC 271
-#define EXEC 272
-#define SETENV 273
-#define NOSETENV 274
-#define LOG_INPUT 275
-#define NOLOG_INPUT 276
-#define LOG_OUTPUT 277
-#define NOLOG_OUTPUT 278
-#define ALL 279
-#define COMMENT 280
-#define HOSTALIAS 281
-#define CMNDALIAS 282
-#define USERALIAS 283
-#define RUNASALIAS 284
-#define ERROR 285
-#define TYPE 286
-#define ROLE 287
-#define PRIVS 288
-#define LIMITPRIVS 289
-#define MYSELF 290
-#define SHA224 291
-#define SHA256 292
-#define SHA384 293
-#define SHA512 294
+#define DIGEST 264
+#define DEFAULTS 265
+#define DEFAULTS_HOST 266
+#define DEFAULTS_USER 267
+#define DEFAULTS_RUNAS 268
+#define DEFAULTS_CMND 269
+#define NOPASSWD 270
+#define PASSWD 271
+#define NOEXEC 272
+#define EXEC 273
+#define SETENV 274
+#define NOSETENV 275
+#define LOG_INPUT 276
+#define NOLOG_INPUT 277
+#define LOG_OUTPUT 278
+#define NOLOG_OUTPUT 279
+#define ALL 280
+#define COMMENT 281
+#define HOSTALIAS 282
+#define CMNDALIAS 283
+#define USERALIAS 284
+#define RUNASALIAS 285
+#define ERROR 286
+#define TYPE 287
+#define ROLE 288
+#define PRIVS 289
+#define LIMITPRIVS 290
+#define MYSELF 291
+#define SHA224 292
+#define SHA256 293
+#define SHA384 294
+#define SHA512 295
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
index 257a87e0a9e43351eb76d942197850781600a9f7..2e286983d27b3978ff3674414ca5f53afbe9b590 100644 (file)
@@ -115,6 +115,7 @@ static struct sudo_digest *new_digest(int, const char *);
 %token <string>  NETGROUP              /* a netgroup (+NAME) */
 %token <string>  USERGROUP             /* a usergroup (%NAME) */
 %token <string>  WORD                  /* a word */
+%token <string>  DIGEST                        /* a SHA-2 digest */
 %token <tok>    DEFAULTS               /* Defaults entry */
 %token <tok>    DEFAULTS_HOST          /* Host-specific defaults entry */
 %token <tok>    DEFAULTS_USER          /* User-specific defaults entry */
@@ -365,16 +366,16 @@ cmndspec  :       runasspec selinux solarisprivs cmndtag digcmnd {
                        }
                ;
 
-digest         :       SHA224 ':' WORD {
+digest         :       SHA224 ':' DIGEST {
                            $$ = new_digest(SUDO_DIGEST_SHA224, $3);
                        }
-               |       SHA256 ':' WORD {
+               |       SHA256 ':' DIGEST {
                            $$ = new_digest(SUDO_DIGEST_SHA256, $3);
                        }
-               |       SHA384 ':' WORD {
+               |       SHA384 ':' DIGEST {
                            $$ = new_digest(SUDO_DIGEST_SHA384, $3);
                        }
-               |       SHA512 ':' WORD {
+               |       SHA512 ':' DIGEST {
                            $$ = new_digest(SUDO_DIGEST_SHA512, $3);
                        }
                ;
index 8d4c3d6250ed4c4515256935d4c899e11adb0d07..74b1f96b8edb4c5f7d67a66158e21ed771e68342 100644 (file)
@@ -569,7 +569,7 @@ command_matches_normal(char *sudoers_cmnd, char *sudoers_args, struct sudo_diges
 
 static struct digest_function {
     const char *digest_name;
-    const int digest_len;
+    const unsigned int digest_len;
     void (*init)(SHA2_CTX *);
     void (*update)(SHA2_CTX *, const unsigned char *, size_t);
     void (*final)(unsigned char *, SHA2_CTX *);
@@ -603,17 +603,62 @@ static struct digest_function {
     }
 };
 
+static size_t
+base64_decode(const char *src, unsigned char *dst)
+{
+    static const char b64[] =
+       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+    const unsigned char *dst0 = dst;
+    unsigned char ch[4];
+    char *pos;
+    int i;
+    debug_decl(base64_decode, SUDO_DEBUG_MATCH)
+
+    /*
+     * Convert from base64 to binary.  Each base64 char holds 6 bits of data
+     * so 4 base64 chars equals 3 chars of data.
+     * Padding (with the '=' char) may or may not be present.
+     */
+    while (*src != '\0') {
+       for (i = 0; i < 4; i++) {
+           switch (*src) {
+           case '=':
+               src++;
+               /* FALLTHROUGH */
+           case '\0':
+               ch[i] = '=';
+               break;
+           default:
+               if ((pos = strchr(b64, *src++)) == NULL)
+                   debug_return_size_t((size_t)-1);
+               ch[i] = (unsigned char)(pos - b64);
+               break;
+           }
+       }
+       if (ch[0] == '=' || ch[1] == '=')
+           break;
+       *dst++ = (ch[0] << 2) | ((ch[1] & 0x30) >> 4);
+       if (ch[2] == '=')
+           break;
+       *dst++ = ((ch[1] & 0x0f) << 4) | ((ch[2] & 0x3c) >> 2);
+       if (ch[3] == '=')
+           break;
+       *dst++ = ((ch[2] & 0x03) << 6) | ch[3];
+    }
+    debug_return_size_t((size_t)(dst - dst0));
+}
+
 static bool
 digest_matches(char *file, struct sudo_digest *sd)
 {
-    char file_digest[SHA512_DIGEST_LENGTH];
-    char sudoers_digest[SHA512_DIGEST_LENGTH];
+    unsigned char file_digest[SHA512_DIGEST_LENGTH];
+    unsigned char sudoers_digest[SHA512_DIGEST_LENGTH];
     unsigned char buf[32 * 1024];
     struct digest_function *func = NULL;
     size_t nread;
     SHA2_CTX ctx;
     FILE *fp;
-    int i;
+    unsigned int i;
     debug_decl(digest_matches, SUDO_DEBUG_MATCH)
 
     for (i = 0; digest_functions[i].digest_name != NULL; i++) {
@@ -626,23 +671,18 @@ digest_matches(char *file, struct sudo_digest *sd)
        warningx(_("unsupported digest type %d for %s"), sd->digest_type, file);
        debug_return_bool(false);
     }
-    /* XXX - support base64 type too */
-    if (strlen(sd->digest_str) != func->digest_len * 2) {
-       warningx(_("digest for %s (%s) is not in %s form"), file,
-           sd->digest_str, func->digest_name);
-       debug_return_bool(false);
-    }
-
-    /* First convert the digest from sudoers from ascii to binary. */
-    /* XXX - parse base64 type too */
-    for (i = 0; i < func->digest_len; i++) {
-       if (!isxdigit((unsigned char)sd->digest_str[i + i]) ||
-           !isxdigit((unsigned char)sd->digest_str[i + i + 1])) {
-           warningx(_("digest for %s (%s) is not in %s form"), file,
-               sd->digest_str, func->digest_name);
-           debug_return_bool(false);
+    if (strlen(sd->digest_str) == func->digest_len * 2) {
+       /* Convert the command digest from ascii hex to binary. */
+       for (i = 0; i < func->digest_len; i++) {
+           if (!isxdigit((unsigned char)sd->digest_str[i + i]) ||
+               !isxdigit((unsigned char)sd->digest_str[i + i + 1])) {
+               goto bad_format;
+           }
+           sudoers_digest[i] = hexchar(&sd->digest_str[i + i]);
        }
-       sudoers_digest[i] = hexchar(&sd->digest_str[i + i]);
+    } else {
+       if (base64_decode(sd->digest_str, sudoers_digest) != func->digest_len)
+           goto bad_format;
     }
 
     if ((fp = fopen(file, "r")) == NULL) {
@@ -664,6 +704,10 @@ digest_matches(char *file, struct sudo_digest *sd)
     func->final(file_digest, &ctx);
 
     debug_return_bool(memcmp(file_digest, sudoers_digest, func->digest_len) == 0);
+bad_format:
+    warningx(_("digest for %s (%s) is not in %s form"), file,
+       sd->digest_str, func->digest_name);
+    debug_return_bool(false);
 }
 
 static bool
index 20b1d2c30363962c4d3397611a40b8927ce4a97c..a367cf906d3052dac439652c23b825fc7c8cc979 100644 (file)
@@ -306,80 +306,100 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
        *yy_cp = '\0'; \
        yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 65
-#define YY_END_OF_BUFFER 66
-static yyconst short int yy_accept[635] =
+#define YY_NUM_RULES 67
+#define YY_END_OF_BUFFER 68
+static yyconst short int yy_accept[814] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   66,   53,   61,   60,   59,   52,   64,   32,
-       54,   55,   32,   56,   53,   53,   53,   53,   58,   57,
-       64,   44,   44,   44,   44,   44,   44,   44,   44,   44,
-       44,   64,   53,   53,   61,   64,   44,   44,   44,   44,
-       44,    2,   64,    1,   53,   44,   44,   53,   17,   16,
-       17,   16,   16,   64,   64,   64,    3,    9,    8,    9,
-        4,    9,    5,   64,   13,   13,   13,   11,   12,   53,
-        0,   61,   59,    0,   63,    0,   53,   34,    0,   32,
-        0,   33,    0,   51,   51,    0,   53,   53,    0,   53,
-
-       53,   53,   53,    0,   37,   44,   44,   44,   44,   44,
-       44,   44,   44,   44,   44,   44,   44,   53,   62,   53,
-       53,   61,    0,    0,    0,    0,    0,    0,   53,   53,
-       53,   53,   53,    2,    1,    0,    1,   45,   45,    0,
-       53,   17,   17,   15,   14,   15,    0,    0,    3,    9,
+        0,    0,    0,    0,   68,   55,   63,   62,   61,   54,
+       66,   34,   56,   57,   34,   58,   55,   55,   55,   55,
+       60,   59,   66,   46,   46,   46,   46,   46,   46,   46,
+       46,   46,   46,   66,   55,   55,   63,   66,   46,   46,
+       46,   46,   46,    2,   66,    1,   55,   46,   46,   55,
+       17,   16,   17,   16,   16,   66,   66,   66,    3,    9,
+        8,    9,    4,    9,    5,   66,   13,   13,   13,   11,
+       12,   66,   19,   19,   18,   18,   18,   19,   18,   18,
+       18,   19,   19,   19,   19,   19,   18,   19,   19,   55,
+
+        0,   63,   61,    0,   65,    0,   55,   36,    0,   34,
+        0,   35,    0,   53,   53,    0,   55,   55,    0,   55,
+       55,   55,   55,    0,   39,   46,   46,   46,   46,   46,
+       46,   46,   46,   46,   46,   46,   46,   55,   64,   55,
+       55,   63,    0,    0,    0,    0,    0,    0,   55,   55,
+       55,   55,   55,    2,    1,    0,    1,   47,   47,    0,
+       55,   17,   17,   15,   14,   15,    0,    0,    3,    9,
         0,    6,    7,    9,    9,   13,    0,   13,   13,    0,
-       10,    0,    0,    0,   34,   34,    0,    0,   53,   53,
-       53,   53,   53,    0,    0,   37,   37,   44,   39,   44,
-       44,   44,   44,   44,   44,   44,   44,   44,   44,   44,
-       44,   53,   53,    0,    0,    0,    0,    0,    0,   53,
-
-       53,   53,   53,   53,    0,   53,   10,    0,   53,   53,
-       53,   53,   53,   53,    0,   38,   38,   38,    0,    0,
-       37,   37,   37,   37,   37,   37,   37,   44,   44,   44,
-       44,   44,   44,   44,   44,   44,   44,   40,   44,   41,
-       53,   53,   53,   53,    0,    0,    0,    0,    0,    0,
-       53,   53,   53,   53,   53,   53,   53,    0,    0,   38,
-       38,   38,    0,   37,   37,    0,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,    0,   25,   44,
-       44,   44,   44,   44,   44,   44,   44,   42,   44,   53,
-       53,   53,   53,   53,    0,    0,    0,    0,   53,   53,
-
-       53,   53,   53,   53,   53,   53,    0,   38,    0,   37,
-       37,   37,    0,    0,    0,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,   44,   44,
-       44,   44,   44,   44,   44,   44,   44,   46,   47,   48,
-       49,   53,    0,    0,    0,   53,   53,   53,   35,   35,
-       35,    0,    0,   37,   37,   37,   37,   37,   37,   37,
-        0,    0,    0,    0,    0,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   44,
-       44,   44,    0,   24,   44,   44,   44,   44,    0,   23,
-        0,   26,   53,    0,    0,    0,   53,   53,   53,   53,
-
-       35,   35,   35,   35,    0,   37,    0,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,    0,    0,
-        0,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,   44,   44,   44,   44,   44,   44,
-       44,   50,    0,    0,    0,   53,   20,   45,   36,   36,
-       36,   36,   37,    0,    0,    0,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,    0,
-        0,    0,    0,    0,   37,   37,   37,   37,   37,   37,
-       37,   37,   44,   44,   44,   44,   44,    0,   22,    0,
-       27,    0,   20,    0,    0,   53,    0,   53,   53,   53,
-
-       36,   36,   36,   36,    0,    0,    0,    0,    0,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   43,
-        0,   30,   44,   44,   44,    0,    0,    0,   18,    0,
-       21,   20,    0,    0,    0,    0,    0,   20,    0,   53,
-       53,   53,    0,    0,    0,   37,   37,   37,   37,   37,
+       10,   36,    0,    0,   35,   19,   19,    0,   19,    0,
+        0,   18,   18,   18,   18,   18,   18,   19,   19,   46,
+
+       19,   19,   19,   19,   19,   19,   19,    0,    0,    0,
+       36,   55,   55,   55,   55,   55,    0,    0,   39,   39,
+       46,   41,   46,   46,   46,   46,   46,   46,   46,   46,
+       46,   46,   46,   46,   55,   55,    0,    0,    0,    0,
+        0,    0,   55,   55,   55,   55,   55,    0,   55,   10,
+        0,    0,    0,   18,   18,   18,   19,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19,    0,   55,   55,
+       55,   55,   55,   55,    0,   40,   40,   40,    0,    0,
+       39,   39,   39,   39,   39,   39,   39,   46,   46,   46,
+       46,   46,   46,   46,   46,   46,   46,   42,   46,   43,
+
+       55,   55,   55,   55,    0,    0,    0,    0,    0,    0,
+       55,   55,   55,   55,    0,    0,    0,    0,    0,   18,
+       18,   19,   46,   19,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   55,   55,   55,    0,    0,   40,   40,
+       40,    0,   39,   39,    0,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   39,   39,    0,   27,   46,   46,
+       46,   46,   46,   46,   46,   46,   44,   46,   55,   55,
+       55,   55,   55,    0,    0,    0,    0,   55,   55,   55,
+        0,    0,    0,   18,   18,   46,   46,   19,   19,   19,
+       19,   19,   19,   19,   19,   19,   19,   19,   55,   55,
+
+       55,   55,   55,    0,   40,    0,   39,   39,   39,    0,
+        0,    0,   39,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   39,   46,   46,   46,   46,   46,
+       46,   46,   46,   46,   48,   49,   50,   51,   55,    0,
+        0,    0,   55,   55,   55,    0,    0,    0,    0,    0,
+       46,   46,   19,   46,   19,   19,   19,   19,   19,   19,
+       19,   19,   19,   37,   37,   37,    0,    0,   39,   39,
+       39,   39,   39,   39,   39,    0,    0,    0,    0,    0,
+       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   46,   46,   46,    0,   26,   46,
+
+       46,   46,   46,    0,   25,    0,   28,   55,    0,    0,
+        0,   55,   55,   55,   37,   37,   37,   46,   46,   46,
+       46,   19,   19,   19,   55,   37,   37,   37,   37,    0,
+       39,    0,   39,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,    0,    0,    0,   39,   39,   39,   39,
+       39,   39,   39,   39,   39,   39,   39,   39,   39,   46,
+       46,   46,   46,   46,   46,   46,   52,    0,    0,    0,
+       55,   22,   47,    0,   37,   37,   37,   37,   46,   46,
+       46,   46,   19,   19,   19,   38,   38,   38,   38,   39,
+        0,    0,    0,   39,   39,   39,   39,   39,   39,   39,
+
+       39,   39,   39,   39,   39,   39,    0,    0,    0,    0,
+        0,   39,   39,   39,   39,   39,   39,   39,   39,   46,
+       46,   46,   46,   46,    0,   24,    0,   29,    0,   22,
+        0,    0,   55,    0,   55,   38,   38,   38,   38,   46,
+       46,   46,   46,   55,   55,   38,   38,   38,   38,    0,
+        0,    0,    0,    0,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   45,    0,   32,   46,   46,   46,
+        0,    0,    0,   20,    0,   23,   22,    0,    0,    0,
+        0,    0,   22,    0,    0,    0,   38,   38,   38,   38,
+
+       46,   46,   46,   55,   55,   55,    0,    0,    0,   39,
+       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   39,   39,   39,    0,   30,   46,
+       46,   23,    0,    0,   22,    0,    0,    0,   46,   46,
+       55,   55,   55,   55,   55,    0,    0,    0,    0,    0,
+       39,   39,   39,   39,   39,   39,   39,   39,    0,   33,
+       46,    0,    0,    0,    0,    0,    0,   46,   55,   55,
+       55,   39,   39,   39,   39,   39,   39,    0,   31,    0,
+        0,   21,    0,    0,    0,   55,   55,   55,   55,   55,
+       39,   39,   39,   39,   39,    0,    0,    0,    0,    0,
+
        37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       37,   37,   37,    0,   28,   44,   44,   21,    0,    0,
-       20,   53,   53,   53,   53,   53,    0,    0,    0,    0,
-        0,   37,   37,   37,   37,   37,   37,   37,   37,    0,
-
-       31,   44,    0,   53,   53,   53,   37,   37,   37,   37,
-       37,   37,    0,   29,    0,    0,   19,   53,   53,   53,
-       53,   53,   37,   37,   37,   37,   37,   35,   35,   35,
-       35,   35,   35,    0
+       37,   37,    0
     } ;
 
 static yyconst int yy_ec[256] =
@@ -417,625 +437,855 @@ static yyconst int yy_ec[256] =
 static yyconst int yy_meta[71] =
     {   0,
         1,    2,    3,    4,    5,    6,    1,    7,    7,    1,
-        1,    8,    9,   10,   11,   12,   12,   12,   12,   12,
-       12,   12,   12,   12,   12,   13,   14,    7,    1,   15,
-       15,   15,   15,   15,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,   16,   17,   18,   18,   18,   18,   18,   18,   17,
-       17,   17,   17,   17,   17,   17,   17,   17,   17,   17
+        8,    9,   10,   11,   12,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   14,   15,    7,    1,   16,
+       16,   16,   16,   16,   17,   17,   17,   17,   17,   17,
+       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
+       17,   18,   19,   20,   20,   20,   20,   20,   20,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21
     } ;
 
-static yyconst short int yy_base[714] =
+static yyconst short int yy_base[931] =
     {   0,
         0,   69,   71,   79,   94,  124,  175,  244,  153,  197,
-       85,  130, 3060, 3007, 3056, 3925, 3053, 3925,  312,   86,
-     3925, 3925, 3004, 3925,  140,  324,  195,  153, 3029, 3925,
-     3925,  383, 3015,   43,  438,   37, 3011,   65, 3010, 3017,
-     2999,  496,  511,   91,  151,  534,   39,   41, 2983,   34,
-     2980,  117, 3034, 3044,  264, 2992, 3003,  136,    0, 3925,
-     3028, 3925,    0,  359,  594,  105,    0, 2979, 3925,  115,
-     3925,  133, 3925,  138, 2946,  152,  171, 3925,  188, 2934,
-      249, 2972, 2958, 2917, 3925,  262,  462,  265, 2895,  215,
-      536, 2844,  563,  572, 2832,  621,  634,  671, 2836, 2836,
-
-      493,  618,  302, 2812,  181,  715,    0, 2791, 2795, 2788,
-     2792,  325, 2781, 2788, 2785, 2777, 2779,  287, 3925,  208,
-      137,  629, 2742, 2747, 2738, 2733, 2724,  121,  200,  211,
-      299,  301,  236,  254, 2782,  690, 2781,  594, 2730,  749,
-      207,    0, 2756,  160, 3925, 3925,  762,  324,    0, 2707,
-      581, 3925, 3925, 2706,  487, 2694, 2729,  272,  469,  370,
-     2720, 2707, 2672,  772,  782,  468,  806,  658,  821,  803,
-      661,  860, 2647, 2633,  904,  362,  949,  993,    0, 2611,
-     2605, 2588, 2590, 2573, 2584, 2579, 2561, 2551, 2564, 2563,
-     2551,  648,  308, 2512, 2517, 2485, 2487, 2493,  463,  335,
-
-     2485,  474,  241,  343,  845,  323, 2531, 2525, 1037,  451,
-        0,    0,  694,  536, 2492, 2488, 1074,  588, 2487, 2468,
-      534,  842, 1087,  879,  746, 1132, 1178, 2467,  465, 2437,
-      524, 2442, 2435, 2424, 2422, 2418, 2399,    0, 2395,    0,
-      834,  518,  557,  521, 2378, 2380, 2364, 2375, 2345,  581,
-      423,  672,  526,  543, 1190, 1202, 1214, 2385, 2384, 1224,
-     2367, 2365, 2364, 2362,  606,  923,  657,  968, 1005, 1237,
-        0, 1018, 1283, 1047,  889, 1328, 1374,  673, 3925, 2344,
-     2344, 2337, 2351, 2329, 2330, 2334, 2334,    0, 2318,  700,
-      976,  796,  645,  760, 2301, 2276, 2277,  884,  691,  977,
-
-      779, 1384,  568, 1423, 1435, 1062, 2318, 2314, 2296, 2295,
-     1445, 1015, 2306, 2294, 1491, 1058, 1060, 1101, 1112, 1145,
-     1503,    0, 1158, 1549, 1256, 1266, 1594, 1640, 2252, 2250,
-     2243,  742,  812, 2238, 2245,  827,  886, 2233, 2221, 2220,
-     2219,  698, 2240, 2182,  665, 1025,  576, 1118, 1651, 1302,
-     1312, 2211, 2204, 2194, 1347, 1690, 1394, 1357, 1734, 1780,
-     1404, 2198, 2197, 2196, 1466, 1167, 1466, 1480, 1516, 1527,
-     1562, 1792,    0, 1575, 1838, 1613, 1414, 1883, 1929, 2154,
-     2120, 2123,  887, 3925, 2124, 2094, 2088, 2072,  929, 3925,
-      930, 3925,  761, 2056, 2047,  853, 1327,  881,  925, 1939,
-
-      211,    0,    0,  928, 2089, 2088, 1661,   58, 1671, 1112,
-     1978,    0, 1711, 2024, 1753, 1623, 2068, 2114, 2099, 2083,
-     2126, 1571, 1572, 1769, 1805, 1816, 1851, 2138,    0, 1864,
-     2184, 1902, 1681, 2230, 2048, 2049, 2030, 2031, 2024,  974,
-      976, 2017, 2006, 1999, 1871,  816, 1883, 2001, 2242, 1949,
-     1959,  979, 2026, 2025, 2017, 2281, 1998, 1155, 1191, 1997,
-     1424, 2293,    0, 2045, 2339, 2087, 1722, 2383, 2429, 2157,
-     1993, 1992, 1922, 2009, 1860, 1918, 2103,  492, 1007, 2441,
-        0, 2169, 1889, 1159, 1885, 1883, 1867, 1262, 3925, 1263,
-     3925, 1813, 2047, 1040, 1121, 1071, 2217, 2222, 2485, 1073,
-
-        0,    0, 1466, 1526, 2259, 1830, 1814, 1807, 2215, 1760,
-     1736, 1527, 1691, 2312, 1816, 2524,    0, 2360, 2570, 2402,
-     1969, 2614, 2660, 1711, 1640, 2671, 2242, 1631, 1031,    0,
-     1264, 3925, 1308, 1575, 1555, 1471, 1490, 1165, 3925, 1471,
-     1421, 2286, 2337, 2426, 2475, 1367, 2503, 2480, 2508, 2683,
-     2695, 2707, 1215, 1126, 2719, 1096, 1059, 1862, 1979, 2543,
-     2046, 2731,    0, 2591, 2777, 2633, 2471,    0,  942,  860,
-      854, 2554,  835, 1309, 3925, 1310,  763, 3925, 1353, 2750,
-     2796, 2823, 1570, 2835, 2847, 2646, 2857,  709,  660,  578,
-     2505,  559,  520, 2199,  474,  377, 2869,    0, 2602, 1355,
-
-     3925, 1470, 1495, 2881, 2893, 2905, 2915, 2925, 2935,  326,
-        0,  208, 1530, 3925,  128, 1552, 3925, 2947, 1571, 2959,
-     2971, 2983, 3925, 2989, 2999, 2760, 3925, 3020, 3057, 3094,
-       59, 3131, 3009, 3925, 3183, 3201, 3219, 3237, 3255, 3273,
-     3291, 3309, 3327, 3334,  747, 3352, 3370, 1582, 3388, 3406,
-     3424, 3442, 3460, 1724, 3478, 3496, 3503, 3511, 3529, 3547,
-     3554, 3562, 3569, 3576, 3583, 3591, 3598, 3605, 3612, 3620,
-     3629, 3636, 3643, 3650,  989, 1635, 3658, 3667, 3674, 3681,
-     3689, 3698, 3705, 3714, 1751, 1769, 3722, 3731, 1770, 1775,
-     3738, 3747, 1817, 3755, 3764, 3782, 3800, 3818, 3825, 3834,
-
-     1707, 1723, 3842, 1920, 1833, 1879, 3849, 3858, 3865, 3872,
-     3881, 3899, 3906
+       85,  130,  314,    0, 4514, 4461, 4510, 5604, 4507, 5604,
+      382,   86, 5604, 5604, 4458, 5604,  140,  394,  195,  153,
+     4483, 5604, 5604,  453, 4383,   43,  508,   37, 4379,   65,
+     4378, 4385, 4367,  566,  581,   91,  151,  604,   39,   41,
+     4351,   34, 4348,  117, 4402, 4412,  428, 4371, 4382,  136,
+        0, 5604, 4407, 5604,    0,  606,  664,  105,    0, 4358,
+     5604,  115, 5604,  133, 5604,  138, 4357,  152,  171, 5604,
+      188,  383,  641,  694,  737,  235,  245,  794,  843, 4369,
+      157,  898, 4365, 4364, 4375, 4370,  944,    0,  206, 4351,
+
+      266, 4400, 4397, 4397, 5604,  263,  532,  585, 4386,  608,
+      707, 4346,  829,  648, 4345,  968,  981, 1018, 4359, 4370,
+      563,  708,  422, 4357,  371, 1062, 1106, 4343, 4347, 4340,
+     4344,  596, 4333, 4340, 4337, 4329, 4331,  644, 5604,  237,
+      137,  946, 4309, 4314, 4305, 4300, 4301,  121,  225,  530,
+      377,  369,  335,  445, 4366,  720, 4365,  931, 4314, 1018,
+      169,    0, 4361,  160, 5604, 5604,  991,  388,    0, 4312,
+      638, 5604, 5604, 4311,  661, 4310, 4356,  392,  221,  420,
+     4358,  653,  665, 1139, 4296, 1145,    0, 1173, 1201, 1210,
+     1037, 1239, 4333, 1081, 1170,  826, 1288, 1343, 4307,    0,
+
+     4311, 4309,  899, 4298, 4296, 4287, 4283, 4336, 4335, 1222,
+     1258, 1389, 1362,  968, 1428, 4323, 4310, 1472,  520, 1517,
+     1561, 1605, 4303, 4297, 4280, 4282, 4289, 4300, 4295, 4283,
+     4279, 4292, 4291, 4290,  654,  493, 4258, 4252, 4242, 4244,
+     4250,  534,  579, 4253,  491,  407,  506, 1413,  626, 4304,
+     4251, 4239, 1651, 1661, 4227, 1705,    0, 4197, 4164, 4155,
+     4151, 4151, 4135, 4112, 4111,  811, 4067, 4122, 1749,  378,
+        0,    0, 1041,  243, 4098, 4097, 1786,  805, 4096, 4095,
+      623, 1410, 1799, 1447, 1091, 1844, 1890, 4094,  429, 4073,
+      632, 4084, 4082, 4056, 4054, 4050, 4053,    0, 4046,    0,
+
+      929,  638,  544,  561, 4022, 4024, 4008, 4022, 4008,  746,
+      524, 1063,  413,  662, 1491, 4060, 4059, 4058, 1270, 1900,
+     1944,  763,  904, 4037, 4020, 4009, 4007, 3992, 3988,  818,
+     3993, 3988, 3912, 1990, 2002, 2014, 3930, 3929, 2024, 3929,
+     3912, 3911, 3910,  919, 1536, 1003, 1580, 1142, 2037,    0,
+     1626, 2083, 1680, 1372, 2128, 2174,  764, 5604, 3892, 3877,
+     3870, 3884, 3862, 3869, 3879, 3879,    0, 3863,  698,  593,
+      820,  973, 1093, 3857, 3824, 3825,  922,  897,  969, 1097,
+     3866, 3858, 2186, 2196, 3829, 3807, 3800, 3814, 3778, 3784,
+     3794, 3793, 3747, 3726, 3716, 3711, 3696, 3656, 2240, 1017,
+
+     2279, 2291, 1637, 3686, 3662, 3648, 3646, 2301, 1127, 3642,
+     3641, 2347, 1154, 1205, 1209, 1724, 1761, 2359,    0, 1763,
+     2405, 1774, 1457, 2450, 2496, 2521, 1024, 1127, 1181, 1190,
+     1169, 1207, 1224, 1392, 3602, 3584, 3577, 3560, 1240, 3581,
+     3547, 1313, 1391,  874, 1774, 1821, 3584, 3576, 3569, 1503,
+     3523, 3519,  869, 1379, 3515, 3511,  949, 1045,    0,    0,
+        0,    0, 3478, 2577, 1863, 1546, 3510, 3509, 3506, 1919,
+     2616, 1963, 1590, 2660, 2706, 2056, 3517, 3509, 3487, 1692,
+     1879, 1979, 2096, 2104, 2147, 2106, 2718,    0, 2217, 2764,
+     2250, 1734, 2809, 2855, 2880, 2086, 1133, 1088, 5604,  421,
+
+     2087, 1184, 2088, 1369, 5604, 1370, 5604, 1197, 3418, 3389,
+     1282, 2127, 1249, 1368, 3442, 3427, 2936, 3386, 3320, 3309,
+     3295, 2951, 1219, 3272, 3006, 1181, 3044,    0, 1709, 3290,
+     3263, 2260,   58, 2320, 1774, 3083,    0, 2380, 3129, 2424,
+     1831, 3173, 3219, 3270, 3265, 3231, 2336, 2462, 2464, 2471,
+     3256, 2477, 3243,    0, 2589, 3289, 2600, 1929, 3335, 3360,
+     1376, 1087, 1847, 1409, 1542, 1586, 3218, 3184, 3166, 1832,
+     1427, 2060, 3174, 2635, 3210, 3186, 3185, 2435, 3129, 3111,
+     3114, 3066, 3429, 1454,    0, 3486, 2679, 2737, 1483, 3085,
+     2989, 2839, 3525, 2819, 2003, 2280, 2783, 2381, 3537,    0,
+
+     2830, 3583, 3016, 2157, 3627, 3673, 3026, 2821, 2801, 2750,
+     2228, 2472, 2474, 2695, 1189, 1531, 3685,    0, 2647, 1848,
+     1925, 1602, 1522, 1849, 1587, 5604, 1664, 5604, 2692, 1967,
+     1630, 2177, 2014, 2406, 2761, 2674, 2630, 3731, 2272, 1926,
+     2155, 2500, 1927, 3741, 2076, 3780,    0, 1967, 2277, 3054,
+     2598, 2535, 2509, 2841, 2470, 2431, 2485, 2600, 3064, 2617,
+     3819,    0, 3104, 3865, 3148, 3036, 3909, 3955, 2390, 2373,
+     3966, 3118, 2338, 1742, 2298, 2129, 5604, 2743, 1825, 1738,
+     2219, 2153, 1825, 5604, 2062, 2083, 3130, 3172, 3276, 3281,
+     1984, 2880, 1920, 3360, 3192, 1912, 1877, 1858, 3274, 1744,
+
+     2326, 2643, 2745, 3978, 3990, 4002, 1700, 1693, 4014, 1662,
+     1623, 2856, 2951, 3496, 3084, 4026,    0, 3508, 4072, 3556,
+     3074,    0, 1599, 1510, 1503, 3319, 1423, 2328, 5604, 3154,
+     2037, 5604, 2124, 3602, 3646, 1409, 1403, 4118, 2407, 2791,
+     4130, 2334, 4142, 4154, 3659, 3704, 1390, 1286, 1251, 3418,
+     1158, 1087, 3105, 1077, 1056, 4166,    0, 3568, 2499, 5604,
+     3270, 2220, 3751, 1014, 1005,  957, 3614, 2522, 4178, 4190,
+     4202, 3761, 3790, 3800,  684,    0,  683, 2685, 5604,  658,
+     2222, 5604,  522,  382, 4214, 4226, 2335, 4238, 4250, 3840,
+     5604, 3846, 3884, 3202, 5604, 3928,  374,  208,  117, 3716,
+
+     4260, 4297, 4334, 4045, 4091, 4270,   59, 4371, 3941, 5604,
+     4280, 3771, 5604, 4423, 4444, 4465, 4486, 4507, 4528, 4549,
+     4570, 4591, 4600, 2074, 4620, 4641, 2383, 4662, 4683, 4704,
+     4725, 4746, 4767, 4788, 4809, 2337, 4830, 4839, 4847, 4856,
+     4876, 4897, 4918, 2474, 4939, 4960, 4981, 5002, 5011, 5030,
+     5039, 5048, 2421, 2516, 5056, 5064, 5072, 5081, 5089, 5096,
+     5104, 5112, 5121, 5131, 2600, 2694, 5139, 5147, 5155, 2695,
+     2757, 5164, 5174, 5194, 2798, 5203, 5211, 2799, 5220, 5230,
+     5250, 2228, 2615, 5259, 5271, 5280, 5290, 2803, 2825, 5299,
+     5309, 5318, 5338, 2700, 5347, 5359, 2841, 2872, 5368, 5378,
+
+     2873, 5387, 5397, 5417, 5438, 5459, 3115, 3116, 5479, 3168,
+     5486, 5496, 2951, 2967, 5505, 2520, 5525, 3304, 3313, 5534,
+     5544, 3517, 3314, 3318, 5552, 5562, 5582, 3814, 3319, 3430
     } ;
 
-static yyconst short int yy_def[714] =
+static yyconst short int yy_def[931] =
     {   0,
-      634,    1,    1,    1,  635,  635,  636,  636,  637,  637,
-      638,  638,  634,  639,  634,  634,  634,  634,  640,  641,
-      634,  634,  642,  634,  643,  639,   26,   26,  644,  634,
-      634,  634,   32,   32,   32,   35,   35,   35,   35,   35,
-       35,  639,   26,  639,  634,  640,   32,   32,   35,   35,
-       35,  634,  645,  634,  646,   35,   35,  639,  647,  634,
-      647,  634,  647,  634,  640,  634,  648,  649,  634,  649,
-      634,  649,  634,  650,  651,  651,  651,  634,  634,  639,
-      639,  634,  634,  652,  634,  653,  634,  641,  654,  655,
-      641,  642,  642,  643,  656,  639,  639,   26,  644,   98,
-
-       98,   98,   98,  657,  658,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,  639,  634,  639,
-      639,  634,  634,  634,  634,  634,  634,  652,  639,   98,
-      639,  639,  639,  634,  634,  634,  634,  646,  659,  639,
-      639,  647,  647,  634,  634,  634,  653,  634,  648,  649,
-      649,  634,  634,  649,  649,  651,  634,  651,  651,  634,
-      634,  652,  660,  634,  634,  655,  655,  634,  639,  169,
-      169,   98,  172,  661,  634,  662,  634,  106,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,  639,  639,  634,  634,  634,  634,  634,  652,  639,
-
-      172,  639,  639,  639,  634,  639,  634,  660,  639,  639,
-      169,  169,  169,  639,  663,  664,  664,  217,  665,  664,
-      666,  177,  634,  223,  223,  634,  223,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-      639,  639,  639,  639,  634,  634,  634,  634,  634,  652,
-      639,  639,  639,  639,  169,  169,  169,  634,  667,  667,
-      260,  667,  668,  669,  670,  634,  671,  226,  671,  634,
-      270,  671,  634,  273,  273,  634,  273,  634,  634,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,  639,
-      639,  639,  639,  639,  634,  634,  634,  652,  639,  639,
-
-      639,  639,  639,  169,  169,  639,  672,  672,  673,  674,
-      634,  634,  675,  676,  634,  677,  677,  678,  276,  678,
-      634,  321,  678,  634,  324,  324,  634,  324,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,  639,  639,  639,
-      639,  639,  634,  634,  652,  639,  639,  639,  639,  349,
-      349,  634,  679,  680,  311,  634,  356,  356,  634,  356,
-      634,  634,  675,  675,  634,  634,  681,  681,  682,  327,
-      682,  634,  372,  682,  634,  375,  375,  634,  375,   35,
-       35,   35,  634,  634,   35,   35,   35,   35,  634,  634,
-      634,  634,  639,  634,  634,  652,  639,  639,  639,  639,
-
-      639,  349,  349,  349,  634,  683,  634,  684,  359,  684,
-      634,  411,  684,  634,  414,  414,  634,  414,  685,  686,
-      634,  634,  687,  687,  688,  378,  688,  634,  428,  688,
-      634,  431,  431,  431,   35,   35,   35,   35,   35,   35,
-       35,  639,  634,  634,  652,  639,  639,  639,  639,  449,
-      449,  449,  634,  689,  690,  634,  691,  691,  692,  417,
-      692,  634,  462,  692,  634,  465,  465,  634,  465,  634,
-      634,  693,  693,  634,  634,  694,  694,  695,  695,  634,
-      480,  695,   35,   35,   35,   35,   35,  634,  634,  634,
-      634,  634,  634,  696,  652,  639,  697,  698,  639,  639,
-
-      449,  449,  449,  639,  634,  634,  689,  689,  634,  634,
-      699,  699,  700,  468,  700,  634,  516,  700,  634,  519,
-      519,  634,  519,  701,  702,  634,  634,  703,  703,   35,
-      634,  634,   35,   35,   35,  634,  696,  696,  634,  652,
-      639,  697,  697,  697,  697,  704,  697,  698,  698,  449,
-      449,  449,  705,  706,  634,  634,  707,  707,  708,  522,
-      708,  634,  562,  708,  634,  565,  565,  709,  634,  701,
-      701,  634,  634,  634,  634,   35,   35,  634,  652,  634,
-      634,  449,  639,  449,  449,  639,  634,  634,  705,  705,
-      634,  634,  710,  710,  711,  711,  711,  597,  711,  634,
-
-      634,   35,  712,  449,  449,  449,  634,  634,  634,  634,
-      713,  713,  634,  634,  712,  712,  634,  449,  639,  449,
-      449,  639,  634,  634,  634,  634,  634,  639,  639,  639,
-      639,  639,  639,    0,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634
+      813,    1,    1,    1,  814,  814,  815,  815,  816,  816,
+      817,  817,  813,   13,  813,  818,  813,  813,  813,  813,
+      819,  820,  813,  813,  821,  813,  822,  818,   28,   28,
+      823,  813,  813,  813,   34,   34,   34,   37,   37,   37,
+       37,   37,   37,  818,   28,  818,  813,  819,   34,   34,
+       37,   37,   37,  813,  824,  813,  825,   37,   37,  818,
+      826,  813,  826,  813,  826,  813,  819,  813,  827,  828,
+      813,  828,  813,  828,  813,  829,  830,  830,  830,  813,
+      813,  831,  832,  833,  813,   85,   85,   85,  813,   89,
+       89,   89,   92,   92,   92,   92,   85,   88,   88,  818,
+
+      818,  813,  813,  834,  813,  835,  813,  820,  836,  831,
+      820,  821,  821,  822,  837,  818,  818,   28,  838,  118,
+      118,  118,  118,  839,  840,   37,  126,  127,  127,  127,
+      127,  127,  127,  127,  127,  127,  127,  818,  813,  818,
+      818,  813,  813,  813,  813,  813,  813,  834,  818,  118,
+      818,  818,  818,  813,  813,  813,  813,  841,  842,  818,
+      818,  843,  843,  813,  813,  813,  835,  813,  844,  845,
+      845,  813,  813,  845,  845,  830,  813,  830,  830,  813,
+      813,  831,  831,  831,  846,  847,   88,  846,  848,  813,
+      813,   85,  192,  192,  192,  192,  813,  197,  198,  849,
+
+      198,  198,  198,  198,  198,   88,   88,  834,  850,  813,
+      813,  818,  212,  212,  118,  215,  851,  813,  852,  813,
+      127,  221,  222,  222,  222,  222,  222,  222,  222,  222,
+      222,  222,  222,  222,  818,  818,  813,  813,  813,  813,
+      813,  834,  818,  215,  818,  818,  818,  813,  818,  813,
+      853,  854,  813,   88,  254,  197,  198,  198,  198,  198,
+      198,  198,  198,  198,  198,   88,   88,  850,  818,  818,
+      212,  212,  212,  818,  855,  856,  856,  277,  857,  856,
+      858,  220,  813,  283,  283,  813,  283,  222,  222,  222,
+      222,  222,  222,  222,  222,  222,  222,  222,  222,  222,
+
+      818,  818,  818,  818,  813,  813,  813,  813,  813,  834,
+      818,  818,  818,  818,  813,  813,  853,  853,  813,  254,
+      197,  198,  859,  198,  198,  198,  198,  198,  198,   88,
+       88,   88,   88,  212,  212,  212,  813,  860,  860,  339,
+      860,  861,  862,  863,  813,  864,  286,  864,  813,  349,
+      864,  813,  352,  352,  813,  352,  813,  813,  222,  222,
+      222,  222,  222,  222,  222,  222,  222,  222,  818,  818,
+      818,  818,  818,  813,  813,  813,  834,  818,  818,  818,
+      865,  866,  813,   88,  321,  859,  859,  198,  198,  198,
+      198,  198,  198,   88,   88,   88,   88,   88,  818,  818,
+
+      212,  212,  818,  867,  867,  868,  869,  813,  813,  870,
+      871,  813,  872,  872,  873,  355,  873,  813,  418,  873,
+      813,  421,  421,  813,  421,  813,  426,  426,  426,  426,
+      426,  426,  426,  426,  818,  818,  818,  818,  818,  813,
+      813,  874,  818,  818,  818,  813,  813,  875,  875,  813,
+      859,  859,  198,  859,  198,  198,  198,  198,   88,   88,
+       88,   88,   88,  818,  464,  464,  813,  876,  877,  408,
+      813,  471,  471,  813,  471,  813,  813,  878,  878,  813,
+      813,  879,  879,  880,  424,  880,  813,  487,  880,  813,
+      490,  490,  813,  490,  813,  495,  495,  813,  813,  495,
+
+      495,  495,  495,  813,  813,  813,  813,  818,  813,  813,
+      881,  818,  818,  818,  882,  883,  813,  884,  884,  884,
+      884,  813,  522,  885,  818,  818,  818,  527,  527,  813,
+      886,  813,  887,  474,  887,  813,  536,  887,  813,  539,
+      539,  813,  539,  888,  889,  813,  813,  890,  890,  891,
+      892,  891,  813,  553,  891,  813,  556,  556,  556,  813,
+      560,  560,  560,  560,  560,  560,  818,  813,  813,  893,
+      818,  818,  818,  813,  813,  894,  894,  813,  895,  895,
+      895,  895,  813,  583,  896,  818,  586,  586,  586,  813,
+      897,  898,  813,  899,  899,  900,  542,  900,  813,  599,
+
+      900,  813,  602,  602,  813,  602,  813,  813,  901,  901,
+      813,  813,  902,  902,  903,  903,  813,  617,  903,  560,
+      560,  560,  560,  560,  813,  813,  813,  813,  813,  813,
+      904,  893,  818,  905,  906,  907,  908,  813,  907,  909,
+      909,  909,  909,  818,  818,  818,  646,  646,  818,  813,
+      813,  910,  910,  813,  813,  911,  911,  912,  605,  912,
+      813,  661,  912,  813,  664,  664,  813,  664,  913,  914,
+      813,  813,  915,  915,  560,  813,  813,  560,  560,  560,
+      813,  904,  904,  813,  893,  818,  905,  905,  905,  905,
+      916,  905,  917,  917,  813,  813,  907,  907,  813,  813,
+
+      909,  909,  909,  646,  646,  646,  918,  919,  813,  813,
+      920,  920,  921,  667,  921,  813,  716,  921,  813,  719,
+      719,  922,  813,  913,  913,  813,  813,  813,  813,  560,
+      560,  813,  893,  813,  813,  923,  924,  813,  909,  909,
+      646,  818,  646,  646,  818,  813,  813,  918,  918,  813,
+      813,  925,  925,  926,  926,  926,  756,  926,  813,  813,
+      560,  927,  813,  813,  923,  923,  813,  909,  646,  646,
+      646,  813,  813,  813,  813,  928,  928,  813,  813,  927,
+      927,  813,  929,  930,  813,  646,  818,  646,  646,  818,
+      813,  813,  813,  813,  813,  813,  813,  929,  929,  813,
+
+      818,  818,  818,  813,  813,  813,  818,  818,  818,  813,
+      813,  813,    0,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813
     } ;
 
-static yyconst short int yy_nxt[3996] =
+static yyconst short int yy_nxt[5675] =
     {   0,
-       14,   15,   16,   17,   18,   19,   20,   21,   22,   14,
-       23,   24,   14,   14,   25,   26,   27,   28,   26,   26,
-       26,   26,   26,   26,   26,   29,   30,   31,   14,   32,
-       33,   33,   33,   34,   35,   35,   35,   35,   36,   35,
-       37,   35,   38,   39,   40,   41,   35,   35,   35,   35,
-       35,   42,   14,   43,   43,   43,   43,   43,   43,   14,
-       14,   14,   14,   14,   14,   14,   14,   44,   14,   14,
-       45,  407,   52,  110,   46,  115,   53,  107,  111,  107,
-       52,  107,   54,  409,   53,   55,   76,   16,   77,   78,
-       54,   89,  109,   55,  113,   15,   60,   61,  130,   62,
-
-       47,   48,  129,  132,   49,   62,  148,  119,  114,   56,
-       81,   90,   50,   57,   35,   51,   35,   56,  134,   62,
-       63,   57,   35,   85,   35,   15,   60,   61,  135,   62,
-      617,   76,   16,   77,   78,   62,   79,   91,   58,  155,
-      119,  152,   81,   95,   95,   64,   58,   95,   95,   62,
-       63,  120,  122,  158,   15,   16,   17,   69,   65,  153,
-      121,  148,  119,   70,   71,   72,  151,   95,  102,  102,
-      102,  102,  102,  103,  159,   64,   15,   16,   17,   73,
-       65,   79,  123,  124,  151,  199,  125,   81,   81,  160,
-      161,   96,  156,  193,  126,  175,  120,  127,   15,   16,
-
-       17,   69,   65,  157,   74,  141,  177,   70,   71,   72,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-       89,  407,  157,   73,   80,  400,   66,   67,   67,   67,
-       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
-       67,   67,   67,   67,   67,   15,   16,   17,   74,   65,
-       80,   81,   80,   80,   80,  134,   80,   80,   81,   81,
-       80,  192,   81,  206,  200,  135,  167,  139,  139,  201,
-      634,  139,  139,  158,   80,   80,   80,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,   81,  148,  119,
-      634,  139,   81,  204,  253,   66,   67,   67,   67,   67,
-
-       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
-       67,   67,   67,   67,   85,  140,   91,  173,  173,  173,
-      173,  173,  173,  157,   86,  148,  119,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,   97,   81,   98,
-       98,   98,   98,   98,   98,   98,   98,   98,   98,   99,
-       81,  560,   81,  100,  100,  100,  100,  100,  183,   81,
-      144,  119,  145,  184,  146,  203,  202,  185,  145,  186,
-      146,  160,  161,  244,   81,   81,  175,  100,  100,  100,
-      100,  100,  100,   80,  146,  146,   81,  222,  254,   80,
-      634,  251,   80,   80,   81,   80,   80,   80,  106,  106,
-
-      106,  106,  106,  106,  106,  106,  106,  106,   99,  251,
-      146,   80,  106,  106,  106,  106,  106,  107,  107,  107,
-      107,  108,  107,  107,  107,  107,  107,  107,  107,  107,
-      107,  107,  107,  107,   81,  107,  100,  100,  100,  100,
-      100,  100,   80,   80,   80,   80,   80,   80,   80,   80,
-       80,   80,   80,  107,  107,  107,  107,  107,  107,  107,
-      107,  107,  107,  634,  209,   85,  278,  107,  107,  107,
-      107,  107,  159,  634,   81,  299,  107,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,  407,  148,  119,
-      279,   80,   80,   80,   80,   80,   80,  118,  119,   80,
-
-       80,   80,   81,   80,   80,  266,  175,   80,  173,  173,
-      173,  173,  173,  173,  173,  173,  173,  173,  250,  167,
-      157,   80,   80,   80,   80,   81,  100,  100,  100,  100,
-      100,  100,  100,  100,  100,  100,   85,   88,  151,   88,
-       88,  292,  251,   88,   88,  560,   86,   88,  175,   87,
-       87,   87,   87,   87,   87,   87,   87,   87,   87,  222,
-      281,   99,   88,   88,   92,  282,   92,   92,   92,   81,
-       92,   92,   81,  293,   92,   95,   95,   81,  294,   95,
-       95,  302,  150,   85,  514,  150,  150,   81,   92,   92,
-       92,  587,  150,  251,   81,  128,   85,  139,  139,   95,
-
-      301,  139,  139,  262,  262,  262,  147,  150,   81,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,   81,
-      175,  139,   94,   96,   80,   80,   94,   81,   80,   80,
-      122,  222,   94,  173,  173,  173,  173,  173,  173,  173,
-      173,  173,  173,  298,  398,  140,   94,   94,   80,  169,
-      170,  171,  169,  169,  169,  169,  169,  169,  169,   95,
-      123,  124,  341,   95,  125,  241,  242,   85,  243,   95,
-      266,  175,  126,  587,  278,  127,  212,  212,  212,  212,
-      212,  213,  268,   95,   95,   81,  172,  172,  172,  172,
-      172,  172,  172,  172,  172,  172,   81,   99,  279,   81,
-
-      172,  172,  172,  172,  172,   87,   87,   87,   87,   87,
-       87,   87,   87,   87,   87,   80,   80,   80,   80,  338,
-      346,  396,  587,   81,  172,  172,  172,  172,  172,  172,
-      178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
-       99,  300,   81,  383,  178,  178,  178,  178,  178,   81,
-      138,   81,   80,   80,  138,   87,   80,   80,   87,  393,
-      138,  271,  271,  271,  271,  271,  272,  384,  172,  172,
-      172,  172,  172,  172,  138,  138,   80,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  165,  165,  165,
-      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-
-      165,  165,  165,  165,  165,  165,  165,  166,  602,  166,
-      166,   81,   81,  166,  166,  340,  342,  166,  211,  211,
-      211,  211,  211,  211,  211,  211,  211,  211,  389,  442,
-       81,  166,  166,  166,  209,  348,  210,  210,  210,  210,
-      210,  210,  210,  210,  210,  210,  139,   81,  385,  175,
-      139,  290,  390,  386,  291,   85,  139,  227,  227,  227,
-      227,  227,  227,  227,  227,  227,  227,   81,  175,  496,
-      139,  139,   81,   80,  175,  214,  214,  214,  214,  214,
-      214,  214,  214,  214,  214,   81,   85,  391,  383,  214,
-      214,  214,  214,  214,  270,  270,  270,  270,  270,  270,
-
-      270,  270,  270,  270,  322,  322,  322,  322,  322,  323,
-      445,  392,  384,  214,  214,  214,  214,  214,  214,  216,
-      217,  218,  218,  218,  218,  218,  218,  218,  218,  219,
-      389,  391,   81,  220,  220,  220,  220,  220,  313,  314,
-      315,  313,  313,  313,  313,  313,  313,  313,  447,   80,
-       80,   80,   80,  345,  390,  392,  175,  220,  220,  220,
-      220,  220,  220,  175,  223,  224,  225,  223,  223,  223,
-      223,  223,  223,  223,  226,  488,   81,  490,  227,  227,
-      227,  227,  227,  277,  277,  277,  277,  277,  277,  277,
-      277,  277,  277,  448,  504,  504,  504,  339,  362,  489,
-
-      362,  491,  227,  227,  227,  227,  227,  227,  228,  228,
-      228,  228,  228,  228,  228,  228,  228,  228,  634,  175,
-      634,  175,  228,  228,  228,  228,  228,   81,   81,  175,
-      268,  266,  175,  317,  317,  317,  317,  317,  317,  347,
-      222,  538,  539,  268,  266,  175,  214,  214,  214,  214,
-      214,  214,  255,  256,  257,  255,  255,  255,  255,  255,
-      255,  255,  321,  321,  321,  321,  321,  321,  321,  321,
-      321,  321,  175,  266,  175,  302,   81,  303,  303,  303,
-      303,  303,  303,  268,  514,  268,  499,  397,   81,  260,
-      260,  261,  262,  262,  262,  262,  262,  262,  262,  219,
-
-      266,  175,  267,  267,  267,  267,  267,  267,  267,  267,
-      267,  267,  268,   81,  266,  175,  269,  269,  269,  269,
-      269,  460,   81,   85,   81,  634,  319,  328,  328,  328,
-      328,  328,  328,  328,  328,  328,  328,  409,  541,  587,
-      269,  269,  269,  269,  269,  269,  175,  273,  274,  275,
-      273,  273,  273,  273,  273,  273,  273,  276,  634,  175,
-      531,  277,  277,  277,  277,  277,  538,  539,  407,   81,
-      319,  266,  175,  368,  368,  368,  368,  368,  368,  399,
-      409,  175,  540,  319,  532,  277,  277,  277,  277,  277,
-      277,  634,  268,  269,  269,  269,  269,  269,  269,  269,
-
-      269,  269,  269,  302,  407,  303,  303,  303,  303,  303,
-      303,  303,  303,  303,  303,  302,  460,  304,  304,  304,
-      304,  304,  304,  304,  304,  304,  304,  302,  587,  305,
-      305,  305,  305,  305,  306,  303,  303,  303,  303,  308,
-      308,  308,  308,  308,  308,  308,  308,  308,  308,  219,
-      266,  175,  317,  317,  317,  317,  317,  317,  317,  317,
-      317,  317,  268,  488,  490,  531,  316,  316,  316,  316,
-      316,  372,  372,  372,  372,  372,  372,  372,  372,  372,
-      372,  373,  373,  373,  373,  373,  374,  489,  491,  532,
-      316,  316,  316,  316,  316,  316,  266,  175,  318,  318,
-
-      318,  318,  318,  318,  318,  318,  318,  318,  319,  574,
-      574,  600,  320,  320,  320,  320,  320,  402,  402,  402,
-      402,  402,  402,  402,  402,  402,  402,  403,  403,  403,
-      403,  403,  404,  575,  575,  601,  320,  320,  320,  320,
-      320,  320,  175,  324,  325,  326,  324,  324,  324,  324,
-      324,  324,  324,  327,  603,   85,  600,  328,  328,  328,
-      328,  328,  360,  360,  360,  360,  360,  360,  360,  360,
-      360,  360,  412,  412,  412,  412,  412,  413,   81,  580,
-      601,  328,  328,  328,  328,  328,  328,  634,  446,  320,
-      320,  320,  320,  320,  320,  320,  320,  320,  320,  349,
-
-      350,  351,  349,  349,  349,  349,  349,  349,  349,  411,
-      411,  411,  411,  411,  411,  411,  411,  411,  411,  419,
-      420,  421,  419,  419,  419,  419,  419,  419,  419,  429,
-      429,  429,  429,  429,  430,   81,  302,  634,  303,  303,
-      303,  303,  303,  303,  303,  303,  303,  303,  302,  460,
-      303,  303,  303,  303,  303,  303,  303,  303,  303,  303,
-      356,  357,  358,  356,  356,  356,  356,  356,  356,  356,
-      359,  613,   81,   85,  360,  360,  360,  360,  360,  361,
-      175,  362,  362,  362,  362,  362,  362,   80,   80,   80,
-       80,  319,  539,  266,  175,  614,  616,  617,  360,  360,
-
-      360,  360,  360,  360,  361,  319,  364,  364,  364,  364,
-      364,  365,  362,  362,  362,  362,  266,  175,  368,  368,
-      368,  368,  368,  368,  368,  368,  368,  368,  319,  266,
-      175,  613,  367,  367,  367,  367,  367,  579,  578,  499,
-      407,  370,  379,  379,  379,  379,  379,  379,  379,  379,
-      379,  379,  460,  616,  617,  614,  367,  367,  367,  367,
-      367,  367,  266,  175,  369,  369,  369,  369,  369,  369,
-      369,  369,  369,  369,  370,  634,  175,   81,  371,  371,
-      371,  371,  371,  582,  618,  175,  175,  370,  266,  175,
-      424,  424,  424,  424,  424,  424,  319,  370,  149,  149,
-
-      370,  577,  371,  371,  371,  371,  371,  371,  175,  375,
-      376,  377,  375,  375,  375,  375,  375,  375,  375,  378,
-      576,   81,   81,  379,  379,  379,  379,  379,  428,  428,
-      428,  428,  428,  428,  428,  428,  428,  428,  463,  463,
-      463,  463,  463,  464,  363,  175,  363,  379,  379,  379,
-      379,  379,  379,  634,  175,  371,  371,  371,  371,  371,
-      371,  371,  371,  371,  371,  400,  401,  401,  401,  401,
-      401,  401,  401,  401,  401,  401,  454,  455,  456,  454,
-      454,  454,  454,  454,  454,  454,  418,  418,  418,  418,
-      418,  418,  418,  418,  418,  418,  481,  481,  481,  481,
-
-      481,  482,   81,  407,  407,  408,  408,  408,  408,  408,
-      408,  408,  408,  408,  408,  409,  514,  569,  569,  410,
-      410,  410,  410,  410,  407,  175,  458,  458,  458,  458,
-      458,  458,  165,  570,  570,  165,  409,  517,  517,  517,
-      517,  517,  518,  410,  410,  410,  410,  410,  410,  414,
-      415,  416,  414,  414,  414,  414,  414,  414,  414,  417,
-      471,  460,  471,  418,  418,  418,  418,  418,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  462,  472,  506,
-      472,  506,  266,  175,  507,  409,  507,  418,  418,  418,
-      418,  418,  418,  634,  370,  410,  410,  410,  410,  410,
-
-      410,  410,  410,  410,  410,  266,  175,  424,  424,  424,
-      424,  424,  424,  424,  424,  424,  424,  370,  266,  175,
-      505,  423,  423,  423,  423,  423,  471,  505,  471,  634,
-      426,  434,  434,  434,  434,  434,  434,  434,  434,  434,
-      434,  514,  588,  505,  588,  423,  423,  423,  423,  423,
-      423,  266,  175,  425,  425,  425,  425,  425,  425,  425,
-      425,  425,  425,  426,  634,  175,  536,  427,  427,  427,
-      427,  427,  494,   85,  175,  407,  426,  266,  175,  477,
-      477,  477,  477,  477,  477,  370,  497,  514,  589,  426,
-      589,  427,  427,  427,  427,  427,  427,  175,  431,  432,
-
-      433,  431,  431,  431,  431,  431,  431,  431,  497,  535,
-      497,  498,  434,  434,  434,  434,  434,  480,  480,  480,
-      480,  480,  480,  480,  480,  480,  480,  495,  581,  534,
-      533,  581,  175,  530,   81,  470,  434,  434,  434,  434,
-      434,  434,  634,  426,  427,  427,  427,  427,  427,  427,
-      427,  427,  427,  427,  449,  450,  451,  452,  449,  449,
-      449,  449,  449,  449,  501,  501,  501,  501,  501,  501,
-      501,  501,  501,  501,  502,  502,  502,  502,  502,  503,
-      504,  504,  504,  504,  563,  563,  563,  563,  563,  564,
-       81,  407,  407,  458,  458,  458,  458,  458,  458,  458,
-
-      458,  458,  458,  409,  560,  470,  470,  457,  457,  457,
-      457,  457,  469,  469,  469,  469,  469,  469,  469,  469,
-      469,  469,  470,  409,  471,  471,  471,  471,  471,  471,
-      505,  457,  457,  457,  457,  457,  457,  407,  505,  459,
-      459,  459,  459,  459,  459,  459,  459,  459,  459,  460,
-      497,  355,   81,  461,  461,  461,  461,  461,  407,  634,
-      512,  512,  512,  512,  512,  512,  493,  492,   81,  487,
-      460,  560,  497,  486,  497,  497,  485,  461,  461,  461,
-      461,  461,  461,  465,  466,  467,  465,  465,  465,  465,
-      465,  465,  465,  468,  484,  483,  470,  469,  469,  469,
-
-      469,  469,  516,  516,  516,  516,  516,  516,  516,  516,
-      516,  516,  470,  355,  264,  444,  266,  175,  443,  441,
-      440,  469,  469,  469,  469,  469,  469,  634,  426,  461,
-      461,  461,  461,  461,  461,  461,  461,  461,  461,  470,
-      439,  473,  473,  473,  473,  473,  474,  471,  471,  471,
-      471,  266,  175,  477,  477,  477,  477,  477,  477,  477,
-      477,  477,  477,  426,  438,  437,  436,  476,  476,  476,
-      476,  476,  524,  525,  526,  524,  524,  524,  524,  524,
-      524,  524,  266,  175,  529,  529,  529,  529,  529,  529,
-      435,  476,  476,  476,  476,  476,  476,  266,  175,  478,
-
-      478,  478,  478,  478,  478,  478,  478,  478,  478,  361,
-      361,  361,  407,  479,  479,  479,  479,  479,  543,  355,
-      544,  545,  546,  543,  560,  544,  545,  546,  505,  264,
-      506,  506,  506,  506,  506,  506,  219,  479,  479,  479,
-      479,  479,  479,  634,  395,  479,  479,  479,  479,  479,
-      479,  479,  479,  479,  479,  499,  175,  500,  500,  500,
-      500,  500,  500,  500,  500,  500,  500,  426,  547,  394,
-       81,   81,   81,  549,  553,  554,  555,  553,  553,  553,
-      553,  553,  553,  553,   81,  388,  387,  634,  382,  634,
-      634,  634,  381,   81,  505,  380,  508,  508,  508,  508,
-
-      508,  509,  506,  506,  506,  506,  407,  361,  512,  512,
-      512,  512,  512,  512,  512,  512,  512,  512,  460,  361,
-      355,  264,  511,  511,  511,  511,  511,  523,  523,  523,
-      523,  523,  523,  523,  523,  523,  523,  547,  543,  219,
-      544,  545,  546,  219,  295,  344,  511,  511,  511,  511,
-      511,  511,  407,  343,  513,  513,  513,  513,  513,  513,
-      513,  513,  513,  513,  514,  337,  336,  335,  515,  515,
-      515,  515,  515,  407,  334,  558,  558,  558,  558,  558,
-      558,  333,  332,  331,  330,  514,  329,  311,  547,  264,
-      219,  307,  515,  515,  515,  515,  515,  515,  519,  520,
-
-      521,  519,  519,  519,  519,  519,  519,  519,  522,  219,
-      105,  295,  523,  523,  523,  523,  523,  562,  562,  562,
-      562,  562,  562,  562,  562,  562,  562,  634,  297,  544,
-      545,  546,  295,  296,  295,  289,  523,  523,  523,  523,
-      523,  523,  634,  288,  515,  515,  515,  515,  515,  515,
-      515,  515,  515,  515,  266,  175,  529,  529,  529,  529,
-      529,  529,  529,  529,  529,  529,  287,  286,  285,  284,
-      528,  528,  528,  528,  528,  283,  634,  547,  634,  634,
-      546,  634,  280,  634,  634,  634,  598,  598,  598,  598,
-      598,  599,   99,  219,  528,  528,  528,  528,  528,  528,
-
-      550,  551,  552,  550,  550,  550,  550,  550,  550,  550,
-      542,  542,  264,  219,  542,  548,  548,  105,  587,  548,
-      588,  588,  588,  588,  588,  588,  547,   85,  542,  542,
-      542,  549,  207,  548,  548,  548,   81,  407,  252,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  514,
-      249,  248,  247,  557,  557,  557,  557,  557,  568,  568,
-      568,  568,  568,  568,  568,  568,  568,  568,  175,  569,
-      569,  569,  569,  569,  569,  246,  245,  557,  557,  557,
-      557,  557,  557,  407,  240,  559,  559,  559,  559,  559,
-      559,  559,  559,  559,  559,  560,  239,  238,  237,  561,
-
-      561,  561,  561,  561,  407,  236,  594,  594,  594,  594,
-      594,  594,  235,  234,  233,  407,  560,  612,  612,  612,
-      612,  612,  612,  561,  561,  561,  561,  561,  561,  565,
-      566,  567,  565,  565,  565,  565,  565,  565,  565,  232,
-      231,  230,  229,  568,  568,  568,  568,  568,  597,  597,
-      597,  597,  597,  597,  597,  597,  597,  597,  105,  582,
-       97,  583,  583,  583,  583,  583,  583,  568,  568,  568,
-      568,  568,  568,  634,   85,  561,  561,  561,  561,  561,
-      561,  561,  561,  561,  561,  175,  571,  571,  571,  571,
-      571,  572,  569,  569,  569,  569,  582,   81,  583,  583,
-
-      583,  583,  583,  583,  583,  583,  583,  583,  582,   85,
-      584,  584,  584,  584,  584,  584,  584,  584,  584,  584,
-      582,  207,  585,  585,  585,  585,  585,  586,  583,  583,
-      583,  583,  587,  156,  590,  590,  590,  590,  590,  591,
-      588,  588,  588,  588,  407,  157,  594,  594,  594,  594,
-      594,  594,  594,  594,  594,  594,  560,  151,  151,  143,
-      593,  593,  593,  593,  593,  581,  581,  581,  581,  581,
-      581,  581,  581,  581,  581,  623,  623,  623,  623,  623,
-      623,  205,  137,  137,  593,  593,  593,  593,  593,  593,
-      407,  198,  595,  595,  595,  595,  595,  595,  595,  595,
-
-      595,  595,  197,  196,  195,  194,  596,  596,  596,  596,
-      596,  581,  581,  581,  581,  581,  581,  581,  581,  581,
-      581,  191,  190,  189,  188,  187,  182,  181,  180,  179,
-      596,  596,  596,  596,  596,  596,   80,  105,  604,  605,
-      606,  604,  604,  604,  604,  604,  604,  604,  582,   80,
-      583,  583,  583,  583,  583,  583,  583,  583,  583,  583,
-      582,  105,  583,  583,  583,  583,  583,  583,  583,  583,
-      583,  583,  607,  608,  609,  607,  607,  607,  607,  607,
-      607,  607,  407,  168,  612,  612,  612,  612,  612,  612,
-      612,  612,  612,  612,  618,   93,  619,  619,  619,  619,
-
-      619,  619,  619,  619,  619,  619,  618,  164,  620,  620,
-      620,  620,  620,  620,  620,  620,  620,  620,  618,   85,
-      621,  621,  621,  621,  621,  622,  619,  619,  619,  619,
-      623,  623,  623,  623,  623,  623,  623,  623,  623,  623,
-      624,  624,  624,  624,  624,  624,  624,  624,  624,  624,
-      625,  625,  625,  625,  625,  626,  623,  623,  623,  623,
-       80,   83,  628,  629,  630,  628,  628,  628,  628,  628,
-      628,  628,  618,   82,  619,  619,  619,  619,  619,  619,
-      619,  619,  619,  619,  618,   81,  619,  619,  619,  619,
-      619,  619,  619,  619,  619,  619,  618,  157,  619,  619,
-
-      619,  619,  619,  619,  623,  623,  623,  623,  623,  623,
-      623,  623,  623,  623,  623,  623,  623,  623,  623,  623,
-      623,  623,  623,  623,  631,  631,  631,  631,  631,  631,
-      151,  143,  113,  111,   81,  631,  631,  631,  631,  631,
-      631,  631,  631,  631,  631,  137,  136,  133,  131,  117,
-      116,  115,  112,  107,  105,   93,   83,   82,   81,  634,
-       81,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,   81,  628,  628,  628,  628,  628,  628,  628,  628,
-      628,  628,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-
-      634,  634,  634,  634,  634,  634,  634,  634,   81,  632,
-      632,  632,  632,  632,  633,  631,  631,  631,  631,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,   81,  631,  631,  631,  631,
-      631,  631,  631,  631,  631,  631,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,   81,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-
-       59,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   68,
-       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
-       68,   68,   68,   68,   68,   68,   68,   75,   75,   75,
-       75,   75,   75,   75,   75,   75,   75,   75,   75,   75,
-       75,   75,   75,   75,   75,   80,  634,  634,  634,  634,
-      634,  634,  634,   80,   80,   80,   80,  634,  634,   80,
-       80,   80,   80,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   88,  634,  634,  634,  634,   88,  634,  634,   88,
-
-       88,   88,   88,   88,  634,   88,   88,   88,   88,   92,
-      634,  634,  634,  634,  634,  634,  634,   92,   92,   92,
-       92,  634,  634,   92,   92,   92,   92,   94,  634,  634,
-       94,   94,  634,   94,  634,   94,   94,   94,   94,  634,
-      634,   94,   94,   94,   94,  104,  104,  634,  104,  634,
-      634,  104,  138,  634,  634,  138,  138,  634,  138,  634,
-      138,  138,  138,  138,  634,  634,  138,  138,  138,  138,
-      142,  634,  634,  142,  142,  634,  142,  634,  142,  142,
-      142,  142,  634,  142,  142,  634,  142,  142,  150,  634,
-      634,  150,  634,  634,  150,  634,  150,  150,  150,  150,
-
-      150,  634,  150,  150,  150,  150,  154,  154,  154,  154,
-      154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
-      154,  154,  154,  154,  156,  156,  634,  156,  634,  156,
-      156,  156,  156,  156,  156,  156,  156,  156,  156,  156,
-      156,  156,  162,  162,  162,  162,  162,  162,  162,  162,
-      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
-      163,  163,  634,  163,  163,  163,  163,  163,  163,  163,
-      163,  163,  163,  163,  163,  163,  163,  163,  166,  634,
-      634,  634,  634,  166,  634,  634,  166,  166,  166,  166,
-      634,  634,  166,  166,  166,  166,   95,  634,  634,   95,
-
-       95,  634,   95,  634,   95,   95,   95,   95,  634,  634,
-       95,   95,   95,   95,  174,  174,  634,  174,  634,  634,
-      174,  176,  176,  176,  634,  176,  634,  634,  176,  139,
-      634,  634,  139,  139,  634,  139,  634,  139,  139,  139,
-      139,  634,  634,  139,  139,  139,  139,  208,  208,  208,
+       16,   17,   18,   19,   20,   21,   22,   23,   24,   16,
+       25,   26,   16,   16,   27,   28,   29,   30,   28,   28,
+       28,   28,   28,   28,   28,   31,   32,   33,   16,   34,
+       35,   35,   35,   36,   37,   37,   37,   37,   38,   37,
+       39,   37,   40,   41,   42,   43,   37,   37,   37,   37,
+       37,   44,   16,   45,   45,   45,   45,   45,   45,   16,
+       16,   16,   16,   16,   16,   16,   16,   46,   16,   16,
+       47,  532,   54,  130,   48,  135,   55,  127,  131,  127,
+       54,  127,   56,  534,   55,   57,   78,   18,   79,   80,
+       56,  109,  129,   57,  133,   17,   62,   63,  150,   64,
+
+       49,   50,  149,  152,   51,   64,  168,  139,  134,   58,
+      101,  110,   52,   59,   37,   53,   37,   58,  154,   64,
+       65,   59,   37,  105,   37,   17,   62,   63,  155,   64,
+      796,   78,   18,   79,   80,   64,   81,  111,   60,  175,
+      139,  172,  101,  115,  115,   66,   60,  115,  115,   64,
+       65,  140,  142,  178,   17,   18,   19,   71,   67,  173,
+      141,  168,  139,   72,   73,   74,  171,  115,  122,  122,
+      122,  122,  122,  123,  179,   66,   17,   18,   19,   75,
+       67,   81,  143,  144,  171,  242,  145,  101,  101,  180,
+      181,  116,  176,  236,  146,  198,  140,  147,   17,   18,
+
+       19,   71,   67,  177,   76,  161,  201,   72,   73,   74,
+      121,  121,  121,  121,  121,  121,  121,  121,  121,  121,
+      101,  796,  177,   75,  179,  249,   68,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   17,   18,   19,   76,   67,
+      194,  194,  194,  194,  194,  194,  194,  194,  194,  194,
+      195,  195,  195,  195,  195,  196,  206,  100,  119,  100,
+      100,  100,  177,  100,  100,  207,  101,  100,  107,  107,
+      107,  107,  107,  107,  107,  107,  107,  107,  101,  243,
+      235,  100,  100,  100,  101,   68,   69,   69,   69,   69,
+
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   33,   17,   18,   19,   33,   33,
+       82,   23,   24,   33,   83,   26,   33,   33,   84,   85,
+       86,   87,   85,   85,   85,   85,   85,   85,   85,   31,
+       88,   33,   33,   89,   90,   90,   90,   91,   92,   92,
+       92,   92,   93,   92,   94,   92,   95,   92,   96,   92,
+       92,   92,   92,   92,   92,   68,   33,   97,   97,   97,
+       97,   97,   97,   98,   98,   98,   98,   98,   98,   98,
+       98,   99,   98,   98,  105,  218,  101,  796,  109,  168,
+      139,  269,  247,  178,  106,  796,  220,  107,  107,  107,
+
+      107,  107,  107,  107,  107,  107,  107,  117,  183,  118,
+      118,  118,  118,  118,  118,  118,  118,  118,  118,  119,
+      101,  180,  181,  120,  120,  120,  120,  120,  101,  101,
+      357,  159,  159,  246,  184,  159,  159,  216,  216,  216,
+      216,  216,  216,  177,  245,  101,  154,  120,  120,  120,
+      120,  120,  120,  100,  358,  159,  155,  127,  101,  100,
+      313,  563,  100,  100,  101,  100,  100,  100,  126,  126,
+      126,  126,  126,  126,  126,  126,  126,  126,  119,  160,
+      311,  100,  126,  126,  126,  126,  126,  127,  127,  127,
+      127,  128,  127,  127,  127,  127,  127,  127,  127,  127,
+
+      127,  127,  127,  127,  101,  127,  120,  120,  120,  120,
+      120,  120,  100,  100,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  127,  127,  127,  127,  127,  127,  127,
+      127,  127,  127,  813,  218,  796,  105,  127,  127,  127,
+      127,  127,  101,  100,  101,  282,  127,  107,  107,  107,
+      107,  107,  107,  107,  107,  107,  107,  101,  304,  311,
+      372,  100,  100,  100,  100,  100,  100,  138,  139,  100,
+      100,  100,  311,  100,  100,  101,  378,  100,  216,  216,
+      216,  216,  216,  216,  216,  216,  216,  216,  244,  310,
+      813,  100,  100,  100,  100,  101,  120,  120,  120,  120,
+
+      120,  120,  120,  120,  120,  120,  105,  164,  139,  165,
+      813,  166,  101,  109,  436,  165,  106,  166,  373,  107,
+      107,  107,  107,  107,  107,  107,  107,  107,  107,  226,
+      101,  166,  166,  813,  227,  311,  111,  218,  228,  170,
+      229,  185,  170,  170,  101,  168,  139,  185,  282,  170,
+      185,  115,  115,  185,  185,  115,  115,  166,  813,  184,
+      782,  371,  168,  139,  170,  148,  105,  187,  360,  185,
+      109,  301,  302,  361,  303,  115,  167,  101,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  101,
+      813,  314,  188,  185,  115,  101,  532,  115,  115,  116,
+
+      115,  115,  115,  115,  184,  101,  115,  115,  108,  714,
+      108,  108,  171,  101,  108,  108,  184,  435,  108,  380,
+      187,  115,  115,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  216,  108,  108,  107,  107,  107,  107,  107,
+      107,  107,  107,  107,  107,  190,  115,  187,  105,  101,
+      191,  187,  192,  192,  192,  192,  192,  192,  192,  192,
+      192,  192,  119,  187,  357,  357,  193,  193,  193,  193,
+      193,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  358,  358,
+      193,  193,  193,  193,  193,  193,  187,  187,  187,  187,
+
+      187,  187,  187,  187,  187,  187,  187,  813,  377,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  813,
+      341,  341,  341,  187,  187,  187,  187,  187,  330,  331,
+      112,  332,  112,  112,  112,  394,  112,  112,  395,  437,
+      112,  255,  255,  255,  255,  255,  255,  187,  187,  187,
+      187,  187,  187,  187,  112,  112,  112,  187,  197,  197,
+      197,  197,  197,  197,  197,  197,  197,  197,  119,  187,
+      498,  101,  197,  197,  197,  197,  197,  198,  198,  198,
+      198,  199,  198,  198,  198,  198,  198,  198,  198,  198,
+      198,  198,  198,  198,  499,  200,  193,  193,  193,  193,
+
+      193,  193,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  198,  198,  198,  198,  198,  198,  198,
+      198,  198,  198,  813,  105,  101,  443,  198,  198,  198,
+      198,  198,  260,  218,  159,  159,  198,  261,  159,  159,
+      386,  262,  513,  263,  282,  387,  369,  142,  101,  370,
+      504,  187,  187,  187,  187,  187,  187,  813,  159,  193,
+      193,  193,  193,  193,  193,  193,  193,  193,  193,  114,
+      763,  100,  100,  114,  505,  100,  100,  143,  144,  114,
+      101,  145,  160,  272,  272,  272,  272,  272,  273,  146,
+      438,  442,  147,  114,  114,  100,  212,  213,  214,  212,
+
+      212,  212,  212,  212,  212,  212,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  345,  218,  763,  158,
+      101,  100,  100,  158,  101,  100,  100,  763,  347,  158,
+      399,  444,  101,  215,  215,  215,  215,  215,  215,  215,
+      215,  215,  215,  158,  158,  100,  506,  215,  215,  215,
+      215,  215,  251,  252,  253,  251,  251,  251,  251,  251,
+      251,  251,  100,  100,  100,  100,  496,  127,  101,  813,
+      507,  215,  215,  215,  215,  215,  215,  221,  221,  221,
+      221,  221,  221,  221,  221,  221,  221,  119,  119,  498,
+      532,  221,  221,  221,  221,  221,  255,  255,  255,  255,
+
+      255,  255,  255,  255,  255,  255,  350,  350,  350,  350,
+      350,  351,  714,  499,  101,  215,  215,  215,  215,  215,
+      215,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+      127,  813,  379,  622,  127,  127,  127,  127,  127,  127,
+      182,  218,  182,  182,  101,  185,  182,  182,  101,  439,
+      182,  185,  282,  445,  185,  813,  218,  185,  185,  100,
+      100,  100,  100,  100,  100,  182,  182,  347,  218,  127,
+      127,  187,  497,  185,  185,  562,  185,  185,  185,  347,
+      185,  185,  498,  659,  185,  255,  255,  255,  255,  255,
+      255,  255,  255,  255,  255,  525,  188,  185,  185,  185,
+
+      185,  115,  345,  218,  115,  115,  499,  115,  115,  115,
+      115,  115,  127,  115,  115,  115,  565,  502,  345,  218,
+      127,  115,  345,  218,  127,  504,  500,  187,  115,  115,
+      347,  501,  101,  127,  416,  115,  115,  211,  211,  211,
+      211,  211,  211,  211,  211,  211,  211,  503,  101,  505,
+      127,  198,  190,  115,  254,  254,  254,  254,  254,  254,
+      254,  254,  254,  254,  746,  567,  584,  127,  254,  254,
+      254,  254,  254,  211,  211,  211,  211,  211,  211,  211,
+      211,  211,  211,  315,  105,  316,  316,  316,  316,  316,
+      316,  101,  254,  254,  254,  254,  254,  254,  187,  746,
+
+      101,  508,  187,  256,  256,  256,  256,  256,  256,  256,
+      256,  256,  256,  119,  187,  105,  572,  256,  256,  256,
+      256,  256,  198,  198,  198,  198,  198,  198,  198,  198,
+      198,  198,  198,  198,  198,  198,  198,  198,  198,  570,
+      200,  254,  254,  254,  254,  254,  254,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  198,  198,
+      198,  198,  198,  198,  198,  198,  198,  198,  813,  511,
+      504,  506,  198,  198,  198,  198,  198,  271,  271,  271,
+      271,  271,  271,  271,  271,  271,  271,  419,  419,  419,
+      419,  419,  420,  506,  505,  507,  187,  187,  187,  187,
+
+      187,  187,  269,  746,  270,  270,  270,  270,  270,  270,
+      270,  270,  270,  270,  159,  520,  763,  507,  159,  101,
+      521,  621,  763,  127,  159,  287,  287,  287,  287,  287,
+      287,  287,  287,  287,  287,  127,  573,  218,  159,  159,
+      101,  100,  101,  274,  274,  274,  274,  274,  274,  274,
+      274,  274,  274,  512,  624,  627,  127,  274,  274,  274,
+      274,  274,  349,  349,  349,  349,  349,  349,  349,  349,
+      349,  349,  488,  488,  488,  488,  488,  489,  101,  628,
+      633,  274,  274,  274,  274,  274,  274,  276,  277,  278,
+      278,  278,  278,  278,  278,  278,  278,  279,  649,  649,
+
+      649,  280,  280,  280,  280,  280,  381,  382,  383,  381,
+      381,  381,  381,  381,  381,  381,  446,  218,  447,  447,
+      447,  447,  447,  447,  218,  280,  280,  280,  280,  280,
+      280,  218,  283,  284,  285,  283,  283,  283,  283,  283,
+      283,  283,  286,  625,  813,  218,  287,  287,  287,  287,
+      287,  410,  411,  412,  410,  410,  410,  410,  410,  410,
+      410,  528,  528,  528,  528,  528,  529,  626,  679,  127,
+      287,  287,  287,  287,  287,  287,  288,  288,  288,  288,
+      288,  288,  288,  288,  288,  288,  119,  627,  625,  127,
+      288,  288,  288,  288,  288,  356,  356,  356,  356,  356,
+
+      356,  356,  356,  356,  356,  537,  537,  537,  537,  537,
+      538,  628,  626,  218,  274,  274,  274,  274,  274,  274,
+      127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+      813,  683,  684,  127,  127,  127,  127,  127,  127,  345,
+      218,  414,  414,  414,  414,  414,  414,  678,  659,  127,
+      399,  347,  400,  400,  400,  400,  400,  400,  100,  100,
+      100,  100,  100,  100,  315,  627,  318,  318,  318,  318,
+      318,  319,  316,  316,  316,  316,  320,  320,  320,  320,
+      320,  320,  320,  320,  320,  320,  119,  597,  101,  628,
+      320,  320,  320,  320,  320,  418,  418,  418,  418,  418,
+
+      418,  418,  418,  418,  418,  476,  746,  477,  477,  477,
+      477,  477,  477,  746,  320,  320,  320,  320,  320,  320,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      100,  100,  100,  100,  321,  321,  321,  321,  321,  425,
+      425,  425,  425,  425,  425,  425,  425,  425,  425,  554,
+      554,  554,  554,  554,  555,  345,  218,  695,  320,  320,
+      320,  320,  320,  320,  334,  335,  336,  334,  334,  334,
+      334,  334,  334,  334,  813,  218,  345,  218,  483,  483,
+      483,  483,  483,  483,  731,  127,  416,  813,  416,  487,
+      487,  487,  487,  487,  487,  487,  487,  487,  487,  534,
+
+      101,  339,  339,  340,  341,  341,  341,  341,  341,  341,
+      341,  279,  345,  218,  346,  346,  346,  346,  346,  346,
+      346,  346,  346,  346,  347,  101,  683,  684,  348,  348,
+      348,  348,  348,  631,  105,  514,  515,  516,  517,  515,
+      515,  515,  515,  515,  515,  515,  600,  600,  600,  600,
+      600,  601,  348,  348,  348,  348,  348,  348,  218,  352,
+      353,  354,  352,  352,  352,  352,  352,  352,  352,  355,
+      730,  695,  127,  356,  356,  356,  356,  356,  527,  527,
+      527,  527,  527,  527,  527,  527,  527,  527,  632,  623,
+      695,  680,  675,  218,  127,  127,  127,  356,  356,  356,
+
+      356,  356,  356,  813,  347,  348,  348,  348,  348,  348,
+      348,  348,  348,  348,  348,  384,  384,  384,  384,  384,
+      384,  384,  384,  384,  384,  695,  676,  676,  813,  384,
+      384,  384,  384,  384,  475,  475,  475,  475,  475,  475,
+      475,  475,  475,  475,  618,  618,  618,  618,  618,  619,
+      677,  677,  813,  384,  384,  384,  384,  384,  384,  385,
+      385,  385,  385,  385,  385,  385,  385,  385,  385,  703,
+      634,  694,  127,  385,  385,  385,  385,  385,  536,  536,
+      536,  536,  536,  536,  536,  536,  536,  536,  100,  100,
+      100,  100,  634,  218,  634,  634,  734,  384,  384,  384,
+
+      384,  384,  384,  399,  416,  400,  400,  400,  400,  400,
+      400,  400,  400,  400,  400,  399,  532,  401,  401,  401,
+      401,  401,  401,  401,  401,  401,  401,  399,  534,  402,
+      402,  402,  402,  402,  403,  400,  400,  400,  400,  405,
+      405,  405,  405,  405,  405,  405,  405,  405,  405,  279,
+      345,  218,  414,  414,  414,  414,  414,  414,  414,  414,
+      414,  414,  347,  634,  105,  101,  413,  413,  413,  413,
+      413,  544,  545,  546,  544,  544,  544,  544,  544,  544,
+      544,  686,  761,  107,  127,  634,  107,  634,  635,  644,
+      413,  413,  413,  413,  413,  413,  345,  218,  415,  415,
+
+      415,  415,  415,  415,  415,  415,  415,  415,  416,  345,
+      218,  101,  417,  417,  417,  417,  417,  345,  218,  813,
+      218,  416,  127,  127,  127,  762,  105,  101,  733,  485,
+      676,  485,  561,  564,  101,  566,  417,  417,  417,  417,
+      417,  417,  218,  421,  422,  423,  421,  421,  421,  421,
+      421,  421,  421,  424,  677,  684,  813,  425,  425,  425,
+      425,  425,  494,  494,  494,  494,  494,  494,  494,  494,
+      494,  494,  662,  662,  662,  662,  662,  663,  101,  105,
+      813,  425,  425,  425,  425,  425,  425,  813,  571,  417,
+      417,  417,  417,  417,  417,  417,  417,  417,  417,  446,
+
+      701,  449,  449,  449,  449,  449,  450,  447,  447,  447,
+      447,  384,  384,  384,  384,  384,  384,  384,  384,  384,
+      384,  781,  782,  781,  782,  384,  384,  384,  384,  384,
+      345,  218,  549,  549,  549,  549,  549,  549,  685,  575,
+      575,  607,  485,  608,  608,  608,  608,  608,  608,  384,
+      384,  384,  384,  384,  384,  464,  465,  466,  464,  464,
+      464,  464,  464,  464,  464,  553,  553,  553,  553,  553,
+      553,  553,  553,  553,  553,  591,  592,  593,  591,  591,
+      591,  591,  591,  591,  591,  695,  732,  700,  700,  700,
+      644,  101,  399,  532,  400,  400,  400,  400,  400,  400,
+
+      400,  400,  400,  400,  399,  597,  400,  400,  400,  400,
+      400,  400,  400,  400,  400,  400,  471,  472,  473,  471,
+      471,  471,  471,  471,  471,  471,  474,  728,  101,  728,
+      475,  475,  475,  475,  475,  543,  543,  543,  543,  543,
+      543,  543,  543,  543,  543,  127,  211,  741,  786,  211,
+      218,  729,  218,  729,  475,  475,  475,  475,  475,  475,
+      476,  416,  479,  479,  479,  479,  479,  480,  477,  477,
+      477,  477,  345,  218,  483,  483,  483,  483,  483,  483,
+      483,  483,  483,  483,  416,  101,  101,  218,  482,  482,
+      482,  482,  482,  532,  813,  595,  595,  595,  595,  595,
+
+      595,  169,  169,  169,  218,  534,  597,  688,  759,  689,
+      690,  691,  482,  482,  482,  482,  482,  482,  345,  218,
+      484,  484,  484,  484,  484,  484,  484,  484,  484,  484,
+      485,  316,  760,  316,  486,  486,  486,  486,  486,  599,
+      599,  599,  599,  599,  599,  599,  599,  599,  599,  574,
+      575,  575,  575,  575,  575,  575,  597,  692,  486,  486,
+      486,  486,  486,  486,  218,  490,  491,  492,  490,  490,
+      490,  490,  490,  490,  490,  493,  218,  345,  218,  494,
+      494,  494,  494,  494,  345,  218,  218,  485,  218,  485,
+      813,  218,  169,  169,  169,  534,  551,  485,  532,  551,
+
+      759,  813,  551,  494,  494,  494,  494,  494,  494,  813,
+      597,  486,  486,  486,  486,  486,  486,  486,  486,  486,
+      486,  100,  650,  778,  760,  813,  317,  100,  317,  735,
+      100,  100,  735,  100,  100,  100,  127,  127,  127,  127,
+      127,  127,  127,  127,  127,  127,  702,  779,  650,  100,
+      127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+      127,  127,  127,  127,  495,  127,  127,  127,  127,  127,
+      127,  127,  101,  127,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
+      100,  525,  526,  526,  526,  526,  526,  526,  526,  526,
+
+      526,  526,  345,  218,  614,  614,  614,  614,  614,  614,
+      447,  650,  447,  532,  551,  617,  617,  617,  617,  617,
+      617,  617,  617,  617,  617,  659,  576,  576,  101,  532,
+      813,  533,  533,  533,  533,  533,  533,  533,  533,  533,
+      533,  534,  659,  695,  813,  535,  535,  535,  535,  535,
+      636,  637,  638,  639,  636,  636,  636,  636,  636,  636,
+      345,  218,  674,  674,  674,  674,  674,  674,  813,  535,
+      535,  535,  535,  535,  535,  539,  540,  541,  539,  539,
+      539,  539,  539,  539,  539,  542,  778,  695,  739,  543,
+      543,  543,  543,  543,  646,  646,  646,  646,  646,  646,
+
+      646,  646,  646,  646,  448,  477,  448,  477,  345,  218,
+      779,  575,  575,  543,  543,  543,  543,  543,  543,  813,
+      551,  535,  535,  535,  535,  535,  535,  535,  535,  535,
+      535,  345,  218,  549,  549,  549,  549,  549,  549,  549,
+      549,  549,  549,  485,  728,  681,  813,  548,  548,  548,
+      548,  548,  647,  647,  647,  647,  647,  648,  649,  649,
+      649,  649,  688,  607,  689,  690,  691,  478,  729,  478,
+      813,  548,  548,  548,  548,  548,  548,  345,  218,  550,
+      550,  550,  550,  550,  550,  550,  550,  550,  550,  551,
+      127,  740,  813,  552,  552,  552,  552,  552,  606,  606,
+
+      606,  606,  606,  606,  606,  606,  606,  606,  447,  477,
+      447,  477,  694,  608,  607,  608,  813,  552,  552,  552,
+      552,  552,  552,  218,  556,  557,  558,  556,  556,  556,
+      556,  556,  556,  556,  607,  609,  768,  609,  559,  559,
+      559,  559,  559,  532,  534,  657,  657,  657,  657,  657,
+      657,  651,  650,  651,  650,  597,  651,  651,  651,  651,
+      651,  651,  559,  559,  559,  559,  559,  559,  813,  532,
+      552,  552,  552,  552,  552,  552,  552,  552,  552,  552,
+      100,  659,  652,  608,  652,  608,  100,  687,  687,  100,
+      100,  687,  100,  100,  100,  127,  127,  127,  127,  127,
+
+      127,  127,  127,  127,  127,  687,  687,  687,  100,  127,
+      127,  127,  127,  127,  127,  127,  560,  127,  127,  127,
+      127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+      127,  101,  127,  100,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
+      574,  577,  577,  577,  577,  577,  578,  575,  575,  575,
+      575,  187,  723,  723,  532,  187,  198,  198,  198,  198,
+      198,  198,  198,  198,  198,  198,  714,  187,  724,  724,
+      198,  198,  198,  583,  198,  198,  198,  198,  198,  198,
+      198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
+
+      198,  198,  650,  200,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  586,  587,  588,  589,  586,  586,  586,  586,  586,
+      586,  661,  661,  661,  661,  661,  661,  661,  661,  661,
+      661,  669,  670,  671,  669,  669,  669,  669,  669,  669,
+      669,  717,  717,  717,  717,  717,  718,  101,  525,  526,
+      526,  526,  526,  526,  526,  526,  526,  526,  526,  707,
+      708,  709,  707,  707,  707,  707,  707,  707,  707,  668,
+      668,  668,  668,  668,  668,  668,  668,  668,  668,  757,
+      757,  757,  757,  757,  758,  101,  532,  813,  595,  595,
+
+      595,  595,  595,  595,  595,  595,  595,  595,  534,  714,
+      470,  643,  594,  594,  594,  594,  594,  532,  532,  712,
+      712,  712,  712,  712,  712,  696,  697,  696,  697,  659,
+      714,  813,  218,  813,  813,  813,  594,  594,  594,  594,
+      594,  594,  532,  551,  596,  596,  596,  596,  596,  596,
+      596,  596,  596,  596,  597,  759,  642,  641,  598,  598,
+      598,  598,  598,  716,  716,  716,  716,  716,  716,  716,
+      716,  716,  716,  688,  640,  689,  690,  691,  651,  760,
+      651,  692,  598,  598,  598,  598,  598,  598,  602,  603,
+      604,  602,  602,  602,  602,  602,  602,  602,  605,  574,
+
+      574,  127,  606,  606,  606,  606,  606,  736,  737,  738,
+      736,  736,  736,  736,  736,  736,  736,  791,  791,  791,
+      791,  791,  791,  692,  574,  101,  606,  606,  606,  606,
+      606,  606,  813,  630,  598,  598,  598,  598,  598,  598,
+      598,  598,  598,  598,  607,  629,  610,  610,  610,  610,
+      610,  611,  608,  608,  608,  608,  345,  218,  614,  614,
+      614,  614,  614,  614,  614,  614,  614,  614,  551,  101,
+      218,  778,  613,  613,  613,  613,  613,  813,  607,  689,
+      690,  691,  813,  607,  813,  813,  691,  695,  470,  696,
+      696,  696,  696,  696,  696,  779,  613,  613,  613,  613,
+
+      613,  613,  345,  218,  615,  615,  615,  615,  615,  615,
+      615,  615,  615,  615,  747,  343,  747,  127,  616,  616,
+      616,  616,  616,  748,  764,  748,  764,  692,  765,  797,
+      765,  797,  692,  218,  723,  723,  723,  723,  723,  723,
+      585,  582,  616,  616,  616,  616,  616,  616,  813,  581,
+      616,  616,  616,  616,  616,  616,  616,  616,  616,  616,
+      100,  693,  580,  693,  693,  693,  100,  693,  693,  100,
+      100,  693,  100,  100,  100,  127,  127,  127,  127,  127,
+      127,  127,  127,  127,  127,  693,  693,  693,  100,  127,
+      127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+
+      127,  127,  127,  127,  127,  127,  127,  620,  127,  127,
+      127,  101,  127,  100,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,  100,  100,  100,  100,
+      625,  746,  579,  747,  747,  747,  747,  747,  747,  187,
+      798,  574,  798,  187,  198,  198,  198,  198,  198,  198,
+      198,  198,  198,  198,  626,  187,  574,  569,  198,  198,
+      198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
+      198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
+      568,  200,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  644,
+
+      476,  645,  645,  645,  645,  645,  645,  645,  645,  645,
+      645,  722,  722,  722,  722,  722,  722,  722,  722,  722,
+      722,  532,  476,  753,  753,  753,  753,  753,  753,  755,
+      476,  470,  755,  714,  343,  279,  755,  101,  650,  524,
+      653,  653,  653,  653,  653,  654,  651,  651,  651,  651,
+      532,  523,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  597,  522,  519,  518,  656,  656,  656,  656,
+      656,  756,  756,  756,  756,  756,  756,  756,  756,  756,
+      756,  532,  446,  777,  777,  777,  777,  777,  777,  446,
+      656,  656,  656,  656,  656,  656,  532,  446,  658,  658,
+
+      658,  658,  658,  658,  658,  658,  658,  658,  659,  510,
+      509,  101,  660,  660,  660,  660,  660,  735,  735,  735,
+      735,  735,  735,  735,  735,  735,  735,  763,  101,  764,
+      764,  764,  764,  764,  764,  101,  660,  660,  660,  660,
+      660,  660,  664,  665,  666,  664,  664,  664,  664,  664,
+      664,  664,  667,  101,  476,  476,  668,  668,  668,  668,
+      668,  735,  735,  735,  735,  735,  735,  735,  735,  735,
+      735,  470,  741,  343,  742,  742,  742,  742,  742,  742,
+      668,  668,  668,  668,  668,  668,  813,  279,  660,  660,
+      660,  660,  660,  660,  660,  660,  660,  660,  345,  218,
+
+      674,  674,  674,  674,  674,  674,  674,  674,  674,  674,
+      101,  279,  463,  462,  673,  673,  673,  673,  673,  772,
+      773,  774,  772,  772,  772,  772,  772,  772,  772,  796,
+      461,  797,  797,  797,  797,  797,  797,  460,  673,  673,
+      673,  673,  673,  673,  695,  459,  698,  698,  698,  698,
+      698,  699,  700,  700,  700,  700,  704,  705,  706,  704,
+      704,  704,  704,  704,  704,  704,  783,  784,  785,  783,
+      783,  783,  783,  783,  783,  783,  791,  791,  791,  791,
+      791,  791,  791,  791,  791,  791,  810,  810,  810,  810,
+      810,  810,  101,  644,  458,  645,  645,  645,  645,  645,
+
+      645,  645,  645,  645,  645,  792,  792,  792,  792,  792,
+      792,  792,  792,  792,  792,  793,  793,  793,  793,  793,
+      794,  791,  791,  791,  791,  457,  795,  456,  455,  795,
+      454,  101,  532,  795,  712,  712,  712,  712,  712,  712,
+      712,  712,  712,  712,  659,  453,  452,  451,  711,  711,
+      711,  711,  711,  786,  813,  787,  787,  787,  787,  787,
+      787,  791,  791,  791,  791,  791,  791,  791,  791,  791,
+      791,  446,  711,  711,  711,  711,  711,  711,  532,  446,
+      713,  713,  713,  713,  713,  713,  713,  713,  713,  713,
+      714,  101,  374,  441,  715,  715,  715,  715,  715,  791,
+
+      791,  791,  791,  791,  791,  791,  791,  791,  791,  440,
+      434,  433,  432,  431,  430,  429,  428,  427,  715,  715,
+      715,  715,  715,  715,  719,  720,  721,  719,  719,  719,
+      719,  719,  719,  719,  426,  408,  343,  279,  722,  722,
+      722,  722,  722,  804,  805,  806,  804,  804,  804,  804,
+      804,  804,  804,  404,  279,  125,  807,  807,  807,  807,
+      807,  807,  722,  722,  722,  722,  722,  722,  813,  398,
+      715,  715,  715,  715,  715,  715,  715,  715,  715,  715,
+      218,  725,  725,  725,  725,  725,  726,  723,  723,  723,
+      723,  741,  101,  742,  742,  742,  742,  742,  742,  742,
+
+      742,  742,  742,  741,  397,  743,  743,  743,  743,  743,
+      743,  743,  743,  743,  743,  741,  396,  744,  744,  744,
+      744,  744,  745,  742,  742,  742,  742,  746,  393,  749,
+      749,  749,  749,  749,  750,  747,  747,  747,  747,  532,
+      392,  753,  753,  753,  753,  753,  753,  753,  753,  753,
+      753,  714,  391,  390,  389,  752,  752,  752,  752,  752,
+      810,  810,  810,  810,  810,  810,  810,  810,  810,  810,
+      388,  315,  315,  315,  374,  376,  374,  375,  374,  752,
+      752,  752,  752,  752,  752,  532,  368,  754,  754,  754,
+      754,  754,  754,  754,  754,  754,  754,  367,  366,  365,
+
+      364,  755,  755,  755,  755,  755,  804,  804,  804,  804,
+      804,  804,  804,  804,  804,  804,  363,  362,  359,  119,
+      279,  343,  279,  125,  105,  755,  755,  755,  755,  755,
+      755,  763,  333,  766,  766,  766,  766,  766,  767,  764,
+      764,  764,  764,  100,  329,  769,  770,  771,  769,  769,
+      769,  769,  769,  769,  769,  741,  328,  742,  742,  742,
+      742,  742,  742,  742,  742,  742,  742,  741,  327,  742,
+      742,  742,  742,  742,  742,  742,  742,  742,  742,  532,
+      326,  777,  777,  777,  777,  777,  777,  777,  777,  777,
+      777,  786,  325,  787,  787,  787,  787,  787,  787,  787,
+
+      787,  787,  787,  786,  324,  788,  788,  788,  788,  788,
+      788,  788,  788,  788,  788,  786,  323,  789,  789,  789,
+      789,  789,  790,  787,  787,  787,  787,  796,  322,  799,
+      799,  799,  799,  799,  800,  797,  797,  797,  797,  100,
+      191,  801,  802,  803,  801,  801,  801,  801,  801,  801,
+      801,  786,  315,  787,  787,  787,  787,  787,  787,  787,
+      787,  787,  787,  786,  315,  787,  787,  787,  787,  787,
+      787,  787,  787,  787,  787,  807,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  811,  811,  811,  811,  811,
+      812,  810,  810,  810,  810,  810,  810,  810,  810,  810,
+
+      810,  810,  810,  810,  810,  250,  312,  309,  308,  307,
+      306,  101,  801,  801,  801,  801,  801,  801,  801,  801,
+      801,  801,  305,  300,  299,  298,  297,  296,  295,  294,
+      293,  292,  291,  290,  289,  125,  117,  105,  105,  267,
+      266,  265,  264,  259,  258,  257,  813,  188,  101,  808,
+      808,  808,  808,  808,  809,  807,  807,  807,  807,  250,
+      176,  177,  171,  171,  163,  248,  157,  157,  241,  240,
+      239,  238,  237,  234,  233,  232,  231,  230,  225,  224,
+      223,  222,  125,  100,  125,  101,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  190,  113,  210,  105,
+
+      103,  102,  101,  205,  204,  203,  202,  198,  177,  171,
+      163,  133,  131,  157,  156,  153,  151,  137,  136,  135,
+      132,  127,  101,   61,   61,   61,   61,   61,   61,   61,
+       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
+       61,   61,   61,   61,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   33,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+
+       77,   77,   77,   77,   77,   77,   77,  100,  125,  113,
+      103,  102,  101,  813,  100,  813,  100,  100,  100,  100,
+      813,  813,  100,  100,  100,  100,  100,  100,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  108,
+      813,  813,  813,  813,  108,  813,  108,  813,  108,  108,
+      108,  108,  108,  813,  108,  108,  108,  108,  108,  108,
+      112,  813,  813,  813,  813,  813,  813,  112,  813,  112,
+      112,  112,  112,  813,  813,  112,  112,  112,  112,  112,
+      112,  114,  813,  813,  114,  114,  813,  114,  114,  813,
+
+      114,  114,  114,  114,  813,  813,  114,  114,  114,  114,
+      114,  114,  124,  124,  813,  124,  813,  813,  813,  124,
+      158,  813,  813,  158,  158,  813,  158,  158,  813,  158,
+      158,  158,  158,  813,  813,  158,  158,  158,  158,  158,
+      158,  162,  813,  813,  162,  162,  813,  162,  162,  813,
+      162,  162,  162,  162,  813,  162,  162,  162,  813,  162,
+      162,  162,  170,  813,  813,  170,  813,  813,  170,  170,
+      813,  170,  170,  170,  170,  170,  813,  170,  170,  170,
+      170,  170,  170,  174,  174,  174,  174,  174,  174,  174,
+      174,  174,  174,  174,  174,  174,  174,  174,  174,  174,
+
+      174,  174,  174,  174,  176,  176,  813,  176,  813,  176,
+      176,  176,  176,  176,  176,  176,  176,  176,  176,  176,
+      176,  176,  176,  176,  176,  182,  813,  813,  813,  813,
+      182,  813,  182,  813,  182,  182,  182,  182,  182,  813,
+      182,  182,  182,  182,  182,  182,  186,  813,  813,  813,
+      813,  813,  813,  186,  813,  186,  186,  186,  186,  813,
+      186,  186,  186,  186,  186,  186,  186,  189,  813,  813,
+      189,  189,  813,  189,  189,  813,  189,  189,  189,  189,
+      813,  189,  189,  189,  189,  189,  189,  189,  208,  208,
       208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
-      208,  208,  208,  208,  208,  215,  215,  634,  215,  634,
-      634,  215,  221,  221,  221,  634,  221,  634,  634,  221,
-      258,  258,  634,  258,  634,  634,  258,  259,  259,  634,
-      259,  634,  634,  259,  263,  263,  634,  263,  634,  634,
-
-      263,  265,  265,  265,  634,  265,  634,  634,  265,  307,
-      307,  634,  307,  634,  634,  307,  309,  309,  634,  309,
-      634,  634,  309,  310,  310,  634,  310,  634,  634,  310,
-      312,  312,  312,  634,  312,  634,  634,  312,  316,  316,
-      316,  316,  634,  316,  634,  634,  316,  352,  352,  634,
-      352,  634,  634,  352,  353,  353,  634,  353,  634,  634,
-      353,  354,  354,  634,  354,  634,  634,  354,  366,  366,
-      366,  634,  366,  634,  634,  366,  367,  367,  367,  367,
-      634,  367,  634,  634,  367,  405,  405,  634,  405,  634,
-      634,  405,  406,  406,  634,  406,  634,  634,  406,  422,
-
-      422,  422,  634,  422,  634,  634,  422,  423,  423,  423,
-      423,  634,  423,  634,  634,  423,  453,  453,  634,  453,
-      634,  634,  453,  457,  634,  457,  457,  634,  457,  634,
-      634,  457,  475,  475,  475,  634,  475,  634,  634,  475,
-      476,  476,  476,  476,  634,  476,  634,  634,  476,  510,
-      510,  634,  510,  634,  634,  510,  511,  634,  511,  511,
-      634,  511,  634,  634,  511,  527,  527,  527,  634,  527,
-      634,  634,  527,  528,  528,  528,  634,  634,  528,  634,
-      634,  528,  537,  537,  537,  537,  537,  537,  537,  537,
-      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
-
-      542,  542,  634,  542,  542,  542,  634,  634,  542,  542,
-      542,  542,  634,  634,  542,  542,  542,  542,  548,  548,
-      634,  548,  548,  548,  634,  634,  548,  548,  548,  548,
-      634,  634,  548,  548,  548,  548,  556,  556,  634,  556,
-      634,  634,  556,  557,  634,  557,  557,  634,  557,  634,
-      634,  557,  573,  573,  634,  634,  573,  634,  634,  573,
-      592,  592,  634,  592,  634,  634,  592,  593,  634,  593,
-      593,  634,  593,  634,  634,  593,  596,  634,  634,  596,
-      634,  634,  596,  610,  610,  634,  610,  634,  634,  610,
-      611,  634,  611,  634,  634,  611,  634,  634,  611,  615,
-
-      615,  615,  615,  615,  615,  615,  615,  615,  615,  615,
-      615,  615,  615,  615,  615,  615,  615,  627,  634,  634,
-      627,  634,  634,  627,   13,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634
 
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  209,
+      209,  813,  209,  209,  209,  209,  209,  209,  209,  209,
+      209,  209,  209,  209,  209,  209,  209,  209,  209,  209,
+      115,  813,  813,  115,  115,  813,  115,  115,  813,  115,
+      115,  115,  115,  813,  813,  115,  115,  115,  115,  115,
+      115,  124,  124,  813,  124,  813,  813,  813,  124,  217,
+      217,  813,  217,  813,  813,  813,  217,  219,  219,  219,
+      813,  219,  813,  813,  813,  219,  158,  813,  813,  158,
+      158,  813,  158,  158,  813,  158,  158,  158,  158,  813,
+      813,  158,  158,  158,  158,  158,  158,  159,  813,  813,
+
+      159,  159,  813,  159,  159,  813,  159,  159,  159,  159,
+      813,  813,  159,  159,  159,  159,  159,  159,  162,  813,
+      813,  162,  162,  813,  162,  162,  813,  162,  162,  162,
+      162,  813,  162,  162,  162,  813,  162,  162,  162,  170,
+      813,  813,  170,  813,  813,  170,  170,  813,  170,  170,
+      170,  170,  170,  813,  170,  170,  170,  170,  170,  170,
+      185,  813,  813,  813,  813,  813,  813,  185,  813,  185,
+      185,  185,  185,  813,  813,  185,  185,  185,  185,  185,
+      185,  186,  813,  813,  813,  813,  813,  813,  186,  813,
+      186,  186,  186,  186,  813,  186,  186,  186,  186,  186,
+
+      186,  186,  189,  813,  813,  189,  189,  813,  189,  189,
+      813,  189,  189,  189,  189,  813,  189,  189,  189,  189,
+      189,  189,  189,  200,  813,  813,  200,  200,  813,  200,
+      268,  268,  268,  268,  268,  268,  268,  268,  268,  268,
+      268,  268,  268,  268,  268,  268,  268,  268,  268,  268,
+      268,  275,  275,  813,  275,  813,  813,  813,  275,  281,
+      281,  281,  813,  281,  813,  813,  813,  281,  337,  337,
+      813,  337,  813,  813,  813,  337,  338,  338,  813,  338,
+      813,  813,  813,  338,  342,  342,  813,  342,  813,  813,
+      813,  342,  344,  344,  344,  813,  344,  813,  813,  813,
+
+      344,  200,  813,  813,  200,  200,  813,  200,  404,  404,
+      813,  404,  813,  813,  813,  404,  406,  406,  813,  406,
+      813,  813,  813,  406,  407,  407,  813,  407,  813,  813,
+      813,  407,  409,  409,  409,  813,  409,  813,  813,  813,
+      409,  413,  413,  413,  413,  813,  413,  813,  813,  813,
+      413,  467,  467,  813,  467,  813,  813,  813,  467,  468,
+      468,  813,  468,  813,  813,  813,  468,  469,  469,  813,
+      469,  813,  813,  813,  469,  481,  481,  481,  813,  481,
+      813,  813,  813,  481,  482,  482,  482,  482,  813,  482,
+      813,  813,  813,  482,  208,  208,  208,  208,  208,  208,
+
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
+      208,  208,  208,  208,  208,  530,  530,  813,  530,  813,
+      813,  813,  530,  531,  531,  813,  531,  813,  813,  813,
+      531,  547,  547,  547,  813,  547,  813,  813,  813,  547,
+      548,  548,  548,  548,  813,  548,  813,  813,  813,  548,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
+      208,  200,  813,  813,  200,  200,  813,  200,  187,  813,
+      813,  813,  187,  187,  813,  187,  187,  187,  813,  813,
+      187,  187,  590,  590,  813,  590,  813,  813,  813,  590,
+
+      594,  813,  594,  594,  813,  594,  813,  813,  813,  594,
+      612,  612,  612,  813,  612,  813,  813,  813,  612,  613,
+      613,  613,  613,  813,  613,  813,  813,  813,  613,  559,
+      559,  813,  813,  559,  813,  813,  813,  559,  208,  208,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  200,
+      813,  813,  200,  200,  813,  200,  187,  813,  813,  813,
+      187,  187,  813,  187,  187,  187,  813,  813,  187,  187,
+      655,  655,  813,  655,  813,  813,  813,  655,  656,  813,
+      656,  656,  813,  656,  813,  813,  813,  656,  672,  672,
+
+      672,  813,  672,  813,  813,  813,  672,  673,  673,  673,
+      813,  813,  673,  813,  813,  813,  673,  682,  682,  682,
+      682,  682,  682,  682,  682,  682,  682,  682,  682,  682,
+      682,  682,  682,  682,  682,  682,  682,  682,  687,  687,
+      813,  687,  687,  687,  813,  687,  813,  687,  687,  687,
+      687,  813,  813,  687,  687,  687,  687,  687,  687,  693,
+      693,  813,  693,  693,  693,  813,  693,  813,  693,  693,
+      693,  693,  813,  813,  693,  693,  693,  693,  693,  693,
+      200,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  200,  200,  813,  200,  200,  813,  200,  710,  710,
+
+      813,  710,  813,  813,  813,  710,  711,  813,  711,  711,
+      813,  711,  813,  813,  813,  711,  727,  727,  813,  813,
+      727,  813,  813,  813,  727,  693,  813,  813,  813,  813,
+      813,  813,  693,  813,  693,  693,  693,  693,  813,  813,
+      693,  693,  693,  693,  693,  693,  751,  751,  813,  751,
+      813,  813,  813,  751,  752,  813,  752,  752,  813,  752,
+      813,  813,  813,  752,  775,  775,  813,  775,  813,  813,
+      813,  775,  776,  813,  776,  813,  813,  776,  813,  813,
+      813,  776,  780,  780,  780,  780,  780,  780,  780,  780,
+      780,  780,  780,  780,  780,  780,  780,  780,  780,  780,
+
+      780,  780,  780,   15,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813
     } ;
 
-static yyconst short int yy_chk[3996] =
+static yyconst short int yy_chk[5675] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1044,439 +1294,623 @@ static yyconst short int yy_chk[3996] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        2,  408,    3,   36,    2,   50,    3,   47,   36,   48,
-        4,   34,    3,  408,    4,    3,   11,   11,   11,   11,
-        4,   20,   34,    4,   38,    5,    5,    5,   48,    5,
-
-        2,    2,   47,   50,    2,    5,   66,   66,   38,    3,
-      631,   20,    2,    3,    3,    2,    3,    4,   52,    5,
-        5,    4,    4,  128,    4,    6,    6,    6,   52,    6,
-      615,   12,   12,   12,   12,    6,   11,   20,    3,   74,
-       74,   70,   44,   25,   25,    5,    4,   25,   25,    6,
-        6,   44,   45,   76,    9,    9,    9,    9,    9,   72,
-       44,  144,  144,    9,    9,    9,   70,   25,   28,   28,
-       28,   28,   28,   28,   77,    6,    7,    7,    7,    9,
-        7,   12,   45,   45,   72,  128,   45,   58,  121,   79,
-       79,   25,   79,  121,   45,  105,   58,   45,   10,   10,
-
-       10,   10,   10,   76,    9,   58,  105,   10,   10,   10,
-       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
-       90,  612,   77,   10,  130,  401,    7,    7,    7,    7,
+        2,  533,    3,   38,    2,   52,    3,   49,   38,   50,
+        4,   36,    3,  533,    4,    3,   11,   11,   11,   11,
+        4,   22,   36,    4,   40,    5,    5,    5,   50,    5,
+
+        2,    2,   49,   52,    2,    5,   68,   68,   40,    3,
+      807,   22,    2,    3,    3,    2,    3,    4,   54,    5,
+        5,    4,    4,  148,    4,    6,    6,    6,   54,    6,
+      799,   12,   12,   12,   12,    6,   11,   22,    3,   76,
+       76,   72,   46,   27,   27,    5,    4,   27,   27,    6,
+        6,   46,   47,   78,    9,    9,    9,    9,    9,   74,
+       46,  164,  164,    9,    9,    9,   72,   27,   30,   30,
+       30,   30,   30,   30,   79,    6,    7,    7,    7,    9,
+        7,   12,   47,   47,   74,  148,   47,   60,  141,   81,
+       81,   27,   81,  141,   47,   91,   60,   47,   10,   10,
+
+       10,   10,   10,   78,    9,   60,   91,   10,   10,   10,
+       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
+      161,  798,   79,   10,  179,  161,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
         7,    7,    7,    7,    7,    8,    8,    8,   10,    8,
-       81,  129,   81,   81,   81,  134,   81,   81,  141,  120,
-       81,  120,  401,  141,  129,  134,   90,   55,   55,  130,
-       88,   55,   55,  158,   81,   81,   81,   86,   86,   86,
-       86,   86,   86,   86,   86,   86,   86,  133,  118,  118,
-       88,   55,  203,  133,  203,    8,    8,    8,    8,    8,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       87,   87,   87,   87,   87,   87,   99,  101,  274,  101,
+      101,  101,  179,  101,  101,   99,  149,  101,  106,  106,
+      106,  106,  106,  106,  106,  106,  106,  106,  140,  149,
+      140,  101,  101,  101,  274,    8,    8,    8,    8,    8,
 
         8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
-        8,    8,    8,    8,   19,   55,   88,  103,  103,  103,
-      103,  103,  103,  158,   19,  148,  148,   19,   19,   19,
-       19,   19,   19,   19,   19,   19,   19,   26,  118,   26,
-       26,   26,   26,   26,   26,   26,   26,   26,   26,   26,
-      131,  610,  132,   26,   26,   26,   26,   26,  112,  193,
-       64,   64,   64,  112,   64,  132,  131,  112,   64,  112,
-       64,  160,  160,  193,  206,   26,  176,   26,   26,   26,
-       26,   26,   26,   32,   64,   64,  200,  176,  206,   32,
-      596,  200,   32,   32,  204,   32,   32,   32,   32,   32,
-
-       32,   32,   32,   32,   32,   32,   32,   32,   32,  204,
-       64,   32,   32,   32,   32,   32,   32,   32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
-       32,   32,   32,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,  210,  199,  229,   35,   35,   35,
-       35,   35,  159,  166,  251,  251,   35,   87,   87,   87,
-       87,   87,   87,   87,   87,   87,   87,  595,  155,  155,
-      229,   35,   35,   35,   35,   35,   35,   42,   42,   42,
-
-       42,   42,  210,   42,   42,  478,  478,   42,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  199,  166,
-      159,   42,   42,   42,   43,  202,   43,   43,   43,   43,
-       43,   43,   43,   43,   43,   43,   46,   91,  155,   91,
-       91,  242,  202,   91,   91,  593,   46,   91,  221,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,  221,
-      231,  214,   91,   91,   93,  231,   93,   93,   93,  242,
-       93,   93,  244,  243,   93,   94,   94,  253,  244,   94,
-       94,  303,  151,  250,  592,  151,  151,  214,   93,   93,
-       93,  590,  151,  253,  254,   46,   65,  138,  138,   94,
-
-      254,  138,  138,  218,  218,  218,   65,  151,  243,   65,
-       65,   65,   65,   65,   65,   65,   65,   65,   65,  303,
-      265,  138,   96,   94,   96,   96,   96,  347,   96,   96,
-      122,  265,   96,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  250,  347,  138,   96,   96,   96,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,  168,
-      122,  122,  293,  168,  122,  192,  192,  345,  192,  168,
-      267,  267,  122,  589,  278,  122,  171,  171,  171,  171,
-      171,  171,  267,  168,  168,   97,   98,   98,   98,   98,
-       98,   98,   98,   98,   98,   98,  293,  252,  278,  192,
-
-       98,   98,   98,   98,   98,  136,  136,  136,  136,  136,
-      136,  136,  136,  136,  136,  213,  213,  213,  213,  290,
-      299,  345,  588,  252,   98,   98,   98,   98,   98,   98,
-      106,  106,  106,  106,  106,  106,  106,  106,  106,  106,
-      106,  252,  299,  332,  106,  106,  106,  106,  106,  342,
-      140,  290,  140,  140,  140,  645,  140,  140,  645,  342,
-      140,  225,  225,  225,  225,  225,  225,  332,  106,  106,
-      106,  106,  106,  106,  140,  140,  140,  147,  147,  147,
-      147,  147,  147,  147,  147,  147,  147,  164,  164,  164,
-      164,  164,  164,  164,  164,  164,  164,  165,  165,  165,
-
-      165,  165,  165,  165,  165,  165,  165,  167,  577,  167,
-      167,  294,  393,  167,  167,  292,  294,  167,  170,  170,
-      170,  170,  170,  170,  170,  170,  170,  170,  336,  393,
-      301,  167,  167,  167,  169,  301,  169,  169,  169,  169,
-      169,  169,  169,  169,  169,  169,  205,  292,  333,  573,
-      205,  241,  336,  333,  241,  396,  205,  222,  222,  222,
-      222,  222,  222,  222,  222,  222,  222,  446,  571,  446,
-      205,  205,  169,  172,  570,  172,  172,  172,  172,  172,
-      172,  172,  172,  172,  172,  241,  298,  337,  383,  172,
-      172,  172,  172,  172,  224,  224,  224,  224,  224,  224,
-
-      224,  224,  224,  224,  275,  275,  275,  275,  275,  275,
-      396,  337,  383,  172,  172,  172,  172,  172,  172,  175,
-      175,  175,  175,  175,  175,  175,  175,  175,  175,  175,
-      389,  391,  398,  175,  175,  175,  175,  175,  266,  266,
-      266,  266,  266,  266,  266,  266,  266,  266,  398,  404,
-      404,  404,  404,  298,  389,  391,  569,  175,  175,  175,
-      175,  175,  175,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  440,  399,  441,  177,  177,
-      177,  177,  177,  268,  268,  268,  268,  268,  268,  268,
-      268,  268,  268,  399,  452,  452,  452,  291,  675,  440,
-
-      675,  441,  177,  177,  177,  177,  177,  177,  178,  178,
-      178,  178,  178,  178,  178,  178,  178,  178,  269,  269,
-      479,  479,  178,  178,  178,  178,  178,  291,  300,  312,
-      269,  272,  272,  272,  272,  272,  272,  272,  272,  300,
-      312,  494,  494,  272,  529,  529,  178,  178,  178,  178,
-      178,  178,  209,  209,  209,  209,  209,  209,  209,  209,
-      209,  209,  274,  274,  274,  274,  274,  274,  274,  274,
-      274,  274,  316,  317,  317,  306,  346,  306,  306,  306,
-      306,  306,  306,  316,  557,  317,  500,  346,  209,  217,
-      217,  217,  217,  217,  217,  217,  217,  217,  217,  217,
-
-      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,
-      223,  223,  223,  306,  318,  318,  223,  223,  223,  223,
-      223,  556,  496,  495,  500,  410,  318,  319,  319,  319,
-      319,  319,  319,  319,  319,  319,  319,  410,  496,  554,
-      223,  223,  223,  223,  223,  223,  226,  226,  226,  226,
-      226,  226,  226,  226,  226,  226,  226,  226,  320,  320,
-      484,  226,  226,  226,  226,  226,  538,  538,  458,  348,
-      320,  323,  323,  323,  323,  323,  323,  323,  323,  348,
-      458,  366,  495,  323,  484,  226,  226,  226,  226,  226,
-      226,  227,  366,  227,  227,  227,  227,  227,  227,  227,
-
-      227,  227,  227,  255,  459,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  256,  459,  256,  256,  256,
-      256,  256,  256,  256,  256,  256,  256,  257,  553,  257,
-      257,  257,  257,  257,  257,  257,  257,  257,  257,  260,
-      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,
-      270,  270,  270,  270,  270,  270,  270,  270,  270,  270,
-      270,  270,  270,  488,  490,  531,  270,  270,  270,  270,
-      270,  325,  325,  325,  325,  325,  325,  325,  325,  325,
-      325,  326,  326,  326,  326,  326,  326,  488,  490,  531,
-      270,  270,  270,  270,  270,  270,  273,  273,  273,  273,
-
-      273,  273,  273,  273,  273,  273,  273,  273,  273,  533,
-      574,  576,  273,  273,  273,  273,  273,  350,  350,  350,
-      350,  350,  350,  350,  350,  350,  350,  351,  351,  351,
-      351,  351,  351,  533,  574,  576,  273,  273,  273,  273,
-      273,  273,  276,  276,  276,  276,  276,  276,  276,  276,
-      276,  276,  276,  276,  579,  579,  600,  276,  276,  276,
-      276,  276,  355,  355,  355,  355,  355,  355,  355,  355,
-      355,  355,  358,  358,  358,  358,  358,  358,  397,  546,
-      600,  276,  276,  276,  276,  276,  276,  277,  397,  277,
-      277,  277,  277,  277,  277,  277,  277,  277,  277,  302,
-
-      302,  302,  302,  302,  302,  302,  302,  302,  302,  357,
-      357,  357,  357,  357,  357,  357,  357,  357,  357,  361,
-      361,  361,  361,  361,  361,  361,  361,  361,  361,  377,
-      377,  377,  377,  377,  377,  302,  304,  461,  304,  304,
-      304,  304,  304,  304,  304,  304,  304,  304,  305,  461,
-      305,  305,  305,  305,  305,  305,  305,  305,  305,  305,
-      311,  311,  311,  311,  311,  311,  311,  311,  311,  311,
-      311,  602,  541,  540,  311,  311,  311,  311,  311,  365,
-      367,  365,  365,  365,  365,  365,  365,  503,  503,  503,
-      503,  367,  537,  368,  368,  602,  603,  603,  311,  311,
-
-      311,  311,  311,  311,  315,  368,  315,  315,  315,  315,
-      315,  315,  315,  315,  315,  315,  321,  321,  321,  321,
-      321,  321,  321,  321,  321,  321,  321,  321,  321,  369,
-      369,  613,  321,  321,  321,  321,  321,  540,  536,  504,
-      512,  369,  370,  370,  370,  370,  370,  370,  370,  370,
-      370,  370,  512,  616,  616,  613,  321,  321,  321,  321,
-      321,  321,  324,  324,  324,  324,  324,  324,  324,  324,
-      324,  324,  324,  324,  324,  371,  371,  504,  324,  324,
-      324,  324,  324,  583,  619,  422,  423,  371,  374,  374,
-      374,  374,  374,  374,  374,  374,  422,  423,  648,  648,
-
-      374,  535,  324,  324,  324,  324,  324,  324,  327,  327,
-      327,  327,  327,  327,  327,  327,  327,  327,  327,  327,
-      534,  583,  619,  327,  327,  327,  327,  327,  376,  376,
-      376,  376,  376,  376,  376,  376,  376,  376,  416,  416,
-      416,  416,  416,  416,  676,  528,  676,  327,  327,  327,
-      327,  327,  327,  328,  525,  328,  328,  328,  328,  328,
-      328,  328,  328,  328,  328,  349,  349,  349,  349,  349,
-      349,  349,  349,  349,  349,  349,  407,  407,  407,  407,
-      407,  407,  407,  407,  407,  407,  409,  409,  409,  409,
-      409,  409,  409,  409,  409,  409,  433,  433,  433,  433,
-
-      433,  433,  349,  356,  513,  356,  356,  356,  356,  356,
-      356,  356,  356,  356,  356,  356,  513,  701,  701,  356,
-      356,  356,  356,  356,  413,  524,  413,  413,  413,  413,
-      413,  413,  654,  702,  702,  654,  413,  467,  467,  467,
-      467,  467,  467,  356,  356,  356,  356,  356,  356,  359,
-      359,  359,  359,  359,  359,  359,  359,  359,  359,  359,
-      685,  511,  685,  359,  359,  359,  359,  359,  415,  415,
-      415,  415,  415,  415,  415,  415,  415,  415,  686,  689,
-      686,  689,  424,  424,  690,  510,  690,  359,  359,  359,
-      359,  359,  359,  360,  424,  360,  360,  360,  360,  360,
-
-      360,  360,  360,  360,  360,  372,  372,  372,  372,  372,
-      372,  372,  372,  372,  372,  372,  372,  372,  425,  425,
-      508,  372,  372,  372,  372,  372,  693,  507,  693,  515,
-      425,  426,  426,  426,  426,  426,  426,  426,  426,  426,
-      426,  515,  705,  506,  705,  372,  372,  372,  372,  372,
-      372,  375,  375,  375,  375,  375,  375,  375,  375,  375,
-      375,  375,  375,  375,  427,  427,  492,  375,  375,  375,
-      375,  375,  445,  445,  475,  558,  427,  430,  430,  430,
-      430,  430,  430,  430,  430,  475,  447,  558,  706,  430,
-      706,  375,  375,  375,  375,  375,  375,  378,  378,  378,
-
-      378,  378,  378,  378,  378,  378,  378,  378,  447,  487,
-      447,  447,  378,  378,  378,  378,  378,  432,  432,  432,
-      432,  432,  432,  432,  432,  432,  432,  445,  704,  486,
-      485,  704,  476,  483,  447,  473,  378,  378,  378,  378,
-      378,  378,  379,  476,  379,  379,  379,  379,  379,  379,
-      379,  379,  379,  379,  400,  400,  400,  400,  400,  400,
-      400,  400,  400,  400,  450,  450,  450,  450,  450,  450,
-      450,  450,  450,  450,  451,  451,  451,  451,  451,  451,
-      451,  451,  451,  451,  521,  521,  521,  521,  521,  521,
-      400,  411,  559,  411,  411,  411,  411,  411,  411,  411,
-
-      411,  411,  411,  411,  559,  472,  471,  411,  411,  411,
-      411,  411,  460,  460,  460,  460,  460,  460,  460,  460,
-      460,  460,  474,  457,  474,  474,  474,  474,  474,  474,
-      455,  411,  411,  411,  411,  411,  411,  414,  454,  414,
-      414,  414,  414,  414,  414,  414,  414,  414,  414,  414,
-      493,  453,  448,  414,  414,  414,  414,  414,  464,  561,
-      464,  464,  464,  464,  464,  464,  444,  443,  442,  439,
-      464,  561,  493,  438,  493,  493,  437,  414,  414,  414,
-      414,  414,  414,  417,  417,  417,  417,  417,  417,  417,
-      417,  417,  417,  417,  436,  435,  420,  417,  417,  417,
-
-      417,  417,  466,  466,  466,  466,  466,  466,  466,  466,
-      466,  466,  419,  406,  405,  395,  477,  477,  394,  388,
-      387,  417,  417,  417,  417,  417,  417,  418,  477,  418,
-      418,  418,  418,  418,  418,  418,  418,  418,  418,  421,
-      386,  421,  421,  421,  421,  421,  421,  421,  421,  421,
-      421,  428,  428,  428,  428,  428,  428,  428,  428,  428,
-      428,  428,  428,  428,  385,  382,  381,  428,  428,  428,
-      428,  428,  470,  470,  470,  470,  470,  470,  470,  470,
-      470,  470,  482,  482,  482,  482,  482,  482,  482,  482,
-      380,  428,  428,  428,  428,  428,  428,  431,  431,  431,
-
-      431,  431,  431,  431,  431,  431,  431,  431,  431,  364,
-      363,  362,  594,  431,  431,  431,  431,  431,  497,  354,
-      497,  497,  497,  498,  594,  498,  498,  498,  509,  353,
-      509,  509,  509,  509,  509,  509,  352,  431,  431,  431,
-      431,  431,  431,  434,  344,  434,  434,  434,  434,  434,
-      434,  434,  434,  434,  434,  449,  527,  449,  449,  449,
-      449,  449,  449,  449,  449,  449,  449,  527,  497,  343,
-      341,  340,  339,  498,  505,  505,  505,  505,  505,  505,
-      505,  505,  505,  505,  338,  335,  334,  542,  331,  542,
-      542,  542,  330,  449,  456,  329,  456,  456,  456,  456,
-
-      456,  456,  456,  456,  456,  456,  462,  314,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  462,  462,  313,
-      310,  309,  462,  462,  462,  462,  462,  514,  514,  514,
-      514,  514,  514,  514,  514,  514,  514,  542,  543,  308,
-      543,  543,  543,  307,  297,  296,  462,  462,  462,  462,
-      462,  462,  465,  295,  465,  465,  465,  465,  465,  465,
-      465,  465,  465,  465,  465,  289,  287,  286,  465,  465,
-      465,  465,  465,  518,  285,  518,  518,  518,  518,  518,
-      518,  284,  283,  282,  281,  518,  280,  264,  543,  263,
-      262,  261,  465,  465,  465,  465,  465,  465,  468,  468,
-
-      468,  468,  468,  468,  468,  468,  468,  468,  468,  259,
-      258,  249,  468,  468,  468,  468,  468,  520,  520,  520,
-      520,  520,  520,  520,  520,  520,  520,  544,  248,  544,
-      544,  544,  247,  246,  245,  239,  468,  468,  468,  468,
-      468,  468,  469,  237,  469,  469,  469,  469,  469,  469,
-      469,  469,  469,  469,  480,  480,  480,  480,  480,  480,
-      480,  480,  480,  480,  480,  480,  236,  235,  234,  233,
-      480,  480,  480,  480,  480,  232,  545,  544,  545,  545,
-      545,  548,  230,  548,  548,  548,  567,  567,  567,  567,
-      567,  567,  228,  220,  480,  480,  480,  480,  480,  480,
-
-      499,  499,  499,  499,  499,  499,  499,  499,  499,  499,
-      547,  547,  219,  216,  547,  549,  549,  215,  591,  549,
-      591,  591,  591,  591,  591,  591,  545,  208,  547,  547,
-      547,  548,  207,  549,  549,  549,  499,  516,  201,  516,
-      516,  516,  516,  516,  516,  516,  516,  516,  516,  516,
-      198,  197,  196,  516,  516,  516,  516,  516,  560,  560,
-      560,  560,  560,  560,  560,  560,  560,  560,  572,  572,
-      572,  572,  572,  572,  572,  195,  194,  516,  516,  516,
-      516,  516,  516,  519,  191,  519,  519,  519,  519,  519,
-      519,  519,  519,  519,  519,  519,  190,  189,  188,  519,
-
-      519,  519,  519,  519,  564,  187,  564,  564,  564,  564,
-      564,  564,  186,  185,  184,  599,  564,  599,  599,  599,
-      599,  599,  599,  519,  519,  519,  519,  519,  519,  522,
-      522,  522,  522,  522,  522,  522,  522,  522,  522,  183,
-      182,  181,  180,  522,  522,  522,  522,  522,  566,  566,
-      566,  566,  566,  566,  566,  566,  566,  566,  174,  586,
-      173,  586,  586,  586,  586,  586,  586,  522,  522,  522,
-      522,  522,  522,  523,  163,  523,  523,  523,  523,  523,
-      523,  523,  523,  523,  523,  526,  526,  526,  526,  526,
-      526,  526,  526,  526,  526,  526,  550,  586,  550,  550,
-
-      550,  550,  550,  550,  550,  550,  550,  550,  551,  162,
-      551,  551,  551,  551,  551,  551,  551,  551,  551,  551,
-      552,  161,  552,  552,  552,  552,  552,  552,  552,  552,
-      552,  552,  555,  157,  555,  555,  555,  555,  555,  555,
-      555,  555,  555,  555,  562,  156,  562,  562,  562,  562,
-      562,  562,  562,  562,  562,  562,  562,  154,  150,  143,
-      562,  562,  562,  562,  562,  580,  580,  580,  580,  580,
-      580,  580,  580,  580,  580,  626,  626,  626,  626,  626,
-      626,  139,  137,  135,  562,  562,  562,  562,  562,  562,
-      565,  127,  565,  565,  565,  565,  565,  565,  565,  565,
-
-      565,  565,  126,  125,  124,  123,  565,  565,  565,  565,
-      565,  581,  581,  581,  581,  581,  581,  581,  581,  581,
-      581,  117,  116,  115,  114,  113,  111,  110,  109,  108,
-      565,  565,  565,  565,  565,  565,  582,  104,  582,  582,
-      582,  582,  582,  582,  582,  582,  582,  582,  584,  100,
-      584,  584,  584,  584,  584,  584,  584,  584,  584,  584,
-      585,   99,  585,  585,  585,  585,  585,  585,  585,  585,
-      585,  585,  587,  587,  587,  587,  587,  587,  587,  587,
-      587,  587,  597,   95,  597,  597,  597,  597,  597,  597,
-      597,  597,  597,  597,  604,   92,  604,  604,  604,  604,
-
-      604,  604,  604,  604,  604,  604,  605,   89,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  606,   84,
-      606,  606,  606,  606,  606,  606,  606,  606,  606,  606,
-      607,  607,  607,  607,  607,  607,  607,  607,  607,  607,
-      608,  608,  608,  608,  608,  608,  608,  608,  608,  608,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  609,
-      618,   83,  618,  618,  618,  618,  618,  618,  618,  618,
-      618,  618,  620,   82,  620,  620,  620,  620,  620,  620,
-      620,  620,  620,  620,  621,   80,  621,  621,  621,  621,
-      621,  621,  621,  621,  621,  621,  622,   75,  622,  622,
-
-      622,  622,  622,  622,  624,  624,  624,  624,  624,  624,
-      624,  624,  624,  624,  625,  625,  625,  625,  625,  625,
-      625,  625,  625,  625,  633,  633,  633,  633,  633,  633,
-       68,   61,   57,   56,  622,  628,  628,  628,  628,  628,
-      628,  628,  628,  628,  628,   54,   53,   51,   49,   41,
-       40,   39,   37,   33,   29,   23,   17,   15,   14,   13,
-      633,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  628,  629,  629,  629,  629,  629,  629,  629,  629,
-      629,  629,    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,  629,  630,
-      630,  630,  630,  630,  630,  630,  630,  630,  630,    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,  630,  632,  632,  632,  632,
-      632,  632,  632,  632,  632,  632,    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,  632,  635,  635,  635,  635,  635,  635,  635,
-      635,  635,  635,  635,  635,  635,  635,  635,  635,  635,
-
-      635,  636,  636,  636,  636,  636,  636,  636,  636,  636,
-      636,  636,  636,  636,  636,  636,  636,  636,  636,  637,
-      637,  637,  637,  637,  637,  637,  637,  637,  637,  637,
-      637,  637,  637,  637,  637,  637,  637,  638,  638,  638,
-      638,  638,  638,  638,  638,  638,  638,  638,  638,  638,
-      638,  638,  638,  638,  638,  639,    0,    0,    0,    0,
-        0,    0,    0,  639,  639,  639,  639,    0,    0,  639,
-      639,  639,  639,  640,  640,  640,  640,  640,  640,  640,
-      640,  640,  640,  640,  640,  640,  640,  640,  640,  640,
-      640,  641,    0,    0,    0,    0,  641,    0,    0,  641,
-
-      641,  641,  641,  641,    0,  641,  641,  641,  641,  642,
-        0,    0,    0,    0,    0,    0,    0,  642,  642,  642,
-      642,    0,    0,  642,  642,  642,  642,  643,    0,    0,
-      643,  643,    0,  643,    0,  643,  643,  643,  643,    0,
-        0,  643,  643,  643,  643,  644,  644,    0,  644,    0,
-        0,  644,  646,    0,    0,  646,  646,    0,  646,    0,
-      646,  646,  646,  646,    0,    0,  646,  646,  646,  646,
-      647,    0,    0,  647,  647,    0,  647,    0,  647,  647,
-      647,  647,    0,  647,  647,    0,  647,  647,  649,    0,
-        0,  649,    0,    0,  649,    0,  649,  649,  649,  649,
-
-      649,    0,  649,  649,  649,  649,  650,  650,  650,  650,
-      650,  650,  650,  650,  650,  650,  650,  650,  650,  650,
-      650,  650,  650,  650,  651,  651,    0,  651,    0,  651,
-      651,  651,  651,  651,  651,  651,  651,  651,  651,  651,
-      651,  651,  652,  652,  652,  652,  652,  652,  652,  652,
-      652,  652,  652,  652,  652,  652,  652,  652,  652,  652,
-      653,  653,    0,  653,  653,  653,  653,  653,  653,  653,
-      653,  653,  653,  653,  653,  653,  653,  653,  655,    0,
-        0,    0,    0,  655,    0,    0,  655,  655,  655,  655,
-        0,    0,  655,  655,  655,  655,  656,    0,    0,  656,
-
-      656,    0,  656,    0,  656,  656,  656,  656,    0,    0,
-      656,  656,  656,  656,  657,  657,    0,  657,    0,    0,
-      657,  658,  658,  658,    0,  658,    0,    0,  658,  659,
-        0,    0,  659,  659,    0,  659,    0,  659,  659,  659,
-      659,    0,    0,  659,  659,  659,  659,  660,  660,  660,
-      660,  660,  660,  660,  660,  660,  660,  660,  660,  660,
-      660,  660,  660,  660,  660,  661,  661,    0,  661,    0,
-        0,  661,  662,  662,  662,    0,  662,    0,    0,  662,
-      663,  663,    0,  663,    0,    0,  663,  664,  664,    0,
-      664,    0,    0,  664,  665,  665,    0,  665,    0,    0,
-
-      665,  666,  666,  666,    0,  666,    0,    0,  666,  667,
-      667,    0,  667,    0,    0,  667,  668,  668,    0,  668,
-        0,    0,  668,  669,  669,    0,  669,    0,    0,  669,
-      670,  670,  670,    0,  670,    0,    0,  670,  671,  671,
-      671,  671,    0,  671,    0,    0,  671,  672,  672,    0,
-      672,    0,    0,  672,  673,  673,    0,  673,    0,    0,
-      673,  674,  674,    0,  674,    0,    0,  674,  677,  677,
-      677,    0,  677,    0,    0,  677,  678,  678,  678,  678,
-        0,  678,    0,    0,  678,  679,  679,    0,  679,    0,
-        0,  679,  680,  680,    0,  680,    0,    0,  680,  681,
-
-      681,  681,    0,  681,    0,    0,  681,  682,  682,  682,
-      682,    0,  682,    0,    0,  682,  683,  683,    0,  683,
-        0,    0,  683,  684,    0,  684,  684,    0,  684,    0,
-        0,  684,  687,  687,  687,    0,  687,    0,    0,  687,
-      688,  688,  688,  688,    0,  688,    0,    0,  688,  691,
-      691,    0,  691,    0,    0,  691,  692,    0,  692,  692,
-        0,  692,    0,    0,  692,  694,  694,  694,    0,  694,
-        0,    0,  694,  695,  695,  695,    0,    0,  695,    0,
-        0,  695,  696,  696,  696,  696,  696,  696,  696,  696,
-      696,  696,  696,  696,  696,  696,  696,  696,  696,  696,
-
-      697,  697,    0,  697,  697,  697,    0,    0,  697,  697,
-      697,  697,    0,    0,  697,  697,  697,  697,  698,  698,
-        0,  698,  698,  698,    0,    0,  698,  698,  698,  698,
-        0,    0,  698,  698,  698,  698,  699,  699,    0,  699,
-        0,    0,  699,  700,    0,  700,  700,    0,  700,    0,
-        0,  700,  703,  703,    0,    0,  703,    0,    0,  703,
-      707,  707,    0,  707,    0,    0,  707,  708,    0,  708,
-      708,    0,  708,    0,    0,  708,  709,    0,    0,  709,
-        0,    0,  709,  710,  710,    0,  710,    0,    0,  710,
-      711,    0,  711,    0,    0,  711,    0,    0,  711,  712,
-
-      712,  712,  712,  712,  712,  712,  712,  712,  712,  712,
-      712,  712,  712,  712,  712,  712,  712,  713,    0,    0,
-      713,    0,    0,  713,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
-      634,  634,  634,  634,  634
-
+        8,    8,    8,    8,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   21,  125,  153,  797,   82,  168,
+      168,  270,  153,  178,   21,  784,  125,   21,   21,   21,
+
+       21,   21,   21,   21,   21,   21,   21,   28,   82,   28,
+       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
+      152,  180,  180,   28,   28,   28,   28,   28,  151,  270,
+      289,   57,   57,  152,   82,   57,   57,  123,  123,  123,
+      123,  123,  123,  178,  151,   28,  154,   28,   28,   28,
+       28,   28,   28,   34,  289,   57,  154,  500,  246,   34,
+      246,  500,   34,   34,  313,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   57,
+      313,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   37,   37,   37,   37,   37,   37,   37,
+       37,   37,   37,   37,  219,  783,  242,   37,   37,   37,
+       37,   37,  245,  150,  236,  219,   37,  107,  107,  107,
+      107,  107,  107,  107,  107,  107,  107,  247,  236,  245,
+      303,   37,   37,   37,   37,   37,   37,   44,   44,   44,
+       44,   44,  247,   44,   44,  311,  311,   44,  121,  121,
+      121,  121,  121,  121,  121,  121,  121,  121,  150,  242,
+      108,   44,   44,   44,   45,  303,   45,   45,   45,   45,
+
+       45,   45,   45,   45,   45,   45,   48,   66,   66,   66,
+      108,   66,  304,  110,  370,   66,   48,   66,  304,   48,
+       48,   48,   48,   48,   48,   48,   48,   48,   48,  132,
+      243,   66,   66,  110,  132,  243,  108,  281,  132,  171,
+      132,   83,  171,  171,  370,  138,  138,   83,  281,  171,
+       83,  114,  114,   83,   83,  114,  114,   66,  182,  110,
+      780,  302,  175,  175,  171,   48,   67,   83,  291,   83,
+      183,  235,  235,  291,  235,  114,   67,  249,  182,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,  302,
+      183,  249,   83,   83,   84,  138,  777,   84,   84,  114,
+
+       84,   84,   84,   84,  182,  235,   84,   84,  111,  775,
+      111,  111,  175,  314,  111,  111,  183,  369,  111,  314,
+       84,   84,   84,  122,  122,  122,  122,  122,  122,  122,
+      122,  122,  122,  111,  111,  156,  156,  156,  156,  156,
+      156,  156,  156,  156,  156,   84,   84,   85,  310,  369,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,  322,  357,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,  322,  357,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+
+       85,   85,   85,   85,   85,   85,   85,   88,  310,   88,
+       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+      278,  278,  278,   88,   88,   88,   88,   88,  266,  266,
+      113,  266,  113,  113,  113,  330,  113,  113,  330,  371,
+      113,  196,  196,  196,  196,  196,  196,   88,   88,   88,
+       88,   88,   88,   89,  113,  113,  113,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+      453,  371,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,  453,   89,   89,   89,   89,   89,
+
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   92,   92,   92,   92,   92,   92,   92,
+       92,   92,   92,   92,  377,  444,  378,   92,   92,   92,
+       92,   92,  203,  344,  158,  158,   92,  203,  158,  158,
+      323,  203,  444,  203,  344,  323,  301,  142,  378,  301,
+      457,   92,   92,   92,   92,   92,   92,   97,  158,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,  116,
+      766,  116,  116,  116,  457,  116,  116,  142,  142,  116,
+      301,  142,  158,  214,  214,  214,  214,  214,  214,  142,
+      372,  377,  142,  116,  116,  116,  117,  117,  117,  117,
+
+      117,  117,  117,  117,  117,  117,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  346,  346,  765,  160,
+      379,  160,  160,  160,  372,  160,  160,  764,  346,  160,
+      400,  379,  117,  118,  118,  118,  118,  118,  118,  118,
+      118,  118,  118,  160,  160,  160,  458,  118,  118,  118,
+      118,  118,  191,  191,  191,  191,  191,  191,  191,  191,
+      191,  191,  273,  273,  273,  273,  427,  427,  400,  755,
+      458,  118,  118,  118,  118,  118,  118,  126,  126,  126,
+      126,  126,  126,  126,  126,  126,  126,  126,  312,  498,
+      754,  126,  126,  126,  126,  126,  194,  194,  194,  194,
+
+      194,  194,  194,  194,  194,  194,  285,  285,  285,  285,
+      285,  285,  752,  498,  312,  126,  126,  126,  126,  126,
+      126,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+      127,  127,  312,  562,  562,  127,  127,  127,  127,  127,
+      184,  409,  184,  184,  373,  186,  184,  184,  380,  373,
+      184,  186,  409,  380,  186,  348,  348,  186,  186,  127,
+      127,  127,  127,  127,  127,  184,  184,  348,  413,  497,
+      428,  186,  428,  186,  188,  497,  188,  188,  188,  413,
+      188,  188,  429,  751,  188,  195,  195,  195,  195,  195,
+      195,  195,  195,  195,  195,  526,  186,  186,  188,  188,
+
+      188,  189,  615,  615,  189,  189,  429,  189,  189,  189,
+      189,  190,  431,  189,  189,  190,  502,  431,  414,  414,
+      502,  190,  415,  415,  429,  433,  430,  189,  189,  189,
+      414,  430,  526,  430,  415,  190,  190,  210,  210,  210,
+      210,  210,  210,  210,  210,  210,  210,  432,  508,  433,
+      432,  523,  189,  189,  192,  192,  192,  192,  192,  192,
+      192,  192,  192,  192,  749,  508,  523,  433,  192,  192,
+      192,  192,  192,  211,  211,  211,  211,  211,  211,  211,
+      211,  211,  211,  319,  511,  319,  319,  319,  319,  319,
+      319,  439,  192,  192,  192,  192,  192,  192,  197,  748,
+
+      513,  439,  197,  197,  197,  197,  197,  197,  197,  197,
+      197,  197,  197,  197,  197,  442,  513,  197,  197,  197,
+      197,  197,  197,  197,  197,  197,  197,  197,  197,  197,
+      197,  197,  197,  197,  197,  197,  197,  197,  197,  511,
+      197,  197,  197,  197,  197,  197,  197,  197,  197,  197,
+      197,  197,  197,  197,  197,  197,  197,  197,  198,  198,
+      198,  198,  198,  198,  198,  198,  198,  198,  198,  442,
+      504,  506,  198,  198,  198,  198,  198,  213,  213,  213,
+      213,  213,  213,  213,  213,  213,  213,  354,  354,  354,
+      354,  354,  354,  434,  504,  506,  198,  198,  198,  198,
+
+      198,  198,  212,  747,  212,  212,  212,  212,  212,  212,
+      212,  212,  212,  212,  248,  454,  737,  434,  248,  514,
+      454,  561,  736,  561,  248,  282,  282,  282,  282,  282,
+      282,  282,  282,  282,  282,  434,  514,  727,  248,  248,
+      212,  215,  443,  215,  215,  215,  215,  215,  215,  215,
+      215,  215,  215,  443,  564,  584,  564,  215,  215,  215,
+      215,  215,  284,  284,  284,  284,  284,  284,  284,  284,
+      284,  284,  423,  423,  423,  423,  423,  423,  571,  584,
+      571,  215,  215,  215,  215,  215,  215,  218,  218,  218,
+      218,  218,  218,  218,  218,  218,  218,  218,  589,  589,
+
+      589,  218,  218,  218,  218,  218,  315,  315,  315,  315,
+      315,  315,  315,  315,  315,  315,  450,  725,  450,  450,
+      450,  450,  450,  450,  724,  218,  218,  218,  218,  218,
+      218,  220,  220,  220,  220,  220,  220,  220,  220,  220,
+      220,  220,  220,  565,  616,  616,  220,  220,  220,  220,
+      220,  345,  345,  345,  345,  345,  345,  345,  345,  345,
+      345,  466,  466,  466,  466,  466,  466,  565,  623,  623,
+      220,  220,  220,  220,  220,  220,  221,  221,  221,  221,
+      221,  221,  221,  221,  221,  221,  221,  566,  625,  565,
+      221,  221,  221,  221,  221,  347,  347,  347,  347,  347,
+
+      347,  347,  347,  347,  347,  473,  473,  473,  473,  473,
+      473,  566,  625,  723,  221,  221,  221,  221,  221,  221,
+      222,  222,  222,  222,  222,  222,  222,  222,  222,  222,
+      222,  631,  631,  566,  222,  222,  222,  222,  222,  351,
+      351,  351,  351,  351,  351,  351,  351,  622,  711,  622,
+      403,  351,  403,  403,  403,  403,  403,  403,  222,  222,
+      222,  222,  222,  222,  253,  627,  253,  253,  253,  253,
+      253,  253,  253,  253,  253,  253,  254,  254,  254,  254,
+      254,  254,  254,  254,  254,  254,  254,  710,  403,  627,
+      254,  254,  254,  254,  254,  353,  353,  353,  353,  353,
+
+      353,  353,  353,  353,  353,  480,  708,  480,  480,  480,
+      480,  480,  480,  707,  254,  254,  254,  254,  254,  254,
+      256,  256,  256,  256,  256,  256,  256,  256,  256,  256,
+      529,  529,  529,  529,  256,  256,  256,  256,  256,  416,
+      416,  416,  416,  416,  416,  416,  416,  416,  416,  492,
+      492,  492,  492,  492,  492,  674,  674,  700,  256,  256,
+      256,  256,  256,  256,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  417,  417,  420,  420,  420,  420,
+      420,  420,  420,  420,  680,  680,  417,  535,  420,  422,
+      422,  422,  422,  422,  422,  422,  422,  422,  422,  535,
+
+      269,  277,  277,  277,  277,  277,  277,  277,  277,  277,
+      277,  277,  283,  283,  283,  283,  283,  283,  283,  283,
+      283,  283,  283,  283,  283,  445,  683,  683,  283,  283,
+      283,  283,  283,  570,  570,  445,  446,  446,  446,  446,
+      446,  446,  446,  446,  446,  446,  541,  541,  541,  541,
+      541,  541,  283,  283,  283,  283,  283,  283,  286,  286,
+      286,  286,  286,  286,  286,  286,  286,  286,  286,  286,
+      679,  698,  679,  286,  286,  286,  286,  286,  465,  465,
+      465,  465,  465,  465,  465,  465,  465,  465,  570,  563,
+      697,  624,  620,  481,  563,  620,  624,  286,  286,  286,
+
+      286,  286,  286,  287,  481,  287,  287,  287,  287,  287,
+      287,  287,  287,  287,  287,  320,  320,  320,  320,  320,
+      320,  320,  320,  320,  320,  696,  621,  640,  643,  320,
+      320,  320,  320,  320,  470,  470,  470,  470,  470,  470,
+      470,  470,  470,  470,  558,  558,  558,  558,  558,  558,
+      621,  640,  643,  320,  320,  320,  320,  320,  320,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  643,
+      630,  693,  621,  321,  321,  321,  321,  321,  472,  472,
+      472,  472,  472,  472,  472,  472,  472,  472,  648,  648,
+      648,  648,  630,  482,  630,  630,  691,  321,  321,  321,
+
+      321,  321,  321,  334,  482,  334,  334,  334,  334,  334,
+      334,  334,  334,  334,  334,  335,  595,  335,  335,  335,
+      335,  335,  335,  335,  335,  335,  335,  336,  595,  336,
+      336,  336,  336,  336,  336,  336,  336,  336,  336,  339,
+      339,  339,  339,  339,  339,  339,  339,  339,  339,  339,
+      349,  349,  349,  349,  349,  349,  349,  349,  349,  349,
+      349,  349,  349,  572,  685,  633,  349,  349,  349,  349,
+      349,  476,  476,  476,  476,  476,  476,  476,  476,  476,
+      476,  633,  731,  824,  731,  572,  824,  572,  572,  645,
+      349,  349,  349,  349,  349,  349,  352,  352,  352,  352,
+
+      352,  352,  352,  352,  352,  352,  352,  352,  352,  483,
+      483,  572,  352,  352,  352,  352,  352,  484,  484,  486,
+      486,  483,  496,  501,  503,  733,  733,  645,  685,  484,
+      676,  486,  496,  501,  686,  503,  352,  352,  352,  352,
+      352,  352,  355,  355,  355,  355,  355,  355,  355,  355,
+      355,  355,  355,  355,  676,  682,  641,  355,  355,  355,
+      355,  355,  485,  485,  485,  485,  485,  485,  485,  485,
+      485,  485,  604,  604,  604,  604,  604,  604,  512,  632,
+      641,  355,  355,  355,  355,  355,  355,  356,  512,  356,
+      356,  356,  356,  356,  356,  356,  356,  356,  356,  383,
+
+      641,  383,  383,  383,  383,  383,  383,  383,  383,  383,
+      383,  384,  384,  384,  384,  384,  384,  384,  384,  384,
+      384,  762,  762,  781,  781,  384,  384,  384,  384,  384,
+      489,  489,  489,  489,  489,  489,  489,  489,  632,  882,
+      882,  611,  489,  611,  611,  611,  611,  611,  611,  384,
+      384,  384,  384,  384,  384,  399,  399,  399,  399,  399,
+      399,  399,  399,  399,  399,  491,  491,  491,  491,  491,
+      491,  491,  491,  491,  491,  532,  532,  532,  532,  532,
+      532,  532,  532,  532,  532,  639,  681,  639,  639,  639,
+      649,  399,  401,  596,  401,  401,  401,  401,  401,  401,
+
+      401,  401,  401,  401,  402,  596,  402,  402,  402,  402,
+      402,  402,  402,  402,  402,  402,  408,  408,  408,  408,
+      408,  408,  408,  408,  408,  408,  408,  701,  649,  728,
+      408,  408,  408,  408,  408,  534,  534,  534,  534,  534,
+      534,  534,  534,  534,  534,  675,  836,  742,  787,  836,
+      547,  701,  673,  728,  408,  408,  408,  408,  408,  408,
+      412,  547,  412,  412,  412,  412,  412,  412,  412,  412,
+      412,  412,  418,  418,  418,  418,  418,  418,  418,  418,
+      418,  418,  418,  418,  418,  742,  787,  670,  418,  418,
+      418,  418,  418,  538,  598,  538,  538,  538,  538,  538,
+
+      538,  827,  827,  827,  669,  538,  598,  634,  739,  634,
+      634,  634,  418,  418,  418,  418,  418,  418,  421,  421,
+      421,  421,  421,  421,  421,  421,  421,  421,  421,  421,
+      421,  853,  739,  853,  421,  421,  421,  421,  421,  540,
+      540,  540,  540,  540,  540,  540,  540,  540,  540,  578,
+      578,  578,  578,  578,  578,  578,  656,  634,  421,  421,
+      421,  421,  421,  421,  424,  424,  424,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  548,  549,  549,  424,
+      424,  424,  424,  424,  550,  550,  612,  548,  613,  549,
+      552,  552,  844,  844,  844,  655,  550,  612,  657,  613,
+
+      759,  642,  552,  424,  424,  424,  424,  424,  424,  425,
+      657,  425,  425,  425,  425,  425,  425,  425,  425,  425,
+      425,  426,  653,  768,  759,  642,  854,  426,  854,  916,
+      426,  426,  916,  426,  426,  426,  426,  426,  426,  426,
+      426,  426,  426,  426,  426,  426,  642,  768,  652,  426,
+      426,  426,  426,  426,  426,  426,  426,  426,  426,  426,
+      426,  426,  426,  426,  426,  426,  426,  426,  426,  426,
+      426,  426,  426,  426,  426,  426,  426,  426,  426,  426,
+      426,  426,  426,  426,  426,  426,  426,  426,  426,  426,
+      426,  464,  464,  464,  464,  464,  464,  464,  464,  464,
+
+      464,  464,  555,  555,  555,  555,  555,  555,  555,  555,
+      865,  651,  865,  658,  555,  557,  557,  557,  557,  557,
+      557,  557,  557,  557,  557,  658,  883,  883,  464,  471,
+      660,  471,  471,  471,  471,  471,  471,  471,  471,  471,
+      471,  471,  660,  637,  702,  471,  471,  471,  471,  471,
+      574,  574,  574,  574,  574,  574,  574,  574,  574,  574,
+      619,  619,  619,  619,  619,  619,  619,  619,  702,  471,
+      471,  471,  471,  471,  471,  474,  474,  474,  474,  474,
+      474,  474,  474,  474,  474,  474,  778,  636,  702,  474,
+      474,  474,  474,  474,  587,  587,  587,  587,  587,  587,
+
+      587,  587,  587,  587,  866,  870,  866,  870,  614,  614,
+      778,  894,  894,  474,  474,  474,  474,  474,  474,  475,
+      614,  475,  475,  475,  475,  475,  475,  475,  475,  475,
+      475,  487,  487,  487,  487,  487,  487,  487,  487,  487,
+      487,  487,  487,  487,  678,  629,  703,  487,  487,  487,
+      487,  487,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  635,  610,  635,  635,  635,  871,  678,  871,
+      703,  487,  487,  487,  487,  487,  487,  490,  490,  490,
+      490,  490,  490,  490,  490,  490,  490,  490,  490,  490,
+      678,  703,  740,  490,  490,  490,  490,  490,  597,  597,
+
+      597,  597,  597,  597,  597,  597,  597,  597,  875,  878,
+      875,  878,  635,  888,  609,  888,  740,  490,  490,  490,
+      490,  490,  490,  493,  493,  493,  493,  493,  493,  493,
+      493,  493,  493,  493,  608,  889,  740,  889,  493,  493,
+      493,  493,  493,  601,  594,  601,  601,  601,  601,  601,
+      601,  897,  592,  897,  654,  601,  654,  654,  654,  654,
+      654,  654,  493,  493,  493,  493,  493,  493,  494,  712,
+      494,  494,  494,  494,  494,  494,  494,  494,  494,  494,
+      495,  712,  898,  901,  898,  901,  495,  692,  692,  495,
+      495,  692,  495,  495,  495,  495,  495,  495,  495,  495,
+
+      495,  495,  495,  495,  495,  692,  692,  692,  495,  495,
+      495,  495,  495,  495,  495,  495,  495,  495,  495,  495,
+      495,  495,  495,  495,  495,  495,  495,  495,  495,  495,
+      495,  495,  495,  495,  495,  495,  495,  495,  495,  495,
+      495,  495,  495,  495,  495,  495,  495,  495,  495,  495,
+      517,  517,  517,  517,  517,  517,  517,  517,  517,  517,
+      517,  522,  913,  913,  713,  522,  522,  522,  522,  522,
+      522,  522,  522,  522,  522,  522,  713,  522,  914,  914,
+      522,  522,  522,  522,  522,  522,  522,  522,  522,  522,
+      522,  522,  522,  522,  522,  522,  522,  522,  522,  522,
+
+      522,  522,  591,  522,  522,  522,  522,  522,  522,  522,
+      522,  522,  522,  522,  522,  522,  522,  522,  522,  522,
+      522,  525,  525,  525,  525,  525,  525,  525,  525,  525,
+      525,  603,  603,  603,  603,  603,  603,  603,  603,  603,
+      603,  607,  607,  607,  607,  607,  607,  607,  607,  607,
+      607,  666,  666,  666,  666,  666,  666,  525,  527,  527,
+      527,  527,  527,  527,  527,  527,  527,  527,  527,  650,
+      650,  650,  650,  650,  650,  650,  650,  650,  650,  659,
+      659,  659,  659,  659,  659,  659,  659,  659,  659,  721,
+      721,  721,  721,  721,  721,  527,  536,  715,  536,  536,
+
+      536,  536,  536,  536,  536,  536,  536,  536,  536,  715,
+      590,  582,  536,  536,  536,  536,  536,  663,  753,  663,
+      663,  663,  663,  663,  663,  907,  908,  907,  908,  663,
+      753,  687,  672,  687,  687,  687,  536,  536,  536,  536,
+      536,  536,  539,  672,  539,  539,  539,  539,  539,  539,
+      539,  539,  539,  539,  539,  730,  581,  580,  539,  539,
+      539,  539,  539,  665,  665,  665,  665,  665,  665,  665,
+      665,  665,  665,  688,  579,  688,  688,  688,  910,  730,
+      910,  687,  539,  539,  539,  539,  539,  539,  542,  542,
+      542,  542,  542,  542,  542,  542,  542,  542,  542,  577,
+
+      576,  730,  542,  542,  542,  542,  542,  695,  695,  695,
+      695,  695,  695,  695,  695,  695,  695,  794,  794,  794,
+      794,  794,  794,  688,  575,  573,  542,  542,  542,  542,
+      542,  542,  543,  569,  543,  543,  543,  543,  543,  543,
+      543,  543,  543,  543,  546,  568,  546,  546,  546,  546,
+      546,  546,  546,  546,  546,  546,  553,  553,  553,  553,
+      553,  553,  553,  553,  553,  553,  553,  553,  553,  567,
+      551,  761,  553,  553,  553,  553,  553,  689,  545,  689,
+      689,  689,  690,  544,  690,  690,  690,  699,  531,  699,
+      699,  699,  699,  699,  699,  761,  553,  553,  553,  553,
+
+      553,  553,  556,  556,  556,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  918,  530,  918,  761,  556,  556,
+      556,  556,  556,  919,  923,  919,  923,  689,  924,  929,
+      924,  929,  690,  726,  726,  726,  726,  726,  726,  726,
+      524,  521,  556,  556,  556,  556,  556,  556,  559,  520,
+      559,  559,  559,  559,  559,  559,  559,  559,  559,  559,
+      560,  694,  519,  694,  694,  694,  560,  694,  694,  560,
+      560,  694,  560,  560,  560,  560,  560,  560,  560,  560,
+      560,  560,  560,  560,  560,  694,  694,  694,  560,  560,
+      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
+
+      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
+      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
+      560,  560,  560,  560,  560,  560,  560,  560,  560,  560,
+      583,  750,  518,  750,  750,  750,  750,  750,  750,  583,
+      930,  516,  930,  583,  583,  583,  583,  583,  583,  583,
+      583,  583,  583,  583,  583,  583,  515,  510,  583,  583,
+      583,  583,  583,  583,  583,  583,  583,  583,  583,  583,
+      583,  583,  583,  583,  583,  583,  583,  583,  583,  583,
+      509,  583,  583,  583,  583,  583,  583,  583,  583,  583,
+      583,  583,  583,  583,  583,  583,  583,  583,  583,  586,
+
+      479,  586,  586,  586,  586,  586,  586,  586,  586,  586,
+      586,  714,  714,  714,  714,  714,  714,  714,  714,  714,
+      714,  718,  478,  718,  718,  718,  718,  718,  718,  922,
+      477,  469,  922,  718,  468,  467,  922,  586,  593,  463,
+      593,  593,  593,  593,  593,  593,  593,  593,  593,  593,
+      599,  456,  599,  599,  599,  599,  599,  599,  599,  599,
+      599,  599,  599,  455,  452,  451,  599,  599,  599,  599,
+      599,  720,  720,  720,  720,  720,  720,  720,  720,  720,
+      720,  758,  449,  758,  758,  758,  758,  758,  758,  448,
+      599,  599,  599,  599,  599,  599,  602,  447,  602,  602,
+
+      602,  602,  602,  602,  602,  602,  602,  602,  602,  441,
+      440,  438,  602,  602,  602,  602,  602,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  767,  437,  767,
+      767,  767,  767,  767,  767,  436,  602,  602,  602,  602,
+      602,  602,  605,  605,  605,  605,  605,  605,  605,  605,
+      605,  605,  605,  435,  411,  410,  605,  605,  605,  605,
+      605,  735,  735,  735,  735,  735,  735,  735,  735,  735,
+      735,  407,  745,  406,  745,  745,  745,  745,  745,  745,
+      605,  605,  605,  605,  605,  605,  606,  405,  606,  606,
+      606,  606,  606,  606,  606,  606,  606,  606,  617,  617,
+
+      617,  617,  617,  617,  617,  617,  617,  617,  617,  617,
+      745,  404,  398,  397,  617,  617,  617,  617,  617,  746,
+      746,  746,  746,  746,  746,  746,  746,  746,  746,  800,
+      396,  800,  800,  800,  800,  800,  800,  395,  617,  617,
+      617,  617,  617,  617,  638,  394,  638,  638,  638,  638,
+      638,  638,  638,  638,  638,  638,  644,  644,  644,  644,
+      644,  644,  644,  644,  644,  644,  763,  763,  763,  763,
+      763,  763,  763,  763,  763,  763,  772,  772,  772,  772,
+      772,  772,  772,  772,  772,  772,  812,  812,  812,  812,
+      812,  812,  644,  646,  393,  646,  646,  646,  646,  646,
+
+      646,  646,  646,  646,  646,  773,  773,  773,  773,  773,
+      773,  773,  773,  773,  773,  774,  774,  774,  774,  774,
+      774,  774,  774,  774,  774,  392,  928,  391,  390,  928,
+      389,  646,  661,  928,  661,  661,  661,  661,  661,  661,
+      661,  661,  661,  661,  661,  388,  387,  386,  661,  661,
+      661,  661,  661,  790,  385,  790,  790,  790,  790,  790,
+      790,  792,  792,  792,  792,  792,  792,  792,  792,  792,
+      792,  382,  661,  661,  661,  661,  661,  661,  664,  381,
+      664,  664,  664,  664,  664,  664,  664,  664,  664,  664,
+      664,  790,  376,  375,  664,  664,  664,  664,  664,  793,
+
+      793,  793,  793,  793,  793,  793,  793,  793,  793,  374,
+      368,  366,  365,  364,  363,  362,  361,  360,  664,  664,
+      664,  664,  664,  664,  667,  667,  667,  667,  667,  667,
+      667,  667,  667,  667,  359,  343,  342,  341,  667,  667,
+      667,  667,  667,  796,  796,  796,  796,  796,  796,  796,
+      796,  796,  796,  340,  338,  337,  809,  809,  809,  809,
+      809,  809,  667,  667,  667,  667,  667,  667,  668,  333,
+      668,  668,  668,  668,  668,  668,  668,  668,  668,  668,
+      671,  671,  671,  671,  671,  671,  671,  671,  671,  671,
+      671,  704,  809,  704,  704,  704,  704,  704,  704,  704,
+
+      704,  704,  704,  705,  332,  705,  705,  705,  705,  705,
+      705,  705,  705,  705,  705,  706,  331,  706,  706,  706,
+      706,  706,  706,  706,  706,  706,  706,  709,  329,  709,
+      709,  709,  709,  709,  709,  709,  709,  709,  709,  716,
+      328,  716,  716,  716,  716,  716,  716,  716,  716,  716,
+      716,  716,  327,  326,  325,  716,  716,  716,  716,  716,
+      804,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      324,  318,  317,  316,  309,  308,  307,  306,  305,  716,
+      716,  716,  716,  716,  716,  719,  299,  719,  719,  719,
+      719,  719,  719,  719,  719,  719,  719,  297,  296,  295,
+
+      294,  719,  719,  719,  719,  719,  805,  805,  805,  805,
+      805,  805,  805,  805,  805,  805,  293,  292,  290,  288,
+      280,  279,  276,  275,  268,  719,  719,  719,  719,  719,
+      719,  738,  267,  738,  738,  738,  738,  738,  738,  738,
+      738,  738,  738,  741,  265,  741,  741,  741,  741,  741,
+      741,  741,  741,  741,  741,  743,  264,  743,  743,  743,
+      743,  743,  743,  743,  743,  743,  743,  744,  263,  744,
+      744,  744,  744,  744,  744,  744,  744,  744,  744,  756,
+      262,  756,  756,  756,  756,  756,  756,  756,  756,  756,
+      756,  769,  261,  769,  769,  769,  769,  769,  769,  769,
+
+      769,  769,  769,  770,  260,  770,  770,  770,  770,  770,
+      770,  770,  770,  770,  770,  771,  259,  771,  771,  771,
+      771,  771,  771,  771,  771,  771,  771,  785,  258,  785,
+      785,  785,  785,  785,  785,  785,  785,  785,  785,  786,
+      255,  786,  786,  786,  786,  786,  786,  786,  786,  786,
+      786,  788,  252,  788,  788,  788,  788,  788,  788,  788,
+      788,  788,  788,  789,  251,  789,  789,  789,  789,  789,
+      789,  789,  789,  789,  789,  801,  801,  801,  801,  801,
+      801,  801,  801,  801,  801,  806,  806,  806,  806,  806,
+      806,  806,  806,  806,  806,  811,  811,  811,  811,  811,
+
+      811,  811,  811,  811,  811,  250,  244,  241,  240,  239,
+      238,  801,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  237,  234,  233,  232,  231,  230,  229,  228,
+      227,  226,  225,  224,  223,  217,  216,  209,  208,  207,
+      206,  205,  204,  202,  201,  199,  193,  185,  802,  803,
+      803,  803,  803,  803,  803,  803,  803,  803,  803,  181,
+      177,  176,  174,  170,  163,  159,  157,  155,  147,  146,
+      145,  144,  143,  137,  136,  135,  134,  133,  131,  130,
+      129,  128,  124,  120,  119,  803,  808,  808,  808,  808,
+      808,  808,  808,  808,  808,  808,  115,  112,  109,  104,
+
+      103,  102,  100,   96,   95,   94,   93,   90,   77,   70,
+       63,   59,   58,   56,   55,   53,   51,   43,   42,   41,
+       39,   35,  808,  814,  814,  814,  814,  814,  814,  814,
+      814,  814,  814,  814,  814,  814,  814,  814,  814,  814,
+      814,  814,  814,  814,  815,  815,  815,  815,  815,  815,
+      815,  815,  815,  815,  815,  815,  815,  815,  815,  815,
+      815,  815,  815,  815,  815,  816,  816,  816,  816,  816,
+      816,  816,  816,  816,  816,  816,  816,  816,  816,  816,
+      816,  816,  816,  816,  816,  816,  817,  817,  817,  817,
+      817,  817,  817,  817,  817,  817,  817,  817,  817,  817,
+
+      817,  817,  817,  817,  817,  817,  817,  818,   31,   25,
+       19,   17,   16,   15,  818,    0,  818,  818,  818,  818,
+        0,    0,  818,  818,  818,  818,  818,  818,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  819,  819,  819,  820,
+        0,    0,    0,    0,  820,    0,  820,    0,  820,  820,
+      820,  820,  820,    0,  820,  820,  820,  820,  820,  820,
+      821,    0,    0,    0,    0,    0,    0,  821,    0,  821,
+      821,  821,  821,    0,    0,  821,  821,  821,  821,  821,
+      821,  822,    0,    0,  822,  822,    0,  822,  822,    0,
+
+      822,  822,  822,  822,    0,    0,  822,  822,  822,  822,
+      822,  822,  823,  823,    0,  823,    0,    0,    0,  823,
+      825,    0,    0,  825,  825,    0,  825,  825,    0,  825,
+      825,  825,  825,    0,    0,  825,  825,  825,  825,  825,
+      825,  826,    0,    0,  826,  826,    0,  826,  826,    0,
+      826,  826,  826,  826,    0,  826,  826,  826,    0,  826,
+      826,  826,  828,    0,    0,  828,    0,    0,  828,  828,
+        0,  828,  828,  828,  828,  828,    0,  828,  828,  828,
+      828,  828,  828,  829,  829,  829,  829,  829,  829,  829,
+      829,  829,  829,  829,  829,  829,  829,  829,  829,  829,
+
+      829,  829,  829,  829,  830,  830,    0,  830,    0,  830,
+      830,  830,  830,  830,  830,  830,  830,  830,  830,  830,
+      830,  830,  830,  830,  830,  831,    0,    0,    0,    0,
+      831,    0,  831,    0,  831,  831,  831,  831,  831,    0,
+      831,  831,  831,  831,  831,  831,  832,    0,    0,    0,
+        0,    0,    0,  832,    0,  832,  832,  832,  832,    0,
+      832,  832,  832,  832,  832,  832,  832,  833,    0,    0,
+      833,  833,    0,  833,  833,    0,  833,  833,  833,  833,
+        0,  833,  833,  833,  833,  833,  833,  833,  834,  834,
+      834,  834,  834,  834,  834,  834,  834,  834,  834,  834,
+
+      834,  834,  834,  834,  834,  834,  834,  834,  834,  835,
+      835,    0,  835,  835,  835,  835,  835,  835,  835,  835,
+      835,  835,  835,  835,  835,  835,  835,  835,  835,  835,
+      837,    0,    0,  837,  837,    0,  837,  837,    0,  837,
+      837,  837,  837,    0,    0,  837,  837,  837,  837,  837,
+      837,  838,  838,    0,  838,    0,    0,    0,  838,  839,
+      839,    0,  839,    0,    0,    0,  839,  840,  840,  840,
+        0,  840,    0,    0,    0,  840,  841,    0,    0,  841,
+      841,    0,  841,  841,    0,  841,  841,  841,  841,    0,
+        0,  841,  841,  841,  841,  841,  841,  842,    0,    0,
+
+      842,  842,    0,  842,  842,    0,  842,  842,  842,  842,
+        0,    0,  842,  842,  842,  842,  842,  842,  843,    0,
+        0,  843,  843,    0,  843,  843,    0,  843,  843,  843,
+      843,    0,  843,  843,  843,    0,  843,  843,  843,  845,
+        0,    0,  845,    0,    0,  845,  845,    0,  845,  845,
+      845,  845,  845,    0,  845,  845,  845,  845,  845,  845,
+      846,    0,    0,    0,    0,    0,    0,  846,    0,  846,
+      846,  846,  846,    0,    0,  846,  846,  846,  846,  846,
+      846,  847,    0,    0,    0,    0,    0,    0,  847,    0,
+      847,  847,  847,  847,    0,  847,  847,  847,  847,  847,
+
+      847,  847,  848,    0,    0,  848,  848,    0,  848,  848,
+        0,  848,  848,  848,  848,    0,  848,  848,  848,  848,
+      848,  848,  848,  849,    0,    0,  849,  849,    0,  849,
+      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
+      850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
+      850,  851,  851,    0,  851,    0,    0,    0,  851,  852,
+      852,  852,    0,  852,    0,    0,    0,  852,  855,  855,
+        0,  855,    0,    0,    0,  855,  856,  856,    0,  856,
+        0,    0,    0,  856,  857,  857,    0,  857,    0,    0,
+        0,  857,  858,  858,  858,    0,  858,    0,    0,    0,
+
+      858,  859,    0,    0,  859,  859,    0,  859,  860,  860,
+        0,  860,    0,    0,    0,  860,  861,  861,    0,  861,
+        0,    0,    0,  861,  862,  862,    0,  862,    0,    0,
+        0,  862,  863,  863,  863,    0,  863,    0,    0,    0,
+      863,  864,  864,  864,  864,    0,  864,    0,    0,    0,
+      864,  867,  867,    0,  867,    0,    0,    0,  867,  868,
+      868,    0,  868,    0,    0,    0,  868,  869,  869,    0,
+      869,    0,    0,    0,  869,  872,  872,  872,    0,  872,
+        0,    0,    0,  872,  873,  873,  873,  873,    0,  873,
+        0,    0,    0,  873,  874,  874,  874,  874,  874,  874,
+
+      874,  874,  874,  874,  874,  874,  874,  874,  874,  874,
+      874,  874,  874,  874,  874,  876,  876,    0,  876,    0,
+        0,    0,  876,  877,  877,    0,  877,    0,    0,    0,
+      877,  879,  879,  879,    0,  879,    0,    0,    0,  879,
+      880,  880,  880,  880,    0,  880,    0,    0,    0,  880,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  881,  881,  881,  881,  881,  881,  881,  881,  881,
+      881,  884,    0,    0,  884,  884,    0,  884,  885,    0,
+        0,    0,  885,  885,    0,  885,  885,  885,    0,    0,
+      885,  885,  886,  886,    0,  886,    0,    0,    0,  886,
+
+      887,    0,  887,  887,    0,  887,    0,    0,    0,  887,
+      890,  890,  890,    0,  890,    0,    0,    0,  890,  891,
+      891,  891,  891,    0,  891,    0,    0,    0,  891,  892,
+      892,    0,    0,  892,    0,    0,    0,  892,  893,  893,
+      893,  893,  893,  893,  893,  893,  893,  893,  893,  893,
+      893,  893,  893,  893,  893,  893,  893,  893,  893,  895,
+        0,    0,  895,  895,    0,  895,  896,    0,    0,    0,
+      896,  896,    0,  896,  896,  896,    0,    0,  896,  896,
+      899,  899,    0,  899,    0,    0,    0,  899,  900,    0,
+      900,  900,    0,  900,    0,    0,    0,  900,  902,  902,
+
+      902,    0,  902,    0,    0,    0,  902,  903,  903,  903,
+        0,    0,  903,    0,    0,    0,  903,  904,  904,  904,
+      904,  904,  904,  904,  904,  904,  904,  904,  904,  904,
+      904,  904,  904,  904,  904,  904,  904,  904,  905,  905,
+        0,  905,  905,  905,    0,  905,    0,  905,  905,  905,
+      905,    0,    0,  905,  905,  905,  905,  905,  905,  906,
+      906,    0,  906,  906,  906,    0,  906,    0,  906,  906,
+      906,  906,    0,    0,  906,  906,  906,  906,  906,  906,
+      909,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  909,  909,    0,  909,  909,    0,  909,  911,  911,
+
+        0,  911,    0,    0,    0,  911,  912,    0,  912,  912,
+        0,  912,    0,    0,    0,  912,  915,  915,    0,    0,
+      915,    0,    0,    0,  915,  917,    0,    0,    0,    0,
+        0,    0,  917,    0,  917,  917,  917,  917,    0,    0,
+      917,  917,  917,  917,  917,  917,  920,  920,    0,  920,
+        0,    0,    0,  920,  921,    0,  921,  921,    0,  921,
+        0,    0,    0,  921,  925,  925,    0,  925,    0,    0,
+        0,  925,  926,    0,  926,    0,    0,  926,    0,    0,
+        0,  926,  927,  927,  927,  927,  927,  927,  927,  927,
+      927,  927,  927,  927,  927,  927,  927,  927,  927,  927,
+
+      927,  927,  927,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  813,  813
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1565,6 +1999,7 @@ char *yytext;
 #include "toke.h"
 #include <gram.h>
 #include "lbuf.h"
+#include "sha2.h"
 #include "secure_path.h"
 
 extern YYSTYPE sudoerslval;
@@ -1582,6 +2017,7 @@ gid_t sudoers_gid = SUDOERS_GID;
 
 static bool continued, sawspace;
 static int prev_state;
+static int digest_len;
 
 static bool _push_include(char *, bool);
 static bool pop_include(void);
@@ -1610,7 +2046,9 @@ int (*trace_print)(const char *msg) = sudoers_trace_print;
 
 #define INSTR 5
 
-#line 1613 "lex.sudoers.c"
+#define WANTDIGEST 6
+
+#line 2051 "lex.sudoers.c"
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1764,9 +2202,9 @@ YY_DECL
        register char *yy_cp, *yy_bp;
        register int yy_act;
 
-#line 132 "toke.l"
+#line 135 "toke.l"
 
-#line 1769 "lex.sudoers.c"
+#line 2207 "lex.sudoers.c"
 
        if ( yy_init )
                {
@@ -1818,13 +2256,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 635 )
+                               if ( yy_current_state >= 814 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 3925 );
+               while ( yy_base[yy_current_state] != 5604 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -1852,7 +2290,7 @@ do_action:        /* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 133 "toke.l"
+#line 136 "toke.l"
 {
                            LEXTRACE(", ");
                            LEXRETURN(',');
@@ -1860,12 +2298,12 @@ YY_RULE_SETUP
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 138 "toke.l"
+#line 141 "toke.l"
 BEGIN STARTDEFS;
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 140 "toke.l"
+#line 143 "toke.l"
 {
                            BEGIN INDEFS;
                            LEXTRACE("DEFVAR ");
@@ -1877,7 +2315,7 @@ YY_RULE_SETUP
 
 case 4:
 YY_RULE_SETUP
-#line 149 "toke.l"
+#line 152 "toke.l"
 {
                            BEGIN STARTDEFS;
                            LEXTRACE(", ");
@@ -1886,7 +2324,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 155 "toke.l"
+#line 158 "toke.l"
 {
                            LEXTRACE("= ");
                            LEXRETURN('=');
@@ -1894,7 +2332,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 160 "toke.l"
+#line 163 "toke.l"
 {
                            LEXTRACE("+= ");
                            LEXRETURN('+');
@@ -1902,7 +2340,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 165 "toke.l"
+#line 168 "toke.l"
 {
                            LEXTRACE("-= ");
                            LEXRETURN('-');
@@ -1910,7 +2348,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 170 "toke.l"
+#line 173 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -1920,7 +2358,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 177 "toke.l"
+#line 180 "toke.l"
 {
                            LEXTRACE("WORD(2) ");
                            if (!fill(sudoerstext, sudoersleng))
@@ -1932,7 +2370,7 @@ YY_RULE_SETUP
 
 case 10:
 YY_RULE_SETUP
-#line 186 "toke.l"
+#line 189 "toke.l"
 {
                            /* Line continuation char followed by newline. */
                            sudolineno++;
@@ -1941,7 +2379,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 192 "toke.l"
+#line 195 "toke.l"
 {
                            LEXTRACE("ENDSTR ");
                            BEGIN prev_state;
@@ -1976,7 +2414,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 224 "toke.l"
+#line 227 "toke.l"
 {
                            LEXTRACE("BACKSLASH ");
                            if (!append(sudoerstext, sudoersleng))
@@ -1985,7 +2423,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 230 "toke.l"
+#line 233 "toke.l"
 {
                            LEXTRACE("STRBODY ");
                            if (!append(sudoerstext, sudoersleng))
@@ -1996,7 +2434,7 @@ YY_RULE_SETUP
 
 case 14:
 YY_RULE_SETUP
-#line 238 "toke.l"
+#line 241 "toke.l"
 {
                            /* quoted fnmatch glob char, pass verbatim */
                            LEXTRACE("QUOTEDCHAR ");
@@ -2007,7 +2445,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 246 "toke.l"
+#line 249 "toke.l"
 {
                            /* quoted sudoers special char, strip backslash */
                            LEXTRACE("QUOTEDCHAR ");
@@ -2018,7 +2456,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 254 "toke.l"
+#line 257 "toke.l"
 {
                            BEGIN INITIAL;
                            yyless(0);
@@ -2027,7 +2465,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 260 "toke.l"
+#line 263 "toke.l"
 {
                            LEXTRACE("ARG ");
                            if (!fill_args(sudoerstext, sudoersleng, sawspace))
@@ -2038,7 +2476,47 @@ YY_RULE_SETUP
 
 case 18:
 YY_RULE_SETUP
-#line 268 "toke.l"
+#line 271 "toke.l"
+{
+                           /* Only return DIGEST if the length is correct. */
+                           if (sudoersleng == digest_len * 2) {
+                               if (!fill(sudoerstext, sudoersleng))
+                                   yyterminate();
+                               BEGIN INITIAL;
+                               LEXTRACE("DIGEST ");
+                               LEXRETURN(DIGEST);
+                           }
+                           BEGIN INITIAL;
+                           yyless(sudoersleng);
+                       } /* hex digest */
+       YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 284 "toke.l"
+{
+                           /* Only return DIGEST if the length is correct. */
+                           size_t len;
+                           if (sudoerstext[sudoersleng - 1] == '=') {
+                               /* use padding */
+                               len = 4 * ((digest_len + 2) / 3);
+                           } else {
+                               /* no padding */
+                               len = (4 * digest_len + 2) / 3;
+                           }
+                           if (sudoersleng == len) {
+                               if (!fill(sudoerstext, sudoersleng))
+                                   yyterminate();
+                               BEGIN INITIAL;
+                               LEXTRACE("DIGEST ");
+                               LEXRETURN(DIGEST);
+                           }
+                           BEGIN INITIAL;
+                           yyless(sudoersleng);
+                       } /* base64 digest */
+       YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 305 "toke.l"
 {
                            char *path;
 
@@ -2057,9 +2535,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }
        YY_BREAK
-case 19:
+case 21:
 YY_RULE_SETUP
-#line 286 "toke.l"
+#line 323 "toke.l"
 {
                            char *path;
 
@@ -2081,9 +2559,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }
        YY_BREAK
-case 20:
+case 22:
 YY_RULE_SETUP
-#line 307 "toke.l"
+#line 344 "toke.l"
 {
                            char deftype;
                            int n;
@@ -2124,9 +2602,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 21:
+case 23:
 YY_RULE_SETUP
-#line 347 "toke.l"
+#line 384 "toke.l"
 {
                            int n;
 
@@ -2153,100 +2631,100 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 22:
+case 24:
 YY_RULE_SETUP
-#line 373 "toke.l"
+#line 410 "toke.l"
 {
                                /* cmnd does not require passwd for this user */
                                LEXTRACE("NOPASSWD ");
                                LEXRETURN(NOPASSWD);
                        }
        YY_BREAK
-case 23:
+case 25:
 YY_RULE_SETUP
-#line 379 "toke.l"
+#line 416 "toke.l"
 {
                                /* cmnd requires passwd for this user */
                                LEXTRACE("PASSWD ");
                                LEXRETURN(PASSWD);
                        }
        YY_BREAK
-case 24:
+case 26:
 YY_RULE_SETUP
-#line 385 "toke.l"
+#line 422 "toke.l"
 {
                                LEXTRACE("NOEXEC ");
                                LEXRETURN(NOEXEC);
                        }
        YY_BREAK
-case 25:
+case 27:
 YY_RULE_SETUP
-#line 390 "toke.l"
+#line 427 "toke.l"
 {
                                LEXTRACE("EXEC ");
                                LEXRETURN(EXEC);
                        }
        YY_BREAK
-case 26:
+case 28:
 YY_RULE_SETUP
-#line 395 "toke.l"
+#line 432 "toke.l"
 {
                                LEXTRACE("SETENV ");
                                LEXRETURN(SETENV);
                        }
        YY_BREAK
-case 27:
+case 29:
 YY_RULE_SETUP
-#line 400 "toke.l"
+#line 437 "toke.l"
 {
                                LEXTRACE("NOSETENV ");
                                LEXRETURN(NOSETENV);
                        }
        YY_BREAK
-case 28:
+case 30:
 YY_RULE_SETUP
-#line 405 "toke.l"
+#line 442 "toke.l"
 {
                                LEXTRACE("LOG_OUTPUT ");
                                LEXRETURN(LOG_OUTPUT);
                        }
        YY_BREAK
-case 29:
+case 31:
 YY_RULE_SETUP
-#line 410 "toke.l"
+#line 447 "toke.l"
 {
                                LEXTRACE("NOLOG_OUTPUT ");
                                LEXRETURN(NOLOG_OUTPUT);
                        }
        YY_BREAK
-case 30:
+case 32:
 YY_RULE_SETUP
-#line 415 "toke.l"
+#line 452 "toke.l"
 {
                                LEXTRACE("LOG_INPUT ");
                                LEXRETURN(LOG_INPUT);
                        }
        YY_BREAK
-case 31:
+case 33:
 YY_RULE_SETUP
-#line 420 "toke.l"
+#line 457 "toke.l"
 {
                                LEXTRACE("NOLOG_INPUT ");
                                LEXRETURN(NOLOG_INPUT);
                        }
        YY_BREAK
-case 32:
+case 34:
 YY_RULE_SETUP
-#line 425 "toke.l"
+#line 462 "toke.l"
 {
                            /* empty group or netgroup */
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
                        }
        YY_BREAK
-case 33:
+case 35:
 YY_RULE_SETUP
-#line 431 "toke.l"
+#line 468 "toke.l"
 {
                            /* netgroup */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2255,9 +2733,9 @@ YY_RULE_SETUP
                            LEXRETURN(NETGROUP);
                        }
        YY_BREAK
-case 34:
+case 36:
 YY_RULE_SETUP
-#line 439 "toke.l"
+#line 476 "toke.l"
 {
                            /* group */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2266,9 +2744,9 @@ YY_RULE_SETUP
                            LEXRETURN(USERGROUP);
                        }
        YY_BREAK
-case 35:
+case 37:
 YY_RULE_SETUP
-#line 447 "toke.l"
+#line 484 "toke.l"
 {
                            if (!fill(sudoerstext, sudoersleng))
                                yyterminate();
@@ -2276,9 +2754,9 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 36:
+case 38:
 YY_RULE_SETUP
-#line 454 "toke.l"
+#line 491 "toke.l"
 {
                            if (!fill(sudoerstext, sudoersleng))
                                yyterminate();
@@ -2286,9 +2764,9 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 37:
+case 39:
 YY_RULE_SETUP
-#line 461 "toke.l"
+#line 498 "toke.l"
 {
                            if (!ipv6_valid(sudoerstext)) {
                                LEXTRACE("ERROR ");
@@ -2300,9 +2778,9 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 38:
+case 40:
 YY_RULE_SETUP
-#line 472 "toke.l"
+#line 509 "toke.l"
 {
                            if (!ipv6_valid(sudoerstext)) {
                                LEXTRACE("ERROR ");
@@ -2314,18 +2792,18 @@ YY_RULE_SETUP
                            LEXRETURN(NTWKADDR);
                        }
        YY_BREAK
-case 39:
+case 41:
 YY_RULE_SETUP
-#line 483 "toke.l"
+#line 520 "toke.l"
 {
                            LEXTRACE("ALL ");
                            LEXRETURN(ALL);
 
                        }
        YY_BREAK
-case 40:
+case 42:
 YY_RULE_SETUP
-#line 489 "toke.l"
+#line 526 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("ROLE ");
@@ -2335,9 +2813,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 41:
+case 43:
 YY_RULE_SETUP
-#line 498 "toke.l"
+#line 535 "toke.l"
 {
 #ifdef HAVE_SELINUX
                            LEXTRACE("TYPE ");
@@ -2347,9 +2825,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 42:
+case 44:
 YY_RULE_SETUP
-#line 506 "toke.l"
+#line 543 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("PRIVS ");
@@ -2359,9 +2837,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 43:
+case 45:
 YY_RULE_SETUP
-#line 515 "toke.l"
+#line 552 "toke.l"
 {
 #ifdef HAVE_PRIV_SET
                            LEXTRACE("LIMITPRIVS ");
@@ -2371,9 +2849,9 @@ YY_RULE_SETUP
 #endif
                        }
        YY_BREAK
-case 44:
+case 46:
 YY_RULE_SETUP
-#line 524 "toke.l"
+#line 561 "toke.l"
 {
                        got_alias:
                            if (!fill(sudoerstext, sudoersleng))
@@ -2382,9 +2860,9 @@ YY_RULE_SETUP
                            LEXRETURN(ALIAS);
                        }
        YY_BREAK
-case 45:
+case 47:
 YY_RULE_SETUP
-#line 532 "toke.l"
+#line 569 "toke.l"
 {
                            /* XXX - no way to specify digest for command */
                            /* no command args allowed for Defaults!/path */
@@ -2394,41 +2872,49 @@ YY_RULE_SETUP
                            LEXRETURN(COMMAND);
                        }
        YY_BREAK
-case 46:
+case 48:
 YY_RULE_SETUP
-#line 541 "toke.l"
+#line 578 "toke.l"
 {
+                           digest_len = SHA224_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA224 ");
                            LEXRETURN(SHA224);
                        }
        YY_BREAK
-case 47:
+case 49:
 YY_RULE_SETUP
-#line 546 "toke.l"
+#line 585 "toke.l"
 {
+                           digest_len = SHA256_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA256 ");
                            LEXRETURN(SHA256);
                        }
        YY_BREAK
-case 48:
+case 50:
 YY_RULE_SETUP
-#line 551 "toke.l"
+#line 592 "toke.l"
 {
+                           digest_len = SHA384_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA384 ");
                            LEXRETURN(SHA384);
                        }
        YY_BREAK
-case 49:
+case 51:
 YY_RULE_SETUP
-#line 556 "toke.l"
+#line 599 "toke.l"
 {
+                           digest_len = SHA512_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA512 ");
                            LEXRETURN(SHA512);
                        }
        YY_BREAK
-case 50:
+case 52:
 YY_RULE_SETUP
-#line 561 "toke.l"
+#line 606 "toke.l"
 {
                            BEGIN GOTCMND;
                            LEXTRACE("COMMAND ");
@@ -2436,9 +2922,9 @@ YY_RULE_SETUP
                                yyterminate();
                        }                       /* sudo -e */
        YY_BREAK
-case 51:
+case 53:
 YY_RULE_SETUP
-#line 568 "toke.l"
+#line 613 "toke.l"
 {
                            /* directories can't have args... */
                            if (sudoerstext[sudoersleng - 1] == '/') {
@@ -2454,9 +2940,9 @@ YY_RULE_SETUP
                            }
                        }                       /* a pathname */
        YY_BREAK
-case 52:
+case 54:
 YY_RULE_SETUP
-#line 583 "toke.l"
+#line 628 "toke.l"
 {
                            LEXTRACE("BEGINSTR ");
                            sudoerslval.string = NULL;
@@ -2464,9 +2950,9 @@ YY_RULE_SETUP
                            BEGIN INSTR;
                        }
        YY_BREAK
-case 53:
+case 55:
 YY_RULE_SETUP
-#line 590 "toke.l"
+#line 635 "toke.l"
 {
                            /* a word */
                            if (!fill(sudoerstext, sudoersleng))
@@ -2475,49 +2961,49 @@ YY_RULE_SETUP
                            LEXRETURN(WORD);
                        }
        YY_BREAK
-case 54:
+case 56:
 YY_RULE_SETUP
-#line 598 "toke.l"
+#line 643 "toke.l"
 {
                            LEXTRACE("( ");
                            LEXRETURN('(');
                        }
        YY_BREAK
-case 55:
+case 57:
 YY_RULE_SETUP
-#line 603 "toke.l"
+#line 648 "toke.l"
 {
                            LEXTRACE(") ");
                            LEXRETURN(')');
                        }
        YY_BREAK
-case 56:
+case 58:
 YY_RULE_SETUP
-#line 608 "toke.l"
+#line 653 "toke.l"
 {
                            LEXTRACE(", ");
                            LEXRETURN(',');
                        }                       /* return ',' */
        YY_BREAK
-case 57:
+case 59:
 YY_RULE_SETUP
-#line 613 "toke.l"
+#line 658 "toke.l"
 {
                            LEXTRACE("= ");
                            LEXRETURN('=');
                        }                       /* return '=' */
        YY_BREAK
-case 58:
+case 60:
 YY_RULE_SETUP
-#line 618 "toke.l"
+#line 663 "toke.l"
 {
                            LEXTRACE(": ");
                            LEXRETURN(':');
                        }                       /* return ':' */
        YY_BREAK
-case 59:
+case 61:
 YY_RULE_SETUP
-#line 623 "toke.l"
+#line 668 "toke.l"
 {
                            if (sudoersleng & 1) {
                                LEXTRACE("!");
@@ -2525,9 +3011,9 @@ YY_RULE_SETUP
                            }
                        }
        YY_BREAK
-case 60:
+case 62:
 YY_RULE_SETUP
-#line 630 "toke.l"
+#line 675 "toke.l"
 {
                            if (YY_START == INSTR) {
                                LEXTRACE("ERROR ");
@@ -2540,25 +3026,25 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* return newline */
        YY_BREAK
-case 61:
+case 63:
 YY_RULE_SETUP
-#line 642 "toke.l"
+#line 687 "toke.l"
 {                      /* throw away space/tabs */
                            sawspace = true;    /* but remember for fill_args */
                        }
        YY_BREAK
-case 62:
+case 64:
 YY_RULE_SETUP
-#line 646 "toke.l"
+#line 691 "toke.l"
 {
                            sawspace = true;    /* remember for fill_args */
                            sudolineno++;
                            continued = true;
                        }                       /* throw away EOL after \ */
        YY_BREAK
-case 63:
+case 65:
 YY_RULE_SETUP
-#line 652 "toke.l"
+#line 697 "toke.l"
 {
                            BEGIN INITIAL;
                            sudolineno++;
@@ -2567,9 +3053,9 @@ YY_RULE_SETUP
                            LEXRETURN(COMMENT);
                        }                       /* comment, not uid/gid */
        YY_BREAK
-case 64:
+case 66:
 YY_RULE_SETUP
-#line 660 "toke.l"
+#line 705 "toke.l"
 {
                            LEXTRACE("ERROR ");
                            LEXRETURN(ERROR);
@@ -2581,7 +3067,8 @@ case YY_STATE_EOF(GOTCMND):
 case YY_STATE_EOF(STARTDEFS):
 case YY_STATE_EOF(INDEFS):
 case YY_STATE_EOF(INSTR):
-#line 665 "toke.l"
+case YY_STATE_EOF(WANTDIGEST):
+#line 710 "toke.l"
 {
                            if (YY_START != INITIAL) {
                                BEGIN INITIAL;
@@ -2592,12 +3079,12 @@ case YY_STATE_EOF(INSTR):
                                yyterminate();
                        }
        YY_BREAK
-case 65:
+case 67:
 YY_RULE_SETUP
-#line 675 "toke.l"
+#line 720 "toke.l"
 ECHO;
        YY_BREAK
-#line 2600 "lex.sudoers.c"
+#line 3087 "lex.sudoers.c"
 
        case YY_END_OF_BUFFER:
                {
@@ -2888,7 +3375,7 @@ static yy_state_type yy_get_previous_state()
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 635 )
+                       if ( yy_current_state >= 814 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -2923,11 +3410,11 @@ yy_state_type yy_current_state;
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 635 )
+               if ( yy_current_state >= 814 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 634);
+       yy_is_jam = (yy_current_state == 813);
 
        return yy_is_jam ? 0 : yy_current_state;
        }
@@ -3488,7 +3975,7 @@ int main()
        return 0;
        }
 #endif
-#line 675 "toke.l"
+#line 720 "toke.l"
 
 struct path_list {
     char *path;
index b90bb77da6352d4509fbf3dafdd7aca1bef2d585..ded6e1f23d887e24ab1258a1ad873669128a6e7d 100644 (file)
@@ -71,6 +71,7 @@
 #include "toke.h"
 #include <gram.h>
 #include "lbuf.h"
+#include "sha2.h"
 #include "secure_path.h"
 
 extern YYSTYPE sudoerslval;
@@ -88,6 +89,7 @@ gid_t sudoers_gid = SUDOERS_GID;
 
 static bool continued, sawspace;
 static int prev_state;
+static int digest_len;
 
 static bool _push_include(char *, bool);
 static bool pop_include(void);
@@ -128,6 +130,7 @@ DEFVAR                      [a-z_]+
 %x     STARTDEFS
 %x     INDEFS
 %x     INSTR
+%s     WANTDIGEST
 
 %%
 <GOTDEFS>[[:blank:]]*,[[:blank:]]* {
@@ -265,6 +268,40 @@ DEFVAR                     [a-z_]+
                        }                       /* a command line arg */
 }
 
+<WANTDIGEST>[[:xdigit:]]+ {
+                           /* Only return DIGEST if the length is correct. */
+                           if (sudoersleng == digest_len * 2) {
+                               if (!fill(sudoerstext, sudoersleng))
+                                   yyterminate();
+                               BEGIN INITIAL;
+                               LEXTRACE("DIGEST ");
+                               LEXRETURN(DIGEST);
+                           }
+                           BEGIN INITIAL;
+                           yyless(sudoersleng);
+                       } /* hex digest */
+
+<WANTDIGEST>[A-Za-z0-9\+/=]+ {
+                           /* Only return DIGEST if the length is correct. */
+                           size_t len;
+                           if (sudoerstext[sudoersleng - 1] == '=') {
+                               /* use padding */
+                               len = 4 * ((digest_len + 2) / 3);
+                           } else {
+                               /* no padding */
+                               len = (4 * digest_len + 2) / 3;
+                           }
+                           if (sudoersleng == len) {
+                               if (!fill(sudoerstext, sudoersleng))
+                                   yyterminate();
+                               BEGIN INITIAL;
+                               LEXTRACE("DIGEST ");
+                               LEXRETURN(DIGEST);
+                           }
+                           BEGIN INITIAL;
+                           yyless(sudoersleng);
+                       } /* base64 digest */
+
 <INITIAL>^#include[[:blank:]]+.*\n {
                            char *path;
 
@@ -539,21 +576,29 @@ ALL {
                        }
 
 sha224                 {
+                           digest_len = SHA224_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA224 ");
                            LEXRETURN(SHA224);
                        }
 
 sha256                 {
+                           digest_len = SHA256_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA256 ");
                            LEXRETURN(SHA256);
                        }
 
 sha384                 {
+                           digest_len = SHA384_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA384 ");
                            LEXRETURN(SHA384);
                        }
 
 sha512                 {
+                           digest_len = SHA512_DIGEST_LENGTH;
+                           BEGIN WANTDIGEST;
                            LEXTRACE("SHA512 ");
                            LEXRETURN(SHA512);
                        }