From 3d1b0bd381f09dc29baff0639f62fd14a5d40a0f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 9 Apr 2013 19:27:09 -0600 Subject: [PATCH] new environment-variable API The `current-environment-variables' parameter determines the current mutable "environment variable set". If that set is the initial one for a Racket process, then using the set corresponds to working with OS environment variables. Otherwise, it's really just a hash table that is packaged up as OS environment variables if a subprocess is created. The new environment-variable interface works in terms of bytes, instead of assuming that environment variable names and values fit in a string encoding. The string-based `getenv' and `putenv' are still available as convenience wrappers. The checking on environment-variable names for those wrappers is a little tighter, preventing any attempt to use a name that contains "=". --- collects/racket/private/misc.rkt | 41 +- collects/scribblings/reference/envvars.scrbl | 119 ++ collects/scribblings/reference/os.scrbl | 1 + collects/scribblings/reference/runtime.scrbl | 15 - .../scribblings/reference/subprocess.scrbl | 6 +- collects/tests/racket/file.rktl | 65 +- collects/tests/racket/subprocess.rktl | 14 + doc/release-notes/racket/HISTORY.txt | 6 + src/get-libs.rkt | 4 +- src/racket/include/scheme.h | 1 + src/racket/src/cstartup.inc | 1787 +++++++++-------- src/racket/src/port.c | 44 +- src/racket/src/schminc.h | 2 +- src/racket/src/schpriv.h | 4 + src/racket/src/schvers.h | 4 +- src/racket/src/startup.inc | 12 +- src/racket/src/startup.rktl | 12 +- src/racket/src/string.c | 528 +++-- src/racket/src/stypes.h | 147 +- src/racket/src/thread.c | 8 +- src/racket/src/type.c | 4 + 21 files changed, 1698 insertions(+), 1126 deletions(-) create mode 100644 collects/scribblings/reference/envvars.scrbl diff --git a/collects/racket/private/misc.rkt b/collects/racket/private/misc.rkt index 9b547a8f36..63766cc457 100644 --- a/collects/racket/private/misc.rkt +++ b/collects/racket/private/misc.rkt @@ -185,6 +185,42 @@ ;; ------------------------------------------------------------------------- + (define (string-no-nuls? s) + (and (string? s) + (not (regexp-match? #rx"\0" s)))) + + (define (bytes-environment-variable-name? s) + (and (bytes? s) + (if (eq? 'windows (system-type)) + (regexp-match? #rx#"^[^\0=]+$" s) + (regexp-match? #rx#"^[^\0=]*$" s)))) + + (define (string-environment-variable-name? s) + (and (string? s) + (bytes-environment-variable-name? + (string->bytes/locale s (char->integer #\?))))) + + (define (getenv s) + (unless (string-environment-variable-name? s) + (raise-argument-error 'getenv "string-environment-variable-name?" s)) + (let ([v (environment-variables-get (string->bytes/locale s (char->integer #\?)))]) + (and v + (bytes->string/locale v #\?)))) + + (define (putenv s t) + (unless (string-no-nuls? s) + (raise-argument-error 'putenv "string-environment-variable-name?" 0 s t)) + (unless (string-no-nuls? t) + (raise-argument-error 'putenv "string-no-nuls?" 1 s t)) + (and + (environment-variables-set! (string->bytes/locale s (char->integer #\?)) + (string->bytes/locale t (char->integer #\?)) + (current-environment-variables) + (lambda () #f)) + #t)) + + ;; ------------------------------------------------------------------------- + (#%provide define-syntax-rule rationalize path-string? path-replace-suffix path-add-suffix @@ -196,4 +232,7 @@ collection-path collection-file-path load/use-compiled guard-evt channel-get channel-try-get channel-put port? displayln - find-library-collection-paths)) + find-library-collection-paths + bytes-environment-variable-name? + string-environment-variable-name? + getenv putenv)) diff --git a/collects/scribblings/reference/envvars.scrbl b/collects/scribblings/reference/envvars.scrbl new file mode 100644 index 0000000000..72dd4c3f72 --- /dev/null +++ b/collects/scribblings/reference/envvars.scrbl @@ -0,0 +1,119 @@ +#lang scribble/doc +@(require "mz.rkt") + +@title[#:tag "envvars"]{Environment Variables} + +A @deftech{environment variable set} encapsulates a partial mapping +from byte strings to bytes strings. A Racket process's initial +@tech{environment variable set} is connected to the operating system's +environment variables: accesses or changes to the set read or change +operating-system environment variables for the Racket process. + +The current @tech{environment variable set}, which is determined by +the @racket[current-environment-variables] parameter, is propagated to +a @tech{subprocess} when the @tech{subprocess} is created. + + +@defproc[(environment-variables? [v any/c]) boolean?]{ + +Returns @racket[#t] if @racket[v] is an @tech{environment variable +set}, @racket[#f] otherwise.} + + +@defparam[current-environment-variables env environment-variables?]{ + +A @tech{parameter} that determines the @tech{environment variable set} +that is propagated to a @tech{subprocess} and that is used as the +default set for functions such as @racket[environment-variables-get] or +@racket[getenv].} + + +@defproc[(bytes-environment-variable-name? [v any/c]) boolean?]{ + +Returns @racket[#t] if @racket[v] is a byte string and if it is valid +for an environment variable name. An environment variable name must +contain no bytes the with value @racket[0] or @racket[61], where +@racket[61] is @racket[(char->integer #\=)]. On Windows, an +environment variable name also must have a non-zero length.} + + +@defproc[(environment-variables-get [name bytes-environment-variable-name?] + [env environment-variables? + (current-environment-variables)]) + (or/c #f (and/c bytes-no-nul? immutable?))]{ + +Returns the mapping for @racket[name] in @racket[env], returning +@racket[#f] if @racket[name] has no mapping. + +Normally, @racket[name] should be a byte-string encoding of a string +using the default encoding of the current @tech{locale}. On Windows, +@racket[name] is coerced to a UTF-8 encoding if @racket[env] is the +initial @tech{environment variable set} of the Racket process.} + + +@defproc[(environment-variables-set! [name bytes-environment-variable-name?] + [maybe-bstr (or/c bytes-no-nul? #f)] + [env environment-variables? + (current-environment-variables)] + [fail (-> any) + (lambda () + (raise (make-exn:fail ....)))]) + any]{ + +Changes the mapping for @racket[name] in @racket[env] to +@racket[maybe-bstr]. If @racket[maybe-bstr] is @racket[#f] and +@racket[env] is the initial @tech{environment variable set} of the +Racket process, then the operating system environment-variable mapping +for @racket[name] is removed. + +Normally, @racket[name] and @racket[maybe-bstr] should be a +byte-string encoding of a string using the default encoding of the +current @tech{locale}. On Windows, @racket[name] and +@racket[maybe-bstr] are coerced to a UTF-8 encoding if @racket[env] is +the initial @tech{environment variable set} of the Racket process. + +On success, the result of @racket[environment-variables-set!] is +@|void-const|. If @racket[env] is the initial @tech{environment +variable set} of the Racket process, then attempting to adjust the +operating system environment-variable mapping might fail for some reason, +in which case @racket[fail] is called in tail position with respect to the +@racket[environment-variables-set!]. The default @racket[fail] raises +an exception.} + + +@defproc[(environment-variables-keys [env environment-variables?]) + (listof (and/c bytes-environment-variable-name? immutable?))]{ + +Returns a list of byte strings that corresponds to names mapped by +@racket[env].} + + +@defproc[(environment-variables-copy [env environment-variables?]) + environment-variables?]{ + +Returns an @tech{environment variable set} that is initialized with +the same mappings as @racket[env].} + + +@deftogether[( +@defproc[(getenv [name string-environment-variable-name?]) + (or/c string-no-nuls? #f)] +@defproc[(putenv [name string-environment-variable-name?] + [value string-no-nuls?]) boolean?] +)]{ + +Convenience wrappers for @racket[environment-variables-get] and +@racket[environment-variables-set!] that convert between strings and +byte strings using the current @tech{locale}'s default encoding (using +@racket[#\?] as the replacement character for encoding errors) and +always using the current @tech{environment variable set} from +@racket[current-environment-variables]. The @racket[putenv] function +returns @racket[#t] for success and @racket[#f] for failure.} + + +@defproc[(string-environment-variable-name? [v any/c]) boolean?]{ + +Returns @racket[#t] if @racket[v] is a string and if its encoding +using the current @tech{locale}'s encoding is valid for an environment +variable name according to @racket[bytes-environment-variable-name?].} + diff --git a/collects/scribblings/reference/os.scrbl b/collects/scribblings/reference/os.scrbl index b1968ac469..6bd6586204 100644 --- a/collects/scribblings/reference/os.scrbl +++ b/collects/scribblings/reference/os.scrbl @@ -11,5 +11,6 @@ @include-section["subprocess.scrbl"] @include-section["logging.scrbl"] @include-section["time.scrbl"] +@include-section["envvars.scrbl"] @include-section["runtime.scrbl"] @include-section["cmdline.scrbl"] diff --git a/collects/scribblings/reference/runtime.scrbl b/collects/scribblings/reference/runtime.scrbl index 4981d90d0e..5031d5c2ae 100644 --- a/collects/scribblings/reference/runtime.scrbl +++ b/collects/scribblings/reference/runtime.scrbl @@ -3,21 +3,6 @@ @title[#:tag "runtime"]{Environment and Runtime Information} -@defproc[(getenv [name string?]) (or/c string? #f)]{ - -Gets the value of an operating system environment variable. The -@racket[name] argument cannot contain a null character; if an -environment variable named by @racket[name] exists, its value is -returned (as a string); otherwise, @racket[#f] is returned.} - -@defproc[(putenv [name string?] [value string?]) boolean?]{ - -Sets the value of an operating system environment variable. The -@racket[name] and @racket[value] arguments are strings that cannot -contain a null character; the environment variable named by -@racket[name] is set to @racket[value]. The return value is -@racket[#t] if the assignment succeeds, @racket[#f] otherwise.} - @defproc[(system-type [mode (or/c 'os 'word 'gc 'link 'so-suffix 'so-mode 'machine) 'os]) (or/c symbol? string? bytes? exact-positive-integer?)]{ diff --git a/collects/scribblings/reference/subprocess.scrbl b/collects/scribblings/reference/subprocess.scrbl index 550acbfd10..c5c15a5382 100644 --- a/collects/scribblings/reference/subprocess.scrbl +++ b/collects/scribblings/reference/subprocess.scrbl @@ -24,8 +24,10 @@ (or/c (and/c input-port? file-stream-port?) #f))])]{ Creates a new process in the underlying operating system to execute -@racket[command] asynchronously. See also @racket[system] and -@racket[process] from @racketmodname[racket/system]. +@racket[command] asynchronously, providing the new process with +environment variables @racket[current-environment-variables]. See also +@racket[system] and @racket[process] from +@racketmodname[racket/system]. The @racket[command] argument is a path to a program executable, and the @racket[arg]s are command-line arguments for the program. See diff --git a/collects/tests/racket/file.rktl b/collects/tests/racket/file.rktl index 8fec19ded8..ba1b42e1eb 100644 --- a/collects/tests/racket/file.rktl +++ b/collects/tests/racket/file.rktl @@ -1258,20 +1258,57 @@ (arity-test printf 1 -1) (arity-test fprintf 2 -1) -(define success-1? (putenv "APPLE" "AnApple")) -(define success-2? (putenv "BANANA" "AnotherApple")) -(err/rt-test (getenv 7)) -(err/rt-test (getenv (string #\a #\nul #\b))) -(err/rt-test (putenv 7 "hi")) -(err/rt-test (putenv "hi" 7)) -(err/rt-test (putenv (string #\a #\nul #\b) "hi")) -(err/rt-test (putenv "hi" (string #\a #\nul #\b))) -(collect-garbage) -(test #t 'success-1 success-1?) -(test #t 'success-2 success-2?) -(test "AnApple" getenv "APPLE") -(test "AnotherApple" getenv "BANANA") -(test #f getenv "AnUndefinedEnvironmentVariable") +(test #t environment-variables? (current-environment-variables)) +(test #f environment-variables? 10) +(test #t environment-variables? (environment-variables-copy (current-environment-variables))) +(test #t list? (environment-variables-keys (current-environment-variables))) +(test #t andmap bytes? (environment-variables-keys (current-environment-variables))) +(test #t = + (length (environment-variables-keys (current-environment-variables))) + (length (environment-variables-keys (environment-variables-copy (current-environment-variables))))) +(test #f bytes-environment-variable-name? #"x=") +(test #f bytes-environment-variable-name? #"x\0") +(test (not (eq? 'windows (system-type))) bytes-environment-variable-name? #"") + +(test #f string-environment-variable-name? "x=") +(test #f string-environment-variable-name? "x\0") +(test (not (eq? 'windows (system-type))) string-environment-variable-name? "") + +(define (env-var-tests) + (define success-1? (putenv "APPLE" "AnApple")) + (define success-2? (putenv "BANANA" "AnotherApple")) + (err/rt-test (getenv 7)) + (err/rt-test (getenv (string #\a #\nul #\b))) + (err/rt-test (putenv 7 "hi")) + (err/rt-test (putenv "hi" 7)) + (err/rt-test (putenv (string #\a #\nul #\b) "hi")) + (err/rt-test (putenv "hi" (string #\a #\nul #\b))) + (collect-garbage) + (test #t 'success-1 success-1?) + (test #t 'success-2 success-2?) + (test "AnApple" getenv "APPLE") + (test "AnotherApple" getenv "BANANA") + (test #f getenv "AnUndefinedEnvironmentVariable") + + (test #"AnApple" environment-variables-get #"APPLE") + (err/rt-test (environment-variables-get #"=AP=PLE=")) + (test (void) environment-variables-set! #"APPLE" #"=x=") + (test #"=x=" environment-variables-get #"APPLE") + (test #"AnotherApple" environment-variables-get #"BANANA") + (test (void) environment-variables-set! #"BANANA" #f) + (test #f environment-variables-get #"BANANA") + (test #f getenv "BANANA") + + (test #"APPLE" car (member #"APPLE" (environment-variables-keys + (current-environment-variables)))) + (test #f member #"BANANA" (environment-variables-keys + (current-environment-variables)))) + +(parameterize ([current-environment-variables + (environment-variables-copy + (current-environment-variables))]) + (env-var-tests)) +(env-var-tests) (arity-test getenv 1 1) (arity-test putenv 2 2) diff --git a/collects/tests/racket/subprocess.rktl b/collects/tests/racket/subprocess.rktl index 8e68fbd86b..39b0e37739 100644 --- a/collects/tests/racket/subprocess.rktl +++ b/collects/tests/racket/subprocess.rktl @@ -460,6 +460,20 @@ (parameterize ([current-input-port (open-input-string "")]) (test 3 system/exit-code "exit 3"))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Environment variables: + +(let ([out (open-output-bytes)]) + (parameterize ([current-input-port (open-input-string "Hi\n")] + [current-output-port out] + [current-environment-variables + (environment-variables-copy + (current-environment-variables))]) + (environment-variables-set! #"Hola" #"hi, there") + (system* self "-e" "(getenv \"Hola\")")) + (test "\"hi, there\"\n" get-output-string out)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (for ([f (list tmpfile tmpfile2)] #:when (file-exists? f)) (delete-file f)) diff --git a/doc/release-notes/racket/HISTORY.txt b/doc/release-notes/racket/HISTORY.txt index 65a5314897..9f8c74a2e5 100644 --- a/doc/release-notes/racket/HISTORY.txt +++ b/doc/release-notes/racket/HISTORY.txt @@ -1,3 +1,9 @@ +Version 5.3.4.2 +Added current-environment-variables, environment-variables-get, + environment-variables-set!, environment-variables-keys, + environment-variables-copy, bytes-environment-variables-name?, + string-environment-variables-name?, and environment-variables? + Version 5.3.4.1 Changed JIT to support ARM diff --git a/src/get-libs.rkt b/src/get-libs.rkt index 496bcb9f60..266fea2821 100644 --- a/src/get-libs.rkt +++ b/src/get-libs.rkt @@ -104,7 +104,7 @@ ["libpangocairo-1.0-0.dll" 94625] ["libpangowin32-1.0-0.dll" 143647] ["libpangoft2-1.0-0.dll" 679322]] - (if (getenv "PLT_WIN_GTK") + (if (environment-variables-get #"PLT_WIN_GTK") '(["libatk-1.0-0.dll" 153763] ["libgtk-win32-2.0-0.dll" 4740156] ["libgdk-win32-2.0-0.dll" 827670] @@ -195,7 +195,7 @@ (define-values (path-size/show) (lambda (path) (let-values ([(sz) (path-size path)]) - (if (getenv "PLT_SHOW_PATH_SIZES") + (if (environment-variables-get #"PLT_SHOW_PATH_SIZES") (printf "~s ~s\n" path sz) (void)) sz))) diff --git a/src/racket/include/scheme.h b/src/racket/include/scheme.h index 3feb45ee3d..345e4a4b88 100644 --- a/src/racket/include/scheme.h +++ b/src/racket/include/scheme.h @@ -1365,6 +1365,7 @@ enum { MZCONFIG_LOAD_EXTENSION_HANDLER, MZCONFIG_CURRENT_DIRECTORY, + MZCONFIG_CURRENT_ENV_VARS, MZCONFIG_RANDOM_STATE, diff --git a/src/racket/src/cstartup.inc b/src/racket/src/cstartup.inc index 9514541ab9..52b75cc4a3 100644 --- a/src/racket/src/cstartup.inc +++ b/src/racket/src/cstartup.inc @@ -1,118 +1,119 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,51,46,56,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,52,46,50,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,51,0,0,0,1,0,0,10,0,14,0, -19,0,26,0,29,0,36,0,49,0,53,0,60,0,65,0,69,0,74,0,83, +27,0,31,0,38,0,42,0,49,0,54,0,61,0,66,0,69,0,74,0,83, 0,87,0,93,0,107,0,121,0,124,0,130,0,134,0,136,0,147,0,149,0, 163,0,170,0,192,0,194,0,208,0,19,1,48,1,59,1,70,1,96,1,129, -1,162,1,224,1,24,2,105,2,161,2,166,2,187,2,68,3,89,3,140,3, -207,3,94,4,238,4,36,5,47,5,130,5,0,0,93,7,0,0,69,35,37, -109,105,110,45,115,116,120,29,11,11,11,64,99,111,110,100,66,108,101,116,114, -101,99,62,111,114,66,117,110,108,101,115,115,72,112,97,114,97,109,101,116,101, -114,105,122,101,63,97,110,100,66,100,101,102,105,110,101,64,108,101,116,42,63, -108,101,116,64,119,104,101,110,68,104,101,114,101,45,115,116,120,29,11,11,11, +1,162,1,224,1,24,2,105,2,161,2,166,2,187,2,84,3,105,3,158,3, +225,3,114,4,2,5,56,5,67,5,150,5,0,0,113,7,0,0,69,35,37, +109,105,110,45,115,116,120,29,11,11,11,72,112,97,114,97,109,101,116,101,114, +105,122,101,63,97,110,100,66,100,101,102,105,110,101,63,108,101,116,66,117,110, +108,101,115,115,64,99,111,110,100,66,108,101,116,114,101,99,64,108,101,116,42, +62,111,114,64,119,104,101,110,68,104,101,114,101,45,115,116,120,29,11,11,11, 65,113,117,111,116,101,29,94,2,15,68,35,37,107,101,114,110,101,108,11,29, 94,2,15,68,35,37,112,97,114,97,109,122,11,62,105,102,65,98,101,103,105, 110,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117,101,115,61,120,73, 108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109,98,100,97,1, 20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121, 61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,97,36,11,8,240, -147,91,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36,16, -20,2,10,2,2,2,7,2,2,2,5,2,2,2,6,2,2,2,3,2,2, -2,8,2,2,2,9,2,2,2,4,2,2,2,11,2,2,2,12,2,2,97, -37,11,8,240,147,91,0,0,93,159,2,16,36,37,16,2,2,13,161,2,2, -37,2,13,2,2,2,13,96,11,11,8,240,147,91,0,0,16,0,96,38,11, -8,240,147,91,0,0,16,0,18,98,64,104,101,114,101,13,16,6,36,2,14, +171,91,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36,16, +20,2,8,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,2, +2,10,2,2,2,3,2,2,2,9,2,2,2,11,2,2,2,12,2,2,97, +37,11,8,240,171,91,0,0,93,159,2,16,36,37,16,2,2,13,161,2,2, +37,2,13,2,2,2,13,96,11,11,8,240,171,91,0,0,16,0,96,38,11, +8,240,171,91,0,0,16,0,18,98,64,104,101,114,101,13,16,6,36,2,14, 2,2,11,11,11,8,32,8,31,8,30,8,29,27,248,22,164,4,195,249,22, 157,4,80,158,39,36,251,22,89,2,18,248,22,104,199,12,249,22,79,2,19, 248,22,106,201,27,248,22,164,4,195,249,22,157,4,80,158,39,36,251,22,89, 2,18,248,22,104,199,249,22,79,2,19,248,22,106,201,12,27,248,22,81,248, 22,164,4,196,28,248,22,87,193,20,14,159,37,36,37,28,248,22,87,248,22, -81,194,248,22,179,17,193,249,22,157,4,80,158,39,36,251,22,89,2,18,248, -22,179,17,199,249,22,79,2,8,248,22,180,17,201,11,18,100,10,13,16,6, +81,194,248,22,183,17,193,249,22,157,4,80,158,39,36,251,22,89,2,18,248, +22,183,17,199,249,22,79,2,4,248,22,184,17,201,11,18,100,10,13,16,6, 36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4,11,11,2, -20,3,1,8,101,110,118,49,55,52,49,54,16,4,11,11,2,21,3,1,8, -101,110,118,49,55,52,49,55,27,248,22,81,248,22,164,4,196,28,248,22,87, -193,20,14,159,37,36,37,28,248,22,87,248,22,81,194,248,22,179,17,193,249, +20,3,1,8,101,110,118,49,55,52,51,56,16,4,11,11,2,21,3,1,8, +101,110,118,49,55,52,51,57,27,248,22,81,248,22,164,4,196,28,248,22,87, +193,20,14,159,37,36,37,28,248,22,87,248,22,81,194,248,22,183,17,193,249, 22,157,4,80,158,39,36,250,22,89,2,22,248,22,89,249,22,89,248,22,89, -2,23,248,22,179,17,201,251,22,89,2,18,2,23,2,23,249,22,79,2,5, -248,22,180,17,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8,32, +2,23,248,22,183,17,201,251,22,89,2,18,2,23,2,23,249,22,79,2,11, +248,22,184,17,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8,32, 8,31,8,30,8,29,16,4,11,11,2,20,3,1,8,101,110,118,49,55,52, -49,57,16,4,11,11,2,21,3,1,8,101,110,118,49,55,52,50,48,248,22, +52,49,16,4,11,11,2,21,3,1,8,101,110,118,49,55,52,52,50,248,22, 164,4,193,27,248,22,164,4,194,249,22,79,248,22,89,248,22,80,196,248,22, -180,17,195,27,248,22,81,248,22,164,4,196,249,22,157,4,80,158,39,36,28, -248,22,64,248,22,158,4,248,22,80,197,27,249,22,2,32,0,88,163,8,36, -37,43,11,9,222,33,40,248,22,164,4,248,22,104,199,250,22,89,2,24,248, -22,89,249,22,89,248,22,89,248,22,179,17,203,250,22,90,2,25,249,22,2, -22,80,203,248,22,106,205,249,22,79,248,22,179,17,201,249,22,2,22,104,199, -250,22,90,2,22,249,22,2,32,0,88,163,8,36,37,47,11,9,222,33,41, -248,22,164,4,248,22,179,17,201,248,22,180,17,198,27,248,22,164,4,194,249, -22,79,248,22,89,248,22,80,196,248,22,180,17,195,27,248,22,81,248,22,164, -4,196,249,22,157,4,80,158,39,36,250,22,90,2,24,249,22,2,32,0,88, -163,8,36,37,47,11,9,222,33,43,248,22,164,4,248,22,80,201,248,22,180, -17,198,27,248,22,81,248,22,164,4,196,27,248,22,164,4,248,22,80,195,249, -22,157,4,80,158,40,36,28,248,22,87,195,250,22,90,2,22,9,248,22,81, -199,250,22,89,2,11,248,22,89,248,22,80,199,250,22,90,2,10,248,22,180, -17,201,248,22,81,202,27,248,22,81,248,22,164,4,196,27,249,22,1,22,93, -249,22,2,22,164,4,248,22,164,4,248,22,80,199,248,22,184,4,249,22,157, -4,80,158,41,36,251,22,89,1,22,119,105,116,104,45,99,111,110,116,105,110, -117,97,116,105,111,110,45,109,97,114,107,2,26,250,22,90,1,23,101,120,116, -101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,21, -95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,45, -115,101,116,45,102,105,114,115,116,11,2,26,202,250,22,90,2,22,9,248,22, -81,204,27,248,22,81,248,22,164,4,196,28,248,22,87,193,20,14,159,37,36, -37,249,22,157,4,80,158,39,36,27,248,22,164,4,248,22,80,197,28,249,22, -156,9,62,61,62,248,22,158,4,248,22,104,196,250,22,89,2,22,248,22,89, -249,22,89,21,93,2,27,248,22,80,199,250,22,90,2,3,249,22,89,2,27, -249,22,89,248,22,113,203,2,27,248,22,81,202,251,22,89,2,18,28,249,22, -156,9,248,22,158,4,248,22,80,200,64,101,108,115,101,10,248,22,179,17,197, -250,22,90,2,22,9,248,22,180,17,200,249,22,79,2,3,248,22,81,202,99, -13,16,6,36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4, -11,11,2,20,3,1,8,101,110,118,49,55,52,52,50,16,4,11,11,2,21, -3,1,8,101,110,118,49,55,52,52,51,18,158,94,10,64,118,111,105,100,8, -48,27,248,22,81,248,22,164,4,196,249,22,157,4,80,158,39,36,28,248,22, -64,248,22,158,4,248,22,80,197,250,22,89,2,28,248,22,89,248,22,179,17, -199,248,22,104,198,27,248,22,158,4,248,22,179,17,197,250,22,89,2,28,248, -22,89,248,22,80,197,250,22,90,2,25,248,22,180,17,199,248,22,180,17,202, -159,36,20,114,159,36,16,1,11,16,0,20,26,150,9,2,1,2,1,2,2, -11,9,9,11,11,11,10,36,80,158,36,36,20,114,159,36,16,0,16,0,38, -39,36,16,0,36,16,0,36,11,11,11,16,10,2,3,2,4,2,5,2,6, -2,7,2,8,2,9,2,10,2,11,2,12,16,10,11,11,11,11,11,11,11, -11,11,11,16,10,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10, -2,11,2,12,36,46,37,16,0,36,16,1,2,13,37,11,11,11,16,0,16, -0,16,0,36,36,11,12,11,11,16,0,16,0,16,0,36,36,16,11,16,5, -11,20,15,16,2,20,14,159,36,36,37,80,158,36,36,36,20,114,159,36,16, -1,2,13,16,1,33,33,10,16,5,2,6,88,163,8,36,37,53,37,9,223, -0,33,34,36,20,114,159,36,16,1,2,13,16,0,11,16,5,2,12,88,163, -8,36,37,53,37,9,223,0,33,35,36,20,114,159,36,16,1,2,13,16,0, -11,16,5,2,8,88,163,8,36,37,53,37,9,223,0,33,36,36,20,114,159, -36,16,1,2,13,16,1,33,37,11,16,5,2,5,88,163,8,36,37,56,37, -9,223,0,33,38,36,20,114,159,36,16,1,2,13,16,1,33,39,11,16,5, -2,11,88,163,8,36,37,58,37,9,223,0,33,42,36,20,114,159,36,16,1, -2,13,16,0,11,16,5,2,4,88,163,8,36,37,53,37,9,223,0,33,44, -36,20,114,159,36,16,1,2,13,16,0,11,16,5,2,10,88,163,8,36,37, -54,37,9,223,0,33,45,36,20,114,159,36,16,1,2,13,16,0,11,16,5, -2,7,88,163,8,36,37,56,37,9,223,0,33,46,36,20,114,159,36,16,1, -2,13,16,0,11,16,5,2,3,88,163,8,36,37,58,37,9,223,0,33,47, -36,20,114,159,36,16,1,2,13,16,1,33,49,11,16,5,2,9,88,163,8, -36,37,54,37,9,223,0,33,50,36,20,114,159,36,16,1,2,13,16,0,11, -16,0,94,2,16,2,17,93,2,16,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 2029); +184,17,195,27,248,22,81,248,22,164,4,23,197,1,249,22,157,4,80,158,39, +36,28,248,22,64,248,22,158,4,248,22,80,23,198,2,27,249,22,2,32,0, +88,163,8,36,37,43,11,9,222,33,40,248,22,164,4,248,22,104,23,200,2, +250,22,89,2,24,248,22,89,249,22,89,248,22,89,248,22,183,17,23,204,2, +250,22,90,2,25,249,22,2,22,80,23,204,2,248,22,106,23,206,2,249,22, +79,248,22,183,17,23,202,1,249,22,2,22,104,23,200,1,250,22,90,2,22, +249,22,2,32,0,88,163,8,36,37,47,11,9,222,33,41,248,22,164,4,248, +22,183,17,201,248,22,184,17,198,27,248,22,164,4,194,249,22,79,248,22,89, +248,22,80,196,248,22,184,17,195,27,248,22,81,248,22,164,4,23,197,1,249, +22,157,4,80,158,39,36,250,22,90,2,24,249,22,2,32,0,88,163,8,36, +37,47,11,9,222,33,43,248,22,164,4,248,22,80,201,248,22,184,17,198,27, +248,22,81,248,22,164,4,196,27,248,22,164,4,248,22,80,195,249,22,157,4, +80,158,40,36,28,248,22,87,195,250,22,90,2,22,9,248,22,81,199,250,22, +89,2,6,248,22,89,248,22,80,199,250,22,90,2,10,248,22,184,17,201,248, +22,81,202,27,248,22,81,248,22,164,4,23,197,1,27,249,22,1,22,93,249, +22,2,22,164,4,248,22,164,4,248,22,80,199,248,22,184,4,249,22,157,4, +80,158,41,36,251,22,89,1,22,119,105,116,104,45,99,111,110,116,105,110,117, +97,116,105,111,110,45,109,97,114,107,2,26,250,22,90,1,23,101,120,116,101, +110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,21,95, +1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,45,115, +101,116,45,102,105,114,115,116,11,2,26,202,250,22,90,2,22,9,248,22,81, +204,27,248,22,81,248,22,164,4,196,28,248,22,87,193,20,14,159,37,36,37, +249,22,157,4,80,158,39,36,27,248,22,164,4,248,22,80,197,28,249,22,160, +9,62,61,62,248,22,158,4,248,22,104,196,250,22,89,2,22,248,22,89,249, +22,89,21,93,2,27,248,22,80,199,250,22,90,2,8,249,22,89,2,27,249, +22,89,248,22,113,203,2,27,248,22,81,202,251,22,89,2,18,28,249,22,160, +9,248,22,158,4,248,22,80,200,64,101,108,115,101,10,248,22,183,17,197,250, +22,90,2,22,9,248,22,184,17,200,249,22,79,2,8,248,22,81,202,99,13, +16,6,36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4,11, +11,2,20,3,1,8,101,110,118,49,55,52,54,52,16,4,11,11,2,21,3, +1,8,101,110,118,49,55,52,54,53,18,158,94,10,64,118,111,105,100,8,48, +27,248,22,81,248,22,164,4,196,249,22,157,4,80,158,39,36,28,248,22,64, +248,22,158,4,248,22,80,197,250,22,89,2,28,248,22,89,248,22,183,17,199, +248,22,104,198,27,248,22,158,4,248,22,183,17,197,250,22,89,2,28,248,22, +89,248,22,80,197,250,22,90,2,25,248,22,184,17,199,248,22,184,17,202,159, +36,20,114,159,36,16,1,11,16,0,20,26,150,9,2,1,2,1,2,2,11, +9,9,11,11,11,10,36,80,158,36,36,20,114,159,36,16,0,16,0,38,39, +36,16,0,36,16,0,36,11,11,11,16,10,2,3,2,4,2,5,2,6,2, +7,2,8,2,9,2,10,2,11,2,12,16,10,11,11,11,11,11,11,11,11, +11,11,16,10,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2, +11,2,12,36,46,37,16,0,36,16,1,2,13,37,11,11,11,16,0,16,0, +16,0,36,36,11,12,11,11,16,0,16,0,16,0,36,36,16,11,16,5,11, +20,15,16,2,20,14,159,36,36,37,80,158,36,36,36,20,114,159,36,16,1, +2,13,16,1,33,33,10,16,5,2,7,88,163,8,36,37,53,37,9,223,0, +33,34,36,20,114,159,36,16,1,2,13,16,0,11,16,5,2,12,88,163,8, +36,37,53,37,9,223,0,33,35,36,20,114,159,36,16,1,2,13,16,0,11, +16,5,2,4,88,163,8,36,37,53,37,9,223,0,33,36,36,20,114,159,36, +16,1,2,13,16,1,33,37,11,16,5,2,11,88,163,8,36,37,56,37,9, +223,0,33,38,36,20,114,159,36,16,1,2,13,16,1,33,39,11,16,5,2, +6,88,163,8,36,37,58,37,9,223,0,33,42,36,20,114,159,36,16,1,2, +13,16,0,11,16,5,2,9,88,163,8,36,37,53,37,9,223,0,33,44,36, +20,114,159,36,16,1,2,13,16,0,11,16,5,2,10,88,163,8,36,37,54, +37,9,223,0,33,45,36,20,114,159,36,16,1,2,13,16,0,11,16,5,2, +3,88,163,8,36,37,56,37,9,223,0,33,46,36,20,114,159,36,16,1,2, +13,16,0,11,16,5,2,8,88,163,8,36,37,58,37,9,223,0,33,47,36, +20,114,159,36,16,1,2,13,16,1,33,49,11,16,5,2,5,88,163,8,36, +37,54,37,9,223,0,33,50,36,20,114,159,36,16,1,2,13,16,0,11,16, +0,94,2,16,2,17,93,2,16,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 2049); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,51,46,56,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,52,46,50,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,126,0,0,0,1,0,0,8,0,21,0, 26,0,43,0,55,0,77,0,106,0,121,0,139,0,151,0,167,0,181,0,203, 0,219,0,236,0,2,1,13,1,19,1,28,1,35,1,42,1,54,1,70,1, 94,1,126,1,144,1,164,1,180,1,198,1,229,1,243,1,4,2,48,2,56, 2,61,2,105,2,112,2,122,2,137,2,146,2,151,2,153,2,177,2,198,2, -211,2,221,2,227,2,16,3,19,3,23,3,32,3,56,3,95,3,109,3,119, -3,130,3,182,3,205,3,213,3,237,3,2,4,215,4,245,4,77,8,100,8, -117,8,71,10,197,10,211,10,176,11,163,13,172,13,181,13,195,13,205,13,161, -14,30,15,103,15,176,15,24,16,53,16,124,16,5,17,76,17,30,18,38,18, -148,18,230,18,232,18,124,19,180,19,187,19,37,20,56,20,209,20,225,20,121, -22,149,22,158,22,232,23,250,23,8,24,29,24,45,24,85,24,94,24,112,24, -161,24,174,24,81,27,243,27,146,28,132,29,115,30,124,30,131,30,252,30,117, -31,189,32,14,33,97,33,182,33,119,34,151,34,251,34,0,0,169,39,0,0, +211,2,221,2,227,2,16,3,19,3,23,3,32,3,56,3,95,3,108,3,118, +3,129,3,181,3,204,3,212,3,236,3,1,4,214,4,244,4,125,8,148,8, +165,8,135,10,5,11,19,11,240,11,232,13,241,13,250,13,8,14,18,14,59, +15,184,15,1,16,74,16,178,16,207,16,22,17,159,17,230,17,184,18,192,18, +48,19,136,19,138,19,34,20,94,20,101,20,225,20,244,20,141,21,157,21,83, +23,111,23,120,23,194,24,212,24,226,24,247,24,7,25,55,25,64,25,82,25, +137,25,150,25,75,28,3,29,162,29,153,30,141,31,150,31,157,31,26,32,151, +32,2,34,89,34,178,34,13,35,206,35,238,35,113,36,0,0,35,41,0,0, 67,35,37,117,116,105,108,115,72,112,97,116,104,45,115,116,114,105,110,103,63, 64,98,115,98,115,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116, 104,71,114,101,114,111,111,116,45,112,97,116,104,1,20,102,105,110,100,45,101, @@ -154,424 +155,442 @@ 126,97,6,21,21,40,111,114,47,99,32,115,116,114,105,110,103,63,32,98,121, 116,101,115,63,41,6,36,36,99,97,110,110,111,116,32,97,100,100,32,97,32, 115,117,102,102,105,120,32,116,111,32,97,32,114,111,111,116,32,112,97,116,104, -58,32,6,11,11,80,76,84,67,79,76,76,69,67,84,83,69,97,100,100,111, -110,45,100,105,114,6,8,8,99,111,108,108,101,99,116,115,27,248,22,135,15, -23,195,2,28,23,193,2,192,86,94,23,193,1,28,248,22,146,7,23,195,2, -27,248,22,157,15,23,196,2,28,23,193,2,192,86,94,23,193,1,248,22,158, -15,23,196,1,11,0,21,35,114,120,34,94,91,92,92,93,91,92,92,93,91, -63,93,91,92,92,93,34,0,6,35,114,120,34,47,34,0,22,35,114,120,34, -91,47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36,34,0,19,35, -114,120,34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34,86,94,28, -28,248,22,136,15,23,195,2,10,28,248,22,135,15,23,195,2,10,28,248,22, -146,7,23,195,2,28,248,22,157,15,23,195,2,10,248,22,158,15,23,195,2, -11,12,250,22,129,10,2,32,2,33,23,197,2,28,28,248,22,136,15,23,195, -2,249,22,156,9,248,22,137,15,23,197,2,2,34,249,22,156,9,247,22,168, -8,2,34,27,28,248,22,146,7,23,196,2,23,195,2,248,22,158,8,248,22, -140,15,23,197,2,28,249,22,128,16,2,58,23,195,2,86,94,23,193,1,28, -248,22,146,7,23,196,2,248,22,143,15,23,196,1,194,27,248,22,185,7,23, -195,1,249,22,144,15,248,22,161,8,250,22,136,16,2,59,28,249,22,128,16, -2,60,23,201,2,23,199,1,250,22,136,16,2,61,23,202,1,2,35,80,159, -44,37,38,2,34,28,248,22,146,7,23,195,2,248,22,143,15,23,195,1,193, -0,28,35,114,120,34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92, -92,85,78,67,92,92,92,92,34,86,95,28,28,28,248,22,135,15,23,195,2, -10,28,248,22,146,7,23,195,2,28,248,22,157,15,23,195,2,10,248,22,158, -15,23,195,2,11,10,248,22,136,15,23,195,2,12,252,22,129,10,2,5,2, -36,36,23,199,2,23,200,2,28,28,28,248,22,135,15,23,196,2,10,28,248, -22,146,7,23,196,2,28,248,22,157,15,23,196,2,10,248,22,158,15,23,196, -2,11,10,248,22,136,15,23,196,2,12,252,22,129,10,2,5,2,36,37,23, -199,2,23,200,2,27,28,248,22,136,15,23,196,2,248,22,137,15,23,196,2, -247,22,138,15,86,95,28,28,248,22,159,15,23,196,2,10,249,22,156,9,247, -22,138,15,23,195,2,12,253,22,131,10,2,5,6,54,54,112,97,116,104,32, -105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,32,97,110,100,32,110, -111,116,32,116,104,101,32,112,108,97,116,102,111,114,109,39,115,32,99,111,110, -118,101,110,116,105,111,110,2,37,23,201,2,6,24,24,112,108,97,116,102,111, -114,109,32,99,111,110,118,101,110,116,105,111,110,32,116,121,112,101,247,22,138, -15,28,249,22,156,9,28,248,22,136,15,23,199,2,248,22,137,15,23,199,2, -247,22,138,15,23,195,2,12,253,22,131,10,2,5,6,37,37,103,105,118,101, -110,32,112,97,116,104,115,32,117,115,101,32,100,105,102,102,101,114,101,110,116, -32,99,111,110,118,101,110,116,105,111,110,115,2,37,23,201,2,6,9,9,114, -111,111,116,32,112,97,116,104,23,202,2,27,27,248,22,163,15,28,248,22,159, -15,23,199,2,197,248,22,160,15,198,86,94,28,28,248,22,136,15,193,10,28, -248,22,135,15,193,10,28,248,22,146,7,193,28,248,22,157,15,193,10,248,22, -158,15,193,11,12,250,22,129,10,2,32,2,33,195,28,28,248,22,136,15,193, -249,22,156,9,248,22,137,15,195,2,34,249,22,156,9,247,22,168,8,2,34, -27,28,248,22,146,7,194,193,248,22,158,8,248,22,140,15,195,28,249,22,128, -16,2,58,194,28,248,22,146,7,194,248,22,143,15,194,193,27,248,22,185,7, -194,249,22,144,15,248,22,161,8,250,22,136,16,2,59,28,249,22,128,16,2, -60,200,198,250,22,136,16,2,61,201,2,35,80,159,47,37,38,2,34,28,248, -22,146,7,193,248,22,143,15,193,192,27,248,22,140,15,23,195,2,28,249,22, -156,9,23,197,2,64,117,110,105,120,28,249,22,143,8,23,195,1,5,1,47, -86,95,23,195,1,23,194,1,28,248,22,136,15,23,199,2,197,248,22,143,15, -23,199,1,249,22,153,15,23,200,1,249,22,144,15,249,22,146,8,248,22,140, -15,23,201,1,37,23,199,1,28,249,22,156,9,23,197,2,2,34,249,22,153, -15,23,200,1,249,22,144,15,28,249,22,128,16,0,27,35,114,120,34,94,92, -92,92,92,92,92,92,92,91,63,93,92,92,92,92,91,97,45,122,93,58,34, -23,199,2,251,22,147,8,2,38,250,22,146,8,23,204,2,40,41,5,1,92, -249,22,146,8,23,203,1,42,28,249,22,128,16,2,63,23,199,2,249,22,147, -8,2,38,249,22,146,8,23,201,1,40,28,249,22,128,16,2,63,23,199,2, -249,22,147,8,2,38,249,22,146,8,23,201,1,40,28,249,22,128,16,0,14, -35,114,120,34,94,92,92,92,92,92,92,92,92,34,23,199,2,249,22,147,8, -5,4,85,78,67,92,249,22,146,8,23,201,1,38,28,249,22,128,16,0,12, -35,114,120,34,94,91,97,45,122,93,58,34,23,199,2,249,22,147,8,250,22, -146,8,23,202,2,36,37,249,22,146,8,23,201,1,38,86,94,23,197,1,12, -23,199,1,12,32,65,88,163,8,36,39,53,11,70,102,111,117,110,100,45,101, -120,101,99,222,33,68,32,66,88,163,8,36,40,58,11,64,110,101,120,116,222, -33,67,27,248,22,161,15,23,196,2,28,249,22,158,9,23,195,2,23,197,1, -11,28,248,22,157,15,23,194,2,27,249,22,153,15,23,197,1,23,196,1,28, -23,197,2,90,159,39,11,89,161,39,36,11,248,22,156,15,23,197,2,86,95, -23,195,1,23,194,1,27,28,23,202,2,27,248,22,161,15,23,199,2,28,249, -22,158,9,194,23,200,2,11,28,248,22,157,15,193,250,2,65,23,205,2,23, -206,2,249,22,153,15,23,200,2,197,250,2,65,23,205,2,23,206,2,195,11, -28,23,193,2,192,86,94,23,193,1,27,28,248,22,135,15,23,196,2,27,249, -22,153,15,23,198,2,23,205,2,28,28,248,22,148,15,193,10,248,22,147,15, -193,192,11,11,28,23,193,2,192,86,94,23,193,1,28,23,203,2,11,27,248, -22,161,15,23,200,2,28,249,22,158,9,23,195,2,23,201,1,11,28,248,22, -157,15,23,194,2,250,2,65,23,206,1,23,207,1,249,22,153,15,23,201,1, -23,198,1,86,94,23,196,1,250,2,65,23,206,1,23,207,1,23,196,1,192, -86,94,23,194,1,28,23,196,2,90,159,39,11,89,161,39,36,11,248,22,156, -15,23,197,2,86,95,23,195,1,23,194,1,27,28,23,201,2,27,248,22,161, -15,23,199,2,28,249,22,158,9,194,23,200,2,11,28,248,22,157,15,193,250, -2,65,23,204,2,23,205,2,249,22,153,15,23,200,2,197,250,2,65,23,204, -2,23,205,2,195,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,135, -15,23,196,2,27,249,22,153,15,23,198,2,23,204,2,28,28,248,22,148,15, -193,10,248,22,147,15,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28, -23,202,2,11,27,248,22,161,15,23,200,2,28,249,22,158,9,23,195,2,23, -201,1,11,28,248,22,157,15,23,194,2,250,2,65,23,205,1,23,206,1,249, -22,153,15,23,201,1,23,198,1,86,94,23,196,1,250,2,65,23,205,1,23, -206,1,23,196,1,192,28,23,193,2,90,159,39,11,89,161,39,36,11,248,22, -156,15,23,199,2,86,95,23,195,1,23,194,1,27,28,23,198,2,251,2,66, -23,198,2,23,203,2,23,201,2,23,202,2,11,28,23,193,2,192,86,94,23, -193,1,27,28,248,22,135,15,23,196,2,27,249,22,153,15,23,198,2,23,201, -2,28,28,248,22,148,15,193,10,248,22,147,15,193,192,11,11,28,23,193,2, -192,86,94,23,193,1,28,23,199,2,11,251,2,66,23,199,1,23,204,1,23, -202,1,23,203,1,194,32,69,88,163,8,36,40,58,11,2,41,222,33,70,28, -248,22,87,23,197,2,11,27,248,22,160,15,248,22,80,23,199,2,27,249,22, -153,15,23,196,1,23,197,2,28,248,22,147,15,23,194,2,86,95,23,198,1, -23,195,1,250,2,65,23,199,1,23,200,1,23,196,1,86,94,23,193,1,27, -248,22,81,23,200,1,28,248,22,87,23,194,2,11,27,248,22,160,15,248,22, -80,23,196,2,27,249,22,153,15,23,196,1,23,200,2,28,248,22,147,15,23, -194,2,86,95,23,198,1,23,195,1,250,2,65,23,202,1,23,203,1,23,196, -1,86,94,23,193,1,27,248,22,81,23,197,1,28,248,22,87,23,194,2,11, -27,248,22,160,15,248,22,80,23,196,2,27,249,22,153,15,23,196,1,23,203, -2,28,248,22,147,15,23,194,2,86,95,23,201,1,23,195,1,250,2,65,23, -205,1,23,206,1,23,196,1,86,94,23,193,1,251,2,69,23,205,1,23,206, -1,23,207,1,248,22,81,23,200,1,86,95,28,28,248,22,135,15,23,195,2, -10,28,248,22,146,7,23,195,2,28,248,22,157,15,23,195,2,10,248,22,158, -15,23,195,2,11,12,250,22,129,10,2,6,2,39,23,197,2,28,28,23,195, -2,28,28,248,22,135,15,23,196,2,10,28,248,22,146,7,23,196,2,28,248, -22,157,15,23,196,2,10,248,22,158,15,23,196,2,11,248,22,157,15,23,196, -2,11,10,12,250,22,129,10,2,6,6,45,45,40,111,114,47,99,32,35,102, -32,40,97,110,100,47,99,32,112,97,116,104,45,115,116,114,105,110,103,63,32, -114,101,108,97,116,105,118,101,45,112,97,116,104,63,41,41,23,198,2,28,28, -248,22,157,15,23,195,2,90,159,39,11,89,161,39,36,11,248,22,156,15,23, -198,2,249,22,156,9,194,2,40,11,27,248,22,166,8,6,4,4,80,65,84, -72,27,28,23,194,2,249,80,158,40,41,23,196,1,9,86,94,23,194,1,9, -27,28,249,22,156,9,247,22,168,8,2,34,249,22,79,248,22,144,15,5,1, -46,23,196,1,23,194,1,28,248,22,87,23,194,2,11,27,248,22,160,15,248, -22,80,23,196,2,27,249,22,153,15,23,196,1,23,201,2,28,248,22,147,15, -23,194,2,86,95,23,199,1,23,195,1,250,2,65,23,203,1,23,204,1,23, +58,32,5,11,80,76,84,67,79,76,76,69,67,84,83,69,97,100,100,111,110, +45,100,105,114,6,8,8,99,111,108,108,101,99,116,115,27,248,22,139,15,23, +195,2,28,23,193,2,192,86,94,23,193,1,28,248,22,146,7,23,195,2,27, +248,22,161,15,23,196,2,28,23,193,2,192,86,94,23,193,1,248,22,162,15, +23,196,1,11,0,21,35,114,120,34,94,91,92,92,93,91,92,92,93,91,63, +93,91,92,92,93,34,0,6,35,114,120,34,47,34,0,22,35,114,120,34,91, +47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36,34,0,19,35,114, +120,34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34,86,94,28,28, +248,22,140,15,23,195,2,10,28,248,22,139,15,23,195,2,10,28,248,22,146, +7,23,195,2,28,248,22,161,15,23,195,2,10,248,22,162,15,23,195,2,11, +12,250,22,133,10,2,32,2,33,23,197,2,28,28,248,22,140,15,23,195,2, +249,22,160,9,248,22,141,15,23,197,2,2,34,249,22,160,9,247,22,172,8, +2,34,27,28,248,22,146,7,23,196,2,23,195,2,248,22,158,8,248,22,144, +15,23,197,2,28,249,22,132,16,2,58,23,195,2,86,94,23,193,1,28,248, +22,146,7,23,196,2,248,22,147,15,23,196,1,194,27,248,22,185,7,23,195, +1,249,22,148,15,248,22,161,8,250,22,140,16,2,59,28,249,22,132,16,2, +60,23,201,2,23,199,1,250,22,140,16,2,61,23,202,1,2,35,80,159,44, +37,38,2,34,28,248,22,146,7,23,195,2,248,22,147,15,23,195,1,193,0, +28,35,114,120,34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92,92, +85,78,67,92,92,92,92,34,86,95,28,28,28,248,22,139,15,23,195,2,10, +28,248,22,146,7,23,195,2,28,248,22,161,15,23,195,2,10,248,22,162,15, +23,195,2,11,10,248,22,140,15,23,195,2,12,252,22,133,10,2,5,2,36, +36,23,199,2,23,200,2,28,28,28,248,22,139,15,23,196,2,10,28,248,22, +146,7,23,196,2,28,248,22,161,15,23,196,2,10,248,22,162,15,23,196,2, +11,10,248,22,140,15,23,196,2,12,252,22,133,10,2,5,2,36,37,23,199, +2,23,200,2,27,28,248,22,140,15,23,196,2,248,22,141,15,23,196,2,247, +22,142,15,86,95,28,28,248,22,163,15,23,196,2,10,249,22,160,9,247,22, +142,15,23,195,2,12,253,22,135,10,2,5,6,54,54,112,97,116,104,32,105, +115,32,110,111,116,32,99,111,109,112,108,101,116,101,32,97,110,100,32,110,111, +116,32,116,104,101,32,112,108,97,116,102,111,114,109,39,115,32,99,111,110,118, +101,110,116,105,111,110,2,37,23,201,2,6,24,24,112,108,97,116,102,111,114, +109,32,99,111,110,118,101,110,116,105,111,110,32,116,121,112,101,247,22,142,15, +28,249,22,160,9,28,248,22,140,15,23,199,2,248,22,141,15,23,199,2,247, +22,142,15,23,195,2,12,253,22,135,10,2,5,6,37,37,103,105,118,101,110, +32,112,97,116,104,115,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32, +99,111,110,118,101,110,116,105,111,110,115,2,37,23,201,2,6,9,9,114,111, +111,116,32,112,97,116,104,23,202,2,27,27,248,22,167,15,28,248,22,163,15, +23,199,2,23,198,1,248,22,164,15,23,199,1,86,94,28,28,248,22,140,15, +23,194,2,10,28,248,22,139,15,23,194,2,10,28,248,22,146,7,23,194,2, +28,248,22,161,15,23,194,2,10,248,22,162,15,23,194,2,11,12,250,22,133, +10,2,32,2,33,23,196,2,28,28,248,22,140,15,23,194,2,249,22,160,9, +248,22,141,15,23,196,2,2,34,249,22,160,9,247,22,172,8,2,34,27,28, +248,22,146,7,23,195,2,23,194,2,248,22,158,8,248,22,144,15,23,196,2, +28,249,22,132,16,2,58,23,195,2,86,94,23,193,1,28,248,22,146,7,23, +195,2,248,22,147,15,23,195,1,193,27,248,22,185,7,23,195,1,249,22,148, +15,248,22,161,8,250,22,140,16,2,59,28,249,22,132,16,2,60,23,201,2, +23,199,1,250,22,140,16,2,61,23,202,1,2,35,80,159,47,37,38,2,34, +28,248,22,146,7,23,194,2,248,22,147,15,23,194,1,192,27,248,22,144,15, +23,195,2,28,249,22,160,9,23,197,2,64,117,110,105,120,28,249,22,143,8, +23,195,1,5,1,47,86,95,23,195,1,23,194,1,28,248,22,140,15,23,199, +2,197,248,22,147,15,23,199,1,249,22,157,15,23,200,1,249,22,148,15,249, +22,146,8,248,22,144,15,23,201,1,37,23,199,1,28,249,22,160,9,23,197, +2,2,34,249,22,157,15,23,200,1,249,22,148,15,28,249,22,132,16,0,27, +35,114,120,34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92,92,91, +97,45,122,93,58,34,23,199,2,251,22,147,8,2,38,250,22,146,8,23,204, +2,40,41,5,1,92,249,22,146,8,23,203,1,42,28,249,22,132,16,2,63, +23,199,2,249,22,147,8,2,38,249,22,146,8,23,201,1,40,28,249,22,132, +16,2,63,23,199,2,249,22,147,8,2,38,249,22,146,8,23,201,1,40,28, +249,22,132,16,0,14,35,114,120,34,94,92,92,92,92,92,92,92,92,34,23, +199,2,249,22,147,8,5,4,85,78,67,92,249,22,146,8,23,201,1,38,28, +249,22,132,16,0,12,35,114,120,34,94,91,97,45,122,93,58,34,23,199,2, +249,22,147,8,250,22,146,8,23,202,2,36,37,249,22,146,8,23,201,1,38, +86,94,23,197,1,12,23,199,1,12,32,65,88,163,8,36,39,53,11,70,102, +111,117,110,100,45,101,120,101,99,222,33,68,32,66,88,163,8,36,40,58,11, +64,110,101,120,116,222,33,67,27,248,22,165,15,23,196,2,28,249,22,162,9, +23,195,2,23,197,1,11,28,248,22,161,15,23,194,2,27,249,22,157,15,23, +197,1,23,196,1,28,23,197,2,90,159,39,11,89,161,39,36,11,248,22,160, +15,23,197,2,86,95,23,195,1,23,194,1,27,28,23,202,2,27,248,22,165, +15,23,199,2,28,249,22,162,9,23,195,2,23,200,2,11,28,248,22,161,15, +23,194,2,250,2,65,23,205,2,23,206,2,249,22,157,15,23,200,2,23,198, +1,250,2,65,23,205,2,23,206,2,23,196,1,11,28,23,193,2,192,86,94, +23,193,1,27,28,248,22,139,15,23,196,2,27,249,22,157,15,23,198,2,23, +205,2,28,28,248,22,152,15,193,10,248,22,151,15,193,192,11,11,28,23,193, +2,192,86,94,23,193,1,28,23,203,2,11,27,248,22,165,15,23,200,2,28, +249,22,162,9,23,195,2,23,201,1,11,28,248,22,161,15,23,194,2,250,2, +65,23,206,1,23,207,1,249,22,157,15,23,201,1,23,198,1,86,94,23,196, +1,250,2,65,23,206,1,23,207,1,23,196,1,192,86,94,23,194,1,28,23, +196,2,90,159,39,11,89,161,39,36,11,248,22,160,15,23,197,2,86,95,23, +195,1,23,194,1,27,28,23,201,2,27,248,22,165,15,23,199,2,28,249,22, +162,9,23,195,2,23,200,2,11,28,248,22,161,15,23,194,2,250,2,65,23, +204,2,23,205,2,249,22,157,15,23,200,2,23,198,1,250,2,65,23,204,2, +23,205,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22, +139,15,23,196,2,27,249,22,157,15,23,198,2,23,204,2,28,28,248,22,152, +15,193,10,248,22,151,15,193,192,11,11,28,23,193,2,192,86,94,23,193,1, +28,23,202,2,11,27,248,22,165,15,23,200,2,28,249,22,162,9,23,195,2, +23,201,1,11,28,248,22,161,15,23,194,2,250,2,65,23,205,1,23,206,1, +249,22,157,15,23,201,1,23,198,1,86,94,23,196,1,250,2,65,23,205,1, +23,206,1,23,196,1,192,28,23,193,2,90,159,39,11,89,161,39,36,11,248, +22,160,15,23,199,2,86,95,23,195,1,23,194,1,27,28,23,198,2,251,2, +66,23,198,2,23,203,2,23,201,2,23,202,2,11,28,23,193,2,192,86,94, +23,193,1,27,28,248,22,139,15,23,196,2,27,249,22,157,15,23,198,2,23, +201,2,28,28,248,22,152,15,193,10,248,22,151,15,193,192,11,11,28,23,193, +2,192,86,94,23,193,1,28,23,199,2,11,251,2,66,23,199,1,23,204,1, +23,202,1,23,203,1,194,32,69,88,163,8,36,40,58,11,2,41,222,33,70, +28,248,22,87,23,197,2,11,27,248,22,164,15,248,22,80,23,199,2,27,249, +22,157,15,23,196,1,23,197,2,28,248,22,151,15,23,194,2,86,95,23,198, +1,23,195,1,250,2,65,23,199,1,23,200,1,23,196,1,86,94,23,193,1, +27,248,22,81,23,200,1,28,248,22,87,23,194,2,11,27,248,22,164,15,248, +22,80,23,196,2,27,249,22,157,15,23,196,1,23,200,2,28,248,22,151,15, +23,194,2,86,95,23,198,1,23,195,1,250,2,65,23,202,1,23,203,1,23, 196,1,86,94,23,193,1,27,248,22,81,23,197,1,28,248,22,87,23,194,2, -11,27,248,22,160,15,248,22,80,23,196,2,27,249,22,153,15,23,196,1,23, -204,2,28,248,22,147,15,23,194,2,86,95,23,202,1,23,195,1,250,2,65, -23,206,1,23,207,1,23,196,1,86,94,23,193,1,27,248,22,81,23,197,1, -28,248,22,87,23,194,2,11,27,248,22,160,15,248,22,80,23,196,2,27,249, -22,153,15,23,196,1,23,207,2,28,248,22,147,15,23,194,2,86,95,23,205, -1,23,195,1,250,2,65,23,209,1,23,210,1,23,196,1,86,94,23,193,1, -251,2,69,23,209,1,23,210,1,23,211,1,248,22,81,23,200,1,27,248,22, -160,15,23,196,1,28,248,22,147,15,23,194,2,250,2,65,23,199,1,23,200, -1,23,196,1,11,250,80,159,39,40,39,196,197,11,250,80,159,39,40,39,196, -11,11,32,74,88,163,8,36,39,57,11,2,41,222,33,76,0,8,35,114,120, -35,34,92,34,34,27,249,22,188,15,196,197,28,192,27,248,22,104,194,27,27, -248,22,113,196,27,249,22,188,15,200,195,28,192,27,248,22,104,194,27,250,2, -74,202,203,248,22,113,198,28,249,22,143,8,195,2,42,249,22,93,201,194,249, -22,79,248,22,144,15,28,249,22,156,9,247,22,168,8,2,34,250,22,136,16, -2,75,199,2,42,196,194,28,249,22,143,8,195,2,42,249,22,93,199,9,249, -22,79,248,22,144,15,28,249,22,156,9,247,22,168,8,2,34,250,22,136,16, -2,75,199,2,42,196,9,28,249,22,143,8,195,2,42,249,22,93,197,194,249, -22,79,248,22,144,15,28,249,22,156,9,247,22,168,8,2,34,250,22,136,16, -2,75,199,2,42,196,194,28,249,22,143,8,197,2,42,249,22,93,195,9,249, -22,79,248,22,144,15,28,249,22,156,9,247,22,168,8,2,34,250,22,136,16, -2,75,201,2,42,198,9,86,95,28,28,248,22,135,8,23,195,2,10,248,22, -146,7,23,195,2,12,250,22,129,10,2,7,6,21,21,40,111,114,47,99,32, -98,121,116,101,115,63,32,115,116,114,105,110,103,63,41,23,197,2,28,28,248, -22,88,23,196,2,249,22,4,22,135,15,23,197,2,11,12,250,22,129,10,2, -7,6,14,14,40,108,105,115,116,111,102,32,112,97,116,104,63,41,23,198,2, -250,2,74,23,198,1,23,196,1,28,248,22,146,7,23,198,2,248,22,160,8, -23,198,1,23,197,1,86,94,28,28,248,22,135,15,23,195,2,10,28,248,22, -146,7,23,195,2,28,248,22,157,15,23,195,2,10,248,22,158,15,23,195,2, -11,12,250,22,129,10,23,196,2,2,39,23,197,2,28,248,22,157,15,23,195, -2,12,251,22,131,10,23,197,1,2,43,2,37,23,198,1,86,94,28,28,248, -22,135,15,23,195,2,10,28,248,22,146,7,23,195,2,28,248,22,157,15,23, -195,2,10,248,22,158,15,23,195,2,11,12,250,22,129,10,23,196,2,2,39, -23,197,2,28,248,22,157,15,23,195,2,12,251,22,131,10,23,197,1,2,43, -2,37,23,198,1,86,94,86,94,28,28,248,22,135,15,23,195,2,10,28,248, -22,146,7,23,195,2,28,248,22,157,15,23,195,2,10,248,22,158,15,23,195, -2,11,12,250,22,129,10,23,196,2,2,39,23,197,2,28,248,22,157,15,23, -195,2,86,94,23,194,1,12,251,22,131,10,23,197,2,2,43,2,37,23,198, -1,249,22,3,20,20,94,88,163,8,36,37,47,11,9,223,2,33,79,23,195, -1,23,197,1,28,28,248,22,0,23,195,2,249,22,50,23,196,2,37,11,12, -250,22,129,10,23,196,1,2,44,23,197,1,86,94,28,28,248,22,135,15,23, -194,2,10,28,248,22,146,7,23,194,2,28,248,22,157,15,23,194,2,10,248, -22,158,15,23,194,2,11,12,250,22,129,10,2,11,2,39,23,196,2,28,248, -22,157,15,23,194,2,12,251,22,131,10,2,11,2,43,2,37,23,197,1,86, -95,86,94,86,94,28,28,248,22,135,15,23,196,2,10,28,248,22,146,7,23, -196,2,28,248,22,157,15,23,196,2,10,248,22,158,15,23,196,2,11,12,250, -22,129,10,2,11,2,39,23,198,2,28,248,22,157,15,23,196,2,12,251,22, -131,10,2,11,2,43,2,37,23,199,2,249,22,3,32,0,88,163,8,36,37, -46,11,9,222,33,82,23,198,2,28,28,248,22,0,23,195,2,249,22,50,23, -196,2,37,11,12,250,22,129,10,2,11,2,44,23,197,2,251,80,158,40,46, -23,198,1,23,199,1,23,200,1,11,86,94,28,28,248,22,135,15,23,194,2, -10,28,248,22,146,7,23,194,2,28,248,22,157,15,23,194,2,10,248,22,158, -15,23,194,2,11,12,250,22,129,10,2,13,2,39,23,196,2,28,248,22,157, -15,23,194,2,12,251,22,131,10,2,13,2,43,2,37,23,197,1,86,96,86, -94,28,28,248,22,135,15,23,196,2,10,28,248,22,146,7,23,196,2,28,248, -22,157,15,23,196,2,10,248,22,158,15,23,196,2,11,12,250,22,129,10,2, -13,2,39,23,198,2,28,248,22,157,15,23,196,2,12,251,22,131,10,2,13, -2,43,2,37,23,199,2,86,94,86,94,28,28,248,22,135,15,23,197,2,10, -28,248,22,146,7,23,197,2,28,248,22,157,15,23,197,2,10,248,22,158,15, -23,197,2,11,12,250,22,129,10,2,13,2,39,23,199,2,28,248,22,157,15, -23,197,2,12,251,22,131,10,2,13,2,43,2,37,23,200,2,249,22,3,32, -0,88,163,8,36,37,46,11,9,222,33,84,23,199,2,28,28,248,22,0,23, -195,2,249,22,50,23,196,2,37,11,12,250,22,129,10,2,13,2,44,23,197, -2,251,80,158,40,46,23,198,1,23,200,1,23,201,1,23,199,1,0,6,45, -105,110,102,46,48,27,248,22,175,15,2,45,27,28,248,22,158,15,23,195,2, -23,194,1,20,13,159,80,159,38,53,37,250,80,159,41,54,37,249,22,33,11, -80,159,43,53,37,22,176,15,248,22,175,15,68,111,114,105,103,45,100,105,114, -27,248,22,175,15,2,46,250,80,159,42,40,39,195,23,198,1,11,28,23,193, -2,250,22,153,15,23,196,1,6,6,6,99,111,110,102,105,103,6,10,10,108, -105,110,107,115,46,114,107,116,100,11,86,94,28,248,22,128,12,23,197,2,27, -247,22,152,10,28,249,22,144,10,194,2,47,251,22,148,10,196,2,47,250,22, -130,8,2,48,28,201,80,159,46,48,38,80,159,46,51,38,248,22,188,11,23, -205,2,247,22,29,12,12,28,248,22,128,12,23,197,2,86,94,23,196,1,248, -23,194,1,247,22,140,2,195,2,86,86,95,28,248,22,128,12,23,198,2,27, -247,22,152,10,28,249,22,144,10,194,2,47,251,22,148,10,196,2,47,250,22, -130,8,2,48,28,23,203,2,80,159,47,48,38,80,159,47,51,38,248,22,188, -11,23,206,2,247,22,29,12,12,28,23,193,2,28,23,195,1,86,94,20,18, -159,11,80,158,39,49,247,22,140,2,20,18,159,11,80,158,39,50,23,193,1, -86,94,20,18,159,11,80,158,39,55,247,22,140,2,20,18,159,11,80,158,39, -56,23,193,1,86,94,23,195,1,12,28,248,22,128,12,23,198,2,86,94,23, -197,1,248,23,195,1,247,22,140,2,196,20,20,94,248,22,141,6,193,28,248, -22,141,7,248,22,141,6,194,12,248,22,189,9,6,30,30,101,120,112,101,99, -116,101,100,32,97,32,115,105,110,103,108,101,32,83,45,101,120,112,114,101,115, -115,105,111,110,248,22,129,6,23,194,1,28,248,22,88,193,28,28,249,22,128, -4,38,248,22,92,195,10,249,22,128,4,39,248,22,92,195,28,28,248,22,146, -7,248,22,80,194,10,249,22,156,9,64,114,111,111,116,248,22,179,17,195,28, -27,248,22,104,194,28,248,22,135,15,193,10,28,248,22,146,7,193,28,248,22, -157,15,193,10,248,22,158,15,193,11,27,248,22,87,248,22,106,195,28,192,192, -248,22,137,16,248,22,113,195,11,11,11,11,250,22,158,2,23,197,1,23,198, -1,249,22,79,23,198,1,23,201,1,28,28,248,22,87,248,22,106,23,197,2, -10,249,22,128,16,248,22,113,23,198,2,247,22,164,8,27,248,22,162,15,249, -22,160,15,248,22,104,23,200,2,23,198,1,28,248,22,64,248,22,80,23,198, -2,86,94,23,196,1,86,94,28,250,22,160,2,23,197,2,11,11,12,250,22, -158,2,23,197,2,11,9,249,22,164,2,23,196,2,20,20,95,88,163,8,36, -38,50,11,9,224,3,2,33,94,23,195,1,23,196,1,27,248,22,67,248,22, -179,17,23,199,1,250,22,158,2,23,198,2,23,196,2,249,22,79,248,22,131, -2,23,200,1,250,22,160,2,23,203,1,23,201,1,9,12,250,22,158,2,23, -196,1,23,197,1,248,22,94,23,199,1,20,13,159,80,159,37,58,37,88,163, -36,37,54,8,240,0,144,0,0,9,225,1,0,2,33,88,27,250,22,170,15, -28,196,80,159,41,48,38,80,159,41,51,38,11,32,0,88,163,8,36,36,41, -11,9,222,33,89,28,249,22,130,4,194,28,195,80,158,40,50,80,158,40,56, -20,13,159,80,159,38,58,37,88,163,36,37,55,8,240,0,240,24,0,9,226, -2,1,3,0,33,90,20,13,159,80,159,38,53,37,26,29,80,159,8,31,54, -37,249,22,33,11,80,159,8,33,53,37,22,169,14,10,22,170,14,10,22,171, -14,10,22,174,14,10,22,173,14,10,22,175,14,10,22,172,14,10,22,176,14, -10,22,177,14,10,22,178,14,10,22,179,14,10,22,180,14,10,22,181,14,11, -22,167,14,11,27,249,22,184,5,28,196,80,159,41,48,38,80,159,41,51,38, -66,98,105,110,97,114,121,27,250,22,46,22,37,88,163,8,36,36,44,11,9, -223,4,33,91,88,163,36,36,43,11,9,223,4,33,92,86,94,28,28,248,22, -88,193,249,22,4,32,0,88,163,8,36,37,45,11,9,222,33,93,194,11,12, -248,22,189,9,6,18,18,105,108,108,45,102,111,114,109,101,100,32,99,111,110, +11,27,248,22,164,15,248,22,80,23,196,2,27,249,22,157,15,23,196,1,23, +203,2,28,248,22,151,15,23,194,2,86,95,23,201,1,23,195,1,250,2,65, +23,205,1,23,206,1,23,196,1,86,94,23,193,1,251,2,69,23,205,1,23, +206,1,23,207,1,248,22,81,23,200,1,86,95,28,28,248,22,139,15,23,195, +2,10,28,248,22,146,7,23,195,2,28,248,22,161,15,23,195,2,10,248,22, +162,15,23,195,2,11,12,250,22,133,10,2,6,2,39,23,197,2,28,28,23, +195,2,28,28,248,22,139,15,23,196,2,10,28,248,22,146,7,23,196,2,28, +248,22,161,15,23,196,2,10,248,22,162,15,23,196,2,11,248,22,161,15,23, +196,2,11,10,12,250,22,133,10,2,6,6,45,45,40,111,114,47,99,32,35, +102,32,40,97,110,100,47,99,32,112,97,116,104,45,115,116,114,105,110,103,63, +32,114,101,108,97,116,105,118,101,45,112,97,116,104,63,41,41,23,198,2,28, +28,248,22,161,15,23,195,2,90,159,39,11,89,161,39,36,11,248,22,160,15, +23,198,2,249,22,160,9,194,2,40,11,27,248,22,168,8,5,4,80,65,84, +72,27,28,23,194,2,249,80,158,40,41,249,22,158,8,23,198,1,7,63,9, +86,94,23,194,1,9,27,28,249,22,160,9,247,22,172,8,2,34,249,22,79, +248,22,148,15,5,1,46,23,196,1,23,194,1,28,248,22,87,23,194,2,11, +27,248,22,164,15,248,22,80,23,196,2,27,249,22,157,15,23,196,1,23,201, +2,28,248,22,151,15,23,194,2,86,95,23,199,1,23,195,1,250,2,65,23, +203,1,23,204,1,23,196,1,86,94,23,193,1,27,248,22,81,23,197,1,28, +248,22,87,23,194,2,11,27,248,22,164,15,248,22,80,23,196,2,27,249,22, +157,15,23,196,1,23,204,2,28,248,22,151,15,23,194,2,86,95,23,202,1, +23,195,1,250,2,65,23,206,1,23,207,1,23,196,1,86,94,23,193,1,27, +248,22,81,23,197,1,28,248,22,87,23,194,2,11,27,248,22,164,15,248,22, +80,23,196,2,27,249,22,157,15,23,196,1,23,207,2,28,248,22,151,15,23, +194,2,86,95,23,205,1,23,195,1,250,2,65,23,209,1,23,210,1,23,196, +1,86,94,23,193,1,251,2,69,23,209,1,23,210,1,23,211,1,248,22,81, +23,200,1,27,248,22,164,15,23,196,1,28,248,22,151,15,23,194,2,250,2, +65,23,199,1,23,200,1,23,196,1,11,250,80,159,39,40,39,196,197,11,250, +80,159,39,40,39,196,11,11,32,74,88,163,8,36,39,57,11,2,41,222,33, +76,0,8,35,114,120,35,34,92,34,34,27,249,22,128,16,23,197,2,23,198, +2,28,23,193,2,86,94,23,196,1,27,248,22,104,23,195,2,27,27,248,22, +113,23,197,1,27,249,22,128,16,23,201,2,23,196,2,28,23,193,2,86,94, +23,194,1,27,248,22,104,23,195,2,27,250,2,74,23,203,2,23,204,1,248, +22,113,23,199,1,28,249,22,143,8,23,196,2,2,42,249,22,93,23,202,2, +194,249,22,79,248,22,148,15,28,249,22,160,9,247,22,172,8,2,34,250,22, +140,16,2,75,23,200,1,2,42,23,197,1,194,86,95,23,199,1,23,193,1, +28,249,22,143,8,23,196,2,2,42,249,22,93,23,200,2,9,249,22,79,248, +22,148,15,28,249,22,160,9,247,22,172,8,2,34,250,22,140,16,2,75,23, +200,1,2,42,23,197,1,9,28,249,22,143,8,23,196,2,2,42,249,22,93, +197,194,86,94,23,196,1,249,22,79,248,22,148,15,28,249,22,160,9,247,22, +172,8,2,34,250,22,140,16,2,75,23,200,1,2,42,23,197,1,194,86,94, +23,193,1,28,249,22,143,8,23,198,2,2,42,249,22,93,195,9,86,94,23, +194,1,249,22,79,248,22,148,15,28,249,22,160,9,247,22,172,8,2,34,250, +22,140,16,2,75,23,202,1,2,42,23,199,1,9,86,95,28,28,248,22,135, +8,23,195,2,10,248,22,146,7,23,195,2,12,250,22,133,10,2,7,6,21, +21,40,111,114,47,99,32,98,121,116,101,115,63,32,115,116,114,105,110,103,63, +41,23,197,2,28,28,248,22,88,23,196,2,249,22,4,22,139,15,23,197,2, +11,12,250,22,133,10,2,7,6,14,14,40,108,105,115,116,111,102,32,112,97, +116,104,63,41,23,198,2,250,2,74,23,198,1,23,196,1,28,248,22,146,7, +23,198,2,248,22,160,8,23,198,1,23,197,1,86,94,28,28,248,22,139,15, +23,195,2,10,28,248,22,146,7,23,195,2,28,248,22,161,15,23,195,2,10, +248,22,162,15,23,195,2,11,12,250,22,133,10,23,196,2,2,39,23,197,2, +28,248,22,161,15,23,195,2,12,251,22,135,10,23,197,1,2,43,2,37,23, +198,1,86,94,28,28,248,22,139,15,23,195,2,10,28,248,22,146,7,23,195, +2,28,248,22,161,15,23,195,2,10,248,22,162,15,23,195,2,11,12,250,22, +133,10,23,196,2,2,39,23,197,2,28,248,22,161,15,23,195,2,12,251,22, +135,10,23,197,1,2,43,2,37,23,198,1,86,94,86,94,28,28,248,22,139, +15,23,195,2,10,28,248,22,146,7,23,195,2,28,248,22,161,15,23,195,2, +10,248,22,162,15,23,195,2,11,12,250,22,133,10,23,196,2,2,39,23,197, +2,28,248,22,161,15,23,195,2,86,94,23,194,1,12,251,22,135,10,23,197, +2,2,43,2,37,23,198,1,249,22,3,20,20,94,88,163,8,36,37,47,11, +9,223,2,33,79,23,195,1,23,197,1,28,28,248,22,0,23,195,2,249,22, +50,23,196,2,37,11,12,250,22,133,10,23,196,1,2,44,23,197,1,86,94, +28,28,248,22,139,15,23,194,2,10,28,248,22,146,7,23,194,2,28,248,22, +161,15,23,194,2,10,248,22,162,15,23,194,2,11,12,250,22,133,10,2,11, +2,39,23,196,2,28,248,22,161,15,23,194,2,12,251,22,135,10,2,11,2, +43,2,37,23,197,1,86,95,86,94,86,94,28,28,248,22,139,15,23,196,2, +10,28,248,22,146,7,23,196,2,28,248,22,161,15,23,196,2,10,248,22,162, +15,23,196,2,11,12,250,22,133,10,2,11,2,39,23,198,2,28,248,22,161, +15,23,196,2,12,251,22,135,10,2,11,2,43,2,37,23,199,2,249,22,3, +32,0,88,163,8,36,37,46,11,9,222,33,82,23,198,2,28,28,248,22,0, +23,195,2,249,22,50,23,196,2,37,11,12,250,22,133,10,2,11,2,44,23, +197,2,251,80,158,40,46,23,198,1,23,199,1,23,200,1,11,86,94,28,28, +248,22,139,15,23,194,2,10,28,248,22,146,7,23,194,2,28,248,22,161,15, +23,194,2,10,248,22,162,15,23,194,2,11,12,250,22,133,10,2,13,2,39, +23,196,2,28,248,22,161,15,23,194,2,12,251,22,135,10,2,13,2,43,2, +37,23,197,1,86,96,86,94,28,28,248,22,139,15,23,196,2,10,28,248,22, +146,7,23,196,2,28,248,22,161,15,23,196,2,10,248,22,162,15,23,196,2, +11,12,250,22,133,10,2,13,2,39,23,198,2,28,248,22,161,15,23,196,2, +12,251,22,135,10,2,13,2,43,2,37,23,199,2,86,94,86,94,28,28,248, +22,139,15,23,197,2,10,28,248,22,146,7,23,197,2,28,248,22,161,15,23, +197,2,10,248,22,162,15,23,197,2,11,12,250,22,133,10,2,13,2,39,23, +199,2,28,248,22,161,15,23,197,2,12,251,22,135,10,2,13,2,43,2,37, +23,200,2,249,22,3,32,0,88,163,8,36,37,46,11,9,222,33,84,23,199, +2,28,28,248,22,0,23,195,2,249,22,50,23,196,2,37,11,12,250,22,133, +10,2,13,2,44,23,197,2,251,80,158,40,46,23,198,1,23,200,1,23,201, +1,23,199,1,0,6,45,105,110,102,46,48,27,248,22,179,15,2,45,27,28, +248,22,162,15,23,195,2,23,194,1,20,13,159,80,159,38,53,37,250,80,159, +41,54,37,249,22,33,11,80,159,43,53,37,22,180,15,248,22,179,15,68,111, +114,105,103,45,100,105,114,27,248,22,179,15,2,46,250,80,159,42,40,39,23, +196,1,23,198,1,11,28,23,193,2,250,22,157,15,23,196,1,6,6,6,99, +111,110,102,105,103,6,10,10,108,105,110,107,115,46,114,107,116,100,11,86,94, +28,248,22,132,12,23,197,2,27,247,22,156,10,28,249,22,148,10,23,195,2, +2,47,251,22,152,10,23,197,1,2,47,250,22,130,8,2,48,28,23,202,1, +80,159,46,48,38,80,159,46,51,38,248,22,128,12,23,205,2,247,22,29,12, +12,28,248,22,132,12,23,197,2,86,94,23,196,1,248,23,194,1,247,22,140, +2,195,2,86,86,95,28,248,22,132,12,23,198,2,27,247,22,156,10,28,249, +22,148,10,23,195,2,2,47,251,22,152,10,23,197,1,2,47,250,22,130,8, +2,48,28,23,203,2,80,159,47,48,38,80,159,47,51,38,248,22,128,12,23, +206,2,247,22,29,12,12,28,23,193,2,28,23,195,1,86,94,20,18,159,11, +80,158,39,49,247,22,140,2,20,18,159,11,80,158,39,50,23,193,1,86,94, +20,18,159,11,80,158,39,55,247,22,140,2,20,18,159,11,80,158,39,56,23, +193,1,86,94,23,195,1,12,28,248,22,132,12,23,198,2,86,94,23,197,1, +248,23,195,1,247,22,140,2,196,20,20,94,248,22,141,6,23,194,2,28,248, +22,141,7,248,22,141,6,23,195,1,12,248,22,129,10,6,30,30,101,120,112, +101,99,116,101,100,32,97,32,115,105,110,103,108,101,32,83,45,101,120,112,114, +101,115,115,105,111,110,248,22,129,6,23,194,1,28,248,22,88,23,194,2,28, +28,249,22,128,4,38,248,22,92,23,196,2,10,249,22,128,4,39,248,22,92, +23,196,2,28,28,248,22,146,7,248,22,80,23,195,2,10,249,22,160,9,64, +114,111,111,116,248,22,183,17,23,196,2,28,27,248,22,104,194,28,248,22,139, +15,23,194,2,10,28,248,22,146,7,23,194,2,28,248,22,161,15,23,194,2, +10,248,22,162,15,23,194,1,11,27,248,22,87,248,22,106,195,28,192,192,248, +22,141,16,248,22,113,195,11,11,11,11,250,22,158,2,23,197,1,23,198,1, +249,22,79,23,198,1,23,201,1,28,28,248,22,87,248,22,106,23,197,2,10, +249,22,132,16,248,22,113,23,198,2,247,22,164,8,27,248,22,166,15,249,22, +164,15,248,22,104,23,200,2,23,198,1,28,248,22,64,248,22,80,23,198,2, +86,94,23,196,1,86,94,28,250,22,160,2,23,197,2,11,11,12,250,22,158, +2,23,197,2,11,9,249,22,164,2,23,196,2,20,20,95,88,163,8,36,38, +50,11,9,224,3,2,33,94,23,195,1,23,196,1,27,248,22,67,248,22,183, +17,23,199,1,250,22,158,2,23,198,2,23,196,2,249,22,79,248,22,131,2, +23,200,1,250,22,160,2,23,203,1,23,201,1,9,12,250,22,158,2,23,196, +1,23,197,1,248,22,94,23,199,1,20,13,159,80,159,37,58,37,88,163,36, +37,54,8,240,0,144,0,0,9,225,1,0,2,33,88,27,250,22,174,15,28, +23,197,2,80,159,41,48,38,80,159,41,51,38,11,32,0,88,163,8,36,36, +41,11,9,222,33,89,28,249,22,130,4,23,195,2,28,23,196,2,80,158,40, +50,80,158,40,56,20,13,159,80,159,38,58,37,20,20,94,88,163,36,37,55, +8,240,0,240,24,0,9,226,2,1,3,0,33,90,23,196,1,20,13,159,80, +159,38,53,37,26,29,80,159,8,31,54,37,249,22,33,11,80,159,8,33,53, +37,22,173,14,10,22,174,14,10,22,175,14,10,22,178,14,10,22,177,14,10, +22,179,14,10,22,176,14,10,22,180,14,10,22,181,14,10,22,182,14,10,22, +183,14,10,22,184,14,10,22,185,14,11,22,171,14,11,27,249,22,184,5,28, +196,80,159,41,48,38,80,159,41,51,38,66,98,105,110,97,114,121,27,250,22, +46,22,37,88,163,8,36,36,44,11,9,223,4,33,91,20,20,94,88,163,36, +36,43,11,9,223,4,33,92,23,197,1,86,94,28,28,248,22,88,23,194,2, +249,22,4,32,0,88,163,8,36,37,45,11,9,222,33,93,23,195,2,11,12, +248,22,129,10,6,18,18,105,108,108,45,102,111,114,109,101,100,32,99,111,110, 116,101,110,116,27,247,22,140,2,27,90,159,39,11,89,161,39,36,11,248,22, -156,15,28,201,80,159,46,48,38,80,159,46,51,38,192,86,96,249,22,3,88, -163,8,36,37,54,11,9,224,2,3,33,95,196,249,22,164,2,195,88,163,8, -36,38,48,11,9,223,3,33,96,28,197,86,94,20,18,159,11,80,158,42,49, -193,20,18,159,11,80,158,42,50,196,86,94,20,18,159,11,80,158,42,55,193, -20,18,159,11,80,158,42,56,196,193,28,193,80,158,38,49,80,158,38,55,248, -22,9,20,20,94,88,163,8,32,37,8,40,8,240,0,240,94,0,9,224,1, -2,33,97,23,195,1,0,7,35,114,120,34,47,43,34,28,248,22,146,7,23, -195,2,27,249,22,190,15,2,99,23,197,2,28,23,193,2,28,249,22,128,4, -248,22,103,23,196,2,248,22,182,3,248,22,149,7,23,199,2,249,22,7,250, -22,168,7,23,200,1,36,248,22,103,23,199,1,23,198,1,249,22,7,250,22, -168,7,23,200,2,36,248,22,103,23,199,2,249,22,79,249,22,168,7,23,201, -1,248,22,105,23,200,1,23,200,1,249,22,7,23,197,1,23,198,1,90,159, -39,11,89,161,39,36,11,248,22,156,15,23,198,1,86,94,23,195,1,28,249, -22,156,9,23,195,2,2,40,86,94,23,193,1,249,22,7,23,196,1,23,200, -1,27,249,22,79,23,197,1,23,201,1,28,248,22,146,7,23,195,2,27,249, -22,190,15,2,99,23,197,2,28,23,193,2,28,249,22,128,4,248,22,103,23, -196,2,248,22,182,3,248,22,149,7,23,199,2,249,22,7,250,22,168,7,23, -200,1,36,248,22,103,23,199,1,23,196,1,249,22,7,250,22,168,7,23,200, -2,36,248,22,103,23,199,2,249,22,79,249,22,168,7,23,201,1,248,22,105, -23,200,1,23,198,1,249,22,7,23,197,1,23,196,1,90,159,39,11,89,161, -39,36,11,248,22,156,15,23,198,1,86,94,23,195,1,28,249,22,156,9,23, -195,2,2,40,86,94,23,193,1,249,22,7,23,196,1,23,198,1,249,80,159, -45,59,39,194,249,22,79,197,199,32,101,88,163,36,43,8,27,11,65,99,108, -111,111,112,222,33,110,32,102,88,163,8,36,37,47,11,2,41,222,33,105,32, -103,88,163,36,37,43,11,69,116,111,45,115,116,114,105,110,103,222,33,104,28, -248,22,135,15,23,194,2,248,22,139,15,23,194,1,192,28,248,22,87,248,22, -81,194,248,22,89,248,2,103,248,22,179,17,195,250,22,90,248,2,103,248,22, -179,17,197,2,50,248,2,102,248,22,180,17,197,249,22,130,8,2,51,23,195, -1,32,107,88,163,36,38,48,11,66,102,105,108,116,101,114,222,33,108,28,248, -22,87,23,195,2,9,28,248,23,194,2,248,22,80,23,196,2,249,22,79,248, -22,179,17,196,249,2,107,196,248,22,180,17,198,249,2,107,23,195,1,248,22, -180,17,23,197,1,249,22,130,8,2,51,248,22,134,2,23,196,1,28,248,22, -87,23,199,2,86,94,23,198,1,28,23,199,2,86,97,23,196,1,23,195,1, -23,194,1,23,193,1,28,23,197,2,249,22,153,15,23,201,1,23,199,1,198, -27,28,248,22,87,23,197,2,2,49,249,22,1,22,169,7,248,2,102,23,199, -2,248,23,198,1,251,22,130,8,6,70,70,99,111,108,108,101,99,116,105,111, -110,32,110,111,116,32,102,111,117,110,100,10,32,32,99,111,108,108,101,99,116, -105,111,110,58,32,126,115,10,32,32,105,110,32,99,111,108,108,101,99,116,105, -111,110,32,100,105,114,101,99,116,111,114,105,101,115,58,126,97,126,97,28,248, -22,87,23,202,1,248,2,103,23,201,1,250,22,169,7,248,2,103,23,204,1, -2,50,23,201,2,249,22,1,22,169,7,249,22,2,32,0,88,163,8,36,37, -44,11,9,222,33,106,249,2,107,22,135,15,23,205,2,28,249,22,5,22,133, -2,23,201,2,250,22,130,8,6,49,49,10,32,32,32,115,117,98,45,99,111, -108,108,101,99,116,105,111,110,58,32,126,115,10,32,32,105,110,32,112,97,114, -101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,58,126,97,23,201,1, -249,22,1,22,169,7,249,22,2,32,0,88,163,8,36,37,45,11,9,222,33, -109,249,2,107,22,133,2,23,208,1,86,95,23,199,1,23,198,1,2,49,27, -248,22,80,23,200,2,27,28,248,22,135,15,23,195,2,249,22,153,15,23,196, -1,23,198,2,248,22,134,2,23,195,1,28,28,248,22,135,15,248,22,80,23, -202,2,248,22,148,15,23,194,2,10,27,250,22,1,22,153,15,23,197,1,23, -201,2,28,28,248,22,87,23,199,2,10,248,22,148,15,23,194,2,28,23,200, -2,28,28,248,22,147,15,249,22,153,15,23,196,2,23,203,2,10,27,28,248, -22,135,15,23,202,2,248,22,139,15,23,202,2,23,201,2,19,248,22,149,7, -194,27,28,249,22,132,4,23,196,4,40,28,249,22,152,7,6,4,4,46,114, -107,116,249,22,168,7,198,249,22,184,3,23,200,4,40,249,22,169,7,250,22, -168,7,199,36,249,22,184,3,23,201,4,40,6,3,3,46,115,115,11,11,28, -192,248,22,147,15,249,22,153,15,23,199,2,195,11,2,86,99,23,202,1,23, -201,1,23,199,1,23,198,1,23,197,1,23,196,1,28,23,200,2,249,22,153, -15,23,195,1,23,202,1,192,254,2,101,23,203,1,23,204,1,23,205,1,23, -206,1,23,207,1,248,22,81,23,209,1,28,23,209,2,86,94,23,200,1,23, -209,1,86,94,23,209,1,23,200,1,28,23,200,2,249,22,153,15,23,195,1, -23,202,1,192,254,2,101,23,203,1,23,204,1,23,205,1,23,206,1,23,207, -1,248,22,81,23,209,1,23,209,1,86,94,23,193,1,254,2,101,23,202,1, -23,203,1,23,204,1,23,205,1,23,206,1,248,22,81,23,208,1,23,208,1, -90,159,38,11,89,161,38,36,11,249,80,159,40,59,39,23,199,1,23,200,1, -27,248,22,67,28,248,22,135,15,23,196,2,248,22,139,15,23,196,2,23,195, -2,27,247,22,181,15,27,250,22,93,28,23,197,2,28,247,22,180,15,27,248, -80,159,46,57,39,10,27,250,22,160,2,196,23,203,2,11,28,192,192,250,22, -160,2,196,11,9,9,9,28,23,197,1,28,80,159,44,51,38,27,248,80,159, -46,57,39,11,27,250,22,160,2,196,23,203,1,11,28,192,192,250,22,160,2, -196,11,9,86,94,23,198,1,9,9,247,22,177,15,254,2,101,23,200,2,23, -203,1,23,204,1,23,206,1,23,209,1,23,200,1,11,86,95,28,28,248,22, -136,15,23,194,2,10,28,248,22,135,15,23,194,2,10,28,248,22,146,7,23, -194,2,28,248,22,157,15,23,194,2,10,248,22,158,15,23,194,2,11,12,252, -22,129,10,23,200,2,2,33,36,23,198,2,23,199,2,28,28,248,22,146,7, -23,195,2,10,248,22,135,8,23,195,2,86,94,23,194,1,12,252,22,129,10, -23,200,2,2,52,37,23,198,2,23,199,1,90,159,39,11,89,161,39,36,11, -248,22,156,15,23,197,2,86,94,23,195,1,86,94,28,23,193,2,86,95,23, -198,1,23,196,1,12,250,22,132,10,23,201,1,2,53,23,199,1,249,22,7, -23,195,1,23,196,1,90,159,38,11,89,161,38,36,11,86,95,28,28,248,22, -136,15,23,196,2,10,28,248,22,135,15,23,196,2,10,28,248,22,146,7,23, -196,2,28,248,22,157,15,23,196,2,10,248,22,158,15,23,196,2,11,12,252, -22,129,10,2,27,2,33,36,23,200,2,23,201,2,28,28,248,22,146,7,23, -197,2,10,248,22,135,8,23,197,2,12,252,22,129,10,2,27,2,52,37,23, -200,2,23,201,2,90,159,39,11,89,161,39,36,11,248,22,156,15,23,199,2, -86,94,28,192,12,250,22,132,10,2,27,2,53,23,201,2,249,22,7,194,195, -27,249,22,145,15,250,22,135,16,0,20,35,114,120,35,34,40,63,58,91,46, -93,91,94,46,93,42,124,41,36,34,248,22,141,15,23,201,1,28,248,22,146, -7,23,203,2,249,22,161,8,23,204,1,8,63,23,202,1,28,248,22,136,15, -23,199,2,248,22,137,15,23,199,1,86,94,23,198,1,247,22,138,15,28,248, -22,135,15,23,195,2,249,22,153,15,23,196,1,23,195,1,192,90,159,38,11, -89,161,38,36,11,86,95,28,28,248,22,136,15,23,196,2,10,28,248,22,135, -15,23,196,2,10,28,248,22,146,7,23,196,2,28,248,22,157,15,23,196,2, -10,248,22,158,15,23,196,2,11,12,252,22,129,10,2,28,2,33,36,23,200, -2,23,201,2,28,28,248,22,146,7,23,197,2,10,248,22,135,8,23,197,2, -12,252,22,129,10,2,28,2,52,37,23,200,2,23,201,2,90,159,39,11,89, -161,39,36,11,248,22,156,15,23,199,2,86,94,28,192,12,250,22,132,10,2, -28,2,53,23,201,2,249,22,7,194,195,27,249,22,145,15,249,22,147,8,250, -22,136,16,0,9,35,114,120,35,34,91,46,93,34,248,22,141,15,23,203,1, -6,1,1,95,28,248,22,146,7,23,202,2,249,22,161,8,23,203,1,8,63, -23,201,1,28,248,22,136,15,23,199,2,248,22,137,15,23,199,1,86,94,23, -198,1,247,22,138,15,28,248,22,135,15,23,195,2,249,22,153,15,23,196,1, -23,195,1,192,249,247,22,173,5,23,195,1,11,249,247,22,173,5,194,11,28, -248,22,87,23,195,2,9,27,248,22,80,23,196,2,27,28,248,22,159,15,23, -195,2,23,194,1,28,248,22,158,15,23,195,2,249,22,160,15,23,196,1,250, -80,159,43,40,39,248,22,175,15,2,46,11,10,250,80,159,41,40,39,248,22, -175,15,2,46,23,197,1,10,28,23,193,2,249,22,79,248,22,162,15,249,22, -160,15,197,247,22,176,15,248,80,159,41,8,30,39,248,22,81,199,86,94,23, -193,1,248,80,159,39,8,30,39,248,22,81,23,198,1,28,248,22,87,23,195, -2,9,27,248,22,80,23,196,2,27,28,248,22,159,15,23,195,2,23,194,1, -28,248,22,158,15,23,195,2,249,22,160,15,23,196,1,250,80,159,43,40,39, -248,22,175,15,2,46,11,10,250,80,159,41,40,39,248,22,175,15,2,46,23, -197,1,10,28,23,193,2,249,22,79,248,22,162,15,249,22,160,15,197,247,22, -176,15,248,80,159,41,8,31,39,248,22,81,199,86,94,23,193,1,248,80,159, -39,8,31,39,248,22,81,23,198,1,28,248,22,87,23,195,2,9,27,248,22, -80,23,196,2,27,28,248,22,159,15,23,195,2,23,194,1,28,248,22,158,15, -23,195,2,249,22,160,15,23,196,1,250,80,159,43,40,39,248,22,175,15,2, -46,11,10,250,80,159,41,40,39,248,22,175,15,2,46,23,197,1,10,28,23, -193,2,249,22,79,248,22,162,15,249,22,160,15,197,247,22,176,15,27,248,22, -81,199,28,248,22,87,193,9,27,248,22,80,194,27,28,248,22,159,15,194,193, -28,248,22,158,15,194,249,22,160,15,195,250,80,159,48,40,39,248,22,175,15, -2,46,11,10,250,80,159,46,40,39,248,22,175,15,2,46,196,10,28,192,249, -22,79,248,22,162,15,249,22,160,15,197,247,22,176,15,248,80,159,46,8,32, -39,248,22,81,198,248,80,159,44,8,32,39,248,22,81,196,86,94,23,193,1, -27,248,22,81,23,198,1,28,248,22,87,23,194,2,9,27,248,22,80,23,195, -2,27,28,248,22,159,15,23,195,2,23,194,1,28,248,22,158,15,23,195,2, -249,22,160,15,23,196,1,250,80,159,46,40,39,248,22,175,15,2,46,11,10, -250,80,159,44,40,39,248,22,175,15,2,46,23,197,1,10,28,23,193,2,249, -22,79,248,22,162,15,249,22,160,15,197,247,22,176,15,248,80,159,44,8,32, -39,248,22,81,198,86,94,23,193,1,248,80,159,42,8,32,39,248,22,81,23, -197,1,27,247,22,180,15,249,80,159,39,41,38,28,23,195,2,27,248,22,166, -8,2,54,28,192,192,2,49,2,49,27,28,23,196,1,250,22,153,15,248,22, -175,15,2,55,247,22,164,8,2,56,11,27,248,80,159,42,8,30,39,250,22, -93,9,248,22,89,248,22,175,15,2,45,9,28,193,249,22,79,195,194,192,27, -247,22,180,15,249,80,159,39,41,38,28,23,195,2,27,248,22,166,8,2,54, -28,192,192,2,49,2,49,27,28,23,196,1,250,22,153,15,248,22,175,15,2, -55,247,22,164,8,2,56,11,27,248,80,159,42,8,31,39,250,22,93,23,203, -1,248,22,89,248,22,175,15,2,45,9,28,193,249,22,79,195,194,192,27,247, -22,180,15,249,80,159,39,41,38,28,23,195,2,27,248,22,166,8,2,54,28, -192,192,2,49,2,49,27,28,23,196,1,250,22,153,15,248,22,175,15,2,55, -247,22,164,8,2,56,11,27,248,80,159,42,8,32,39,250,22,93,23,203,1, -248,22,89,248,22,175,15,2,45,23,204,1,28,193,249,22,79,195,194,192,27, -20,13,159,80,159,37,53,37,254,80,159,44,54,37,249,22,33,11,80,159,46, -53,37,22,173,14,10,22,180,14,10,22,181,14,10,248,22,141,6,23,196,2, -28,248,22,141,7,23,194,2,12,86,94,248,22,164,9,23,194,1,27,20,13, -159,80,159,38,53,37,254,80,159,45,54,37,249,22,33,11,80,159,47,53,37, -22,173,14,10,22,180,14,10,22,181,14,10,248,22,141,6,23,197,2,28,248, -22,141,7,23,194,2,12,86,94,248,22,164,9,23,194,1,27,20,13,159,80, -159,39,53,37,254,80,159,46,54,37,249,22,33,11,80,159,48,53,37,22,173, -14,10,22,180,14,10,22,181,14,10,248,22,141,6,23,198,2,28,248,22,141, -7,23,194,2,12,86,94,248,22,164,9,23,194,1,248,80,159,40,8,33,39, -23,198,1,86,94,249,22,132,7,247,22,169,5,23,196,2,248,22,156,6,249, -22,136,4,36,249,22,184,3,23,198,1,23,199,1,27,28,23,197,2,86,95, -23,196,1,23,195,1,23,197,1,86,94,23,197,1,27,248,22,175,15,2,46, -27,250,80,159,42,40,39,196,11,11,27,248,22,139,4,23,199,1,27,28,193, -193,36,27,248,22,139,4,23,202,1,27,28,193,193,36,249,22,136,6,198,88, -163,8,36,36,48,11,9,224,4,2,33,124,27,248,22,185,5,23,195,1,248, -80,159,39,8,33,39,23,194,1,159,36,20,114,159,36,16,1,11,16,0,20, -26,145,9,2,1,2,1,29,11,11,11,11,9,9,11,11,11,10,43,80,158, -36,36,20,114,159,40,16,30,2,2,2,3,2,4,2,5,2,6,2,7,2, -8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,30,2, -20,76,102,105,110,100,45,108,105,110,107,115,45,112,97,116,104,33,11,4,30, -2,21,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45, -107,101,121,11,6,30,2,21,1,23,101,120,116,101,110,100,45,112,97,114,97, -109,101,116,101,114,105,122,97,116,105,111,110,11,3,2,22,2,23,2,24,30, -2,20,1,21,101,120,99,101,112,116,105,111,110,45,104,97,110,100,108,101,114, -45,107,101,121,11,2,2,25,2,26,2,27,2,28,2,29,2,30,2,31,16, -0,37,39,36,16,0,36,16,13,2,9,2,10,2,8,2,3,2,26,2,24, -2,22,2,17,2,23,2,25,2,15,2,14,2,16,49,11,11,11,16,13,2, -13,2,11,2,31,2,12,2,6,2,30,2,29,2,4,2,28,2,7,2,27, -2,2,2,5,16,13,11,11,11,11,11,11,11,11,11,11,11,11,11,16,13, -2,13,2,11,2,31,2,12,2,6,2,30,2,29,2,4,2,28,2,7,2, -27,2,2,2,5,49,49,37,12,11,11,16,0,16,0,16,0,36,36,11,12, -11,11,16,0,16,0,16,0,36,36,16,30,20,15,16,2,32,0,88,163,36, -37,45,11,2,2,222,33,57,80,159,36,36,37,20,15,16,2,249,22,148,7, -7,92,7,92,80,159,36,37,37,20,15,16,2,88,163,36,37,54,38,2,4, -223,0,33,62,80,159,36,38,37,20,15,16,2,88,163,36,38,58,38,2,5, -223,0,33,64,80,159,36,39,37,20,15,16,2,20,25,96,2,6,88,163,8, -36,39,8,25,8,32,9,223,0,33,71,88,163,36,38,47,52,9,223,0,33, -72,88,163,36,37,46,52,9,223,0,33,73,80,159,36,40,37,20,15,16,2, -27,248,22,184,15,248,22,160,8,27,28,249,22,156,9,247,22,168,8,2,34, -6,1,1,59,6,1,1,58,250,22,130,8,6,14,14,40,91,94,126,97,93, -42,41,126,97,40,46,42,41,195,195,88,163,8,36,38,48,11,2,7,223,0, +160,15,28,201,80,159,46,48,38,80,159,46,51,38,192,86,96,249,22,3,20, +20,94,88,163,8,36,37,54,11,9,224,2,3,33,95,23,195,1,23,197,1, +249,22,164,2,195,88,163,8,36,38,48,11,9,223,3,33,96,28,197,86,94, +20,18,159,11,80,158,42,49,193,20,18,159,11,80,158,42,50,196,86,94,20, +18,159,11,80,158,42,55,193,20,18,159,11,80,158,42,56,196,193,28,193,80, +158,38,49,80,158,38,55,248,22,9,20,20,94,88,163,8,32,37,8,40,8, +240,0,240,94,0,9,224,1,2,33,97,23,195,1,0,7,35,114,120,34,47, +43,34,28,248,22,146,7,23,195,2,27,249,22,130,16,2,99,23,197,2,28, +23,193,2,28,249,22,128,4,248,22,103,23,196,2,248,22,182,3,248,22,149, +7,23,199,2,249,22,7,250,22,168,7,23,200,1,36,248,22,103,23,199,1, +23,198,1,249,22,7,250,22,168,7,23,200,2,36,248,22,103,23,199,2,249, +22,79,249,22,168,7,23,201,1,248,22,105,23,200,1,23,200,1,249,22,7, +23,197,1,23,198,1,90,159,39,11,89,161,39,36,11,248,22,160,15,23,198, +1,86,94,23,195,1,28,249,22,160,9,23,195,2,2,40,86,94,23,193,1, +249,22,7,23,196,1,23,200,1,27,249,22,79,23,197,1,23,201,1,28,248, +22,146,7,23,195,2,27,249,22,130,16,2,99,23,197,2,28,23,193,2,28, +249,22,128,4,248,22,103,23,196,2,248,22,182,3,248,22,149,7,23,199,2, +249,22,7,250,22,168,7,23,200,1,36,248,22,103,23,199,1,23,196,1,249, +22,7,250,22,168,7,23,200,2,36,248,22,103,23,199,2,249,22,79,249,22, +168,7,23,201,1,248,22,105,23,200,1,23,198,1,249,22,7,23,197,1,23, +196,1,90,159,39,11,89,161,39,36,11,248,22,160,15,23,198,1,86,94,23, +195,1,28,249,22,160,9,23,195,2,2,40,86,94,23,193,1,249,22,7,23, +196,1,23,198,1,249,80,159,45,59,39,194,249,22,79,197,199,32,101,88,163, +36,43,8,27,11,65,99,108,111,111,112,222,33,110,32,102,88,163,8,36,37, +47,11,2,41,222,33,105,32,103,88,163,36,37,43,11,69,116,111,45,115,116, +114,105,110,103,222,33,104,28,248,22,139,15,23,194,2,248,22,143,15,23,194, +1,192,28,248,22,87,248,22,81,23,195,2,248,22,89,248,2,103,248,22,183, +17,23,196,1,250,22,90,248,2,103,248,22,183,17,23,198,2,2,50,248,2, +102,248,22,184,17,23,198,1,249,22,130,8,2,51,23,195,1,32,107,88,163, +36,38,48,11,66,102,105,108,116,101,114,222,33,108,28,248,22,87,23,195,2, +9,28,248,23,194,2,248,22,80,23,196,2,249,22,79,248,22,183,17,23,197, +2,249,2,107,23,197,1,248,22,184,17,23,199,1,249,2,107,23,195,1,248, +22,184,17,23,197,1,249,22,130,8,2,51,248,22,134,2,23,196,1,28,248, +22,87,23,199,2,86,94,23,198,1,28,23,199,2,86,97,23,196,1,23,195, +1,23,194,1,23,193,1,28,23,197,2,249,22,157,15,23,201,1,23,199,1, +198,27,28,248,22,87,23,197,2,2,49,249,22,1,22,169,7,248,2,102,23, +199,2,248,23,198,1,251,22,130,8,6,70,70,99,111,108,108,101,99,116,105, +111,110,32,110,111,116,32,102,111,117,110,100,10,32,32,99,111,108,108,101,99, +116,105,111,110,58,32,126,115,10,32,32,105,110,32,99,111,108,108,101,99,116, +105,111,110,32,100,105,114,101,99,116,111,114,105,101,115,58,126,97,126,97,28, +248,22,87,23,202,1,248,2,103,23,201,1,250,22,169,7,248,2,103,23,204, +1,2,50,23,201,2,249,22,1,22,169,7,249,22,2,32,0,88,163,8,36, +37,44,11,9,222,33,106,249,2,107,22,139,15,23,205,2,28,249,22,5,22, +133,2,23,201,2,250,22,130,8,6,49,49,10,32,32,32,115,117,98,45,99, +111,108,108,101,99,116,105,111,110,58,32,126,115,10,32,32,105,110,32,112,97, +114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,58,126,97,23,201, +1,249,22,1,22,169,7,249,22,2,32,0,88,163,8,36,37,45,11,9,222, +33,109,249,2,107,22,133,2,23,208,1,86,95,23,199,1,23,198,1,2,49, +27,248,22,80,23,200,2,27,28,248,22,139,15,23,195,2,249,22,157,15,23, +196,1,23,198,2,248,22,134,2,23,195,1,28,28,248,22,139,15,248,22,80, +23,202,2,248,22,152,15,23,194,2,10,27,250,22,1,22,157,15,23,197,1, +23,201,2,28,28,248,22,87,23,199,2,10,248,22,152,15,23,194,2,28,23, +200,2,28,28,248,22,151,15,249,22,157,15,23,196,2,23,203,2,10,27,28, +248,22,139,15,23,202,2,248,22,143,15,23,202,2,23,201,2,19,248,22,149, +7,23,195,2,27,28,249,22,132,4,23,196,4,40,28,249,22,152,7,6,4, +4,46,114,107,116,249,22,168,7,23,199,2,249,22,184,3,23,200,4,40,249, +22,169,7,250,22,168,7,23,200,1,36,249,22,184,3,23,201,4,40,6,3, +3,46,115,115,86,95,23,195,1,23,194,1,11,11,28,23,193,2,248,22,151, +15,249,22,157,15,23,199,2,23,196,1,11,2,86,99,23,202,1,23,201,1, +23,199,1,23,198,1,23,197,1,23,196,1,28,23,200,2,249,22,157,15,23, +195,1,23,202,1,192,254,2,101,23,203,1,23,204,1,23,205,1,23,206,1, +23,207,1,248,22,81,23,209,1,28,23,209,2,86,94,23,200,1,23,209,1, +86,94,23,209,1,23,200,1,28,23,200,2,249,22,157,15,23,195,1,23,202, +1,192,254,2,101,23,203,1,23,204,1,23,205,1,23,206,1,23,207,1,248, +22,81,23,209,1,23,209,1,86,94,23,193,1,254,2,101,23,202,1,23,203, +1,23,204,1,23,205,1,23,206,1,248,22,81,23,208,1,23,208,1,90,159, +38,11,89,161,38,36,11,249,80,159,40,59,39,23,199,1,23,200,1,27,248, +22,67,28,248,22,139,15,23,196,2,248,22,143,15,23,196,2,23,195,2,27, +247,22,185,15,27,250,22,93,28,23,197,2,28,247,22,184,15,27,248,80,159, +46,57,39,10,27,250,22,160,2,23,197,2,23,203,2,11,28,23,193,2,192, +86,94,23,193,1,250,22,160,2,23,197,1,11,9,9,9,28,23,197,1,28, +80,159,44,51,38,27,248,80,159,46,57,39,11,27,250,22,160,2,23,197,2, +23,203,1,11,28,23,193,2,192,86,94,23,193,1,250,22,160,2,23,197,1, +11,9,86,94,23,198,1,9,9,247,22,181,15,254,2,101,23,200,2,23,203, +1,23,204,1,23,206,1,23,209,1,23,200,1,11,86,95,28,28,248,22,140, +15,23,194,2,10,28,248,22,139,15,23,194,2,10,28,248,22,146,7,23,194, +2,28,248,22,161,15,23,194,2,10,248,22,162,15,23,194,2,11,12,252,22, +133,10,23,200,2,2,33,36,23,198,2,23,199,2,28,28,248,22,146,7,23, +195,2,10,248,22,135,8,23,195,2,86,94,23,194,1,12,252,22,133,10,23, +200,2,2,52,37,23,198,2,23,199,1,90,159,39,11,89,161,39,36,11,248, +22,160,15,23,197,2,86,94,23,195,1,86,94,28,23,193,2,86,95,23,198, +1,23,196,1,12,250,22,136,10,23,201,1,2,53,23,199,1,249,22,7,23, +195,1,23,196,1,90,159,38,11,89,161,38,36,11,86,95,28,28,248,22,140, +15,23,196,2,10,28,248,22,139,15,23,196,2,10,28,248,22,146,7,23,196, +2,28,248,22,161,15,23,196,2,10,248,22,162,15,23,196,2,11,12,252,22, +133,10,2,27,2,33,36,23,200,2,23,201,2,28,28,248,22,146,7,23,197, +2,10,248,22,135,8,23,197,2,12,252,22,133,10,2,27,2,52,37,23,200, +2,23,201,2,90,159,39,11,89,161,39,36,11,248,22,160,15,23,199,2,86, +94,23,195,1,86,94,28,192,12,250,22,136,10,2,27,2,53,23,201,2,249, +22,7,194,195,27,249,22,149,15,250,22,139,16,0,20,35,114,120,35,34,40, +63,58,91,46,93,91,94,46,93,42,124,41,36,34,248,22,145,15,23,201,1, +28,248,22,146,7,23,203,2,249,22,161,8,23,204,1,8,63,23,202,1,28, +248,22,140,15,23,199,2,248,22,141,15,23,199,1,86,94,23,198,1,247,22, +142,15,28,248,22,139,15,23,195,2,249,22,157,15,23,196,1,23,195,1,192, +90,159,38,11,89,161,38,36,11,86,95,28,28,248,22,140,15,23,196,2,10, +28,248,22,139,15,23,196,2,10,28,248,22,146,7,23,196,2,28,248,22,161, +15,23,196,2,10,248,22,162,15,23,196,2,11,12,252,22,133,10,2,28,2, +33,36,23,200,2,23,201,2,28,28,248,22,146,7,23,197,2,10,248,22,135, +8,23,197,2,12,252,22,133,10,2,28,2,52,37,23,200,2,23,201,2,90, +159,39,11,89,161,39,36,11,248,22,160,15,23,199,2,86,94,23,195,1,86, +94,28,192,12,250,22,136,10,2,28,2,53,23,201,2,249,22,7,194,195,27, +249,22,149,15,249,22,147,8,250,22,140,16,0,9,35,114,120,35,34,91,46, +93,34,248,22,145,15,23,203,1,6,1,1,95,28,248,22,146,7,23,202,2, +249,22,161,8,23,203,1,8,63,23,201,1,28,248,22,140,15,23,199,2,248, +22,141,15,23,199,1,86,94,23,198,1,247,22,142,15,28,248,22,139,15,23, +195,2,249,22,157,15,23,196,1,23,195,1,192,249,247,22,173,5,23,195,1, +11,249,247,22,173,5,194,11,28,248,22,87,23,195,2,9,27,248,22,80,23, +196,2,27,28,248,22,163,15,23,195,2,23,194,1,28,248,22,162,15,23,195, +2,249,22,164,15,23,196,1,250,80,159,43,40,39,248,22,179,15,2,46,11, +10,250,80,159,41,40,39,248,22,179,15,2,46,23,197,1,10,28,23,193,2, +249,22,79,248,22,166,15,249,22,164,15,23,198,1,247,22,180,15,248,80,159, +41,8,30,39,248,22,81,23,200,1,86,94,23,193,1,248,80,159,39,8,30, +39,248,22,81,23,198,1,28,248,22,87,23,195,2,9,27,248,22,80,23,196, +2,27,28,248,22,163,15,23,195,2,23,194,1,28,248,22,162,15,23,195,2, +249,22,164,15,23,196,1,250,80,159,43,40,39,248,22,179,15,2,46,11,10, +250,80,159,41,40,39,248,22,179,15,2,46,23,197,1,10,28,23,193,2,249, +22,79,248,22,166,15,249,22,164,15,23,198,1,247,22,180,15,248,80,159,41, +8,31,39,248,22,81,23,200,1,86,94,23,193,1,248,80,159,39,8,31,39, +248,22,81,23,198,1,28,248,22,87,23,195,2,9,27,248,22,80,23,196,2, +27,28,248,22,163,15,23,195,2,23,194,1,28,248,22,162,15,23,195,2,249, +22,164,15,23,196,1,250,80,159,43,40,39,248,22,179,15,2,46,11,10,250, +80,159,41,40,39,248,22,179,15,2,46,23,197,1,10,28,23,193,2,249,22, +79,248,22,166,15,249,22,164,15,23,198,1,247,22,180,15,27,248,22,81,23, +200,1,28,248,22,87,23,194,2,9,27,248,22,80,23,195,2,27,28,248,22, +163,15,23,195,2,23,194,1,28,248,22,162,15,23,195,2,249,22,164,15,23, +196,1,250,80,159,48,40,39,248,22,179,15,2,46,11,10,250,80,159,46,40, +39,248,22,179,15,2,46,23,197,1,10,28,23,193,2,249,22,79,248,22,166, +15,249,22,164,15,23,198,1,247,22,180,15,248,80,159,46,8,32,39,248,22, +81,23,199,1,86,94,23,193,1,248,80,159,44,8,32,39,248,22,81,23,197, +1,86,94,23,193,1,27,248,22,81,23,198,1,28,248,22,87,23,194,2,9, +27,248,22,80,23,195,2,27,28,248,22,163,15,23,195,2,23,194,1,28,248, +22,162,15,23,195,2,249,22,164,15,23,196,1,250,80,159,46,40,39,248,22, +179,15,2,46,11,10,250,80,159,44,40,39,248,22,179,15,2,46,23,197,1, +10,28,23,193,2,249,22,79,248,22,166,15,249,22,164,15,23,198,1,247,22, +180,15,248,80,159,44,8,32,39,248,22,81,23,199,1,86,94,23,193,1,248, +80,159,42,8,32,39,248,22,81,23,197,1,27,247,22,184,15,249,80,159,39, +41,38,28,23,195,2,27,248,22,168,8,2,54,28,192,249,22,158,8,194,7, +63,2,49,2,49,27,28,23,196,1,250,22,157,15,248,22,179,15,2,55,247, +22,164,8,2,56,11,27,248,80,159,42,8,30,39,250,22,93,9,248,22,89, +248,22,179,15,2,45,9,28,193,249,22,79,195,194,192,27,247,22,184,15,249, +80,159,39,41,38,28,23,195,2,27,248,22,168,8,2,54,28,192,249,22,158, +8,194,7,63,2,49,2,49,27,28,23,196,1,250,22,157,15,248,22,179,15, +2,55,247,22,164,8,2,56,11,27,248,80,159,42,8,31,39,250,22,93,23, +203,1,248,22,89,248,22,179,15,2,45,9,28,193,249,22,79,195,194,192,27, +247,22,184,15,249,80,159,39,41,38,28,23,195,2,27,248,22,168,8,2,54, +28,192,249,22,158,8,194,7,63,2,49,2,49,27,28,23,196,1,250,22,157, +15,248,22,179,15,2,55,247,22,164,8,2,56,11,27,248,80,159,42,8,32, +39,250,22,93,23,203,1,248,22,89,248,22,179,15,2,45,23,204,1,28,193, +249,22,79,195,194,192,27,20,13,159,80,159,37,53,37,254,80,159,44,54,37, +249,22,33,11,80,159,46,53,37,22,177,14,10,22,184,14,10,22,185,14,10, +248,22,141,6,23,196,2,28,248,22,141,7,23,194,2,12,86,94,248,22,168, +9,23,194,1,27,20,13,159,80,159,38,53,37,254,80,159,45,54,37,249,22, +33,11,80,159,47,53,37,22,177,14,10,22,184,14,10,22,185,14,10,248,22, +141,6,23,197,2,28,248,22,141,7,23,194,2,12,86,94,248,22,168,9,23, +194,1,27,20,13,159,80,159,39,53,37,254,80,159,46,54,37,249,22,33,11, +80,159,48,53,37,22,177,14,10,22,184,14,10,22,185,14,10,248,22,141,6, +23,198,2,28,248,22,141,7,23,194,2,12,86,94,248,22,168,9,23,194,1, +248,80,159,40,8,33,39,23,198,1,86,94,249,22,132,7,247,22,169,5,23, +196,2,248,22,156,6,249,22,136,4,36,249,22,184,3,23,198,1,23,199,1, +27,28,23,197,2,86,95,23,196,1,23,195,1,23,197,1,86,94,23,197,1, +27,248,22,179,15,2,46,27,250,80,159,42,40,39,23,197,1,11,11,27,248, +22,139,4,23,199,1,27,28,23,194,2,23,194,1,86,94,23,194,1,36,27, +248,22,139,4,23,202,1,27,28,23,194,2,23,194,1,86,94,23,194,1,36, +249,22,136,6,23,199,1,20,20,95,88,163,8,36,36,48,11,9,224,4,2, +33,124,23,195,1,23,197,1,27,248,22,185,5,23,195,1,248,80,159,39,8, +33,39,23,194,1,159,36,20,114,159,36,16,1,11,16,0,20,26,145,9,2, +1,2,1,29,11,11,11,11,9,9,11,11,11,10,43,80,158,36,36,20,114, +159,40,16,30,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2, +10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,30,2,20,76,102,105, +110,100,45,108,105,110,107,115,45,112,97,116,104,33,11,4,30,2,21,1,20, +112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,11, +6,30,2,21,1,23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101, +114,105,122,97,116,105,111,110,11,3,2,22,2,23,2,24,30,2,20,1,21, +101,120,99,101,112,116,105,111,110,45,104,97,110,100,108,101,114,45,107,101,121, +11,2,2,25,2,26,2,27,2,28,2,29,2,30,2,31,16,0,37,39,36, +16,0,36,16,13,2,9,2,10,2,8,2,3,2,26,2,24,2,22,2,17, +2,23,2,25,2,15,2,14,2,16,49,11,11,11,16,13,2,13,2,11,2, +31,2,12,2,6,2,30,2,29,2,4,2,28,2,7,2,27,2,2,2,5, +16,13,11,11,11,11,11,11,11,11,11,11,11,11,11,16,13,2,13,2,11, +2,31,2,12,2,6,2,30,2,29,2,4,2,28,2,7,2,27,2,2,2, +5,49,49,37,12,11,11,16,0,16,0,16,0,36,36,11,12,11,11,16,0, +16,0,16,0,36,36,16,30,20,15,16,2,32,0,88,163,36,37,45,11,2, +2,222,33,57,80,159,36,36,37,20,15,16,2,249,22,148,7,7,92,7,92, +80,159,36,37,37,20,15,16,2,88,163,36,37,54,38,2,4,223,0,33,62, +80,159,36,38,37,20,15,16,2,88,163,36,38,58,38,2,5,223,0,33,64, +80,159,36,39,37,20,15,16,2,20,25,96,2,6,88,163,8,36,39,8,25, +8,32,9,223,0,33,71,88,163,36,38,47,52,9,223,0,33,72,88,163,36, +37,46,52,9,223,0,33,73,80,159,36,40,37,20,15,16,2,27,248,22,188, +15,248,22,160,8,27,28,249,22,160,9,247,22,172,8,2,34,6,1,1,59, +6,1,1,58,250,22,130,8,6,14,14,40,91,94,126,97,93,42,41,126,97, +40,46,42,41,23,196,2,23,196,1,88,163,8,36,38,48,11,2,7,223,0, 33,77,80,159,36,41,37,20,15,16,2,32,0,88,163,8,36,38,47,11,2, 8,222,33,78,80,159,36,42,37,20,15,16,2,32,0,88,163,8,36,39,48, 11,2,9,222,33,80,80,159,36,43,37,20,15,16,2,32,0,88,163,8,36, 38,46,11,2,10,222,33,81,80,159,36,44,37,20,15,16,2,88,163,45,39, 49,8,128,16,2,11,223,0,33,83,80,159,36,45,37,20,15,16,2,88,163, 45,40,50,8,128,16,2,13,223,0,33,85,80,159,36,47,37,20,15,16,2, -248,22,175,15,70,108,105,110,107,115,45,102,105,108,101,80,159,36,48,37,20, +248,22,179,15,70,108,105,110,107,115,45,102,105,108,101,80,159,36,48,37,20, 15,16,2,247,22,140,2,80,158,36,49,20,15,16,2,2,86,80,158,36,50, 20,15,16,2,248,80,159,37,52,37,88,163,36,36,49,8,240,16,0,6,0, 9,223,1,33,87,80,159,36,51,37,20,15,16,2,247,22,140,2,80,158,36, @@ -597,10 +616,10 @@ 52,36,38,36,2,31,223,0,33,125,80,159,36,8,29,37,95,29,94,2,18, 68,35,37,107,101,114,110,101,108,11,29,94,2,18,69,35,37,109,105,110,45, 115,116,120,11,2,20,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 10447); + EVAL_ONE_SIZED_STR((char *)expr, 10825); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,51,46,56,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,52,46,50,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,14,0,0,0,1,0,0,15,0,40,0, 57,0,75,0,97,0,120,0,140,0,162,0,171,0,180,0,187,0,196,0,203, 0,0,0,229,1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99, @@ -619,8 +638,8 @@ 16,2,2,5,2,6,38,11,11,11,16,5,2,3,2,7,2,8,2,4,2, 2,16,5,11,11,11,11,11,16,5,2,3,2,7,2,8,2,4,2,2,41, 41,37,12,11,11,16,0,16,0,16,0,36,36,11,12,11,11,16,0,16,0, -16,0,36,36,16,3,20,15,16,6,253,22,139,11,2,3,11,38,36,11,248, -22,89,249,22,79,22,190,10,88,163,36,37,45,44,9,223,9,33,9,80,159, +16,0,36,36,16,3,20,15,16,6,253,22,143,11,2,3,11,38,36,11,248, +22,89,249,22,79,22,130,11,88,163,36,37,45,44,9,223,9,33,9,80,159, 36,36,37,80,159,36,37,37,80,159,36,38,37,80,159,36,39,37,80,159,36, 40,37,20,15,16,2,20,27,158,88,163,36,37,45,44,9,223,0,33,10,88, 163,36,37,45,44,9,223,0,33,11,80,159,36,41,37,20,15,16,2,20,27, @@ -630,17 +649,17 @@ EVAL_ONE_SIZED_STR((char *)expr, 555); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,51,46,56,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,52,46,50,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,89,0,0,0,1,0,0,7,0,18,0, 45,0,51,0,60,0,67,0,89,0,102,0,128,0,145,0,167,0,175,0,187, 0,202,0,218,0,236,0,0,1,12,1,28,1,51,1,63,1,94,1,101,1, 106,1,111,1,129,1,135,1,140,1,145,1,154,1,159,1,163,1,178,1,185, 1,190,1,194,1,199,1,206,1,217,1,224,1,232,1,42,2,108,2,183,2, -2,3,82,3,117,3,197,3,232,3,47,4,82,4,153,4,188,4,92,12,122, -12,173,12,8,13,27,13,41,13,147,13,160,13,53,14,68,15,148,15,10,16, -71,16,79,16,90,16,124,17,138,17,166,17,179,17,118,18,131,18,200,18,222, -18,242,18,48,19,58,19,72,19,103,19,202,19,206,19,52,20,203,26,0,27, -24,27,48,27,0,0,47,31,0,0,66,35,37,98,111,111,116,70,100,108,108, +2,3,105,3,140,3,243,3,22,4,116,4,151,4,245,4,24,5,225,12,255, +12,50,13,141,13,160,13,174,13,76,14,89,14,242,14,53,16,135,16,7,17, +68,17,76,17,87,17,121,18,135,18,163,18,176,18,115,19,128,19,197,19,219, +19,239,19,45,20,55,20,69,20,106,20,205,20,209,20,59,21,53,29,106,29, +130,29,154,29,0,0,153,33,0,0,66,35,37,98,111,111,116,70,100,108,108, 45,115,117,102,102,105,120,1,25,100,101,102,97,117,108,116,45,108,111,97,100, 47,117,115,101,45,99,111,109,112,105,108,101,100,65,113,117,111,116,101,68,35, 37,112,97,114,97,109,122,29,94,2,4,2,5,11,1,20,112,97,114,97,109, @@ -663,368 +682,398 @@ 64,108,111,111,112,63,108,105,98,6,12,12,109,111,100,117,108,101,45,112,97, 116,104,63,66,115,117,98,109,111,100,6,2,2,46,46,6,1,1,46,64,102, 105,108,101,66,112,108,97,110,101,116,6,8,8,109,97,105,110,46,114,107,116, -6,4,4,46,114,107,116,67,105,103,110,111,114,101,100,250,22,153,15,28,249, -22,156,9,23,201,2,2,28,86,94,23,199,1,23,197,1,28,248,22,157,15, -23,200,2,249,22,153,15,23,199,1,23,201,1,249,80,159,43,42,39,23,199, -1,23,201,1,23,200,1,249,80,159,43,43,39,23,198,1,2,29,250,22,153, -15,28,249,22,156,9,23,201,2,2,28,86,94,23,199,1,23,197,1,28,248, -22,157,15,23,200,2,249,22,153,15,23,199,1,23,201,1,249,80,159,43,42, +6,4,4,46,114,107,116,67,105,103,110,111,114,101,100,250,22,157,15,28,249, +22,160,9,23,201,2,2,28,86,94,23,199,1,23,197,1,28,248,22,161,15, +23,200,2,249,22,157,15,23,199,1,23,201,1,249,80,159,43,42,39,23,199, +1,23,201,1,23,200,1,249,80,159,43,43,39,23,198,1,2,29,250,22,157, +15,28,249,22,160,9,23,201,2,2,28,86,94,23,199,1,23,197,1,28,248, +22,161,15,23,200,2,249,22,157,15,23,199,1,23,201,1,249,80,159,43,42, 39,23,199,1,23,201,1,23,200,1,249,80,159,43,43,39,23,198,1,2,29, -252,22,153,15,28,249,22,156,9,23,203,2,2,28,86,94,23,201,1,23,199, -1,28,248,22,157,15,23,202,2,249,22,153,15,23,201,1,23,203,1,249,80, -159,45,42,39,23,201,1,23,203,1,23,202,1,2,30,247,22,169,8,249,80, -159,45,43,39,23,200,1,80,159,45,36,38,252,22,153,15,28,249,22,156,9, -23,203,2,2,28,86,94,23,201,1,23,199,1,28,248,22,157,15,23,202,2, -249,22,153,15,23,201,1,23,203,1,249,80,159,45,42,39,23,201,1,23,203, -1,23,202,1,2,30,247,22,169,8,249,80,159,45,43,39,23,200,1,80,159, -45,36,38,27,252,22,153,15,28,249,22,156,9,200,2,28,200,28,248,22,157, -15,199,249,22,153,15,202,200,249,80,159,47,42,39,202,200,202,2,30,247,22, -169,8,249,80,159,47,43,39,201,80,159,47,36,38,27,250,22,170,15,196,11, -32,0,88,163,8,36,36,41,11,9,222,11,28,192,249,22,79,195,194,11,249, -22,5,20,20,96,88,163,8,36,37,54,8,129,3,9,226,5,3,2,6,33, -46,23,199,1,23,195,1,23,196,1,23,197,1,27,252,22,153,15,28,249,22, -156,9,200,2,28,200,28,248,22,157,15,199,249,22,153,15,202,200,249,80,159, -47,42,39,202,200,202,2,30,247,22,169,8,249,80,159,47,43,39,201,80,159, -47,36,38,27,250,22,170,15,196,11,32,0,88,163,8,36,36,41,11,9,222, -11,28,192,249,22,79,195,194,11,249,22,5,20,20,96,88,163,8,36,37,54, -8,129,3,9,226,5,3,2,6,33,48,23,199,1,23,195,1,23,196,1,23, -197,1,27,250,22,153,15,28,249,22,156,9,198,2,28,198,28,248,22,157,15, -197,249,22,153,15,200,198,249,80,159,45,42,39,200,198,200,249,80,159,45,43, -39,199,2,29,27,250,22,170,15,196,11,32,0,88,163,8,36,36,41,11,9, -222,11,28,192,249,22,79,195,194,11,249,22,5,20,20,96,88,163,8,36,37, -52,8,128,3,9,226,5,3,2,6,33,50,23,199,1,23,195,1,23,196,1, -23,197,1,27,250,22,153,15,28,249,22,156,9,198,2,28,198,28,248,22,157, -15,197,249,22,153,15,200,198,249,80,159,45,42,39,200,198,200,249,80,159,45, -43,39,199,2,29,27,250,22,170,15,196,11,32,0,88,163,8,36,36,41,11, -9,222,11,28,192,249,22,79,195,194,11,249,22,5,20,20,96,88,163,8,36, -37,52,8,128,3,9,226,5,3,2,6,33,52,23,199,1,23,195,1,23,196, -1,23,197,1,86,95,28,248,80,159,37,40,39,23,195,2,12,250,22,129,10, -2,26,6,12,12,112,97,116,104,45,115,116,114,105,110,103,63,23,197,2,28, -28,23,195,2,28,248,22,64,23,196,2,10,28,248,22,88,23,196,2,28,249, -22,130,4,248,22,92,23,198,2,37,28,28,248,22,64,248,22,80,23,197,2, -10,248,22,154,9,248,22,179,17,23,197,2,249,22,4,22,64,248,22,180,17, -23,198,2,11,11,11,10,12,250,22,129,10,2,26,6,71,71,40,111,114,47, -99,32,35,102,32,115,121,109,98,111,108,63,32,40,99,111,110,115,47,99,32, -40,111,114,47,99,32,35,102,32,115,121,109,98,111,108,63,41,32,40,110,111, -110,45,101,109,112,116,121,45,108,105,115,116,111,102,32,115,121,109,98,111,108, -63,41,41,41,23,197,2,27,28,23,196,2,247,22,189,4,11,27,28,23,194, -2,250,22,160,2,80,158,41,41,248,22,149,16,247,22,171,13,11,11,27,28, -23,194,2,250,22,160,2,248,22,81,23,198,2,23,198,2,11,11,28,23,193, -2,86,96,23,197,1,23,195,1,23,194,1,20,13,159,80,159,39,38,37,250, -80,159,42,39,37,249,22,33,11,80,159,44,38,37,22,190,4,248,22,104,23, -197,2,27,248,22,113,23,195,2,20,13,159,80,159,40,38,37,250,80,159,43, -39,37,249,22,33,11,80,159,45,38,37,22,174,5,28,248,22,135,15,23,197, -2,23,196,1,86,94,23,196,1,247,22,176,15,249,247,22,172,5,248,22,80, -23,197,1,23,201,1,86,94,23,193,1,90,159,47,11,89,161,37,36,11,28, -248,22,159,15,23,209,2,23,208,2,27,247,22,174,5,28,192,249,22,160,15, -23,211,2,194,23,209,2,89,161,39,37,11,248,22,156,15,23,209,1,86,94, -23,196,1,89,161,38,40,11,28,23,209,2,27,248,22,140,15,23,197,2,19, -248,22,140,8,194,28,28,249,22,132,4,23,195,4,40,249,22,143,8,2,27, -249,22,146,8,197,249,22,184,3,23,199,4,40,11,249,22,7,23,199,2,248, -22,144,15,249,22,147,8,250,22,146,8,201,36,249,22,184,3,23,203,4,40, -5,3,46,115,115,249,22,7,23,199,2,11,2,249,22,7,23,197,2,11,89, -161,37,42,11,28,249,22,156,9,23,199,2,23,197,2,23,193,2,249,22,153, -15,23,196,2,23,199,2,89,161,37,43,11,28,23,198,2,28,249,22,156,9, -23,200,2,23,197,1,23,193,1,86,94,23,193,1,249,22,153,15,23,196,2, -23,200,2,86,94,23,195,1,11,89,161,37,44,11,28,249,22,156,9,23,196, -2,68,114,101,108,97,116,105,118,101,86,94,23,194,1,2,28,23,194,1,89, -161,37,45,11,247,22,178,15,89,161,37,46,11,247,22,179,15,27,250,22,170, -15,23,203,2,11,32,0,88,163,8,36,36,41,11,9,222,11,27,28,23,194, -2,249,22,79,23,203,2,23,196,1,86,94,23,194,1,11,27,28,23,203,2, -28,23,194,2,11,27,250,22,170,15,23,207,2,11,32,0,88,163,8,36,36, -41,11,9,222,11,28,192,249,22,79,23,206,2,194,11,11,27,28,23,195,2, -23,195,2,23,194,2,27,88,163,36,38,51,8,128,3,62,122,111,225,19,13, -9,33,42,27,88,163,36,38,51,8,128,3,66,97,108,116,45,122,111,225,20, -14,11,33,43,27,88,163,36,38,53,8,129,3,9,225,21,15,11,33,44,27, -88,163,36,38,53,8,129,3,9,225,22,16,13,33,45,27,28,23,200,2,23, -200,2,248,22,154,9,23,200,2,27,28,23,208,2,28,23,200,2,86,94,23, -201,1,23,200,2,248,22,154,9,23,202,1,11,27,28,23,195,2,28,23,197, -1,27,249,22,5,88,163,36,37,48,8,129,3,9,226,28,23,22,18,33,47, -23,217,2,27,28,23,202,2,11,193,28,192,192,28,193,28,23,202,2,28,249, -22,132,4,248,22,81,196,248,22,81,23,205,2,193,11,11,11,11,86,94,23, -197,1,11,28,23,193,2,86,108,23,217,1,23,216,1,23,214,1,23,213,1, -23,211,1,23,210,1,23,209,1,23,208,1,23,201,1,23,200,1,23,199,1, -23,198,1,23,196,1,23,195,1,23,194,1,20,13,159,80,159,8,25,38,37, -250,80,159,8,28,39,37,249,22,33,11,80,159,8,30,38,37,22,190,4,11, -20,13,159,80,159,8,25,38,37,250,80,159,8,28,39,37,249,22,33,11,80, -159,8,30,38,37,22,174,5,28,248,22,135,15,23,216,2,23,215,1,86,94, -23,215,1,247,22,176,15,249,247,22,183,15,248,22,80,23,196,1,23,222,1, -86,94,23,193,1,27,28,23,195,2,28,23,197,1,27,249,22,5,88,163,36, -37,48,8,129,3,9,226,29,24,23,20,33,49,23,218,2,27,28,23,204,2, -11,193,28,192,192,28,193,28,203,28,249,22,132,4,248,22,81,196,248,22,81, -206,193,11,11,11,11,86,94,23,197,1,11,28,23,193,2,86,105,23,218,1, -23,217,1,23,215,1,23,214,1,23,211,1,23,210,1,23,209,1,23,201,1, -23,200,1,23,199,1,23,196,1,23,195,1,20,13,159,80,159,8,26,38,37, -250,80,159,8,29,39,37,249,22,33,11,80,159,8,31,38,37,22,190,4,23, -215,1,20,13,159,80,159,8,26,38,37,250,80,159,8,29,39,37,249,22,33, -11,80,159,8,31,38,37,22,174,5,28,248,22,135,15,23,217,2,23,216,1, -86,94,23,216,1,247,22,176,15,249,247,22,183,15,248,22,80,23,196,1,23, -223,1,86,94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5,88, -163,36,37,48,8,128,3,9,226,30,25,24,20,33,51,23,219,2,27,28,23, -204,2,11,193,28,192,192,28,193,28,23,204,2,28,249,22,132,4,248,22,81, -196,248,22,81,23,207,2,193,11,11,11,86,94,23,210,1,11,86,94,23,201, -1,11,28,23,193,2,86,102,23,216,1,23,215,1,23,213,1,23,212,1,23, -211,1,23,202,1,23,200,1,23,197,1,23,196,1,86,94,27,248,22,80,23, -195,2,28,23,219,2,250,22,158,2,248,22,81,23,30,23,30,250,22,89,198, -11,23,221,2,12,20,13,159,80,159,8,27,38,37,250,80,159,8,30,39,37, -249,22,33,11,80,159,8,32,38,37,22,190,4,11,20,13,159,80,159,8,27, -38,37,250,80,159,8,30,39,37,249,22,33,11,80,159,8,32,38,37,22,174, -5,28,248,22,135,15,23,218,2,23,217,1,86,94,23,217,1,247,22,176,15, -249,247,22,172,5,248,22,179,17,23,196,1,23,224,32,0,0,0,1,86,94, -23,193,1,27,28,23,197,1,28,23,201,1,27,249,22,5,88,163,36,37,48, -8,128,3,9,226,31,26,25,22,33,53,23,220,1,27,28,23,205,2,11,193, -28,192,192,28,193,28,204,28,249,22,132,4,248,22,81,196,248,22,81,23,15, -193,11,11,11,86,96,23,217,1,23,216,1,23,212,1,11,86,94,23,201,1, -11,28,23,193,2,86,95,23,213,1,23,198,1,86,94,27,248,22,80,23,195, -2,28,23,220,2,250,22,158,2,248,22,81,23,31,23,31,250,22,89,198,23, -221,2,23,222,2,12,20,13,159,80,159,8,28,38,37,250,80,159,8,31,39, -37,249,22,33,11,80,159,8,33,38,37,22,190,4,23,217,1,20,13,159,80, -159,8,28,38,37,250,80,159,8,31,39,37,249,22,33,11,80,159,8,33,38, -37,22,174,5,28,248,22,135,15,23,219,2,23,218,1,86,94,23,218,1,247, -22,176,15,249,247,22,172,5,248,22,179,17,23,196,1,23,224,33,0,0,0, -1,86,94,23,193,1,28,28,248,22,77,23,224,32,0,0,0,2,248,22,179, -17,23,224,32,0,0,0,2,10,27,28,23,199,2,86,94,23,215,1,23,214, -1,86,94,23,214,1,23,215,1,28,28,248,22,77,23,224,33,0,0,0,2, -248,22,154,9,248,22,147,15,23,195,2,11,12,20,13,159,80,159,8,29,38, -37,250,80,159,8,32,39,37,249,22,33,11,80,159,8,34,38,37,22,190,4, -28,23,224,35,0,0,0,2,28,23,202,1,11,23,196,2,86,94,23,202,1, -11,20,13,159,80,159,8,29,38,37,250,80,159,8,32,39,37,249,22,33,11, -80,159,8,34,38,37,22,174,5,28,248,22,135,15,23,220,2,23,219,1,86, -94,23,219,1,247,22,176,15,249,247,22,172,5,23,195,1,23,224,34,0,0, -0,1,12,28,23,194,2,250,22,158,2,248,22,81,23,198,1,23,196,1,250, -22,89,23,201,1,23,202,1,23,203,1,12,27,249,22,176,8,80,159,39,47, -38,249,22,191,3,248,22,187,3,248,22,173,2,200,8,128,8,27,28,193,248, -22,176,2,194,11,28,192,27,249,22,102,198,195,28,192,248,22,81,193,11,11, -27,249,22,191,3,248,22,187,3,248,22,173,2,23,199,2,8,128,8,27,249, -22,176,8,80,159,40,47,38,23,196,2,27,28,23,194,2,248,22,176,2,23, -195,1,86,94,23,194,1,11,250,22,177,8,80,159,42,47,38,23,198,1,248, -22,175,2,249,22,79,249,22,79,23,205,1,23,206,1,28,23,199,2,23,199, -1,86,94,23,199,1,9,0,17,35,114,120,34,94,40,46,42,63,41,47,40, -46,42,41,36,34,32,59,88,163,8,36,37,59,11,2,31,222,33,60,27,249, -22,188,15,2,58,195,28,192,249,22,79,248,22,104,195,27,248,22,113,196,27, -249,22,188,15,2,58,195,28,192,249,22,79,248,22,104,195,27,248,22,113,196, -27,249,22,188,15,2,58,195,28,192,249,22,79,248,22,104,195,27,248,22,113, -196,27,249,22,188,15,2,58,195,28,192,249,22,79,248,22,104,195,248,2,59, -248,22,113,196,248,22,89,194,248,22,89,194,248,22,89,194,248,22,89,194,32, -61,88,163,36,37,55,11,2,31,222,33,62,28,248,22,87,248,22,81,23,195, -2,249,22,7,9,248,22,179,17,23,196,1,90,159,38,11,89,161,38,36,11, -27,248,22,180,17,23,197,2,28,248,22,87,248,22,81,194,249,22,7,9,248, -22,179,17,195,90,159,38,11,89,161,38,36,11,27,248,22,180,17,196,28,248, -22,87,248,22,81,194,249,22,7,9,248,22,179,17,195,90,159,38,11,89,161, -38,36,11,248,2,61,248,22,180,17,196,249,22,7,249,22,79,248,22,179,17, -199,196,195,249,22,7,249,22,79,248,22,179,17,199,196,195,249,22,7,249,22, -79,248,22,179,17,23,200,1,23,197,1,23,196,1,27,27,249,22,188,15,2, -58,23,197,2,28,192,249,22,79,248,22,104,195,27,248,22,113,196,27,249,22, -188,15,2,58,195,28,192,249,22,79,248,22,104,195,27,248,22,113,196,27,249, -22,188,15,2,58,195,28,192,249,22,79,248,22,104,195,27,248,22,113,196,27, -249,22,188,15,2,58,195,28,192,249,22,79,248,22,104,195,248,2,59,248,22, -113,196,248,22,89,194,248,22,89,194,248,22,89,194,248,22,89,195,28,23,195, -1,192,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,179,17,23, -196,1,27,248,22,180,17,23,195,2,90,159,38,11,89,161,38,36,11,28,248, -22,87,248,22,81,23,197,2,249,22,7,9,248,22,179,17,23,198,1,27,248, -22,180,17,23,197,2,90,159,38,11,89,161,38,36,11,28,248,22,87,248,22, -81,196,249,22,7,9,248,22,179,17,197,90,159,38,11,89,161,38,36,11,248, -2,61,248,22,180,17,198,249,22,7,249,22,79,248,22,179,17,201,196,195,249, -22,7,249,22,79,248,22,179,17,23,203,1,196,195,249,22,7,249,22,79,248, -22,179,17,23,201,1,23,197,1,23,196,1,28,208,12,20,13,159,80,159,36, -57,37,80,158,36,55,89,161,37,37,10,249,22,191,4,21,94,2,32,6,19, -19,112,108,97,110,101,116,47,114,101,115,111,108,118,101,114,46,114,107,116,1, -27,112,108,97,110,101,116,45,109,111,100,117,108,101,45,110,97,109,101,45,114, -101,115,111,108,118,101,114,12,27,28,23,195,2,28,249,22,156,9,23,197,2, -80,158,39,52,86,94,23,195,1,80,158,37,53,27,248,22,150,5,23,197,2, -27,28,248,22,77,194,248,22,179,17,194,193,28,248,22,135,15,193,90,159,39, -11,89,161,39,36,11,248,22,156,15,196,86,95,20,18,159,11,80,158,42,52, -199,20,18,159,11,80,158,42,53,192,192,11,11,28,23,193,2,192,86,94,23, -193,1,27,247,22,174,5,28,23,193,2,192,86,94,23,193,1,247,22,176,15, -90,159,39,11,89,161,39,36,11,248,22,156,15,23,198,2,86,95,23,195,1, -23,193,1,28,249,22,188,15,0,11,35,114,120,34,91,46,93,115,115,36,34, -248,22,140,15,23,197,1,249,80,159,41,58,39,23,199,1,2,27,196,249,80, -159,38,54,39,195,10,249,22,14,23,196,1,80,159,38,51,38,86,96,28,248, -22,148,5,23,196,2,12,250,22,129,10,2,22,6,21,21,114,101,115,111,108, -118,101,100,45,109,111,100,117,108,101,45,112,97,116,104,63,23,198,2,28,28, -23,196,2,248,22,172,13,23,197,2,10,12,250,22,129,10,2,22,6,20,20, -40,111,114,47,99,32,35,102,32,110,97,109,101,115,112,97,99,101,63,41,23, -199,2,28,24,193,2,248,24,194,1,23,196,2,86,94,23,193,1,12,27,250, -22,160,2,80,159,41,41,38,248,22,149,16,247,22,171,13,11,27,28,23,194, -2,23,194,1,86,94,23,194,1,27,249,22,79,247,22,140,2,247,22,140,2, -86,94,250,22,158,2,80,159,43,41,38,248,22,149,16,247,22,171,13,195,192, -86,94,250,22,158,2,248,22,80,23,197,2,23,200,2,68,100,101,99,108,97, -114,101,100,28,23,198,2,27,28,248,22,77,248,22,150,5,23,200,2,248,22, -149,5,248,22,80,248,22,150,5,23,201,1,23,198,1,27,250,22,160,2,80, -159,44,41,38,248,22,149,16,23,204,1,11,28,23,193,2,27,250,22,160,2, -248,22,81,23,198,1,23,198,2,11,28,23,193,2,250,22,158,2,248,22,180, -17,23,200,1,23,198,1,23,196,1,12,12,12,251,24,197,1,23,198,1,23, -199,1,23,200,1,10,32,71,88,163,36,38,47,11,76,102,108,97,116,116,101, -110,45,115,117,98,45,112,97,116,104,222,33,74,32,72,88,163,36,40,54,11, -2,31,222,33,73,28,248,22,87,23,197,2,28,248,22,87,195,192,249,22,79, -194,248,22,94,197,28,249,22,158,9,248,22,80,23,199,2,2,35,28,248,22, -87,23,196,2,86,95,23,196,1,23,195,1,250,22,189,9,2,22,6,37,37, -116,111,111,32,109,97,110,121,32,34,46,46,34,115,32,105,110,32,115,117,98, -109,111,100,117,108,101,32,112,97,116,104,58,32,126,46,115,250,22,90,2,34, -28,249,22,158,9,23,201,2,2,36,23,199,1,28,248,22,135,15,23,200,2, -23,199,1,249,22,89,28,248,22,64,23,202,2,2,4,2,37,23,201,1,23, -200,1,251,2,72,23,197,1,23,198,1,248,22,81,23,200,1,248,22,180,17, -23,201,1,251,2,72,23,197,1,23,198,1,249,22,79,248,22,179,17,23,203, -2,23,201,1,248,22,180,17,23,201,1,251,2,72,23,197,1,23,198,2,9, -23,198,1,27,249,22,169,7,6,31,31,115,116,97,110,100,97,114,100,45,109, -111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,58,32, -23,197,1,28,23,194,2,250,22,191,9,11,23,196,1,23,197,1,86,94,23, -194,1,248,22,189,9,23,194,1,28,249,22,152,7,194,2,36,2,28,28,249, -22,152,7,194,2,35,62,117,112,192,32,77,88,163,8,36,37,50,11,67,115, -115,45,62,114,107,116,222,33,78,19,248,22,149,7,194,28,249,22,132,4,23, -195,4,39,28,249,22,152,7,6,3,3,46,115,115,249,22,168,7,197,249,22, -184,3,23,199,4,39,249,22,169,7,250,22,168,7,198,36,249,22,184,3,23, -200,4,39,2,40,193,193,2,0,8,35,114,120,34,91,46,93,34,32,80,88, -163,8,36,37,47,11,2,31,222,33,81,28,248,22,87,193,9,250,22,90,6, -4,4,10,32,32,32,248,22,139,15,248,22,105,197,248,2,80,248,22,81,197, -28,249,22,158,9,248,22,81,23,200,2,23,197,1,28,249,22,156,9,248,22, -179,17,23,200,1,23,196,1,251,22,189,9,2,22,6,41,41,99,121,99,108, -101,32,105,110,32,108,111,97,100,105,110,103,10,32,32,97,116,32,112,97,116, -104,58,32,126,97,10,32,32,112,97,116,104,115,58,126,97,23,200,1,249,22, -1,22,169,7,248,2,80,248,22,94,23,201,1,12,12,247,23,193,1,20,13, -159,80,159,43,50,38,249,22,79,249,22,79,248,22,149,16,247,22,171,13,23, -201,1,23,195,1,20,13,159,80,159,43,38,37,250,80,159,46,39,37,249,22, -33,11,80,159,48,38,37,22,189,4,23,198,2,249,247,22,173,5,23,200,1, -27,248,22,67,248,22,139,15,23,201,1,28,23,202,2,28,250,22,160,2,248, -22,80,200,200,11,249,22,79,11,203,249,22,79,194,203,192,86,94,28,248,22, -158,5,23,196,2,12,28,23,197,2,250,22,191,9,11,6,15,15,98,97,100, -32,109,111,100,117,108,101,32,112,97,116,104,23,200,2,250,22,129,10,2,22, -2,33,23,198,2,28,28,248,22,77,23,196,2,249,22,156,9,248,22,179,17, -23,198,2,2,4,11,86,97,23,198,1,23,197,1,23,196,1,23,193,1,248, -22,149,5,248,22,104,23,197,1,28,28,248,22,77,23,196,2,28,249,22,156, -9,248,22,179,17,23,198,2,2,34,28,248,22,77,248,22,104,23,197,2,249, -22,156,9,248,22,108,23,198,2,2,4,11,11,11,86,97,23,198,1,23,197, -1,23,196,1,23,193,1,248,22,149,5,249,2,71,248,22,121,23,199,2,248, -22,106,23,199,1,28,28,248,22,77,23,196,2,28,249,22,156,9,248,22,179, -17,23,198,2,2,34,28,28,249,22,158,9,248,22,104,23,198,2,2,36,10, -249,22,158,9,248,22,104,23,198,2,2,35,28,23,196,2,27,248,22,150,5, -23,198,2,28,248,22,64,193,10,28,248,22,77,193,248,22,64,248,22,179,17, -194,11,11,11,11,11,86,96,23,198,1,23,197,1,23,193,1,27,248,22,150, -5,23,198,1,248,22,149,5,249,2,71,28,248,22,77,23,197,2,248,22,179, -17,23,197,2,23,196,2,27,28,249,22,158,9,248,22,104,23,203,2,2,35, -248,22,180,17,200,248,22,106,200,28,248,22,77,23,198,2,249,22,93,248,22, -180,17,199,194,192,28,28,248,22,77,23,196,2,249,22,156,9,248,22,179,17, -23,198,2,2,38,11,86,94,248,80,159,38,8,28,39,23,194,2,253,24,199, -1,23,201,1,23,202,1,23,203,1,23,204,1,11,80,158,43,55,28,28,248, -22,77,23,196,2,28,249,22,156,9,248,22,179,17,23,198,2,2,34,28,248, -22,77,248,22,104,23,197,2,249,22,156,9,248,22,108,23,198,2,2,38,11, -11,11,86,94,248,80,159,38,8,28,39,23,194,2,253,24,199,1,248,22,104, -23,202,2,23,202,1,23,203,1,23,204,1,248,22,106,23,202,1,80,158,43, -55,27,88,163,8,36,37,47,11,79,115,104,111,119,45,99,111,108,108,101,99, -116,105,111,110,45,101,114,114,223,5,33,75,27,28,248,22,77,197,28,249,22, -156,9,2,34,248,22,179,17,199,27,248,22,104,198,28,28,249,22,158,9,194, -2,36,10,249,22,158,9,194,2,35,28,198,27,248,22,150,5,200,28,248,22, -77,193,248,22,179,17,193,192,250,22,189,9,2,22,6,45,45,110,111,32,98, -97,115,101,32,112,97,116,104,32,102,111,114,32,114,101,108,97,116,105,118,101, -32,115,117,98,109,111,100,117,108,101,32,112,97,116,104,58,32,126,46,115,200, -192,196,196,27,28,248,22,77,198,28,249,22,156,9,2,34,248,22,179,17,200, -27,28,28,28,249,22,158,9,248,22,104,201,2,36,10,249,22,158,9,248,22, -104,201,2,35,199,11,27,248,22,150,5,201,27,28,249,22,158,9,248,22,104, -203,2,35,248,22,180,17,201,248,22,106,201,28,248,22,77,194,249,2,71,248, -22,179,17,196,249,22,93,248,22,180,17,198,196,249,2,71,195,194,249,2,71, -2,36,28,249,22,158,9,248,22,104,203,2,35,248,22,180,17,201,248,22,106, -201,28,248,22,77,193,248,22,180,17,193,11,11,11,27,28,248,22,64,195,27, -248,80,159,43,48,39,249,22,79,198,247,22,177,15,28,192,192,90,159,38,11, -89,161,38,36,11,249,80,159,46,54,39,248,22,70,200,11,27,28,248,22,87, -194,2,39,249,22,169,7,196,2,40,251,80,159,49,59,39,203,28,248,22,87, -198,198,248,22,80,198,28,248,22,87,198,9,248,22,180,17,198,196,28,248,22, -146,7,195,27,248,80,159,43,8,29,39,201,27,248,80,159,44,48,39,249,22, -79,199,196,28,192,192,90,159,38,11,89,161,38,36,11,249,80,159,47,54,39, -200,11,250,22,1,22,153,15,198,249,22,93,249,22,2,32,0,88,163,8,36, -37,44,11,9,222,33,76,199,248,22,89,248,2,77,200,28,248,22,135,15,195, -248,80,159,42,8,30,39,248,22,162,15,28,248,22,159,15,197,196,249,22,160, -15,198,248,80,159,46,8,29,39,204,28,249,22,156,9,248,22,80,197,2,32, -27,248,80,159,43,48,39,249,22,79,198,247,22,177,15,28,192,192,90,159,39, -11,89,161,38,36,11,249,80,159,47,54,39,248,22,104,201,11,89,161,37,38, -11,28,248,22,87,248,22,106,200,28,248,22,87,193,249,22,128,16,2,79,195, -11,10,27,28,195,248,2,77,195,28,248,22,87,194,2,39,28,249,22,128,16, -2,79,196,248,2,77,195,249,22,169,7,196,2,40,27,28,196,249,22,93,28, -248,22,87,248,22,106,204,21,93,6,5,5,109,122,108,105,98,249,22,1,22, -93,249,22,2,80,159,53,8,31,39,248,22,106,23,15,196,28,248,22,87,195, -248,22,89,196,194,251,80,159,51,59,39,205,248,22,80,197,248,22,180,17,197, -197,28,249,22,156,9,248,22,179,17,197,2,37,248,80,159,42,8,30,39,248, -22,162,15,249,22,160,15,248,22,164,15,248,22,104,200,248,80,159,46,8,29, -39,204,12,86,94,28,28,248,22,135,15,193,10,248,22,171,8,193,12,28,200, -250,22,191,9,67,114,101,113,117,105,114,101,249,22,130,8,6,17,17,98,97, -100,32,109,111,100,117,108,101,32,112,97,116,104,126,97,28,197,248,22,80,198, -6,0,0,203,250,22,129,10,2,22,2,33,197,27,28,248,22,171,8,194,249, -22,176,8,195,36,249,22,162,15,248,22,163,15,196,11,27,28,248,22,171,8, -195,249,22,176,8,196,37,248,80,159,44,8,24,39,194,90,159,39,11,89,161, -39,36,11,28,248,22,171,8,198,250,22,7,2,41,249,22,176,8,202,38,2, -41,248,22,156,15,197,27,28,248,22,171,8,199,249,22,176,8,200,39,249,80, -159,49,58,39,196,5,0,27,28,248,22,171,8,200,249,22,176,8,201,40,248, -22,149,5,199,27,250,22,160,2,80,159,52,41,38,248,22,149,16,247,22,171, -13,11,27,28,193,193,27,249,22,79,247,22,140,2,247,22,140,2,86,94,250, -22,158,2,80,159,54,41,38,248,22,149,16,247,22,171,13,195,192,27,28,203, -248,22,149,5,249,22,79,248,22,150,5,199,206,195,86,95,28,23,19,27,250, -22,160,2,248,22,80,198,196,11,28,192,12,27,27,28,248,22,17,80,159,55, -51,38,80,159,54,51,38,247,22,19,251,22,33,11,80,159,58,50,38,9,196, -27,248,22,149,16,247,22,171,13,86,94,249,22,3,88,163,8,36,37,54,11, -9,226,14,13,2,3,33,82,195,248,28,248,22,17,80,159,56,51,38,32,0, -88,163,36,37,42,11,9,222,33,83,80,159,55,8,32,39,88,163,36,36,56, -8,240,12,64,0,0,9,230,19,15,13,12,8,7,5,2,33,84,12,28,28, -248,22,171,8,203,11,28,248,22,146,7,205,10,28,248,22,64,205,10,28,248, -22,77,205,249,22,156,9,248,22,179,17,23,15,2,32,11,249,80,159,53,49, -39,28,248,22,146,7,23,15,249,22,79,23,16,248,80,159,56,8,29,39,23, -22,249,22,79,23,16,247,22,177,15,252,22,173,8,23,16,23,15,205,203,202, -12,192,86,96,20,18,159,11,80,158,36,55,248,80,159,37,8,27,37,249,22, -33,11,80,159,39,57,37,248,22,188,4,80,159,37,56,38,248,22,173,5,80, -159,37,37,39,248,22,168,14,80,159,37,45,39,20,18,159,11,80,158,36,55, -248,80,159,37,8,27,37,249,22,33,11,80,159,39,57,37,20,18,159,11,80, -158,36,55,248,80,159,37,8,27,37,249,22,33,11,80,159,39,57,37,159,36, -20,114,159,36,16,1,11,16,0,20,26,145,9,2,1,2,1,29,11,11,11, -11,9,9,11,11,11,10,38,80,158,36,36,20,114,159,41,16,28,2,2,2, -3,30,2,6,2,7,11,6,30,2,6,1,23,101,120,116,101,110,100,45,112, -97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,11,3,30,2,8,72, -112,97,116,104,45,115,116,114,105,110,103,63,38,196,11,2,9,30,2,8,71, -114,101,114,111,111,116,45,112,97,116,104,40,196,12,30,2,8,75,112,97,116, -104,45,97,100,100,45,115,117,102,102,105,120,40,196,8,2,10,2,11,2,12, -2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,30, -2,23,2,7,11,6,30,2,8,79,112,97,116,104,45,114,101,112,108,97,99, -101,45,115,117,102,102,105,120,40,196,10,30,2,8,73,102,105,110,100,45,99, -111,108,45,102,105,108,101,44,196,3,30,2,8,76,110,111,114,109,97,108,45, -99,97,115,101,45,112,97,116,104,38,196,7,2,24,2,25,30,2,23,74,114, -101,112,97,114,97,109,101,116,101,114,105,122,101,11,7,16,0,37,39,36,16, -0,36,16,15,2,16,2,17,2,9,2,13,2,18,2,19,2,12,2,3,2, -11,2,2,2,14,2,15,2,10,2,20,2,22,51,11,11,11,16,3,2,24, -2,21,2,25,16,3,11,11,11,16,3,2,24,2,21,2,25,39,39,37,12, -11,11,16,0,16,0,16,0,36,36,11,12,11,11,16,0,16,0,16,0,36, -36,16,23,20,15,16,2,248,22,168,8,69,115,111,45,115,117,102,102,105,120, -80,159,36,36,37,20,15,16,2,88,163,36,38,8,43,8,189,3,2,3,223, -0,33,54,80,159,36,37,37,20,15,16,2,32,0,88,163,8,36,41,52,11, -2,10,222,33,55,80,159,36,44,37,20,15,16,2,20,27,158,32,0,88,163, -8,36,37,42,11,2,11,222,192,32,0,88,163,8,36,37,42,11,2,11,222, -192,80,159,36,45,37,20,15,16,2,247,22,143,2,80,159,36,41,37,20,15, -16,2,8,128,8,80,159,36,46,37,20,15,16,2,249,22,172,8,8,128,8, -11,80,159,36,47,37,20,15,16,2,88,163,8,36,37,50,8,128,32,2,14, -223,0,33,56,80,159,36,48,37,20,15,16,2,88,163,8,36,38,55,8,128, -32,2,15,223,0,33,57,80,159,36,49,37,20,15,16,2,247,22,75,80,159, -36,50,37,20,15,16,2,248,22,18,74,109,111,100,117,108,101,45,108,111,97, -100,105,110,103,80,159,36,51,37,20,15,16,2,11,80,158,36,52,20,15,16, -2,11,80,158,36,53,20,15,16,2,32,0,88,163,36,38,8,25,11,2,20, -222,33,63,80,159,36,54,37,20,15,16,2,11,80,158,36,55,20,15,16,2, -88,164,8,34,37,45,8,240,0,0,40,0,1,21,112,114,101,112,45,112,108, -97,110,101,116,45,114,101,115,111,108,118,101,114,33,37,224,1,0,33,64,80, -159,36,8,28,39,20,15,16,2,88,163,36,37,50,8,240,0,0,3,0,67, -103,101,116,45,100,105,114,223,0,33,65,80,159,36,8,29,39,20,15,16,2, -88,163,36,37,49,8,240,0,0,64,0,72,112,97,116,104,45,115,115,45,62, -114,107,116,223,0,33,66,80,159,36,8,30,39,20,15,16,2,88,163,8,36, -37,45,8,240,0,0,4,0,9,223,0,33,67,80,159,36,8,31,39,20,15, -16,2,88,163,36,37,45,8,240,0,128,0,0,9,223,0,33,68,80,159,36, -8,32,39,20,15,16,2,27,11,20,19,158,36,90,159,37,10,89,161,37,36, -10,20,25,96,2,22,88,163,8,36,38,54,8,32,9,224,2,1,33,69,88, -163,36,39,49,11,9,223,0,33,70,88,163,36,40,8,32,16,4,8,240,44, -240,0,0,8,240,204,241,0,0,37,36,9,224,2,1,33,85,207,80,159,36, -56,37,20,15,16,2,88,163,36,36,45,16,2,8,130,8,8,184,32,2,24, -223,0,33,86,80,159,36,8,25,37,20,15,16,2,20,27,158,88,163,8,36, -36,45,16,2,36,8,168,32,2,25,223,0,33,87,88,163,8,36,36,45,16, -2,36,8,168,32,2,25,223,0,33,88,80,159,36,8,26,37,96,29,94,2, -4,68,35,37,107,101,114,110,101,108,11,29,94,2,4,69,35,37,109,105,110, -45,115,116,120,11,2,8,2,23,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 8203); +252,22,157,15,28,249,22,160,9,23,203,2,2,28,86,94,23,201,1,23,199, +1,28,248,22,161,15,23,202,2,249,22,157,15,23,201,1,23,203,1,249,80, +159,45,42,39,23,201,1,23,203,1,23,202,1,2,30,247,22,173,8,249,80, +159,45,43,39,23,200,1,80,159,45,36,38,252,22,157,15,28,249,22,160,9, +23,203,2,2,28,86,94,23,201,1,23,199,1,28,248,22,161,15,23,202,2, +249,22,157,15,23,201,1,23,203,1,249,80,159,45,42,39,23,201,1,23,203, +1,23,202,1,2,30,247,22,173,8,249,80,159,45,43,39,23,200,1,80,159, +45,36,38,27,252,22,157,15,28,249,22,160,9,23,201,2,2,28,86,94,23, +199,1,23,201,1,28,248,22,161,15,23,200,2,249,22,157,15,23,203,1,23, +201,1,249,80,159,47,42,39,23,203,1,23,201,1,23,203,1,2,30,247,22, +173,8,249,80,159,47,43,39,23,202,1,80,159,47,36,38,27,250,22,174,15, +196,11,32,0,88,163,8,36,36,41,11,9,222,11,28,192,249,22,79,195,194, +11,249,22,5,20,20,96,88,163,8,36,37,54,8,129,3,9,226,5,3,2, +6,33,46,23,199,1,23,195,1,23,196,1,23,197,1,27,252,22,157,15,28, +249,22,160,9,23,201,2,2,28,86,94,23,199,1,23,201,1,28,248,22,161, +15,23,200,2,249,22,157,15,23,203,1,23,201,1,249,80,159,47,42,39,23, +203,1,23,201,1,23,203,1,2,30,247,22,173,8,249,80,159,47,43,39,23, +202,1,80,159,47,36,38,27,250,22,174,15,196,11,32,0,88,163,8,36,36, +41,11,9,222,11,28,192,249,22,79,195,194,11,249,22,5,20,20,96,88,163, +8,36,37,54,8,129,3,9,226,5,3,2,6,33,48,23,199,1,23,195,1, +23,196,1,23,197,1,27,250,22,157,15,28,249,22,160,9,23,199,2,2,28, +86,94,23,197,1,23,199,1,28,248,22,161,15,23,198,2,249,22,157,15,23, +201,1,23,199,1,249,80,159,45,42,39,23,201,1,23,199,1,23,201,1,249, +80,159,45,43,39,23,200,1,2,29,27,250,22,174,15,196,11,32,0,88,163, +8,36,36,41,11,9,222,11,28,192,249,22,79,195,194,11,249,22,5,20,20, +96,88,163,8,36,37,52,8,128,3,9,226,5,3,2,6,33,50,23,199,1, +23,195,1,23,196,1,23,197,1,27,250,22,157,15,28,249,22,160,9,23,199, +2,2,28,86,94,23,197,1,23,199,1,28,248,22,161,15,23,198,2,249,22, +157,15,23,201,1,23,199,1,249,80,159,45,42,39,23,201,1,23,199,1,23, +201,1,249,80,159,45,43,39,23,200,1,2,29,27,250,22,174,15,196,11,32, +0,88,163,8,36,36,41,11,9,222,11,28,192,249,22,79,195,194,11,249,22, +5,20,20,96,88,163,8,36,37,52,8,128,3,9,226,5,3,2,6,33,52, +23,199,1,23,195,1,23,196,1,23,197,1,86,95,28,248,80,159,37,40,39, +23,195,2,12,250,22,133,10,2,26,6,12,12,112,97,116,104,45,115,116,114, +105,110,103,63,23,197,2,28,28,23,195,2,28,248,22,64,23,196,2,10,28, +248,22,88,23,196,2,28,249,22,130,4,248,22,92,23,198,2,37,28,28,248, +22,64,248,22,80,23,197,2,10,248,22,158,9,248,22,183,17,23,197,2,249, +22,4,22,64,248,22,184,17,23,198,2,11,11,11,10,12,250,22,133,10,2, +26,6,71,71,40,111,114,47,99,32,35,102,32,115,121,109,98,111,108,63,32, +40,99,111,110,115,47,99,32,40,111,114,47,99,32,35,102,32,115,121,109,98, +111,108,63,41,32,40,110,111,110,45,101,109,112,116,121,45,108,105,115,116,111, +102,32,115,121,109,98,111,108,63,41,41,41,23,197,2,27,28,23,196,2,247, +22,189,4,11,27,28,23,194,2,250,22,160,2,80,158,41,41,248,22,153,16, +247,22,175,13,11,11,27,28,23,194,2,250,22,160,2,248,22,81,23,198,2, +23,198,2,11,11,28,23,193,2,86,96,23,197,1,23,195,1,23,194,1,20, +13,159,80,159,39,38,37,250,80,159,42,39,37,249,22,33,11,80,159,44,38, +37,22,190,4,248,22,104,23,197,2,27,248,22,113,23,195,2,20,13,159,80, +159,40,38,37,250,80,159,43,39,37,249,22,33,11,80,159,45,38,37,22,174, +5,28,248,22,139,15,23,197,2,23,196,1,86,94,23,196,1,247,22,180,15, +249,247,22,172,5,248,22,80,23,197,1,23,201,1,86,94,23,193,1,90,159, +47,11,89,161,37,36,11,28,248,22,163,15,23,209,2,23,208,2,27,247,22, +174,5,28,23,193,2,249,22,164,15,23,211,2,23,195,1,23,209,2,89,161, +39,37,11,248,22,160,15,23,209,1,86,94,23,196,1,89,161,38,40,11,28, +23,209,2,27,248,22,144,15,23,197,2,19,248,22,140,8,23,195,2,28,28, +249,22,132,4,23,195,4,40,249,22,143,8,2,27,249,22,146,8,23,198,2, +249,22,184,3,23,199,4,40,11,249,22,7,23,199,2,248,22,148,15,249,22, +147,8,250,22,146,8,23,202,1,36,249,22,184,3,23,203,4,40,5,3,46, +115,115,249,22,7,23,199,2,11,2,249,22,7,23,197,2,11,89,161,37,42, +11,28,249,22,160,9,23,199,2,23,197,2,23,193,2,249,22,157,15,23,196, +2,23,199,2,89,161,37,43,11,28,23,198,2,28,249,22,160,9,23,200,2, +23,197,1,23,193,1,86,94,23,193,1,249,22,157,15,23,196,2,23,200,2, +86,94,23,195,1,11,89,161,37,44,11,28,249,22,160,9,23,196,2,68,114, +101,108,97,116,105,118,101,86,94,23,194,1,2,28,23,194,1,89,161,37,45, +11,247,22,182,15,89,161,37,46,11,247,22,183,15,27,250,22,174,15,23,203, +2,11,32,0,88,163,8,36,36,41,11,9,222,11,27,28,23,194,2,249,22, +79,23,203,2,23,196,1,86,94,23,194,1,11,27,28,23,203,2,28,23,194, +2,11,27,250,22,174,15,23,207,2,11,32,0,88,163,8,36,36,41,11,9, +222,11,28,192,249,22,79,23,206,2,194,11,11,27,28,23,195,2,23,195,2, +23,194,2,27,88,163,36,38,51,8,128,3,62,122,111,225,19,13,9,33,42, +27,88,163,36,38,51,8,128,3,66,97,108,116,45,122,111,225,20,14,11,33, +43,27,88,163,36,38,53,8,129,3,9,225,21,15,11,33,44,27,88,163,36, +38,53,8,129,3,9,225,22,16,13,33,45,27,28,23,200,2,23,200,2,248, +22,158,9,23,200,2,27,28,23,208,2,28,23,200,2,86,94,23,201,1,23, +200,2,248,22,158,9,23,202,1,11,27,28,23,195,2,28,23,197,1,27,249, +22,5,88,163,36,37,48,8,129,3,9,226,28,23,22,18,33,47,23,217,2, +27,28,23,202,2,11,193,28,192,192,28,193,28,23,202,2,28,249,22,132,4, +248,22,81,196,248,22,81,23,205,2,193,11,11,11,11,86,94,23,197,1,11, +28,23,193,2,86,108,23,217,1,23,216,1,23,214,1,23,213,1,23,211,1, +23,210,1,23,209,1,23,208,1,23,201,1,23,200,1,23,199,1,23,198,1, +23,196,1,23,195,1,23,194,1,20,13,159,80,159,8,25,38,37,250,80,159, +8,28,39,37,249,22,33,11,80,159,8,30,38,37,22,190,4,11,20,13,159, +80,159,8,25,38,37,250,80,159,8,28,39,37,249,22,33,11,80,159,8,30, +38,37,22,174,5,28,248,22,139,15,23,216,2,23,215,1,86,94,23,215,1, +247,22,180,15,249,247,22,187,15,248,22,80,23,196,1,23,222,1,86,94,23, +193,1,27,28,23,195,2,28,23,197,1,27,249,22,5,88,163,36,37,48,8, +129,3,9,226,29,24,23,20,33,49,23,218,2,27,28,23,204,2,11,193,28, +192,192,28,193,28,203,28,249,22,132,4,248,22,81,196,248,22,81,206,193,11, +11,11,11,86,94,23,197,1,11,28,23,193,2,86,105,23,218,1,23,217,1, +23,215,1,23,214,1,23,211,1,23,210,1,23,209,1,23,201,1,23,200,1, +23,199,1,23,196,1,23,195,1,20,13,159,80,159,8,26,38,37,250,80,159, +8,29,39,37,249,22,33,11,80,159,8,31,38,37,22,190,4,23,215,1,20, +13,159,80,159,8,26,38,37,250,80,159,8,29,39,37,249,22,33,11,80,159, +8,31,38,37,22,174,5,28,248,22,139,15,23,217,2,23,216,1,86,94,23, +216,1,247,22,180,15,249,247,22,187,15,248,22,80,23,196,1,23,223,1,86, +94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5,20,20,94,88, +163,36,37,48,8,128,3,9,226,30,25,24,20,33,51,23,213,1,23,219,2, +27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28,249,22,132,4, +248,22,81,196,248,22,81,23,207,2,193,11,11,11,86,94,23,210,1,11,86, +94,23,201,1,11,28,23,193,2,86,102,23,216,1,23,215,1,23,213,1,23, +212,1,23,211,1,23,202,1,23,200,1,23,197,1,23,196,1,86,94,27,248, +22,80,23,195,2,28,23,219,2,250,22,158,2,248,22,81,23,223,1,23,223, +1,250,22,89,23,199,1,11,23,221,2,12,20,13,159,80,159,8,27,38,37, +250,80,159,8,30,39,37,249,22,33,11,80,159,8,32,38,37,22,190,4,11, +20,13,159,80,159,8,27,38,37,250,80,159,8,30,39,37,249,22,33,11,80, +159,8,32,38,37,22,174,5,28,248,22,139,15,23,218,2,23,217,1,86,94, +23,217,1,247,22,180,15,249,247,22,172,5,248,22,183,17,23,196,1,23,224, +32,0,0,0,1,86,94,23,193,1,27,28,23,197,1,28,23,201,1,27,249, +22,5,20,20,95,88,163,36,37,48,8,128,3,9,226,31,26,25,22,33,53, +23,215,1,23,219,1,23,220,1,27,28,23,205,2,11,193,28,192,192,28,193, +28,204,28,249,22,132,4,248,22,81,196,248,22,81,23,15,193,11,11,11,86, +96,23,217,1,23,216,1,23,212,1,11,86,94,23,201,1,11,28,23,193,2, +86,95,23,213,1,23,198,1,86,94,27,248,22,80,23,195,2,28,23,220,2, +250,22,158,2,248,22,81,23,224,32,0,0,0,1,23,224,32,0,0,0,1, +250,22,89,23,199,1,23,221,2,23,222,2,12,20,13,159,80,159,8,28,38, +37,250,80,159,8,31,39,37,249,22,33,11,80,159,8,33,38,37,22,190,4, +23,217,1,20,13,159,80,159,8,28,38,37,250,80,159,8,31,39,37,249,22, +33,11,80,159,8,33,38,37,22,174,5,28,248,22,139,15,23,219,2,23,218, +1,86,94,23,218,1,247,22,180,15,249,247,22,172,5,248,22,183,17,23,196, +1,23,224,33,0,0,0,1,86,94,23,193,1,28,28,248,22,77,23,224,32, +0,0,0,2,248,22,183,17,23,224,32,0,0,0,2,10,27,28,23,199,2, +86,94,23,215,1,23,214,1,86,94,23,214,1,23,215,1,28,28,248,22,77, +23,224,33,0,0,0,2,248,22,158,9,248,22,151,15,23,195,2,11,12,20, +13,159,80,159,8,29,38,37,250,80,159,8,32,39,37,249,22,33,11,80,159, +8,34,38,37,22,190,4,28,23,224,35,0,0,0,2,28,23,202,1,11,23, +196,2,86,94,23,202,1,11,20,13,159,80,159,8,29,38,37,250,80,159,8, +32,39,37,249,22,33,11,80,159,8,34,38,37,22,174,5,28,248,22,139,15, +23,220,2,23,219,1,86,94,23,219,1,247,22,180,15,249,247,22,172,5,23, +195,1,23,224,34,0,0,0,1,12,28,23,194,2,250,22,158,2,248,22,81, +23,198,1,23,196,1,250,22,89,23,201,1,23,202,1,23,203,1,12,27,249, +22,180,8,80,159,39,47,38,249,22,191,3,248,22,187,3,248,22,173,2,200, +8,128,8,27,28,193,248,22,176,2,194,11,28,192,27,249,22,102,198,195,28, +192,248,22,81,193,11,11,27,249,22,191,3,248,22,187,3,248,22,173,2,23, +199,2,8,128,8,27,249,22,180,8,80,159,40,47,38,23,196,2,27,28,23, +194,2,248,22,176,2,23,195,1,86,94,23,194,1,11,250,22,181,8,80,159, +42,47,38,23,198,1,248,22,175,2,249,22,79,249,22,79,23,205,1,23,206, +1,28,23,199,2,23,199,1,86,94,23,199,1,9,0,17,35,114,120,34,94, +40,46,42,63,41,47,40,46,42,41,36,34,32,59,88,163,8,36,37,59,11, +2,31,222,33,60,27,249,22,128,16,2,58,23,196,2,28,23,193,2,86,94, +23,194,1,249,22,79,248,22,104,23,196,2,27,248,22,113,23,197,1,27,249, +22,128,16,2,58,23,196,2,28,23,193,2,86,94,23,194,1,249,22,79,248, +22,104,23,196,2,27,248,22,113,23,197,1,27,249,22,128,16,2,58,23,196, +2,28,23,193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,27,248, +22,113,23,197,1,27,249,22,128,16,2,58,23,196,2,28,23,193,2,86,94, +23,194,1,249,22,79,248,22,104,23,196,2,248,2,59,248,22,113,23,197,1, +248,22,89,194,248,22,89,194,248,22,89,194,248,22,89,194,32,61,88,163,36, +37,55,11,2,31,222,33,62,28,248,22,87,248,22,81,23,195,2,249,22,7, +9,248,22,183,17,23,196,1,90,159,38,11,89,161,38,36,11,27,248,22,184, +17,23,197,2,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,183, +17,195,90,159,38,11,89,161,38,36,11,27,248,22,184,17,196,28,248,22,87, +248,22,81,23,195,2,249,22,7,9,248,22,183,17,195,90,159,38,11,89,161, +38,36,11,248,2,61,248,22,184,17,196,249,22,7,249,22,79,248,22,183,17, +199,196,195,249,22,7,249,22,79,248,22,183,17,199,196,195,249,22,7,249,22, +79,248,22,183,17,23,200,1,23,197,1,23,196,1,27,27,249,22,128,16,2, +58,23,197,2,28,23,193,2,86,94,23,195,1,249,22,79,248,22,104,23,196, +2,27,248,22,113,23,197,1,27,249,22,128,16,2,58,23,196,2,28,23,193, +2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,27,248,22,113,23,197, +1,27,249,22,128,16,2,58,23,196,2,28,23,193,2,86,94,23,194,1,249, +22,79,248,22,104,23,196,2,27,248,22,113,23,197,1,27,249,22,128,16,2, +58,23,196,2,28,23,193,2,86,94,23,194,1,249,22,79,248,22,104,23,196, +2,248,2,59,248,22,113,23,197,1,248,22,89,194,248,22,89,194,248,22,89, +194,248,22,89,195,28,23,195,1,192,28,248,22,87,248,22,81,23,195,2,249, +22,7,9,248,22,183,17,23,196,1,27,248,22,184,17,23,195,2,90,159,38, +11,89,161,38,36,11,28,248,22,87,248,22,81,23,197,2,249,22,7,9,248, +22,183,17,23,198,1,27,248,22,184,17,23,197,2,90,159,38,11,89,161,38, +36,11,28,248,22,87,248,22,81,23,197,2,249,22,7,9,248,22,183,17,197, +90,159,38,11,89,161,38,36,11,248,2,61,248,22,184,17,198,249,22,7,249, +22,79,248,22,183,17,201,196,195,249,22,7,249,22,79,248,22,183,17,23,203, +1,196,195,249,22,7,249,22,79,248,22,183,17,23,201,1,23,197,1,23,196, +1,28,24,194,2,12,20,13,159,80,159,36,57,37,80,158,36,55,89,161,37, +37,10,249,22,191,4,21,94,2,32,6,19,19,112,108,97,110,101,116,47,114, +101,115,111,108,118,101,114,46,114,107,116,1,27,112,108,97,110,101,116,45,109, +111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,12,27, +28,23,195,2,28,249,22,160,9,23,197,2,80,158,39,52,86,94,23,195,1, +80,158,37,53,27,248,22,150,5,23,197,2,27,28,248,22,77,23,195,2,248, +22,183,17,23,195,1,23,194,1,28,248,22,139,15,23,194,2,90,159,39,11, +89,161,39,36,11,248,22,160,15,23,197,1,86,95,20,18,159,11,80,158,42, +52,199,20,18,159,11,80,158,42,53,192,192,11,11,28,23,193,2,192,86,94, +23,193,1,27,247,22,174,5,28,23,193,2,192,86,94,23,193,1,247,22,180, +15,90,159,39,11,89,161,39,36,11,248,22,160,15,23,198,2,86,95,23,195, +1,23,193,1,28,249,22,128,16,0,11,35,114,120,34,91,46,93,115,115,36, +34,248,22,144,15,23,197,1,249,80,159,41,58,39,23,199,1,2,27,196,249, +80,159,38,54,39,195,10,249,22,14,23,196,1,80,159,38,51,38,86,96,28, +248,22,148,5,23,196,2,12,250,22,133,10,2,22,6,21,21,114,101,115,111, +108,118,101,100,45,109,111,100,117,108,101,45,112,97,116,104,63,23,198,2,28, +28,23,196,2,248,22,176,13,23,197,2,10,12,250,22,133,10,2,22,6,20, +20,40,111,114,47,99,32,35,102,32,110,97,109,101,115,112,97,99,101,63,41, +23,199,2,28,24,193,2,248,24,194,1,23,196,2,86,94,23,193,1,12,27, +250,22,160,2,80,159,41,41,38,248,22,153,16,247,22,175,13,11,27,28,23, +194,2,23,194,1,86,94,23,194,1,27,249,22,79,247,22,140,2,247,22,140, +2,86,94,250,22,158,2,80,159,43,41,38,248,22,153,16,247,22,175,13,195, +192,86,94,250,22,158,2,248,22,80,23,197,2,23,200,2,68,100,101,99,108, +97,114,101,100,28,23,198,2,27,28,248,22,77,248,22,150,5,23,200,2,248, +22,149,5,248,22,80,248,22,150,5,23,201,1,23,198,1,27,250,22,160,2, +80,159,44,41,38,248,22,153,16,23,204,1,11,28,23,193,2,27,250,22,160, +2,248,22,81,23,198,1,23,198,2,11,28,23,193,2,250,22,158,2,248,22, +184,17,23,200,1,23,198,1,23,196,1,12,12,12,251,24,197,1,23,198,1, +23,199,1,23,200,1,10,32,71,88,163,36,38,47,11,76,102,108,97,116,116, +101,110,45,115,117,98,45,112,97,116,104,222,33,74,32,72,88,163,36,40,54, +11,2,31,222,33,73,28,248,22,87,23,197,2,28,248,22,87,195,192,249,22, +79,194,248,22,94,197,28,249,22,162,9,248,22,80,23,199,2,2,35,28,248, +22,87,23,196,2,86,95,23,196,1,23,195,1,250,22,129,10,2,22,6,37, +37,116,111,111,32,109,97,110,121,32,34,46,46,34,115,32,105,110,32,115,117, +98,109,111,100,117,108,101,32,112,97,116,104,58,32,126,46,115,250,22,90,2, +34,28,249,22,162,9,23,201,2,2,36,23,199,1,28,248,22,139,15,23,200, +2,23,199,1,249,22,89,28,248,22,64,23,202,2,2,4,2,37,23,201,1, +23,200,1,251,2,72,23,197,1,23,198,1,248,22,81,23,200,1,248,22,184, +17,23,201,1,251,2,72,23,197,1,23,198,1,249,22,79,248,22,183,17,23, +203,2,23,201,1,248,22,184,17,23,201,1,251,2,72,23,197,1,23,198,2, +9,23,198,1,27,249,22,169,7,6,31,31,115,116,97,110,100,97,114,100,45, +109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,58, +32,23,197,1,28,23,194,2,250,22,131,10,11,23,196,1,23,197,1,86,94, +23,194,1,248,22,129,10,23,194,1,28,249,22,152,7,194,2,36,2,28,28, +249,22,152,7,194,2,35,62,117,112,192,32,77,88,163,8,36,37,50,11,67, +115,115,45,62,114,107,116,222,33,78,19,248,22,149,7,194,28,249,22,132,4, +23,195,4,39,28,249,22,152,7,6,3,3,46,115,115,249,22,168,7,197,249, +22,184,3,23,199,4,39,249,22,169,7,250,22,168,7,198,36,249,22,184,3, +23,200,4,39,2,40,193,193,2,0,8,35,114,120,34,91,46,93,34,32,80, +88,163,8,36,37,47,11,2,31,222,33,81,28,248,22,87,23,194,2,9,250, +22,90,6,4,4,10,32,32,32,248,22,143,15,248,22,105,23,198,2,248,2, +80,248,22,81,23,198,1,28,249,22,162,9,248,22,81,23,200,2,23,197,1, +28,249,22,160,9,248,22,183,17,23,200,1,23,196,1,251,22,129,10,2,22, +6,41,41,99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,10,32, +32,97,116,32,112,97,116,104,58,32,126,97,10,32,32,112,97,116,104,115,58, +126,97,23,200,1,249,22,1,22,169,7,248,2,80,248,22,94,23,201,1,12, +12,247,23,193,1,20,13,159,80,159,43,50,38,249,22,79,249,22,79,248,22, +153,16,247,22,175,13,23,201,1,23,195,1,20,13,159,80,159,43,38,37,250, +80,159,46,39,37,249,22,33,11,80,159,48,38,37,22,189,4,23,198,2,249, +247,22,173,5,23,200,1,27,248,22,67,248,22,143,15,23,201,1,28,23,202, +2,28,250,22,160,2,248,22,80,23,201,1,23,201,1,11,249,22,79,11,203, +249,22,79,194,203,192,86,94,28,248,22,158,5,23,196,2,12,28,23,197,2, +250,22,131,10,11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97, +116,104,23,200,2,250,22,133,10,2,22,2,33,23,198,2,28,28,248,22,77, +23,196,2,249,22,160,9,248,22,183,17,23,198,2,2,4,11,86,97,23,198, +1,23,197,1,23,196,1,23,193,1,248,22,149,5,248,22,104,23,197,1,28, +28,248,22,77,23,196,2,28,249,22,160,9,248,22,183,17,23,198,2,2,34, +28,248,22,77,248,22,104,23,197,2,249,22,160,9,248,22,108,23,198,2,2, +4,11,11,11,86,97,23,198,1,23,197,1,23,196,1,23,193,1,248,22,149, +5,249,2,71,248,22,121,23,199,2,248,22,106,23,199,1,28,28,248,22,77, +23,196,2,28,249,22,160,9,248,22,183,17,23,198,2,2,34,28,28,249,22, +162,9,248,22,104,23,198,2,2,36,10,249,22,162,9,248,22,104,23,198,2, +2,35,28,23,196,2,27,248,22,150,5,23,198,2,28,248,22,64,193,10,28, +248,22,77,193,248,22,64,248,22,183,17,194,11,11,11,11,11,86,96,23,198, +1,23,197,1,23,193,1,27,248,22,150,5,23,198,1,248,22,149,5,249,2, +71,28,248,22,77,23,197,2,248,22,183,17,23,197,2,23,196,2,27,28,249, +22,162,9,248,22,104,23,203,2,2,35,248,22,184,17,200,248,22,106,200,28, +248,22,77,23,198,2,249,22,93,248,22,184,17,199,194,192,28,28,248,22,77, +23,196,2,249,22,160,9,248,22,183,17,23,198,2,2,38,11,86,94,248,80, +159,38,8,28,39,23,194,2,253,24,199,1,23,201,1,23,202,1,23,203,1, +23,204,1,11,80,158,43,55,28,28,248,22,77,23,196,2,28,249,22,160,9, +248,22,183,17,23,198,2,2,34,28,248,22,77,248,22,104,23,197,2,249,22, +160,9,248,22,108,23,198,2,2,38,11,11,11,86,94,248,80,159,38,8,28, +39,23,194,2,253,24,199,1,248,22,104,23,202,2,23,202,1,23,203,1,23, +204,1,248,22,106,23,202,1,80,158,43,55,86,94,23,193,1,27,88,163,8, +36,37,47,11,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45, +101,114,114,223,5,33,75,27,28,248,22,77,23,198,2,28,249,22,160,9,2, +34,248,22,183,17,23,200,2,27,248,22,104,23,199,2,28,28,249,22,162,9, +23,195,2,2,36,10,249,22,162,9,23,195,2,2,35,86,94,23,193,1,28, +23,199,2,27,248,22,150,5,23,201,2,28,248,22,77,193,248,22,183,17,193, +192,250,22,129,10,2,22,6,45,45,110,111,32,98,97,115,101,32,112,97,116, +104,32,102,111,114,32,114,101,108,97,116,105,118,101,32,115,117,98,109,111,100, +117,108,101,32,112,97,116,104,58,32,126,46,115,23,201,2,192,23,197,2,23, +197,2,27,28,248,22,77,23,199,2,28,249,22,160,9,2,34,248,22,183,17, +23,201,2,27,28,28,28,249,22,162,9,248,22,104,23,202,2,2,36,10,249, +22,162,9,248,22,104,23,202,2,2,35,23,200,2,11,27,248,22,150,5,23, +202,2,27,28,249,22,162,9,248,22,104,23,204,2,2,35,248,22,184,17,23, +202,1,248,22,106,23,202,1,28,248,22,77,23,195,2,249,2,71,248,22,183, +17,23,197,2,249,22,93,248,22,184,17,23,199,1,23,197,1,249,2,71,23, +196,1,23,195,1,249,2,71,2,36,28,249,22,162,9,248,22,104,23,204,2, +2,35,248,22,184,17,23,202,1,248,22,106,23,202,1,28,248,22,77,193,248, +22,184,17,193,11,11,11,27,28,248,22,64,23,196,2,27,248,80,159,43,48, +39,249,22,79,23,199,2,247,22,181,15,28,23,193,2,192,86,94,23,193,1, +90,159,38,11,89,161,38,36,11,249,80,159,46,54,39,248,22,70,23,201,2, +11,27,28,248,22,87,23,195,2,2,39,249,22,169,7,23,197,2,2,40,251, +80,159,49,59,39,23,204,1,28,248,22,87,23,199,2,23,199,1,86,94,23, +199,1,248,22,80,23,199,2,28,248,22,87,23,199,2,86,94,23,198,1,9, +248,22,184,17,23,199,1,23,197,1,28,248,22,146,7,23,196,2,86,94,23, +196,1,27,248,80,159,43,8,29,39,23,202,2,27,248,80,159,44,48,39,249, +22,79,23,200,2,23,197,2,28,23,193,2,192,86,94,23,193,1,90,159,38, +11,89,161,38,36,11,249,80,159,47,54,39,23,201,2,11,250,22,1,22,157, +15,23,199,1,249,22,93,249,22,2,32,0,88,163,8,36,37,44,11,9,222, +33,76,23,200,1,248,22,89,248,2,77,23,201,1,28,248,22,139,15,23,196, +2,86,94,23,196,1,248,80,159,42,8,30,39,248,22,166,15,28,248,22,163, +15,23,198,2,23,197,2,249,22,164,15,23,199,2,248,80,159,46,8,29,39, +23,205,2,28,249,22,160,9,248,22,80,23,198,2,2,32,27,248,80,159,43, +48,39,249,22,79,23,199,2,247,22,181,15,28,23,193,2,192,86,94,23,193, +1,90,159,39,11,89,161,38,36,11,249,80,159,47,54,39,248,22,104,23,202, +2,11,89,161,37,38,11,28,248,22,87,248,22,106,23,201,2,28,248,22,87, +23,194,2,249,22,132,16,2,79,23,196,2,11,10,27,28,23,196,2,248,2, +77,23,196,2,28,248,22,87,23,195,2,2,39,28,249,22,132,16,2,79,23, +197,2,248,2,77,23,196,2,249,22,169,7,23,197,2,2,40,27,28,23,197, +1,86,94,23,196,1,249,22,93,28,248,22,87,248,22,106,23,205,2,21,93, +6,5,5,109,122,108,105,98,249,22,1,22,93,249,22,2,80,159,53,8,31, +39,248,22,106,23,208,2,23,197,1,28,248,22,87,23,196,2,86,94,23,195, +1,248,22,89,23,197,1,86,94,23,196,1,23,195,1,251,80,159,51,59,39, +23,206,1,248,22,80,23,198,2,248,22,184,17,23,198,1,23,198,1,28,249, +22,160,9,248,22,183,17,23,198,2,2,37,248,80,159,42,8,30,39,248,22, +166,15,249,22,164,15,248,22,168,15,248,22,104,23,201,2,248,80,159,46,8, +29,39,23,205,2,12,86,94,28,28,248,22,139,15,23,194,2,10,248,22,175, +8,23,194,2,86,94,23,201,1,12,28,23,201,2,250,22,131,10,67,114,101, +113,117,105,114,101,249,22,130,8,6,17,17,98,97,100,32,109,111,100,117,108, +101,32,112,97,116,104,126,97,28,23,198,2,248,22,80,23,199,2,6,0,0, +23,204,1,86,94,23,201,1,250,22,133,10,2,22,2,33,23,198,2,27,28, +248,22,175,8,23,195,2,249,22,180,8,23,196,2,36,249,22,166,15,248,22, +167,15,23,197,2,11,27,28,248,22,175,8,23,196,2,249,22,180,8,23,197, +2,37,248,80,159,44,8,24,39,23,195,2,90,159,39,11,89,161,39,36,11, +28,248,22,175,8,23,199,2,250,22,7,2,41,249,22,180,8,23,203,2,38, +2,41,248,22,160,15,23,198,2,86,95,23,195,1,23,193,1,27,28,248,22, +175,8,23,200,2,249,22,180,8,23,201,2,39,249,80,159,49,58,39,23,197, +2,5,0,27,28,248,22,175,8,23,201,2,249,22,180,8,23,202,2,40,248, +22,149,5,23,200,2,27,250,22,160,2,80,159,52,41,38,248,22,153,16,247, +22,175,13,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,22,79, +247,22,140,2,247,22,140,2,86,94,250,22,158,2,80,159,54,41,38,248,22, +153,16,247,22,175,13,195,192,27,28,23,204,2,248,22,149,5,249,22,79,248, +22,150,5,23,200,2,23,207,2,23,196,2,86,95,28,23,212,1,27,250,22, +160,2,248,22,80,23,199,2,196,11,28,23,193,1,12,27,27,28,248,22,17, +80,159,55,51,38,80,159,54,51,38,247,22,19,251,22,33,11,80,159,58,50, +38,9,23,197,1,27,248,22,153,16,247,22,175,13,86,94,249,22,3,20,20, +94,88,163,8,36,37,54,11,9,226,14,13,2,3,33,82,23,195,1,23,196, +2,248,28,248,22,17,80,159,56,51,38,32,0,88,163,36,37,42,11,9,222, +33,83,80,159,55,8,32,39,20,20,96,88,163,36,36,56,8,240,12,64,0, +0,9,230,19,15,13,12,8,7,5,2,33,84,23,195,1,23,198,1,23,208, +1,12,28,28,248,22,175,8,23,204,1,11,28,248,22,146,7,23,206,2,10, +28,248,22,64,23,206,2,10,28,248,22,77,23,206,2,249,22,160,9,248,22, +183,17,23,208,2,2,32,11,249,80,159,53,49,39,28,248,22,146,7,23,208, +2,249,22,79,23,209,1,248,80,159,56,8,29,39,23,215,1,86,94,23,212, +1,249,22,79,23,209,1,247,22,181,15,252,22,177,8,23,209,1,23,208,1, +23,206,1,23,204,1,23,203,1,12,192,86,96,20,18,159,11,80,158,36,55, +248,80,159,37,8,27,37,249,22,33,11,80,159,39,57,37,248,22,188,4,80, +159,37,56,38,248,22,173,5,80,159,37,37,39,248,22,172,14,80,159,37,45, +39,20,18,159,11,80,158,36,55,248,80,159,37,8,27,37,249,22,33,11,80, +159,39,57,37,20,18,159,11,80,158,36,55,248,80,159,37,8,27,37,249,22, +33,11,80,159,39,57,37,159,36,20,114,159,36,16,1,11,16,0,20,26,145, +9,2,1,2,1,29,11,11,11,11,9,9,11,11,11,10,38,80,158,36,36, +20,114,159,41,16,28,2,2,2,3,30,2,6,2,7,11,6,30,2,6,1, +23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116, +105,111,110,11,3,30,2,8,72,112,97,116,104,45,115,116,114,105,110,103,63, +38,196,11,2,9,30,2,8,71,114,101,114,111,111,116,45,112,97,116,104,40, +196,12,30,2,8,75,112,97,116,104,45,97,100,100,45,115,117,102,102,105,120, +40,196,8,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18, +2,19,2,20,2,21,2,22,30,2,23,2,7,11,6,30,2,8,79,112,97, +116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,40,196,10,30, +2,8,73,102,105,110,100,45,99,111,108,45,102,105,108,101,44,196,3,30,2, +8,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,38,196,7, +2,24,2,25,30,2,23,74,114,101,112,97,114,97,109,101,116,101,114,105,122, +101,11,7,16,0,37,39,36,16,0,36,16,15,2,16,2,17,2,9,2,13, +2,18,2,19,2,12,2,3,2,11,2,2,2,14,2,15,2,10,2,20,2, +22,51,11,11,11,16,3,2,24,2,21,2,25,16,3,11,11,11,16,3,2, +24,2,21,2,25,39,39,37,12,11,11,16,0,16,0,16,0,36,36,11,12, +11,11,16,0,16,0,16,0,36,36,16,23,20,15,16,2,248,22,172,8,69, +115,111,45,115,117,102,102,105,120,80,159,36,36,37,20,15,16,2,88,163,36, +38,8,43,8,189,3,2,3,223,0,33,54,80,159,36,37,37,20,15,16,2, +32,0,88,163,8,36,41,52,11,2,10,222,33,55,80,159,36,44,37,20,15, +16,2,20,27,158,32,0,88,163,8,36,37,42,11,2,11,222,192,32,0,88, +163,8,36,37,42,11,2,11,222,192,80,159,36,45,37,20,15,16,2,247,22, +143,2,80,159,36,41,37,20,15,16,2,8,128,8,80,159,36,46,37,20,15, +16,2,249,22,176,8,8,128,8,11,80,159,36,47,37,20,15,16,2,88,163, +8,36,37,50,8,128,32,2,14,223,0,33,56,80,159,36,48,37,20,15,16, +2,88,163,8,36,38,55,8,128,32,2,15,223,0,33,57,80,159,36,49,37, +20,15,16,2,247,22,75,80,159,36,50,37,20,15,16,2,248,22,18,74,109, +111,100,117,108,101,45,108,111,97,100,105,110,103,80,159,36,51,37,20,15,16, +2,11,80,158,36,52,20,15,16,2,11,80,158,36,53,20,15,16,2,32,0, +88,163,36,38,8,25,11,2,20,222,33,63,80,159,36,54,37,20,15,16,2, +11,80,158,36,55,20,15,16,2,88,164,8,34,37,45,8,240,0,0,40,0, +1,21,112,114,101,112,45,112,108,97,110,101,116,45,114,101,115,111,108,118,101, +114,33,37,224,1,0,33,64,80,159,36,8,28,39,20,15,16,2,88,163,36, +37,50,8,240,0,0,3,0,67,103,101,116,45,100,105,114,223,0,33,65,80, +159,36,8,29,39,20,15,16,2,88,163,36,37,49,8,240,0,0,64,0,72, +112,97,116,104,45,115,115,45,62,114,107,116,223,0,33,66,80,159,36,8,30, +39,20,15,16,2,88,163,8,36,37,45,8,240,0,0,4,0,9,223,0,33, +67,80,159,36,8,31,39,20,15,16,2,88,163,36,37,45,8,240,0,128,0, +0,9,223,0,33,68,80,159,36,8,32,39,20,15,16,2,27,11,20,19,158, +36,90,159,37,10,89,161,37,36,10,20,25,96,2,22,88,163,8,36,38,54, +8,32,9,224,2,1,33,69,88,163,36,39,49,11,9,223,0,33,70,88,163, +36,40,8,32,16,4,8,240,44,240,0,0,8,240,204,241,0,0,37,36,9, +224,2,1,33,85,207,80,159,36,56,37,20,15,16,2,88,163,36,36,45,16, +2,8,130,8,8,184,32,2,24,223,0,33,86,80,159,36,8,25,37,20,15, +16,2,20,27,158,88,163,8,36,36,45,16,2,36,8,168,32,2,25,223,0, +33,87,88,163,8,36,36,45,16,2,36,8,168,32,2,25,223,0,33,88,80, +159,36,8,26,37,96,29,94,2,4,68,35,37,107,101,114,110,101,108,11,29, +94,2,4,69,35,37,109,105,110,45,115,116,120,11,2,8,2,23,9,9,9, +36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 8821); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,51,46,56,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,52,46,50,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,11,0,0,0,1,0,0,10,0,16,0, 29,0,44,0,58,0,78,0,90,0,104,0,118,0,170,0,0,0,99,1,0, 0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2, @@ -1032,7 +1081,7 @@ 114,107,11,29,94,2,2,68,35,37,112,97,114,97,109,122,11,29,94,2,2, 74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,11,29,94,2,2,66, 35,37,98,111,111,116,11,29,94,2,2,68,35,37,101,120,112,111,98,115,11, -29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240,177,93, +29,94,2,2,68,35,37,107,101,114,110,101,108,11,97,36,11,8,240,200,93, 0,0,100,159,2,3,36,36,159,2,4,36,36,159,2,5,36,36,159,2,6, 36,36,159,2,7,36,36,159,2,8,36,36,159,2,9,36,36,159,2,9,36, 36,16,0,159,36,20,114,159,36,16,1,11,16,0,20,26,145,9,2,1,2, diff --git a/src/racket/src/port.c b/src/racket/src/port.c index 79c6c634d2..43757bc074 100644 --- a/src/racket/src/port.c +++ b/src/racket/src/port.c @@ -9011,7 +9011,8 @@ static char *cmdline_protect(char *s) static intptr_t mz_spawnv(char *command, const char * const *argv, int exact_cmdline, intptr_t sin, intptr_t sout, intptr_t serr, int *pid, - int new_process_group) + int new_process_group, + void *env) { int i, l, len = 0; intptr_t cr_flag; @@ -9056,10 +9057,11 @@ static intptr_t mz_spawnv(char *command, const char * const *argv, cr_flag = 0; if (new_process_group) cr_flag |= CREATE_NEW_PROCESS_GROUP; + cr_flag |= CREATE_UNICODE_ENVIRONMENT; if (CreateProcessW(WIDE_PATH_COPY(command), WIDE_PATH_COPY(cmdline), NULL, NULL, 1 /*inherit*/, - cr_flag, NULL, NULL, + cr_flag, env, NULL, &startup, &info)) { CloseHandle(info.hThread); *pid = info.dwProcessId; @@ -9129,6 +9131,8 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[]) System_Child *sc; # endif int fork_errno = 0; + char *env; + int need_free; #else void *sc = 0; #endif @@ -9351,7 +9355,10 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[]) fflush(stderr); { - Scheme_Object *tcd; + Scheme_Object *tcd, *envvar; + Scheme_Config *config; + char *env; + int need_free; if (!exact_cmdline) { /* protect spaces, etc. in the arguments: */ @@ -9362,20 +9369,29 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[]) } } + config = scheme_current_config(); + /* Set real CWD before spawn: */ - tcd = scheme_get_param(scheme_current_config(), MZCONFIG_CURRENT_DIRECTORY); + tcd = scheme_get_param(config, MZCONFIG_CURRENT_DIRECTORY); scheme_os_setcwd(SCHEME_BYTE_STR_VAL(tcd), 0); + envvar = scheme_get_param(config, MZCONFIG_CURRENT_ENV_VARS); + + env = scheme_environment_variables_to_block(envvar, &need_free); + spawn_status = mz_spawnv(command, (const char * const *)argv, exact_cmdline, to_subprocess[0], from_subprocess[1], err_subprocess[1], &pid, - new_process_group); + new_process_group, + env); if (spawn_status != -1) sc = (void *)spawn_status; + + if (need_free) free(env); } #else @@ -9539,10 +9555,17 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[]) #endif } - /* Set real CWD */ + /* Set real CWD and get envrionment variables */ { - Scheme_Object *dir; - dir = scheme_get_param(scheme_current_config(), MZCONFIG_CURRENT_DIRECTORY); + Scheme_Object *dir, *envvar; + Scheme_Config *config; + + config = scheme_current_config(); + + envvar = scheme_get_param(config, MZCONFIG_CURRENT_ENV_VARS); + env = scheme_environment_variables_to_block(envvar, &need_free); + + dir = scheme_get_param(config, MZCONFIG_CURRENT_DIRECTORY); if (!scheme_os_setcwd(SCHEME_PATH_VAL(dir), 1)) { scheme_console_printf("racket: chdir failed to: %s\n", SCHEME_BYTE_STR_VAL(dir)); _exit(1); @@ -9564,9 +9587,12 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[]) #endif END_XFORM_SKIP; - err = MSC_IZE(execv)(command, argv); + err = MSC_IZE(execve)(command, argv, (char **)env); if (err) err = errno; + + if (need_free) + free(env); /* If we get here it failed; give up */ diff --git a/src/racket/src/schminc.h b/src/racket/src/schminc.h index 2f9b7668ba..1898015e1b 100644 --- a/src/racket/src/schminc.h +++ b/src/racket/src/schminc.h @@ -14,7 +14,7 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 1088 +#define EXPECTED_PRIM_COUNT 1092 #define EXPECTED_UNSAFE_COUNT 100 #define EXPECTED_FLFXNUM_COUNT 69 #define EXPECTED_EXTFL_COUNT 45 diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 71b8131f49..37524f1b81 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -4000,6 +4000,10 @@ void scheme_unused_intptr(intptr_t); intptr_t scheme_check_overflow(intptr_t n, intptr_t m, intptr_t a); +Scheme_Object *scheme_make_environment_variables(Scheme_Hash_Table *ht); +# define SCHEME_ENVVARS_TABLE(ev) ((Scheme_Hash_Table *)SCHEME_PTR_VAL(ev)) +void *scheme_environment_variables_to_block(Scheme_Object *env, int *_need_free); + /*========================================================================*/ /* places */ /*========================================================================*/ diff --git a/src/racket/src/schvers.h b/src/racket/src/schvers.h index acc0b6e31e..f1a2b2ecf7 100644 --- a/src/racket/src/schvers.h +++ b/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "5.3.4.1" +#define MZSCHEME_VERSION "5.3.4.2" #define MZSCHEME_VERSION_X 5 #define MZSCHEME_VERSION_Y 3 #define MZSCHEME_VERSION_Z 4 -#define MZSCHEME_VERSION_W 1 +#define MZSCHEME_VERSION_W 2 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) diff --git a/src/racket/src/startup.inc b/src/racket/src/startup.inc index e90b85358c..56785b62aa 100644 --- a/src/racket/src/startup.inc +++ b/src/racket/src/startup.inc @@ -261,13 +261,14 @@ "(if(and(relative-path? program)" "(let-values(((base name dir?)(split-path program)))" "(eq? base 'relative)))" -" (let ((paths-str (getenv \"PATH\"))" +" (let ((paths-str (environment-variables-get #\"PATH\"))" "(win-add(lambda(s)(if(eq?(system-type) 'windows) " " (cons (bytes->path #\".\") s) " " s))))" "(let loop((paths(win-add " -"(if paths-str " -"(path-list-string->path-list paths-str null)" +"(if paths-str" +"(path-list-string->path-list(bytes->string/locale paths-str #\\?)" +" null)" " null))))" "(if(null? paths)" " #f" @@ -634,7 +635,10 @@ "(cons-if(lambda(f r)(if f(cons f r) r))))" "(path-list-string->path-list" "(if user-too?" -" (or (getenv \"PLTCOLLECTS\") \"\")" +" (let ((c (environment-variables-get #\"PLTCOLLECTS\")))" +"(if c" +"(bytes->string/locale c #\\?)" +" \"\"))" " \"\")" "(cons-if" "(and user-too?" diff --git a/src/racket/src/startup.rktl b/src/racket/src/startup.rktl index b67f207b1c..bf879697f6 100644 --- a/src/racket/src/startup.rktl +++ b/src/racket/src/startup.rktl @@ -316,13 +316,14 @@ (if (and (relative-path? program) (let-values ([(base name dir?) (split-path program)]) (eq? base 'relative))) - (let ([paths-str (getenv "PATH")] + (let ([paths-str (environment-variables-get #"PATH")] [win-add (lambda (s) (if (eq? (system-type) 'windows) (cons (bytes->path #".") s) s))]) (let loop ([paths (win-add - (if paths-str - (path-list-string->path-list paths-str null) + (if paths-str + (path-list-string->path-list (bytes->string/locale paths-str #\?) + null) null))]) (if (null? paths) #f @@ -730,7 +731,10 @@ [cons-if (lambda (f r) (if f (cons f r) r))]) (path-list-string->path-list (if user-too? - (or (getenv "PLTCOLLECTS") "") + (let ([c (environment-variables-get #"PLTCOLLECTS")]) + (if c + (bytes->string/locale c #\?) + "")) "") (cons-if (and user-too? diff --git a/src/racket/src/string.c b/src/racket/src/string.c index d2edb79ff3..e291b5a684 100644 --- a/src/racket/src/string.c +++ b/src/racket/src/string.c @@ -301,8 +301,12 @@ static Scheme_Object *sch_printf(int argc, Scheme_Object *argv[]); static Scheme_Object *sch_eprintf(int argc, Scheme_Object *argv[]); static Scheme_Object *sch_fprintf(int argc, Scheme_Object *argv[]); static Scheme_Object *banner(int argc, Scheme_Object *argv[]); +static Scheme_Object *env_p(int argc, Scheme_Object *argv[]); static Scheme_Object *sch_getenv(int argc, Scheme_Object *argv[]); +static Scheme_Object *sch_getenv_names(int argc, Scheme_Object *argv[]); static Scheme_Object *sch_putenv(int argc, Scheme_Object *argv[]); +static Scheme_Object *env_copy(int argc, Scheme_Object *argv[]); +static Scheme_Object *current_environment_variables(int argc, Scheme_Object *argv[]); static Scheme_Object *system_type(int argc, Scheme_Object *argv[]); static Scheme_Object *system_library_subpath(int argc, Scheme_Object *argv[]); static Scheme_Object *cmdline_args(int argc, Scheme_Object *argv[]); @@ -849,15 +853,42 @@ scheme_init_string (Scheme_Env *env) 0, 0), env); - scheme_add_global_constant("getenv", + /* Environment variables */ + + scheme_add_global_constant("environment-variables?", + scheme_make_folding_prim(env_p, + "environment-variables?", + 1, 1, 1), + env); + + scheme_add_global_constant("current-environment-variables", + scheme_register_parameter(current_environment_variables, + "current-environment-variables", + MZCONFIG_CURRENT_ENV_VARS), + env); + + scheme_add_global_constant("environment-variables-get", scheme_make_immed_prim(sch_getenv, - "getenv", + "environment-variables-get", + 1, 2), + env); + + scheme_add_global_constant("environment-variables-set!", + scheme_make_prim_w_arity(sch_putenv, + "environment-variables-set!", + 2, 4), + env); + + scheme_add_global_constant("environment-variables-keys", + scheme_make_immed_prim(sch_getenv_names, + "environment-variables-keys", 1, 1), env); - scheme_add_global_constant("putenv", - scheme_make_immed_prim(sch_putenv, - "putenv", - 2, 2), + + scheme_add_global_constant("environment-variables-copy", + scheme_make_immed_prim(env_copy, + "environment-variables-copy", + 1, 1), env); /* Don't make these folding, since they're platform-specific: */ @@ -2052,6 +2083,46 @@ int scheme_any_string_has_null(Scheme_Object *o) /* Environment Variables */ /***********************************************************************/ +#ifdef OS_X +# include +# define GET_ENVIRON_ARRAY *_NSGetEnviron() +#endif + +#if !defined(DOS_FILE_SYSTEM) && !defined(GET_ENVIRON_ARRAY) +extern char **environ; +# define GET_ENVIRON_ARRAY environ +#endif + +Scheme_Object *scheme_make_environment_variables(Scheme_Hash_Table *ht) +{ + Scheme_Object *ev; + + ev = scheme_alloc_small_object(); + ev->type = scheme_environment_variables_type; + SCHEME_PTR_VAL(ev) = (Scheme_Object *)ht; + + return ev; +} + +static Scheme_Object *env_p(int argc, Scheme_Object *argv[]) +{ + return (SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_environment_variables_type) + ? scheme_true + : scheme_false); +} + +static Scheme_Object *current_environment_variables(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *v; + + v = scheme_param_config("current-environment-variables", + scheme_make_integer(MZCONFIG_CURRENT_ENV_VARS), + argc, argv, + -1, env_p, "environment-variables?", 0); + + return v; +} + #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) static char* clone_str_with_gc(const char* buffer) { int length; @@ -2070,51 +2141,28 @@ static void create_putenv_str_table_if_needed() { } #ifndef DOS_FILE_SYSTEM -static void putenv_str_table_put_name(Scheme_Object *name, Scheme_Object *value) { +static void putenv_str_table_put_name(const char *name, char *value) { #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) void *original_gc; - Scheme_Object *name_copy; + const char *name_copy; original_gc = GC_switch_to_master_gc(); scheme_start_atomic(); - name_copy = (Scheme_Object *) clone_str_with_gc((const char *) name); + name_copy = clone_str_with_gc(name); create_putenv_str_table_if_needed(); - scheme_hash_set(putenv_str_table, name_copy, value); + scheme_hash_set(putenv_str_table, (Scheme_Object *)name_copy, (Scheme_Object *)value); scheme_end_atomic_no_swap(); GC_switch_back_from_master(original_gc); #else create_putenv_str_table_if_needed(); - scheme_hash_set(putenv_str_table, name, value); + scheme_hash_set(putenv_str_table, (Scheme_Object *)name, (Scheme_Object *)value); #endif } #endif -#ifndef GETENV_FUNCTION -static void putenv_str_table_put_name_value(Scheme_Object *name, Scheme_Object *value) { -#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) - void *original_gc; - Scheme_Object *name_copy; - Scheme_Object *value_copy; - original_gc = GC_switch_to_master_gc(); - scheme_start_atomic(); - - name_copy = (Scheme_Object *) clone_str_with_gc((const char *) name); - value_copy = (Scheme_Object *) clone_str_with_gc((const char *) value); - create_putenv_str_table_if_needed(); - scheme_hash_set(putenv_str_table, name_copy, value_copy); - - scheme_end_atomic_no_swap(); - GC_switch_back_from_master(original_gc); -#else - create_putenv_str_table_if_needed(); - scheme_hash_set(putenv_str_table, name, value); -#endif -} -#endif - -#if !defined(GETENV_FUNCTION) || defined(MZ_PRECISE_GC) -static Scheme_Object *putenv_str_table_get(Scheme_Object *name) { +#if defined(MZ_PRECISE_GC) +static Scheme_Object *putenv_str_table_get(const char *name) { #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) void *original_gc; Scheme_Object *value; @@ -2122,14 +2170,14 @@ static Scheme_Object *putenv_str_table_get(Scheme_Object *name) { scheme_start_atomic(); create_putenv_str_table_if_needed(); - value = scheme_hash_get(putenv_str_table, name); + value = scheme_hash_get(putenv_str_table, (Scheme_Object *)name); scheme_end_atomic_no_swap(); GC_switch_back_from_master(original_gc); return value; #else create_putenv_str_table_if_needed(); - return scheme_hash_get(putenv_str_table, name); + return scheme_hash_get(putenv_str_table, (Scheme_Object *)name); #endif } #endif @@ -2140,40 +2188,6 @@ static int sch_bool_getenv(const char* name); void scheme_init_getenv(void) { -#ifndef GETENV_FUNCTION - FILE *f = fopen("Environment", "r"); - if (f) { - Scheme_Object *p = scheme_make_file_input_port(f); - mz_jmp_buf *savebuf, newbuf; - savebuf = scheme_current_thread->error_buf; - scheme_current_thread->error_buf = &newbuf; - if (!scheme_setjmp(newbuf)) { - while (1) { - Scheme_Object *v = scheme_read(p); - if (SCHEME_EOFP(v)) - break; - - if (SCHEME_PAIRP(v) && SCHEME_PAIRP(SCHEME_CDR(v)) - && SCHEME_NULLP(SCHEME_CDR(SCHEME_CDR(v)))) { - Scheme_Object *key = SCHEME_CAR(v); - Scheme_Object *val = SCHEME_CADR(v); - if (SCHEME_STRINGP(key) && SCHEME_STRINGP(val)) { - Scheme_Object *a[2]; - a[0] = key; - a[1] = val; - sch_putenv(2, a); - v = NULL; - } - } - - if (v) - scheme_signal_error("bad environment specification: %V", v); - } - } - scheme_current_thread->error_buf = savebuf; - scheme_close_input_port(p); - } -#endif if (sch_bool_getenv("PLTNOMZJIT")) { scheme_set_startup_use_jit(0); } @@ -2183,61 +2197,82 @@ scheme_init_getenv(void) # include static char *dos_win_getenv(const char *name) { int value_size; - value_size = GetEnvironmentVariable(name, NULL, 0); + value_size = GetEnvironmentVariableW(WIDE_PATH(name), NULL, 0); if (value_size) { - char *value; + wchar_t *value; int got; - value = scheme_malloc_atomic(value_size); - got = GetEnvironmentVariable(name, value, value_size); + value = scheme_malloc_atomic(sizeof(wchar_t) * value_size); + got = GetEnvironmentVariableW(WIDE_PATH(name), value, value_size); if (got < value_size) value[got] = 0; - return value; + return NARROW_PATH(value); } return NULL; } #endif -static int sch_bool_getenv(const char* name) { +static int sch_bool_getenv(const char* name) +{ int rc = 0; -#ifdef GETENV_FUNCTION -# ifdef DOS_FILE_SYSTEM + +#ifdef DOS_FILE_SYSTEM if (GetEnvironmentVariable(name, NULL, 0)) rc = 1; -# else - if (getenv(name)) rc = 1; -# endif #else - if (putenv_str_table_get(name)) rc = 1; + if (getenv(name)) rc = 1; #endif + return rc; } +int byte_string_ok_name(Scheme_Object *o) +{ + const char *s = SCHEME_BYTE_STR_VAL(o); + int i = SCHEME_BYTE_STRTAG_VAL(o); +#ifdef DOS_FILE_SYSTEM + if (!i) return 0; +#endif + while (i--) { + if (!s[i] || s[i] == '=') + return 0; + } + return 1; +} + static Scheme_Object *sch_getenv(int argc, Scheme_Object *argv[]) { char *name; char *value; - Scheme_Object *bs; + Scheme_Object *bs, *ev, *val; + Scheme_Hash_Table *ht; - if (!SCHEME_CHAR_STRINGP(argv[0]) || scheme_any_string_has_null(argv[0])) - scheme_wrong_contract("getenv", CHAR_STRING_W_NO_NULLS, 0, argc, argv); + bs = argv[0]; + if (!SCHEME_BYTE_STRINGP(bs) + || !byte_string_ok_name(bs)) + scheme_wrong_contract("environment-variables-get", "bytes-environment-variable-name?", 0, argc, argv); + if ((argc > 1) + && !SAME_TYPE(SCHEME_TYPE(argv[1]), scheme_environment_variables_type)) + scheme_wrong_contract("environment-variables-get", "environment-variables?", 1, argc, argv); - bs = scheme_char_string_to_byte_string_locale(argv[0]); - name = SCHEME_BYTE_STR_VAL(bs); + if (argc > 1) + ev = argv[1]; + else + ev = scheme_get_param(scheme_current_config(), MZCONFIG_CURRENT_ENV_VARS); + ht = SCHEME_ENVVARS_TABLE(ev); -#ifdef GETENV_FUNCTION -# ifdef DOS_FILE_SYSTEM - value = dos_win_getenv(name); -# else - value = getenv(name); -# endif + if (!ht) { + name = SCHEME_BYTE_STR_VAL(bs); + +#ifdef DOS_FILE_SYSTEM + value = dos_win_getenv(name); #else - { - Scheme_Object *hash_value; - hash_value = putenv_str_table_get(name); - return hash_value ? hash_value : scheme_false; - } + value = getenv(name); #endif - return value ? scheme_make_locale_string(value) : scheme_false; + return value ? scheme_make_byte_string(value) : scheme_false; + } else { + val = scheme_hash_get_atomic(ht, bs); + return val ? val : scheme_false; + } } #ifndef DOS_FILE_SYSTEM @@ -2246,21 +2281,26 @@ static int sch_unix_putenv(const char *var, const char *val, const intptr_t varl intptr_t total_length; total_length = varlen + vallen + 2; + if (val) { #ifdef MZ_PRECISE_GC - /* Can't put moveable string into array. */ - buffer = malloc(total_length); + /* Can't put moveable string into array. */ + buffer = malloc(total_length); #else - buffer = (char *)scheme_malloc_atomic(total_length); + buffer = (char *)scheme_malloc_atomic(total_length); #endif - memcpy(buffer, var, varlen); - buffer[varlen] = '='; - memcpy(buffer + varlen + 1, val, vallen + 1); + + memcpy(buffer, var, varlen); + buffer[varlen] = '='; + memcpy(buffer + varlen + 1, val, vallen + 1); + } else { + buffer = NULL; + } #ifdef MZ_PRECISE_GC { /* Free old, if in table: */ char *oldbuffer; - oldbuffer = (char *)putenv_str_table_get((Scheme_Object *)var); + oldbuffer = (char *)putenv_str_table_get(var); if (oldbuffer) free(oldbuffer); } @@ -2268,40 +2308,270 @@ static int sch_unix_putenv(const char *var, const char *val, const intptr_t varl /* if precise the buffer needs to be remembered so it can be freed */ /* if not precise the buffer needs to be rooted so it doesn't get collected prematurely */ - putenv_str_table_put_name((Scheme_Object *)var, (Scheme_Object *)buffer); - return putenv(buffer); + putenv_str_table_put_name(var, buffer); + + if (buffer) + return putenv(buffer); + else + return unsetenv(var); } #endif static Scheme_Object *sch_putenv(int argc, Scheme_Object *argv[]) { - Scheme_Object *varbs; - Scheme_Object *valbs; + Scheme_Object *varbs, *valbs, *ev; + Scheme_Hash_Table *ht; char *var; char *val; - int rc = 0; + int rc = 0, errid = 0; - if (!SCHEME_CHAR_STRINGP(argv[0]) || scheme_any_string_has_null(argv[0])) - scheme_wrong_contract("putenv", CHAR_STRING_W_NO_NULLS, 0, argc, argv); - if (!SCHEME_CHAR_STRINGP(argv[1]) || scheme_any_string_has_null(argv[1])) - scheme_wrong_contract("putenv", CHAR_STRING_W_NO_NULLS, 1, argc, argv); + varbs = argv[0]; + if (!SCHEME_BYTE_STRINGP(varbs) + || !byte_string_ok_name(varbs)) + scheme_wrong_contract("environment-variables-set!", "bytes-environment-variable-name?", 0, argc, argv); + valbs = argv[1]; + if (!SCHEME_FALSEP(valbs) + && (!SCHEME_BYTE_STRINGP(valbs) + || scheme_byte_string_has_null(valbs))) + scheme_wrong_contract("environment-variables-set!", "(or/c bytes-no-nuls? #f)", 1, argc, argv); + if ((argc > 2) + && !SAME_TYPE(SCHEME_TYPE(argv[2]), scheme_environment_variables_type)) + scheme_wrong_contract("environment-variables-set!", "environment-variables?", 1, argc, argv); + if (argc > 3) + scheme_check_proc_arity("environment-variables-set!", 0, 3, argc, argv); - varbs = scheme_char_string_to_byte_string_locale(argv[0]); - var = SCHEME_BYTE_STR_VAL(varbs); + if (argc > 2) + ev = argv[2]; + else + ev = scheme_get_param(scheme_current_config(), MZCONFIG_CURRENT_ENV_VARS); + ht = SCHEME_ENVVARS_TABLE(ev); - valbs = scheme_char_string_to_byte_string_locale(argv[1]); - val = SCHEME_BYTE_STR_VAL(valbs); + if (ht) { + if (SCHEME_FALSEP(valbs)) { + scheme_hash_set_atomic(ht, varbs, NULL); + } else { + varbs = byte_string_to_immutable(1, &varbs); + valbs = byte_string_to_immutable(1, &valbs); + scheme_hash_set_atomic(ht, varbs, valbs); + } -#ifdef GETENV_FUNCTION -# ifdef DOS_FILE_SYSTEM - rc = !SetEnvironmentVariable(var, val); -# else - rc = sch_unix_putenv(var, val, SCHEME_BYTE_STRLEN_VAL(varbs), SCHEME_BYTE_STRLEN_VAL(valbs)); -# endif + return scheme_void; + } else { + var = SCHEME_BYTE_STR_VAL(varbs); + + if (SCHEME_FALSEP(valbs)) { + val = NULL; + } else { + val = SCHEME_BYTE_STR_VAL(valbs); + } + +#ifdef DOS_FILE_SYSTEM + rc = !SetEnvironmentVariable(var, val); + if (rc) + errid = GetLastError(); #else - putenv_str_table_put_name_value(argv[0], argv[1]); + rc = sch_unix_putenv(var, val, SCHEME_BYTE_STRLEN_VAL(varbs), (val ? SCHEME_BYTE_STRLEN_VAL(valbs) : 0)); + errid = errno; +#endif + + if (rc) { + if (argc > 3) + return _scheme_tail_apply(argv[3], 0, NULL); + else { + scheme_raise_exn(MZEXN_FAIL, + "environment-variables-set!: change failed\n" + " system error: %e", + errid); + } + } + + return scheme_void; + } +} + +static Scheme_Object *env_copy(int argc, Scheme_Object *argv[]) +{ + Scheme_Hash_Table *ht; + + if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_environment_variables_type)) + scheme_wrong_contract("environment-variables-copy", "environment-variables?", 0, argc, argv); + + ht = SCHEME_ENVVARS_TABLE(argv[0]); + if (ht) + return scheme_make_environment_variables(scheme_clone_hash_table(ht)); + + /* copy system environment variables into a hash table: */ + ht = scheme_make_hash_table_equal(); + +#ifdef DOS_FILE_SYSTEM + { + char *p; + wchar_t *e; + int i, start, j; + Scheme_Object *var, *val; + + e = GetEnvironmentStringsW(); + + for (i = 0; e[i]; ) { + start = i; + while (e[i]) { + i++; + } + p = NARROW_PATH(e XFORM_OK_PLUS start); + for (j = 0; p[j] && p[j] != '='; j++) { + } + if (p[j]) { + var = scheme_make_immutable_sized_byte_string(p, j, 1); + val = scheme_make_immutable_sized_byte_string(p XFORM_OK_PLUS j + 1, -1, 1); + scheme_hash_set(ht, var, val); + } + i++; + } + + FreeEnvironmentStringsW(e); + } +#else + { + int i, j; + char **ea, *p; + Scheme_Object *var, *val; + + ea = GET_ENVIRON_ARRAY; + + for (i = 0; ea[i]; i++) { + p = ea[i]; + for (j = 0; p[j] && p[j] != '='; j++) { + } + if (p[j]) { + var = scheme_make_immutable_sized_byte_string(p, j, 1); + val = scheme_make_immutable_sized_byte_string(p XFORM_OK_PLUS j + 1, -1, 1); + scheme_hash_set(ht, var, val); + } + } + } +#endif + + return scheme_make_environment_variables(ht); +} + +static Scheme_Object *sch_getenv_names(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *ev, *r = scheme_null; + Scheme_Hash_Table *ht; + int i; + + ev = argv[0]; + if (!SAME_TYPE(SCHEME_TYPE(ev), scheme_environment_variables_type)) + scheme_wrong_contract("environment-variables-keys", "environment-variables?", 0, argc, argv); + + ht = SCHEME_ENVVARS_TABLE(ev); + if (!ht) { + ev = env_copy(1, argv); + ht = SCHEME_ENVVARS_TABLE(ev); + } + + for (i = ht->size; i--; ) { + if (ht->vals[i]) { + r = scheme_make_pair(ht->keys[i], r); + } + } + + return r; +} + +#ifdef DOS_FILE_SYSTEM +static int wc_strlen(const wchar_t *ws) +{ + int l; + for (l =0; ws[l]; l++) { } + return l; +} +#endif + +void *scheme_environment_variables_to_block(Scheme_Object *ev, int *_need_free) +{ + Scheme_Hash_Table *ht; + + ht = SCHEME_ENVVARS_TABLE(ev); + if (!ht) { + *_need_free = 0; +#ifdef DOS_FILE_SYSTEM + return NULL; +#else + return GET_ENVIRON_ARRAY; +#endif + } + + *_need_free = 1; + +#ifdef DOS_FILE_SYSTEM + { + int i; + int len = 0, slen; + GC_CAN_IGNORE wchar_t *r, *s; + + for (i = ht->size; i--; ) { + if (ht->vals[i]) { + len += wc_strlen(WIDE_PATH(SCHEME_BYTE_STR_VAL(ht->keys[i]))); + len += wc_strlen(WIDE_PATH(SCHEME_BYTE_STR_VAL(ht->vals[i]))); + len += 2; + } + } + + r = (wchar_t *)malloc((len + 1) * sizeof(wchar_t)); + + len = 0; + + for (i = ht->size; i--; ) { + if (ht->vals[i]) { + s = WIDE_PATH(SCHEME_BYTE_STR_VAL(ht->keys[i])); + slen = wc_strlen(s); + memcpy(r XFORM_OK_PLUS len, s, slen * sizeof(wchar_t)); + len += slen; + r[len++] = '='; + s = WIDE_PATH(SCHEME_BYTE_STR_VAL(ht->vals[i])); + slen = wc_strlen(s); + memcpy(r XFORM_OK_PLUS len, s, slen * sizeof(wchar_t)); + len += slen; + r[len++] = 0; + } + } + r[len] = 0; + + return r; + } +#else + { + GC_CAN_IGNORE char **r, *s; + intptr_t i, len = 0, slen, c; + + for (i = ht->size; i--; ) { + if (ht->vals[i]) { + len += SCHEME_BYTE_STRLEN_VAL(ht->keys[i]); + len += SCHEME_BYTE_STRLEN_VAL(ht->vals[i]); + len += 2; + } + } + + r = (char **)malloc((ht->count+1) * sizeof(char*) + len); + s = (char *)(r + (ht->count+1)); + for (i = ht->size, c = 0; i--; ) { + if (ht->vals[i]) { + r[c++] = s; + slen = SCHEME_BYTE_STRLEN_VAL(ht->keys[i]); + memcpy(s, SCHEME_BYTE_STR_VAL(ht->keys[i]), slen); + s[slen] = '='; + s = s XFORM_OK_PLUS (slen + 1); + slen = SCHEME_BYTE_STRLEN_VAL(ht->vals[i]); + memcpy(s, SCHEME_BYTE_STR_VAL(ht->vals[i]), slen); + s[slen] = 0; + s = s XFORM_OK_PLUS (slen + 1); + } + } + + return r; + } #endif - return rc ? scheme_false : scheme_true; } /***********************************************************************/ diff --git a/src/racket/src/stypes.h b/src/racket/src/stypes.h index 7b6cd74b13..2151440b4f 100644 --- a/src/racket/src/stypes.h +++ b/src/racket/src/stypes.h @@ -207,83 +207,84 @@ enum { scheme_proc_shape_type, /* 183 */ scheme_struct_proc_shape_type, /* 184 */ scheme_phantom_bytes_type, /* 185 */ + scheme_environment_variables_type, /* 186 */ #ifdef MZTAG_REQUIRED - _scheme_last_normal_type_, /* 186 */ + _scheme_last_normal_type_, /* 187 */ - scheme_rt_weak_array, /* 187 */ + scheme_rt_weak_array, /* 188 */ - scheme_rt_comp_env, /* 188 */ - scheme_rt_constant_binding, /* 189 */ - scheme_rt_resolve_info, /* 190 */ - scheme_rt_unresolve_info, /* 191 */ - scheme_rt_optimize_info, /* 192 */ - scheme_rt_compile_info, /* 193 */ - scheme_rt_cont_mark, /* 194 */ - scheme_rt_saved_stack, /* 195 */ - scheme_rt_reply_item, /* 196 */ - scheme_rt_closure_info, /* 197 */ - scheme_rt_overflow, /* 198 */ - scheme_rt_overflow_jmp, /* 199 */ - scheme_rt_meta_cont, /* 200 */ - scheme_rt_dyn_wind_cell, /* 201 */ - scheme_rt_dyn_wind_info, /* 202 */ - scheme_rt_dyn_wind, /* 203 */ - scheme_rt_dup_check, /* 204 */ - scheme_rt_thread_memory, /* 205 */ - scheme_rt_input_file, /* 206 */ - scheme_rt_input_fd, /* 207 */ - scheme_rt_oskit_console_input, /* 208 */ - scheme_rt_tested_input_file, /* 209 */ - scheme_rt_tested_output_file, /* 210 */ - scheme_rt_indexed_string, /* 211 */ - scheme_rt_output_file, /* 212 */ - scheme_rt_load_handler_data, /* 213 */ - scheme_rt_pipe, /* 214 */ - scheme_rt_beos_process, /* 215 */ - scheme_rt_system_child, /* 216 */ - scheme_rt_tcp, /* 217 */ - scheme_rt_write_data, /* 218 */ - scheme_rt_tcp_select_info, /* 219 */ - scheme_rt_param_data, /* 220 */ - scheme_rt_will, /* 221 */ - scheme_rt_linker_name, /* 222 */ - scheme_rt_param_map, /* 223 */ - scheme_rt_finalization, /* 224 */ - scheme_rt_finalizations, /* 225 */ - scheme_rt_cpp_object, /* 226 */ - scheme_rt_cpp_array_object, /* 227 */ - scheme_rt_stack_object, /* 228 */ - scheme_rt_preallocated_object, /* 229 */ - scheme_thread_hop_type, /* 230 */ - scheme_rt_srcloc, /* 231 */ - scheme_rt_evt, /* 232 */ - scheme_rt_syncing, /* 233 */ - scheme_rt_comp_prefix, /* 234 */ - scheme_rt_user_input, /* 235 */ - scheme_rt_user_output, /* 236 */ - scheme_rt_compact_port, /* 237 */ - scheme_rt_read_special_dw, /* 238 */ - scheme_rt_regwork, /* 239 */ - scheme_rt_rx_lazy_string, /* 240 */ - scheme_rt_buf_holder, /* 241 */ - scheme_rt_parameterization, /* 242 */ - scheme_rt_print_params, /* 243 */ - scheme_rt_read_params, /* 244 */ - scheme_rt_native_code, /* 245 */ - scheme_rt_native_code_plus_case, /* 246 */ - scheme_rt_jitter_data, /* 247 */ - scheme_rt_module_exports, /* 248 */ - scheme_rt_delay_load_info, /* 249 */ - scheme_rt_marshal_info, /* 250 */ - scheme_rt_unmarshal_info, /* 251 */ - scheme_rt_runstack, /* 252 */ - scheme_rt_sfs_info, /* 253 */ - scheme_rt_validate_clearing, /* 254 */ - scheme_rt_avl_node, /* 255 */ - scheme_rt_lightweight_cont, /* 256 */ - scheme_rt_export_info, /* 257 */ - scheme_rt_cont_jmp, /* 258 */ + scheme_rt_comp_env, /* 189 */ + scheme_rt_constant_binding, /* 190 */ + scheme_rt_resolve_info, /* 191 */ + scheme_rt_unresolve_info, /* 192 */ + scheme_rt_optimize_info, /* 193 */ + scheme_rt_compile_info, /* 194 */ + scheme_rt_cont_mark, /* 195 */ + scheme_rt_saved_stack, /* 196 */ + scheme_rt_reply_item, /* 197 */ + scheme_rt_closure_info, /* 198 */ + scheme_rt_overflow, /* 199 */ + scheme_rt_overflow_jmp, /* 200 */ + scheme_rt_meta_cont, /* 201 */ + scheme_rt_dyn_wind_cell, /* 202 */ + scheme_rt_dyn_wind_info, /* 203 */ + scheme_rt_dyn_wind, /* 204 */ + scheme_rt_dup_check, /* 205 */ + scheme_rt_thread_memory, /* 206 */ + scheme_rt_input_file, /* 207 */ + scheme_rt_input_fd, /* 208 */ + scheme_rt_oskit_console_input, /* 209 */ + scheme_rt_tested_input_file, /* 210 */ + scheme_rt_tested_output_file, /* 211 */ + scheme_rt_indexed_string, /* 212 */ + scheme_rt_output_file, /* 213 */ + scheme_rt_load_handler_data, /* 214 */ + scheme_rt_pipe, /* 215 */ + scheme_rt_beos_process, /* 216 */ + scheme_rt_system_child, /* 217 */ + scheme_rt_tcp, /* 218 */ + scheme_rt_write_data, /* 219 */ + scheme_rt_tcp_select_info, /* 220 */ + scheme_rt_param_data, /* 221 */ + scheme_rt_will, /* 222 */ + scheme_rt_linker_name, /* 223 */ + scheme_rt_param_map, /* 224 */ + scheme_rt_finalization, /* 225 */ + scheme_rt_finalizations, /* 226 */ + scheme_rt_cpp_object, /* 227 */ + scheme_rt_cpp_array_object, /* 228 */ + scheme_rt_stack_object, /* 229 */ + scheme_rt_preallocated_object, /* 230 */ + scheme_thread_hop_type, /* 231 */ + scheme_rt_srcloc, /* 232 */ + scheme_rt_evt, /* 233 */ + scheme_rt_syncing, /* 234 */ + scheme_rt_comp_prefix, /* 235 */ + scheme_rt_user_input, /* 236 */ + scheme_rt_user_output, /* 237 */ + scheme_rt_compact_port, /* 238 */ + scheme_rt_read_special_dw, /* 239 */ + scheme_rt_regwork, /* 240 */ + scheme_rt_rx_lazy_string, /* 241 */ + scheme_rt_buf_holder, /* 242 */ + scheme_rt_parameterization, /* 243 */ + scheme_rt_print_params, /* 244 */ + scheme_rt_read_params, /* 245 */ + scheme_rt_native_code, /* 246 */ + scheme_rt_native_code_plus_case, /* 247 */ + scheme_rt_jitter_data, /* 248 */ + scheme_rt_module_exports, /* 249 */ + scheme_rt_delay_load_info, /* 250 */ + scheme_rt_marshal_info, /* 251 */ + scheme_rt_unmarshal_info, /* 252 */ + scheme_rt_runstack, /* 253 */ + scheme_rt_sfs_info, /* 254 */ + scheme_rt_validate_clearing, /* 255 */ + scheme_rt_avl_node, /* 256 */ + scheme_rt_lightweight_cont, /* 257 */ + scheme_rt_export_info, /* 258 */ + scheme_rt_cont_jmp, /* 259 */ #endif _scheme_last_type_ diff --git a/src/racket/src/thread.c b/src/racket/src/thread.c index 6631bfb790..034645d906 100644 --- a/src/racket/src/thread.c +++ b/src/racket/src/thread.c @@ -4414,7 +4414,7 @@ void scheme_break_kind_thread(Scheme_Thread *p, int kind) void scheme_break_thread(Scheme_Thread *p) { - return scheme_break_kind_thread(p, MZEXN_BREAK); + scheme_break_kind_thread(p, MZEXN_BREAK); } static void call_on_atomic_timeout(int must) @@ -7404,6 +7404,12 @@ static void make_initial_config(Scheme_Thread *p) scheme_set_original_dir(s); } + { + Scheme_Object *ev; + ev = scheme_make_environment_variables(NULL); + init_param(cells, paramz, MZCONFIG_CURRENT_ENV_VARS, ev); + } + { Scheme_Object *rs; rs = scheme_make_random_state(scheme_get_milliseconds()); diff --git a/src/racket/src/type.c b/src/racket/src/type.c index 0fa40ee453..5c4a2f3777 100644 --- a/src/racket/src/type.c +++ b/src/racket/src/type.c @@ -311,6 +311,8 @@ scheme_init_type () set_name(scheme_phantom_bytes_type, ""); + set_name(scheme_environment_variables_type, ""); + #ifdef MZ_GC_BACKTRACE set_name(scheme_rt_meta_cont, ""); #endif @@ -720,6 +722,8 @@ void scheme_register_traversers(void) GC_REG_TRAV(scheme_proc_shape_type, small_object); GC_REG_TRAV(scheme_struct_proc_shape_type, small_atomic_obj); + + GC_REG_TRAV(scheme_environment_variables_type, small_object); } END_XFORM_SKIP;