From: Todd C. Miller Date: Mon, 15 Apr 2013 19:12:00 +0000 (-0400) Subject: Sanity check digest in parser so visudo can catch errors. X-Git-Tag: SUDO_1_8_7~1^2~70 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e715841fc2075211dc773e2df3e8871e0d600705;p=sudo Sanity check digest in parser so visudo can catch errors. Add base64 support --- diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c index c4769a444..463c83018 100644 --- a/plugins/sudoers/gram.c +++ b/plugins/sudoers/gram.c @@ -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; diff --git a/plugins/sudoers/gram.h b/plugins/sudoers/gram.h index 6bd3267ec..e11062dc3 100644 --- a/plugins/sudoers/gram.h +++ b/plugins/sudoers/gram.h @@ -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 { diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y index 257a87e0a..2e286983d 100644 --- a/plugins/sudoers/gram.y +++ b/plugins/sudoers/gram.y @@ -115,6 +115,7 @@ static struct sudo_digest *new_digest(int, const char *); %token NETGROUP /* a netgroup (+NAME) */ %token USERGROUP /* a usergroup (%NAME) */ %token WORD /* a word */ +%token DIGEST /* a SHA-2 digest */ %token DEFAULTS /* Defaults entry */ %token DEFAULTS_HOST /* Host-specific defaults entry */ %token 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); } ; diff --git a/plugins/sudoers/match.c b/plugins/sudoers/match.c index 8d4c3d625..74b1f96b8 100644 --- a/plugins/sudoers/match.c +++ b/plugins/sudoers/match.c @@ -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 diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c index 20b1d2c30..a367cf906 100644 --- a/plugins/sudoers/toke.c +++ b/plugins/sudoers/toke.c @@ -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 #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; diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l index b90bb77da..ded6e1f23 100644 --- a/plugins/sudoers/toke.l +++ b/plugins/sudoers/toke.l @@ -71,6 +71,7 @@ #include "toke.h" #include #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 %% [[:blank:]]*,[[:blank:]]* { @@ -265,6 +268,40 @@ DEFVAR [a-z_]+ } /* a command line arg */ } +[[: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 */ + +[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 */ + ^#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); }