From 72c958df628690ebc52a626d35cd4edcab0c7089 Mon Sep 17 00:00:00 2001 From: Claire Alvis Date: Tue, 7 May 2013 09:36:47 -0400 Subject: [PATCH] all necessary changes to check references to uninitialized letrec variables includes a new pass, letrec_check, two new primitives, and changes to packages that grabbed the letrec undefined value --- pkgs/algol60/runtime.rkt | 2 +- .../compatibility-lib/mzlib/unit200.rkt | 3 +- .../htdp-pkgs/htdp-lib/lang/private/teach.rkt | 20 +- pkgs/pconvert-lib/mzlib/pconvert.rkt | 9 +- pkgs/plai/datatype.rkt | 8 +- pkgs/r5rs-pkgs/r5rs-lib/r5rs/main.rkt | 2 +- .../scribblings/reference/data.scrbl | 28 +- .../racket-test/tests/racket/optimize.rktl | 3 + .../racket-test/tests/racket/syntax.rktl | 14 +- pkgs/swindle/tiny-clos.rkt | 5 +- .../typed-racket/types/abbrev.rkt | 5 +- .../typed-racket/utils/any-wrap.rkt | 5 +- .../collects/racket/contract/private/misc.rkt | 13 +- .../collects/racket/private/class-c-old.rkt | 3 +- .../racket/private/class-internal.rkt | 3 +- racket/collects/racket/private/classidmap.rkt | 5 +- racket/collects/racket/private/pre-base.rkt | 3 +- .../collects/racket/private/unit-runtime.rkt | 5 +- racket/collects/racket/shared.rkt | 4 +- racket/collects/racket/undefined.rkt | 10 +- racket/collects/racket/unit.rkt | 4 +- racket/collects/syntax/toplevel.rkt | 6 +- racket/src/racket/gc2/Makefile.in | 6 + racket/src/racket/src/Makefile.in | 6 + racket/src/racket/src/compenv.c | 11 +- racket/src/racket/src/compile.c | 39 +- racket/src/racket/src/cstartup.inc | 2096 ++++++++--------- racket/src/racket/src/env.c | 1 + racket/src/racket/src/eval.c | 2 + racket/src/racket/src/fun.c | 27 + racket/src/racket/src/letrec_check.c | 1854 +++++++++++++++ racket/src/racket/src/mkmark.rkt | 6 +- racket/src/racket/src/module.c | 6 +- racket/src/racket/src/mzmark_letrec_check.inc | 78 + racket/src/racket/src/mzmark_type.inc | 8 + racket/src/racket/src/mzmarksrc.c | 38 + racket/src/racket/src/optimize.c | 21 +- racket/src/racket/src/print.c | 1 + racket/src/racket/src/schminc.h | 2 +- racket/src/racket/src/schpriv.h | 7 + racket/src/racket/src/schvers.h | 4 +- racket/src/racket/src/stypes.h | 2 + 42 files changed, 3225 insertions(+), 1150 deletions(-) create mode 100644 racket/src/racket/src/letrec_check.c create mode 100644 racket/src/racket/src/mzmark_letrec_check.inc diff --git a/pkgs/algol60/runtime.rkt b/pkgs/algol60/runtime.rkt index ab813a810a..7e88cce853 100644 --- a/pkgs/algol60/runtime.rkt +++ b/pkgs/algol60/runtime.rkt @@ -1,4 +1,5 @@ (module runtime mzscheme + (require racket/undefined) (provide (struct a60:array (vec dimens)) (struct a60:switch (choices)) @@ -17,7 +18,6 @@ (define-struct a60:array (vec dimens)) (define-struct a60:switch (choices)) - (define undefined (letrec ([x x]) x)) (define (check-boolean b) b) (define (goto f) (f)) (define (get-value v) (v)) diff --git a/pkgs/compatibility-pkgs/compatibility-lib/mzlib/unit200.rkt b/pkgs/compatibility-pkgs/compatibility-lib/mzlib/unit200.rkt index d1dd8ec122..29f4968657 100644 --- a/pkgs/compatibility-pkgs/compatibility-lib/mzlib/unit200.rkt +++ b/pkgs/compatibility-pkgs/compatibility-lib/mzlib/unit200.rkt @@ -7,14 +7,13 @@ syntax/name syntax/context racket/syntax + racket/undefined (only racket/base filter) "private/unitidmap.rkt") ;; ---------------------------------------------------------------------- ;; Structures and helpers - (define undefined (letrec ([x x]) x)) ; initial value - (define insp (current-inspector)) ; for named structures (define-struct unit (num-imports exports go)) ; unit value diff --git a/pkgs/htdp-pkgs/htdp-lib/lang/private/teach.rkt b/pkgs/htdp-pkgs/htdp-lib/lang/private/teach.rkt index 87bc2841f4..fd95907105 100644 --- a/pkgs/htdp-pkgs/htdp-lib/lang/private/teach.rkt +++ b/pkgs/htdp-pkgs/htdp-lib/lang/private/teach.rkt @@ -38,6 +38,7 @@ mzlib/math mzlib/pconvert-prop scheme/match + racket/undefined "set-result.rkt" (only racket/base define-struct) racket/struct-info @@ -87,15 +88,14 @@ (current-continuation-marks))))) ;; Wrapped around uses of local-bound variables: - (define (check-not-undefined name val) - (if (eq? val undefined) + (define (teach-check-not-undefined name val) + (if (undefined? val) (raise (make-exn:fail:contract:variable (format "local variable used before its definition: ~a" name) (current-continuation-marks) name)) val)) - (define undefined (letrec ([x x]) x)) (define (identifier-is-bound? id) (or (identifier-binding id) @@ -1147,11 +1147,11 @@ ;; For intermediate: ;; This application form disallows rator expressions that aren't - ;; top-level identifiers or of the form `(check-not-undefined ...)'. + ;; top-level identifiers or of the form `(teach-check-not-undefined ...)'. ;; The latter is probably surprising. It turns out that every use of ;; a `local'-bound identifier gets converted to an undefined check, - ;; and the call to `check-not-undefined' can't be forged by the + ;; and the call to `teach-check-not-undefined' can't be forged by the ;; programmer. So the pattern-match effectively recognizes uses of ;; `local'-bound identifiers, which are legal as rator ;; expressions. (`let' and `letrec' get converted to `local'.) @@ -1163,8 +1163,8 @@ (syntax-case stx () [(_ rator rand ...) (let* ([fun (syntax rator)] - [undef-check? (syntax-case fun (check-not-undefined) - [(check-not-undefined id) + [undef-check? (syntax-case fun (teach-check-not-undefined) + [(teach-check-not-undefined id) #t] [_else #f])] [binding (and (identifier? fun) @@ -1749,7 +1749,7 @@ ((define-syntaxes (def-id/prop ...) (values (make-undefined-check - (quote-syntax check-not-undefined) + (quote-syntax teach-check-not-undefined) (quote-syntax tmp-id)) ...)) ...)))]) @@ -1818,7 +1818,7 @@ (quasisyntax/loc stx (#%stratified-body (define-syntaxes (name) (make-undefined-check - (quote-syntax check-not-undefined) + (quote-syntax teach-check-not-undefined) (quote-syntax tmp-id))) ... (define-values (tmp-id) rhs-expr) @@ -1853,7 +1853,7 @@ (let-values ([(tmp-id) rhs-expr] ...) #,(stepper-syntax-property #`(let-syntaxes ([(name) (make-undefined-check - (quote-syntax check-not-undefined) + (quote-syntax teach-check-not-undefined) (quote-syntax tmp-id))] ...) expr) diff --git a/pkgs/pconvert-lib/mzlib/pconvert.rkt b/pkgs/pconvert-lib/mzlib/pconvert.rkt index 51f6788c12..a2f932e2a3 100644 --- a/pkgs/pconvert-lib/mzlib/pconvert.rkt +++ b/pkgs/pconvert-lib/mzlib/pconvert.rkt @@ -4,7 +4,8 @@ (require (only racket/base sort) compatibility/mlist "pconvert-prop.rkt" - racket/class) + racket/class + racket/undefined) (provide show-sharing constructor-style-printing @@ -27,8 +28,6 @@ current-build-share-hook current-print-convert-hook) - (define undefined-val (letrec ([x x]) x)) - ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; the value stored in the hash table. Contains the name ;; @@ -123,7 +122,9 @@ (boolean? expr) (char? expr) (void? expr) (null? expr) - (eq? expr undefined-val) ; # test - yuck + ;; # test - yuck, and maybe not worth checking + ;; anymore, since undefined generally shouldn't escape + (undefined? expr) ) 'atomic] [(and (not (struct? expr)) ;; struct names are the wrong thing, here diff --git a/pkgs/plai/datatype.rkt b/pkgs/plai/datatype.rkt index c5a3ca5326..84090fc450 100644 --- a/pkgs/plai/datatype.rkt +++ b/pkgs/plai/datatype.rkt @@ -2,7 +2,8 @@ (require (for-syntax racket/base racket/list) racket/list - racket/contract) + racket/contract + racket/undefined) (provide define-type type-case) @@ -86,11 +87,6 @@ stx)] [_ (transfer-srcloc orig stx)])))) -(define the-undefined - (letrec ([x x]) x)) -(define (undefined? x) - (eq? the-undefined x)) - (define-syntax (define-type stx) (syntax-parse stx diff --git a/pkgs/r5rs-pkgs/r5rs-lib/r5rs/main.rkt b/pkgs/r5rs-pkgs/r5rs-lib/r5rs/main.rkt index 1a96490349..4061636345 100644 --- a/pkgs/r5rs-pkgs/r5rs-lib/r5rs/main.rkt +++ b/pkgs/r5rs-pkgs/r5rs-lib/r5rs/main.rkt @@ -1,5 +1,6 @@ (module main scheme/base (require scheme/mpair + racket/undefined (for-syntax scheme/base syntax/kerncase "private/r5rs-trans.rkt") (only-in mzscheme transcript-on transcript-off)) @@ -243,7 +244,6 @@ ;; Copied from R5rS, but with an added `let' around body, ;; and with optimization for precedure letrecs - (define undefined (letrec ([u u]) u)) (define-for-syntax (immediate-value? stx) (let ([v (syntax-e stx)]) (or (number? v) diff --git a/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl b/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl index e0cf7bf794..697f4a6c7b 100644 --- a/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl +++ b/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl @@ -174,15 +174,27 @@ The @|void-const| value is always @racket[eq?] to itself. @; ---------------------------------------------------------------------- @section[#:tag "undefined"]{Undefined} -The constant @|undefined-const| is used as the initial value for -@racket[letrec] bindings and in other places where a placeholder value -is needed before a specific value can be assigned. Use -@racket[undefined] (which is bound to @|undefined-const|) as a last resort. +@note-lib[racket/undefined] -The @|undefined-const| value is always @racket[eq?] to itself. +The constant @racket[undefined] is conceptually used as a placeholder +value for a binding, so that a reference to a binding before its +definition can be detected. Such references are normally protected +implicitly via @racket[check-not-undefined], so that an expression does +not normally produce an @racket[undefined] value. -@note-lib-only[racket/undefined] +The @racket[undefined] value is always @racket[eq?] to itself. -@defthing[undefined any/c]{The @|undefined-const| constant.} +@defproc[(undefined? [v any/c]) boolean?]{Returns @racket[#t] if @racket[v] is the + constant @racket[undefined], @racket[#f] otherwise.} -@history[#:added "6.0.0.6"] + +@defthing[undefined undefined?]{The ``undefined'' constant.} + +@defproc[(check-not-undefined [v any/c] [sym symbol?]) (and/c any/c (not/c undefined?))]{ + +Checks whether @racket[v] is @racket[undefined], and raises +@racket[exn:fail:contract:variable] in that case with an error message +along the lines of ``@racket[sym]: variable used before its definition.'' +If @racket[v] is not @racket[undefined], then it is returned. + +} diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 4ad749b545..732faa85e6 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -918,6 +918,9 @@ (test-comp '(let ([x 8][y 9]) (lambda () (+ x y))) '(let ([x 8][y 9]) (lambda () (if #f y (+ x y))))) +;; Don't optimize away use before definition: +(test-comp '(letrec ([x (begin x 5)]) x) '5 #f) + (test-comp '(let ([x 5]) (set! x 2)) '(let ([x 5]) (set! x x) (set! x 2))) (test-comp '(let* () (f 5)) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/syntax.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/syntax.rktl index db19b24479..8b7b1d6558 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/syntax.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/syntax.rktl @@ -87,8 +87,8 @@ (let ((x 4)) (lambda (y) (+ x y)))) (test 10 add4 6) -(test (letrec([x x]) x) 'lambda (let ([x (lambda () (define d d) d)]) (x))) -(test (letrec([x x]) x) 'lambda ((lambda () (define d d) d))) +(err/rt-test (let ([x (lambda () (define d d) d)]) (x)) exn:fail:contract:variable?) +(err/rt-test ((lambda () (define d d) d)) exn:fail:contract:variable?) (test '(3 4 5 6) (lambda x x) 3 4 5 6) (test '(5 6) (lambda (x y . z) z) 3 4 5 6) (test 'second (lambda () (cons 'first 2) 'second)) @@ -643,8 +643,8 @@ (test 'twox 'let*-values (let*-values ([() (values)][() (values)]) 'twox)) (test 'threex 'letrec-values (letrec-values ([() (values)][() (values)]) 'threex)) -(letrec ([undef undef]) - (test (list 1 undef undef) 'no-split-letrec (letrec-values ([(a b c) (values 1 a b)]) (list a b c)))) +(err/rt-test (letrec-values ([(a b c) (values 1 a b)]) (list a b c)) + exn:fail:contract:variable?) (test '(10 11) 'letrec-values (letrec-values ([(names kps) (letrec ([oloop 10]) @@ -1642,13 +1642,15 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; check that the compiler is not too agressive with `letrec' -> `let*' -(test "#\nready\n" +(test "\nready\n" get-output-string (let ([p (open-output-string)]) (parameterize ([current-output-port p]) (let ([restart void]) (letrec ([dummy1 (let/cc k (set! restart k))] - [dummy2 (displayln maybe-ready)] + [dummy2 (displayln (with-handlers ([exn:fail:contract:variable? + (lambda (exn) ')]) + maybe-ready))] [maybe-ready 'ready]) (let ([rs restart]) (set! restart void) diff --git a/pkgs/swindle/tiny-clos.rkt b/pkgs/swindle/tiny-clos.rkt index 3a799860e5..a1647de142 100644 --- a/pkgs/swindle/tiny-clos.rkt +++ b/pkgs/swindle/tiny-clos.rkt @@ -116,7 +116,8 @@ ;;; OK, now let's get going. But, as usual, before we can do anything ;;; interesting, we have to muck around for a bit first. First, we need to ;;; load the support library. [-- replaced with a module.] -(require swindle/misc) +(require swindle/misc + racket/undefined) ;; This is a convenient function for raising exceptions (define (raise* exn-maker fmt . args) @@ -219,7 +220,7 @@ ;;> This is Racket's `unspecified' value which is used as the default ;;> value for unbound slots. It is provided so you can check if a slot is ;;> unbound. -(define* ??? (letrec ([x x]) x)) ; this is Racket's # value +(define* ??? undefined) (define unspecified-initializer (lambda args ???)) (define false-func (lambda args #f)) diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt index 4cb1940a2f..258d0983ea 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt @@ -8,6 +8,7 @@ racket/list racket/match racket/function + racket/undefined unstable/function (prefix-in c: (contract-req)) @@ -91,8 +92,8 @@ (define/decl -Boolean (Un -False -True)) (define/decl -Undefined (make-Base 'Undefined - #'(lambda (x) (equal? (letrec ([y y]) y) x)) ; initial value of letrec bindings - (lambda (x) (equal? (letrec ([y y]) y) x)))) + #'undefined? ; initial value of letrec bindings + undefined?)) (define/decl -Bytes (make-Base 'Bytes #'bytes? bytes?)) (define/decl -Base-Regexp (make-Base 'Base-Regexp #'(and/c regexp? (not/c pregexp?)) diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/utils/any-wrap.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/utils/any-wrap.rkt index 9d68fc3d4b..18d9c29dcf 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/utils/any-wrap.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/utils/any-wrap.rkt @@ -3,15 +3,14 @@ (require racket/match racket/contract/combinator racket/fixnum racket/flonum racket/set + racket/undefined (only-in (combine-in racket/private/promise) promise? prop:force promise-forcer)) -(define undef (letrec ([x x]) x)) - (define (base-val? e) (or (number? e) (string? e) (char? e) (symbol? e) - (null? e) (regexp? e) (eq? undef e) (path? e) + (null? e) (regexp? e) (undefined? e) (path? e) (regexp? e) (keyword? e) (bytes? e) (boolean? e) (void? e) ;; Base values because you can only store flonums/fixnums in these ;; and not any higher-order values. This isn't sound if we ever diff --git a/racket/collects/racket/contract/private/misc.rkt b/racket/collects/racket/contract/private/misc.rkt index d5be237544..668b5c128e 100644 --- a/racket/collects/racket/contract/private/misc.rkt +++ b/racket/collects/racket/contract/private/misc.rkt @@ -557,26 +557,23 @@ (apply or/c ss)) (define atomic-value? - (let ([undefined (letrec ([x x]) x)]) - (λ (x) - (or (char? x) (symbol? x) (boolean? x) - (null? x) (keyword? x) (number? x) - (void? x) (eq? x undefined))))) + (λ (x) + (or (char? x) (symbol? x) (boolean? x) + (null? x) (keyword? x) (number? x) + (void? x)))) (define/final-prop (one-of/c . elems) (for ([arg (in-list elems)] [i (in-naturals)]) (unless (atomic-value? arg) (raise-argument-error 'one-of/c - "char, symbol, boolean, null, keyword, number, void, or undefined" + "char, symbol, boolean, null, keyword, number, or void" i elems))) - (define (undefined? x) (eq? x (letrec ([x x]) x))) (define or/c-args (map (λ (x) (cond [(void? x) void?] - [(undefined? x) undefined?] [else x])) elems)) (apply or/c or/c-args)) diff --git a/racket/collects/racket/private/class-c-old.rkt b/racket/collects/racket/private/class-c-old.rkt index 517d883c92..2e05c84b44 100644 --- a/racket/collects/racket/private/class-c-old.rkt +++ b/racket/collects/racket/private/class-c-old.rkt @@ -3,6 +3,7 @@ racket/stxparam syntax/parse) racket/stxparam + racket/undefined "class-wrapped.rkt" "class-internal.rkt" "../contract/base.rkt" @@ -20,8 +21,6 @@ build-internal-class/c internal-class/c-proj class/c-internal-name-clauses) -(define undefined (letrec ([x x]) x)) - ;; Shorthand contracts that treat the implicit object argument as if it were ;; contracted with any/c. (define-syntax-rule (->m . stx) diff --git a/racket/collects/racket/private/class-internal.rkt b/racket/collects/racket/private/class-internal.rkt index d9b831ce19..1191c811eb 100644 --- a/racket/collects/racket/private/class-internal.rkt +++ b/racket/collects/racket/private/class-internal.rkt @@ -9,6 +9,7 @@ (only-in "../contract/region.rkt" current-contract-region) "../contract/base.rkt" "../contract/combinator.rkt" + racket/undefined (for-syntax racket/stxparam syntax/kerncase syntax/stx @@ -4375,8 +4376,6 @@ An example ;; misc utils ;;-------------------------------------------------------------------- -(define undefined (letrec ([x x]) x)) - (define-struct (exn:fail:object exn:fail) () #:inspector insp) (struct as-write (content)) diff --git a/racket/collects/racket/private/classidmap.rkt b/racket/collects/racket/private/classidmap.rkt index 0f6a8a7e10..b0dd01c342 100644 --- a/racket/collects/racket/private/classidmap.rkt +++ b/racket/collects/racket/private/classidmap.rkt @@ -3,6 +3,7 @@ (require syntax/stx (for-syntax racket/base) (for-template racket/base + racket/undefined "class-wrapped.rkt")) (define insp (variable-reference->module-declaration-inspector @@ -83,12 +84,12 @@ [(id . args) (with-syntax ([bindings (syntax/loc stx ([obj obj-expr]))] [call (quasisyntax/loc stx - (((unsyntax field-accessor) obj) . args))]) + ((check-not-undefined ((unsyntax field-accessor) obj) 'id) . args))]) (syntax/loc stx (let* bindings call)))] [id (with-syntax ([bindings (syntax/loc stx ([obj obj-expr]))] [get (quasisyntax/loc stx - ((unsyntax field-accessor) obj))]) + (check-not-undefined ((unsyntax field-accessor) obj) 'id))]) (syntax/loc stx (let* bindings get)))]))))))) (define (make-method-map the-finder the-obj the-binder the-binder-localized method-accessor) diff --git a/racket/collects/racket/private/pre-base.rkt b/racket/collects/racket/private/pre-base.rkt index 8266105f22..b3bbb836e4 100644 --- a/racket/collects/racket/private/pre-base.rkt +++ b/racket/collects/racket/private/pre-base.rkt @@ -179,7 +179,8 @@ procedure->method procedure-rename chaperone-procedure impersonate-procedure assq assv assoc - prop:incomplete-arity prop:method-arity-error) + prop:incomplete-arity prop:method-arity-error + check-not-undefined undefined) (all-from "reqprov.rkt") (all-from-except "for.rkt" define-in-vector-like diff --git a/racket/collects/racket/private/unit-runtime.rkt b/racket/collects/racket/private/unit-runtime.rkt index ddc971c7f9..c8c56936fa 100644 --- a/racket/collects/racket/private/unit-runtime.rkt +++ b/racket/collects/racket/private/unit-runtime.rkt @@ -2,7 +2,7 @@ (require (for-syntax "unit-syntax.rkt" racket/base)) (provide define-syntax/err-param - undefined (rename-out [make-a-unit make-unit]) unit-import-sigs unit-export-sigs unit-go unit? unit-deps + (rename-out [make-a-unit make-unit]) unit-import-sigs unit-export-sigs unit-go unit? unit-deps check-unit check-no-imports check-sigs check-deps check-helper) (define-syntax define-syntax/err-param @@ -12,9 +12,6 @@ (parameterize ((error-syntax arg)) body))))) -;; initial value -(define undefined (letrec ([x x]) x)) - ;; for named structures (define insp (current-inspector)) diff --git a/racket/collects/racket/shared.rkt b/racket/collects/racket/shared.rkt index ca37e8160e..1a95d4a80d 100644 --- a/racket/collects/racket/shared.rkt +++ b/racket/collects/racket/shared.rkt @@ -3,14 +3,14 @@ syntax/kerncase syntax/struct racket/struct-info - racket/include)) + racket/include) + racket/undefined) (provide shared) (define-for-syntax code-insp (variable-reference->module-declaration-inspector (#%variable-reference))) -(define undefined (letrec ([x x]) x)) (require (only-in racket/base [cons the-cons])) (define-syntax shared diff --git a/racket/collects/racket/undefined.rkt b/racket/collects/racket/undefined.rkt index 29252b11b5..bd9b7d367f 100644 --- a/racket/collects/racket/undefined.rkt +++ b/racket/collects/racket/undefined.rkt @@ -1,8 +1,8 @@ #lang racket/base +(require '#%kernel) -(provide undefined) +(provide check-not-undefined + undefined + undefined?) -;; In a future version of Racket, this `letrec` pattern -;; will not work, but the `racket/undefined` library will -;; still export an `undefined`: -(define undefined (letrec ([x x]) x)) +(define (undefined? v) (eq? v undefined)) diff --git a/racket/collects/racket/unit.rkt b/racket/collects/racket/unit.rkt index e7c98b9a88..d637f9b4f9 100644 --- a/racket/collects/racket/unit.rkt +++ b/racket/collects/racket/unit.rkt @@ -17,6 +17,7 @@ "private/unit-syntax.rkt")) (require racket/block + racket/undefined racket/contract/base racket/contract/region racket/stxparam @@ -1186,7 +1187,8 @@ (lambda (int/ext-name index ctc) (bound-identifier-mapping-put! def-table (car int/ext-name) - #`(vector-ref #,v #,index)) + #`(check-not-undefined (vector-ref #,v #,index) + '#,(car int/ext-name))) (bound-identifier-mapping-put! ctc-table (car int/ext-name) ctc) diff --git a/racket/collects/syntax/toplevel.rkt b/racket/collects/syntax/toplevel.rkt index b35ba4fbde..b775937f74 100644 --- a/racket/collects/syntax/toplevel.rkt +++ b/racket/collects/syntax/toplevel.rkt @@ -1,5 +1,6 @@ (module toplevel racket/base - (require "kerncase.rkt") + (require "kerncase.rkt" + racket/undefined) (provide eval-compile-time-part-of-top-level eval-compile-time-part-of-top-level/compile @@ -74,8 +75,7 @@ (begin0 (when compile? (compile-syntax stx)) (for-each (lambda (id) - (with-syntax ([id id] - [undefined (letrec ([x x]) x)]) + (with-syntax ([id id]) (eval-syntax (syntax (define-values (id) undefined))))) (syntax->list (syntax (id ...)))))] [_else diff --git a/racket/src/racket/gc2/Makefile.in b/racket/src/racket/gc2/Makefile.in index 6630aeb4b9..0f0794e094 100644 --- a/racket/src/racket/gc2/Makefile.in +++ b/racket/src/racket/gc2/Makefile.in @@ -76,6 +76,7 @@ OBJS = salloc.@LTO@ \ jitprep.@LTO@ \ jitstack.@LTO@ \ jitstate.@LTO@ \ + letrec_check.@LTO@ \ list.@LTO@ \ marshal.@LTO@ \ module.@LTO@ \ @@ -135,6 +136,7 @@ XSRCS = $(XSRCDIR)/salloc.c \ $(XSRCDIR)/jitprep.c \ $(XSRCDIR)/jitstack.c \ $(XSRCDIR)/jitstate.c \ + $(XSRCDIR)/letrec_check.c \ $(XSRCDIR)/list.c \ $(XSRCDIR)/marshal.c \ $(XSRCDIR)/module.c \ @@ -253,6 +255,8 @@ $(XSRCDIR)/marshal.c: ../src/marshal.@LTO@ $(XFORMDEP) $(SRCDIR)/mzrt.h $(XFORM) $(XSRCDIR)/marshal.c $(SRCDIR)/marshal.c $(XSRCDIR)/module.c: ../src/module.@LTO@ $(XFORMDEP) $(SRCDIR)/mzrt.h $(XFORM) $(XSRCDIR)/module.c $(SRCDIR)/module.c +$(XSRCDIR)/letrec_check.c: ../src/letrec_check.@LTO@ $(XFORMDEP) + $(XFORM) $(XSRCDIR)/letrec_check.c $(SRCDIR)/letrec_check.c $(XSRCDIR)/list.c: ../src/list.@LTO@ $(XFORMDEP) $(XFORM) $(XSRCDIR)/list.c $(SRCDIR)/list.c $(XSRCDIR)/network.c: ../src/network.@LTO@ $(XFORMDEP) @@ -360,6 +364,8 @@ jitstack.@LTO@: $(XSRCDIR)/jitstack.c $(CC) $(ALL_CFLAGS) -c $(XSRCDIR)/jitstack.c -o jitstack.@LTO@ jitstate.@LTO@: $(XSRCDIR)/jitstate.c $(CC) $(ALL_CFLAGS) -c $(XSRCDIR)/jitstate.c -o jitstate.@LTO@ +letrec_check.@LTO@: $(XSRCDIR)/letrec_check.c + $(CC) $(ALL_CFLAGS) -c $(XSRCDIR)/letrec_check.c -o letrec_check.@LTO@ list.@LTO@: $(XSRCDIR)/list.c $(CC) $(ALL_CFLAGS) -c $(XSRCDIR)/list.c -o list.@LTO@ marshal.@LTO@: $(XSRCDIR)/marshal.c diff --git a/racket/src/racket/src/Makefile.in b/racket/src/racket/src/Makefile.in index e64c8f286e..3583b8c718 100644 --- a/racket/src/racket/src/Makefile.in +++ b/racket/src/racket/src/Makefile.in @@ -39,6 +39,7 @@ OBJS = salloc.@LTO@ \ jitprep.@LTO@ \ jitstack.@LTO@ \ jitstate.@LTO@ \ + letrec_check.@LTO@ \ list.@LTO@ \ marshal.@LTO@ \ module.@LTO@ \ @@ -96,6 +97,7 @@ SRCS = $(srcdir)/salloc.c \ $(srcdir)/jitprep.c \ $(srcdir)/jitstack.c \ $(srcdir)/jitstate.c \ + $(srcdir)/letrec_check.c \ $(srcdir)/list.c \ $(srcdir)/marshal.c \ $(srcdir)/module.c \ @@ -226,6 +228,8 @@ jitstack.@LTO@: $(srcdir)/jitstack.c $(CC) $(ALL_CFLAGS) -c $(srcdir)/jitstack.c -o jitstack.@LTO@ jitstate.@LTO@: $(srcdir)/jitstate.c $(CC) $(ALL_CFLAGS) -c $(srcdir)/jitstate.c -o jitstate.@LTO@ +letrec_check.@LTO@: $(srcdir)/letrec_check.c + $(CC) $(ALL_CFLAGS) -c $(srcdir)/letrec_check.c -o letrec_check.@LTO@ list.@LTO@: $(srcdir)/list.c $(CC) $(ALL_CFLAGS) -c $(srcdir)/list.c -o list.@LTO@ marshal.@LTO@: $(srcdir)/marshal.c @@ -362,6 +366,8 @@ jitprep.@LTO@: $(COMMON_HEADERS) \ jitstack.@LTO@: $(COMMON_HEADERS) $(JIT_HEADERS) $(srcdir)/codetab.inc \ $(srcdir)/unwind/libunwind.h jitstate.@LTO@: $(COMMON_HEADERS) $(JIT_HEADERS) +letrec_check.@LTO@: $(COMMON_HEADERS) \ + $(srcdir)/stypes.h list.@LTO@: $(COMMON_HEADERS) \ $(srcdir)/stypes.h marshal.@LTO@: $(COMMON_HEADERS) \ diff --git a/racket/src/racket/src/compenv.c b/racket/src/racket/src/compenv.c index 5a7d838d5c..45001b83b4 100644 --- a/racket/src/racket/src/compenv.c +++ b/racket/src/racket/src/compenv.c @@ -28,6 +28,10 @@ #define TABLE_CACHE_MAX_SIZE 2048 +/* Pre-allocate local variable reference objects. + first dimension: position in the current stack frame + second dimension: 0 for local variables, 1 for unboxed local variables + third dimension: flags. TODO has to do with whether something is an unboxed fixnum, flonum, or extnum */ READ_ONLY static Scheme_Object *scheme_local[MAX_CONST_LOCAL_POS][MAX_CONST_LOCAL_TYPES][MAX_CONST_LOCAL_FLAG_VAL + 1]; READ_ONLY static Scheme_Object *toplevels[MAX_CONST_TOPLEVEL_DEPTH][MAX_CONST_TOPLEVEL_POS][SCHEME_TOPLEVEL_FLAGS_MASK + 1]; @@ -853,11 +857,14 @@ static Scheme_Object *alloc_local(short type, int pos) return (Scheme_Object *)v; } +/* type should be either scheme_local_type or scheme_local_unbox_type + TODO: double check that */ Scheme_Object *scheme_make_local(Scheme_Type type, int pos, int flags) { int k; Scheme_Object *v, *key; + /* k is 0 if type is scheme_local_type and 1 if type is scheme_local_unbox_type */ k = type - scheme_local_type; /* Helper for reading bytecode: make sure flags is a valid value */ @@ -899,7 +906,9 @@ static Scheme_Local *get_frame_loc(Scheme_Comp_Env *frame, int cnt, u; u = COMPILE_DATA(frame)->use[i]; - + + // flags -= (flags & SCHEME_APP_POS); + u |= (((flags & (SCHEME_APP_POS | SCHEME_SETTING)) ? CONSTRAINED_USE : ((u & (ARBITRARY_USE | ONE_ARBITRARY_USE)) ? ARBITRARY_USE : ONE_ARBITRARY_USE)) diff --git a/racket/src/racket/src/compile.c b/racket/src/racket/src/compile.c index f70213a8c1..f7adca4fbd 100644 --- a/racket/src/racket/src/compile.c +++ b/racket/src/racket/src/compile.c @@ -1210,18 +1210,6 @@ set_syntax (Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Info *rec, rec[drec].value_name = SCHEME_STX_SYM(name); val = scheme_compile_expr(body, scheme_no_defines(env), rec, drec); - - /* check for (set! x x) */ - if (SAME_TYPE(SCHEME_TYPE(var), SCHEME_TYPE(val))) { - if (SAME_TYPE(SCHEME_TYPE(var), scheme_local_type) - || SAME_TYPE(SCHEME_TYPE(var), scheme_local_unbox_type)) { - /* local */ - if (SCHEME_LOCAL_POS(var) == SCHEME_LOCAL_POS(val)) - return scheme_compiled_void(); - } else { - /* global; can't do anything b/c var might be undefined or constant */ - } - } set_undef = (rec[drec].comp_flags & COMP_ALLOW_SET_UNDEFINED); @@ -2073,7 +2061,7 @@ gen_let_syntax (Scheme_Object *form, Scheme_Comp_Env *origenv, char *formname, int star, int recursive, int multi, Scheme_Compile_Info *rec, int drec, Scheme_Comp_Env *frame_already) { - Scheme_Object *bindings, *l, *binding, *name, **names, *forms, *defname; + Scheme_Object *bindings, *l, *binding, *name, **names, **clv_names, *forms, *defname; int num_clauses, num_bindings, i, j, k, m, pre_k; Scheme_Comp_Env *frame, *env, *rhs_env; Scheme_Compile_Info *recs; @@ -2110,6 +2098,7 @@ gen_let_syntax (Scheme_Object *form, Scheme_Comp_Env *origenv, char *formname, post_bind = !recursive && !star; rev_bind_order = recursive; + /* forms ends up being the let body */ forms = SCHEME_STX_CDR(form); forms = SCHEME_STX_CDR(forms); forms = scheme_datum_to_syntax(forms, form, form, 0, 0); @@ -2266,6 +2255,16 @@ gen_let_syntax (Scheme_Object *form, Scheme_Comp_Env *origenv, char *formname, lv->count = (k - pre_k); lv->position = pre_k; + if (recursive) { + /* The names are only used for recursive bindings (in letrec_check), + currently. It would be ok if we record extra names, though. */ + clv_names = MALLOC_N(Scheme_Object*, lv->count); + for (m = pre_k; m < k; m++) { + clv_names[m - pre_k] = SCHEME_STX_SYM(names[m]); + } + lv->names = clv_names; + } + if (lv->count == 1) recs[i].value_name = SCHEME_STX_SYM(names[pre_k]); @@ -2827,6 +2826,8 @@ do_begin_syntax(char *name, if (zero) env = scheme_no_defines(env); + /* if the begin has only one expression inside, drop the begin + TODO: is this right */ if (SCHEME_STX_NULLP(SCHEME_STX_CDR(forms))) { forms = SCHEME_STX_CAR(forms); return scheme_compile_expr(forms, env, rec, drec); @@ -2924,9 +2925,9 @@ Scheme_Object *scheme_make_sequence_compilation(Scheme_Object *seq, int opt) /* "Inline" nested begins */ count += ((Scheme_Sequence *)v)->count; total++; - } else if (opt - && (((opt > 0) && !last) || ((opt < 0) && !first)) - && scheme_omittable_expr(v, -1, -1, 0, NULL, NULL, -1, 0)) { + } else if (opt + && (((opt > 0) && !last) || ((opt < 0) && !first)) + && scheme_omittable_expr(v, -1, -1, 0, NULL, NULL, -1, 1)) { /* A value that is not the result. We'll drop it. */ total++; } else { @@ -2954,7 +2955,7 @@ Scheme_Object *scheme_make_sequence_compilation(Scheme_Object *seq, int opt) /* can't optimize away a begin0 at read time; it's too late, since the return is combined with EXPD_BEGIN0 */ addconst = 1; - } else if ((opt < 0) && !scheme_omittable_expr(SCHEME_CAR(seq), 1, -1, 0, NULL, NULL, -1, 0)) { + } else if ((opt < 0) && !scheme_omittable_expr(SCHEME_CAR(seq), 1, -1, 0, NULL, NULL, -1, 1)) { /* We can't optimize (begin0 expr cont) to expr because exp is not in tail position in the original (so we'd mess up continuation marks). */ @@ -2986,7 +2987,7 @@ Scheme_Object *scheme_make_sequence_compilation(Scheme_Object *seq, int opt) } else if (opt && (((opt > 0) && (k < total)) || ((opt < 0) && k)) - && scheme_omittable_expr(v, -1, -1, 0, NULL, NULL, -1, 0)) { + && scheme_omittable_expr(v, -1, -1, 0, NULL, NULL, -1, 1)) { /* Value not the result. Do nothing. */ } else o->array[i++] = v; @@ -3574,6 +3575,8 @@ void scheme_bind_syntaxes(const char *where, Scheme_Object *names, Scheme_Object a = scheme_compile_expr_lift_to_let(a, eenv, &mrec, 0); + a = scheme_letrec_check_expr(a); + oi = scheme_optimize_info_create(eenv->prefix, 1); if (!(rec[drec].comp_flags & COMP_CAN_INLINE)) scheme_optimize_info_never_inline(oi); diff --git a/racket/src/racket/src/cstartup.inc b/racket/src/racket/src/cstartup.inc index bb5e9cdbd3..960baf2a3a 100644 --- a/racket/src/racket/src/cstartup.inc +++ b/racket/src/racket/src/cstartup.inc @@ -1,14 +1,14 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,49,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,32,0,37,0,40,0,47,0,54,0,59,0,63,0,67,0,74,0,83, +21,0,28,0,33,0,37,0,40,0,45,0,58,0,62,0,67,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,84,3,105,3,158,3, 225,3,114,4,2,5,56,5,67,5,150,5,0,0,115,7,0,0,69,35,37, -109,105,110,45,115,116,120,29,11,11,11,64,119,104,101,110,72,112,97,114,97, -109,101,116,101,114,105,122,101,64,99,111,110,100,62,111,114,66,100,101,102,105, -110,101,66,108,101,116,114,101,99,64,108,101,116,42,63,108,101,116,63,97,110, +109,105,110,45,115,116,120,29,11,11,11,66,100,101,102,105,110,101,66,108,101, +116,114,101,99,64,108,101,116,42,63,97,110,100,62,111,114,64,119,104,101,110, +72,112,97,114,97,109,101,116,101,114,105,122,101,63,108,101,116,64,99,111,110, 100,66,117,110,108,101,115,115,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, @@ -17,63 +17,63 @@ 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, 18,88,0,0,95,144,2,17,36,36,144,2,16,36,36,144,2,16,36,36,16, -20,2,3,2,2,2,5,2,2,2,4,2,2,2,6,2,2,2,7,2,2, -2,8,2,2,2,9,2,2,2,10,2,2,2,11,2,2,2,12,2,2,97, +20,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,2, +2,8,2,2,2,11,2,2,2,10,2,2,2,9,2,2,2,12,2,2,97, 37,11,8,240,18,88,0,0,93,144,2,16,36,37,16,2,2,13,146,2,2, -37,2,13,2,2,2,13,96,11,11,8,240,18,88,0,0,16,0,96,38,11, +37,2,13,2,2,2,13,96,38,11,8,240,18,88,0,0,16,0,96,11,11, 8,240,18,88,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,143,39,36,251,22,90,2,18,248,22,102,199,12,249,22,80,2,19, -248,22,104,201,27,248,22,164,4,195,249,22,157,4,80,143,39,36,251,22,90, -2,18,248,22,102,199,249,22,80,2,19,248,22,104,201,12,27,248,22,82,248, -22,164,4,196,28,248,22,88,193,20,14,144,37,36,37,28,248,22,88,248,22, -82,194,248,22,144,18,193,249,22,157,4,80,143,39,36,251,22,90,2,18,248, -22,144,18,199,249,22,80,2,11,248,22,145,18,201,11,18,100,10,13,16,6, +2,2,11,11,11,8,32,8,31,8,30,8,29,27,248,22,166,4,195,249,22, +159,4,80,143,39,36,251,22,92,2,18,248,22,104,199,12,249,22,82,2,19, +248,22,106,201,27,248,22,166,4,195,249,22,159,4,80,143,39,36,251,22,92, +2,18,248,22,104,199,249,22,82,2,19,248,22,106,201,12,27,248,22,84,248, +22,166,4,196,28,248,22,90,193,20,14,144,37,36,37,28,248,22,90,248,22, +84,194,248,22,146,18,193,249,22,159,4,80,143,39,36,251,22,92,2,18,248, +22,146,18,199,249,22,82,2,6,248,22,147,18,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,54,55,55,16,4,11,11,2,21,3,1,8, -101,110,118,49,55,54,55,56,27,248,22,82,248,22,164,4,196,28,248,22,88, -193,20,14,144,37,36,37,28,248,22,88,248,22,82,194,248,22,144,18,193,249, -22,157,4,80,143,39,36,250,22,90,2,22,248,22,90,249,22,90,248,22,90, -2,23,248,22,144,18,201,251,22,90,2,18,2,23,2,23,249,22,80,2,6, -248,22,145,18,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8,32, +101,110,118,49,55,54,55,56,27,248,22,84,248,22,166,4,196,28,248,22,90, +193,20,14,144,37,36,37,28,248,22,90,248,22,84,194,248,22,146,18,193,249, +22,159,4,80,143,39,36,250,22,92,2,22,248,22,92,249,22,92,248,22,92, +2,23,248,22,146,18,201,251,22,92,2,18,2,23,2,23,249,22,82,2,7, +248,22,147,18,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,54, 56,48,16,4,11,11,2,21,3,1,8,101,110,118,49,55,54,56,49,248,22, -164,4,193,27,248,22,164,4,194,249,22,80,248,22,90,248,22,81,196,248,22, -145,18,195,27,248,22,82,248,22,164,4,23,197,1,249,22,157,4,80,143,39, -36,28,248,22,64,248,22,158,4,248,22,81,23,198,2,27,249,22,2,32,0, -88,148,8,36,37,43,11,9,222,33,40,248,22,164,4,248,22,102,23,200,2, -250,22,90,2,24,248,22,90,249,22,90,248,22,90,248,22,144,18,23,204,2, -250,22,91,2,25,249,22,2,22,81,23,204,2,248,22,104,23,206,2,249,22, -80,248,22,144,18,23,202,1,249,22,2,22,102,23,200,1,250,22,91,2,22, -249,22,2,32,0,88,148,8,36,37,47,11,9,222,33,41,248,22,164,4,248, -22,144,18,201,248,22,145,18,198,27,248,22,164,4,194,249,22,80,248,22,90, -248,22,81,196,248,22,145,18,195,27,248,22,82,248,22,164,4,23,197,1,249, -22,157,4,80,143,39,36,250,22,91,2,24,249,22,2,32,0,88,148,8,36, -37,47,11,9,222,33,43,248,22,164,4,248,22,81,201,248,22,145,18,198,27, -248,22,82,248,22,164,4,196,27,248,22,164,4,248,22,81,195,249,22,157,4, -80,143,40,36,28,248,22,88,195,250,22,91,2,22,9,248,22,82,199,250,22, -90,2,10,248,22,90,248,22,81,199,250,22,91,2,9,248,22,145,18,201,248, -22,82,202,27,248,22,82,248,22,164,4,23,197,1,27,249,22,1,22,94,249, -22,2,22,164,4,248,22,164,4,248,22,81,199,248,22,185,4,249,22,157,4, -80,143,41,36,251,22,90,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,91,1,23,101,120,116,101, +166,4,193,27,248,22,166,4,194,249,22,82,248,22,92,248,22,83,196,248,22, +147,18,195,27,248,22,84,248,22,166,4,23,197,1,249,22,159,4,80,143,39, +36,28,248,22,66,248,22,160,4,248,22,83,23,198,2,27,249,22,2,32,0, +88,148,8,36,37,43,11,9,222,33,40,248,22,166,4,248,22,104,23,200,2, +250,22,92,2,24,248,22,92,249,22,92,248,22,92,248,22,146,18,23,204,2, +250,22,93,2,25,249,22,2,22,83,23,204,2,248,22,106,23,206,2,249,22, +82,248,22,146,18,23,202,1,249,22,2,22,104,23,200,1,250,22,93,2,22, +249,22,2,32,0,88,148,8,36,37,47,11,9,222,33,41,248,22,166,4,248, +22,146,18,201,248,22,147,18,198,27,248,22,166,4,194,249,22,82,248,22,92, +248,22,83,196,248,22,147,18,195,27,248,22,84,248,22,166,4,23,197,1,249, +22,159,4,80,143,39,36,250,22,93,2,24,249,22,2,32,0,88,148,8,36, +37,47,11,9,222,33,43,248,22,166,4,248,22,83,201,248,22,147,18,198,27, +248,22,84,248,22,166,4,196,27,248,22,166,4,248,22,83,195,249,22,159,4, +80,143,40,36,28,248,22,90,195,250,22,93,2,22,9,248,22,84,199,250,22, +92,2,10,248,22,92,248,22,83,199,250,22,93,2,5,248,22,147,18,201,248, +22,84,202,27,248,22,84,248,22,166,4,23,197,1,27,249,22,1,22,96,249, +22,2,22,166,4,248,22,166,4,248,22,83,199,248,22,187,4,249,22,159,4, +80,143,41,36,251,22,92,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,93,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,91,2,22,9,248,22,82, -204,27,248,22,82,248,22,164,4,196,28,248,22,88,193,20,14,144,37,36,37, -249,22,157,4,80,143,39,36,27,248,22,164,4,248,22,81,197,28,249,22,167, -9,62,61,62,248,22,158,4,248,22,102,196,250,22,90,2,22,248,22,90,249, -22,90,21,93,2,27,248,22,81,199,250,22,91,2,5,249,22,90,2,27,249, -22,90,248,22,111,203,2,27,248,22,82,202,251,22,90,2,18,28,249,22,167, -9,248,22,158,4,248,22,81,200,64,101,108,115,101,10,248,22,144,18,197,250, -22,91,2,22,9,248,22,145,18,200,249,22,80,2,5,248,22,82,202,99,13, +101,116,45,102,105,114,115,116,11,2,26,202,250,22,93,2,22,9,248,22,84, +204,27,248,22,84,248,22,166,4,196,28,248,22,90,193,20,14,144,37,36,37, +249,22,159,4,80,143,39,36,27,248,22,166,4,248,22,83,197,28,249,22,169, +9,62,61,62,248,22,160,4,248,22,104,196,250,22,92,2,22,248,22,92,249, +22,92,21,93,2,27,248,22,83,199,250,22,93,2,11,249,22,92,2,27,249, +22,92,248,22,113,203,2,27,248,22,84,202,251,22,92,2,18,28,249,22,169, +9,248,22,160,4,248,22,83,200,64,101,108,115,101,10,248,22,146,18,197,250, +22,93,2,22,9,248,22,147,18,200,249,22,82,2,11,248,22,84,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,55,48,51,16,4,11,11,2,21,3, 1,8,101,110,118,49,55,55,48,52,18,143,94,10,64,118,111,105,100,8,48, -27,248,22,82,248,22,164,4,196,249,22,157,4,80,143,39,36,28,248,22,64, -248,22,158,4,248,22,81,197,250,22,90,2,28,248,22,90,248,22,144,18,199, -248,22,102,198,27,248,22,158,4,248,22,144,18,197,250,22,90,2,28,248,22, -90,248,22,81,197,250,22,91,2,25,248,22,145,18,199,248,22,145,18,202,144, +27,248,22,84,248,22,166,4,196,249,22,159,4,80,143,39,36,28,248,22,66, +248,22,160,4,248,22,83,197,250,22,92,2,28,248,22,92,248,22,146,18,199, +248,22,104,198,27,248,22,160,4,248,22,146,18,197,250,22,92,2,28,248,22, +92,248,22,83,197,250,22,93,2,25,248,22,147,18,199,248,22,147,18,202,144, 36,20,114,144,36,16,1,11,16,0,20,26,15,58,9,2,1,2,1,2,2, 11,9,9,11,11,11,10,36,80,143,36,36,20,114,144,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, @@ -83,24 +83,24 @@ 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,144,36,36,37,80,143,36,36,36,20,114,144,36,16, 1,2,13,16,1,33,33,10,16,5,2,12,88,148,8,36,37,53,37,9,223, -0,33,34,36,20,114,144,36,16,1,2,13,16,0,11,16,5,2,3,88,148, +0,33,34,36,20,114,144,36,16,1,2,13,16,0,11,16,5,2,8,88,148, 8,36,37,53,37,9,223,0,33,35,36,20,114,144,36,16,1,2,13,16,0, -11,16,5,2,11,88,148,8,36,37,53,37,9,223,0,33,36,36,20,114,144, -36,16,1,2,13,16,1,33,37,11,16,5,2,6,88,148,8,36,37,56,37, +11,16,5,2,6,88,148,8,36,37,53,37,9,223,0,33,36,36,20,114,144, +36,16,1,2,13,16,1,33,37,11,16,5,2,7,88,148,8,36,37,56,37, 9,223,0,33,38,36,20,114,144,36,16,1,2,13,16,1,33,39,11,16,5, 2,10,88,148,8,36,37,58,37,9,223,0,33,42,36,20,114,144,36,16,1, -2,13,16,0,11,16,5,2,8,88,148,8,36,37,53,37,9,223,0,33,44, -36,20,114,144,36,16,1,2,13,16,0,11,16,5,2,9,88,148,8,36,37, +2,13,16,0,11,16,5,2,4,88,148,8,36,37,53,37,9,223,0,33,44, +36,20,114,144,36,16,1,2,13,16,0,11,16,5,2,5,88,148,8,36,37, 54,37,9,223,0,33,45,36,20,114,144,36,16,1,2,13,16,0,11,16,5, -2,4,88,148,8,36,37,56,37,9,223,0,33,46,36,20,114,144,36,16,1, -2,13,16,0,11,16,5,2,5,88,148,8,36,37,58,37,9,223,0,33,47, -36,20,114,144,36,16,1,2,13,16,1,33,49,11,16,5,2,7,88,148,8, +2,9,88,148,8,36,37,56,37,9,223,0,33,46,36,20,114,144,36,16,1, +2,13,16,0,11,16,5,2,11,88,148,8,36,37,58,37,9,223,0,33,47, +36,20,114,144,36,16,1,2,13,16,1,33,49,11,16,5,2,3,88,148,8, 36,37,54,37,9,223,0,33,50,36,20,114,144,36,16,1,2,13,16,0,11, 16,0,94,2,16,2,17,93,2,16,9,9,36,9,0}; EVAL_ONE_SIZED_STR((char *)expr, 2051); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,49,46,50,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,187,0,0,0,1,0,0,8,0,21,0, 26,0,43,0,55,0,77,0,106,0,150,0,156,0,165,0,172,0,187,0,205, 0,217,0,233,0,247,0,13,1,32,1,39,1,73,1,90,1,107,1,130,1, @@ -180,748 +180,748 @@ 109,101,110,116,32,101,109,112,116,121,6,10,10,103,105,118,101,110,32,112,97, 116,104,66,102,105,110,105,115,104,5,1,95,5,11,80,76,84,67,79,76,76, 69,67,84,83,1,20,99,111,108,108,101,99,116,115,45,115,101,97,114,99,104, -45,100,105,114,115,6,8,8,99,111,108,108,101,99,116,115,27,248,22,160,15, -194,28,192,192,28,248,22,151,7,194,27,248,22,183,15,195,28,192,192,248,22, -184,15,195,11,0,21,35,114,120,34,94,91,92,92,93,91,92,92,93,91,63, +45,100,105,114,115,6,8,8,99,111,108,108,101,99,116,115,27,248,22,162,15, +194,28,192,192,28,248,22,153,7,194,27,248,22,185,15,195,28,192,192,248,22, +186,15,195,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,161,15,23,195,2,10,28,248,22,160,15,23,195,2,10,28,248,22,151, -7,23,195,2,28,248,22,183,15,23,195,2,10,248,22,184,15,23,195,2,11, -12,250,22,176,11,2,41,2,42,23,197,2,28,28,248,22,161,15,23,195,2, -249,22,167,9,248,22,162,15,23,197,2,2,43,249,22,167,9,247,22,178,8, -2,43,27,28,248,22,151,7,23,196,2,23,195,2,248,22,163,8,248,22,165, -15,23,197,2,28,249,22,156,16,2,78,23,195,2,28,248,22,151,7,195,248, -22,168,15,195,194,27,248,22,190,7,23,195,1,249,22,169,15,248,22,166,8, -250,22,164,16,2,79,28,249,22,156,16,2,80,23,201,2,23,199,1,250,22, -164,16,2,81,23,202,1,2,44,80,144,44,37,38,2,43,28,248,22,151,7, -194,248,22,168,15,194,193,0,28,35,114,120,34,94,92,92,92,92,92,92,92, +248,22,163,15,23,195,2,10,28,248,22,162,15,23,195,2,10,28,248,22,153, +7,23,195,2,28,248,22,185,15,23,195,2,10,248,22,186,15,23,195,2,11, +12,250,22,178,11,2,41,2,42,23,197,2,28,28,248,22,163,15,23,195,2, +249,22,169,9,248,22,164,15,23,197,2,2,43,249,22,169,9,247,22,180,8, +2,43,27,28,248,22,153,7,23,196,2,23,195,2,248,22,165,8,248,22,167, +15,23,197,2,28,249,22,158,16,2,78,23,195,2,28,248,22,153,7,195,248, +22,170,15,195,194,27,248,22,128,8,23,195,1,249,22,171,15,248,22,168,8, +250,22,166,16,2,79,28,249,22,158,16,2,80,23,201,2,23,199,1,250,22, +166,16,2,81,23,202,1,2,44,80,144,44,37,38,2,43,28,248,22,153,7, +194,248,22,170,15,194,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,160,15,23,195,2,10,28,248,22,151,7,23,195,2,28,248,22,183,15, -23,195,2,10,248,22,184,15,23,195,2,11,10,248,22,161,15,23,195,2,12, -252,22,176,11,2,5,2,45,36,23,199,2,23,200,2,28,28,28,248,22,160, -15,23,196,2,10,28,248,22,151,7,23,196,2,28,248,22,183,15,23,196,2, -10,248,22,184,15,23,196,2,11,10,248,22,161,15,23,196,2,12,252,22,176, -11,2,5,2,45,37,23,199,2,23,200,2,27,28,248,22,161,15,23,196,2, -248,22,162,15,23,196,2,247,22,163,15,86,95,28,28,248,22,185,15,23,196, -2,10,249,22,167,9,247,22,163,15,23,195,2,12,253,22,178,11,2,5,6, +248,22,162,15,23,195,2,10,28,248,22,153,7,23,195,2,28,248,22,185,15, +23,195,2,10,248,22,186,15,23,195,2,11,10,248,22,163,15,23,195,2,12, +252,22,178,11,2,5,2,45,36,23,199,2,23,200,2,28,28,28,248,22,162, +15,23,196,2,10,28,248,22,153,7,23,196,2,28,248,22,185,15,23,196,2, +10,248,22,186,15,23,196,2,11,10,248,22,163,15,23,196,2,12,252,22,178, +11,2,5,2,45,37,23,199,2,23,200,2,27,28,248,22,163,15,23,196,2, +248,22,164,15,23,196,2,247,22,165,15,86,95,28,28,248,22,187,15,23,196, +2,10,249,22,169,9,247,22,165,15,23,195,2,12,253,22,180,11,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,46,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,163,15,28,249,22,167,9,28,248,22,161,15,23,199,2, -248,22,162,15,23,199,2,247,22,163,15,23,195,2,12,253,22,178,11,2,5, +116,121,112,101,247,22,165,15,28,249,22,169,9,28,248,22,163,15,23,199,2, +248,22,164,15,23,199,2,247,22,165,15,23,195,2,12,253,22,180,11,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,46, 23,201,2,6,9,9,114,111,111,116,32,112,97,116,104,23,202,2,27,27,248, -22,189,15,28,248,22,185,15,23,199,2,23,198,1,248,22,186,15,23,199,1, -86,94,28,28,248,22,161,15,23,194,2,10,28,248,22,160,15,23,194,2,10, -28,248,22,151,7,23,194,2,28,248,22,183,15,23,194,2,10,248,22,184,15, -23,194,2,11,12,250,22,176,11,2,41,2,42,23,196,2,28,28,248,22,161, -15,23,194,2,249,22,167,9,248,22,162,15,23,196,2,2,43,249,22,167,9, -247,22,178,8,2,43,27,28,248,22,151,7,23,195,2,23,194,2,248,22,163, -8,248,22,165,15,23,196,2,28,249,22,156,16,2,78,23,195,2,28,248,22, -151,7,194,248,22,168,15,194,193,27,248,22,190,7,23,195,1,249,22,169,15, -248,22,166,8,250,22,164,16,2,79,28,249,22,156,16,2,80,23,201,2,23, -199,1,250,22,164,16,2,81,23,202,1,2,44,80,144,47,37,38,2,43,28, -248,22,151,7,193,248,22,168,15,193,192,27,248,22,165,15,23,195,2,28,249, -22,167,9,23,197,2,64,117,110,105,120,28,249,22,148,8,194,5,1,47,28, -248,22,161,15,198,197,248,22,168,15,198,249,22,178,15,199,249,22,169,15,249, -22,151,8,248,22,165,15,200,37,198,28,249,22,167,9,23,197,2,2,43,249, -22,178,15,23,200,1,249,22,169,15,28,249,22,156,16,0,27,35,114,120,34, +22,191,15,28,248,22,187,15,23,199,2,23,198,1,248,22,188,15,23,199,1, +86,94,28,28,248,22,163,15,23,194,2,10,28,248,22,162,15,23,194,2,10, +28,248,22,153,7,23,194,2,28,248,22,185,15,23,194,2,10,248,22,186,15, +23,194,2,11,12,250,22,178,11,2,41,2,42,23,196,2,28,28,248,22,163, +15,23,194,2,249,22,169,9,248,22,164,15,23,196,2,2,43,249,22,169,9, +247,22,180,8,2,43,27,28,248,22,153,7,23,195,2,23,194,2,248,22,165, +8,248,22,167,15,23,196,2,28,249,22,158,16,2,78,23,195,2,28,248,22, +153,7,194,248,22,170,15,194,193,27,248,22,128,8,23,195,1,249,22,171,15, +248,22,168,8,250,22,166,16,2,79,28,249,22,158,16,2,80,23,201,2,23, +199,1,250,22,166,16,2,81,23,202,1,2,44,80,144,47,37,38,2,43,28, +248,22,153,7,193,248,22,170,15,193,192,27,248,22,167,15,23,195,2,28,249, +22,169,9,23,197,2,64,117,110,105,120,28,249,22,150,8,194,5,1,47,28, +248,22,163,15,198,197,248,22,170,15,198,249,22,180,15,199,249,22,171,15,249, +22,153,8,248,22,167,15,200,37,198,28,249,22,169,9,23,197,2,2,43,249, +22,180,15,23,200,1,249,22,171,15,28,249,22,158,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,152,8,2,47,250,22,151,8,203,40,41,5,1,92, -249,22,151,8,202,42,28,249,22,156,16,2,83,23,199,2,249,22,152,8,2, -47,249,22,151,8,200,40,28,249,22,156,16,2,83,23,199,2,249,22,152,8, -2,47,249,22,151,8,200,40,28,249,22,156,16,0,14,35,114,120,34,94,92, -92,92,92,92,92,92,92,34,23,199,2,249,22,152,8,5,4,85,78,67,92, -249,22,151,8,200,38,28,249,22,156,16,0,12,35,114,120,34,94,91,97,45, -122,93,58,34,198,249,22,152,8,250,22,151,8,201,36,37,249,22,151,8,200, +58,34,23,199,2,251,22,154,8,2,47,250,22,153,8,203,40,41,5,1,92, +249,22,153,8,202,42,28,249,22,158,16,2,83,23,199,2,249,22,154,8,2, +47,249,22,153,8,200,40,28,249,22,158,16,2,83,23,199,2,249,22,154,8, +2,47,249,22,153,8,200,40,28,249,22,158,16,0,14,35,114,120,34,94,92, +92,92,92,92,92,92,92,34,23,199,2,249,22,154,8,5,4,85,78,67,92, +249,22,153,8,200,38,28,249,22,158,16,0,12,35,114,120,34,94,91,97,45, +122,93,58,34,198,249,22,154,8,250,22,153,8,201,36,37,249,22,153,8,200, 38,12,198,12,32,85,88,148,8,36,39,53,11,70,102,111,117,110,100,45,101, 120,101,99,222,33,88,32,86,88,148,8,36,40,58,11,64,110,101,120,116,222, -33,87,27,248,22,187,15,23,196,2,28,249,22,169,9,23,195,2,23,197,1, -11,28,248,22,183,15,23,194,2,27,249,22,178,15,23,197,1,23,196,1,28, -23,197,2,90,144,39,11,89,146,39,36,11,248,22,181,15,23,197,2,86,95, -23,195,1,23,194,1,27,28,23,202,2,27,248,22,187,15,23,199,2,28,249, -22,169,9,23,195,2,23,200,2,11,28,248,22,183,15,23,194,2,250,2,85, -23,205,2,23,206,2,249,22,178,15,23,200,2,23,198,1,250,2,85,23,205, +33,87,27,248,22,189,15,23,196,2,28,249,22,171,9,23,195,2,23,197,1, +11,28,248,22,185,15,23,194,2,27,249,22,180,15,23,197,1,23,196,1,28, +23,197,2,90,144,39,11,89,146,39,36,11,248,22,183,15,23,197,2,86,95, +23,195,1,23,194,1,27,28,23,202,2,27,248,22,189,15,23,199,2,28,249, +22,171,9,23,195,2,23,200,2,11,28,248,22,185,15,23,194,2,250,2,85, +23,205,2,23,206,2,249,22,180,15,23,200,2,23,198,1,250,2,85,23,205, 2,23,206,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248, -22,160,15,23,196,2,27,249,22,178,15,23,198,2,23,205,2,28,28,248,22, -173,15,193,10,248,22,172,15,193,192,11,11,28,23,193,2,192,86,94,23,193, -1,28,23,203,2,11,27,248,22,187,15,23,200,2,28,249,22,169,9,194,23, -201,1,11,28,248,22,183,15,193,250,2,85,205,206,249,22,178,15,200,197,250, +22,162,15,23,196,2,27,249,22,180,15,23,198,2,23,205,2,28,28,248,22, +175,15,193,10,248,22,174,15,193,192,11,11,28,23,193,2,192,86,94,23,193, +1,28,23,203,2,11,27,248,22,189,15,23,200,2,28,249,22,171,9,194,23, +201,1,11,28,248,22,185,15,193,250,2,85,205,206,249,22,180,15,200,197,250, 2,85,205,206,195,192,86,94,23,194,1,28,23,196,2,90,144,39,11,89,146, -39,36,11,248,22,181,15,23,197,2,86,95,23,195,1,23,194,1,27,28,23, -201,2,27,248,22,187,15,23,199,2,28,249,22,169,9,23,195,2,23,200,2, -11,28,248,22,183,15,23,194,2,250,2,85,23,204,2,23,205,2,249,22,178, +39,36,11,248,22,183,15,23,197,2,86,95,23,195,1,23,194,1,27,28,23, +201,2,27,248,22,189,15,23,199,2,28,249,22,171,9,23,195,2,23,200,2, +11,28,248,22,185,15,23,194,2,250,2,85,23,204,2,23,205,2,249,22,180, 15,23,200,2,23,198,1,250,2,85,23,204,2,23,205,2,23,196,1,11,28, -23,193,2,192,86,94,23,193,1,27,28,248,22,160,15,23,196,2,27,249,22, -178,15,23,198,2,23,204,2,28,28,248,22,173,15,193,10,248,22,172,15,193, +23,193,2,192,86,94,23,193,1,27,28,248,22,162,15,23,196,2,27,249,22, +180,15,23,198,2,23,204,2,28,28,248,22,175,15,193,10,248,22,174,15,193, 192,11,11,28,23,193,2,192,86,94,23,193,1,28,23,202,2,11,27,248,22, -187,15,23,200,2,28,249,22,169,9,194,23,201,1,11,28,248,22,183,15,193, -250,2,85,204,205,249,22,178,15,200,197,250,2,85,204,205,195,192,28,23,193, -2,90,144,39,11,89,146,39,36,11,248,22,181,15,23,199,2,86,95,23,195, +189,15,23,200,2,28,249,22,171,9,194,23,201,1,11,28,248,22,185,15,193, +250,2,85,204,205,249,22,180,15,200,197,250,2,85,204,205,195,192,28,23,193, +2,90,144,39,11,89,146,39,36,11,248,22,183,15,23,199,2,86,95,23,195, 1,23,194,1,27,28,23,198,2,251,2,86,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,160,15,195, -27,249,22,178,15,197,200,28,28,248,22,173,15,193,10,248,22,172,15,193,192, +23,202,2,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,162,15,195, +27,249,22,180,15,197,200,28,28,248,22,175,15,193,10,248,22,174,15,193,192, 11,11,28,192,192,28,198,11,251,2,86,198,203,201,202,194,32,89,88,148,8, -36,40,57,11,2,50,222,33,90,28,248,22,88,23,197,2,11,27,249,22,178, -15,248,22,186,15,248,22,81,23,201,2,23,196,2,28,248,22,172,15,23,194, -2,250,2,85,197,198,195,86,94,23,193,1,27,248,22,82,23,199,1,28,248, -22,88,23,194,2,11,27,249,22,178,15,248,22,186,15,248,22,81,23,198,2, -23,198,2,28,248,22,172,15,23,194,2,250,2,85,199,200,195,86,94,23,193, -1,27,248,22,82,23,196,1,28,248,22,88,23,194,2,11,27,249,22,178,15, -248,22,186,15,248,22,81,23,198,2,23,200,2,28,248,22,172,15,23,194,2, -250,2,85,201,202,195,86,94,23,193,1,27,248,22,82,23,196,1,28,248,22, -88,23,194,2,11,27,249,22,178,15,248,22,186,15,248,22,81,197,201,28,248, -22,172,15,193,250,2,85,203,204,195,251,2,89,203,204,205,248,22,82,198,86, -95,28,28,248,22,160,15,23,195,2,10,28,248,22,151,7,23,195,2,28,248, -22,183,15,23,195,2,10,248,22,184,15,23,195,2,11,12,250,22,176,11,2, -6,2,48,23,197,2,28,28,23,195,2,28,28,248,22,160,15,23,196,2,10, -28,248,22,151,7,23,196,2,28,248,22,183,15,23,196,2,10,248,22,184,15, -23,196,2,11,248,22,183,15,23,196,2,11,10,12,250,22,176,11,2,6,6, +36,40,57,11,2,50,222,33,90,28,248,22,90,23,197,2,11,27,249,22,180, +15,248,22,188,15,248,22,83,23,201,2,23,196,2,28,248,22,174,15,23,194, +2,250,2,85,197,198,195,86,94,23,193,1,27,248,22,84,23,199,1,28,248, +22,90,23,194,2,11,27,249,22,180,15,248,22,188,15,248,22,83,23,198,2, +23,198,2,28,248,22,174,15,23,194,2,250,2,85,199,200,195,86,94,23,193, +1,27,248,22,84,23,196,1,28,248,22,90,23,194,2,11,27,249,22,180,15, +248,22,188,15,248,22,83,23,198,2,23,200,2,28,248,22,174,15,23,194,2, +250,2,85,201,202,195,86,94,23,193,1,27,248,22,84,23,196,1,28,248,22, +90,23,194,2,11,27,249,22,180,15,248,22,188,15,248,22,83,197,201,28,248, +22,174,15,193,250,2,85,203,204,195,251,2,89,203,204,205,248,22,84,198,86, +95,28,28,248,22,162,15,23,195,2,10,28,248,22,153,7,23,195,2,28,248, +22,185,15,23,195,2,10,248,22,186,15,23,195,2,11,12,250,22,178,11,2, +6,2,48,23,197,2,28,28,23,195,2,28,28,248,22,162,15,23,196,2,10, +28,248,22,153,7,23,196,2,28,248,22,185,15,23,196,2,10,248,22,186,15, +23,196,2,11,248,22,185,15,23,196,2,11,10,12,250,22,178,11,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,183,15,23,195,2,90,144,39,11, -89,146,39,36,11,248,22,181,15,23,198,2,249,22,167,9,194,2,49,11,27, -249,22,173,8,247,22,172,8,5,4,80,65,84,72,27,28,23,194,2,249,80, -143,40,41,249,22,163,8,23,198,1,7,63,9,86,94,23,194,1,9,27,28, -249,22,167,9,247,22,178,8,2,43,249,22,80,248,22,169,15,5,1,46,23, -196,1,23,194,1,28,248,22,88,23,194,2,11,27,249,22,178,15,248,22,186, -15,248,22,81,23,198,2,23,200,2,28,248,22,172,15,23,194,2,250,2,85, -201,202,195,86,94,23,193,1,27,248,22,82,23,196,1,28,248,22,88,23,194, -2,11,27,249,22,178,15,248,22,186,15,248,22,81,23,198,2,23,202,2,28, -248,22,172,15,23,194,2,250,2,85,203,204,195,86,94,23,193,1,27,248,22, -82,23,196,1,28,248,22,88,23,194,2,11,27,249,22,178,15,248,22,186,15, -248,22,81,23,198,2,23,204,2,28,248,22,172,15,23,194,2,250,2,85,205, -206,195,86,94,23,193,1,27,248,22,82,23,196,1,28,248,22,88,23,194,2, -11,27,249,22,178,15,248,22,186,15,248,22,81,197,205,28,248,22,172,15,193, -250,2,85,23,15,23,16,195,251,2,89,23,15,23,16,23,17,248,22,82,198, -27,248,22,186,15,23,196,1,28,248,22,172,15,193,250,2,85,198,199,195,11, +116,104,63,41,41,23,198,2,28,28,248,22,185,15,23,195,2,90,144,39,11, +89,146,39,36,11,248,22,183,15,23,198,2,249,22,169,9,194,2,49,11,27, +249,22,175,8,247,22,174,8,5,4,80,65,84,72,27,28,23,194,2,249,80, +143,40,41,249,22,165,8,23,198,1,7,63,9,86,94,23,194,1,9,27,28, +249,22,169,9,247,22,180,8,2,43,249,22,82,248,22,171,15,5,1,46,23, +196,1,23,194,1,28,248,22,90,23,194,2,11,27,249,22,180,15,248,22,188, +15,248,22,83,23,198,2,23,200,2,28,248,22,174,15,23,194,2,250,2,85, +201,202,195,86,94,23,193,1,27,248,22,84,23,196,1,28,248,22,90,23,194, +2,11,27,249,22,180,15,248,22,188,15,248,22,83,23,198,2,23,202,2,28, +248,22,174,15,23,194,2,250,2,85,203,204,195,86,94,23,193,1,27,248,22, +84,23,196,1,28,248,22,90,23,194,2,11,27,249,22,180,15,248,22,188,15, +248,22,83,23,198,2,23,204,2,28,248,22,174,15,23,194,2,250,2,85,205, +206,195,86,94,23,193,1,27,248,22,84,23,196,1,28,248,22,90,23,194,2, +11,27,249,22,180,15,248,22,188,15,248,22,83,197,205,28,248,22,174,15,193, +250,2,85,23,15,23,16,195,251,2,89,23,15,23,16,23,17,248,22,84,198, +27,248,22,188,15,23,196,1,28,248,22,174,15,193,250,2,85,198,199,195,11, 250,80,144,39,40,39,196,197,11,250,80,144,39,40,39,196,11,11,32,94,88, 148,8,36,39,57,11,2,50,222,33,96,0,8,35,114,120,35,34,92,34,34, -27,249,22,152,16,23,197,2,23,198,2,28,23,193,2,86,94,23,196,1,27, -248,22,102,23,195,2,27,27,248,22,111,23,197,1,27,249,22,152,16,23,201, -2,23,196,2,28,23,193,2,86,94,23,194,1,27,248,22,102,23,195,2,27, -250,2,94,23,203,2,23,204,1,248,22,111,23,199,1,28,249,22,148,8,23, -196,2,2,51,249,22,94,23,202,2,194,249,22,80,248,22,169,15,28,249,22, -167,9,247,22,178,8,2,43,250,22,164,16,2,95,23,200,1,2,51,196,194, -86,95,23,199,1,23,193,1,28,249,22,148,8,23,196,2,2,51,249,22,94, -23,200,2,9,249,22,80,248,22,169,15,28,249,22,167,9,247,22,178,8,2, -43,250,22,164,16,2,95,23,200,1,2,51,196,9,28,249,22,148,8,23,196, -2,2,51,249,22,94,197,194,86,94,23,196,1,249,22,80,248,22,169,15,28, -249,22,167,9,247,22,178,8,2,43,250,22,164,16,2,95,23,200,1,2,51, -196,194,86,94,23,193,1,28,249,22,148,8,23,198,2,2,51,249,22,94,195, -9,86,94,23,194,1,249,22,80,248,22,169,15,28,249,22,167,9,247,22,178, -8,2,43,250,22,164,16,2,95,23,202,1,2,51,198,9,86,95,28,28,248, -22,140,8,194,10,248,22,151,7,194,12,250,22,176,11,2,7,6,21,21,40, +27,249,22,154,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,154,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,94,23,203,2,23,204,1,248,22,113,23,199,1,28,249,22,150,8,23, +196,2,2,51,249,22,96,23,202,2,194,249,22,82,248,22,171,15,28,249,22, +169,9,247,22,180,8,2,43,250,22,166,16,2,95,23,200,1,2,51,196,194, +86,95,23,199,1,23,193,1,28,249,22,150,8,23,196,2,2,51,249,22,96, +23,200,2,9,249,22,82,248,22,171,15,28,249,22,169,9,247,22,180,8,2, +43,250,22,166,16,2,95,23,200,1,2,51,196,9,28,249,22,150,8,23,196, +2,2,51,249,22,96,197,194,86,94,23,196,1,249,22,82,248,22,171,15,28, +249,22,169,9,247,22,180,8,2,43,250,22,166,16,2,95,23,200,1,2,51, +196,194,86,94,23,193,1,28,249,22,150,8,23,198,2,2,51,249,22,96,195, +9,86,94,23,194,1,249,22,82,248,22,171,15,28,249,22,169,9,247,22,180, +8,2,43,250,22,166,16,2,95,23,202,1,2,51,198,9,86,95,28,28,248, +22,142,8,194,10,248,22,153,7,194,12,250,22,178,11,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,196, -28,28,248,22,89,195,249,22,4,22,160,15,196,11,12,250,22,176,11,2,7, +28,28,248,22,91,195,249,22,4,22,162,15,196,11,12,250,22,178,11,2,7, 6,14,14,40,108,105,115,116,111,102,32,112,97,116,104,63,41,197,250,2,94, -197,195,28,248,22,151,7,197,248,22,165,8,197,196,28,28,248,22,0,23,195, -2,249,22,50,23,196,2,36,11,20,13,144,80,144,36,43,37,26,29,80,144, -8,29,44,37,249,22,33,11,80,144,8,31,43,37,22,130,15,10,22,131,15, -10,22,132,15,10,22,135,15,10,22,134,15,11,22,136,15,10,22,133,15,10, -22,137,15,10,22,138,15,10,22,139,15,10,22,140,15,10,22,141,15,11,22, -142,15,10,22,128,15,11,247,23,194,1,250,22,176,11,2,8,2,52,23,197, -1,86,94,28,28,248,22,160,15,23,195,2,10,28,248,22,151,7,23,195,2, -28,248,22,183,15,23,195,2,10,248,22,184,15,23,195,2,11,12,250,22,176, -11,23,196,2,2,48,23,197,2,28,248,22,183,15,23,195,2,12,251,22,178, -11,23,197,1,2,53,2,46,23,198,1,86,94,28,28,248,22,160,15,23,195, -2,10,28,248,22,151,7,23,195,2,28,248,22,183,15,23,195,2,10,248,22, -184,15,23,195,2,11,12,250,22,176,11,23,196,2,2,48,23,197,2,28,248, -22,183,15,23,195,2,12,251,22,178,11,23,197,1,2,53,2,46,23,198,1, -86,94,86,94,28,28,248,22,160,15,23,195,2,10,28,248,22,151,7,23,195, -2,28,248,22,183,15,23,195,2,10,248,22,184,15,23,195,2,11,12,250,22, -176,11,23,196,2,2,48,23,197,2,28,248,22,183,15,23,195,2,86,94,23, -194,1,12,251,22,178,11,23,197,2,2,53,2,46,23,198,1,249,22,3,20, +197,195,28,248,22,153,7,197,248,22,167,8,197,196,28,28,248,22,0,23,195, +2,249,22,52,23,196,2,36,11,20,13,144,80,144,36,43,37,26,29,80,144, +8,29,44,37,249,22,33,11,80,144,8,31,43,37,22,132,15,10,22,133,15, +10,22,134,15,10,22,137,15,10,22,136,15,11,22,138,15,10,22,135,15,10, +22,139,15,10,22,140,15,10,22,141,15,10,22,142,15,10,22,143,15,11,22, +144,15,10,22,130,15,11,247,23,194,1,250,22,178,11,2,8,2,52,23,197, +1,86,94,28,28,248,22,162,15,23,195,2,10,28,248,22,153,7,23,195,2, +28,248,22,185,15,23,195,2,10,248,22,186,15,23,195,2,11,12,250,22,178, +11,23,196,2,2,48,23,197,2,28,248,22,185,15,23,195,2,12,251,22,180, +11,23,197,1,2,53,2,46,23,198,1,86,94,28,28,248,22,162,15,23,195, +2,10,28,248,22,153,7,23,195,2,28,248,22,185,15,23,195,2,10,248,22, +186,15,23,195,2,11,12,250,22,178,11,23,196,2,2,48,23,197,2,28,248, +22,185,15,23,195,2,12,251,22,180,11,23,197,1,2,53,2,46,23,198,1, +86,94,86,94,28,28,248,22,162,15,23,195,2,10,28,248,22,153,7,23,195, +2,28,248,22,185,15,23,195,2,10,248,22,186,15,23,195,2,11,12,250,22, +178,11,23,196,2,2,48,23,197,2,28,248,22,185,15,23,195,2,86,94,23, +194,1,12,251,22,180,11,23,197,2,2,53,2,46,23,198,1,249,22,3,20, 20,94,88,148,8,36,37,47,11,9,223,2,33,100,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,176,11,23, -196,1,2,54,23,197,1,86,94,28,28,248,22,160,15,23,194,2,10,28,248, -22,151,7,23,194,2,28,248,22,183,15,23,194,2,10,248,22,184,15,23,194, -2,11,12,250,22,176,11,2,15,2,48,23,196,2,28,248,22,183,15,23,194, -2,12,251,22,178,11,2,15,2,53,2,46,23,197,1,86,95,86,94,86,94, -28,28,248,22,160,15,23,196,2,10,28,248,22,151,7,23,196,2,28,248,22, -183,15,23,196,2,10,248,22,184,15,23,196,2,11,12,250,22,176,11,2,15, -2,48,23,198,2,28,248,22,183,15,23,196,2,12,251,22,178,11,2,15,2, +28,248,22,0,23,195,2,249,22,52,23,196,2,37,11,12,250,22,178,11,23, +196,1,2,54,23,197,1,86,94,28,28,248,22,162,15,23,194,2,10,28,248, +22,153,7,23,194,2,28,248,22,185,15,23,194,2,10,248,22,186,15,23,194, +2,11,12,250,22,178,11,2,15,2,48,23,196,2,28,248,22,185,15,23,194, +2,12,251,22,180,11,2,15,2,53,2,46,23,197,1,86,95,86,94,86,94, +28,28,248,22,162,15,23,196,2,10,28,248,22,153,7,23,196,2,28,248,22, +185,15,23,196,2,10,248,22,186,15,23,196,2,11,12,250,22,178,11,2,15, +2,48,23,198,2,28,248,22,185,15,23,196,2,12,251,22,180,11,2,15,2, 53,2,46,23,199,2,249,22,3,32,0,88,148,8,36,37,46,11,9,222,33, -103,23,198,2,28,28,248,22,0,23,195,2,249,22,50,23,196,2,37,11,12, -250,22,176,11,2,15,2,54,23,197,2,251,80,143,40,49,23,198,1,23,199, -1,23,200,1,11,86,94,28,28,248,22,160,15,23,194,2,10,28,248,22,151, -7,23,194,2,28,248,22,183,15,23,194,2,10,248,22,184,15,23,194,2,11, -12,250,22,176,11,2,17,2,48,23,196,2,28,248,22,183,15,23,194,2,12, -251,22,178,11,2,17,2,53,2,46,23,197,1,86,96,86,94,28,28,248,22, -160,15,23,196,2,10,28,248,22,151,7,23,196,2,28,248,22,183,15,23,196, -2,10,248,22,184,15,23,196,2,11,12,250,22,176,11,2,17,2,48,23,198, -2,28,248,22,183,15,23,196,2,12,251,22,178,11,2,17,2,53,2,46,23, -199,2,86,94,86,94,28,28,248,22,160,15,23,197,2,10,28,248,22,151,7, -23,197,2,28,248,22,183,15,23,197,2,10,248,22,184,15,23,197,2,11,12, -250,22,176,11,2,17,2,48,23,199,2,28,248,22,183,15,23,197,2,12,251, -22,178,11,2,17,2,53,2,46,23,200,2,249,22,3,32,0,88,148,8,36, -37,46,11,9,222,33,105,23,199,2,28,28,248,22,0,23,195,2,249,22,50, -23,196,2,37,11,12,250,22,176,11,2,17,2,54,23,197,2,251,80,143,40, -49,23,198,1,23,200,1,23,201,1,23,199,1,27,248,22,137,16,2,55,28, -248,22,185,15,23,194,2,248,22,188,15,23,194,1,28,248,22,184,15,23,194, -2,90,144,39,11,89,146,39,36,11,248,22,181,15,249,22,186,15,27,248,22, -137,16,2,56,250,80,144,47,40,39,23,196,1,11,11,248,22,137,16,2,57, -86,95,23,195,1,23,194,1,248,22,188,15,249,22,186,15,23,199,1,23,196, -1,27,250,80,144,41,40,39,248,22,137,16,2,56,23,197,1,10,28,23,193, -2,248,22,188,15,23,194,1,11,249,80,144,38,52,37,36,80,144,38,8,39, -39,27,248,22,137,16,2,58,28,248,22,185,15,23,194,2,248,22,188,15,23, -194,1,28,248,22,184,15,23,194,2,90,144,39,11,89,146,39,36,11,248,22, -181,15,249,22,186,15,27,248,22,137,16,2,56,250,80,144,47,40,39,23,196, -1,11,11,248,22,137,16,2,57,86,95,23,195,1,23,194,1,248,22,188,15, -249,22,186,15,23,199,1,23,196,1,27,250,80,144,41,40,39,248,22,137,16, -2,56,23,197,1,10,28,23,193,2,248,22,188,15,23,194,1,11,249,80,144, +103,23,198,2,28,28,248,22,0,23,195,2,249,22,52,23,196,2,37,11,12, +250,22,178,11,2,15,2,54,23,197,2,251,80,143,40,49,23,198,1,23,199, +1,23,200,1,11,86,94,28,28,248,22,162,15,23,194,2,10,28,248,22,153, +7,23,194,2,28,248,22,185,15,23,194,2,10,248,22,186,15,23,194,2,11, +12,250,22,178,11,2,17,2,48,23,196,2,28,248,22,185,15,23,194,2,12, +251,22,180,11,2,17,2,53,2,46,23,197,1,86,96,86,94,28,28,248,22, +162,15,23,196,2,10,28,248,22,153,7,23,196,2,28,248,22,185,15,23,196, +2,10,248,22,186,15,23,196,2,11,12,250,22,178,11,2,17,2,48,23,198, +2,28,248,22,185,15,23,196,2,12,251,22,180,11,2,17,2,53,2,46,23, +199,2,86,94,86,94,28,28,248,22,162,15,23,197,2,10,28,248,22,153,7, +23,197,2,28,248,22,185,15,23,197,2,10,248,22,186,15,23,197,2,11,12, +250,22,178,11,2,17,2,48,23,199,2,28,248,22,185,15,23,197,2,12,251, +22,180,11,2,17,2,53,2,46,23,200,2,249,22,3,32,0,88,148,8,36, +37,46,11,9,222,33,105,23,199,2,28,28,248,22,0,23,195,2,249,22,52, +23,196,2,37,11,12,250,22,178,11,2,17,2,54,23,197,2,251,80,143,40, +49,23,198,1,23,200,1,23,201,1,23,199,1,27,248,22,139,16,2,55,28, +248,22,187,15,23,194,2,248,22,190,15,23,194,1,28,248,22,186,15,23,194, +2,90,144,39,11,89,146,39,36,11,248,22,183,15,249,22,188,15,27,248,22, +139,16,2,56,250,80,144,47,40,39,23,196,1,11,11,248,22,139,16,2,57, +86,95,23,195,1,23,194,1,248,22,190,15,249,22,188,15,23,199,1,23,196, +1,27,250,80,144,41,40,39,248,22,139,16,2,56,23,197,1,10,28,23,193, +2,248,22,190,15,23,194,1,11,249,80,144,38,52,37,36,80,144,38,8,39, +39,27,248,22,139,16,2,58,28,248,22,187,15,23,194,2,248,22,190,15,23, +194,1,28,248,22,186,15,23,194,2,90,144,39,11,89,146,39,36,11,248,22, +183,15,249,22,188,15,27,248,22,139,16,2,56,250,80,144,47,40,39,23,196, +1,11,11,248,22,139,16,2,57,86,95,23,195,1,23,194,1,248,22,190,15, +249,22,188,15,23,199,1,23,196,1,27,250,80,144,41,40,39,248,22,139,16, +2,56,23,197,1,10,28,23,193,2,248,22,190,15,23,194,1,11,249,80,144, 38,52,37,37,80,144,38,8,40,39,27,20,13,144,80,144,37,43,37,26,29, -80,144,8,30,44,37,249,22,33,11,80,144,8,32,43,37,22,130,15,10,22, -131,15,10,22,132,15,10,22,135,15,10,22,134,15,11,22,136,15,10,22,133, -15,10,22,137,15,10,22,138,15,10,22,139,15,10,22,140,15,10,22,141,15, -11,22,142,15,10,22,128,15,11,247,22,146,6,28,248,22,149,2,193,192,11, -27,28,23,195,2,249,22,178,15,23,197,1,6,11,11,99,111,110,102,105,103, -46,114,107,116,100,86,94,23,195,1,11,27,28,23,194,2,28,248,22,172,15, -23,195,2,249,22,138,6,23,196,1,80,144,40,8,41,39,11,11,28,192,192, -21,17,1,0,250,22,158,2,23,196,1,2,59,247,22,169,8,250,22,158,2, -195,2,59,247,22,169,8,28,248,22,151,7,23,195,2,27,248,22,168,15,23, -196,1,28,248,22,185,15,23,194,2,192,249,22,186,15,23,195,1,27,247,80, -144,40,51,39,28,23,193,2,192,86,94,23,193,1,247,22,138,16,28,248,22, -140,8,23,195,2,27,248,22,169,15,23,196,1,28,248,22,185,15,23,194,2, -192,249,22,186,15,23,195,1,27,247,80,144,40,51,39,28,23,193,2,192,86, -94,23,193,1,247,22,138,16,28,248,22,160,15,23,195,2,28,248,22,185,15, -23,195,2,193,249,22,186,15,23,196,1,27,247,80,144,39,51,39,28,23,193, -2,192,86,94,23,193,1,247,22,138,16,193,27,248,22,137,16,2,55,28,248, -22,185,15,23,194,2,248,22,188,15,23,194,1,28,248,22,184,15,23,194,2, -90,144,39,11,89,146,39,36,11,248,22,181,15,249,22,186,15,27,248,22,137, -16,2,56,250,80,144,47,40,39,23,196,1,11,11,248,22,137,16,2,57,86, -95,23,195,1,23,194,1,248,22,188,15,249,22,186,15,23,199,1,23,196,1, -27,250,80,144,41,40,39,248,22,137,16,2,56,23,197,1,10,28,23,193,2, -248,22,188,15,23,194,1,11,28,248,22,185,15,23,195,2,193,249,22,186,15, +80,144,8,30,44,37,249,22,33,11,80,144,8,32,43,37,22,132,15,10,22, +133,15,10,22,134,15,10,22,137,15,10,22,136,15,11,22,138,15,10,22,135, +15,10,22,139,15,10,22,140,15,10,22,141,15,10,22,142,15,10,22,143,15, +11,22,144,15,10,22,130,15,11,247,22,148,6,28,248,22,151,2,193,192,11, +27,28,23,195,2,249,22,180,15,23,197,1,6,11,11,99,111,110,102,105,103, +46,114,107,116,100,86,94,23,195,1,11,27,28,23,194,2,28,248,22,174,15, +23,195,2,249,22,140,6,23,196,1,80,144,40,8,41,39,11,11,28,192,192, +21,17,1,0,250,22,160,2,23,196,1,2,59,247,22,171,8,250,22,160,2, +195,2,59,247,22,171,8,28,248,22,153,7,23,195,2,27,248,22,170,15,23, +196,1,28,248,22,187,15,23,194,2,192,249,22,188,15,23,195,1,27,247,80, +144,40,51,39,28,23,193,2,192,86,94,23,193,1,247,22,140,16,28,248,22, +142,8,23,195,2,27,248,22,171,15,23,196,1,28,248,22,187,15,23,194,2, +192,249,22,188,15,23,195,1,27,247,80,144,40,51,39,28,23,193,2,192,86, +94,23,193,1,247,22,140,16,28,248,22,162,15,23,195,2,28,248,22,187,15, +23,195,2,193,249,22,188,15,23,196,1,27,247,80,144,39,51,39,28,23,193, +2,192,86,94,23,193,1,247,22,140,16,193,27,248,22,139,16,2,55,28,248, +22,187,15,23,194,2,248,22,190,15,23,194,1,28,248,22,186,15,23,194,2, +90,144,39,11,89,146,39,36,11,248,22,183,15,249,22,188,15,27,248,22,139, +16,2,56,250,80,144,47,40,39,23,196,1,11,11,248,22,139,16,2,57,86, +95,23,195,1,23,194,1,248,22,190,15,249,22,188,15,23,199,1,23,196,1, +27,250,80,144,41,40,39,248,22,139,16,2,56,23,197,1,10,28,23,193,2, +248,22,190,15,23,194,1,11,28,248,22,187,15,23,195,2,193,249,22,188,15, 23,196,1,27,249,80,144,41,52,37,36,80,144,41,8,42,39,28,23,193,2, -192,86,94,23,193,1,247,22,138,16,28,248,22,185,15,23,195,2,248,22,188, -15,23,195,1,28,248,22,184,15,23,195,2,90,144,39,11,89,146,39,36,11, -248,22,181,15,249,22,186,15,27,248,22,137,16,2,56,250,80,144,46,40,39, -23,196,1,11,11,248,22,137,16,2,57,86,95,23,195,1,23,194,1,248,22, -188,15,249,22,186,15,23,200,1,23,196,1,27,250,80,144,40,40,39,248,22, -137,16,2,56,23,198,1,10,28,23,193,2,248,22,188,15,23,194,1,11,28, -248,22,88,23,196,2,9,28,248,22,81,23,196,2,249,22,80,27,248,22,144, -18,23,199,2,28,248,22,151,7,23,194,2,27,248,22,168,15,23,195,1,28, -248,22,185,15,23,194,2,192,249,22,186,15,23,195,1,27,247,80,144,43,51, -39,28,23,193,2,192,86,94,23,193,1,247,22,138,16,28,248,22,140,8,23, -194,2,27,248,22,169,15,23,195,1,28,248,22,185,15,23,194,2,192,249,22, -186,15,23,195,1,27,247,80,144,43,51,39,28,23,193,2,192,86,94,23,193, -1,247,22,138,16,28,248,22,160,15,23,194,2,28,248,22,185,15,23,194,2, -192,249,22,186,15,23,195,1,27,247,80,144,42,51,39,28,23,193,2,192,86, -94,23,193,1,247,22,138,16,192,27,248,22,145,18,23,199,1,28,248,22,88, -23,194,2,9,28,248,22,81,23,194,2,249,22,80,248,80,144,42,57,39,248, -22,144,18,23,197,2,27,248,22,145,18,23,197,1,28,248,22,88,23,194,2, -9,28,248,22,81,23,194,2,249,22,80,248,80,144,45,57,39,248,22,144,18, -23,197,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23,198,1,249, -22,94,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23,198, -1,249,22,94,23,199,2,27,248,22,145,18,23,197,1,28,248,22,88,23,194, -2,9,28,248,22,81,23,194,2,249,22,80,248,80,144,45,57,39,248,22,144, -18,23,197,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23,198,1, -249,22,94,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23, -198,1,249,22,94,23,196,2,27,248,22,145,18,23,199,1,28,248,22,88,23, -194,2,9,28,248,22,81,23,194,2,249,22,80,248,80,144,42,57,39,248,22, -144,18,23,197,2,27,248,22,145,18,23,197,1,28,248,22,88,23,194,2,9, -28,248,22,81,23,194,2,249,22,80,248,80,144,45,57,39,248,22,144,18,23, -197,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23,198,1,249,22, -94,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23,198,1, -249,22,94,23,199,2,27,248,22,145,18,23,197,1,28,248,22,88,23,194,2, -9,28,248,22,81,23,194,2,249,22,80,248,80,144,45,57,39,248,22,144,18, -23,197,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23,198,1,249, -22,94,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,145,18,23,198, -1,27,250,22,158,2,23,198,1,23,199,1,11,28,192,249,80,144,39,8,43, -39,198,194,196,27,248,22,137,16,2,58,28,248,22,185,15,23,194,2,248,22, -188,15,23,194,1,28,248,22,184,15,23,194,2,90,144,39,11,89,146,39,36, -11,248,22,181,15,249,22,186,15,27,248,22,137,16,2,56,250,80,144,47,40, -39,23,196,1,11,11,248,22,137,16,2,57,86,95,23,195,1,23,194,1,248, -22,188,15,249,22,186,15,23,199,1,23,196,1,27,250,80,144,41,40,39,248, -22,137,16,2,56,23,197,1,10,28,23,193,2,248,22,188,15,23,194,1,11, +192,86,94,23,193,1,247,22,140,16,28,248,22,187,15,23,195,2,248,22,190, +15,23,195,1,28,248,22,186,15,23,195,2,90,144,39,11,89,146,39,36,11, +248,22,183,15,249,22,188,15,27,248,22,139,16,2,56,250,80,144,46,40,39, +23,196,1,11,11,248,22,139,16,2,57,86,95,23,195,1,23,194,1,248,22, +190,15,249,22,188,15,23,200,1,23,196,1,27,250,80,144,40,40,39,248,22, +139,16,2,56,23,198,1,10,28,23,193,2,248,22,190,15,23,194,1,11,28, +248,22,90,23,196,2,9,28,248,22,83,23,196,2,249,22,82,27,248,22,146, +18,23,199,2,28,248,22,153,7,23,194,2,27,248,22,170,15,23,195,1,28, +248,22,187,15,23,194,2,192,249,22,188,15,23,195,1,27,247,80,144,43,51, +39,28,23,193,2,192,86,94,23,193,1,247,22,140,16,28,248,22,142,8,23, +194,2,27,248,22,171,15,23,195,1,28,248,22,187,15,23,194,2,192,249,22, +188,15,23,195,1,27,247,80,144,43,51,39,28,23,193,2,192,86,94,23,193, +1,247,22,140,16,28,248,22,162,15,23,194,2,28,248,22,187,15,23,194,2, +192,249,22,188,15,23,195,1,27,247,80,144,42,51,39,28,23,193,2,192,86, +94,23,193,1,247,22,140,16,192,27,248,22,147,18,23,199,1,28,248,22,90, +23,194,2,9,28,248,22,83,23,194,2,249,22,82,248,80,144,42,57,39,248, +22,146,18,23,197,2,27,248,22,147,18,23,197,1,28,248,22,90,23,194,2, +9,28,248,22,83,23,194,2,249,22,82,248,80,144,45,57,39,248,22,146,18, +23,197,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23,198,1,249, +22,96,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23,198, +1,249,22,96,23,199,2,27,248,22,147,18,23,197,1,28,248,22,90,23,194, +2,9,28,248,22,83,23,194,2,249,22,82,248,80,144,45,57,39,248,22,146, +18,23,197,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23,198,1, +249,22,96,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23, +198,1,249,22,96,23,196,2,27,248,22,147,18,23,199,1,28,248,22,90,23, +194,2,9,28,248,22,83,23,194,2,249,22,82,248,80,144,42,57,39,248,22, +146,18,23,197,2,27,248,22,147,18,23,197,1,28,248,22,90,23,194,2,9, +28,248,22,83,23,194,2,249,22,82,248,80,144,45,57,39,248,22,146,18,23, +197,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23,198,1,249,22, +96,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23,198,1, +249,22,96,23,199,2,27,248,22,147,18,23,197,1,28,248,22,90,23,194,2, +9,28,248,22,83,23,194,2,249,22,82,248,80,144,45,57,39,248,22,146,18, +23,197,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23,198,1,249, +22,96,23,202,2,249,80,144,46,8,43,39,23,204,1,248,22,147,18,23,198, +1,27,250,22,160,2,23,198,1,23,199,1,11,28,192,249,80,144,39,8,43, +39,198,194,196,27,248,22,139,16,2,58,28,248,22,187,15,23,194,2,248,22, +190,15,23,194,1,28,248,22,186,15,23,194,2,90,144,39,11,89,146,39,36, +11,248,22,183,15,249,22,188,15,27,248,22,139,16,2,56,250,80,144,47,40, +39,23,196,1,11,11,248,22,139,16,2,57,86,95,23,195,1,23,194,1,248, +22,190,15,249,22,188,15,23,199,1,23,196,1,27,250,80,144,41,40,39,248, +22,139,16,2,56,23,197,1,10,28,23,193,2,248,22,190,15,23,194,1,11, 27,248,80,144,38,55,39,249,80,144,40,52,37,37,80,144,40,8,44,39,27, -27,250,22,158,2,23,198,2,70,108,105,110,107,115,45,102,105,108,101,11,27, -28,23,194,2,23,194,1,86,94,23,194,1,249,22,178,15,27,250,22,158,2, -23,202,2,69,115,104,97,114,101,45,100,105,114,11,28,192,192,249,22,178,15, -62,117,112,6,5,5,115,104,97,114,101,2,60,28,248,22,151,7,23,194,2, -27,248,22,168,15,23,195,1,28,248,22,185,15,23,194,2,192,249,22,186,15, +27,250,22,160,2,23,198,2,70,108,105,110,107,115,45,102,105,108,101,11,27, +28,23,194,2,23,194,1,86,94,23,194,1,249,22,180,15,27,250,22,160,2, +23,202,2,69,115,104,97,114,101,45,100,105,114,11,28,192,192,249,22,180,15, +62,117,112,6,5,5,115,104,97,114,101,2,60,28,248,22,153,7,23,194,2, +27,248,22,170,15,23,195,1,28,248,22,187,15,23,194,2,192,249,22,188,15, 23,195,1,27,247,80,144,44,51,39,28,23,193,2,192,86,94,23,193,1,247, -22,138,16,28,248,22,140,8,23,194,2,27,248,22,169,15,23,195,1,28,248, -22,185,15,23,194,2,192,249,22,186,15,23,195,1,27,247,80,144,44,51,39, -28,23,193,2,192,86,94,23,193,1,247,22,138,16,28,248,22,160,15,23,194, -2,28,248,22,185,15,23,194,2,192,249,22,186,15,23,195,1,27,247,80,144, -43,51,39,28,23,193,2,192,86,94,23,193,1,247,22,138,16,192,250,22,94, -248,22,90,11,28,247,22,144,16,28,247,22,145,16,248,22,90,250,22,178,15, -248,22,137,16,2,61,250,22,158,2,23,204,2,2,59,247,22,169,8,2,60, -9,9,28,247,22,145,16,250,80,144,44,59,39,23,200,1,78,108,105,110,107, -115,45,115,101,97,114,99,104,45,102,105,108,101,115,248,22,90,23,200,1,9, -248,22,166,13,23,194,1,249,22,16,80,144,38,8,26,38,28,248,22,186,12, +22,140,16,28,248,22,142,8,23,194,2,27,248,22,171,15,23,195,1,28,248, +22,187,15,23,194,2,192,249,22,188,15,23,195,1,27,247,80,144,44,51,39, +28,23,193,2,192,86,94,23,193,1,247,22,140,16,28,248,22,162,15,23,194, +2,28,248,22,187,15,23,194,2,192,249,22,188,15,23,195,1,27,247,80,144, +43,51,39,28,23,193,2,192,86,94,23,193,1,247,22,140,16,192,250,22,96, +248,22,92,11,28,247,22,146,16,28,247,22,147,16,248,22,92,250,22,180,15, +248,22,139,16,2,61,250,22,160,2,23,204,2,2,59,247,22,171,8,2,60, +9,9,28,247,22,147,16,250,80,144,44,59,39,23,200,1,78,108,105,110,107, +115,45,115,101,97,114,99,104,45,102,105,108,101,115,248,22,92,23,200,1,9, +248,22,168,13,23,194,1,249,22,16,80,144,38,8,26,38,28,248,22,188,12, 23,197,2,86,94,23,196,1,32,0,88,148,8,36,36,41,11,9,222,11,20, 20,94,88,148,8,36,36,43,11,9,223,3,33,123,23,196,1,32,125,88,148, -36,37,56,11,2,50,222,33,126,90,144,39,11,89,146,39,36,11,248,22,181, -15,23,197,1,86,95,23,195,1,23,194,1,28,248,22,160,15,23,194,2,28, -248,22,173,15,23,194,2,249,22,143,6,23,195,1,32,0,88,148,8,36,36, -41,11,9,222,11,90,144,39,11,89,146,39,36,11,248,22,181,15,23,197,1, -86,95,23,195,1,23,194,1,28,248,22,160,15,23,194,2,28,248,22,173,15, -23,194,2,249,22,143,6,23,195,1,32,0,88,148,8,36,36,41,11,9,222, -11,90,144,39,11,89,146,39,36,11,248,22,181,15,23,197,1,86,95,23,195, -1,23,194,1,28,248,22,160,15,23,194,2,28,248,22,173,15,23,194,2,249, -22,143,6,23,195,1,32,0,88,148,8,36,36,41,11,9,222,11,90,144,39, -11,89,146,39,36,11,248,22,181,15,23,197,1,86,95,23,195,1,23,194,1, -28,248,22,160,15,23,194,2,28,248,22,173,15,23,194,2,249,22,143,6,23, +36,37,56,11,2,50,222,33,126,90,144,39,11,89,146,39,36,11,248,22,183, +15,23,197,1,86,95,23,195,1,23,194,1,28,248,22,162,15,23,194,2,28, +248,22,175,15,23,194,2,249,22,145,6,23,195,1,32,0,88,148,8,36,36, +41,11,9,222,11,90,144,39,11,89,146,39,36,11,248,22,183,15,23,197,1, +86,95,23,195,1,23,194,1,28,248,22,162,15,23,194,2,28,248,22,175,15, +23,194,2,249,22,145,6,23,195,1,32,0,88,148,8,36,36,41,11,9,222, +11,90,144,39,11,89,146,39,36,11,248,22,183,15,23,197,1,86,95,23,195, +1,23,194,1,28,248,22,162,15,23,194,2,28,248,22,175,15,23,194,2,249, +22,145,6,23,195,1,32,0,88,148,8,36,36,41,11,9,222,11,90,144,39, +11,89,146,39,36,11,248,22,183,15,23,197,1,86,95,23,195,1,23,194,1, +28,248,22,162,15,23,194,2,28,248,22,175,15,23,194,2,249,22,145,6,23, 195,1,32,0,88,148,8,36,36,41,11,9,222,11,248,2,125,23,194,1,11, 11,11,11,32,127,88,148,8,36,37,55,11,2,50,222,33,128,2,27,249,22, -161,6,8,128,128,23,196,2,28,248,22,146,7,23,194,2,9,249,22,80,23, -195,1,27,249,22,161,6,8,128,128,23,199,2,28,248,22,146,7,23,194,2, -9,249,22,80,23,195,1,27,249,22,161,6,8,128,128,23,202,2,28,248,22, -146,7,23,194,2,9,249,22,80,23,195,1,27,249,22,161,6,8,128,128,23, -205,2,28,248,22,146,7,23,194,2,9,249,22,80,23,195,1,248,2,127,23, -206,1,27,249,22,161,6,8,128,128,23,196,2,28,248,22,140,8,23,194,2, -28,249,22,132,4,248,22,145,8,23,196,2,8,128,128,249,22,1,22,152,8, -249,22,80,23,197,1,27,249,22,161,6,8,128,128,23,201,2,28,248,22,146, -7,23,194,2,9,249,22,80,23,195,1,27,249,22,161,6,8,128,128,23,204, -2,28,248,22,146,7,23,194,2,9,249,22,80,23,195,1,27,249,22,161,6, -8,128,128,23,207,2,28,248,22,146,7,23,194,2,9,249,22,80,23,195,1, -27,249,22,161,6,8,128,128,23,210,2,28,248,22,146,7,23,194,2,9,249, -22,80,23,195,1,248,2,127,23,211,1,192,192,248,22,131,6,23,194,1,20, -13,144,80,144,37,8,28,37,80,144,37,8,45,39,27,28,249,22,187,8,248, -22,178,8,2,62,38,90,144,39,11,89,146,39,36,11,248,22,181,15,23,198, -2,86,95,23,195,1,23,194,1,28,248,22,160,15,23,194,2,28,248,22,173, -15,23,194,2,249,22,143,6,23,195,1,32,0,88,148,8,36,36,41,11,9, -222,11,90,144,39,11,89,146,39,36,11,248,22,181,15,23,197,1,86,95,23, -195,1,23,194,1,28,248,22,160,15,23,194,2,28,248,22,173,15,23,194,2, -249,22,143,6,23,195,1,32,0,88,148,8,36,36,41,11,9,222,11,90,144, -39,11,89,146,39,36,11,248,22,181,15,23,197,1,86,95,23,195,1,23,194, -1,28,248,22,160,15,23,194,2,28,248,22,173,15,23,194,2,249,22,143,6, +163,6,8,128,128,23,196,2,28,248,22,148,7,23,194,2,9,249,22,82,23, +195,1,27,249,22,163,6,8,128,128,23,199,2,28,248,22,148,7,23,194,2, +9,249,22,82,23,195,1,27,249,22,163,6,8,128,128,23,202,2,28,248,22, +148,7,23,194,2,9,249,22,82,23,195,1,27,249,22,163,6,8,128,128,23, +205,2,28,248,22,148,7,23,194,2,9,249,22,82,23,195,1,248,2,127,23, +206,1,27,249,22,163,6,8,128,128,23,196,2,28,248,22,142,8,23,194,2, +28,249,22,134,4,248,22,147,8,23,196,2,8,128,128,249,22,1,22,154,8, +249,22,82,23,197,1,27,249,22,163,6,8,128,128,23,201,2,28,248,22,148, +7,23,194,2,9,249,22,82,23,195,1,27,249,22,163,6,8,128,128,23,204, +2,28,248,22,148,7,23,194,2,9,249,22,82,23,195,1,27,249,22,163,6, +8,128,128,23,207,2,28,248,22,148,7,23,194,2,9,249,22,82,23,195,1, +27,249,22,163,6,8,128,128,23,210,2,28,248,22,148,7,23,194,2,9,249, +22,82,23,195,1,248,2,127,23,211,1,192,192,248,22,133,6,23,194,1,20, +13,144,80,144,37,8,28,37,80,144,37,8,45,39,27,28,249,22,189,8,248, +22,180,8,2,62,38,90,144,39,11,89,146,39,36,11,248,22,183,15,23,198, +2,86,95,23,195,1,23,194,1,28,248,22,162,15,23,194,2,28,248,22,175, +15,23,194,2,249,22,145,6,23,195,1,32,0,88,148,8,36,36,41,11,9, +222,11,90,144,39,11,89,146,39,36,11,248,22,183,15,23,197,1,86,95,23, +195,1,23,194,1,28,248,22,162,15,23,194,2,28,248,22,175,15,23,194,2, +249,22,145,6,23,195,1,32,0,88,148,8,36,36,41,11,9,222,11,90,144, +39,11,89,146,39,36,11,248,22,183,15,23,197,1,86,95,23,195,1,23,194, +1,28,248,22,162,15,23,194,2,28,248,22,175,15,23,194,2,249,22,145,6, 23,195,1,32,0,88,148,8,36,36,41,11,9,222,11,90,144,39,11,89,146, -39,36,11,248,22,181,15,23,197,1,86,95,23,195,1,23,194,1,28,248,22, -160,15,23,194,2,28,248,22,173,15,23,194,2,249,22,143,6,23,195,1,32, +39,36,11,248,22,183,15,23,197,1,86,95,23,195,1,23,194,1,28,248,22, +162,15,23,194,2,28,248,22,175,15,23,194,2,249,22,145,6,23,195,1,32, 0,88,148,8,36,36,41,11,9,222,11,248,2,125,23,194,1,11,11,11,11, -11,28,248,22,172,15,23,195,2,27,28,249,22,187,8,248,22,178,8,2,62, -38,249,22,143,6,23,197,2,32,0,88,148,8,36,36,41,11,9,222,11,11, -86,94,28,23,194,2,248,22,145,6,23,195,1,86,94,23,194,1,12,249,22, -80,27,248,22,186,5,23,199,1,250,22,46,22,37,88,148,36,36,8,24,11, +11,28,248,22,174,15,23,195,2,27,28,249,22,189,8,248,22,180,8,2,62, +38,249,22,145,6,23,197,2,32,0,88,148,8,36,36,41,11,9,222,11,11, +86,94,28,23,194,2,248,22,147,6,23,195,1,86,94,23,194,1,12,249,22, +82,27,248,22,188,5,23,199,1,250,22,48,22,37,88,148,36,36,8,24,11, 9,223,3,33,129,2,20,20,94,88,148,36,36,43,11,9,223,3,33,130,2, -23,196,1,194,249,22,80,11,194,28,28,23,195,2,28,248,22,82,23,196,2, -248,22,165,9,249,22,161,14,36,248,22,145,18,23,199,2,11,11,194,86,94, +23,196,1,194,249,22,82,11,194,28,28,23,195,2,28,248,22,84,23,196,2, +248,22,167,9,249,22,163,14,36,248,22,147,18,23,199,2,11,11,194,86,94, 23,195,1,249,22,14,20,20,94,88,148,8,32,36,58,16,4,36,8,128,80, 8,128,128,36,9,224,2,3,33,131,2,23,196,1,80,144,38,8,26,38,27, -248,22,165,9,194,28,192,192,248,22,165,9,248,22,81,195,86,95,28,248,22, -143,12,23,198,2,27,247,22,135,12,28,249,22,191,11,23,195,2,2,63,251, -22,131,12,23,197,1,2,63,250,22,135,8,6,42,42,101,114,114,111,114,32, +248,22,167,9,194,28,192,192,248,22,167,9,248,22,83,195,86,95,28,248,22, +145,12,23,198,2,27,247,22,137,12,28,249,22,129,12,23,195,2,2,63,251, +22,133,12,23,197,1,2,63,250,22,137,8,6,42,42,101,114,114,111,114,32, 114,101,97,100,105,110,103,32,99,111,108,108,101,99,116,105,111,110,32,108,105, -110,107,115,32,102,105,108,101,32,126,115,58,32,126,97,23,203,2,248,22,139, -12,23,206,2,247,22,29,12,12,28,23,193,2,250,22,156,2,80,144,42,8, -25,38,23,198,1,249,22,80,21,17,0,0,23,198,1,86,95,23,195,1,23, -193,1,12,28,248,22,143,12,23,198,2,86,94,23,197,1,248,23,195,1,247, -22,138,2,196,88,148,36,37,55,8,240,0,0,0,2,9,226,0,2,1,3, -33,134,2,20,20,94,248,22,146,6,23,194,2,28,248,22,146,7,248,22,146, -6,23,195,1,12,248,22,172,11,6,30,30,101,120,112,101,99,116,101,100,32, +110,107,115,32,102,105,108,101,32,126,115,58,32,126,97,23,203,2,248,22,141, +12,23,206,2,247,22,29,12,12,28,23,193,2,250,22,158,2,80,144,42,8, +25,38,23,198,1,249,22,82,21,17,0,0,23,198,1,86,95,23,195,1,23, +193,1,12,28,248,22,145,12,23,198,2,86,94,23,197,1,248,23,195,1,247, +22,140,2,196,88,148,36,37,55,8,240,0,0,0,2,9,226,0,2,1,3, +33,134,2,20,20,94,248,22,148,6,23,194,2,28,248,22,148,7,248,22,148, +6,23,195,1,12,248,22,174,11,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,131,6,23,194,1,28,248,22,89,193,28,28,249,22,128,4,38,248,22, -93,195,10,249,22,128,4,39,248,22,93,195,28,28,248,22,151,7,248,22,81, -194,10,28,249,22,167,9,2,64,248,22,144,18,195,10,249,22,167,9,2,65, -248,22,144,18,195,28,27,248,22,102,194,28,248,22,160,15,193,10,28,248,22, -151,7,193,28,248,22,183,15,193,10,248,22,184,15,193,11,27,248,22,88,248, -22,104,195,28,192,192,248,22,165,16,248,22,111,195,11,11,11,11,28,248,22, -173,15,249,22,178,15,23,196,2,23,198,2,27,248,22,68,248,22,164,15,23, -198,1,250,22,156,2,23,198,2,23,196,2,249,22,80,23,199,1,250,22,158, -2,23,203,1,23,201,1,9,12,250,22,156,2,23,197,1,23,198,1,249,22, -80,23,198,1,23,201,1,28,28,248,22,88,248,22,104,23,197,2,10,249,22, -156,16,248,22,111,23,198,2,247,22,169,8,27,248,22,188,15,249,22,186,15, -248,22,102,23,200,2,23,198,1,28,249,22,167,9,248,22,81,23,199,2,2, +248,22,133,6,23,194,1,28,248,22,91,193,28,28,249,22,130,4,38,248,22, +95,195,10,249,22,130,4,39,248,22,95,195,28,28,248,22,153,7,248,22,83, +194,10,28,249,22,169,9,2,64,248,22,146,18,195,10,249,22,169,9,2,65, +248,22,146,18,195,28,27,248,22,104,194,28,248,22,162,15,193,10,28,248,22, +153,7,193,28,248,22,185,15,193,10,248,22,186,15,193,11,27,248,22,90,248, +22,106,195,28,192,192,248,22,167,16,248,22,113,195,11,11,11,11,28,248,22, +175,15,249,22,180,15,23,196,2,23,198,2,27,248,22,70,248,22,166,15,23, +198,1,250,22,158,2,23,198,2,23,196,2,249,22,82,23,199,1,250,22,160, +2,23,203,1,23,201,1,9,12,250,22,158,2,23,197,1,23,198,1,249,22, +82,23,198,1,23,201,1,28,28,248,22,90,248,22,106,23,197,2,10,249,22, +158,16,248,22,113,23,198,2,247,22,171,8,27,248,22,190,15,249,22,188,15, +248,22,104,23,200,2,23,198,1,28,249,22,169,9,248,22,83,23,199,2,2, 65,86,94,23,196,1,249,22,3,20,20,94,88,148,8,36,37,53,11,9,224, -3,2,33,139,2,23,196,1,248,22,191,15,23,196,1,28,249,22,167,9,248, -22,144,18,23,199,2,2,64,86,94,23,196,1,86,94,28,250,22,158,2,23, -197,2,11,11,12,250,22,156,2,23,197,2,11,9,249,22,164,2,23,196,2, +3,2,33,139,2,23,196,1,248,22,129,16,23,196,1,28,249,22,169,9,248, +22,146,18,23,199,2,2,64,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,166,2,23,196,2, 20,20,95,88,148,8,36,38,50,11,9,224,3,2,33,140,2,23,195,1,23, -196,1,27,248,22,68,248,22,144,18,23,199,1,250,22,156,2,23,198,2,23, -196,2,249,22,80,248,22,129,2,23,200,1,250,22,158,2,23,203,1,23,201, -1,9,12,250,22,156,2,23,196,1,23,197,1,248,22,95,23,199,1,27,28, -28,23,194,2,248,22,165,9,248,22,81,23,196,2,10,9,27,249,22,186,5, -23,198,2,66,98,105,110,97,114,121,250,22,46,22,37,88,148,8,36,36,44, +196,1,27,248,22,70,248,22,146,18,23,199,1,250,22,158,2,23,198,2,23, +196,2,249,22,82,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,97,23,199,1,27,28, +28,23,194,2,248,22,167,9,248,22,83,23,196,2,10,9,27,249,22,188,5, +23,198,2,66,98,105,110,97,114,121,250,22,48,22,37,88,148,8,36,36,44, 11,9,223,3,33,136,2,20,20,94,88,148,36,36,43,11,9,223,3,33,137, -2,23,196,1,86,94,28,28,248,22,89,23,194,2,249,22,4,32,0,88,148, -8,36,37,45,11,9,222,33,138,2,23,195,2,11,12,248,22,172,11,6,18, +2,23,196,1,86,94,28,28,248,22,91,23,194,2,249,22,4,32,0,88,148, +8,36,37,45,11,9,222,33,138,2,23,195,2,11,12,248,22,174,11,6,18, 18,105,108,108,45,102,111,114,109,101,100,32,99,111,110,116,101,110,116,27,247, -22,138,2,27,90,144,39,11,89,146,39,36,11,248,22,181,15,23,201,2,192, +22,140,2,27,90,144,39,11,89,146,39,36,11,248,22,183,15,23,201,2,192, 86,96,249,22,3,20,20,94,88,148,8,36,37,54,11,9,224,2,3,33,141, -2,23,195,1,23,197,1,249,22,164,2,195,88,148,8,36,38,48,11,9,223, -3,33,142,2,250,22,156,2,80,144,44,8,25,38,23,200,1,249,22,80,23, +2,23,195,1,23,197,1,249,22,166,2,195,88,148,8,36,38,48,11,9,223, +3,33,142,2,250,22,158,2,80,144,44,8,25,38,23,200,1,249,22,82,23, 201,1,198,193,20,13,144,80,144,37,8,28,37,250,80,144,40,8,46,39,23, -198,2,23,196,2,11,27,250,22,158,2,80,144,41,8,25,38,23,197,2,21, -143,11,17,0,0,27,248,22,81,23,195,2,27,249,80,144,42,8,27,39,23, -198,2,23,196,2,28,249,22,169,9,23,195,2,23,196,1,248,22,82,195,86, +198,2,23,196,2,11,27,250,22,160,2,80,144,41,8,25,38,23,197,2,21, +143,11,17,0,0,27,248,22,83,23,195,2,27,249,80,144,42,8,27,39,23, +198,2,23,196,2,28,249,22,171,9,23,195,2,23,196,1,248,22,84,195,86, 94,23,195,1,20,13,144,80,144,40,8,28,37,250,80,144,43,8,46,39,23, 201,1,23,199,2,23,196,2,27,20,20,95,88,148,8,36,36,52,8,240,0, 0,0,2,9,225,5,4,1,33,143,2,23,194,1,23,197,1,28,28,248,22, -0,23,194,2,249,22,50,23,195,2,36,11,20,13,144,80,144,41,43,37,26, -29,80,144,8,34,44,37,249,22,33,11,80,144,8,36,43,37,22,130,15,10, -22,131,15,10,22,132,15,10,22,135,15,10,22,134,15,11,22,136,15,10,22, -133,15,10,22,137,15,10,22,138,15,10,22,139,15,10,22,140,15,10,22,141, -15,11,22,142,15,10,22,128,15,11,247,23,193,1,250,22,176,11,2,8,2, +0,23,194,2,249,22,52,23,195,2,36,11,20,13,144,80,144,41,43,37,26, +29,80,144,8,34,44,37,249,22,33,11,80,144,8,36,43,37,22,132,15,10, +22,133,15,10,22,134,15,10,22,137,15,10,22,136,15,11,22,138,15,10,22, +135,15,10,22,139,15,10,22,140,15,10,22,141,15,10,22,142,15,10,22,143, +15,11,22,144,15,10,22,130,15,11,247,23,193,1,250,22,178,11,2,8,2, 52,23,196,1,248,22,9,20,20,94,88,148,36,37,8,43,16,4,8,128,6, 8,128,104,8,240,0,64,0,0,36,9,224,1,2,33,144,2,23,195,1,0, -7,35,114,120,34,47,43,34,28,248,22,151,7,23,195,2,27,249,22,154,16, -2,146,2,23,197,2,28,23,193,2,28,249,22,128,4,248,22,101,23,196,2, -248,22,182,3,248,22,154,7,23,199,2,249,22,7,250,22,173,7,23,200,1, -36,248,22,101,23,199,1,23,198,1,249,22,7,250,22,173,7,23,200,2,36, -248,22,101,23,199,2,249,22,80,249,22,173,7,23,201,1,248,22,103,23,200, +7,35,114,120,34,47,43,34,28,248,22,153,7,23,195,2,27,249,22,156,16, +2,146,2,23,197,2,28,23,193,2,28,249,22,130,4,248,22,103,23,196,2, +248,22,184,3,248,22,156,7,23,199,2,249,22,7,250,22,175,7,23,200,1, +36,248,22,103,23,199,1,23,198,1,249,22,7,250,22,175,7,23,200,2,36, +248,22,103,23,199,2,249,22,82,249,22,175,7,23,201,1,248,22,105,23,200, 1,23,200,1,249,22,7,23,197,1,23,198,1,90,144,39,11,89,146,39,36, -11,248,22,181,15,23,198,1,86,94,23,195,1,28,249,22,167,9,23,195,2, -2,49,86,94,23,193,1,249,22,7,23,196,1,23,200,1,27,249,22,80,23, -197,1,23,201,1,28,248,22,151,7,23,195,2,27,249,22,154,16,2,146,2, -23,197,2,28,23,193,2,28,249,22,128,4,248,22,101,23,196,2,248,22,182, -3,248,22,154,7,23,199,2,249,22,7,250,22,173,7,23,200,1,36,248,22, -101,23,199,1,23,196,1,249,22,7,250,22,173,7,23,200,2,36,248,22,101, -23,199,2,249,22,80,249,22,173,7,23,201,1,248,22,103,23,200,1,23,198, +11,248,22,183,15,23,198,1,86,94,23,195,1,28,249,22,169,9,23,195,2, +2,49,86,94,23,193,1,249,22,7,23,196,1,23,200,1,27,249,22,82,23, +197,1,23,201,1,28,248,22,153,7,23,195,2,27,249,22,156,16,2,146,2, +23,197,2,28,23,193,2,28,249,22,130,4,248,22,103,23,196,2,248,22,184, +3,248,22,156,7,23,199,2,249,22,7,250,22,175,7,23,200,1,36,248,22, +103,23,199,1,23,196,1,249,22,7,250,22,175,7,23,200,2,36,248,22,103, +23,199,2,249,22,82,249,22,175,7,23,201,1,248,22,105,23,200,1,23,198, 1,249,22,7,23,197,1,23,196,1,90,144,39,11,89,146,39,36,11,248,22, -181,15,23,198,1,86,94,23,195,1,28,249,22,167,9,23,195,2,2,49,86, +183,15,23,198,1,86,94,23,195,1,28,249,22,169,9,23,195,2,2,49,86, 94,23,193,1,249,22,7,23,196,1,23,198,1,249,80,144,45,8,31,39,194, -249,22,80,197,199,28,248,22,88,23,196,2,9,28,248,22,81,23,196,2,28, -248,22,149,2,248,22,144,18,23,197,2,250,22,94,249,22,2,22,129,2,250, -22,158,2,248,22,144,18,23,204,2,23,202,2,9,250,22,158,2,248,22,144, -18,23,202,2,11,9,27,248,22,145,18,23,200,1,28,248,22,88,23,194,2, -9,28,248,22,81,23,194,2,28,248,22,149,2,248,22,144,18,23,195,2,250, -22,94,249,22,2,22,129,2,250,22,158,2,248,22,144,18,23,202,2,23,206, -2,9,250,22,158,2,248,22,144,18,23,200,2,11,9,249,80,144,45,8,47, -39,23,203,1,248,22,145,18,23,199,1,27,248,80,144,42,8,30,39,248,22, -144,18,23,196,2,250,22,94,250,22,158,2,23,199,2,23,205,2,9,250,22, -158,2,23,199,1,11,9,249,80,144,46,8,47,39,23,204,1,248,22,145,18, -23,200,1,249,22,94,247,22,140,16,249,80,144,44,8,47,39,23,202,1,248, -22,145,18,23,198,1,27,248,80,144,38,8,30,39,248,22,144,18,23,198,2, -250,22,94,250,22,158,2,23,199,2,23,201,2,9,250,22,158,2,23,199,1, -11,9,27,248,22,145,18,23,201,1,28,248,22,88,23,194,2,9,28,248,22, -81,23,194,2,28,248,22,149,2,248,22,144,18,23,195,2,250,22,94,249,22, -2,22,129,2,250,22,158,2,248,22,144,18,23,202,2,23,207,2,9,250,22, -158,2,248,22,144,18,23,200,2,11,9,249,80,144,46,8,47,39,23,204,1, -248,22,145,18,23,199,1,27,248,80,144,43,8,30,39,248,22,144,18,23,196, -2,250,22,94,250,22,158,2,23,199,2,23,206,2,9,250,22,158,2,23,199, -1,11,9,249,80,144,47,8,47,39,23,205,1,248,22,145,18,23,200,1,249, -22,94,247,22,140,16,249,80,144,45,8,47,39,23,203,1,248,22,145,18,23, -198,1,249,22,94,247,22,140,16,27,248,22,145,18,23,199,1,28,248,22,88, -23,194,2,9,28,248,22,81,23,194,2,28,248,22,149,2,248,22,144,18,23, -195,2,250,22,94,249,22,2,22,129,2,250,22,158,2,248,22,144,18,23,202, -2,23,205,2,9,250,22,158,2,248,22,144,18,23,200,2,11,9,249,80,144, -44,8,47,39,23,202,1,248,22,145,18,23,199,1,27,248,80,144,41,8,30, -39,248,22,144,18,23,196,2,250,22,94,250,22,158,2,23,199,2,23,204,2, -9,250,22,158,2,23,199,1,11,9,249,80,144,45,8,47,39,23,203,1,248, -22,145,18,23,200,1,249,22,94,247,22,140,16,249,80,144,43,8,47,39,23, -201,1,248,22,145,18,23,198,1,32,149,2,88,148,36,43,8,31,11,65,99, +249,22,82,197,199,28,248,22,90,23,196,2,9,28,248,22,83,23,196,2,28, +248,22,151,2,248,22,146,18,23,197,2,250,22,96,249,22,2,22,131,2,250, +22,160,2,248,22,146,18,23,204,2,23,202,2,9,250,22,160,2,248,22,146, +18,23,202,2,11,9,27,248,22,147,18,23,200,1,28,248,22,90,23,194,2, +9,28,248,22,83,23,194,2,28,248,22,151,2,248,22,146,18,23,195,2,250, +22,96,249,22,2,22,131,2,250,22,160,2,248,22,146,18,23,202,2,23,206, +2,9,250,22,160,2,248,22,146,18,23,200,2,11,9,249,80,144,45,8,47, +39,23,203,1,248,22,147,18,23,199,1,27,248,80,144,42,8,30,39,248,22, +146,18,23,196,2,250,22,96,250,22,160,2,23,199,2,23,205,2,9,250,22, +160,2,23,199,1,11,9,249,80,144,46,8,47,39,23,204,1,248,22,147,18, +23,200,1,249,22,96,247,22,142,16,249,80,144,44,8,47,39,23,202,1,248, +22,147,18,23,198,1,27,248,80,144,38,8,30,39,248,22,146,18,23,198,2, +250,22,96,250,22,160,2,23,199,2,23,201,2,9,250,22,160,2,23,199,1, +11,9,27,248,22,147,18,23,201,1,28,248,22,90,23,194,2,9,28,248,22, +83,23,194,2,28,248,22,151,2,248,22,146,18,23,195,2,250,22,96,249,22, +2,22,131,2,250,22,160,2,248,22,146,18,23,202,2,23,207,2,9,250,22, +160,2,248,22,146,18,23,200,2,11,9,249,80,144,46,8,47,39,23,204,1, +248,22,147,18,23,199,1,27,248,80,144,43,8,30,39,248,22,146,18,23,196, +2,250,22,96,250,22,160,2,23,199,2,23,206,2,9,250,22,160,2,23,199, +1,11,9,249,80,144,47,8,47,39,23,205,1,248,22,147,18,23,200,1,249, +22,96,247,22,142,16,249,80,144,45,8,47,39,23,203,1,248,22,147,18,23, +198,1,249,22,96,247,22,142,16,27,248,22,147,18,23,199,1,28,248,22,90, +23,194,2,9,28,248,22,83,23,194,2,28,248,22,151,2,248,22,146,18,23, +195,2,250,22,96,249,22,2,22,131,2,250,22,160,2,248,22,146,18,23,202, +2,23,205,2,9,250,22,160,2,248,22,146,18,23,200,2,11,9,249,80,144, +44,8,47,39,23,202,1,248,22,147,18,23,199,1,27,248,80,144,41,8,30, +39,248,22,146,18,23,196,2,250,22,96,250,22,160,2,23,199,2,23,204,2, +9,250,22,160,2,23,199,1,11,9,249,80,144,45,8,47,39,23,203,1,248, +22,147,18,23,200,1,249,22,96,247,22,142,16,249,80,144,43,8,47,39,23, +201,1,248,22,147,18,23,198,1,32,149,2,88,148,36,43,8,31,11,65,99, 108,111,111,112,222,33,156,2,32,150,2,88,148,8,36,37,47,11,2,50,222, -33,151,2,28,248,22,88,248,22,82,23,195,2,248,22,90,27,248,22,144,18, -195,28,248,22,160,15,193,248,22,164,15,193,192,250,22,91,27,248,22,144,18, -23,198,2,28,248,22,160,15,193,248,22,164,15,193,192,2,67,248,2,150,2, -248,22,145,18,23,198,1,250,22,135,8,6,7,7,10,32,126,97,32,126,97, -6,1,1,32,23,196,1,249,22,135,8,6,6,6,10,32,32,32,126,97,248, -22,132,2,23,196,1,32,154,2,88,148,36,38,48,11,66,102,105,108,116,101, -114,222,33,155,2,28,248,22,88,23,195,2,9,28,248,23,194,2,248,22,81, -23,196,2,249,22,80,248,22,144,18,23,197,2,249,2,154,2,23,197,1,248, -22,145,18,23,199,1,249,2,154,2,23,195,1,248,22,145,18,23,197,1,28, -248,22,88,23,199,2,86,94,23,198,1,28,23,199,2,28,196,249,22,178,15, -200,198,198,27,28,248,22,88,23,197,2,2,66,249,22,1,22,174,7,248,2, -150,2,23,199,2,248,23,198,1,251,22,135,8,6,70,70,99,111,108,108,101, +33,151,2,28,248,22,90,248,22,84,23,195,2,248,22,92,27,248,22,146,18, +195,28,248,22,162,15,193,248,22,166,15,193,192,250,22,93,27,248,22,146,18, +23,198,2,28,248,22,162,15,193,248,22,166,15,193,192,2,67,248,2,150,2, +248,22,147,18,23,198,1,250,22,137,8,6,7,7,10,32,126,97,32,126,97, +6,1,1,32,23,196,1,249,22,137,8,6,6,6,10,32,32,32,126,97,248, +22,134,2,23,196,1,32,154,2,88,148,36,38,48,11,66,102,105,108,116,101, +114,222,33,155,2,28,248,22,90,23,195,2,9,28,248,23,194,2,248,22,83, +23,196,2,249,22,82,248,22,146,18,23,197,2,249,2,154,2,23,197,1,248, +22,147,18,23,199,1,249,2,154,2,23,195,1,248,22,147,18,23,197,1,28, +248,22,90,23,199,2,86,94,23,198,1,28,23,199,2,28,196,249,22,180,15, +200,198,198,27,28,248,22,90,23,197,2,2,66,249,22,1,22,176,7,248,2, +150,2,23,199,2,248,23,198,1,251,22,137,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,88,23,202,1,28,248,22,160,15,23,201,2,248,22,164,15, -23,201,1,23,200,1,250,22,174,7,28,248,22,160,15,23,204,2,248,22,164, -15,23,204,1,23,203,1,2,67,23,201,2,249,22,1,22,174,7,249,22,2, -32,0,88,148,8,36,37,45,11,9,222,33,152,2,27,248,22,93,23,205,2, -27,248,22,93,247,22,140,16,28,249,22,129,4,249,22,184,3,23,198,2,23, -197,2,41,23,205,2,249,22,94,247,22,140,16,248,22,90,249,22,135,8,6, +126,97,28,248,22,90,23,202,1,28,248,22,162,15,23,201,2,248,22,166,15, +23,201,1,23,200,1,250,22,176,7,28,248,22,162,15,23,204,2,248,22,166, +15,23,204,1,23,203,1,2,67,23,201,2,249,22,1,22,176,7,249,22,2, +32,0,88,148,8,36,37,45,11,9,222,33,152,2,27,248,22,95,23,205,2, +27,248,22,95,247,22,142,16,28,249,22,131,4,249,22,186,3,23,198,2,23, +197,2,41,23,205,2,249,22,96,247,22,142,16,248,22,92,249,22,137,8,6, 50,50,46,46,46,32,91,126,97,32,97,100,100,105,116,105,111,110,97,108,32, 108,105,110,107,101,100,32,97,110,100,32,112,97,99,107,97,103,101,32,100,105, -114,101,99,116,111,114,105,101,115,93,249,22,184,3,23,201,1,23,200,1,28, -249,22,5,22,131,2,23,201,2,250,22,135,8,6,49,49,10,32,32,32,115, +114,101,99,116,111,114,105,101,115,93,249,22,186,3,23,201,1,23,200,1,28, +249,22,5,22,133,2,23,201,2,250,22,137,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,174,7,249,22,2,32,0,88,148,8,36,37, -45,11,9,222,33,153,2,249,2,154,2,22,131,2,23,208,1,86,95,23,199, -1,23,198,1,2,66,27,248,22,81,23,200,2,27,28,248,22,160,15,23,195, -2,249,22,178,15,23,196,1,23,198,2,248,22,132,2,23,195,1,28,28,248, -22,160,15,248,22,81,23,202,2,248,22,173,15,23,194,2,10,27,250,22,1, -22,178,15,23,197,1,23,201,2,28,28,248,22,88,23,199,2,10,248,22,173, -15,23,194,2,28,23,200,2,28,28,248,22,172,15,249,22,178,15,195,202,10, -27,28,248,22,160,15,201,248,22,164,15,201,200,19,248,22,154,7,23,195,2, -27,28,249,22,132,4,23,196,4,40,28,249,22,157,7,6,4,4,46,114,107, -116,249,22,173,7,23,199,2,249,22,184,3,23,200,4,40,249,22,174,7,250, -22,173,7,23,200,1,36,249,22,184,3,23,201,4,40,6,3,3,46,115,115, -86,94,23,195,1,11,11,28,23,193,2,248,22,172,15,249,22,178,15,198,23, -196,1,11,2,28,199,249,22,178,15,194,201,192,254,2,149,2,202,203,204,205, -206,248,22,82,23,16,28,23,16,23,16,199,28,199,249,22,178,15,194,201,192, -254,2,149,2,202,203,204,205,206,248,22,82,23,16,23,16,254,2,149,2,201, -202,203,204,205,248,22,82,23,15,23,15,90,144,38,11,89,146,38,36,11,249, -80,144,40,8,31,39,23,199,1,23,200,1,27,248,22,68,28,248,22,160,15, -195,248,22,164,15,195,194,27,27,247,22,141,16,28,248,22,88,23,194,2,9, -28,248,22,81,23,194,2,28,248,22,149,2,248,22,144,18,23,195,2,250,22, -94,249,22,2,22,129,2,250,22,158,2,248,22,144,18,23,202,2,23,203,2, -9,250,22,158,2,248,22,144,18,23,200,2,11,9,249,80,144,46,8,47,39, -23,200,1,248,22,145,18,23,199,1,27,248,80,144,43,8,30,39,248,22,144, -18,23,196,2,250,22,94,250,22,158,2,23,199,2,23,202,2,9,250,22,158, -2,23,199,1,11,9,249,80,144,47,8,47,39,23,201,1,248,22,145,18,23, -200,1,249,22,94,247,22,140,16,249,80,144,45,8,47,39,23,199,1,248,22, -145,18,23,198,1,254,2,149,2,199,201,202,204,23,15,199,11,86,95,28,28, -248,22,161,15,23,194,2,10,28,248,22,160,15,23,194,2,10,28,248,22,151, -7,23,194,2,28,248,22,183,15,23,194,2,10,248,22,184,15,23,194,2,11, -12,252,22,176,11,23,200,2,2,42,36,23,198,2,23,199,2,28,28,248,22, -151,7,23,195,2,10,248,22,140,8,23,195,2,86,94,23,194,1,12,252,22, -176,11,23,200,2,2,68,37,23,198,2,23,199,1,90,144,39,11,89,146,39, -36,11,248,22,181,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,179,11,23,201,1,2,69,23,199,1,249, +126,97,23,201,1,249,22,1,22,176,7,249,22,2,32,0,88,148,8,36,37, +45,11,9,222,33,153,2,249,2,154,2,22,133,2,23,208,1,86,95,23,199, +1,23,198,1,2,66,27,248,22,83,23,200,2,27,28,248,22,162,15,23,195, +2,249,22,180,15,23,196,1,23,198,2,248,22,134,2,23,195,1,28,28,248, +22,162,15,248,22,83,23,202,2,248,22,175,15,23,194,2,10,27,250,22,1, +22,180,15,23,197,1,23,201,2,28,28,248,22,90,23,199,2,10,248,22,175, +15,23,194,2,28,23,200,2,28,28,248,22,174,15,249,22,180,15,195,202,10, +27,28,248,22,162,15,201,248,22,166,15,201,200,19,248,22,156,7,23,195,2, +27,28,249,22,134,4,23,196,4,40,28,249,22,159,7,6,4,4,46,114,107, +116,249,22,175,7,23,199,2,249,22,186,3,23,200,4,40,249,22,176,7,250, +22,175,7,23,200,1,36,249,22,186,3,23,201,4,40,6,3,3,46,115,115, +86,94,23,195,1,11,11,28,23,193,2,248,22,174,15,249,22,180,15,198,23, +196,1,11,2,28,199,249,22,180,15,194,201,192,254,2,149,2,202,203,204,205, +206,248,22,84,23,16,28,23,16,23,16,199,28,199,249,22,180,15,194,201,192, +254,2,149,2,202,203,204,205,206,248,22,84,23,16,23,16,254,2,149,2,201, +202,203,204,205,248,22,84,23,15,23,15,90,144,38,11,89,146,38,36,11,249, +80,144,40,8,31,39,23,199,1,23,200,1,27,248,22,70,28,248,22,162,15, +195,248,22,166,15,195,194,27,27,247,22,143,16,28,248,22,90,23,194,2,9, +28,248,22,83,23,194,2,28,248,22,151,2,248,22,146,18,23,195,2,250,22, +96,249,22,2,22,131,2,250,22,160,2,248,22,146,18,23,202,2,23,203,2, +9,250,22,160,2,248,22,146,18,23,200,2,11,9,249,80,144,46,8,47,39, +23,200,1,248,22,147,18,23,199,1,27,248,80,144,43,8,30,39,248,22,146, +18,23,196,2,250,22,96,250,22,160,2,23,199,2,23,202,2,9,250,22,160, +2,23,199,1,11,9,249,80,144,47,8,47,39,23,201,1,248,22,147,18,23, +200,1,249,22,96,247,22,142,16,249,80,144,45,8,47,39,23,199,1,248,22, +147,18,23,198,1,254,2,149,2,199,201,202,204,23,15,199,11,86,95,28,28, +248,22,163,15,23,194,2,10,28,248,22,162,15,23,194,2,10,28,248,22,153, +7,23,194,2,28,248,22,185,15,23,194,2,10,248,22,186,15,23,194,2,11, +12,252,22,178,11,23,200,2,2,42,36,23,198,2,23,199,2,28,28,248,22, +153,7,23,195,2,10,248,22,142,8,23,195,2,86,94,23,194,1,12,252,22, +178,11,23,200,2,2,68,37,23,198,2,23,199,1,90,144,39,11,89,146,39, +36,11,248,22,183,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,181,11,23,201,1,2,69,23,199,1,249, 22,7,23,195,1,23,196,1,32,159,2,88,148,8,36,43,58,11,2,72,222, -33,160,2,249,22,170,15,27,251,22,152,8,250,22,151,8,23,203,2,36,23, -207,1,23,205,1,249,23,203,1,23,202,1,23,208,1,28,248,22,151,7,23, -204,2,249,22,166,8,23,205,1,8,63,23,203,1,28,248,22,133,4,248,22, -145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36,2,70,2,71,201, -192,28,248,22,161,15,197,248,22,162,15,197,247,22,163,15,32,161,2,88,148, -8,36,42,8,24,11,2,50,222,33,162,2,28,248,22,133,4,23,199,2,86, -95,23,198,1,23,194,1,19,248,22,145,8,23,195,2,19,248,22,145,8,23, -196,2,249,22,170,15,27,251,22,152,8,250,22,151,8,23,205,2,36,23,204, -4,2,51,249,23,206,1,23,204,1,23,202,4,28,248,22,151,7,23,207,2, -249,22,166,8,23,208,1,8,63,23,206,1,28,248,22,133,4,248,22,145,8, -23,195,2,86,94,23,193,1,251,22,178,11,2,36,2,70,2,71,204,192,28, -248,22,161,15,200,248,22,162,15,200,247,22,163,15,2,2,27,248,22,182,3, -23,200,1,28,249,22,167,9,8,46,249,22,146,8,23,198,2,23,197,2,27, -248,22,181,3,23,195,2,249,22,170,15,27,251,22,152,8,250,22,151,8,23, +33,160,2,249,22,172,15,27,251,22,154,8,250,22,153,8,23,203,2,36,23, +207,1,23,205,1,249,23,203,1,23,202,1,23,208,1,28,248,22,153,7,23, +204,2,249,22,168,8,23,205,1,8,63,23,203,1,28,248,22,135,4,248,22, +147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36,2,70,2,71,201, +192,28,248,22,163,15,197,248,22,164,15,197,247,22,165,15,32,161,2,88,148, +8,36,42,8,24,11,2,50,222,33,162,2,28,248,22,135,4,23,199,2,86, +95,23,198,1,23,194,1,19,248,22,147,8,23,195,2,19,248,22,147,8,23, +196,2,249,22,172,15,27,251,22,154,8,250,22,153,8,23,205,2,36,23,204, +4,2,51,249,23,206,1,23,204,1,23,202,4,28,248,22,153,7,23,207,2, +249,22,168,8,23,208,1,8,63,23,206,1,28,248,22,135,4,248,22,147,8, +23,195,2,86,94,23,193,1,251,22,180,11,2,36,2,70,2,71,204,192,28, +248,22,163,15,200,248,22,164,15,200,247,22,165,15,2,2,27,248,22,184,3, +23,200,1,28,249,22,169,9,8,46,249,22,148,8,23,198,2,23,197,2,27, +248,22,183,3,23,195,2,249,22,172,15,27,251,22,154,8,250,22,153,8,23, 205,2,36,23,204,1,23,203,1,249,23,206,1,23,204,1,23,202,1,28,248, -22,151,7,23,207,2,249,22,166,8,23,208,1,8,63,23,206,1,28,248,22, -133,4,248,22,145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36,2, -70,2,71,204,192,28,248,22,161,15,200,248,22,162,15,200,247,22,163,15,28, -248,22,133,4,23,194,2,86,95,23,195,1,23,193,1,19,248,22,145,8,23, -196,2,19,248,22,145,8,23,197,2,249,22,170,15,27,251,22,152,8,250,22, -151,8,23,206,2,36,23,204,4,2,51,249,23,207,1,23,205,1,23,202,4, -28,248,22,151,7,23,208,2,249,22,166,8,23,209,1,8,63,23,207,1,28, -248,22,133,4,248,22,145,8,23,195,2,86,94,23,193,1,251,22,178,11,2, -36,2,70,2,71,205,192,28,248,22,161,15,201,248,22,162,15,201,247,22,163, -15,2,2,27,248,22,182,3,23,195,1,28,249,22,167,9,8,46,249,22,146, -8,23,199,2,23,197,2,27,248,22,181,3,23,195,2,249,22,170,15,27,251, -22,152,8,250,22,151,8,23,206,2,36,23,204,1,23,204,1,249,23,207,1, -23,205,1,23,202,1,28,248,22,151,7,23,208,2,249,22,166,8,23,209,1, -8,63,23,207,1,28,248,22,133,4,248,22,145,8,23,195,2,86,94,23,193, -1,251,22,178,11,2,36,2,70,2,71,205,192,28,248,22,161,15,201,248,22, -162,15,201,247,22,163,15,28,248,22,133,4,193,254,2,159,2,201,203,204,205, -248,22,145,8,202,2,51,248,22,145,8,202,27,248,22,182,3,194,28,249,22, -167,9,8,46,249,22,146,8,199,196,254,2,159,2,202,204,205,206,199,203,248, -22,181,3,200,253,2,161,2,201,202,203,204,205,198,90,144,38,11,89,146,38, -36,11,86,95,28,28,248,22,161,15,23,199,2,10,28,248,22,160,15,23,199, -2,10,28,248,22,151,7,23,199,2,28,248,22,183,15,23,199,2,10,248,22, -184,15,23,199,2,11,12,252,22,176,11,23,200,2,2,42,36,23,203,2,23, -204,2,28,28,248,22,151,7,23,200,2,10,248,22,140,8,23,200,2,12,252, -22,176,11,23,200,2,2,68,37,23,203,2,23,204,2,90,144,39,11,89,146, -39,36,11,248,22,181,15,23,202,2,86,94,23,195,1,86,94,28,192,12,250, -22,179,11,23,201,1,2,69,23,204,2,249,22,7,194,195,27,248,22,166,15, -23,196,1,27,19,248,22,145,8,23,196,2,28,248,22,133,4,23,194,4,86, -94,23,199,1,19,248,22,145,8,23,197,2,19,248,22,145,8,23,198,2,249, -22,170,15,27,251,22,152,8,250,22,151,8,23,207,2,36,23,204,4,2,51, -249,23,211,1,23,206,1,23,202,4,28,248,22,151,7,23,212,2,249,22,166, -8,23,213,1,8,63,23,211,1,28,248,22,133,4,248,22,145,8,23,195,2, -86,94,23,193,1,251,22,178,11,2,36,2,70,2,71,23,17,192,28,248,22, -161,15,205,248,22,162,15,205,247,22,163,15,2,2,27,248,22,182,3,23,195, -4,28,249,22,167,9,8,46,249,22,146,8,23,200,2,23,197,2,27,248,22, -181,3,23,195,2,249,22,170,15,27,251,22,152,8,250,22,151,8,23,207,2, -36,23,204,1,23,208,1,249,23,211,1,23,206,1,23,202,1,28,248,22,151, -7,23,212,2,249,22,166,8,23,213,1,8,63,23,211,1,28,248,22,133,4, -248,22,145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36,2,70,2, -71,23,17,192,28,248,22,161,15,205,248,22,162,15,205,247,22,163,15,28,248, -22,133,4,23,194,2,86,95,23,200,1,23,193,1,254,2,159,2,23,203,2, -23,208,1,23,209,1,23,210,1,248,22,145,8,23,204,2,2,51,248,22,145, -8,23,204,1,27,248,22,182,3,23,195,1,28,249,22,167,9,8,46,249,22, -146,8,23,201,2,23,197,2,254,2,159,2,23,204,1,23,209,1,23,210,1, -23,211,1,23,200,2,23,208,1,248,22,181,3,23,201,1,253,2,161,2,23, +22,153,7,23,207,2,249,22,168,8,23,208,1,8,63,23,206,1,28,248,22, +135,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36,2, +70,2,71,204,192,28,248,22,163,15,200,248,22,164,15,200,247,22,165,15,28, +248,22,135,4,23,194,2,86,95,23,195,1,23,193,1,19,248,22,147,8,23, +196,2,19,248,22,147,8,23,197,2,249,22,172,15,27,251,22,154,8,250,22, +153,8,23,206,2,36,23,204,4,2,51,249,23,207,1,23,205,1,23,202,4, +28,248,22,153,7,23,208,2,249,22,168,8,23,209,1,8,63,23,207,1,28, +248,22,135,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,180,11,2, +36,2,70,2,71,205,192,28,248,22,163,15,201,248,22,164,15,201,247,22,165, +15,2,2,27,248,22,184,3,23,195,1,28,249,22,169,9,8,46,249,22,148, +8,23,199,2,23,197,2,27,248,22,183,3,23,195,2,249,22,172,15,27,251, +22,154,8,250,22,153,8,23,206,2,36,23,204,1,23,204,1,249,23,207,1, +23,205,1,23,202,1,28,248,22,153,7,23,208,2,249,22,168,8,23,209,1, +8,63,23,207,1,28,248,22,135,4,248,22,147,8,23,195,2,86,94,23,193, +1,251,22,180,11,2,36,2,70,2,71,205,192,28,248,22,163,15,201,248,22, +164,15,201,247,22,165,15,28,248,22,135,4,193,254,2,159,2,201,203,204,205, +248,22,147,8,202,2,51,248,22,147,8,202,27,248,22,184,3,194,28,249,22, +169,9,8,46,249,22,148,8,199,196,254,2,159,2,202,204,205,206,199,203,248, +22,183,3,200,253,2,161,2,201,202,203,204,205,198,90,144,38,11,89,146,38, +36,11,86,95,28,28,248,22,163,15,23,199,2,10,28,248,22,162,15,23,199, +2,10,28,248,22,153,7,23,199,2,28,248,22,185,15,23,199,2,10,248,22, +186,15,23,199,2,11,12,252,22,178,11,23,200,2,2,42,36,23,203,2,23, +204,2,28,28,248,22,153,7,23,200,2,10,248,22,142,8,23,200,2,12,252, +22,178,11,23,200,2,2,68,37,23,203,2,23,204,2,90,144,39,11,89,146, +39,36,11,248,22,183,15,23,202,2,86,94,23,195,1,86,94,28,192,12,250, +22,181,11,23,201,1,2,69,23,204,2,249,22,7,194,195,27,248,22,168,15, +23,196,1,27,19,248,22,147,8,23,196,2,28,248,22,135,4,23,194,4,86, +94,23,199,1,19,248,22,147,8,23,197,2,19,248,22,147,8,23,198,2,249, +22,172,15,27,251,22,154,8,250,22,153,8,23,207,2,36,23,204,4,2,51, +249,23,211,1,23,206,1,23,202,4,28,248,22,153,7,23,212,2,249,22,168, +8,23,213,1,8,63,23,211,1,28,248,22,135,4,248,22,147,8,23,195,2, +86,94,23,193,1,251,22,180,11,2,36,2,70,2,71,23,17,192,28,248,22, +163,15,205,248,22,164,15,205,247,22,165,15,2,2,27,248,22,184,3,23,195, +4,28,249,22,169,9,8,46,249,22,148,8,23,200,2,23,197,2,27,248,22, +183,3,23,195,2,249,22,172,15,27,251,22,154,8,250,22,153,8,23,207,2, +36,23,204,1,23,208,1,249,23,211,1,23,206,1,23,202,1,28,248,22,153, +7,23,212,2,249,22,168,8,23,213,1,8,63,23,211,1,28,248,22,135,4, +248,22,147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36,2,70,2, +71,23,17,192,28,248,22,163,15,205,248,22,164,15,205,247,22,165,15,28,248, +22,135,4,23,194,2,86,95,23,200,1,23,193,1,254,2,159,2,23,203,2, +23,208,1,23,209,1,23,210,1,248,22,147,8,23,204,2,2,51,248,22,147, +8,23,204,1,27,248,22,184,3,23,195,1,28,249,22,169,9,8,46,249,22, +148,8,23,201,2,23,197,2,254,2,159,2,23,204,1,23,209,1,23,210,1, +23,211,1,23,200,2,23,208,1,248,22,183,3,23,201,1,253,2,161,2,23, 203,1,23,207,1,23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22, -161,15,195,249,22,178,15,196,194,192,32,164,2,88,148,8,36,40,58,11,2, -50,222,33,165,2,28,248,22,133,4,23,197,2,86,94,23,196,1,19,248,22, -145,8,23,195,2,35,248,22,145,8,23,196,2,249,22,170,15,27,251,22,152, -8,250,22,151,8,23,205,1,36,23,204,4,2,51,2,51,28,248,22,151,7, -23,205,2,249,22,166,8,23,206,1,8,63,23,204,1,28,248,22,133,4,248, -22,145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36,2,70,2,71, -202,192,28,248,22,161,15,198,248,22,162,15,198,247,22,163,15,2,27,248,22, -182,3,23,198,1,28,249,22,167,9,8,46,249,22,146,8,23,198,2,23,197, -2,35,248,22,181,3,23,195,2,249,22,170,15,27,251,22,152,8,250,22,151, -8,23,205,1,36,23,204,1,2,51,2,51,28,248,22,151,7,23,205,2,249, -22,166,8,23,206,1,8,63,23,204,1,28,248,22,133,4,248,22,145,8,23, -195,2,86,94,23,193,1,251,22,178,11,2,36,2,70,2,71,202,192,28,248, -22,161,15,198,248,22,162,15,198,247,22,163,15,28,248,22,133,4,23,194,2, -86,94,23,193,1,19,248,22,145,8,23,196,2,35,248,22,145,8,23,197,2, -249,22,170,15,27,251,22,152,8,250,22,151,8,23,206,1,36,23,204,4,2, -51,2,51,28,248,22,151,7,23,206,2,249,22,166,8,23,207,1,8,63,23, -205,1,28,248,22,133,4,248,22,145,8,23,195,2,86,94,23,193,1,251,22, -178,11,2,36,2,70,2,71,203,192,28,248,22,161,15,199,248,22,162,15,199, -247,22,163,15,2,27,248,22,182,3,23,195,1,28,249,22,167,9,8,46,249, -22,146,8,23,199,2,23,197,2,35,248,22,181,3,23,195,2,249,22,170,15, -27,251,22,152,8,250,22,151,8,23,206,1,36,23,204,1,2,51,2,51,28, -248,22,151,7,23,206,2,249,22,166,8,23,207,1,8,63,23,205,1,28,248, -22,133,4,248,22,145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36, -2,70,2,71,203,192,28,248,22,161,15,199,248,22,162,15,199,247,22,163,15, +163,15,195,249,22,180,15,196,194,192,32,164,2,88,148,8,36,40,58,11,2, +50,222,33,165,2,28,248,22,135,4,23,197,2,86,94,23,196,1,19,248,22, +147,8,23,195,2,35,248,22,147,8,23,196,2,249,22,172,15,27,251,22,154, +8,250,22,153,8,23,205,1,36,23,204,4,2,51,2,51,28,248,22,153,7, +23,205,2,249,22,168,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248, +22,147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36,2,70,2,71, +202,192,28,248,22,163,15,198,248,22,164,15,198,247,22,165,15,2,27,248,22, +184,3,23,198,1,28,249,22,169,9,8,46,249,22,148,8,23,198,2,23,197, +2,35,248,22,183,3,23,195,2,249,22,172,15,27,251,22,154,8,250,22,153, +8,23,205,1,36,23,204,1,2,51,2,51,28,248,22,153,7,23,205,2,249, +22,168,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248,22,147,8,23, +195,2,86,94,23,193,1,251,22,180,11,2,36,2,70,2,71,202,192,28,248, +22,163,15,198,248,22,164,15,198,247,22,165,15,28,248,22,135,4,23,194,2, +86,94,23,193,1,19,248,22,147,8,23,196,2,35,248,22,147,8,23,197,2, +249,22,172,15,27,251,22,154,8,250,22,153,8,23,206,1,36,23,204,4,2, +51,2,51,28,248,22,153,7,23,206,2,249,22,168,8,23,207,1,8,63,23, +205,1,28,248,22,135,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22, +180,11,2,36,2,70,2,71,203,192,28,248,22,163,15,199,248,22,164,15,199, +247,22,165,15,2,27,248,22,184,3,23,195,1,28,249,22,169,9,8,46,249, +22,148,8,23,199,2,23,197,2,35,248,22,183,3,23,195,2,249,22,172,15, +27,251,22,154,8,250,22,153,8,23,206,1,36,23,204,1,2,51,2,51,28, +248,22,153,7,23,206,2,249,22,168,8,23,207,1,8,63,23,205,1,28,248, +22,135,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36, +2,70,2,71,203,192,28,248,22,163,15,199,248,22,164,15,199,247,22,165,15, 251,2,164,2,198,199,200,196,90,144,38,11,89,146,38,36,11,86,95,28,28, -248,22,161,15,23,196,2,10,28,248,22,160,15,23,196,2,10,28,248,22,151, -7,23,196,2,28,248,22,183,15,23,196,2,10,248,22,184,15,23,196,2,11, -12,252,22,176,11,2,36,2,42,36,23,200,2,23,201,2,28,28,248,22,151, -7,23,197,2,10,248,22,140,8,23,197,2,12,252,22,176,11,2,36,2,68, -37,23,200,2,23,201,2,90,144,39,11,89,146,39,36,11,248,22,181,15,23, -199,2,86,94,23,195,1,86,94,28,192,12,250,22,179,11,2,36,2,69,23, -201,2,249,22,7,194,195,27,248,22,166,15,23,196,1,27,251,2,164,2,23, -198,2,23,201,1,23,202,1,248,22,145,8,23,199,1,28,248,22,161,15,195, -249,22,178,15,196,194,192,2,51,252,80,143,41,8,33,2,36,2,51,32,0, +248,22,163,15,23,196,2,10,28,248,22,162,15,23,196,2,10,28,248,22,153, +7,23,196,2,28,248,22,185,15,23,196,2,10,248,22,186,15,23,196,2,11, +12,252,22,178,11,2,36,2,42,36,23,200,2,23,201,2,28,28,248,22,153, +7,23,197,2,10,248,22,142,8,23,197,2,12,252,22,178,11,2,36,2,68, +37,23,200,2,23,201,2,90,144,39,11,89,146,39,36,11,248,22,183,15,23, +199,2,86,94,23,195,1,86,94,28,192,12,250,22,181,11,2,36,2,69,23, +201,2,249,22,7,194,195,27,248,22,168,15,23,196,1,27,251,2,164,2,23, +198,2,23,201,1,23,202,1,248,22,147,8,23,199,1,28,248,22,163,15,195, +249,22,180,15,196,194,192,2,51,252,80,143,41,8,33,2,36,2,51,32,0, 88,148,8,36,38,43,11,9,222,33,167,2,198,199,32,169,2,88,148,8,36, 40,57,11,2,50,222,33,172,2,32,170,2,88,148,8,36,42,57,11,2,72, -222,33,171,2,249,22,170,15,27,251,22,152,8,250,22,151,8,23,203,2,36, -23,206,1,23,204,1,249,22,151,8,23,202,1,23,207,1,28,248,22,151,7, -23,203,2,249,22,166,8,23,204,1,8,63,23,202,1,28,248,22,133,4,248, -22,145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36,2,70,2,71, -200,192,28,248,22,161,15,196,248,22,162,15,196,247,22,163,15,28,248,22,133, -4,23,197,2,86,94,23,196,1,19,248,22,145,8,23,195,2,19,248,22,145, -8,23,196,2,249,22,170,15,27,251,22,152,8,250,22,151,8,23,205,2,36, -23,204,4,2,51,249,22,151,8,23,204,1,23,202,4,28,248,22,151,7,23, -205,2,249,22,166,8,23,206,1,8,63,23,204,1,28,248,22,133,4,248,22, -145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36,2,70,2,71,202, -192,28,248,22,161,15,198,248,22,162,15,198,247,22,163,15,2,2,27,248,22, -182,3,23,198,1,28,249,22,167,9,8,46,249,22,146,8,23,198,2,23,197, -2,27,248,22,181,3,23,195,2,249,22,170,15,27,251,22,152,8,250,22,151, -8,23,205,2,36,23,204,1,2,73,249,22,151,8,23,204,1,23,202,1,28, -248,22,151,7,23,205,2,249,22,166,8,23,206,1,8,63,23,204,1,28,248, -22,133,4,248,22,145,8,23,195,2,86,94,23,193,1,251,22,178,11,2,36, -2,70,2,71,202,192,28,248,22,161,15,198,248,22,162,15,198,247,22,163,15, -28,248,22,133,4,193,253,2,170,2,199,200,201,248,22,145,8,200,2,51,248, -22,145,8,200,27,248,22,182,3,194,28,249,22,167,9,8,46,249,22,146,8, -198,196,253,2,170,2,200,201,202,198,2,73,248,22,181,3,199,251,2,169,2, -198,199,200,196,90,144,38,11,89,146,38,36,11,86,95,28,28,248,22,161,15, -23,196,2,10,28,248,22,160,15,23,196,2,10,28,248,22,151,7,23,196,2, -28,248,22,183,15,23,196,2,10,248,22,184,15,23,196,2,11,12,252,22,176, -11,2,36,2,42,36,23,200,2,23,201,2,28,28,248,22,151,7,23,197,2, -10,248,22,140,8,23,197,2,12,252,22,176,11,2,36,2,68,37,23,200,2, -23,201,2,90,144,39,11,89,146,39,36,11,248,22,181,15,23,199,2,86,94, -23,195,1,86,94,28,192,12,250,22,179,11,2,36,2,69,23,201,2,249,22, -7,194,195,27,248,22,166,15,23,196,1,27,251,2,169,2,23,198,2,23,201, -1,23,202,1,248,22,145,8,23,199,1,28,248,22,161,15,195,249,22,178,15, -196,194,192,252,80,143,41,8,33,2,36,2,73,22,151,8,198,199,249,247,22, -175,5,23,195,1,11,249,247,22,175,5,194,11,28,248,22,88,23,195,2,9, -27,27,248,22,81,23,197,2,28,248,22,185,15,23,194,2,248,22,188,15,23, -194,1,28,248,22,184,15,23,194,2,90,144,39,11,89,146,39,36,11,248,22, -181,15,249,22,186,15,27,248,22,137,16,2,56,250,80,144,48,40,39,23,196, -1,11,11,248,22,137,16,2,57,86,95,23,195,1,23,194,1,248,22,188,15, -249,22,186,15,23,199,1,23,196,1,27,250,80,144,42,40,39,248,22,137,16, -2,56,23,197,1,10,28,23,193,2,248,22,188,15,23,194,1,11,28,23,193, -2,249,22,80,248,22,188,15,249,22,186,15,23,198,1,247,22,138,16,27,248, -22,82,23,199,1,28,248,22,88,23,194,2,9,27,248,80,144,42,53,39,248, -22,81,23,196,2,28,23,193,2,249,22,80,248,22,188,15,249,22,186,15,23, -198,1,247,22,138,16,248,80,144,44,8,48,39,248,22,82,23,198,1,86,94, -23,193,1,248,80,144,42,8,48,39,248,22,82,23,196,1,86,94,23,193,1, -27,248,22,82,23,197,1,28,248,22,88,23,194,2,9,27,248,80,144,40,53, -39,248,22,81,23,196,2,28,23,193,2,249,22,80,248,22,188,15,249,22,186, -15,23,198,1,247,22,138,16,248,80,144,42,8,48,39,248,22,82,23,198,1, -86,94,23,193,1,248,80,144,40,8,48,39,248,22,82,23,196,1,28,248,22, -88,23,195,2,9,27,27,248,22,81,23,197,2,28,248,22,185,15,23,194,2, -248,22,188,15,23,194,1,28,248,22,184,15,23,194,2,90,144,39,11,89,146, -39,36,11,248,22,181,15,249,22,186,15,27,248,22,137,16,2,56,250,80,144, -48,40,39,23,196,1,11,11,248,22,137,16,2,57,86,95,23,195,1,23,194, -1,248,22,188,15,249,22,186,15,23,199,1,23,196,1,27,250,80,144,42,40, -39,248,22,137,16,2,56,23,197,1,10,28,23,193,2,248,22,188,15,23,194, -1,11,28,23,193,2,249,22,80,248,22,188,15,249,22,186,15,23,198,1,247, -22,138,16,27,248,22,82,23,199,1,28,248,22,88,23,194,2,9,27,248,80, -144,42,53,39,248,22,81,23,196,2,28,23,193,2,249,22,80,248,22,188,15, -249,22,186,15,23,198,1,247,22,138,16,248,80,144,44,8,49,39,248,22,82, -23,198,1,86,94,23,193,1,248,80,144,42,8,49,39,248,22,82,23,196,1, -86,94,23,193,1,27,248,22,82,23,197,1,28,248,22,88,23,194,2,9,27, -248,80,144,40,53,39,248,22,81,23,196,2,28,23,193,2,249,22,80,248,22, -188,15,249,22,186,15,23,198,1,247,22,138,16,248,80,144,42,8,49,39,248, -22,82,23,198,1,86,94,23,193,1,248,80,144,40,8,49,39,248,22,82,23, -196,1,27,248,22,137,16,2,58,28,248,22,185,15,23,194,2,248,22,188,15, -23,194,1,28,248,22,184,15,23,194,2,90,144,39,11,89,146,39,36,11,248, -22,181,15,249,22,186,15,27,248,22,137,16,2,56,250,80,144,47,40,39,23, -196,1,11,11,248,22,137,16,2,57,86,95,23,195,1,23,194,1,248,22,188, -15,249,22,186,15,23,199,1,23,196,1,27,250,80,144,41,40,39,248,22,137, -16,2,56,23,197,1,10,28,23,193,2,248,22,188,15,23,194,1,11,28,248, -22,88,23,195,2,9,27,27,248,22,81,23,197,2,28,248,22,185,15,23,194, -2,248,22,188,15,23,194,1,28,248,22,184,15,23,194,2,90,144,39,11,89, -146,39,36,11,248,22,181,15,249,22,186,15,27,248,22,137,16,2,56,250,80, -144,48,40,39,23,196,1,11,11,248,22,137,16,2,57,86,95,23,195,1,23, -194,1,248,22,188,15,249,22,186,15,23,199,1,23,196,1,27,250,80,144,42, -40,39,248,22,137,16,2,56,23,197,1,10,28,23,193,2,248,22,188,15,23, -194,1,11,28,23,193,2,249,22,80,248,22,188,15,249,22,186,15,23,198,1, -247,22,138,16,27,248,22,82,23,199,1,28,248,22,88,23,194,2,9,27,27, -248,22,81,23,196,2,28,248,22,185,15,23,194,2,248,22,188,15,23,194,1, -28,248,22,184,15,23,194,2,90,144,39,11,89,146,39,36,11,248,22,181,15, -249,22,186,15,27,248,22,137,16,2,56,250,80,144,52,40,39,23,196,1,11, -11,248,22,137,16,2,57,86,95,23,195,1,23,194,1,248,22,188,15,249,22, -186,15,23,199,1,23,196,1,27,250,80,144,46,40,39,248,22,137,16,2,56, -23,197,1,10,28,23,193,2,248,22,188,15,23,194,1,11,28,23,193,2,249, -22,80,248,22,188,15,249,22,186,15,23,198,1,247,22,138,16,27,248,22,82, -23,198,1,28,248,22,88,23,194,2,9,27,248,80,144,46,53,39,248,22,81, -23,196,2,28,23,193,2,249,22,80,248,22,188,15,249,22,186,15,23,198,1, -247,22,138,16,248,80,144,48,8,51,39,248,22,82,23,198,1,86,94,23,193, -1,248,80,144,46,8,51,39,248,22,82,23,196,1,86,94,23,193,1,27,248, -22,82,23,196,1,28,248,22,88,23,194,2,9,27,248,80,144,44,53,39,248, -22,81,23,196,2,28,23,193,2,249,22,80,248,22,188,15,249,22,186,15,23, -198,1,247,22,138,16,248,80,144,46,8,51,39,248,22,82,23,198,1,86,94, -23,193,1,248,80,144,44,8,51,39,248,22,82,23,196,1,86,94,23,193,1, -27,248,22,82,23,197,1,28,248,22,88,23,194,2,9,27,27,248,22,81,23, -196,2,28,248,22,185,15,23,194,2,248,22,188,15,23,194,1,28,248,22,184, -15,23,194,2,90,144,39,11,89,146,39,36,11,248,22,181,15,249,22,186,15, -27,248,22,137,16,2,56,250,80,144,50,40,39,23,196,1,11,11,248,22,137, -16,2,57,86,95,23,195,1,23,194,1,248,22,188,15,249,22,186,15,23,199, -1,23,196,1,27,250,80,144,44,40,39,248,22,137,16,2,56,23,197,1,10, -28,23,193,2,248,22,188,15,23,194,1,11,28,23,193,2,249,22,80,248,22, -188,15,249,22,186,15,23,198,1,247,22,138,16,27,248,22,82,23,198,1,28, -248,22,88,23,194,2,9,27,248,80,144,44,53,39,248,22,81,23,196,2,28, -23,193,2,249,22,80,248,22,188,15,249,22,186,15,23,198,1,247,22,138,16, -248,80,144,46,8,51,39,248,22,82,23,198,1,86,94,23,193,1,248,80,144, -44,8,51,39,248,22,82,23,196,1,86,94,23,193,1,27,248,22,82,23,196, -1,28,248,22,88,23,194,2,9,27,248,80,144,42,53,39,248,22,81,23,196, -2,28,23,193,2,249,22,80,248,22,188,15,249,22,186,15,23,198,1,247,22, -138,16,248,80,144,44,8,51,39,248,22,82,23,198,1,86,94,23,193,1,248, -80,144,42,8,51,39,248,22,82,23,196,1,27,247,22,144,16,27,248,80,144, +222,33,171,2,249,22,172,15,27,251,22,154,8,250,22,153,8,23,203,2,36, +23,206,1,23,204,1,249,22,153,8,23,202,1,23,207,1,28,248,22,153,7, +23,203,2,249,22,168,8,23,204,1,8,63,23,202,1,28,248,22,135,4,248, +22,147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36,2,70,2,71, +200,192,28,248,22,163,15,196,248,22,164,15,196,247,22,165,15,28,248,22,135, +4,23,197,2,86,94,23,196,1,19,248,22,147,8,23,195,2,19,248,22,147, +8,23,196,2,249,22,172,15,27,251,22,154,8,250,22,153,8,23,205,2,36, +23,204,4,2,51,249,22,153,8,23,204,1,23,202,4,28,248,22,153,7,23, +205,2,249,22,168,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248,22, +147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36,2,70,2,71,202, +192,28,248,22,163,15,198,248,22,164,15,198,247,22,165,15,2,2,27,248,22, +184,3,23,198,1,28,249,22,169,9,8,46,249,22,148,8,23,198,2,23,197, +2,27,248,22,183,3,23,195,2,249,22,172,15,27,251,22,154,8,250,22,153, +8,23,205,2,36,23,204,1,2,73,249,22,153,8,23,204,1,23,202,1,28, +248,22,153,7,23,205,2,249,22,168,8,23,206,1,8,63,23,204,1,28,248, +22,135,4,248,22,147,8,23,195,2,86,94,23,193,1,251,22,180,11,2,36, +2,70,2,71,202,192,28,248,22,163,15,198,248,22,164,15,198,247,22,165,15, +28,248,22,135,4,193,253,2,170,2,199,200,201,248,22,147,8,200,2,51,248, +22,147,8,200,27,248,22,184,3,194,28,249,22,169,9,8,46,249,22,148,8, +198,196,253,2,170,2,200,201,202,198,2,73,248,22,183,3,199,251,2,169,2, +198,199,200,196,90,144,38,11,89,146,38,36,11,86,95,28,28,248,22,163,15, +23,196,2,10,28,248,22,162,15,23,196,2,10,28,248,22,153,7,23,196,2, +28,248,22,185,15,23,196,2,10,248,22,186,15,23,196,2,11,12,252,22,178, +11,2,36,2,42,36,23,200,2,23,201,2,28,28,248,22,153,7,23,197,2, +10,248,22,142,8,23,197,2,12,252,22,178,11,2,36,2,68,37,23,200,2, +23,201,2,90,144,39,11,89,146,39,36,11,248,22,183,15,23,199,2,86,94, +23,195,1,86,94,28,192,12,250,22,181,11,2,36,2,69,23,201,2,249,22, +7,194,195,27,248,22,168,15,23,196,1,27,251,2,169,2,23,198,2,23,201, +1,23,202,1,248,22,147,8,23,199,1,28,248,22,163,15,195,249,22,180,15, +196,194,192,252,80,143,41,8,33,2,36,2,73,22,153,8,198,199,249,247,22, +177,5,23,195,1,11,249,247,22,177,5,194,11,28,248,22,90,23,195,2,9, +27,27,248,22,83,23,197,2,28,248,22,187,15,23,194,2,248,22,190,15,23, +194,1,28,248,22,186,15,23,194,2,90,144,39,11,89,146,39,36,11,248,22, +183,15,249,22,188,15,27,248,22,139,16,2,56,250,80,144,48,40,39,23,196, +1,11,11,248,22,139,16,2,57,86,95,23,195,1,23,194,1,248,22,190,15, +249,22,188,15,23,199,1,23,196,1,27,250,80,144,42,40,39,248,22,139,16, +2,56,23,197,1,10,28,23,193,2,248,22,190,15,23,194,1,11,28,23,193, +2,249,22,82,248,22,190,15,249,22,188,15,23,198,1,247,22,140,16,27,248, +22,84,23,199,1,28,248,22,90,23,194,2,9,27,248,80,144,42,53,39,248, +22,83,23,196,2,28,23,193,2,249,22,82,248,22,190,15,249,22,188,15,23, +198,1,247,22,140,16,248,80,144,44,8,48,39,248,22,84,23,198,1,86,94, +23,193,1,248,80,144,42,8,48,39,248,22,84,23,196,1,86,94,23,193,1, +27,248,22,84,23,197,1,28,248,22,90,23,194,2,9,27,248,80,144,40,53, +39,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,190,15,249,22,188, +15,23,198,1,247,22,140,16,248,80,144,42,8,48,39,248,22,84,23,198,1, +86,94,23,193,1,248,80,144,40,8,48,39,248,22,84,23,196,1,28,248,22, +90,23,195,2,9,27,27,248,22,83,23,197,2,28,248,22,187,15,23,194,2, +248,22,190,15,23,194,1,28,248,22,186,15,23,194,2,90,144,39,11,89,146, +39,36,11,248,22,183,15,249,22,188,15,27,248,22,139,16,2,56,250,80,144, +48,40,39,23,196,1,11,11,248,22,139,16,2,57,86,95,23,195,1,23,194, +1,248,22,190,15,249,22,188,15,23,199,1,23,196,1,27,250,80,144,42,40, +39,248,22,139,16,2,56,23,197,1,10,28,23,193,2,248,22,190,15,23,194, +1,11,28,23,193,2,249,22,82,248,22,190,15,249,22,188,15,23,198,1,247, +22,140,16,27,248,22,84,23,199,1,28,248,22,90,23,194,2,9,27,248,80, +144,42,53,39,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,190,15, +249,22,188,15,23,198,1,247,22,140,16,248,80,144,44,8,49,39,248,22,84, +23,198,1,86,94,23,193,1,248,80,144,42,8,49,39,248,22,84,23,196,1, +86,94,23,193,1,27,248,22,84,23,197,1,28,248,22,90,23,194,2,9,27, +248,80,144,40,53,39,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22, +190,15,249,22,188,15,23,198,1,247,22,140,16,248,80,144,42,8,49,39,248, +22,84,23,198,1,86,94,23,193,1,248,80,144,40,8,49,39,248,22,84,23, +196,1,27,248,22,139,16,2,58,28,248,22,187,15,23,194,2,248,22,190,15, +23,194,1,28,248,22,186,15,23,194,2,90,144,39,11,89,146,39,36,11,248, +22,183,15,249,22,188,15,27,248,22,139,16,2,56,250,80,144,47,40,39,23, +196,1,11,11,248,22,139,16,2,57,86,95,23,195,1,23,194,1,248,22,190, +15,249,22,188,15,23,199,1,23,196,1,27,250,80,144,41,40,39,248,22,139, +16,2,56,23,197,1,10,28,23,193,2,248,22,190,15,23,194,1,11,28,248, +22,90,23,195,2,9,27,27,248,22,83,23,197,2,28,248,22,187,15,23,194, +2,248,22,190,15,23,194,1,28,248,22,186,15,23,194,2,90,144,39,11,89, +146,39,36,11,248,22,183,15,249,22,188,15,27,248,22,139,16,2,56,250,80, +144,48,40,39,23,196,1,11,11,248,22,139,16,2,57,86,95,23,195,1,23, +194,1,248,22,190,15,249,22,188,15,23,199,1,23,196,1,27,250,80,144,42, +40,39,248,22,139,16,2,56,23,197,1,10,28,23,193,2,248,22,190,15,23, +194,1,11,28,23,193,2,249,22,82,248,22,190,15,249,22,188,15,23,198,1, +247,22,140,16,27,248,22,84,23,199,1,28,248,22,90,23,194,2,9,27,27, +248,22,83,23,196,2,28,248,22,187,15,23,194,2,248,22,190,15,23,194,1, +28,248,22,186,15,23,194,2,90,144,39,11,89,146,39,36,11,248,22,183,15, +249,22,188,15,27,248,22,139,16,2,56,250,80,144,52,40,39,23,196,1,11, +11,248,22,139,16,2,57,86,95,23,195,1,23,194,1,248,22,190,15,249,22, +188,15,23,199,1,23,196,1,27,250,80,144,46,40,39,248,22,139,16,2,56, +23,197,1,10,28,23,193,2,248,22,190,15,23,194,1,11,28,23,193,2,249, +22,82,248,22,190,15,249,22,188,15,23,198,1,247,22,140,16,27,248,22,84, +23,198,1,28,248,22,90,23,194,2,9,27,248,80,144,46,53,39,248,22,83, +23,196,2,28,23,193,2,249,22,82,248,22,190,15,249,22,188,15,23,198,1, +247,22,140,16,248,80,144,48,8,51,39,248,22,84,23,198,1,86,94,23,193, +1,248,80,144,46,8,51,39,248,22,84,23,196,1,86,94,23,193,1,27,248, +22,84,23,196,1,28,248,22,90,23,194,2,9,27,248,80,144,44,53,39,248, +22,83,23,196,2,28,23,193,2,249,22,82,248,22,190,15,249,22,188,15,23, +198,1,247,22,140,16,248,80,144,46,8,51,39,248,22,84,23,198,1,86,94, +23,193,1,248,80,144,44,8,51,39,248,22,84,23,196,1,86,94,23,193,1, +27,248,22,84,23,197,1,28,248,22,90,23,194,2,9,27,27,248,22,83,23, +196,2,28,248,22,187,15,23,194,2,248,22,190,15,23,194,1,28,248,22,186, +15,23,194,2,90,144,39,11,89,146,39,36,11,248,22,183,15,249,22,188,15, +27,248,22,139,16,2,56,250,80,144,50,40,39,23,196,1,11,11,248,22,139, +16,2,57,86,95,23,195,1,23,194,1,248,22,190,15,249,22,188,15,23,199, +1,23,196,1,27,250,80,144,44,40,39,248,22,139,16,2,56,23,197,1,10, +28,23,193,2,248,22,190,15,23,194,1,11,28,23,193,2,249,22,82,248,22, +190,15,249,22,188,15,23,198,1,247,22,140,16,27,248,22,84,23,198,1,28, +248,22,90,23,194,2,9,27,248,80,144,44,53,39,248,22,83,23,196,2,28, +23,193,2,249,22,82,248,22,190,15,249,22,188,15,23,198,1,247,22,140,16, +248,80,144,46,8,51,39,248,22,84,23,198,1,86,94,23,193,1,248,80,144, +44,8,51,39,248,22,84,23,196,1,86,94,23,193,1,27,248,22,84,23,196, +1,28,248,22,90,23,194,2,9,27,248,80,144,42,53,39,248,22,83,23,196, +2,28,23,193,2,249,22,82,248,22,190,15,249,22,188,15,23,198,1,247,22, +140,16,248,80,144,44,8,51,39,248,22,84,23,198,1,86,94,23,193,1,248, +80,144,42,8,51,39,248,22,84,23,196,1,27,247,22,146,16,27,248,80,144, 39,55,39,247,80,144,39,54,39,249,80,144,40,41,38,28,23,196,2,27,249, -22,173,8,247,22,172,8,2,74,28,192,249,22,163,8,194,7,63,2,66,2, -66,250,80,144,43,59,39,23,198,2,2,75,27,28,23,200,1,250,22,178,15, -248,22,137,16,2,61,250,22,158,2,23,205,1,2,59,247,22,169,8,2,76, -86,94,23,199,1,11,27,248,80,144,46,8,48,39,250,22,94,9,248,22,90, -248,22,137,16,2,55,9,28,193,249,22,80,195,194,192,27,247,22,144,16,27, +22,175,8,247,22,174,8,2,74,28,192,249,22,165,8,194,7,63,2,66,2, +66,250,80,144,43,59,39,23,198,2,2,75,27,28,23,200,1,250,22,180,15, +248,22,139,16,2,61,250,22,160,2,23,205,1,2,59,247,22,171,8,2,76, +86,94,23,199,1,11,27,248,80,144,46,8,48,39,250,22,96,9,248,22,92, +248,22,139,16,2,55,9,28,193,249,22,82,195,194,192,27,247,22,146,16,27, 248,80,144,39,55,39,247,80,144,39,54,39,249,80,144,40,41,38,28,23,196, -2,27,249,22,173,8,247,22,172,8,2,74,28,192,249,22,163,8,194,7,63, +2,27,249,22,175,8,247,22,174,8,2,74,28,192,249,22,165,8,194,7,63, 2,66,2,66,250,80,144,43,59,39,23,198,2,2,75,27,28,23,200,1,250, -22,178,15,248,22,137,16,2,61,250,22,158,2,23,205,1,2,59,247,22,169, -8,2,76,86,94,23,199,1,11,27,248,80,144,46,8,49,39,250,22,94,23, -207,1,248,22,90,248,22,137,16,2,55,9,28,193,249,22,80,195,194,192,27, -247,22,144,16,27,248,80,144,39,55,39,249,80,144,41,52,37,37,80,144,41, -8,50,39,249,80,144,40,41,38,28,23,196,2,27,249,22,173,8,247,22,172, -8,2,74,28,192,249,22,163,8,194,7,63,2,66,2,66,250,80,144,43,59, -39,23,198,2,2,75,27,28,23,200,1,250,22,178,15,248,22,137,16,2,61, -250,22,158,2,23,205,1,2,59,247,22,169,8,2,76,86,94,23,199,1,11, -27,27,250,22,94,23,207,1,248,22,90,248,22,137,16,2,55,23,208,1,28, -248,22,88,23,194,2,9,27,27,248,22,81,23,196,2,28,248,22,185,15,23, -194,2,248,22,188,15,23,194,1,28,248,22,184,15,23,194,2,90,144,39,11, -89,146,39,36,11,248,22,181,15,249,22,186,15,27,248,22,137,16,2,56,250, -80,144,58,40,39,23,196,1,11,11,248,22,137,16,2,57,86,95,23,195,1, -23,194,1,248,22,188,15,249,22,186,15,23,199,1,23,196,1,27,250,80,144, -52,40,39,248,22,137,16,2,56,23,197,1,10,28,23,193,2,248,22,188,15, -23,194,1,11,28,23,193,2,249,22,80,248,22,188,15,249,22,186,15,23,198, -1,247,22,138,16,27,248,22,82,23,198,1,28,248,22,88,23,194,2,9,27, -248,80,144,52,53,39,248,22,81,23,196,2,28,23,193,2,249,22,80,248,22, -188,15,249,22,186,15,23,198,1,247,22,138,16,248,80,144,54,8,51,39,248, -22,82,23,198,1,86,94,23,193,1,248,80,144,52,8,51,39,248,22,82,23, -196,1,86,94,23,193,1,27,248,22,82,23,196,1,28,248,22,88,23,194,2, -9,27,248,80,144,50,53,39,248,22,81,23,196,2,28,23,193,2,249,22,80, -248,22,188,15,249,22,186,15,23,198,1,247,22,138,16,248,80,144,52,8,51, -39,248,22,82,23,198,1,86,94,23,193,1,248,80,144,50,8,51,39,248,22, -82,23,196,1,28,193,249,22,80,195,194,192,27,20,13,144,80,144,37,43,37, -26,9,80,144,46,44,37,249,22,33,11,80,144,48,43,37,22,134,15,10,22, -141,15,10,22,142,15,10,22,143,15,10,248,22,146,6,23,196,2,28,248,22, -146,7,23,194,2,12,86,94,248,22,175,9,23,194,1,27,20,13,144,80,144, -38,43,37,26,9,80,144,47,44,37,249,22,33,11,80,144,49,43,37,22,134, -15,10,22,141,15,10,22,142,15,10,22,143,15,10,248,22,146,6,23,197,2, -28,248,22,146,7,23,194,2,12,86,94,248,22,175,9,23,194,1,27,20,13, +22,180,15,248,22,139,16,2,61,250,22,160,2,23,205,1,2,59,247,22,171, +8,2,76,86,94,23,199,1,11,27,248,80,144,46,8,49,39,250,22,96,23, +207,1,248,22,92,248,22,139,16,2,55,9,28,193,249,22,82,195,194,192,27, +247,22,146,16,27,248,80,144,39,55,39,249,80,144,41,52,37,37,80,144,41, +8,50,39,249,80,144,40,41,38,28,23,196,2,27,249,22,175,8,247,22,174, +8,2,74,28,192,249,22,165,8,194,7,63,2,66,2,66,250,80,144,43,59, +39,23,198,2,2,75,27,28,23,200,1,250,22,180,15,248,22,139,16,2,61, +250,22,160,2,23,205,1,2,59,247,22,171,8,2,76,86,94,23,199,1,11, +27,27,250,22,96,23,207,1,248,22,92,248,22,139,16,2,55,23,208,1,28, +248,22,90,23,194,2,9,27,27,248,22,83,23,196,2,28,248,22,187,15,23, +194,2,248,22,190,15,23,194,1,28,248,22,186,15,23,194,2,90,144,39,11, +89,146,39,36,11,248,22,183,15,249,22,188,15,27,248,22,139,16,2,56,250, +80,144,58,40,39,23,196,1,11,11,248,22,139,16,2,57,86,95,23,195,1, +23,194,1,248,22,190,15,249,22,188,15,23,199,1,23,196,1,27,250,80,144, +52,40,39,248,22,139,16,2,56,23,197,1,10,28,23,193,2,248,22,190,15, +23,194,1,11,28,23,193,2,249,22,82,248,22,190,15,249,22,188,15,23,198, +1,247,22,140,16,27,248,22,84,23,198,1,28,248,22,90,23,194,2,9,27, +248,80,144,52,53,39,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22, +190,15,249,22,188,15,23,198,1,247,22,140,16,248,80,144,54,8,51,39,248, +22,84,23,198,1,86,94,23,193,1,248,80,144,52,8,51,39,248,22,84,23, +196,1,86,94,23,193,1,27,248,22,84,23,196,1,28,248,22,90,23,194,2, +9,27,248,80,144,50,53,39,248,22,83,23,196,2,28,23,193,2,249,22,82, +248,22,190,15,249,22,188,15,23,198,1,247,22,140,16,248,80,144,52,8,51, +39,248,22,84,23,198,1,86,94,23,193,1,248,80,144,50,8,51,39,248,22, +84,23,196,1,28,193,249,22,82,195,194,192,27,20,13,144,80,144,37,43,37, +26,9,80,144,46,44,37,249,22,33,11,80,144,48,43,37,22,136,15,10,22, +143,15,10,22,144,15,10,22,145,15,10,248,22,148,6,23,196,2,28,248,22, +148,7,23,194,2,12,86,94,248,22,177,9,23,194,1,27,20,13,144,80,144, +38,43,37,26,9,80,144,47,44,37,249,22,33,11,80,144,49,43,37,22,136, +15,10,22,143,15,10,22,144,15,10,22,145,15,10,248,22,148,6,23,197,2, +28,248,22,148,7,23,194,2,12,86,94,248,22,177,9,23,194,1,27,20,13, 144,80,144,39,43,37,26,9,80,144,48,44,37,249,22,33,11,80,144,50,43, -37,22,134,15,10,22,141,15,10,22,142,15,10,22,143,15,10,248,22,146,6, -23,198,2,28,248,22,146,7,23,194,2,12,86,94,248,22,175,9,23,194,1, -248,80,144,40,8,52,39,197,86,94,249,22,137,7,247,22,171,5,23,196,2, -248,22,161,6,249,22,136,4,36,249,22,184,3,23,198,1,23,199,1,27,28, +37,22,136,15,10,22,143,15,10,22,144,15,10,22,145,15,10,248,22,148,6, +23,198,2,28,248,22,148,7,23,194,2,12,86,94,248,22,177,9,23,194,1, +248,80,144,40,8,52,39,197,86,94,249,22,139,7,247,22,173,5,23,196,2, +248,22,163,6,249,22,138,4,36,249,22,186,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,137,16,2,56,27,250,80,144,42,40,39,23,197,1,11,11,27,248,22,139, +22,139,16,2,56,27,250,80,144,42,40,39,23,197,1,11,11,27,248,22,141, 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, -138,6,23,199,1,20,20,95,88,148,8,36,36,48,11,9,224,4,2,33,185, -2,23,195,1,23,197,1,27,248,22,187,5,23,195,1,248,80,144,39,8,52, +141,4,23,202,1,27,28,23,194,2,23,194,1,86,94,23,194,1,36,249,22, +140,6,23,199,1,20,20,95,88,148,8,36,36,48,11,9,224,4,2,33,185, +2,23,195,1,23,197,1,27,248,22,189,5,23,195,1,248,80,144,39,8,52, 39,193,144,36,20,114,144,36,16,1,11,16,0,20,26,15,53,9,2,1,2, 1,29,11,11,11,11,9,9,11,11,11,10,43,80,143,36,36,20,114,144,50, 16,39,2,2,2,3,2,4,2,5,2,6,2,7,2,8,30,2,11,1,20, @@ -942,13 +942,13 @@ 2,7,2,36,2,2,2,5,53,53,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,49,20,15,16,2,32,0, 88,148,8,36,37,45,11,2,2,222,33,77,80,144,36,36,37,20,15,16,2, -249,22,153,7,7,92,7,92,80,144,36,37,37,20,15,16,2,88,148,8,36, +249,22,155,7,7,92,7,92,80,144,36,37,37,20,15,16,2,88,148,8,36, 37,54,38,2,4,223,0,33,82,80,144,36,38,37,20,15,16,2,88,148,8, 36,38,58,38,2,5,223,0,33,84,80,144,36,39,37,20,15,16,2,20,25, 96,2,6,88,148,8,36,39,8,24,8,32,9,223,0,33,91,88,148,8,36, 38,47,52,9,223,0,33,92,88,148,8,36,37,46,52,9,223,0,33,93,80, -144,36,40,37,20,15,16,2,27,248,22,148,16,248,22,165,8,27,28,249,22, -167,9,247,22,178,8,2,43,6,1,1,59,6,1,1,58,250,22,135,8,6, +144,36,40,37,20,15,16,2,27,248,22,150,16,248,22,167,8,27,28,249,22, +169,9,247,22,180,8,2,43,6,1,1,59,6,1,1,58,250,22,137,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,148,8,36,38,48,11,2,7,223,0,33,97,80,144,36,41,37,20,15, 16,2,88,148,36,37,8,38,8,128,6,2,8,223,0,33,98,80,144,36,42, @@ -977,7 +977,7 @@ 33,120,80,144,36,59,37,20,15,16,2,88,148,36,36,53,52,9,223,0,33, 121,80,144,36,8,44,39,20,15,16,2,88,148,8,36,36,54,16,4,8,240, 0,128,0,0,8,137,2,8,128,64,36,2,27,223,0,33,122,80,144,36,8, -24,37,20,15,16,2,247,22,140,2,80,144,36,8,25,37,20,15,16,2,248, +24,37,20,15,16,2,247,22,142,2,80,144,36,8,25,37,20,15,16,2,248, 22,18,65,115,116,97,109,112,80,144,36,8,26,37,20,15,16,2,88,148,36, 37,46,8,240,0,0,0,4,9,223,0,33,124,80,144,36,8,45,39,20,15, 16,2,88,148,36,38,48,16,4,36,8,128,80,8,128,128,36,2,30,223,0, @@ -1017,7 +1017,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 19187); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,49,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,231,1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99, @@ -1036,8 +1036,8 @@ 36,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,185,10,2,3,11,38,36,11, -248,22,90,249,22,80,22,172,10,88,148,36,37,45,44,9,223,9,33,9,80, +0,16,0,36,36,16,3,20,15,16,6,253,22,187,10,2,3,11,38,36,11, +248,22,92,249,22,82,22,174,10,88,148,36,37,45,44,9,223,9,33,9,80, 144,36,36,37,80,144,36,37,37,80,144,36,38,37,80,144,36,39,37,80,144, 36,40,37,20,15,16,2,20,27,143,88,148,36,37,45,44,9,223,0,33,10, 88,148,36,37,45,44,9,223,0,33,11,80,144,36,41,37,20,15,16,2,20, @@ -1047,7 +1047,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 557); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,49,46,50,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,106,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,75,1,87,1,118,1, @@ -1083,396 +1083,396 @@ 112,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,178,15,28, -249,22,167,9,23,201,2,2,29,86,94,23,199,1,23,197,1,28,248,22,183, -15,23,200,2,249,22,178,15,23,199,1,23,201,1,249,80,144,43,42,39,23, +116,6,4,4,46,114,107,116,67,105,103,110,111,114,101,100,250,22,180,15,28, +249,22,169,9,23,201,2,2,29,86,94,23,199,1,23,197,1,28,248,22,185, +15,23,200,2,249,22,180,15,23,199,1,23,201,1,249,80,144,43,42,39,23, 199,1,23,201,1,23,200,1,249,80,144,43,43,39,23,198,1,2,30,250,22, -178,15,28,249,22,167,9,23,201,2,2,29,86,94,23,199,1,23,197,1,28, -248,22,183,15,23,200,2,249,22,178,15,23,199,1,23,201,1,249,80,144,43, +180,15,28,249,22,169,9,23,201,2,2,29,86,94,23,199,1,23,197,1,28, +248,22,185,15,23,200,2,249,22,180,15,23,199,1,23,201,1,249,80,144,43, 42,39,23,199,1,23,201,1,23,200,1,249,80,144,43,43,39,23,198,1,2, -30,252,22,178,15,28,249,22,167,9,23,203,2,2,29,86,94,23,201,1,23, -199,1,28,248,22,183,15,23,202,2,249,22,178,15,23,201,1,23,203,1,249, -80,144,45,42,39,23,201,1,23,203,1,23,202,1,2,31,247,22,179,8,249, -80,144,45,43,39,23,200,1,80,144,45,36,38,252,22,178,15,28,249,22,167, -9,23,203,2,2,29,86,94,23,201,1,23,199,1,28,248,22,183,15,23,202, -2,249,22,178,15,23,201,1,23,203,1,249,80,144,45,42,39,23,201,1,23, -203,1,23,202,1,2,31,247,22,179,8,249,80,144,45,43,39,23,200,1,80, -144,45,36,38,27,252,22,178,15,28,249,22,167,9,23,201,2,2,29,86,94, -23,199,1,23,201,1,28,248,22,183,15,23,200,2,249,22,178,15,23,203,1, +30,252,22,180,15,28,249,22,169,9,23,203,2,2,29,86,94,23,201,1,23, +199,1,28,248,22,185,15,23,202,2,249,22,180,15,23,201,1,23,203,1,249, +80,144,45,42,39,23,201,1,23,203,1,23,202,1,2,31,247,22,181,8,249, +80,144,45,43,39,23,200,1,80,144,45,36,38,252,22,180,15,28,249,22,169, +9,23,203,2,2,29,86,94,23,201,1,23,199,1,28,248,22,185,15,23,202, +2,249,22,180,15,23,201,1,23,203,1,249,80,144,45,42,39,23,201,1,23, +203,1,23,202,1,2,31,247,22,181,8,249,80,144,45,43,39,23,200,1,80, +144,45,36,38,27,252,22,180,15,28,249,22,169,9,23,201,2,2,29,86,94, +23,199,1,23,201,1,28,248,22,185,15,23,200,2,249,22,180,15,23,203,1, 23,201,1,249,80,144,47,42,39,23,203,1,23,201,1,23,203,1,2,31,247, -22,179,8,249,80,144,47,43,39,23,202,1,80,144,47,36,38,27,250,22,132, -16,196,11,32,0,88,148,8,36,36,41,11,9,222,11,28,192,249,22,80,195, +22,181,8,249,80,144,47,43,39,23,202,1,80,144,47,36,38,27,250,22,134, +16,196,11,32,0,88,148,8,36,36,41,11,9,222,11,28,192,249,22,82,195, 194,11,249,22,5,20,20,96,88,148,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,252,22,178,15, -28,249,22,167,9,23,201,2,2,29,86,94,23,199,1,23,201,1,28,248,22, -183,15,23,200,2,249,22,178,15,23,203,1,23,201,1,249,80,144,47,42,39, -23,203,1,23,201,1,23,203,1,2,31,247,22,179,8,249,80,144,47,43,39, -23,202,1,80,144,47,36,38,27,250,22,132,16,196,11,32,0,88,148,8,36, -36,41,11,9,222,11,28,192,249,22,80,195,194,11,249,22,5,20,20,96,88, +2,6,33,48,23,199,1,23,195,1,23,196,1,23,197,1,27,252,22,180,15, +28,249,22,169,9,23,201,2,2,29,86,94,23,199,1,23,201,1,28,248,22, +185,15,23,200,2,249,22,180,15,23,203,1,23,201,1,249,80,144,47,42,39, +23,203,1,23,201,1,23,203,1,2,31,247,22,181,8,249,80,144,47,43,39, +23,202,1,80,144,47,36,38,27,250,22,134,16,196,11,32,0,88,148,8,36, +36,41,11,9,222,11,28,192,249,22,82,195,194,11,249,22,5,20,20,96,88, 148,8,36,37,54,8,129,3,9,226,5,3,2,6,33,50,23,199,1,23,195, -1,23,196,1,23,197,1,27,250,22,178,15,28,249,22,167,9,23,199,2,2, -29,86,94,23,197,1,23,199,1,28,248,22,183,15,23,198,2,249,22,178,15, +1,23,196,1,23,197,1,27,250,22,180,15,28,249,22,169,9,23,199,2,2, +29,86,94,23,197,1,23,199,1,28,248,22,185,15,23,198,2,249,22,180,15, 23,201,1,23,199,1,249,80,144,45,42,39,23,201,1,23,199,1,23,201,1, -249,80,144,45,43,39,23,200,1,2,30,27,250,22,132,16,196,11,32,0,88, -148,8,36,36,41,11,9,222,11,28,192,249,22,80,195,194,11,249,22,5,20, +249,80,144,45,43,39,23,200,1,2,30,27,250,22,134,16,196,11,32,0,88, +148,8,36,36,41,11,9,222,11,28,192,249,22,82,195,194,11,249,22,5,20, 20,96,88,148,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,27,250,22,178,15,28,249,22,167,9,23, -199,2,2,29,86,94,23,197,1,23,199,1,28,248,22,183,15,23,198,2,249, -22,178,15,23,201,1,23,199,1,249,80,144,45,42,39,23,201,1,23,199,1, -23,201,1,249,80,144,45,43,39,23,200,1,2,30,27,250,22,132,16,196,11, -32,0,88,148,8,36,36,41,11,9,222,11,28,192,249,22,80,195,194,11,249, +1,23,195,1,23,196,1,23,197,1,27,250,22,180,15,28,249,22,169,9,23, +199,2,2,29,86,94,23,197,1,23,199,1,28,248,22,185,15,23,198,2,249, +22,180,15,23,201,1,23,199,1,249,80,144,45,42,39,23,201,1,23,199,1, +23,201,1,249,80,144,45,43,39,23,200,1,2,30,27,250,22,134,16,196,11, +32,0,88,148,8,36,36,41,11,9,222,11,28,192,249,22,82,195,194,11,249, 22,5,20,20,96,88,148,8,36,37,52,8,128,3,9,226,5,3,2,6,33, 54,23,199,1,23,195,1,23,196,1,23,197,1,86,95,28,248,80,144,37,40, -39,23,195,2,12,250,22,176,11,2,27,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,89,23,196,2,28,249,22,130,4,248,22,93,23,198,2,37,28,28, -248,22,64,248,22,81,23,197,2,10,248,22,165,9,248,22,144,18,23,197,2, -249,22,4,22,64,248,22,145,18,23,198,2,11,11,11,10,12,250,22,176,11, +39,23,195,2,12,250,22,178,11,2,27,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,66,23,196,2,10, +28,248,22,91,23,196,2,28,249,22,132,4,248,22,95,23,198,2,37,28,28, +248,22,66,248,22,83,23,197,2,10,248,22,167,9,248,22,146,18,23,197,2, +249,22,4,22,66,248,22,147,18,23,198,2,11,11,11,10,12,250,22,178,11, 2,27,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,190,4,11,27,28,23,194,2,250,22,158,2,80,143,41,41,248,22,177, -16,247,22,130,14,11,11,27,28,23,194,2,250,22,158,2,248,22,82,23,198, +247,22,128,5,11,27,28,23,194,2,250,22,160,2,80,143,41,41,248,22,179, +16,247,22,132,14,11,11,27,28,23,194,2,250,22,160,2,248,22,84,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,144,80,144,39,38,37,250,80,144,42,39,37,249,22,33,11,80,144,44, -38,37,22,191,4,248,22,102,23,197,2,27,248,22,111,23,195,2,20,13,144, +38,37,22,129,5,248,22,104,23,197,2,27,248,22,113,23,195,2,20,13,144, 80,144,40,38,37,250,80,144,43,39,37,249,22,33,11,80,144,45,38,37,22, -176,5,28,248,22,160,15,23,197,2,23,196,1,86,94,23,196,1,247,22,138, -16,249,247,22,174,5,248,22,81,23,197,1,23,201,1,86,94,23,193,1,90, -144,47,11,89,146,37,36,11,28,248,22,185,15,23,209,2,23,208,2,27,247, -22,176,5,28,192,249,22,186,15,23,211,2,194,23,209,2,89,146,39,37,11, -248,22,181,15,23,209,1,86,94,23,196,1,89,146,38,40,11,28,23,209,2, -27,248,22,165,15,23,197,2,19,248,22,145,8,194,28,28,249,22,132,4,23, -195,4,40,249,22,148,8,2,28,249,22,151,8,197,249,22,184,3,23,199,4, -40,11,249,22,7,23,199,2,248,22,169,15,249,22,152,8,250,22,151,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,146,37,42,11,28,249,22,167,9,23,199,2, -23,197,2,23,193,2,249,22,178,15,23,196,2,23,199,2,89,146,37,43,11, -28,23,198,2,28,249,22,167,9,23,200,2,23,197,1,23,193,1,86,94,23, -193,1,249,22,178,15,23,196,2,23,200,2,86,94,23,195,1,11,89,146,37, -44,11,28,249,22,167,9,23,196,2,68,114,101,108,97,116,105,118,101,86,94, -23,194,1,2,29,23,194,1,89,146,37,45,11,247,22,142,16,89,146,37,46, -11,247,22,143,16,27,250,22,132,16,23,203,2,11,32,0,88,148,8,36,36, -41,11,9,222,11,27,28,23,194,2,249,22,80,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,132,16,23,207, -2,11,32,0,88,148,8,36,36,41,11,9,222,11,28,192,249,22,80,23,206, +178,5,28,248,22,162,15,23,197,2,23,196,1,86,94,23,196,1,247,22,140, +16,249,247,22,176,5,248,22,83,23,197,1,23,201,1,86,94,23,193,1,90, +144,47,11,89,146,37,36,11,28,248,22,187,15,23,209,2,23,208,2,27,247, +22,178,5,28,192,249,22,188,15,23,211,2,194,23,209,2,89,146,39,37,11, +248,22,183,15,23,209,1,86,94,23,196,1,89,146,38,40,11,28,23,209,2, +27,248,22,167,15,23,197,2,19,248,22,147,8,194,28,28,249,22,134,4,23, +195,4,40,249,22,150,8,2,28,249,22,153,8,197,249,22,186,3,23,199,4, +40,11,249,22,7,23,199,2,248,22,171,15,249,22,154,8,250,22,153,8,201, +36,249,22,186,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,146,37,42,11,28,249,22,169,9,23,199,2, +23,197,2,23,193,2,249,22,180,15,23,196,2,23,199,2,89,146,37,43,11, +28,23,198,2,28,249,22,169,9,23,200,2,23,197,1,23,193,1,86,94,23, +193,1,249,22,180,15,23,196,2,23,200,2,86,94,23,195,1,11,89,146,37, +44,11,28,249,22,169,9,23,196,2,68,114,101,108,97,116,105,118,101,86,94, +23,194,1,2,29,23,194,1,89,146,37,45,11,247,22,144,16,89,146,37,46, +11,247,22,145,16,27,250,22,134,16,23,203,2,11,32,0,88,148,8,36,36, +41,11,9,222,11,27,28,23,194,2,249,22,82,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,134,16,23,207, +2,11,32,0,88,148,8,36,36,41,11,9,222,11,28,192,249,22,82,23,206, 2,194,11,11,27,28,23,195,2,23,195,2,23,194,2,27,88,148,8,36,38, 51,8,128,3,62,122,111,225,19,13,9,33,44,27,88,148,8,36,38,51,8, 128,3,66,97,108,116,45,122,111,225,20,14,11,33,45,27,88,148,8,36,38, 53,8,129,3,9,225,21,15,11,33,46,27,88,148,8,36,38,53,8,129,3, -9,225,22,16,13,33,47,27,28,23,200,2,23,200,2,248,22,165,9,23,200, -2,27,28,23,208,2,28,23,200,2,86,94,23,201,1,23,200,2,248,22,165, +9,225,22,16,13,33,47,27,28,23,200,2,23,200,2,248,22,167,9,23,200, +2,27,28,23,208,2,28,23,200,2,86,94,23,201,1,23,200,2,248,22,167, 9,23,202,1,11,27,28,23,195,2,28,23,197,1,27,249,22,5,88,148,36, 37,48,8,129,3,9,226,28,23,22,18,33,49,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,82,196,248, -22,82,23,205,2,193,11,11,11,11,86,94,23,197,1,11,28,23,193,2,86, +11,193,28,192,192,28,193,28,23,202,2,28,249,22,134,4,248,22,84,196,248, +22,84,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,144,80,144,8,25,38,37,250,80,144,8,28,39,37,249, -22,33,11,80,144,8,30,38,37,22,191,4,11,20,13,144,80,144,8,25,38, -37,250,80,144,8,28,39,37,249,22,33,11,80,144,8,30,38,37,22,176,5, -28,248,22,160,15,23,216,2,23,215,1,86,94,23,215,1,247,22,138,16,249, -247,22,147,16,248,22,81,23,196,1,23,222,1,86,94,23,193,1,27,28,23, +22,33,11,80,144,8,30,38,37,22,129,5,11,20,13,144,80,144,8,25,38, +37,250,80,144,8,28,39,37,249,22,33,11,80,144,8,30,38,37,22,178,5, +28,248,22,162,15,23,216,2,23,215,1,86,94,23,215,1,247,22,140,16,249, +247,22,149,16,248,22,83,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,148,36,37,48,8,129,3,9,226,29, 24,23,20,33,51,23,218,2,27,28,23,204,2,11,193,28,192,192,28,193,28, -203,28,249,22,132,4,248,22,82,196,248,22,82,206,193,11,11,11,11,86,94, +203,28,249,22,134,4,248,22,84,196,248,22,84,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,144,80,144,8,26,38,37,250,80,144,8,29,39,37,249, -22,33,11,80,144,8,31,38,37,22,191,4,23,215,1,20,13,144,80,144,8, +22,33,11,80,144,8,31,38,37,22,129,5,23,215,1,20,13,144,80,144,8, 26,38,37,250,80,144,8,29,39,37,249,22,33,11,80,144,8,31,38,37,22, -176,5,28,248,22,160,15,23,217,2,23,216,1,86,94,23,216,1,247,22,138, -16,249,247,22,147,16,248,22,81,23,196,1,23,223,1,86,94,23,193,1,27, +178,5,28,248,22,162,15,23,217,2,23,216,1,86,94,23,216,1,247,22,140, +16,249,247,22,149,16,248,22,83,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,148,36,37,48,8, 128,3,9,226,30,25,24,20,33,53,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,82,196,248, -22,82,23,207,2,193,11,11,11,86,94,23,210,1,11,86,94,23,201,1,11, +11,193,28,192,192,28,193,28,23,204,2,28,249,22,134,4,248,22,84,196,248, +22,84,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,81,23,195,2, -28,23,219,2,250,22,156,2,248,22,82,23,223,1,23,223,1,250,22,90,23, +23,202,1,23,200,1,23,197,1,23,196,1,86,94,27,248,22,83,23,195,2, +28,23,219,2,250,22,158,2,248,22,84,23,223,1,23,223,1,250,22,92,23, 199,1,11,23,221,2,12,20,13,144,80,144,8,27,38,37,250,80,144,8,30, -39,37,249,22,33,11,80,144,8,32,38,37,22,191,4,11,20,13,144,80,144, +39,37,249,22,33,11,80,144,8,32,38,37,22,129,5,11,20,13,144,80,144, 8,27,38,37,250,80,144,8,30,39,37,249,22,33,11,80,144,8,32,38,37, -22,176,5,28,248,22,160,15,23,218,2,23,217,1,86,94,23,217,1,247,22, -138,16,249,247,22,174,5,248,22,144,18,23,196,1,23,224,32,0,0,0,1, +22,178,5,28,248,22,162,15,23,218,2,23,217,1,86,94,23,217,1,247,22, +140,16,249,247,22,176,5,248,22,146,18,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,148,36,37,48,8,128,3,9,226,31,26,25,22,33,55,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,82,196,248,22,82,23,15,193,11,11,11,86,96,23,217,1,23, +134,4,248,22,84,196,248,22,84,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,81,23,195,2,28,23,220,2,250,22,156,2,248, -22,82,23,224,32,0,0,0,1,23,224,32,0,0,0,1,250,22,90,23,199, +23,198,1,86,94,27,248,22,83,23,195,2,28,23,220,2,250,22,158,2,248, +22,84,23,224,32,0,0,0,1,23,224,32,0,0,0,1,250,22,92,23,199, 1,23,221,2,23,222,2,12,20,13,144,80,144,8,28,38,37,250,80,144,8, -31,39,37,249,22,33,11,80,144,8,33,38,37,22,191,4,23,217,1,20,13, +31,39,37,249,22,33,11,80,144,8,33,38,37,22,129,5,23,217,1,20,13, 144,80,144,8,28,38,37,250,80,144,8,31,39,37,249,22,33,11,80,144,8, -33,38,37,22,176,5,28,248,22,160,15,23,219,2,23,218,1,86,94,23,218, -1,247,22,138,16,249,247,22,174,5,248,22,144,18,23,196,1,23,224,33,0, -0,0,1,86,94,23,193,1,28,28,248,22,78,23,224,32,0,0,0,2,248, -22,144,18,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,78,23,224,33,0,0, -0,2,248,22,165,9,248,22,172,15,23,195,2,11,12,20,13,144,80,144,8, +33,38,37,22,178,5,28,248,22,162,15,23,219,2,23,218,1,86,94,23,218, +1,247,22,140,16,249,247,22,176,5,248,22,146,18,23,196,1,23,224,33,0, +0,0,1,86,94,23,193,1,28,28,248,22,80,23,224,32,0,0,0,2,248, +22,146,18,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,80,23,224,33,0,0, +0,2,248,22,167,9,248,22,174,15,23,195,2,11,12,20,13,144,80,144,8, 29,38,37,250,80,144,8,32,39,37,249,22,33,11,80,144,8,34,38,37,22, -191,4,28,23,224,35,0,0,0,2,28,23,202,1,11,23,196,2,86,94,23, +129,5,28,23,224,35,0,0,0,2,28,23,202,1,11,23,196,2,86,94,23, 202,1,11,20,13,144,80,144,8,29,38,37,250,80,144,8,32,39,37,249,22, -33,11,80,144,8,34,38,37,22,176,5,28,248,22,160,15,23,220,2,23,219, -1,86,94,23,219,1,247,22,138,16,249,247,22,174,5,23,195,1,23,224,34, -0,0,0,1,12,28,23,194,2,250,22,156,2,248,22,82,23,198,1,23,196, -1,250,22,90,23,201,1,23,202,1,23,203,1,12,27,249,22,187,8,80,144, -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,100,198,195,28,192,248,22,82,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,187,8,80,144,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,188,8,80,144,42,47,38,23,198, -1,248,22,175,2,249,22,80,249,22,80,23,205,1,23,206,1,28,23,199,2, +33,11,80,144,8,34,38,37,22,178,5,28,248,22,162,15,23,220,2,23,219, +1,86,94,23,219,1,247,22,140,16,249,247,22,176,5,23,195,1,23,224,34, +0,0,0,1,12,28,23,194,2,250,22,158,2,248,22,84,23,198,1,23,196, +1,250,22,92,23,201,1,23,202,1,23,203,1,12,27,249,22,189,8,80,144, +39,47,38,249,22,129,4,248,22,189,3,248,22,175,2,200,8,128,8,27,28, +193,248,22,178,2,194,11,28,192,27,249,22,102,198,195,28,192,248,22,84,193, +11,11,27,249,22,129,4,248,22,189,3,248,22,175,2,23,199,2,8,128,8, +27,249,22,189,8,80,144,40,47,38,23,196,2,27,28,23,194,2,248,22,178, +2,23,195,1,86,94,23,194,1,11,250,22,190,8,80,144,42,47,38,23,198, +1,248,22,177,2,249,22,82,249,22,82,23,205,1,23,206,1,28,23,199,2, 23,199,1,86,94,23,199,1,9,32,60,88,149,8,38,39,51,11,2,32,36, 223,3,33,75,32,61,88,149,8,38,39,50,11,2,32,36,223,3,33,74,32, 62,88,148,8,36,37,50,11,2,33,222,33,73,32,63,88,149,8,38,39,50, -11,2,32,36,223,3,33,64,28,249,22,128,4,23,197,2,23,195,4,248,22, -90,194,28,249,22,134,9,7,47,249,22,155,7,23,198,2,23,199,2,249,22, -80,250,22,173,7,23,199,2,36,23,200,2,248,2,62,249,22,173,7,23,199, -1,248,22,181,3,23,201,1,250,2,63,23,196,4,196,248,22,181,3,198,32, +11,2,32,36,223,3,33,64,28,249,22,130,4,23,197,2,23,195,4,248,22, +92,194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249,22, +82,250,22,175,7,23,199,2,36,23,200,2,248,2,62,249,22,175,7,23,199, +1,248,22,183,3,23,201,1,250,2,63,23,196,4,196,248,22,183,3,198,32, 65,88,149,8,38,39,52,11,2,32,36,223,3,33,72,32,66,88,149,8,38, 39,51,11,2,32,36,223,3,33,69,32,67,88,149,8,38,39,50,11,2,32, -36,223,3,33,68,28,249,22,128,4,23,197,2,23,195,4,248,22,90,194,28, -249,22,134,9,7,47,249,22,155,7,23,198,2,23,199,2,249,22,80,250,22, -173,7,23,199,2,36,23,200,2,248,2,62,249,22,173,7,23,199,1,248,22, -181,3,23,201,1,250,2,67,23,196,4,196,248,22,181,3,198,28,249,22,128, -4,23,197,2,23,195,4,248,22,90,194,28,249,22,134,9,7,47,249,22,155, -7,23,198,2,23,199,2,249,22,80,250,22,173,7,23,199,2,36,23,200,2, -27,249,22,173,7,23,199,1,248,22,181,3,23,201,1,19,248,22,154,7,23, -195,2,250,2,67,23,196,4,23,197,1,36,2,27,248,22,181,3,23,197,1, -28,249,22,128,4,23,195,2,23,196,4,248,22,90,195,28,249,22,134,9,7, -47,249,22,155,7,23,199,2,23,197,2,249,22,80,250,22,173,7,23,200,2, -36,23,198,2,248,2,62,249,22,173,7,23,200,1,248,22,181,3,23,199,1, -250,2,66,23,197,4,197,248,22,181,3,196,32,70,88,149,8,38,39,50,11, -2,32,36,223,3,33,71,28,249,22,128,4,23,197,2,23,195,4,248,22,90, -194,28,249,22,134,9,7,47,249,22,155,7,23,198,2,23,199,2,249,22,80, -250,22,173,7,23,199,2,36,23,200,2,248,2,62,249,22,173,7,23,199,1, -248,22,181,3,23,201,1,250,2,70,23,196,4,196,248,22,181,3,198,28,249, -22,128,4,23,197,2,23,195,4,248,22,90,194,28,249,22,134,9,7,47,249, -22,155,7,23,198,2,23,199,2,249,22,80,250,22,173,7,23,199,2,36,23, -200,2,27,249,22,173,7,23,199,1,248,22,181,3,23,201,1,19,248,22,154, -7,23,195,2,250,2,66,23,196,4,23,197,1,36,2,27,248,22,181,3,23, -197,1,28,249,22,128,4,23,195,2,23,196,4,248,22,90,195,28,249,22,134, -9,7,47,249,22,155,7,23,199,2,23,197,2,249,22,80,250,22,173,7,23, -200,2,36,23,198,2,27,249,22,173,7,23,200,1,248,22,181,3,23,199,1, -19,248,22,154,7,23,195,2,250,2,70,23,196,4,23,197,1,36,2,27,248, -22,181,3,23,195,1,28,249,22,128,4,23,195,2,23,197,4,248,22,90,196, -28,249,22,134,9,7,47,249,22,155,7,23,200,2,23,197,2,249,22,80,250, -22,173,7,23,201,2,36,23,198,2,248,2,62,249,22,173,7,23,201,1,248, -22,181,3,23,199,1,250,2,65,23,198,4,198,248,22,181,3,196,19,248,22, -154,7,23,195,2,28,249,22,128,4,36,23,195,4,248,22,90,194,28,249,22, -134,9,7,47,249,22,155,7,23,198,2,36,249,22,80,250,22,173,7,23,199, -2,36,36,27,249,22,173,7,23,199,1,37,19,248,22,154,7,23,195,2,250, -2,63,23,196,4,23,197,1,36,2,28,249,22,128,4,37,23,195,4,248,22, -90,194,28,249,22,134,9,7,47,249,22,155,7,23,198,2,37,249,22,80,250, -22,173,7,23,199,2,36,37,248,2,62,249,22,173,7,23,199,1,38,250,2, -65,23,196,4,196,38,2,28,249,22,128,4,23,197,2,23,195,4,248,22,90, -194,28,249,22,134,9,7,47,249,22,155,7,23,198,2,23,199,2,249,22,80, -250,22,173,7,23,199,2,36,23,200,2,248,2,62,249,22,173,7,23,199,1, -248,22,181,3,23,201,1,250,2,61,23,196,4,196,248,22,181,3,198,28,249, -22,128,4,23,197,2,23,195,4,248,22,90,194,28,249,22,134,9,7,47,249, -22,155,7,23,198,2,23,199,2,249,22,80,250,22,173,7,23,199,2,36,23, -200,2,27,249,22,173,7,23,199,1,248,22,181,3,23,201,1,19,248,22,154, -7,23,195,2,250,2,61,23,196,4,23,197,1,36,2,27,248,22,181,3,23, -197,1,28,249,22,128,4,23,195,2,23,196,4,248,22,90,195,28,249,22,134, -9,7,47,249,22,155,7,23,199,2,23,197,2,249,22,80,250,22,173,7,23, -200,2,36,23,198,2,248,2,62,249,22,173,7,23,200,1,248,22,181,3,23, -199,1,250,2,60,23,197,4,197,248,22,181,3,196,32,76,88,148,36,37,55, -11,2,33,222,33,77,28,248,22,88,248,22,82,23,195,2,249,22,7,9,248, -22,144,18,23,196,1,90,144,38,11,89,146,38,36,11,27,248,22,145,18,23, -197,2,28,248,22,88,248,22,82,23,195,2,249,22,7,9,248,22,144,18,195, -90,144,38,11,89,146,38,36,11,27,248,22,145,18,196,28,248,22,88,248,22, -82,23,195,2,249,22,7,9,248,22,144,18,195,90,144,38,11,89,146,38,36, -11,248,2,76,248,22,145,18,196,249,22,7,249,22,80,248,22,144,18,199,196, -195,249,22,7,249,22,80,248,22,144,18,199,196,195,249,22,7,249,22,80,248, -22,144,18,23,200,1,23,197,1,23,196,1,27,19,248,22,154,7,23,196,2, -250,2,60,23,196,4,23,198,1,36,2,28,23,195,1,192,28,248,22,88,248, -22,82,23,195,2,249,22,7,9,248,22,144,18,23,196,1,27,248,22,145,18, -23,195,2,90,144,38,11,89,146,38,36,11,28,248,22,88,248,22,82,23,197, -2,249,22,7,9,248,22,144,18,23,198,1,27,248,22,145,18,23,197,2,90, -144,38,11,89,146,38,36,11,28,248,22,88,248,22,82,23,197,2,249,22,7, -9,248,22,144,18,197,90,144,38,11,89,146,38,36,11,248,2,76,248,22,145, -18,198,249,22,7,249,22,80,248,22,144,18,201,196,195,249,22,7,249,22,80, -248,22,144,18,23,203,1,196,195,249,22,7,249,22,80,248,22,144,18,23,201, -1,23,197,1,23,196,1,248,22,136,12,252,22,159,10,248,22,163,4,23,200, -2,248,22,159,4,23,200,2,248,22,160,4,23,200,2,248,22,161,4,23,200, -2,248,22,162,4,23,200,1,28,24,194,2,12,20,13,144,80,144,36,58,37, -80,143,36,56,89,146,37,37,10,249,22,129,5,21,94,2,34,6,19,19,112, +36,223,3,33,68,28,249,22,130,4,23,197,2,23,195,4,248,22,92,194,28, +249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249,22,82,250,22, +175,7,23,199,2,36,23,200,2,248,2,62,249,22,175,7,23,199,1,248,22, +183,3,23,201,1,250,2,67,23,196,4,196,248,22,183,3,198,28,249,22,130, +4,23,197,2,23,195,4,248,22,92,194,28,249,22,136,9,7,47,249,22,157, +7,23,198,2,23,199,2,249,22,82,250,22,175,7,23,199,2,36,23,200,2, +27,249,22,175,7,23,199,1,248,22,183,3,23,201,1,19,248,22,156,7,23, +195,2,250,2,67,23,196,4,23,197,1,36,2,27,248,22,183,3,23,197,1, +28,249,22,130,4,23,195,2,23,196,4,248,22,92,195,28,249,22,136,9,7, +47,249,22,157,7,23,199,2,23,197,2,249,22,82,250,22,175,7,23,200,2, +36,23,198,2,248,2,62,249,22,175,7,23,200,1,248,22,183,3,23,199,1, +250,2,66,23,197,4,197,248,22,183,3,196,32,70,88,149,8,38,39,50,11, +2,32,36,223,3,33,71,28,249,22,130,4,23,197,2,23,195,4,248,22,92, +194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249,22,82, +250,22,175,7,23,199,2,36,23,200,2,248,2,62,249,22,175,7,23,199,1, +248,22,183,3,23,201,1,250,2,70,23,196,4,196,248,22,183,3,198,28,249, +22,130,4,23,197,2,23,195,4,248,22,92,194,28,249,22,136,9,7,47,249, +22,157,7,23,198,2,23,199,2,249,22,82,250,22,175,7,23,199,2,36,23, +200,2,27,249,22,175,7,23,199,1,248,22,183,3,23,201,1,19,248,22,156, +7,23,195,2,250,2,66,23,196,4,23,197,1,36,2,27,248,22,183,3,23, +197,1,28,249,22,130,4,23,195,2,23,196,4,248,22,92,195,28,249,22,136, +9,7,47,249,22,157,7,23,199,2,23,197,2,249,22,82,250,22,175,7,23, +200,2,36,23,198,2,27,249,22,175,7,23,200,1,248,22,183,3,23,199,1, +19,248,22,156,7,23,195,2,250,2,70,23,196,4,23,197,1,36,2,27,248, +22,183,3,23,195,1,28,249,22,130,4,23,195,2,23,197,4,248,22,92,196, +28,249,22,136,9,7,47,249,22,157,7,23,200,2,23,197,2,249,22,82,250, +22,175,7,23,201,2,36,23,198,2,248,2,62,249,22,175,7,23,201,1,248, +22,183,3,23,199,1,250,2,65,23,198,4,198,248,22,183,3,196,19,248,22, +156,7,23,195,2,28,249,22,130,4,36,23,195,4,248,22,92,194,28,249,22, +136,9,7,47,249,22,157,7,23,198,2,36,249,22,82,250,22,175,7,23,199, +2,36,36,27,249,22,175,7,23,199,1,37,19,248,22,156,7,23,195,2,250, +2,63,23,196,4,23,197,1,36,2,28,249,22,130,4,37,23,195,4,248,22, +92,194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,37,249,22,82,250, +22,175,7,23,199,2,36,37,248,2,62,249,22,175,7,23,199,1,38,250,2, +65,23,196,4,196,38,2,28,249,22,130,4,23,197,2,23,195,4,248,22,92, +194,28,249,22,136,9,7,47,249,22,157,7,23,198,2,23,199,2,249,22,82, +250,22,175,7,23,199,2,36,23,200,2,248,2,62,249,22,175,7,23,199,1, +248,22,183,3,23,201,1,250,2,61,23,196,4,196,248,22,183,3,198,28,249, +22,130,4,23,197,2,23,195,4,248,22,92,194,28,249,22,136,9,7,47,249, +22,157,7,23,198,2,23,199,2,249,22,82,250,22,175,7,23,199,2,36,23, +200,2,27,249,22,175,7,23,199,1,248,22,183,3,23,201,1,19,248,22,156, +7,23,195,2,250,2,61,23,196,4,23,197,1,36,2,27,248,22,183,3,23, +197,1,28,249,22,130,4,23,195,2,23,196,4,248,22,92,195,28,249,22,136, +9,7,47,249,22,157,7,23,199,2,23,197,2,249,22,82,250,22,175,7,23, +200,2,36,23,198,2,248,2,62,249,22,175,7,23,200,1,248,22,183,3,23, +199,1,250,2,60,23,197,4,197,248,22,183,3,196,32,76,88,148,36,37,55, +11,2,33,222,33,77,28,248,22,90,248,22,84,23,195,2,249,22,7,9,248, +22,146,18,23,196,1,90,144,38,11,89,146,38,36,11,27,248,22,147,18,23, +197,2,28,248,22,90,248,22,84,23,195,2,249,22,7,9,248,22,146,18,195, +90,144,38,11,89,146,38,36,11,27,248,22,147,18,196,28,248,22,90,248,22, +84,23,195,2,249,22,7,9,248,22,146,18,195,90,144,38,11,89,146,38,36, +11,248,2,76,248,22,147,18,196,249,22,7,249,22,82,248,22,146,18,199,196, +195,249,22,7,249,22,82,248,22,146,18,199,196,195,249,22,7,249,22,82,248, +22,146,18,23,200,1,23,197,1,23,196,1,27,19,248,22,156,7,23,196,2, +250,2,60,23,196,4,23,198,1,36,2,28,23,195,1,192,28,248,22,90,248, +22,84,23,195,2,249,22,7,9,248,22,146,18,23,196,1,27,248,22,147,18, +23,195,2,90,144,38,11,89,146,38,36,11,28,248,22,90,248,22,84,23,197, +2,249,22,7,9,248,22,146,18,23,198,1,27,248,22,147,18,23,197,2,90, +144,38,11,89,146,38,36,11,28,248,22,90,248,22,84,23,197,2,249,22,7, +9,248,22,146,18,197,90,144,38,11,89,146,38,36,11,248,2,76,248,22,147, +18,198,249,22,7,249,22,82,248,22,146,18,201,196,195,249,22,7,249,22,82, +248,22,146,18,23,203,1,196,195,249,22,7,249,22,82,248,22,146,18,23,201, +1,23,197,1,23,196,1,248,22,138,12,252,22,161,10,248,22,165,4,23,200, +2,248,22,161,4,23,200,2,248,22,162,4,23,200,2,248,22,163,4,23,200, +2,248,22,164,4,23,200,1,28,24,194,2,12,20,13,144,80,144,36,58,37, +80,143,36,56,89,146,37,37,10,249,22,131,5,21,94,2,34,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,167,9,23,197,2,80,143, -39,52,86,94,23,195,1,80,143,37,53,27,248,22,152,5,23,197,2,27,28, -248,22,78,23,195,2,248,22,144,18,23,195,1,23,194,1,28,248,22,160,15, -23,194,2,90,144,39,11,89,146,39,36,11,248,22,181,15,23,197,1,86,95, +111,108,118,101,114,12,27,28,23,195,2,28,249,22,169,9,23,197,2,80,143, +39,52,86,94,23,195,1,80,143,37,53,27,248,22,154,5,23,197,2,27,28, +248,22,80,23,195,2,248,22,146,18,23,195,1,23,194,1,28,248,22,162,15, +23,194,2,90,144,39,11,89,146,39,36,11,248,22,183,15,23,197,1,86,95, 20,18,144,11,80,143,42,52,199,20,18,144,11,80,143,42,53,192,192,11,11, -28,23,193,2,192,86,94,23,193,1,27,247,22,176,5,28,23,193,2,192,86, -94,23,193,1,247,22,138,16,90,144,39,11,89,146,39,36,11,248,22,181,15, -23,198,2,86,95,23,195,1,23,193,1,28,249,22,152,16,0,11,35,114,120, -34,91,46,93,115,115,36,34,248,22,165,15,23,197,1,249,80,144,41,59,39, +28,23,193,2,192,86,94,23,193,1,27,247,22,178,5,28,23,193,2,192,86, +94,23,193,1,247,22,140,16,90,144,39,11,89,146,39,36,11,248,22,183,15, +23,198,2,86,95,23,195,1,23,193,1,28,249,22,154,16,0,11,35,114,120, +34,91,46,93,115,115,36,34,248,22,167,15,23,197,1,249,80,144,41,59,39, 23,199,1,2,28,196,249,80,144,38,54,39,195,10,249,22,14,23,196,1,80, -144,38,51,38,86,96,28,248,22,150,5,23,196,2,12,250,22,176,11,2,23, +144,38,51,38,86,96,28,248,22,152,5,23,196,2,12,250,22,178,11,2,23, 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,131,14,23,197,2,10,12,250, -22,176,11,2,23,6,20,20,40,111,114,47,99,32,35,102,32,110,97,109,101, +116,104,63,23,198,2,28,28,23,196,2,248,22,133,14,23,197,2,10,12,250, +22,178,11,2,23,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,158,2,80,144,41,41,38,248,22,177,16,247, -22,130,14,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,22,80, -247,22,138,2,247,22,138,2,86,94,250,22,156,2,80,144,43,41,38,248,22, -177,16,247,22,130,14,195,192,86,94,250,22,156,2,248,22,81,23,197,2,23, -200,2,68,100,101,99,108,97,114,101,100,28,23,198,2,27,28,248,22,78,248, -22,152,5,23,200,2,248,22,151,5,248,22,81,248,22,152,5,23,201,1,23, -198,1,27,250,22,158,2,80,144,44,41,38,248,22,177,16,23,204,1,11,28, -23,193,2,27,250,22,158,2,248,22,82,23,198,1,23,198,2,11,28,23,193, -2,250,22,156,2,248,22,145,18,23,200,1,23,198,1,23,196,1,12,12,12, +86,94,23,193,1,12,27,250,22,160,2,80,144,41,41,38,248,22,179,16,247, +22,132,14,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249,22,82, +247,22,140,2,247,22,140,2,86,94,250,22,158,2,80,144,43,41,38,248,22, +179,16,247,22,132,14,195,192,86,94,250,22,158,2,248,22,83,23,197,2,23, +200,2,68,100,101,99,108,97,114,101,100,28,23,198,2,27,28,248,22,80,248, +22,154,5,23,200,2,248,22,153,5,248,22,83,248,22,154,5,23,201,1,23, +198,1,27,250,22,160,2,80,144,44,41,38,248,22,179,16,23,204,1,11,28, +23,193,2,27,250,22,160,2,248,22,84,23,198,1,23,198,2,11,28,23,193, +2,250,22,158,2,248,22,147,18,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,87,88,148,36,38,47, 11,76,102,108,97,116,116,101,110,45,115,117,98,45,112,97,116,104,222,33,90, -32,88,88,148,36,40,54,11,2,33,222,33,89,28,248,22,88,23,197,2,28, -248,22,88,195,192,249,22,80,194,248,22,95,197,28,249,22,169,9,248,22,81, -23,199,2,2,37,28,248,22,88,23,196,2,86,95,23,196,1,23,195,1,250, -22,172,11,2,23,6,37,37,116,111,111,32,109,97,110,121,32,34,46,46,34, +32,88,88,148,36,40,54,11,2,33,222,33,89,28,248,22,90,23,197,2,28, +248,22,90,195,192,249,22,82,194,248,22,97,197,28,249,22,171,9,248,22,83, +23,199,2,2,37,28,248,22,90,23,196,2,86,95,23,196,1,23,195,1,250, +22,174,11,2,23,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,91,2,36,28,249,22,169,9,23,201,2,2,38,23,199,1, -28,248,22,160,15,23,200,2,23,199,1,249,22,90,28,248,22,64,23,202,2, -2,4,2,39,23,201,1,23,200,1,251,2,88,196,197,248,22,82,199,248,22, -145,18,200,251,2,88,196,197,249,22,80,248,22,144,18,202,200,248,22,145,18, -200,251,2,88,196,197,9,197,27,250,22,174,7,27,28,23,199,2,28,247,22, -189,11,248,80,144,44,55,39,23,200,2,11,11,28,192,192,6,29,29,115,116, +126,46,115,250,22,93,2,36,28,249,22,171,9,23,201,2,2,38,23,199,1, +28,248,22,162,15,23,200,2,23,199,1,249,22,92,28,248,22,66,23,202,2, +2,4,2,39,23,201,1,23,200,1,251,2,88,196,197,248,22,84,199,248,22, +147,18,200,251,2,88,196,197,249,22,82,248,22,146,18,202,200,248,22,147,18, +200,251,2,88,196,197,9,197,27,250,22,176,7,27,28,23,199,2,28,247,22, +191,11,248,80,144,44,55,39,23,200,2,11,11,28,192,192,6,29,29,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,6,2,2,58,32,250,22,163,16,0,7,35,114,120,34, -92,110,34,23,203,1,249,22,135,8,6,23,23,10,32,32,102,111,114,32,109, -111,100,117,108,101,32,112,97,116,104,58,32,126,115,10,23,202,2,248,22,166, -13,28,23,196,2,251,22,174,12,23,198,1,247,22,29,248,22,90,23,201,1, -23,199,1,86,94,23,196,1,250,22,137,13,23,197,1,247,22,29,23,198,1, -28,249,22,157,7,194,2,38,2,29,28,249,22,157,7,194,2,37,62,117,112, +115,111,108,118,101,114,6,2,2,58,32,250,22,165,16,0,7,35,114,120,34, +92,110,34,23,203,1,249,22,137,8,6,23,23,10,32,32,102,111,114,32,109, +111,100,117,108,101,32,112,97,116,104,58,32,126,115,10,23,202,2,248,22,168, +13,28,23,196,2,251,22,176,12,23,198,1,247,22,29,248,22,92,23,201,1, +23,199,1,86,94,23,196,1,250,22,139,13,23,197,1,247,22,29,23,198,1, +28,249,22,159,7,194,2,38,2,29,28,249,22,159,7,194,2,37,62,117,112, 192,32,93,88,148,8,36,37,50,11,67,115,115,45,62,114,107,116,222,33,94, -19,248,22,154,7,194,28,249,22,132,4,23,195,4,39,28,249,22,157,7,6, -3,3,46,115,115,249,22,173,7,197,249,22,184,3,23,199,4,39,249,22,174, -7,250,22,173,7,198,36,249,22,184,3,23,200,4,39,2,42,193,193,2,0, +19,248,22,156,7,194,28,249,22,134,4,23,195,4,39,28,249,22,159,7,6, +3,3,46,115,115,249,22,175,7,197,249,22,186,3,23,199,4,39,249,22,176, +7,250,22,175,7,198,36,249,22,186,3,23,200,4,39,2,42,193,193,2,0, 8,35,114,120,34,91,46,93,34,32,96,88,148,8,36,37,47,11,2,33,222, -33,97,28,248,22,88,23,194,2,9,250,22,91,6,4,4,10,32,32,32,248, -22,164,15,248,22,103,23,198,2,248,2,96,248,22,82,23,198,1,28,249,22, -169,9,248,22,82,23,200,2,23,197,1,28,249,22,167,9,248,22,144,18,23, -200,1,23,196,1,251,22,172,11,2,23,6,41,41,99,121,99,108,101,32,105, +33,97,28,248,22,90,23,194,2,9,250,22,93,6,4,4,10,32,32,32,248, +22,166,15,248,22,105,23,198,2,248,2,96,248,22,84,23,198,1,28,249,22, +171,9,248,22,84,23,200,2,23,197,1,28,249,22,169,9,248,22,146,18,23, +200,1,23,196,1,251,22,174,11,2,23,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,174, -7,248,2,96,248,22,95,23,201,1,12,12,247,23,193,1,250,22,157,4,11, -196,195,20,13,144,80,144,45,50,38,249,22,80,249,22,80,248,22,177,16,247, -22,130,14,23,201,1,23,195,1,20,13,144,80,144,45,38,37,252,80,144,50, -39,37,249,22,33,11,80,144,52,38,37,22,190,4,23,200,2,22,128,5,248, +126,97,10,32,32,112,97,116,104,115,58,126,97,23,200,1,249,22,1,22,176, +7,248,2,96,248,22,97,23,201,1,12,12,247,23,193,1,250,22,159,4,11, +196,195,20,13,144,80,144,45,50,38,249,22,82,249,22,82,248,22,179,16,247, +22,132,14,23,201,1,23,195,1,20,13,144,80,144,45,38,37,252,80,144,50, +39,37,249,22,33,11,80,144,52,38,37,22,128,5,23,200,2,22,130,5,248, 28,23,207,2,20,20,94,88,148,8,36,37,46,11,9,223,14,33,100,23,207, -1,86,94,23,207,1,22,7,28,248,22,64,23,206,2,23,205,1,28,28,248, -22,78,23,206,2,249,22,167,9,248,22,144,18,23,208,2,2,34,11,23,205, -1,86,94,23,205,1,28,248,22,150,5,23,202,2,27,248,22,152,5,23,203, -2,28,248,22,64,193,249,22,90,2,4,194,192,23,201,2,249,247,22,175,5, -23,200,1,27,248,22,68,248,22,164,15,23,201,1,28,23,203,2,28,250,22, -158,2,248,22,81,23,201,1,23,201,1,11,249,22,80,11,204,249,22,80,194, -204,192,86,96,28,248,22,160,5,23,196,2,12,28,248,22,155,4,23,198,2, -250,22,174,11,11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97, -116,104,23,200,2,250,22,176,11,2,23,2,35,23,198,2,28,28,23,196,2, -248,22,150,5,23,197,2,10,12,250,22,176,11,2,23,6,31,31,40,111,114, +1,86,94,23,207,1,22,7,28,248,22,66,23,206,2,23,205,1,28,28,248, +22,80,23,206,2,249,22,169,9,248,22,146,18,23,208,2,2,34,11,23,205, +1,86,94,23,205,1,28,248,22,152,5,23,202,2,27,248,22,154,5,23,203, +2,28,248,22,66,193,249,22,92,2,4,194,192,23,201,2,249,247,22,177,5, +23,200,1,27,248,22,70,248,22,166,15,23,201,1,28,23,203,2,28,250,22, +160,2,248,22,83,23,201,1,23,201,1,11,249,22,82,11,204,249,22,82,194, +204,192,86,96,28,248,22,162,5,23,196,2,12,28,248,22,157,4,23,198,2, +250,22,176,11,11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97, +116,104,23,200,2,250,22,178,11,2,23,2,35,23,198,2,28,28,23,196,2, +248,22,152,5,23,197,2,10,12,250,22,178,11,2,23,6,31,31,40,111,114, 47,99,32,35,102,32,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101, -45,112,97,116,104,63,41,23,199,2,28,28,23,197,2,248,22,155,4,23,198, -2,10,12,250,22,176,11,2,23,6,17,17,40,111,114,47,99,32,35,102,32, -115,121,110,116,97,120,63,41,23,200,2,28,28,248,22,78,23,196,2,249,22, -167,9,248,22,144,18,23,198,2,2,4,11,86,97,23,198,1,23,197,1,23, -196,1,23,193,1,248,22,151,5,248,22,102,23,197,1,28,28,248,22,78,23, -196,2,28,249,22,167,9,248,22,144,18,23,198,2,2,36,28,248,22,78,248, -22,102,23,197,2,249,22,167,9,248,22,106,23,198,2,2,4,11,11,11,86, -97,23,198,1,23,197,1,23,196,1,23,193,1,248,22,151,5,249,2,87,248, -22,119,23,199,2,248,22,104,23,199,1,28,28,248,22,78,23,196,2,28,249, -22,167,9,248,22,144,18,23,198,2,2,36,28,28,249,22,169,9,248,22,102, -23,198,2,2,38,10,249,22,169,9,248,22,102,23,198,2,2,37,28,23,196, -2,27,248,22,152,5,23,198,2,28,248,22,64,193,10,28,248,22,78,193,248, -22,64,248,22,144,18,194,11,11,11,11,11,86,96,23,198,1,23,197,1,23, -193,1,27,248,22,152,5,23,198,1,248,22,151,5,249,2,87,28,248,22,78, -23,197,2,248,22,144,18,23,197,2,23,196,2,27,28,249,22,169,9,248,22, -102,23,203,2,2,37,248,22,145,18,200,248,22,104,200,28,248,22,78,23,198, -2,249,22,94,248,22,145,18,199,194,192,28,28,248,22,78,23,196,2,249,22, -167,9,248,22,144,18,23,198,2,2,40,11,86,94,248,80,144,38,8,29,39, +45,112,97,116,104,63,41,23,199,2,28,28,23,197,2,248,22,157,4,23,198, +2,10,12,250,22,178,11,2,23,6,17,17,40,111,114,47,99,32,35,102,32, +115,121,110,116,97,120,63,41,23,200,2,28,28,248,22,80,23,196,2,249,22, +169,9,248,22,146,18,23,198,2,2,4,11,86,97,23,198,1,23,197,1,23, +196,1,23,193,1,248,22,153,5,248,22,104,23,197,1,28,28,248,22,80,23, +196,2,28,249,22,169,9,248,22,146,18,23,198,2,2,36,28,248,22,80,248, +22,104,23,197,2,249,22,169,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,153,5,249,2,87,248, +22,121,23,199,2,248,22,106,23,199,1,28,28,248,22,80,23,196,2,28,249, +22,169,9,248,22,146,18,23,198,2,2,36,28,28,249,22,171,9,248,22,104, +23,198,2,2,38,10,249,22,171,9,248,22,104,23,198,2,2,37,28,23,196, +2,27,248,22,154,5,23,198,2,28,248,22,66,193,10,28,248,22,80,193,248, +22,66,248,22,146,18,194,11,11,11,11,11,86,96,23,198,1,23,197,1,23, +193,1,27,248,22,154,5,23,198,1,248,22,153,5,249,2,87,28,248,22,80, +23,197,2,248,22,146,18,23,197,2,23,196,2,27,28,249,22,171,9,248,22, +104,23,203,2,2,37,248,22,147,18,200,248,22,106,200,28,248,22,80,23,198, +2,249,22,96,248,22,147,18,199,194,192,28,28,248,22,80,23,196,2,249,22, +169,9,248,22,146,18,23,198,2,2,40,11,86,94,248,80,144,38,8,29,39, 23,194,2,253,24,199,1,23,201,1,23,202,1,23,203,1,23,204,1,11,80, -143,43,56,28,28,248,22,78,23,196,2,28,249,22,167,9,248,22,144,18,23, -198,2,2,36,28,248,22,78,248,22,102,23,197,2,249,22,167,9,248,22,106, +143,43,56,28,28,248,22,80,23,196,2,28,249,22,169,9,248,22,146,18,23, +198,2,2,36,28,248,22,80,248,22,104,23,197,2,249,22,169,9,248,22,108, 23,198,2,2,40,11,11,11,86,94,248,80,144,38,8,29,39,23,194,2,253, -24,199,1,248,22,102,23,202,2,23,202,1,23,203,1,23,204,1,248,22,104, +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,143,43,56,86,94,23,193,1,27,88,148,8,36,37,54,8,240, 0,0,8,0,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45, -101,114,114,225,2,5,3,33,91,27,28,248,22,78,23,198,2,28,249,22,167, -9,2,36,248,22,144,18,23,200,2,27,248,22,102,23,199,2,28,28,249,22, -169,9,23,195,2,2,38,10,249,22,169,9,23,195,2,2,37,86,94,23,193, -1,28,23,199,2,27,248,22,152,5,23,201,2,28,248,22,78,193,248,22,144, -18,193,192,250,22,172,11,2,23,6,45,45,110,111,32,98,97,115,101,32,112, +101,114,114,225,2,5,3,33,91,27,28,248,22,80,23,198,2,28,249,22,169, +9,2,36,248,22,146,18,23,200,2,27,248,22,104,23,199,2,28,28,249,22, +171,9,23,195,2,2,38,10,249,22,171,9,23,195,2,2,37,86,94,23,193, +1,28,23,199,2,27,248,22,154,5,23,201,2,28,248,22,80,193,248,22,146, +18,193,192,250,22,174,11,2,23,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,78,23,199,2,28,249,22,167,9,2,36,248,22, -144,18,23,201,2,27,28,28,28,249,22,169,9,248,22,102,23,202,2,2,38, -10,249,22,169,9,248,22,102,23,202,2,2,37,23,200,2,11,27,248,22,152, -5,23,202,2,27,28,249,22,169,9,248,22,102,23,204,2,2,37,248,22,145, -18,23,202,1,248,22,104,23,202,1,28,248,22,78,23,195,2,249,2,87,248, -22,144,18,23,197,2,249,22,94,248,22,145,18,23,199,1,23,197,1,249,2, -87,23,196,1,23,195,1,249,2,87,2,38,28,249,22,169,9,248,22,102,23, -204,2,2,37,248,22,145,18,23,202,1,248,22,104,23,202,1,28,248,22,78, -193,248,22,145,18,193,11,11,11,27,28,248,22,64,23,196,2,27,248,80,144, -43,48,39,249,22,80,23,199,2,247,22,140,16,28,23,193,2,192,86,94,23, -193,1,90,144,38,11,89,146,38,36,11,249,80,144,46,54,39,248,22,71,23, -201,2,11,27,28,248,22,88,23,195,2,2,41,249,22,174,7,23,197,2,2, -42,251,80,144,49,8,24,39,23,204,1,28,248,22,88,23,199,2,23,199,1, -86,94,23,199,1,248,22,81,23,199,2,28,248,22,88,23,199,2,86,94,23, -198,1,9,248,22,145,18,23,199,1,23,197,1,28,248,22,151,7,23,196,2, +2,23,197,2,27,28,248,22,80,23,199,2,28,249,22,169,9,2,36,248,22, +146,18,23,201,2,27,28,28,28,249,22,171,9,248,22,104,23,202,2,2,38, +10,249,22,171,9,248,22,104,23,202,2,2,37,23,200,2,11,27,248,22,154, +5,23,202,2,27,28,249,22,171,9,248,22,104,23,204,2,2,37,248,22,147, +18,23,202,1,248,22,106,23,202,1,28,248,22,80,23,195,2,249,2,87,248, +22,146,18,23,197,2,249,22,96,248,22,147,18,23,199,1,23,197,1,249,2, +87,23,196,1,23,195,1,249,2,87,2,38,28,249,22,171,9,248,22,104,23, +204,2,2,37,248,22,147,18,23,202,1,248,22,106,23,202,1,28,248,22,80, +193,248,22,147,18,193,11,11,11,27,28,248,22,66,23,196,2,27,248,80,144, +43,48,39,249,22,82,23,199,2,247,22,142,16,28,23,193,2,192,86,94,23, +193,1,90,144,38,11,89,146,38,36,11,249,80,144,46,54,39,248,22,73,23, +201,2,11,27,28,248,22,90,23,195,2,2,41,249,22,176,7,23,197,2,2, +42,251,80,144,49,8,24,39,23,204,1,28,248,22,90,23,199,2,23,199,1, +86,94,23,199,1,248,22,83,23,199,2,28,248,22,90,23,199,2,86,94,23, +198,1,9,248,22,147,18,23,199,1,23,197,1,28,248,22,153,7,23,196,2, 86,94,23,196,1,27,248,80,144,43,8,30,39,23,202,2,27,248,80,144,44, -48,39,249,22,80,23,200,2,23,197,2,28,23,193,2,192,86,94,23,193,1, +48,39,249,22,82,23,200,2,23,197,2,28,23,193,2,192,86,94,23,193,1, 90,144,38,11,89,146,38,36,11,249,80,144,47,54,39,23,201,2,11,250,22, -1,22,178,15,23,199,1,249,22,94,249,22,2,32,0,88,148,8,36,37,44, -11,9,222,33,92,23,200,1,248,22,90,248,2,93,23,201,1,28,248,22,160, -15,23,196,2,86,94,23,196,1,248,80,144,42,8,31,39,248,22,188,15,28, -248,22,185,15,23,198,2,23,197,2,249,22,186,15,23,199,2,248,80,144,46, -8,30,39,23,205,2,28,249,22,167,9,248,22,81,23,198,2,2,34,27,248, -80,144,43,48,39,249,22,80,23,199,2,247,22,140,16,28,23,193,2,192,86, +1,22,180,15,23,199,1,249,22,96,249,22,2,32,0,88,148,8,36,37,44, +11,9,222,33,92,23,200,1,248,22,92,248,2,93,23,201,1,28,248,22,162, +15,23,196,2,86,94,23,196,1,248,80,144,42,8,31,39,248,22,190,15,28, +248,22,187,15,23,198,2,23,197,2,249,22,188,15,23,199,2,248,80,144,46, +8,30,39,23,205,2,28,249,22,169,9,248,22,83,23,198,2,2,34,27,248, +80,144,43,48,39,249,22,82,23,199,2,247,22,142,16,28,23,193,2,192,86, 94,23,193,1,90,144,39,11,89,146,38,36,11,249,80,144,47,54,39,248,22, -102,23,202,2,11,89,146,37,38,11,28,248,22,88,248,22,104,23,201,2,28, -248,22,88,23,194,2,249,22,156,16,2,95,23,196,2,11,10,27,28,23,196, -2,248,2,93,23,196,2,28,248,22,88,23,195,2,2,41,28,249,22,156,16, -2,95,23,197,2,248,2,93,23,196,2,249,22,174,7,23,197,2,2,42,27, -28,23,197,1,86,94,23,196,1,249,22,94,28,248,22,88,248,22,104,23,205, -2,21,93,6,5,5,109,122,108,105,98,249,22,1,22,94,249,22,2,80,144, -53,8,32,39,248,22,104,23,208,2,23,197,1,28,248,22,88,23,196,2,86, -94,23,195,1,248,22,90,23,197,1,86,94,23,196,1,23,195,1,251,80,144, -51,8,24,39,23,206,1,248,22,81,23,198,2,248,22,145,18,23,198,1,23, -198,1,28,249,22,167,9,248,22,144,18,23,198,2,2,39,248,80,144,42,8, -31,39,248,22,188,15,249,22,186,15,248,22,190,15,248,22,102,23,201,2,248, -80,144,46,8,30,39,23,205,2,12,86,94,28,28,248,22,160,15,23,194,2, -10,248,22,182,8,23,194,2,12,28,23,201,2,250,22,174,11,67,114,101,113, -117,105,114,101,249,22,135,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,81,23,199,2,6,0,0,23, -204,2,250,22,176,11,2,23,2,35,23,198,2,27,28,248,22,182,8,23,195, -2,249,22,187,8,23,196,2,36,249,22,188,15,248,22,189,15,23,197,2,11, -27,28,248,22,182,8,23,196,2,249,22,187,8,23,197,2,37,248,80,144,44, -8,25,39,23,195,2,90,144,39,11,89,146,39,36,11,28,248,22,182,8,23, -199,2,250,22,7,2,43,249,22,187,8,23,203,2,38,2,43,248,22,181,15, -23,198,2,86,95,23,195,1,23,193,1,27,28,248,22,182,8,23,200,2,249, -22,187,8,23,201,2,39,249,80,144,49,59,39,23,197,2,5,0,27,28,248, -22,182,8,23,201,2,249,22,187,8,23,202,2,40,248,22,151,5,23,200,2, -27,250,22,158,2,80,144,52,41,38,248,22,177,16,247,22,130,14,11,27,28, -23,194,2,23,194,1,86,94,23,194,1,27,249,22,80,247,22,138,2,247,22, -138,2,86,94,250,22,156,2,80,144,54,41,38,248,22,177,16,247,22,130,14, -195,192,27,28,23,204,2,248,22,151,5,249,22,80,248,22,152,5,23,200,2, -23,207,2,23,196,2,86,95,28,23,212,1,27,250,22,158,2,248,22,81,23, +104,23,202,2,11,89,146,37,38,11,28,248,22,90,248,22,106,23,201,2,28, +248,22,90,23,194,2,249,22,158,16,2,95,23,196,2,11,10,27,28,23,196, +2,248,2,93,23,196,2,28,248,22,90,23,195,2,2,41,28,249,22,158,16, +2,95,23,197,2,248,2,93,23,196,2,249,22,176,7,23,197,2,2,42,27, +28,23,197,1,86,94,23,196,1,249,22,96,28,248,22,90,248,22,106,23,205, +2,21,93,6,5,5,109,122,108,105,98,249,22,1,22,96,249,22,2,80,144, +53,8,32,39,248,22,106,23,208,2,23,197,1,28,248,22,90,23,196,2,86, +94,23,195,1,248,22,92,23,197,1,86,94,23,196,1,23,195,1,251,80,144, +51,8,24,39,23,206,1,248,22,83,23,198,2,248,22,147,18,23,198,1,23, +198,1,28,249,22,169,9,248,22,146,18,23,198,2,2,39,248,80,144,42,8, +31,39,248,22,190,15,249,22,188,15,248,22,128,16,248,22,104,23,201,2,248, +80,144,46,8,30,39,23,205,2,12,86,94,28,28,248,22,162,15,23,194,2, +10,248,22,184,8,23,194,2,12,28,23,201,2,250,22,176,11,67,114,101,113, +117,105,114,101,249,22,137,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,83,23,199,2,6,0,0,23, +204,2,250,22,178,11,2,23,2,35,23,198,2,27,28,248,22,184,8,23,195, +2,249,22,189,8,23,196,2,36,249,22,190,15,248,22,191,15,23,197,2,11, +27,28,248,22,184,8,23,196,2,249,22,189,8,23,197,2,37,248,80,144,44, +8,25,39,23,195,2,90,144,39,11,89,146,39,36,11,28,248,22,184,8,23, +199,2,250,22,7,2,43,249,22,189,8,23,203,2,38,2,43,248,22,183,15, +23,198,2,86,95,23,195,1,23,193,1,27,28,248,22,184,8,23,200,2,249, +22,189,8,23,201,2,39,249,80,144,49,59,39,23,197,2,5,0,27,28,248, +22,184,8,23,201,2,249,22,189,8,23,202,2,40,248,22,153,5,23,200,2, +27,250,22,160,2,80,144,52,41,38,248,22,179,16,247,22,132,14,11,27,28, +23,194,2,23,194,1,86,94,23,194,1,27,249,22,82,247,22,140,2,247,22, +140,2,86,94,250,22,158,2,80,144,54,41,38,248,22,179,16,247,22,132,14, +195,192,27,28,23,204,2,248,22,153,5,249,22,82,248,22,154,5,23,200,2, +23,207,2,23,196,2,86,95,28,23,212,1,27,250,22,160,2,248,22,83,23, 199,2,196,11,28,23,193,1,12,27,27,28,248,22,17,80,144,55,51,38,80, 144,54,51,38,247,22,19,251,22,33,11,80,144,58,50,38,9,23,197,1,27, -248,22,177,16,247,22,130,14,86,94,249,22,3,20,20,94,88,148,8,36,37, +248,22,179,16,247,22,132,14,86,94,249,22,3,20,20,94,88,148,8,36,37, 54,11,9,226,14,13,2,3,33,98,23,195,1,23,196,2,248,28,248,22,17, 80,144,56,51,38,32,0,88,148,36,37,42,11,9,222,33,99,80,144,55,8, 33,39,20,20,97,88,148,36,36,8,24,8,240,12,64,0,0,9,232,19,22, 15,16,13,12,8,7,5,2,33,101,23,195,1,23,198,1,23,208,1,23,215, -1,12,28,28,248,22,182,8,23,204,1,11,28,248,22,151,7,23,206,2,10, -28,248,22,64,23,206,2,10,28,248,22,78,23,206,2,249,22,167,9,248,22, -144,18,23,208,2,2,34,11,249,80,144,53,49,39,28,248,22,151,7,23,208, -2,249,22,80,23,209,1,248,80,144,56,8,30,39,23,215,1,86,94,23,212, -1,249,22,80,23,209,1,247,22,140,16,252,22,184,8,23,209,1,23,208,1, +1,12,28,28,248,22,184,8,23,204,1,11,28,248,22,153,7,23,206,2,10, +28,248,22,66,23,206,2,10,28,248,22,80,23,206,2,249,22,169,9,248,22, +146,18,23,208,2,2,34,11,249,80,144,53,49,39,28,248,22,153,7,23,208, +2,249,22,82,23,209,1,248,80,144,56,8,30,39,23,215,1,86,94,23,212, +1,249,22,82,23,209,1,247,22,142,16,252,22,186,8,23,209,1,23,208,1, 23,206,1,23,204,1,23,203,1,12,192,86,96,20,18,144,11,80,143,36,56, -248,80,144,37,8,28,37,249,22,33,11,80,144,39,58,37,248,22,189,4,80, -144,37,57,38,248,22,175,5,80,144,37,37,39,248,22,129,15,80,144,37,45, +248,80,144,37,8,28,37,249,22,33,11,80,144,39,58,37,248,22,191,4,80, +144,37,57,38,248,22,177,5,80,144,37,37,39,248,22,131,15,80,144,37,45, 39,20,18,144,11,80,143,36,56,248,80,144,37,8,28,37,249,22,33,11,80, 144,39,58,37,20,18,144,11,80,143,36,56,248,80,144,37,8,28,37,249,22, 33,11,80,144,39,58,37,144,36,20,114,144,36,16,1,11,16,0,20,26,15, @@ -1493,16 +1493,16 @@ 2,10,2,20,2,23,52,11,11,11,16,3,2,25,2,22,2,26,16,3,11, 11,11,16,3,2,25,2,22,2,26,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,24,20,15,16,2, -248,22,178,8,69,115,111,45,115,117,102,102,105,120,80,144,36,36,37,20,15, +248,22,180,8,69,115,111,45,115,117,102,102,105,120,80,144,36,36,37,20,15, 16,2,88,148,36,38,8,43,8,189,3,2,3,223,0,33,56,80,144,36,37, 37,20,15,16,2,32,0,88,148,8,36,41,52,11,2,10,222,33,57,80,144, 36,44,37,20,15,16,2,20,27,143,32,0,88,148,8,36,37,42,11,2,11, 222,192,32,0,88,148,8,36,37,42,11,2,11,222,192,80,144,36,45,37,20, -15,16,2,247,22,141,2,80,144,36,41,37,20,15,16,2,8,128,8,80,144, -36,46,37,20,15,16,2,249,22,183,8,8,128,8,11,80,144,36,47,37,20, +15,16,2,247,22,143,2,80,144,36,41,37,20,15,16,2,8,128,8,80,144, +36,46,37,20,15,16,2,249,22,185,8,8,128,8,11,80,144,36,47,37,20, 15,16,2,88,148,8,36,37,50,8,128,32,2,14,223,0,33,58,80,144,36, 48,37,20,15,16,2,88,148,8,36,38,55,8,128,32,2,15,223,0,33,59, -80,144,36,49,37,20,15,16,2,247,22,76,80,144,36,50,37,20,15,16,2, +80,144,36,49,37,20,15,16,2,247,22,78,80,144,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,144,36, 51,37,20,15,16,2,11,80,143,36,52,20,15,16,2,11,80,143,36,53,20, 15,16,2,32,0,88,148,36,38,57,11,2,20,222,33,78,80,144,36,54,37, @@ -1529,7 +1529,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 10046); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,49,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,101,1,0, 0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2, diff --git a/racket/src/racket/src/env.c b/racket/src/racket/src/env.c index 6b18d35f38..37d00c7cfd 100644 --- a/racket/src/racket/src/env.c +++ b/racket/src/racket/src/env.c @@ -249,6 +249,7 @@ Scheme_Env *scheme_engine_instance_init() scheme_init_portable_case(); scheme_init_compenv(); + scheme_init_letrec_check(); scheme_init_optimize(); scheme_init_resolve(); scheme_init_sfs(); diff --git a/racket/src/racket/src/eval.c b/racket/src/racket/src/eval.c index 7c0db9403c..bc26e97e04 100644 --- a/racket/src/racket/src/eval.c +++ b/racket/src/racket/src/eval.c @@ -4061,6 +4061,8 @@ static void *compile_k(void) break; } + o = scheme_letrec_check_expr(o); + oi = scheme_optimize_info_create(cenv->prefix, 1); scheme_optimize_info_enforce_const(oi, enforce_consts); if (!(comp_flags & COMP_CAN_INLINE)) diff --git a/racket/src/racket/src/fun.c b/racket/src/racket/src/fun.c index 108fa99322..ef71fc5501 100644 --- a/racket/src/racket/src/fun.c +++ b/racket/src/racket/src/fun.c @@ -86,6 +86,7 @@ READ_ONLY Scheme_Object *scheme_values_func; /* the function bound to `values' * READ_ONLY Scheme_Object *scheme_procedure_p_proc; READ_ONLY Scheme_Object *scheme_procedure_arity_includes_proc; READ_ONLY Scheme_Object *scheme_void_proc; +READ_ONLY Scheme_Object *scheme_check_not_undefined; READ_ONLY Scheme_Object *scheme_apply_proc; READ_ONLY Scheme_Object *scheme_call_with_values_proc; /* the function bound to `call-with-values' */ READ_ONLY Scheme_Object *scheme_reduced_procedure_struct; @@ -160,6 +161,7 @@ static Scheme_Object *extract_one_cc_mark (int argc, Scheme_Object *argv[]); static Scheme_Object *call_with_immediate_cc_mark (int argc, Scheme_Object *argv[]); static Scheme_Object *void_func (int argc, Scheme_Object *argv[]); static Scheme_Object *void_p (int argc, Scheme_Object *argv[]); +static Scheme_Object *check_not_undefined (int argc, Scheme_Object *argv[]); static Scheme_Object *dynamic_wind (int argc, Scheme_Object *argv[]); #ifdef TIME_SYNTAX static Scheme_Object *time_apply(int argc, Scheme_Object *argv[]); @@ -490,6 +492,14 @@ scheme_init_fun (Scheme_Env *env) | SCHEME_PRIM_IS_OMITABLE); scheme_add_global_constant("void?", o, env); + /* adds the new primitive check-undefined to the kernel langauge + check-undefined has an arity of 1 and no flags */ + REGISTER_SO(scheme_check_not_undefined); + scheme_check_not_undefined = scheme_make_prim_w_arity(check_not_undefined, "check-not-undefined", 2, 2); + scheme_add_global_constant("check-not-undefined", scheme_check_not_undefined, env); + + scheme_add_global_constant("undefined", scheme_undefined, env); + #ifdef TIME_SYNTAX scheme_add_global_constant("time-apply", scheme_make_prim_w_arity2(time_apply, @@ -2523,6 +2533,23 @@ void_p (int argc, Scheme_Object *argv[]) return SAME_OBJ(argv[0], scheme_void) ? scheme_true : scheme_false; } +static Scheme_Object * +check_not_undefined (int argc, Scheme_Object *argv[]) +{ + if (!SCHEME_SYMBOLP(argv[1])) + scheme_wrong_contract("check-not-undefined", "symbol?", 1, argc, argv); + + if (SAME_OBJ(argv[0], scheme_undefined)) { + scheme_raise_exn(MZEXN_FAIL_CONTRACT_VARIABLE, + argv[1], + "%S: variable used before its definition", + argv[1]); + } + + return argv[0]; +} + + static Scheme_Object * procedure_p (int argc, Scheme_Object *argv[]) { diff --git a/racket/src/racket/src/letrec_check.c b/racket/src/racket/src/letrec_check.c new file mode 100644 index 0000000000..0875ef83ab --- /dev/null +++ b/racket/src/racket/src/letrec_check.c @@ -0,0 +1,1854 @@ +/* + Racket + Copyright (c) 2004-2013 PLT Design Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301 USA. + +*/ + +#include "schpriv.h" + +#ifdef MZ_PRECISE_GC +static void register_traversers(void); +#endif + +void scheme_init_letrec_check() +{ +#ifdef MZ_PRECISE_GC + register_traversers(); +#endif +} + +#define DEBUG_LEVEL 0 +#define DEBUG(stmt) if (DEBUG_LEVEL) { stmt; } +#define VERBOSE_DEBUG(stmt) if (DEBUG_LEVEL > 1) { stmt; } +#define MODNAME_DEBUG(stmt) if (0 || (DEBUG_LEVEL > 1)) { stmt; } + +#define LET_RHS_EXPR 0x1 +#define LET_BODY_EXPR (0x1 << 1) +#define LET_NO_EXPR (0x1 << 2) + +#define FRAME_TYPE_LETREC 0x1 +#define FRAME_TYPE_LETSTAR (0x1 << 1) +#define FRAME_TYPE_LET (0x1 << 2) +#define FRAME_TYPE_CLOSURE (0x1 << 3) + +typedef Scheme_Object Wrapped_Lhs; + +/* struct where all mutable information is stored during this pass! */ +typedef struct Letrec_Check_Frame { + MZTAG_IF_REQUIRED + + /* whether this is a frame for a letrec, let*, let, or closure */ + int frame_type; + + /* TODO: should this really be an mzshort? */ + /* total number of bindings in this frame */ + int count; + + /* number of deferred expressions that must be processed before + the let can be finished */ + int waiting; + + /* table of lists of deferred sub expressions for each bound + variable we count all variables here (not just letrec bound + variables) because we still need to jump over them */ + Scheme_Object **def; + + /* which sub-expression of a letrec we are in, so that we know + what to record when we find a reference to a local reference */ + int subexpr; + + /* we also need to track which variables are referenced so that + letrecs can track what variables appear in bodies and RHS. + this array is always num_bindings long, and indexed by the + position of local references */ + int *ref; + + /* we need to track which variables we actually add checks around + so we can update the flags for those variables */ + int *checked; + + /* so we can fix the flags afterwards */ + Scheme_Let_Header *head; + + Scheme_Object *deferred_with_rhs_ref; + Scheme_Object *deferred_with_body_ref; + Scheme_Object *deferred_with_no_ref; + + struct Letrec_Check_Frame *next; +} Letrec_Check_Frame; + +/* a deferred expression, these are inserted and completely removed by + the letrec_check pass */ +typedef struct { + Scheme_Object so; + + /* the expression that has been deferred */ + Scheme_Closure_Data *expr; + + /* the frame that existed when the expr was deferred */ + Letrec_Check_Frame *frame; + + /* the position of the LHS variable associated with this deferred + RHS binding sub-expression */ + int position; + + /* the environment; i.e. the states of the variables in enclosing + letrecs at the point of deferral */ + Scheme_Object *uvars; + Scheme_Object *pvars; + + /* keeps track of the subexpressions of all frames so they can be + set back to the correct values upon un-deferral */ + Scheme_Object *subexpr_ls; + +} Scheme_Deferred_Expr; + +void print_frame(Letrec_Check_Frame *frame) +{ + fflush(stdout); + + printf("frame: [ "); + while(frame != NULL) { + printf("[%d %d %d] ", frame->frame_type, frame->count, (int)SCHEME_INT_VAL(frame->subexpr)); + frame = frame->next; + } + printf("]"); +} + +/* initializes a Letrec_Check_Frame */ +Letrec_Check_Frame *init_letrec_check_frame(int frame_type, + mzshort count, + Letrec_Check_Frame *prev, + Scheme_Let_Header *head) +{ + Letrec_Check_Frame *frame; + Scheme_Object **def; + int *ref, *checked, i; + + frame = (Letrec_Check_Frame *)MALLOC_ONE_RT(Letrec_Check_Frame); +#ifdef MZTAG_REQUIRED + frame->type = scheme_rt_letrec_check_frame; +#endif + + frame->frame_type = frame_type; + + frame->count = count; + frame->next = prev; + frame->waiting = 0; + + frame->head = head; + + /* def will be a table of lists so every entry should be + initialized to scheme_null */ + def = MALLOC_N(Scheme_Object *, count); + for(i = 0; i < count; i++) { def[i] = scheme_null; } + frame->def = def; + + /* the sub-expression of the letrec (if we're in a letrec), + i.e. the RHS or the body. this is for tracking where LHS + variables are referenced */ + if (frame_type == FRAME_TYPE_CLOSURE) { + frame->subexpr = 2; + } + else { + frame->subexpr = -1; + } + + /* ref is a table of flags, 0 for unreferenced, 1-3 for referenced + in the body and/or the RHS */ + ref = MALLOC_N(int, count); + for(i = count; i--;) { ref[i] = 0; } + frame->ref = ref; + + /* checked is a table of 0s or 1s, whether or not a LHS variable + had a check added around it */ + checked = MALLOC_N(int, count); + for(i = count; i--;) { checked[i] = 0; } + frame->checked = checked; + + frame->deferred_with_rhs_ref = scheme_false; + frame->deferred_with_body_ref = scheme_false; + frame->deferred_with_no_ref = scheme_false; + + if (DEBUG_LEVEL > 1) { + printf("init_letrec_check_frame: type: %d; ", frame->frame_type); + print_frame(frame->next); + printf(" -> "); + print_frame(frame); + printf("\n"); + } + +#ifdef MZTAG_REQUIRED + if (frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("init_letrec_check_frame: frame is not a frame"); + } + if ((prev != NULL) && (prev->type != scheme_rt_letrec_check_frame)) { + scheme_signal_error("init_letrec_check_frame: frame is not a frame"); + } +#endif + + return frame; +} + +/* returns the frame that is the nearest enclosing let in the + LET_RHS_EXPR */ +Letrec_Check_Frame *get_nearest_rhs(Letrec_Check_Frame *frame) { + for (; frame != NULL; frame = frame->next) { + if (frame->subexpr < 0) { + scheme_signal_error("get_nearest_rhs: subexpr is negative"); + } + if ((frame->subexpr & LET_RHS_EXPR) && + (frame->frame_type & FRAME_TYPE_LETREC)) + { return frame; } + } + + scheme_signal_error("get_nearest_rhs: not in a let RHS"); + return frame; // dead +} + +/* returns the frame that was created when pos was created, and + changes pos to be relative to that frame */ +Letrec_Check_Frame *get_relative_frame(int *pos, Letrec_Check_Frame *frame) +{ + if (DEBUG_LEVEL > 1) { + printf("get_relative_frame\n pos_int: %d\n ", *pos); + print_frame(frame); + printf("\n"); + } + + /* we've gone wrong if pos_int is negative or if the frame has + become NULL because pos should have be a valid LHS variable + reference */ + if (*pos < 0) + scheme_signal_error("get_relative_frame: pos is negative"); + if (frame == NULL) { + scheme_signal_error("get_relative_frame: frame is NULL"); + } + + if (frame->subexpr < 0) { + scheme_signal_error("get_relative_frame: subexpr is negative"); + } + + /* if we're in the RHS of a let, no bindings for the LHS variables + have been pushed yet, pos can't possibly be in this frame. so + don't do any offsetting and look in the next frame */ + if ((frame->frame_type & FRAME_TYPE_LET) && + (frame->subexpr & LET_RHS_EXPR)) { + return get_relative_frame(pos, frame->next); + } + else { + if (*pos >= frame->count) { + /* we're not in the right frame yet, so offset pos by the + number of bindings in this frame */ + (*pos) -= frame->count; + return get_relative_frame(pos, frame->next); + } + } + + return frame; +} + +/* takes an absolute position and returns whether or not that position + has a reference of the right type */ +int pos_has_ref(int position, Letrec_Check_Frame *frame, int type) +{ + int pos_ref = position; + + if (type & LET_NO_EXPR) { + return 1; + } + else { + frame = get_relative_frame(&pos_ref, frame); + return ((frame->ref)[pos_ref] & type); + } +} + +/* adds expr to the deferred bindings of lhs */ +void update_frame(Letrec_Check_Frame *outer, Letrec_Check_Frame *inner, + int position, Scheme_Deferred_Expr *clos) +{ + Scheme_Object *prev_def; + + DEBUG(printf("deferring closure at position %d\n", position)); + if (DEBUG_LEVEL > 1) { + printf(" outer: "); + print_frame(outer); + printf("\n inner: "); + print_frame(inner); + printf("\n"); + } + + if (position >= outer->count) { + scheme_signal_error("update_frame: position exceeds binding count"); + } + + /* put the deferred expression in the right place */ + prev_def = (outer->def)[position]; + prev_def = scheme_make_pair((Scheme_Object *)clos, prev_def); + (outer->def)[position] = prev_def; + + /* increment the waiting count between the current frame and the + outer frame */ + for (; outer != inner; inner = inner->next) { + (inner->waiting)++; + } + + return; +} + +/* records all the subexprs at the time of deferral */ +Scheme_Object *frame_to_subexpr_ls(Letrec_Check_Frame *frame) { + Scheme_Object *ls = scheme_null; + + for (; frame != NULL; frame = frame->next) { + if (frame->subexpr < 0) { + print_frame(frame); + printf("\n"); + scheme_signal_error("frame_to_subexpr_ls: frame->subexpr is negative"); + } + ls = scheme_make_pair(scheme_make_integer(frame->subexpr), ls); + } + + return scheme_reverse(ls); +} + +/* replaces all the subexprs to their state pre-deferral */ +void subexpr_ls_to_frame(Scheme_Object *ls, Letrec_Check_Frame *frame) { + for (; frame != NULL; frame = frame->next) { + if (SCHEME_CAR(ls) < 0) { + scheme_signal_error("subexpr_ls_to_frame: negative subexpr in list"); + } + if (SCHEME_NULLP(ls)) { + scheme_signal_error("subexpr_ls_to_frame: ls is null"); + } + frame->subexpr = SCHEME_INT_VAL(SCHEME_CAR(ls)); + ls = SCHEME_CDR(ls); + } + + return; +} + +/* creates a deferred expression "closure" by closing over the frame, + and uvars/pvars at the point of deferral */ +Scheme_Deferred_Expr *make_deferred_expr_closure(Scheme_Closure_Data *expr, Letrec_Check_Frame *frame, + int position, Scheme_Object *uvars, Scheme_Object *pvars) +{ + Scheme_Deferred_Expr *clos; + + Scheme_Object *subexpr_ls; + subexpr_ls = frame_to_subexpr_ls(frame); + + clos = MALLOC_ONE_RT(Scheme_Deferred_Expr); + clos->so.type = scheme_deferred_expr_type; + clos->expr = expr; + clos->frame = frame; + clos->position = position; + clos->uvars = uvars; + clos->pvars = pvars; + clos->subexpr_ls = subexpr_ls; + + return clos; +} + +Scheme_Object *letrec_check_expr(Scheme_Object *, Letrec_Check_Frame *, + Scheme_Object *, Scheme_Object *, Scheme_Object *); +void process_deferred_bindings(Letrec_Check_Frame *); + +void letrec_check_lets_resume(Letrec_Check_Frame *frame) +{ + Scheme_Compiled_Let_Value *clv; + Scheme_Object *body; + int i, j, k, *clv_flags; + Scheme_Let_Header *head; + int was_checked; + + DEBUG(printf("letrec_check_lets_resume\n ")); + +#ifdef MZTAG_REQUIRED + if (frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_lets_resume: frame is not a frame"); + } +#endif + + head = frame->head; + + DEBUG(print_frame(frame)); + DEBUG(printf("\n attempting to resume, waiting is %d\n", frame->waiting)); + + if (frame->waiting != 0) { + return; + } + + frame->subexpr = LET_BODY_EXPR; + process_deferred_bindings(frame); + frame->subexpr = -1; + + frame->subexpr = LET_NO_EXPR; + process_deferred_bindings(frame); + frame->subexpr = -1; + + body = head->body; + if (frame->frame_type == FRAME_TYPE_LETREC) { + DEBUG(printf("updating flags\n")); + /* loops through every right hand side again to update the flags + that we have invalidated; i.e., adding check-undefineds around + references means there is one (more) instance where the LHS + variable is not used in application position */ + k = head->count; + for (i = head->num_clauses; i--;) { + clv = (Scheme_Compiled_Let_Value *) body; + clv_flags = clv->flags; + k -= clv->count; + for (j = 0; j < clv->count; j++) { + was_checked = frame->checked[k + j]; + if (was_checked) { + DEBUG(printf("%d had check inserted\n", k)); + clv_flags[j] -= (clv_flags[j] & SCHEME_WAS_ONLY_APPLIED); + clv_flags[j] -= (clv_flags[j] & SCHEME_WAS_APPLIED_EXCEPT_ONCE); + } + } + clv->flags = clv_flags; + clv->names = NULL; /* not used in later passes */ + body = clv->body; + } + } + + return; +} + +void print_vars(Scheme_Object *vars) +{ + fflush(stdout); + scheme_display(vars, scheme_orig_stdout_port); + scheme_flush_output(scheme_orig_stdout_port); + + return; +} + + +/* appends two nested lists of variables that are always the same length, e.x. + merge_vars( ((1) () (0)) , (() (2) (1)) ) => ((1) (2) (0 1)) */ +Scheme_Object *merge_vars(Scheme_Object *vars1, Scheme_Object *vars2) { + Scheme_Object *merged, *car1, *car2, *appended_cars, *tmp; + + /* make sure they are the same length */ + if (scheme_proper_list_length(vars1) != + scheme_proper_list_length(vars2)) { + scheme_signal_error("arguments to merge_vars are not the same length"); + } + + merged = scheme_null; + while (!SCHEME_NULLP(vars1)) { + if (SCHEME_NULLP(vars2)) { + scheme_wrong_contract("merge_vars", "same-length?", -1, 0, &vars2); + } + + car1 = SCHEME_CAR(vars1); + car2 = SCHEME_CAR(vars2); + + appended_cars = scheme_append(car1, car2); + merged = scheme_make_pair(appended_cars, merged); + + vars1 = SCHEME_CDR(vars1); + vars2 = SCHEME_CDR(vars2); + } + + tmp = scheme_reverse(merged); + return tmp; +} + +void check_inner_vars(Scheme_Object *ls) { + while(!SCHEME_NULLP(ls)) { + if (!SCHEME_PAIRP(ls)) { + scheme_signal_error("check_inner_vars: vars is not a list"); + } + ls = SCHEME_CDR(ls); + } + return; +} + +void check_vars(Scheme_Object *vars) { + DEBUG(printf("check_vars\n")); + + while(!SCHEME_NULLP(vars)) { + if (!SCHEME_PAIRP(vars)) { + scheme_signal_error("check_vars: vars is not a list"); + } + check_inner_vars(SCHEME_CAR(vars)); + vars = SCHEME_CDR(vars); + } + + return; +} + +/* looks up an absolute position in a nested list of vars, where we + only care about the outermost dimension; e.x.: + + lookup_var(1, ((1) ...)) = 1 + lookup_var(1, (() ...)) = 0 + lookup_var(2, ((1) ...)) = 0 +*/ +int lookup_var(int position, Scheme_Object *vars, Letrec_Check_Frame *frame) +{ + Scheme_Object *vars_car, *caar; + + check_vars(vars); + + if (frame == NULL) { + scheme_signal_error("lookup_var: frame == NULL"); + return 0; + } + + if (DEBUG_LEVEL > 1) { + printf("lookup_var: %d in ", position); + print_vars(vars); + printf(" and "); + print_frame(frame); + printf("\n"); + } + + if (SCHEME_NULLP(vars)) { + return 0; + } + + if (frame->subexpr < 0) { + scheme_signal_error("lookup_var: subexpr is negative"); + } + + /* if we're in the RHS of a let, there are no bindings pushed yet + so we don't have to do any offsetting */ + if ((frame->frame_type == FRAME_TYPE_LET) && + (frame->subexpr & LET_RHS_EXPR)) { + return lookup_var(position, vars, frame->next); + } + if (position >= frame->count) { + /* we're not in the right frame yet, so offset pos by the + number of bindings in this frame */ + position -= frame->count; + + /* if is is not a letrec, or we are in the body of the letrec, + there are no uvars/pvars for this frame, so don't cdr */ + if ((frame->frame_type != FRAME_TYPE_LETREC) || + (frame->subexpr & LET_BODY_EXPR)) { + return lookup_var(position, vars, frame->next); + } + else { + if (SCHEME_NULLP(vars)) { + scheme_signal_error("lookup_var: vars is null"); + } + return lookup_var(position, SCHEME_CDR(vars), frame->next); + } + } + + if (frame->frame_type == FRAME_TYPE_LETREC) { + if (frame->subexpr & LET_BODY_EXPR) { + VERBOSE_DEBUG(printf(" didn't find %d in vars\n", position)); + return 0; + } + + if (SCHEME_NULLP(vars)) { + scheme_signal_error("lookup_var: vars is null"); + } + + /* we're in the right place, so we just have to check in the + car of vars for the int we're looking for */ + vars_car = SCHEME_CAR(vars); + while(!SCHEME_NULLP(vars_car)) { + caar = SCHEME_CAR(vars_car); + if (SCHEME_INT_VAL(caar) == position) { + VERBOSE_DEBUG(printf(" found %d in vars\n", position)); + return 1; + } + vars_car = SCHEME_CDR(vars_car); + } + } + + VERBOSE_DEBUG(printf(" didn't find %d in vars\n", position)); + return 0; +} + +/* records that we have seen a reference to loc */ +void record_ref(Scheme_Local *loc, Letrec_Check_Frame *frame) +{ + Scheme_Object *deferred_with_rhs_ref, *deferred_with_body_ref; + Letrec_Check_Frame *inner; + int position = SCHEME_LOCAL_POS(loc); + + DEBUG(printf("recording reference for %d\n", position)); + + inner = frame; + frame = get_relative_frame(&position, frame); + + DEBUG(printf(" checking for LET_NO_EXPR\n")); + for(; inner != frame; inner = inner->next) { + if (inner->subexpr < 0) { + scheme_signal_error("record_ref: subexpr is negative"); + } + if (inner->subexpr & LET_NO_EXPR) { + return; + } + } + + /* calculate the new flag to indicate we have seen loc in the + subexpr of the letrec */ + + frame->ref[position] |= frame->subexpr; + + deferred_with_rhs_ref = frame->deferred_with_rhs_ref; + deferred_with_body_ref = frame->deferred_with_body_ref; + if (!SCHEME_FALSEP(deferred_with_rhs_ref) || + !SCHEME_FALSEP(deferred_with_body_ref)) { + Scheme_Object **def, *defls, *tmp; + + DEBUG(printf("record_ref: adding something to a frame deferred list\n")); + + def = frame->def; + defls = def[position]; + + if (!SCHEME_FALSEP(deferred_with_rhs_ref)) { + tmp = scheme_append(defls, deferred_with_rhs_ref); + frame->deferred_with_rhs_ref = tmp; + } + else { + tmp = scheme_append(defls, deferred_with_body_ref); + frame->deferred_with_body_ref = tmp; + } + + DEBUG(printf("adding %d existing deferred expression(s) to deferred list\n", + scheme_list_length(def[position]))); + + (frame->def)[position] = scheme_null; + } + + return; +} + +/* records that we have seen a reference to loc */ +Scheme_Object *record_checked(Scheme_Local *loc, Letrec_Check_Frame *frame) +{ + int position = SCHEME_LOCAL_POS(loc), k; + Scheme_Object *obj; + + frame = get_relative_frame(&position, frame); + DEBUG(printf("recording check for (relative position) %d\n", position)); + DEBUG(print_frame(frame)); + DEBUG(printf("\n")); + + DEBUG(printf(" old value: %d\n", (frame->checked)[position])); + + (frame->checked)[position] = 1; + + DEBUG(printf(" new value: %d\n", (frame->checked)[position])); + + obj = frame->head->body; + k = frame->head->count; + + while (1) { + Scheme_Compiled_Let_Value *clv = (Scheme_Compiled_Let_Value *)obj; + + SCHEME_ASSERT(SAME_TYPE(SCHEME_TYPE(obj), scheme_compiled_let_value_type), "not a clv"); + SCHEME_ASSERT(position >= 0, "position went negative"); + + k -= clv->count; + + if (position >= k) + return clv->names[position - k]; + + obj = clv->body; + } + + ESCAPED_BEFORE_HERE; +} + +/* returns another vars list that has the same length but has all + empty lists + + rem_vars( ((1) (1 2) ) ) = (() ()) */ +Scheme_Object *rem_vars(Scheme_Object *vars) +{ + Scheme_Object *tmp, *new; + DEBUG(printf("rem_vars: removing vars from a list of vars\n")); + + new = scheme_null; + tmp = vars; + while(!SCHEME_NULLP(tmp)) { + if (!SCHEME_PAIRP(tmp)) { + scheme_wrong_contract("rem_vars", "list?", -1, 0, &tmp); + } + new = scheme_make_pair(scheme_null, new); + tmp = SCHEME_CDR(tmp); + } + + return new; +} + +Scheme_Object *letrec_check_local(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, + Scheme_Object *pos) +{ + Scheme_Local *loc = (Scheme_Local *)o; + int position; + + DEBUG(printf("letrec_check_local\n")); + + position = SCHEME_LOCAL_POS(loc); + + if (DEBUG_LEVEL > 1) { + printf(" position: %d\n ", position); + print_frame(frame); + printf("\n uvars: "); + print_vars(uvars); + printf("\n pvars: "); + print_vars(pvars); + printf("\n"); + } + + /* record that we saw this local in the frame, so later we know to + process its deferred bindings if there are any */ + record_ref(loc, frame); + + /* figure out if we need to add a check around this local + reference; if it is neither protectable or unprotected, we do + not have to add a check. */ + if (lookup_var(position, uvars, frame) || + lookup_var(position, pvars, frame)) { + /* our reference is either unprotectable or protectable, so we + need to insert an error check around it */ + Scheme_App3_Rec *app3; + Scheme_Object *name; + + DEBUG(printf("adding a check around this reference because loc is %d\n", position)); + name = record_checked(loc, frame); + + app3 = MALLOC_ONE_TAGGED(Scheme_App3_Rec); + app3->iso.so.type = scheme_application3_type; + app3->rator = scheme_check_not_undefined; + app3->rand1 = o; + app3->rand2 = name; + + return (Scheme_Object *) app3; + } + + /* our reference is protected, so we're fine */ + DEBUG(printf("local was neither unprotected nor protectable\n")); + return o; +} + +Scheme_Object *letrec_check_application(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + int i,n; + Scheme_App_Rec *app; + Scheme_Object *new_uvars, *new_pvars, *val; + + app = (Scheme_App_Rec *)o; + + /* we'll have to check the rator and all the arguments */ + n = 1 + app->num_args; + + /* by entering the sub-expressions of an application, all + protectable variables are moved to the unprotected state. */ + new_uvars = merge_vars(uvars, pvars); + new_pvars = rem_vars(pvars); + pos = scheme_false; + + for (i = 0; i < n; i++) { + val = letrec_check_expr(app->args[i], frame, new_uvars, new_pvars, pos); + app->args[i] = val; + } + + return o; +} + +Scheme_Object *letrec_check_application2(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_App2_Rec *app; + Scheme_Object *new_uvars, *new_pvars, *val; + + app = (Scheme_App2_Rec *)o; + + /* by entering the sub-expressions of an application, all + protectable variables are moved to the unprotected state. */ + new_uvars = merge_vars(uvars, pvars); + new_pvars = rem_vars(pvars); + pos = scheme_false; + + val = letrec_check_expr(app->rator, frame, new_uvars, new_pvars, pos); + app->rator = val; + val = letrec_check_expr(app->rand, frame, new_uvars, new_pvars, pos); + app->rand = val; + + return o; +} + +Scheme_Object *letrec_check_application3(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_App3_Rec *app; + Scheme_Object *new_uvars, *new_pvars, *val; + + app = (Scheme_App3_Rec *)o; + + /* by entering the sub-expressions of an application, all + protectable variables are moved to the unprotected state. */ + new_uvars = merge_vars(uvars, pvars); + new_pvars = rem_vars(pvars); + pos = scheme_false; + + val = letrec_check_expr(app->rator, frame, new_uvars, new_pvars, pos); + app->rator = val; + val = letrec_check_expr(app->rand1, frame, new_uvars, new_pvars, pos); + app->rand1 = val; + val = letrec_check_expr(app->rand2, frame, new_uvars, new_pvars, pos); + app->rand2 = val; + + return o; +} + +Scheme_Object *letrec_check_sequence(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Sequence *seq; + Scheme_Object *val; + int i,n; + + seq = (Scheme_Sequence *)o; + + n = seq->count; + for (i = 0; i < n; i++) { + val = letrec_check_expr(seq->array[i], frame, uvars, pvars, pos); + seq->array[i] = val; + } + + return o; +} + +Scheme_Object *letrec_check_branch(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Branch_Rec *br; + Scheme_Object *val; + + br = (Scheme_Branch_Rec *)o; + + val = letrec_check_expr(br->test, frame, uvars, pvars, pos); + br->test = val; + val = letrec_check_expr(br->tbranch, frame, uvars, pvars, pos); + br->tbranch = val; + val = letrec_check_expr(br->fbranch, frame, uvars, pvars, pos); + br->fbranch = val; + + return o; +} + +Scheme_Object *letrec_check_wcm(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_With_Continuation_Mark *wcm; + Scheme_Object *val; + + wcm = (Scheme_With_Continuation_Mark *)o; + + val = letrec_check_expr(wcm->key, frame, uvars, pvars, pos); + wcm->key = val; + val = letrec_check_expr(wcm->val, frame, uvars, pvars, pos); + wcm->val = val; + val = letrec_check_expr(wcm->body, frame, uvars, pvars, pos); + wcm->body = val; + + return o; +} + +Scheme_Object *letrec_check_closure_compilation(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Closure_Data *data; + Letrec_Check_Frame *new_frame; + Scheme_Object *new_pvars, *val; + int num_params; + + data = (Scheme_Closure_Data *)o; + + /* if we have not entered a letrec, pos will be false */ + if (SCHEME_FALSEP(pos)) { + /* by entering an lambda, we move all protectable variables to + the protected state; i.e. we discard them since we do not + track protected variables. TODO: In reality, pvars is + already null? */ + new_pvars = rem_vars(pvars); + + num_params = data->num_params; + new_frame = init_letrec_check_frame(FRAME_TYPE_CLOSURE, num_params, frame, NULL); + +#ifdef MZTAG_REQUIRED + if ((frame != NULL) && (frame->type != scheme_rt_letrec_check_frame)) { + scheme_signal_error("letrec_check_closure_compilation: frame is not a frame"); + } + if (new_frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_closure_compilation: frame is not a frame"); + } +#endif + + if (num_params < 0) { + scheme_signal_error("lambda has negative arguments what do"); + } + + pvars = new_pvars; + val = letrec_check_expr(data->code, new_frame, uvars, pvars, pos); + data->code = val; + if (DEBUG_LEVEL > 1) { + printf("letrec_check_closure_compilation: "); + print_frame(new_frame); + printf(" <- "); + print_frame(frame); + printf("\n"); + } + + } + else { + /* we can defer this lambda because it is not inside an + application! hurray! */ + + Scheme_Deferred_Expr *clos; + Letrec_Check_Frame *outer_frame; + + /* create a deferred expression that closes over the frame it + appeared in, the variable to which it is being deferred, + and the current uvars and pvars */ + int position = SCHEME_INT_VAL(pos); + clos = make_deferred_expr_closure(data, frame, position, uvars, pvars); + + /* get the correct frame and stick it up there */ + outer_frame = get_nearest_rhs(frame); + update_frame(outer_frame, frame, position, clos); + + } + + return o; +} + +void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int type) +{ + Scheme_Deferred_Expr *clos; + Scheme_Closure_Data *data; + Letrec_Check_Frame *inner, *new_frame; + Scheme_Object *tmp, *val, *uvars, *pvars, *tmp_uvars, *tmp_pvars, *deferred_uvars, *deferred_pvars, *after_i, *i_wrapped, *subexpr_ls; + int i, old_subexpr, num_params, length_diff, position; + + /* gets the closed over data from clos, which will always be a + deferred expression that contains a closure */ + clos = (Scheme_Deferred_Expr *)o; + + SCHEME_ASSERT(SAME_TYPE(SCHEME_TYPE(clos), scheme_deferred_expr_type), + "letrec_check_deferred_expr: clos is not a scheme_deferred_expr"); + + data = (Scheme_Closure_Data *)clos->expr; + position = clos->position; + inner = clos->frame; + uvars = clos->uvars; + pvars = clos->pvars; + subexpr_ls = clos->subexpr_ls; + + subexpr_ls_to_frame(subexpr_ls, inner); + +#ifdef MZTAG_REQUIRED + if (outer->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_deferred_expr: frame is not a frame"); + } +#endif + + if (scheme_proper_list_length(uvars) != + scheme_proper_list_length(pvars)) { + scheme_signal_error("letrec_check_deferred_expr: vars different lengths"); + } + + DEBUG(printf(" preparing to process deferred expression for %d in subexpr %d\n", + position, outer->subexpr)); + + after_i = scheme_null; + for (i = position - 1; i >= 0; i--) { + i_wrapped = scheme_make_integer(i); + tmp = scheme_make_pair(i_wrapped, after_i); + after_i = tmp; + } + + if (outer->frame_type == FRAME_TYPE_LETREC) { + if (SCHEME_NULLP(uvars)) { + scheme_signal_error("letrec_check_deferred_expr: uvars is null"); + } + + if (SCHEME_NULLP(pvars)) { + scheme_signal_error("letrec_check_deferred_expr: pvars is null"); + } + + if (type & LET_NO_EXPR) { + /* otherwise, it is not referenced anywhere in an unsafe context, + so we're pretty much good. still have to check it for letrecs + in its sub-expressions */ + DEBUG(printf(" building NO environment\n")); + + deferred_uvars = scheme_make_pair(scheme_null, SCHEME_CDR(uvars)); + tmp = rem_vars(SCHEME_CDR(pvars)); + deferred_pvars = scheme_make_pair(scheme_null, tmp); + } + else if (type & LET_RHS_EXPR) { + /* the worst thing that can happen is that a LHS variable is + referenced during the evaluation of a RHS binding (i.e. in + an unsafe context in a RHS) so we check those first. + + we treat 1 thru i as protected, because this reference must + occur in a binding after i (and therefore 1 thru i have + values). the rest of the LHS variables and those LHS + variables from outer letrecs are considered unprotected. + */ + DEBUG(printf(" building RHS environment\n")); + + deferred_uvars = merge_vars(uvars, pvars); + tmp = scheme_make_pair(after_i, SCHEME_CDR(deferred_uvars)); + deferred_uvars = tmp; + deferred_pvars = rem_vars(pvars); + } + + else if (type & LET_BODY_EXPR) { + /* the next worst thing that can happen is that a LHS variable + is referenced during the body, where a variable from an + outer letrec might appear. + + all LHS variables of the current letrec are protected, but + the LHS variables from outer letrecs are unprotected. + */ + DEBUG(printf(" building BODY environment\n")); + + tmp = scheme_make_pair(scheme_null, SCHEME_CDR(uvars)); + deferred_uvars = tmp; + + tmp = scheme_make_pair(scheme_null, SCHEME_CDR(pvars)); + deferred_pvars = tmp; + + tmp = merge_vars(deferred_uvars, deferred_pvars); + deferred_uvars = tmp; + deferred_pvars = rem_vars(deferred_pvars); + } + + else { + scheme_signal_error("letrec_check_deferred_expr: invalid type"); + return; // dead + } + } + else { + if (type & LET_NO_EXPR) { + deferred_uvars = uvars; + deferred_pvars = rem_vars(pvars); + } + else { + deferred_uvars = uvars; + deferred_pvars = pvars; + } + } + + /* we trust the enclosing let to know the statuses of variables up + until (and including) it's own LHS variables, and then we + switch over to the deferred expression's environment. so, we + compute the length difference of the two lists and chop off + what we need to */ + length_diff = scheme_list_length(uvars) - scheme_list_length(deferred_uvars); + + tmp_uvars = scheme_null; + tmp_pvars = scheme_null; + while (length_diff > 0) { + tmp = scheme_make_pair(SCHEME_CAR(uvars), tmp_uvars); + tmp_uvars = tmp; + tmp = scheme_make_pair(SCHEME_CAR(pvars), tmp_pvars); + tmp_pvars = tmp; + uvars = SCHEME_CDR(uvars); + pvars = SCHEME_CDR(pvars); + length_diff--; + } + tmp_uvars = scheme_reverse(tmp_uvars); + tmp_pvars = scheme_reverse(tmp_pvars); + + uvars = scheme_append(tmp_uvars, deferred_uvars); + pvars = scheme_append(tmp_pvars, deferred_pvars); + + DEBUG(printf(" calculated: uvars: ")); + DEBUG(print_vars(uvars);) + DEBUG(printf(" pvars: ")); + DEBUG(print_vars(pvars);) + DEBUG(printf("\n")); + + /* establish that we actually get a lambda back */ + if (SCHEME_TYPE(data) != scheme_compiled_unclosed_procedure_type) { + printf("SCHEME_TYPE(data): %d\n", SCHEME_TYPE(data)); + scheme_signal_error("deferred expression does not contain a lambda"); + } + + /* hopefully we know how to deal with this lambda */ + num_params = data->num_params; + if (num_params < 0) { + scheme_signal_error("process_deferred_bindings: lambda has negative arguments"); + } + + if (outer->subexpr < 0) { + scheme_signal_error("letrec_check_deferred_expr: subexpr is negative"); + } + if (inner->subexpr < 0) { + scheme_signal_error("letrec_check_deferred_expr: subexpr is negative"); + } + + old_subexpr = outer->subexpr; + outer->subexpr = LET_RHS_EXPR; + + new_frame = init_letrec_check_frame(FRAME_TYPE_CLOSURE, num_params, inner, NULL); + if (type & LET_NO_EXPR) { + new_frame->subexpr |= LET_NO_EXPR; + } + +#ifdef MZTAG_REQUIRED + if (new_frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_deferred_expr: frame is not a frame"); + } + if (inner->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_deferred_expr: frame is not a frame"); + } +#endif + + val = letrec_check_expr(data->code, new_frame, uvars, pvars, scheme_false); + data->code = val; + + outer->subexpr = old_subexpr; + +#ifdef MZTAG_REQUIRED + if (outer->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_deferred_expr: frame is not a frame"); + } + if (new_frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_deferred_expr: frame is not a frame"); + } +#endif + + /* decrement the waiting count between the current frame and the + outer frame */ + DEBUG(printf(" expression processed, checking between %p and %p\n", outer, inner)); + for (; outer != inner; inner = inner->next) { + DEBUG(printf(" %p decrementing waiting and resuming letrecs\n", inner)); + if (inner == NULL) { + scheme_signal_error("letrec_check_deferred_expr: inner is null"); + } + if (outer == NULL) { + scheme_signal_error("letrec_check_deferred_expr: outer is null"); + } +#ifdef MZTAG_REQUIRED + if (inner->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_deferred_expr: frame is not a frame"); + } + if (outer->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_deferred_expr: frame is not a frame"); + } +#endif + (inner->waiting)--; + letrec_check_lets_resume(inner); + } + + DEBUG(printf("done waking things up\n")); + return; +} + +/* PLAN: + * + * Indicate that we are traversing the RHSs of the let by changing the + * frame->subexpr field, and then process every binding RHS. + * + * Populate frame->deferred_with_rhs_ref with the DEFERRED bindings of + * every LHS variable mentioned in the RHSs according to frame->ref, + * and process every expression in frame->deferred_with_rhs_ref. + * + * If there is a reference to a LHS variable binding while + * frame->deferred_with_rhs_ref is NOT FALSE, the deferred bindings + * for that LHS variable are also placed in + * frame->deferred_with_rhs_ref. This step computes a closure. + * + * Indicate that we are traversing the BODY of the let by changing the + * frame->subexpr field, and then process the body. + * + * Populate frame->deferred_with_body_ref with the DEFERRED bindings + * of every LHS variable mentioned in the body according to + * frame->ref, and process every expression in + * frame->deferred_with_body_ref. + * + * If there is a reference to a LHS variable binding while + * frame->deferred_with_body_ref is NOT FALSE, the deferred bindings + * for that LHS variable are also placed in + * frame->deferred_with_body_ref. This step computes a closure. + * + * Go back and remove the SCHEME_WAS_ONLY_APPLIED and + * SCHEME_WAS_APPLIED_EXCEPT_ONCE flags from variables who had + * undefined checks added around them according to frame->checked. + */ + +/* populates frame->deferred_with_(rhs/body)_ref with the deferred + binding of every LHS variable mentioned in the (RHSs/BODY) + according to frame->ref, and processes every expression inside */ +void process_deferred_bindings_rhs(Letrec_Check_Frame *frame) { + // ls = &(frame->deferred_with_rhs_ref); + + // TODO: anything weird here? + Scheme_Object **def, *tmp; + int i, count, subexpr; + + subexpr = frame->subexpr; + def = frame->def; + count = frame->count; + + frame->deferred_with_rhs_ref = scheme_null; + + def = frame->def; + for (i = 0; i < count; i++) { + if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) { + DEBUG(printf(" adding bindings for %d\n", i)); + tmp = scheme_append(def[i], frame->deferred_with_rhs_ref); + frame->def[i] = scheme_null; + frame->deferred_with_rhs_ref = tmp; + } + else if (SCHEME_NULLP(def[i])) { + DEBUG(printf(" bindings for %d are null\n", i)); + } + else if (!(pos_has_ref(i, frame, subexpr))) { + DEBUG(printf(" no ref to %d\n", i)); + } + } + VERBOSE_DEBUG(printf(" %d expressions to be processed initially\n", + scheme_list_length(frame->deferred_with_rhs_ref))); + while (!SCHEME_NULLP(frame->deferred_with_rhs_ref)) { + DEBUG(printf(" checking one expr\n")); + if (!SCHEME_PAIRP(frame->deferred_with_rhs_ref)) { + scheme_signal_error("process_deferred_bindings_rhs: ls is not a ls"); + } + tmp = SCHEME_CAR(frame->deferred_with_rhs_ref); + frame->deferred_with_rhs_ref = SCHEME_CDR(frame->deferred_with_rhs_ref); + VERBOSE_DEBUG(printf(" popping one expression (%d left to be processed)\n", + scheme_list_length(frame->deferred_with_rhs_ref))); + letrec_check_deferred_expr(tmp, frame, subexpr); + } + + DEBUG(printf(" putting ls to false\n")); + +#ifdef MZTAG_REQUIRED + if (frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("process_deferred_bindings_rhs: frame is not a frame"); + } +#endif + + /* put the accumulator back to false before leaving */ + frame->deferred_with_rhs_ref = scheme_false; + + DEBUG(printf(" done processing deferred bindings\n")); + + return; +} + +void process_deferred_bindings_body(Letrec_Check_Frame *frame) { + // ls = &(frame->deferred_with_body_ref); + + Scheme_Object **def, *tmp; + int i, count, subexpr; + + subexpr = frame->subexpr; + def = frame->def; + count = frame->count; + + frame->deferred_with_body_ref = scheme_null; + + def = frame->def; + for (i = 0; i < count; i++) { + if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) { + DEBUG(printf(" adding bindings for %d\n", i)); + tmp = scheme_append(def[i], frame->deferred_with_body_ref); + frame->def[i] = scheme_null; + frame->deferred_with_body_ref = tmp; + } + else if (SCHEME_NULLP(def[i])) { + DEBUG(printf(" bindings for %d are null\n", i)); + } + else if (!(pos_has_ref(i, frame, subexpr))) { + DEBUG(printf(" no ref to %d\n", i)); + } + } + VERBOSE_DEBUG(printf(" %d expressions to be processed initially\n", + scheme_list_length(frame->deferred_with_body_ref))); + while (!SCHEME_NULLP(frame->deferred_with_body_ref)) { + DEBUG(printf(" checking one expr\n")); + DEBUG(print_frame(frame)); + DEBUG(printf("\n")); + if (!SCHEME_PAIRP(frame->deferred_with_body_ref)) { + scheme_signal_error("process_deferred_bindings_body: ls is not a ls"); + } + tmp = SCHEME_CAR(frame->deferred_with_body_ref); + frame->deferred_with_body_ref = SCHEME_CDR(frame->deferred_with_body_ref); + VERBOSE_DEBUG(printf(" popping one expression (%d left to be processed)\n", + scheme_list_length(frame->deferred_with_body_ref))); + letrec_check_deferred_expr(tmp, frame, subexpr); + } + + DEBUG(printf(" putting ls to false\n")); + +#ifdef MZTAG_REQUIRED + if (frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("process_deferred_bindings_body: frame is not a frame"); + } +#endif + + /* put the accumulator back to false before leaving */ + frame->deferred_with_body_ref = scheme_false; + + DEBUG(printf(" done processing deferred bindings\n")); + + return; +} + +void process_deferred_bindings_no(Letrec_Check_Frame *frame) { + // ls = &(frame->deferred_with_no_ref); + + Scheme_Object **def, *tmp; + int i, count, subexpr; + + + subexpr = frame->subexpr; + def = frame->def; + count = frame->count; + + frame->deferred_with_no_ref = scheme_null; + def = frame->def; + for (i = 0; i < count; i++) { + if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) { + DEBUG(printf(" adding bindings for %d\n", i)); + tmp = scheme_append(def[i], frame->deferred_with_no_ref); + frame->def[i] = scheme_null; + frame->deferred_with_no_ref = tmp; + } + else if (SCHEME_NULLP(def[i])) { + DEBUG(printf(" bindings for %d are null\n", i)); + } + else if (!(pos_has_ref(i, frame, subexpr))) { + DEBUG(printf(" no ref to %d\n", i)); + } + } + VERBOSE_DEBUG(printf(" %d expressions to be processed initially\n", + scheme_list_length(frame->deferred_with_no_ref))); + while (!SCHEME_NULLP(frame->deferred_with_no_ref)) { + DEBUG(printf(" checking one expr\n")); + if (!SCHEME_PAIRP(frame->deferred_with_no_ref)) { + scheme_signal_error("process_deferred_bindings_no: ls is not a ls"); + } + tmp = SCHEME_CAR(frame->deferred_with_no_ref); + frame->deferred_with_no_ref = SCHEME_CDR(frame->deferred_with_no_ref); + VERBOSE_DEBUG(printf(" popping one expression (%d left to be processed)\n", + scheme_list_length(frame->deferred_with_no_ref))); + letrec_check_deferred_expr(tmp, frame, subexpr); + } + + DEBUG(printf(" putting ls to false\n")); + +#ifdef MZTAG_REQUIRED + if (frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("process_deferred_bindings_no: frame is not a frame"); + } +#endif + + /* put the accumulator back to false before leaving */ + frame->deferred_with_no_ref = scheme_false; + + DEBUG(printf(" done processing deferred bindings\n")); + + return; +} + +void process_deferred_bindings(Letrec_Check_Frame *frame) { + int subexpr; + + DEBUG(printf("processing deferred bindings\n")); + if (DEBUG_LEVEL > 1) { + printf(" "); + print_frame(frame); + printf("\n"); + } + + subexpr = frame->subexpr; + + VERBOSE_DEBUG(printf(" subexpr: %d\n", subexpr)); + + if (subexpr & LET_NO_EXPR) { + VERBOSE_DEBUG(printf(" checking deferred bindings with NO reference\n")); + return process_deferred_bindings_no(frame); + } + else if (subexpr & LET_RHS_EXPR) { + VERBOSE_DEBUG(printf(" checking deferred bindings with RHS reference\n")); + return process_deferred_bindings_rhs(frame); + } + else if (subexpr & LET_BODY_EXPR) { + VERBOSE_DEBUG(printf(" checking deferred bindings with BODY reference\n")); + return process_deferred_bindings_body(frame); + } + else { + scheme_signal_error("process_deferred_bindings: unknown subexpr"); + } + + return; // dead +} + +Scheme_Object *letrec_check_lets(Scheme_Object *o, Letrec_Check_Frame *old_frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Letrec_Check_Frame *frame; + Scheme_Compiled_Let_Value *clv; + Scheme_Object *body, *new_uvars_level, *new_pvars_level, *i_wrapped, *tmp, *val; + int i, j, k; + + /* gets the information out of our header about the number of + total clauses, the number of total bindings, and whether or not + this let is recursive */ + Scheme_Let_Header *head = (Scheme_Let_Header *)o; + + /* number of clauses in the let */ + int num_clauses = head->num_clauses; + + /* number of total bindings (not necessarily the same as the + number of bindings thanks to let(rec)-values) */ + int count = head->count; + + /* information about this let */ + int header_flags = SCHEME_LET_FLAGS(head); + + /* computes what kind of let this is: letrec, let*, or let */ + int frame_type; + + Scheme_Object *new_uvars, *new_pvars; + + /* compute and record the type, either let let* or letrec */ + if (header_flags & SCHEME_LET_RECURSIVE) { + DEBUG(printf("LETREC_CHECK_LETREC\n")); + frame_type = FRAME_TYPE_LETREC; + } + else if (header_flags & SCHEME_LET_STAR) { + DEBUG(printf("LETREC_CHECK_LETSTAR\n")); + frame_type = FRAME_TYPE_LETSTAR; + } + else { + DEBUG(printf("LETREC_CHECK_LET\n")); + frame_type = FRAME_TYPE_LET; + } + + /* push the new bindings on to the frame (even in the case of let + this is ok because get_relative_frame knows how to look up + variables properly given the subexpr */ + frame = init_letrec_check_frame(frame_type, count, old_frame, head); +#ifdef MZTAG_REQUIRED + if (frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_lets: frame is not a frame"); + } + if ((old_frame != NULL) && (old_frame->type != scheme_rt_letrec_check_frame)) { + scheme_signal_error("letrec_check_lets: frame is not a frame"); + } +#endif + + /* add a new level to our uvars and pvars if this is a letrec */ + if (frame_type == FRAME_TYPE_LETREC) { + new_pvars_level = scheme_null; + new_uvars_level = scheme_null; + + for (i = 0; i < count; i++) { + i_wrapped = scheme_make_integer(i); + tmp = scheme_make_pair(i_wrapped, new_pvars_level); + new_pvars_level = tmp; + } + + // new_pvars_level = (i i-1 ... 1 0) + // new_uvars_level = () + } + + body = head->body; + + frame->subexpr = LET_RHS_EXPR; + + /* loops through every right hand side */ + k = head->count; + for (i = num_clauses; i--;) { + clv = (Scheme_Compiled_Let_Value *)body; + + if (frame_type == FRAME_TYPE_LETREC) { + new_uvars = scheme_make_pair(new_uvars_level, uvars); + new_pvars = scheme_make_pair(new_pvars_level, pvars); + } + else { + new_uvars = uvars; + new_pvars = pvars; + } + + k -= clv->count; + + /* TODO: is there something more sane for the treatment of + bindings with no variables? every lambda in the rhs will + be treated as if there is an unsafe application where in + fact it is just the opposite, no unsafe application can + possibly happen */ + if (clv->count == 0) { + val = letrec_check_expr(clv->value, frame, new_uvars, new_pvars, + scheme_false); + } + else if (frame_type == FRAME_TYPE_LETREC) { + val = letrec_check_expr(clv->value, frame, new_uvars, new_pvars, + scheme_make_integer(k)); + } + else { + val = letrec_check_expr(clv->value, frame, new_uvars, new_pvars, + pos); + } + + if (frame_type == FRAME_TYPE_LETREC) { + /* then remove the current LHS variable from the + protectables variables as it is now protected */ + for (j = 0; j < clv->count; j++) { + if (SCHEME_NULLP(new_pvars_level)) { + scheme_signal_error("letrec_check_lets: new_pvars_level is null"); + } + new_pvars_level = SCHEME_CDR(new_pvars_level); + } + } + + if (frame_type == FRAME_TYPE_LETREC) { + clv->value = val; + } + + body = clv->body; + } + + if (frame_type != FRAME_TYPE_LET) { + process_deferred_bindings(frame); + } + + /* body is already the right value thanks to the for */ + frame->subexpr = LET_BODY_EXPR; + DEBUG(printf("processing let body\n")); + val = letrec_check_expr(body, frame, uvars, pvars, pos); + + /* put the new body in the right place: after the last RHS if the + let had bindings, otherwise, the let header should point to the + new body */ + if (num_clauses > 0) clv->body = val; + else head->body = val; + +#ifdef MZTAG_REQUIRED + if (frame->type != scheme_rt_letrec_check_frame) { + scheme_signal_error("letrec_check_lets: frame is not a frame"); + } +#endif + + letrec_check_lets_resume(frame); + + DEBUG(printf("letrec_check_lets: ")); + DEBUG(print_frame(old_frame)); + DEBUG(printf(" <- ")); + DEBUG(print_frame(frame)); + DEBUG(printf("\n")); + + return o; +} + +/* note to future self: the length of define_values is sometimes 1, + and you definitely don't want to look inside if that's the case */ +Scheme_Object *letrec_check_define_values(Scheme_Object *data, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + if (SCHEME_VEC_SIZE(data) <= 1) { + // TODO: right thing to do? + return data; + } + else { + Scheme_Object *vars = SCHEME_VEC_ELS(data)[0]; + Scheme_Object *val = SCHEME_VEC_ELS(data)[1]; + DEBUG(printf("letrec_check_define_values\n")); + + DEBUG(printf(" size: %d\n position 0: ", (int)SCHEME_VEC_SIZE(data))); + DEBUG(fflush(stdout)); + DEBUG(scheme_display(vars, scheme_orig_stdout_port)); + DEBUG(scheme_flush_output(scheme_orig_stdout_port)); + DEBUG(printf("\n position 1: ")); + DEBUG(fflush(stdout)); + DEBUG(scheme_display(val, scheme_orig_stdout_port)); + DEBUG(scheme_flush_output(scheme_orig_stdout_port)); + DEBUG(printf("\n")); + + if(!SCHEME_PAIRP(vars) && !SCHEME_NULLP(vars)) { + printf("vars: %d, val: %d\n", SCHEME_TYPE(vars), SCHEME_TYPE(val)); + scheme_signal_error("letrec_check_define_values: processing resolved code"); + } + + // TODO: don't think we need to process vars ever + // vars = letrec_check_expr(vars, frame, uvars, pvars, pos); + val = letrec_check_expr(val, frame, uvars, pvars, pos); + + SCHEME_VEC_ELS(data)[1] = val; + } + + return data; +} + +Scheme_Object *letrec_check_ref(Scheme_Object *data, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Wrapped_Lhs *lhs) +{ + return data; +} + +Scheme_Object *letrec_check_set(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Set_Bang *sb; + Scheme_Object *val; + + sb = (Scheme_Set_Bang *)o; + val = sb->val; + + val = letrec_check_expr(val, frame, uvars, pvars, pos); + sb->val = val; + + return o; +} + +Scheme_Object *letrec_check_define_syntaxes(Scheme_Object *data, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Object *val; + val = SCHEME_VEC_ELS(data)[3]; + + val = letrec_check_expr(val, frame, uvars, pvars, pos); + SCHEME_VEC_ELS(data)[3] = val; + + return data; +} + +Scheme_Object *letrec_check_begin_for_syntax(Scheme_Object *data, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Object *l, *a, *val; + + l = SCHEME_VEC_ELS(data)[2]; + + while (!SCHEME_NULLP(l)) { + a = SCHEME_CAR(l); + val = letrec_check_expr(a, frame, uvars, pvars, pos); + SCHEME_CAR(l) = val; + l = SCHEME_CDR(l); + } + + return data; +} + +Scheme_Object *letrec_check_case_lambda(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Case_Lambda *cl; + Scheme_Object *val; + int i, n; + + cl = (Scheme_Case_Lambda *)o; + + n = cl->count; + for (i = 0; i < n; i++) { + val = letrec_check_expr(cl->array[i], frame, uvars, pvars, pos); + cl->array[i] = val; + } + + return o; +} + +Scheme_Object *letrec_check_begin0(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + int i, n; + Scheme_Sequence *seq; + Scheme_Object *val; + + seq = (Scheme_Sequence *)o; + + n = seq->count; + for (i = 0; i < n; i++) { + val = letrec_check_expr(seq->array[i], frame, uvars, pvars, pos); + seq->array[i] = val; + } + + return o; +} + +Scheme_Object *letrec_check_apply_values(Scheme_Object *data, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + Scheme_Object *f, *e; + + f = SCHEME_PTR1_VAL(data); + e = SCHEME_PTR2_VAL(data); + + f = letrec_check_expr(f, frame, uvars, pvars, pos); + e = letrec_check_expr(e, frame, uvars, pvars, pos); + + SCHEME_PTR1_VAL(data) = f; + SCHEME_PTR2_VAL(data) = e; + + return data; +} + +Scheme_Object *letrec_check_module(Scheme_Object *o, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + int i, cnt; + Scheme_Module *m; + Scheme_Object *val; + m = (Scheme_Module *)o; + + if (!m->comp_prefix) { + /* already resolved */ + return (Scheme_Object *)m; + } + + DEBUG(printf("letrec_check_module:\n ")); + MODNAME_DEBUG(fflush(stdout)); + MODNAME_DEBUG(scheme_display(m->modname, scheme_orig_stdout_port)); + MODNAME_DEBUG(scheme_flush_output(scheme_orig_stdout_port)); + MODNAME_DEBUG(printf("\n")); + + cnt = SCHEME_VEC_SIZE(m->bodies[0]); + for(i = 0; i < cnt; i++) { + val = SCHEME_VEC_ELS(m->bodies[0])[i]; + val = letrec_check_expr(val, frame, uvars, pvars, pos); + SCHEME_VEC_ELS(m->bodies[0])[i] = val; + } + + { + /* check submodules */ + int k; + Scheme_Object *p; + for (k = 0; k < 2; k++) { + p = (k ? m->post_submodules : m->pre_submodules); + if (p) { + while (!SCHEME_NULLP(p)) { + letrec_check_expr(SCHEME_CAR(p), frame, uvars, pvars, pos); + p = SCHEME_CDR(p); + } + } + } + } + + return o; +} + +Scheme_Object *letrec_check_expr(Scheme_Object *expr, Letrec_Check_Frame *frame, + Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) +{ + int type; + type = SCHEME_TYPE(expr); + + SCHEME_USE_FUEL(1); + + VERBOSE_DEBUG(printf ("letrec_check_expr: type %d\n", type)); + + switch (type) { + case scheme_local_type: + return letrec_check_local(expr, frame, uvars, pvars, pos); + case scheme_application_type: + return letrec_check_application(expr, frame, uvars, pvars, pos); + case scheme_application2_type: + return letrec_check_application2(expr, frame, uvars, pvars, pos); + case scheme_application3_type: + return letrec_check_application3(expr, frame, uvars, pvars, pos); + case scheme_sequence_type: + case scheme_splice_sequence_type: + return letrec_check_sequence(expr, frame, uvars, pvars, pos); + case scheme_branch_type: + return letrec_check_branch(expr, frame, uvars, pvars, pos); + case scheme_with_cont_mark_type: + return letrec_check_wcm(expr, frame, uvars, pvars, pos); + case scheme_compiled_unclosed_procedure_type: + return letrec_check_closure_compilation(expr, frame, uvars, pvars, pos); + case scheme_compiled_let_void_type: + return letrec_check_lets(expr, frame, uvars, pvars, pos); + case scheme_compiled_toplevel_type: /* var ref to a top level */ + return expr; + case scheme_compiled_quote_syntax_type: + return expr; + case scheme_variable_type: + case scheme_module_variable_type: + scheme_signal_error("got top-level in wrong place"); + return 0; + case scheme_define_values_type: + return letrec_check_define_values(expr, frame, uvars, pvars, pos); + case scheme_varref_form_type: + return letrec_check_ref(expr, frame, uvars, pvars, pos); + case scheme_set_bang_type: + return letrec_check_set(expr, frame, uvars, pvars, pos); + case scheme_define_syntaxes_type: + return letrec_check_define_syntaxes(expr, frame, uvars, pvars, pos); + case scheme_begin_for_syntax_type: + return letrec_check_begin_for_syntax(expr, frame, uvars, pvars, pos); + case scheme_case_lambda_sequence_type: + return letrec_check_case_lambda(expr, frame, uvars, pvars, pos); + case scheme_begin0_sequence_type: + return letrec_check_begin0(expr, frame, uvars, pvars, pos); + case scheme_apply_values_type: + return letrec_check_apply_values(expr, frame, uvars, pvars, pos); + case scheme_require_form_type: + return expr; + case scheme_module_type: + return letrec_check_module(expr, frame, uvars, pvars, pos); + default: + return expr; + } +} + +Scheme_Object *scheme_letrec_check_expr(Scheme_Object *expr) +{ + Scheme_Object *val; + Scheme_Object *init_uvars = scheme_null; + Scheme_Object *init_pvars = scheme_null; + Scheme_Object *init_pos = scheme_false; + + DEBUG(printf("Entry\n")); + val = letrec_check_expr(expr, NULL, init_uvars, init_pvars, init_pos); + DEBUG(printf("Exit\n")); + + DEBUG(fflush(stdout)); + return val; +} + +/*========================================================================*/ +/* precise GC traversers */ +/*========================================================================*/ + +#ifdef MZ_PRECISE_GC + +START_XFORM_SKIP; + +#include "mzmark_letrec_check.inc" + +static void register_traversers(void) +{ + GC_REG_TRAV(scheme_rt_letrec_check_frame, mark_letrec_check_frame); + GC_REG_TRAV(scheme_deferred_expr_type, mark_scheme_deferred_expr); +} + +END_XFORM_SKIP; + +#endif diff --git a/racket/src/racket/src/mkmark.rkt b/racket/src/racket/src/mkmark.rkt index f03d3b72ec..84b9164ab1 100644 --- a/racket/src/racket/src/mkmark.rkt +++ b/racket/src/racket/src/mkmark.rkt @@ -1,7 +1,7 @@ #lang racket/base -(define re:start "^START ([a-z]+);") -(define re:end "^END ([a-z]+);") +(define re:start "^START ([a-z_]+);") +(define re:end "^END ([a-z_]+);") (define re:form "^([a-zA-Z0-9_]+) [{]") @@ -39,7 +39,7 @@ (loop (cdr l) (not skip?))] [skip? (loop (cdr l) #t)] - [(regexp-match? #rx"(START|END)_[A-Z]+_ONLY;" (car l)) + [(regexp-match? #rx"(START|END)_[A-Z_]+_ONLY;" (car l)) (loop (cdr l) skip?)] [else (printf "~a\n" (car l)) diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 4bdbd8e5d4..6174243db1 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -8404,11 +8404,13 @@ static Scheme_Object *do_module_begin(Scheme_Object *orig_form, Scheme_Comp_Env /* Note: don't use MZCONFIG_USE_JIT for module bodies */ use_jit = scheme_startup_use_jit; + o = scheme_letrec_check_expr((Scheme_Object *)env->genv->module); + oi = scheme_optimize_info_create(env->prefix, 1); scheme_optimize_info_enforce_const(oi, rec[drec].comp_flags & COMP_ENFORCE_CONSTS); if (!(rec[drec].comp_flags & COMP_CAN_INLINE)) scheme_optimize_info_never_inline(oi); - o = scheme_optimize_expr((Scheme_Object *)env->genv->module, oi, 0); + o = scheme_optimize_expr(o, oi, 0); rp = scheme_resolve_prefix(0, env->prefix, 1); ri = scheme_resolve_info_create(rp); @@ -9014,6 +9016,8 @@ static Scheme_Object *do_module_begin_at_phase(Scheme_Object *form, Scheme_Comp_ if (!for_stx) lifted_reqs = scheme_append(scheme_frame_get_require_lifts(eenv), lifted_reqs); + m = scheme_letrec_check_expr(m); + oi = scheme_optimize_info_create(eenv->prefix, 1); scheme_optimize_info_set_context(oi, (Scheme_Object *)env->genv->module); if (!(rec[drec].comp_flags & COMP_CAN_INLINE)) diff --git a/racket/src/racket/src/mzmark_letrec_check.inc b/racket/src/racket/src/mzmark_letrec_check.inc new file mode 100644 index 0000000000..420b985973 --- /dev/null +++ b/racket/src/racket/src/mzmark_letrec_check.inc @@ -0,0 +1,78 @@ +/* >>>> Generated by mkmark.rkt from mzmarksrc.c <<<< */ + +static int mark_letrec_check_frame_SIZE(void *p, struct NewGC *gc) { + return + gcBYTES_TO_WORDS(sizeof(Letrec_Check_Frame)); +} + +static int mark_letrec_check_frame_MARK(void *p, struct NewGC *gc) { + Letrec_Check_Frame *frame = (Letrec_Check_Frame *)p; + + gcMARK2(frame->def, gc); + gcMARK2(frame->next, gc); + gcMARK2(frame->ref, gc); + gcMARK2(frame->checked, gc); + gcMARK2(frame->head, gc); + gcMARK2(frame->deferred_with_rhs_ref, gc); + gcMARK2(frame->deferred_with_body_ref, gc); + gcMARK2(frame->deferred_with_no_ref, gc); + + return + gcBYTES_TO_WORDS(sizeof(Letrec_Check_Frame)); +} + +static int mark_letrec_check_frame_FIXUP(void *p, struct NewGC *gc) { + Letrec_Check_Frame *frame = (Letrec_Check_Frame *)p; + + gcFIXUP2(frame->def, gc); + gcFIXUP2(frame->next, gc); + gcFIXUP2(frame->ref, gc); + gcFIXUP2(frame->checked, gc); + gcFIXUP2(frame->head, gc); + gcFIXUP2(frame->deferred_with_rhs_ref, gc); + gcFIXUP2(frame->deferred_with_body_ref, gc); + gcFIXUP2(frame->deferred_with_no_ref, gc); + + return + gcBYTES_TO_WORDS(sizeof(Letrec_Check_Frame)); +} + +#define mark_letrec_check_frame_IS_ATOMIC 0 +#define mark_letrec_check_frame_IS_CONST_SIZE 1 + + +static int mark_scheme_deferred_expr_SIZE(void *p, struct NewGC *gc) { + return + gcBYTES_TO_WORDS(sizeof(Scheme_Deferred_Expr)); +} + +static int mark_scheme_deferred_expr_MARK(void *p, struct NewGC *gc) { + Scheme_Deferred_Expr *clos = (Scheme_Deferred_Expr *)p; + + gcMARK2(clos->expr, gc); + gcMARK2(clos->frame, gc); + gcMARK2(clos->uvars, gc); + gcMARK2(clos->pvars, gc); + gcMARK2(clos->subexpr_ls, gc); + + return + gcBYTES_TO_WORDS(sizeof(Scheme_Deferred_Expr)); +} + +static int mark_scheme_deferred_expr_FIXUP(void *p, struct NewGC *gc) { + Scheme_Deferred_Expr *clos = (Scheme_Deferred_Expr *)p; + + gcFIXUP2(clos->expr, gc); + gcFIXUP2(clos->frame, gc); + gcFIXUP2(clos->uvars, gc); + gcFIXUP2(clos->pvars, gc); + gcFIXUP2(clos->subexpr_ls, gc); + + return + gcBYTES_TO_WORDS(sizeof(Scheme_Deferred_Expr)); +} + +#define mark_scheme_deferred_expr_IS_ATOMIC 0 +#define mark_scheme_deferred_expr_IS_CONST_SIZE 1 + + diff --git a/racket/src/racket/src/mzmark_type.inc b/racket/src/racket/src/mzmark_type.inc index 60780093d5..5fc327c3df 100644 --- a/racket/src/racket/src/mzmark_type.inc +++ b/racket/src/racket/src/mzmark_type.inc @@ -628,6 +628,7 @@ static int comp_let_value_MARK(void *p, struct NewGC *gc) { gcMARK2(c->flags, gc); gcMARK2(c->value, gc); gcMARK2(c->body, gc); + gcMARK2(c->names, gc); return gcBYTES_TO_WORDS(sizeof(Scheme_Compiled_Let_Value)); @@ -639,6 +640,7 @@ static int comp_let_value_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(c->flags, gc); gcFIXUP2(c->value, gc); gcFIXUP2(c->body, gc); + gcFIXUP2(c->names, gc); return gcBYTES_TO_WORDS(sizeof(Scheme_Compiled_Let_Value)); @@ -1660,6 +1662,9 @@ static int input_port_MARK(void *p, struct NewGC *gc) { gcMARK2(ip->input_extras_ready, gc); gcMARK2(ip->unless, gc); gcMARK2(ip->unless_cache, gc); +#ifdef WINDOWS_FILE_HANDLES + gcMARK2(ip->bufwidths, gc); +#endif return gcBYTES_TO_WORDS(sizeof(Scheme_Input_Port)); @@ -1687,6 +1692,9 @@ static int input_port_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(ip->input_extras_ready, gc); gcFIXUP2(ip->unless, gc); gcFIXUP2(ip->unless_cache, gc); +#ifdef WINDOWS_FILE_HANDLES + gcFIXUP2(ip->bufwidths, gc); +#endif return gcBYTES_TO_WORDS(sizeof(Scheme_Input_Port)); diff --git a/racket/src/racket/src/mzmarksrc.c b/racket/src/racket/src/mzmarksrc.c index e5ffe59825..7d926e241f 100644 --- a/racket/src/racket/src/mzmarksrc.c +++ b/racket/src/racket/src/mzmarksrc.c @@ -235,6 +235,7 @@ comp_let_value { gcMARK2(c->flags, gc); gcMARK2(c->value, gc); gcMARK2(c->body, gc); + gcMARK2(c->names, gc); size: gcBYTES_TO_WORDS(sizeof(Scheme_Compiled_Let_Value)); @@ -1327,6 +1328,43 @@ END sfs; /**********************************************************************/ +START letrec_check; + +mark_letrec_check_frame { + mark: + Letrec_Check_Frame *frame = (Letrec_Check_Frame *)p; + + gcMARK2(frame->def, gc); + gcMARK2(frame->next, gc); + gcMARK2(frame->ref, gc); + gcMARK2(frame->checked, gc); + gcMARK2(frame->head, gc); + gcMARK2(frame->deferred_with_rhs_ref, gc); + gcMARK2(frame->deferred_with_body_ref, gc); + gcMARK2(frame->deferred_with_no_ref, gc); + + size: + gcBYTES_TO_WORDS(sizeof(Letrec_Check_Frame)); +} + +mark_scheme_deferred_expr { + mark: + Scheme_Deferred_Expr *clos = (Scheme_Deferred_Expr *)p; + + gcMARK2(clos->expr, gc); + gcMARK2(clos->frame, gc); + gcMARK2(clos->uvars, gc); + gcMARK2(clos->pvars, gc); + gcMARK2(clos->subexpr_ls, gc); + + size: + gcBYTES_TO_WORDS(sizeof(Scheme_Deferred_Expr)); +} + +END letrec_check; + +/**********************************************************************/ + START optimize; mark_optimize_info { diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 77211df3ec..c42b64cf94 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -250,7 +250,7 @@ int scheme_omittable_expr(Scheme_Object *o, int vals, int fuel, int resolved, If warn_info is supplied, complain when a mismatch is detected. If no_id is 1, then an identifier doesn't count as omittable, unless the identifier is a consistent top-level; currently, this - is used to imply the absece of a continuation-mark impersonator. */ + is used to imply the absence of a continuation-mark impersonator. */ { Scheme_Type vtype; @@ -439,6 +439,15 @@ int scheme_omittable_expr(Scheme_Object *o, int vals, int fuel, int resolved, return 0; } + /* check for (set! x x) */ + if (vtype == scheme_set_bang_type) { + Scheme_Set_Bang *sb = (Scheme_Set_Bang *)o; + if (SAME_TYPE(scheme_local_type, SCHEME_TYPE(sb->var)) + && SAME_TYPE(scheme_local_type, SCHEME_TYPE(sb->val)) + && (SCHEME_LOCAL_POS(sb->var) == SCHEME_LOCAL_POS(sb->val))) + return 1; + } + /* check for struct-type declaration: */ { Scheme_Object *auto_e; @@ -2568,6 +2577,16 @@ static Scheme_Object *optimize_application3(Scheme_Object *o, Optimize_Info *inf app = (Scheme_App3_Rec *)o; + if (SAME_OBJ(app->rator, scheme_check_not_undefined) + && SCHEME_SYMBOLP(app->rand2)) { + scheme_log(info->logger, + SCHEME_LOG_WARNING, + 0, + "warning%s: use-before-definition check inserted on variable: %S", + scheme_optimize_context_to_string(info->context), + app->rand2); + } + /* Check for (apply ... (list ...)) early: */ le = direct_apply((Scheme_Object *)app, app->rator, app->rand2, info); if (le) return scheme_optimize_expr(le, info, context); diff --git a/racket/src/racket/src/print.c b/racket/src/racket/src/print.c index e60dccbff8..1929acddde 100644 --- a/racket/src/racket/src/print.c +++ b/racket/src/racket/src/print.c @@ -2028,6 +2028,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, if (compact && (SCHEME_PROCP(obj) || SCHEME_STRUCT_TYPEP(obj) || SCHEME_EOFP(obj) + || SAME_OBJ(scheme_undefined, obj) || SAME_TYPE(scheme_always_evt_type, SCHEME_TYPE(obj)) || SAME_TYPE(scheme_never_evt_type, SCHEME_TYPE(obj)) || SAME_TYPE(scheme_struct_property_type, SCHEME_TYPE(obj)) diff --git a/racket/src/racket/src/schminc.h b/racket/src/racket/src/schminc.h index 033df58612..2dd81674fa 100644 --- a/racket/src/racket/src/schminc.h +++ b/racket/src/racket/src/schminc.h @@ -14,7 +14,7 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 1116 +#define EXPECTED_PRIM_COUNT 1118 #define EXPECTED_UNSAFE_COUNT 101 #define EXPECTED_FLFXNUM_COUNT 69 #define EXPECTED_EXTFL_COUNT 45 diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index a27b210c6e..34c275fc7b 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -18,6 +18,8 @@ #ifndef __mzscheme_private__ #define __mzscheme_private__ +// #define MZ_GC_STRESS_TESTING 1 + #include "scheme.h" #include "longdouble/longdouble.h" @@ -263,6 +265,7 @@ void scheme_init_type(); void scheme_init_custodian_extractors(); void scheme_init_bignum(); void scheme_init_compenv(); +void scheme_init_letrec_check(); void scheme_init_optimize(); void scheme_init_resolve(); void scheme_init_sfs(); @@ -432,6 +435,7 @@ extern Scheme_Object *scheme_values_func; extern Scheme_Object *scheme_procedure_p_proc; extern Scheme_Object *scheme_procedure_arity_includes_proc; extern Scheme_Object *scheme_void_proc; +extern Scheme_Object *scheme_check_not_undefined; extern Scheme_Object *scheme_pair_p_proc; extern Scheme_Object *scheme_mpair_p_proc; extern Scheme_Object *scheme_unsafe_cons_list_proc; @@ -1346,6 +1350,7 @@ typedef struct Scheme_Compiled_Let_Value { int *flags; Scheme_Object *value; Scheme_Object *body; + Scheme_Object **names; /* NULL after letrec_check phase */ } Scheme_Compiled_Let_Value; #define SCHEME_CLV_FLAGS(clv) MZ_OPT_HASH_KEY(&(clv)->iso) @@ -2856,6 +2861,8 @@ typedef struct Scheme_Set_Bang { Scheme_Object *scheme_protect_quote(Scheme_Object *expr); +Scheme_Object *scheme_letrec_check_expr(Scheme_Object *); + Scheme_Object *scheme_optimize_expr(Scheme_Object *, Optimize_Info *, int context); Scheme_Object *scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, int context); diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index 81ba3f0984..97ddbb1253 100644 --- a/racket/src/racket/src/schvers.h +++ b/racket/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "6.0.1.1" +#define MZSCHEME_VERSION "6.0.1.2" #define MZSCHEME_VERSION_X 6 #define MZSCHEME_VERSION_Y 0 #define MZSCHEME_VERSION_Z 1 -#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/racket/src/racket/src/stypes.h b/racket/src/racket/src/stypes.h index 546a21c479..58e76174dc 100644 --- a/racket/src/racket/src/stypes.h +++ b/racket/src/racket/src/stypes.h @@ -288,7 +288,9 @@ enum { scheme_rt_lightweight_cont, /* 260 */ scheme_rt_export_info, /* 261 */ scheme_rt_cont_jmp, /* 262 */ + scheme_rt_letrec_check_frame, /* 263 */ #endif + scheme_deferred_expr_type, /* 264 */ _scheme_last_type_ };