From 3980f1531b7942faa05ae8986b544ac1fb6d8415 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Tue, 14 Feb 2017 15:56:34 -0700 Subject: [PATCH] Add support for command timeouts in sudoers. After the timeout, the command will be terminated. --- MANIFEST | 9 + doc/sudoers.cat | 28 +- doc/sudoers.man.in | 28 +- doc/sudoers.mdoc.in | 27 +- plugins/sudoers/Makefile.in | 14 +- plugins/sudoers/def_data.c | 4 + plugins/sudoers/def_data.h | 2 + plugins/sudoers/def_data.in | 3 + plugins/sudoers/defaults.c | 30 + plugins/sudoers/defaults.h | 2 + plugins/sudoers/gram.c | 604 ++-- plugins/sudoers/gram.h | 11 +- plugins/sudoers/gram.y | 50 +- plugins/sudoers/ldap.c | 2 + plugins/sudoers/mkdefaults | 1 + plugins/sudoers/parse.c | 17 +- plugins/sudoers/parse.h | 8 +- plugins/sudoers/policy.c | 6 +- plugins/sudoers/regress/sudoers/test17.in | 13 + .../sudoers/regress/sudoers/test17.json.ok | 180 + plugins/sudoers/regress/sudoers/test17.out.ok | 14 + .../sudoers/regress/sudoers/test17.toke.ok | 11 + plugins/sudoers/regress/sudoers/test18.in | 8 + .../sudoers/regress/sudoers/test18.json.ok | 0 plugins/sudoers/regress/sudoers/test18.out.ok | 6 + .../sudoers/regress/sudoers/test18.toke.ok | 10 + plugins/sudoers/testsudoers.c | 2 + plugins/sudoers/timeout.c | 113 + plugins/sudoers/toke.c | 3040 +++++++++-------- plugins/sudoers/toke.l | 5 + plugins/sudoers/visudo_json.c | 8 +- 31 files changed, 2437 insertions(+), 1819 deletions(-) create mode 100644 plugins/sudoers/regress/sudoers/test17.in create mode 100644 plugins/sudoers/regress/sudoers/test17.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test17.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test17.toke.ok create mode 100644 plugins/sudoers/regress/sudoers/test18.in create mode 100644 plugins/sudoers/regress/sudoers/test18.json.ok create mode 100644 plugins/sudoers/regress/sudoers/test18.out.ok create mode 100644 plugins/sudoers/regress/sudoers/test18.toke.ok create mode 100644 plugins/sudoers/timeout.c diff --git a/MANIFEST b/MANIFEST index 057f67b85..e14e0890c 100644 --- a/MANIFEST +++ b/MANIFEST @@ -407,6 +407,14 @@ plugins/sudoers/regress/sudoers/test16.in plugins/sudoers/regress/sudoers/test16.json.ok plugins/sudoers/regress/sudoers/test16.out.ok plugins/sudoers/regress/sudoers/test16.toke.ok +plugins/sudoers/regress/sudoers/test17.in +plugins/sudoers/regress/sudoers/test17.json.ok +plugins/sudoers/regress/sudoers/test17.out.ok +plugins/sudoers/regress/sudoers/test17.toke.ok +plugins/sudoers/regress/sudoers/test18.in +plugins/sudoers/regress/sudoers/test18.json.ok +plugins/sudoers/regress/sudoers/test18.out.ok +plugins/sudoers/regress/sudoers/test18.toke.ok plugins/sudoers/regress/sudoers/test2.in plugins/sudoers/regress/sudoers/test2.json.ok plugins/sudoers/regress/sudoers/test2.out.ok @@ -493,6 +501,7 @@ plugins/sudoers/sudoers_debug.h plugins/sudoers/sudoers_version.h plugins/sudoers/sudoreplay.c plugins/sudoers/testsudoers.c +plugins/sudoers/timeout.c plugins/sudoers/timestamp.c plugins/sudoers/timestr.c plugins/sudoers/toke.c diff --git a/doc/sudoers.cat b/doc/sudoers.cat index be615baab..9b783b56c 100644 --- a/doc/sudoers.cat +++ b/doc/sudoers.cat @@ -95,9 +95,9 @@ DDEESSCCRRIIPPTTIIOONN was used to authenticate, the terminal session ID, and a time stamp (using a monotonic clock if one is available). The user may then use ssuuddoo without a password for a short period of time (5 minutes unless - overridden by the _t_i_m_e_o_u_t option). By default, ssuuddooeerrss uses a separate - record for each tty, which means that a user's login sessions are - authenticated separately. The _t_t_y___t_i_c_k_e_t_s option can be disabled to + overridden by the _t_i_m_e_s_t_a_m_p___t_i_m_e_o_u_t option). By default, ssuuddooeerrss uses a + separate record for each tty, which means that a user's login sessions + are authenticated separately. The _t_t_y___t_i_c_k_e_t_s option can be disabled to force the use of a single time stamp for all of a user's sessions. LLooggggiinngg @@ -478,12 +478,15 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' - Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Tag_Spec) + Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec | + Tag_Spec) SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') + Timeout_Spec ::= 'TIMEOUT=timeout' + Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' | @@ -605,6 +608,16 @@ SSUUDDOOEERRSS FFIILLEE FFOORRMMAATT Privileges can be excluded from a set by prefixing the privilege name with either an `!' or `-' character. + TTiimmeeoouutt__SSppeecc + A command may have a timeout associated with it. If the timeout expires + before the command has exited, the command will be terminated. The + timeout may be specified in combinations of days, hours, minutes and + seconds. For example, a timeout of 7 days, 8 hours, 30 minutes and 10 + seconds would be written as 7d8h30m10s where the letter following a + number indicates the unit of time. Any of the days, minutes, hours or + seconds may be omitted. If a number is specified without a unit, seconds + is assumed. + TTaagg__SSppeecc A command may have zero or more tags associated with it. The following tag values are supported: EXEC, NOEXEC, FOLLOW, NOFOLLOW, LOG_INPUT, @@ -1422,6 +1435,13 @@ SSUUDDOOEERRSS OOPPTTIIOONNSS file descriptor at which to start closing. The default is 3. + command_timeout The maximum amount of time a command is allowed to run + before it is terminated. See the Timeout_Spec section + for a description of the timeout syntax. + + This setting is only supported by version 1.8.19 or + higher. + maxseq The maximum sequence number that will be substituted for the ``%{seq}'' escape in the I/O log file (see the _i_o_l_o_g___d_i_r description above for more information). diff --git a/doc/sudoers.man.in b/doc/sudoers.man.in index 399e8432a..0aa82c9c0 100644 --- a/doc/sudoers.man.in +++ b/doc/sudoers.man.in @@ -224,7 +224,7 @@ The user may then use without a password for a short period of time (\fR@timeout@\fR minutes unless overridden by the -\fItimeout\fR +\fItimestamp_timeout\fR option) \&. By default, @@ -986,12 +986,15 @@ Cmnd_Spec ::= Runas_Spec? Option_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' -Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Tag_Spec) +Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec | + Tag_Spec) SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') +Timeout_Spec ::= 'TIMEOUT=timeout' + Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' | @@ -1253,6 +1256,18 @@ name with either an or \(oq\-\(cq character. +.SS "Timeout_Spec" +A command may have a timeout associated with it. +If the timeout expires before the command has exited, the +command will be terminated. +The timeout may be specified in combinations of days, hours, +minutes and seconds. +For example, a timeout of 7 days, 8 hours, 30 minutes and +10 seconds would be written as +\fR7d8h30m10s\fR +where the letter following a number indicates the unit of time. +Any of the days, minutes, hours or seconds may be omitted. +If a number is specified without a unit, seconds is assumed. .SS "Tag_Spec" A command may have zero or more tags associated with it. The following tag values are supported: @@ -2988,6 +3003,15 @@ to start closing. The default is \fR3\fR. .TP 18n +command_timeout +The maximum amount of time a command is allowed to run before +it is terminated. +See the +\fRTimeout_Spec\fR +section for a description of the timeout syntax. +.sp +This setting is only supported by version 1.8.19 or higher. +.TP 18n maxseq The maximum sequence number that will be substituted for the \(Lq\fR%{seq}\fR\(Rq diff --git a/doc/sudoers.mdoc.in b/doc/sudoers.mdoc.in index 85eae4a52..4f923ae08 100644 --- a/doc/sudoers.mdoc.in +++ b/doc/sudoers.mdoc.in @@ -213,7 +213,7 @@ without a password for a short period of time .Po .Li @timeout@ minutes unless overridden by the -.Em timeout +.Em timestamp_timeout option .Pc . By default, @@ -939,12 +939,15 @@ Cmnd_Spec ::= Runas_Spec? Option_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' -Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Tag_Spec) +Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Timeout_Spec | + Tag_Spec) SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset') +Timeout_Spec ::= 'TIMEOUT=timeout' + Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' | 'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' | @@ -1176,6 +1179,18 @@ name with either an or .Ql \- character. +.Ss Timeout_Spec +A command may have a timeout associated with it. +If the timeout expires before the command has exited, the +command will be terminated. +The timeout may be specified in combinations of days, hours, +minutes and seconds. +For example, a timeout of 7 days, 8 hours, 30 minutes and +10 seconds would be written as +.Li 7d8h30m10s +where the letter following a number indicates the unit of time. +Any of the days, minutes, hours or seconds may be omitted. +If a number is specified without a unit, seconds is assumed. .Ss Tag_Spec A command may have zero or more tags associated with it. The following tag values are supported: @@ -2804,6 +2819,14 @@ option can be used to specify a different file descriptor at which to start closing. The default is .Li 3 . +.It command_timeout +The maximum amount of time a command is allowed to run before +it is terminated. +See the +.Li Timeout_Spec +section for a description of the timeout syntax. +.Pp +This setting is only supported by version 1.8.20 or higher. .It maxseq The maximum sequence number that will be substituted for the .Dq Li %{seq} diff --git a/plugins/sudoers/Makefile.in b/plugins/sudoers/Makefile.in index f36f9ef64..48e03f7a3 100644 --- a/plugins/sudoers/Makefile.in +++ b/plugins/sudoers/Makefile.in @@ -152,8 +152,8 @@ AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@ LIBPARSESUDOERS_OBJS = alias.lo audit.lo base64.lo defaults.lo hexchar.lo \ gram.lo match.lo match_addr.lo pwutil.lo pwutil_impl.lo \ - rcstr.lo redblack.lo sudoers_debug.lo timestr.lo \ - toke.lo toke_util.lo + rcstr.lo redblack.lo sudoers_debug.lo timeout.lo \ + timestr.lo toke.lo toke_util.lo SUDOERS_OBJS = $(AUTH_OBJS) boottime.lo check.lo editor.lo env.lo find_path.lo \ gc.lo goodpath.lo group_plugin.lo interfaces.lo iolog.lo \ @@ -1077,6 +1077,16 @@ testsudoers.o: $(srcdir)/testsudoers.c $(devdir)/def_data.h $(devdir)/gram.h \ $(srcdir)/sudoers_debug.h $(srcdir)/tsgetgrpw.h \ $(top_builddir)/config.h $(top_builddir)/pathnames.h $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/testsudoers.c +timeout.lo: $(srcdir)/timeout.c $(devdir)/def_data.h \ + $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ + $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ + $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \ + $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \ + $(incdir)/sudo_util.h $(srcdir)/defaults.h $(srcdir)/logging.h \ + $(srcdir)/parse.h $(srcdir)/sudo_nss.h $(srcdir)/sudoers.h \ + $(srcdir)/sudoers_debug.h $(top_builddir)/config.h \ + $(top_builddir)/pathnames.h + $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/timeout.c timestamp.lo: $(srcdir)/timestamp.c $(devdir)/def_data.h \ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ diff --git a/plugins/sudoers/def_data.c b/plugins/sudoers/def_data.c index 891aba2ad..3ac51d7e9 100644 --- a/plugins/sudoers/def_data.c +++ b/plugins/sudoers/def_data.c @@ -449,6 +449,10 @@ struct sudo_defs_types sudo_defs_table[] = { "ignore_unknown_defaults", T_FLAG, N_("Ignore unknown Defaults entries in sudoers instead of producing a warning"), NULL, + }, { + "command_timeout", T_TIMEOUT|T_BOOL, + N_("Time in seconds after which the command will be terminated: %u"), + NULL, }, { NULL, 0, NULL } diff --git a/plugins/sudoers/def_data.h b/plugins/sudoers/def_data.h index 2d8e17c19..3a5f5c660 100644 --- a/plugins/sudoers/def_data.h +++ b/plugins/sudoers/def_data.h @@ -208,6 +208,8 @@ #define def_fdexec (sudo_defs_table[I_FDEXEC].sd_un.tuple) #define I_IGNORE_UNKNOWN_DEFAULTS 104 #define def_ignore_unknown_defaults (sudo_defs_table[I_IGNORE_UNKNOWN_DEFAULTS].sd_un.flag) +#define I_COMMAND_TIMEOUT 105 +#define def_command_timeout (sudo_defs_table[I_COMMAND_TIMEOUT].sd_un.ival) enum def_tuple { never, diff --git a/plugins/sudoers/def_data.in b/plugins/sudoers/def_data.in index a4f662897..f6fa6c733 100644 --- a/plugins/sudoers/def_data.in +++ b/plugins/sudoers/def_data.in @@ -329,3 +329,6 @@ fdexec ignore_unknown_defaults T_FLAG "Ignore unknown Defaults entries in sudoers instead of producing a warning" +command_timeout + T_TIMEOUT|T_BOOL + "Time in seconds after which the command will be terminated: %u" diff --git a/plugins/sudoers/defaults.c b/plugins/sudoers/defaults.c index 869b684f2..897884772 100644 --- a/plugins/sudoers/defaults.c +++ b/plugins/sudoers/defaults.c @@ -101,6 +101,7 @@ static bool store_mode(const char *str, union sudo_defs_val *sd_un); static int store_str(const char *str, union sudo_defs_val *sd_un); static bool store_syslogfac(const char *str, union sudo_defs_val *sd_un); static bool store_syslogpri(const char *str, union sudo_defs_val *sd_un); +static bool store_timeout(const char *str, union sudo_defs_val *sd_un); static bool store_tuple(const char *str, union sudo_defs_val *sd_un, struct def_values *tuple_vals); static bool store_uint(const char *str, union sudo_defs_val *sd_un); static bool store_float(const char *str, union sudo_defs_val *sd_un); @@ -178,6 +179,13 @@ dump_defaults(void) } } break; + case T_TIMEOUT: + if (cur->sd_un.ival) { + sudo_printf(SUDO_CONV_INFO_MSG, desc, + cur->sd_un.ival); + sudo_printf(SUDO_CONV_INFO_MSG, "\n"); + } + break; case T_TUPLE: for (def = cur->values; def->sval; def++) { if (cur->sd_un.tuple == def->nval) { @@ -301,6 +309,9 @@ parse_default_entry(struct sudo_defs_types *def, const char *val, int op, case T_LIST: rc = store_list(val, sd_un, op); break; + case T_TIMEOUT: + rc = store_timeout(val, sd_un); + break; case T_TUPLE: rc = store_tuple(val, sd_un, def->values); break; @@ -986,6 +997,25 @@ store_mode(const char *str, union sudo_defs_val *sd_un) debug_return_bool(true); } +static bool +store_timeout(const char *str, union sudo_defs_val *sd_un) +{ + debug_decl(store_mode, SUDOERS_DEBUG_DEFAULTS) + + if (str == NULL) { + sd_un->ival = 0; + } else { + int seconds = parse_timeout(str); + if (seconds == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO|SUDO_DEBUG_LINENO, + "%s", str); + debug_return_bool(false); + } + sd_un->ival = seconds; + } + debug_return_bool(true); +} + static bool list_op(const char *str, size_t len, union sudo_defs_val *sd_un, enum list_ops op) diff --git a/plugins/sudoers/defaults.h b/plugins/sudoers/defaults.h index 163d3c64d..dda48dc42 100644 --- a/plugins/sudoers/defaults.h +++ b/plugins/sudoers/defaults.h @@ -99,6 +99,8 @@ struct early_default { #define T_TUPLE 0x009 #undef T_FLOAT #define T_FLOAT 0x010 +#undef T_TIMEOUT +#define T_TIMEOUT 0x020 #undef T_MASK #define T_MASK 0x0FF #undef T_BOOL diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c index 59996acc6..600780940 100644 --- a/plugins/sudoers/gram.c +++ b/plugins/sudoers/gram.c @@ -38,7 +38,7 @@ #define YYPREFIX "sudoers" #line 2 "gram.y" /* - * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2016 + * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2017 * Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any @@ -81,6 +81,8 @@ #if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__) # include #endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */ +#include +#include #include #include "sudoers.h" /* XXX */ @@ -104,12 +106,13 @@ struct userspec_list userspecs = TAILQ_HEAD_INITIALIZER(userspecs); /* * Local protoypes */ +static void init_options(struct command_options *opts); static bool add_defaults(int, struct member *, struct defaults *); static bool add_userspec(struct member *, struct privilege *); static struct defaults *new_default(char *, char *, short); static struct member *new_member(char *, int); static struct sudo_digest *new_digest(int, const char *); -#line 76 "gram.y" +#line 79 "gram.y" #ifndef YYSTYPE_DEFINED #define YYSTYPE_DEFINED typedef union { @@ -125,7 +128,7 @@ typedef union { int tok; } YYSTYPE; #endif /* YYSTYPE_DEFINED */ -#line 128 "gram.c" +#line 131 "gram.c" #define COMMAND 257 #define ALIAS 258 #define DEFVAR 259 @@ -164,11 +167,12 @@ typedef union { #define ROLE 292 #define PRIVS 293 #define LIMITPRIVS 294 -#define MYSELF 295 -#define SHA224_TOK 296 -#define SHA256_TOK 297 -#define SHA384_TOK 298 -#define SHA512_TOK 299 +#define CMND_TIMEOUT 295 +#define MYSELF 296 +#define SHA224_TOK 297 +#define SHA256_TOK 298 +#define SHA384_TOK 299 +#define SHA512_TOK 300 #define YYERRCODE 256 #if defined(__cplusplus) || defined(__STDC__) const short sudoerslhs[] = @@ -176,17 +180,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, + 0, 0, 29, 29, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 4, 4, 3, 3, 3, 3, 3, 21, 21, 20, 11, 11, 9, 9, - 9, 9, 9, 2, 2, 1, 27, 27, 27, 27, - 7, 7, 6, 6, 23, 24, 25, 26, 18, 18, - 19, 19, 19, 19, 19, 22, 22, 22, 22, 22, + 9, 9, 9, 2, 2, 1, 28, 28, 28, 28, + 7, 7, 6, 6, 27, 23, 24, 25, 26, 18, + 18, 19, 19, 19, 19, 19, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 5, 5, 5, 31, 31, 34, - 10, 10, 32, 32, 35, 8, 8, 33, 33, 36, - 30, 30, 37, 14, 14, 12, 12, 13, 13, 13, - 13, 13, 17, 17, 15, 15, 16, 16, 16, + 22, 22, 22, 22, 22, 22, 5, 5, 5, 32, + 32, 35, 10, 10, 33, 33, 36, 8, 8, 34, + 34, 37, 31, 31, 38, 14, 14, 12, 12, 13, + 13, 13, 13, 13, 17, 17, 15, 15, 16, 16, + 16, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerslen[] = @@ -198,13 +203,14 @@ short sudoerslen[] = 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, 3, 3, 3, 3, 3, - 1, 2, 1, 2, 3, 3, 3, 3, 0, 3, - 0, 1, 3, 2, 1, 0, 2, 2, 2, 2, + 1, 2, 1, 2, 3, 3, 3, 3, 3, 0, + 3, 0, 1, 3, 2, 1, 0, 2, 2, 2, 2, 2, 2, 2, 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, + 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[] = @@ -212,24 +218,24 @@ const short sudoersdefred[] = short sudoersdefred[] = #endif { 0, - 0, 98, 100, 101, 102, 0, 0, 0, 0, 0, - 99, 5, 0, 0, 0, 0, 0, 0, 94, 96, + 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, 81, 0, 0, 77, - 76, 75, 0, 0, 0, 0, 0, 43, 41, 86, - 0, 0, 0, 0, 78, 0, 0, 83, 0, 0, - 91, 0, 0, 88, 97, 0, 0, 24, 0, 4, + 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, 95, 0, 0, 21, - 22, 23, 18, 82, 37, 38, 39, 40, 87, 0, - 79, 0, 84, 0, 92, 0, 89, 0, 34, 0, - 56, 25, 0, 0, 0, 0, 0, 107, 109, 108, - 0, 103, 105, 0, 0, 50, 35, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 69, 70, 67, - 68, 0, 0, 0, 0, 36, 71, 72, 73, 74, - 106, 0, 0, 0, 0, 0, 0, 104, 46, 45, - 47, 48, + 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, + 57, 25, 0, 0, 0, 0, 0, 109, 111, 110, + 0, 105, 107, 0, 0, 51, 35, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 71, 72, 69, + 70, 0, 0, 0, 0, 0, 36, 73, 74, 75, + 76, 58, 108, 0, 0, 0, 0, 0, 0, 0, + 106, 47, 46, 48, 49, 45, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoersdgoto[] = @@ -239,69 +245,69 @@ short sudoersdgoto[] = { 18, 119, 120, 27, 28, 48, 49, 50, 51, 35, 67, 37, 19, 20, 21, 132, 133, 134, 121, 125, 68, - 69, 127, 157, 158, 159, 160, 52, 22, 23, 60, - 54, 57, 63, 55, 58, 64, 61, + 69, 127, 158, 159, 160, 161, 162, 52, 22, 23, + 60, 54, 57, 63, 55, 58, 64, 61, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerssindex[] = #else short sudoerssindex[] = #endif - { 478, - -266, 0, 0, 0, 0, -23, 289, -19, -19, -5, + { 499, + -266, 0, 0, 0, 0, -23, 227, -19, -19, -5, 0, 0, -233, -232, -221, -219, -231, 0, 0, 0, - -33, 478, 0, 0, -3, -216, 0, 3, 0, 0, + -33, 499, 0, 0, -3, -216, 0, 3, 0, 0, 0, 0, 0, -225, 0, -28, 0, -24, -24, 0, 0, 0, -240, -8, -7, -2, 2, 0, 0, 0, -21, -12, -9, 8, 0, -4, 10, 0, 9, 11, 0, 13, 14, 0, 0, -19, -37, 0, 17, 0, - -208, -202, -192, 0, -23, 0, 289, 3, 3, 3, - 0, -188, -186, -185, -184, -5, 3, 0, 289, -233, - -5, -232, -19, -221, -19, -219, 0, 41, 289, 0, + -208, -202, -192, 0, -23, 0, 227, 3, 3, 3, + 0, -188, -186, -185, -184, -5, 3, 0, 227, -233, + -5, -232, -19, -221, -19, -219, 0, 41, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 40, 0, 42, 0, 42, 0, -29, 0, 46, - 0, 0, 405, -36, 44, 41, 404, 0, 0, 0, - -217, 0, 0, 47, 405, 0, 0, 0, 0, 0, + 0, 0, 289, -36, 44, 41, 404, 0, 0, 0, + -217, 0, 0, 47, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 31, 32, 33, 34, 0, 0, 0, 0, 0, - 0, 405, 47, -165, -164, -163, -162, 0, 0, 0, - 0, 0,}; + 0, 31, 32, 33, 34, 37, 0, 0, 0, 0, + 0, 0, 0, 289, 47, -164, -163, -162, -161, -160, + 0, 0, 0, 0, 0, 0,}; #if defined(__cplusplus) || defined(__STDC__) const short sudoersrindex[] = #else short sudoersrindex[] = #endif - { 102, + { 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 103, 0, 0, 1, 0, 0, 145, 0, 0, + 0, 105, 0, 0, 1, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, 193, 0, 0, 207, 0, 0, 241, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 309, 323, 357, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 49, 0, 63, 0, 97, 0, 64, 0, 111, - 0, 0, 65, 67, 0, 434, 0, 0, 0, 0, - 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, + 0, 49, 0, 63, 0, 97, 0, 65, 0, 111, + 0, 0, 67, 68, 0, 450, 0, 0, 0, 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, 0, 0, 0, 0, 0, - 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, - 0, 0,}; + 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,}; #if defined(__cplusplus) || defined(__STDC__) const short sudoersgindex[] = #else short sudoersgindex[] = #endif { 0, - -22, 0, 38, 26, 71, 66, -73, 24, 82, -1, - 43, 51, 105, -6, -43, 4, -11, 0, 0, 27, - 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, - 0, 0, 0, 35, 36, 37, 45, + -11, 0, 43, 26, 71, 64, -73, 28, 83, -1, + 45, 54, 106, -6, -40, 4, -10, 0, 0, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, + 0, 0, 0, 0, 38, 35, 36, 48, }; -#define YYTABLESIZE 767 +#define YYTABLESIZE 788 #if defined(__cplusplus) || defined(__STDC__) const short sudoerstable[] = #else @@ -309,21 +315,21 @@ short sudoerstable[] = #endif { 34, 19, 38, 39, 17, 26, 36, 77, 66, 26, 26, - 66, 26, 109, 17, 80, 77, 40, 41, 24, 66, + 66, 26, 109, 17, 82, 77, 40, 41, 24, 66, 43, 135, 86, 98, 53, 56, 2, 43, 123, 3, 4, 5, 29, 19, 30, 31, 59, 32, 62, 72, - 128, 73, 74, 42, 19, 129, 75, 80, 85, 82, - 83, 89, 11, 156, 100, 84, 91, 71, 33, 85, - 101, 78, 93, 79, 80, 90, 130, 92, 94, 93, - 102, 96, 80, 95, 99, 105, 87, 106, 107, 108, - 118, 85, 77, 86, 136, 66, 114, 110, 116, 126, - 162, 164, 165, 166, 167, 93, 90, 169, 170, 171, - 172, 1, 2, 137, 51, 55, 85, 52, 54, 53, - 26, 124, 103, 81, 112, 76, 97, 88, 168, 104, - 93, 65, 70, 163, 111, 122, 0, 113, 0, 90, - 0, 0, 117, 0, 161, 0, 0, 0, 115, 0, - 0, 0, 0, 26, 12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 0, 0, 0, 9, 0, + 128, 73, 74, 42, 19, 129, 75, 82, 87, 82, + 83, 89, 11, 157, 100, 84, 91, 71, 33, 85, + 101, 78, 95, 79, 80, 90, 130, 92, 94, 93, + 102, 96, 82, 95, 99, 105, 87, 106, 107, 108, + 118, 87, 77, 86, 136, 66, 114, 110, 116, 126, + 164, 166, 167, 168, 169, 95, 92, 170, 172, 173, + 174, 175, 176, 1, 2, 52, 87, 56, 53, 55, + 26, 124, 54, 81, 137, 88, 76, 103, 112, 97, + 95, 104, 65, 171, 165, 122, 113, 111, 70, 92, + 0, 117, 0, 0, 163, 0, 0, 0, 0, 0, + 0, 115, 0, 26, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 92, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -333,39 +339,39 @@ short sudoerstable[] = 0, 0, 0, 0, 29, 10, 30, 31, 2, 32, 25, 3, 4, 5, 25, 25, 0, 25, 2, 8, 11, 3, 4, 5, 40, 41, 0, 0, 0, 0, - 33, 40, 41, 0, 11, 0, 19, 0, 19, 0, + 33, 40, 41, 0, 11, 0, 19, 0, 19, 34, 0, 19, 19, 19, 11, 19, 19, 19, 19, 19, - 80, 42, 80, 11, 7, 80, 80, 80, 42, 80, - 80, 80, 80, 80, 19, 19, 19, 19, 19, 19, - 44, 45, 46, 47, 0, 0, 0, 0, 80, 80, - 80, 80, 80, 80, 85, 0, 85, 7, 15, 85, - 85, 85, 0, 85, 85, 85, 85, 85, 93, 0, - 93, 34, 13, 93, 93, 93, 0, 93, 93, 93, - 93, 93, 85, 85, 85, 85, 85, 85, 0, 0, - 0, 15, 0, 0, 0, 0, 93, 93, 93, 93, - 93, 93, 90, 0, 90, 13, 14, 90, 90, 90, - 0, 90, 90, 90, 90, 90, 26, 0, 26, 0, + 82, 42, 82, 11, 7, 82, 82, 82, 42, 82, + 82, 82, 82, 82, 19, 19, 19, 19, 19, 19, + 0, 44, 45, 46, 47, 0, 0, 0, 82, 82, + 82, 82, 82, 82, 87, 0, 87, 7, 15, 87, + 87, 87, 0, 87, 87, 87, 87, 87, 95, 0, + 95, 131, 13, 95, 95, 95, 0, 95, 95, 95, + 95, 95, 87, 87, 87, 87, 87, 87, 0, 0, + 0, 15, 0, 0, 0, 0, 95, 95, 95, 95, + 95, 95, 92, 0, 92, 13, 14, 92, 92, 92, + 0, 92, 92, 92, 92, 92, 26, 0, 26, 0, 16, 26, 26, 26, 0, 26, 26, 26, 26, 26, - 90, 90, 90, 90, 90, 90, 0, 0, 0, 14, + 92, 92, 92, 92, 92, 92, 0, 0, 0, 14, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 12, 0, 12, 16, 0, 12, 12, 12, 0, 12, 12, 12, 12, 12, 9, 0, 9, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 12, 12, - 12, 12, 12, 12, 0, 0, 43, 131, 0, 0, + 12, 12, 12, 12, 0, 0, 43, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 10, 0, 10, 0, 0, 10, 10, 10, 0, 10, 10, 10, - 10, 10, 8, 0, 8, 0, 49, 8, 8, 8, + 10, 10, 8, 0, 8, 0, 0, 8, 8, 8, 0, 8, 8, 8, 8, 8, 10, 10, 10, 10, - 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 10, 50, 0, 29, 0, 30, 31, 0, 32, 8, 8, 8, 8, 8, 8, 11, 0, 11, 0, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, - 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, - 7, 0, 7, 0, 0, 7, 7, 7, 0, 7, - 7, 7, 7, 7, 0, 0, 29, 0, 30, 31, - 0, 32, 0, 0, 0, 0, 0, 0, 7, 7, + 7, 17, 7, 0, 0, 7, 7, 7, 0, 7, + 7, 7, 7, 7, 0, 0, 128, 0, 0, 0, + 0, 129, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 15, 0, 15, 0, 0, 15, - 15, 15, 33, 15, 15, 15, 15, 15, 13, 0, + 15, 15, 130, 15, 15, 15, 15, 15, 13, 0, 13, 0, 0, 13, 13, 13, 0, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, @@ -374,17 +380,19 @@ short sudoerstable[] = 0, 16, 16, 16, 0, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 16, 16, - 40, 41, 128, 0, 0, 0, 0, 129, 0, 0, + 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 42, 130, 0, - 49, 49, 0, 0, 152, 153, 154, 155, 0, 44, - 45, 46, 47, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, - 0, 0, 0, 0, 49, 49, 49, 49, 0, 49, - 49, 49, 49, 1, 0, 2, 0, 0, 3, 4, - 5, 0, 6, 7, 8, 9, 10, 0, 0, 0, + 145, 146, 147, 148, 149, 150, 151, 42, 0, 0, + 0, 0, 0, 0, 152, 153, 154, 155, 156, 0, + 44, 45, 46, 47, 0, 0, 50, 50, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, + 50, 50, 50, 50, 50, 0, 50, 50, 50, 50, + 0, 0, 0, 0, 1, 0, 2, 0, 0, 3, + 4, 5, 0, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 12, 13, 14, 15, 16, + 0, 0, 11, 12, 13, 14, 15, 16, }; #if defined(__cplusplus) || defined(__STDC__) const short sudoerscheck[] = @@ -401,12 +409,12 @@ short sudoerscheck[] = 263, 36, 0, 38, 39, 58, 284, 58, 58, 61, 263, 58, 58, 61, 58, 264, 51, 264, 264, 264, 40, 33, 44, 44, 41, 44, 93, 89, 95, 44, - 44, 61, 61, 61, 61, 33, 0, 263, 263, 263, - 263, 0, 0, 126, 41, 41, 58, 41, 41, 41, - 0, 118, 75, 43, 91, 34, 66, 52, 162, 77, - 58, 17, 22, 135, 90, 99, -1, 92, -1, 33, - -1, -1, 96, -1, 131, -1, -1, -1, 94, -1, - -1, -1, -1, 33, 0, -1, -1, -1, -1, -1, + 44, 61, 61, 61, 61, 33, 0, 61, 263, 263, + 263, 263, 263, 0, 0, 41, 58, 41, 41, 41, + 0, 118, 41, 43, 126, 52, 34, 75, 91, 66, + 58, 77, 17, 164, 135, 99, 92, 90, 22, 33, + -1, 96, -1, -1, 131, -1, -1, -1, -1, -1, + -1, 94, -1, 33, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, @@ -417,11 +425,11 @@ short sudoerscheck[] = -1, -1, -1, -1, 258, 33, 260, 261, 258, 263, 259, 261, 262, 263, 259, 259, -1, 259, 258, 33, 0, 261, 262, 263, 257, 258, -1, -1, -1, -1, - 284, 257, 258, -1, 284, -1, 256, -1, 258, -1, + 284, 257, 258, -1, 284, -1, 256, -1, 258, 33, -1, 261, 262, 263, 284, 265, 266, 267, 268, 269, 256, 284, 258, 33, 0, 261, 262, 263, 284, 265, 266, 267, 268, 269, 284, 285, 286, 287, 288, 289, - 296, 297, 298, 299, -1, -1, -1, -1, 284, 285, + -1, 297, 298, 299, 300, -1, -1, -1, 284, 285, 286, 287, 288, 289, 256, -1, 258, 33, 0, 261, 262, 263, -1, 265, 266, 267, 268, 269, 256, -1, 258, 33, 0, 261, 262, 263, -1, 265, 266, 267, @@ -435,18 +443,18 @@ short sudoerscheck[] = 256, -1, 258, 33, -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, 256, -1, 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, 284, 285, - 286, 287, 288, 289, -1, -1, 33, 33, -1, -1, + 286, 287, 288, 289, -1, -1, 33, -1, -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, 256, -1, 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, - 268, 269, 256, -1, 258, -1, 33, 261, 262, 263, + 268, 269, 256, -1, 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, 284, 285, 286, 287, - 288, 289, -1, -1, -1, -1, -1, -1, -1, -1, + 288, 289, 33, -1, 258, -1, 260, 261, -1, 263, 284, 285, 286, 287, 288, 289, 256, -1, 258, -1, -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, - 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 284, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, - 256, -1, 258, -1, -1, 261, 262, 263, -1, 265, - 266, 267, 268, 269, -1, -1, 258, -1, 260, 261, + 256, 33, 258, -1, -1, 261, 262, 263, -1, 265, + 266, 267, 268, 269, -1, -1, 258, -1, -1, -1, -1, 263, -1, -1, -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, 256, -1, 258, -1, -1, 261, 262, 263, 284, 265, 266, 267, 268, 269, 256, -1, @@ -458,23 +466,25 @@ short sudoerscheck[] = -1, 261, 262, 263, -1, 265, 266, 267, 268, 269, 284, 285, 286, 287, 288, 289, -1, -1, -1, -1, -1, -1, -1, -1, 284, 285, 286, 287, 288, 289, - 257, 258, 258, -1, -1, -1, -1, 263, -1, -1, + 257, 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 284, -1, - 257, 258, -1, -1, 291, 292, 293, 294, -1, 296, - 297, 298, 299, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, -1, -1, - -1, -1, -1, -1, 291, 292, 293, 294, -1, 296, - 297, 298, 299, 256, -1, 258, -1, -1, 261, 262, - 263, -1, 265, 266, 267, 268, 269, -1, -1, -1, + -1, -1, -1, -1, 291, 292, 293, 294, 295, -1, + 297, 298, 299, 300, -1, -1, 257, 258, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, -1, -1, -1, -1, -1, -1, + 291, 292, 293, 294, 295, -1, 297, 298, 299, 300, + -1, -1, -1, -1, 256, -1, 258, -1, -1, 261, + 262, 263, -1, 265, 266, 267, 268, 269, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 284, 285, 286, 287, 288, 289, + -1, -1, 284, 285, 286, 287, 288, 289, }; #define YYFINAL 18 #ifndef YYDEBUG #define YYDEBUG 0 #endif -#define YYMAXTOKEN 299 +#define YYMAXTOKEN 300 #if YYDEBUG #if defined(__cplusplus) || defined(__STDC__) const char * const sudoersname[] = @@ -494,8 +504,8 @@ char *sudoersname[] = "NOPASSWD","PASSWD","NOEXEC","EXEC","SETENV","NOSETENV","LOG_INPUT", "NOLOG_INPUT","LOG_OUTPUT","NOLOG_OUTPUT","MAIL","NOMAIL","FOLLOW","NOFOLLOW", "ALL","COMMENT","HOSTALIAS","CMNDALIAS","USERALIAS","RUNASALIAS","ERROR","TYPE", -"ROLE","PRIVS","LIMITPRIVS","MYSELF","SHA224_TOK","SHA256_TOK","SHA384_TOK", -"SHA512_TOK", +"ROLE","PRIVS","LIMITPRIVS","CMND_TIMEOUT","MYSELF","SHA224_TOK","SHA256_TOK", +"SHA384_TOK","SHA512_TOK", }; #if defined(__cplusplus) || defined(__STDC__) const char * const sudoersrule[] = @@ -547,6 +557,7 @@ char *sudoersrule[] = "digcmnd : digest opcmnd", "opcmnd : cmnd", "opcmnd : '!' cmnd", +"timeoutspec : CMND_TIMEOUT '=' WORD", "rolespec : ROLE '=' WORD", "typespec : TYPE '=' WORD", "privsspec : PRIVS '=' WORD", @@ -559,6 +570,7 @@ char *sudoersrule[] = "runaslist : ':' grouplist", "runaslist : ':'", "options :", +"options : options timeoutspec", "options : options NOPASSWD", "options : options PASSWD", "options : options NOEXEC", @@ -640,7 +652,7 @@ short *yysslim; YYSTYPE *yyvs; unsigned int yystacksize; int yyparse(void); -#line 834 "gram.y" +#line 850 "gram.y" void sudoerserror(const char *s) { @@ -955,7 +967,25 @@ init_parser(const char *path, bool quiet) debug_return_bool(ret); } -#line 906 "gram.c" + +/* + * Initialize all options in a cmndspec. + */ +static void +init_options(struct command_options *opts) +{ + TAGS_INIT(opts->tags); + opts->timeout = UNSPEC; +#ifdef HAVE_SELINUX + opts->role = NULL; + opts->type = NULL; +#endif +#ifdef HAVE_PRIV_SET + opts->privs = NULL; + opts->limitprivs = NULL; +#endif +} +#line 936 "gram.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ #if defined(__cplusplus) || defined(__STDC__) static int yygrowstack(void) @@ -1164,23 +1194,23 @@ yyreduce: switch (yyn) { case 1: -#line 166 "gram.y" +#line 172 "gram.y" { ; } break; case 5: -#line 174 "gram.y" +#line 180 "gram.y" { ; } break; case 6: -#line 177 "gram.y" +#line 183 "gram.y" { yyerrok; } break; case 7: -#line 180 "gram.y" +#line 186 "gram.y" { if (!add_userspec(yyvsp[-1].member, yyvsp[0].privilege)) { sudoerserror(N_("unable to allocate memory")); @@ -1189,73 +1219,73 @@ case 7: } break; case 8: -#line 186 "gram.y" +#line 192 "gram.y" { ; } break; case 9: -#line 189 "gram.y" +#line 195 "gram.y" { ; } break; case 10: -#line 192 "gram.y" +#line 198 "gram.y" { ; } break; case 11: -#line 195 "gram.y" +#line 201 "gram.y" { ; } break; case 12: -#line 198 "gram.y" +#line 204 "gram.y" { if (!add_defaults(DEFAULTS, NULL, yyvsp[0].defaults)) YYERROR; } break; case 13: -#line 202 "gram.y" +#line 208 "gram.y" { if (!add_defaults(DEFAULTS_USER, yyvsp[-1].member, yyvsp[0].defaults)) YYERROR; } break; case 14: -#line 206 "gram.y" +#line 212 "gram.y" { if (!add_defaults(DEFAULTS_RUNAS, yyvsp[-1].member, yyvsp[0].defaults)) YYERROR; } break; case 15: -#line 210 "gram.y" +#line 216 "gram.y" { if (!add_defaults(DEFAULTS_HOST, yyvsp[-1].member, yyvsp[0].defaults)) YYERROR; } break; case 16: -#line 214 "gram.y" +#line 220 "gram.y" { if (!add_defaults(DEFAULTS_CMND, yyvsp[-1].member, yyvsp[0].defaults)) YYERROR; } break; case 18: -#line 221 "gram.y" +#line 227 "gram.y" { HLTQ_CONCAT(yyvsp[-2].defaults, yyvsp[0].defaults, entries); yyval.defaults = yyvsp[-2].defaults; } break; case 19: -#line 227 "gram.y" +#line 233 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, true); if (yyval.defaults == NULL) { @@ -1265,7 +1295,7 @@ case 19: } break; case 20: -#line 234 "gram.y" +#line 240 "gram.y" { yyval.defaults = new_default(yyvsp[0].string, NULL, false); if (yyval.defaults == NULL) { @@ -1275,7 +1305,7 @@ case 20: } break; case 21: -#line 241 "gram.y" +#line 247 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, true); if (yyval.defaults == NULL) { @@ -1285,7 +1315,7 @@ case 21: } break; case 22: -#line 248 "gram.y" +#line 254 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '+'); if (yyval.defaults == NULL) { @@ -1295,7 +1325,7 @@ case 22: } break; case 23: -#line 255 "gram.y" +#line 261 "gram.y" { yyval.defaults = new_default(yyvsp[-2].string, yyvsp[0].string, '-'); if (yyval.defaults == NULL) { @@ -1305,14 +1335,14 @@ case 23: } break; case 25: -#line 265 "gram.y" +#line 271 "gram.y" { HLTQ_CONCAT(yyvsp[-2].privilege, yyvsp[0].privilege, entries); yyval.privilege = yyvsp[-2].privilege; } break; case 26: -#line 271 "gram.y" +#line 277 "gram.y" { struct privilege *p = calloc(1, sizeof(*p)); if (p == NULL) { @@ -1326,21 +1356,21 @@ case 26: } break; case 27: -#line 284 "gram.y" +#line 290 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; case 28: -#line 288 "gram.y" +#line 294 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; case 29: -#line 294 "gram.y" +#line 300 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -1350,7 +1380,7 @@ case 29: } break; case 30: -#line 301 "gram.y" +#line 307 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -1360,7 +1390,7 @@ case 30: } break; case 31: -#line 308 "gram.y" +#line 314 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); if (yyval.member == NULL) { @@ -1370,7 +1400,7 @@ case 31: } break; case 32: -#line 315 "gram.y" +#line 321 "gram.y" { yyval.member = new_member(yyvsp[0].string, NTWKADDR); if (yyval.member == NULL) { @@ -1380,7 +1410,7 @@ case 32: } break; case 33: -#line 322 "gram.y" +#line 328 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); if (yyval.member == NULL) { @@ -1390,7 +1420,7 @@ case 33: } break; case 35: -#line 332 "gram.y" +#line 338 "gram.y" { struct cmndspec *prev; prev = HLTQ_LAST(yyvsp[-2].cmndspec, cmndspec, entries); @@ -1409,6 +1439,9 @@ case 35: if (yyvsp[0].cmndspec->limitprivs == NULL) yyvsp[0].cmndspec->limitprivs = prev->limitprivs; #endif /* HAVE_PRIV_SET */ + /* propagate command timeout */ + if (yyvsp[0].cmndspec->timeout == UNSPEC) + yyvsp[0].cmndspec->timeout = prev->timeout; /* propagate tags and runas list */ if (yyvsp[0].cmndspec->tags.nopasswd == UNSPEC) yyvsp[0].cmndspec->tags.nopasswd = prev->tags.nopasswd; @@ -1436,7 +1469,7 @@ case 35: } break; case 36: -#line 377 "gram.y" +#line 386 "gram.y" { struct cmndspec *cs = calloc(1, sizeof(*cs)); if (cs == NULL) { @@ -1474,6 +1507,7 @@ case 36: cs->privs = yyvsp[-1].options.privs; cs->limitprivs = yyvsp[-1].options.limitprivs; #endif + cs->timeout = yyvsp[-1].options.timeout; cs->tags = yyvsp[-1].options.tags; cs->cmnd = yyvsp[0].member; HLTQ_INIT(cs, entries); @@ -1485,7 +1519,7 @@ case 36: } break; case 37: -#line 425 "gram.y" +#line 435 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA224, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1495,7 +1529,7 @@ case 37: } break; case 38: -#line 432 "gram.y" +#line 442 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA256, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1505,7 +1539,7 @@ case 38: } break; case 39: -#line 439 "gram.y" +#line 449 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA384, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1515,7 +1549,7 @@ case 39: } break; case 40: -#line 446 "gram.y" +#line 456 "gram.y" { yyval.digest = new_digest(SUDO_DIGEST_SHA512, yyvsp[0].string); if (yyval.digest == NULL) { @@ -1525,13 +1559,13 @@ case 40: } break; case 41: -#line 455 "gram.y" +#line 465 "gram.y" { yyval.member = yyvsp[0].member; } break; case 42: -#line 458 "gram.y" +#line 468 "gram.y" { if (yyvsp[0].member->type != COMMAND) { sudoerserror(N_("a digest requires a path name")); @@ -1543,57 +1577,63 @@ case 42: } break; case 43: -#line 469 "gram.y" +#line 479 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; case 44: -#line 473 "gram.y" +#line 483 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; case 45: -#line 479 "gram.y" +#line 489 "gram.y" { yyval.string = yyvsp[0].string; } break; case 46: -#line 484 "gram.y" +#line 494 "gram.y" { yyval.string = yyvsp[0].string; } break; case 47: -#line 489 "gram.y" +#line 499 "gram.y" { yyval.string = yyvsp[0].string; } break; case 48: -#line 493 "gram.y" +#line 504 "gram.y" { yyval.string = yyvsp[0].string; } break; case 49: -#line 498 "gram.y" +#line 508 "gram.y" { - yyval.runas = NULL; + yyval.string = yyvsp[0].string; } break; case 50: -#line 501 "gram.y" +#line 513 "gram.y" { - yyval.runas = yyvsp[-1].runas; + yyval.runas = NULL; } break; case 51: -#line 506 "gram.y" +#line 516 "gram.y" +{ + yyval.runas = yyvsp[-1].runas; + } +break; +case 52: +#line 521 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas != NULL) { @@ -1610,8 +1650,8 @@ case 51: } } break; -case 52: -#line 521 "gram.y" +case 53: +#line 536 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas == NULL) { @@ -1622,8 +1662,8 @@ case 52: /* $$->runasgroups = NULL; */ } break; -case 53: -#line 530 "gram.y" +case 54: +#line 545 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas == NULL) { @@ -1634,8 +1674,8 @@ case 53: yyval.runas->runasgroups = yyvsp[0].member; } break; -case 54: -#line 539 "gram.y" +case 55: +#line 554 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas == NULL) { @@ -1646,8 +1686,8 @@ case 54: yyval.runas->runasgroups = yyvsp[0].member; } break; -case 55: -#line 548 "gram.y" +case 56: +#line 563 "gram.y" { yyval.runas = calloc(1, sizeof(struct runascontainer)); if (yyval.runas != NULL) { @@ -1664,136 +1704,140 @@ case 55: } } break; -case 56: -#line 565 "gram.y" +case 57: +#line 580 "gram.y" { - TAGS_INIT(yyval.options.tags); -#ifdef HAVE_SELINUX - yyval.options.role = NULL, yyval.options.type = NULL; -#endif -#ifdef HAVE_PRIV_SET - yyval.options.privs = NULL, yyval.options.limitprivs = NULL; -#endif + init_options(&yyval.options); } break; -case 57: -#line 574 "gram.y" +case 58: +#line 583 "gram.y" +{ + yyval.options.timeout = parse_timeout(yyvsp[0].string); + if (yyval.options.timeout == -1) { + sudoerserror(N_("unable parse timeout value")); + YYERROR; + } + } +break; +case 59: +#line 590 "gram.y" { yyval.options.tags.nopasswd = true; } break; -case 58: -#line 577 "gram.y" +case 60: +#line 593 "gram.y" { yyval.options.tags.nopasswd = false; } break; -case 59: -#line 580 "gram.y" +case 61: +#line 596 "gram.y" { yyval.options.tags.noexec = true; } break; -case 60: -#line 583 "gram.y" +case 62: +#line 599 "gram.y" { yyval.options.tags.noexec = false; } break; -case 61: -#line 586 "gram.y" +case 63: +#line 602 "gram.y" { yyval.options.tags.setenv = true; } break; -case 62: -#line 589 "gram.y" +case 64: +#line 605 "gram.y" { yyval.options.tags.setenv = false; } break; -case 63: -#line 592 "gram.y" +case 65: +#line 608 "gram.y" { yyval.options.tags.log_input = true; } break; -case 64: -#line 595 "gram.y" +case 66: +#line 611 "gram.y" { yyval.options.tags.log_input = false; } break; -case 65: -#line 598 "gram.y" +case 67: +#line 614 "gram.y" { yyval.options.tags.log_output = true; } break; -case 66: -#line 601 "gram.y" +case 68: +#line 617 "gram.y" { yyval.options.tags.log_output = false; } break; -case 67: -#line 604 "gram.y" +case 69: +#line 620 "gram.y" { yyval.options.tags.follow = true; } break; -case 68: -#line 607 "gram.y" +case 70: +#line 623 "gram.y" { yyval.options.tags.follow = false; } break; -case 69: -#line 610 "gram.y" +case 71: +#line 626 "gram.y" { yyval.options.tags.send_mail = true; } break; -case 70: -#line 613 "gram.y" +case 72: +#line 629 "gram.y" { yyval.options.tags.send_mail = false; } break; -case 71: -#line 616 "gram.y" +case 73: +#line 632 "gram.y" { #ifdef HAVE_SELINUX yyval.options.role = yyvsp[0].string; #endif } break; -case 72: -#line 621 "gram.y" +case 74: +#line 637 "gram.y" { #ifdef HAVE_SELINUX yyval.options.type = yyvsp[0].string; #endif } break; -case 73: -#line 626 "gram.y" +case 75: +#line 642 "gram.y" { #ifdef HAVE_PRIV_SET yyval.options.privs = yyvsp[0].string; #endif } break; -case 74: -#line 631 "gram.y" +case 76: +#line 647 "gram.y" { #ifdef HAVE_PRIV_SET yyval.options.limitprivs = yyvsp[0].string; #endif } break; -case 75: -#line 638 "gram.y" +case 77: +#line 654 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -1802,8 +1846,8 @@ case 75: } } break; -case 76: -#line 645 "gram.y" +case 78: +#line 661 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -1812,8 +1856,8 @@ case 76: } } break; -case 77: -#line 652 "gram.y" +case 79: +#line 668 "gram.y" { struct sudo_command *c = calloc(1, sizeof(*c)); if (c == NULL) { @@ -1830,8 +1874,8 @@ case 77: } } break; -case 80: -#line 673 "gram.y" +case 82: +#line 689 "gram.y" { const char *s; s = alias_add(yyvsp[-2].string, HOSTALIAS, sudoers, this_lineno, yyvsp[0].member); @@ -1841,15 +1885,15 @@ case 80: } } break; -case 82: -#line 684 "gram.y" +case 84: +#line 700 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 85: -#line 694 "gram.y" +case 87: +#line 710 "gram.y" { const char *s; s = alias_add(yyvsp[-2].string, CMNDALIAS, sudoers, this_lineno, yyvsp[0].member); @@ -1859,15 +1903,15 @@ case 85: } } break; -case 87: -#line 705 "gram.y" +case 89: +#line 721 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 90: -#line 715 "gram.y" +case 92: +#line 731 "gram.y" { const char *s; s = alias_add(yyvsp[-2].string, RUNASALIAS, sudoers, this_lineno, yyvsp[0].member); @@ -1877,8 +1921,8 @@ case 90: } } break; -case 93: -#line 729 "gram.y" +case 95: +#line 745 "gram.y" { const char *s; s = alias_add(yyvsp[-2].string, USERALIAS, sudoers, this_lineno, yyvsp[0].member); @@ -1888,29 +1932,29 @@ case 93: } } break; -case 95: -#line 740 "gram.y" +case 97: +#line 756 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 96: -#line 746 "gram.y" +case 98: +#line 762 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 97: -#line 750 "gram.y" +case 99: +#line 766 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 98: -#line 756 "gram.y" +case 100: +#line 772 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -1919,8 +1963,8 @@ case 98: } } break; -case 99: -#line 763 "gram.y" +case 101: +#line 779 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -1929,8 +1973,8 @@ case 99: } } break; -case 100: -#line 770 "gram.y" +case 102: +#line 786 "gram.y" { yyval.member = new_member(yyvsp[0].string, NETGROUP); if (yyval.member == NULL) { @@ -1939,8 +1983,8 @@ case 100: } } break; -case 101: -#line 777 "gram.y" +case 103: +#line 793 "gram.y" { yyval.member = new_member(yyvsp[0].string, USERGROUP); if (yyval.member == NULL) { @@ -1949,8 +1993,8 @@ case 101: } } break; -case 102: -#line 784 "gram.y" +case 104: +#line 800 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); if (yyval.member == NULL) { @@ -1959,29 +2003,29 @@ case 102: } } break; -case 104: -#line 794 "gram.y" +case 106: +#line 810 "gram.y" { HLTQ_CONCAT(yyvsp[-2].member, yyvsp[0].member, entries); yyval.member = yyvsp[-2].member; } break; -case 105: -#line 800 "gram.y" +case 107: +#line 816 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = false; } break; -case 106: -#line 804 "gram.y" +case 108: +#line 820 "gram.y" { yyval.member = yyvsp[0].member; yyval.member->negated = true; } break; -case 107: -#line 810 "gram.y" +case 109: +#line 826 "gram.y" { yyval.member = new_member(yyvsp[0].string, ALIAS); if (yyval.member == NULL) { @@ -1990,8 +2034,8 @@ case 107: } } break; -case 108: -#line 817 "gram.y" +case 110: +#line 833 "gram.y" { yyval.member = new_member(NULL, ALL); if (yyval.member == NULL) { @@ -2000,8 +2044,8 @@ case 108: } } break; -case 109: -#line 824 "gram.y" +case 111: +#line 840 "gram.y" { yyval.member = new_member(yyvsp[0].string, WORD); if (yyval.member == NULL) { @@ -2010,7 +2054,7 @@ case 109: } } break; -#line 1961 "gram.c" +#line 2005 "gram.c" } yyssp -= yym; yystate = *yyssp; diff --git a/plugins/sudoers/gram.h b/plugins/sudoers/gram.h index e2ccaeec2..f86240977 100644 --- a/plugins/sudoers/gram.h +++ b/plugins/sudoers/gram.h @@ -36,11 +36,12 @@ #define ROLE 292 #define PRIVS 293 #define LIMITPRIVS 294 -#define MYSELF 295 -#define SHA224_TOK 296 -#define SHA256_TOK 297 -#define SHA384_TOK 298 -#define SHA512_TOK 299 +#define CMND_TIMEOUT 295 +#define MYSELF 296 +#define SHA224_TOK 297 +#define SHA256_TOK 298 +#define SHA384_TOK 299 +#define SHA512_TOK 300 #ifndef YYSTYPE_DEFINED #define YYSTYPE_DEFINED typedef union { diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y index 2b1a98a4e..6a3fb6dde 100644 --- a/plugins/sudoers/gram.y +++ b/plugins/sudoers/gram.y @@ -1,6 +1,6 @@ %{ /* - * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2016 + * Copyright (c) 1996, 1998-2005, 2007-2013, 2014-2017 * Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any @@ -43,6 +43,8 @@ #if defined(YYBISON) && defined(HAVE_ALLOCA_H) && !defined(__GNUC__) # include #endif /* YYBISON && HAVE_ALLOCA_H && !__GNUC__ */ +#include +#include #include #include "sudoers.h" /* XXX */ @@ -66,6 +68,7 @@ struct userspec_list userspecs = TAILQ_HEAD_INITIALIZER(userspecs); /* * Local protoypes */ +static void init_options(struct command_options *opts); static bool add_defaults(int, struct member *, struct defaults *); static bool add_userspec(struct member *, struct privilege *); static struct defaults *new_default(char *, char *, short); @@ -127,6 +130,7 @@ static struct sudo_digest *new_digest(int, const char *); %token ROLE /* SELinux role */ %token PRIVS /* Solaris privileges */ %token LIMITPRIVS /* Solaris limit privileges */ +%token CMND_TIMEOUT /* command timeout */ %token MYSELF /* run as myself, not another user */ %token SHA224_TOK /* sha224 token */ %token SHA256_TOK /* sha256 token */ @@ -159,7 +163,9 @@ static struct sudo_digest *new_digest(int, const char *); %type typespec %type privsspec %type limitprivsspec +%type timeoutspec %type digest +%type options %% @@ -347,6 +353,9 @@ cmndspeclist : cmndspec if ($3->limitprivs == NULL) $3->limitprivs = prev->limitprivs; #endif /* HAVE_PRIV_SET */ + /* propagate command timeout */ + if ($3->timeout == UNSPEC) + $3->timeout = prev->timeout; /* propagate tags and runas list */ if ($3->tags.nopasswd == UNSPEC) $3->tags.nopasswd = prev->tags.nopasswd; @@ -411,6 +420,7 @@ cmndspec : runasspec options digcmnd { cs->privs = $2.privs; cs->limitprivs = $2.limitprivs; #endif + cs->timeout = $2.timeout; cs->tags = $2.tags; cs->cmnd = $3; HLTQ_INIT(cs, entries); @@ -476,6 +486,11 @@ opcmnd : cmnd { } ; +timeoutspec : CMND_TIMEOUT '=' WORD { + $$ = $3; + } + ; + rolespec : ROLE '=' WORD { $$ = $3; } @@ -563,13 +578,14 @@ runaslist : /* empty */ { ; options : /* empty */ { - TAGS_INIT($$.tags); -#ifdef HAVE_SELINUX - $$.role = NULL, $$.type = NULL; -#endif -#ifdef HAVE_PRIV_SET - $$.privs = NULL, $$.limitprivs = NULL; -#endif + init_options(&$$); + } + | options timeoutspec { + $$.timeout = parse_timeout($2); + if ($$.timeout == -1) { + sudoerserror(N_("unable parse timeout value")); + YYERROR; + } } | options NOPASSWD { $$.tags.nopasswd = true; @@ -1145,3 +1161,21 @@ init_parser(const char *path, bool quiet) debug_return_bool(ret); } + +/* + * Initialize all options in a cmndspec. + */ +static void +init_options(struct command_options *opts) +{ + TAGS_INIT(opts->tags); + opts->timeout = UNSPEC; +#ifdef HAVE_SELINUX + opts->role = NULL; + opts->type = NULL; +#endif +#ifdef HAVE_PRIV_SET + opts->privs = NULL; + opts->limitprivs = NULL; +#endif +} diff --git a/plugins/sudoers/ldap.c b/plugins/sudoers/ldap.c index 72b2f07a2..7a28cf116 100644 --- a/plugins/sudoers/ldap.c +++ b/plugins/sudoers/ldap.c @@ -2479,6 +2479,8 @@ sudo_ldap_display_entry_short(LDAP *ld, LDAPMessage *entry, struct passwd *pw, sudo_lbuf_append(lbuf, negated ? "NOSETENV: " : "SETENV: "); else if (strcmp(val, "mail_all_cmnds") == 0 || strcmp(val, "mail_always") == 0) sudo_lbuf_append(lbuf, negated ? "NOMAIL: " : "MAIL: "); + else if (!negated && strcmp(val, "command_timeout") == 0) + sudo_lbuf_append(lbuf, "TIMEOUT=%s", val); } ldap_value_free_len(bv); } diff --git a/plugins/sudoers/mkdefaults b/plugins/sudoers/mkdefaults index 654c5d8fe..603c95c71 100755 --- a/plugins/sudoers/mkdefaults +++ b/plugins/sudoers/mkdefaults @@ -147,6 +147,7 @@ sub print_record { elsif (/^T_LOGPRI/) { $v = "ival"; } elsif (/^T_TUPLE/) { $v = "tuple"; } elsif (/^T_FLOAT/) { $v = "fval"; } + elsif (/^T_TIMEOUT/) { $v = "ival"; } else { die "$0: unknown defaults type: $_\n"; } } printf HEADER "#define %-23s (sudo_defs_table[$defname].sd_un.${v})\n", diff --git a/plugins/sudoers/parse.c b/plugins/sudoers/parse.c index 08474a504..527dd96a7 100644 --- a/plugins/sudoers/parse.c +++ b/plugins/sudoers/parse.c @@ -145,7 +145,7 @@ sudo_file_setdefs(struct sudo_nss *nss) int sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag) { - int match, host_match, runas_match, cmnd_match; + int match, host_match, runas_match, cmnd_match, timeout; struct cmndspec *cs; struct cmndtag *tags = NULL; struct privilege *priv; @@ -227,6 +227,7 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag) if (cmnd_match != UNSPEC) { match = cmnd_match; tags = &cs->tags; + timeout = cs->timeout; #ifdef HAVE_SELINUX /* Set role and type if not specified on command line. */ if (user_role == NULL) { @@ -301,6 +302,8 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag) if (match == ALLOW) { SET(validated, VALIDATE_SUCCESS); CLR(validated, VALIDATE_FAILURE); + if (timeout > 0) + def_command_timeout = timeout; if (tags != NULL) { if (tags->nopasswd != UNSPEC) def_authenticate = !tags->nopasswd; @@ -370,6 +373,11 @@ sudo_file_append_cmnd(struct cmndspec *cs, struct cmndtag *tags, if (cs->type) sudo_lbuf_append(lbuf, "TYPE=%s ", cs->type); #endif /* HAVE_SELINUX */ + if (cs->timeout > 0) { + char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2]; + snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout); + sudo_lbuf_append(lbuf, "TIMEOUT=%s ", numbuf); + } if (TAG_CHANGED(setenv)) { tags->setenv = cs->tags.setenv; sudo_lbuf_append(lbuf, tags->setenv ? "SETENV: " : "NOSETENV: "); @@ -481,6 +489,8 @@ new_long_entry(struct cmndspec *cs, struct cmndspec *prev_cs) if (cs->type && (!prev_cs->type || strcmp(cs->type, prev_cs->type) != 0)) return true; #endif /* HAVE_SELINUX */ + if (cs->timeout != prev_cs->timeout) + return true; return false; } @@ -553,6 +563,11 @@ sudo_file_display_priv_long(struct passwd *pw, struct userspec *us, if (cs->type) sudo_lbuf_append(lbuf, " Type: %s\n", cs->type); #endif /* HAVE_SELINUX */ + if (cs->timeout > 0) { + char numbuf[(((sizeof(int) * 8) + 2) / 3) + 2]; + snprintf(numbuf, sizeof(numbuf), "%d", cs->timeout); + sudo_lbuf_append(lbuf, " Timeout: %s\n", numbuf); + } sudo_lbuf_append(lbuf, _(" Commands:\n")); } sudo_lbuf_append(lbuf, "\t"); diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h index 6450e2a29..452364832 100644 --- a/plugins/sudoers/parse.h +++ b/plugins/sudoers/parse.h @@ -113,7 +113,8 @@ struct cmndtag { * Per-command option container struct. */ struct command_options { - struct cmndtag tags; /* Command tags */ + struct cmndtag tags; /* tag specificaion */ + int timeout; /* command timeout */ #ifdef HAVE_SELINUX char *role, *type; /* SELinux role and type */ #endif @@ -168,6 +169,7 @@ struct privilege { /* * Structure describing a linked list of Cmnd_Specs. + * XXX - include struct command_options instad of its contents inline */ struct cmndspec { TAILQ_ENTRY(cmndspec) entries; @@ -175,6 +177,7 @@ struct cmndspec { struct member_list *runasgrouplist; /* list of runas groups */ struct member *cmnd; /* command to allow/deny */ struct cmndtag tags; /* tag specificaion */ + int timeout; /* command timeout */ #ifdef HAVE_SELINUX char *role, *type; /* SELinux role and type */ #endif @@ -275,4 +278,7 @@ int hexchar(const char *s); /* base64.c */ size_t base64_decode(const char *str, unsigned char *dst, size_t dsize); +/* timeout.c */ +int parse_timeout(const char *timestr); + #endif /* SUDOERS_PARSE_H */ diff --git a/plugins/sudoers/policy.c b/plugins/sudoers/policy.c index 4ee1e284e..857601fec 100644 --- a/plugins/sudoers/policy.c +++ b/plugins/sudoers/policy.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2016 Todd C. Miller + * Copyright (c) 2010-2017 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 @@ -580,6 +580,10 @@ sudoers_policy_exec_setup(char *argv[], char *envp[], mode_t cmnd_umask, if ((command_info[info_len++] = sudo_new_key_val("iolog_group", def_iolog_group)) == NULL) goto oom; } + if (def_command_timeout != 0) { + if (asprintf(&command_info[info_len++], "timeout=%u", def_command_timeout) == -1) + goto oom; + } if (cmnd_umask != ACCESSPERMS) { if (asprintf(&command_info[info_len++], "umask=0%o", (unsigned int)cmnd_umask) == -1) goto oom; diff --git a/plugins/sudoers/regress/sudoers/test17.in b/plugins/sudoers/regress/sudoers/test17.in new file mode 100644 index 000000000..37d066c46 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.in @@ -0,0 +1,13 @@ +# Test parsing of command_timeout and TIMEOUT syntax +Defaults command_timeout=2d8h10m59s +user0 ALL = TIMEOUT=7D4H10M30S /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls +user1 ALL = TIMEOUT=7d4h10m30s /usr/bin/id +user2 ALL = TIMEOUT=4h10m30s /usr/bin/id +user3 ALL = TIMEOUT=10m30s /usr/bin/id +user4 ALL = TIMEOUT=14d /usr/bin/id +user5 ALL = TIMEOUT=5m /usr/bin/id +user6 ALL = TIMEOUT=30s /usr/bin/id +user7 ALL = TIMEOUT=45 /usr/bin/id +user8 ALL = TIMEOUT=7d4h10m30s /usr/bin/id, TIMEOUT=4h10m30s /usr/bin/id, \ + TIMEOUT=10m30s /usr/bin/id, TIMEOUT=14d /usr/bin/id, \ + TIMEOUT=5m /usr/bin/id, TIMEOUT=30s /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test17.json.ok b/plugins/sudoers/regress/sudoers/test17.json.ok new file mode 100644 index 000000000..bd599f0ac --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.json.ok @@ -0,0 +1,180 @@ +{ + "Defaults": [ + { + "Options": [ + { "command_timeout": "2d8h10m59s" } + ] + } + ], + "User_Specs": [ + { + "User_List": [ + { "username": "user0" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/who" }, + { "command": "/bin/ls" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user1" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user2" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 15030 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user3" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 630 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user4" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 1209600 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user5" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 300 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user6" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 30 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user7" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 45 } + ], + "Commands": [ + { "command": "/usr/bin/id" } + ] + } + ] + }, + { + "User_List": [ + { "username": "user8" } + ], + "Host_List": [ + { "hostalias": "ALL" } + ], + "Cmnd_Specs": [ + { + "Options": [ + { "command_timeout": 619830 } + ], + "Commands": [ + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" }, + { "command": "/usr/bin/id" } + ] + } + ] + } + ] +} diff --git a/plugins/sudoers/regress/sudoers/test17.out.ok b/plugins/sudoers/regress/sudoers/test17.out.ok new file mode 100644 index 000000000..c76ef6056 --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.out.ok @@ -0,0 +1,14 @@ +Parses OK. + +Defaults command_timeout=2d8h10m59s + + +user0 ALL = TIMEOUT=619830 /usr/bin/id, TIMEOUT=619830 /usr/bin/who, /bin/ls +user1 ALL = TIMEOUT=619830 /usr/bin/id +user2 ALL = TIMEOUT=15030 /usr/bin/id +user3 ALL = TIMEOUT=630 /usr/bin/id +user4 ALL = TIMEOUT=1209600 /usr/bin/id +user5 ALL = TIMEOUT=300 /usr/bin/id +user6 ALL = TIMEOUT=30 /usr/bin/id +user7 ALL = TIMEOUT=45 /usr/bin/id +user8 ALL = TIMEOUT=619830 /usr/bin/id, TIMEOUT=15030 /usr/bin/id, TIMEOUT=630 /usr/bin/id, TIMEOUT=1209600 /usr/bin/id, TIMEOUT=300 /usr/bin/id, TIMEOUT=30 /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test17.toke.ok b/plugins/sudoers/regress/sudoers/test17.toke.ok new file mode 100644 index 000000000..17bb5fb5f --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test17.toke.ok @@ -0,0 +1,11 @@ +# +DEFAULTS DEFVAR = WORD(2) +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND , COMMAND , CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND , CMND_TIMEOUT = WORD(5) COMMAND diff --git a/plugins/sudoers/regress/sudoers/test18.in b/plugins/sudoers/regress/sudoers/test18.in new file mode 100644 index 000000000..8d94ec76d --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test18.in @@ -0,0 +1,8 @@ +# Test command_timeout and TIMEOUT syntax errors +Defaults command_timeout=2d8h10m59ss +Defaults:root command_timeout=15f +user0 ALL = TIMEOUT=7dd4h10m30s /usr/bin/id, /usr/bin/who, TIMEOUT=0 /bin/ls +user1 ALL = TIMEOUT=7d4h10mm30s /usr/bin/id +user2 ALL = TIMEOUT=4hg10m30s /usr/bin/id +user3 ALL = TIMEOUT=10m30ss /usr/bin/id +user4 ALL = TIMEOUT=14g /usr/bin/id diff --git a/plugins/sudoers/regress/sudoers/test18.json.ok b/plugins/sudoers/regress/sudoers/test18.json.ok new file mode 100644 index 000000000..e69de29bb diff --git a/plugins/sudoers/regress/sudoers/test18.out.ok b/plugins/sudoers/regress/sudoers/test18.out.ok new file mode 100644 index 000000000..74a9a38dc --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test18.out.ok @@ -0,0 +1,6 @@ +Parse error in sudoers near line 4 (problem with defaults entries). + +Defaults command_timeout=2d8h10m59ss +Defaults:root command_timeout=15f + + diff --git a/plugins/sudoers/regress/sudoers/test18.toke.ok b/plugins/sudoers/regress/sudoers/test18.toke.ok new file mode 100644 index 000000000..05fbaef0f --- /dev/null +++ b/plugins/sudoers/regress/sudoers/test18.toke.ok @@ -0,0 +1,10 @@ +# +DEFAULTS DEFVAR = WORD(2) +DEFAULTS_USER WORD(5) DEFVAR = WORD(2) +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND , COMMAND , CMND_TIMEOUT = WORD(5) COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +WORD(5) ALL = CMND_TIMEOUT = WORD(5) <*> COMMAND +testsudoers: sudoers:2 value "2d8h10m59ss" is invalid for option "command_timeout" +testsudoers: sudoers:3 value "15f" is invalid for option "command_timeout" diff --git a/plugins/sudoers/testsudoers.c b/plugins/sudoers/testsudoers.c index 67e495905..bfe4f2ad8 100644 --- a/plugins/sudoers/testsudoers.c +++ b/plugins/sudoers/testsudoers.c @@ -634,6 +634,8 @@ print_privilege(struct privilege *priv) if (cs->limitprivs) printf("LIMITPRIVS=%s ", cs->limitprivs); #endif /* HAVE_PRIV_SET */ + if (cs->timeout > 0) + printf("TIMEOUT=%d ", cs->timeout); if (TAG_CHANGED(follow)) printf("%sFOLLOW: ", cs->tags.follow ? "" : "NO"); if (TAG_CHANGED(log_input)) diff --git a/plugins/sudoers/timeout.c b/plugins/sudoers/timeout.c new file mode 100644 index 000000000..8d6cbfd2d --- /dev/null +++ b/plugins/sudoers/timeout.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2017 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. + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include +#include +#include +#include +#ifdef HAVE_STRING_H +# include +#endif /* HAVE_STRING_H */ +#ifdef HAVE_STRINGS_H +# include +#endif /* HAVE_STRINGS_H */ +#include +#include +#include + +#include "sudo_compat.h" +#include "sudoers_debug.h" +#include "parse.h" + +/* + * Parse a command timeout in sudoers in the format 1d2h3m4s + * (days, hours, minutes, seconds) or a number of seconds with no suffix. + * Returns the number of seconds or -1 on error. + */ +int +parse_timeout(const char *timestr) +{ + debug_decl(parse_timeout, SUDOERS_DEBUG_PARSER) + const char digits[] = "0123456789"; + const char suffixes[] = "dhms"; + const char *cp; + int timeout = 0; + size_t len = 0; + int idx = 0; + + for (cp = timestr; *cp != '\0'; cp += len) { + char ch; + long l; + + if ((len = strspn(cp, digits)) == 0) { + /* parse error */ + errno = EINVAL; + debug_return_int(-1); + } + if (cp[len] == '\0') { + /* no suffix, assume seconds. */ + ch = 's'; + } else { + ch = tolower(cp[len]); + len++; + } + + /* Find a matching suffix or return an error. */ + while (suffixes[idx] != ch) { + if (suffixes[idx] == '\0') { + /* parse error */ + errno = EINVAL; + debug_return_int(-1); + } + idx++; + } + + errno = 0; + l = strtol(cp, NULL, 10); + if (errno == ERANGE || l > INT_MAX) + goto overflow; + switch (ch) { + case 'd': + if (l > INT_MAX / (24 * 60 * 60)) + goto overflow; + l *= 24 * 60 * 60; + break; + case 'h': + if (l > INT_MAX / (60 * 60)) + goto overflow; + l *= 60 * 60; + break; + case 'm': + if (l > INT_MAX / 60) + goto overflow; + l *= 60; + break; + } + if (l > INT_MAX - timeout) + goto overflow; + + timeout += l; + } + + debug_return_int(timeout); +overflow: + errno = EOVERFLOW; + debug_return_int(-1); +} diff --git a/plugins/sudoers/toke.c b/plugins/sudoers/toke.c index f126a96e9..c03ad8356 100644 --- a/plugins/sudoers/toke.c +++ b/plugins/sudoers/toke.c @@ -306,105 +306,105 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 71 -#define YY_END_OF_BUFFER 72 -static yyconst short int yy_accept[862] = +#define YY_NUM_RULES 72 +#define YY_END_OF_BUFFER 73 +static yyconst short int yy_accept[868] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 72, 59, 67, 66, 65, 58, - 69, 38, 60, 61, 38, 62, 59, 59, 59, 59, - 64, 63, 70, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 70, 59, 59, 67, 69, - 50, 50, 50, 50, 50, 2, 70, 1, 59, 50, - 50, 59, 17, 16, 17, 16, 16, 70, 69, 70, - 3, 9, 8, 9, 4, 9, 5, 70, 13, 13, - 13, 11, 12, 70, 19, 19, 18, 18, 18, 19, + 0, 0, 0, 0, 73, 60, 68, 67, 66, 59, + 70, 38, 61, 62, 38, 63, 60, 60, 60, 60, + 65, 64, 71, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 71, 60, 60, 68, 70, + 51, 51, 51, 51, 51, 2, 71, 1, 60, 51, + 51, 60, 17, 16, 17, 16, 16, 71, 70, 71, + 3, 9, 8, 9, 4, 9, 5, 71, 13, 13, + 13, 11, 12, 71, 19, 19, 18, 18, 18, 19, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, - 18, 19, 19, 59, 0, 67, 65, 69, 69, 0, - 59, 40, 0, 38, 0, 39, 0, 57, 57, 0, - 59, 59, 0, 59, 59, 59, 59, 0, 43, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 59, 68, 59, 59, 67, 0, 0, - 0, 0, 0, 69, 59, 59, 59, 59, 59, 2, - 1, 0, 1, 51, 51, 0, 59, 17, 17, 15, - 14, 15, 0, 0, 3, 9, 0, 6, 7, 9, - 9, 13, 0, 13, 13, 0, 10, 40, 0, 0, - 39, 19, 19, 0, 19, 0, 0, 18, 18, 18, - - 18, 18, 18, 19, 19, 50, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 69, 69, 0, 40, 59, - 59, 59, 59, 59, 0, 0, 43, 43, 50, 45, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 59, 59, 0, 0, - 0, 0, 0, 69, 59, 59, 59, 59, 59, 0, - 59, 10, 0, 0, 0, 18, 18, 18, 19, 19, + 18, 19, 19, 60, 0, 68, 66, 70, 70, 0, + 60, 40, 0, 38, 0, 39, 0, 58, 58, 0, + 60, 60, 0, 60, 60, 60, 60, 0, 43, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 60, 69, 60, 60, 68, 0, + 0, 0, 0, 0, 70, 60, 60, 60, 60, 60, + 2, 1, 0, 1, 52, 52, 0, 60, 17, 17, + 15, 14, 15, 0, 0, 3, 9, 0, 6, 7, + 9, 9, 13, 0, 13, 13, 0, 10, 40, 0, + 0, 39, 19, 19, 0, 19, 0, 0, 18, 18, + + 18, 18, 18, 18, 19, 19, 51, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 70, 70, 0, 40, + 60, 60, 60, 60, 60, 0, 0, 43, 43, 51, + 45, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 60, 60, + 0, 0, 0, 0, 0, 70, 60, 60, 60, 60, + 60, 0, 60, 10, 0, 0, 0, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 69, 59, 59, 59, 59, 59, 59, - 0, 44, 44, 44, 0, 0, 43, 43, 43, 43, - - 43, 43, 43, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 46, 50, 47, - 59, 59, 59, 59, 0, 0, 0, 0, 0, 69, - 59, 59, 59, 59, 0, 0, 0, 0, 0, 18, - 18, 19, 19, 50, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 59, 59, 59, - 0, 0, 44, 44, 44, 0, 43, 43, 0, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 0, 27, 50, 50, 50, 50, 0, 34, 50, 50, - 50, 50, 50, 50, 50, 48, 50, 59, 59, 59, - - 59, 59, 0, 0, 0, 69, 59, 59, 59, 0, - 0, 0, 18, 18, 19, 50, 50, 19, 19, 19, + 19, 19, 19, 19, 19, 70, 60, 60, 60, 60, + 60, 60, 0, 44, 44, 44, 0, 0, 43, 43, + + 43, 43, 43, 43, 43, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 47, + 51, 51, 48, 60, 60, 60, 60, 0, 0, 0, + 0, 0, 70, 60, 60, 60, 60, 0, 0, 0, + 0, 0, 18, 18, 19, 19, 51, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 59, 59, 59, 59, 59, 0, 44, 0, 43, 43, - 43, 0, 0, 0, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 52, - 53, 54, 55, 59, 0, 0, 69, 59, 59, 59, - 0, 0, 0, 0, 0, 19, 50, 50, 19, 19, - 50, 19, 19, 19, 19, 19, 19, 19, 19, 19, - - 19, 41, 41, 41, 0, 0, 43, 43, 43, 43, - 43, 43, 43, 0, 0, 0, 0, 0, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 0, 36, 50, 50, 50, 0, 26, 50, - 50, 50, 0, 35, 50, 50, 0, 25, 0, 28, - 59, 0, 0, 69, 59, 59, 59, 41, 41, 41, - 50, 50, 19, 50, 50, 19, 19, 19, 59, 41, - 41, 41, 41, 0, 43, 0, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - - 43, 43, 43, 50, 50, 50, 50, 50, 50, 50, - 50, 56, 0, 0, 69, 59, 22, 51, 0, 41, - 41, 41, 41, 50, 50, 19, 50, 50, 19, 19, - 19, 42, 42, 42, 42, 43, 0, 0, 0, 43, + 60, 60, 60, 0, 0, 44, 44, 44, 0, 43, + 43, 0, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 0, 27, 51, 51, 51, 51, 0, + 34, 51, 51, 51, 51, 51, 51, 51, 49, 51, + + 51, 60, 60, 60, 60, 60, 0, 0, 0, 70, + 60, 60, 60, 0, 0, 0, 18, 18, 19, 51, + 51, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 60, 60, 60, 60, 60, 0, + 44, 0, 43, 43, 43, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 0, 0, 0, 0, 0, 43, 43, 43, - 43, 43, 43, 43, 43, 50, 50, 50, 0, 37, - 50, 50, 0, 24, 0, 29, 0, 22, 69, 69, - 59, 0, 59, 42, 42, 42, 42, 50, 50, 50, - 50, 59, 59, 42, 42, 42, 42, 0, 0, 0, - - 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 53, 54, 55, 56, 60, 0, + 0, 70, 60, 60, 60, 0, 0, 0, 0, 0, + 19, 51, 51, 19, 19, 51, 19, 19, 19, 19, + + 19, 19, 19, 19, 19, 19, 41, 41, 41, 0, + 0, 43, 43, 43, 43, 43, 43, 43, 0, 0, + 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 0, 36, 51, + 51, 51, 0, 26, 51, 51, 51, 0, 35, 51, + 51, 0, 25, 0, 28, 46, 60, 0, 0, 70, + 60, 60, 60, 41, 41, 41, 51, 51, 19, 51, + 51, 19, 19, 19, 60, 41, 41, 41, 41, 0, + 43, 0, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 0, 0, 0, 43, 43, 43, 43, + + 43, 43, 43, 43, 43, 43, 43, 43, 43, 51, + 51, 51, 51, 51, 51, 51, 51, 57, 0, 0, + 70, 60, 22, 52, 0, 41, 41, 41, 41, 51, + 51, 19, 51, 51, 19, 19, 19, 42, 42, 42, + 42, 43, 0, 0, 0, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, + 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, + 43, 51, 51, 51, 0, 37, 51, 51, 0, 24, + 0, 29, 0, 22, 70, 70, 60, 0, 60, 42, + 42, 42, 42, 51, 51, 51, 51, 60, 60, 42, + + 42, 42, 42, 0, 0, 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 49, 0, 32, 50, 50, 50, 0, 69, - 69, 20, 69, 23, 22, 0, 0, 0, 0, 0, - 22, 0, 0, 0, 42, 42, 42, 42, 50, 50, - 50, 59, 59, 59, 0, 0, 0, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 50, 0, + 32, 51, 51, 51, 0, 70, 70, 20, 70, 23, + 22, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 42, 42, 42, 42, 51, 51, 51, 60, 60, 60, + 0, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 0, 30, 50, 50, 23, - 69, 0, 22, 0, 0, 0, 50, 50, 59, 59, - 59, 59, 59, 0, 0, 0, 0, 0, 43, 43, - - 43, 43, 43, 43, 43, 43, 0, 33, 50, 69, - 0, 0, 0, 0, 0, 50, 59, 59, 59, 43, - 43, 43, 43, 43, 43, 0, 31, 69, 69, 21, - 0, 0, 0, 59, 59, 59, 59, 59, 43, 43, - 43, 43, 43, 0, 0, 0, 0, 0, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 0 + 43, 0, 30, 51, 51, 23, 70, 0, 22, 0, + 0, 0, 51, 51, 60, 60, 60, 60, 60, 0, + + 0, 0, 0, 0, 43, 43, 43, 43, 43, 43, + 43, 43, 0, 33, 51, 70, 0, 0, 0, 0, + 0, 51, 60, 60, 60, 43, 43, 43, 43, 43, + 43, 0, 31, 70, 70, 21, 0, 0, 0, 60, + 60, 60, 60, 60, 43, 43, 43, 43, 43, 0, + 0, 0, 0, 0, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 0 } ; static yyconst int yy_ec[256] = @@ -451,229 +451,231 @@ static yyconst int yy_meta[72] = 21 } ; -static yyconst short int yy_base[979] = +static yyconst short int yy_base[985] = { 0, 0, 70, 72, 80, 87, 126, 178, 248, 156, 200, - 132, 140, 319, 0, 4925, 4863, 4908, 5587, 4903, 5587, - 388, 95, 5587, 5587, 4853, 5587, 142, 400, 198, 155, - 4878, 5587, 5587, 460, 4863, 37, 40, 516, 62, 4868, - 4851, 49, 4846, 4852, 4831, 575, 590, 125, 223, 613, - 33, 45, 4815, 38, 4805, 94, 4860, 4866, 434, 4822, - 4832, 136, 0, 5587, 4857, 5587, 0, 615, 674, 108, - 0, 4800, 5587, 70, 5587, 104, 5587, 152, 4799, 73, - 135, 5587, 161, 171, 651, 705, 749, 256, 245, 807, - 857, 4807, 82, 151, 913, 4801, 4811, 4797, 4807, 4802, - - 960, 0, 94, 4782, 645, 4831, 4824, 4824, 5587, 266, - 541, 204, 4813, 614, 718, 4771, 843, 947, 4767, 984, - 997, 1035, 4793, 4804, 572, 719, 276, 4790, 175, 1080, - 1125, 4767, 4772, 4761, 4757, 4759, 4756, 406, 4728, 4705, - 4698, 4688, 4688, 391, 5587, 173, 339, 637, 4666, 4663, - 4650, 4644, 4645, 397, 133, 385, 139, 349, 395, 257, - 4711, 731, 4710, 1019, 4658, 1036, 345, 0, 4706, 296, - 5587, 5587, 941, 393, 0, 4649, 654, 5587, 5587, 4643, - 552, 4641, 4687, 435, 595, 425, 4689, 649, 981, 1159, - 4637, 1165, 0, 1194, 1222, 1189, 1057, 1261, 4675, 1100, - - 1221, 840, 1311, 1367, 4631, 0, 4635, 4599, 4597, 4592, - 991, 4583, 4580, 4571, 4563, 4614, 4609, 1236, 1246, 1414, - 1281, 985, 1454, 4595, 4580, 1499, 674, 1545, 1590, 1635, - 4573, 4557, 4558, 4537, 4548, 4534, 4541, 4538, 4550, 4549, - 4543, 4522, 4518, 4528, 4525, 4522, 976, 398, 4489, 4487, - 4477, 4475, 4480, 541, 411, 4483, 396, 490, 499, 1438, - 515, 4535, 4522, 4521, 1682, 1692, 4520, 1737, 0, 4494, - 4480, 4464, 4476, 4464, 4471, 4470, 4454, 4453, 4444, 4430, - 4441, 625, 4407, 4470, 1782, 415, 0, 0, 1061, 658, - 4446, 4445, 1820, 606, 4358, 4357, 702, 1387, 1833, 1435, - - 1110, 1879, 1926, 4356, 660, 4338, 4333, 645, 677, 4345, - 4338, 4341, 4338, 4329, 4327, 4323, 4326, 0, 4329, 0, - 832, 176, 419, 648, 4312, 4314, 4298, 4312, 4298, 660, - 516, 1081, 708, 672, 1474, 4351, 4350, 4349, 1191, 1936, - 1981, 776, 4319, 678, 820, 4327, 4320, 4323, 4320, 4300, - 4298, 4294, 4301, 249, 4318, 4324, 4281, 2028, 2040, 2052, - 4313, 4312, 2062, 4312, 4310, 4309, 4308, 828, 1519, 1139, - 1565, 1162, 2075, 0, 1612, 2122, 1655, 1291, 2168, 2215, - 884, 5587, 4283, 4288, 4289, 4282, 965, 5587, 4276, 4267, - 4252, 4265, 4258, 4269, 4269, 0, 4251, 533, 781, 709, - - 980, 896, 4244, 4226, 4227, 937, 1079, 1109, 1116, 4280, - 4279, 2227, 2237, 4244, 4143, 4139, 4121, 4125, 4095, 4069, - 4071, 4053, 4053, 4042, 4014, 4031, 4017, 4011, 4006, 3948, - 2282, 1035, 2322, 2334, 1667, 3979, 3978, 3977, 3966, 2344, - 1178, 3965, 3953, 2391, 1198, 1299, 1403, 1712, 1749, 2403, - 0, 1762, 2450, 1792, 1484, 2496, 2543, 2568, 1188, 1246, - 1394, 1313, 1419, 1880, 1338, 1393, 1440, 1481, 1524, 3902, - 3890, 3855, 3847, 946, 3863, 3811, 1167, 1164, 575, 983, - 1802, 3860, 3859, 3858, 1577, 1525, 3811, 3801, 1526, 3786, - 1510, 1547, 3753, 3736, 1615, 1616, 0, 0, 0, 0, - - 3712, 2625, 1853, 1722, 3737, 3734, 3687, 1908, 2665, 1956, - 1812, 2710, 2757, 2001, 3675, 3667, 3666, 1968, 1454, 1758, - 1893, 2017, 2095, 2135, 2769, 0, 2148, 2816, 2188, 2105, - 2862, 2909, 1617, 5587, 2934, 1023, 1596, 1637, 5587, 1411, - 1001, 2122, 1695, 5587, 1752, 2181, 1763, 5587, 1858, 5587, - 1393, 3591, 3557, 1130, 2210, 1220, 1721, 3604, 3595, 2991, - 3549, 3540, 3006, 3490, 3464, 1829, 786, 3418, 3062, 1493, - 3101, 0, 1391, 3461, 3446, 2258, 2041, 2292, 2145, 3141, - 0, 2304, 3154, 2364, 2268, 3199, 3246, 3449, 3378, 3258, - 2311, 2380, 2416, 2425, 3364, 2429, 3270, 0, 2472, 3317, - - 2516, 2429, 3364, 3389, 1040, 893, 1915, 1836, 1498, 1981, - 2102, 3301, 3282, 3252, 2100, 1519, 2519, 3264, 2635, 3292, - 3282, 3258, 2646, 3206, 3179, 3459, 3182, 3161, 2007, 2008, - 0, 3517, 2652, 2685, 1619, 3173, 3177, 3142, 3557, 3087, - 2305, 2427, 2730, 2532, 3569, 0, 2791, 3582, 2836, 2483, - 3627, 3674, 2882, 3098, 3077, 3020, 2697, 2746, 2898, 3074, - 1273, 1309, 3686, 0, 2848, 1837, 2171, 1615, 2170, 5587, - 1399, 1871, 2216, 5587, 2264, 5587, 2834, 2368, 1742, 1858, - 2280, 2817, 3088, 2802, 2750, 3698, 2742, 2430, 2548, 2523, - 2452, 3708, 1976, 3748, 0, 2192, 2318, 3085, 2743, 2723, - - 2705, 3113, 2686, 2570, 2666, 2792, 3126, 3006, 3788, 0, - 3176, 3801, 3219, 3119, 3846, 3893, 2509, 2482, 3904, 3235, - 2442, 1772, 2403, 2736, 5587, 2794, 1916, 1979, 2329, 2288, - 2173, 5587, 2261, 2212, 3199, 3304, 3309, 3314, 2182, 2934, - 1982, 3389, 3527, 1994, 1948, 1908, 3448, 1902, 2737, 2889, - 3180, 3916, 3928, 3940, 1873, 1867, 3952, 1808, 1740, 3085, - 3155, 3537, 3298, 3964, 0, 3604, 3977, 3647, 3547, 4024, - 1731, 1704, 1674, 3658, 1667, 2886, 5587, 2888, 2080, 5587, - 2219, 3718, 3728, 1630, 1585, 4036, 2914, 3296, 4048, 2320, - 4060, 4072, 3763, 3769, 1578, 1492, 1467, 3615, 1368, 1248, - - 3330, 1233, 1220, 4084, 0, 2368, 3033, 5587, 3297, 2325, - 3821, 1183, 1094, 1016, 3833, 3126, 4096, 4108, 4120, 3866, - 3997, 4130, 924, 0, 830, 3181, 5587, 754, 2492, 5587, - 694, 586, 4142, 4154, 3100, 4166, 4178, 3878, 5587, 4188, - 4198, 3738, 5587, 4208, 571, 286, 244, 4009, 4218, 4256, - 4294, 4228, 4238, 4266, 55, 4332, 4248, 5587, 4304, 3779, - 5587, 4385, 4406, 4427, 4448, 4469, 4490, 4511, 4532, 4553, - 4562, 2563, 4582, 4603, 2523, 4624, 4645, 4666, 4687, 4708, - 4729, 4750, 4771, 2567, 4792, 4801, 4809, 4818, 4838, 4859, - 4880, 2794, 4901, 4922, 4943, 4964, 4985, 4994, 5013, 5022, - - 5031, 2466, 2897, 5039, 5047, 5055, 5064, 5072, 5079, 5087, - 5095, 5104, 5114, 2898, 3084, 5122, 5130, 5138, 3085, 3187, - 5147, 5157, 5177, 3234, 5186, 5194, 3235, 5203, 5213, 5233, - 2681, 2785, 5242, 5254, 5263, 5273, 3238, 3342, 5282, 5292, - 5301, 5321, 2832, 5330, 5342, 3347, 3348, 5351, 5361, 3352, - 5370, 5380, 5400, 5421, 5442, 3353, 3357, 5462, 3358, 5469, - 5479, 2926, 3006, 5488, 3559, 5508, 3460, 3598, 5517, 5527, - 3615, 3643, 5535, 5545, 5565, 4279, 3763, 3817 + 132, 140, 319, 0, 4881, 4827, 4873, 5615, 4868, 5615, + 388, 95, 5615, 5615, 4816, 5615, 142, 400, 198, 155, + 4842, 5615, 5615, 460, 4825, 37, 40, 516, 62, 4834, + 4820, 49, 4818, 4822, 58, 575, 590, 125, 223, 613, + 33, 45, 4788, 38, 4785, 121, 4839, 4846, 434, 4804, + 4816, 136, 0, 5615, 4840, 5615, 0, 615, 674, 152, + 0, 4782, 5615, 104, 5615, 112, 5615, 161, 4781, 73, + 173, 5615, 189, 204, 651, 705, 749, 256, 245, 807, + 857, 4789, 57, 157, 913, 4783, 4793, 4779, 4772, 4737, + + 960, 0, 128, 4713, 645, 4761, 4756, 4756, 5615, 266, + 541, 614, 4737, 617, 718, 4692, 843, 947, 4690, 984, + 997, 1035, 4716, 4727, 572, 719, 276, 4714, 96, 1080, + 1125, 4699, 4704, 4690, 4683, 4686, 4682, 406, 4673, 4680, + 4677, 4652, 4656, 4623, 391, 5615, 133, 171, 992, 4596, + 4599, 4590, 4584, 4585, 397, 349, 385, 395, 383, 339, + 154, 4647, 731, 4643, 1034, 4587, 1160, 547, 0, 4633, + 256, 5615, 5615, 941, 267, 0, 4581, 654, 5615, 5615, + 4580, 672, 4572, 4619, 401, 595, 296, 4617, 663, 676, + 1187, 4563, 1193, 0, 1222, 1250, 1021, 1055, 1289, 4599, + + 1100, 1219, 840, 1339, 1395, 4572, 0, 4575, 4568, 4571, + 4567, 963, 4550, 4548, 4535, 4529, 4581, 4580, 1249, 1264, + 1442, 1274, 1065, 1482, 4561, 4548, 1527, 528, 1573, 1618, + 1663, 4537, 4527, 4528, 4511, 4524, 4512, 4519, 4511, 4518, + 4516, 4510, 4497, 4493, 4507, 4478, 4477, 4472, 1108, 384, + 4438, 4443, 4433, 4435, 4441, 541, 586, 4444, 499, 342, + 500, 1206, 633, 4410, 4397, 4396, 1710, 1720, 4395, 1765, + 0, 4376, 4367, 4352, 4365, 4353, 4360, 4359, 4371, 4370, + 4365, 4352, 4363, 447, 4329, 4392, 1810, 214, 0, 0, + 1108, 529, 4368, 4367, 1848, 411, 4366, 4365, 702, 1309, + + 1861, 1415, 1157, 1907, 1954, 4364, 620, 4346, 4341, 641, + 681, 4353, 4346, 4338, 4335, 4326, 4324, 4320, 4323, 0, + 4326, 4324, 0, 832, 975, 668, 942, 4308, 4310, 4294, + 4308, 4294, 564, 532, 1081, 419, 949, 1452, 4347, 4346, + 4345, 1321, 1964, 2009, 776, 4315, 665, 820, 4323, 4316, + 4318, 4315, 4306, 4303, 4299, 4294, 1013, 4311, 4317, 4274, + 2056, 2068, 2080, 4306, 4305, 2090, 4305, 4272, 4195, 4183, + 828, 1462, 1183, 1502, 1187, 2103, 0, 1549, 2150, 1593, + 1425, 2196, 2243, 884, 5615, 4147, 4141, 4121, 4103, 965, + 5615, 4107, 4087, 4061, 4063, 4033, 4033, 4020, 0, 4003, + + 4003, 635, 709, 704, 988, 896, 3980, 3962, 3963, 1150, + 996, 982, 1152, 4017, 4006, 2255, 2265, 3981, 3945, 3941, + 3923, 3904, 3888, 3867, 3863, 3856, 3867, 3867, 3834, 3856, + 3836, 3837, 3838, 3786, 2310, 610, 2350, 2362, 1605, 3805, + 3802, 3784, 3777, 2372, 1164, 3777, 3774, 2419, 1178, 1631, + 1640, 1683, 1645, 2431, 0, 1742, 2478, 1785, 1472, 2524, + 2571, 2596, 1509, 1274, 1062, 1227, 1529, 1810, 1341, 1506, + 1723, 1366, 1421, 1665, 3728, 3720, 3688, 3664, 648, 3679, + 3644, 947, 1192, 592, 781, 1821, 3669, 3649, 3624, 1560, + 1422, 3581, 3565, 1507, 3557, 1173, 1508, 3541, 3548, 1666, + + 1688, 0, 0, 0, 0, 3519, 2653, 1881, 1753, 3534, + 3514, 3490, 1927, 2693, 1984, 1797, 2738, 2785, 2029, 3501, + 3486, 3477, 1838, 1646, 1834, 1836, 1943, 2123, 2045, 2797, + 0, 2172, 2844, 2216, 1891, 2890, 2937, 1765, 5615, 2962, + 1214, 992, 1887, 5615, 994, 1125, 2156, 1888, 5615, 1631, + 2209, 1933, 5615, 1934, 5615, 3382, 1101, 3343, 3303, 1216, + 2238, 708, 1283, 3357, 3334, 3019, 3297, 3291, 3034, 3238, + 3207, 1714, 786, 3184, 3090, 1208, 3129, 0, 1931, 3210, + 3158, 2286, 2069, 2320, 2332, 3169, 0, 2333, 3182, 2392, + 1994, 3227, 3274, 3166, 3160, 3286, 2408, 2443, 2445, 2453, + + 3124, 2458, 3298, 0, 2500, 3345, 2544, 2133, 3392, 3417, + 893, 1253, 2129, 1621, 1014, 2130, 2175, 3079, 2999, 2978, + 1598, 1262, 2547, 2993, 2663, 2952, 2951, 2902, 2297, 2869, + 2825, 3487, 2828, 2797, 1990, 1991, 0, 3545, 2673, 2713, + 1512, 2766, 2774, 2770, 3585, 2739, 2334, 2351, 2758, 2456, + 3597, 0, 2819, 3610, 2864, 2511, 3655, 3702, 2910, 2726, + 2686, 2610, 2725, 2459, 2774, 2926, 1337, 1648, 3714, 0, + 2876, 1448, 2197, 1524, 2035, 5615, 1661, 1667, 2036, 5615, + 2223, 5615, 2553, 2396, 1790, 2358, 2453, 2845, 3114, 2587, + 2538, 3726, 2685, 2268, 2576, 2551, 2479, 3736, 1075, 3776, + + 0, 2033, 2143, 3105, 2466, 2412, 2406, 3117, 2373, 2331, + 2560, 2694, 3139, 2820, 3816, 0, 3152, 3829, 3202, 3212, + 3874, 3921, 2304, 2235, 3932, 3150, 2228, 1976, 2014, 2481, + 5615, 2822, 1666, 1987, 1949, 1958, 2200, 5615, 2127, 1881, + 3272, 3332, 3337, 3342, 1902, 2962, 1835, 3417, 3247, 1847, + 1833, 1805, 3476, 1797, 2764, 2917, 3208, 3944, 3956, 3968, + 1780, 1752, 3980, 1722, 1691, 3034, 3183, 3555, 3275, 3992, + 0, 3567, 4005, 3630, 3640, 4052, 1632, 1612, 1605, 3676, + 1587, 2765, 5615, 2916, 2195, 5615, 2290, 3682, 3746, 1522, + 1443, 4064, 2942, 3324, 4076, 2348, 4088, 4100, 3758, 3796, + + 1435, 1408, 1302, 3766, 1199, 1191, 3326, 1156, 1094, 4112, + 0, 2453, 3061, 5615, 3325, 2353, 3849, 1031, 973, 927, + 3788, 3115, 4124, 4136, 4148, 3894, 4025, 4158, 777, 0, + 556, 3209, 5615, 542, 2416, 5615, 455, 382, 4170, 4182, + 2733, 4194, 4206, 3906, 5615, 4216, 4226, 3806, 5615, 4236, + 286, 194, 187, 3861, 4246, 4284, 4322, 4256, 4266, 4294, + 53, 4360, 4038, 5615, 4304, 4276, 5615, 4413, 4434, 4455, + 4476, 4497, 4518, 4539, 4560, 4581, 4590, 2187, 4610, 4631, + 2551, 4652, 4673, 4694, 4715, 4736, 4757, 4778, 4799, 2235, + 4820, 4829, 4837, 4846, 4866, 4887, 4908, 2822, 4929, 4950, + + 4971, 4992, 5013, 5022, 5041, 5050, 5059, 2774, 2925, 5067, + 5075, 5083, 5092, 5100, 5107, 5115, 5123, 5132, 5142, 2926, + 3129, 5150, 5158, 5166, 3164, 3168, 5175, 5185, 5205, 3262, + 5214, 5222, 3268, 5231, 5241, 5261, 2512, 2592, 5270, 5282, + 5291, 5301, 3370, 3371, 5310, 5320, 5329, 5349, 2692, 5358, + 5370, 3375, 3376, 5379, 5389, 3380, 5398, 5408, 5428, 5449, + 5470, 3381, 3385, 5490, 3386, 5497, 5507, 2709, 2813, 5516, + 3579, 5536, 3488, 3583, 5545, 5555, 3584, 3626, 5563, 5573, + 5593, 4335, 3651, 3671 } ; -static yyconst short int yy_def[979] = +static yyconst short int yy_def[985] = { 0, - 861, 1, 1, 1, 862, 862, 863, 863, 864, 864, - 865, 865, 861, 13, 861, 866, 861, 861, 861, 861, - 867, 868, 861, 861, 869, 861, 870, 866, 28, 28, - 871, 861, 861, 861, 34, 34, 34, 34, 38, 38, - 38, 38, 38, 38, 38, 866, 28, 866, 861, 867, - 34, 34, 38, 38, 38, 861, 872, 861, 873, 38, - 38, 866, 874, 861, 874, 861, 874, 861, 867, 861, - 875, 876, 861, 876, 861, 876, 861, 877, 878, 878, - 878, 861, 861, 879, 880, 881, 861, 87, 87, 87, - 861, 91, 91, 91, 91, 95, 95, 95, 95, 95, - - 87, 90, 90, 866, 866, 861, 861, 882, 861, 883, - 861, 868, 884, 879, 868, 869, 869, 870, 885, 866, - 866, 28, 886, 122, 122, 122, 122, 887, 888, 38, + 867, 1, 1, 1, 868, 868, 869, 869, 870, 870, + 871, 871, 867, 13, 867, 872, 867, 867, 867, 867, + 873, 874, 867, 867, 875, 867, 876, 872, 28, 28, + 877, 867, 867, 867, 34, 34, 34, 34, 38, 38, + 38, 38, 38, 38, 38, 872, 28, 872, 867, 873, + 34, 34, 38, 38, 38, 867, 878, 867, 879, 38, + 38, 872, 880, 867, 880, 867, 880, 867, 873, 867, + 881, 882, 867, 882, 867, 882, 867, 883, 884, 884, + 884, 867, 867, 885, 886, 887, 867, 87, 87, 87, + 867, 91, 91, 91, 91, 95, 95, 95, 95, 95, + + 87, 90, 90, 872, 872, 867, 867, 888, 867, 889, + 867, 874, 890, 885, 874, 875, 875, 876, 891, 872, + 872, 28, 892, 122, 122, 122, 122, 893, 894, 38, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 866, 861, 866, 866, 861, 861, 861, - 861, 861, 861, 882, 866, 122, 866, 866, 866, 861, - 861, 861, 861, 889, 890, 866, 866, 891, 891, 861, - 861, 861, 883, 861, 892, 893, 893, 861, 861, 893, - 893, 894, 861, 894, 894, 861, 861, 879, 879, 879, - 895, 896, 90, 895, 897, 861, 861, 87, 198, 198, - - 198, 198, 861, 203, 204, 898, 204, 204, 204, 204, - 204, 204, 204, 90, 90, 882, 899, 861, 861, 866, - 220, 220, 122, 223, 900, 861, 901, 861, 131, 229, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 866, 866, 861, 861, - 861, 861, 861, 882, 866, 223, 866, 866, 866, 861, - 866, 861, 902, 903, 861, 90, 266, 203, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 90, 90, 899, 866, 866, 220, 220, 220, 866, - 904, 905, 905, 293, 906, 905, 907, 228, 861, 299, - - 299, 861, 299, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 866, 866, 866, 866, 861, 861, 861, 861, 861, 882, - 866, 866, 866, 866, 861, 861, 902, 902, 861, 266, - 203, 204, 204, 908, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 90, 90, 90, 90, 220, 220, 220, - 861, 909, 909, 363, 909, 910, 911, 912, 861, 913, - 302, 913, 861, 373, 913, 861, 376, 376, 861, 376, - 861, 861, 230, 230, 230, 230, 861, 861, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 866, 866, 866, - - 866, 866, 861, 861, 861, 882, 866, 866, 866, 914, - 915, 861, 90, 341, 204, 908, 908, 204, 204, 204, - 204, 204, 204, 204, 204, 90, 90, 90, 90, 90, - 866, 866, 220, 220, 866, 916, 916, 917, 918, 861, - 861, 919, 920, 861, 921, 921, 922, 379, 922, 861, - 450, 922, 861, 453, 453, 861, 453, 861, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 866, - 866, 866, 866, 866, 861, 861, 923, 866, 866, 866, - 861, 861, 924, 924, 861, 204, 908, 908, 204, 204, - 908, 204, 204, 204, 204, 204, 90, 90, 90, 90, - - 90, 866, 502, 502, 861, 925, 926, 440, 861, 509, - 509, 861, 509, 861, 861, 927, 927, 861, 861, 928, - 928, 929, 456, 929, 861, 525, 929, 861, 528, 528, - 861, 528, 861, 861, 861, 535, 535, 861, 861, 535, - 535, 535, 861, 861, 535, 535, 861, 861, 861, 861, - 866, 861, 861, 930, 866, 866, 866, 931, 932, 861, - 933, 933, 861, 933, 933, 563, 563, 934, 866, 866, - 866, 571, 571, 861, 935, 861, 936, 512, 936, 936, - 580, 936, 861, 583, 583, 861, 583, 937, 938, 861, - 861, 939, 939, 940, 941, 940, 861, 597, 940, 861, - - 600, 600, 600, 861, 604, 604, 604, 604, 604, 604, - 604, 866, 861, 861, 942, 866, 866, 866, 861, 861, - 943, 943, 861, 944, 944, 861, 944, 944, 626, 626, - 945, 866, 632, 632, 632, 861, 946, 947, 861, 948, - 948, 949, 586, 949, 949, 645, 949, 861, 648, 648, - 861, 648, 861, 861, 950, 950, 861, 861, 951, 951, - 952, 952, 952, 663, 952, 604, 604, 604, 861, 861, - 604, 604, 861, 861, 861, 861, 861, 861, 953, 942, - 866, 954, 955, 956, 957, 861, 956, 958, 958, 958, - 958, 866, 866, 866, 694, 694, 866, 861, 861, 959, - - 959, 861, 861, 960, 960, 961, 651, 961, 961, 709, - 961, 861, 712, 712, 861, 712, 962, 963, 861, 861, - 964, 964, 604, 861, 861, 604, 604, 604, 861, 953, - 953, 861, 942, 866, 954, 954, 954, 954, 965, 954, - 966, 966, 861, 861, 956, 956, 861, 861, 958, 958, - 958, 694, 694, 694, 967, 968, 861, 861, 969, 969, - 970, 715, 970, 970, 764, 970, 861, 767, 767, 767, - 861, 962, 962, 861, 861, 861, 861, 604, 604, 861, - 942, 861, 861, 971, 972, 861, 958, 958, 694, 866, - 694, 694, 866, 861, 861, 967, 967, 861, 861, 973, - - 973, 974, 974, 974, 804, 804, 861, 861, 604, 975, - 861, 861, 971, 971, 861, 958, 694, 694, 694, 861, - 861, 861, 861, 976, 976, 861, 861, 975, 975, 861, - 977, 978, 861, 694, 866, 694, 694, 866, 861, 861, - 861, 861, 861, 861, 861, 977, 977, 861, 866, 866, - 866, 861, 861, 861, 866, 866, 866, 861, 861, 861, - 0, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861 + 131, 131, 131, 131, 872, 867, 872, 872, 867, 867, + 867, 867, 867, 867, 888, 872, 122, 872, 872, 872, + 867, 867, 867, 867, 895, 896, 872, 872, 897, 897, + 867, 867, 867, 889, 867, 898, 899, 899, 867, 867, + 899, 899, 900, 867, 900, 900, 867, 867, 885, 885, + 885, 901, 902, 90, 901, 903, 867, 867, 87, 199, + + 199, 199, 199, 867, 204, 205, 904, 205, 205, 205, + 205, 205, 205, 205, 90, 90, 888, 905, 867, 867, + 872, 221, 221, 122, 224, 906, 867, 907, 867, 131, + 230, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 872, 872, + 867, 867, 867, 867, 867, 888, 872, 224, 872, 872, + 872, 867, 872, 867, 908, 909, 867, 90, 268, 204, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 90, 90, 905, 872, 872, 221, 221, + 221, 872, 910, 911, 911, 295, 912, 911, 913, 229, + + 867, 301, 301, 867, 301, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 872, 872, 872, 872, 867, 867, 867, + 867, 867, 888, 872, 872, 872, 872, 867, 867, 908, + 908, 867, 268, 204, 205, 205, 914, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 90, 90, 90, 90, + 221, 221, 221, 867, 915, 915, 366, 915, 916, 917, + 918, 867, 919, 304, 919, 867, 376, 919, 867, 379, + 379, 867, 379, 867, 867, 231, 231, 231, 231, 867, + 867, 231, 231, 231, 231, 231, 231, 231, 231, 231, + + 231, 872, 872, 872, 872, 872, 867, 867, 867, 888, + 872, 872, 872, 920, 921, 867, 90, 344, 205, 914, + 914, 205, 205, 205, 205, 205, 205, 205, 205, 90, + 90, 90, 90, 90, 872, 872, 221, 221, 872, 922, + 922, 923, 924, 867, 867, 925, 926, 867, 927, 927, + 928, 382, 928, 867, 454, 928, 867, 457, 457, 867, + 457, 867, 462, 462, 462, 462, 462, 462, 462, 462, + 462, 462, 462, 462, 872, 872, 872, 872, 872, 867, + 867, 929, 872, 872, 872, 867, 867, 930, 930, 867, + 205, 914, 914, 205, 205, 914, 205, 205, 205, 205, + + 205, 90, 90, 90, 90, 90, 872, 507, 507, 867, + 931, 932, 444, 867, 514, 514, 867, 514, 867, 867, + 933, 933, 867, 867, 934, 934, 935, 460, 935, 867, + 530, 935, 867, 533, 533, 867, 533, 867, 867, 867, + 540, 540, 867, 867, 540, 540, 540, 867, 867, 540, + 540, 867, 867, 867, 867, 540, 872, 867, 867, 936, + 872, 872, 872, 937, 938, 867, 939, 939, 867, 939, + 939, 569, 569, 940, 872, 872, 872, 577, 577, 867, + 941, 867, 942, 517, 942, 942, 586, 942, 867, 589, + 589, 867, 589, 943, 944, 867, 867, 945, 945, 946, + + 947, 946, 867, 603, 946, 867, 606, 606, 606, 867, + 610, 610, 610, 610, 610, 610, 610, 872, 867, 867, + 948, 872, 872, 872, 867, 867, 949, 949, 867, 950, + 950, 867, 950, 950, 632, 632, 951, 872, 638, 638, + 638, 867, 952, 953, 867, 954, 954, 955, 592, 955, + 955, 651, 955, 867, 654, 654, 867, 654, 867, 867, + 956, 956, 867, 867, 957, 957, 958, 958, 958, 669, + 958, 610, 610, 610, 867, 867, 610, 610, 867, 867, + 867, 867, 867, 867, 959, 948, 872, 960, 961, 962, + 963, 867, 962, 964, 964, 964, 964, 872, 872, 872, + + 700, 700, 872, 867, 867, 965, 965, 867, 867, 966, + 966, 967, 657, 967, 967, 715, 967, 867, 718, 718, + 867, 718, 968, 969, 867, 867, 970, 970, 610, 867, + 867, 610, 610, 610, 867, 959, 959, 867, 948, 872, + 960, 960, 960, 960, 971, 960, 972, 972, 867, 867, + 962, 962, 867, 867, 964, 964, 964, 700, 700, 700, + 973, 974, 867, 867, 975, 975, 976, 721, 976, 976, + 770, 976, 867, 773, 773, 773, 867, 968, 968, 867, + 867, 867, 867, 610, 610, 867, 948, 867, 867, 977, + 978, 867, 964, 964, 700, 872, 700, 700, 872, 867, + + 867, 973, 973, 867, 867, 979, 979, 980, 980, 980, + 810, 810, 867, 867, 610, 981, 867, 867, 977, 977, + 867, 964, 700, 700, 700, 867, 867, 867, 867, 982, + 982, 867, 867, 981, 981, 867, 983, 984, 867, 700, + 872, 700, 700, 872, 867, 867, 867, 867, 867, 867, + 867, 983, 983, 867, 872, 872, 872, 867, 867, 867, + 872, 872, 872, 867, 867, 867, 0, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867 } ; -static yyconst short int yy_nxt[5659] = +static yyconst short int yy_nxt[5687] = { 0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 16, 25, 26, 16, 16, 27, 28, 29, 30, 28, 28, @@ -682,31 +684,31 @@ static yyconst short int yy_nxt[5659] = 40, 41, 38, 42, 43, 44, 45, 38, 38, 38, 38, 38, 46, 16, 47, 47, 47, 47, 47, 47, 16, 16, 16, 16, 16, 16, 16, 16, 48, 16, - 16, 49, 131, 56, 184, 50, 131, 57, 139, 131, + 16, 49, 131, 56, 185, 50, 131, 57, 139, 131, 141, 56, 134, 58, 131, 57, 59, 133, 17, 64, - 65, 58, 66, 140, 59, 160, 178, 155, 66, 135, + 65, 58, 66, 140, 59, 143, 205, 156, 66, 135, - 113, 51, 52, 156, 136, 161, 53, 105, 158, 174, - 145, 60, 66, 67, 54, 61, 38, 55, 38, 60, - 114, 204, 177, 61, 38, 183, 38, 17, 64, 65, - 179, 66, 207, 80, 18, 81, 82, 66, 185, 68, + 113, 51, 52, 157, 136, 105, 53, 208, 159, 144, + 227, 60, 66, 67, 54, 61, 38, 55, 38, 60, + 114, 229, 161, 61, 38, 184, 38, 17, 64, 65, + 179, 66, 162, 80, 18, 81, 82, 66, 180, 68, 62, 80, 18, 81, 82, 119, 119, 115, 62, 119, - 119, 66, 67, 181, 145, 214, 177, 17, 18, 19, - 73, 69, 186, 187, 215, 182, 74, 75, 76, 119, - 126, 126, 126, 126, 126, 127, 113, 105, 68, 17, - 18, 19, 77, 69, 83, 105, 146, 183, 105, 226, - 204, 105, 83, 208, 120, 147, 189, 146, 255, 400, + 119, 66, 67, 175, 146, 161, 178, 17, 18, 19, + 73, 69, 182, 146, 178, 162, 74, 75, 76, 119, + 126, 126, 126, 126, 126, 127, 186, 105, 68, 17, + 18, 19, 77, 69, 83, 105, 147, 249, 105, 215, + 187, 188, 83, 183, 120, 148, 205, 147, 216, 209, - 228, 17, 18, 19, 73, 69, 167, 257, 78, 861, + 850, 17, 18, 19, 73, 69, 168, 850, 78, 113, 74, 75, 76, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 190, 148, 105, 77, 247, 105, 861, + 125, 125, 125, 105, 149, 184, 77, 287, 250, 190, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 17, - 18, 19, 78, 69, 149, 150, 115, 844, 160, 151, - 201, 201, 201, 201, 201, 202, 426, 152, 161, 427, - 153, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 111, 111, 111, 111, 111, 111, 111, 111, 111, - 111, 224, 224, 224, 224, 224, 224, 174, 145, 844, + 18, 19, 78, 69, 150, 151, 191, 175, 146, 152, + 202, 202, 202, 202, 202, 203, 105, 153, 175, 146, + 154, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 225, 225, 225, 225, 225, 225, 187, 188, 850, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 33, @@ -717,589 +719,592 @@ static yyconst short int yy_nxt[5659] = 98, 95, 99, 95, 100, 95, 95, 95, 95, 95, 95, 70, 33, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 103, 102, 102, - 109, 105, 174, 145, 174, 145, 248, 105, 104, 109, - - 110, 105, 261, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111, 121, 258, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 123, 186, 187, 285, 124, - 124, 124, 124, 124, 124, 401, 184, 165, 165, 236, - 237, 165, 165, 105, 256, 238, 239, 105, 105, 240, - 105, 241, 105, 259, 124, 124, 124, 124, 124, 124, - 104, 165, 254, 105, 324, 331, 104, 105, 331, 104, + 109, 105, 175, 146, 105, 850, 336, 261, 104, 109, + + 110, 105, 185, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 121, 257, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 123, 368, 368, 368, 124, + 124, 124, 124, 124, 124, 105, 105, 166, 166, 237, + 238, 166, 166, 105, 258, 239, 240, 105, 260, 241, + 327, 242, 105, 184, 124, 124, 124, 124, 124, 124, + 104, 166, 256, 259, 357, 358, 104, 359, 850, 104, 104, 105, 104, 104, 104, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 123, 166, 183, 104, 130, + 130, 130, 130, 130, 130, 123, 167, 334, 104, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 132, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 105, 131, 124, 124, 124, 124, 124, 124, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 861, 105, 109, 333, 131, 131, 131, 131, 131, - 131, 105, 470, 174, 145, 131, 111, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 331, 105, 105, 407, - 104, 104, 104, 104, 104, 104, 144, 145, 104, 104, - 104, 334, 104, 104, 844, 105, 104, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 330, 185, 844, - - 104, 104, 104, 104, 177, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 109, 170, 145, 171, 113, - 172, 365, 365, 365, 171, 110, 172, 105, 111, 111, - 111, 111, 111, 111, 111, 111, 111, 111, 148, 861, - 172, 172, 354, 355, 556, 356, 104, 183, 104, 104, - 104, 191, 104, 104, 861, 176, 104, 191, 176, 176, - 191, 381, 109, 191, 191, 176, 190, 172, 149, 150, - 104, 104, 104, 151, 861, 154, 109, 193, 387, 191, - 176, 152, 385, 123, 153, 382, 173, 386, 226, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 298, - - 105, 190, 388, 194, 191, 119, 402, 844, 119, 119, - 105, 119, 119, 119, 119, 416, 226, 119, 119, 112, - 417, 112, 112, 406, 105, 112, 112, 298, 472, 112, - 409, 193, 119, 119, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 112, 112, 111, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 830, 196, 119, 193, - 105, 105, 197, 193, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 123, 193, 331, 381, 199, 199, - 199, 199, 199, 199, 193, 193, 193, 193, 193, 193, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - - 193, 382, 471, 199, 199, 199, 199, 199, 199, 193, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 861, 387, 193, 193, 193, 193, 193, 193, 193, 193, - 193, 193, 861, 105, 630, 204, 193, 193, 193, 193, - 193, 193, 226, 576, 116, 388, 116, 116, 116, 398, - 116, 116, 399, 298, 116, 267, 267, 267, 267, 267, - 267, 193, 193, 193, 193, 193, 193, 193, 116, 116, - 116, 193, 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 123, 193, 105, 381, 203, 203, 203, 203, - 203, 203, 204, 204, 204, 204, 205, 204, 204, 204, - - 204, 204, 204, 204, 204, 204, 204, 204, 204, 382, - 206, 199, 199, 199, 199, 199, 199, 193, 193, 193, - 193, 193, 193, 193, 193, 193, 193, 193, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 861, 109, - 668, 131, 204, 204, 204, 204, 204, 204, 105, 762, - 119, 119, 204, 474, 119, 119, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 387, 193, 193, 193, - 193, 193, 193, 861, 119, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 118, 113, 104, 104, 118, - 388, 104, 104, 321, 322, 118, 323, 473, 105, 120, - - 288, 288, 288, 288, 288, 289, 861, 477, 551, 118, - 118, 104, 220, 221, 222, 220, 220, 220, 220, 220, - 220, 220, 165, 165, 274, 275, 165, 165, 105, 811, - 276, 277, 105, 190, 278, 105, 279, 164, 131, 104, - 104, 164, 608, 104, 104, 557, 165, 164, 431, 105, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 131, 164, 164, 104, 223, 223, 223, 223, 223, 223, - 605, 166, 263, 264, 265, 263, 263, 263, 263, 263, - 263, 263, 104, 104, 104, 104, 667, 105, 131, 223, - 223, 223, 223, 223, 223, 229, 229, 229, 229, 229, - - 229, 229, 229, 229, 229, 123, 123, 811, 478, 229, - 229, 229, 229, 229, 229, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 374, 374, 374, 374, 374, - 375, 105, 109, 105, 223, 223, 223, 223, 223, 223, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 861, 408, 369, 226, 131, 131, 131, 131, 131, 131, - 188, 105, 188, 188, 371, 191, 188, 188, 105, 109, - 188, 191, 479, 480, 191, 861, 226, 191, 191, 104, - 104, 104, 104, 104, 104, 188, 188, 371, 615, 861, - 119, 193, 226, 191, 119, 191, 811, 191, 191, 191, - - 119, 191, 191, 298, 335, 191, 336, 336, 336, 336, - 336, 336, 226, 861, 119, 119, 105, 194, 191, 191, - 191, 191, 119, 371, 554, 119, 119, 555, 119, 119, - 119, 119, 535, 861, 119, 119, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 576, 861, 193, 119, - 119, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 861, 105, 762, 196, 119, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 369, 226, 617, 536, - 266, 266, 266, 266, 266, 266, 287, 287, 287, 287, - - 287, 287, 287, 287, 287, 287, 451, 451, 451, 451, - 451, 452, 369, 226, 538, 266, 266, 266, 266, 266, - 266, 193, 861, 226, 371, 193, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 123, 193, 539, 543, - 268, 268, 268, 268, 268, 268, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 544, 206, 266, 266, 266, 266, 266, - 266, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 193, 193, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 861, 707, 861, 861, 204, 204, 204, 204, - - 204, 204, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 303, 104, 104, 104, 104, 369, 226, 861, 861, - 861, 193, 193, 193, 193, 193, 193, 285, 448, 286, - 286, 286, 286, 286, 286, 286, 286, 286, 286, 165, - 537, 861, 545, 165, 861, 105, 727, 131, 131, 165, - 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, - 607, 540, 612, 165, 165, 861, 105, 104, 226, 290, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 371, - 794, 546, 547, 290, 290, 290, 290, 290, 290, 410, - 411, 412, 410, 410, 410, 410, 410, 410, 410, 526, - - 526, 526, 526, 526, 527, 794, 548, 569, 290, 290, - 290, 290, 290, 290, 292, 293, 294, 294, 294, 294, - 294, 294, 294, 294, 295, 549, 533, 538, 296, 296, - 296, 296, 296, 296, 442, 443, 444, 442, 442, 442, - 442, 442, 442, 442, 672, 105, 131, 564, 543, 550, - 534, 539, 565, 296, 296, 296, 296, 296, 296, 226, - 299, 300, 301, 299, 299, 299, 299, 299, 299, 299, - 302, 105, 544, 681, 303, 303, 303, 303, 303, 303, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 481, 794, 482, 482, 482, 482, 482, 482, 811, 303, - - 303, 303, 303, 303, 303, 304, 304, 304, 304, 304, - 304, 304, 304, 304, 304, 123, 547, 549, 533, 304, - 304, 304, 304, 304, 304, 369, 226, 446, 446, 446, - 446, 446, 446, 131, 697, 697, 697, 371, 538, 606, - 548, 550, 534, 811, 290, 290, 290, 290, 290, 290, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 861, 726, 539, 131, 131, 131, 131, 131, 131, 131, - 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, - 431, 226, 432, 432, 432, 432, 432, 432, 226, 104, - 104, 104, 104, 104, 104, 335, 543, 338, 338, 338, - - 338, 338, 339, 336, 336, 336, 336, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 123, 226, 105, - 544, 340, 340, 340, 340, 340, 340, 457, 457, 457, - 457, 457, 457, 457, 457, 457, 457, 572, 572, 572, - 572, 572, 573, 731, 732, 226, 340, 340, 340, 340, - 340, 340, 341, 341, 341, 341, 341, 341, 341, 341, - 341, 341, 861, 226, 547, 707, 341, 341, 341, 341, - 341, 341, 226, 105, 448, 369, 226, 521, 521, 521, - 521, 521, 521, 448, 610, 369, 226, 448, 548, 131, - 618, 340, 340, 340, 340, 340, 340, 358, 359, 360, - - 358, 358, 358, 358, 358, 358, 358, 525, 525, 525, - 525, 525, 525, 525, 525, 525, 525, 558, 559, 560, - 558, 558, 558, 558, 558, 558, 558, 581, 581, 581, - 581, 581, 582, 643, 105, 363, 363, 364, 365, 365, - 365, 365, 365, 365, 365, 295, 369, 226, 370, 370, - 370, 370, 370, 370, 370, 370, 370, 370, 371, 549, - 109, 629, 372, 372, 372, 372, 372, 372, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 204, 671, - 794, 861, 723, 550, 131, 131, 794, 372, 372, 372, - 372, 372, 372, 226, 376, 377, 378, 376, 376, 376, - - 376, 376, 376, 376, 379, 861, 369, 226, 380, 380, - 380, 380, 380, 380, 728, 743, 669, 541, 448, 131, - 733, 743, 542, 513, 513, 513, 513, 513, 513, 513, - 513, 513, 513, 380, 380, 380, 380, 380, 380, 861, - 670, 372, 372, 372, 372, 372, 372, 372, 372, 372, - 372, 413, 413, 413, 413, 413, 413, 413, 413, 413, - 413, 743, 778, 131, 131, 413, 413, 413, 413, 413, - 413, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 514, 673, 515, 515, 515, 515, 515, 515, 692, - 413, 413, 413, 413, 413, 413, 414, 414, 414, 414, - - 414, 414, 414, 414, 414, 414, 674, 743, 673, 675, - 414, 414, 414, 414, 414, 414, 588, 589, 590, 588, - 588, 588, 588, 588, 588, 588, 779, 131, 105, 131, - 369, 226, 674, 676, 742, 413, 413, 413, 413, 413, - 413, 431, 523, 432, 432, 432, 432, 432, 432, 432, - 432, 432, 432, 431, 576, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 431, 578, 434, 434, 434, - 434, 434, 435, 432, 432, 432, 432, 437, 437, 437, - 437, 437, 437, 437, 437, 437, 437, 295, 369, 226, - 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - - 371, 679, 109, 675, 445, 445, 445, 445, 445, 445, - 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, - 598, 598, 598, 598, 598, 599, 809, 676, 131, 445, - 445, 445, 445, 445, 445, 369, 226, 447, 447, 447, - 447, 447, 447, 447, 447, 447, 447, 448, 861, 226, - 131, 449, 449, 449, 449, 449, 449, 680, 861, 131, - 523, 369, 226, 593, 593, 593, 593, 593, 593, 609, - 578, 669, 724, 523, 731, 732, 449, 449, 449, 449, - 449, 449, 226, 453, 454, 455, 453, 453, 453, 453, - 453, 453, 453, 456, 782, 670, 725, 457, 457, 457, - - 457, 457, 457, 597, 597, 597, 597, 597, 597, 597, - 597, 597, 597, 104, 104, 104, 104, 673, 131, 131, - 810, 109, 457, 457, 457, 457, 457, 457, 861, 611, - 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, - 481, 674, 484, 484, 484, 484, 484, 485, 482, 482, - 482, 482, 413, 413, 413, 413, 413, 413, 413, 413, - 413, 413, 105, 109, 105, 675, 413, 413, 413, 413, - 413, 413, 616, 637, 638, 639, 637, 637, 637, 637, - 637, 637, 637, 646, 646, 646, 646, 646, 647, 676, - 732, 413, 413, 413, 413, 413, 413, 502, 503, 504, - - 502, 502, 502, 502, 502, 502, 502, 587, 587, 587, - 587, 587, 587, 587, 587, 587, 587, 576, 576, 641, - 641, 641, 641, 641, 641, 226, 829, 830, 781, 578, - 578, 692, 105, 789, 105, 431, 448, 432, 432, 432, - 432, 432, 432, 432, 432, 432, 432, 431, 734, 432, - 432, 432, 432, 432, 432, 432, 432, 432, 432, 509, - 510, 511, 509, 509, 509, 509, 509, 509, 509, 512, - 105, 682, 105, 513, 513, 513, 513, 513, 513, 645, - 645, 645, 645, 645, 645, 645, 645, 645, 645, 824, - 824, 824, 824, 682, 226, 682, 682, 780, 513, 513, - - 513, 513, 513, 513, 514, 523, 517, 517, 517, 517, - 517, 518, 515, 515, 515, 515, 369, 226, 521, 521, - 521, 521, 521, 521, 521, 521, 521, 521, 448, 369, - 226, 724, 520, 520, 520, 520, 520, 520, 369, 226, - 576, 523, 861, 226, 664, 664, 664, 664, 664, 665, - 595, 131, 643, 861, 595, 725, 226, 520, 520, 520, - 520, 520, 520, 369, 226, 522, 522, 522, 522, 522, - 522, 522, 522, 522, 522, 523, 336, 861, 336, 524, - 524, 524, 524, 524, 524, 369, 226, 660, 660, 660, - 660, 660, 660, 829, 830, 751, 226, 595, 710, 710, - - 710, 710, 710, 711, 524, 524, 524, 524, 524, 524, - 226, 528, 529, 530, 528, 528, 528, 528, 528, 528, - 528, 531, 682, 226, 861, 532, 532, 532, 532, 532, - 532, 663, 663, 663, 663, 663, 663, 663, 663, 663, - 663, 175, 175, 175, 682, 861, 682, 683, 861, 861, - 532, 532, 532, 532, 532, 532, 861, 643, 524, 524, - 524, 524, 524, 524, 524, 524, 524, 524, 104, 533, - 750, 105, 111, 861, 104, 111, 219, 104, 104, 219, - 104, 104, 104, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 534, 749, 643, 104, 131, 131, 131, - + 131, 867, 227, 109, 836, 131, 131, 131, 131, 131, + 131, 105, 105, 300, 123, 131, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 109, 334, 334, 582, + 104, 104, 104, 104, 104, 104, 145, 146, 104, 104, + 104, 105, 104, 104, 105, 411, 104, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 333, 186, 105, + + 104, 104, 104, 104, 263, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 109, 171, 146, 172, 867, + 173, 384, 113, 435, 172, 110, 173, 410, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 105, 867, + 173, 173, 867, 334, 105, 385, 104, 184, 104, 104, + 104, 192, 104, 104, 475, 177, 104, 192, 177, 177, + 192, 562, 105, 192, 192, 177, 115, 173, 867, 191, + 104, 104, 104, 175, 146, 155, 109, 194, 388, 192, + 177, 113, 390, 389, 405, 105, 174, 105, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 337, + + 105, 867, 420, 195, 192, 119, 391, 421, 119, 119, + 557, 119, 119, 119, 119, 191, 227, 119, 119, 112, + 105, 112, 112, 477, 178, 112, 112, 300, 191, 112, + 476, 194, 119, 119, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 112, 112, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 105, 197, 119, 194, + 105, 105, 198, 194, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 123, 194, 623, 384, 200, 200, + 200, 200, 200, 200, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + + 194, 385, 768, 200, 200, 200, 200, 200, 200, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 867, 390, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 867, 105, 636, 205, 194, 194, 194, 194, + 194, 194, 227, 563, 116, 391, 116, 116, 116, 402, + 116, 116, 403, 300, 116, 269, 269, 269, 269, 269, + 269, 194, 194, 194, 194, 194, 194, 194, 116, 116, + 116, 194, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 123, 194, 105, 384, 204, 204, 204, 204, + 204, 204, 205, 205, 205, 205, 206, 205, 205, 205, + + 205, 205, 205, 205, 205, 205, 205, 205, 205, 385, + 207, 200, 200, 200, 200, 200, 200, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 867, 673, + 817, 131, 205, 205, 205, 205, 205, 205, 105, 109, + 119, 119, 205, 479, 119, 119, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 390, 194, 194, 194, + 194, 194, 194, 867, 119, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 118, 817, 104, 104, 118, + 391, 104, 104, 149, 105, 118, 276, 277, 404, 120, + + 406, 105, 278, 279, 560, 478, 280, 413, 281, 118, + 118, 104, 221, 222, 223, 221, 221, 221, 221, 221, + 221, 221, 119, 150, 151, 483, 119, 105, 152, 131, + 430, 131, 119, 431, 105, 612, 153, 166, 166, 154, + 105, 166, 166, 613, 817, 484, 119, 119, 105, 105, + 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, + 678, 166, 131, 867, 224, 224, 224, 224, 224, 224, + 265, 266, 267, 265, 265, 265, 265, 265, 265, 265, + 290, 290, 290, 290, 290, 291, 167, 867, 698, 224, + 224, 224, 224, 224, 224, 230, 230, 230, 230, 230, + + 230, 230, 230, 230, 230, 123, 123, 867, 542, 230, + 230, 230, 230, 230, 230, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 324, 325, 105, 326, 104, + 104, 104, 104, 105, 224, 224, 224, 224, 224, 224, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 867, 412, 109, 105, 131, 131, 131, 131, 131, 131, + 105, 165, 131, 104, 104, 165, 614, 104, 104, 582, + 618, 165, 377, 377, 377, 377, 377, 378, 227, 104, + 104, 104, 104, 104, 104, 165, 165, 104, 189, 300, + 189, 189, 227, 192, 189, 189, 372, 227, 189, 192, + + 867, 227, 192, 374, 105, 192, 192, 166, 374, 485, + 570, 166, 374, 189, 189, 571, 768, 166, 109, 194, + 482, 192, 575, 192, 713, 192, 192, 192, 543, 192, + 192, 166, 166, 192, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 105, 195, 192, 192, 192, 192, + 119, 131, 544, 119, 119, 561, 119, 119, 119, 119, + 105, 611, 119, 119, 220, 220, 220, 220, 220, 220, + 220, 220, 220, 220, 621, 867, 194, 119, 119, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 289, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 867, + + 674, 131, 197, 119, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 105, 800, 687, 541, 268, 268, + 268, 268, 268, 268, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 338, 105, 339, 339, 339, 339, + 339, 339, 548, 268, 268, 268, 268, 268, 268, 194, + 372, 227, 624, 194, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 123, 194, 549, 552, 270, 270, + 270, 270, 270, 270, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 553, 207, 268, 268, 268, 268, 268, 268, 194, + + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 867, 800, 554, 538, 205, 205, 205, 205, 205, 205, + 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, + 455, 455, 455, 455, 455, 456, 555, 539, 800, 194, + 194, 194, 194, 194, 194, 287, 817, 288, 288, 288, + 288, 288, 288, 288, 288, 288, 288, 414, 415, 416, + 414, 414, 414, 414, 414, 414, 414, 446, 447, 448, + 446, 446, 446, 446, 446, 446, 446, 531, 531, 531, + 531, 531, 532, 729, 105, 104, 131, 292, 292, 292, + + 292, 292, 292, 292, 292, 292, 292, 867, 543, 548, + 867, 292, 292, 292, 292, 292, 292, 383, 383, 383, + 383, 383, 383, 383, 383, 383, 383, 703, 703, 703, + 867, 867, 544, 549, 867, 817, 292, 292, 292, 292, + 292, 292, 294, 295, 296, 296, 296, 296, 296, 296, + 296, 296, 297, 540, 867, 550, 298, 298, 298, 298, + 298, 298, 372, 227, 450, 450, 450, 450, 450, 450, + 732, 545, 131, 486, 374, 487, 487, 487, 487, 487, + 487, 298, 298, 298, 298, 298, 298, 227, 301, 302, + 303, 301, 301, 301, 301, 301, 301, 301, 304, 685, + + 109, 227, 305, 305, 305, 305, 305, 305, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 435, 227, + 436, 436, 436, 436, 436, 436, 227, 305, 305, 305, + 305, 305, 305, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 123, 372, 227, 227, 306, 306, 306, + 306, 306, 306, 372, 227, 686, 374, 105, 867, 227, + 227, 867, 227, 616, 677, 452, 867, 552, 131, 131, + 452, 374, 292, 292, 292, 292, 292, 292, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 867, 554, + 867, 553, 131, 131, 131, 131, 131, 131, 461, 461, + + 461, 461, 461, 461, 461, 461, 461, 461, 733, 131, + 734, 556, 784, 555, 131, 131, 713, 104, 104, 104, + 104, 104, 104, 338, 867, 341, 341, 341, 341, 341, + 342, 339, 339, 339, 339, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 123, 635, 649, 867, 343, + 343, 343, 343, 343, 343, 372, 227, 526, 526, 526, + 526, 526, 526, 205, 551, 800, 538, 452, 578, 578, + 578, 578, 578, 579, 343, 343, 343, 343, 343, 343, + 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, + 539, 737, 738, 800, 344, 344, 344, 344, 344, 344, + + 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, + 749, 867, 587, 587, 587, 587, 587, 588, 749, 343, + 343, 343, 343, 343, 343, 361, 362, 363, 361, 361, + 361, 361, 361, 361, 361, 867, 564, 565, 566, 564, + 564, 564, 564, 564, 564, 564, 749, 546, 227, 372, + 227, 519, 547, 520, 520, 520, 520, 520, 520, 452, + 749, 452, 105, 366, 366, 367, 368, 368, 368, 368, + 368, 368, 368, 297, 372, 227, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 374, 748, 543, 548, + 375, 375, 375, 375, 375, 375, 577, 577, 577, 577, + + 577, 577, 577, 577, 577, 577, 604, 604, 604, 604, + 604, 605, 544, 549, 788, 375, 375, 375, 375, 375, + 375, 227, 379, 380, 381, 379, 379, 379, 379, 379, + 379, 379, 382, 105, 552, 554, 383, 383, 383, 383, + 383, 383, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 104, 104, 104, 104, 372, 227, 553, 555, + 738, 383, 383, 383, 383, 383, 383, 867, 528, 375, + 375, 375, 375, 375, 375, 375, 375, 375, 375, 417, + 417, 417, 417, 417, 417, 417, 417, 417, 417, 372, + 227, 679, 681, 417, 417, 417, 417, 417, 417, 586, + + 586, 586, 586, 586, 586, 586, 586, 586, 586, 652, + 652, 652, 652, 652, 653, 680, 682, 786, 417, 417, + 417, 417, 417, 417, 418, 418, 418, 418, 418, 418, + 418, 418, 418, 418, 785, 131, 675, 679, 418, 418, + 418, 418, 418, 418, 594, 595, 596, 594, 594, 594, + 594, 594, 594, 594, 104, 104, 104, 104, 867, 227, + 676, 680, 131, 417, 417, 417, 417, 417, 417, 435, + 528, 436, 436, 436, 436, 436, 436, 436, 436, 436, + 436, 435, 582, 437, 437, 437, 437, 437, 437, 437, + 437, 437, 437, 435, 584, 438, 438, 438, 438, 438, + + 439, 436, 436, 436, 436, 441, 441, 441, 441, 441, + 441, 441, 441, 441, 441, 297, 372, 227, 450, 450, + 450, 450, 450, 450, 450, 450, 450, 450, 374, 109, + 675, 679, 449, 449, 449, 449, 449, 449, 537, 537, + 537, 537, 537, 537, 537, 537, 537, 537, 670, 670, + 670, 670, 670, 671, 676, 680, 698, 449, 449, 449, + 449, 449, 449, 372, 227, 451, 451, 451, 451, 451, + 451, 451, 451, 451, 451, 452, 681, 131, 131, 453, + 453, 453, 453, 453, 453, 372, 227, 599, 599, 599, + 599, 599, 599, 131, 787, 105, 111, 528, 730, 111, + + 682, 737, 738, 615, 453, 453, 453, 453, 453, 453, + 227, 457, 458, 459, 457, 457, 457, 457, 457, 457, + 457, 460, 731, 131, 681, 461, 461, 461, 461, 461, + 461, 603, 603, 603, 603, 603, 603, 603, 603, 603, + 603, 815, 227, 131, 220, 131, 131, 220, 682, 227, + 461, 461, 461, 461, 461, 461, 867, 617, 453, 453, + 453, 453, 453, 453, 453, 453, 453, 453, 486, 730, + 489, 489, 489, 489, 489, 490, 487, 487, 487, 487, + 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, + 105, 816, 109, 731, 417, 417, 417, 417, 417, 417, + + 622, 643, 644, 645, 643, 643, 643, 643, 643, 643, + 643, 625, 626, 626, 626, 626, 626, 626, 227, 417, + 417, 417, 417, 417, 417, 507, 508, 509, 507, 507, + 507, 507, 507, 507, 507, 593, 593, 593, 593, 593, + 593, 593, 593, 593, 593, 867, 582, 582, 647, 647, + 647, 647, 647, 647, 835, 836, 649, 584, 584, 584, + 109, 795, 105, 435, 582, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 435, 649, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 514, 515, 516, + 514, 514, 514, 514, 514, 514, 514, 517, 584, 688, + + 105, 518, 518, 518, 518, 518, 518, 651, 651, 651, + 651, 651, 651, 651, 651, 651, 651, 835, 836, 704, + 739, 688, 227, 688, 688, 704, 518, 518, 518, 518, + 518, 518, 519, 452, 522, 522, 522, 522, 522, 523, + 520, 520, 520, 520, 372, 227, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 452, 227, 372, 227, + 525, 525, 525, 525, 525, 525, 372, 227, 528, 867, + 528, 867, 227, 227, 830, 830, 830, 830, 601, 704, + 867, 649, 730, 601, 528, 525, 525, 525, 525, 525, + 525, 372, 227, 527, 527, 527, 527, 527, 527, 527, + + 527, 527, 527, 528, 867, 105, 731, 529, 529, 529, + 529, 529, 529, 372, 227, 666, 666, 666, 666, 666, + 666, 740, 757, 626, 626, 601, 716, 716, 716, 716, + 716, 717, 529, 529, 529, 529, 529, 529, 227, 533, + 534, 535, 533, 533, 533, 533, 533, 533, 533, 536, + 688, 749, 867, 537, 537, 537, 537, 537, 537, 669, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 176, + 176, 176, 688, 582, 688, 689, 867, 867, 537, 537, + 537, 537, 537, 537, 867, 649, 529, 529, 529, 529, + 529, 529, 529, 529, 529, 529, 104, 538, 756, 105, + + 749, 867, 104, 627, 627, 104, 104, 735, 104, 104, + 104, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 539, 755, 659, 104, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 105, 131, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 569, - 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, - 684, 685, 686, 687, 684, 684, 684, 684, 684, 684, - 619, 620, 620, 620, 620, 620, 620, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 105, 576, 576, - 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, - 578, 643, 620, 620, 579, 579, 579, 579, 579, 579, - - 695, 695, 695, 695, 695, 696, 697, 697, 697, 697, - 653, 578, 654, 654, 654, 654, 654, 654, 698, 579, - 579, 579, 579, 579, 579, 583, 584, 585, 583, 583, - 583, 583, 583, 583, 583, 586, 698, 724, 776, 587, - 587, 587, 587, 587, 587, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 743, 698, 748, 748, 748, - 226, 725, 777, 743, 587, 587, 587, 587, 587, 587, - 861, 523, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 369, 226, 593, 593, 593, 593, 593, 593, - 593, 593, 593, 593, 523, 776, 621, 621, 592, 592, - - 592, 592, 592, 592, 576, 576, 705, 705, 705, 705, - 705, 705, 175, 175, 175, 743, 643, 707, 736, 777, - 737, 738, 739, 592, 592, 592, 592, 592, 592, 369, - 226, 594, 594, 594, 594, 594, 594, 594, 594, 594, - 594, 595, 131, 620, 620, 596, 596, 596, 596, 596, - 596, 709, 709, 709, 709, 709, 709, 709, 709, 709, - 709, 369, 226, 722, 722, 722, 722, 722, 722, 740, - 596, 596, 596, 596, 596, 596, 226, 600, 601, 602, - 600, 600, 600, 600, 600, 600, 600, 776, 729, 807, - 861, 603, 603, 603, 603, 603, 603, 717, 718, 719, - - 717, 717, 717, 717, 717, 717, 717, 337, 482, 337, - 482, 777, 226, 808, 861, 807, 603, 603, 603, 603, - 603, 603, 861, 595, 596, 596, 596, 596, 596, 596, - 596, 596, 596, 596, 104, 787, 131, 771, 771, 808, - 104, 735, 735, 104, 104, 735, 104, 104, 104, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 735, - 735, 735, 104, 131, 131, 131, 131, 131, 131, 131, - 131, 604, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 105, 131, 104, 104, + 131, 131, 131, 131, 131, 131, 131, 131, 105, 131, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 575, 576, 576, + 576, 576, 576, 576, 576, 576, 576, 576, 690, 691, + 692, 693, 690, 690, 690, 690, 690, 690, 700, 700, + 700, 700, 700, 700, 700, 700, 700, 700, 749, 659, + + 754, 754, 754, 626, 626, 105, 582, 582, 583, 583, + 583, 583, 583, 583, 583, 583, 583, 583, 584, 713, + 777, 777, 585, 585, 585, 585, 585, 585, 701, 701, + 701, 701, 701, 702, 703, 703, 703, 703, 659, 659, + 660, 660, 660, 660, 660, 660, 840, 585, 585, 585, + 585, 585, 585, 589, 590, 591, 589, 589, 589, 589, + 589, 589, 589, 592, 584, 782, 782, 593, 593, 593, + 593, 593, 593, 658, 658, 658, 658, 658, 658, 658, + 658, 658, 658, 704, 339, 105, 339, 704, 227, 783, + 783, 513, 593, 593, 593, 593, 593, 593, 867, 601, + + 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, + 372, 227, 599, 599, 599, 599, 599, 599, 599, 599, + 599, 599, 528, 782, 778, 778, 598, 598, 598, 598, + 598, 598, 582, 867, 711, 711, 711, 711, 711, 711, + 176, 176, 176, 697, 649, 713, 742, 783, 743, 744, + 745, 598, 598, 598, 598, 598, 598, 372, 227, 600, + 600, 600, 600, 600, 600, 600, 600, 600, 600, 601, + 131, 696, 695, 602, 602, 602, 602, 602, 602, 715, + 715, 715, 715, 715, 715, 715, 715, 715, 715, 372, + 227, 728, 728, 728, 728, 728, 728, 746, 602, 602, + + 602, 602, 602, 602, 227, 606, 607, 608, 606, 606, + 606, 606, 606, 606, 606, 694, 625, 813, 867, 609, + 609, 609, 609, 609, 609, 723, 724, 725, 723, 723, + 723, 723, 723, 723, 723, 340, 487, 340, 487, 372, + 227, 814, 867, 813, 609, 609, 609, 609, 609, 609, + 867, 601, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 104, 793, 131, 625, 625, 814, 104, 741, + 741, 104, 104, 741, 104, 104, 104, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 741, 741, 741, + 104, 131, 131, 131, 131, 131, 131, 131, 131, 610, - 104, 104, 104, 104, 104, 619, 622, 622, 622, 622, - 622, 623, 620, 620, 620, 620, 193, 772, 772, 861, - 193, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 707, 193, 653, 807, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 626, 204, 204, 808, 206, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 193, 193, 193, 193, 193, 193, 193, 632, 633, 634, - 635, 632, 632, 632, 632, 632, 632, 369, 226, 736, - 653, 737, 738, 739, 483, 515, 483, 515, 576, 595, - - 755, 756, 757, 755, 755, 755, 755, 755, 755, 755, - 707, 653, 578, 834, 105, 569, 570, 570, 570, 570, - 570, 570, 570, 570, 570, 570, 698, 826, 699, 699, - 699, 699, 699, 699, 765, 765, 765, 765, 765, 766, - 742, 716, 716, 716, 716, 716, 716, 716, 716, 716, - 716, 827, 105, 105, 576, 698, 641, 641, 641, 641, - 641, 641, 641, 641, 641, 641, 578, 576, 576, 642, - 642, 642, 642, 642, 642, 642, 642, 642, 642, 643, - 762, 861, 826, 644, 644, 644, 644, 644, 644, 576, - 698, 760, 760, 760, 760, 760, 760, 516, 508, 516, - - 861, 707, 861, 861, 861, 861, 827, 691, 644, 644, - 644, 644, 644, 644, 648, 649, 650, 648, 648, 648, - 648, 648, 648, 648, 651, 690, 689, 788, 652, 652, - 652, 652, 652, 652, 764, 764, 764, 764, 764, 764, - 764, 764, 764, 764, 482, 515, 482, 515, 654, 226, - 654, 740, 688, 652, 652, 652, 652, 652, 652, 861, - 595, 644, 644, 644, 644, 644, 644, 644, 644, 644, - 644, 653, 619, 656, 656, 656, 656, 656, 657, 654, - 654, 654, 654, 369, 226, 660, 660, 660, 660, 660, - 660, 660, 660, 660, 660, 595, 619, 861, 826, 659, - - 659, 659, 659, 659, 659, 736, 619, 737, 738, 739, - 861, 861, 737, 738, 739, 861, 105, 861, 861, 739, - 678, 861, 827, 762, 659, 659, 659, 659, 659, 659, - 369, 226, 661, 661, 661, 661, 661, 661, 661, 661, - 661, 661, 816, 576, 677, 131, 662, 662, 662, 662, - 662, 662, 655, 105, 655, 762, 740, 699, 700, 699, - 700, 740, 654, 744, 654, 744, 740, 745, 699, 745, - 699, 662, 662, 662, 662, 662, 662, 861, 226, 662, - 662, 662, 662, 662, 662, 662, 662, 662, 662, 104, - 741, 653, 741, 741, 741, 104, 741, 741, 104, 104, - - 741, 104, 104, 104, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 741, 741, 741, 104, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 666, 131, 131, - 131, 105, 131, 104, 104, 104, 104, 104, 104, 104, + 131, 131, 131, 131, 105, 131, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 669, 743, 653, 744, 744, 744, 744, 744, 744, 193, - 795, 508, 795, 193, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 670, 193, 367, 631, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 628, 206, 193, 193, 193, 193, 193, 193, 193, - 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, - 692, 627, 693, 693, 693, 693, 693, 693, 693, 693, - 693, 693, 784, 785, 786, 784, 784, 784, 784, 784, - 784, 784, 770, 770, 770, 770, 770, 770, 770, 770, - 770, 770, 805, 805, 805, 805, 805, 806, 783, 105, - 698, 783, 701, 701, 701, 701, 701, 702, 699, 699, - 699, 699, 576, 625, 705, 705, 705, 705, 705, 705, - 705, 705, 705, 705, 643, 576, 624, 706, 706, 706, - - 706, 706, 706, 706, 706, 706, 706, 707, 796, 619, - 796, 708, 708, 708, 708, 708, 708, 576, 619, 801, - 801, 801, 801, 801, 801, 812, 614, 812, 794, 762, - 795, 795, 795, 795, 795, 795, 708, 708, 708, 708, - 708, 708, 712, 713, 714, 712, 712, 712, 712, 712, - 712, 712, 715, 813, 613, 813, 716, 716, 716, 716, - 716, 716, 804, 804, 804, 804, 804, 804, 804, 804, - 804, 804, 226, 771, 771, 771, 771, 771, 771, 514, - 514, 716, 716, 716, 716, 716, 716, 861, 514, 708, - 708, 708, 708, 708, 708, 708, 708, 708, 708, 369, - - 226, 722, 722, 722, 722, 722, 722, 722, 722, 722, - 722, 743, 508, 746, 746, 746, 746, 746, 747, 748, - 748, 748, 748, 752, 753, 754, 752, 752, 752, 752, - 752, 752, 752, 783, 783, 783, 783, 783, 783, 783, - 783, 783, 783, 783, 783, 783, 783, 783, 783, 783, - 783, 783, 783, 839, 839, 839, 839, 839, 839, 367, - 105, 692, 295, 693, 693, 693, 693, 693, 693, 693, - 693, 693, 693, 845, 568, 845, 789, 567, 790, 790, - 790, 790, 790, 790, 820, 821, 822, 820, 820, 820, - 820, 820, 820, 820, 858, 858, 858, 858, 858, 858, - - 105, 576, 566, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 707, 576, 105, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 762, 846, 563, 846, - 763, 763, 763, 763, 763, 763, 831, 832, 833, 831, - 831, 831, 831, 831, 831, 831, 811, 562, 812, 812, - 812, 812, 812, 812, 561, 763, 763, 763, 763, 763, - 763, 767, 768, 769, 767, 767, 767, 767, 767, 767, - 767, 481, 481, 481, 553, 770, 770, 770, 770, 770, - 770, 839, 839, 839, 839, 839, 839, 839, 839, 839, - 839, 834, 552, 835, 835, 835, 835, 835, 835, 105, - - 770, 770, 770, 770, 770, 770, 861, 105, 763, 763, - 763, 763, 763, 763, 763, 763, 763, 763, 226, 773, - 773, 773, 773, 773, 774, 771, 771, 771, 771, 789, - 105, 790, 790, 790, 790, 790, 790, 790, 790, 790, - 790, 789, 105, 791, 791, 791, 791, 791, 791, 791, - 791, 791, 791, 789, 105, 792, 792, 792, 792, 792, - 793, 790, 790, 790, 790, 794, 514, 797, 797, 797, - 797, 797, 798, 795, 795, 795, 795, 576, 514, 801, - 801, 801, 801, 801, 801, 801, 801, 801, 801, 762, - 576, 508, 802, 802, 802, 802, 802, 802, 802, 802, - - 802, 802, 367, 295, 295, 501, 803, 803, 803, 803, - 803, 803, 840, 840, 840, 840, 840, 840, 840, 840, - 840, 840, 844, 500, 845, 845, 845, 845, 845, 845, - 499, 803, 803, 803, 803, 803, 803, 861, 498, 803, - 803, 803, 803, 803, 803, 803, 803, 803, 803, 811, - 497, 814, 814, 814, 814, 814, 815, 812, 812, 812, - 812, 104, 496, 817, 818, 819, 817, 817, 817, 817, - 817, 817, 817, 789, 495, 790, 790, 790, 790, 790, - 790, 790, 790, 790, 790, 789, 494, 790, 790, 790, - 790, 790, 790, 790, 790, 790, 790, 576, 493, 825, - - 825, 825, 825, 825, 825, 825, 825, 825, 825, 834, - 492, 835, 835, 835, 835, 835, 835, 835, 835, 835, - 835, 834, 491, 836, 836, 836, 836, 836, 836, 836, - 836, 836, 836, 834, 490, 837, 837, 837, 837, 837, - 838, 835, 835, 835, 835, 841, 841, 841, 841, 841, - 842, 839, 839, 839, 839, 844, 489, 847, 847, 847, - 847, 847, 848, 845, 845, 845, 845, 104, 488, 849, - 850, 851, 849, 849, 849, 849, 849, 849, 849, 834, - 487, 835, 835, 835, 835, 835, 835, 835, 835, 835, - 835, 834, 486, 835, 835, 835, 835, 835, 835, 835, - - 835, 835, 835, 839, 839, 839, 839, 839, 839, 839, - 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, - 839, 839, 839, 852, 853, 854, 852, 852, 852, 852, - 852, 852, 852, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 852, 852, 852, 852, 852, 852, 852, - 852, 852, 852, 855, 855, 855, 855, 855, 855, 861, - 105, 849, 849, 849, 849, 849, 849, 849, 849, 849, - 849, 859, 859, 859, 859, 859, 860, 858, 858, 858, - 858, 843, 481, 481, 843, 403, 476, 475, 843, 469, - - 105, 468, 467, 466, 465, 464, 463, 462, 105, 856, - 856, 856, 856, 856, 857, 855, 855, 855, 855, 858, - 858, 858, 858, 858, 858, 858, 858, 858, 858, 461, - 460, 459, 458, 440, 367, 295, 436, 295, 129, 430, - 429, 428, 425, 424, 423, 422, 105, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 421, 420, 419, - 418, 415, 335, 335, 335, 403, 405, 403, 404, 403, - 397, 396, 395, 394, 393, 392, 391, 390, 389, 384, - 383, 123, 295, 367, 105, 63, 63, 63, 63, 63, + 104, 104, 104, 625, 628, 628, 628, 628, 628, 629, + 626, 626, 626, 626, 194, 105, 684, 582, 194, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 713, + 194, 683, 813, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 632, 205, 205, 814, 207, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + + 194, 194, 194, 194, 194, 638, 639, 640, 641, 638, + 638, 638, 638, 638, 638, 742, 832, 743, 744, 745, + 761, 762, 763, 761, 761, 761, 761, 761, 761, 761, + 704, 105, 705, 705, 705, 705, 705, 705, 227, 488, + 833, 488, 105, 575, 576, 576, 576, 576, 576, 576, + 576, 576, 576, 576, 722, 722, 722, 722, 722, 722, + 722, 722, 722, 722, 227, 582, 748, 766, 766, 766, + 766, 766, 766, 659, 520, 601, 520, 713, 521, 659, + 521, 105, 582, 513, 647, 647, 647, 647, 647, 647, + 647, 647, 647, 647, 584, 582, 582, 648, 648, 648, + + 648, 648, 648, 648, 648, 648, 648, 649, 768, 867, + 832, 650, 650, 650, 650, 650, 650, 770, 770, 770, + 770, 770, 770, 770, 770, 770, 770, 771, 771, 771, + 771, 771, 772, 867, 833, 370, 650, 650, 650, 650, + 650, 650, 654, 655, 656, 654, 654, 654, 654, 654, + 654, 654, 657, 637, 634, 794, 658, 658, 658, 658, + 658, 658, 790, 791, 792, 790, 790, 790, 790, 790, + 790, 790, 487, 867, 487, 867, 867, 867, 520, 633, + 520, 658, 658, 658, 658, 658, 658, 867, 867, 650, + 650, 650, 650, 650, 650, 650, 650, 650, 650, 659, + + 768, 662, 662, 662, 662, 662, 663, 660, 660, 660, + 660, 372, 227, 666, 666, 666, 666, 666, 666, 666, + 666, 666, 666, 601, 746, 867, 832, 665, 665, 665, + 665, 665, 665, 742, 631, 743, 744, 745, 867, 582, + 743, 744, 745, 867, 630, 867, 867, 745, 625, 867, + 833, 768, 665, 665, 665, 665, 665, 665, 372, 227, + 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, + 822, 625, 620, 131, 668, 668, 668, 668, 668, 668, + 660, 661, 660, 661, 746, 705, 706, 705, 706, 746, + 660, 750, 660, 750, 746, 751, 705, 751, 705, 668, + + 668, 668, 668, 668, 668, 867, 619, 668, 668, 668, + 668, 668, 668, 668, 668, 668, 668, 104, 747, 131, + 747, 747, 747, 104, 747, 747, 104, 104, 747, 104, + 104, 104, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 747, 747, 747, 104, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 672, 131, 131, 131, 105, + 131, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 675, 749, + 519, 750, 750, 750, 750, 750, 750, 194, 801, 519, + + 801, 194, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 676, 194, 519, 513, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 370, + 207, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 698, 297, + 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, + 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, + 582, 574, 807, 807, 807, 807, 807, 807, 789, 573, + 572, 789, 768, 802, 818, 802, 818, 105, 704, 569, + + 707, 707, 707, 707, 707, 708, 705, 705, 705, 705, + 582, 568, 711, 711, 711, 711, 711, 711, 711, 711, + 711, 711, 649, 582, 567, 712, 712, 712, 712, 712, + 712, 712, 712, 712, 712, 713, 819, 486, 819, 714, + 714, 714, 714, 714, 714, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 811, 811, 811, 811, 811, + 812, 851, 486, 851, 714, 714, 714, 714, 714, 714, + 718, 719, 720, 718, 718, 718, 718, 718, 718, 718, + 721, 852, 486, 852, 722, 722, 722, 722, 722, 722, + 227, 777, 777, 777, 777, 777, 777, 789, 789, 789, + + 789, 789, 789, 789, 789, 789, 789, 559, 558, 722, + 722, 722, 722, 722, 722, 867, 105, 714, 714, 714, + 714, 714, 714, 714, 714, 714, 714, 372, 227, 728, + 728, 728, 728, 728, 728, 728, 728, 728, 728, 749, + 105, 752, 752, 752, 752, 752, 753, 754, 754, 754, + 754, 758, 759, 760, 758, 758, 758, 758, 758, 758, + 758, 789, 789, 789, 789, 789, 789, 789, 789, 789, + 789, 795, 105, 796, 796, 796, 796, 796, 796, 800, + 105, 801, 801, 801, 801, 801, 801, 519, 105, 698, + 519, 699, 699, 699, 699, 699, 699, 699, 699, 699, + + 699, 817, 513, 818, 818, 818, 818, 818, 818, 370, + 105, 826, 827, 828, 826, 826, 826, 826, 826, 826, + 826, 845, 845, 845, 845, 845, 845, 297, 105, 582, + 297, 766, 766, 766, 766, 766, 766, 766, 766, 766, + 766, 713, 582, 506, 767, 767, 767, 767, 767, 767, + 767, 767, 767, 767, 768, 505, 504, 503, 769, 769, + 769, 769, 769, 769, 837, 838, 839, 837, 837, 837, + 837, 837, 837, 837, 850, 502, 851, 851, 851, 851, + 851, 851, 501, 769, 769, 769, 769, 769, 769, 773, + 774, 775, 773, 773, 773, 773, 773, 773, 773, 500, + + 499, 498, 497, 776, 776, 776, 776, 776, 776, 845, + 845, 845, 845, 845, 845, 845, 845, 845, 845, 840, + 496, 841, 841, 841, 841, 841, 841, 495, 776, 776, + 776, 776, 776, 776, 867, 494, 769, 769, 769, 769, + 769, 769, 769, 769, 769, 769, 227, 779, 779, 779, + 779, 779, 780, 777, 777, 777, 777, 795, 105, 796, + 796, 796, 796, 796, 796, 796, 796, 796, 796, 795, + 493, 797, 797, 797, 797, 797, 797, 797, 797, 797, + 797, 795, 492, 798, 798, 798, 798, 798, 799, 796, + 796, 796, 796, 800, 491, 803, 803, 803, 803, 803, + + 804, 801, 801, 801, 801, 582, 867, 807, 807, 807, + 807, 807, 807, 807, 807, 807, 807, 768, 582, 486, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 486, 407, 481, 480, 809, 809, 809, 809, 809, 809, + 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, + 474, 473, 472, 861, 861, 861, 861, 861, 861, 809, + 809, 809, 809, 809, 809, 867, 471, 809, 809, 809, + 809, 809, 809, 809, 809, 809, 809, 817, 470, 820, + 820, 820, 820, 820, 821, 818, 818, 818, 818, 104, + 105, 823, 824, 825, 823, 823, 823, 823, 823, 823, + + 823, 795, 469, 796, 796, 796, 796, 796, 796, 796, + 796, 796, 796, 795, 468, 796, 796, 796, 796, 796, + 796, 796, 796, 796, 796, 582, 467, 831, 831, 831, + 831, 831, 831, 831, 831, 831, 831, 840, 466, 841, + 841, 841, 841, 841, 841, 841, 841, 841, 841, 840, + 465, 842, 842, 842, 842, 842, 842, 842, 842, 842, + 842, 840, 464, 843, 843, 843, 843, 843, 844, 841, + 841, 841, 841, 847, 847, 847, 847, 847, 848, 845, + 845, 845, 845, 850, 463, 853, 853, 853, 853, 853, + 854, 851, 851, 851, 851, 104, 462, 855, 856, 857, + + 855, 855, 855, 855, 855, 855, 855, 840, 444, 841, + 841, 841, 841, 841, 841, 841, 841, 841, 841, 840, + 370, 841, 841, 841, 841, 841, 841, 841, 841, 841, + 841, 845, 845, 845, 845, 845, 845, 845, 845, 845, + 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, + 845, 858, 859, 860, 858, 858, 858, 858, 858, 858, + 858, 861, 861, 861, 861, 861, 861, 861, 861, 861, + 861, 864, 864, 864, 864, 864, 864, 864, 864, 864, + 864, 858, 858, 858, 858, 858, 858, 858, 858, 858, + 858, 864, 864, 864, 864, 864, 864, 297, 105, 855, + + 855, 855, 855, 855, 855, 855, 855, 855, 855, 865, + 865, 865, 865, 865, 866, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, 864, 440, + 297, 129, 434, 433, 432, 429, 105, 862, 862, 862, + 862, 862, 863, 861, 861, 861, 861, 849, 428, 427, + 849, 426, 425, 424, 849, 423, 422, 419, 338, 338, + 338, 407, 409, 407, 408, 407, 401, 400, 399, 398, + 397, 396, 395, 394, 105, 861, 861, 861, 861, 861, + 861, 861, 861, 861, 861, 393, 392, 387, 386, 123, + 297, 370, 297, 129, 109, 360, 356, 355, 354, 353, + + 352, 351, 350, 349, 348, 347, 346, 345, 198, 338, + 338, 264, 105, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - - 63, 63, 63, 63, 63, 63, 33, 33, 33, 33, + 63, 63, 63, 63, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 72, 72, 72, + 33, 33, 33, 33, 33, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 79, 79, + 72, 72, 72, 72, 72, 72, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 104, - 295, 129, 109, 357, 353, 352, 104, 351, 104, 104, - 104, 104, 350, 349, 104, 104, 104, 104, 104, 104, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 79, 79, 79, 79, 79, 79, 79, 104, 335, 332, + 331, 330, 329, 328, 104, 323, 104, 104, 104, 104, + 322, 321, 104, 104, 104, 104, 104, 104, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 112, 348, 347, 346, 345, 112, 344, 112, 343, - 112, 112, 112, 112, 112, 342, 112, 112, 112, 112, - 112, 112, 116, 197, 335, 335, 262, 332, 329, 116, - 328, 116, 116, 116, 116, 327, 326, 116, 116, 116, - 116, 116, 116, 118, 325, 320, 118, 118, 319, 118, - 118, 318, 118, 118, 118, 118, 317, 316, 118, 118, - 118, 118, 118, 118, 128, 128, 315, 128, 314, 313, - 312, 128, 164, 311, 310, 164, 164, 309, 164, 164, - 308, 164, 164, 164, 164, 307, 306, 164, 164, 164, - - 164, 164, 164, 168, 305, 129, 168, 168, 121, 168, - 168, 109, 168, 168, 168, 168, 109, 168, 168, 168, - 283, 168, 168, 168, 176, 282, 281, 176, 280, 273, - 176, 176, 272, 176, 176, 176, 176, 176, 271, 176, - 176, 176, 176, 176, 176, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 180, 180, 180, 180, 182, 182, 270, 182, - 269, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 182, 182, 182, 182, 182, 182, 182, 188, 861, 194, - 262, 182, 188, 183, 188, 177, 188, 188, 188, 188, - - 188, 177, 188, 188, 188, 188, 188, 188, 192, 169, - 260, 163, 163, 253, 252, 192, 251, 192, 192, 192, - 192, 250, 192, 192, 192, 192, 192, 192, 192, 195, - 249, 246, 195, 195, 245, 195, 195, 244, 195, 195, - 195, 195, 243, 195, 195, 195, 195, 195, 195, 195, - 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, - 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, - 216, 217, 217, 242, 217, 217, 217, 217, 217, 217, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 112, + 320, 319, 318, 317, 112, 316, 112, 315, 112, 112, + 112, 112, 112, 314, 112, 112, 112, 112, 112, 112, + 116, 313, 312, 311, 310, 309, 308, 116, 307, 116, + 116, 116, 116, 129, 121, 116, 116, 116, 116, 116, + 116, 118, 109, 109, 118, 118, 285, 118, 118, 284, + 118, 118, 118, 118, 283, 282, 118, 118, 118, 118, + + 118, 118, 128, 128, 275, 128, 274, 273, 272, 128, + 165, 271, 867, 165, 165, 195, 165, 165, 264, 165, + 165, 165, 165, 183, 184, 165, 165, 165, 165, 165, + 165, 169, 178, 178, 169, 169, 170, 169, 169, 262, + 169, 169, 169, 169, 164, 169, 169, 169, 164, 169, + 169, 169, 177, 255, 254, 177, 253, 252, 177, 177, + 251, 177, 177, 177, 177, 177, 248, 177, 177, 177, + 177, 177, 177, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 181, 181, 181, 181, 183, 183, 247, 183, 246, 183, + + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 189, 245, 244, 243, 236, + 189, 235, 189, 234, 189, 189, 189, 189, 189, 233, + 189, 189, 189, 189, 189, 189, 193, 232, 231, 129, + 104, 129, 197, 193, 117, 193, 193, 193, 193, 219, + 193, 193, 193, 193, 193, 193, 193, 196, 109, 107, + 196, 196, 106, 196, 196, 105, 196, 196, 196, 196, + 214, 196, 196, 196, 196, 196, 196, 196, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, - 217, 217, 119, 235, 234, 119, 119, 233, 119, 119, - - 232, 119, 119, 119, 119, 231, 230, 119, 119, 119, - 119, 119, 119, 128, 128, 129, 128, 104, 129, 196, - 128, 225, 225, 117, 225, 218, 109, 107, 225, 227, - 227, 227, 106, 227, 105, 213, 212, 227, 164, 211, - 210, 164, 164, 209, 164, 164, 204, 164, 164, 164, - 164, 183, 177, 164, 164, 164, 164, 164, 164, 165, - 169, 139, 165, 165, 136, 165, 165, 163, 165, 165, - 165, 165, 162, 159, 165, 165, 165, 165, 165, 165, - 168, 157, 143, 168, 168, 142, 168, 168, 141, 168, - 168, 168, 168, 138, 168, 168, 168, 137, 168, 168, - - 168, 176, 131, 129, 176, 117, 107, 176, 176, 106, - 176, 176, 176, 176, 176, 105, 176, 176, 176, 176, - 176, 176, 182, 182, 861, 182, 861, 182, 182, 182, - 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 182, 182, 182, 191, 861, 861, 861, 861, 861, 861, - 191, 861, 191, 191, 191, 191, 861, 861, 191, 191, - 191, 191, 191, 191, 192, 861, 861, 861, 861, 861, - 861, 192, 861, 192, 192, 192, 192, 861, 192, 192, - 192, 192, 192, 192, 192, 195, 861, 861, 195, 195, - 861, 195, 195, 861, 195, 195, 195, 195, 861, 195, - - 195, 195, 195, 195, 195, 195, 206, 861, 861, 206, - 206, 861, 206, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 291, 291, 861, 291, 861, 861, - 861, 291, 297, 297, 297, 861, 297, 861, 861, 861, - 297, 361, 361, 861, 361, 861, 861, 861, 361, 362, - 362, 861, 362, 861, 861, 861, 362, 366, 366, 861, - 366, 861, 861, 861, 366, 368, 368, 368, 861, 368, - 861, 861, 861, 368, 206, 861, 861, 206, 206, 861, - 206, 436, 436, 861, 436, 861, 861, 861, 436, 438, - - 438, 861, 438, 861, 861, 861, 438, 439, 439, 861, - 439, 861, 861, 861, 439, 441, 441, 441, 861, 441, - 861, 861, 861, 441, 445, 445, 445, 445, 861, 445, - 861, 861, 861, 445, 505, 505, 861, 505, 861, 861, - 861, 505, 506, 506, 861, 506, 861, 861, 861, 506, - 507, 507, 861, 507, 861, 861, 861, 507, 519, 519, - 519, 861, 519, 861, 861, 861, 519, 520, 520, 520, - 520, 861, 520, 861, 861, 861, 520, 216, 216, 216, - 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, - 216, 216, 216, 216, 216, 216, 216, 216, 574, 574, - - 861, 574, 861, 861, 861, 574, 575, 575, 861, 575, - 861, 861, 861, 575, 591, 591, 591, 861, 591, 861, - 861, 861, 591, 592, 592, 592, 592, 861, 592, 861, - 861, 861, 592, 216, 216, 216, 216, 216, 216, 216, - 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, - 216, 216, 216, 216, 206, 861, 861, 206, 206, 861, - 206, 193, 861, 861, 861, 193, 193, 861, 193, 193, - 193, 861, 861, 193, 193, 636, 636, 861, 636, 861, - 861, 861, 636, 640, 861, 640, 640, 861, 640, 861, - 861, 861, 640, 658, 658, 658, 861, 658, 861, 861, - - 861, 658, 659, 659, 659, 659, 861, 659, 861, 861, - 861, 659, 603, 603, 861, 861, 603, 861, 861, 861, - 603, 216, 216, 216, 216, 216, 216, 216, 216, 216, - 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, - 216, 216, 206, 861, 861, 206, 206, 861, 206, 193, - 861, 861, 861, 193, 193, 861, 193, 193, 193, 861, - 861, 193, 193, 703, 703, 861, 703, 861, 861, 861, - 703, 704, 861, 704, 704, 861, 704, 861, 861, 861, - 704, 720, 720, 720, 861, 720, 861, 861, 861, 720, - 721, 721, 721, 861, 861, 721, 861, 861, 861, 721, - - 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, - 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, - 730, 735, 735, 861, 735, 735, 735, 861, 735, 861, - 735, 735, 735, 735, 861, 861, 735, 735, 735, 735, - 735, 735, 741, 741, 861, 741, 741, 741, 861, 741, - 861, 741, 741, 741, 741, 861, 861, 741, 741, 741, - 741, 741, 741, 206, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 206, 206, 861, 206, 206, 861, - 206, 758, 758, 861, 758, 861, 861, 861, 758, 759, - 861, 759, 759, 861, 759, 861, 861, 861, 759, 775, - - 775, 861, 861, 775, 861, 861, 861, 775, 741, 861, - 861, 861, 861, 861, 861, 741, 861, 741, 741, 741, - 741, 861, 861, 741, 741, 741, 741, 741, 741, 799, - 799, 861, 799, 861, 861, 861, 799, 800, 861, 800, - 800, 861, 800, 861, 861, 861, 800, 823, 823, 861, - 823, 861, 861, 861, 823, 824, 861, 824, 861, 861, - 824, 861, 861, 861, 824, 828, 828, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 15, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861 + 217, 217, 217, 217, 217, 217, 217, 217, 217, 218, + + 218, 213, 218, 218, 218, 218, 218, 218, 218, 218, + 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + 119, 212, 211, 119, 119, 210, 119, 119, 205, 119, + 119, 119, 119, 184, 178, 119, 119, 119, 119, 119, + 119, 128, 128, 170, 128, 139, 136, 164, 128, 226, + 226, 163, 226, 160, 158, 142, 226, 228, 228, 228, + 141, 228, 138, 137, 131, 228, 165, 129, 117, 165, + 165, 107, 165, 165, 106, 165, 165, 165, 165, 105, + 867, 165, 165, 165, 165, 165, 165, 166, 867, 867, + 166, 166, 867, 166, 166, 867, 166, 166, 166, 166, + + 867, 867, 166, 166, 166, 166, 166, 166, 169, 867, + 867, 169, 169, 867, 169, 169, 867, 169, 169, 169, + 169, 867, 169, 169, 169, 867, 169, 169, 169, 177, + 867, 867, 177, 867, 867, 177, 177, 867, 177, 177, + 177, 177, 177, 867, 177, 177, 177, 177, 177, 177, + 183, 183, 867, 183, 867, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 183, 192, 867, 867, 867, 867, 867, 867, 192, 867, + 192, 192, 192, 192, 867, 867, 192, 192, 192, 192, + 192, 192, 193, 867, 867, 867, 867, 867, 867, 193, + + 867, 193, 193, 193, 193, 867, 193, 193, 193, 193, + 193, 193, 193, 196, 867, 867, 196, 196, 867, 196, + 196, 867, 196, 196, 196, 196, 867, 196, 196, 196, + 196, 196, 196, 196, 207, 867, 867, 207, 207, 867, + 207, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 293, 293, 867, 293, 867, 867, 867, 293, + 299, 299, 299, 867, 299, 867, 867, 867, 299, 364, + 364, 867, 364, 867, 867, 867, 364, 365, 365, 867, + 365, 867, 867, 867, 365, 369, 369, 867, 369, 867, + + 867, 867, 369, 371, 371, 371, 867, 371, 867, 867, + 867, 371, 207, 867, 867, 207, 207, 867, 207, 440, + 440, 867, 440, 867, 867, 867, 440, 442, 442, 867, + 442, 867, 867, 867, 442, 443, 443, 867, 443, 867, + 867, 867, 443, 445, 445, 445, 867, 445, 867, 867, + 867, 445, 449, 449, 449, 449, 867, 449, 867, 867, + 867, 449, 510, 510, 867, 510, 867, 867, 867, 510, + 511, 511, 867, 511, 867, 867, 867, 511, 512, 512, + 867, 512, 867, 867, 867, 512, 524, 524, 524, 867, + 524, 867, 867, 867, 524, 525, 525, 525, 525, 867, + + 525, 867, 867, 867, 525, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 580, 580, 867, 580, + 867, 867, 867, 580, 581, 581, 867, 581, 867, 867, + 867, 581, 597, 597, 597, 867, 597, 867, 867, 867, + 597, 598, 598, 598, 598, 867, 598, 867, 867, 867, + 598, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 207, 867, 867, 207, 207, 867, 207, 194, + 867, 867, 867, 194, 194, 867, 194, 194, 194, 867, + + 867, 194, 194, 642, 642, 867, 642, 867, 867, 867, + 642, 646, 867, 646, 646, 867, 646, 867, 867, 867, + 646, 664, 664, 664, 867, 664, 867, 867, 867, 664, + 665, 665, 665, 665, 867, 665, 867, 867, 867, 665, + 609, 609, 867, 867, 609, 867, 867, 867, 609, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 207, 867, 867, 207, 207, 867, 207, 194, 867, 867, + 867, 194, 194, 867, 194, 194, 194, 867, 867, 194, + 194, 709, 709, 867, 709, 867, 867, 867, 709, 710, + + 867, 710, 710, 867, 710, 867, 867, 867, 710, 726, + 726, 726, 867, 726, 867, 867, 867, 726, 727, 727, + 727, 867, 867, 727, 867, 867, 867, 727, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, 736, 741, + 741, 867, 741, 741, 741, 867, 741, 867, 741, 741, + 741, 741, 867, 867, 741, 741, 741, 741, 741, 741, + 747, 747, 867, 747, 747, 747, 867, 747, 867, 747, + 747, 747, 747, 867, 867, 747, 747, 747, 747, 747, + 747, 207, 867, 867, 867, 867, 867, 867, 867, 867, + + 867, 867, 207, 207, 867, 207, 207, 867, 207, 764, + 764, 867, 764, 867, 867, 867, 764, 765, 867, 765, + 765, 867, 765, 867, 867, 867, 765, 781, 781, 867, + 867, 781, 867, 867, 867, 781, 747, 867, 867, 867, + 867, 867, 867, 747, 867, 747, 747, 747, 747, 867, + 867, 747, 747, 747, 747, 747, 747, 805, 805, 867, + 805, 867, 867, 867, 805, 806, 867, 806, 806, 867, + 806, 867, 867, 867, 806, 829, 829, 867, 829, 867, + 867, 867, 829, 830, 867, 830, 867, 867, 830, 867, + 867, 867, 830, 834, 834, 834, 834, 834, 834, 834, + + 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, + 834, 834, 834, 834, 15, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867 } ; -static yyconst short int yy_chk[5659] = +static yyconst short int yy_chk[5687] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1310,29 +1315,29 @@ static yyconst short int yy_chk[5659] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 51, 3, 80, 2, 36, 3, 42, 37, 54, 4, 37, 3, 52, 4, 3, 36, 5, 5, - 5, 4, 5, 42, 4, 56, 74, 51, 5, 39, + 5, 4, 5, 42, 4, 45, 93, 51, 5, 39, - 22, 2, 2, 52, 39, 56, 2, 855, 54, 70, - 70, 3, 5, 5, 2, 3, 3, 2, 3, 4, - 22, 93, 74, 4, 4, 80, 4, 6, 6, 6, - 76, 6, 93, 11, 11, 11, 11, 6, 81, 5, + 22, 2, 2, 52, 39, 861, 2, 93, 54, 45, + 129, 3, 5, 5, 2, 3, 3, 2, 3, 4, + 22, 129, 56, 4, 4, 80, 4, 6, 6, 6, + 74, 6, 56, 11, 11, 11, 11, 6, 76, 5, 3, 12, 12, 12, 12, 27, 27, 22, 4, 27, - 27, 6, 6, 78, 78, 103, 76, 9, 9, 9, - 9, 9, 83, 83, 103, 83, 9, 9, 9, 27, - 30, 30, 30, 30, 30, 30, 84, 48, 6, 7, - 7, 7, 9, 7, 11, 155, 48, 81, 62, 129, - 94, 157, 12, 94, 27, 48, 84, 62, 155, 322, + 27, 6, 6, 70, 70, 161, 74, 9, 9, 9, + 9, 9, 78, 78, 76, 161, 9, 9, 9, 27, + 30, 30, 30, 30, 30, 30, 81, 48, 6, 7, + 7, 7, 9, 7, 11, 147, 48, 147, 62, 103, + 83, 83, 12, 83, 27, 48, 94, 62, 103, 94, - 129, 10, 10, 10, 10, 10, 62, 157, 9, 112, + 853, 10, 10, 10, 10, 10, 62, 852, 9, 84, 10, 10, 10, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 84, 49, 146, 10, 146, 322, 112, + 29, 29, 29, 148, 49, 81, 10, 288, 148, 84, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, - 8, 8, 10, 8, 49, 49, 112, 847, 160, 49, - 89, 89, 89, 89, 89, 89, 354, 49, 160, 354, + 8, 8, 10, 8, 49, 49, 84, 171, 171, 49, + 89, 89, 89, 89, 89, 89, 288, 49, 175, 175, 49, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 127, 127, 127, 127, 127, 127, 170, 170, 846, + 110, 127, 127, 127, 127, 127, 127, 187, 187, 851, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, @@ -1343,586 +1348,589 @@ static yyconst short int yy_chk[5659] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 21, 147, 144, 144, 174, 174, 147, 167, 156, 154, - - 21, 158, 167, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 28, 158, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 186, 186, 286, 28, - 28, 28, 28, 28, 28, 323, 184, 59, 59, 138, - 138, 59, 59, 144, 156, 138, 138, 159, 257, 138, - 248, 138, 28, 159, 28, 28, 28, 28, 28, 28, - 34, 59, 154, 255, 248, 257, 34, 286, 255, 34, - 34, 323, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 59, 184, 34, 34, + 21, 160, 145, 145, 260, 838, 260, 160, 157, 155, + + 21, 156, 185, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 28, 156, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 296, 296, 296, 28, + 28, 28, 28, 28, 28, 159, 250, 59, 59, 138, + 138, 59, 59, 145, 157, 138, 138, 158, 159, 138, + 250, 138, 28, 185, 28, 28, 28, 28, 28, 28, + 34, 59, 155, 158, 284, 284, 34, 284, 837, 34, + 34, 336, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 59, 336, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 258, 254, 258, 38, 38, 38, 38, 38, - 38, 259, 398, 181, 181, 38, 111, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 259, 261, 331, 331, + 38, 38, 228, 256, 834, 38, 38, 38, 38, 38, + 38, 259, 261, 228, 292, 38, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 333, 261, 259, 831, 38, 38, 38, 38, 38, 38, 46, 46, 46, 46, - 46, 261, 46, 46, 845, 398, 46, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 254, 185, 832, - - 46, 46, 46, 47, 181, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 50, 68, 68, 68, 114, - 68, 294, 294, 294, 68, 50, 68, 479, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 148, 114, - 68, 68, 282, 282, 479, 282, 105, 185, 105, 105, - 105, 85, 105, 105, 188, 177, 105, 85, 177, 177, - 85, 305, 330, 85, 85, 177, 114, 68, 148, 148, - 105, 105, 105, 148, 188, 50, 69, 85, 309, 85, - 177, 148, 308, 290, 148, 305, 69, 308, 227, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 227, - - 324, 188, 309, 85, 85, 86, 324, 831, 86, 86, - 290, 86, 86, 86, 86, 344, 297, 86, 86, 115, - 344, 115, 115, 330, 334, 115, 115, 297, 400, 115, - 334, 86, 86, 86, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 115, 115, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 828, 86, 86, 87, - 333, 400, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 333, 342, 87, 87, + 46, 292, 46, 46, 334, 334, 46, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 256, 186, 168, + + 46, 46, 46, 47, 168, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 50, 68, 68, 68, 112, + 68, 307, 114, 436, 68, 50, 68, 333, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 257, 112, + 68, 68, 114, 257, 484, 307, 105, 186, 105, 105, + 105, 85, 105, 105, 402, 178, 105, 85, 178, 178, + 85, 484, 436, 85, 85, 178, 112, 68, 189, 114, + 105, 105, 105, 182, 182, 50, 69, 85, 310, 85, + 178, 190, 311, 310, 326, 263, 69, 402, 189, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 263, + + 479, 190, 347, 85, 85, 86, 311, 347, 86, 86, + 479, 86, 86, 86, 86, 189, 299, 86, 86, 115, + 326, 115, 115, 404, 182, 115, 115, 299, 190, 115, + 403, 86, 86, 86, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 115, 115, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 404, 86, 86, 87, + 562, 403, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 562, 345, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 342, 399, 87, 87, 87, 87, 87, 87, 87, + 87, 345, 829, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 90, 345, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 399, 567, 567, 90, 90, 90, 90, - 90, 90, 368, 825, 117, 345, 117, 117, 117, 321, - 117, 117, 321, 368, 117, 202, 202, 202, 202, 202, - 202, 90, 90, 90, 90, 90, 90, 91, 117, 117, + 90, 348, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 485, 573, 573, 90, 90, 90, 90, + 90, 90, 371, 485, 117, 348, 117, 117, 117, 324, + 117, 117, 324, 371, 117, 203, 203, 203, 203, 203, + 203, 90, 90, 90, 90, 90, 90, 91, 117, 117, 117, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 321, 381, 91, 91, 91, 91, + 91, 91, 91, 91, 324, 384, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 381, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 384, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 406, - 606, 606, 95, 95, 95, 95, 95, 95, 402, 823, - 118, 118, 95, 402, 118, 118, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 387, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 611, + 820, 611, 95, 95, 95, 95, 95, 95, 406, 482, + 118, 118, 95, 406, 118, 118, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 390, 95, 95, 95, 95, 95, 95, 101, 118, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 120, 189, 120, 120, 120, - 387, 120, 120, 247, 247, 120, 247, 401, 474, 118, + 101, 101, 101, 101, 101, 120, 819, 120, 120, 120, + 390, 120, 120, 149, 327, 120, 212, 212, 325, 118, - 222, 222, 222, 222, 222, 222, 189, 406, 474, 120, + 327, 337, 212, 212, 482, 405, 212, 337, 212, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 164, 164, 211, 211, 164, 164, 247, 814, - 211, 211, 401, 189, 211, 480, 211, 166, 541, 166, - 166, 166, 541, 166, 166, 480, 164, 166, 432, 121, + 121, 121, 197, 149, 149, 411, 197, 325, 149, 542, + 357, 545, 197, 357, 412, 542, 149, 165, 165, 149, + 405, 165, 165, 545, 818, 412, 197, 197, 411, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 536, 166, 166, 166, 122, 122, 122, 122, 122, 122, - 536, 164, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 289, 289, 289, 289, 605, 432, 605, 122, + 615, 165, 615, 465, 122, 122, 122, 122, 122, 122, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 223, 223, 223, 223, 223, 223, 165, 465, 699, 122, 122, 122, 122, 122, 122, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 332, 813, 407, 130, - 130, 130, 130, 130, 130, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 301, 301, 301, 301, 301, - 301, 407, 554, 332, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 335, 809, 465, 130, + 130, 130, 130, 130, 130, 201, 201, 201, 201, 201, + 201, 201, 201, 201, 201, 249, 249, 699, 249, 291, + 291, 291, 291, 335, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 332, 370, 370, 131, 131, 131, 131, 131, 131, - 190, 408, 190, 190, 370, 192, 190, 190, 409, 477, - 190, 192, 408, 409, 192, 372, 372, 192, 192, 131, - 131, 131, 131, 131, 131, 190, 190, 372, 554, 459, - 196, 192, 441, 192, 196, 194, 812, 194, 194, 194, - - 196, 194, 194, 441, 339, 194, 339, 339, 339, 339, - 339, 339, 445, 459, 196, 196, 478, 192, 192, 194, - 194, 194, 195, 445, 477, 195, 195, 478, 195, 195, - 195, 195, 459, 803, 195, 195, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 802, 460, 195, 195, - 195, 218, 218, 218, 218, 218, 218, 218, 218, 218, - 218, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 460, 556, 800, 195, 195, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 661, 661, 556, 460, - 198, 198, 198, 198, 198, 198, 221, 221, 221, 221, - - 221, 221, 221, 221, 221, 221, 378, 378, 378, 378, - 378, 378, 446, 446, 462, 198, 198, 198, 198, 198, - 198, 203, 662, 662, 446, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 462, 465, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 465, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 799, 466, 461, 204, 204, 204, 204, - - 204, 204, 298, 298, 298, 298, 298, 298, 298, 298, - 298, 298, 573, 573, 573, 573, 447, 447, 466, 461, - 463, 204, 204, 204, 204, 204, 204, 220, 447, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 260, - 461, 467, 466, 260, 463, 551, 671, 671, 540, 260, - 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, - 540, 463, 551, 260, 260, 467, 220, 223, 519, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 519, - 797, 467, 468, 223, 223, 223, 223, 223, 223, 335, - 335, 335, 335, 335, 335, 335, 335, 335, 335, 455, - - 455, 455, 455, 455, 455, 796, 468, 570, 223, 223, - 223, 223, 223, 223, 226, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 469, 486, 489, 226, 226, - 226, 226, 226, 226, 369, 369, 369, 369, 369, 369, - 369, 369, 369, 369, 609, 570, 609, 491, 492, 469, - 486, 489, 491, 226, 226, 226, 226, 226, 226, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 616, 492, 616, 228, 228, 228, 228, 228, 228, - 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, - 485, 795, 485, 485, 485, 485, 485, 485, 785, 228, - - 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, - 229, 229, 229, 229, 229, 229, 495, 496, 533, 229, - 229, 229, 229, 229, 229, 375, 375, 375, 375, 375, - 375, 375, 375, 537, 635, 635, 635, 375, 538, 537, - 495, 496, 533, 784, 229, 229, 229, 229, 229, 229, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 668, 538, 668, 230, 230, 230, 230, 230, 230, - 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, - 435, 775, 435, 435, 435, 435, 435, 435, 773, 230, - 230, 230, 230, 230, 230, 265, 543, 265, 265, 265, - - 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 266, 266, 772, 435, - 543, 266, 266, 266, 266, 266, 266, 448, 448, 448, - 448, 448, 448, 448, 448, 448, 448, 504, 504, 504, - 504, 504, 504, 679, 679, 771, 266, 266, 266, 266, - 266, 266, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 449, 449, 547, 759, 268, 268, 268, 268, - 268, 268, 520, 557, 449, 452, 452, 452, 452, 452, - 452, 452, 452, 520, 545, 722, 722, 452, 547, 545, - 557, 268, 268, 268, 268, 268, 268, 285, 285, 285, - - 285, 285, 285, 285, 285, 285, 285, 454, 454, 454, - 454, 454, 454, 454, 454, 454, 454, 481, 481, 481, - 481, 481, 481, 481, 481, 481, 481, 511, 511, 511, - 511, 511, 511, 758, 285, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 299, 299, 299, 299, - 299, 299, 299, 299, 299, 299, 299, 299, 299, 549, - 680, 566, 299, 299, 299, 299, 299, 299, 503, 503, - 503, 503, 503, 503, 503, 503, 503, 503, 566, 608, - 756, 464, 666, 549, 608, 666, 755, 299, 299, 299, - 299, 299, 299, 302, 302, 302, 302, 302, 302, 302, - - 302, 302, 302, 302, 302, 464, 521, 521, 302, 302, - 302, 302, 302, 302, 672, 748, 607, 464, 521, 672, - 680, 746, 464, 508, 508, 508, 508, 508, 508, 508, - 508, 508, 508, 302, 302, 302, 302, 302, 302, 303, - 607, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 745, 727, 607, 727, 340, 340, 340, 340, 340, - 340, 510, 510, 510, 510, 510, 510, 510, 510, 510, - 510, 518, 610, 518, 518, 518, 518, 518, 518, 693, - 340, 340, 340, 340, 340, 340, 341, 341, 341, 341, - - 341, 341, 341, 341, 341, 341, 610, 744, 629, 630, - 341, 341, 341, 341, 341, 341, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 728, 728, 693, 610, - 522, 522, 629, 630, 741, 341, 341, 341, 341, 341, - 341, 358, 522, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 358, 359, 577, 359, 359, 359, 359, 359, - 359, 359, 359, 359, 359, 360, 577, 360, 360, 360, - 360, 360, 360, 360, 360, 360, 360, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, 373, 373, - 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, - - 373, 615, 615, 611, 373, 373, 373, 373, 373, 373, - 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, - 530, 530, 530, 530, 530, 530, 779, 611, 779, 373, - 373, 373, 373, 373, 373, 376, 376, 376, 376, 376, - 376, 376, 376, 376, 376, 376, 376, 376, 524, 524, - 611, 376, 376, 376, 376, 376, 376, 615, 579, 542, - 524, 527, 527, 527, 527, 527, 527, 527, 527, 542, - 579, 669, 667, 527, 731, 731, 376, 376, 376, 376, - 376, 376, 379, 379, 379, 379, 379, 379, 379, 379, - 379, 379, 379, 379, 739, 669, 667, 379, 379, 379, - - 379, 379, 379, 529, 529, 529, 529, 529, 529, 529, - 529, 529, 529, 696, 696, 696, 696, 673, 546, 667, - 781, 781, 379, 379, 379, 379, 379, 379, 380, 546, - 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 412, 673, 412, 412, 412, 412, 412, 412, 412, 412, - 412, 412, 413, 413, 413, 413, 413, 413, 413, 413, - 413, 413, 555, 733, 734, 675, 413, 413, 413, 413, - 413, 413, 555, 576, 576, 576, 576, 576, 576, 576, - 576, 576, 576, 585, 585, 585, 585, 585, 585, 675, - 730, 413, 413, 413, 413, 413, 413, 431, 431, 431, - - 431, 431, 431, 431, 431, 431, 431, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 582, 641, 582, - 582, 582, 582, 582, 582, 591, 810, 810, 733, 582, - 641, 697, 681, 790, 431, 433, 591, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 434, 681, 434, - 434, 434, 434, 434, 434, 434, 434, 434, 434, 440, - 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, - 697, 678, 790, 440, 440, 440, 440, 440, 440, 584, - 584, 584, 584, 584, 584, 584, 584, 584, 584, 806, - 806, 806, 806, 678, 592, 678, 678, 729, 440, 440, - - 440, 440, 440, 440, 444, 592, 444, 444, 444, 444, - 444, 444, 444, 444, 444, 444, 450, 450, 450, 450, - 450, 450, 450, 450, 450, 450, 450, 450, 450, 593, - 593, 688, 450, 450, 450, 450, 450, 450, 594, 594, - 642, 593, 596, 596, 602, 602, 602, 602, 602, 602, - 594, 723, 642, 691, 596, 688, 721, 450, 450, 450, - 450, 450, 450, 453, 453, 453, 453, 453, 453, 453, - 453, 453, 453, 453, 453, 453, 902, 691, 902, 453, - 453, 453, 453, 453, 453, 599, 599, 599, 599, 599, - 599, 599, 599, 829, 829, 691, 718, 599, 650, 650, - - 650, 650, 650, 650, 453, 453, 453, 453, 453, 453, - 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, - 456, 456, 617, 717, 690, 456, 456, 456, 456, 456, - 456, 601, 601, 601, 601, 601, 601, 601, 601, 601, - 601, 875, 875, 875, 617, 644, 617, 617, 690, 689, - 456, 456, 456, 456, 456, 456, 457, 644, 457, 457, - 457, 457, 457, 457, 457, 457, 457, 457, 458, 458, - 690, 617, 872, 689, 458, 872, 884, 458, 458, 884, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 689, 704, 458, 458, 458, 458, + 131, 335, 410, 557, 131, 131, 131, 131, 131, 131, + 249, 167, 546, 167, 167, 167, 546, 167, 167, 808, + 557, 167, 303, 303, 303, 303, 303, 303, 445, 131, + 131, 131, 131, 131, 131, 167, 167, 167, 191, 445, + 191, 191, 449, 193, 191, 191, 373, 373, 191, 193, + + 375, 375, 193, 449, 413, 193, 193, 262, 373, 413, + 496, 262, 375, 191, 191, 496, 806, 262, 560, 193, + 410, 193, 576, 195, 805, 195, 195, 195, 466, 195, + 195, 262, 262, 195, 202, 202, 202, 202, 202, 202, + 202, 202, 202, 202, 483, 193, 193, 195, 195, 195, + 196, 541, 466, 196, 196, 483, 196, 196, 196, 196, + 576, 541, 196, 196, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 560, 464, 196, 196, 196, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 222, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 464, + + 612, 612, 196, 196, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 622, 803, 622, 464, 199, 199, + 199, 199, 199, 199, 300, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 342, 563, 342, 342, 342, 342, + 342, 342, 469, 199, 199, 199, 199, 199, 199, 204, + 667, 667, 563, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 469, 472, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 472, 204, 204, 204, 204, 204, 204, 204, 204, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 458, 502, - 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, - 623, 623, 623, 623, 623, 623, 623, 633, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 502, 509, 705, - 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, - 509, 705, 931, 931, 509, 509, 509, 509, 509, 509, - - 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, - 657, 703, 657, 657, 657, 657, 657, 657, 701, 509, - 509, 509, 509, 509, 509, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 512, 700, 724, 749, 512, - 512, 512, 512, 512, 512, 643, 643, 643, 643, 643, - 643, 643, 643, 643, 643, 687, 699, 687, 687, 687, - 658, 724, 749, 685, 512, 512, 512, 512, 512, 512, - 513, 658, 513, 513, 513, 513, 513, 513, 513, 513, - 513, 513, 525, 525, 525, 525, 525, 525, 525, 525, - 525, 525, 525, 525, 525, 726, 932, 932, 525, 525, - - 525, 525, 525, 525, 647, 706, 647, 647, 647, 647, - 647, 647, 892, 892, 892, 684, 647, 706, 682, 726, - 682, 682, 682, 525, 525, 525, 525, 525, 525, 528, - 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, - 528, 528, 726, 943, 943, 528, 528, 528, 528, 528, - 528, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 665, 665, 665, 665, 665, 665, 665, 665, 682, - 528, 528, 528, 528, 528, 528, 531, 531, 531, 531, - 531, 531, 531, 531, 531, 531, 531, 776, 677, 778, - 750, 531, 531, 531, 531, 531, 531, 653, 653, 653, - - 653, 653, 653, 653, 653, 653, 653, 903, 914, 903, - 914, 776, 659, 778, 750, 787, 531, 531, 531, 531, - 531, 531, 532, 659, 532, 532, 532, 532, 532, 532, - 532, 532, 532, 532, 535, 750, 778, 962, 962, 787, - 535, 740, 740, 535, 535, 740, 535, 535, 535, 535, - 535, 535, 535, 535, 535, 535, 535, 535, 535, 740, - 740, 740, 535, 535, 535, 535, 535, 535, 535, 535, - 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, - 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, - 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, - - 535, 535, 535, 535, 535, 560, 560, 560, 560, 560, - 560, 560, 560, 560, 560, 560, 563, 963, 963, 708, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, - 563, 708, 563, 656, 807, 563, 563, 563, 563, 563, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, - 563, 563, 563, 563, 563, 563, 563, 563, 807, 563, - 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, - 563, 563, 563, 563, 563, 563, 563, 569, 569, 569, - 569, 569, 569, 569, 569, 569, 569, 660, 660, 683, - 655, 683, 683, 683, 915, 919, 915, 919, 760, 660, - - 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, - 760, 654, 640, 835, 569, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 702, 816, 702, 702, - 702, 702, 702, 702, 714, 714, 714, 714, 714, 714, - 683, 707, 707, 707, 707, 707, 707, 707, 707, 707, - 707, 816, 835, 571, 580, 638, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 583, 761, 583, - 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, - 761, 751, 826, 583, 583, 583, 583, 583, 583, 711, - 637, 711, 711, 711, 711, 711, 711, 920, 636, 920, - - 735, 711, 735, 735, 735, 751, 826, 628, 583, 583, - 583, 583, 583, 583, 586, 586, 586, 586, 586, 586, - 586, 586, 586, 586, 586, 627, 625, 751, 586, 586, - 586, 586, 586, 586, 713, 713, 713, 713, 713, 713, - 713, 713, 713, 713, 924, 927, 924, 927, 937, 720, - 937, 735, 624, 586, 586, 586, 586, 586, 586, 587, - 720, 587, 587, 587, 587, 587, 587, 587, 587, 587, - 587, 590, 622, 590, 590, 590, 590, 590, 590, 590, - 590, 590, 590, 597, 597, 597, 597, 597, 597, 597, - 597, 597, 597, 597, 597, 597, 621, 788, 809, 597, - - 597, 597, 597, 597, 597, 736, 620, 736, 736, 736, - 737, 763, 737, 737, 737, 738, 618, 738, 738, 738, - 614, 788, 809, 763, 597, 597, 597, 597, 597, 597, - 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, - 600, 600, 788, 801, 613, 809, 600, 600, 600, 600, - 600, 600, 938, 612, 938, 801, 736, 946, 947, 946, - 947, 737, 950, 956, 950, 956, 738, 957, 959, 957, - 959, 600, 600, 600, 600, 600, 600, 603, 595, 603, - 603, 603, 603, 603, 603, 603, 603, 603, 603, 604, - 742, 589, 742, 742, 742, 604, 742, 742, 604, 604, - - 742, 604, 604, 604, 604, 604, 604, 604, 604, 604, - 604, 604, 604, 604, 742, 742, 742, 604, 604, 604, - 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, - 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, - 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, - 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, - 626, 747, 588, 747, 747, 747, 747, 747, 747, 626, - 967, 575, 967, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 574, 568, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 565, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 632, 564, 632, 632, 632, 632, 632, 632, 632, 632, - 632, 632, 743, 743, 743, 743, 743, 743, 743, 743, - 743, 743, 762, 762, 762, 762, 762, 762, 762, 762, - 762, 762, 769, 769, 769, 769, 769, 769, 965, 632, - 639, 965, 639, 639, 639, 639, 639, 639, 639, 639, - 639, 639, 645, 562, 645, 645, 645, 645, 645, 645, - 645, 645, 645, 645, 645, 648, 561, 648, 648, 648, - - 648, 648, 648, 648, 648, 648, 648, 648, 968, 559, - 968, 648, 648, 648, 648, 648, 648, 766, 558, 766, - 766, 766, 766, 766, 766, 971, 553, 971, 798, 766, - 798, 798, 798, 798, 798, 798, 648, 648, 648, 648, - 648, 648, 651, 651, 651, 651, 651, 651, 651, 651, - 651, 651, 651, 972, 552, 972, 651, 651, 651, 651, - 651, 651, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 774, 774, 774, 774, 774, 774, 774, 517, - 516, 651, 651, 651, 651, 651, 651, 652, 515, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 663, - - 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, - 663, 686, 507, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 692, 692, 692, 692, 692, 692, 692, - 692, 692, 692, 782, 782, 782, 782, 782, 782, 782, - 782, 782, 782, 783, 783, 783, 783, 783, 783, 783, - 783, 783, 783, 842, 842, 842, 842, 842, 842, 506, - 692, 694, 505, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 977, 501, 977, 793, 494, 793, 793, - 793, 793, 793, 793, 794, 794, 794, 794, 794, 794, - 794, 794, 794, 794, 860, 860, 860, 860, 860, 860, - - 694, 709, 493, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 709, 709, 712, 793, 712, 712, 712, 712, - 712, 712, 712, 712, 712, 712, 712, 978, 490, 978, - 712, 712, 712, 712, 712, 712, 811, 811, 811, 811, - 811, 811, 811, 811, 811, 811, 815, 488, 815, 815, - 815, 815, 815, 815, 487, 712, 712, 712, 712, 712, - 712, 715, 715, 715, 715, 715, 715, 715, 715, 715, - 715, 484, 483, 482, 476, 715, 715, 715, 715, 715, - 715, 820, 820, 820, 820, 820, 820, 820, 820, 820, - 820, 838, 475, 838, 838, 838, 838, 838, 838, 473, - - 715, 715, 715, 715, 715, 715, 716, 472, 716, 716, - 716, 716, 716, 716, 716, 716, 716, 716, 719, 719, - 719, 719, 719, 719, 719, 719, 719, 719, 719, 752, - 838, 752, 752, 752, 752, 752, 752, 752, 752, 752, - 752, 753, 471, 753, 753, 753, 753, 753, 753, 753, - 753, 753, 753, 754, 470, 754, 754, 754, 754, 754, - 754, 754, 754, 754, 754, 757, 443, 757, 757, 757, - 757, 757, 757, 757, 757, 757, 757, 764, 442, 764, - 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, - 767, 439, 767, 767, 767, 767, 767, 767, 767, 767, - - 767, 767, 438, 437, 436, 430, 767, 767, 767, 767, - 767, 767, 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 848, 429, 848, 848, 848, 848, 848, 848, - 428, 767, 767, 767, 767, 767, 767, 770, 427, 770, - 770, 770, 770, 770, 770, 770, 770, 770, 770, 786, - 426, 786, 786, 786, 786, 786, 786, 786, 786, 786, - 786, 789, 425, 789, 789, 789, 789, 789, 789, 789, - 789, 789, 789, 791, 424, 791, 791, 791, 791, 791, - 791, 791, 791, 791, 791, 792, 423, 792, 792, 792, - 792, 792, 792, 792, 792, 792, 792, 804, 422, 804, - - 804, 804, 804, 804, 804, 804, 804, 804, 804, 817, - 421, 817, 817, 817, 817, 817, 817, 817, 817, 817, - 817, 818, 420, 818, 818, 818, 818, 818, 818, 818, - 818, 818, 818, 819, 419, 819, 819, 819, 819, 819, - 819, 819, 819, 819, 819, 822, 822, 822, 822, 822, - 822, 822, 822, 822, 822, 833, 418, 833, 833, 833, - 833, 833, 833, 833, 833, 833, 833, 834, 417, 834, - 834, 834, 834, 834, 834, 834, 834, 834, 834, 836, - 416, 836, 836, 836, 836, 836, 836, 836, 836, 836, - 836, 837, 415, 837, 837, 837, 837, 837, 837, 837, - - 837, 837, 837, 840, 840, 840, 840, 840, 840, 840, - 840, 840, 840, 841, 841, 841, 841, 841, 841, 841, - 841, 841, 841, 844, 844, 844, 844, 844, 844, 844, - 844, 844, 844, 849, 849, 849, 849, 849, 849, 849, - 849, 849, 849, 852, 852, 852, 852, 852, 852, 852, - 852, 852, 852, 853, 853, 853, 853, 853, 853, 853, - 853, 853, 853, 857, 857, 857, 857, 857, 857, 414, - 849, 850, 850, 850, 850, 850, 850, 850, 850, 850, - 850, 854, 854, 854, 854, 854, 854, 854, 854, 854, - 854, 976, 411, 410, 976, 405, 404, 403, 976, 397, - - 857, 395, 394, 393, 392, 391, 390, 389, 850, 851, - 851, 851, 851, 851, 851, 851, 851, 851, 851, 859, - 859, 859, 859, 859, 859, 859, 859, 859, 859, 386, - 385, 384, 383, 367, 366, 365, 364, 362, 361, 357, - 356, 355, 353, 352, 351, 350, 851, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 349, 348, 347, - 346, 343, 338, 337, 336, 329, 328, 327, 326, 325, - 319, 317, 316, 315, 314, 313, 312, 311, 310, 307, - 306, 304, 296, 295, 856, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, - - 862, 862, 862, 862, 862, 862, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 864, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, - 864, 864, 864, 864, 864, 864, 864, 864, 865, 865, - 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, - 865, 865, 865, 865, 865, 865, 865, 865, 865, 866, - 292, 291, 284, 283, 281, 280, 866, 279, 866, 866, - 866, 866, 278, 277, 866, 866, 866, 866, 866, 866, - 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 802, 473, 491, 205, 205, 205, 205, 205, 205, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 381, 381, 381, 381, 381, 381, 473, 491, 801, 205, + 205, 205, 205, 205, 205, 221, 791, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 372, 372, 372, + 372, 372, 372, 372, 372, 372, 372, 459, 459, 459, + 459, 459, 459, 672, 221, 224, 672, 224, 224, 224, + + 224, 224, 224, 224, 224, 224, 224, 470, 494, 497, + 463, 224, 224, 224, 224, 224, 224, 374, 374, 374, + 374, 374, 374, 374, 374, 374, 374, 641, 641, 641, + 467, 470, 494, 497, 463, 790, 224, 224, 224, 224, + 224, 224, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 463, 467, 470, 227, 227, 227, 227, + 227, 227, 378, 378, 378, 378, 378, 378, 378, 378, + 674, 467, 674, 490, 378, 490, 490, 490, 490, 490, + 490, 227, 227, 227, 227, 227, 227, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 621, + + 621, 781, 229, 229, 229, 229, 229, 229, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 439, 779, + 439, 439, 439, 439, 439, 439, 778, 229, 229, 229, + 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 450, 450, 777, 230, 230, 230, + 230, 230, 230, 451, 451, 621, 450, 439, 453, 453, + 524, 668, 668, 550, 614, 451, 474, 500, 550, 614, + 453, 524, 230, 230, 230, 230, 230, 230, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 501, + 474, 500, 231, 231, 231, 231, 231, 231, 452, 452, + + 452, 452, 452, 452, 452, 452, 452, 452, 677, 677, + 678, 474, 733, 501, 733, 678, 765, 231, 231, 231, + 231, 231, 231, 267, 471, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 572, 764, 471, 268, + 268, 268, 268, 268, 268, 456, 456, 456, 456, 456, + 456, 456, 456, 572, 471, 762, 538, 456, 509, 509, + 509, 509, 509, 509, 268, 268, 268, 268, 268, 268, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 538, 685, 685, 761, 270, 270, 270, 270, 270, 270, - 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, - 867, 868, 276, 275, 274, 273, 868, 272, 868, 271, - 868, 868, 868, 868, 868, 270, 868, 868, 868, 868, - 868, 868, 869, 267, 264, 263, 262, 256, 253, 869, - 252, 869, 869, 869, 869, 251, 250, 869, 869, 869, - 869, 869, 869, 870, 249, 246, 870, 870, 245, 870, - 870, 244, 870, 870, 870, 870, 243, 242, 870, 870, - 870, 870, 870, 870, 871, 871, 241, 871, 240, 239, - 238, 871, 873, 237, 236, 873, 873, 235, 873, 873, - 234, 873, 873, 873, 873, 233, 232, 873, 873, 873, - - 873, 873, 873, 874, 231, 225, 874, 874, 224, 874, - 874, 217, 874, 874, 874, 874, 216, 874, 874, 874, - 215, 874, 874, 874, 876, 214, 213, 876, 212, 210, - 876, 876, 209, 876, 876, 876, 876, 876, 208, 876, - 876, 876, 876, 876, 876, 877, 877, 877, 877, 877, - 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, - 877, 877, 877, 877, 877, 877, 878, 878, 207, 878, - 205, 878, 878, 878, 878, 878, 878, 878, 878, 878, - 878, 878, 878, 878, 878, 878, 878, 879, 199, 191, - 187, 183, 879, 182, 879, 180, 879, 879, 879, 879, - - 879, 176, 879, 879, 879, 879, 879, 879, 880, 169, - 165, 163, 161, 153, 152, 880, 151, 880, 880, 880, - 880, 150, 880, 880, 880, 880, 880, 880, 880, 881, - 149, 143, 881, 881, 142, 881, 881, 141, 881, 881, - 881, 881, 140, 881, 881, 881, 881, 881, 881, 881, - 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, - 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, - 882, 883, 883, 139, 883, 883, 883, 883, 883, 883, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 754, 468, 516, 516, 516, 516, 516, 516, 752, 270, + 270, 270, 270, 270, 270, 287, 287, 287, 287, 287, + 287, 287, 287, 287, 287, 468, 486, 486, 486, 486, + 486, 486, 486, 486, 486, 486, 751, 468, 525, 526, + 526, 523, 468, 523, 523, 523, 523, 523, 523, 525, + 750, 526, 287, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 301, 301, 301, 301, 301, 301, + 301, 301, 301, 301, 301, 301, 301, 747, 543, 548, + 301, 301, 301, 301, 301, 301, 508, 508, 508, 508, + + 508, 508, 508, 508, 508, 508, 535, 535, 535, 535, + 535, 535, 543, 548, 745, 301, 301, 301, 301, 301, + 301, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 740, 552, 554, 304, 304, 304, 304, + 304, 304, 513, 513, 513, 513, 513, 513, 513, 513, + 513, 513, 579, 579, 579, 579, 527, 527, 552, 554, + 736, 304, 304, 304, 304, 304, 304, 305, 527, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 728, + 728, 635, 636, 343, 343, 343, 343, 343, 343, 515, + + 515, 515, 515, 515, 515, 515, 515, 515, 515, 591, + 591, 591, 591, 591, 591, 635, 636, 735, 343, 343, + 343, 343, 343, 343, 344, 344, 344, 344, 344, 344, + 344, 344, 344, 344, 734, 734, 675, 679, 344, 344, + 344, 344, 344, 344, 519, 519, 519, 519, 519, 519, + 519, 519, 519, 519, 702, 702, 702, 702, 529, 529, + 675, 679, 729, 344, 344, 344, 344, 344, 344, 361, + 529, 361, 361, 361, 361, 361, 361, 361, 361, 361, + 361, 362, 583, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 363, 583, 363, 363, 363, 363, 363, + + 363, 363, 363, 363, 363, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 366, 376, 376, 376, 376, + 376, 376, 376, 376, 376, 376, 376, 376, 376, 739, + 613, 616, 376, 376, 376, 376, 376, 376, 528, 528, + 528, 528, 528, 528, 528, 528, 528, 528, 608, 608, + 608, 608, 608, 608, 613, 616, 703, 376, 376, 376, + 376, 376, 376, 379, 379, 379, 379, 379, 379, 379, + 379, 379, 379, 379, 379, 379, 617, 613, 616, 379, + 379, 379, 379, 379, 379, 532, 532, 532, 532, 532, + 532, 532, 532, 547, 739, 703, 878, 532, 673, 878, + + 617, 737, 737, 547, 379, 379, 379, 379, 379, 379, + 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, + 382, 382, 673, 617, 681, 382, 382, 382, 382, 382, + 382, 534, 534, 534, 534, 534, 534, 534, 534, 534, + 534, 785, 727, 785, 890, 673, 551, 890, 681, 724, + 382, 382, 382, 382, 382, 382, 383, 551, 383, 383, + 383, 383, 383, 383, 383, 383, 383, 383, 416, 694, + 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, + 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, + 561, 787, 787, 694, 417, 417, 417, 417, 417, 417, + + 561, 582, 582, 582, 582, 582, 582, 582, 582, 582, + 582, 629, 629, 629, 629, 629, 629, 629, 723, 417, + 417, 417, 417, 417, 417, 435, 435, 435, 435, 435, + 435, 435, 435, 435, 435, 584, 584, 584, 584, 584, + 584, 584, 584, 584, 584, 585, 588, 647, 588, 588, + 588, 588, 588, 588, 816, 816, 710, 585, 588, 647, + 686, 796, 435, 437, 648, 437, 437, 437, 437, 437, + 437, 437, 437, 437, 437, 438, 648, 438, 438, 438, + 438, 438, 438, 438, 438, 438, 438, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 709, 684, + + 796, 444, 444, 444, 444, 444, 444, 590, 590, 590, + 590, 590, 590, 590, 590, 590, 590, 835, 835, 707, + 686, 684, 597, 684, 684, 706, 444, 444, 444, 444, + 444, 444, 448, 597, 448, 448, 448, 448, 448, 448, + 448, 448, 448, 448, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 598, 599, 599, + 454, 454, 454, 454, 454, 454, 600, 600, 598, 650, + 599, 602, 602, 664, 812, 812, 812, 812, 600, 705, + 697, 650, 730, 602, 664, 454, 454, 454, 454, 454, + 454, 457, 457, 457, 457, 457, 457, 457, 457, 457, + + 457, 457, 457, 457, 697, 687, 730, 457, 457, 457, + 457, 457, 457, 605, 605, 605, 605, 605, 605, 605, + 605, 687, 697, 937, 937, 605, 656, 656, 656, 656, + 656, 656, 457, 457, 457, 457, 457, 457, 460, 460, + 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, + 623, 691, 696, 460, 460, 460, 460, 460, 460, 607, + 607, 607, 607, 607, 607, 607, 607, 607, 607, 881, + 881, 881, 623, 711, 623, 623, 696, 695, 460, 460, + 460, 460, 460, 460, 461, 711, 461, 461, 461, 461, + 461, 461, 461, 461, 461, 461, 462, 462, 696, 623, + + 690, 695, 462, 938, 938, 462, 462, 683, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, 462, 695, 662, 462, 462, 462, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, + 462, 462, 462, 462, 462, 462, 462, 507, 507, 507, + 507, 507, 507, 507, 507, 507, 507, 507, 625, 625, + 625, 625, 625, 625, 625, 625, 625, 625, 639, 639, + 639, 639, 639, 639, 639, 639, 639, 639, 693, 661, + + 693, 693, 693, 949, 949, 507, 514, 712, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 712, + 968, 968, 514, 514, 514, 514, 514, 514, 640, 640, + 640, 640, 640, 640, 640, 640, 640, 640, 663, 660, + 663, 663, 663, 663, 663, 663, 841, 514, 514, 514, + 514, 514, 514, 517, 517, 517, 517, 517, 517, 517, + 517, 517, 517, 517, 646, 755, 782, 517, 517, 517, + 517, 517, 517, 649, 649, 649, 649, 649, 649, 649, + 649, 649, 649, 644, 908, 841, 908, 643, 665, 755, + 782, 642, 517, 517, 517, 517, 517, 517, 518, 665, + + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, + 530, 530, 530, 732, 969, 969, 530, 530, 530, 530, + 530, 530, 653, 714, 653, 653, 653, 653, 653, 653, + 898, 898, 898, 634, 653, 714, 688, 732, 688, 688, + 688, 530, 530, 530, 530, 530, 530, 533, 533, 533, + 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + 732, 633, 631, 533, 533, 533, 533, 533, 533, 655, + 655, 655, 655, 655, 655, 655, 655, 655, 655, 671, + 671, 671, 671, 671, 671, 671, 671, 688, 533, 533, + + 533, 533, 533, 533, 536, 536, 536, 536, 536, 536, + 536, 536, 536, 536, 536, 630, 628, 784, 756, 536, + 536, 536, 536, 536, 536, 659, 659, 659, 659, 659, + 659, 659, 659, 659, 659, 909, 920, 909, 920, 666, + 666, 784, 756, 793, 536, 536, 536, 536, 536, 536, + 537, 666, 537, 537, 537, 537, 537, 537, 537, 537, + 537, 537, 540, 756, 784, 627, 626, 793, 540, 746, + 746, 540, 540, 746, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 540, 540, 746, 746, 746, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 566, 566, 566, 566, 566, 566, 566, + 566, 566, 566, 566, 569, 624, 620, 766, 569, 569, + 569, 569, 569, 569, 569, 569, 569, 569, 569, 766, + 569, 619, 813, 569, 569, 569, 569, 569, 569, 569, + 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, + 569, 569, 569, 569, 569, 569, 813, 569, 569, 569, + 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, + + 569, 569, 569, 569, 569, 575, 575, 575, 575, 575, + 575, 575, 575, 575, 575, 689, 822, 689, 689, 689, + 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, + 708, 618, 708, 708, 708, 708, 708, 708, 601, 921, + 822, 921, 575, 577, 577, 577, 577, 577, 577, 577, + 577, 577, 577, 577, 713, 713, 713, 713, 713, 713, + 713, 713, 713, 713, 726, 717, 689, 717, 717, 717, + 717, 717, 717, 595, 925, 726, 925, 717, 926, 594, + 926, 577, 586, 581, 586, 586, 586, 586, 586, 586, + 586, 586, 586, 586, 586, 589, 767, 589, 589, 589, + + 589, 589, 589, 589, 589, 589, 589, 589, 767, 757, + 832, 589, 589, 589, 589, 589, 589, 719, 719, 719, + 719, 719, 719, 719, 719, 719, 719, 720, 720, 720, + 720, 720, 720, 757, 832, 580, 589, 589, 589, 589, + 589, 589, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 574, 571, 757, 592, 592, 592, 592, + 592, 592, 749, 749, 749, 749, 749, 749, 749, 749, + 749, 749, 930, 741, 930, 741, 741, 741, 933, 570, + 933, 592, 592, 592, 592, 592, 592, 593, 769, 593, + 593, 593, 593, 593, 593, 593, 593, 593, 593, 596, + + 769, 596, 596, 596, 596, 596, 596, 596, 596, 596, + 596, 603, 603, 603, 603, 603, 603, 603, 603, 603, + 603, 603, 603, 603, 741, 794, 815, 603, 603, 603, + 603, 603, 603, 742, 568, 742, 742, 742, 743, 807, + 743, 743, 743, 744, 567, 744, 744, 744, 565, 794, + 815, 807, 603, 603, 603, 603, 603, 603, 606, 606, + 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, + 794, 564, 559, 815, 606, 606, 606, 606, 606, 606, + 943, 944, 943, 944, 742, 952, 953, 952, 953, 743, + 956, 962, 956, 962, 744, 963, 965, 963, 965, 606, + + 606, 606, 606, 606, 606, 609, 558, 609, 609, 609, + 609, 609, 609, 609, 609, 609, 609, 610, 748, 556, + 748, 748, 748, 610, 748, 748, 610, 610, 748, 610, + 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, + 610, 610, 748, 748, 748, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 610, 610, 610, 610, 632, 753, + 522, 753, 753, 753, 753, 753, 753, 632, 973, 521, + + 973, 632, 632, 632, 632, 632, 632, 632, 632, 632, + 632, 632, 632, 632, 520, 512, 632, 632, 632, 632, + 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, + 632, 632, 632, 632, 632, 632, 632, 632, 632, 511, + 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, + 632, 632, 632, 632, 632, 632, 632, 632, 638, 510, + 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, + 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, + 772, 506, 772, 772, 772, 772, 772, 772, 971, 499, + 498, 971, 772, 974, 977, 974, 977, 638, 645, 495, + + 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, + 651, 493, 651, 651, 651, 651, 651, 651, 651, 651, + 651, 651, 651, 654, 492, 654, 654, 654, 654, 654, + 654, 654, 654, 654, 654, 654, 978, 489, 978, 654, + 654, 654, 654, 654, 654, 774, 774, 774, 774, 774, + 774, 774, 774, 774, 774, 775, 775, 775, 775, 775, + 775, 983, 488, 983, 654, 654, 654, 654, 654, 654, + 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, + 657, 984, 487, 984, 657, 657, 657, 657, 657, 657, + 780, 780, 780, 780, 780, 780, 780, 788, 788, 788, + + 788, 788, 788, 788, 788, 788, 788, 481, 480, 657, + 657, 657, 657, 657, 657, 658, 478, 658, 658, 658, + 658, 658, 658, 658, 658, 658, 658, 669, 669, 669, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 692, + 477, 692, 692, 692, 692, 692, 692, 692, 692, 692, + 692, 698, 698, 698, 698, 698, 698, 698, 698, 698, + 698, 789, 789, 789, 789, 789, 789, 789, 789, 789, + 789, 799, 476, 799, 799, 799, 799, 799, 799, 804, + 475, 804, 804, 804, 804, 804, 804, 447, 698, 700, + 446, 700, 700, 700, 700, 700, 700, 700, 700, 700, + + 700, 821, 443, 821, 821, 821, 821, 821, 821, 442, + 799, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 848, 848, 848, 848, 848, 848, 441, 700, 715, + 440, 715, 715, 715, 715, 715, 715, 715, 715, 715, + 715, 715, 718, 434, 718, 718, 718, 718, 718, 718, + 718, 718, 718, 718, 718, 433, 432, 431, 718, 718, + 718, 718, 718, 718, 817, 817, 817, 817, 817, 817, + 817, 817, 817, 817, 854, 430, 854, 854, 854, 854, + 854, 854, 429, 718, 718, 718, 718, 718, 718, 721, + 721, 721, 721, 721, 721, 721, 721, 721, 721, 428, + + 427, 426, 425, 721, 721, 721, 721, 721, 721, 826, + 826, 826, 826, 826, 826, 826, 826, 826, 826, 844, + 424, 844, 844, 844, 844, 844, 844, 423, 721, 721, + 721, 721, 721, 721, 722, 422, 722, 722, 722, 722, + 722, 722, 722, 722, 722, 722, 725, 725, 725, 725, + 725, 725, 725, 725, 725, 725, 725, 758, 844, 758, + 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, + 421, 759, 759, 759, 759, 759, 759, 759, 759, 759, + 759, 760, 420, 760, 760, 760, 760, 760, 760, 760, + 760, 760, 760, 763, 419, 763, 763, 763, 763, 763, + + 763, 763, 763, 763, 763, 770, 418, 770, 770, 770, + 770, 770, 770, 770, 770, 770, 770, 770, 773, 415, + 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, + 414, 409, 408, 407, 773, 773, 773, 773, 773, 773, + 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, + 401, 400, 398, 863, 863, 863, 863, 863, 863, 773, + 773, 773, 773, 773, 773, 776, 397, 776, 776, 776, + 776, 776, 776, 776, 776, 776, 776, 792, 396, 792, + 792, 792, 792, 792, 792, 792, 792, 792, 792, 795, + 863, 795, 795, 795, 795, 795, 795, 795, 795, 795, + + 795, 797, 395, 797, 797, 797, 797, 797, 797, 797, + 797, 797, 797, 798, 394, 798, 798, 798, 798, 798, + 798, 798, 798, 798, 798, 810, 393, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 823, 392, 823, + 823, 823, 823, 823, 823, 823, 823, 823, 823, 824, + 389, 824, 824, 824, 824, 824, 824, 824, 824, 824, + 824, 825, 388, 825, 825, 825, 825, 825, 825, 825, + 825, 825, 825, 828, 828, 828, 828, 828, 828, 828, + 828, 828, 828, 839, 387, 839, 839, 839, 839, 839, + 839, 839, 839, 839, 839, 840, 386, 840, 840, 840, + + 840, 840, 840, 840, 840, 840, 840, 842, 370, 842, + 842, 842, 842, 842, 842, 842, 842, 842, 842, 843, + 369, 843, 843, 843, 843, 843, 843, 843, 843, 843, + 843, 846, 846, 846, 846, 846, 846, 846, 846, 846, + 846, 847, 847, 847, 847, 847, 847, 847, 847, 847, + 847, 850, 850, 850, 850, 850, 850, 850, 850, 850, + 850, 855, 855, 855, 855, 855, 855, 855, 855, 855, + 855, 858, 858, 858, 858, 858, 858, 858, 858, 858, + 858, 859, 859, 859, 859, 859, 859, 859, 859, 859, + 859, 866, 866, 866, 866, 866, 866, 368, 855, 856, + + 856, 856, 856, 856, 856, 856, 856, 856, 856, 860, + 860, 860, 860, 860, 860, 860, 860, 860, 860, 865, + 865, 865, 865, 865, 865, 865, 865, 865, 865, 367, + 365, 364, 360, 359, 358, 356, 856, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 982, 355, 354, + 982, 353, 352, 351, 982, 350, 349, 346, 341, 340, + 339, 332, 331, 330, 329, 328, 322, 321, 319, 318, + 317, 316, 315, 314, 857, 862, 862, 862, 862, 862, + 862, 862, 862, 862, 862, 313, 312, 309, 308, 306, + 298, 297, 294, 293, 286, 285, 283, 282, 281, 280, + + 279, 278, 277, 276, 275, 274, 273, 272, 269, 266, + 265, 264, 862, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 869, 869, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, + 869, 869, 869, 869, 869, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 872, 258, 255, + + 254, 253, 252, 251, 872, 248, 872, 872, 872, 872, + 247, 246, 872, 872, 872, 872, 872, 872, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, 873, 874, + 245, 244, 243, 242, 874, 241, 874, 240, 874, 874, + 874, 874, 874, 239, 874, 874, 874, 874, 874, 874, + 875, 238, 237, 236, 235, 234, 233, 875, 232, 875, + 875, 875, 875, 226, 225, 875, 875, 875, 875, 875, + 875, 876, 218, 217, 876, 876, 216, 876, 876, 215, + 876, 876, 876, 876, 214, 213, 876, 876, 876, 876, + + 876, 876, 877, 877, 211, 877, 210, 209, 208, 877, + 879, 206, 200, 879, 879, 192, 879, 879, 188, 879, + 879, 879, 879, 184, 183, 879, 879, 879, 879, 879, + 879, 880, 181, 177, 880, 880, 170, 880, 880, 166, + 880, 880, 880, 880, 164, 880, 880, 880, 162, 880, + 880, 880, 882, 154, 153, 882, 152, 151, 882, 882, + 150, 882, 882, 882, 882, 882, 144, 882, 882, 882, + 882, 882, 882, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, - 883, 883, 885, 137, 136, 885, 885, 135, 885, 885, - - 134, 885, 885, 885, 885, 133, 132, 885, 885, 885, - 885, 885, 885, 886, 886, 128, 886, 124, 123, 119, - 886, 887, 887, 116, 887, 113, 108, 107, 887, 888, - 888, 888, 106, 888, 104, 100, 99, 888, 889, 98, - 97, 889, 889, 96, 889, 889, 92, 889, 889, 889, - 889, 79, 72, 889, 889, 889, 889, 889, 889, 890, - 65, 61, 890, 890, 60, 890, 890, 58, 890, 890, - 890, 890, 57, 55, 890, 890, 890, 890, 890, 890, - 891, 53, 45, 891, 891, 44, 891, 891, 43, 891, - 891, 891, 891, 41, 891, 891, 891, 40, 891, 891, - - 891, 893, 35, 31, 893, 25, 19, 893, 893, 17, - 893, 893, 893, 893, 893, 16, 893, 893, 893, 893, - 893, 893, 894, 894, 15, 894, 0, 894, 894, 894, - 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, - 894, 894, 894, 895, 0, 0, 0, 0, 0, 0, - 895, 0, 895, 895, 895, 895, 0, 0, 895, 895, - 895, 895, 895, 895, 896, 0, 0, 0, 0, 0, - 0, 896, 0, 896, 896, 896, 896, 0, 896, 896, - 896, 896, 896, 896, 896, 897, 0, 0, 897, 897, - 0, 897, 897, 0, 897, 897, 897, 897, 0, 897, - - 897, 897, 897, 897, 897, 897, 898, 0, 0, 898, - 898, 0, 898, 899, 899, 899, 899, 899, 899, 899, - 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, - 899, 899, 899, 899, 900, 900, 0, 900, 0, 0, - 0, 900, 901, 901, 901, 0, 901, 0, 0, 0, - 901, 904, 904, 0, 904, 0, 0, 0, 904, 905, - 905, 0, 905, 0, 0, 0, 905, 906, 906, 0, - 906, 0, 0, 0, 906, 907, 907, 907, 0, 907, - 0, 0, 0, 907, 908, 0, 0, 908, 908, 0, - 908, 909, 909, 0, 909, 0, 0, 0, 909, 910, - + 883, 883, 883, 883, 884, 884, 143, 884, 142, 884, + + 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, + 884, 884, 884, 884, 884, 885, 141, 140, 139, 137, + 885, 136, 885, 135, 885, 885, 885, 885, 885, 134, + 885, 885, 885, 885, 885, 885, 886, 133, 132, 128, + 124, 123, 119, 886, 116, 886, 886, 886, 886, 113, + 886, 886, 886, 886, 886, 886, 886, 887, 108, 107, + 887, 887, 106, 887, 887, 104, 887, 887, 887, 887, + 100, 887, 887, 887, 887, 887, 887, 887, 888, 888, + 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, + 888, 888, 888, 888, 888, 888, 888, 888, 888, 889, + + 889, 99, 889, 889, 889, 889, 889, 889, 889, 889, + 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, + 891, 98, 97, 891, 891, 96, 891, 891, 92, 891, + 891, 891, 891, 79, 72, 891, 891, 891, 891, 891, + 891, 892, 892, 65, 892, 61, 60, 58, 892, 893, + 893, 57, 893, 55, 53, 44, 893, 894, 894, 894, + 43, 894, 41, 40, 35, 894, 895, 31, 25, 895, + 895, 19, 895, 895, 17, 895, 895, 895, 895, 16, + 15, 895, 895, 895, 895, 895, 895, 896, 0, 0, + 896, 896, 0, 896, 896, 0, 896, 896, 896, 896, + + 0, 0, 896, 896, 896, 896, 896, 896, 897, 0, + 0, 897, 897, 0, 897, 897, 0, 897, 897, 897, + 897, 0, 897, 897, 897, 0, 897, 897, 897, 899, + 0, 0, 899, 0, 0, 899, 899, 0, 899, 899, + 899, 899, 899, 0, 899, 899, 899, 899, 899, 899, + 900, 900, 0, 900, 0, 900, 900, 900, 900, 900, + 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, + 900, 901, 0, 0, 0, 0, 0, 0, 901, 0, + 901, 901, 901, 901, 0, 0, 901, 901, 901, 901, + 901, 901, 902, 0, 0, 0, 0, 0, 0, 902, + + 0, 902, 902, 902, 902, 0, 902, 902, 902, 902, + 902, 902, 902, 903, 0, 0, 903, 903, 0, 903, + 903, 0, 903, 903, 903, 903, 0, 903, 903, 903, + 903, 903, 903, 903, 904, 0, 0, 904, 904, 0, + 904, 905, 905, 905, 905, 905, 905, 905, 905, 905, + 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, + 905, 905, 906, 906, 0, 906, 0, 0, 0, 906, + 907, 907, 907, 0, 907, 0, 0, 0, 907, 910, 910, 0, 910, 0, 0, 0, 910, 911, 911, 0, - 911, 0, 0, 0, 911, 912, 912, 912, 0, 912, - 0, 0, 0, 912, 913, 913, 913, 913, 0, 913, - 0, 0, 0, 913, 916, 916, 0, 916, 0, 0, - 0, 916, 917, 917, 0, 917, 0, 0, 0, 917, - 918, 918, 0, 918, 0, 0, 0, 918, 921, 921, - 921, 0, 921, 0, 0, 0, 921, 922, 922, 922, - 922, 0, 922, 0, 0, 0, 922, 923, 923, 923, - 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, - 923, 923, 923, 923, 923, 923, 923, 923, 925, 925, - - 0, 925, 0, 0, 0, 925, 926, 926, 0, 926, - 0, 0, 0, 926, 928, 928, 928, 0, 928, 0, - 0, 0, 928, 929, 929, 929, 929, 0, 929, 0, - 0, 0, 929, 930, 930, 930, 930, 930, 930, 930, - 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, - 930, 930, 930, 930, 933, 0, 0, 933, 933, 0, - 933, 934, 0, 0, 0, 934, 934, 0, 934, 934, - 934, 0, 0, 934, 934, 935, 935, 0, 935, 0, - 0, 0, 935, 936, 0, 936, 936, 0, 936, 0, - 0, 0, 936, 939, 939, 939, 0, 939, 0, 0, - - 0, 939, 940, 940, 940, 940, 0, 940, 0, 0, - 0, 940, 941, 941, 0, 0, 941, 0, 0, 0, - 941, 942, 942, 942, 942, 942, 942, 942, 942, 942, - 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, - 942, 942, 944, 0, 0, 944, 944, 0, 944, 945, - 0, 0, 0, 945, 945, 0, 945, 945, 945, 0, - 0, 945, 945, 948, 948, 0, 948, 0, 0, 0, - 948, 949, 0, 949, 949, 0, 949, 0, 0, 0, - 949, 951, 951, 951, 0, 951, 0, 0, 0, 951, - 952, 952, 952, 0, 0, 952, 0, 0, 0, 952, - - 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, - 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, - 953, 954, 954, 0, 954, 954, 954, 0, 954, 0, - 954, 954, 954, 954, 0, 0, 954, 954, 954, 954, - 954, 954, 955, 955, 0, 955, 955, 955, 0, 955, - 0, 955, 955, 955, 955, 0, 0, 955, 955, 955, - 955, 955, 955, 958, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 958, 958, 0, 958, 958, 0, - 958, 960, 960, 0, 960, 0, 0, 0, 960, 961, - 0, 961, 961, 0, 961, 0, 0, 0, 961, 964, - - 964, 0, 0, 964, 0, 0, 0, 964, 966, 0, - 0, 0, 0, 0, 0, 966, 0, 966, 966, 966, - 966, 0, 0, 966, 966, 966, 966, 966, 966, 969, - 969, 0, 969, 0, 0, 0, 969, 970, 0, 970, - 970, 0, 970, 0, 0, 0, 970, 973, 973, 0, - 973, 0, 0, 0, 973, 974, 0, 974, 0, 0, - 974, 0, 0, 0, 974, 975, 975, 975, 975, 975, - 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, - 975, 975, 975, 975, 975, 975, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 861, 861, 861 + 911, 0, 0, 0, 911, 912, 912, 0, 912, 0, + + 0, 0, 912, 913, 913, 913, 0, 913, 0, 0, + 0, 913, 914, 0, 0, 914, 914, 0, 914, 915, + 915, 0, 915, 0, 0, 0, 915, 916, 916, 0, + 916, 0, 0, 0, 916, 917, 917, 0, 917, 0, + 0, 0, 917, 918, 918, 918, 0, 918, 0, 0, + 0, 918, 919, 919, 919, 919, 0, 919, 0, 0, + 0, 919, 922, 922, 0, 922, 0, 0, 0, 922, + 923, 923, 0, 923, 0, 0, 0, 923, 924, 924, + 0, 924, 0, 0, 0, 924, 927, 927, 927, 0, + 927, 0, 0, 0, 927, 928, 928, 928, 928, 0, + + 928, 0, 0, 0, 928, 929, 929, 929, 929, 929, + 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, + 929, 929, 929, 929, 929, 929, 931, 931, 0, 931, + 0, 0, 0, 931, 932, 932, 0, 932, 0, 0, + 0, 932, 934, 934, 934, 0, 934, 0, 0, 0, + 934, 935, 935, 935, 935, 0, 935, 0, 0, 0, + 935, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 939, 0, 0, 939, 939, 0, 939, 940, + 0, 0, 0, 940, 940, 0, 940, 940, 940, 0, + + 0, 940, 940, 941, 941, 0, 941, 0, 0, 0, + 941, 942, 0, 942, 942, 0, 942, 0, 0, 0, + 942, 945, 945, 945, 0, 945, 0, 0, 0, 945, + 946, 946, 946, 946, 0, 946, 0, 0, 0, 946, + 947, 947, 0, 0, 947, 0, 0, 0, 947, 948, + 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, + 950, 0, 0, 950, 950, 0, 950, 951, 0, 0, + 0, 951, 951, 0, 951, 951, 951, 0, 0, 951, + 951, 954, 954, 0, 954, 0, 0, 0, 954, 955, + + 0, 955, 955, 0, 955, 0, 0, 0, 955, 957, + 957, 957, 0, 957, 0, 0, 0, 957, 958, 958, + 958, 0, 0, 958, 0, 0, 0, 958, 959, 959, + 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, + 959, 959, 959, 959, 959, 959, 959, 959, 959, 960, + 960, 0, 960, 960, 960, 0, 960, 0, 960, 960, + 960, 960, 0, 0, 960, 960, 960, 960, 960, 960, + 961, 961, 0, 961, 961, 961, 0, 961, 0, 961, + 961, 961, 961, 0, 0, 961, 961, 961, 961, 961, + 961, 964, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 964, 964, 0, 964, 964, 0, 964, 966, + 966, 0, 966, 0, 0, 0, 966, 967, 0, 967, + 967, 0, 967, 0, 0, 0, 967, 970, 970, 0, + 0, 970, 0, 0, 0, 970, 972, 0, 0, 0, + 0, 0, 0, 972, 0, 972, 972, 972, 972, 0, + 0, 972, 972, 972, 972, 972, 972, 975, 975, 0, + 975, 0, 0, 0, 975, 976, 0, 976, 976, 0, + 976, 0, 0, 0, 976, 979, 979, 0, 979, 0, + 0, 0, 979, 980, 0, 980, 0, 0, 980, 0, + 0, 0, 980, 981, 981, 981, 981, 981, 981, 981, + + 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, + 981, 981, 981, 981, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, + 867, 867, 867, 867, 867, 867 } ; static yy_state_type yy_last_accepting_state; @@ -2047,7 +2055,7 @@ int (*trace_print)(const char *msg) = sudoers_trace_print; #define WANTDIGEST 6 -#line 2050 "lex.sudoers.c" +#line 2058 "lex.sudoers.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -2203,7 +2211,7 @@ YY_DECL #line 122 "toke.l" -#line 2206 "lex.sudoers.c" +#line 2214 "lex.sudoers.c" if ( yy_init ) { @@ -2255,13 +2263,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 >= 862 ) + if ( yy_current_state >= 868 ) 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] != 5587 ); + while ( yy_base[yy_current_state] != 5615 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -2835,6 +2843,14 @@ YY_RULE_SETUP case 46: YY_RULE_SETUP #line 533 "toke.l" +{ + LEXTRACE("CMND_TIMEOUT "); + LEXRETURN(CMND_TIMEOUT); + } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 538 "toke.l" { #ifdef HAVE_SELINUX LEXTRACE("ROLE "); @@ -2844,9 +2860,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 47: +case 48: YY_RULE_SETUP -#line 542 "toke.l" +#line 547 "toke.l" { #ifdef HAVE_SELINUX LEXTRACE("TYPE "); @@ -2856,9 +2872,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 48: +case 49: YY_RULE_SETUP -#line 550 "toke.l" +#line 555 "toke.l" { #ifdef HAVE_PRIV_SET LEXTRACE("PRIVS "); @@ -2868,9 +2884,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 49: +case 50: YY_RULE_SETUP -#line 559 "toke.l" +#line 564 "toke.l" { #ifdef HAVE_PRIV_SET LEXTRACE("LIMITPRIVS "); @@ -2880,9 +2896,9 @@ YY_RULE_SETUP #endif } YY_BREAK -case 50: +case 51: YY_RULE_SETUP -#line 568 "toke.l" +#line 573 "toke.l" { got_alias: if (!fill(sudoerstext, sudoersleng)) @@ -2891,9 +2907,9 @@ YY_RULE_SETUP LEXRETURN(ALIAS); } YY_BREAK -case 51: +case 52: YY_RULE_SETUP -#line 576 "toke.l" +#line 581 "toke.l" { /* XXX - no way to specify digest for command */ /* no command args allowed for Defaults!/path */ @@ -2903,9 +2919,9 @@ YY_RULE_SETUP LEXRETURN(COMMAND); } YY_BREAK -case 52: +case 53: YY_RULE_SETUP -#line 585 "toke.l" +#line 590 "toke.l" { digest_len = SHA224_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2913,9 +2929,9 @@ YY_RULE_SETUP LEXRETURN(SHA224_TOK); } YY_BREAK -case 53: +case 54: YY_RULE_SETUP -#line 592 "toke.l" +#line 597 "toke.l" { digest_len = SHA256_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2923,9 +2939,9 @@ YY_RULE_SETUP LEXRETURN(SHA256_TOK); } YY_BREAK -case 54: +case 55: YY_RULE_SETUP -#line 599 "toke.l" +#line 604 "toke.l" { digest_len = SHA384_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2933,9 +2949,9 @@ YY_RULE_SETUP LEXRETURN(SHA384_TOK); } YY_BREAK -case 55: +case 56: YY_RULE_SETUP -#line 606 "toke.l" +#line 611 "toke.l" { digest_len = SHA512_DIGEST_LENGTH; BEGIN WANTDIGEST; @@ -2943,9 +2959,9 @@ YY_RULE_SETUP LEXRETURN(SHA512_TOK); } YY_BREAK -case 56: +case 57: YY_RULE_SETUP -#line 613 "toke.l" +#line 618 "toke.l" { BEGIN GOTCMND; LEXTRACE("COMMAND "); @@ -2953,9 +2969,9 @@ YY_RULE_SETUP yyterminate(); } /* sudo -e */ YY_BREAK -case 57: +case 58: YY_RULE_SETUP -#line 620 "toke.l" +#line 625 "toke.l" { /* directories can't have args... */ if (sudoerstext[sudoersleng - 1] == '/') { @@ -2971,9 +2987,9 @@ YY_RULE_SETUP } } /* a pathname */ YY_BREAK -case 58: +case 59: YY_RULE_SETUP -#line 635 "toke.l" +#line 640 "toke.l" { LEXTRACE("BEGINSTR "); sudoerslval.string = NULL; @@ -2981,9 +2997,9 @@ YY_RULE_SETUP BEGIN INSTR; } YY_BREAK -case 59: +case 60: YY_RULE_SETUP -#line 642 "toke.l" +#line 647 "toke.l" { /* a word */ if (!fill(sudoerstext, sudoersleng)) @@ -2992,49 +3008,49 @@ YY_RULE_SETUP LEXRETURN(WORD); } YY_BREAK -case 60: +case 61: YY_RULE_SETUP -#line 650 "toke.l" +#line 655 "toke.l" { LEXTRACE("( "); LEXRETURN('('); } YY_BREAK -case 61: +case 62: YY_RULE_SETUP -#line 655 "toke.l" +#line 660 "toke.l" { LEXTRACE(") "); LEXRETURN(')'); } YY_BREAK -case 62: +case 63: YY_RULE_SETUP -#line 660 "toke.l" +#line 665 "toke.l" { LEXTRACE(", "); LEXRETURN(','); } /* return ',' */ YY_BREAK -case 63: +case 64: YY_RULE_SETUP -#line 665 "toke.l" +#line 670 "toke.l" { LEXTRACE("= "); LEXRETURN('='); } /* return '=' */ YY_BREAK -case 64: +case 65: YY_RULE_SETUP -#line 670 "toke.l" +#line 675 "toke.l" { LEXTRACE(": "); LEXRETURN(':'); } /* return ':' */ YY_BREAK -case 65: +case 66: YY_RULE_SETUP -#line 675 "toke.l" +#line 680 "toke.l" { if (sudoersleng & 1) { LEXTRACE("!"); @@ -3042,9 +3058,9 @@ YY_RULE_SETUP } } YY_BREAK -case 66: +case 67: YY_RULE_SETUP -#line 682 "toke.l" +#line 687 "toke.l" { if (YY_START == INSTR) { LEXTRACE("ERROR "); @@ -3057,25 +3073,25 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* return newline */ YY_BREAK -case 67: +case 68: YY_RULE_SETUP -#line 694 "toke.l" +#line 699 "toke.l" { /* throw away space/tabs */ sawspace = true; /* but remember for fill_args */ } YY_BREAK -case 68: +case 69: YY_RULE_SETUP -#line 698 "toke.l" +#line 703 "toke.l" { sawspace = true; /* remember for fill_args */ sudolineno++; continued = true; } /* throw away EOL after \ */ YY_BREAK -case 69: +case 70: YY_RULE_SETUP -#line 704 "toke.l" +#line 709 "toke.l" { if (sudoerstext[sudoersleng - 1] == '\n') { /* comment ending in a newline */ @@ -3090,9 +3106,9 @@ YY_RULE_SETUP LEXRETURN(COMMENT); } /* comment, not uid/gid */ YY_BREAK -case 70: +case 71: YY_RULE_SETUP -#line 718 "toke.l" +#line 723 "toke.l" { LEXTRACE("ERROR "); LEXRETURN(ERROR); @@ -3105,7 +3121,7 @@ case YY_STATE_EOF(STARTDEFS): case YY_STATE_EOF(INDEFS): case YY_STATE_EOF(INSTR): case YY_STATE_EOF(WANTDIGEST): -#line 723 "toke.l" +#line 728 "toke.l" { if (YY_START != INITIAL) { BEGIN INITIAL; @@ -3116,12 +3132,12 @@ case YY_STATE_EOF(WANTDIGEST): yyterminate(); } YY_BREAK -case 71: +case 72: YY_RULE_SETUP -#line 733 "toke.l" +#line 738 "toke.l" ECHO; YY_BREAK -#line 3124 "lex.sudoers.c" +#line 3140 "lex.sudoers.c" case YY_END_OF_BUFFER: { @@ -3412,7 +3428,7 @@ static yy_state_type yy_get_previous_state YY_PROTO(( void )) 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 >= 862 ) + if ( yy_current_state >= 868 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3447,11 +3463,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 >= 862 ) + if ( yy_current_state >= 868 ) 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 == 861); + yy_is_jam = (yy_current_state == 867); return yy_is_jam ? 0 : yy_current_state; } @@ -4012,7 +4028,7 @@ int main() return 0; } #endif -#line 733 "toke.l" +#line 738 "toke.l" struct path_list { SLIST_ENTRY(path_list) entries; diff --git a/plugins/sudoers/toke.l b/plugins/sudoers/toke.l index 3a6a083c7..12784b7ac 100644 --- a/plugins/sudoers/toke.l +++ b/plugins/sudoers/toke.l @@ -530,6 +530,11 @@ ALL { } +TIMEOUT { + LEXTRACE("CMND_TIMEOUT "); + LEXRETURN(CMND_TIMEOUT); + } + ROLE { #ifdef HAVE_SELINUX LEXTRACE("ROLE "); diff --git a/plugins/sudoers/visudo_json.c b/plugins/sudoers/visudo_json.c index d21bf90f5..bbea8d891 100644 --- a/plugins/sudoers/visudo_json.c +++ b/plugins/sudoers/visudo_json.c @@ -781,11 +781,17 @@ print_cmndspec_json(FILE *fp, struct cmndspec *cs, struct cmndspec **nextp, } /* Print tags */ - if (TAGS_SET(cs->tags)) { + if (cs->timeout > 0 || TAGS_SET(cs->tags)) { struct cmndtag tag = cs->tags; fprintf(fp, "%*s\"Options\": [\n", indent, ""); indent += 4; + if (cs->timeout > 0) { + value.type = JSON_NUMBER; + value.u.number = cs->timeout; + print_pair_json(fp, "{ ", "command_timeout", &value, + TAGS_SET(tag) ? " },\n" : " }\n", indent); + } if (tag.nopasswd != UNSPEC) { value.type = JSON_BOOL; value.u.boolean = !tag.nopasswd; -- 2.40.0