diff --git a/pkgs/drracket-pkgs/drracket/drracket/private/unit.rkt b/pkgs/drracket-pkgs/drracket/drracket/private/unit.rkt index 77369cf4c3..be2f4812a8 100644 --- a/pkgs/drracket-pkgs/drracket/drracket/private/unit.rkt +++ b/pkgs/drracket-pkgs/drracket/drracket/private/unit.rkt @@ -4496,7 +4496,6 @@ (if (null? v) (send bug-icon show #f) (send bug-icon show #t))) - (set-bug-label (preferences:get 'drracket:saved-bug-reports)) (define remove-bug-icon-callback (preferences:add-callback 'drracket:saved-bug-reports @@ -4608,6 +4607,7 @@ (λ (l) (cons btn (remq* (list btn) l)))) btn)) + (set-bug-label (preferences:get 'drracket:saved-bug-reports)) (set! func-defs-canvas (new func-defs-canvas% (parent name-panel) diff --git a/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl b/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl index 8f46951318..01eef58bcc 100644 --- a/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl +++ b/pkgs/racket-pkgs/racket-doc/scribblings/reference/data.scrbl @@ -1,6 +1,5 @@ #lang scribble/doc -@(require "mz.rkt" - (for-label racket/undefined)) +@(require "mz.rkt") @title[#:style 'toc #:tag "data"]{Datatypes} @@ -170,33 +169,5 @@ The @|void-const| value is always @racket[eq?] to itself. @defproc[(void [v any/c] ...) void?]{Returns the constant @|void-const|. Each @racket[v] argument is ignored.} - @; ---------------------------------------------------------------------- -@section[#:tag "undefined"]{Undefined} - -@note-lib[racket/undefined] - -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. - -The @racket[undefined] value is always @racket[eq?] to itself. - -@history[#:added "6.0.0.6"] - -@defproc[(undefined? [v any/c]) boolean?]{Returns @racket[#t] if @racket[v] is the - constant @racket[undefined], @racket[#f] otherwise.} - - -@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 @racket[v] is returned. - -} +@include-section["undefined.scrbl"] diff --git a/pkgs/racket-pkgs/racket-doc/scribblings/reference/undefined.scrbl b/pkgs/racket-pkgs/racket-doc/scribblings/reference/undefined.scrbl new file mode 100644 index 0000000000..8f313bd027 --- /dev/null +++ b/pkgs/racket-pkgs/racket-doc/scribblings/reference/undefined.scrbl @@ -0,0 +1,23 @@ +#lang scribble/doc +@(require "mz.rkt" + (for-label racket/undefined)) + +@title[#:tag "undefined"]{Undefined} + +@note-lib[racket/undefined] + +The constant @racket[undefined] can be used as a placeholder value for +a value to be installed later, especially for cases where premature +access of the value is either difficult or impossible to detect or +prevent. + +The @racket[undefined] value is always @racket[eq?] to itself. + +@history[#:added "6.0.0.6"] + +@defproc[(undefined? [v any/c]) boolean?]{ + +Returns @racket[#t] if @racket[v] is the constant @racket[undefined], +@racket[#f] otherwise.} + +@defthing[undefined undefined?]{The ``undefined'' constant.} diff --git a/pkgs/racket-pkgs/racket-doc/scribblings/reference/unsafe-undefined.scrbl b/pkgs/racket-pkgs/racket-doc/scribblings/reference/unsafe-undefined.scrbl new file mode 100644 index 0000000000..6fd6027b25 --- /dev/null +++ b/pkgs/racket-pkgs/racket-doc/scribblings/reference/unsafe-undefined.scrbl @@ -0,0 +1,55 @@ +#lang scribble/doc +@(require "mz.rkt" + (for-label racket/unsafe/undefined)) + +@title[#:tag "unsafe-undefined"]{Unsafe Undefined} + +@note-lib[racket/unsafe/undefined] + +The constant @racket[unsafe-undefined] is used internally as a +placeholder value. For example, it is used by @racket[letrec] as a +value for a variable that has not yet been assigned a value. Unlike +the @racket[undefined] value exported by @racket[racket/undefined], +however, the @racket[unsafe-undefined] value should not leak as the +result of a safe expression. Expression results that potentially +produce @racket[unsafe-undefined] can be guarded by +@racket[check-not-unsafe-undefined], so that an exception can be +raised instead of producing an @racket[undefined] value. + +The @racket[unsafe-undefined] value is always @racket[eq?] to itself. + +@history[#:added "6.0.0.6"] + +@defproc[(unsafe-undefined? [v any/c]) boolean?]{ + +Returns @racket[#t] if @racket[v] is the constant +@racket[unsafe-undefined], @racket[#f] otherwise.} + + +@defthing[unsafe-undefined unsafe-undefined?]{ + +The unsafe ``undefined'' constant.} + + +@defproc[(check-not-unsafe-undefined [v any/c] [sym symbol?]) + (and/c any/c (not/c unsafe-undefined?))]{ + +Checks whether @racket[v] is @racket[unsafe-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[unsafe-undefined], then +@racket[v] is returned.} + +@defthing[prop:chaperone-unsafe-undefined struct-type-property?]{ + +A @tech{structure type property} that causes a structure type's +constructor to produce a @tech{chaperone} of an instance where every +access of a field in the structure is checked to prevent returning +@racket[unsafe-undefined]. + +The property value should be a list of symbols used as field names, +but the list should be in reverse order of the structure's fields. +When a field access would otherwise produce @racket[unsafe-undefined], +the @racket[exn:fail:contract:variable] exception is raised if a field +name is provided by the structure property's value, otherwise the +@racket[exn:fail:contract] exception is raised.} diff --git a/pkgs/racket-pkgs/racket-doc/scribblings/reference/unsafe.scrbl b/pkgs/racket-pkgs/racket-doc/scribblings/reference/unsafe.scrbl index 463a4a2b41..ece83f5613 100644 --- a/pkgs/racket-pkgs/racket-doc/scribblings/reference/unsafe.scrbl +++ b/pkgs/racket-pkgs/racket-doc/scribblings/reference/unsafe.scrbl @@ -418,3 +418,7 @@ Unchecked versions of @racket[extflvector-length], @racket[extflvector-ref], and @racket[extflvector-set!]. A @tech{extflvector}'s size can never be larger than a @tech{fixnum} (so even @racket[extflvector-length] always returns a fixnum).} + +@; ------------------------------------------------------------------------ + +@include-section["unsafe-undefined.scrbl"] diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/object.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/object.rktl index 2b13eec1db..db0e81f2dc 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/object.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/object.rktl @@ -1922,6 +1922,122 @@ (test 5 'send-generic (send-generic (new c%) (generic c% m) 5)) (test 6 'send-generic-interface (send-generic (new c/i%) (generic i<%> m) 6)) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; check error reporting for variable use before assignment + +(let () + (define c% + (class object% + (define x 7) + (field [h 10]) + (super-new))) + + (define d% + (class c% + (define z z) + (super-new))) + + (define e% + (class d% + (define q 1) + (field [s 1]) + (super-new))) + + (define d2% + (class c% + (define z 1) + (field [f f]) + (super-new))) + + (define e2% + (class d2% + (define q 1) + (field [s 1]) + (super-new))) + + (err/rt-test (new d%) (lambda (exn) + (and (exn:fail:contract:variable? exn) + (eq? 'z (exn:fail:contract:variable-id exn))))) + (err/rt-test (new e%) (lambda (exn) + (and (exn:fail:contract:variable? exn) + (eq? 'z (exn:fail:contract:variable-id exn))))) + (err/rt-test (new d2%) (lambda (exn) + (and (exn:fail:contract:variable? exn) + (eq? 'f (exn:fail:contract:variable-id exn))))) + (err/rt-test (new e2%) (lambda (exn) + (and (exn:fail:contract:variable? exn) + (eq? 'f (exn:fail:contract:variable-id exn)))))) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; check optimization to omit use-before-definition chaperone: + +;; Relies on expansion where the next-to-last argument of `compose-class` +;; is #t when the chaperone is needed. + +(let () + (define (check-opt e opt?) + (test #t + `(,opt? ,e) + (let ([e (expand e)]) + (let loop ([e e]) + (cond + [(and (pair? e) + (pair? (cdr e)) + (eq? (syntax-e (car e)) 'compose-class)) + (eq? opt? (syntax-case (list-ref e (- (length e) 2)) (quote) + [(quote #f) #t] + [(quote #t) #f] + [_ 'unknown]))] + [(syntax? e) + (loop (syntax-e e))] + [(pair? e) + (and (loop (car e)) (loop (cdr e)))] + [else #t]))))) + + (check-opt '(class object%) #t) + (check-opt '(class object% (super-new)) #t) + + (check-opt '(class object% (define x 1)) #t) + (check-opt '(class object% (define x 1) (super-new)) #t) + (check-opt '(class object% (field [x 1]) (super-new)) #t) + (check-opt '(class object% (init-field [x 1]) (super-new)) #t) + (check-opt '(class object% (define x (+ 1 2))) #t) + (check-opt '(class object% (define x (free-var 1))) #t) + + (check-opt '(class object% (define x x)) #f) + (check-opt '(class object% (field [x x])) #f) + (check-opt '(class object% (init-field [x x])) #f) + (check-opt '(class object% (super-new) (define x 1)) #f) + (check-opt '(class object% (super-make-object) (define x 1)) #f) + (check-opt '(class object% (super-instantiate ()) (define x 1)) #f) + (check-opt '(class object% (displayln this) (define x 1)) #f) + (check-opt '(class object% (inherit m) (m) (define x 1)) #f) + (check-opt '(class object% (define/override (m) x) (super m) (define x 1)) #f) + + (check-opt '(class object% (define x 1) (define y 1) (super-new)) #t) + (check-opt '(class object% (define x 1) (define y x) (super-new)) #t) + (check-opt '(class object% (field [x 1] [y x]) (super-new)) #t) + (check-opt '(class object% (field [x 1] [y x]) (super-make-object)) #t) + (check-opt '(class object% (init-field [x 1] [y x]) (super-new)) #t) + (check-opt '(class object% (init-field [x 1]) (define y x) (super-new)) #t) + (check-opt '(class object% (define x 1) (define y (list x)) (super-new)) #t) + (check-opt '(class object% (define/public (m) x) (define x 1) (super-new)) #t) + (check-opt '(class object% (define/override (m) x) (define x 1) (super-new)) #t) + + (check-opt '(class object% (define x y) (define y 1) (super-new)) #f) + (check-opt '(class object% (init-field [x y] [y 1])) #f) + + (check-opt '(class object% (inherit-field f) (super-new) (displayln f)) #t) + (check-opt '(class object% (inherit-field f) (displayln f) (super-new)) #f) + (check-opt '(class object% (inherit-field f) (set! f 10) (super-new)) #t) + + ;; Ok to use after explicit assignment that's before the decl: + (check-opt '(class object% (set! y 7) (define x y) (define y 1) (super-new)) #t) + ;; But not in a branch + (check-opt '(class object% (when ? (set! y 7)) (define x y) (define y 1) (super-new)) #f) + + (void)) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/collects/racket/private/class-c-old.rkt b/racket/collects/racket/private/class-c-old.rkt index 2e05c84b44..3127f28e3d 100644 --- a/racket/collects/racket/private/class-c-old.rkt +++ b/racket/collects/racket/private/class-c-old.rkt @@ -236,6 +236,7 @@ field-pub-width field-ht (class-field-ids cls) + (class-all-field-ids cls) 'struct:object 'object? 'make-object 'field-ref 'field-set! @@ -247,6 +248,8 @@ (class-orig-cls cls) #f #f ; serializer is never set + + (class-check-undef? cls) #f)] [obj-name (if name (string->symbol (format "object:~a" name)) @@ -500,6 +503,7 @@ field-pub-width field-ht (class-field-ids cls) + (class-all-field-ids cls) 'struct:object 'object? 'make-object 'field-ref 'field-set! @@ -511,6 +515,9 @@ (class-orig-cls cls) #f #f ; serializer is never set + + (class-check-undef? cls) + #f)] [obj-name (if name (string->symbol (format "object:~a" name)) @@ -1249,6 +1256,7 @@ field-pub-width field-ht (class-field-ids cls) + (class-all-field-ids cls) 'struct:object 'object? 'make-object 'field-ref 'field-set! @@ -1259,6 +1267,8 @@ (class-orig-cls cls) #f #f ; serializer is never set + + (class-check-undef? cls) #f)] [obj-name (if name (string->symbol (format "wrapper-object:~a" name)) diff --git a/racket/collects/racket/private/class-internal.rkt b/racket/collects/racket/private/class-internal.rkt index 1191c811eb..00bf874926 100644 --- a/racket/collects/racket/private/class-internal.rkt +++ b/racket/collects/racket/private/class-internal.rkt @@ -9,7 +9,8 @@ (only-in "../contract/region.rkt" current-contract-region) "../contract/base.rkt" "../contract/combinator.rkt" - racket/undefined + racket/unsafe/undefined + "class-undef.rkt" (for-syntax racket/stxparam syntax/kerncase syntax/stx @@ -1219,8 +1220,7 @@ [class-name class-name]) (syntax-track-origin (syntax/loc e - (begin - 1 ; to ensure a non-empty body + (begin (set! id (extract-arg 'class-name `idpos init-args defval)) ...)) e @@ -1232,7 +1232,6 @@ (map normalize-init/field (syntax->list #'(idp ...)))]) (syntax-track-origin (syntax/loc e (begin - 1 ; to ensure a non-empty body (set! iid expr) ...)) e @@ -1247,7 +1246,8 @@ #'id/rename (stx-car #'id/rename))]) (syntax-track-origin - (syntax/loc e (set! id (extract-rest-args n init-args))) + (syntax/loc e + (set! id (extract-rest-args n init-args))) e #'-i-r))] [(-i-r) @@ -1271,7 +1271,7 @@ [definify (lambda (l) (map bind-local-id l) l)]) - + ;; ---- set up field and method mappings ---- (with-syntax ([(rename-super-orig ...) (definify (map car rename-supers))] [(rename-super-orig-localized ...) (map lookup-localize (map car rename-supers))] @@ -1348,14 +1348,16 @@ public-final-name ... pubment-name ...) (values - (make-field-map (quote-syntax the-finder) + (make-field-map #t + (quote-syntax the-finder) (quote the-obj) (quote-syntax inherit-field-name) (quote-syntax inherit-field-name-localized) (quote-syntax inherit-field-accessor) (quote-syntax inherit-field-mutator)) ... - (make-field-map (quote-syntax the-finder) + (make-field-map #f + (quote-syntax the-finder) (quote the-obj) (quote-syntax local-field) (quote-syntax local-field-localized) @@ -1486,18 +1488,22 @@ [inspector (if (pair? inspect-decls) (stx-car (stx-cdr (car inspect-decls))) #'(current-inspector))] - [deserialize-id-expr deserialize-id-expr]) + [deserialize-id-expr deserialize-id-expr] + [private-field-names private-field-names]) (add-decl-props (quasisyntax/loc stx - (let ([superclass super-expression] - [interfaces (list interface-expression ...)]) - (compose-class - 'name superclass interfaces inspector deserialize-id-expr #,any-localized? + (detect-field-unsafe-undefined + compose-class + 'name + super-expression + (list interface-expression ...) + inspector deserialize-id-expr #,any-localized? ;; Field count: num-fields ;; Field names: `field-names `inherit-field-names + `private-field-names ; for undefined-checking property ;; Method names: `(rename-super-name ... rename-super-extra-name ...) `(rename-inner-name ... rename-inner-extra-name ...) @@ -1620,42 +1626,54 @@ (syntax-case stx () [(_ (arg (... ...)) (kw kwarg) (... ...)) (with-syntax ([stx stx]) - (syntax (-instantiate super-go stx #f (the-obj si_c si_inited? - si_leftovers) - (list arg (... ...)) - (kw kwarg) (... ...))))]))] + (syntax + (begin + `(declare-super-new) + (-instantiate super-go stx #f (the-obj si_c si_inited? + si_leftovers) + (list arg (... ...)) + (kw kwarg) (... ...)))))]))] [super-new-param (lambda (stx) (syntax-case stx () [(_ (kw kwarg) (... ...)) (with-syntax ([stx stx]) - (syntax (-instantiate super-go stx #f (the-obj si_c si_inited? - si_leftovers) - null - (kw kwarg) (... ...))))]))] + (syntax + (begin + `(declare-super-new) + (-instantiate super-go stx #f (the-obj si_c si_inited? + si_leftovers) + null + (kw kwarg) (... ...)))))]))] [super-make-object-param (lambda (stx) (let ([code (quote-syntax (lambda args (super-go the-obj si_c si_inited? si_leftovers args null)))]) - (if (identifier? stx) - code - (datum->syntax - code - (cons code - (cdr (syntax-e stx)))))))]) + #`(begin + `(declare-super-new) + #,(if (identifier? stx) + code + (datum->syntax + code + (cons code + (cdr (syntax-e stx))))))))]) (letrec-syntaxes+values ([(plain-init-name) (make-init-redirect (quote-syntax set!) (quote-syntax #%plain-app) (quote-syntax local-plain-init-name) (quote-syntax plain-init-name-localized))] ...) - ([(local-plain-init-name) undefined] ...) + ([(local-plain-init-name) unsafe-undefined] ...) (void) ; in case the body is empty - . exprs))))))))))))) + (begin + '(declare-field-use-start) ; see "class-undef.rkt" + . exprs)))))))))))))) + ;; Extra argument added here by `detect-field-unsafe-undefined` + #; check-undef? ;; Not primitive: - #f))))))))))))))))) + #f)))))))))))))))) ;; The class* and class entry points: (values @@ -1746,7 +1764,6 @@ () defn-or-expr ...))])) - (define-syntaxes (private* public* pubment* override* overment* augride* augment* public-final* override-final* augment-final*) (let ([mk @@ -1969,6 +1986,7 @@ field-pub-width ; total number of public fields field-ht ; maps public field names to field-infos (see make-field-info above) field-ids ; list of public field names + all-field-ids ; list of field names in reverse order, used for `undefined` error reporting [struct:object ; structure type for instances #:mutable] @@ -2000,6 +2018,8 @@ #:mutable] [fixup ; for deserialization #:mutable] + + check-undef? ; objects need an unsafe-undefined guarding chaperone? no-super-init?); #t => no super-init needed #:inspector insp) @@ -2044,6 +2064,7 @@ last few projections. num-fields ; total fields (public & private) public-field-names ; list of symbols (shorter than num-fields) inherit-field-names ; list of symbols (not included in num-fields) + private-field-names ; list of symbols (the rest of num-fields) rename-super-names ; list of symbols rename-inner-names @@ -2063,6 +2084,9 @@ last few projections. init-mode ; 'normal, 'stop, or 'list make-methods ; takes field and method accessors + + check-undef? + make-struct:prim) ; see "primitive classes", below (define (make-method proc meth-name) (procedure-rename @@ -2288,11 +2312,15 @@ last few projections. methods super-methods int-methods beta-methods meth-flags inner-projs dynamic-idxs dynamic-projs field-width field-pub-width field-ht field-names + (append (reverse private-field-names) + (reverse public-field-names) + (class-all-field-ids super)) 'struct:object 'object? 'make-object 'field-ref 'field-set! init-args init-mode 'init #f #f #f ; serializer is set later + (or check-undef? (class-check-undef? super)) (and make-struct:prim #t))] [obj-name (if name (string->symbol (format "object:~a" name)) @@ -2347,10 +2375,14 @@ last few projections. (add-properties (class-struct:object super) interfaces) 0 ;; No init fields ;; Fields for new slots: - num-fields undefined + num-fields unsafe-undefined ;; Map object property to class: (append (list (cons prop:object c)) + (if (class-check-undef? c) + (list (cons prop:chaperone-unsafe-undefined + (class-all-field-ids c))) + null) (if deserialize-id (list (cons prop:serializable @@ -3078,7 +3110,7 @@ An example (vector) (vector) (vector) - 0 0 (make-hasheq) null + 0 0 (make-hasheq) null null 'struct:object object? 'make-object 'field-ref-not-needed 'field-set!-not-needed @@ -3094,6 +3126,8 @@ An example #f (lambda (obj) #(())) ; serialize (lambda (obj args) (void)) ; deserialize-fixup + + #f ; no chaperone to guard against unsafe-undefined #t)) ; no super-init @@ -3242,6 +3276,7 @@ An example field-pub-width field-ht (class-field-ids cls) + (class-all-field-ids cls) 'struct:object 'object? 'make-object 'field-ref 'field-set! @@ -3252,6 +3287,8 @@ An example (class-orig-cls cls) #f #f ; serializer is never set + + (class-check-undef? cls) #f)] [obj-name (if name (string->symbol (format "wrapper-object:~a" name)) @@ -3265,7 +3302,7 @@ An example (class-struct:object cls) 0 ;; No init fields 0 ;; No new fields in this class replacement - undefined + unsafe-undefined ;; Map object property to class: (list (cons prop:object c)))]) (set-class-struct:object! c struct:object) @@ -4261,7 +4298,7 @@ An example #f #f - 0 null null ; no fields + 0 null null null ; no fields null ; no rename-supers null ; no rename-inners @@ -4289,6 +4326,8 @@ An example (if init-arg-names (extract-primitive-args this name init-arg-names init-args) init-args))))) + + #f make-struct:prim)) diff --git a/racket/collects/racket/private/class-undef.rkt b/racket/collects/racket/private/class-undef.rkt new file mode 100644 index 0000000000..71f42aa044 --- /dev/null +++ b/racket/collects/racket/private/class-undef.rkt @@ -0,0 +1,201 @@ +#lang racket/base +(require (for-syntax racket/base + syntax/private/boundmap + syntax/kerncase)) + +(provide declare-field-use-start + declare-field-assignment + declare-field-use + declare-inherit-use + declare-this-escapes + declare-super-new + + detect-field-unsafe-undefined) + +;; The `class` macros inject declarations into expansions +;; of the form `(begin (_declare-word _id ...) _expr ...)` +;; for each of the following `_declare-word`s: +(define-syntax declare-field-use-start #f) ; marks start of initialization +(define-syntax declare-field-assignment #f) +(define-syntax declare-field-use #f) +(define-syntax declare-inherit-use #f) +(define-syntax declare-this-escapes #f) +(define-syntax declare-super-new #f) + +;; A wrapper macro that runs the `need-undeed-check?` analysis +;; and adds a boolean argument to a call to `compose-class`: +(define-syntax (detect-field-unsafe-undefined stx) + (syntax-case stx () + [(_ compose-class arg ... proc final) + (let-values ([(exp exp-proc) (syntax-local-expand-expression #'proc)]) + (with-syntax ([exp-proc exp-proc] + [need-undef? (need-undefined-check? exp)]) + (syntax/loc stx + (compose-class arg ... proc need-undef? final))))])) + +;; Analysis to detect whether any field can be referenced while +;; its value is `unsafe-undefined`, based on `declare-...` annotations +;; inserted by macros. +(define-for-syntax (need-undefined-check? exp) + ;; All local fields need to be initialized (i.e., assigned) + ;; before a method call or `super-new` + (define init-too-late? #f) + ;; It's ok to use inherited fields only after `super-new` has + ;; definitely been called: + (define super-new? #f) + + ;; cloop returns #t if access-before-definition looks possible: + (let cloop ([exp exp] + [ready #f] ; table of initializations, after start + [in-branch? #f]) + (define (loop e) (cloop e ready in-branch?)) + + (kernel-syntax-case exp #f + [_ + (identifier? exp) + #f] + + ;; ---------------------------------------- + ;; Handle annotations at start of `begin`: + + [(begin) #f] + [(begin '(decl) . body) + (and (identifier? #'decl) + (free-identifier=? #'decl #'declare-field-use-start)) + ;; Beginning of the class body; start tracking initialization + ;; creating the `ready` table: + (cloop #`(begin . body) (make-module-identifier-mapping) #f)] + [(begin '(decl id ...) . body) + (and (identifier? #'decl) + (free-identifier=? #'decl #'declare-field-use)) + ;; A field is used. If tracking has started, make sure the + ;; field is definitely initalized: + (or (and ready + (ormap (lambda (id) + (not (module-identifier-mapping-get ready id (lambda () #f)))) + (syntax->list #'(id ...))) + (report #'body) + #t) + (loop #'(begin . body)))] + [(begin '(decl id ...) . body) + (and (identifier? #'decl) + (free-identifier=? #'decl #'declare-field-assignment)) + ;; A field is assigned. If this is after an action that + ;; might read a field externally, it's too late. Otherwise, + ;; assuming that we're not in a branch, the field is after here + ;; assigned (but not before the right-hand side is evaluated): + (let ([ids (syntax->list #'(id ...))]) + (or (and ready + init-too-late? + (ormap (lambda (id) + (not (module-identifier-mapping-get ready id (lambda () #f)))) + ids) + (report #'body) + #t) + ;; field is ready after RHS is evaluated: + (begin0 + (loop #'(begin . body)) + (when ready + (unless in-branch? + (for-each (lambda (id) + (module-identifier-mapping-put! ready id #t)) + ids))))))] + [(begin '(decl id ...) . body) + (and (identifier? #'decl) + (free-identifier=? #'decl #'declare-inherit-use)) + ;; It's ok to use an inherited field only if `super-new` has + ;; definitely been called. + (or (and ready + (not super-new?) + (report #'body) + #t) + (loop #'(begin . body)))] + [(begin '(decl) . body) + (and (identifier? #'decl) + (free-identifier=? #'decl #'declare-this-escapes)) + ;; Any method call or explicit use of `this` means a field + ;; might be accessed outside of the `class` declaration, + ;; so any initialization afterward is too late: + (begin + (when ready (set! init-too-late? #t)) + (loop #'(begin . body)))] + + [(begin '(decl) . body) + (and (identifier? #'decl) + (free-identifier=? #'decl #'declare-super-new)) + ;; As long as we're not in a branch, `super-new` is definitely + ;; called after here. + (begin + (when (and ready (not in-branch?)) (set! super-new? #t)) + (loop #'(begin '(declare-this-escapes) . body)))] + + ;; ---------------------------------------- + ;; Abstract interpretation of core forms. + + ;; We model order by calling `cloop` in order, which can mutate + ;; `init-too-late?`, `super-new?` and `ready`. (Those could + ;; have been threaded through, but local mutation is easier.) + + ;; We model both branches and delayed computation (via closures) + ;; by recurring with a true `in-branch?`. In a branch, we + ;; pessimistically ignore initialization (via local-field + ;; assignment) and super-new`, and pessimistcally assume all + ;; references, method calls, and inherite-field assignemtnt. + ;; [Room for improvement: use a functional table in place of + ;; `ready`, etc., and suitably split and merge.] + + [(begin exp . body) + (or (loop #'exp) + (loop #'(begin . body)))] + + [(#%plain-lambda _ exp ...) + (cloop #'(begin exp ...) ready #t)] + [(case-lambda clause ...) + (ormap (lambda (clause) + (cloop #`(#%plain-lambda . #,clause) ready #t)) + (syntax->list #'(clause ...)))] + [(if tst thn els) + (or (loop #'tst) + (cloop #'thn ready #t) + (cloop #'els ready #t))] + [(begin0 exp ...) + (loop #'(begin exp ...))] + [(let-values ([(id ...) exp] ...) body-exp ...) + (loop #'(begin exp ... body-exp ...))] + [(letrec-values ([(id ...) exp] ...) body-exp ...) + (loop #'(begin exp ... body-exp ...))] + [(letrec-syntaxes+values _ ([(id ...) exp] ...) body-exp ...) + (loop #'(begin exp ... body-exp ...))] + [(set! id exp) + (loop #'exp)] + + [(quote . _) #f] + [(quote-syntax . _) #f] + + [(with-continuation-mark key val exp) + (loop #'(begin key val exp))] + + [(#%plain-app exp ...) + (loop #'(begin exp ...))] + [(#%top . _) #f] + [(#%variable-reference . _) #f] + + [(#%expression expr) (loop #'expr)] + + [_else (raise-syntax-error #f "unrecognized expression form" exp)]))) + +(define-for-syntax (report exprs) + (when (pair? (syntax->list exprs)) + (define expr (car (syntax->list exprs))) + (define s (srcloc->string (srcloc (syntax-source expr) + (syntax-line expr) + (syntax-column expr) + (syntax-position expr) + (syntax-span expr)))) + (log-message (make-logger 'optimizer (current-logger)) + 'debug + (format "chaperoning to prevent undefined access due to: ~.s~a~a" + (syntax->datum expr) + (if s " at: " "") + (or s "")) + #f))) diff --git a/racket/collects/racket/private/classidmap.rkt b/racket/collects/racket/private/classidmap.rkt index b0dd01c342..87b48db320 100644 --- a/racket/collects/racket/private/classidmap.rkt +++ b/racket/collects/racket/private/classidmap.rkt @@ -3,8 +3,9 @@ (require syntax/stx (for-syntax racket/base) (for-template racket/base - racket/undefined - "class-wrapped.rkt")) + racket/unsafe/undefined + "class-wrapped.rkt" + "class-undef.rkt")) (define insp (variable-reference->module-declaration-inspector (#%variable-reference))) @@ -35,6 +36,18 @@ (define (binding from to stx) stx) +;; Declarations used to determine whether a chaperone is +;; needed to protect against unsafe-undefined access +(define (add-declare-this-escapes src-stx stx) + (quasisyntax/loc src-stx (begin '(declare-this-escapes) #,stx))) +(define (add-declare-field-use id inherited? src-stx stx) + (if inherited? + (quasisyntax/loc src-stx (begin '(declare-inherit-use #,id) #,stx)) + (quasisyntax/loc src-stx (begin '(declare-field-use #,id) #,stx)))) +(define (add-declare-field-assignment id inherited? src-stx stx) + (if inherited? + stx + (quasisyntax/loc src-stx (begin '(declare-field-assignment #,id) #,stx)))) (define (make-this-map orig-id the-finder the-obj) (let ([set!-stx (datum->syntax the-finder 'set!)]) @@ -46,11 +59,13 @@ (free-identifier=? (syntax set!) set!-stx) (raise-syntax-error 'class "cannot mutate object identifier" stx)] [(id . args) - (datum->syntax + (add-declare-this-escapes stx - (cons (find the-finder the-obj stx) (syntax args)) - stx)] - [id (find the-finder the-obj stx)]))))) + (datum->syntax + stx + (cons (find the-finder the-obj stx) (syntax args)) + stx))] + [id (add-declare-this-escapes stx (find the-finder the-obj stx))]))))) (define (make-this%-map replace-stx the-finder) (let ([set!-stx (datum->syntax the-finder 'set!)]) @@ -66,9 +81,10 @@ [(f . args) (quasisyntax/loc stx (#,replace-stx . args))]))))) -(define (make-field-map the-finder the-obj the-binder the-binder-localized +(define (make-field-map inherited? the-finder the-obj the-binder the-binder-localized field-accessor field-mutator) (let ([set!-stx (datum->syntax the-finder 'set!)]) + (define (choose-src a b) (if (syntax-source a) a b)) (mk-set!-trans the-binder-localized (lambda (stx) @@ -77,20 +93,32 @@ (syntax-case stx () [(set! id expr) (free-identifier=? (syntax set!) set!-stx) - (with-syntax ([bindings (syntax/loc stx ([obj obj-expr] [id expr]))] - [set (quasisyntax/loc stx - ((unsyntax field-mutator) obj id))]) - (syntax/loc stx (let* bindings set)))] + (add-declare-field-assignment + #'id + inherited? + #'id + (with-syntax ([bindings (syntax/loc stx ([obj obj-expr] [id expr]))] + [set (quasisyntax/loc stx + ((unsyntax field-mutator) obj id))]) + (syntax/loc (choose-src stx #'id) (let* bindings set))))] [(id . args) - (with-syntax ([bindings (syntax/loc stx ([obj obj-expr]))] - [call (quasisyntax/loc stx - ((check-not-undefined ((unsyntax field-accessor) obj) 'id) . args))]) - (syntax/loc stx (let* bindings call)))] + (add-declare-field-use + #'id + inherited? + #'id + (with-syntax ([bindings (syntax/loc stx ([obj obj-expr]))] + [call (quasisyntax/loc stx + (((unsyntax field-accessor) obj) . args))]) + (syntax/loc (choose-src stx #'id) (let* bindings call))))] [id - (with-syntax ([bindings (syntax/loc stx ([obj obj-expr]))] - [get (quasisyntax/loc stx - (check-not-undefined ((unsyntax field-accessor) obj) 'id))]) - (syntax/loc stx (let* bindings get)))]))))))) + (add-declare-field-use + #'id + inherited? + stx + (with-syntax ([bindings (syntax/loc stx ([obj obj-expr]))] + [get (quasisyntax/loc stx + ((unsyntax field-accessor) obj))]) + (syntax/loc (choose-src stx #'id) (let* bindings get))))]))))))) (define (make-method-map the-finder the-obj the-binder the-binder-localized method-accessor) (let ([set!-stx (datum->syntax the-finder 'set!)]) @@ -103,15 +131,17 @@ (free-identifier=? (syntax set!) set!-stx) (raise-syntax-error 'class "cannot mutate method" stx)] [(id . args) - (binding - the-binder (syntax id) - (datum->syntax - the-finder - (make-method-apply - (list method-accessor (find the-finder the-obj stx)) - (find the-finder the-obj stx) - (syntax args)) - stx))] + (add-declare-this-escapes + stx + (binding + the-binder (syntax id) + (datum->syntax + the-finder + (make-method-apply + (list method-accessor (find the-finder the-obj stx)) + (find the-finder the-obj stx) + (syntax args)) + stx)))] [_else (raise-syntax-error 'class @@ -131,12 +161,14 @@ (free-identifier=? (syntax set!) set!-stx) (raise-syntax-error 'class "cannot mutate method" stx)] [(id . args) - (binding - the-binder (syntax id) - (datum->syntax - the-finder - (make-method-apply (find the-finder new-name stx) (find the-finder the-obj stx) (syntax args)) - stx))] + (add-declare-this-escapes + stx + (binding + the-binder (syntax id) + (datum->syntax + the-finder + (make-method-apply (find the-finder new-name stx) (find the-finder the-obj stx) (syntax args)) + stx)))] [_else (raise-syntax-error 'class @@ -154,12 +186,14 @@ (free-identifier=? (syntax set!) set!-stx) (raise-syntax-error 'class "cannot mutate super method" stx)] [(id . args) - (binding - the-binder (syntax id) - (datum->syntax - the-finder - (make-method-apply (find the-finder rename-temp stx) (find the-finder the-obj stx) (syntax args)) - stx))] + (add-declare-this-escapes + stx + (binding + the-binder (syntax id) + (datum->syntax + the-finder + (make-method-apply (find the-finder rename-temp stx) (find the-finder the-obj stx) (syntax args)) + stx)))] [_else (raise-syntax-error 'class @@ -180,13 +214,15 @@ [(id (lambda () default) . args) (free-identifier=? (syntax lambda) lambda-stx) (let ([target (find the-finder the-obj stx)]) - (binding - the-binder (syntax id) - (datum->syntax - the-finder - (make-method-apply (list (find the-finder rename-temp stx) target #'default) - target (syntax args)) - stx)))] + (add-declare-this-escapes + stx + (binding + the-binder (syntax id) + (datum->syntax + the-finder + (make-method-apply (list (find the-finder rename-temp stx) target #'default) + target (syntax args)) + stx))))] [(id (lambda largs default) . args) (free-identifier=? (syntax lambda) lambda-stx) (raise-syntax-error @@ -211,27 +247,31 @@ stx)])))))) (define (generate-super-call stx the-finder the-obj rename-temp args) - (class-syntax-protect - (datum->syntax - the-finder - (make-method-apply (find the-finder rename-temp stx) - (find the-finder the-obj stx) - args) - stx))) + (add-declare-this-escapes + stx + (class-syntax-protect + (datum->syntax + the-finder + (make-method-apply (find the-finder rename-temp stx) + (find the-finder the-obj stx) + args) + stx)))) (define (generate-inner-call stx the-finder the-obj default-expr rename-temp args) - (class-syntax-protect - (datum->syntax - the-finder - (let ([target (find the-finder the-obj stx)]) - (datum->syntax - the-finder - `(let ([i (,(find the-finder rename-temp stx) ,target)]) - (if i - ,(make-method-apply 'i target args) - ,default-expr)) - stx)) - stx))) + (add-declare-this-escapes + stx + (class-syntax-protect + (datum->syntax + the-finder + (let ([target (find the-finder the-obj stx)]) + (datum->syntax + the-finder + `(let ([i (,(find the-finder rename-temp stx) ,target)]) + (if i + ,(make-method-apply 'i target args) + ,default-expr)) + stx)) + stx)))) (define (make-init-error-map localized-id) (mk-set!-trans @@ -253,14 +293,22 @@ (with-syntax ([local-id local-id]) (syntax/loc stx (set! local-id expr)))] [(id . args) - (with-syntax ([local-id local-id] + (with-syntax ([local-id (datum->syntax + local-id + (syntax-e local-id) + #'id + #'id)] [#%app #%app-stx]) - (syntax/loc stx (#%app local-id . args)))] - [_else (datum->syntax - local-id - (syntax-e local-id) - stx - stx)]))))) + (syntax/loc stx (#%app (#%app check-not-unsafe-undefined local-id 'id) . args)))] + [id (quasisyntax/loc stx + (#,#%app-stx + check-not-unsafe-undefined + #,(datum->syntax + local-id + (syntax-e local-id) + stx + stx) + 'id))]))))) (define super-error-map (lambda (stx) diff --git a/racket/collects/racket/private/pre-base.rkt b/racket/collects/racket/private/pre-base.rkt index b3bbb836e4..8266105f22 100644 --- a/racket/collects/racket/private/pre-base.rkt +++ b/racket/collects/racket/private/pre-base.rkt @@ -179,8 +179,7 @@ procedure->method procedure-rename chaperone-procedure impersonate-procedure assq assv assoc - prop:incomplete-arity prop:method-arity-error - check-not-undefined undefined) + prop:incomplete-arity prop:method-arity-error) (all-from "reqprov.rkt") (all-from-except "for.rkt" define-in-vector-like diff --git a/racket/collects/racket/undefined.rkt b/racket/collects/racket/undefined.rkt index bd9b7d367f..a193bbaca3 100644 --- a/racket/collects/racket/undefined.rkt +++ b/racket/collects/racket/undefined.rkt @@ -1,8 +1,10 @@ #lang racket/base -(require '#%kernel) -(provide check-not-undefined - undefined +(provide undefined undefined?) +(define-values (struct:undef make-undef undef? undef-ref undef-set!) + (make-struct-type 'undefined #f 0 0)) +(define undefined (make-undef)) + (define (undefined? v) (eq? v undefined)) diff --git a/racket/collects/racket/unit.rkt b/racket/collects/racket/unit.rkt index d637f9b4f9..84e87e6c4c 100644 --- a/racket/collects/racket/unit.rkt +++ b/racket/collects/racket/unit.rkt @@ -17,7 +17,7 @@ "private/unit-syntax.rkt")) (require racket/block - racket/undefined + racket/unsafe/undefined racket/contract/base racket/contract/region racket/stxparam @@ -967,7 +967,7 @@ (list (cons 'dept depr) ...) (syntax-parameterize ([current-contract-region (lambda (stx) #'(quote (unit name)))]) (lambda () - (let ([eloc (box undefined)] ... ...) + (let ([eloc (box unsafe-undefined)] ... ...) (values (lambda (import-table) (let-values ([(iloc ...) @@ -1005,7 +1005,10 @@ (define-values (e-post-id ...) (letrec-syntaxes+values (post-renames ...) () e-post-rhs)) ... ...))))) - (unit-export ((export-key ...) (vector-immutable (λ () (unbox eloc)) ...)) ...))))))) + (unit-export ((export-key ...) + (vector-immutable (λ () (check-not-unsafe-undefined (unbox eloc) 'int-evar)) + ...)) + ...))))))) import-tagged-sigids export-tagged-sigids dep-tagged-sigids)))))) @@ -1187,8 +1190,8 @@ (lambda (int/ext-name index ctc) (bound-identifier-mapping-put! def-table (car int/ext-name) - #`(check-not-undefined (vector-ref #,v #,index) - '#,(car int/ext-name))) + #`(check-not-unsafe-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/racket/unsafe/ops.rkt b/racket/collects/racket/unsafe/ops.rkt index 753f246287..c4ed47627b 100644 --- a/racket/collects/racket/unsafe/ops.rkt +++ b/racket/collects/racket/unsafe/ops.rkt @@ -3,7 +3,10 @@ '#%flfxnum '#%extfl) -(provide (all-from-out '#%unsafe) +(provide (except-out (all-from-out '#%unsafe) + unsafe-undefined + check-not-unsafe-undefined + prop:chaperone-unsafe-undefined) (prefix-out unsafe- (combine-out flsin flcos fltan flasin flacos flatan diff --git a/racket/collects/racket/unsafe/undefined.rkt b/racket/collects/racket/unsafe/undefined.rkt new file mode 100644 index 0000000000..94fc7e6746 --- /dev/null +++ b/racket/collects/racket/unsafe/undefined.rkt @@ -0,0 +1,9 @@ +#lang racket/base +(require '#%unsafe) + +(provide check-not-unsafe-undefined + unsafe-undefined + unsafe-undefined? + prop:chaperone-unsafe-undefined) + +(define (unsafe-undefined? v) (eq? v unsafe-undefined)) diff --git a/racket/src/racket/src/cstartup.inc b/racket/src/racket/src/cstartup.inc index 960baf2a3a..211e2f395b 100644 --- a/racket/src/racket/src/cstartup.inc +++ b/racket/src/racket/src/cstartup.inc @@ -1,5 +1,5 @@ { - 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, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,49,46,51,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, 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, @@ -22,58 +22,58 @@ 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,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,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, +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,6,248,22,145,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,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, +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,7, +248,22,145,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, -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, +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,5,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, 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,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, +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,11,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,11,248,22,82,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,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, +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, 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, @@ -100,7 +100,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 2051); } { - 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, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,48,46,49,46,51,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,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, +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, 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,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, +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, 92,91,63,93,92,92,92,92,85,78,67,92,92,92,92,34,86,95,28,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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 2,23,206,2,23,196,1,11,28,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,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, +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, 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,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, +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, 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,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, +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, 192,11,11,28,23,193,2,192,86,94,23,193,1,28,23,202,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,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, +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, 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,162,15,195, -27,249,22,180,15,197,200,28,28,248,22,175,15,193,10,248,22,174,15,193,192, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,91,195,249,22,4,22,162,15,196,11,12,250,22,178,11,2,7, +28,28,248,22,89,195,249,22,4,22,160,15,196,11,12,250,22,176,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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 27,248,80,144,38,55,39,249,80,144,40,52,37,37,80,144,40,8,44,39,27, -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, +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, 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,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, +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, 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,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, +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, 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, -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, +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, 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, +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,248,2,125,23,194,1,11,11,11,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, +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, 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,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,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,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,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, +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, 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,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, +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, 97,32,115,105,110,103,108,101,32,83,45,101,120,112,114,101,115,115,105,111,110, -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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 18,105,108,108,45,102,111,114,109,101,100,32,99,111,110,116,101,110,116,27,247, -22,140,2,27,90,144,39,11,89,146,39,36,11,248,22,183,15,23,201,2,192, +22,138,2,27,90,144,39,11,89,146,39,36,11,248,22,181,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,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, +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, 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,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, +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, 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,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, +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, +52,23,196,1,248,22,8,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,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, +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, 1,23,200,1,249,22,7,23,197,1,23,198,1,90,144,39,11,89,146,39,36, -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, +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, 1,249,22,7,23,197,1,23,196,1,90,144,39,11,89,146,39,36,11,248,22, -183,15,23,198,1,86,94,23,195,1,28,249,22,169,9,23,195,2,2,49,86, +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,198,1,249,80,144,45,8,31,39,194, -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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 205,2,36,23,204,1,23,203,1,249,23,206,1,23,204,1,23,202,1,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,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, +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, 203,1,23,207,1,23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22, -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, +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, 251,2,164,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,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, +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, 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,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, +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, 39,55,39,247,80,144,39,54,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,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, +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, 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,175,8,247,22,174,8,2,74,28,192,249,22,165,8,194,7,63, +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,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, +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, 144,80,144,39,43,37,26,9,80,144,48,44,37,249,22,33,11,80,144,50,43, -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, +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, 23,197,2,86,95,23,196,1,23,195,1,23,197,1,86,94,23,197,1,27,248, -22,139,16,2,56,27,250,80,144,42,40,39,23,197,1,11,11,27,248,22,141, +22,137,16,2,56,27,250,80,144,42,40,39,23,197,1,11,11,27,248,22,139, 4,23,199,1,27,28,23,194,2,23,194,1,86,94,23,194,1,36,27,248,22, -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, +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, 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,155,7,7,92,7,92,80,144,36,37,37,20,15,16,2,88,148,8,36, +249,22,153,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,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, +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, 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,142,2,80,144,36,8,25,37,20,15,16,2,248, +24,37,20,15,16,2,247,22,140,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,49,46,50,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,51,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,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, +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, 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,49,46,50,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,51,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,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, +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, 199,1,23,201,1,23,200,1,249,80,144,43,43,39,23,198,1,2,30,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, +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,199,1,23,201,1,23,200,1,249,80,144,43,43,39,23,198,1,2, -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, +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, 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, +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,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,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, +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, 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,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, +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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,129,5,248,22,104,23,197,2,27,248,22,113,23,195,2,20,13,144, +38,37,22,191,4,248,22,102,23,197,2,27,248,22,111,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, -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, +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, 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,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,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,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,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, +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, 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,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, +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, 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,134,4,248,22,84,196,248,22,84,206,193,11,11,11,11,86,94, +203,28,249,22,132,4,248,22,82,196,248,22,82,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,129,5,23,215,1,20,13,144,80,144,8, +22,33,11,80,144,8,31,38,37,22,191,4,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, -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, +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, 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,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, +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, 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,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, +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, 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,129,5,11,20,13,144,80,144, +39,37,249,22,33,11,80,144,8,32,38,37,22,191,4,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,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, +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, 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, -134,4,248,22,84,196,248,22,84,23,15,193,11,11,11,86,96,23,217,1,23, +132,4,248,22,82,196,248,22,82,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,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, +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, 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,129,5,23,217,1,20,13, +31,39,37,249,22,33,11,80,144,8,33,38,37,22,191,4,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,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, +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, 29,38,37,250,80,144,8,32,39,37,249,22,33,11,80,144,8,34,38,37,22, -129,5,28,23,224,35,0,0,0,2,28,23,202,1,11,23,196,2,86,94,23, +191,4,28,23,224,35,0,0,0,2,28,23,202,1,11,23,196,2,86,94,23, 202,1,11,20,13,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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,152,5,23,196,2,12,250,22,178,11,2,23, +144,38,51,38,86,96,28,248,22,150,5,23,196,2,12,250,22,176,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,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, +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, 115,112,97,99,101,63,41,23,199,2,28,24,193,2,248,24,194,1,23,196,2, -86,94,23,193,1,12,27,250,22,160,2,80,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 192,32,93,88,148,8,36,37,50,11,67,115,115,45,62,114,107,116,222,33,94, -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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,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, +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, 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,104,23,202,2,23,202,1,23,203,1,23,204,1,248,22,106, +24,199,1,248,22,102,23,202,2,23,202,1,23,203,1,23,204,1,248,22,104, 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,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, +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, 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,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, +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, 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,82,23,200,2,23,197,2,28,23,193,2,192,86,94,23,193,1, +48,39,249,22,80,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,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, +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, 94,23,193,1,90,144,39,11,89,146,38,36,11,249,80,144,47,54,39,248,22, -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, +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, 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,179,16,247,22,132,14,86,94,249,22,3,20,20,94,88,148,8,36,37, +248,22,177,16,247,22,130,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,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, +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, 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,191,4,80, -144,37,57,38,248,22,177,5,80,144,37,37,39,248,22,131,15,80,144,37,45, +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, 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,180,8,69,115,111,45,115,117,102,102,105,120,80,144,36,36,37,20,15, +248,22,178,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,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,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,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,78,80,144,36,50,37,20,15,16,2, +80,144,36,49,37,20,15,16,2,247,22,76,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,49,46,50,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,51,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 37d00c7cfd..5c0e178499 100644 --- a/racket/src/racket/src/env.c +++ b/racket/src/racket/src/env.c @@ -328,6 +328,7 @@ static void init_unsafe(Scheme_Env *env) scheme_init_unsafe_numcomp(unsafe_env); scheme_init_unsafe_list(unsafe_env); scheme_init_unsafe_vector(unsafe_env); + scheme_init_unsafe_fun(unsafe_env); scheme_init_extfl_unsafe_number(unsafe_env); scheme_init_extfl_unsafe_numarith(unsafe_env); diff --git a/racket/src/racket/src/fun.c b/racket/src/racket/src/fun.c index 8eb4d06086..6f55a768ea 100644 --- a/racket/src/racket/src/fun.c +++ b/racket/src/racket/src/fun.c @@ -93,6 +93,7 @@ READ_ONLY Scheme_Object *scheme_reduced_procedure_struct; READ_ONLY Scheme_Object *scheme_tail_call_waiting; READ_ONLY Scheme_Object *scheme_inferred_name_symbol; READ_ONLY Scheme_Object *scheme_default_prompt_tag; +READ_ONLY Scheme_Object *scheme_chaperone_undefined_property; /* READ ONLY SHARABLE GLOBALS */ @@ -190,6 +191,7 @@ static Scheme_Object *current_prompt_read(int, Scheme_Object **); static Scheme_Object *current_read(int, Scheme_Object **); static Scheme_Object *current_get_read_input_port(int, Scheme_Object **); +static Scheme_Object *chaperone_not_undefined (int argc, Scheme_Object *argv[]); static Scheme_Object *chaperone_wrap_cc_guard(Scheme_Object *obj, Scheme_Object *proc); static Scheme_Object *do_cc_guard(Scheme_Object *v, Scheme_Object *cc_guard, Scheme_Object *chaperone); @@ -491,16 +493,6 @@ 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_proc); - o = scheme_make_prim_w_arity(scheme_check_not_undefined, "check-not-undefined", 2, 2); - scheme_check_not_undefined_proc = o; - SCHEME_PRIM_PROC_FLAGS(o) |= scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_BINARY_INLINED); - scheme_add_global_constant("check-not-undefined", o, 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, @@ -677,6 +669,25 @@ scheme_init_fun (Scheme_Env *env) original_default_prompt->tag = scheme_default_prompt_tag; } +void +scheme_init_unsafe_fun (Scheme_Env *env) +{ + Scheme_Object *o, *a[1]; + + REGISTER_SO(scheme_check_not_undefined_proc); + o = scheme_make_prim_w_arity(scheme_check_not_undefined, "check-not-unsafe-undefined", 2, 2); + scheme_check_not_undefined_proc = o; + SCHEME_PRIM_PROC_FLAGS(o) |= scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_BINARY_INLINED); + scheme_add_global_constant("check-not-unsafe-undefined", o, env); + + scheme_add_global_constant("unsafe-undefined", scheme_undefined, env); + + REGISTER_SO(scheme_chaperone_undefined_property); + o = scheme_make_struct_type_property(scheme_intern_symbol("chaperone-unsafe-undefined")); + scheme_chaperone_undefined_property = o; + scheme_add_global_constant("prop:chaperone-unsafe-undefined", o, env); +} + void scheme_init_fun_places() { @@ -2538,7 +2549,7 @@ Scheme_Object * scheme_check_not_undefined (int argc, Scheme_Object *argv[]) { if (!SCHEME_SYMBOLP(argv[1])) - scheme_wrong_contract("check-not-undefined", "symbol?", 1, argc, argv); + scheme_wrong_contract("check-not-unsafe-undefined", "symbol?", 1, argc, argv); if (SAME_OBJ(argv[0], scheme_undefined)) { scheme_raise_exn(MZEXN_FAIL_CONTRACT_VARIABLE, @@ -2550,6 +2561,11 @@ scheme_check_not_undefined (int argc, Scheme_Object *argv[]) return argv[0]; } +Scheme_Object * +chaperone_not_undefined (int argc, Scheme_Object *argv[]) +{ + return scheme_chaperone_not_undefined(argv[0]); +} static Scheme_Object * procedure_p (int argc, Scheme_Object *argv[]) diff --git a/racket/src/racket/src/jitinline.c b/racket/src/racket/src/jitinline.c index cbcd3d2d7d..3320094521 100644 --- a/racket/src/racket/src/jitinline.c +++ b/racket/src/racket/src/jitinline.c @@ -3527,11 +3527,11 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i jit_movr_p(dest, JIT_R0); return 1; - } else if (IS_NAMED_PRIM(rator, "check-not-undefined")) { + } else if (IS_NAMED_PRIM(rator, "check-not-unsafe-undefined")) { if (SCHEME_SYMBOLP(app->rand2)) { GC_CAN_IGNORE jit_insn *ref, *ref2; - LOG_IT(("inlined check-not-undefined\n")); + LOG_IT(("inlined check-not-unsafe-undefined\n")); mz_runstack_skipped(jitter, 2); scheme_generate_non_tail(app->rand1, jitter, 0, 1, 0); /* no sync... */ diff --git a/racket/src/racket/src/schminc.h b/racket/src/racket/src/schminc.h index 2dd81674fa..c81b3f37f1 100644 --- a/racket/src/racket/src/schminc.h +++ b/racket/src/racket/src/schminc.h @@ -14,8 +14,8 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 1118 -#define EXPECTED_UNSAFE_COUNT 101 +#define EXPECTED_PRIM_COUNT 1116 +#define EXPECTED_UNSAFE_COUNT 104 #define EXPECTED_FLFXNUM_COUNT 69 #define EXPECTED_EXTFL_COUNT 45 #define EXPECTED_FUTURES_COUNT 15 diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index 5f560321b3..2e5310b3a3 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -308,6 +308,7 @@ void scheme_init_promise(Scheme_Env *env); void scheme_init_struct(Scheme_Env *env); void scheme_init_reduced_proc_struct(Scheme_Env *env); void scheme_init_fun(Scheme_Env *env); +void scheme_init_unsafe_fun(Scheme_Env *env); void scheme_init_compile(Scheme_Env *env); void scheme_init_symbol(Scheme_Env *env); void scheme_init_char(Scheme_Env *env); @@ -527,6 +528,8 @@ extern Scheme_Object *scheme_app_mark_impersonator_property; extern Scheme_Object *scheme_no_arity_property; +extern Scheme_Object *scheme_chaperone_undefined_property; + extern Scheme_Object *scheme_reduced_procedure_struct; /* recycle some constants that can't appear in code: */ @@ -1003,6 +1006,8 @@ Scheme_Object *scheme_chaperone_hash_get(Scheme_Object *table, Scheme_Object *ke Scheme_Object *scheme_chaperone_hash_traversal_get(Scheme_Object *table, Scheme_Object *key, Scheme_Object **alt_key); void scheme_chaperone_hash_set(Scheme_Object *table, Scheme_Object *key, Scheme_Object *val); +Scheme_Object *scheme_chaperone_not_undefined(Scheme_Object *orig_val); + /*========================================================================*/ /* syntax objects */ /*========================================================================*/ diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index 97ddbb1253..6d61210357 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.2" +#define MZSCHEME_VERSION "6.0.1.3" #define MZSCHEME_VERSION_X 6 #define MZSCHEME_VERSION_Y 0 #define MZSCHEME_VERSION_Z 1 -#define MZSCHEME_VERSION_W 2 +#define MZSCHEME_VERSION_W 3 #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/struct.c b/racket/src/racket/src/struct.c index 5c7861e52d..cd24ec6c85 100644 --- a/racket/src/racket/src/struct.c +++ b/racket/src/racket/src/struct.c @@ -2002,7 +2002,38 @@ static Scheme_Object *chaperone_struct_ref(const char *who, Scheme_Object *o, in Scheme_Chaperone *px = (Scheme_Chaperone *)o; Scheme_Object *a[2], *red, *orig; - if (!SCHEME_VECTORP(px->redirects) + if (SCHEME_VECTORP(px->redirects) + && !(SCHEME_VEC_SIZE(px->redirects) & 1) + && SAME_OBJ(SCHEME_VEC_ELS(px->redirects)[1], scheme_undefined)) { + /* chaperone on every field: check that result is not undefined */ + o = px->prev; + + if (!SCHEME_CHAPERONEP(o)) + orig = ((Scheme_Structure *)o)->slots[i]; + else + orig = chaperone_struct_ref(who, o, i); + + if (SAME_OBJ(orig, scheme_undefined)) { + int len; + o = scheme_struct_type_property_ref(scheme_chaperone_undefined_property, px->val); + len = (o ? scheme_proper_list_length(o) : 0); + if (i < len) { + for (i = len - i; --i; ) { + o = SCHEME_CDR(o); + } + o = SCHEME_CAR(o); + scheme_raise_exn(MZEXN_FAIL_CONTRACT_VARIABLE, + o, + "%S: field used before its initialization", + o); + } else { + scheme_raise_exn(MZEXN_FAIL_CONTRACT, + "field used before its initialization"); + } + } + + return orig; + } else if (!SCHEME_VECTORP(px->redirects) || (SCHEME_VEC_SIZE(px->redirects) & 1) || SCHEME_FALSEP(SCHEME_VEC_ELS(px->redirects)[PRE_REDIRECTS + i])) { o = px->prev; @@ -2065,7 +2096,8 @@ static void chaperone_struct_set(const char *who, Scheme_Object *o, int i, Schem o = px->prev; if (SCHEME_VECTORP(px->redirects) - && !(SCHEME_VEC_SIZE(px->redirects) & 1)) { + && !(SCHEME_VEC_SIZE(px->redirects) & 1) + && !SAME_OBJ(SCHEME_VEC_ELS(px->redirects)[1], scheme_undefined)) { half = (SCHEME_VEC_SIZE(px->redirects) - PRE_REDIRECTS) >> 1; red = SCHEME_VEC_ELS(px->redirects)[PRE_REDIRECTS + half + i]; if (SCHEME_TRUEP(red)) { @@ -2102,7 +2134,8 @@ void scheme_struct_set(Scheme_Object *sv, int pos, Scheme_Object *v) } } -static Scheme_Object **apply_guards(Scheme_Struct_Type *stype, int argc, Scheme_Object **args) +static Scheme_Object **apply_guards(Scheme_Struct_Type *stype, int argc, Scheme_Object **args, + int *_chaperone_undefined) { Scheme_Object **guard_argv = NULL, *v, *prev_guards = NULL, *guard; int p, gcount; @@ -2131,7 +2164,9 @@ static Scheme_Object **apply_guards(Scheme_Struct_Type *stype, int argc, Scheme_ guard = scheme_false; } - if (!SCHEME_FALSEP(guard)) { + if (SAME_OBJ(guard, scheme_undefined)) + *_chaperone_undefined = 1; + else if (!SCHEME_FALSEP(guard)) { gcount = stype->parent_types[p]->num_islots; guard_argv[argc] = guard_argv[gcount]; guard_argv[gcount] = stype->name; @@ -2173,6 +2208,7 @@ scheme_make_struct_instance(Scheme_Object *_stype, int argc, Scheme_Object **arg Scheme_Structure *inst; Scheme_Struct_Type *stype; int p, i, j, nis, ns, c; + int chaperone_undefined = 0; stype = (Scheme_Struct_Type *)_stype; @@ -2185,7 +2221,7 @@ scheme_make_struct_instance(Scheme_Object *_stype, int argc, Scheme_Object **arg inst->stype = stype; /* Apply guards, if any: */ - args = apply_guards(stype, argc, args); + args = apply_guards(stype, argc, args, &chaperone_undefined); /* Fill in fields: */ j = c; @@ -2212,8 +2248,11 @@ scheme_make_struct_instance(Scheme_Object *_stype, int argc, Scheme_Object **arg inst->slots[--j] = args[--i]; } } - - return (Scheme_Object *)inst; + + if (chaperone_undefined) + return scheme_chaperone_not_undefined((Scheme_Object *)inst); + else + return (Scheme_Object *)inst; } Scheme_Object *scheme_make_blank_prefab_struct_instance(Scheme_Struct_Type *stype) @@ -2609,7 +2648,7 @@ static Scheme_Object *struct_info_chaperone(Scheme_Object *o, Scheme_Object *si, if (SCHEME_VECTORP(px->redirects) && !(SCHEME_VEC_SIZE(px->redirects) & 1)) { proc = SCHEME_VEC_ELS(px->redirects)[1]; - if (SCHEME_TRUEP(proc)) { + if (SCHEME_TRUEP(proc) && !SAME_OBJ(proc, scheme_undefined)) { if (SCHEME_CHAPERONE_FLAGS(px) & SCHEME_CHAPERONE_IS_IMPERSONATOR) proc = scheme_box(proc); procs = scheme_make_pair(proc, procs); @@ -4289,7 +4328,7 @@ static Scheme_Object *_make_struct_type(Scheme_Object *base, Scheme_Object *guard) { Scheme_Struct_Type *struct_type, *parent_type; - int j, depth, checked_proc = 0; + int j, depth, checked_proc = 0, chaperone_undefined = 0; if (parent && SCHEME_NP_CHAPERONEP(parent)) parent_type = (Scheme_Struct_Type *)SCHEME_CHAPERONE_VAL(parent); @@ -4432,6 +4471,8 @@ static Scheme_Object *_make_struct_type(Scheme_Object *base, if (SAME_OBJ(prop, scheme_checked_proc_property)) checked_proc = 1; + if (SAME_OBJ(prop, scheme_chaperone_undefined_property)) + chaperone_undefined = 1; propv = guard_property(prop, SCHEME_CDR(a), struct_type); @@ -4489,6 +4530,8 @@ static Scheme_Object *_make_struct_type(Scheme_Object *base, if (SAME_OBJ(prop, scheme_checked_proc_property)) checked_proc = 1; + if (SAME_OBJ(prop, scheme_chaperone_undefined_property)) + chaperone_undefined = 1; propv = guard_property(prop, SCHEME_CDR(a), struct_type); @@ -4554,6 +4597,8 @@ static Scheme_Object *_make_struct_type(Scheme_Object *base, } struct_type->guard = guard; + } else if (chaperone_undefined) { + struct_type->guard = scheme_undefined; } if (parent && SCHEME_NP_CHAPERONEP(parent)) { @@ -5666,6 +5711,40 @@ static Scheme_Object *impersonate_struct(int argc, Scheme_Object **argv) return do_chaperone_struct("impersonate-struct", 1, argc, argv); } + +Scheme_Object *scheme_chaperone_not_undefined (Scheme_Object *orig_val) +{ + Scheme_Chaperone *px; + Scheme_Object *val, *redirects; + Scheme_Hash_Tree *props; + + val = orig_val; + + if (SCHEME_CHAPERONEP(val)) { + props = ((Scheme_Chaperone *)val)->props; + val = SCHEME_CHAPERONE_VAL(val); + } else + props = NULL; + + redirects = scheme_make_vector(PRE_REDIRECTS, scheme_false); + + SCHEME_VEC_ELS(redirects)[0] = scheme_false; + SCHEME_VEC_ELS(redirects)[1] = scheme_undefined; /* special handing in struct_ref */ + + px = MALLOC_ONE_TAGGED(Scheme_Chaperone); + if (SCHEME_PROCP(val)) + px->iso.so.type = scheme_proc_chaperone_type; + else + px->iso.so.type = scheme_chaperone_type; + px->val = val; + px->prev = orig_val; + px->props = props; + px->redirects = redirects; + + return (Scheme_Object *)px; +} + + static Scheme_Object *do_chaperone_struct_type(const char *name, int is_impersonator, int argc, Scheme_Object **argv) { Scheme_Chaperone *px; diff --git a/racket/src/racket/src/type.c b/racket/src/racket/src/type.c index ae0868fb18..ef05c325f4 100644 --- a/racket/src/racket/src/type.c +++ b/racket/src/racket/src/type.c @@ -163,7 +163,7 @@ scheme_init_type () set_name(scheme_double_type, ""); set_name(scheme_long_double_type, ""); set_name(scheme_float_type, ""); - set_name(scheme_undefined_type, ""); + set_name(scheme_undefined_type, ""); set_name(scheme_eof_type, ""); set_name(scheme_input_port_type, ""); set_name(scheme_output_port_type, "");