diff --git a/MANIFEST b/MANIFEST index b92a2169e..a239ab384 100644 --- a/MANIFEST +++ b/MANIFEST @@ -200,6 +200,7 @@ plugins/sudoers/gram.c plugins/sudoers/gram.h plugins/sudoers/gram.y plugins/sudoers/group_plugin.c +plugins/sudoers/hexchar.c plugins/sudoers/ins_2001.h plugins/sudoers/ins_classic.h plugins/sudoers/ins_csops.h @@ -268,6 +269,8 @@ plugins/sudoers/regress/logging/check_wrap.in plugins/sudoers/regress/logging/check_wrap.out.ok plugins/sudoers/regress/parser/check_addr.c plugins/sudoers/regress/parser/check_addr.in +plugins/sudoers/regress/parser/check_digest.c +plugins/sudoers/regress/parser/check_digest.out.ok plugins/sudoers/regress/parser/check_fill.c plugins/sudoers/regress/sudoers/test1.in plugins/sudoers/regress/sudoers/test1.out.ok @@ -331,6 +334,8 @@ plugins/sudoers/regress/visudo/test3.err.ok plugins/sudoers/regress/visudo/test3.out.ok plugins/sudoers/regress/visudo/test3.sh plugins/sudoers/set_perms.c +plugins/sudoers/sha2.c +plugins/sudoers/sha2.h plugins/sudoers/sssd.c plugins/sudoers/sudo_nss.c plugins/sudoers/sudo_nss.h diff --git a/config.h.in b/config.h.in index b601aa24d..2f7855185 100644 --- a/config.h.in +++ b/config.h.in @@ -960,6 +960,15 @@ /* Define to `int' if doesn't define. */ #undef uid_t +/* Define to `unsigned int' if does not define. */ +#undef uint32_t + +/* Define to `unsigned long long' if does not define. */ +#undef uint64_t + +/* Define to `unsigned char' if does not define. */ +#undef uint8_t + /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile diff --git a/configure b/configure index 2b3e49be5..e12d8ab21 100755 --- a/configure +++ b/configure @@ -16247,6 +16247,39 @@ _ACEOF fi +ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" +if test "x$ac_cv_type_uint8_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define uint8_t unsigned char +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" +if test "x$ac_cv_type_uint32_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define uint32_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default" +if test "x$ac_cv_type_uint64_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define uint64_t unsigned long long +_ACEOF + +fi + ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " $ac_includes_default #include diff --git a/configure.in b/configure.in index e145e3666..aea690e6a 100644 --- a/configure.in +++ b/configure.in @@ -2169,6 +2169,9 @@ AC_CHECK_TYPE(size_t, unsigned int) AC_CHECK_TYPE(ssize_t, int) AC_CHECK_TYPE(dev_t, int) AC_CHECK_TYPE(ino_t, unsigned int) +AC_CHECK_TYPE(uint8_t, unsigned char) +AC_CHECK_TYPE(uint32_t, unsigned int) +AC_CHECK_TYPE(uint64_t, unsigned long long) AC_CHECK_TYPE(socklen_t, [], [AC_DEFINE(socklen_t, unsigned int)], [ AC_INCLUDES_DEFAULT #include ]) diff --git a/plugins/sudoers/Makefile.in b/plugins/sudoers/Makefile.in index eb95e5ed6..63bc6be52 100644 --- a/plugins/sudoers/Makefile.in +++ b/plugins/sudoers/Makefile.in @@ -123,13 +123,14 @@ SHELL = @SHELL@ PROGS = sudoers.la visudo sudoreplay testsudoers -TEST_PROGS = check_iolog_path check_fill check_wrap check_addr check_symbols +TEST_PROGS = check_iolog_path check_fill check_wrap check_addr check_symbols \ + check_digest AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@ -LIBPARSESUDOERS_OBJS = alias.lo audit.lo defaults.lo gram.lo match.lo \ - match_addr.lo pwutil.lo pwutil_impl.lo timestr.lo \ - toke.lo toke_util.lo redblack.lo +LIBPARSESUDOERS_OBJS = alias.lo audit.lo defaults.lo hexchar.lo gram.lo \ + match.lo match_addr.lo pwutil.lo pwutil_impl.lo \ + timestr.lo toke.lo toke_util.lo redblack.lo sha2.lo SUDOERS_OBJS = $(AUTH_OBJS) boottime.lo check.lo env.lo find_path.lo \ goodpath.lo group_plugin.lo interfaces.lo iolog.lo \ @@ -146,7 +147,9 @@ TEST_OBJS = group_plugin.o interfaces.o locale.o net_ifs.o \ CHECK_ADDR_OBJS = check_addr.o interfaces.o locale.o match_addr.o -CHECK_FILL_OBJS = check_fill.o locale.o toke_util.o +CHECK_DIGEST_OBJS = check_digest.o sha2.o + +CHECK_FILL_OBJS = check_fill.o hexchar.o locale.o toke_util.o CHECK_IOLOG_PATH_OBJS = check_iolog_path.o iolog_path.o locale.o \ pwutil.o pwutil_impl.o redblack.o @@ -202,12 +205,15 @@ testsudoers: libparsesudoers.la $(TEST_OBJS) $(LT_LIBS) check_addr: $(CHECK_ADDR_OBJS) $(LT_LIBS) $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_ADDR_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) $(NET_LIBS) -check_iolog_path: $(CHECK_IOLOG_PATH_OBJS) $(LT_LIBS) - $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PATH_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) +check_digest: $(CHECK_DIGEST_OBJS) $(LT_LIBS) + $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_DIGEST_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) check_fill: $(CHECK_FILL_OBJS) $(LT_LIBS) $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_FILL_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) +check_iolog_path: $(CHECK_IOLOG_PATH_OBJS) $(LT_LIBS) + $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PATH_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) + check_symbols: $(CHECK_SYMBOLS_OBJS) $(LT_LIBS) if [ X"$(soext)" != X"" ]; then \ $(LIBTOOL) --mode=link $(CC) -o $@ $(CHECK_SYMBOLS_OBJS) $(LDFLAGS) $(PIE_LDFLAGS) $(SSP_LDFLAGS) $(LIBS) @SUDO_LIBS@; \ @@ -310,7 +316,10 @@ check: $(TEST_PROGS) visudo testsudoers @if test X"$(cross_compiling)" != X"yes"; then \ rval=0; \ CWD=`pwd`; \ + mkdir -p regress/parser; \ ./check_addr $(srcdir)/regress/parser/check_addr.in || rval=`expr $$rval + $$?`; \ + ./check_digest > regress/parser/check_digest.out; \ + diff regress/parser/check_digest.out $(srcdir)/regress/parser/check_digest.out.ok || rval=`expr $$rval + $$?`; \ ./check_fill || rval=`expr $$rval + $$?`; \ ./check_iolog_path $(srcdir)/regress/iolog_path/data || rval=`expr $$rval + $$?`; \ if [ X"$(soext)" != X"" ]; then \ @@ -473,6 +482,9 @@ check_addr.o: $(srcdir)/regress/parser/check_addr.c $(top_builddir)/config.h \ $(incdir)/sudo_debug.h $(incdir)/gettext.h $(srcdir)/parse.h \ $(srcdir)/interfaces.h $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/regress/parser/check_addr.c +check_digest.o: $(srcdir)/regress/parser/check_digest.c \ + $(top_builddir)/config.h $(srcdir)/sha2.h + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/regress/parser/check_digest.c check_fill.o: $(srcdir)/regress/parser/check_fill.c $(top_builddir)/config.h \ $(top_srcdir)/compat/stdbool.h $(incdir)/missing.h \ $(incdir)/list.h $(srcdir)/parse.h $(srcdir)/toke.h \ @@ -571,6 +583,10 @@ group_plugin.lo: $(srcdir)/group_plugin.c $(top_builddir)/config.h \ $(incdir)/gettext.h $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/group_plugin.c group_plugin.o: group_plugin.lo +hexchar.lo: $(srcdir)/hexchar.c $(top_builddir)/config.h $(incdir)/missing.h \ + $(incdir)/sudo_debug.h $(incdir)/error.h + $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/hexchar.c +hexchar.o: hexchar.lo interfaces.lo: $(srcdir)/interfaces.c $(top_builddir)/config.h \ $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \ $(top_builddir)/pathnames.h $(incdir)/missing.h \ @@ -646,7 +662,8 @@ match.lo: $(srcdir)/match.c $(top_builddir)/config.h \ $(incdir)/alloc.h $(incdir)/list.h $(incdir)/fileops.h \ $(srcdir)/defaults.h $(devdir)/def_data.h $(srcdir)/logging.h \ $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h $(incdir)/sudo_debug.h \ - $(incdir)/gettext.h $(srcdir)/parse.h $(devdir)/gram.h + $(incdir)/gettext.h $(srcdir)/parse.h $(srcdir)/sha2.h \ + $(devdir)/gram.h $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/match.c match_addr.lo: $(srcdir)/match_addr.c $(top_builddir)/config.h \ $(srcdir)/sudoers.h $(top_srcdir)/compat/stdbool.h \ @@ -754,6 +771,9 @@ set_perms.lo: $(srcdir)/set_perms.c $(top_builddir)/config.h \ $(srcdir)/logging.h $(srcdir)/sudo_nss.h $(incdir)/sudo_plugin.h \ $(incdir)/sudo_debug.h $(incdir)/gettext.h $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/set_perms.c +sha2.lo: $(srcdir)/sha2.c $(top_builddir)/config.h $(srcdir)/sha2.h + $(LIBTOOL) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(DEFS) $(srcdir)/sha2.c +sha2.o: sha2.lo sia.lo: $(authdir)/sia.c $(top_builddir)/config.h $(srcdir)/sudoers.h \ $(top_srcdir)/compat/stdbool.h $(top_builddir)/pathnames.h \ $(incdir)/missing.h $(incdir)/error.h $(incdir)/alloc.h \ diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c index 90d4c8a5f..c4769a444 100644 --- a/plugins/sudoers/gram.c +++ b/plugins/sudoers/gram.c @@ -127,7 +127,8 @@ static void add_defaults(int, struct member *, struct defaults *); static void add_userspec(struct member *, struct privilege *); static struct defaults *new_default(char *, char *, int); static struct member *new_member(char *, int); -#line 94 "gram.y" +static struct sudo_digest *new_digest(int, const char *); +#line 95 "gram.y" #ifndef YYSTYPE_DEFINED #define YYSTYPE_DEFINED typedef union { @@ -136,6 +137,7 @@ typedef union { struct member *member; struct runascontainer *runas; struct privilege *privilege; + struct sudo_digest *digest; struct sudo_command command; struct cmndtag tag; struct selinux_info seinfo; @@ -144,7 +146,7 @@ typedef union { int tok; } YYSTYPE; #endif /* YYSTYPE_DEFINED */ -#line 147 "gram.c" +#line 149 "gram.c" #define COMMAND 257 #define ALIAS 258 #define DEFVAR 259 @@ -179,6 +181,10 @@ typedef union { #define PRIVS 288 #define LIMITPRIVS 289 #define MYSELF 290 +#define SHA224 291 +#define SHA256 292 +#define SHA384 293 +#define SHA512 294 #define YYERRCODE 256 #if defined(__cplusplus) || defined(__STDC__) const short sudoerslhs[] = @@ -186,17 +192,18 @@ const short sudoerslhs[] = short sudoerslhs[] = #endif { -1, - 0, 0, 28, 28, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 4, 4, 3, 3, - 3, 3, 3, 20, 20, 19, 10, 10, 8, 8, - 8, 8, 8, 2, 2, 1, 6, 6, 23, 24, - 22, 22, 22, 22, 22, 26, 27, 25, 25, 25, - 25, 25, 17, 17, 18, 18, 18, 18, 18, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 5, 5, 5, 31, 31, 34, 9, 9, 32, 32, - 35, 7, 7, 33, 33, 36, 30, 30, 37, 13, - 13, 11, 11, 12, 12, 12, 12, 12, 16, 16, - 14, 14, 15, 15, 15, + 0, 0, 30, 30, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 4, 4, 3, 3, + 3, 3, 3, 21, 21, 20, 11, 11, 9, 9, + 9, 9, 9, 2, 2, 1, 29, 29, 29, 29, + 7, 7, 6, 6, 24, 25, 23, 23, 23, 23, + 23, 27, 28, 26, 26, 26, 26, 26, 18, 18, + 19, 19, 19, 19, 19, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 5, 5, 5, 33, + 33, 36, 10, 10, 34, 34, 37, 8, 8, 35, + 35, 38, 32, 32, 39, 14, 14, 12, 12, 13, + 13, 13, 13, 13, 17, 17, 15, 15, 16, 16, + 16, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerslen[] = @@ -207,14 +214,15 @@ short sudoerslen[] = 0, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 3, 1, 2, 3, 3, 3, 1, 3, 3, 1, 2, 1, 1, - 1, 1, 1, 1, 3, 5, 1, 2, 3, 3, - 0, 1, 1, 2, 2, 3, 3, 0, 1, 1, - 2, 2, 0, 3, 0, 1, 3, 2, 1, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 3, 3, 1, 3, 1, 3, - 3, 1, 3, 1, 3, 3, 1, 3, 3, 1, - 3, 1, 2, 1, 1, 1, 1, 1, 1, 3, - 1, 2, 1, 1, 1, + 1, 1, 1, 1, 3, 5, 3, 3, 3, 3, + 1, 2, 1, 2, 3, 3, 0, 1, 1, 2, + 2, 3, 3, 0, 1, 1, 2, 2, 0, 3, + 0, 1, 3, 2, 1, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 3, 3, 1, 3, 1, 3, 3, 1, 3, 1, + 3, 3, 1, 3, 3, 1, 3, 1, 2, 1, + 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, + 1, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoersdefred[] = @@ -222,22 +230,24 @@ const short sudoersdefred[] = short sudoersdefred[] = #endif { 0, - 0, 94, 96, 97, 98, 0, 0, 0, 0, 0, - 95, 5, 0, 0, 0, 0, 0, 0, 90, 92, + 0, 100, 102, 103, 104, 0, 0, 0, 0, 0, + 101, 5, 0, 0, 0, 0, 0, 0, 96, 98, 0, 0, 3, 6, 0, 0, 17, 0, 29, 32, - 31, 33, 30, 0, 27, 0, 77, 0, 0, 73, - 72, 71, 0, 37, 82, 0, 0, 0, 74, 0, - 0, 79, 0, 0, 87, 0, 0, 84, 93, 0, - 0, 24, 0, 4, 0, 0, 0, 20, 0, 28, - 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 0, 0, 21, 22, - 23, 18, 78, 83, 0, 75, 0, 80, 0, 88, - 0, 85, 0, 34, 0, 0, 25, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 103, 105, 104, 0, - 99, 101, 0, 0, 54, 35, 0, 0, 0, 0, - 60, 0, 0, 44, 45, 102, 0, 0, 40, 39, - 0, 0, 0, 51, 52, 100, 46, 47, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 36, + 31, 33, 30, 0, 27, 0, 83, 0, 0, 79, + 78, 77, 0, 0, 0, 0, 0, 43, 41, 88, + 0, 0, 0, 0, 80, 0, 0, 85, 0, 0, + 93, 0, 0, 90, 99, 0, 0, 24, 0, 4, + 0, 0, 0, 20, 0, 28, 0, 0, 0, 0, + 44, 0, 0, 0, 0, 0, 0, 42, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, 0, 21, + 22, 23, 18, 84, 37, 38, 39, 40, 89, 0, + 81, 0, 86, 0, 94, 0, 91, 0, 34, 0, + 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 109, 111, 110, 0, 105, 107, 0, 0, 60, + 35, 0, 0, 0, 0, 66, 0, 0, 50, 51, + 108, 0, 0, 46, 45, 0, 0, 0, 57, 58, + 106, 52, 53, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 36, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoersdgoto[] = @@ -245,114 +255,118 @@ const short sudoersdgoto[] = short sudoersdgoto[] = #endif { 18, - 104, 105, 27, 28, 44, 45, 46, 35, 61, 37, - 19, 20, 21, 121, 122, 123, 106, 110, 62, 63, - 143, 114, 115, 116, 131, 132, 133, 22, 23, 54, - 48, 51, 57, 49, 52, 58, 55, + 119, 120, 27, 28, 48, 49, 50, 51, 35, 67, + 37, 19, 20, 21, 136, 137, 138, 121, 125, 68, + 69, 158, 129, 130, 131, 146, 147, 148, 52, 22, + 23, 60, 54, 57, 63, 55, 58, 64, 61, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerssindex[] = #else short sudoerssindex[] = #endif - { 541, - -270, 0, 0, 0, 0, -21, -5, 553, 553, 20, - 0, 0, -242, -229, -216, -214, -240, 0, 0, 0, - -27, 541, 0, 0, -18, -227, 0, 2, 0, 0, - 0, 0, 0, -223, 0, -33, 0, -31, -31, 0, - 0, 0, -243, 0, 0, -24, -12, -6, 0, 3, - 4, 0, 5, 7, 0, 6, 10, 0, 0, 553, - -20, 0, 11, 0, -206, -193, -191, 0, -21, 0, - -5, 2, 2, 2, 0, 20, 2, -5, -242, 20, - -229, 553, -216, 553, -214, 0, 33, -5, 0, 0, - 0, 0, 0, 0, 31, 0, 32, 0, 34, 0, - 34, 0, 513, 0, 35, -226, 0, 86, -25, 36, - 33, 19, 21, -234, -202, -201, 0, 0, 0, -232, - 0, 0, 41, 86, 0, 0, -176, -173, 37, 38, - 0, -198, -195, 0, 0, 0, 86, 41, 0, 0, - -169, -168, 569, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,}; + { -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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,}; #if defined(__cplusplus) || defined(__STDC__) const short sudoersrindex[] = #else short sudoersrindex[] = #endif - { 96, + { 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 0, 0, 1, 0, 0, 177, 0, 0, + 0, 105, 0, 0, 1, 0, 0, 177, 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, 446, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, - 0, 0, 0, 0, 30, 0, 59, 0, 89, 0, - 118, 0, 60, 0, 148, -28, 0, 62, 63, 0, - 463, 0, 0, 594, 489, 512, 0, 0, 0, 0, - 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 623, 653, 0, 0, 0, 0, 65, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,}; #if defined(__cplusplus) || defined(__STDC__) const short sudoersgindex[] = #else short sudoersgindex[] = #endif { 0, - -11, 0, 39, 12, 66, -72, 27, 76, -4, 40, - 52, 98, -1, -23, -7, -8, 0, 0, 42, 0, - 0, 0, 8, 13, 0, -13, -9, 0, 99, 0, - 0, 0, 0, 46, 45, 44, 48, + -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, }; -#define YYTABLESIZE 932 +#define YYTABLESIZE 1124 #if defined(__cplusplus) || defined(__STDC__) const short sudoerstable[] = #else short sudoerstable[] = #endif - { 26, - 19, 26, 36, 94, 41, 34, 38, 39, 26, 24, - 71, 26, 60, 40, 41, 47, 60, 2, 60, 76, - 3, 4, 5, 71, 66, 117, 67, 34, 50, 76, - 118, 68, 124, 19, 29, 42, 30, 31, 11, 32, - 87, 53, 65, 56, 19, 69, 119, 72, 78, 73, - 74, 79, 43, 129, 130, 33, 89, 77, 81, 112, - 113, 81, 76, 80, 83, 82, 84, 85, 88, 90, - 159, 91, 103, 95, 71, 76, 125, 60, 111, 127, - 99, 128, 101, 112, 137, 113, 139, 76, 89, 140, - 130, 81, 129, 147, 148, 1, 2, 141, 142, 126, - 55, 109, 59, 56, 58, 57, 97, 92, 75, 70, - 93, 86, 136, 146, 59, 138, 81, 86, 120, 145, - 64, 89, 144, 135, 96, 98, 0, 134, 102, 107, - 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 89, 26, 0, 0, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, + { 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, 86, 12, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 25, 41, 41, - 29, 0, 30, 31, 25, 32, 10, 25, 0, 9, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 33, 29, 0, 30, 31, 19, 32, 19, 41, - 41, 19, 19, 19, 19, 19, 19, 19, 19, 10, - 8, 0, 0, 33, 0, 0, 40, 41, 0, 19, - 19, 19, 19, 19, 19, 76, 0, 76, 0, 0, - 76, 76, 76, 76, 76, 76, 76, 76, 42, 11, - 0, 0, 0, 8, 0, 0, 0, 0, 76, 76, - 76, 76, 76, 76, 81, 0, 81, 0, 0, 81, - 81, 81, 81, 81, 81, 81, 81, 0, 7, 0, - 0, 0, 11, 0, 0, 0, 0, 81, 81, 81, - 81, 81, 81, 117, 89, 0, 89, 0, 118, 89, - 89, 89, 89, 89, 89, 89, 89, 15, 0, 0, - 0, 7, 0, 0, 119, 0, 0, 89, 89, 89, - 89, 89, 89, 86, 0, 86, 0, 0, 86, 86, - 86, 86, 86, 86, 86, 86, 13, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 86, 86, 86, 86, - 86, 86, 0, 26, 0, 26, 0, 0, 26, 26, + 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, @@ -361,51 +375,70 @@ short sudoerstable[] = 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, 53, 0, 10, 10, 10, + 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, 42, 0, 0, 0, 0, 8, 0, 8, 0, + 10, 47, 0, 0, 0, 0, 8, 0, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 0, - 0, 0, 0, 0, 43, 17, 0, 0, 0, 8, + 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, - 108, 0, 0, 17, 0, 0, 0, 0, 11, 11, - 11, 11, 11, 11, 7, 17, 7, 0, 0, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, - 0, 43, 0, 0, 0, 0, 0, 7, 7, 7, + 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, 48, 0, 0, 0, + 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, 49, 0, 0, 0, 0, + 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, 50, 0, 0, 0, 0, + 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, 53, - 53, 0, 0, 0, 16, 16, 16, 16, 16, 16, - 0, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 0, 0, 0, 42, 42, 0, 53, 53, - 53, 53, 0, 0, 0, 0, 0, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, - 2, 0, 0, 3, 4, 5, 42, 42, 0, 0, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 11, 0, 0, 0, 0, 1, 0, 2, 43, - 43, 3, 4, 5, 6, 7, 8, 9, 10, 0, - 2, 0, 0, 3, 4, 5, 0, 0, 0, 11, - 12, 13, 14, 15, 16, 40, 41, 0, 0, 0, - 0, 11, 0, 0, 0, 0, 0, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 42, 0, 0, - 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 49, - 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 0, 0, 0, 0, 0, 0, 0, 50, - 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, + 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 30, 31, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 33, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerscheck[] = @@ -413,21 +446,21 @@ const short sudoerscheck[] = short sudoerscheck[] = #endif { 33, - 0, 33, 7, 76, 33, 33, 8, 9, 33, 280, - 44, 33, 44, 257, 258, 258, 44, 258, 44, 44, - 261, 262, 263, 44, 43, 258, 45, 33, 258, 0, - 263, 259, 58, 33, 258, 279, 260, 261, 279, 263, - 61, 258, 61, 258, 44, 44, 279, 36, 61, 38, - 39, 58, 33, 288, 289, 279, 263, 46, 0, 286, - 287, 58, 33, 61, 58, 61, 61, 58, 58, 263, - 143, 263, 40, 78, 44, 44, 41, 44, 44, 61, - 82, 61, 84, 286, 44, 287, 263, 58, 0, 263, - 289, 33, 288, 263, 263, 0, 0, 61, 61, 111, - 41, 103, 41, 41, 41, 41, 80, 69, 43, 34, - 71, 60, 120, 137, 17, 124, 58, 0, 33, 133, - 22, 33, 132, 116, 79, 81, -1, 115, 85, 88, - 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 58, 0, -1, -1, + 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, @@ -435,14 +468,14 @@ short sudoerscheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, 0, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 259, -1, 259, 257, 258, - 258, -1, 260, 261, 259, 263, 0, 259, -1, 33, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 279, 258, -1, 260, 261, 256, 263, 258, 288, - 289, 261, 262, 263, 264, 265, 266, 267, 268, 33, - 0, -1, -1, 279, -1, -1, 257, 258, -1, 279, + -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, 279, 0, + 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, @@ -467,13 +500,13 @@ short sudoerscheck[] = -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, 33, 33, -1, -1, -1, 279, + -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, - 58, -1, -1, 33, -1, -1, -1, -1, 279, 280, - 281, 282, 283, 284, 256, 33, 258, -1, -1, 261, - 262, 263, 264, 265, 266, 267, 268, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, 279, 280, 281, + -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, @@ -485,34 +518,53 @@ short sudoerscheck[] = -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, -1, -1, 279, 280, 281, 282, 283, 284, - -1, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, -1, -1, -1, 257, 258, -1, 286, 287, - 288, 289, -1, -1, -1, -1, -1, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 257, 258, - 258, -1, -1, 261, 262, 263, 288, 289, -1, -1, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 279, -1, -1, -1, -1, 256, -1, 258, 288, - 289, 261, 262, 263, 264, 265, 266, 267, 268, -1, - 258, -1, -1, 261, 262, 263, -1, -1, -1, 279, - 280, 281, 282, 283, 284, 257, 258, -1, -1, -1, - -1, 279, -1, -1, -1, -1, -1, 269, 270, 271, + 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, - 257, 258, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, -1, -1, -1, -1, -1, -1, 257, - 258, -1, -1, -1, -1, -1, -1, -1, -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, -1, -1, -1, -1, -1, -1, -1, + 258, -1, -1, 291, 292, 293, 294, -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, + 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, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 258, -1, 260, 261, -1, 263, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, }; #define YYFINAL 18 #ifndef YYDEBUG #define YYDEBUG 0 #endif -#define YYMAXTOKEN 290 +#define YYMAXTOKEN 294 #if YYDEBUG #if defined(__cplusplus) || defined(__STDC__) const char * const sudoersname[] = @@ -531,7 +583,8 @@ char *sudoersname[] = "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", +"RUNASALIAS","ERROR","TYPE","ROLE","PRIVS","LIMITPRIVS","MYSELF","SHA224", +"SHA256","SHA384","SHA512", }; #if defined(__cplusplus) || defined(__STDC__) const char * const sudoersrule[] = @@ -574,7 +627,13 @@ char *sudoersrule[] = "host : WORD", "cmndspeclist : cmndspec", "cmndspeclist : cmndspeclist ',' cmndspec", -"cmndspec : runasspec selinux solarisprivs cmndtag opcmnd", +"cmndspec : runasspec selinux solarisprivs cmndtag digcmnd", +"digest : SHA224 ':' WORD", +"digest : SHA256 ':' WORD", +"digest : SHA384 ':' WORD", +"digest : SHA512 ':' WORD", +"digcmnd : opcmnd", +"digcmnd : digest opcmnd", "opcmnd : cmnd", "opcmnd : '!' cmnd", "rolespec : ROLE '=' WORD", @@ -620,8 +679,8 @@ char *sudoersrule[] = "cmndaliases : cmndalias", "cmndaliases : cmndaliases ':' cmndalias", "cmndalias : ALIAS '=' cmndlist", -"cmndlist : opcmnd", -"cmndlist : cmndlist ',' opcmnd", +"cmndlist : digcmnd", +"cmndlist : cmndlist ',' digcmnd", "runasaliases : runasalias", "runasaliases : runasaliases ':' runasalias", "runasalias : ALIAS '=' userlist", @@ -671,14 +730,13 @@ short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; -#line 647 "gram.y" +#line 680 "gram.y" void sudoerserror(const char *s) { debug_decl(sudoerserror, SUDO_DEBUG_PARSER) /* If we last saw a newline the error is on the preceding line. */ - /* XXX - COMMENT not yet defined - XXX */ if (last_token == COMMENT) sudolineno--; @@ -738,6 +796,19 @@ new_member(char *name, int type) debug_return_ptr(m); } +struct sudo_digest * +new_digest(int digest_type, const char *digest_str) +{ + struct sudo_digest *dig; + debug_decl(new_digest, SUDO_DEBUG_PARSER) + + dig = emalloc(sizeof(*dig)); + dig->digest_type = digest_type; + dig->digest_str = estrdup(digest_str); + + debug_return_ptr(dig); +} + /* * Add a list of defaults structures to the defaults list. * The binding, if non-NULL, specifies a list of hosts, users, or @@ -907,7 +978,7 @@ init_parser(const char *path, bool quiet) debug_return; } -#line 858 "gram.c" +#line 929 "gram.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ #if defined(__cplusplus) || defined(__STDC__) static int yygrowstack(void) @@ -1110,127 +1181,127 @@ yyreduce: switch (yyn) { case 1: -#line 176 "gram.y" +#line 184 "gram.y" { ; } break; case 5: -#line 184 "gram.y" +#line 192 "gram.y" { ; } break; case 6: -#line 187 "gram.y" +#line 195 "gram.y" { yyerrok; } break; case 7: -#line 190 "gram.y" +#line 198 "gram.y" { add_userspec(yyvsp[-1].member, yyvsp[0].privilege); } break; case 8: -#line 193 "gram.y" +#line 201 "gram.y" { ; } break; case 9: -#line 196 "gram.y" +#line 204 "gram.y" { ; } break; case 10: -#line 199 "gram.y" +#line 207 "gram.y" { ; } break; case 11: -#line 202 "gram.y" +#line 210 "gram.y" { ; } break; case 12: -#line 205 "gram.y" +#line 213 "gram.y" { add_defaults(DEFAULTS, NULL, yyvsp[0].defaults); } break; case 13: -#line 208 "gram.y" +#line 216 "gram.y" { add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults); } break; case 14: -#line 211 "gram.y" +#line 219 "gram.y" { add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults); } break; case 15: -#line 214 "gram.y" +#line 222 "gram.y" { add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults); } break; case 16: -#line 217 "gram.y" +#line 225 "gram.y" { add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults); } break; case 18: -#line 223 "gram.y" +#line 231 "gram.y" { list_append(yyvsp[-2].defaults, yyvsp[0].defaults); yyval.defaults = yyvsp[-2].defaults; } break; case 19: -#line 229 "gram.y" +#line 237 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, true); } break; case 20: -#line 232 "gram.y" +#line 240 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, false); } break; case 21: -#line 235 "gram.y" +#line 243 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true); } break; case 22: -#line 238 "gram.y" +#line 246 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+'); } break; case 23: -#line 241 "gram.y" +#line 249 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-'); } break; case 25: -#line 247 "gram.y" +#line 255 "gram.y" { list_append(yyvsp[-2].privilege, yyvsp[0].privilege); yyval.privilege = yyvsp[-2].privilege; } break; case 26: -#line 253 "gram.y" +#line 261 "gram.y" { struct privilege *p = ecalloc(1, sizeof(*p)); list2tq(&p->hostlist, yyvsp[-2].member); @@ -1241,51 +1312,51 @@ case 26: } break; case 27: -#line 263 "gram.y" +#line 271 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; case 28: -#line 267 "gram.y" +#line 275 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; case 29: -#line 273 "gram.y" +#line 281 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; case 30: -#line 276 "gram.y" +#line 284 "gram.y" { yyval.member = new_member(NULL, ALL); } break; case 31: -#line 279 "gram.y" +#line 287 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); } break; case 32: -#line 282 "gram.y" +#line 290 "gram.y" { yyval.member = new_member(yyvsp[0].string, NTWKADDR); } break; case 33: -#line 285 "gram.y" +#line 293 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); } break; case 35: -#line 291 "gram.y" +#line 299 "gram.y" { list_append(yyvsp[-2].cmndspec, yyvsp[0].cmndspec); #ifdef HAVE_SELINUX @@ -1325,7 +1396,7 @@ case 35: } break; case 36: -#line 330 "gram.y" +#line 338 "gram.y" { struct cmndspec *cs = ecalloc(1, sizeof(*cs)); if (yyvsp[-4].runas != NULL) { @@ -1356,246 +1427,285 @@ case 36: } break; case 37: -#line 360 "gram.y" +#line 368 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string); + } +break; +case 38: +#line 371 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string); + } +break; +case 39: +#line 374 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string); + } +break; +case 40: +#line 377 "gram.y" +{ + yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string); + } +break; +case 41: +#line 382 "gram.y" +{ + yyval.member = yyvsp[0].member; + } +break; +case 42: +#line 385 "gram.y" +{ + /* XXX - yuck */ + struct sudo_command *c = (struct sudo_command *)(yyvsp[0].member->name); + c->digest = yyvsp[-1].digest; + yyval.member = yyvsp[0].member; + } +break; +case 43: +#line 393 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 38: -#line 364 "gram.y" +case 44: +#line 397 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 39: -#line 370 "gram.y" -{ - yyval.string = yyvsp[0].string; - } -break; -case 40: -#line 375 "gram.y" -{ - yyval.string = yyvsp[0].string; - } -break; -case 41: -#line 380 "gram.y" -{ - yyval.seinfo.role = NULL; - yyval.seinfo.type = NULL; - } -break; -case 42: -#line 384 "gram.y" -{ - yyval.seinfo.role = yyvsp[0].string; - yyval.seinfo.type = NULL; - } -break; -case 43: -#line 388 "gram.y" -{ - yyval.seinfo.type = yyvsp[0].string; - yyval.seinfo.role = NULL; - } -break; -case 44: -#line 392 "gram.y" -{ - yyval.seinfo.role = yyvsp[-1].string; - yyval.seinfo.type = yyvsp[0].string; - } -break; case 45: -#line 396 "gram.y" +#line 403 "gram.y" { - yyval.seinfo.type = yyvsp[-1].string; - yyval.seinfo.role = yyvsp[0].string; + yyval.string = yyvsp[0].string; } break; case 46: -#line 402 "gram.y" +#line 408 "gram.y" { yyval.string = yyvsp[0].string; } break; case 47: -#line 406 "gram.y" +#line 413 "gram.y" +{ + yyval.seinfo.role = NULL; + yyval.seinfo.type = NULL; + } +break; +case 48: +#line 417 "gram.y" +{ + yyval.seinfo.role = yyvsp[0].string; + yyval.seinfo.type = NULL; + } +break; +case 49: +#line 421 "gram.y" +{ + yyval.seinfo.type = yyvsp[0].string; + yyval.seinfo.role = NULL; + } +break; +case 50: +#line 425 "gram.y" +{ + yyval.seinfo.role = yyvsp[-1].string; + yyval.seinfo.type = yyvsp[0].string; + } +break; +case 51: +#line 429 "gram.y" +{ + yyval.seinfo.type = yyvsp[-1].string; + yyval.seinfo.role = yyvsp[0].string; + } +break; +case 52: +#line 435 "gram.y" { yyval.string = yyvsp[0].string; } break; -case 48: -#line 411 "gram.y" +case 53: +#line 439 "gram.y" +{ + yyval.string = yyvsp[0].string; + } +break; +case 54: +#line 444 "gram.y" { yyval.privinfo.privs = NULL; yyval.privinfo.limitprivs = NULL; } break; -case 49: -#line 415 "gram.y" +case 55: +#line 448 "gram.y" { yyval.privinfo.privs = yyvsp[0].string; yyval.privinfo.limitprivs = NULL; } break; -case 50: -#line 419 "gram.y" +case 56: +#line 452 "gram.y" { yyval.privinfo.privs = NULL; yyval.privinfo.limitprivs = yyvsp[0].string; } break; -case 51: -#line 423 "gram.y" +case 57: +#line 456 "gram.y" { yyval.privinfo.privs = yyvsp[-1].string; yyval.privinfo.limitprivs = yyvsp[0].string; } break; -case 52: -#line 427 "gram.y" +case 58: +#line 460 "gram.y" { yyval.privinfo.limitprivs = yyvsp[-1].string; yyval.privinfo.privs = yyvsp[0].string; } break; -case 53: -#line 433 "gram.y" +case 59: +#line 466 "gram.y" { yyval.runas = NULL; } break; -case 54: -#line 436 "gram.y" +case 60: +#line 469 "gram.y" { yyval.runas = yyvsp[-1].runas; } break; -case 55: -#line 441 "gram.y" +case 61: +#line 474 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); yyval.runas->runasusers = new_member(NULL, MYSELF); /* $$->runasgroups = NULL; */ } break; -case 56: -#line 446 "gram.y" +case 62: +#line 479 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); yyval.runas->runasusers = yyvsp[0].member; /* $$->runasgroups = NULL; */ } break; -case 57: -#line 451 "gram.y" +case 63: +#line 484 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); yyval.runas->runasusers = yyvsp[-2].member; yyval.runas->runasgroups = yyvsp[0].member; } break; -case 58: -#line 456 "gram.y" +case 64: +#line 489 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); /* $$->runasusers = NULL; */ yyval.runas->runasgroups = yyvsp[0].member; } break; -case 59: -#line 461 "gram.y" +case 65: +#line 494 "gram.y" { yyval.runas = ecalloc(1, sizeof(struct runascontainer)); yyval.runas->runasusers = new_member(NULL, MYSELF); /* $$->runasgroups = NULL; */ } break; -case 60: -#line 468 "gram.y" +case 66: +#line 501 "gram.y" { yyval.tag.nopasswd = yyval.tag.noexec = yyval.tag.setenv = yyval.tag.log_input = yyval.tag.log_output = UNSPEC; } break; -case 61: -#line 472 "gram.y" +case 67: +#line 505 "gram.y" { yyval.tag.nopasswd = true; } break; -case 62: -#line 475 "gram.y" +case 68: +#line 508 "gram.y" { yyval.tag.nopasswd = false; } break; -case 63: -#line 478 "gram.y" +case 69: +#line 511 "gram.y" { yyval.tag.noexec = true; } break; -case 64: -#line 481 "gram.y" +case 70: +#line 514 "gram.y" { yyval.tag.noexec = false; } break; -case 65: -#line 484 "gram.y" +case 71: +#line 517 "gram.y" { yyval.tag.setenv = true; } break; -case 66: -#line 487 "gram.y" +case 72: +#line 520 "gram.y" { yyval.tag.setenv = false; } break; -case 67: -#line 490 "gram.y" +case 73: +#line 523 "gram.y" { yyval.tag.log_input = true; } break; -case 68: -#line 493 "gram.y" +case 74: +#line 526 "gram.y" { yyval.tag.log_input = false; } break; -case 69: -#line 496 "gram.y" +case 75: +#line 529 "gram.y" { yyval.tag.log_output = true; } break; -case 70: -#line 499 "gram.y" +case 76: +#line 532 "gram.y" { yyval.tag.log_output = false; } break; -case 71: -#line 504 "gram.y" +case 77: +#line 537 "gram.y" { yyval.member = new_member(NULL, ALL); } break; -case 72: -#line 507 "gram.y" +case 78: +#line 540 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; -case 73: -#line 510 "gram.y" +case 79: +#line 543 "gram.y" { struct sudo_command *c = ecalloc(1, sizeof(*c)); c->cmnd = yyvsp[0].command.cmnd; @@ -1603,8 +1713,8 @@ case 73: yyval.member = new_member((char *)c, COMMAND); } break; -case 76: -#line 522 "gram.y" +case 82: +#line 555 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, HOSTALIAS, yyvsp[0].member)) != NULL) { @@ -1613,15 +1723,15 @@ case 76: } } break; -case 78: -#line 532 "gram.y" +case 84: +#line 565 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 81: -#line 542 "gram.y" +case 87: +#line 575 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, CMNDALIAS, yyvsp[0].member)) != NULL) { @@ -1630,15 +1740,15 @@ case 81: } } break; -case 83: -#line 552 "gram.y" +case 89: +#line 585 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 86: -#line 562 "gram.y" +case 92: +#line 595 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, RUNASALIAS, yyvsp[0].member)) != NULL) { @@ -1647,8 +1757,8 @@ case 86: } } break; -case 89: -#line 575 "gram.y" +case 95: +#line 608 "gram.y" { char *s; if ((s = alias_add(yyvsp[-2].string, USERALIAS, yyvsp[0].member)) != NULL) { @@ -1657,97 +1767,97 @@ case 89: } } break; -case 91: -#line 585 "gram.y" +case 97: +#line 618 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 92: -#line 591 "gram.y" +case 98: +#line 624 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 93: -#line 595 "gram.y" +case 99: +#line 628 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 94: -#line 601 "gram.y" +case 100: +#line 634 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; -case 95: -#line 604 "gram.y" +case 101: +#line 637 "gram.y" { yyval.member = new_member(NULL, ALL); } break; -case 96: -#line 607 "gram.y" +case 102: +#line 640 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); } break; -case 97: -#line 610 "gram.y" +case 103: +#line 643 "gram.y" { yyval.member = new_member(yyvsp[0].string, USERGROUP); } break; -case 98: -#line 613 "gram.y" +case 104: +#line 646 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); } break; -case 100: -#line 619 "gram.y" +case 106: +#line 652 "gram.y" { list_append(yyvsp[-2].member, yyvsp[0].member); yyval.member = yyvsp[-2].member; } break; -case 101: -#line 625 "gram.y" +case 107: +#line 658 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 102: -#line 629 "gram.y" +case 108: +#line 662 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 103: -#line 635 "gram.y" +case 109: +#line 668 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); } break; -case 104: -#line 638 "gram.y" +case 110: +#line 671 "gram.y" { yyval.member = new_member(NULL, ALL); } break; -case 105: -#line 641 "gram.y" +case 111: +#line 674 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); } break; -#line 1698 "gram.c" +#line 1808 "gram.c" } yyssp -= yym; yystate = *yyssp; diff --git a/plugins/sudoers/gram.h b/plugins/sudoers/gram.h index 47272b4ea..6bd3267ec 100644 --- a/plugins/sudoers/gram.h +++ b/plugins/sudoers/gram.h @@ -32,6 +32,10 @@ #define PRIVS 288 #define LIMITPRIVS 289 #define MYSELF 290 +#define SHA224 291 +#define SHA256 292 +#define SHA384 293 +#define SHA512 294 #ifndef YYSTYPE_DEFINED #define YYSTYPE_DEFINED typedef union { @@ -40,6 +44,7 @@ typedef union { struct member *member; struct runascontainer *runas; struct privilege *privilege; + struct sudo_digest *digest; struct sudo_command command; struct cmndtag tag; struct selinux_info seinfo; diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y index 4ba2b42e8..257a87e0a 100644 --- a/plugins/sudoers/gram.y +++ b/plugins/sudoers/gram.y @@ -89,6 +89,7 @@ static void add_defaults(int, struct member *, struct defaults *); static void add_userspec(struct member *, struct privilege *); static struct defaults *new_default(char *, char *, int); static struct member *new_member(char *, int); +static struct sudo_digest *new_digest(int, const char *); %} %union { @@ -97,6 +98,7 @@ static struct member *new_member(char *, int); struct member *member; struct runascontainer *runas; struct privilege *privilege; + struct sudo_digest *digest; struct sudo_command command; struct cmndtag tag; struct selinux_info seinfo; @@ -142,6 +144,10 @@ static struct member *new_member(char *, int); %token PRIVS /* Solaris privileges */ %token LIMITPRIVS /* Solaris limit privileges */ %token MYSELF /* run as myself, not another user */ +%token SHA224 /* sha224 digest */ +%token SHA256 /* sha256 digest */ +%token SHA384 /* sha384 digest */ +%token SHA512 /* sha512 digest */ %type cmndspec %type cmndspeclist @@ -149,6 +155,7 @@ static struct member *new_member(char *, int); %type defaults_list %type cmnd %type opcmnd +%type digcmnd %type cmndlist %type host %type hostlist @@ -170,6 +177,7 @@ static struct member *new_member(char *, int); %type solarisprivs %type privsspec %type limitprivsspec +%type digest %% @@ -327,7 +335,7 @@ cmndspeclist : cmndspec } ; -cmndspec : runasspec selinux solarisprivs cmndtag opcmnd { +cmndspec : runasspec selinux solarisprivs cmndtag digcmnd { struct cmndspec *cs = ecalloc(1, sizeof(*cs)); if ($1 != NULL) { list2tq(&cs->runasuserlist, $1->runasusers); @@ -357,6 +365,31 @@ cmndspec : runasspec selinux solarisprivs cmndtag opcmnd { } ; +digest : SHA224 ':' WORD { + $$ = new_digest(SUDO_DIGEST_SHA224, $3); + } + | SHA256 ':' WORD { + $$ = new_digest(SUDO_DIGEST_SHA256, $3); + } + | SHA384 ':' WORD { + $$ = new_digest(SUDO_DIGEST_SHA384, $3); + } + | SHA512 ':' WORD { + $$ = new_digest(SUDO_DIGEST_SHA512, $3); + } + ; + +digcmnd : opcmnd { + $$ = $1; + } + | digest opcmnd { + /* XXX - yuck */ + struct sudo_command *c = (struct sudo_command *)($2->name); + c->digest = $1; + $$ = $2; + } + ; + opcmnd : cmnd { $$ = $1; $$->negated = false; @@ -548,8 +581,8 @@ cmndalias : ALIAS '=' cmndlist { } ; -cmndlist : opcmnd - | cmndlist ',' opcmnd { +cmndlist : digcmnd + | cmndlist ',' digcmnd { list_append($1, $3); $$ = $1; } @@ -650,7 +683,6 @@ sudoerserror(const char *s) debug_decl(sudoerserror, SUDO_DEBUG_PARSER) /* If we last saw a newline the error is on the preceding line. */ - /* XXX - COMMENT not yet defined - XXX */ if (last_token == COMMENT) sudolineno--; @@ -710,6 +742,19 @@ new_member(char *name, int type) debug_return_ptr(m); } +struct sudo_digest * +new_digest(int digest_type, const char *digest_str) +{ + struct sudo_digest *dig; + debug_decl(new_digest, SUDO_DEBUG_PARSER) + + dig = emalloc(sizeof(*dig)); + dig->digest_type = digest_type; + dig->digest_str = estrdup(digest_str); + + debug_return_ptr(dig); +} + /* * Add a list of defaults structures to the defaults list. * The binding, if non-NULL, specifies a list of hosts, users, or diff --git a/plugins/sudoers/hexchar.c b/plugins/sudoers/hexchar.c new file mode 100644 index 000000000..bcfe526ac --- /dev/null +++ b/plugins/sudoers/hexchar.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include + +#include "missing.h" +#include "sudo_debug.h" +#include "error.h" + +int +hexchar(const char *s) +{ + unsigned char result[2]; + int i; + debug_decl(hexchar, SUDO_DEBUG_UTIL) + + for (i = 0; i < 2; i++) { + switch (s[i]) { + case '0': + result[i] = 0; + break; + case '1': + result[i] = 1; + break; + case '2': + result[i] = 2; + break; + case '3': + result[i] = 3; + break; + case '4': + result[i] = 4; + break; + case '5': + result[i] = 5; + break; + case '6': + result[i] = 6; + break; + case '7': + result[i] = 7; + break; + case '8': + result[i] = 8; + break; + case '9': + result[i] = 9; + break; + case 'A': + case 'a': + result[i] = 10; + break; + case 'B': + case 'b': + result[i] = 11; + break; + case 'C': + case 'c': + result[i] = 12; + break; + case 'D': + case 'd': + result[i] = 13; + break; + case 'E': + case 'e': + result[i] = 14; + break; + case 'F': + case 'f': + result[i] = 15; + break; + default: + /* Should not happen. */ + errorx(1, "internal error, \\x%s not in proper hex format", s); + } + } + debug_return_int((result[0] << 4) | result[1]); +} diff --git a/plugins/sudoers/ldap.c b/plugins/sudoers/ldap.c index 167aa5858..d1d160831 100644 --- a/plugins/sudoers/ldap.c +++ b/plugins/sudoers/ldap.c @@ -855,7 +855,7 @@ sudo_ldap_check_command(LDAP *ld, LDAPMessage *entry, int *setenv_implied) *allowed_args++ = '\0'; /* check the command like normal */ - if (command_matches(allowed_cmnd, allowed_args)) { + if (command_matches(allowed_cmnd, allowed_args, NULL)) { /* * If allowed (no bang) set ret but keep on checking. * If disallowed (bang), exit loop. diff --git a/plugins/sudoers/match.c b/plugins/sudoers/match.c index 413731822..8d4c3d625 100644 --- a/plugins/sudoers/match.c +++ b/plugins/sudoers/match.c @@ -60,9 +60,6 @@ #else # include #endif /* HAVE_NETGROUP_H */ -#include -#include -#include #ifdef HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) @@ -79,9 +76,14 @@ # include # endif #endif +#include +#include +#include +#include #include "sudoers.h" #include "parse.h" +#include "sha2.h" #include static struct member_list empty; @@ -91,7 +93,7 @@ static bool command_matches_dir(char *, size_t); static bool command_matches_glob(char *, char *); #endif static bool command_matches_fnmatch(char *, char *); -static bool command_matches_normal(char *, char *); +static bool command_matches_normal(char *, char *, struct sudo_digest *); /* * Returns true if string 's' contains meta characters. @@ -367,7 +369,7 @@ cmnd_matches(struct member *m) break; case COMMAND: c = (struct sudo_command *)m->name; - if (command_matches(c->cmnd, c->args)) + if (command_matches(c->cmnd, c->args, c->digest)) matched = !m->negated; break; } @@ -375,9 +377,7 @@ cmnd_matches(struct member *m) } static bool -command_args_match(sudoers_cmnd, sudoers_args) - char *sudoers_cmnd; - char *sudoers_args; +command_args_match(char *sudoers_cmnd, char *sudoers_args) { int flags = 0; debug_decl(command_args_match, SUDO_DEBUG_MATCH) @@ -408,7 +408,7 @@ command_args_match(sudoers_cmnd, sudoers_args) * otherwise, return true if user_cmnd names one of the inodes in path. */ bool -command_matches(char *sudoers_cmnd, char *sudoers_args) +command_matches(char *sudoers_cmnd, char *sudoers_args, struct sudo_digest *digest) { debug_decl(command_matches, SUDO_DEBUG_MATCH) @@ -444,7 +444,7 @@ command_matches(char *sudoers_cmnd, char *sudoers_args) debug_return_bool(command_matches_glob(sudoers_cmnd, sudoers_args)); #endif } - debug_return_bool(command_matches_normal(sudoers_cmnd, sudoers_args)); + debug_return_bool(command_matches_normal(sudoers_cmnd, sudoers_args, digest)); } static bool @@ -545,28 +545,129 @@ command_matches_glob(char *sudoers_cmnd, char *sudoers_args) #ifdef SUDOERS_NAME_MATCH static bool -command_matches_normal(char *sudoers_cmnd, char *sudoers_args) +command_matches_normal(char *sudoers_cmnd, char *sudoers_args, struct sudo_digest *digest) { size_t dlen; + debug_decl(command_matches_normal, SUDO_DEBUG_MATCH) dlen = strlen(sudoers_cmnd); /* If it ends in '/' it is a directory spec. */ if (sudoers_cmnd[dlen - 1] == '/') - return command_matches_dir(sudoers_cmnd, dlen); + debug_return_bool(command_matches_dir(sudoers_cmnd, dlen)); if (strcmp(user_cmnd, sudoers_cmnd) == 0) { if (command_args_match(sudoers_cmnd, sudoers_args)) { efree(safe_cmnd); safe_cmnd = estrdup(sudoers_cmnd); - return true; + debug_return_bool(true); } } - return false; + debug_return_bool(false); } #else /* !SUDOERS_NAME_MATCH */ + +static struct digest_function { + const char *digest_name; + const int digest_len; + void (*init)(SHA2_CTX *); + void (*update)(SHA2_CTX *, const unsigned char *, size_t); + void (*final)(unsigned char *, SHA2_CTX *); +} digest_functions[] = { + { + "SHA224", + SHA224_DIGEST_LENGTH, + SHA224Init, + SHA224Update, + SHA224Final + }, { + "SHA256", + SHA256_DIGEST_LENGTH, + SHA256Init, + SHA256Update, + SHA256Final + }, { + "SHA384", + SHA384_DIGEST_LENGTH, + SHA384Init, + SHA384Update, + SHA384Final + }, { + "SHA512", + SHA512_DIGEST_LENGTH, + SHA512Init, + SHA512Update, + SHA512Final + }, { + NULL + } +}; + static bool -command_matches_normal(char *sudoers_cmnd, char *sudoers_args) +digest_matches(char *file, struct sudo_digest *sd) +{ + char file_digest[SHA512_DIGEST_LENGTH]; + 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; + debug_decl(digest_matches, SUDO_DEBUG_MATCH) + + for (i = 0; digest_functions[i].digest_name != NULL; i++) { + if (sd->digest_type == i) { + func = &digest_functions[i]; + break; + } + } + if (func == NULL) { + 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); + } + sudoers_digest[i] = hexchar(&sd->digest_str[i + i]); + } + + if ((fp = fopen(file, "r")) == NULL) { + sudo_debug_printf(SUDO_DEBUG_INFO, "unable to open %s: %s", + file, strerror(errno)); + debug_return_bool(false); + } + + func->init(&ctx); + while ((nread = fread(buf, 1, sizeof(buf), fp)) != 0) { + func->update(&ctx, buf, nread); + } + if (ferror(fp)) { + warningx(_("%s: read error"), file); + fclose(fp); + debug_return_bool(false); + } + fclose(fp); + func->final(file_digest, &ctx); + + debug_return_bool(memcmp(file_digest, sudoers_digest, func->digest_len) == 0); +} + +static bool +command_matches_normal(char *sudoers_cmnd, char *sudoers_args, struct sudo_digest *digest) { struct stat sudoers_stat; char *base; @@ -592,17 +693,21 @@ command_matches_normal(char *sudoers_cmnd, char *sudoers_args) * a) there are no args in sudoers OR * b) there are no args on command line and none req by sudoers OR * c) there are args in sudoers and on command line and they match + * d) there is a digest and it matches */ if (user_stat != NULL && (user_stat->st_dev != sudoers_stat.st_dev || user_stat->st_ino != sudoers_stat.st_ino)) debug_return_bool(false); - if (command_args_match(sudoers_cmnd, sudoers_args)) { - efree(safe_cmnd); - safe_cmnd = estrdup(sudoers_cmnd); - debug_return_bool(true); + if (!command_args_match(sudoers_cmnd, sudoers_args)) + debug_return_bool(false); + if (digest != NULL && !digest_matches(sudoers_cmnd, digest)) { + /* XXX - log functions not available but we should log very loudly */ + debug_return_bool(false); } - debug_return_bool(false); + efree(safe_cmnd); + safe_cmnd = estrdup(sudoers_cmnd); + debug_return_bool(true); } #endif /* SUDOERS_NAME_MATCH */ @@ -614,7 +719,8 @@ command_matches_normal(char *sudoers_cmnd, char *sudoers_args) static bool command_matches_dir(char *sudoers_dir, size_t dlen) { - return strncmp(user_cmnd, sudoers_dir, dlen) == 0; + debug_decl(command_matches_normal, SUDO_DEBUG_MATCH) + debug_return_bool(strncmp(user_cmnd, sudoers_dir, dlen) == 0); } #else /* !SUDOERS_NAME_MATCH */ /* diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h index 602231698..7ab5063a6 100644 --- a/plugins/sudoers/parse.h +++ b/plugins/sudoers/parse.h @@ -27,12 +27,24 @@ #undef IMPLIED #define IMPLIED 2 +#define SUDO_DIGEST_SHA224 0 +#define SUDO_DIGEST_SHA256 1 +#define SUDO_DIGEST_SHA384 2 +#define SUDO_DIGEST_SHA512 3 + +struct sudo_digest { + int digest_type; + char *digest_str; +}; + /* - * A command with args. XXX - merge into struct member. + * A command with option args and digest. + * XXX - merge into struct member */ struct sudo_command { char *cmnd; char *args; + struct sudo_digest *digest; }; /* @@ -117,6 +129,7 @@ struct cmndspec { struct member_list runasuserlist; /* list of runas users */ struct member_list runasgrouplist; /* list of runas groups */ struct member *cmnd; /* command to allow/deny */ + char *digest; /* optional command digest */ struct cmndtag tags; /* tag specificaion */ #ifdef HAVE_SELINUX char *role, *type; /* SELinux role and type */ @@ -182,7 +195,7 @@ char *alias_add(char *, int, struct member *); bool addr_matches(char *); int cmnd_matches(struct member *); int cmndlist_matches(struct member_list *); -bool command_matches(char *, char *); +bool command_matches(char *, char *, struct sudo_digest *); int hostlist_matches(struct member_list *); bool hostname_matches(char *, char *, char *); bool netgr_matches(char *, char *, char *, char *); @@ -200,5 +213,6 @@ void init_aliases(void); void init_lexer(void); void init_parser(const char *, bool); int alias_compare(const void *, const void *); +int hexchar(const char *s); #endif /* _SUDOERS_PARSE_H */ diff --git a/plugins/sudoers/regress/parser/check_digest.c b/plugins/sudoers/regress/parser/check_digest.c new file mode 100644 index 000000000..42020e838 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_digest.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2013 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif /* STDC_HEADERS */ +#ifdef HAVE_STRING_H +# if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS) +# include +# endif +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#if defined(HAVE_STDINT_H) +# include +#elif defined(HAVE_INTTYPES_H) +# include +#endif + +#include "missing.h" +#include "sha2.h" + +__dso_public int main(int argc, char *argv[]); + +static struct digest_function { + const char *digest_name; + const int digest_len; + void (*init)(SHA2_CTX *); + void (*update)(SHA2_CTX *, const unsigned char *, size_t); + void (*final)(unsigned char *, SHA2_CTX *); +} digest_functions[] = { + { + "SHA224", + SHA224_DIGEST_LENGTH, + SHA224Init, + SHA224Update, + SHA224Final + }, { + "SHA256", + SHA256_DIGEST_LENGTH, + SHA256Init, + SHA256Update, + SHA256Final + }, { + "SHA384", + SHA384_DIGEST_LENGTH, + SHA384Init, + SHA384Update, + SHA384Final + }, { + "SHA512", + SHA512_DIGEST_LENGTH, + SHA512Init, + SHA512Update, + SHA512Final + }, { + NULL + } +}; + +int +main(int argc, char *argv[]) +{ + SHA2_CTX ctx; + int i, j; + struct digest_function *func; + unsigned char digest[SHA512_DIGEST_LENGTH]; + static const char hex[] = "0123456789abcdef"; + unsigned char buf[1000]; + unsigned const char *test_strings[] = { + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789", + "12345678901234567890123456789012345678901234567890123456789" + "012345678901234567890", + }; + + for (func = digest_functions; func->digest_name != NULL; func++) { + for (i = 0; i < 8; i++) { + func->init(&ctx); + func->update(&ctx, test_strings[i], strlen(test_strings[i])); + func->final(digest, &ctx); + printf("%s (\"%s\") = ", func->digest_name, test_strings[i]); + for (j = 0; j < func->digest_len; j++) { + putchar(hex[digest[j] >> 4]); + putchar(hex[digest[j] & 0x0f]); + } + putchar('\n'); + } + + /* Simulate a string of a million 'a' characters. */ + memset(buf, 'a', sizeof(buf)); + func->init(&ctx); + for (i = 0; i < 1000; i++) { + func->update(&ctx, buf, sizeof(buf)); + } + func->final(digest, &ctx); + printf("%s (one million 'a' characters) = ", func->digest_name); + for (j = 0; j < func->digest_len; j++) { + putchar(hex[digest[j] >> 4]); + putchar(hex[digest[j] & 0x0f]); + } + putchar('\n'); + } + exit(0); +} diff --git a/plugins/sudoers/regress/parser/check_digest.out.ok b/plugins/sudoers/regress/parser/check_digest.out.ok new file mode 100644 index 000000000..bfb573553 --- /dev/null +++ b/plugins/sudoers/regress/parser/check_digest.out.ok @@ -0,0 +1,36 @@ +SHA224 ("") = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f +SHA224 ("a") = abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5 +SHA224 ("abc") = 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 +SHA224 ("message digest") = 2cb21c83ae2f004de7e81c3c7019cbcb65b71ab656b22d6d0c39b8eb +SHA224 ("abcdefghijklmnopqrstuvwxyz") = 45a5f72c39c5cff2522eb3429799e49e5f44b356ef926bcf390dccc2 +SHA224 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525 +SHA224 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = bff72b4fcb7d75e5632900ac5f90d219e05e97a7bde72e740db393d9 +SHA224 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b50aecbe4e9bb0b57bc5f3ae760a8e01db24f203fb3cdcd13148046e +SHA224 (one million 'a' characters) = 20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67 +SHA256 ("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +SHA256 ("a") = ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb +SHA256 ("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad +SHA256 ("message digest") = f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650 +SHA256 ("abcdefghijklmnopqrstuvwxyz") = 71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73 +SHA256 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1 +SHA256 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0 +SHA256 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e +SHA256 (one million 'a' characters) = cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0 +SHA384 ("") = 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b +SHA384 ("a") = 54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31 +SHA384 ("abc") = cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 +SHA384 ("message digest") = 473ed35167ec1f5d8e550368a3db39be54639f828868e9454c239fc8b52e3c61dbd0d8b4de1390c256dcbb5d5fd99cd5 +SHA384 ("abcdefghijklmnopqrstuvwxyz") = feb67349df3db6f5924815d6c3dc133f091809213731fe5c7b5f4999e463479ff2877f5f2936fa63bb43784b12f3ebb4 +SHA384 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b +SHA384 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1761336e3f7cbfe51deb137f026f89e01a448e3b1fafa64039c1464ee8732f11a5341a6f41e0c202294736ed64db1a84 +SHA384 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = b12932b0627d1c060942f5447764155655bd4da0c9afa6dd9b9ef53129af1b8fb0195996d2de9ca0df9d821ffee67026 +SHA384 (one million 'a' characters) = 9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985 +SHA512 ("") = cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e +SHA512 ("a") = 1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75 +SHA512 ("abc") = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f +SHA512 ("message digest") = 107dbf389d9e9f71a3a95f6c055b9251bc5268c2be16d6c13492ea45b0199f3309e16455ab1e96118e8a905d5597b72038ddb372a89826046de66687bb420e7c +SHA512 ("abcdefghijklmnopqrstuvwxyz") = 4dbff86cc2ca1bae1e16468a05cb9881c97f1753bce3619034898faa1aabe429955a1bf8ec483d7421fe3c1646613a59ed5441fb0f321389f77f48a879c7b1f1 +SHA512 ("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") = 204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445 +SHA512 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 1e07be23c26a86ea37ea810c8ec7809352515a970e9253c26f536cfc7a9996c45c8370583e0a78fa4a90041d71a4ceab7423f19c71b9d5a3e01249f0bebd5894 +SHA512 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 72ec1ef1124a45b047e8b7c75a932195135bb61de24ec0d1914042246e0aec3a2354e093d76f3048b456764346900cb130d2a4fd5dd16abb5e30bcb850dee843 +SHA512 (one million 'a' characters) = e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b diff --git a/plugins/sudoers/sha2.h b/plugins/sudoers/sha2.h index 13d071a85..79dfc068d 100644 --- a/plugins/sudoers/sha2.h +++ b/plugins/sudoers/sha2.h @@ -49,13 +49,9 @@ typedef struct { void SHA224Init(SHA2_CTX *ctx); void SHA224Pad(SHA2_CTX *ctx); -void SHA224Transform(uint32_t state[8], const uint8_t buffer[SHA224_BLOCK_LENGTH]) - __attribute__((__bounded__(__minbytes__,1,32))) - __attribute__((__bounded__(__minbytes__,2,SHA224_BLOCK_LENGTH))); -void SHA224Update(SHA2_CTX *ctx, const uint8_t *data, size_t len) - __attribute__((__bounded__(__string__,2,3))); -void SHA224Final(uint8_t digest[SHA224_DIGEST_LENGTH], SHA2_CTX *ctx) - __attribute__((__bounded__(__minbytes__,1,SHA224_DIGEST_LENGTH))); +void SHA224Transform(uint32_t state[8], const uint8_t buffer[SHA224_BLOCK_LENGTH]); +void SHA224Update(SHA2_CTX *ctx, const uint8_t *data, size_t len); +void SHA224Final(uint8_t digest[SHA224_DIGEST_LENGTH], SHA2_CTX *ctx); void SHA256Init(SHA2_CTX *ctx); void SHA256Pad(SHA2_CTX *ctx); diff --git a/plugins/sudoers/sssd.c b/plugins/sudoers/sssd.c index e25c7d667..03f28628d 100644 --- a/plugins/sudoers/sssd.c +++ b/plugins/sudoers/sssd.c @@ -774,7 +774,7 @@ sudo_sss_check_command(struct sudo_sss_handle *handle, *allowed_args++ = '\0'; /* check the command like normal */ - if (command_matches(allowed_cmnd, allowed_args)) { + if (command_matches(allowed_cmnd, allowed_args, NULL)) { /* * If allowed (no bang) set ret but keep on checking. * If disallowed (bang), exit loop. diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c index 743d5ef94..20b1d2c30 100644 --- a/plugins/sudoers/toke.c +++ b/plugins/sudoers/toke.c @@ -306,79 +306,80 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 61 -#define YY_END_OF_BUFFER 62 -static yyconst short int yy_accept[622] = +#define YY_NUM_RULES 65 +#define YY_END_OF_BUFFER 66 +static yyconst short int yy_accept[635] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 62, 49, 57, 56, 55, 48, 60, 32, - 50, 51, 32, 52, 49, 49, 49, 49, 54, 53, - 60, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 60, 49, 49, 57, 60, 44, 44, 44, 44, - 44, 2, 60, 1, 49, 44, 44, 49, 17, 16, - 17, 16, 16, 60, 60, 60, 3, 9, 8, 9, - 4, 9, 5, 60, 13, 13, 13, 11, 12, 49, - 0, 57, 55, 0, 59, 0, 49, 34, 0, 32, - 0, 33, 0, 47, 47, 0, 49, 49, 0, 49, + 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, - 49, 49, 49, 0, 37, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 49, 58, 49, - 57, 0, 0, 0, 0, 0, 0, 49, 49, 49, - 49, 49, 2, 1, 0, 1, 45, 45, 0, 49, - 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, 49, 49, 49, - 49, 49, 0, 0, 37, 37, 44, 39, 44, 44, + 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, 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, - 49, 0, 0, 0, 0, 0, 0, 49, 49, 49, + 44, 53, 53, 0, 0, 0, 0, 0, 0, 53, - 49, 49, 0, 49, 10, 0, 49, 49, 49, 49, - 49, 49, 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, 49, 0, - 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, - 49, 49, 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, 49, 0, 0, 0, 0, 49, - 49, 49, 49, 49, 49, 49, 49, 0, 38, 0, + 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, - 37, 37, 37, 0, 0, 0, 37, 37, 37, 37, + 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, 44, 44, 44, 44, 44, 44, 49, 0, - 0, 0, 49, 49, 49, 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, 49, - 0, 0, 0, 49, 49, 49, 49, 35, 35, 35, - 35, 0, 37, 0, 37, 37, 37, 37, 37, 37, + 44, 44, 0, 24, 44, 44, 44, 44, 0, 23, + 0, 26, 53, 0, 0, 0, 53, 53, 53, 53, - 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, 46, 0, - 0, 0, 49, 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, 49, 0, 49, 49, 49, 36, 36, 36, - 36, 0, 0, 0, 0, 0, 37, 37, 37, 37, + 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, 43, 0, 30, 44, - 44, 44, 0, 0, 0, 18, 0, 21, 20, 0, - 0, 0, 0, 0, 20, 0, 49, 49, 49, 0, - 0, 0, 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, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 0, 28, 44, 44, 21, 0, 0, 20, 49, 49, - 49, 49, 49, 0, 0, 0, 0, 0, 37, 37, - 37, 37, 37, 37, 37, 37, 0, 31, 44, 0, - 49, 49, 49, 37, 37, 37, 37, 37, 37, 0, + 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, - 29, 0, 0, 19, 49, 49, 49, 49, 49, 37, - 37, 37, 37, 37, 35, 35, 35, 35, 35, 35, - 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 } ; static yyconst int yy_ec[256] = @@ -388,15 +389,15 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, 6, 1, 7, 1, 1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 22, 22, 23, 24, 1, 1, - 25, 26, 10, 27, 28, 29, 30, 31, 32, 29, - 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, - 36, 42, 43, 44, 45, 46, 47, 48, 49, 36, - 10, 50, 10, 1, 51, 1, 52, 53, 54, 55, + 19, 20, 21, 22, 23, 24, 25, 26, 1, 1, + 27, 28, 10, 29, 30, 31, 32, 33, 34, 31, + 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, + 38, 44, 45, 46, 47, 48, 49, 50, 51, 38, + 10, 52, 10, 1, 53, 1, 54, 55, 56, 57, - 56, 57, 58, 58, 59, 58, 58, 60, 61, 62, - 63, 58, 58, 64, 65, 66, 67, 58, 58, 58, - 58, 58, 1, 1, 1, 1, 1, 1, 1, 1, + 58, 59, 60, 61, 62, 60, 60, 63, 64, 65, + 66, 60, 60, 67, 68, 69, 70, 60, 60, 60, + 60, 60, 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, @@ -413,583 +414,628 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[68] = +static yyconst int yy_meta[71] = { 0, 1, 2, 3, 4, 5, 6, 1, 7, 7, 1, - 1, 8, 1, 9, 10, 11, 11, 11, 11, 11, - 11, 11, 11, 12, 13, 7, 1, 11, 11, 11, - 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, - 15, 16, 16, 16, 16, 16, 16, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15 + 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 } ; -static yyconst short int yy_base[686] = +static yyconst short int yy_base[714] = { 0, - 0, 66, 68, 76, 119, 124, 173, 239, 148, 197, - 82, 90, 2937, 2886, 2933, 3595, 2929, 3595, 165, 65, - 3595, 3595, 2882, 3595, 130, 293, 173, 146, 2907, 3595, - 3595, 350, 2893, 42, 402, 41, 2889, 74, 2888, 2895, - 2876, 458, 197, 57, 219, 482, 38, 207, 2854, 37, - 2851, 117, 249, 2880, 326, 2841, 2852, 105, 0, 3595, - 2875, 3595, 0, 469, 424, 143, 0, 2828, 3595, 48, - 3595, 223, 3595, 155, 2827, 202, 97, 3595, 252, 2817, - 504, 2855, 2852, 2852, 3595, 258, 504, 312, 526, 201, - 548, 2796, 557, 528, 2795, 582, 579, 614, 2820, 2829, + 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, - 593, 601, 266, 2818, 182, 656, 0, 2796, 2791, 2766, - 2761, 296, 2727, 2725, 2713, 2696, 2691, 426, 3595, 87, - 659, 2659, 2663, 2655, 2650, 2651, 257, 196, 318, 276, - 258, 288, 436, 2694, 631, 2693, 655, 2644, 690, 303, - 0, 2681, 168, 3595, 3595, 701, 352, 0, 2634, 723, - 3595, 3595, 2633, 447, 2632, 2676, 467, 461, 433, 2670, - 2659, 2600, 720, 733, 206, 755, 759, 771, 781, 791, - 828, 2581, 2570, 870, 453, 913, 955, 0, 2563, 2557, - 2540, 2523, 2530, 2541, 2536, 2516, 2502, 2496, 2475, 2473, - 277, 2442, 2436, 2402, 2404, 2407, 477, 436, 2405, 424, + 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, - 401, 292, 813, 488, 2454, 2450, 845, 438, 855, 890, - 756, 465, 2428, 2418, 930, 554, 2409, 2408, 463, 898, - 999, 939, 972, 1042, 980, 2403, 490, 2378, 500, 2380, - 2338, 2327, 2325, 2321, 2310, 0, 2305, 0, 508, 2274, - 2238, 2212, 2211, 2176, 515, 517, 615, 527, 529, 1018, - 1061, 1086, 2212, 2210, 1026, 2209, 2203, 2171, 2166, 565, - 1069, 754, 1096, 802, 1123, 0, 1106, 1134, 1151, 1159, - 1177, 1196, 601, 3595, 2136, 2137, 2127, 2131, 2090, 2090, - 2084, 2078, 0, 2062, 607, 2056, 2024, 2025, 573, 576, - 578, 676, 1204, 591, 1221, 1239, 1231, 2064, 2031, 2006, + 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, - 2004, 1274, 676, 1256, 1293, 1318, 682, 808, 815, 1301, - 819, 1328, 0, 1339, 1350, 1367, 1247, 1393, 1377, 1955, - 1915, 1888, 742, 692, 1884, 1891, 794, 980, 777, 1889, - 1856, 652, 945, 680, 820, 1411, 1420, 1436, 1842, 1824, - 1800, 1446, 1473, 1455, 1266, 1515, 1492, 1500, 1809, 1534, - 1559, 1544, 1009, 1052, 1569, 1571, 1580, 1590, 1601, 0, - 1612, 1623, 1590, 1463, 1666, 1642, 1762, 1737, 1740, 1108, - 3595, 1696, 1672, 1662, 1628, 1157, 3595, 1158, 3595, 774, - 1514, 1500, 730, 1152, 697, 913, 1650, 805, 1686, 1709, - 1695, 1516, 1500, 1721, 1222, 1730, 1474, 1744, 0, 830, + 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, - 1755, 1772, 1571, 1797, 1782, 1816, 1841, 1851, 1284, 1377, - 1832, 1861, 1861, 1872, 1883, 0, 1894, 1905, 1872, 1824, - 1924, 1414, 1400, 1375, 1336, 1331, 1159, 1483, 1312, 1274, - 1260, 1539, 606, 1730, 1238, 1949, 1959, 1969, 1984, 1256, - 1994, 2004, 2019, 1245, 1535, 1915, 1932, 1950, 2029, 0, - 874, 2040, 2057, 2065, 2082, 2101, 2109, 1214, 2126, 2136, - 2146, 1633, 1675, 2154, 924, 966, 2165, 0, 1003, 1092, - 1731, 1087, 1056, 1052, 2042, 3595, 2063, 3595, 1017, 2147, - 1126, 624, 1311, 2187, 2192, 2183, 1756, 2193, 2203, 2230, - 1979, 2238, 992, 2248, 2265, 2275, 830, 811, 1970, 2194, + 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, - 2281, 2214, 2291, 0, 1111, 2302, 2319, 2256, 2344, 2329, - 2362, 2371, 2387, 1807, 813, 1170, 0, 2065, 3595, 2228, - 738, 713, 680, 731, 1201, 3595, 900, 653, 2409, 2414, - 2419, 2424, 2418, 2436, 2445, 2446, 2459, 2469, 2480, 2494, - 2504, 2515, 569, 531, 2215, 2217, 2523, 2221, 2533, 0, - 1278, 2544, 2561, 2569, 2588, 519, 2597, 2606, 2615, 492, - 2304, 3595, 2393, 452, 3595, 1416, 2621, 2629, 2637, 1981, - 2647, 2657, 2672, 2682, 345, 2692, 2707, 2717, 305, 264, - 2303, 245, 191, 2725, 0, 1477, 2441, 3595, 2444, 1632, - 2735, 2745, 2755, 2770, 2780, 2790, 90, 0, 92, 2482, + 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, - 3595, 100, 1647, 3595, 2798, 1982, 2808, 2818, 2833, 3595, - 2843, 2853, 2763, 3595, 2868, 2876, 2884, 19, 2892, 2903, - 3595, 2953, 2969, 2985, 3001, 3017, 3033, 3049, 3065, 3081, - 3087, 3103, 3119, 1676, 3135, 3151, 3167, 3183, 3199, 3215, - 3231, 3237, 3244, 3260, 3276, 3282, 3289, 3295, 3301, 3307, - 3314, 3320, 3326, 3332, 3339, 3347, 3353, 3359, 3365, 3372, - 3380, 3386, 3392, 3399, 3407, 3413, 3421, 3428, 3436, 3442, - 3450, 3457, 3465, 3481, 3497, 3513, 3519, 3527, 3534, 3540, - 3548, 3554, 3562, 3578, 2159 + 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 } ; -static yyconst short int yy_def[686] = +static yyconst short int yy_def[714] = { 0, - 621, 1, 1, 1, 622, 622, 623, 623, 624, 624, - 625, 625, 621, 626, 621, 621, 621, 621, 627, 628, - 621, 621, 629, 621, 630, 626, 26, 26, 631, 621, - 621, 621, 32, 32, 32, 35, 35, 35, 35, 35, - 35, 626, 26, 626, 621, 627, 32, 32, 35, 35, - 35, 621, 621, 621, 632, 35, 35, 626, 633, 621, - 633, 621, 633, 621, 627, 621, 634, 635, 621, 635, - 621, 635, 621, 636, 637, 637, 637, 621, 621, 626, - 626, 621, 621, 638, 621, 639, 621, 628, 621, 640, - 628, 629, 629, 630, 641, 626, 626, 26, 631, 98, + 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, 642, 643, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 626, 621, 626, - 621, 621, 621, 621, 621, 621, 638, 626, 98, 626, - 626, 626, 621, 621, 621, 621, 632, 644, 626, 626, - 633, 633, 621, 621, 621, 639, 621, 634, 635, 635, - 621, 621, 635, 635, 637, 621, 637, 637, 621, 621, - 638, 645, 621, 621, 640, 640, 621, 626, 626, 626, - 98, 171, 646, 621, 647, 621, 106, 35, 35, 35, + 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, - 626, 621, 621, 621, 621, 621, 638, 626, 171, 626, + 35, 639, 639, 634, 634, 634, 634, 634, 652, 639, - 626, 626, 621, 626, 621, 645, 626, 626, 626, 626, - 626, 626, 648, 649, 649, 215, 650, 649, 651, 176, - 621, 221, 221, 621, 221, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 626, 621, - 621, 621, 621, 621, 638, 626, 626, 626, 626, 626, - 626, 626, 621, 652, 652, 255, 652, 653, 654, 655, - 621, 656, 224, 656, 656, 265, 656, 621, 268, 268, - 621, 268, 621, 621, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 626, 621, 621, 621, 638, 626, - 626, 626, 626, 626, 626, 626, 626, 657, 657, 658, + 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, - 659, 621, 621, 621, 621, 621, 660, 660, 661, 271, - 661, 661, 312, 661, 621, 315, 315, 621, 315, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 626, 621, - 621, 638, 626, 626, 626, 626, 626, 626, 621, 662, - 663, 302, 621, 343, 343, 621, 343, 621, 621, 621, - 621, 621, 621, 664, 664, 665, 318, 665, 665, 359, - 665, 621, 362, 362, 621, 362, 35, 35, 35, 621, - 621, 35, 35, 35, 35, 621, 621, 621, 621, 626, - 621, 621, 638, 626, 626, 626, 626, 626, 626, 626, - 626, 621, 666, 621, 667, 346, 667, 667, 398, 398, + 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, - 621, 401, 401, 621, 401, 621, 621, 621, 621, 668, - 668, 669, 365, 669, 669, 415, 669, 621, 418, 418, - 418, 35, 35, 35, 35, 35, 35, 35, 626, 621, - 621, 638, 626, 626, 626, 626, 626, 626, 626, 621, - 621, 621, 621, 670, 670, 671, 404, 671, 671, 449, - 449, 621, 452, 452, 621, 452, 621, 621, 621, 621, - 621, 621, 672, 672, 673, 673, 673, 467, 467, 35, - 35, 35, 35, 35, 621, 621, 621, 621, 621, 621, - 674, 638, 626, 675, 676, 626, 626, 626, 626, 626, - 626, 621, 621, 621, 621, 621, 621, 677, 677, 678, + 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, - 455, 678, 678, 503, 503, 621, 506, 506, 621, 506, - 621, 621, 621, 621, 679, 679, 35, 621, 621, 35, - 35, 35, 621, 674, 674, 621, 638, 626, 675, 675, - 675, 675, 621, 675, 676, 676, 626, 626, 626, 621, - 621, 621, 621, 680, 680, 681, 509, 681, 681, 549, - 549, 621, 552, 552, 552, 621, 621, 621, 621, 621, - 621, 621, 35, 35, 621, 638, 621, 621, 626, 626, - 626, 626, 626, 621, 621, 621, 621, 621, 621, 682, - 682, 683, 683, 683, 584, 584, 621, 621, 35, 684, - 626, 626, 626, 621, 621, 621, 621, 685, 685, 621, + 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, - 621, 684, 684, 621, 626, 626, 626, 626, 626, 621, - 621, 621, 621, 621, 626, 626, 626, 626, 626, 626, - 0, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621 + 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 } ; -static yyconst short int yy_nxt[3663] = +static yyconst short int yy_nxt[3996] = { 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 14, 23, 24, 14, 14, 25, 26, 27, 28, 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, 44, 14, 14, 45, 81, 52, - 89, 46, 151, 53, 107, 110, 115, 52, 107, 54, - 111, 53, 55, 76, 16, 77, 78, 54, 90, 109, - 55, 76, 16, 77, 78, 47, 48, 150, 128, 49, + 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, - 158, 113, 604, 131, 56, 394, 81, 50, 57, 35, - 51, 35, 56, 547, 91, 114, 57, 35, 133, 35, - 15, 60, 61, 120, 62, 15, 60, 61, 134, 62, - 62, 79, 58, 95, 95, 62, 81, 95, 95, 79, - 58, 191, 62, 63, 147, 119, 156, 62, 63, 15, - 16, 17, 69, 65, 81, 95, 154, 119, 70, 71, - 72, 102, 102, 102, 102, 102, 103, 85, 64, 147, - 119, 140, 73, 64, 15, 16, 17, 86, 65, 96, - 87, 87, 87, 87, 87, 87, 87, 87, 101, 101, - 101, 101, 101, 101, 101, 101, 174, 74, 15, 16, + 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, 621, 176, 89, 70, 71, 72, - 80, 621, 100, 100, 100, 100, 100, 100, 100, 100, - 121, 73, 66, 67, 67, 67, 67, 67, 67, 67, + 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, - 15, 16, 17, 107, 65, 81, 74, 152, 122, 123, - 166, 156, 124, 159, 160, 166, 155, 198, 394, 85, - 125, 135, 129, 126, 87, 87, 87, 87, 87, 87, - 87, 87, 150, 87, 87, 87, 87, 87, 87, 87, - 87, 172, 172, 172, 172, 172, 172, 547, 66, 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, - 67, 67, 67, 67, 67, 67, 97, 81, 98, 98, - 98, 98, 98, 98, 98, 98, 99, 621, 197, 201, - 100, 100, 100, 100, 100, 81, 81, 182, 501, 138, - 138, 80, 183, 138, 138, 621, 184, 81, 185, 239, - 200, 81, 81, 202, 100, 100, 100, 100, 100, 100, - 80, 138, 81, 147, 119, 246, 80, 204, 574, 80, - 80, 91, 80, 80, 80, 106, 106, 106, 106, 106, - 106, 106, 106, 99, 199, 139, 80, 106, 106, 106, - 106, 106, 107, 107, 107, 107, 108, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, + 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, - 107, 100, 100, 100, 100, 100, 100, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 107, 107, 107, - 107, 107, 107, 107, 107, 621, 85, 147, 119, 107, - 107, 107, 107, 107, 159, 160, 146, 133, 107, 621, - 621, 621, 621, 621, 621, 621, 621, 134, 147, 119, - 81, 207, 248, 80, 80, 80, 80, 80, 80, 118, - 119, 80, 80, 80, 158, 80, 80, 174, 157, 80, - 143, 119, 144, 81, 145, 81, 220, 174, 144, 85, - 145, 80, 80, 80, 85, 81, 220, 81, 99, 246, - 246, 273, 145, 145, 86, 589, 150, 87, 87, 87, + 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, - 87, 87, 87, 87, 87, 80, 174, 80, 80, 80, - 156, 80, 80, 274, 81, 80, 156, 85, 145, 87, - 87, 87, 87, 87, 87, 87, 87, 80, 80, 80, - 245, 95, 95, 174, 276, 95, 95, 81, 163, 277, - 127, 164, 164, 164, 164, 164, 164, 164, 164, 88, - 249, 88, 88, 95, 501, 88, 88, 81, 92, 88, - 92, 92, 92, 285, 92, 92, 81, 290, 92, 257, - 257, 257, 88, 88, 289, 85, 81, 96, 81, 174, - 92, 92, 92, 94, 292, 80, 80, 94, 220, 80, - 80, 246, 447, 94, 168, 169, 170, 168, 168, 168, + 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, - 168, 168, 273, 333, 293, 94, 94, 80, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 274, 81, 85, 81, 81, 171, - 171, 171, 171, 171, 171, 171, 171, 334, 99, 332, - 81, 171, 171, 171, 171, 171, 87, 87, 87, 87, - 87, 87, 87, 87, 85, 81, 81, 483, 138, 138, - 121, 329, 138, 138, 81, 171, 171, 171, 171, 171, - 171, 177, 177, 177, 177, 177, 177, 177, 177, 99, - 138, 291, 527, 177, 177, 177, 177, 177, 122, 123, - 174, 137, 124, 80, 80, 137, 174, 80, 80, 220, + 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, - 125, 137, 81, 126, 139, 263, 383, 171, 171, 171, - 171, 171, 171, 137, 137, 80, 621, 621, 621, 621, - 621, 621, 621, 621, 149, 81, 372, 149, 149, 81, - 335, 373, 85, 526, 149, 164, 164, 164, 164, 164, - 164, 164, 164, 370, 565, 385, 81, 149, 164, 164, - 164, 164, 164, 164, 164, 164, 165, 564, 165, 165, - 95, 434, 165, 165, 95, 371, 165, 261, 174, 207, - 95, 208, 208, 208, 208, 208, 208, 263, 165, 165, - 165, 563, 95, 95, 207, 432, 208, 208, 208, 208, - 208, 208, 208, 208, 207, 376, 209, 209, 209, 209, + 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, - 209, 209, 209, 209, 207, 81, 210, 210, 210, 210, - 210, 211, 208, 208, 138, 621, 174, 377, 138, 387, - 81, 261, 174, 81, 138, 263, 81, 174, 261, 174, - 81, 263, 621, 174, 447, 380, 138, 138, 310, 429, - 81, 80, 310, 212, 212, 212, 212, 212, 212, 212, - 212, 444, 444, 396, 81, 212, 212, 212, 212, 212, - 250, 251, 252, 250, 250, 250, 250, 250, 207, 81, - 208, 208, 208, 208, 208, 208, 208, 208, 386, 212, - 212, 212, 212, 212, 212, 214, 215, 216, 216, 216, - 216, 216, 216, 217, 81, 498, 498, 218, 218, 218, + 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, - 218, 218, 85, 207, 81, 208, 208, 208, 208, 208, - 208, 208, 208, 225, 225, 225, 225, 225, 225, 225, - 225, 218, 218, 218, 218, 218, 218, 174, 221, 222, - 223, 221, 221, 221, 221, 221, 224, 261, 174, 81, - 225, 225, 225, 225, 225, 255, 255, 256, 257, 257, - 257, 257, 257, 217, 265, 265, 265, 265, 265, 265, - 265, 265, 81, 566, 225, 225, 225, 225, 225, 225, - 226, 226, 226, 226, 226, 226, 226, 226, 435, 621, - 174, 378, 226, 226, 226, 226, 226, 266, 266, 266, - 266, 266, 267, 621, 81, 264, 264, 264, 264, 264, + 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, - 264, 264, 264, 379, 384, 492, 212, 212, 212, 212, - 212, 212, 261, 174, 262, 262, 262, 262, 262, 262, - 262, 262, 263, 174, 515, 515, 264, 264, 264, 264, - 264, 293, 263, 294, 294, 294, 294, 294, 294, 294, - 294, 299, 299, 299, 299, 299, 299, 299, 299, 217, - 264, 264, 264, 264, 264, 264, 174, 268, 269, 270, - 268, 268, 268, 268, 268, 271, 174, 81, 523, 272, - 272, 272, 272, 272, 293, 310, 295, 295, 295, 295, - 295, 295, 295, 295, 304, 305, 306, 304, 304, 304, - 304, 304, 522, 272, 272, 272, 272, 272, 272, 293, + 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, - 521, 296, 296, 296, 296, 296, 297, 294, 294, 370, - 81, 272, 272, 272, 272, 272, 272, 272, 272, 261, - 174, 308, 308, 308, 308, 308, 308, 525, 526, 263, - 520, 371, 544, 544, 517, 81, 261, 174, 308, 308, - 308, 308, 308, 308, 308, 308, 263, 261, 174, 309, - 309, 309, 309, 309, 309, 309, 309, 310, 376, 378, - 475, 311, 311, 311, 311, 311, 312, 312, 312, 312, - 312, 312, 312, 312, 313, 313, 313, 313, 313, 314, - 377, 379, 476, 261, 174, 311, 311, 311, 311, 311, - 311, 174, 315, 316, 317, 315, 315, 315, 315, 315, + 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, 81, 525, 526, 319, 319, 319, 319, 319, 621, - 433, 311, 311, 311, 311, 311, 311, 311, 311, 336, - 337, 338, 336, 336, 336, 336, 336, 457, 319, 319, - 319, 319, 319, 319, 293, 394, 294, 294, 294, 294, - 294, 294, 294, 294, 293, 396, 294, 294, 294, 294, - 294, 294, 293, 81, 294, 294, 294, 294, 294, 294, - 294, 294, 360, 360, 360, 360, 360, 361, 396, 348, - 81, 349, 349, 349, 349, 349, 349, 349, 349, 342, - 81, 399, 399, 399, 399, 399, 400, 81, 81, 343, - 344, 345, 343, 343, 343, 343, 343, 346, 174, 580, + 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, - 580, 347, 347, 347, 347, 347, 348, 310, 350, 350, - 350, 350, 350, 350, 350, 350, 319, 319, 319, 319, - 319, 319, 319, 319, 480, 347, 347, 347, 347, 347, - 347, 348, 479, 351, 351, 351, 351, 351, 352, 349, - 349, 261, 174, 355, 355, 355, 355, 355, 355, 355, - 355, 310, 261, 174, 355, 355, 355, 355, 355, 355, - 81, 81, 310, 261, 174, 356, 356, 356, 356, 356, - 356, 356, 356, 357, 474, 528, 473, 358, 358, 358, - 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, - 621, 174, 358, 358, 358, 358, 358, 358, 358, 358, + 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, - 357, 358, 358, 358, 358, 358, 358, 174, 362, 363, - 364, 362, 362, 362, 362, 362, 365, 590, 85, 472, - 366, 366, 366, 366, 366, 387, 388, 388, 388, 388, - 388, 388, 388, 388, 387, 389, 389, 389, 389, 389, - 389, 389, 389, 471, 366, 366, 366, 366, 366, 366, - 387, 390, 390, 390, 390, 390, 391, 388, 388, 470, - 81, 347, 347, 347, 347, 347, 347, 347, 347, 81, - 398, 398, 398, 398, 398, 398, 398, 398, 416, 416, - 416, 416, 416, 417, 477, 81, 394, 621, 395, 395, - 395, 395, 395, 395, 395, 395, 396, 396, 598, 598, + 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, - 397, 397, 397, 397, 397, 621, 478, 397, 397, 397, - 397, 397, 397, 397, 397, 406, 407, 408, 406, 406, - 406, 406, 406, 342, 397, 397, 397, 397, 397, 397, - 401, 402, 403, 401, 401, 401, 401, 401, 404, 259, - 481, 85, 405, 405, 405, 405, 405, 348, 394, 349, - 349, 349, 349, 349, 349, 349, 349, 348, 396, 349, - 349, 349, 349, 349, 349, 431, 405, 405, 405, 405, - 405, 405, 348, 430, 349, 349, 349, 349, 349, 349, - 349, 349, 261, 174, 261, 174, 450, 450, 450, 450, - 450, 451, 310, 482, 357, 366, 366, 366, 366, 366, + 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, - 366, 366, 366, 621, 174, 415, 415, 415, 415, 415, - 415, 415, 415, 357, 261, 174, 411, 411, 411, 411, - 411, 411, 411, 411, 357, 261, 174, 411, 411, 411, - 411, 411, 411, 603, 604, 357, 261, 174, 412, 412, - 412, 412, 412, 412, 412, 412, 413, 174, 603, 604, - 414, 414, 414, 414, 414, 621, 357, 414, 414, 414, - 414, 414, 414, 414, 414, 436, 437, 438, 439, 436, - 436, 436, 436, 428, 414, 414, 414, 414, 414, 414, - 174, 418, 419, 420, 418, 418, 418, 418, 418, 174, - 148, 148, 427, 421, 421, 421, 421, 421, 413, 81, + 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, - 387, 388, 388, 388, 388, 388, 388, 388, 388, 387, - 388, 388, 388, 388, 388, 388, 426, 421, 421, 421, - 421, 421, 421, 387, 388, 388, 388, 388, 388, 388, - 388, 388, 518, 484, 425, 81, 441, 442, 443, 441, - 441, 441, 441, 441, 81, 405, 405, 405, 405, 405, - 405, 405, 405, 484, 519, 484, 485, 394, 81, 445, - 445, 445, 445, 445, 445, 445, 445, 396, 394, 486, - 446, 446, 446, 446, 446, 446, 446, 446, 447, 81, - 424, 423, 448, 448, 448, 448, 448, 449, 449, 449, - 449, 449, 449, 449, 449, 621, 422, 448, 448, 448, + 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, - 448, 448, 448, 448, 448, 81, 448, 448, 448, 448, - 448, 448, 452, 453, 454, 452, 452, 452, 452, 452, - 455, 174, 348, 342, 456, 456, 456, 456, 456, 457, - 413, 458, 458, 458, 458, 458, 458, 458, 458, 468, - 468, 468, 468, 468, 469, 261, 174, 259, 456, 456, - 456, 456, 456, 456, 457, 357, 459, 459, 459, 459, - 459, 459, 459, 459, 457, 217, 460, 460, 460, 460, - 460, 461, 458, 458, 261, 174, 421, 421, 421, 421, - 421, 421, 421, 421, 413, 621, 174, 467, 467, 467, - 467, 467, 467, 467, 467, 413, 261, 174, 464, 464, + 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, - 464, 464, 464, 464, 464, 464, 413, 261, 174, 464, - 464, 464, 464, 464, 464, 382, 381, 413, 261, 174, - 465, 465, 465, 465, 465, 465, 465, 465, 394, 375, - 374, 369, 466, 466, 466, 466, 466, 621, 447, 466, - 466, 466, 466, 466, 466, 466, 466, 456, 456, 456, - 456, 456, 456, 456, 456, 368, 466, 466, 466, 466, - 466, 466, 486, 621, 487, 487, 487, 487, 487, 487, - 487, 487, 486, 447, 488, 488, 488, 488, 488, 488, - 488, 488, 486, 394, 489, 489, 489, 489, 489, 490, - 491, 491, 486, 447, 569, 605, 367, 486, 81, 491, + 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, - 491, 491, 487, 487, 487, 487, 487, 492, 81, 493, - 493, 493, 493, 493, 493, 493, 493, 492, 81, 494, - 494, 494, 494, 494, 494, 494, 494, 342, 81, 259, - 81, 81, 492, 81, 495, 495, 495, 495, 495, 496, - 493, 493, 394, 475, 499, 499, 499, 499, 499, 499, - 499, 499, 447, 394, 217, 500, 500, 500, 500, 500, - 500, 500, 500, 501, 477, 476, 518, 502, 502, 502, - 502, 502, 503, 503, 503, 503, 503, 503, 503, 503, - 504, 504, 504, 504, 504, 505, 478, 217, 519, 286, - 331, 502, 502, 502, 502, 502, 502, 506, 507, 508, + 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, - 506, 506, 506, 506, 506, 509, 330, 328, 327, 510, - 510, 510, 510, 510, 621, 326, 502, 502, 502, 502, - 502, 502, 502, 502, 511, 512, 513, 511, 511, 511, - 511, 511, 325, 510, 510, 510, 510, 510, 510, 457, - 324, 458, 458, 458, 458, 458, 458, 458, 458, 457, - 484, 458, 458, 458, 458, 458, 458, 458, 458, 457, - 323, 458, 458, 458, 458, 458, 458, 261, 174, 614, - 484, 322, 484, 484, 614, 321, 320, 413, 261, 174, - 516, 516, 516, 516, 516, 516, 516, 516, 530, 302, - 531, 532, 533, 530, 259, 531, 532, 533, 537, 538, + 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, - 539, 537, 537, 537, 537, 537, 486, 394, 487, 487, - 487, 487, 487, 487, 487, 487, 486, 501, 487, 487, - 487, 487, 487, 487, 487, 487, 217, 621, 394, 561, - 394, 298, 81, 217, 621, 105, 534, 501, 501, 286, - 547, 536, 81, 486, 547, 487, 487, 487, 487, 487, - 487, 562, 81, 540, 541, 542, 540, 540, 540, 540, - 540, 492, 288, 493, 493, 493, 493, 493, 493, 493, - 493, 550, 550, 550, 550, 550, 551, 286, 492, 81, - 493, 493, 493, 493, 493, 493, 493, 493, 492, 287, - 493, 493, 493, 493, 493, 493, 510, 510, 510, 510, + 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, - 510, 510, 510, 510, 394, 561, 545, 545, 545, 545, - 545, 545, 545, 545, 501, 394, 394, 546, 546, 546, - 546, 546, 546, 546, 546, 547, 547, 562, 286, 548, - 548, 548, 548, 548, 549, 549, 549, 549, 549, 549, - 549, 549, 621, 284, 548, 548, 548, 548, 548, 548, - 548, 548, 283, 548, 548, 548, 548, 548, 548, 552, - 553, 554, 552, 552, 552, 552, 552, 282, 281, 280, - 279, 555, 555, 555, 555, 555, 174, 556, 556, 556, - 556, 556, 556, 556, 556, 174, 557, 557, 557, 557, - 557, 557, 557, 557, 587, 555, 555, 555, 555, 555, + 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, - 555, 174, 558, 558, 558, 558, 558, 559, 556, 556, - 621, 278, 621, 621, 621, 530, 588, 531, 532, 533, - 621, 275, 531, 532, 533, 621, 99, 621, 621, 533, - 567, 217, 259, 568, 568, 568, 568, 568, 568, 568, - 568, 217, 587, 529, 529, 600, 621, 529, 621, 621, - 621, 105, 85, 535, 535, 205, 247, 535, 534, 529, - 529, 529, 244, 534, 588, 243, 242, 601, 534, 535, - 535, 535, 569, 534, 570, 570, 570, 570, 570, 570, - 570, 570, 569, 600, 571, 571, 571, 571, 571, 571, - 571, 571, 241, 569, 536, 572, 572, 572, 572, 572, + 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, - 573, 570, 570, 240, 238, 601, 237, 574, 81, 575, - 575, 575, 575, 575, 575, 575, 575, 574, 81, 576, - 576, 576, 576, 576, 576, 576, 576, 236, 574, 81, - 577, 577, 577, 577, 577, 578, 575, 575, 555, 555, - 555, 555, 555, 555, 555, 555, 394, 235, 581, 581, - 581, 581, 581, 581, 581, 581, 547, 394, 234, 582, - 582, 582, 582, 582, 582, 582, 582, 233, 232, 231, - 230, 583, 583, 583, 583, 583, 584, 584, 584, 584, - 584, 584, 584, 584, 585, 585, 585, 585, 585, 586, - 229, 228, 227, 105, 97, 583, 583, 583, 583, 583, + 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, 621, 85, 583, 583, 583, 583, 583, 583, 583, - 583, 174, 556, 556, 556, 556, 556, 556, 556, 556, - 174, 556, 556, 556, 556, 556, 556, 556, 556, 174, - 556, 556, 556, 556, 556, 556, 568, 568, 568, 568, - 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 568, 591, 592, 593, 591, 591, 591, 591, 591, - 569, 85, 570, 570, 570, 570, 570, 570, 570, 570, - 569, 205, 570, 570, 570, 570, 570, 570, 570, 570, - 155, 156, 150, 150, 142, 569, 81, 570, 570, 570, - 570, 570, 570, 203, 136, 136, 81, 594, 595, 596, + 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, - 594, 594, 594, 594, 594, 574, 81, 575, 575, 575, - 575, 575, 575, 575, 575, 196, 195, 194, 193, 192, - 574, 81, 575, 575, 575, 575, 575, 575, 575, 575, - 574, 190, 575, 575, 575, 575, 575, 575, 394, 189, - 599, 599, 599, 599, 599, 599, 599, 599, 605, 188, - 606, 606, 606, 606, 606, 606, 606, 606, 605, 187, - 607, 607, 607, 607, 607, 607, 607, 607, 605, 186, - 608, 608, 608, 608, 608, 609, 606, 606, 610, 610, - 610, 610, 610, 610, 81, 610, 610, 610, 610, 610, - 610, 610, 610, 181, 81, 611, 611, 611, 611, 611, + 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, - 611, 611, 611, 180, 81, 612, 612, 612, 612, 612, - 613, 610, 610, 615, 616, 617, 615, 615, 615, 615, - 615, 605, 179, 606, 606, 606, 606, 606, 606, 606, - 606, 605, 178, 606, 606, 606, 606, 606, 606, 606, - 606, 105, 80, 105, 167, 93, 605, 81, 606, 606, - 606, 606, 606, 606, 85, 83, 82, 81, 610, 610, - 610, 610, 610, 610, 610, 610, 81, 81, 610, 610, - 610, 610, 610, 610, 610, 610, 156, 150, 142, 113, - 111, 136, 81, 618, 618, 618, 618, 618, 618, 618, - 618, 615, 615, 615, 615, 615, 615, 615, 615, 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, 620, 618, 618, 618, 618, 618, - 618, 618, 618, 618, 618, 132, 130, 81, 618, 618, - 618, 618, 618, 618, 117, 81, 116, 115, 112, 107, - 105, 93, 83, 81, 82, 81, 621, 621, 621, 621, - 621, 81, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 81, 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, 68, 68, 68, 68, 68, + 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, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 80, 621, 621, - 621, 621, 621, 621, 621, 80, 80, 80, 621, 621, + 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, 88, - 621, 621, 621, 621, 88, 621, 621, 88, 88, 88, - 88, 621, 88, 88, 88, 92, 621, 621, 621, 621, - 621, 621, 621, 92, 92, 92, 621, 621, 92, 92, - 92, 94, 621, 621, 94, 94, 621, 94, 621, 94, - 94, 94, 621, 621, 94, 94, 94, 104, 104, 621, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 88, 634, 634, 634, 634, 88, 634, 634, 88, - 621, 621, 104, 137, 621, 621, 137, 137, 621, 137, - 621, 137, 137, 137, 621, 621, 137, 137, 137, 141, - 621, 621, 141, 141, 621, 141, 621, 141, 141, 141, - 621, 141, 621, 141, 141, 149, 621, 621, 149, 621, - 621, 149, 621, 149, 149, 149, 149, 621, 149, 149, - 149, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 155, 155, 621, - 155, 621, 155, 155, 155, 155, 155, 155, 155, 155, - 155, 155, 155, 161, 161, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, + 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, - 162, 621, 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 165, 621, 621, 621, 621, - 165, 621, 621, 165, 165, 165, 621, 621, 165, 165, - 165, 95, 621, 621, 95, 95, 621, 95, 621, 95, - 95, 95, 621, 621, 95, 95, 95, 173, 173, 621, - 621, 621, 173, 175, 175, 175, 621, 621, 621, 175, - 138, 621, 621, 138, 138, 621, 138, 621, 138, 138, - 138, 621, 621, 138, 138, 138, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 213, 213, 621, 621, 621, 213, 219, 219, + 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, - 219, 621, 621, 621, 219, 253, 253, 621, 621, 621, - 253, 254, 254, 621, 621, 621, 254, 258, 258, 621, - 621, 621, 258, 260, 260, 260, 621, 621, 621, 260, - 298, 298, 621, 621, 621, 298, 300, 300, 621, 621, - 621, 300, 301, 301, 621, 621, 621, 301, 303, 303, - 303, 621, 621, 621, 303, 307, 307, 307, 307, 621, - 621, 621, 307, 339, 339, 621, 621, 621, 339, 340, - 340, 621, 621, 621, 340, 341, 341, 621, 621, 621, - 341, 353, 353, 353, 621, 621, 621, 353, 354, 354, - 354, 354, 621, 621, 621, 354, 392, 392, 621, 621, + 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, + 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, - 621, 392, 393, 393, 621, 621, 621, 393, 409, 409, - 409, 621, 621, 621, 409, 410, 410, 410, 410, 621, - 621, 621, 410, 440, 440, 621, 621, 621, 440, 444, - 621, 444, 444, 621, 621, 621, 444, 462, 462, 462, - 621, 621, 621, 462, 463, 463, 463, 463, 621, 621, - 621, 463, 497, 497, 621, 621, 621, 497, 498, 621, - 498, 498, 621, 621, 621, 498, 514, 514, 514, 621, - 621, 621, 514, 515, 515, 515, 621, 621, 621, 621, - 515, 524, 524, 524, 524, 524, 524, 524, 524, 524, - 524, 524, 524, 524, 524, 524, 524, 529, 529, 621, + 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, - 529, 529, 529, 621, 621, 529, 529, 529, 621, 621, - 529, 529, 529, 535, 535, 621, 535, 535, 535, 621, - 621, 535, 535, 535, 621, 621, 535, 535, 535, 543, - 543, 621, 621, 621, 543, 544, 621, 544, 544, 621, - 621, 621, 544, 560, 560, 621, 621, 621, 621, 560, - 579, 579, 621, 621, 621, 579, 580, 621, 580, 580, - 621, 621, 621, 580, 597, 597, 621, 621, 621, 597, - 598, 621, 598, 621, 621, 621, 621, 598, 602, 602, - 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, - 602, 602, 602, 602, 13, 621, 621, 621, 621, 621, + 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 - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621 } ; -static yyconst short int yy_chk[3663] = +static yyconst short int yy_chk[3996] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -997,403 +1043,440 @@ static yyconst short int yy_chk[3663] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 618, 3, - 20, 2, 70, 3, 47, 36, 50, 4, 34, 3, - 36, 4, 3, 11, 11, 11, 11, 4, 20, 34, - 4, 12, 12, 12, 12, 2, 2, 70, 47, 2, + 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, - 77, 38, 602, 50, 3, 599, 44, 2, 3, 3, - 2, 3, 4, 597, 20, 38, 4, 4, 52, 4, - 5, 5, 5, 44, 5, 6, 6, 6, 52, 6, - 5, 11, 3, 25, 25, 6, 120, 25, 25, 12, - 4, 120, 5, 5, 66, 66, 77, 6, 6, 9, - 9, 9, 9, 9, 58, 25, 74, 74, 9, 9, - 9, 28, 28, 28, 28, 28, 28, 19, 5, 143, - 143, 58, 9, 6, 7, 7, 7, 19, 7, 25, - 19, 19, 19, 19, 19, 19, 19, 19, 27, 27, - 27, 27, 27, 27, 27, 27, 105, 9, 10, 10, + 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, 583, 105, 90, 10, 10, 10, - 43, 165, 43, 43, 43, 43, 43, 43, 43, 43, - 45, 10, 7, 7, 7, 7, 7, 7, 7, 7, + 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, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 48, 8, 128, 10, 72, 45, 45, - 90, 76, 45, 79, 79, 165, 79, 128, 582, 127, - 45, 53, 48, 45, 53, 53, 53, 53, 53, 53, - 53, 53, 72, 86, 86, 86, 86, 86, 86, 86, - 86, 103, 103, 103, 103, 103, 103, 580, 8, 8, + 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, + 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, - 8, 8, 8, 8, 8, 8, 26, 131, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 88, 127, 131, - 26, 26, 26, 26, 26, 130, 191, 112, 579, 55, - 55, 129, 112, 55, 55, 88, 112, 132, 112, 191, - 130, 202, 26, 132, 26, 26, 26, 26, 26, 26, - 32, 55, 140, 147, 147, 202, 32, 140, 575, 32, - 32, 88, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 129, 55, 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, 32, 32, 32, 32, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 65, 118, 118, 35, - 35, 35, 35, 35, 159, 159, 65, 133, 35, 65, - 65, 65, 65, 65, 65, 65, 65, 133, 154, 154, - 201, 208, 201, 35, 35, 35, 35, 35, 35, 42, - 42, 42, 42, 42, 158, 42, 42, 175, 157, 42, - 64, 64, 64, 200, 64, 118, 175, 219, 64, 197, - 64, 42, 42, 42, 46, 198, 219, 208, 212, 200, - 198, 227, 64, 64, 46, 564, 154, 46, 46, 46, + 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, - 46, 46, 46, 46, 46, 81, 560, 81, 81, 81, - 158, 81, 81, 227, 212, 81, 157, 245, 64, 87, - 87, 87, 87, 87, 87, 87, 87, 81, 81, 81, - 197, 94, 94, 556, 229, 94, 94, 204, 89, 229, - 46, 89, 89, 89, 89, 89, 89, 89, 89, 91, - 204, 91, 91, 94, 544, 91, 91, 239, 93, 91, - 93, 93, 93, 239, 93, 93, 246, 246, 93, 216, - 216, 216, 91, 91, 245, 289, 248, 94, 249, 260, - 93, 93, 93, 96, 249, 96, 96, 96, 260, 96, - 96, 248, 543, 96, 97, 97, 97, 97, 97, 97, + 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, - 97, 97, 273, 290, 294, 96, 96, 96, 101, 101, - 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, - 102, 102, 102, 102, 273, 290, 482, 291, 97, 98, - 98, 98, 98, 98, 98, 98, 98, 291, 247, 289, - 294, 98, 98, 98, 98, 98, 135, 135, 135, 135, - 135, 135, 135, 135, 332, 433, 285, 433, 137, 137, - 121, 285, 137, 137, 247, 98, 98, 98, 98, 98, - 98, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 137, 247, 482, 106, 106, 106, 106, 106, 121, 121, - 303, 139, 121, 139, 139, 139, 307, 139, 139, 303, + 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, - 121, 139, 528, 121, 137, 307, 332, 106, 106, 106, - 106, 106, 106, 139, 139, 139, 146, 146, 146, 146, - 146, 146, 146, 146, 150, 292, 324, 150, 150, 334, - 292, 324, 383, 524, 150, 163, 163, 163, 163, 163, - 163, 163, 163, 323, 523, 334, 385, 150, 164, 164, - 164, 164, 164, 164, 164, 164, 166, 522, 166, 166, - 167, 385, 166, 166, 167, 323, 166, 262, 262, 211, - 167, 211, 211, 211, 211, 211, 211, 262, 166, 166, - 166, 521, 167, 167, 168, 383, 168, 168, 168, 168, - 168, 168, 168, 168, 169, 327, 169, 169, 169, 169, + 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, - 169, 169, 169, 169, 170, 211, 170, 170, 170, 170, - 170, 170, 170, 170, 203, 264, 264, 327, 203, 388, - 168, 308, 308, 380, 203, 264, 329, 515, 309, 309, - 169, 308, 311, 311, 498, 329, 203, 203, 309, 380, - 170, 171, 311, 171, 171, 171, 171, 171, 171, 171, - 171, 400, 400, 497, 388, 171, 171, 171, 171, 171, - 207, 207, 207, 207, 207, 207, 207, 207, 209, 335, - 209, 209, 209, 209, 209, 209, 209, 209, 335, 171, - 171, 171, 171, 171, 171, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 207, 451, 451, 174, 174, 174, + 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, - 174, 174, 527, 210, 209, 210, 210, 210, 210, 210, - 210, 210, 210, 220, 220, 220, 220, 220, 220, 220, - 220, 174, 174, 174, 174, 174, 174, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 465, 465, 210, - 176, 176, 176, 176, 176, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 222, 222, 222, 222, 222, 222, - 222, 222, 386, 527, 176, 176, 176, 176, 176, 176, - 177, 177, 177, 177, 177, 177, 177, 177, 386, 466, - 466, 328, 177, 177, 177, 177, 177, 223, 223, 223, - 223, 223, 223, 225, 333, 225, 225, 225, 225, 225, + 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, - 225, 225, 225, 328, 333, 493, 177, 177, 177, 177, - 177, 177, 221, 221, 221, 221, 221, 221, 221, 221, - 221, 221, 221, 353, 469, 469, 221, 221, 221, 221, - 221, 250, 353, 250, 250, 250, 250, 250, 250, 250, - 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 221, 221, 221, 221, 221, 221, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 354, 250, 479, 224, - 224, 224, 224, 224, 251, 354, 251, 251, 251, 251, - 251, 251, 251, 251, 261, 261, 261, 261, 261, 261, - 261, 261, 474, 224, 224, 224, 224, 224, 224, 252, + 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, - 473, 252, 252, 252, 252, 252, 252, 252, 252, 370, - 251, 263, 263, 263, 263, 263, 263, 263, 263, 267, - 267, 267, 267, 267, 267, 267, 267, 481, 481, 267, - 472, 370, 505, 505, 470, 252, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 376, 378, - 427, 268, 268, 268, 268, 268, 269, 269, 269, 269, - 269, 269, 269, 269, 270, 270, 270, 270, 270, 270, - 376, 378, 427, 516, 516, 268, 268, 268, 268, 268, - 268, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 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, - 271, 384, 525, 525, 271, 271, 271, 271, 271, 272, - 384, 272, 272, 272, 272, 272, 272, 272, 272, 293, - 293, 293, 293, 293, 293, 293, 293, 458, 271, 271, - 271, 271, 271, 271, 295, 395, 295, 295, 295, 295, - 295, 295, 295, 295, 297, 395, 297, 297, 297, 297, - 297, 297, 296, 293, 296, 296, 296, 296, 296, 296, - 296, 296, 317, 317, 317, 317, 317, 317, 444, 304, - 295, 304, 304, 304, 304, 304, 304, 304, 304, 440, - 297, 345, 345, 345, 345, 345, 345, 435, 296, 302, - 302, 302, 302, 302, 302, 302, 302, 302, 409, 551, + 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, - 551, 302, 302, 302, 302, 302, 305, 409, 305, 305, - 305, 305, 305, 305, 305, 305, 310, 310, 310, 310, - 310, 310, 310, 310, 431, 302, 302, 302, 302, 302, - 302, 306, 430, 306, 306, 306, 306, 306, 306, 306, - 306, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 314, 314, 314, 314, 314, 314, 314, 314, - 483, 429, 314, 315, 315, 315, 315, 315, 315, 315, - 315, 315, 315, 315, 426, 483, 425, 315, 315, 315, - 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, - 319, 410, 319, 319, 319, 319, 319, 319, 319, 319, + 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, - 410, 315, 315, 315, 315, 315, 315, 318, 318, 318, - 318, 318, 318, 318, 318, 318, 318, 566, 566, 424, - 318, 318, 318, 318, 318, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 337, 337, 337, 337, 337, 337, - 337, 337, 337, 423, 318, 318, 318, 318, 318, 318, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 422, - 336, 342, 342, 342, 342, 342, 342, 342, 342, 337, - 344, 344, 344, 344, 344, 344, 344, 344, 364, 364, - 364, 364, 364, 364, 428, 338, 343, 397, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 397, 586, 586, + 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, - 343, 343, 343, 343, 343, 347, 428, 347, 347, 347, - 347, 347, 347, 347, 347, 348, 348, 348, 348, 348, - 348, 348, 348, 393, 343, 343, 343, 343, 343, 343, - 346, 346, 346, 346, 346, 346, 346, 346, 346, 392, - 432, 432, 346, 346, 346, 346, 346, 350, 445, 350, - 350, 350, 350, 350, 350, 350, 350, 352, 445, 352, - 352, 352, 352, 352, 352, 382, 346, 346, 346, 346, - 346, 346, 351, 381, 351, 351, 351, 351, 351, 351, - 351, 351, 355, 355, 356, 356, 403, 403, 403, 403, - 403, 403, 355, 432, 356, 357, 357, 357, 357, 357, + 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, - 357, 357, 357, 358, 358, 363, 363, 363, 363, 363, - 363, 363, 363, 358, 359, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 361, 361, 361, 361, 361, - 361, 361, 361, 590, 590, 361, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 462, 603, 603, - 362, 362, 362, 362, 362, 366, 462, 366, 366, 366, - 366, 366, 366, 366, 366, 387, 387, 387, 387, 387, - 387, 387, 387, 375, 362, 362, 362, 362, 362, 362, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 463, - 634, 634, 374, 365, 365, 365, 365, 365, 463, 387, + 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, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 391, - 391, 391, 391, 391, 391, 391, 373, 365, 365, 365, - 365, 365, 365, 390, 390, 390, 390, 390, 390, 390, - 390, 390, 471, 434, 372, 389, 394, 394, 394, 394, - 394, 394, 394, 394, 391, 396, 396, 396, 396, 396, - 396, 396, 396, 434, 471, 434, 434, 398, 390, 398, - 398, 398, 398, 398, 398, 398, 398, 398, 401, 487, - 401, 401, 401, 401, 401, 401, 401, 401, 401, 434, - 369, 368, 401, 401, 401, 401, 401, 402, 402, 402, - 402, 402, 402, 402, 402, 405, 367, 405, 405, 405, + 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, - 405, 405, 405, 405, 405, 487, 401, 401, 401, 401, - 401, 401, 404, 404, 404, 404, 404, 404, 404, 404, - 404, 514, 349, 341, 404, 404, 404, 404, 404, 406, - 514, 406, 406, 406, 406, 406, 406, 406, 406, 420, - 420, 420, 420, 420, 420, 411, 411, 340, 404, 404, - 404, 404, 404, 404, 407, 411, 407, 407, 407, 407, - 407, 407, 407, 407, 408, 339, 408, 408, 408, 408, - 408, 408, 408, 408, 412, 412, 413, 413, 413, 413, - 413, 413, 413, 413, 412, 414, 414, 419, 419, 419, - 419, 419, 419, 419, 419, 414, 415, 415, 415, 415, + 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, - 415, 415, 415, 415, 415, 415, 415, 417, 417, 417, - 417, 417, 417, 417, 417, 331, 330, 417, 418, 418, - 418, 418, 418, 418, 418, 418, 418, 418, 446, 326, - 325, 322, 418, 418, 418, 418, 418, 421, 446, 421, - 421, 421, 421, 421, 421, 421, 421, 447, 447, 447, - 447, 447, 447, 447, 447, 321, 418, 418, 418, 418, - 418, 418, 436, 448, 436, 436, 436, 436, 436, 436, - 436, 436, 437, 448, 437, 437, 437, 437, 437, 437, - 437, 437, 438, 499, 438, 438, 438, 438, 438, 438, - 438, 438, 491, 499, 570, 606, 320, 439, 436, 439, + 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, - 439, 439, 439, 439, 439, 439, 439, 441, 437, 441, - 441, 441, 441, 441, 441, 441, 441, 442, 438, 442, - 442, 442, 442, 442, 442, 442, 442, 301, 491, 300, - 570, 606, 443, 439, 443, 443, 443, 443, 443, 443, - 443, 443, 449, 475, 449, 449, 449, 449, 449, 449, - 449, 449, 449, 452, 299, 452, 452, 452, 452, 452, - 452, 452, 452, 452, 477, 475, 518, 452, 452, 452, - 452, 452, 453, 453, 453, 453, 453, 453, 453, 453, - 454, 454, 454, 454, 454, 454, 477, 298, 518, 288, - 287, 452, 452, 452, 452, 452, 452, 455, 455, 455, + 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, - 455, 455, 455, 455, 455, 455, 286, 284, 282, 455, - 455, 455, 455, 455, 456, 281, 456, 456, 456, 456, - 456, 456, 456, 456, 457, 457, 457, 457, 457, 457, - 457, 457, 280, 455, 455, 455, 455, 455, 455, 459, - 279, 459, 459, 459, 459, 459, 459, 459, 459, 460, - 480, 460, 460, 460, 460, 460, 460, 460, 460, 461, - 278, 461, 461, 461, 461, 461, 461, 464, 464, 685, - 480, 277, 480, 480, 685, 276, 275, 464, 467, 467, - 467, 467, 467, 467, 467, 467, 467, 467, 484, 259, - 484, 484, 484, 485, 258, 485, 485, 485, 486, 486, + 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, - 486, 486, 486, 486, 486, 486, 488, 500, 488, 488, - 488, 488, 488, 488, 488, 488, 489, 500, 489, 489, - 489, 489, 489, 489, 489, 489, 257, 502, 545, 520, - 546, 256, 486, 254, 548, 253, 484, 502, 545, 244, - 546, 485, 488, 490, 548, 490, 490, 490, 490, 490, - 490, 520, 489, 492, 492, 492, 492, 492, 492, 492, - 492, 494, 243, 494, 494, 494, 494, 494, 494, 494, - 494, 508, 508, 508, 508, 508, 508, 242, 495, 490, - 495, 495, 495, 495, 495, 495, 495, 495, 496, 241, - 496, 496, 496, 496, 496, 496, 501, 501, 501, 501, + 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, - 501, 501, 501, 501, 503, 561, 503, 503, 503, 503, - 503, 503, 503, 503, 503, 506, 581, 506, 506, 506, - 506, 506, 506, 506, 506, 506, 581, 561, 240, 506, - 506, 506, 506, 506, 507, 507, 507, 507, 507, 507, - 507, 507, 510, 237, 510, 510, 510, 510, 510, 510, - 510, 510, 235, 506, 506, 506, 506, 506, 506, 509, - 509, 509, 509, 509, 509, 509, 509, 234, 233, 232, - 231, 509, 509, 509, 509, 509, 511, 511, 511, 511, - 511, 511, 511, 511, 511, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 563, 509, 509, 509, 509, 509, + 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, - 509, 513, 513, 513, 513, 513, 513, 513, 513, 513, - 529, 230, 529, 529, 529, 530, 563, 530, 530, 530, - 531, 228, 531, 531, 531, 532, 226, 532, 532, 532, - 533, 218, 217, 533, 533, 533, 533, 533, 533, 533, - 533, 214, 587, 534, 534, 589, 535, 534, 535, 535, - 535, 213, 206, 536, 536, 205, 199, 536, 529, 534, - 534, 534, 196, 530, 587, 195, 194, 589, 531, 536, - 536, 536, 537, 532, 537, 537, 537, 537, 537, 537, - 537, 537, 538, 600, 538, 538, 538, 538, 538, 538, - 538, 538, 193, 539, 535, 539, 539, 539, 539, 539, + 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, - 539, 539, 539, 192, 190, 600, 189, 540, 537, 540, - 540, 540, 540, 540, 540, 540, 540, 541, 538, 541, - 541, 541, 541, 541, 541, 541, 541, 188, 542, 539, - 542, 542, 542, 542, 542, 542, 542, 542, 547, 547, - 547, 547, 547, 547, 547, 547, 549, 187, 549, 549, - 549, 549, 549, 549, 549, 549, 549, 552, 186, 552, - 552, 552, 552, 552, 552, 552, 552, 185, 184, 183, - 182, 552, 552, 552, 552, 552, 553, 553, 553, 553, - 553, 553, 553, 553, 554, 554, 554, 554, 554, 554, - 181, 180, 179, 173, 172, 552, 552, 552, 552, 552, + 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, - 552, 555, 162, 555, 555, 555, 555, 555, 555, 555, - 555, 557, 557, 557, 557, 557, 557, 557, 557, 557, - 558, 558, 558, 558, 558, 558, 558, 558, 558, 559, - 559, 559, 559, 559, 559, 559, 567, 567, 567, 567, - 567, 567, 567, 567, 568, 568, 568, 568, 568, 568, - 568, 568, 569, 569, 569, 569, 569, 569, 569, 569, - 571, 161, 571, 571, 571, 571, 571, 571, 571, 571, - 572, 160, 572, 572, 572, 572, 572, 572, 572, 572, - 156, 155, 153, 149, 142, 573, 569, 573, 573, 573, - 573, 573, 573, 138, 136, 134, 571, 574, 574, 574, + 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, - 574, 574, 574, 574, 574, 576, 572, 576, 576, 576, - 576, 576, 576, 576, 576, 126, 125, 124, 123, 122, - 577, 573, 577, 577, 577, 577, 577, 577, 577, 577, - 578, 117, 578, 578, 578, 578, 578, 578, 584, 116, - 584, 584, 584, 584, 584, 584, 584, 584, 591, 115, - 591, 591, 591, 591, 591, 591, 591, 591, 592, 114, - 592, 592, 592, 592, 592, 592, 592, 592, 593, 113, - 593, 593, 593, 593, 593, 593, 593, 593, 613, 613, - 613, 613, 613, 613, 591, 594, 594, 594, 594, 594, - 594, 594, 594, 111, 592, 595, 595, 595, 595, 595, + 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, - 595, 595, 595, 110, 593, 596, 596, 596, 596, 596, - 596, 596, 596, 605, 605, 605, 605, 605, 605, 605, - 605, 607, 109, 607, 607, 607, 607, 607, 607, 607, - 607, 608, 108, 608, 608, 608, 608, 608, 608, 608, - 608, 104, 100, 99, 95, 92, 609, 605, 609, 609, - 609, 609, 609, 609, 84, 83, 82, 607, 611, 611, - 611, 611, 611, 611, 611, 611, 80, 608, 612, 612, - 612, 612, 612, 612, 612, 612, 75, 68, 61, 57, - 56, 54, 609, 615, 615, 615, 615, 615, 615, 615, - 615, 616, 616, 616, 616, 616, 616, 616, 616, 617, + 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, - 617, 617, 617, 617, 617, 617, 617, 619, 619, 619, - 619, 619, 619, 619, 619, 51, 49, 615, 620, 620, - 620, 620, 620, 620, 41, 616, 40, 39, 37, 33, - 29, 23, 17, 617, 15, 14, 13, 0, 0, 0, - 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 620, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 622, 622, 622, 622, 622, 622, 622, 623, - 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, - 623, 623, 623, 623, 623, 624, 624, 624, 624, 624, - 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, + 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, - 624, 625, 625, 625, 625, 625, 625, 625, 625, 625, - 625, 625, 625, 625, 625, 625, 625, 626, 0, 0, - 0, 0, 0, 0, 0, 626, 626, 626, 0, 0, - 626, 626, 626, 627, 627, 627, 627, 627, 627, 627, - 627, 627, 627, 627, 627, 627, 627, 627, 627, 628, - 0, 0, 0, 0, 628, 0, 0, 628, 628, 628, - 628, 0, 628, 628, 628, 629, 0, 0, 0, 0, - 0, 0, 0, 629, 629, 629, 0, 0, 629, 629, - 629, 630, 0, 0, 630, 630, 0, 630, 0, 630, - 630, 630, 0, 0, 630, 630, 630, 631, 631, 0, + 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, - 0, 0, 631, 632, 0, 0, 632, 632, 0, 632, - 0, 632, 632, 632, 0, 0, 632, 632, 632, 633, - 0, 0, 633, 633, 0, 633, 0, 633, 633, 633, - 0, 633, 0, 633, 633, 635, 0, 0, 635, 0, - 0, 635, 0, 635, 635, 635, 635, 0, 635, 635, 635, 636, 636, 636, 636, 636, 636, 636, 636, 636, - 636, 636, 636, 636, 636, 636, 636, 637, 637, 0, - 637, 0, 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, 639, + 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, - 639, 0, 639, 639, 639, 639, 639, 639, 639, 639, - 639, 639, 639, 639, 639, 640, 0, 0, 0, 0, - 640, 0, 0, 640, 640, 640, 0, 0, 640, 640, - 640, 641, 0, 0, 641, 641, 0, 641, 0, 641, - 641, 641, 0, 0, 641, 641, 641, 642, 642, 0, - 0, 0, 642, 643, 643, 643, 0, 0, 0, 643, - 644, 0, 0, 644, 644, 0, 644, 0, 644, 644, - 644, 0, 0, 644, 644, 644, 645, 645, 645, 645, - 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, - 645, 645, 646, 646, 0, 0, 0, 646, 647, 647, + 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, - 647, 0, 0, 0, 647, 648, 648, 0, 0, 0, - 648, 649, 649, 0, 0, 0, 649, 650, 650, 0, - 0, 0, 650, 651, 651, 651, 0, 0, 0, 651, - 652, 652, 0, 0, 0, 652, 653, 653, 0, 0, - 0, 653, 654, 654, 0, 0, 0, 654, 655, 655, - 655, 0, 0, 0, 655, 656, 656, 656, 656, 0, - 0, 0, 656, 657, 657, 0, 0, 0, 657, 658, - 658, 0, 0, 0, 658, 659, 659, 0, 0, 0, - 659, 660, 660, 660, 0, 0, 0, 660, 661, 661, - 661, 661, 0, 0, 0, 661, 662, 662, 0, 0, + 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, - 0, 662, 663, 663, 0, 0, 0, 663, 664, 664, - 664, 0, 0, 0, 664, 665, 665, 665, 665, 0, - 0, 0, 665, 666, 666, 0, 0, 0, 666, 667, - 0, 667, 667, 0, 0, 0, 667, 668, 668, 668, - 0, 0, 0, 668, 669, 669, 669, 669, 0, 0, - 0, 669, 670, 670, 0, 0, 0, 670, 671, 0, - 671, 671, 0, 0, 0, 671, 672, 672, 672, 0, - 0, 0, 672, 673, 673, 673, 0, 0, 0, 0, - 673, 674, 674, 674, 674, 674, 674, 674, 674, 674, - 674, 674, 674, 674, 674, 674, 674, 675, 675, 0, + 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, - 675, 675, 675, 0, 0, 675, 675, 675, 0, 0, - 675, 675, 675, 676, 676, 0, 676, 676, 676, 0, - 0, 676, 676, 676, 0, 0, 676, 676, 676, 677, - 677, 0, 0, 0, 677, 678, 0, 678, 678, 0, - 0, 0, 678, 679, 679, 0, 0, 0, 0, 679, - 680, 680, 0, 0, 0, 680, 681, 0, 681, 681, - 0, 0, 0, 681, 682, 682, 0, 0, 0, 682, - 683, 0, 683, 0, 0, 0, 0, 683, 684, 684, - 684, 684, 684, 684, 684, 684, 684, 684, 684, 684, - 684, 684, 684, 684, 621, 621, 621, 621, 621, 621, + 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 - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, - 621, 621 } ; static yy_state_type yy_last_accepting_state; @@ -1527,7 +1610,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print; #define INSTR 5 -#line 1530 "lex.sudoers.c" +#line 1613 "lex.sudoers.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -1683,7 +1766,7 @@ YY_DECL #line 132 "toke.l" -#line 1686 "lex.sudoers.c" +#line 1769 "lex.sudoers.c" if ( yy_init ) { @@ -1735,13 +1818,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 >= 622 ) + if ( yy_current_state >= 635 ) 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] != 3595 ); + while ( yy_base[yy_current_state] != 3925 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -2303,6 +2386,7 @@ case 45: YY_RULE_SETUP #line 532 "toke.l" { + /* XXX - no way to specify digest for command */ /* no command args allowed for Defaults!/path */ if (!fill_cmnd(sudoerstext, sudoersleng)) yyterminate(); @@ -2312,7 +2396,39 @@ YY_RULE_SETUP YY_BREAK case 46: YY_RULE_SETUP -#line 540 "toke.l" +#line 541 "toke.l" +{ + LEXTRACE("SHA224 "); + LEXRETURN(SHA224); + } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 546 "toke.l" +{ + LEXTRACE("SHA256 "); + LEXRETURN(SHA256); + } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 551 "toke.l" +{ + LEXTRACE("SHA384 "); + LEXRETURN(SHA384); + } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 556 "toke.l" +{ + LEXTRACE("SHA512 "); + LEXRETURN(SHA512); + } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 561 "toke.l" { BEGIN GOTCMND; LEXTRACE("COMMAND "); @@ -2320,9 +2436,9 @@ YY_RULE_SETUP yyterminate(); } /* sudo -e */ YY_BREAK -case 47: +case 51: YY_RULE_SETUP -#line 547 "toke.l" +#line 568 "toke.l" { /* directories can't have args... */ if (sudoerstext[sudoersleng - 1] == '/') { @@ -2338,9 +2454,9 @@ YY_RULE_SETUP } } /* a pathname */ YY_BREAK -case 48: +case 52: YY_RULE_SETUP -#line 562 "toke.l" +#line 583 "toke.l" { LEXTRACE("BEGINSTR "); sudoerslval.string = NULL; @@ -2348,9 +2464,9 @@ YY_RULE_SETUP BEGIN INSTR; } YY_BREAK -case 49: +case 53: YY_RULE_SETUP -#line 569 "toke.l" +#line 590 "toke.l" { /* a word */ if (!fill(sudoerstext, sudoersleng)) @@ -2359,49 +2475,49 @@ YY_RULE_SETUP LEXRETURN(WORD); } YY_BREAK -case 50: +case 54: YY_RULE_SETUP -#line 577 "toke.l" +#line 598 "toke.l" { LEXTRACE("( "); LEXRETURN('('); } YY_BREAK -case 51: +case 55: YY_RULE_SETUP -#line 582 "toke.l" +#line 603 "toke.l" { LEXTRACE(") "); LEXRETURN(')'); } YY_BREAK -case 52: +case 56: YY_RULE_SETUP -#line 587 "toke.l" +#line 608 "toke.l" { LEXTRACE(", "); LEXRETURN(','); } /* return ',' */ YY_BREAK -case 53: +case 57: YY_RULE_SETUP -#line 592 "toke.l" +#line 613 "toke.l" { LEXTRACE("= "); LEXRETURN('='); } /* return '=' */ YY_BREAK -case 54: +case 58: YY_RULE_SETUP -#line 597 "toke.l" +#line 618 "toke.l" { LEXTRACE(": "); LEXRETURN(':'); } /* return ':' */ YY_BREAK -case 55: +case 59: YY_RULE_SETUP -#line 602 "toke.l" +#line 623 "toke.l" { if (sudoersleng & 1) { LEXTRACE("!"); @@ -2409,9 +2525,9 @@ YY_RULE_SETUP } } YY_BREAK -case 56: +case 60: YY_RULE_SETUP -#line 609 "toke.l" +#line 630 "toke.l" { if (YY_START == INSTR) { LEXTRACE("ERROR "); @@ -2424,25 +2540,25 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* return newline */ YY_BREAK -case 57: +case 61: YY_RULE_SETUP -#line 621 "toke.l" +#line 642 "toke.l" { /* throw away space/tabs */ sawspace = true; /* but remember for fill_args */ } YY_BREAK -case 58: +case 62: YY_RULE_SETUP -#line 625 "toke.l" +#line 646 "toke.l" { sawspace = true; /* remember for fill_args */ sudolineno++; continued = true; } /* throw away EOL after \ */ YY_BREAK -case 59: +case 63: YY_RULE_SETUP -#line 631 "toke.l" +#line 652 "toke.l" { BEGIN INITIAL; sudolineno++; @@ -2451,9 +2567,9 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* comment, not uid/gid */ YY_BREAK -case 60: +case 64: YY_RULE_SETUP -#line 639 "toke.l" +#line 660 "toke.l" { LEXTRACE("ERROR "); LEXRETURN(ERROR); @@ -2465,7 +2581,7 @@ case YY_STATE_EOF(GOTCMND): case YY_STATE_EOF(STARTDEFS): case YY_STATE_EOF(INDEFS): case YY_STATE_EOF(INSTR): -#line 644 "toke.l" +#line 665 "toke.l" { if (YY_START != INITIAL) { BEGIN INITIAL; @@ -2476,12 +2592,12 @@ case YY_STATE_EOF(INSTR): yyterminate(); } YY_BREAK -case 61: +case 65: YY_RULE_SETUP -#line 654 "toke.l" +#line 675 "toke.l" ECHO; YY_BREAK -#line 2484 "lex.sudoers.c" +#line 2600 "lex.sudoers.c" case YY_END_OF_BUFFER: { @@ -2772,7 +2888,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 >= 622 ) + if ( yy_current_state >= 635 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2807,11 +2923,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 >= 622 ) + if ( yy_current_state >= 635 ) 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 == 621); + yy_is_jam = (yy_current_state == 634); return yy_is_jam ? 0 : yy_current_state; } @@ -3372,7 +3488,7 @@ int main() return 0; } #endif -#line 654 "toke.l" +#line 675 "toke.l" struct path_list { char *path; diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l index 012d3780a..b90bb77da 100644 --- a/plugins/sudoers/toke.l +++ b/plugins/sudoers/toke.l @@ -530,6 +530,7 @@ ALL { } ({PATH}|sudoedit) { + /* XXX - no way to specify digest for command */ /* no command args allowed for Defaults!/path */ if (!fill_cmnd(sudoerstext, sudoersleng)) yyterminate(); @@ -537,6 +538,26 @@ ALL { LEXRETURN(COMMAND); } +sha224 { + LEXTRACE("SHA224 "); + LEXRETURN(SHA224); + } + +sha256 { + LEXTRACE("SHA256 "); + LEXRETURN(SHA256); + } + +sha384 { + LEXTRACE("SHA384 "); + LEXRETURN(SHA384); + } + +sha512 { + LEXTRACE("SHA512 "); + LEXRETURN(SHA512); + } + sudoedit { BEGIN GOTCMND; LEXTRACE("COMMAND "); diff --git a/plugins/sudoers/toke_util.c b/plugins/sudoers/toke_util.c index e717e946f..703267cf3 100644 --- a/plugins/sudoers/toke_util.c +++ b/plugins/sudoers/toke_util.c @@ -57,51 +57,6 @@ static int arg_len = 0; static int arg_size = 0; -static int -hexchar(const char *s) -{ - int i, result = 0; - debug_decl(hexchar, SUDO_DEBUG_PARSER) - - s += 2; /* skip \\x */ - for (i = 0; i < 2; i++) { - switch (*s) { - case 'A': - case 'a': - result += 10; - break; - case 'B': - case 'b': - result += 11; - break; - case 'C': - case 'c': - result += 12; - break; - case 'D': - case 'd': - result += 13; - break; - case 'E': - case 'e': - result += 14; - break; - case 'F': - case 'f': - result += 15; - break; - default: - result += *s - '0'; - break; - } - if (i == 0) { - result *= 16; - s++; - } - } - debug_return_int(result); -} - bool fill_txt(const char *src, int len, int olen) { @@ -123,7 +78,7 @@ fill_txt(const char *src, int len, int olen) if (src[1] == 'x' && len >= 3 && isxdigit((unsigned char) src[2]) && isxdigit((unsigned char) src[3])) { - *dst++ = hexchar(src); + *dst++ = hexchar(src + 2); src += 4; len -= 3; } else {