diff --git a/pkgs/base/info.rkt b/pkgs/base/info.rkt index 6c64727430..3d07d0be13 100644 --- a/pkgs/base/info.rkt +++ b/pkgs/base/info.rkt @@ -12,7 +12,7 @@ (define collection 'multi) -(define version "6.4.0.1") +(define version "6.4.0.4") (define deps `("racket-lib" ["racket" #:version ,version])) diff --git a/pkgs/racket-doc/scribblings/raco/setup.scrbl b/pkgs/racket-doc/scribblings/raco/setup.scrbl index b351eeb35a..a48b3fa240 100644 --- a/pkgs/racket-doc/scribblings/raco/setup.scrbl +++ b/pkgs/racket-doc/scribblings/raco/setup.scrbl @@ -366,8 +366,8 @@ Optional @filepath{info.rkt} fields trigger additional actions by (list src-string flags category name out-k) (list src-string flags category name out-k order-n)] [flags (list mode-symbol ...)] - [category (list category-symbol) - (list category-symbol sort-number)] + [category (list category-string-or-symbol) + (list category-string-or-symbol sort-number)] [name string #f] ] @@ -542,7 +542,10 @@ Optional @filepath{info.rkt} fields trigger additional actions by source file need not be present. Moving documentation into place may require no movement at all, depending on the way that the enclosing collection is installed, but movement includes adding a - @filepath{synced.rktd} file to represent the installation.} + @filepath{synced.rktd} file to represent the installation. + + @history[#:changed "6.4" @elem{Allow a category to be a string + instead of a symbol.}]} @item{@as-index{@racketidfont{release-note-files}} : @racket[(listof (cons/c string? (cons/c string? list?)))] --- A list of release-notes text files to link from the main documentation pages. diff --git a/pkgs/racket-doc/scribblings/reference/chaperones.scrbl b/pkgs/racket-doc/scribblings/reference/chaperones.scrbl index 432ecf9e4c..ea0defac8a 100644 --- a/pkgs/racket-doc/scribblings/reference/chaperones.scrbl +++ b/pkgs/racket-doc/scribblings/reference/chaperones.scrbl @@ -783,7 +783,6 @@ or structure type. #:changed "6.1.1.8" @elem{Added optional @racket[struct-type] argument.}]} - @defproc[(chaperone-vector [vec vector?] [ref-proc (vector? exact-nonnegative-integer? any/c . -> . any/c)] [set-proc (vector? exact-nonnegative-integer? any/c . -> . any/c)] diff --git a/pkgs/racket-doc/scribblings/reference/procedures.scrbl b/pkgs/racket-doc/scribblings/reference/procedures.scrbl index 8e784b4852..65d1dabd5d 100644 --- a/pkgs/racket-doc/scribblings/reference/procedures.scrbl +++ b/pkgs/racket-doc/scribblings/reference/procedures.scrbl @@ -230,6 +230,26 @@ list is also in the second list. (procedure-keywords (lambda (#:tag t #:mode [m #f]) t)) ]} +@defproc[(procedure-result-arity [proc procedure?]) (or/c #f procedure-arity?)]{ + Returns the arity of the result of the procedure @racket[proc] or + @racket[#f] if the number of results are not known, perhaps due to shortcomings + in the implementation of @racket[procedure-result-arity] or + because @racket[proc]'s behavior is not sufficiently simple. + + @mz-examples[(procedure-result-arity car) + (procedure-result-arity values) + (procedure-result-arity + (λ (x) + (apply + values + (let loop () + (cond + [(zero? (random 10)) '()] + [else (cons 1 (loop))])))))] + + @history[#:added "6.4.0.3"] +} + @defproc[(make-keyword-procedure [proc (((listof keyword?) list?) () #:rest list? . ->* . any)] [plain-proc procedure? (lambda args (apply proc null null args))]) diff --git a/pkgs/racket-doc/scribblings/reference/unsafe.scrbl b/pkgs/racket-doc/scribblings/reference/unsafe.scrbl index 3ff37c1bf7..55d48a3453 100644 --- a/pkgs/racket-doc/scribblings/reference/unsafe.scrbl +++ b/pkgs/racket-doc/scribblings/reference/unsafe.scrbl @@ -434,4 +434,91 @@ fixnum).} @; ------------------------------------------------------------------------ +@section{Unsafe Impersonators and Chaperones} + +@defproc[(unsafe-impersonate-procedure [proc procedure?] + [replacement-proc procedure?] + [prop impersonator-property?] + [prop-val any] ... ...) + (and/c procedure? impersonator?)]{ + Like @racket[impersonate-procedure], except it assumes that @racket[replacement-proc] + is already properly wrapping @racket[proc] and so when the procedure that + @racket[unsafe-impersonate-procedure] produces is invoked, the + @racket[replacement-proc] is invoked directly, ignoring @racket[proc]. + + In addition, it does not specially handle @racket[impersonator-prop:application-mark], + instead just treating it as an ordinary property if it is supplied as one of the + @racket[prop] arguments. + + This procedure is unsafe only in how it assumes @racket[replacement-proc] is + a proper wrapper for @racket[proc]. It otherwise does all of the checking + that @racket[impersonate-procedure] does. + + As an example, this function: + @racketblock[(λ (f) + (unsafe-impersonate-procedure + f + (λ (x) + (if (number? x) + (error 'no-numbers!) + (f x)))))] + is equivalent to this one: + @racketblock[(λ (f) + (impersonate-procedure + f + (λ (x) + (if (number? x) + (error 'no-numbers!) + x))))] + (except that some error messages start with @litchar{unsafe-impersonate-procedure} + instead of @litchar{impersonate-procedure}). + + Similarly the two procedures @racket[_wrap-f1] and + @racket[_wrap-f2] are almost equivalent; they differ only + in the error message produced when their arguments are + functions that return multiple values (and that they update + different global variables). The version using @racket[unsafe-impersonate-procedure] + will signal an error in the @racket[let] expression about multiple + value return, whereas the one using @racket[impersonate-procedure] signals + an error from @racket[impersonate-procedure] about multiple value return. + @racketblock[(define log1-args '()) + (define log1-results '()) + (define wrap-f1 + (λ (f) + (impersonate-procedure + f + (λ (arg) + (set! log1-args (cons arg log1-args)) + (values (λ (res) + (set! log1-results (cons res log1-results)) + res) + arg))))) + + (define log2-args '()) + (define log2-results '()) + (define wrap-f2 + (λ (f) + (unsafe-impersonate-procedure + f + (λ (arg) + (set! log2-args (cons arg log2-args)) + (let ([res (f arg)]) + (set! log2-results (cons res log2-results)) + res)))))] + + @history[#:added "6.4.0.4"] +} + + +@defproc[(unsafe-chaperone-procedure [proc procedure?] + [wrapper-proc procedure?] + [prop impersonator-property?] + [prop-val any] ... ...) + (and/c procedure? chaperone?)]{ + Like @racket[unsafe-impersonate-procedure], but creates a @tech{chaperone}. + @history[#:added "6.4.0.4"] +} + +@; ------------------------------------------------------------------------ + @include-section["unsafe-undefined.scrbl"] diff --git a/pkgs/racket-test-core/tests/racket/chaperone.rktl b/pkgs/racket-test-core/tests/racket/chaperone.rktl index 8275f6468e..fe076c9fa2 100644 --- a/pkgs/racket-test-core/tests/racket/chaperone.rktl +++ b/pkgs/racket-test-core/tests/racket/chaperone.rktl @@ -3,6 +3,10 @@ (load-relative "loadtest.rktl") (Section 'chaperones) +(require (only-in racket/unsafe/ops + unsafe-impersonate-procedure + unsafe-chaperone-procedure)) + ;; ---------------------------------------- (define (chaperone-of?/impersonator a b) @@ -2310,6 +2314,80 @@ ;; ---------------------------------------- +(let () + (define (f x) (+ x 1)) + (define f2 (unsafe-chaperone-procedure f f)) + (test 2 f2 1) + (test #t chaperone-of? f2 f) + (test #f chaperone-of? f f2) + + (define f3 (unsafe-chaperone-procedure f sub1)) + (define f3i (unsafe-impersonate-procedure f sub1)) + (test 0 f3 1) + (test 0 f3i 1) + (test #t chaperone-of? f3 f) + (test #f chaperone-of? f3i f) + (test #f chaperone-of? f3 f2) + (test #f chaperone-of? f2 f3) + + (test #f chaperone-of? + (unsafe-chaperone-procedure f f) + (unsafe-chaperone-procedure f f)) + + (define-values (prop:p prop:p? prop:get-p) + (make-impersonator-property 'p)) + (test #t prop:p? (unsafe-chaperone-procedure f f prop:p 5)) + (test 5 prop:get-p (unsafe-chaperone-procedure f f prop:p 5)) + + (define f4 (unsafe-chaperone-procedure f (case-lambda + [(x) (f x)] + [(x y) (f x)]))) + (test 2 f4 1) + + (test 1 + procedure-arity + (unsafe-chaperone-procedure (λ (x) (+ x 1)) + (case-lambda + [(x) (+ x 1)] + [(x y) (+ x y)]))) + + (define f5 (unsafe-chaperone-procedure f (λ (x #:y [y 1]) (f x)))) + (test 2 f5 1) + + (err/rt-test (unsafe-chaperone-procedure + (λ (#:x x) x) + (λ (#:y y) y)) + exn:fail?) + + (let () + + (define (f-marks) + (continuation-mark-set->list + (current-continuation-marks) + 'mark-key)) + + (define f-marks-chap + (unsafe-chaperone-procedure + f-marks + f-marks + impersonator-prop:application-mark + (cons 'x 123))) + ;; test that impersonator-prop:application-mark + ;; is ignored (as the docs say it is). + (test '() f-marks-chap)) + + (let () + (struct s (f) #:property prop:procedure 0) + (test #t s? (unsafe-chaperone-procedure (s add1) (λ (x) x))))) + +;; Check name in arity error message: +(let () + (define (pf x) x) + (define cf (unsafe-chaperone-procedure pf (lambda (x) x))) + (err/rt-test (cf) (λ (x) (regexp-match #rx"^pf:" (exn-message x))))) + +;; ---------------------------------------- + (let () (struct s ([a #:mutable])) (err/rt-test (impersonate-struct 5 set-s-a! (lambda (a b) b))) @@ -2331,4 +2409,38 @@ ;; ---------------------------------------- +(let () + (define-values (->-c has-->c? get-->-c) + (make-impersonator-property '->-c)) + + (define-values (->-w has-->w? get-->-w) + (make-impersonator-property '->-w)) + + (define-values (prop:x x? x-ref) + (make-impersonator-property 'x)) + + (define (wrap-again function) + (chaperone-procedure* + function + #f + ->-w void + ->-c void)) + + (define (do-wrap f) + (chaperone-procedure* f + (λ (chap arg) + (test #t has-->w? chap) + (test #t has-->c? chap) + arg + (values (lambda (result) result) arg)))) + + (define wrapped-f (wrap-again (do-wrap (lambda (x) (+ x 1))))) + (define wrapped2-f (wrap-again (chaperone-procedure (do-wrap (lambda (x) (+ x 1))) #f prop:x 'x))) + (define (test-wrapped x) (x 19)) + (set! test-wrapped test-wrapped) + (test-wrapped wrapped-f) + (test-wrapped wrapped2-f)) + +;; ---------------------------------------- + (report-errs) diff --git a/pkgs/racket-test-core/tests/racket/for.rktl b/pkgs/racket-test-core/tests/racket/for.rktl index 98eec00217..ec943ccbe7 100644 --- a/pkgs/racket-test-core/tests/racket/for.rktl +++ b/pkgs/racket-test-core/tests/racket/for.rktl @@ -436,10 +436,18 @@ (err/rt-test (for*/fold () ([x '(1 2)]) x) exn:fail:contract:arity?) ;; for/fold result-arity checking: -(err/rt-test (begin (for/fold () ([i (in-range 10)]) 1) 1) #rx".*expected number of values not received.*") -(err/rt-test (begin (for/fold () () 1) 1) #rx".*expected number of values not received.*") -(err/rt-test (begin (for/fold ([x 1]) () (values 1 2)) 1) #rx".*expected number of values not received.*") -(err/rt-test (begin (for/fold ([x 1] [y 2]) ([i (in-range 10)]) 1) 1) #rx".*expected number of values not received.*") +(err/rt-test (begin (for/fold () ([i (in-range 10)]) 1) 1) + exn:fail:contract:arity? + #rx".*expected number of values not received.*") +(err/rt-test (begin (for/fold () () 1) 1) + exn:fail:contract:arity? + #rx".*expected number of values not received.*") +(err/rt-test (begin (for/fold ([x 1]) () (values 1 2)) 1) + exn:fail:contract:arity? + #rx".*expected number of values not received.*") +(err/rt-test (begin (for/fold ([x 1] [y 2]) ([i (in-range 10)]) 1) 1) + exn:fail:contract:arity? + #rx".*expected number of values not received.*") (test 1 'one (begin (for/fold () () (values)) 1)) ;; for/fold syntax checking diff --git a/pkgs/racket-test-core/tests/racket/function.rktl b/pkgs/racket-test-core/tests/racket/function.rktl index ba2be7ccd0..4175b3b284 100644 --- a/pkgs/racket-test-core/tests/racket/function.rktl +++ b/pkgs/racket-test-core/tests/racket/function.rktl @@ -106,6 +106,49 @@ (arity-test compose1 0 -1) (arity-test compose 0 -1)) +;; ---------- procedure-result-arity ---------- + +(test 1 procedure-result-arity car) +(test 1 procedure-result-arity list) +(test (arity-at-least 0) procedure-result-arity values) +(test (arity-at-least 0) procedure-result-arity call/cc) +(let () + (struct s (x)) + (test 1 procedure-result-arity s-x) + (test 1 procedure-result-arity s?) + (test 1 procedure-result-arity s)) +(test 1 procedure-result-arity (λ (x) 0)) +(test 1 procedure-result-arity (let ([f 1]) (λ (x) (+ f x)))) +(test #f procedure-result-arity + (λ () + (if (= 0 (random 1)) + 1 + (values 1 2)))) +(err/rt-test (procedure-result-arity 1) exn:fail?) +(test 1 procedure-result-arity (chaperone-procedure car values)) +(test 1 procedure-result-arity (impersonate-procedure car (λ (x) 1))) +(test #f procedure-result-arity (λ (x) (values x x))) +(test 1 procedure-result-arity (parameterize ([eval-jit-enabled #f]) + (eval '(λ (x) x)))) +(test 1 procedure-result-arity (parameterize ([eval-jit-enabled #f]) + (eval '(case-lambda + [(x) x] + [(x y) x] + [(a b c d e f) a] + [(a b . whatever) a])))) +(test #f procedure-result-arity (parameterize ([eval-jit-enabled #f]) + (eval '(case-lambda + [(x) x] + [(x y) (values x y)] + [(a b c d e f) (values 1 2 3 4 5 6 7 8)] + [(a b . whatever) a])))) + +;; hopefully this test will start failing at +;; some point and return 1 instead of #f +(let () + (struct s (f) #:property prop:procedure 0) + (test #f procedure-result-arity (s car))) + ;; ---------- identity ---------- (let () (test 'foo identity 'foo) diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index df465a98f8..70063734de 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -5111,6 +5111,15 @@ (set! f f) (test 12 ((f 10) 1))) +(let () + (define (f) + (procedure-specialize + (lambda () + #'x))) + (set! f f) + (test #t syntax? ((f))) + (test 'x syntax-e ((f)))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/pkgs/racket-test-core/tests/racket/testing.rktl b/pkgs/racket-test-core/tests/racket/testing.rktl index 671cbc0314..2ff4c84f06 100644 --- a/pkgs/racket-test-core/tests/racket/testing.rktl +++ b/pkgs/racket-test-core/tests/racket/testing.rktl @@ -216,6 +216,14 @@ transcript. [(_ e exn?) (syntax (thunk-error-test (err:mz:lambda () e) (quote-syntax e) exn?))] + [(_ e exn? msg-rx) + (regexp? (syntax-e #'msg-rx)) + #'(thunk-error-test + (err:mz:lambda () e) + (quote-syntax e) + (lambda (exn) + (and (exn? exn) + (regexp-match? msg-rx (exn-message exn)))))] [(_ e) (syntax (err/rt-test e exn:application:type?))]))) diff --git a/pkgs/racket-test/tests/match/examples.rkt b/pkgs/racket-test/tests/match/examples.rkt index 22cbee956e..d5eff15695 100644 --- a/pkgs/racket-test/tests/match/examples.rkt +++ b/pkgs/racket-test/tests/match/examples.rkt @@ -736,12 +736,12 @@ (failure-cont) 0)] [_ 1])) - + (comp 0 (match (cons 1 2) [(cons a b) #:when (= a b) 1] [_ 0])) - + (comp 1 (match (cons 1 1) [(cons a b) #:when (= a b) 1] @@ -772,7 +772,7 @@ [`(,(? L4e?) ...) #t] [(? L3v?) #t] [_ #f])) - + (define (is-biop? sym) (or (is-aop? sym) (is-cmp? sym))) (define (is-aop? sym) (memq sym '(+ - *))) (define (is-cmp? sym) (memq sym '(< <= =))) @@ -794,7 +794,7 @@ (apply max (hash-values ht))))) (check-true (car v)) (check < (cadr v) 50)) - + (test-case "syntax-local-match-introduce" (define-match-expander foo (lambda (stx) (syntax-local-match-introduce #'x))) @@ -809,5 +809,22 @@ [(and x (? (λ _ (set-box! b #f))) (app unbox #f)) 'yes] [_ 'no]) 'yes)) - + + (test-case "match-expander rename transformer" + (define-match-expander foo + (lambda (stx) (syntax-case stx () [(_ a) #'a])) + (make-rename-transformer #'values)) + + (check-equal? (foo 2) 2)) + + (test-case "match-expander rename transformer set!" + (define x 1) + (define-match-expander foo + (lambda (stx) (syntax-case stx () [(_ a) #'a])) + (make-rename-transformer #'x)) + + (set! foo 2) + (check-equal? x 2)) + + )) diff --git a/pkgs/racket-test/tests/racket/contract/arrow.rkt b/pkgs/racket-test/tests/racket/contract/arrow.rkt index c5ecff1614..f5b87900b9 100644 --- a/pkgs/racket-test/tests/racket/contract/arrow.rkt +++ b/pkgs/racket-test/tests/racket/contract/arrow.rkt @@ -487,5 +487,23 @@ 'dynamic->*8 '((contract (dynamic->* #:range-contracts #f) (λ () 1) 'pos 'neg)) 1) + + (test/spec-passed + 'dynamic->*9 + '(begin + ((contract (dynamic->* #:range-contracts (list (or/c 1 2) (or/c 3 4))) + (λ () (values 1 3)) + 'pos + 'neg)) + (void))) + + (test/pos-blame + 'dynamic->*10 + '(begin + ((contract (dynamic->* #:range-contracts (list (or/c 1 2) (or/c 3 4))) + (λ () (values #f #f)) + 'pos + 'neg)) + (void))) ) diff --git a/pkgs/racket-test/tests/racket/contract/prof.rkt b/pkgs/racket-test/tests/racket/contract/prof.rkt index 7e19329674..9d669c32f3 100644 --- a/pkgs/racket-test/tests/racket/contract/prof.rkt +++ b/pkgs/racket-test/tests/racket/contract/prof.rkt @@ -43,35 +43,35 @@ (contract-eval '(require 'prof-fun)) (test/spec-passed - 'provide/contract1 + 'contract-marks1 '((contract (-> neg-blame? any/c) (λ (x) x) 'pos 'neg) 1)) (test/spec-passed - 'provide/contract2 + 'contract-marks2 '((contract (-> any/c pos-blame?) (λ (x) x) 'pos 'neg) 1)) (test/spec-passed - 'provide/contract3 + 'contract-marks3 '(contract (vector/c pos-blame?) (vector 1) 'pos 'neg)) (test/spec-passed - 'provide/contract4 + 'contract-marks4 '((contract (parameter/c pos-blame?) (make-parameter #f) 'pos 'neg))) (test/spec-passed - 'provide/contract5 + 'contract-marks5 '(contract (unconstrained-domain-> pos-blame?) (λ () 1) 'pos 'neg)) (test/spec-passed - 'provide/contract6 + 'contract-marks6 '(contract (->* () #:pre neg-blame? any) (λ () 1) 'pos 'neg)) (test/spec-passed - 'provide/contract7 + 'contract-marks7 '(contract (->* () any/c #:post pos-blame?) (λ () 1) 'pos 'neg)) (test/spec-passed/result - 'provide/contract8 + 'contract-marks8 '(let () (eval '(module prof1 racket/base (require racket/contract 'prof-fun) @@ -85,7 +85,7 @@ 11) (test/spec-passed/result - 'provide/contract9 + 'contract-marks9 '(let () (eval '(module prof2 racket/base (require racket/contract 'prof-fun) @@ -98,7 +98,7 @@ 11) (test/spec-passed/result - 'provide/contract10 + 'contract-marks10 '(let () (eval '(module prof3 racket/base (require racket/contract 'prof-fun) @@ -111,21 +111,21 @@ 11) (test/spec-passed - 'provide/contract11 + 'contract-marks11 '(let () (struct posn (x y)) ((contract (-> (struct/dc posn [x neg-blame?]) any/c) (λ (x) x) 'pos 'neg) (posn 1 2)))) (test/spec-passed - 'provide/contract12 + 'contract-marks12 '(let () (struct posn (x y)) ((contract (-> any/c (struct/dc posn [x pos-blame?])) (λ (x) x) 'pos 'neg) (posn 1 2)))) (test/spec-passed - 'provide/contract13 + 'contract-marks13 '(let () (struct posn (x y)) ((contract (-> any/c (struct/dc posn [x pos-blame?] #:inv (x) pos-blame?)) @@ -133,7 +133,7 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract14 + 'contract-marks14 '(let () (struct posn (x y) #:mutable) ((contract (-> any/c (struct/dc posn [x pos-blame?])) @@ -141,7 +141,7 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract15 + 'contract-marks15 '(let () (struct posn (x y)) ((contract (-> any/c (struct/dc posn [x #:lazy pos-blame?])) @@ -149,7 +149,7 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract16 + 'contract-marks16 '(let () (struct posn (x y)) ((contract (-> any/c (struct/dc posn @@ -159,7 +159,7 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract17 + 'contract-marks17 '(let () (struct posn (x y)) ((contract (-> any/c (struct/dc posn @@ -169,7 +169,7 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract18 + 'contract-marks18 '(let () (struct posn (x y) #:mutable) ((contract (-> any/c (struct/dc posn @@ -179,7 +179,7 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract19 + 'contract-marks19 '(let () (struct posn (x y)) ((contract (-> any/c (struct/dc posn @@ -189,7 +189,7 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract20 + 'contract-marks20 '(let () (struct posn (x y) #:mutable) ((contract (-> any/c (struct/dc posn @@ -199,15 +199,444 @@ (posn 1 2)))) (test/spec-passed - 'provide/contract21 + 'contract-marks21 '(let () ((contract (case-> (-> any/c any/c pos-blame?)) (λ (x y) x) 'pos 'neg) 1 2))) (test/spec-passed - 'provide/contract22 + 'contract-marks22 '(let () ((contract (case-> (-> neg-blame? any/c)) (λ (x) x) 'pos 'neg) - 1)))) + 1))) + + (test/spec-passed + 'contract-marks23 + '(unbox (contract (box/c neg-blame?) (box 1) 'pos 'neg))) + + (test/spec-passed + 'contract-marks24 + '(set-box! (contract (box/c neg-blame?) (box 1) 'pos 'neg) 2)) + + ;; do we catch flat contracts applies with `contract-out`? + (test/spec-passed/result + 'contract-marks25 + '(let () + (eval '(module prof25 racket/base + (require racket/contract 'prof-fun) + (define x 3) + (define a-contract (λ _ (named-blame? 'prof25))) + (provide + (contract-out + [x a-contract])))) + (eval '(require 'prof25)) + (eval 'x)) + 3) + + (test/spec-passed/result + 'contract-marks26 + '(let () + (eval '(define/contract x (λ _ (named-blame? 'top-level)) 3)) + (eval 'x)) + 3) + + (test/spec-passed/result + 'contract-marks27 + '(with-contract test27 #:result (λ _ (named-blame? '(region test27))) 3) + 3) + + (test/spec-passed/result + 'contract-marks28 + '(let () + (eval '(define-struct/contract foo ([bar (λ _ (named-blame? 'top-level))]))) + (eval '(foo-bar (foo 3)))) + 3) + + (test/spec-passed/result + 'contract-marks29 + '(let () + (eval '(define f (invariant-assertion (-> (λ _ (named-blame? 'top-level)) + (λ _ (named-blame? 'top-level))) + (λ (x) 3)))) + (eval '(f 2))) + 3) + + (test/spec-passed/result + 'contract-marks30 + '(let () + (eval '(module test30 racket/base + (require racket/contract/base 'prof-fun) + (define (f x) 3) + (define-module-boundary-contract g f (-> (λ _ (named-blame? 'top-level)) + (λ _ (named-blame? 'top-level)))) + (provide g))) + (eval '(require 'test30)) + (eval '(f 2))) + 3) + + (test/spec-passed/result + 'contract-marks31 + '((hash-ref (contract (hash/c (-> neg-blame? pos-blame?) + (-> neg-blame? pos-blame?)) + (hash values values) + 'pos 'neg) + values) + 3) + 3) + + (test/spec-passed/result + 'contract-marks32 + '(car (contract (listof pos-blame?) (list 3) 'pos 'neg)) + 3) + + (test/spec-passed/result + 'contract-marks33 + '((car (contract (listof (-> neg-blame? pos-blame?)) (list (lambda (x) 3)) 'pos 'neg)) 2) + 3) + + (test/spec-passed/result + 'contract-marks34 + '(begin + (require racket/promise) + (force (contract (promise/c pos-blame?) (delay 3) 'pos 'neg))) + 3) + + (test/spec-passed/result + 'contract-marks35 + '(let () + (define/contract tag + (prompt-tag/c (-> (λ _ (named-blame? 'top-level)) + (λ _ (named-blame? 'top-level)))) + (make-continuation-prompt-tag)) + (call-with-continuation-prompt + (lambda () + (number->string + (call-with-composable-continuation + (lambda (k) + (abort-current-continuation tag k))))) + tag + (lambda (k) 3))) + 3) + + (test/spec-passed/result + 'contract-marks36 + '(let () + (define/contract mark-key + (continuation-mark-key/c (-> (λ _ (named-blame? 'top-level)) + (λ _ (named-blame? 'top-level)))) + (make-continuation-mark-key)) + (with-continuation-mark + mark-key + (lambda (s) (append s '(truffle fudge ganache))) + (let ([mark-value (continuation-mark-set-first + (current-continuation-marks) mark-key)]) + (mark-value '(chocolate-bar))))) + '(chocolate-bar truffle fudge ganache)) + + (test/spec-passed + 'contract-marks37 + '(let () + (define/contract my-evt + (evt/c (λ _ (named-blame? 'top-level))) + always-evt) + (sync my-evt))) + + (test/spec-passed + 'contract-marks38 + '(let () + (define/contract chan + (channel/c (λ _ (named-blame? 'top-level))) + (make-channel)) + (thread (λ () (channel-get chan))) + (channel-put chan 'not-a-string))) + + (test/spec-passed + 'contract-marks39 + '(let () + (eval '(require racket/class)) + (eval '((contract (->m neg-blame? any/c) (λ (_ x) x) 'pos 'neg) 'a 1)))) + + (test/spec-passed + 'contract-marks40 + '(let () + (define o + (contract + (object-contract (field x pos-blame?) (f (->m neg-blame?))) + (new (class object% (init-field x) (define/public (f) x) (super-new)) [x 3]) + 'pos 'neg)) + (get-field x o) + (set-field! x o 2) + (send o f))) + + (test/spec-passed + 'contract-marks41 + '(contract (vectorof pos-blame? #:flat? #t) #(1 2 3) 'pos 'neg)) + + (test/spec-passed + 'contract-marks42 + '((vector-ref (contract (vectorof (-> pos-blame? neg-blame?)) (vector values) + 'pos 'neg) + 0) + 1)) + + (test/spec-passed + 'contract-marks43 + '(contract (vector/c pos-blame? #:flat? #t) #(1) 'pos 'neg)) + + (test/spec-passed + 'contract-marks42 + '((vector-ref (contract (vector/c (-> pos-blame? neg-blame?)) (vector values) + 'pos 'neg) + 0) + 1)) + + (test/spec-passed + 'contract-marks43 + '((contract (parametric->/c (X) (-> pos-blame? X neg-blame?)) + (lambda (x y) x) + 'pos 'neg) + 1 2)) + + (test/spec-passed + 'contract-marks44 + '(let () + (struct s ([x #:mutable])) + (define s* (contract (struct/dc s [x pos-blame?] #:inv (x) pos-blame?) (s 3) 'pos 'neg)) + (set-s-x! s* 3) + (s-x s*))) + + (test/spec-passed + 'contract-marks45 + '(let () + (eval '(module propmod racket/base + (require racket/contract 'prof-fun) + (define-values (prop prop? prop-ref) + (make-struct-type-property 'prop)) + (define (app-prop x v) + (((prop-ref x) x) v)) + (provide/contract + [prop (struct-type-property/c + (-> (lambda _ (named-blame? 'propmod)) + (-> (lambda _ (named-blame? 'propmod)) + (lambda _ (named-blame? 'propmod)))))]) + (provide prop-ref app-prop))) + (eval '(require 'propmod)) + (eval '(struct s (f) #:property prop (lambda (s) (s-f s)))) + (eval '(define s1 (s even?))) + (eval '(app-prop s1 5)))) + + (test/spec-passed + 'contract-marks46 + '((contract (->i ([x () pos-blame?] [y (x) pos-blame?]) + #:rest [z (x y) pos-blame?] + #:pre (x y z) pos-blame? + [res (x y z) neg-blame?] + #:post (res x y z) neg-blame?) + (lambda (x y . z) 3) + 'pos 'neg) + 1 2 3)) + + (test/spec-passed + 'contract-marks47 + '((contract (->i ([x () pos-blame?] [y (x) pos-blame?]) + ([w (x y) pos-blame?]) + #:rest [z (x y) pos-blame?] + #:pre (x y z) pos-blame? + [res (x y z) neg-blame?] + #:post (res x y z) neg-blame?) + (lambda (x y [w 3] . z) 3) + 'pos 'neg) + 1 2 3 4)) + + (test/spec-passed + 'contract-marks48 + '((contract (->i ([x () pos-blame?] [y (x) pos-blame?]) + [res (x y) neg-blame?]) + (lambda (x y) 3) + 'pos 'neg) + 1 2)) + + (test/spec-passed + 'contract-marks49 + '((contract (->i ([x () pos-blame?]) + [res (x) neg-blame?]) + (lambda (x) 3) + 'pos 'neg) + 1)) + + (test/spec-passed + 'contract-marks50 + '((contract (opt/c (-> neg-blame? any/c)) (λ (x) x) 'pos 'neg) 1)) + + (test/spec-passed + 'contract-marks51 + '((contract (opt/c (-> any/c pos-blame?)) (λ (x) x) 'pos 'neg) 1)) + + (test/spec-passed + 'contract-marks52 + '((contract (->d ([x pos-blame?] [y pos-blame?]) + #:rest z pos-blame? + #:pre pos-blame? + [res neg-blame?] + #:post neg-blame?) + (lambda (x y . z) 3) + 'pos 'neg) + 1 2 3)) + + (test/spec-passed + 'contract-marks53 + '((contract (->d ([x pos-blame?] [y pos-blame?]) + ([w pos-blame?]) + #:rest z pos-blame? + #:pre pos-blame? + [res neg-blame?] + #:post neg-blame?) + (lambda (x y [w 3] . z) 3) + 'pos 'neg) + 1 2 3 4)) + + (test/spec-passed + 'contract-marks54 + '((contract (->d ([x pos-blame?] [y pos-blame?]) + [res neg-blame?]) + (lambda (x y) 3) + 'pos 'neg) + 1 2)) + + (test/spec-passed + 'contract-marks55 + '((contract (->d ([x pos-blame?]) + [res neg-blame?]) + (lambda (x) 3) + 'pos 'neg) + 1)) + + (test/spec-passed + 'contract-marks56 + '(let () + (eval '(require racket/async-channel)) + (eval '(define c (contract (async-channel/c pos-blame?) (make-async-channel) 'pos 'neg))) + (eval '(async-channel-put c 3)) + (eval '(async-channel-get c)))) + + (test/spec-passed + 'contract-marks57 + '(let () + (eval '(require racket/generic)) + (eval '(define-generics fooable (foo fooable))) + (eval '(struct s () #:methods gen:fooable [(define (foo x) x)])) + (eval '(foo (contract (generic-instance/c gen:fooable [foo (-> pos-blame? neg-blame?)]) + (s) 'pos 'neg))))) + + (test/spec-passed + 'contract-marks58 + '(let () + (eval '(require racket/set)) + (eval '(define s (contract (set/c pos-blame?) (set 1 2 3) 'pos 'neg))) + (eval '(set-add s 3)) + (eval '(set-member? s 3)))) + + (test/spec-passed + 'contract-marks59 + '(let () + (eval '(require racket/set)) + (eval '(define s (contract (set/c pos-blame? #:lazy? #t #:kind 'mutable) + (mutable-set 1 2 3) 'pos 'neg))) + (eval '(set-add! s 3)) + (eval '(set-member? s 3)))) + + (test/spec-passed + 'contract-marks60 + '(let () + (eval '(require racket/set)) + (eval '(define s (contract (set/c pos-blame? #:kind 'dont-care) + (list 1 2 3) 'pos 'neg))) + (eval '(set-add s 3)) + (eval '(set-member? s 3)))) + + (test/spec-passed + 'contract-marks61 + '(let () + (eval '(require racket/stream)) + (eval '(stream-first (contract (stream/c pos-blame?) (in-range 3) 'pos 'neg))))) + + (test/spec-passed/result + 'contract-marks62 + '(let () + (define marked? #f) ; check that we measure the cost of contract-stronger? + (define (make/c) ; the two have to not be eq?, otherwise contract-stronger? is not called + (make-contract #:late-neg-projection + (lambda (b) + (lambda (val neg-party) + (pos-blame? 'dummy))) + #:stronger + (lambda (c1 c2) + (when (pos-blame? 'dummy) + (set! marked? #t) + #t)))) + ((contract (-> pos-blame? (make/c)) + (contract (-> pos-blame? (make/c)) values 'pos 'neg) + 'pos 'neg) + 3) + marked?) + #t) + + (test/spec-passed + 'contract-marks63 + '(let () + (eval '(require racket/sequence)) + (eval '(sequence->list (contract (sequence/c pos-blame?) (in-range 3) 'pos 'neg))))) + + (test/spec-passed + 'contract-marks64 + '(let () + (eval '(require racket/sequence racket/dict)) + (eval '(sequence-ref (contract (sequence/c pos-blame? pos-blame?) + (in-dict '((1 . 2) (3 . 4))) 'pos 'neg) + 0)))) + + (test/spec-passed + 'contract-marks65 + '(let () + (eval '(require syntax/id-table)) + (eval '(define t (contract (free-id-table/c pos-blame? neg-blame?) + (make-free-id-table) + 'pos 'neg))) + (eval '(free-id-table-set! t #'a 3)) + (eval '(free-id-table-ref t #'a)))) + + (test/spec-passed + 'contract-marks66 + '(let () + (eval '(require syntax/id-table)) + (eval '(define t (contract (free-id-table/c pos-blame? neg-blame?) + (make-immutable-free-id-table) + 'pos 'neg))) + (eval '(free-id-table-ref (free-id-table-set t #'a 3) #'a)))) + + ;; check that there's no mark when running the body of a contracted function + ;; (i.e., user code) + (test/spec-passed/result + 'contract-marks67 + '(let () + (eval '(module m racket/base + (require racket/contract/base + (only-in racket/contract/private/guts + contract-continuation-mark-key)) + (provide + (contract-out + [f (-> integer? void?)])) + (define (f x) + (define m + (continuation-mark-set->list + (current-continuation-marks) + contract-continuation-mark-key)) + (unless (null? m) + (error 'ack "~s" m))))) + (eval '(require 'm)) + (eval '(let ([f f]) (f 1)))) + (void)) + + ) diff --git a/pkgs/racket-test/tests/racket/contract/tail.rkt b/pkgs/racket-test/tests/racket/contract/tail.rkt index 024f0fe544..7c12fbfcfd 100644 --- a/pkgs/racket-test/tests/racket/contract/tail.rkt +++ b/pkgs/racket-test/tests/racket/contract/tail.rkt @@ -21,6 +21,17 @@ 'neg)]) (f 3)) (c))) + + (ctest/rewrite 1 + tail-arrow.2 + (let ([c (counter)]) + (letrec ([f + (contract (-> any/c c) + (λ ([x #f]) (if (zero? x) x (f (- x 1)))) + 'pos + 'neg)]) + (f 3)) + (c))) (ctest/rewrite 1 tail-unconstrained-domain-arrow diff --git a/racket/collects/racket/HISTORY.txt b/racket/collects/racket/HISTORY.txt index 8abe452910..4826d9acb1 100644 --- a/racket/collects/racket/HISTORY.txt +++ b/racket/collects/racket/HISTORY.txt @@ -1,3 +1,8 @@ +Version 6.4, January 2016 +Changes noted in the documentation, including support for + incremental garbage collection +Performance improvements and bug repairs + Version 6.3, October 2015 Bug repairs and other changes noted in the documentation, including substantial changes to the macro expander diff --git a/racket/collects/racket/async-channel.rkt b/racket/collects/racket/async-channel.rkt index e4249b7519..c3858d2336 100644 --- a/racket/collects/racket/async-channel.rkt +++ b/racket/collects/racket/async-channel.rkt @@ -215,10 +215,17 @@ (define pos-elem-proj (lnp blame)) (define neg-elem-proj (lnp (blame-swap blame))) (λ (val neg-party) + (define blame+neg-party (cons blame neg-party)) (check-async-channel/c ctc val blame neg-party) (impersonate/chaperone-async-channel val - (λ (v) (pos-elem-proj v neg-party)) - (λ (v) (neg-elem-proj v neg-party)) + (λ (v) + (with-contract-continuation-mark + blame+neg-party + (pos-elem-proj v neg-party))) + (λ (v) + (with-contract-continuation-mark + blame+neg-party + (neg-elem-proj v neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame blame)))) diff --git a/racket/collects/racket/contract/private/arr-i.rkt b/racket/collects/racket/contract/private/arr-i.rkt index 6393b98bbb..2368c356ef 100644 --- a/racket/collects/racket/contract/private/arr-i.rkt +++ b/racket/collects/racket/contract/private/arr-i.rkt @@ -811,7 +811,7 @@ evaluted left-to-right.) #`(case-lambda [#,(vector->list wrapper-ress) (with-contract-continuation-mark - blame + blame+neg-party #,(add-wrapper-let (add-post-cond an-istx indy-arg-vars ordered-args indy-res-vars ordered-ress #`(values #,@(vector->list wrapper-ress))) @@ -906,6 +906,7 @@ evaluted left-to-right.) (with-syntax ([arg-checker (or (syntax-local-infer-name stx) 'arg-checker)]) #`(λ #,wrapper-proc-arglist (λ (val neg-party) + (define blame+neg-party (cons blame neg-party)) (chk val #,(and (syntax-parameter-value #'making-a-method) #t)) (c-or-i-procedure val @@ -915,10 +916,12 @@ evaluted left-to-right.) (make-keyword-procedure (λ (kwds kwd-args . args) (with-contract-continuation-mark - blame (keyword-apply arg-checker kwds kwd-args args))) + blame+neg-party + (keyword-apply arg-checker kwds kwd-args args))) (λ args (with-contract-continuation-mark - blame (apply arg-checker args))))) + blame+neg-party + (apply arg-checker args))))) impersonator-prop:contracted ctc impersonator-prop:blame blame)))))) diff --git a/racket/collects/racket/contract/private/arrow-higher-order.rkt b/racket/collects/racket/contract/private/arrow-higher-order.rkt index 01e0469037..9d08118eb9 100644 --- a/racket/collects/racket/contract/private/arrow-higher-order.rkt +++ b/racket/collects/racket/contract/private/arrow-higher-order.rkt @@ -8,7 +8,10 @@ "misc.rkt" "prop.rkt" "guts.rkt" - (prefix-in arrow: "arrow.rkt")) + (prefix-in arrow: "arrow.rkt") + (only-in racket/unsafe/ops + unsafe-chaperone-procedure + unsafe-impersonate-procedure)) (provide (for-syntax build-chaperone-constructor/real) procedure-arity-exactly/no-kwds @@ -154,36 +157,42 @@ [(opt-kwd-x ...) (generate-temporaries (map car opt-kwds))] [(rng-late-neg-projs ...) (if rngs rngs '())] [(rng-x ...) (if rngs (generate-temporaries rngs) '())]) - (with-syntax ([(rng-checker-name ...) - (if rngs - (list (gen-id 'rng-checker)) - null)] - [(rng-checker ...) - (if rngs - (list - (with-syntax ([rng-len (length rngs)]) - (with-syntax ([rng-results - #'(values (rng-late-neg-projs rng-x neg-party) - ...)]) - #'(case-lambda - [(rng-x ...) - (with-contract-continuation-mark - (cons blame neg-party) - (let () - post ... - rng-results))] - [args - (arrow:bad-number-of-results blame val rng-len args - #:missing-party neg-party)])))) - null)]) + + (define rng-checker + (and rngs + (with-syntax ([rng-len (length rngs)] + [rng-results #'(values (rng-late-neg-projs rng-x neg-party) ...)]) + #'(case-lambda + [(rng-x ...) + (with-contract-continuation-mark + (cons blame neg-party) + (let () + post ... + rng-results))] + [args + (arrow:bad-number-of-results blame val rng-len args + #:missing-party neg-party)])))) + (define (wrap-call-with-values-and-range-checking stx assume-result-values?) + (if rngs + (if assume-result-values? + #`(let-values ([(rng-x ...) #,stx]) + (with-contract-continuation-mark + (cons blame neg-party) + (let () + post ... + (values (rng-late-neg-projs rng-x neg-party) ...)))) + #`(call-with-values + (λ () #,stx) + #,rng-checker)) + stx)) + (let* ([min-method-arity (length doms)] [max-method-arity (+ min-method-arity (length opt-doms))] [min-arity (+ (length this-args) min-method-arity)] [max-arity (+ min-arity (length opt-doms))] [req-keywords (map (λ (p) (syntax-e (car p))) req-kwds)] [opt-keywords (map (λ (p) (syntax-e (car p))) opt-kwds)] - [need-apply-values? (or dom-rest (not (null? opt-doms)))] - [no-rng-checking? (not rngs)]) + [need-apply? (or dom-rest (not (null? opt-doms)))]) (with-syntax ([(dom-projd-args ...) #'((dom-ctc dom-x neg-party) ...)] [basic-params (cond @@ -227,6 +236,7 @@ (for/fold ([s #'null]) ([tx (in-list (map cdr put-in-reverse))]) (tx s)))]) + (with-syntax ([kwd-lam-params (if dom-rest #'(this-param ... @@ -239,7 +249,7 @@ kwd-param ...))] [basic-return (let ([inner-stx-gen - (if need-apply-values? + (if need-apply? (λ (s) #`(apply values #,@s this-param ... dom-projd-args ... @@ -248,16 +258,56 @@ #,@s this-param ... dom-projd-args ...)))]) - (if no-rng-checking? - (inner-stx-gen #'()) + (if rngs (arrow:check-tail-contract rng-ctcs blame-party-info neg-party - #'(rng-checker-name ...) - inner-stx-gen)))] + (list rng-checker) + inner-stx-gen + #'(cons blame neg-party)) + (inner-stx-gen #'())))] + [(basic-unsafe-return basic-unsafe-return/result-values-assumed) + (let () + (define (inner-stx-gen stuff assume-result-values?) + (define arg-checking-expressions + (if need-apply? + #'(this-param ... dom-projd-args ... opt+rest-uses) + #'(this-param ... dom-projd-args ...))) + (define the-call/no-tail-mark + (with-syntax ([(tmps ...) (generate-temporaries + arg-checking-expressions)]) + #`(let-values ([(tmps ...) + (with-contract-continuation-mark + (cons blame neg-party) + (values #,@arg-checking-expressions))]) + #,(if need-apply? + #`(apply val tmps ...) + #`(val tmps ...))))) + (define the-call + #`(with-continuation-mark arrow:tail-contract-key + (list* neg-party blame-party-info #,rng-ctcs) + #,the-call/no-tail-mark)) + (cond + [(null? (syntax-e stuff)) ;; surely there must a better way + the-call/no-tail-mark] + [else + (wrap-call-with-values-and-range-checking + the-call + assume-result-values?)])) + (define (mk-return assume-result-values?) + (if rngs + (arrow:check-tail-contract + rng-ctcs + blame-party-info + neg-party + #'not-a-null + (λ (x) (inner-stx-gen x assume-result-values?)) + #'(cons blame neg-party)) + (inner-stx-gen #'() assume-result-values?))) + (list (mk-return #f) (mk-return #t)))] [kwd-return (let* ([inner-stx-gen - (if need-apply-values? + (if need-apply? (λ (s k) #`(apply values #,@s #,@k this-param ... @@ -275,83 +325,87 @@ (λ (s) (inner-stx-gen s #'(kwd-results))))]) #`(let ([kwd-results kwd-stx]) - #,(if no-rng-checking? - (outer-stx-gen #'()) + #,(if rngs (arrow:check-tail-contract rng-ctcs blame-party-info neg-party - #'(rng-checker-name ...) - outer-stx-gen))))]) - (with-syntax ([basic-lambda-name (gen-id 'basic-lambda)] - [basic-lambda #'(λ basic-params - ;; Arrow contract domain checking is instrumented - ;; both here, and in `arity-checking-wrapper'. - ;; We need to instrument here, because sometimes - ;; a-c-w doesn't wrap, and just returns us. - ;; We need to instrument in a-c-w to count arity - ;; checking time. - ;; Overhead of double-wrapping has not been - ;; noticeable in my measurements so far. - ;; - stamourv + (list rng-checker) + outer-stx-gen + #'(cons blame neg-party)) + (outer-stx-gen #'()))))]) + + ;; Arrow contract domain checking is instrumented + ;; both here, and in `arity-checking-wrapper'. + ;; We need to instrument here, because sometimes + ;; a-c-w doesn't wrap, and just returns us. + ;; We need to instrument in a-c-w to count arity + ;; checking time. + ;; Overhead of double-wrapping has not been + ;; noticeable in my measurements so far. + ;; - stamourv + (with-syntax ([basic-lambda #'(λ basic-params (with-contract-continuation-mark (cons blame neg-party) (let () pre ... basic-return)))] + [basic-unsafe-lambda + #'(λ basic-params + (let () + pre ... basic-unsafe-return))] + [basic-unsafe-lambda/result-values-assumed + #'(λ basic-params + (let () + pre ... basic-unsafe-return/result-values-assumed))] [kwd-lambda-name (gen-id 'kwd-lambda)] [kwd-lambda #`(λ kwd-lam-params (with-contract-continuation-mark (cons blame neg-party) (let () pre ... kwd-return)))]) - (with-syntax ([(basic-checker-name) (generate-temporaries '(basic-checker))]) - (cond - [(and (null? req-keywords) (null? opt-keywords)) - #`(let-values ([(rng-checker-name ...) (values rng-checker ...)]) - (let ([basic-lambda-name basic-lambda]) - (arrow:arity-checking-wrapper val - blame neg-party - basic-lambda-name - void - #,min-method-arity - #,max-method-arity - #,min-arity - #,(if dom-rest #f max-arity) - '(req-kwd ...) - '(opt-kwd ...))))] - [(pair? req-keywords) - #`(let-values ([(rng-checker-name ...) (values rng-checker ...)]) - (let ([kwd-lambda-name kwd-lambda]) - (arrow:arity-checking-wrapper val - blame neg-party - void - kwd-lambda-name - #,min-method-arity - #,max-method-arity - #,min-arity - #,(if dom-rest #f max-arity) - '(req-kwd ...) - '(opt-kwd ...))))] - [else - #`(let-values ([(rng-checker-name ...) (values rng-checker ...)]) - (let ([basic-lambda-name basic-lambda] - [kwd-lambda-name kwd-lambda]) - (arrow:arity-checking-wrapper val - blame neg-party - basic-lambda-name - kwd-lambda-name - #,min-method-arity - #,max-method-arity - #,min-arity - #,(if dom-rest #f max-arity) - '(req-kwd ...) - '(opt-kwd ...))))]))))))))))) + (cond + [(and (null? req-keywords) (null? opt-keywords)) + #`(arrow:arity-checking-wrapper val + blame neg-party + basic-lambda + basic-unsafe-lambda + basic-unsafe-lambda/result-values-assumed + #,(and rngs (length rngs)) + void + #,min-method-arity + #,max-method-arity + #,min-arity + #,(if dom-rest #f max-arity) + '(req-kwd ...) + '(opt-kwd ...))] + [(pair? req-keywords) + #`(arrow:arity-checking-wrapper val + blame neg-party + void #t #f #f + kwd-lambda + #,min-method-arity + #,max-method-arity + #,min-arity + #,(if dom-rest #f max-arity) + '(req-kwd ...) + '(opt-kwd ...))] + [else + #`(arrow:arity-checking-wrapper val + blame neg-party + basic-lambda #t #f #f + kwd-lambda + #,min-method-arity + #,max-method-arity + #,min-arity + #,(if dom-rest #f max-arity) + '(req-kwd ...) + '(opt-kwd ...))]))))))))) (define (maybe-cons-kwd c x r neg-party) (if (eq? arrow:unspecified-dom x) r (cons (c x neg-party) r))) -(define (->-proj chaperone-or-impersonate-procedure ctc +(define (->-proj chaperone? ctc ;; fields of the 'ctc' struct min-arity doms kwd-infos rest pre? rngs post? plus-one-arity-function chaperone-constructor @@ -414,10 +468,15 @@ (if partial-rest (list partial-rest) '()))) (define blame-party-info (arrow:get-blame-party-info orig-blame)) (define (successfully-got-the-right-kind-of-function val neg-party) - (define chap/imp-func (apply chaperone-constructor - orig-blame val - neg-party blame-party-info - rngs the-args)) + (define-values (chap/imp-func use-unsafe-chaperone-procedure?) + (apply chaperone-constructor + orig-blame val + neg-party blame-party-info + rngs the-args)) + (define chaperone-or-impersonate-procedure + (if use-unsafe-chaperone-procedure? + (if chaperone? unsafe-chaperone-procedure unsafe-impersonate-procedure) + (if chaperone? chaperone-procedure impersonate-procedure))) (cond [chap/imp-func (if (or post? (not rngs)) diff --git a/racket/collects/racket/contract/private/arrow-val-first.rkt b/racket/collects/racket/contract/private/arrow-val-first.rkt index 32497e22c2..0198a48dbf 100644 --- a/racket/collects/racket/contract/private/arrow-val-first.rkt +++ b/racket/collects/racket/contract/private/arrow-val-first.rkt @@ -962,11 +962,12 @@ (cons result-checker args-dealt-with) args-dealt-with))))) - (arrow:arity-checking-wrapper f blame neg-party - interposition-proc interposition-proc - min-arity max-arity - min-arity max-arity - mandatory-keywords optional-keywords)))) + (values (arrow:arity-checking-wrapper f blame neg-party + interposition-proc #f interposition-proc #f #f + min-arity max-arity + min-arity max-arity + mandatory-keywords optional-keywords) + #f)))) (build--> 'dynamic->* mandatory-domain-contracts optional-domain-contracts @@ -1159,11 +1160,13 @@ (arrow:keywords-match man-kwds opt-kwds x) #t)) -(define (make-property build-X-property chaperone-or-impersonate-procedure) +(define (make-property chaperone?) + (define build-X-property + (if chaperone? build-chaperone-contract-property build-contract-property)) (define val-first-proj (λ (->stct) (maybe-warn-about-val-first ->stct) - (->-proj chaperone-or-impersonate-procedure ->stct + (->-proj chaperone? ->stct (base->-min-arity ->stct) (base->-doms ->stct) (base->-kwd-infos ->stct) @@ -1176,7 +1179,7 @@ #f))) (define late-neg-proj (λ (->stct) - (->-proj chaperone-or-impersonate-procedure ->stct + (->-proj chaperone? ->stct (base->-min-arity ->stct) (base->-doms ->stct) (base->-kwd-infos ->stct) @@ -1227,19 +1230,13 @@ (not (base->-post? that)))) (define-struct (-> base->) () - #:property - prop:chaperone-contract - (make-property build-chaperone-contract-property chaperone-procedure)) + #:property prop:chaperone-contract (make-property #t)) (define-struct (predicate/c base->) () - #:property - prop:chaperone-contract - (make-property build-chaperone-contract-property chaperone-procedure)) + #:property prop:chaperone-contract (make-property #t)) (define-struct (impersonator-> base->) () - #:property - prop:contract - (make-property build-contract-property impersonate-procedure)) + #:property prop:contract (make-property #f)) (define ->void-contract (let-syntax ([get-chaperone-constructor @@ -1303,25 +1300,27 @@ '(expected: "a procedure that accepts 1 non-keyword argument" given: "~e") f)) - (cond - [(and (struct-predicate-procedure? f) - (not (impersonator? f))) - #f] - [(and (equal? (procedure-arity f) 1) - (let-values ([(required mandatory) (procedure-keywords f)]) - (and (null? required) - (null? mandatory)))) - (λ (arg) - (values (rng-checker f blame neg-party) arg))] - [(procedure-arity-includes? f 1) - (make-keyword-procedure - (λ (kwds kwd-args . other) - (unless (null? kwds) - (arrow:raise-no-keywords-arg blame #:missing-party neg-party f kwds)) - (unless (= 1 (length other)) - (arrow:raise-wrong-number-of-args-error #:missing-party neg-party - blame f (length other) 1 1 1)) - (values (rng-checker f blame neg-party) (car other))))])))) + (values (cond + [(and (struct-predicate-procedure? f) + (not (impersonator? f))) + #f] + [(and (equal? (procedure-arity f) 1) + (let-values ([(required mandatory) (procedure-keywords f)]) + (and (null? required) + (null? mandatory)))) + (λ (arg) + (values (rng-checker f blame neg-party) arg))] + [(procedure-arity-includes? f 1) + (make-keyword-procedure + (λ (kwds kwd-args . other) + (unless (null? kwds) + (arrow:raise-no-keywords-arg blame #:missing-party neg-party f kwds)) + (unless (= 1 (length other)) + (arrow:raise-wrong-number-of-args-error + #:missing-party neg-party + blame f (length other) 1 1 1)) + (values (rng-checker f blame neg-party) (car other))))]) + #f)))) (define -predicate/c (mk-any/c->boolean-contract predicate/c)) (define any/c->boolean-contract (mk-any/c->boolean-contract make-->)) diff --git a/racket/collects/racket/contract/private/arrow.rkt b/racket/collects/racket/contract/private/arrow.rkt index 384784b4a1..44e5c0a13b 100644 --- a/racket/collects/racket/contract/private/arrow.rkt +++ b/racket/collects/racket/contract/private/arrow.rkt @@ -52,7 +52,7 @@ (define tail-contract-key (gensym 'tail-contract-key)) -(define-for-syntax (check-tail-contract rng-ctcs blame-party-info neg-party rng-checkers call-gen) +(define-for-syntax (check-tail-contract rng-ctcs blame-party-info neg-party rng-checkers call-gen blame+neg-party) (unless (identifier? rng-ctcs) (raise-argument-error 'check-tail-contract "identifier?" @@ -61,7 +61,7 @@ #`(call-with-immediate-continuation-mark tail-contract-key (λ (m) - (if (tail-marks-match? m #,rng-ctcs #,blame-party-info #,neg-party) + (if (tail-marks-match? m #,rng-ctcs #,blame-party-info #,neg-party #,blame+neg-party) #,(call-gen #'()) #,(call-gen rng-checkers))))) @@ -69,25 +69,28 @@ ;; rng-ctc : (or/c #f (listof ctc)) ;; blame-party-info : (list/c pos-party boolean?[blame-swapped?]) ;; neg-party : neg-party -(define (tail-marks-match? m rng-ctcs blame-party-info neg-party) - (and m - rng-ctcs - (eq? (car m) neg-party) - (let ([mark-blame-part-info (cadr m)]) - (and (eq? (car mark-blame-part-info) (car blame-party-info)) - (eq? (cadr mark-blame-part-info) (cadr blame-party-info)))) - (let loop ([m (cddr m)] - [rng-ctcs rng-ctcs]) - (cond - [(null? m) (null? rng-ctcs)] - [(null? rng-ctcs) (null? m)] - [else - (define m1 (car m)) - (define rng-ctc1 (car rng-ctcs)) - (cond - [(eq? m1 rng-ctc1) (loop (cdr m) (cdr rng-ctcs))] - [(contract-struct-stronger? m1 rng-ctc1) (loop (cdr m) (cdr rng-ctcs))] - [else #f])])))) +;; blame+neg-party : (cons/c blame? neg-party) +(define (tail-marks-match? m rng-ctcs blame-party-info neg-party blame+neg-party) + (with-contract-continuation-mark + blame+neg-party + (and m + rng-ctcs + (eq? (car m) neg-party) + (let ([mark-blame-part-info (cadr m)]) + (and (eq? (car mark-blame-part-info) (car blame-party-info)) + (eq? (cadr mark-blame-part-info) (cadr blame-party-info)))) + (let loop ([m (cddr m)] + [rng-ctcs rng-ctcs]) + (cond + [(null? m) (null? rng-ctcs)] + [(null? rng-ctcs) (null? m)] + [else + (define m1 (car m)) + (define rng-ctc1 (car rng-ctcs)) + (cond + [(eq? m1 rng-ctc1) (loop (cdr m) (cdr rng-ctcs))] + [(contract-struct-stronger? m1 rng-ctc1) (loop (cdr m) (cdr rng-ctcs))] + [else #f])]))))) ;; used as part of the information in the continuation mark ;; that records what is to be checked for a pending contract @@ -115,27 +118,30 @@ (λ (val neg-party) (check-is-a-procedure orig-blame neg-party val) (define (res-checker res-x ...) (values/drop (p-app-x res-x neg-party) ...)) + (define blame+neg-party (cons orig-blame neg-party)) (wrapper val (make-keyword-procedure (λ (kwds kwd-vals . args) (with-contract-continuation-mark - (cons orig-blame neg-party) + blame+neg-party #,(check-tail-contract #'rngs-list #'blame-party-info #'neg-party (list #'res-checker) - (λ (s) #`(apply values #,@s kwd-vals args))))) + (λ (s) #`(apply values #,@s kwd-vals args)) + #'blame+neg-party))) (λ args (with-contract-continuation-mark - (cons orig-blame neg-party) + blame+neg-party #,(check-tail-contract #'rngs-list #'blame-party-info #'neg-party (list #'res-checker) - (λ (s) #`(apply values #,@s args)))))) + (λ (s) #`(apply values #,@s args)) + #'blame+neg-party)))) impersonator-prop:contracted ctc impersonator-prop:application-mark (cons tail-contract-key (list neg-party blame-party-info rngs-x ...)))))))) @@ -346,7 +352,8 @@ blame-party-info #'neg-party #'(rng-checker-name ...) - inner-stx-gen)))] + inner-stx-gen + #'(cons blame neg-party))))] [kwd-return (let* ([inner-stx-gen (if need-apply-values? @@ -370,7 +377,8 @@ blame-party-info #'neg-party #'(rng-checker-name ...) - outer-stx-gen))))]) + outer-stx-gen + #'(cons blame neg-party)))))]) (with-syntax ([basic-lambda-name (gen-id 'basic-lambda)] [basic-lambda #'(λ basic-params ;; Arrow contract domain checking is instrumented @@ -398,7 +406,7 @@ #`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)]) (let ([basic-lambda-name basic-lambda]) (arity-checking-wrapper val blame neg-party - basic-lambda-name + basic-lambda-name #f #f #f void #,min-method-arity #,max-method-arity @@ -410,7 +418,7 @@ #`(let-values ([(rng-checker-name ...) (values/drop rng-checker ...)]) (let ([kwd-lambda-name kwd-lambda]) (arity-checking-wrapper val blame neg-party - void + void #f #f #f kwd-lambda-name #,min-method-arity #,max-method-arity @@ -423,7 +431,7 @@ (let ([basic-lambda-name basic-lambda] [kwd-lambda-name kwd-lambda]) (arity-checking-wrapper val blame neg-party - basic-lambda-name + basic-lambda-name #f #f #f kwd-lambda-name #,min-method-arity #,max-method-arity @@ -433,15 +441,34 @@ '(opt-kwd ...))))]))))))))))) ;; should we pass both the basic-lambda and the kwd-lambda? -(define (arity-checking-wrapper val blame neg-party basic-lambda kwd-lambda +;; if basic-unsafe-lambda is #f, returns only the one value, +;; namely the chaperone wrapper. Otherwise, returns two values, +;; a procedure and a boolean indicating it the procedure is the +;; basic-unsafe-lambda or not; note that basic-unsafe-lambda might +;; also be #t, but that happens only when we know that basic-lambda +;; can't be chosen (because there are keywords involved) +(define (arity-checking-wrapper val blame neg-party basic-lambda + basic-unsafe-lambda + basic-unsafe-lambda/result-values-assumed contract-result-val-count + kwd-lambda min-method-arity max-method-arity min-arity max-arity req-kwd opt-kwd) ;; should not build this unless we are in the 'else' case (and maybe not at all) (cond [(matches-arity-exactly? val min-arity max-arity req-kwd opt-kwd) - (if (and (null? req-kwd) (null? opt-kwd)) - basic-lambda - kwd-lambda)] + (if (and (null? req-kwd) (null? opt-kwd)) + (cond + [(and basic-unsafe-lambda + basic-unsafe-lambda/result-values-assumed + (equal? contract-result-val-count + (procedure-result-arity val))) + (values basic-unsafe-lambda/result-values-assumed #t)] + [basic-unsafe-lambda + (values basic-unsafe-lambda #t)] + [else basic-lambda]) + (if basic-unsafe-lambda + (values kwd-lambda #f) + kwd-lambda))] [else (define-values (vr va) (procedure-keywords val)) (define all-kwds (append req-kwd opt-kwd)) @@ -493,9 +520,13 @@ (raise-blame-error (blame-swap blame) #:missing-party neg-party val "expected required keyword ~a" (car req-kwd))))) - (if (or (not va) (pair? vr) (pair? va)) - (make-keyword-procedure kwd-checker basic-checker-name) - basic-checker-name)])) + (define proc + (if (or (not va) (pair? vr) (pair? va)) + (make-keyword-procedure kwd-checker basic-checker-name) + basic-checker-name)) + (if basic-unsafe-lambda + (values proc #f) + proc)])) (define (raise-wrong-number-of-args-error blame #:missing-party [missing-party #f] val diff --git a/racket/collects/racket/contract/private/base.rkt b/racket/collects/racket/contract/private/base.rkt index e2b49f0025..bb7fd8c68c 100644 --- a/racket/collects/racket/contract/private/base.rkt +++ b/racket/collects/racket/contract/private/base.rkt @@ -74,8 +74,12 @@ (if clnp #f neg) #t)) (cond - [clnp ((clnp blame) v neg)] - [else (((contract-projection c) blame) v)]))) + [clnp (with-contract-continuation-mark + (cons blame neg) + ((clnp blame) v neg))] + [else (with-contract-continuation-mark + blame + (((contract-projection c) blame) v))]))) (define-syntax (invariant-assertion stx) (syntax-case stx () diff --git a/racket/collects/racket/contract/private/box.rkt b/racket/collects/racket/contract/private/box.rkt index e88d576cd1..8ec39c9fea 100644 --- a/racket/collects/racket/contract/private/box.rkt +++ b/racket/collects/racket/contract/private/box.rkt @@ -141,6 +141,7 @@ (define pos-elem-r-proj (r-vfp box-blame)) (define neg-elem-w-proj (w-vfp (blame-swap box-blame))) (λ (val neg-party) + (define blame+neg-party (cons blame neg-party)) (cond [(check-box/c-np ctc val blame) => @@ -150,8 +151,14 @@ (box-immutable (pos-elem-r-proj (unbox val) neg-party)) (chaperone/impersonate-box val - (λ (b v) (pos-elem-r-proj v neg-party)) - (λ (b v) (neg-elem-w-proj v neg-party)) + (λ (b v) + (with-contract-continuation-mark + blame+neg-party + (pos-elem-r-proj v neg-party))) + (λ (b v) + (with-contract-continuation-mark + blame+neg-party + (neg-elem-w-proj v neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame (blame-add-missing-party blame neg-party)))]))))) diff --git a/racket/collects/racket/contract/private/case-arrow.rkt b/racket/collects/racket/contract/private/case-arrow.rkt index b644cf10a9..5e43e69e28 100644 --- a/racket/collects/racket/contract/private/case-arrow.rkt +++ b/racket/collects/racket/contract/private/case-arrow.rkt @@ -91,12 +91,14 @@ (λ (rng-checks) #`(apply values #,@rng-checks this-parameter ... (dom-proj-x dom-formals neg-party) ... - (rst-proj-x rst-formal neg-party)))) + (rst-proj-x rst-formal neg-party))) + #'(cons blame neg-party)) (check-tail-contract #'rng-ctcs-x blame-party-info neg-party rng-checkers (λ (rng-checks) #`(values/drop #,@rng-checks this-parameter ... - (dom-proj-x dom-formals neg-party) ...)))))] + (dom-proj-x dom-formals neg-party) ...)) + #'(cons blame neg-party))))] [rst-ctc-expr #`(apply values this-parameter ... (dom-proj-x dom-formals neg-party) ... diff --git a/racket/collects/racket/contract/private/guts.rkt b/racket/collects/racket/contract/private/guts.rkt index d166a9d838..0af245ae55 100644 --- a/racket/collects/racket/contract/private/guts.rkt +++ b/racket/collects/racket/contract/private/guts.rkt @@ -772,11 +772,24 @@ (define contract-continuation-mark-key (make-continuation-mark-key 'contract)) -(define-syntax-rule (with-contract-continuation-mark payload code) +;; Instrumentation strategy: +;; - add instrumentation at entry points to the contract system: +;; - `contract` (`apply-contract`, really) +;; - `contract-out` (`do-partial-app`, really) +;; - all others go through one of the above +;; that instrumentation picks up "top-level" flat contracts (i.e., not part of +;; some higher-order contract) and the "eager" parts of higher-order contracts +;; - add instrumentation inside chaperones/impersonators created by projections +;; that instrumentation picks up the deferred work of higher-order contracts +;; - add instrumentation to `plus-one-arity-functions` +;; those perform checking, but don't rely on chaperones +;; they exist for -> and ->*, and are partially implemented for ->i +;; TODO once they're fully implemented for ->i, will need to instrument them +(define-syntax-rule (with-contract-continuation-mark payload code ...) (begin ;; ;; When debugging a missing blame party error, turn this on, then run ;; ;; the contract test suite. It should find the problematic combinator. ;; (unless (or (pair? payload) (not (blame-missing-party? payload))) ;; (error "internal error: missing blame party" payload)) - (with-continuation-mark contract-continuation-mark-key payload code))) - + (with-continuation-mark contract-continuation-mark-key payload + (let () code ...)))) diff --git a/racket/collects/racket/contract/private/hash.rkt b/racket/collects/racket/contract/private/hash.rkt index 712d735975..cb3882580a 100644 --- a/racket/collects/racket/contract/private/hash.rkt +++ b/racket/collects/racket/contract/private/hash.rkt @@ -234,6 +234,7 @@ (define (handle-the-hash val neg-party pos-dom-proj neg-dom-proj mk-pos-rng-proj mk-neg-rng-proj chaperone-or-impersonate-hash ctc blame) + (define blame+neg-party (cons blame neg-party)) (if (immutable? val) (for/fold ([h val]) ([(k v) (in-hash val)]) (hash-set h @@ -242,16 +243,26 @@ (chaperone-or-impersonate-hash val (λ (h k) - (values (neg-dom-proj k neg-party) + (values (with-contract-continuation-mark + blame+neg-party + (neg-dom-proj k neg-party)) (λ (h k v) - ((mk-pos-rng-proj k) v neg-party)))) + (with-contract-continuation-mark + blame+neg-party + ((mk-pos-rng-proj k) v neg-party))))) (λ (h k v) - (values (neg-dom-proj k neg-party) - ((mk-neg-rng-proj k) v neg-party))) + (with-contract-continuation-mark + blame+neg-party + (values (neg-dom-proj k neg-party) + ((mk-neg-rng-proj k) v neg-party)))) (λ (h k) - (neg-dom-proj k neg-party)) + (with-contract-continuation-mark + blame+neg-party + (neg-dom-proj k neg-party))) (λ (h k) - (pos-dom-proj k neg-party)) + (with-contract-continuation-mark + blame+neg-party + (pos-dom-proj k neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame blame))) diff --git a/racket/collects/racket/contract/private/misc.rkt b/racket/collects/racket/contract/private/misc.rkt index 75cc3c9265..e0adb9f8d5 100644 --- a/racket/collects/racket/contract/private/misc.rkt +++ b/racket/collects/racket/contract/private/misc.rkt @@ -1283,7 +1283,10 @@ (c/i-procedure proc (λ (promise) - (values (λ (val) (p-app val neg-party)) promise))))) + (values (λ (val) (with-contract-continuation-mark + (cons blame neg-party) + (p-app val neg-party))) + promise))))) (raise-blame-error blame #:missing-party neg-party val @@ -1520,11 +1523,14 @@ (define cc-neg-projs (for/list ([proj (in-list call/cc-projs)]) (proj swapped))) (define cc-pos-projs (for/list ([proj (in-list call/cc-projs)]) (proj blame))) (define (make-proj projs neg-party) + (define blame+neg-party (cons blame neg-party)) (λ vs - (apply values - (for/list ([proj (in-list projs)] - [v (in-list vs)]) - (proj v neg-party))))) + (with-contract-continuation-mark + blame+neg-party + (apply values + (for/list ([proj (in-list projs)] + [v (in-list vs)]) + (proj v neg-party)))))) (λ (val neg-party) ;; now do the actual wrapping (cond @@ -1604,11 +1610,16 @@ (define proj1 (ho-proj blame)) (define proj2 (ho-proj (blame-swap blame))) (λ (val neg-party) + (define blame+neg-party (cons blame neg-party)) (cond [(continuation-mark-key? val) (proxy val - (λ (v) (proj1 v neg-party)) - (λ (v) (proj2 v neg-party)) + (λ (v) (with-contract-continuation-mark + blame+neg-party + (proj1 v neg-party))) + (λ (v) (with-contract-continuation-mark + blame+neg-party + (proj2 v neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame blame)] [else @@ -1665,21 +1676,23 @@ (define ctcs (chaperone-evt/c-ctcs evt-ctc)) (define projs (map contract-projection ctcs)) (λ (blame) - (define ((checker val) . args) - (define expected-num (length ctcs)) - (unless (= (length args) expected-num) - (raise-blame-error - blame val - `(expected: "event that produces ~a values" - given: "event that produces ~a values") - expected-num - (length args))) - (apply - values - (for/list ([proj projs] [val args]) - ((proj blame) val)))) - (define (generator evt) - (values evt (checker evt))) + (define ((checker val blame+neg-party) . args) + (with-contract-continuation-mark + blame+neg-party + (define expected-num (length ctcs)) + (unless (= (length args) expected-num) + (raise-blame-error + blame val + `(expected: "event that produces ~a values" + given: "event that produces ~a values") + expected-num + (length args))) + (apply + values + (for/list ([proj projs] [val args]) + ((proj blame) val))))) + (define ((generator blame+neg-party) evt) + (values evt (checker evt blame+neg-party))) (λ (val neg-party) (unless (contract-first-order-passes? evt-ctc val) (raise-blame-error @@ -1687,7 +1700,7 @@ '(expected: "~s" given: "~e") (contract-name evt-ctc) val)) - (chaperone-evt val generator)))) + (chaperone-evt val (generator (cons blame neg-party)))))) ;; evt/c-first-order : Contract -> Any -> Boolean ;; First order check for evt/c @@ -1733,8 +1746,19 @@ (λ (blame) (define pos-proj (ho-proj blame)) (define neg-proj (ho-proj (blame-swap blame))) - (define (proj1 neg-party) (λ (ch) (values ch (λ (v) (pos-proj v neg-party))))) - (define (proj2 neg-party) (λ (ch v) (neg-proj v neg-party))) + (define (proj1 neg-party) + (define blame+neg-party (cons blame neg-party)) + (λ (ch) + (values ch (λ (v) + (with-contract-continuation-mark + blame+neg-party + (pos-proj v neg-party)))))) + (define (proj2 neg-party) + (define blame+neg-party (cons blame neg-party)) + (λ (ch v) + (with-contract-continuation-mark + blame+neg-party + (neg-proj v neg-party)))) (λ (val neg-party) (cond [(channel? val) diff --git a/racket/collects/racket/contract/private/parametric.rkt b/racket/collects/racket/contract/private/parametric.rkt index a0b072a104..1f6e3d4a52 100644 --- a/racket/collects/racket/contract/private/parametric.rkt +++ b/racket/collects/racket/contract/private/parametric.rkt @@ -61,14 +61,16 @@ (define barrier/c (polymorphic-contract-barrier c)) (define vars (polymorphic-contract-vars c)) (define (wrap p neg-party) - ;; values in polymorphic types come in from negative position, - ;; relative to the poly/c contract - (define instances - (for/list ([var (in-list vars)]) - (barrier/c negative? var))) - (define protector - (apply (polymorphic-contract-body c) instances)) - (((get/build-late-neg-projection protector) blame) p neg-party)) + (with-contract-continuation-mark + (cons blame neg-party) + ;; values in polymorphic types come in from negative position, + ;; relative to the poly/c contract + (define instances + (for/list ([var (in-list vars)]) + (barrier/c negative? var))) + (define protector + (apply (polymorphic-contract-body c) instances)) + (((get/build-late-neg-projection protector) blame) p neg-party))) (lambda (p neg-party) (unless (procedure? p) diff --git a/racket/collects/racket/contract/private/provide.rkt b/racket/collects/racket/contract/private/provide.rkt index 066c37d0f9..dbb0b6ba3e 100644 --- a/racket/collects/racket/contract/private/provide.rkt +++ b/racket/collects/racket/contract/private/provide.rkt @@ -152,14 +152,16 @@ ;; expressions: (quasisyntax/loc stx (#%expression #,stx))))))) - (struct provide/contract-transformer provide/contract-info (saved-id-table partially-applied-id) + (struct provide/contract-transformer provide/contract-info (saved-id-table partially-applied-id blame) #:property prop:set!-transformer (λ (self stx) (let ([partially-applied-id (provide/contract-transformer-partially-applied-id self)] [saved-id-table (provide/contract-transformer-saved-id-table self)] - [rename-id (provide/contract-info-rename-id self)]) - (with-syntax ([partially-applied-id partially-applied-id]) + [rename-id (provide/contract-info-rename-id self)] + [blame (provide/contract-transformer-blame self)]) + (with-syntax ([partially-applied-id partially-applied-id] + [blame blame]) (if (eq? 'expression (syntax-local-context)) ;; In an expression context: (let* ([key (syntax-local-lift-context)] @@ -171,7 +173,9 @@ (syntax-local-introduce (syntax-local-lift-expression (add-lifted-property - #'(partially-applied-id (quote-module-name)))))))]) + #'(with-contract-continuation-mark + (cons blame 'no-negative-party) + (partially-applied-id (quote-module-name))))))))]) (when key (hash-set! saved-id-table key lifted-ctcd-val)) (define (adjust-location new-stx) (datum->syntax new-stx (syntax-e new-stx) stx new-stx)) @@ -195,13 +199,14 @@ ;; expressions: (quasisyntax/loc stx (#%expression #,stx))))))) - (define (make-provide/contract-transformer rename-id cid id eid pos [pid #f]) + (define (make-provide/contract-transformer rename-id cid id eid pos [pid #f] [blame #f]) (if pid - (provide/contract-transformer rename-id cid id (make-hasheq) pid) + (provide/contract-transformer rename-id cid id (make-hasheq) pid blame) (begin ;; TODO: this needs to change! ;; syntax/parse uses this ;; this will just drop contracts for now. + ;; VS: is this still the case? this function is not exported anymore (λ (stx) (syntax-case stx () [(_ args ...) @@ -286,12 +291,12 @@ [(->i . _) (values #t (->i-valid-app-shapes ctrct))] [_ (values #f #f)])) (with-syntax ([id id] - [(partially-applied-id extra-neg-party-argument-fn contract-id) - (generate-temporaries (list 'idX 'idY 'idZ))] + [(partially-applied-id extra-neg-party-argument-fn contract-id blame-id) + (generate-temporaries (list 'idX 'idY 'idZ 'idB))] [ctrct ctrct]) (syntax-local-lift-module-end-declaration #`(begin - (define partially-applied-id + (define-values (partially-applied-id blame-id) (do-partial-app contract-id id '#,name-for-blame @@ -322,7 +327,8 @@ (quote-syntax #,id-rename) (quote-syntax contract-id) (quote-syntax id) #f #f - (quote-syntax partially-applied-id))))))) + (quote-syntax partially-applied-id) + (quote-syntax blame-id))))))) (define-syntax (define-module-boundary-contract stx) (cond @@ -375,7 +381,7 @@ 'define-module-boundary-contract pos-blame-party-expr))])])) -;; ... -> (or/c #f (-> blame val)) +;; ... -> (values (or/c #f (-> neg-party val)) blame) (define (do-partial-app ctc val name pos-module-source source) (define p (parameterize ([warn-about-val-first? #f]) ;; when we're building the val-first projection @@ -388,14 +394,19 @@ (λ () (contract-name ctc)) pos-module-source #f #t)) - (define neg-accepter ((p blme) val)) - - ;; we don't have the negative blame here, but we - ;; expect only positive failures from this; do the - ;; check and then toss the results. - (neg-accepter 'incomplete-blame-from-provide.rkt) - - neg-accepter) + (with-contract-continuation-mark + (cons blme 'no-negative-party) ; we don't know the negative party yet + ;; computing neg-accepter may involve some front-loaded checking. instrument + (define neg-accepter ((p blme) val)) + + ;; check as much as we can while knowing only the + ;; contracted value (e.g., function arity) + ;; we don't have the negative blame here, but we + ;; expect only positive failures from this; do the + ;; check and then toss the results. + (neg-accepter 'incomplete-blame-from-provide.rkt) + + (values neg-accepter blme))) (define-for-syntax (true-provide/contract provide-stx just-check-errors? who) (syntax-case provide-stx () diff --git a/racket/collects/racket/contract/private/struct-dc.rkt b/racket/collects/racket/contract/private/struct-dc.rkt index b422a1e69f..524bdd4e64 100644 --- a/racket/collects/racket/contract/private/struct-dc.rkt +++ b/racket/collects/racket/contract/private/struct-dc.rkt @@ -330,6 +330,7 @@ (define mut-indy-proj (car mut-indy-projs)) (define sel (and (subcontract? subcontract) (subcontract-ref subcontract))) (define blame (car blames)) + (define blame+neg-party (cons blame neg-party)) (define mut-blame (car mut-blames)) (define indy-blame (car indy-blames)) (define mut-indy-blame (car mut-indy-blames)) @@ -344,7 +345,7 @@ (cond [(invariant? subcontract) (unless (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (apply (invariant-dep-proc subcontract) dep-args)) (raise-invariant-blame-failure blame neg-party v (reverse dep-args) @@ -352,7 +353,7 @@ (values chaperone-args impersonate-args)] [(immutable? subcontract) (define (chk fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) (chk #f (sel v)) ;; check the field contract immediately (values (if (flat-contract? (indep-ctc subcontract)) @@ -363,7 +364,7 @@ (values (list* sel (cache-λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) chaperone-args) impersonate-args)] @@ -373,23 +374,23 @@ (list* sel (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) (mutable-set subcontract) (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (mut-proj v neg-party))) impersonate-args)) (values (list* sel (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) (mutable-set subcontract) (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (mut-proj v neg-party))) chaperone-args) impersonate-args))] @@ -398,7 +399,7 @@ (cond [(dep-immutable? subcontract) (define (chk fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) (chk #f (sel v)) ;; check the field contract immediately (values (if (flat-contract? dep-ctc) @@ -409,7 +410,7 @@ (values (list* sel (cache-λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) chaperone-args) impersonate-args)] @@ -419,12 +420,12 @@ (values (list* sel (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) (dep-mutable-set subcontract) (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (mut-proj v neg-party))) chaperone-args) impersonate-args) @@ -432,12 +433,12 @@ (list* sel (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (proj v neg-party))) (dep-mutable-set subcontract) (λ (fld v) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (mut-proj v neg-party))) impersonate-args)))] [(dep-on-state-immutable? subcontract) @@ -445,7 +446,7 @@ (values (list* sel (λ (strct val) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (build-dep-on-state-proj (base-struct/dc-subcontracts ctc) subcontract strct orig-indy-projs orig-indy-blames blame neg-party val))) @@ -455,13 +456,13 @@ (proj (sel v) neg-party) (define (get-chap-proc strct val) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (build-dep-on-state-proj (base-struct/dc-subcontracts ctc) subcontract strct orig-indy-projs orig-indy-blames blame neg-party val))) (define (set-chap-proc strct val) (with-contract-continuation-mark - (cons blame neg-party) + blame+neg-party (build-dep-on-state-proj (base-struct/dc-subcontracts ctc) subcontract strct orig-mut-indy-projs orig-mut-indy-blames mut-blame neg-party val))) diff --git a/racket/collects/racket/contract/private/struct-prop.rkt b/racket/collects/racket/contract/private/struct-prop.rkt index b468aa215f..6c3f2edc51 100644 --- a/racket/collects/racket/contract/private/struct-prop.rkt +++ b/racket/collects/racket/contract/private/struct-prop.rkt @@ -16,11 +16,14 @@ (raise-blame-error input-blame x #:neg-party '(expected "struct-type-property" given: "~e") x)) + (define blame+neg-party (cons blame neg-party)) (define-values (nprop _pred _acc) (make-struct-type-property (wrap-name x) (lambda (val _info) - (late-neg-proj val neg-party)) + (with-contract-continuation-mark + blame+neg-party + (late-neg-proj val neg-party))) (list (cons x values)))) nprop))) diff --git a/racket/collects/racket/contract/private/vector.rkt b/racket/collects/racket/contract/private/vector.rkt index f0bcf66865..a547edf76d 100644 --- a/racket/collects/racket/contract/private/vector.rkt +++ b/racket/collects/racket/contract/private/vector.rkt @@ -365,14 +365,11 @@ (for/list ([c (in-list (base-vector/c-elems ctc))]) ((get/build-late-neg-projection c) blame+ctxt))) (λ (val neg-party) - (with-contract-continuation-mark - (cons blame neg-party) - (begin - (check-vector/c ctc val blame neg-party) - (for ([e (in-vector val)] - [p (in-list val+np-acceptors)]) - (p e neg-party)) - val))))))) + (check-vector/c ctc val blame neg-party) + (for ([e (in-vector val)] + [p (in-list val+np-acceptors)]) + (p e neg-party)) + val))))) (define (vector/c-ho-late-neg-projection vector-wrapper) (λ (ctc) diff --git a/racket/collects/racket/match/match-expander.rkt b/racket/collects/racket/match/match-expander.rkt index c40632dd9a..60a9b8730d 100644 --- a/racket/collects/racket/match/match-expander.rkt +++ b/racket/collects/racket/match/match-expander.rkt @@ -11,13 +11,30 @@ #:property prop:set!-transformer (λ (me stx) (define xf (match-expander-macro-xform me)) - (if (set!-transformer? xf) - ((set!-transformer-procedure xf) stx) - (syntax-case stx (set!) - [(set! . _) - (raise-syntax-error #f "cannot mutate syntax identifier" stx)] - [_ (xf stx)]))) - #:property prop:match-expander (struct-field-index match-xform) + (define proc + (cond [(rename-transformer? xf) + (lambda (x) + (define target (rename-transformer-target xf)) + (syntax-case stx (set!) + [(set! id args ...) + #`(set! #,target args ...)] + [(id args ...) + (datum->syntax stx + `(,target ,@(syntax->list #'(args ...))) + stx stx)] + [_ (rename-transformer-target xf)]))] + [(set!-transformer? xf) (set!-transformer-procedure xf)] + [(procedure? xf) + (lambda (stx) + (syntax-case stx (set!) + [(set! . _) + (raise-syntax-error #f "cannot mutate syntax identifier" stx)] + [_ (xf stx)]))] + [else (raise-syntax-error + #f + "not a procedure for match expander transformer" stx)])) + (proc stx)) + #:property prop:match-expander (struct-field-index match-xform) #:property prop:legacy-match-expander (struct-field-index legacy-xform)) (values make-match-expander)))) diff --git a/racket/collects/racket/private/class-c-old.rkt b/racket/collects/racket/private/class-c-old.rkt index 22e31cf62d..0618e0c02e 100644 --- a/racket/collects/racket/private/class-c-old.rkt +++ b/racket/collects/racket/private/class-c-old.rkt @@ -1649,6 +1649,15 @@ (define prj (contract-late-neg-projection c)) (define p-pos (prj (blame-add-field-context blame f #:swap? #f))) (define p-neg (prj (blame-add-field-context blame f #:swap? #t))) - (hash-set! field-ht f (field-info-extend-external fi p-pos p-neg neg-party))))) + (hash-set! field-ht f (field-info-extend-external fi + (lambda args + (with-contract-continuation-mark + (cons blame neg-party) + (apply p-pos args))) + (lambda args + (with-contract-continuation-mark + (cons blame neg-party) + (apply p-neg args))) + neg-party))))) (copy-seals cls c))) diff --git a/racket/collects/racket/private/for.rkt b/racket/collects/racket/private/for.rkt index c95664af1a..65b4defe5c 100644 --- a/racket/collects/racket/private/for.rkt +++ b/racket/collects/racket/private/for.rkt @@ -48,10 +48,10 @@ (rename *in-port in-port) (rename *in-lines in-lines) (rename *in-bytes-lines in-bytes-lines) - in-hash - in-hash-keys - in-hash-values - in-hash-pairs + (rename *in-hash in-hash) + (rename *in-hash-keys in-hash-keys) + (rename *in-hash-values in-hash-values) + (rename *in-hash-pairs in-hash-pairs) in-directory in-sequences @@ -664,12 +664,93 @@ (values (hash-iterate-key ht pos) (hash-iterate-value ht pos))))) + (define-sequence-syntax *in-hash + (lambda () #'in-hash) + (lambda (stx) + (syntax-case stx () + [[(k v) (_ ht-expr)] + (for-clause-syntax-protect + #'[(k v) + (:do-in + ;;outer bindings + ([(ht) ht-expr]) + ;; outer check + (unless (hash? ht) (in-hash ht)) + ;; loop bindings + ([i (hash-iterate-first ht)]) + ;; pos check + i + ;; inner bindings + ([(k v) (values (hash-iterate-key ht i) + (hash-iterate-value ht i))]) + ;; pre guard + #t + ;; post guard + #t + ;; loop args + ((hash-iterate-next ht i)))])] + [_ #f]))) + (define (in-hash-keys ht) (unless (hash? ht) (raise-argument-error 'in-hash-keys "hash?" ht)) (make-do-sequence (lambda () (:hash-gen ht hash-iterate-key)))) + + (define-sequence-syntax *in-hash-keys + (lambda () #'in-hash-keys) + (lambda (stx) + (syntax-case stx () + [[(id) (_ ht-expr)] + (for-clause-syntax-protect + #'[(id) + (:do-in + ;;outer bindings + ([(ht) ht-expr]) + ;; outer check + (unless (hash? ht) (in-hash-keys ht)) + ;; loop bindings + ([i (hash-iterate-first ht)]) + ;; pos check + i + ;; inner bindings + ([(id) (hash-iterate-key ht i)]) + ;; pre guard + #t + ;; post guard + #t + ;; loop args + ((hash-iterate-next ht i)))])] + [_ #f]))) + (define (in-hash-values ht) (unless (hash? ht) (raise-argument-error 'in-hash-values "hash?" ht)) (make-do-sequence (lambda () (:hash-gen ht hash-iterate-value)))) + + (define-sequence-syntax *in-hash-values + (lambda () #'in-hash-values) + (lambda (stx) + (syntax-case stx () + [[(id) (_ ht-expr)] + (for-clause-syntax-protect + #'[(id) + (:do-in + ;;outer bindings + ([(ht) ht-expr]) + ;; outer check + (unless (hash? ht) (in-hash-values ht)) + ;; loop bindings + ([i (hash-iterate-first ht)]) + ;; pos check + i + ;; inner bindings + ([(id) (hash-iterate-value ht i)]) + ;; pre guard + #t + ;; post guard + #t + ;; loop args + ((hash-iterate-next ht i)))])] + [_ #f]))) + (define (in-hash-pairs ht) (unless (hash? ht) (raise-argument-error 'in-hash-values "hash?" ht)) (make-do-sequence (lambda () @@ -677,6 +758,33 @@ (cons (hash-iterate-key ht pos) (hash-iterate-value ht pos))))))) + (define-sequence-syntax *in-hash-pairs + (lambda () #'in-hash-pairs) + (lambda (stx) + (syntax-case stx () + [[(id) (_ ht-expr)] + (for-clause-syntax-protect + #'[(id) + (:do-in + ;;outer bindings + ([(ht) ht-expr]) + ;; outer check + (unless (hash? ht) (in-hash-pairs ht)) + ;; loop bindings + ([i (hash-iterate-first ht)]) + ;; pos check + i + ;; inner bindings + ([(id) (cons (hash-iterate-key ht i) + (hash-iterate-value ht i))]) + ;; pre guard + #t + ;; post guard + #t + ;; loop args + ((hash-iterate-next ht i)))])] + [_ #f]))) + (define (:hash-gen ht sel) (values (lambda (pos) (sel ht pos)) (lambda (pos) (hash-iterate-next ht pos)) diff --git a/racket/collects/racket/private/kw.rkt b/racket/collects/racket/private/kw.rkt index 14eef699e8..60ddd987ba 100644 --- a/racket/collects/racket/private/kw.rkt +++ b/racket/collects/racket/private/kw.rkt @@ -2,7 +2,11 @@ (#%require "define.rkt" "small-scheme.rkt" "more-scheme.rkt" + (only '#%unsafe + unsafe-chaperone-procedure + unsafe-impersonate-procedure) (for-syntax '#%kernel + '#%unsafe "procedure-alias.rkt" "stx.rkt" "small-scheme.rkt" @@ -26,7 +30,9 @@ new:procedure->method new:procedure-rename new:chaperone-procedure + (protect new:unsafe-chaperone-procedure) new:impersonate-procedure + (protect new:unsafe-impersonate-procedure) new:chaperone-procedure* new:impersonate-procedure* (for-syntax kw-expander? kw-expander-impl kw-expander-proc @@ -634,7 +640,7 @@ (let ([#,core-id #,impl]) (let ([#,unpack-id #,kwimpl]) #,wrap)))))) - #`(#%expression #,stx)))]) + (quasisyntax/loc stx (#%expression #,stx))))]) (values new-lambda new-lambda))) (define (missing-kw proc . args) @@ -1529,12 +1535,24 @@ (do-chaperone-procedure #f #f chaperone-procedure 'chaperone-procedure proc wrap-proc props))]) chaperone-procedure)) + (define new:unsafe-chaperone-procedure + (let ([unsafe-chaperone-procedure + (lambda (proc wrap-proc . props) + (do-unsafe-chaperone-procedure unsafe-chaperone-procedure 'unsafe-chaperone-procedure proc wrap-proc props))]) + unsafe-chaperone-procedure)) + (define new:impersonate-procedure (let ([impersonate-procedure (lambda (proc wrap-proc . props) (do-chaperone-procedure #t #f impersonate-procedure 'impersonate-procedure proc wrap-proc props))]) impersonate-procedure)) + (define new:unsafe-impersonate-procedure + (let ([unsafe-impersonate-procedure + (lambda (proc wrap-proc . props) + (do-unsafe-chaperone-procedure unsafe-impersonate-procedure 'unsafe-impersonate-procedure proc wrap-proc props))]) + unsafe-impersonate-procedure)) + (define new:chaperone-procedure* (let ([chaperone-procedure* (lambda (proc wrap-proc . props) @@ -1553,52 +1571,10 @@ (if (or (not (keyword-procedure? n-proc)) (not (procedure? wrap-proc)) ;; if any bad prop, let `chaperone-procedure' complain - (let loop ([props props]) - (cond - [(null? props) #f] - [(impersonator-property? (car props)) - (let ([props (cdr props)]) - (or (null? props) - (loop (cdr props))))] - [else #t]))) + (bad-props? props)) (apply chaperone-procedure proc wrap-proc props) - (let-values ([(a) (procedure-arity proc)] - [(b) (procedure-arity wrap-proc)] - [(d) (if self-arg? 1 0)] - [(a-req a-allow) (procedure-keywords proc)] - [(b-req b-allow) (procedure-keywords wrap-proc)]) - (define (includes? a b) - (cond - [(number? b) (cond - [(number? a) (= b (+ a d))] - [(arity-at-least? a) - (b . >= . (+ (arity-at-least-value a) d))] - [else - (ormap (lambda (a) (includes? a b)) a)])] - [(arity-at-least? b) (cond - [(number? a) #f] - [(arity-at-least? a) - ((arity-at-least-value b) . >= . (+ (arity-at-least-value a) d))] - [else (ormap (lambda (a) (includes? b a)) a)])] - [else (andmap (lambda (b) (includes? a b)) b)])) - - (unless (includes? b a) - ;; Let core report error: - (apply chaperone-procedure proc wrap-proc props)) - (unless (subset? b-req a-req) - (raise-arguments-error - name - "wrapper procedure requires more keywords than original procedure" - "wrapper procedure" wrap-proc - "original procedure" proc)) - (unless (or (not b-allow) - (and a-allow - (subset? a-allow b-allow))) - (raise-arguments-error - name - "wrapper procedure does not accept all keywords of original procedure" - "wrapper procedure" wrap-proc - "original procedure" proc)) + (begin + (chaperone-arity-match-checking self-arg? name proc wrap-proc props) (let*-values ([(kw-chaperone) (let ([p (keyword-procedure-proc n-wrap-proc)]) ;; `extra-arg ...` will be `self-proc` if `self-arg?`: @@ -1759,6 +1735,68 @@ chap-accessor #f props))))))) + (define (do-unsafe-chaperone-procedure unsafe-chaperone-procedure name proc wrap-proc props) + (let ([n-proc (normalize-proc proc)] + [n-wrap-proc (normalize-proc wrap-proc)]) + (if (or (not (keyword-procedure? n-proc)) + (not (procedure? wrap-proc)) + ;; if any bad prop, let `unsafe-chaperone-procedure' complain + (bad-props? props)) + (apply unsafe-chaperone-procedure proc wrap-proc props) + (begin + (chaperone-arity-match-checking #f name proc wrap-proc props) + (apply unsafe-chaperone-procedure proc wrap-proc props))))) + + (define (bad-props? props) + (let loop ([props props]) + (cond + [(null? props) #f] + [(impersonator-property? (car props)) + (let ([props (cdr props)]) + (or (null? props) + (loop (cdr props))))] + [else #t]))) + + (define (chaperone-arity-match-checking self-arg? name proc wrap-proc props) + (let-values ([(a) (procedure-arity proc)] + [(b) (procedure-arity wrap-proc)] + [(d) (if self-arg? 1 0)] + [(a-req a-allow) (procedure-keywords proc)] + [(b-req b-allow) (procedure-keywords wrap-proc)]) + (define (includes? a b) + (cond + [(number? b) (cond + [(number? a) (= b (+ a d))] + [(arity-at-least? a) + (b . >= . (+ (arity-at-least-value a) d))] + [else + (ormap (lambda (a) (includes? a b)) a)])] + [(arity-at-least? b) (cond + [(number? a) #f] + [(arity-at-least? a) + ((arity-at-least-value b) . >= . (+ (arity-at-least-value a) d))] + [else (ormap (lambda (a) (includes? b a)) a)])] + [else (andmap (lambda (b) (includes? a b)) b)])) + + (unless (includes? b a) + ;; Let core report error: + (apply chaperone-procedure proc wrap-proc props)) + (unless (subset? b-req a-req) + (raise-arguments-error + name + "wrapper procedure requires more keywords than original procedure" + "wrapper procedure" wrap-proc + "original procedure" proc)) + (unless (or (not b-allow) + (and a-allow + (subset? a-allow b-allow))) + (raise-arguments-error + name + "wrapper procedure does not accept all keywords of original procedure" + "wrapper procedure" wrap-proc + "original procedure" proc)) + (void))) + (define (normalize-proc proc) ;; If `proc' gets keyword support through `new-prop:procedure', ;; then wrap it to normalize to to something that matches diff --git a/racket/collects/racket/sequence.rkt b/racket/collects/racket/sequence.rkt index d8d1e26848..f07d4b9c72 100644 --- a/racket/collects/racket/sequence.rkt +++ b/racket/collects/racket/sequence.rkt @@ -218,6 +218,7 @@ orig-blame #:missing-party neg-party seq '(expected: "a sequence" given: "~e") seq)) + (define blame+neg-party (cons orig-blame neg-party)) (define result-seq (make-do-sequence (lambda () @@ -228,7 +229,9 @@ next (case-lambda [(elem) - (p elem neg-party)] + (with-contract-continuation-mark + blame+neg-party + (p elem neg-party))] [elems (define n-elems (length elems)) (raise-blame-error @@ -251,6 +254,7 @@ orig-blame #:missing-party neg-party seq '(expected: "a sequence" given: "~e") seq)) + (define blame+neg-party (cons orig-blame neg-party)) (define result-seq (make-do-sequence (lambda () @@ -260,17 +264,19 @@ (call-with-values next (lambda elems - (define n-elems (length elems)) - (unless (= n-elems n-cs) - (raise-blame-error - blame #:missing-party neg-party seq - '(expected: "a sequence of ~a values" given: "~a values\n values: ~e") - n-cs n-elems elems)) - (apply - values - (for/list ([elem (in-list elems)] - [p (in-list ps)]) - (p elem neg-party)))))) + (with-contract-continuation-mark + blame+neg-party + (define n-elems (length elems)) + (unless (= n-elems n-cs) + (raise-blame-error + blame #:missing-party neg-party seq + '(expected: "a sequence of ~a values" given: "~a values\n values: ~e") + n-cs n-elems elems)) + (apply + values + (for/list ([elem (in-list elems)] + [p (in-list ps)]) + (p elem neg-party))))))) add1 0 (lambda (idx) diff --git a/racket/collects/racket/set.rkt b/racket/collects/racket/set.rkt index 8df5a90110..9c0fd16673 100644 --- a/racket/collects/racket/set.rkt +++ b/racket/collects/racket/set.rkt @@ -198,6 +198,7 @@ (λ (val neg-party) (set-contract-check cmp kind blame neg-party val) (define (pos-interpose val ele) (late-neg-pos-proj ele neg-party)) + (define blame+neg-party (cons blame neg-party)) (cond [(set? val) (chaperone-hash-set @@ -205,31 +206,44 @@ (λ (val ele) ele) (λ (val ele) ele) (λ (val ele) ele) - (λ (val ele) (late-neg-pos-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-pos-proj ele neg-party))) (λ (val) (void)) - (λ (val ele) (late-neg-equal-key-pos-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-equal-key-pos-proj ele neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame (cons blame neg-party))] [else (chaperone-hash-set val (λ (val ele) ele) - (λ (val ele) (late-neg-neg-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-neg-proj ele neg-party))) (λ (val ele) ele) - (λ (val ele) (late-neg-pos-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-pos-proj ele neg-party))) (λ (val) (void)) - (λ (val ele) (late-neg-equal-key-pos-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-equal-key-pos-proj ele neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame (cons blame neg-party))]))] [else (λ (val neg-party) + (define blame+neg-party (cons blame neg-party)) (set-contract-check cmp kind blame neg-party val) (cond [(set? val) (chaperone-hash-set (for/fold ([s (set-clear val)]) ([e (in-set val)]) - (set-add s (late-neg-pos-proj e neg-party))) + (set-add s (with-contract-continuation-mark + blame+neg-party + (late-neg-pos-proj e neg-party)))) #f #f #f impersonator-prop:contracted ctc impersonator-prop:blame (cons blame neg-party))] @@ -240,11 +254,17 @@ (chaperone-hash-set val (λ (val ele) ele) - (λ (val ele) (late-neg-neg-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-neg-proj ele neg-party))) (λ (val ele) ele) - (λ (val ele) (late-neg-pos-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-pos-proj ele neg-party))) (λ (val) (void)) - (λ (val ele) (late-neg-equal-key-pos-proj ele neg-party)) + (λ (val ele) (with-contract-continuation-mark + blame+neg-party + (late-neg-equal-key-pos-proj ele neg-party))) impersonator-prop:contracted ctc impersonator-prop:blame (cons blame neg-party))]))]))) diff --git a/racket/collects/racket/stream.rkt b/racket/collects/racket/stream.rkt index a2d9220c78..362b3941fa 100644 --- a/racket/collects/racket/stream.rkt +++ b/racket/collects/racket/stream.rkt @@ -256,15 +256,20 @@ (unless (stream? val) (raise-blame-error blame #:missing-party neg-party val '(expected "a stream" given: "~e") val)) + (define blame+neg-party (cons blame neg-party)) (if (list? val) (listof-elem-ctc-neg-acceptor val neg-party) (impersonate/chaperone-stream val - (λ (v) (elem-ctc-late-neg-acceptor v neg-party)) + (λ (v) (with-contract-continuation-mark + blame+neg-party + (elem-ctc-late-neg-acceptor v neg-party))) (λ (v) - (if (list? v) - (listof-elem-ctc-neg-acceptor v neg-party) - (stream/c-late-neg-proj-val-acceptor v neg-party))) + (with-contract-continuation-mark + blame+neg-party + (if (list? v) + (listof-elem-ctc-neg-acceptor v neg-party) + (stream/c-late-neg-proj-val-acceptor v neg-party)))) impersonator-prop:contracted ctc impersonator-prop:blame stream-blame))) stream/c-late-neg-proj-val-acceptor)) diff --git a/racket/collects/racket/unsafe/ops.rkt b/racket/collects/racket/unsafe/ops.rkt index 04a38c590e..bd1d4527b1 100644 --- a/racket/collects/racket/unsafe/ops.rkt +++ b/racket/collects/racket/unsafe/ops.rkt @@ -1,14 +1,19 @@ #lang racket/base (require '#%unsafe '#%flfxnum - '#%extfl) + '#%extfl + "../private/kw.rkt") (provide (except-out (all-from-out '#%unsafe) unsafe-undefined check-not-unsafe-undefined check-not-unsafe-undefined/assign prop:chaperone-unsafe-undefined - chaperone-struct-unsafe-undefined) + chaperone-struct-unsafe-undefined + unsafe-chaperone-procedure + unsafe-impersonate-procedure) + (rename-out [new:unsafe-impersonate-procedure unsafe-impersonate-procedure] + [new:unsafe-chaperone-procedure unsafe-chaperone-procedure]) (prefix-out unsafe- (combine-out flsin flcos fltan flasin flacos flatan diff --git a/racket/collects/syntax/id-table.rkt b/racket/collects/syntax/id-table.rkt index 1a70a3986c..bbc553eb86 100644 --- a/racket/collects/syntax/id-table.rkt +++ b/racket/collects/syntax/id-table.rkt @@ -130,20 +130,35 @@ (define pos-rng-proj (id-table/c-rng-pos-proj ctc blame)) (define neg-rng-proj (id-table/c-rng-neg-proj ctc blame)) (lambda (tbl neg-party) + (define blame+neg-party (cons blame neg-party)) (check-id-table/c ctc tbl blame neg-party) ;;TODO for immutable hash tables optimize this chaperone to a flat ;;check if possible (if (immutable-idtbl? tbl) - (chaperone-immutable-id-table tbl - (λ (val) (pos-dom-proj val neg-party)) - (λ (val) (pos-rng-proj val neg-party)) - impersonator-prop:contracted ctc) - (chaperone-mutable-id-table tbl - (λ (val) (neg-dom-proj val neg-party)) - (λ (val) (pos-dom-proj val neg-party)) - (λ (val) (neg-rng-proj val neg-party)) - (λ (val) (pos-rng-proj val neg-party)) - impersonator-prop:contracted ctc))))) + (chaperone-immutable-id-table + tbl + (λ (val) (with-contract-continuation-mark + blame+neg-party + (pos-dom-proj val neg-party))) + (λ (val) (with-contract-continuation-mark + blame+neg-party + (pos-rng-proj val neg-party))) + impersonator-prop:contracted ctc) + (chaperone-mutable-id-table + tbl + (λ (val) (with-contract-continuation-mark + blame+neg-party + (neg-dom-proj val neg-party))) + (λ (val) (with-contract-continuation-mark + blame+neg-party + (pos-dom-proj val neg-party))) + (λ (val) (with-contract-continuation-mark + blame+neg-party + (neg-rng-proj val neg-party))) + (λ (val) (with-contract-continuation-mark + blame+neg-party + (pos-rng-proj val neg-party))) + impersonator-prop:contracted ctc))))) (struct flat-id-table/c base-id-table/c () #:omit-define-syntaxes diff --git a/racket/src/racket/src/cstartup.inc b/racket/src/racket/src/cstartup.inc index 574a9b0113..d485711a30 100644 --- a/racket/src/racket/src/cstartup.inc +++ b/racket/src/racket/src/cstartup.inc @@ -1,1580 +1,1579 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,54,46,51,46,48,46,49,48,84,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,1,0,0,8,0,18, -0,22,0,26,0,31,0,38,0,42,0,47,0,59,0,66,0,69,0,82,0, -89,0,94,0,103,0,109,0,123,0,137,0,140,0,146,0,157,0,159,0,173, -0,180,0,202,0,204,0,218,0,246,0,251,0,255,0,72,1,79,1,90,1, -128,1,135,1,144,1,177,1,210,1,16,2,21,2,102,2,107,2,112,2,133, -2,30,3,51,3,104,3,173,3,242,3,132,4,24,5,35,5,118,5,0,0, -148,7,0,0,3,1,5,105,110,115,112,48,71,35,37,109,105,110,45,115,116, -120,29,11,11,11,65,97,110,100,66,99,111,110,100,68,100,101,102,105,110,101, -65,108,101,116,66,108,101,116,42,73,108,101,116,42,45,118,97,108,117,101,115, -68,108,101,116,114,101,99,64,111,114,74,112,97,114,97,109,101,116,101,114,105, -122,101,68,117,110,108,101,115,115,66,119,104,101,110,70,104,101,114,101,45,115, -116,120,67,113,117,111,116,101,29,94,2,16,70,35,37,107,101,114,110,101,108, -11,29,94,2,16,70,35,37,112,97,114,97,109,122,11,64,105,102,67,98,101, -103,105,110,72,108,101,116,45,118,97,108,117,101,115,63,120,75,108,101,116,114, -101,99,45,118,97,108,117,101,115,68,108,97,109,98,100,97,1,20,112,97,114, -97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,63,118,75,100, -101,102,105,110,101,45,118,97,108,117,101,115,38,28,16,3,93,16,2,29,11, -11,11,2,3,2,29,93,143,16,5,39,2,31,40,2,34,2,2,39,38,29, -93,2,30,36,30,0,39,36,31,1,145,40,143,2,32,16,4,2,17,39,39, -2,1,143,2,32,16,4,2,18,39,39,2,1,16,22,2,4,2,33,2,5, -2,33,2,6,2,33,2,7,2,33,2,8,2,33,2,9,2,33,2,10,2, -33,2,11,2,33,2,12,2,33,2,13,2,33,2,14,2,33,38,32,143,2, -31,2,29,38,33,93,143,2,32,143,2,1,2,3,36,34,2,144,40,143,2, -35,16,4,2,17,40,39,2,1,16,2,2,15,93,143,2,35,147,2,1,2, -3,40,2,15,143,2,3,40,2,15,38,35,143,2,34,2,29,18,143,66,104, -101,114,101,2,28,27,248,22,165,4,195,249,22,158,4,80,143,42,39,251,22, -91,2,19,248,22,103,199,12,249,22,81,2,20,248,22,105,201,27,248,22,165, -4,195,249,22,158,4,80,143,42,39,251,22,91,2,19,248,22,103,199,249,22, -81,2,20,248,22,105,201,12,27,248,22,83,248,22,165,4,196,28,248,22,89, -193,20,14,144,40,39,40,28,248,22,89,248,22,83,194,248,22,170,20,193,249, -22,158,4,80,143,42,39,251,22,91,2,19,248,22,170,20,199,249,22,81,2, -4,248,22,171,20,201,11,18,143,10,2,28,27,248,22,83,248,22,165,4,196, -28,248,22,89,193,20,14,144,40,39,40,28,248,22,89,248,22,83,194,248,22, -170,20,193,249,22,158,4,80,143,42,39,250,22,91,2,21,248,22,91,249,22, -91,248,22,91,2,22,248,22,170,20,201,251,22,91,2,19,2,22,2,22,249, -22,81,2,11,248,22,171,20,204,18,143,11,2,28,248,22,165,4,193,27,248, -22,165,4,194,249,22,81,248,22,91,248,22,82,196,248,22,171,20,195,27,248, -22,83,248,22,165,4,23,197,1,249,22,158,4,80,143,42,39,28,248,22,65, -248,22,159,4,248,22,82,23,198,2,27,249,22,2,32,0,88,148,8,36,40, -46,11,9,222,33,43,248,22,165,4,248,22,103,23,200,2,250,22,91,2,23, -248,22,91,249,22,91,248,22,91,248,22,170,20,23,204,2,250,22,92,2,24, -249,22,2,22,82,23,204,2,248,22,105,23,206,2,249,22,81,248,22,170,20, -23,202,1,249,22,2,22,103,23,200,1,250,22,92,2,21,249,22,2,32,0, -88,148,8,36,40,50,11,9,222,33,44,248,22,165,4,248,22,170,20,201,248, -22,171,20,198,27,248,22,165,4,194,249,22,81,248,22,91,248,22,82,196,248, -22,171,20,195,27,248,22,83,248,22,165,4,23,197,1,249,22,158,4,80,143, -42,39,250,22,92,2,23,249,22,2,32,0,88,148,8,36,40,50,11,9,222, -33,46,248,22,165,4,248,22,82,201,248,22,171,20,198,27,248,22,83,248,22, -165,4,196,27,248,22,165,4,248,22,82,195,249,22,158,4,80,143,43,39,28, -248,22,89,195,250,22,92,2,21,9,248,22,171,20,199,250,22,91,2,7,248, -22,91,248,22,82,199,250,22,92,2,8,248,22,171,20,201,248,22,171,20,202, -27,248,22,83,248,22,165,4,196,27,248,22,165,4,248,22,82,195,249,22,158, -4,80,143,43,39,28,248,22,89,195,250,22,92,2,21,9,248,22,171,20,199, -250,22,91,2,21,248,22,91,248,22,82,199,250,22,92,2,9,248,22,171,20, -201,248,22,171,20,202,27,248,22,83,248,22,165,4,23,197,1,27,249,22,1, -22,95,249,22,2,22,165,4,248,22,165,4,248,22,82,199,248,22,186,4,249, -22,158,4,80,143,44,39,251,22,91,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,25,250,22,92,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,25,202,250,22,92,2,21,9, -248,22,171,20,204,27,248,22,83,248,22,165,4,196,28,248,22,89,193,20,14, -144,40,39,40,249,22,158,4,80,143,42,39,27,248,22,165,4,248,22,82,197, -28,249,22,170,9,64,61,62,248,22,159,4,248,22,103,196,250,22,91,2,21, -248,22,91,249,22,91,21,93,2,26,248,22,170,20,199,250,22,92,2,5,249, -22,91,2,26,249,22,91,248,22,112,203,2,26,248,22,171,20,202,251,22,91, -2,19,28,249,22,170,9,248,22,159,4,248,22,170,20,200,66,101,108,115,101, -10,248,22,170,20,197,250,22,92,2,21,9,248,22,171,20,200,249,22,81,2, -5,248,22,171,20,202,18,143,94,10,66,118,111,105,100,2,28,27,248,22,83, -248,22,165,4,196,249,22,158,4,80,143,42,39,28,248,22,65,248,22,159,4, -248,22,82,197,250,22,91,2,27,248,22,91,248,22,170,20,199,248,22,103,198, -27,248,22,159,4,248,22,170,20,197,250,22,91,2,27,248,22,91,248,22,82, -197,250,22,92,2,24,248,22,171,20,199,248,22,171,20,202,145,39,9,20,121, -145,2,1,39,16,1,11,16,0,20,27,15,61,9,2,2,2,2,2,3,11, -11,11,11,9,9,11,11,11,10,39,80,143,39,39,20,121,145,2,1,39,16, -0,16,0,41,42,39,16,0,39,16,0,39,11,11,11,16,11,2,4,2,5, -2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,16,11,11, -11,11,11,11,11,11,11,11,11,11,16,11,2,4,2,5,2,6,2,7,2, -8,2,9,2,10,2,11,2,12,2,13,2,14,39,50,40,16,0,39,16,1, -2,15,40,11,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16, -0,16,0,39,39,16,12,16,5,11,20,15,16,2,20,14,144,39,39,40,80, -143,39,39,39,20,121,145,2,1,39,16,1,2,15,16,1,33,36,10,16,5, -2,13,88,148,8,36,40,56,40,9,223,0,33,37,39,20,121,145,2,1,39, -16,1,2,15,16,0,11,16,5,2,14,88,148,8,36,40,56,40,9,223,0, -33,38,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,5,2,4,88, -148,8,36,40,56,42,9,223,0,33,39,39,20,121,145,2,1,39,16,1,2, -15,16,1,33,40,11,16,5,2,11,88,148,8,36,40,59,42,9,223,0,33, -41,39,20,121,145,2,1,39,16,1,2,15,16,1,33,42,11,16,5,2,7, -88,148,8,36,40,61,40,9,223,0,33,45,39,20,121,145,2,1,39,16,1, -2,15,16,0,11,16,5,2,10,88,148,8,36,40,56,40,9,223,0,33,47, -39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,5,2,8,88,148,8, -36,40,57,40,9,223,0,33,48,39,20,121,145,2,1,39,16,1,2,15,16, -0,11,16,5,2,9,88,148,8,36,40,57,40,9,223,0,33,49,39,20,121, -145,2,1,39,16,1,2,15,16,0,11,16,5,2,12,88,148,8,36,40,59, -40,9,223,0,33,50,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16, -5,2,5,88,148,8,36,40,61,42,9,223,0,33,51,39,20,121,145,2,1, -39,16,1,2,15,16,1,33,52,11,16,5,2,6,88,148,8,36,40,57,40, -9,223,0,33,53,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,0, -94,2,17,2,18,93,2,17,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 2091); + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,54,0,0,0,1,0,0,8,0,18,0, +22,0,26,0,31,0,38,0,42,0,47,0,59,0,66,0,69,0,82,0,89, +0,94,0,103,0,109,0,123,0,137,0,140,0,146,0,157,0,159,0,173,0, +180,0,202,0,204,0,218,0,246,0,251,0,255,0,72,1,79,1,90,1,128, +1,135,1,144,1,177,1,210,1,16,2,21,2,102,2,107,2,112,2,133,2, +30,3,51,3,104,3,173,3,242,3,132,4,24,5,35,5,118,5,0,0,148, +7,0,0,3,1,5,105,110,115,112,48,71,35,37,109,105,110,45,115,116,120, +29,11,11,11,65,97,110,100,66,99,111,110,100,68,100,101,102,105,110,101,65, +108,101,116,66,108,101,116,42,73,108,101,116,42,45,118,97,108,117,101,115,68, +108,101,116,114,101,99,64,111,114,74,112,97,114,97,109,101,116,101,114,105,122, +101,68,117,110,108,101,115,115,66,119,104,101,110,70,104,101,114,101,45,115,116, +120,67,113,117,111,116,101,29,94,2,16,70,35,37,107,101,114,110,101,108,11, +29,94,2,16,70,35,37,112,97,114,97,109,122,11,64,105,102,67,98,101,103, +105,110,72,108,101,116,45,118,97,108,117,101,115,63,120,75,108,101,116,114,101, +99,45,118,97,108,117,101,115,68,108,97,109,98,100,97,1,20,112,97,114,97, +109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,63,118,75,100,101, +102,105,110,101,45,118,97,108,117,101,115,38,28,16,3,93,16,2,29,11,11, +11,2,3,2,29,93,143,16,5,39,2,31,40,2,34,2,2,39,38,29,93, +2,30,36,30,0,39,36,31,1,145,40,143,2,32,16,4,2,17,39,39,2, +1,143,2,32,16,4,2,18,39,39,2,1,16,22,2,4,2,33,2,5,2, +33,2,6,2,33,2,7,2,33,2,8,2,33,2,9,2,33,2,10,2,33, +2,11,2,33,2,12,2,33,2,13,2,33,2,14,2,33,38,32,143,2,31, +2,29,38,33,93,143,2,32,143,2,1,2,3,36,34,2,144,40,143,2,35, +16,4,2,17,40,39,2,1,16,2,2,15,93,143,2,35,147,2,1,2,3, +40,2,15,143,2,3,40,2,15,38,35,143,2,34,2,29,18,143,66,104,101, +114,101,2,28,27,248,22,166,4,195,249,22,159,4,80,143,42,39,251,22,92, +2,19,248,22,104,199,12,249,22,82,2,20,248,22,106,201,27,248,22,166,4, +195,249,22,159,4,80,143,42,39,251,22,92,2,19,248,22,104,199,249,22,82, +2,20,248,22,106,201,12,27,248,22,84,248,22,166,4,196,28,248,22,90,193, +20,14,144,40,39,40,28,248,22,90,248,22,84,194,248,22,171,20,193,249,22, +159,4,80,143,42,39,251,22,92,2,19,248,22,171,20,199,249,22,82,2,4, +248,22,172,20,201,11,18,143,10,2,28,27,248,22,84,248,22,166,4,196,28, +248,22,90,193,20,14,144,40,39,40,28,248,22,90,248,22,84,194,248,22,171, +20,193,249,22,159,4,80,143,42,39,250,22,92,2,21,248,22,92,249,22,92, +248,22,92,2,22,248,22,171,20,201,251,22,92,2,19,2,22,2,22,249,22, +82,2,11,248,22,172,20,204,18,143,11,2,28,248,22,166,4,193,27,248,22, +166,4,194,249,22,82,248,22,92,248,22,83,196,248,22,172,20,195,27,248,22, +84,248,22,166,4,23,197,1,249,22,159,4,80,143,42,39,28,248,22,66,248, +22,160,4,248,22,83,23,198,2,27,249,22,2,32,0,88,148,8,36,40,46, +11,9,222,33,43,248,22,166,4,248,22,104,23,200,2,250,22,92,2,23,248, +22,92,249,22,92,248,22,92,248,22,171,20,23,204,2,250,22,93,2,24,249, +22,2,22,83,23,204,2,248,22,106,23,206,2,249,22,82,248,22,171,20,23, +202,1,249,22,2,22,104,23,200,1,250,22,93,2,21,249,22,2,32,0,88, +148,8,36,40,50,11,9,222,33,44,248,22,166,4,248,22,171,20,201,248,22, +172,20,198,27,248,22,166,4,194,249,22,82,248,22,92,248,22,83,196,248,22, +172,20,195,27,248,22,84,248,22,166,4,23,197,1,249,22,159,4,80,143,42, +39,250,22,93,2,23,249,22,2,32,0,88,148,8,36,40,50,11,9,222,33, +46,248,22,166,4,248,22,83,201,248,22,172,20,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,43,39,28,248, +22,90,195,250,22,93,2,21,9,248,22,172,20,199,250,22,92,2,7,248,22, +92,248,22,83,199,250,22,93,2,8,248,22,172,20,201,248,22,172,20,202,27, +248,22,84,248,22,166,4,196,27,248,22,166,4,248,22,83,195,249,22,159,4, +80,143,43,39,28,248,22,90,195,250,22,93,2,21,9,248,22,172,20,199,250, +22,92,2,21,248,22,92,248,22,83,199,250,22,93,2,9,248,22,172,20,201, +248,22,172,20,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,44,39,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,25,250,22,93,1,23,101,120, +116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, +21,95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107, +45,115,101,116,45,102,105,114,115,116,11,2,25,202,250,22,93,2,21,9,248, +22,172,20,204,27,248,22,84,248,22,166,4,196,28,248,22,90,193,20,14,144, +40,39,40,249,22,159,4,80,143,42,39,27,248,22,166,4,248,22,83,197,28, +249,22,171,9,64,61,62,248,22,160,4,248,22,104,196,250,22,92,2,21,248, +22,92,249,22,92,21,93,2,26,248,22,171,20,199,250,22,93,2,5,249,22, +92,2,26,249,22,92,248,22,113,203,2,26,248,22,172,20,202,251,22,92,2, +19,28,249,22,171,9,248,22,160,4,248,22,171,20,200,66,101,108,115,101,10, +248,22,171,20,197,250,22,93,2,21,9,248,22,172,20,200,249,22,82,2,5, +248,22,172,20,202,18,143,94,10,66,118,111,105,100,2,28,27,248,22,84,248, +22,166,4,196,249,22,159,4,80,143,42,39,28,248,22,66,248,22,160,4,248, +22,83,197,250,22,92,2,27,248,22,92,248,22,171,20,199,248,22,104,198,27, +248,22,160,4,248,22,171,20,197,250,22,92,2,27,248,22,92,248,22,83,197, +250,22,93,2,24,248,22,172,20,199,248,22,172,20,202,145,39,9,20,121,145, +2,1,39,16,1,11,16,0,20,27,15,61,9,2,2,2,2,2,3,11,11, +11,11,9,9,11,11,11,10,39,80,143,39,39,20,121,145,2,1,39,16,0, +16,0,41,42,39,16,0,39,16,0,39,11,11,11,16,11,2,4,2,5,2, +6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,16,11,11,11, +11,11,11,11,11,11,11,11,11,16,11,2,4,2,5,2,6,2,7,2,8, +2,9,2,10,2,11,2,12,2,13,2,14,39,50,40,16,0,39,16,1,2, +15,40,11,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0, +16,0,39,39,16,12,16,5,11,20,15,16,2,20,14,144,39,39,40,80,143, +39,39,39,20,121,145,2,1,39,16,1,2,15,16,1,33,36,10,16,5,2, +13,88,148,8,36,40,56,40,9,223,0,33,37,39,20,121,145,2,1,39,16, +1,2,15,16,0,11,16,5,2,14,88,148,8,36,40,56,40,9,223,0,33, +38,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,5,2,4,88,148, +8,36,40,56,42,9,223,0,33,39,39,20,121,145,2,1,39,16,1,2,15, +16,1,33,40,11,16,5,2,11,88,148,8,36,40,59,42,9,223,0,33,41, +39,20,121,145,2,1,39,16,1,2,15,16,1,33,42,11,16,5,2,7,88, +148,8,36,40,61,40,9,223,0,33,45,39,20,121,145,2,1,39,16,1,2, +15,16,0,11,16,5,2,10,88,148,8,36,40,56,40,9,223,0,33,47,39, +20,121,145,2,1,39,16,1,2,15,16,0,11,16,5,2,8,88,148,8,36, +40,57,40,9,223,0,33,48,39,20,121,145,2,1,39,16,1,2,15,16,0, +11,16,5,2,9,88,148,8,36,40,57,40,9,223,0,33,49,39,20,121,145, +2,1,39,16,1,2,15,16,0,11,16,5,2,12,88,148,8,36,40,59,40, +9,223,0,33,50,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,5, +2,5,88,148,8,36,40,61,42,9,223,0,33,51,39,20,121,145,2,1,39, +16,1,2,15,16,1,33,52,11,16,5,2,6,88,148,8,36,40,57,40,9, +223,0,33,53,39,20,121,145,2,1,39,16,1,2,15,16,0,11,16,0,94, +2,17,2,18,93,2,17,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 2090); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,54,46,51,46,48,46,49,48,84,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,1,0,0,8,0,16, -0,29,0,34,0,51,0,63,0,85,0,114,0,158,0,164,0,178,0,193,0, -211,0,223,0,239,0,253,0,19,1,39,1,73,1,90,1,107,1,130,1,145, -1,184,1,202,1,233,1,245,1,6,2,18,2,33,2,57,2,89,2,118,2, -134,2,152,2,172,2,193,2,211,2,242,2,0,3,17,3,61,3,69,3,74, -3,118,3,125,3,135,3,150,3,159,3,164,3,166,3,199,3,223,3,244,3, -1,4,11,4,20,4,31,4,49,4,62,4,72,4,82,4,88,4,93,4,105, -4,108,4,112,4,117,4,160,4,173,4,176,4,200,4,239,4,246,4,3,5, -25,5,36,5,66,5,89,5,97,5,121,5,142,5,91,6,121,6,212,9,235, -9,252,9,176,11,23,12,37,12,241,12,217,14,226,14,235,14,249,14,3,15, -23,16,126,16,251,16,68,17,141,17,243,17,16,18,87,18,221,18,36,19,243, -19,105,20,118,20,236,20,249,20,100,21,167,21,180,21,191,21,87,22,205,22, -249,22,104,23,182,25,206,25,68,26,150,27,157,27,209,27,222,27,212,28,228, -28,83,29,242,29,249,29,126,31,203,31,220,31,120,32,140,32,200,32,207,32, -67,33,121,33,140,33,91,34,107,34,68,35,69,36,106,36,115,36,202,37,47, -40,63,40,130,40,151,40,171,40,191,40,248,40,221,43,187,44,203,44,174,45, -232,45,9,46,141,46,44,47,60,47,157,47,174,47,252,49,47,52,63,52,37, -54,225,54,227,54,254,54,14,55,30,55,127,55,194,56,126,57,142,57,151,57, -158,57,224,58,34,60,152,60,198,63,72,64,204,64,149,66,99,67,141,67,249, -67,0,0,197,75,0,0,3,1,5,105,110,115,112,48,69,35,37,117,116,105, -108,115,74,112,97,116,104,45,115,116,114,105,110,103,63,66,98,115,98,115,78, -110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,73,114,101,114,111, -111,116,45,112,97,116,104,1,20,102,105,110,100,45,101,120,101,99,117,116,97, -98,108,101,45,112,97,116,104,1,27,112,97,116,104,45,108,105,115,116,45,115, -116,114,105,110,103,45,62,112,97,116,104,45,108,105,115,116,1,42,99,97,108, -108,45,119,105,116,104,45,100,101,102,97,117,108,116,45,114,101,97,100,105,110, -103,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,67,113,117, -111,116,101,29,94,2,10,70,35,37,112,97,114,97,109,122,11,76,45,99,104, -101,99,107,45,114,101,108,112,97,116,104,79,45,99,104,101,99,107,45,99,111, -108,108,101,99,116,105,111,110,73,45,99,104,101,99,107,45,102,97,105,108,77, -99,111,108,108,101,99,116,105,111,110,45,112,97,116,104,75,102,105,110,100,45, -99,111,108,45,102,105,108,101,1,20,99,111,108,108,101,99,116,105,111,110,45, -102,105,108,101,45,112,97,116,104,1,18,102,105,110,100,45,109,97,105,110,45, -99,111,108,108,101,99,116,115,1,32,101,120,101,45,114,101,108,97,116,105,118, -101,45,112,97,116,104,45,62,99,111,109,112,108,101,116,101,45,112,97,116,104, -78,102,105,110,100,45,109,97,105,110,45,99,111,110,102,105,103,78,103,101,116, -45,99,111,110,102,105,103,45,116,97,98,108,101,1,21,103,101,116,45,105,110, -115,116,97,108,108,97,116,105,111,110,45,110,97,109,101,76,99,111,101,114,99, -101,45,116,111,45,112,97,116,104,1,37,99,111,108,108,101,99,116,115,45,114, -101,108,97,116,105,118,101,45,112,97,116,104,45,62,99,111,109,112,108,101,116, -101,45,112,97,116,104,79,97,100,100,45,99,111,110,102,105,103,45,115,101,97, -114,99,104,1,29,102,105,110,100,45,108,105,98,114,97,114,121,45,99,111,108, -108,101,99,116,105,111,110,45,108,105,110,107,115,73,108,105,110,107,115,45,99, -97,99,104,101,78,115,116,97,109,112,45,112,114,111,109,112,116,45,116,97,103, -73,102,105,108,101,45,62,115,116,97,109,112,76,110,111,45,102,105,108,101,45, -115,116,97,109,112,63,1,22,103,101,116,45,108,105,110,107,101,100,45,99,111, -108,108,101,99,116,105,111,110,115,1,30,110,111,114,109,97,108,105,122,101,45, -99,111,108,108,101,99,116,105,111,110,45,114,101,102,101,114,101,110,99,101,1, -27,102,105,108,101,45,101,120,105,115,116,115,63,47,109,97,121,98,101,45,99, -111,109,112,105,108,101,100,77,112,97,116,104,45,97,100,100,45,115,117,102,102, -105,120,79,99,104,101,99,107,45,115,117,102,102,105,120,45,99,97,108,108,1, -18,112,97,116,104,45,97,100,106,117,115,116,45,115,117,102,102,105,120,1,19, -112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,79,108, -111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,1,29,102,105,110, -100,45,108,105,98,114,97,114,121,45,99,111,108,108,101,99,116,105,111,110,45, -112,97,116,104,115,75,101,109,98,101,100,100,101,100,45,108,111,97,100,78,110, -111,114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,41,41,40,111,114, -47,99,32,112,97,116,104,45,102,111,114,45,115,111,109,101,45,115,121,115,116, -101,109,63,32,112,97,116,104,45,115,116,114,105,110,103,63,41,69,119,105,110, -100,111,119,115,6,2,2,92,49,6,41,41,40,111,114,47,99,32,112,97,116, -104,45,115,116,114,105,110,103,63,32,112,97,116,104,45,102,111,114,45,115,111, -109,101,45,115,121,115,116,101,109,63,41,6,4,4,112,97,116,104,5,8,92, -92,63,92,82,69,76,92,6,12,12,112,97,116,104,45,115,116,114,105,110,103, -63,70,114,101,108,97,116,105,118,101,66,108,111,111,112,5,0,6,30,30,40, -112,114,111,99,101,100,117,114,101,45,97,114,105,116,121,45,105,110,99,108,117, -100,101,115,47,99,32,48,41,6,21,21,105,110,118,97,108,105,100,32,114,101, -108,97,116,105,118,101,32,112,97,116,104,6,18,18,40,97,110,121,47,99,32, -46,32,45,62,32,46,32,97,110,121,41,74,99,111,108,108,101,99,116,115,45, -100,105,114,71,101,120,101,99,45,102,105,108,101,70,111,114,105,103,45,100,105, -114,72,99,111,110,102,105,103,45,100,105,114,79,105,110,115,116,97,108,108,97, -116,105,111,110,45,110,97,109,101,6,10,10,108,105,110,107,115,46,114,107,116, -100,71,97,100,100,111,110,45,100,105,114,71,102,115,45,99,104,97,110,103,101, -67,101,114,114,111,114,66,114,111,111,116,73,115,116,97,116,105,99,45,114,111, -111,116,6,0,0,6,1,1,47,5,3,46,122,111,6,40,40,114,101,109,111, -118,105,110,103,32,115,117,102,102,105,120,32,109,97,107,101,115,32,112,97,116, -104,32,101,108,101,109,101,110,116,32,101,109,112,116,121,6,10,10,103,105,118, -101,110,32,112,97,116,104,5,1,95,6,21,21,40,111,114,47,99,32,115,116, -114,105,110,103,63,32,98,121,116,101,115,63,41,6,36,36,99,97,110,110,111, -116,32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32,114, -111,111,116,32,112,97,116,104,58,32,68,102,105,110,105,115,104,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,179,15,194,28,192,192,28,248,22,154,7,194,27,248,22,138,16,195, -28,192,192,248,22,139,16,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,180,15,23,195,2,10,28,248,22,179,15,23,195,2, -10,28,248,22,154,7,23,195,2,28,248,22,138,16,23,195,2,10,248,22,139, -16,23,195,2,11,12,250,22,183,11,2,41,2,42,23,197,2,28,28,248,22, -180,15,23,195,2,249,22,170,9,248,22,181,15,23,197,2,2,43,249,22,170, -9,247,22,181,8,2,43,27,28,248,22,154,7,23,196,2,23,195,2,248,22, -166,8,248,22,184,15,23,197,2,28,249,22,176,16,2,79,23,195,2,28,248, -22,154,7,195,248,22,187,15,195,194,86,94,23,195,1,27,248,22,129,8,23, -195,1,249,22,188,15,248,22,169,8,250,22,184,16,2,80,28,249,22,176,16, -2,81,23,201,2,23,199,1,250,22,184,16,2,82,23,202,1,2,44,80,144, -47,40,41,2,43,28,248,22,154,7,194,248,22,187,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,179,15,23,195,2,10,28,248,22, -154,7,23,195,2,28,248,22,138,16,23,195,2,10,248,22,139,16,23,195,2, -11,10,248,22,180,15,23,195,2,12,252,22,183,11,2,6,2,45,39,23,199, -2,23,200,2,28,28,28,248,22,179,15,23,196,2,10,28,248,22,154,7,23, -196,2,28,248,22,138,16,23,196,2,10,248,22,139,16,23,196,2,11,10,248, -22,180,15,23,196,2,12,252,22,183,11,2,6,2,45,40,23,199,2,23,200, -2,27,28,248,22,180,15,23,196,2,248,22,181,15,23,196,2,247,22,182,15, -86,95,28,28,248,22,140,16,23,196,2,10,249,22,170,9,247,22,182,15,23, -195,2,12,253,22,185,11,2,6,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,182,15,28,249,22, -170,9,28,248,22,180,15,23,199,2,248,22,181,15,23,199,2,247,22,182,15, -23,195,2,12,253,22,185,11,2,6,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,144,16,28,248,22,140,16,23,199,2, -23,198,1,248,22,141,16,23,199,1,86,94,28,28,248,22,180,15,23,194,2, -10,28,248,22,179,15,23,194,2,10,28,248,22,154,7,23,194,2,28,248,22, -138,16,23,194,2,10,248,22,139,16,23,194,2,11,12,250,22,183,11,2,41, -2,42,23,196,2,28,28,248,22,180,15,23,194,2,249,22,170,9,248,22,181, -15,23,196,2,2,43,249,22,170,9,247,22,181,8,2,43,27,28,248,22,154, -7,23,195,2,23,194,2,248,22,166,8,248,22,184,15,23,196,2,28,249,22, -176,16,2,79,23,195,2,28,248,22,154,7,194,248,22,187,15,194,193,86,94, -23,194,1,27,248,22,129,8,23,195,1,249,22,188,15,248,22,169,8,250,22, -184,16,2,80,28,249,22,176,16,2,81,23,201,2,23,199,1,250,22,184,16, -2,82,23,202,1,2,44,80,144,50,40,41,2,43,28,248,22,154,7,193,248, -22,187,15,193,192,27,248,22,184,15,23,195,2,28,249,22,170,9,23,197,2, -66,117,110,105,120,28,249,22,151,8,194,5,1,47,28,248,22,180,15,198,197, -248,22,187,15,198,249,22,133,16,199,249,22,188,15,249,22,154,8,248,22,184, -15,200,40,198,86,94,23,194,1,28,249,22,170,9,23,197,2,2,43,249,22, -133,16,23,200,1,249,22,188,15,28,249,22,176,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,155,8,2,47,250,22,154,8,203,43,44,5,1,92,249, -22,154,8,202,45,28,249,22,176,16,2,84,23,199,2,249,22,155,8,2,47, -249,22,154,8,200,43,28,249,22,176,16,2,84,23,199,2,249,22,155,8,2, -47,249,22,154,8,200,43,28,249,22,176,16,0,14,35,114,120,34,94,92,92, -92,92,92,92,92,92,34,23,199,2,249,22,155,8,5,4,85,78,67,92,249, -22,154,8,200,41,28,249,22,176,16,0,12,35,114,120,34,94,91,97,45,122, -93,58,34,198,249,22,155,8,250,22,154,8,201,39,40,249,22,154,8,200,41, -12,198,12,32,86,88,148,8,36,42,56,11,72,102,111,117,110,100,45,101,120, -101,99,222,33,89,32,87,88,148,8,36,43,61,11,66,110,101,120,116,222,33, -88,27,248,22,142,16,23,196,2,28,249,22,172,9,23,195,2,23,197,1,11, -28,248,22,138,16,23,194,2,27,249,22,133,16,23,197,1,23,196,1,28,23, -197,2,90,144,42,11,89,146,42,39,11,248,22,136,16,23,197,2,86,95,23, -195,1,23,194,1,27,28,23,202,2,27,248,22,142,16,23,199,2,28,249,22, -172,9,23,195,2,23,200,2,11,28,248,22,138,16,23,194,2,250,2,86,23, -205,2,23,206,2,249,22,133,16,23,200,2,23,198,1,250,2,86,23,205,2, -23,206,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22, -179,15,23,196,2,27,249,22,133,16,23,198,2,23,205,2,28,28,248,22,128, -16,193,10,248,22,191,15,193,192,11,11,28,23,193,2,192,86,94,23,193,1, -28,23,203,2,11,27,248,22,142,16,23,200,2,28,249,22,172,9,194,23,201, -1,11,28,248,22,138,16,193,250,2,86,205,206,249,22,133,16,200,197,250,2, -86,205,206,195,192,86,94,23,194,1,28,23,196,2,90,144,42,11,89,146,42, -39,11,248,22,136,16,23,197,2,86,95,23,195,1,23,194,1,27,28,23,201, -2,27,248,22,142,16,23,199,2,28,249,22,172,9,23,195,2,23,200,2,11, -28,248,22,138,16,23,194,2,250,2,86,23,204,2,23,205,2,249,22,133,16, -23,200,2,23,198,1,250,2,86,23,204,2,23,205,2,23,196,1,11,28,23, -193,2,192,86,94,23,193,1,27,28,248,22,179,15,23,196,2,27,249,22,133, -16,23,198,2,23,204,2,28,28,248,22,128,16,193,10,248,22,191,15,193,192, -11,11,28,23,193,2,192,86,94,23,193,1,28,23,202,2,11,27,248,22,142, -16,23,200,2,28,249,22,172,9,194,23,201,1,11,28,248,22,138,16,193,250, -2,86,204,205,249,22,133,16,200,197,250,2,86,204,205,195,192,28,23,193,2, -90,144,42,11,89,146,42,39,11,248,22,136,16,23,199,2,86,95,23,195,1, -23,194,1,27,28,23,198,2,251,2,87,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,179,15,195,27, -249,22,133,16,197,200,28,28,248,22,128,16,193,10,248,22,191,15,193,192,11, -11,28,192,192,28,198,11,251,2,87,198,203,201,202,194,32,90,88,148,8,36, -43,60,11,2,50,222,33,91,28,248,22,89,23,197,2,11,27,249,22,133,16, -248,22,141,16,248,22,82,23,201,2,23,196,2,28,248,22,191,15,23,194,2, -250,2,86,197,198,195,86,94,23,193,1,27,248,22,171,20,23,199,1,28,248, -22,89,23,194,2,11,27,249,22,133,16,248,22,141,16,248,22,82,23,198,2, -23,198,2,28,248,22,191,15,23,194,2,250,2,86,199,200,195,86,94,23,193, -1,27,248,22,171,20,23,196,1,28,248,22,89,23,194,2,11,27,249,22,133, -16,248,22,141,16,248,22,82,23,198,2,23,200,2,28,248,22,191,15,23,194, -2,250,2,86,201,202,195,86,94,23,193,1,27,248,22,171,20,23,196,1,28, -248,22,89,23,194,2,11,27,249,22,133,16,248,22,141,16,248,22,82,197,201, -28,248,22,191,15,193,250,2,86,203,204,195,251,2,90,203,204,205,248,22,171, -20,198,86,95,28,28,248,22,179,15,23,195,2,10,28,248,22,154,7,23,195, -2,28,248,22,138,16,23,195,2,10,248,22,139,16,23,195,2,11,12,250,22, -183,11,2,7,2,48,23,197,2,28,28,23,195,2,28,28,248,22,179,15,23, -196,2,10,28,248,22,154,7,23,196,2,28,248,22,138,16,23,196,2,10,248, -22,139,16,23,196,2,11,248,22,138,16,23,196,2,11,10,12,250,22,183,11, -2,7,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,138,16,23,195,2,90, -144,42,11,89,146,42,39,11,248,22,136,16,23,198,2,249,22,170,9,194,2, -49,11,27,249,22,176,8,247,22,175,8,5,4,80,65,84,72,27,28,23,194, -2,249,80,143,43,44,249,22,166,8,23,198,1,7,63,9,86,94,23,194,1, -9,27,28,249,22,170,9,247,22,181,8,2,43,249,22,81,248,22,188,15,5, -1,46,23,196,1,23,194,1,28,248,22,89,23,194,2,11,27,249,22,133,16, -248,22,141,16,248,22,82,23,198,2,23,200,2,28,248,22,191,15,23,194,2, -250,2,86,201,202,195,86,94,23,193,1,27,248,22,171,20,23,196,1,28,248, -22,89,23,194,2,11,27,249,22,133,16,248,22,141,16,248,22,82,23,198,2, -23,202,2,28,248,22,191,15,23,194,2,250,2,86,203,204,195,86,94,23,193, -1,27,248,22,171,20,23,196,1,28,248,22,89,23,194,2,11,27,249,22,133, -16,248,22,141,16,248,22,82,23,198,2,23,204,2,28,248,22,191,15,23,194, -2,250,2,86,205,206,195,86,94,23,193,1,27,248,22,171,20,23,196,1,28, -248,22,89,23,194,2,11,27,249,22,133,16,248,22,141,16,248,22,82,197,205, -28,248,22,191,15,193,250,2,86,23,15,23,16,195,251,2,90,23,15,23,16, -23,17,248,22,171,20,198,27,248,22,141,16,23,196,1,28,248,22,191,15,193, -250,2,86,198,199,195,11,250,80,144,42,43,42,196,197,11,250,80,144,42,43, -42,196,11,11,32,95,88,148,8,36,42,58,11,2,50,222,33,97,0,8,35, -114,120,35,34,92,34,34,27,249,22,172,16,23,197,2,23,198,2,28,23,193, -2,86,94,23,196,1,27,248,22,103,23,195,2,27,27,248,22,112,23,197,1, -27,249,22,172,16,23,201,2,23,196,2,28,23,193,2,86,94,23,194,1,27, -248,22,103,23,195,2,27,250,2,95,202,23,204,1,248,22,112,23,199,1,27, -28,249,22,170,9,247,22,181,8,2,43,250,22,184,16,2,96,23,198,1,2, -51,194,28,249,22,151,8,194,2,51,249,22,95,202,195,249,22,81,248,22,188, -15,195,195,86,95,23,199,1,23,193,1,27,28,249,22,170,9,247,22,181,8, -2,43,250,22,184,16,2,96,23,198,1,2,51,194,28,249,22,151,8,194,2, -51,249,22,95,200,9,249,22,81,248,22,188,15,195,9,27,28,249,22,170,9, -247,22,181,8,2,43,250,22,184,16,2,96,23,198,1,2,51,194,28,249,22, -151,8,194,2,51,249,22,95,198,195,249,22,81,248,22,188,15,195,195,86,95, -23,195,1,23,193,1,27,28,249,22,170,9,247,22,181,8,2,43,250,22,184, -16,2,96,23,200,1,2,51,196,28,249,22,151,8,194,2,51,249,22,95,196, -9,249,22,81,248,22,188,15,195,9,86,95,28,28,248,22,143,8,194,10,248, -22,154,7,194,12,250,22,183,11,2,8,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,90,195, -249,22,4,22,179,15,196,11,12,250,22,183,11,2,8,6,14,14,40,108,105, -115,116,111,102,32,112,97,116,104,63,41,197,250,2,95,197,195,28,248,22,154, -7,197,248,22,168,8,197,196,28,28,248,22,0,23,195,2,249,22,48,23,196, -2,39,11,20,13,144,80,144,39,46,40,26,35,80,144,8,35,47,40,249,22, -31,11,80,144,8,37,46,40,22,146,15,10,22,147,15,10,22,148,15,10,22, -149,15,11,22,150,15,11,22,154,15,10,22,153,15,11,22,155,15,10,22,152, -15,10,22,156,15,10,22,151,15,11,22,157,15,10,22,158,15,10,22,159,15, -10,22,160,15,11,22,161,15,10,22,144,15,11,247,23,194,1,250,22,183,11, -2,9,2,52,23,197,1,86,94,28,28,248,22,179,15,23,195,2,10,28,248, -22,154,7,23,195,2,28,248,22,138,16,23,195,2,10,248,22,139,16,23,195, -2,11,12,250,22,183,11,23,196,2,2,48,23,197,2,28,248,22,138,16,23, -195,2,12,251,22,185,11,23,197,1,2,53,2,46,23,198,1,86,94,28,28, -248,22,179,15,23,195,2,10,28,248,22,154,7,23,195,2,28,248,22,138,16, -23,195,2,10,248,22,139,16,23,195,2,11,12,250,22,183,11,23,196,2,2, -48,23,197,2,28,248,22,138,16,23,195,2,12,251,22,185,11,23,197,1,2, -53,2,46,23,198,1,86,95,28,28,248,22,179,15,23,195,2,10,28,248,22, -154,7,23,195,2,28,248,22,138,16,23,195,2,10,248,22,139,16,23,195,2, -11,12,250,22,183,11,23,196,2,2,48,23,197,2,28,248,22,138,16,23,195, -2,86,94,23,194,1,12,251,22,185,11,23,197,2,2,53,2,46,23,198,1, -249,22,3,20,20,94,88,148,8,36,40,50,11,9,223,2,33,101,23,195,1, -23,197,1,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12,250, -22,183,11,23,196,1,2,54,23,197,1,86,94,28,28,248,22,179,15,23,194, -2,10,28,248,22,154,7,23,194,2,28,248,22,138,16,23,194,2,10,248,22, -139,16,23,194,2,11,12,250,22,183,11,2,15,2,48,23,196,2,28,248,22, -138,16,23,194,2,12,251,22,185,11,2,15,2,53,2,46,23,197,1,86,97, -28,28,248,22,179,15,23,196,2,10,28,248,22,154,7,23,196,2,28,248,22, -138,16,23,196,2,10,248,22,139,16,23,196,2,11,12,250,22,183,11,2,15, -2,48,23,198,2,28,248,22,138,16,23,196,2,12,251,22,185,11,2,15,2, -53,2,46,23,199,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222,33, -104,23,198,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12, -250,22,183,11,2,15,2,54,23,197,2,252,80,143,44,52,23,199,1,23,200, -1,23,201,1,11,11,86,94,28,28,248,22,179,15,23,194,2,10,28,248,22, -154,7,23,194,2,28,248,22,138,16,23,194,2,10,248,22,139,16,23,194,2, -11,12,250,22,183,11,2,17,2,48,23,196,2,28,248,22,138,16,23,194,2, -12,251,22,185,11,2,17,2,53,2,46,23,197,1,86,99,28,28,248,22,179, -15,23,197,2,10,28,248,22,154,7,23,197,2,28,248,22,138,16,23,197,2, -10,248,22,139,16,23,197,2,11,12,250,22,183,11,2,17,2,48,23,199,2, -28,248,22,138,16,23,197,2,12,251,22,185,11,2,17,2,53,2,46,23,200, -2,28,28,248,22,179,15,23,198,2,10,28,248,22,154,7,23,198,2,28,248, -22,138,16,23,198,2,10,248,22,139,16,23,198,2,11,12,250,22,183,11,2, -17,2,48,23,200,2,28,248,22,138,16,23,198,2,12,251,22,185,11,2,17, -2,53,2,46,23,201,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222, -33,106,23,200,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11, -12,250,22,183,11,2,17,2,54,23,197,2,252,80,143,44,52,23,199,1,23, -202,1,23,203,1,23,201,1,23,200,1,27,248,22,156,16,2,55,28,248,22, -140,16,23,194,2,248,22,143,16,23,194,1,28,248,22,139,16,23,194,2,90, -144,42,11,89,146,42,39,11,248,22,136,16,249,22,141,16,250,80,144,49,43, -42,248,22,156,16,2,56,11,11,248,22,156,16,2,57,86,95,23,195,1,23, -194,1,248,22,143,16,249,22,141,16,23,199,1,23,196,1,27,250,80,144,44, -43,42,248,22,156,16,2,56,23,197,1,10,28,23,193,2,248,22,143,16,23, -194,1,11,249,80,144,41,55,40,39,80,144,41,8,40,42,27,248,22,156,16, -2,58,28,248,22,140,16,23,194,2,248,22,143,16,23,194,1,28,248,22,139, -16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,136,16,249,22,141,16, -250,80,144,49,43,42,248,22,156,16,2,56,11,11,248,22,156,16,2,57,86, -95,23,195,1,23,194,1,248,22,143,16,249,22,141,16,23,199,1,23,196,1, -27,250,80,144,44,43,42,248,22,156,16,2,56,23,197,1,10,28,23,193,2, -248,22,143,16,23,194,1,11,249,80,144,41,55,40,40,80,144,41,8,41,42, -27,20,13,144,80,144,40,46,40,26,35,80,144,8,36,47,40,249,22,31,11, -80,144,8,38,46,40,22,146,15,10,22,147,15,10,22,148,15,10,22,149,15, -11,22,150,15,11,22,154,15,10,22,153,15,11,22,155,15,10,22,152,15,10, -22,156,15,10,22,151,15,11,22,157,15,10,22,158,15,10,22,159,15,10,22, -160,15,11,22,161,15,10,22,144,15,11,247,22,149,6,28,248,22,150,2,193, -192,11,27,28,23,195,2,249,22,133,16,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, -191,15,23,195,2,249,22,141,6,23,196,1,80,144,43,8,42,42,11,11,28, -192,192,21,17,1,0,250,22,159,2,23,196,1,2,59,247,22,172,8,250,22, -159,2,195,2,59,247,22,172,8,28,248,22,154,7,23,195,2,27,248,22,187, -15,23,196,1,28,248,22,140,16,23,194,2,192,249,22,141,16,23,195,1,27, -247,80,144,43,54,42,28,23,193,2,192,86,94,23,193,1,247,22,157,16,28, -248,22,143,8,23,195,2,27,248,22,188,15,23,196,1,28,248,22,140,16,23, -194,2,192,249,22,141,16,23,195,1,27,247,80,144,43,54,42,28,23,193,2, -192,86,94,23,193,1,247,22,157,16,28,248,22,179,15,23,195,2,28,248,22, -140,16,23,195,2,193,249,22,141,16,23,196,1,27,247,80,144,42,54,42,28, -23,193,2,192,86,94,23,193,1,247,22,157,16,193,27,248,22,156,16,2,55, -28,248,22,140,16,23,194,2,248,22,143,16,23,194,1,28,248,22,139,16,23, -194,2,90,144,42,11,89,146,42,39,11,248,22,136,16,249,22,141,16,250,80, -144,49,43,42,248,22,156,16,2,56,11,11,248,22,156,16,2,57,86,95,23, -195,1,23,194,1,248,22,143,16,249,22,141,16,23,199,1,23,196,1,27,250, -80,144,44,43,42,248,22,156,16,2,56,23,197,1,10,28,23,193,2,248,22, -143,16,23,194,1,11,28,248,22,140,16,23,195,2,193,249,22,141,16,23,196, -1,27,249,80,144,44,55,40,39,80,144,44,8,43,42,28,23,193,2,192,86, -94,23,193,1,247,22,157,16,28,248,22,140,16,23,195,2,248,22,143,16,23, -195,1,28,248,22,139,16,23,195,2,90,144,42,11,89,146,42,39,11,248,22, -136,16,249,22,141,16,250,80,144,48,43,42,248,22,156,16,2,56,11,11,248, -22,156,16,2,57,86,95,23,195,1,23,194,1,248,22,143,16,249,22,141,16, -23,200,1,23,196,1,27,250,80,144,43,43,42,248,22,156,16,2,56,23,198, -1,10,28,23,193,2,248,22,143,16,23,194,1,11,28,248,22,89,23,196,2, -9,28,248,22,82,23,196,2,249,22,81,27,248,22,170,20,23,199,2,28,248, -22,154,7,23,194,2,27,248,22,187,15,23,195,1,28,248,22,140,16,23,194, -2,192,249,22,141,16,23,195,1,27,247,80,144,46,54,42,28,23,193,2,192, -86,94,23,193,1,247,22,157,16,28,248,22,143,8,23,194,2,27,248,22,188, -15,23,195,1,28,248,22,140,16,23,194,2,192,249,22,141,16,23,195,1,27, -247,80,144,46,54,42,28,23,193,2,192,86,94,23,193,1,247,22,157,16,28, -248,22,179,15,23,194,2,28,248,22,140,16,23,194,2,192,249,22,141,16,23, -195,1,27,247,80,144,45,54,42,28,23,193,2,192,86,94,23,193,1,247,22, -157,16,192,27,248,22,171,20,23,199,1,28,248,22,89,23,194,2,9,28,248, -22,82,23,194,2,249,22,81,248,80,144,45,60,42,248,22,170,20,23,197,2, -27,248,22,171,20,23,197,1,28,248,22,89,23,194,2,9,28,248,22,82,23, -194,2,249,22,81,248,80,144,48,60,42,248,22,170,20,23,197,2,249,80,144, -49,8,44,42,23,204,1,248,22,171,20,23,198,1,249,22,95,23,202,2,249, -80,144,49,8,44,42,23,204,1,248,22,171,20,23,198,1,249,22,95,23,199, -2,27,248,22,171,20,23,197,1,28,248,22,89,23,194,2,9,28,248,22,82, -23,194,2,249,22,81,248,80,144,48,60,42,248,22,170,20,23,197,2,249,80, -144,49,8,44,42,23,204,1,248,22,171,20,23,198,1,249,22,95,23,202,2, -249,80,144,49,8,44,42,23,204,1,248,22,171,20,23,198,1,249,22,95,23, -196,2,27,248,22,171,20,23,199,1,28,248,22,89,23,194,2,9,28,248,22, -82,23,194,2,249,22,81,248,80,144,45,60,42,248,22,170,20,23,197,2,27, -248,22,171,20,23,197,1,28,248,22,89,23,194,2,9,28,248,22,82,23,194, -2,249,22,81,248,80,144,48,60,42,248,22,170,20,23,197,2,249,80,144,49, -8,44,42,23,204,1,248,22,171,20,23,198,1,249,22,95,23,202,2,249,80, -144,49,8,44,42,23,204,1,248,22,171,20,23,198,1,249,22,95,23,199,2, -27,248,22,171,20,23,197,1,28,248,22,89,23,194,2,9,28,248,22,82,23, -194,2,249,22,81,248,80,144,48,60,42,248,22,170,20,23,197,2,249,80,144, -49,8,44,42,23,204,1,248,22,171,20,23,198,1,249,22,95,23,202,2,249, -80,144,49,8,44,42,23,204,1,248,22,171,20,23,198,1,27,250,22,159,2, -23,198,1,23,199,1,11,28,192,249,80,144,42,8,44,42,198,194,196,27,248, -22,156,16,2,58,28,248,22,140,16,23,194,2,248,22,143,16,23,194,1,28, -248,22,139,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,136,16,249, -22,141,16,250,80,144,49,43,42,248,22,156,16,2,56,11,11,248,22,156,16, -2,57,86,95,23,195,1,23,194,1,248,22,143,16,249,22,141,16,23,199,1, -23,196,1,27,250,80,144,44,43,42,248,22,156,16,2,56,23,197,1,10,28, -23,193,2,248,22,143,16,23,194,1,11,27,248,80,144,41,58,42,249,80,144, -43,55,40,40,80,144,43,8,45,42,27,27,250,22,159,2,23,198,2,72,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,133,16,27,250,22,159,2,23,202,2,71,115,104,97,114,101,45, -100,105,114,11,28,192,192,249,22,133,16,64,117,112,6,5,5,115,104,97,114, -101,2,60,28,248,22,154,7,23,194,2,27,248,22,187,15,23,195,1,28,248, -22,140,16,23,194,2,192,249,22,141,16,23,195,1,27,247,80,144,47,54,42, -28,23,193,2,192,86,94,23,193,1,247,22,157,16,28,248,22,143,8,23,194, -2,27,248,22,188,15,23,195,1,28,248,22,140,16,23,194,2,192,249,22,141, -16,23,195,1,27,247,80,144,47,54,42,28,23,193,2,192,86,94,23,193,1, -247,22,157,16,28,248,22,179,15,23,194,2,28,248,22,140,16,23,194,2,192, -249,22,141,16,23,195,1,27,247,80,144,46,54,42,28,23,193,2,192,86,94, -23,193,1,247,22,157,16,192,250,22,95,248,22,91,11,28,247,22,164,16,28, -247,22,165,16,248,22,91,250,22,133,16,248,22,156,16,2,61,250,22,159,2, -23,204,2,2,59,247,22,172,8,2,60,9,9,28,247,22,165,16,250,80,144, -47,8,23,42,23,200,1,1,18,108,105,110,107,115,45,115,101,97,114,99,104, -45,102,105,108,101,115,248,22,91,23,200,1,9,248,22,175,13,23,194,1,249, -22,14,80,144,41,8,26,41,28,248,22,131,13,23,197,2,86,94,23,196,1, -32,0,88,148,8,36,39,44,11,9,222,11,20,20,94,88,148,8,36,39,46, -11,9,223,3,33,124,23,196,1,32,126,88,148,39,40,59,11,2,50,222,33, -127,90,144,42,11,89,146,42,39,11,248,22,136,16,23,197,1,86,95,23,195, -1,23,194,1,28,248,22,179,15,23,194,2,28,248,22,128,16,23,194,2,249, -22,146,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42, -11,89,146,42,39,11,248,22,136,16,23,197,1,86,95,23,195,1,23,194,1, -28,248,22,179,15,23,194,2,28,248,22,128,16,23,194,2,249,22,146,6,23, -195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42, -39,11,248,22,136,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,179, -15,23,194,2,28,248,22,128,16,23,194,2,249,22,146,6,23,195,1,32,0, -88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22, -136,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,179,15,23,194,2, -28,248,22,128,16,23,194,2,249,22,146,6,23,195,1,32,0,88,148,8,36, -39,44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,32,128,2,88,148, -8,36,40,58,11,2,50,222,33,129,2,27,249,22,164,6,8,128,128,23,196, -2,28,248,22,149,7,23,194,2,9,249,22,81,23,195,1,27,249,22,164,6, -8,128,128,23,199,2,28,248,22,149,7,23,194,2,9,249,22,81,23,195,1, -27,249,22,164,6,8,128,128,23,202,2,28,248,22,149,7,23,194,2,9,249, -22,81,23,195,1,27,249,22,164,6,8,128,128,23,205,2,28,248,22,149,7, -23,194,2,9,249,22,81,23,195,1,248,2,128,2,23,206,1,27,249,22,164, -6,8,128,128,23,196,2,28,248,22,143,8,23,194,2,28,249,22,133,4,248, -22,148,8,23,196,2,8,128,128,249,22,1,22,155,8,249,22,81,23,197,1, -27,249,22,164,6,8,128,128,23,201,2,28,248,22,149,7,23,194,2,9,249, -22,81,23,195,1,27,249,22,164,6,8,128,128,23,204,2,28,248,22,149,7, -23,194,2,9,249,22,81,23,195,1,27,249,22,164,6,8,128,128,23,207,2, -28,248,22,149,7,23,194,2,9,249,22,81,23,195,1,27,249,22,164,6,8, -128,128,23,210,2,28,248,22,149,7,23,194,2,9,249,22,81,23,195,1,248, -2,128,2,23,211,1,192,192,248,22,134,6,23,194,1,20,13,144,80,144,40, -8,28,40,80,144,40,8,46,42,27,28,249,22,190,8,248,22,181,8,2,62, -41,90,144,42,11,89,146,42,39,11,248,22,136,16,23,198,2,86,95,23,195, -1,23,194,1,28,248,22,179,15,23,194,2,28,248,22,128,16,23,194,2,249, -22,146,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42, -11,89,146,42,39,11,248,22,136,16,23,197,1,86,95,23,195,1,23,194,1, -28,248,22,179,15,23,194,2,28,248,22,128,16,23,194,2,249,22,146,6,23, -195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42, -39,11,248,22,136,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,179, -15,23,194,2,28,248,22,128,16,23,194,2,249,22,146,6,23,195,1,32,0, -88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22, -136,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,179,15,23,194,2, -28,248,22,128,16,23,194,2,249,22,146,6,23,195,1,32,0,88,148,8,36, -39,44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,11,28,248,22,191, -15,23,195,2,27,28,249,22,190,8,248,22,181,8,2,62,41,249,22,146,6, -23,197,2,32,0,88,148,8,36,39,44,11,9,222,11,11,86,94,28,23,194, -2,248,22,148,6,23,195,1,86,94,23,194,1,12,249,22,81,27,248,22,189, -5,23,199,1,250,22,44,22,35,88,148,39,39,8,24,11,9,223,3,33,130, -2,20,20,94,88,148,8,36,39,46,11,9,223,3,33,131,2,23,196,1,194, -249,22,81,11,194,28,28,23,195,2,28,248,22,83,23,196,2,248,22,168,9, -249,22,177,14,39,248,22,171,20,23,199,2,11,11,194,86,94,23,195,1,249, -22,12,20,20,94,88,148,8,32,39,61,16,4,39,8,128,80,8,240,0,64, -0,0,39,9,224,2,3,33,132,2,23,196,1,80,144,41,8,26,41,27,248, -22,168,9,194,28,192,192,248,22,168,9,248,22,82,195,86,95,28,248,22,152, -12,23,198,2,27,247,22,144,12,28,249,22,134,12,23,195,2,2,63,251,22, -140,12,23,197,1,2,63,250,22,138,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,148,12, -23,206,2,247,22,27,12,12,28,23,193,2,250,22,157,2,80,144,45,8,25, -41,23,198,1,249,22,81,23,198,1,21,17,0,0,86,95,23,195,1,23,193, -1,12,28,248,22,152,12,23,198,2,86,94,23,197,1,248,23,195,1,247,22, -139,2,196,88,148,39,40,58,8,240,0,0,0,2,9,226,0,2,1,3,33, -135,2,20,20,94,248,22,149,6,23,194,2,28,248,22,149,7,248,22,149,6, -23,195,1,12,248,22,179,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,134,6,23,194,1,28,248,22,90,193,28,28,249,22,129,4,41,248,22,94, -195,10,249,22,129,4,42,248,22,94,195,28,28,248,22,154,7,248,22,82,194, -10,28,249,22,170,9,2,64,248,22,170,20,195,10,249,22,170,9,2,65,248, -22,170,20,195,28,27,248,22,103,194,28,248,22,179,15,193,10,28,248,22,154, -7,193,28,248,22,138,16,193,10,248,22,139,16,193,11,27,248,22,89,248,22, -105,195,28,192,192,248,22,185,16,248,22,112,195,11,11,11,11,28,248,22,128, -16,249,22,133,16,23,196,2,23,198,2,27,248,22,69,248,22,183,15,23,198, -1,250,22,157,2,23,198,2,23,196,2,249,22,81,23,199,1,250,22,159,2, -23,203,1,23,201,1,9,12,250,22,157,2,23,197,1,23,198,1,249,22,81, -23,198,1,23,201,1,28,28,248,22,89,248,22,105,23,197,2,10,249,22,176, -16,248,22,112,23,198,2,247,22,172,8,27,248,22,143,16,249,22,141,16,248, -22,103,23,200,2,23,198,1,28,249,22,170,9,248,22,170,20,23,199,2,2, -65,86,94,23,196,1,249,22,3,20,20,94,88,148,8,36,40,56,11,9,224, -3,2,33,140,2,23,196,1,248,22,146,16,23,196,1,28,249,22,170,9,248, -22,170,20,23,199,2,2,64,86,94,23,196,1,86,94,28,250,22,159,2,23, -197,2,11,11,12,250,22,157,2,23,197,2,11,9,249,22,165,2,23,196,2, -20,20,95,88,148,8,36,41,53,11,9,224,3,2,33,141,2,23,195,1,23, -196,1,27,248,22,69,248,22,170,20,23,199,1,250,22,157,2,23,198,2,23, -196,2,249,22,81,248,22,130,2,23,200,1,250,22,159,2,23,203,1,23,201, -1,9,12,250,22,157,2,23,196,1,23,197,1,248,22,96,23,199,1,27,28, -28,23,194,2,248,22,168,9,248,22,82,23,196,2,10,9,27,249,22,189,5, -23,198,2,68,98,105,110,97,114,121,250,22,44,22,35,88,148,8,36,39,47, -11,9,223,3,33,137,2,20,20,94,88,148,8,36,39,46,11,9,223,3,33, -138,2,23,196,1,86,94,28,28,248,22,90,23,194,2,249,22,4,32,0,88, -148,8,36,40,48,11,9,222,33,139,2,23,195,2,11,12,248,22,179,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,139,2,27,90,144,42,11,89,146,42,39,11,248,22,136,16,23,201,2, -192,86,96,249,22,3,20,20,94,88,148,8,36,40,57,11,9,224,2,3,33, -142,2,23,195,1,23,197,1,249,22,165,2,195,88,148,8,36,41,51,11,9, -223,3,33,143,2,250,22,157,2,80,144,47,8,25,41,23,200,1,249,22,81, -23,201,1,198,193,20,13,144,80,144,40,8,28,40,250,80,144,43,8,47,42, -23,198,2,23,196,2,11,27,250,22,159,2,80,144,44,8,25,41,23,197,2, -21,143,11,17,0,0,27,248,22,82,23,195,2,27,249,80,144,45,8,27,42, -23,198,2,23,196,2,28,249,22,172,9,23,195,2,23,196,1,248,22,171,20, -195,86,94,23,195,1,20,13,144,80,144,43,8,28,40,250,80,144,46,8,47, -42,23,201,1,23,199,2,23,196,2,27,20,20,95,88,148,8,36,39,55,8, -240,0,0,0,2,9,225,5,4,1,33,144,2,23,194,1,23,197,1,28,249, -22,48,23,195,2,39,20,13,144,80,144,44,46,40,26,35,80,144,8,40,47, -40,249,22,31,11,80,144,8,42,46,40,22,146,15,10,22,147,15,10,22,148, -15,10,22,149,15,11,22,150,15,11,22,154,15,10,22,153,15,11,22,155,15, -10,22,152,15,10,22,156,15,10,22,151,15,11,22,157,15,10,22,158,15,10, -22,159,15,10,22,160,15,11,22,161,15,10,22,144,15,11,247,23,193,1,250, -22,183,11,2,9,2,52,23,196,1,248,22,8,20,20,94,88,148,39,40,8, -49,16,4,8,128,6,8,128,104,8,240,0,128,0,0,39,9,224,1,2,33, -145,2,23,195,1,0,7,35,114,120,34,47,43,34,28,248,22,154,7,23,195, -2,27,249,22,174,16,2,147,2,23,197,2,28,23,193,2,28,249,22,129,4, -248,22,102,23,196,2,248,22,183,3,248,22,157,7,23,199,2,249,22,7,250, -22,176,7,23,200,1,39,248,22,102,23,199,1,23,198,1,249,22,7,250,22, -176,7,23,200,2,39,248,22,102,23,199,2,249,22,81,249,22,176,7,23,201, -1,248,22,104,23,200,1,23,200,1,86,94,23,193,1,249,22,7,23,197,1, -23,198,1,90,144,42,11,89,146,42,39,11,248,22,136,16,23,198,1,86,94, -23,195,1,28,249,22,170,9,23,195,2,2,49,86,94,23,193,1,249,22,7, -23,196,1,23,200,1,27,249,22,81,23,197,1,23,201,1,28,248,22,154,7, -23,195,2,27,249,22,174,16,2,147,2,23,197,2,28,23,193,2,28,249,22, -129,4,248,22,102,23,196,2,248,22,183,3,248,22,157,7,23,199,2,249,22, -7,250,22,176,7,23,200,1,39,248,22,102,23,199,1,23,196,1,249,22,7, -250,22,176,7,23,200,2,39,248,22,102,23,199,2,249,22,81,249,22,176,7, -23,201,1,248,22,104,23,200,1,23,198,1,86,94,23,193,1,249,22,7,23, -197,1,23,196,1,90,144,42,11,89,146,42,39,11,248,22,136,16,23,198,1, -86,94,23,195,1,28,249,22,170,9,23,195,2,2,49,86,94,23,193,1,249, -22,7,23,196,1,23,198,1,249,80,144,48,8,31,42,194,249,22,81,197,199, -28,248,22,89,23,196,2,9,28,248,22,82,23,196,2,28,248,22,150,2,248, -22,170,20,23,197,2,250,22,95,249,22,2,22,130,2,250,22,159,2,248,22, -170,20,23,204,2,23,202,2,9,250,22,159,2,248,22,170,20,23,202,2,11, -9,27,248,22,171,20,23,200,1,28,248,22,89,23,194,2,9,28,248,22,82, -23,194,2,28,248,22,150,2,248,22,170,20,23,195,2,250,22,95,249,22,2, -22,130,2,250,22,159,2,248,22,170,20,23,202,2,23,206,2,9,250,22,159, -2,248,22,170,20,23,200,2,11,9,249,80,144,48,8,48,42,23,203,1,248, -22,171,20,23,199,1,27,248,80,144,45,8,30,42,248,22,170,20,23,196,2, -250,22,95,250,22,159,2,23,199,2,23,205,2,9,250,22,159,2,23,199,1, -11,9,249,80,144,49,8,48,42,23,204,1,248,22,171,20,23,200,1,249,22, -95,247,22,160,16,249,80,144,47,8,48,42,23,202,1,248,22,171,20,23,198, -1,27,248,80,144,41,8,30,42,248,22,170,20,23,198,2,250,22,95,250,22, -159,2,23,199,2,23,201,2,9,250,22,159,2,23,199,1,11,9,27,248,22, -171,20,23,201,1,28,248,22,89,23,194,2,9,28,248,22,82,23,194,2,28, -248,22,150,2,248,22,170,20,23,195,2,250,22,95,249,22,2,22,130,2,250, -22,159,2,248,22,170,20,23,202,2,23,207,2,9,250,22,159,2,248,22,170, -20,23,200,2,11,9,249,80,144,49,8,48,42,23,204,1,248,22,171,20,23, -199,1,27,248,80,144,46,8,30,42,248,22,170,20,23,196,2,250,22,95,250, -22,159,2,23,199,2,23,206,2,9,250,22,159,2,23,199,1,11,9,249,80, -144,50,8,48,42,23,205,1,248,22,171,20,23,200,1,249,22,95,247,22,160, -16,249,80,144,48,8,48,42,23,203,1,248,22,171,20,23,198,1,249,22,95, -247,22,160,16,27,248,22,171,20,23,199,1,28,248,22,89,23,194,2,9,28, -248,22,82,23,194,2,28,248,22,150,2,248,22,170,20,23,195,2,250,22,95, -249,22,2,22,130,2,250,22,159,2,248,22,170,20,23,202,2,23,205,2,9, -250,22,159,2,248,22,170,20,23,200,2,11,9,249,80,144,47,8,48,42,23, -202,1,248,22,171,20,23,199,1,27,248,80,144,44,8,30,42,248,22,170,20, -23,196,2,250,22,95,250,22,159,2,23,199,2,23,204,2,9,250,22,159,2, -23,199,1,11,9,249,80,144,48,8,48,42,23,203,1,248,22,171,20,23,200, -1,249,22,95,247,22,160,16,249,80,144,46,8,48,42,23,201,1,248,22,171, -20,23,198,1,32,150,2,88,148,8,36,40,50,11,2,50,222,33,151,2,28, -248,22,89,248,22,83,23,195,2,248,22,91,27,248,22,170,20,195,28,248,22, -179,15,193,248,22,183,15,193,192,250,22,92,27,248,22,170,20,23,198,2,28, -248,22,179,15,193,248,22,183,15,193,192,2,67,248,2,150,2,248,22,171,20, -23,198,1,250,22,138,8,6,7,7,10,32,126,97,32,126,97,6,1,1,32, -23,196,1,249,22,138,8,6,6,6,10,32,32,32,126,97,248,22,133,2,23, -196,1,32,154,2,88,148,39,41,51,11,68,102,105,108,116,101,114,222,33,155, -2,28,248,22,89,23,195,2,9,28,248,23,194,2,248,22,82,23,196,2,249, -22,81,248,22,170,20,23,197,2,249,2,154,2,23,197,1,248,22,171,20,23, -199,1,249,2,154,2,23,195,1,248,22,171,20,23,197,1,28,248,22,89,23, -201,2,86,95,23,200,1,23,199,1,28,23,201,2,28,197,249,22,133,16,202, -199,200,86,95,23,201,1,23,198,1,27,28,248,22,89,23,198,2,2,66,249, -22,1,22,177,7,248,2,150,2,23,200,2,248,23,199,1,251,22,138,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,89,23,203,1,28,248,22,179,15, -23,202,2,248,22,183,15,23,202,1,23,201,1,250,22,177,7,28,248,22,179, -15,23,205,2,248,22,183,15,23,205,1,23,204,1,2,67,23,201,2,249,22, -1,22,177,7,249,22,2,32,0,88,148,8,36,40,48,11,9,222,33,152,2, -27,248,22,94,23,206,2,27,248,22,94,247,22,160,16,28,249,22,130,4,249, -22,185,3,23,198,2,23,197,2,44,23,206,2,249,22,95,247,22,160,16,248, -22,91,249,22,138,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,185,3, -23,201,1,23,200,1,28,249,22,5,22,132,2,23,202,2,250,22,138,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,177,7,249,22,2, -32,0,88,148,8,36,40,48,11,9,222,33,153,2,249,2,154,2,22,132,2, -23,209,1,86,95,23,200,1,23,198,1,2,66,27,248,22,82,23,202,2,27, -28,248,22,179,15,23,195,2,249,22,133,16,23,196,1,23,199,2,248,22,133, -2,23,195,1,28,28,248,22,179,15,248,22,170,20,23,204,2,248,22,128,16, -23,194,2,10,27,250,22,1,22,133,16,23,197,1,23,202,2,28,28,248,22, -89,23,200,2,10,248,22,128,16,23,194,2,28,23,201,2,28,28,250,80,144, -45,8,32,42,195,203,204,10,27,28,248,22,179,15,202,248,22,183,15,202,201, -19,248,22,157,7,23,195,2,27,28,249,22,133,4,23,196,4,43,28,249,22, -160,7,6,4,4,46,114,107,116,249,22,176,7,23,199,2,249,22,185,3,23, -200,4,43,249,22,177,7,250,22,176,7,23,200,1,39,249,22,185,3,23,201, -4,43,6,3,3,46,115,115,86,94,23,195,1,11,86,94,23,195,1,11,28, -23,193,2,250,80,144,48,8,32,42,198,23,196,1,23,15,11,2,28,200,249, -22,133,16,194,202,192,26,8,80,144,50,8,49,42,204,205,206,23,15,23,16, -23,17,248,22,171,20,23,19,28,23,19,23,19,200,192,26,8,80,144,50,8, -49,42,204,205,206,23,15,23,16,23,17,248,22,171,20,23,19,23,19,26,8, -80,144,49,8,49,42,203,204,205,206,23,15,23,16,248,22,171,20,23,18,23, -18,90,144,41,11,89,146,41,39,11,249,80,144,43,8,31,42,23,199,1,23, -200,1,27,248,22,69,28,248,22,179,15,195,248,22,183,15,195,194,27,27,247, -22,161,16,28,248,22,89,23,194,2,9,28,248,22,82,23,194,2,28,248,22, -150,2,248,22,170,20,23,195,2,250,22,95,249,22,2,22,130,2,250,22,159, -2,248,22,170,20,23,202,2,23,203,2,9,250,22,159,2,248,22,170,20,23, -200,2,11,9,249,80,144,49,8,48,42,23,200,1,248,22,171,20,23,199,1, -27,248,80,144,46,8,30,42,248,22,170,20,23,196,2,250,22,95,250,22,159, -2,23,199,2,23,202,2,9,250,22,159,2,23,199,1,11,9,249,80,144,50, -8,48,42,23,201,1,248,22,171,20,23,200,1,249,22,95,247,22,160,16,249, -80,144,48,8,48,42,23,199,1,248,22,171,20,23,198,1,26,8,80,144,51, -8,49,42,200,202,203,205,23,16,23,17,200,11,32,158,2,88,148,8,36,42, -59,11,2,50,222,33,159,2,28,248,22,134,4,23,196,2,86,94,23,195,1, -19,248,22,148,8,23,195,2,19,248,22,148,8,23,196,2,249,22,189,15,27, -251,22,155,8,250,22,154,8,23,205,2,39,23,204,4,2,51,249,22,154,8, -23,204,1,23,202,4,2,68,28,248,22,134,4,248,22,148,8,23,195,2,86, -94,23,193,1,251,22,185,11,2,37,2,69,2,70,202,192,28,248,22,180,15, -198,248,22,181,15,198,247,22,182,15,2,2,27,248,22,183,3,23,197,1,28, -249,22,170,9,8,46,249,22,149,8,23,198,2,23,197,2,27,248,22,182,3, -23,195,2,249,22,189,15,27,251,22,155,8,250,22,154,8,23,205,2,39,23, -204,1,2,71,249,22,154,8,23,204,1,23,202,1,2,68,28,248,22,134,4, -248,22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2, -70,202,192,28,248,22,180,15,198,248,22,181,15,198,247,22,182,15,250,2,158, -2,196,197,195,248,22,191,15,27,250,22,133,16,23,200,1,23,202,1,23,199, -1,28,249,22,170,9,23,197,2,66,115,97,109,101,192,28,248,22,138,16,23, -196,2,249,22,133,16,194,196,249,80,144,46,42,42,23,195,1,23,197,1,249, -22,5,20,20,96,88,148,39,40,54,47,9,226,5,4,2,6,33,160,2,23, -199,1,23,195,1,23,197,1,23,196,1,27,248,22,191,15,249,22,133,16,23, -198,2,23,199,2,28,23,193,2,192,86,94,23,193,1,28,23,197,1,27,90, -144,41,11,89,146,41,39,11,250,80,144,46,8,34,42,23,202,2,2,68,2, -37,27,248,22,185,15,23,196,1,27,250,2,158,2,23,197,2,23,204,1,248, -22,148,8,23,198,1,28,248,22,180,15,195,249,22,133,16,196,194,192,27,247, -22,162,16,249,22,5,20,20,96,88,148,39,40,51,47,9,226,5,6,2,3, -33,161,2,23,196,1,23,195,1,23,199,1,247,22,163,16,11,86,95,28,28, -248,22,180,15,23,194,2,10,28,248,22,179,15,23,194,2,10,28,248,22,154, -7,23,194,2,28,248,22,138,16,23,194,2,10,248,22,139,16,23,194,2,11, -12,252,22,183,11,23,200,2,2,42,39,23,198,2,23,199,2,28,28,248,22, -154,7,23,195,2,10,248,22,143,8,23,195,2,86,94,23,194,1,12,252,22, -183,11,23,200,2,2,72,40,23,198,2,23,199,1,90,144,42,11,89,146,42, -39,11,248,22,136,16,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,186,11,23,201,1,2,73,23,199,1,249, -22,7,23,195,1,23,196,1,32,164,2,88,148,8,36,46,61,11,2,74,222, -33,165,2,249,22,189,15,27,251,22,155,8,250,22,154,8,23,203,2,39,23, -207,1,23,205,1,249,23,203,1,23,202,1,23,208,1,28,248,22,154,7,23, -204,2,249,22,169,8,23,205,1,8,63,23,203,1,28,248,22,134,4,248,22, -148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2,70,201, -192,28,248,22,180,15,197,248,22,181,15,197,247,22,182,15,32,166,2,88,148, -8,36,45,8,24,11,2,50,222,33,167,2,28,248,22,134,4,23,199,2,86, -95,23,198,1,23,194,1,19,248,22,148,8,23,195,2,19,248,22,148,8,23, -196,2,249,22,189,15,27,251,22,155,8,250,22,154,8,23,205,2,39,23,204, -4,2,51,249,23,206,1,23,204,1,23,202,4,28,248,22,154,7,23,207,2, -249,22,169,8,23,208,1,8,63,23,206,1,28,248,22,134,4,248,22,148,8, -23,195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2,70,204,192,28, -248,22,180,15,200,248,22,181,15,200,247,22,182,15,2,2,27,248,22,183,3, -23,200,1,28,249,22,170,9,8,46,249,22,149,8,23,198,2,23,197,2,27, -248,22,182,3,23,195,2,249,22,189,15,27,251,22,155,8,250,22,154,8,23, -205,2,39,23,204,1,23,203,1,249,23,206,1,23,204,1,23,202,1,28,248, -22,154,7,23,207,2,249,22,169,8,23,208,1,8,63,23,206,1,28,248,22, -134,4,248,22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37,2, -69,2,70,204,192,28,248,22,180,15,200,248,22,181,15,200,247,22,182,15,28, -248,22,134,4,23,194,2,86,95,23,195,1,23,193,1,19,248,22,148,8,23, -196,2,19,248,22,148,8,23,197,2,249,22,189,15,27,251,22,155,8,250,22, -154,8,23,206,2,39,23,204,4,2,51,249,23,207,1,23,205,1,23,202,4, -28,248,22,154,7,23,208,2,249,22,169,8,23,209,1,8,63,23,207,1,28, -248,22,134,4,248,22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2, -37,2,69,2,70,205,192,28,248,22,180,15,201,248,22,181,15,201,247,22,182, -15,2,2,27,248,22,183,3,23,195,1,28,249,22,170,9,8,46,249,22,149, -8,23,199,2,23,197,2,27,248,22,182,3,23,195,2,249,22,189,15,27,251, -22,155,8,250,22,154,8,23,206,2,39,23,204,1,23,204,1,249,23,207,1, -23,205,1,23,202,1,28,248,22,154,7,23,208,2,249,22,169,8,23,209,1, -8,63,23,207,1,28,248,22,134,4,248,22,148,8,23,195,2,86,94,23,193, -1,251,22,185,11,2,37,2,69,2,70,205,192,28,248,22,180,15,201,248,22, -181,15,201,247,22,182,15,28,248,22,134,4,193,254,2,164,2,201,203,204,205, -248,22,148,8,202,2,51,248,22,148,8,202,27,248,22,183,3,194,28,249,22, -170,9,8,46,249,22,149,8,199,196,254,2,164,2,202,204,205,206,199,203,248, -22,182,3,200,253,2,166,2,201,202,203,204,205,198,90,144,41,11,89,146,41, -39,11,86,95,28,28,248,22,180,15,23,199,2,10,28,248,22,179,15,23,199, -2,10,28,248,22,154,7,23,199,2,28,248,22,138,16,23,199,2,10,248,22, -139,16,23,199,2,11,12,252,22,183,11,23,200,2,2,42,39,23,203,2,23, -204,2,28,28,248,22,154,7,23,200,2,10,248,22,143,8,23,200,2,12,252, -22,183,11,23,200,2,2,72,40,23,203,2,23,204,2,90,144,42,11,89,146, -42,39,11,248,22,136,16,23,202,2,86,94,23,195,1,86,94,28,192,12,250, -22,186,11,23,201,1,2,73,23,204,2,249,22,7,194,195,27,248,22,185,15, -23,196,1,27,19,248,22,148,8,23,196,2,28,248,22,134,4,23,194,4,86, -94,23,199,1,19,248,22,148,8,23,197,2,19,248,22,148,8,23,198,2,249, -22,189,15,27,251,22,155,8,250,22,154,8,23,207,2,39,23,204,4,2,51, -249,23,211,1,23,206,1,23,202,4,28,248,22,154,7,23,212,2,249,22,169, -8,23,213,1,8,63,23,211,1,28,248,22,134,4,248,22,148,8,23,195,2, -86,94,23,193,1,251,22,185,11,2,37,2,69,2,70,23,17,192,28,248,22, -180,15,205,248,22,181,15,205,247,22,182,15,2,2,27,248,22,183,3,23,195, -4,28,249,22,170,9,8,46,249,22,149,8,23,200,2,23,197,2,27,248,22, -182,3,23,195,2,249,22,189,15,27,251,22,155,8,250,22,154,8,23,207,2, -39,23,204,1,23,208,1,249,23,211,1,23,206,1,23,202,1,28,248,22,154, -7,23,212,2,249,22,169,8,23,213,1,8,63,23,211,1,28,248,22,134,4, -248,22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2, -70,23,17,192,28,248,22,180,15,205,248,22,181,15,205,247,22,182,15,28,248, -22,134,4,23,194,2,86,95,23,200,1,23,193,1,254,2,164,2,23,203,2, -23,208,1,23,209,1,23,210,1,248,22,148,8,23,204,2,2,51,248,22,148, -8,23,204,1,27,248,22,183,3,23,195,1,28,249,22,170,9,8,46,249,22, -149,8,23,201,2,23,197,2,254,2,164,2,23,204,1,23,209,1,23,210,1, -23,211,1,23,200,2,23,208,1,248,22,182,3,23,201,1,253,2,166,2,23, -203,1,23,207,1,23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22, -180,15,195,249,22,133,16,196,194,192,32,169,2,88,148,8,36,43,61,11,2, -50,222,33,170,2,28,248,22,134,4,23,197,2,86,94,23,196,1,19,248,22, -148,8,23,195,2,35,248,22,148,8,23,196,2,249,22,189,15,27,251,22,155, -8,250,22,154,8,23,205,1,39,23,204,4,2,51,2,51,28,248,22,154,7, -23,205,2,249,22,169,8,23,206,1,8,63,23,204,1,28,248,22,134,4,248, -22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2,70, -202,192,28,248,22,180,15,198,248,22,181,15,198,247,22,182,15,2,27,248,22, -183,3,23,198,1,28,249,22,170,9,8,46,249,22,149,8,23,198,2,23,197, -2,35,248,22,182,3,23,195,2,249,22,189,15,27,251,22,155,8,250,22,154, -8,23,205,1,39,23,204,1,2,51,2,51,28,248,22,154,7,23,205,2,249, -22,169,8,23,206,1,8,63,23,204,1,28,248,22,134,4,248,22,148,8,23, -195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2,70,202,192,28,248, -22,180,15,198,248,22,181,15,198,247,22,182,15,28,248,22,134,4,23,194,2, -86,94,23,193,1,19,248,22,148,8,23,196,2,35,248,22,148,8,23,197,2, -249,22,189,15,27,251,22,155,8,250,22,154,8,23,206,1,39,23,204,4,2, -51,2,51,28,248,22,154,7,23,206,2,249,22,169,8,23,207,1,8,63,23, -205,1,28,248,22,134,4,248,22,148,8,23,195,2,86,94,23,193,1,251,22, -185,11,2,37,2,69,2,70,203,192,28,248,22,180,15,199,248,22,181,15,199, -247,22,182,15,2,27,248,22,183,3,23,195,1,28,249,22,170,9,8,46,249, -22,149,8,23,199,2,23,197,2,35,248,22,182,3,23,195,2,249,22,189,15, -27,251,22,155,8,250,22,154,8,23,206,1,39,23,204,1,2,51,2,51,28, -248,22,154,7,23,206,2,249,22,169,8,23,207,1,8,63,23,205,1,28,248, -22,134,4,248,22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37, -2,69,2,70,203,192,28,248,22,180,15,199,248,22,181,15,199,247,22,182,15, -251,2,169,2,198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28, -248,22,180,15,23,196,2,10,28,248,22,179,15,23,196,2,10,28,248,22,154, -7,23,196,2,28,248,22,138,16,23,196,2,10,248,22,139,16,23,196,2,11, -12,252,22,183,11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,154, -7,23,197,2,10,248,22,143,8,23,197,2,12,252,22,183,11,2,37,2,72, -40,23,200,2,23,201,2,90,144,42,11,89,146,42,39,11,248,22,136,16,23, -199,2,86,94,23,195,1,86,94,28,192,12,250,22,186,11,2,37,2,73,23, -201,2,249,22,7,194,195,27,248,22,185,15,23,196,1,27,251,2,169,2,23, -198,2,23,201,1,23,202,1,248,22,148,8,23,199,1,28,248,22,180,15,195, -249,22,133,16,196,194,192,2,51,252,80,144,44,8,35,42,2,37,2,51,32, -0,88,148,8,36,41,46,11,9,222,33,172,2,198,199,32,174,2,88,148,8, -36,43,60,11,2,50,222,33,177,2,32,175,2,88,148,8,36,45,60,11,2, -74,222,33,176,2,249,22,189,15,27,251,22,155,8,250,22,154,8,23,203,2, -39,23,206,1,23,204,1,249,22,154,8,23,202,1,23,207,1,28,248,22,154, -7,23,203,2,249,22,169,8,23,204,1,8,63,23,202,1,28,248,22,134,4, -248,22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2, -70,200,192,28,248,22,180,15,196,248,22,181,15,196,247,22,182,15,28,248,22, -134,4,23,197,2,86,94,23,196,1,19,248,22,148,8,23,195,2,19,248,22, -148,8,23,196,2,249,22,189,15,27,251,22,155,8,250,22,154,8,23,205,2, -39,23,204,4,2,51,249,22,154,8,23,204,1,23,202,4,28,248,22,154,7, -23,205,2,249,22,169,8,23,206,1,8,63,23,204,1,28,248,22,134,4,248, -22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2,37,2,69,2,70, -202,192,28,248,22,180,15,198,248,22,181,15,198,247,22,182,15,2,2,27,248, -22,183,3,23,198,1,28,249,22,170,9,8,46,249,22,149,8,23,198,2,23, -197,2,27,248,22,182,3,23,195,2,249,22,189,15,27,251,22,155,8,250,22, -154,8,23,205,2,39,23,204,1,2,71,249,22,154,8,23,204,1,23,202,1, -28,248,22,154,7,23,205,2,249,22,169,8,23,206,1,8,63,23,204,1,28, -248,22,134,4,248,22,148,8,23,195,2,86,94,23,193,1,251,22,185,11,2, -37,2,69,2,70,202,192,28,248,22,180,15,198,248,22,181,15,198,247,22,182, -15,28,248,22,134,4,193,253,2,175,2,199,200,201,248,22,148,8,200,2,51, -248,22,148,8,200,27,248,22,183,3,194,28,249,22,170,9,8,46,249,22,149, -8,198,196,253,2,175,2,200,201,202,198,2,71,248,22,182,3,199,251,2,174, -2,198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248,22,180, -15,23,196,2,10,28,248,22,179,15,23,196,2,10,28,248,22,154,7,23,196, -2,28,248,22,138,16,23,196,2,10,248,22,139,16,23,196,2,11,12,252,22, -183,11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,154,7,23,197, -2,10,248,22,143,8,23,197,2,12,252,22,183,11,2,37,2,72,40,23,200, -2,23,201,2,90,144,42,11,89,146,42,39,11,248,22,136,16,23,199,2,86, -94,23,195,1,86,94,28,192,12,250,22,186,11,2,37,2,73,23,201,2,249, -22,7,194,195,27,248,22,185,15,23,196,1,27,251,2,174,2,23,198,2,23, -201,1,23,202,1,248,22,148,8,23,199,1,28,248,22,180,15,195,249,22,133, -16,196,194,192,252,80,144,44,8,35,42,2,37,2,71,22,154,8,198,199,249, -247,22,177,5,23,195,1,11,249,247,22,177,5,194,11,28,248,22,89,23,195, -2,9,27,27,248,22,82,23,197,2,28,248,22,140,16,23,194,2,248,22,143, -16,23,194,1,28,248,22,139,16,23,194,2,90,144,42,11,89,146,42,39,11, -248,22,136,16,249,22,141,16,250,80,144,50,43,42,248,22,156,16,2,56,11, -11,248,22,156,16,2,57,86,95,23,195,1,23,194,1,248,22,143,16,249,22, -141,16,23,199,1,23,196,1,27,250,80,144,45,43,42,248,22,156,16,2,56, -23,197,1,10,28,23,193,2,248,22,143,16,23,194,1,11,28,23,193,2,249, -22,81,248,22,143,16,249,22,141,16,23,198,1,247,22,157,16,27,248,22,171, -20,23,199,1,28,248,22,89,23,194,2,9,27,248,80,144,45,56,42,248,22, -82,23,196,2,28,23,193,2,249,22,81,248,22,143,16,249,22,141,16,23,198, -1,247,22,157,16,248,80,144,47,8,50,42,248,22,171,20,23,198,1,86,94, -23,193,1,248,80,144,45,8,50,42,248,22,171,20,23,196,1,86,94,23,193, -1,27,248,22,171,20,23,197,1,28,248,22,89,23,194,2,9,27,248,80,144, -43,56,42,248,22,82,23,196,2,28,23,193,2,249,22,81,248,22,143,16,249, -22,141,16,23,198,1,247,22,157,16,248,80,144,45,8,50,42,248,22,171,20, -23,198,1,86,94,23,193,1,248,80,144,43,8,50,42,248,22,171,20,23,196, -1,28,248,22,89,23,195,2,9,27,27,248,22,82,23,197,2,28,248,22,140, -16,23,194,2,248,22,143,16,23,194,1,28,248,22,139,16,23,194,2,90,144, -42,11,89,146,42,39,11,248,22,136,16,249,22,141,16,250,80,144,50,43,42, -248,22,156,16,2,56,11,11,248,22,156,16,2,57,86,95,23,195,1,23,194, -1,248,22,143,16,249,22,141,16,23,199,1,23,196,1,27,250,80,144,45,43, -42,248,22,156,16,2,56,23,197,1,10,28,23,193,2,248,22,143,16,23,194, -1,11,28,23,193,2,249,22,81,248,22,143,16,249,22,141,16,23,198,1,247, -22,157,16,27,248,22,171,20,23,199,1,28,248,22,89,23,194,2,9,27,248, -80,144,45,56,42,248,22,82,23,196,2,28,23,193,2,249,22,81,248,22,143, -16,249,22,141,16,23,198,1,247,22,157,16,248,80,144,47,8,51,42,248,22, -171,20,23,198,1,86,94,23,193,1,248,80,144,45,8,51,42,248,22,171,20, -23,196,1,86,94,23,193,1,27,248,22,171,20,23,197,1,28,248,22,89,23, -194,2,9,27,248,80,144,43,56,42,248,22,82,23,196,2,28,23,193,2,249, -22,81,248,22,143,16,249,22,141,16,23,198,1,247,22,157,16,248,80,144,45, -8,51,42,248,22,171,20,23,198,1,86,94,23,193,1,248,80,144,43,8,51, -42,248,22,171,20,23,196,1,27,248,22,156,16,2,58,28,248,22,140,16,23, -194,2,248,22,143,16,23,194,1,28,248,22,139,16,23,194,2,90,144,42,11, -89,146,42,39,11,248,22,136,16,249,22,141,16,250,80,144,49,43,42,248,22, -156,16,2,56,11,11,248,22,156,16,2,57,86,95,23,195,1,23,194,1,248, -22,143,16,249,22,141,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248, -22,156,16,2,56,23,197,1,10,28,23,193,2,248,22,143,16,23,194,1,11, -28,248,22,89,23,195,2,9,27,27,248,22,82,23,197,2,28,248,22,140,16, -23,194,2,248,22,143,16,23,194,1,28,248,22,139,16,23,194,2,90,144,42, -11,89,146,42,39,11,248,22,136,16,249,22,141,16,250,80,144,50,43,42,248, -22,156,16,2,56,11,11,248,22,156,16,2,57,86,95,23,195,1,23,194,1, -248,22,143,16,249,22,141,16,23,199,1,23,196,1,27,250,80,144,45,43,42, -248,22,156,16,2,56,23,197,1,10,28,23,193,2,248,22,143,16,23,194,1, -11,28,23,193,2,249,22,81,248,22,143,16,249,22,141,16,23,198,1,247,22, -157,16,27,248,22,171,20,23,199,1,28,248,22,89,23,194,2,9,27,27,248, -22,82,23,196,2,28,248,22,140,16,23,194,2,248,22,143,16,23,194,1,28, -248,22,139,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,136,16,249, -22,141,16,250,80,144,54,43,42,248,22,156,16,2,56,11,11,248,22,156,16, -2,57,86,95,23,195,1,23,194,1,248,22,143,16,249,22,141,16,23,199,1, -23,196,1,27,250,80,144,49,43,42,248,22,156,16,2,56,23,197,1,10,28, -23,193,2,248,22,143,16,23,194,1,11,28,23,193,2,249,22,81,248,22,143, -16,249,22,141,16,23,198,1,247,22,157,16,27,248,22,171,20,23,198,1,28, -248,22,89,23,194,2,9,27,248,80,144,49,56,42,248,22,82,23,196,2,28, -23,193,2,249,22,81,248,22,143,16,249,22,141,16,23,198,1,247,22,157,16, -248,80,144,51,8,53,42,248,22,171,20,23,198,1,86,94,23,193,1,248,80, -144,49,8,53,42,248,22,171,20,23,196,1,86,94,23,193,1,27,248,22,171, -20,23,196,1,28,248,22,89,23,194,2,9,27,248,80,144,47,56,42,248,22, -82,23,196,2,28,23,193,2,249,22,81,248,22,143,16,249,22,141,16,23,198, -1,247,22,157,16,248,80,144,49,8,53,42,248,22,171,20,23,198,1,86,94, -23,193,1,248,80,144,47,8,53,42,248,22,171,20,23,196,1,86,94,23,193, -1,27,248,22,171,20,23,197,1,28,248,22,89,23,194,2,9,27,27,248,22, -82,23,196,2,28,248,22,140,16,23,194,2,248,22,143,16,23,194,1,28,248, -22,139,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,136,16,249,22, -141,16,250,80,144,52,43,42,248,22,156,16,2,56,11,11,248,22,156,16,2, -57,86,95,23,195,1,23,194,1,248,22,143,16,249,22,141,16,23,199,1,23, -196,1,27,250,80,144,47,43,42,248,22,156,16,2,56,23,197,1,10,28,23, -193,2,248,22,143,16,23,194,1,11,28,23,193,2,249,22,81,248,22,143,16, -249,22,141,16,23,198,1,247,22,157,16,27,248,22,171,20,23,198,1,28,248, -22,89,23,194,2,9,27,248,80,144,47,56,42,248,22,82,23,196,2,28,23, -193,2,249,22,81,248,22,143,16,249,22,141,16,23,198,1,247,22,157,16,248, -80,144,49,8,53,42,248,22,171,20,23,198,1,86,94,23,193,1,248,80,144, -47,8,53,42,248,22,171,20,23,196,1,86,94,23,193,1,27,248,22,171,20, -23,196,1,28,248,22,89,23,194,2,9,27,248,80,144,45,56,42,248,22,82, -23,196,2,28,23,193,2,249,22,81,248,22,143,16,249,22,141,16,23,198,1, -247,22,157,16,248,80,144,47,8,53,42,248,22,171,20,23,198,1,86,94,23, -193,1,248,80,144,45,8,53,42,248,22,171,20,23,196,1,27,247,22,164,16, -27,248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43,44,41,28,23, -196,2,27,249,22,176,8,247,22,175,8,2,75,28,192,249,22,166,8,194,7, -63,2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200, -1,250,22,133,16,248,22,156,16,2,61,250,22,159,2,23,205,1,2,59,247, -22,172,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8,50,42,250,22, -95,9,248,22,91,248,22,156,16,2,55,9,28,193,249,22,81,195,194,192,27, -247,22,164,16,27,248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43, -44,41,28,23,196,2,27,249,22,176,8,247,22,175,8,2,75,28,192,249,22, -166,8,194,7,63,2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76, -27,28,23,200,1,250,22,133,16,248,22,156,16,2,61,250,22,159,2,23,205, -1,2,59,247,22,172,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8, -51,42,250,22,95,23,207,1,248,22,91,248,22,156,16,2,55,9,28,193,249, -22,81,195,194,192,27,247,22,164,16,27,248,80,144,42,58,42,249,80,144,44, -55,40,40,80,144,44,8,52,42,249,80,144,43,44,41,28,23,196,2,27,249, -22,176,8,247,22,175,8,2,75,28,192,249,22,166,8,194,7,63,2,66,2, -66,250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200,1,250,22,133, -16,248,22,156,16,2,61,250,22,159,2,23,205,1,2,59,247,22,172,8,2, -77,86,94,23,199,1,11,27,27,250,22,95,23,207,1,248,22,91,248,22,156, -16,2,55,23,208,1,28,248,22,89,23,194,2,9,27,27,248,22,82,23,196, -2,28,248,22,140,16,23,194,2,248,22,143,16,23,194,1,28,248,22,139,16, -23,194,2,90,144,42,11,89,146,42,39,11,248,22,136,16,249,22,141,16,250, -80,144,60,43,42,248,22,156,16,2,56,11,11,248,22,156,16,2,57,86,95, -23,195,1,23,194,1,248,22,143,16,249,22,141,16,23,199,1,23,196,1,27, -250,80,144,55,43,42,248,22,156,16,2,56,23,197,1,10,28,23,193,2,248, -22,143,16,23,194,1,11,28,23,193,2,249,22,81,248,22,143,16,249,22,141, -16,23,198,1,247,22,157,16,27,248,22,171,20,23,198,1,28,248,22,89,23, -194,2,9,27,248,80,144,55,56,42,248,22,82,23,196,2,28,23,193,2,249, -22,81,248,22,143,16,249,22,141,16,23,198,1,247,22,157,16,248,80,144,57, -8,53,42,248,22,171,20,23,198,1,86,94,23,193,1,248,80,144,55,8,53, -42,248,22,171,20,23,196,1,86,94,23,193,1,27,248,22,171,20,23,196,1, -28,248,22,89,23,194,2,9,27,248,80,144,53,56,42,248,22,82,23,196,2, -28,23,193,2,249,22,81,248,22,143,16,249,22,141,16,23,198,1,247,22,157, -16,248,80,144,55,8,53,42,248,22,171,20,23,198,1,86,94,23,193,1,248, -80,144,53,8,53,42,248,22,171,20,23,196,1,28,193,249,22,81,195,194,192, -27,20,13,144,80,144,40,46,40,26,9,80,144,49,47,40,249,22,31,11,80, -144,51,46,40,22,153,15,10,22,160,15,10,22,161,15,10,22,162,15,10,248, -22,149,6,23,196,2,28,248,22,149,7,23,194,2,12,86,94,248,22,178,9, -23,194,1,27,20,13,144,80,144,41,46,40,26,9,80,144,50,47,40,249,22, -31,11,80,144,52,46,40,22,153,15,10,22,160,15,10,22,161,15,10,22,162, -15,10,248,22,149,6,23,197,2,28,248,22,149,7,23,194,2,12,86,94,248, -22,178,9,23,194,1,27,20,13,144,80,144,42,46,40,26,9,80,144,51,47, -40,249,22,31,11,80,144,53,46,40,22,153,15,10,22,160,15,10,22,161,15, -10,22,162,15,10,248,22,149,6,23,198,2,28,248,22,149,7,23,194,2,12, -86,94,248,22,178,9,23,194,1,248,80,144,43,8,54,42,197,86,94,249,22, -140,7,247,22,173,5,23,196,2,248,22,164,6,249,22,137,4,39,249,22,185, -3,28,23,198,2,23,198,1,86,94,23,198,1,39,23,199,1,27,248,22,190, -5,28,23,198,2,86,95,23,197,1,23,196,1,23,198,1,86,94,23,198,1, -27,250,80,144,45,43,42,248,22,156,16,2,56,11,11,27,248,22,140,4,23, -199,1,27,28,23,194,2,23,194,1,86,94,23,194,1,39,27,248,22,140,4, -23,202,1,249,22,141,6,23,198,1,20,20,95,88,148,8,36,39,51,11,9, -224,3,2,33,190,2,23,195,1,23,196,1,248,80,144,41,8,54,42,193,145, -39,9,20,121,145,2,1,39,16,1,11,16,0,20,27,15,56,9,2,2,2, -2,29,11,11,11,11,11,11,11,9,9,11,11,11,10,46,80,143,39,39,20, -121,145,2,1,54,16,40,2,3,2,4,2,5,2,6,2,7,2,8,2,9, -30,2,11,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, -45,107,101,121,11,6,30,2,11,1,23,101,120,116,101,110,100,45,112,97,114, -97,109,101,116,101,114,105,122,97,116,105,111,110,11,4,2,12,2,13,2,14, -2,15,2,16,2,17,2,18,30,2,11,1,19,99,97,99,104,101,45,99,111, -110,102,105,103,117,114,97,116,105,111,110,11,1,2,19,2,20,2,21,2,22, -2,23,2,24,2,25,2,26,2,27,2,28,2,29,30,2,11,1,21,101,120, -99,101,112,116,105,111,110,45,104,97,110,100,108,101,114,45,107,101,121,11,3, -2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,2,39,2, -40,16,0,40,42,39,16,0,39,16,19,2,13,2,14,2,12,2,25,2,4, -2,35,2,23,2,24,2,19,2,29,2,33,2,21,2,22,2,31,2,27,2, -30,2,32,2,36,2,28,58,11,11,11,16,17,2,9,2,17,2,15,2,40, -2,16,2,7,2,26,2,39,2,18,2,20,2,38,2,5,2,34,2,8,2, -37,2,3,2,6,16,17,11,11,11,11,11,11,11,11,11,11,11,11,11,11, -11,11,11,16,17,2,9,2,17,2,15,2,40,2,16,2,7,2,26,2,39, -2,18,2,20,2,38,2,5,2,34,2,8,2,37,2,3,2,6,56,56,40, -12,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0, -39,39,16,51,20,15,16,2,32,0,88,148,8,36,40,48,11,2,3,222,33, -78,80,144,39,39,40,20,15,16,2,249,22,156,7,7,92,7,92,80,144,39, -40,40,20,15,16,2,88,148,8,36,40,57,41,2,5,223,0,33,83,80,144, -39,41,40,20,15,16,2,88,148,8,36,41,61,41,2,6,223,0,33,85,80, -144,39,42,40,20,15,16,2,20,26,96,2,7,88,148,8,36,42,8,24,8, -32,9,223,0,33,92,88,148,8,36,41,50,55,9,223,0,33,93,88,148,8, -36,40,49,55,9,223,0,33,94,80,144,39,43,40,20,15,16,2,27,248,22, -168,16,248,22,168,8,27,28,249,22,170,9,247,22,181,8,2,43,6,1,1, -59,6,1,1,58,250,22,138,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,41,51,11,2,8,223, -0,33,98,80,144,39,44,40,20,15,16,2,88,148,39,40,8,44,8,128,6, -2,9,223,0,33,99,80,144,39,45,40,20,15,16,2,32,0,88,148,8,36, -41,50,11,2,12,222,33,100,80,144,39,48,40,20,15,16,2,32,0,88,148, -8,36,42,51,11,2,13,222,33,102,80,144,39,49,40,20,15,16,2,32,0, -88,148,8,36,41,49,11,2,14,222,33,103,80,144,39,50,40,20,15,16,2, -88,148,39,42,53,8,128,128,2,15,223,0,33,105,80,144,39,51,40,20,15, -16,2,88,148,39,44,55,8,128,128,2,17,223,0,33,107,80,144,39,53,40, -20,15,16,2,88,148,39,39,56,55,9,223,0,33,108,80,144,39,8,40,42, -20,15,16,2,88,148,39,39,47,16,4,39,40,8,128,4,39,2,18,223,0, -33,109,80,144,39,54,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33, -110,80,144,39,8,41,42,20,15,16,2,88,148,39,39,47,16,4,39,40,8, -128,8,39,2,20,223,0,33,111,80,144,39,57,40,20,15,16,2,88,148,8, -36,39,8,44,8,128,6,9,223,0,33,112,80,144,39,8,42,42,20,15,16, -2,88,148,8,36,40,50,16,4,39,39,8,128,16,39,2,21,223,0,33,113, -80,144,39,58,40,20,15,16,2,20,28,143,32,0,88,148,39,40,48,11,2, -22,222,33,114,32,0,88,148,39,40,48,11,2,22,222,33,115,80,144,39,59, -40,20,15,16,2,88,148,8,36,40,50,8,240,0,128,0,0,2,23,223,0, -33,116,80,144,39,60,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33, -117,80,144,39,8,43,42,20,15,16,2,88,148,8,36,40,51,16,4,39,40, -8,128,32,39,2,24,223,0,33,118,80,144,39,61,40,20,15,16,2,88,148, -39,40,56,55,2,19,223,0,33,119,80,144,39,56,40,20,15,16,2,88,148, -8,36,41,58,16,4,8,240,0,128,0,0,8,32,8,128,64,39,2,50,223, -0,33,120,80,144,39,8,44,42,20,15,16,2,88,148,8,36,42,52,16,4, -39,39,8,128,64,39,2,25,223,0,33,121,80,144,39,8,23,40,20,15,16, -2,88,148,39,39,56,55,9,223,0,33,122,80,144,39,8,45,42,20,15,16, -2,88,148,8,36,39,57,16,4,8,240,0,128,0,0,8,137,2,8,128,128, -39,2,26,223,0,33,123,80,144,39,8,24,40,20,15,16,2,247,22,141,2, -80,144,39,8,25,40,20,15,16,2,248,22,16,67,115,116,97,109,112,80,144, -39,8,26,40,20,15,16,2,88,148,39,40,49,8,240,0,0,0,4,9,223, -0,33,125,80,144,39,8,46,42,20,15,16,2,88,148,39,41,51,16,4,39, -8,128,80,8,240,0,64,0,0,39,2,29,223,0,33,133,2,80,144,39,8, -27,40,20,15,16,2,32,0,88,148,8,36,40,48,11,2,30,222,33,134,2, -80,144,39,8,29,40,20,15,16,2,88,148,8,36,42,48,8,240,0,0,0, -2,74,109,97,107,101,45,104,97,110,100,108,101,114,223,0,33,136,2,80,144, -39,8,47,42,20,15,16,2,88,148,39,40,47,16,4,8,128,6,8,128,104, -8,240,0,128,0,0,39,2,31,223,0,33,146,2,80,144,39,8,30,40,20, -15,16,2,88,148,39,41,59,16,2,39,8,240,0,128,0,0,2,32,223,0, -33,148,2,80,144,39,8,31,40,20,15,16,2,88,148,8,36,41,61,16,4, -39,8,240,0,64,0,0,39,40,2,50,223,0,33,149,2,80,144,39,8,48, -42,20,15,16,2,88,148,39,47,8,33,16,4,39,39,40,41,67,99,108,111, -111,112,223,0,33,156,2,80,144,39,8,49,42,20,15,16,2,88,148,39,44, -8,25,16,4,39,8,240,0,192,0,0,39,42,2,16,223,0,33,157,2,80, -144,39,52,40,20,15,16,2,88,148,39,42,58,16,4,47,39,43,39,2,33, -223,0,33,162,2,80,144,39,8,32,40,20,15,16,2,32,0,88,148,39,42, -53,11,2,35,222,33,163,2,80,144,39,8,34,40,20,15,16,2,32,0,88, -148,8,36,44,8,27,11,2,36,222,33,168,2,80,144,39,8,35,40,20,15, -16,2,20,28,143,32,0,88,148,8,36,41,55,11,2,37,222,33,171,2,88, -148,8,100,41,52,16,4,39,39,47,39,2,37,223,0,33,173,2,80,144,39, -8,36,40,20,15,16,2,20,28,143,32,0,88,148,8,36,41,55,11,2,34, -222,33,178,2,88,148,8,100,41,52,16,4,39,39,47,39,2,34,223,0,33, -179,2,80,144,39,8,33,40,20,15,16,2,20,28,143,32,0,88,148,39,40, -47,11,2,38,222,33,180,2,32,0,88,148,39,40,47,11,2,38,222,33,181, -2,80,144,39,8,37,40,20,15,16,2,88,148,8,36,40,58,16,4,55,41, -39,43,2,50,223,0,33,182,2,80,144,39,8,50,42,20,15,16,2,88,148, -8,36,40,58,16,4,55,41,39,47,2,50,223,0,33,183,2,80,144,39,8, -51,42,20,15,16,2,88,148,39,39,56,55,9,223,0,33,184,2,80,144,39, -8,52,42,20,15,16,2,88,148,8,36,40,8,23,16,4,55,41,39,8,32, -2,50,223,0,33,185,2,80,144,39,8,53,42,20,15,16,2,20,26,96,2, -39,88,148,39,39,60,16,4,8,32,8,140,2,39,43,9,223,0,33,186,2, -88,148,39,40,61,16,4,8,32,8,140,2,39,47,9,223,0,33,187,2,88, -148,39,41,8,30,16,4,8,48,8,139,2,39,8,48,9,223,0,33,188,2, -80,144,39,8,38,40,20,15,16,2,88,148,8,36,40,60,16,4,8,128,6, -39,39,8,64,2,50,223,0,33,189,2,80,144,39,8,54,42,20,15,16,2, -88,148,8,36,42,56,16,4,55,39,39,8,64,2,40,223,0,33,191,2,80, -144,39,8,39,40,95,29,94,2,10,70,35,37,107,101,114,110,101,108,11,29, -94,2,10,71,35,37,109,105,110,45,115,116,120,11,2,11,9,9,9,39,9, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,192,0,0,0,1,0,0,8,0,16,0, +29,0,34,0,51,0,63,0,85,0,114,0,158,0,164,0,178,0,193,0,211, +0,223,0,239,0,253,0,19,1,39,1,73,1,90,1,107,1,130,1,145,1, +184,1,202,1,233,1,245,1,6,2,18,2,33,2,57,2,89,2,118,2,134, +2,152,2,172,2,193,2,211,2,242,2,0,3,17,3,61,3,69,3,74,3, +118,3,125,3,135,3,150,3,159,3,164,3,166,3,199,3,223,3,244,3,1, +4,11,4,20,4,31,4,49,4,62,4,72,4,82,4,88,4,93,4,105,4, +108,4,112,4,117,4,160,4,173,4,176,4,200,4,239,4,246,4,3,5,25, +5,36,5,66,5,89,5,97,5,121,5,142,5,91,6,121,6,212,9,235,9, +252,9,176,11,23,12,37,12,241,12,217,14,226,14,235,14,249,14,3,15,23, +16,126,16,251,16,68,17,141,17,243,17,16,18,87,18,221,18,36,19,243,19, +105,20,118,20,236,20,249,20,100,21,167,21,180,21,191,21,87,22,205,22,249, +22,104,23,182,25,206,25,68,26,150,27,157,27,209,27,222,27,212,28,228,28, +83,29,242,29,249,29,126,31,203,31,220,31,120,32,140,32,200,32,207,32,67, +33,121,33,140,33,91,34,107,34,68,35,69,36,106,36,115,36,202,37,47,40, +63,40,130,40,151,40,171,40,191,40,248,40,221,43,187,44,203,44,174,45,232, +45,9,46,141,46,44,47,60,47,157,47,174,47,252,49,47,52,63,52,37,54, +225,54,227,54,254,54,14,55,30,55,127,55,194,56,126,57,142,57,151,57,158, +57,224,58,34,60,152,60,198,63,72,64,204,64,149,66,99,67,141,67,249,67, +0,0,197,75,0,0,3,1,5,105,110,115,112,48,69,35,37,117,116,105,108, +115,74,112,97,116,104,45,115,116,114,105,110,103,63,66,98,115,98,115,78,110, +111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,73,114,101,114,111,111, +116,45,112,97,116,104,1,20,102,105,110,100,45,101,120,101,99,117,116,97,98, +108,101,45,112,97,116,104,1,27,112,97,116,104,45,108,105,115,116,45,115,116, +114,105,110,103,45,62,112,97,116,104,45,108,105,115,116,1,42,99,97,108,108, +45,119,105,116,104,45,100,101,102,97,117,108,116,45,114,101,97,100,105,110,103, +45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,67,113,117,111, +116,101,29,94,2,10,70,35,37,112,97,114,97,109,122,11,76,45,99,104,101, +99,107,45,114,101,108,112,97,116,104,79,45,99,104,101,99,107,45,99,111,108, +108,101,99,116,105,111,110,73,45,99,104,101,99,107,45,102,97,105,108,77,99, +111,108,108,101,99,116,105,111,110,45,112,97,116,104,75,102,105,110,100,45,99, +111,108,45,102,105,108,101,1,20,99,111,108,108,101,99,116,105,111,110,45,102, +105,108,101,45,112,97,116,104,1,18,102,105,110,100,45,109,97,105,110,45,99, +111,108,108,101,99,116,115,1,32,101,120,101,45,114,101,108,97,116,105,118,101, +45,112,97,116,104,45,62,99,111,109,112,108,101,116,101,45,112,97,116,104,78, +102,105,110,100,45,109,97,105,110,45,99,111,110,102,105,103,78,103,101,116,45, +99,111,110,102,105,103,45,116,97,98,108,101,1,21,103,101,116,45,105,110,115, +116,97,108,108,97,116,105,111,110,45,110,97,109,101,76,99,111,101,114,99,101, +45,116,111,45,112,97,116,104,1,37,99,111,108,108,101,99,116,115,45,114,101, +108,97,116,105,118,101,45,112,97,116,104,45,62,99,111,109,112,108,101,116,101, +45,112,97,116,104,79,97,100,100,45,99,111,110,102,105,103,45,115,101,97,114, +99,104,1,29,102,105,110,100,45,108,105,98,114,97,114,121,45,99,111,108,108, +101,99,116,105,111,110,45,108,105,110,107,115,73,108,105,110,107,115,45,99,97, +99,104,101,78,115,116,97,109,112,45,112,114,111,109,112,116,45,116,97,103,73, +102,105,108,101,45,62,115,116,97,109,112,76,110,111,45,102,105,108,101,45,115, +116,97,109,112,63,1,22,103,101,116,45,108,105,110,107,101,100,45,99,111,108, +108,101,99,116,105,111,110,115,1,30,110,111,114,109,97,108,105,122,101,45,99, +111,108,108,101,99,116,105,111,110,45,114,101,102,101,114,101,110,99,101,1,27, +102,105,108,101,45,101,120,105,115,116,115,63,47,109,97,121,98,101,45,99,111, +109,112,105,108,101,100,77,112,97,116,104,45,97,100,100,45,115,117,102,102,105, +120,79,99,104,101,99,107,45,115,117,102,102,105,120,45,99,97,108,108,1,18, +112,97,116,104,45,97,100,106,117,115,116,45,115,117,102,102,105,120,1,19,112, +97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,79,108,111, +97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,1,29,102,105,110,100, +45,108,105,98,114,97,114,121,45,99,111,108,108,101,99,116,105,111,110,45,112, +97,116,104,115,75,101,109,98,101,100,100,101,100,45,108,111,97,100,78,110,111, +114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,41,41,40,111,114,47, +99,32,112,97,116,104,45,102,111,114,45,115,111,109,101,45,115,121,115,116,101, +109,63,32,112,97,116,104,45,115,116,114,105,110,103,63,41,69,119,105,110,100, +111,119,115,6,2,2,92,49,6,41,41,40,111,114,47,99,32,112,97,116,104, +45,115,116,114,105,110,103,63,32,112,97,116,104,45,102,111,114,45,115,111,109, +101,45,115,121,115,116,101,109,63,41,6,4,4,112,97,116,104,5,8,92,92, +63,92,82,69,76,92,6,12,12,112,97,116,104,45,115,116,114,105,110,103,63, +70,114,101,108,97,116,105,118,101,66,108,111,111,112,5,0,6,30,30,40,112, +114,111,99,101,100,117,114,101,45,97,114,105,116,121,45,105,110,99,108,117,100, +101,115,47,99,32,48,41,6,21,21,105,110,118,97,108,105,100,32,114,101,108, +97,116,105,118,101,32,112,97,116,104,6,18,18,40,97,110,121,47,99,32,46, +32,45,62,32,46,32,97,110,121,41,74,99,111,108,108,101,99,116,115,45,100, +105,114,71,101,120,101,99,45,102,105,108,101,70,111,114,105,103,45,100,105,114, +72,99,111,110,102,105,103,45,100,105,114,79,105,110,115,116,97,108,108,97,116, +105,111,110,45,110,97,109,101,6,10,10,108,105,110,107,115,46,114,107,116,100, +71,97,100,100,111,110,45,100,105,114,71,102,115,45,99,104,97,110,103,101,67, +101,114,114,111,114,66,114,111,111,116,73,115,116,97,116,105,99,45,114,111,111, +116,6,0,0,6,1,1,47,5,3,46,122,111,6,40,40,114,101,109,111,118, +105,110,103,32,115,117,102,102,105,120,32,109,97,107,101,115,32,112,97,116,104, +32,101,108,101,109,101,110,116,32,101,109,112,116,121,6,10,10,103,105,118,101, +110,32,112,97,116,104,5,1,95,6,21,21,40,111,114,47,99,32,115,116,114, +105,110,103,63,32,98,121,116,101,115,63,41,6,36,36,99,97,110,110,111,116, +32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32,114,111, +111,116,32,112,97,116,104,58,32,68,102,105,110,105,115,104,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,180,15,194,28,192,192,28,248,22,155,7,194,27,248,22,139,16,195,28, +192,192,248,22,140,16,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,181,15,23,195,2,10,28,248,22,180,15,23,195,2,10, +28,248,22,155,7,23,195,2,28,248,22,139,16,23,195,2,10,248,22,140,16, +23,195,2,11,12,250,22,184,11,2,41,2,42,23,197,2,28,28,248,22,181, +15,23,195,2,249,22,171,9,248,22,182,15,23,197,2,2,43,249,22,171,9, +247,22,182,8,2,43,27,28,248,22,155,7,23,196,2,23,195,2,248,22,167, +8,248,22,185,15,23,197,2,28,249,22,177,16,2,79,23,195,2,28,248,22, +155,7,195,248,22,188,15,195,194,86,94,23,195,1,27,248,22,130,8,23,195, +1,249,22,189,15,248,22,170,8,250,22,185,16,2,80,28,249,22,177,16,2, +81,23,201,2,23,199,1,250,22,185,16,2,82,23,202,1,2,44,80,144,47, +40,41,2,43,28,248,22,155,7,194,248,22,188,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,180,15,23,195,2,10,28,248,22,155, +7,23,195,2,28,248,22,139,16,23,195,2,10,248,22,140,16,23,195,2,11, +10,248,22,181,15,23,195,2,12,252,22,184,11,2,6,2,45,39,23,199,2, +23,200,2,28,28,28,248,22,180,15,23,196,2,10,28,248,22,155,7,23,196, +2,28,248,22,139,16,23,196,2,10,248,22,140,16,23,196,2,11,10,248,22, +181,15,23,196,2,12,252,22,184,11,2,6,2,45,40,23,199,2,23,200,2, +27,28,248,22,181,15,23,196,2,248,22,182,15,23,196,2,247,22,183,15,86, +95,28,28,248,22,141,16,23,196,2,10,249,22,171,9,247,22,183,15,23,195, +2,12,253,22,186,11,2,6,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,183,15,28,249,22,171, +9,28,248,22,181,15,23,199,2,248,22,182,15,23,199,2,247,22,183,15,23, +195,2,12,253,22,186,11,2,6,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,145,16,28,248,22,141,16,23,199,2,23, +198,1,248,22,142,16,23,199,1,86,94,28,28,248,22,181,15,23,194,2,10, +28,248,22,180,15,23,194,2,10,28,248,22,155,7,23,194,2,28,248,22,139, +16,23,194,2,10,248,22,140,16,23,194,2,11,12,250,22,184,11,2,41,2, +42,23,196,2,28,28,248,22,181,15,23,194,2,249,22,171,9,248,22,182,15, +23,196,2,2,43,249,22,171,9,247,22,182,8,2,43,27,28,248,22,155,7, +23,195,2,23,194,2,248,22,167,8,248,22,185,15,23,196,2,28,249,22,177, +16,2,79,23,195,2,28,248,22,155,7,194,248,22,188,15,194,193,86,94,23, +194,1,27,248,22,130,8,23,195,1,249,22,189,15,248,22,170,8,250,22,185, +16,2,80,28,249,22,177,16,2,81,23,201,2,23,199,1,250,22,185,16,2, +82,23,202,1,2,44,80,144,50,40,41,2,43,28,248,22,155,7,193,248,22, +188,15,193,192,27,248,22,185,15,23,195,2,28,249,22,171,9,23,197,2,66, +117,110,105,120,28,249,22,152,8,194,5,1,47,28,248,22,181,15,198,197,248, +22,188,15,198,249,22,134,16,199,249,22,189,15,249,22,155,8,248,22,185,15, +200,40,198,86,94,23,194,1,28,249,22,171,9,23,197,2,2,43,249,22,134, +16,23,200,1,249,22,189,15,28,249,22,177,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,156,8,2,47,250,22,155,8,203,43,44,5,1,92,249,22, +155,8,202,45,28,249,22,177,16,2,84,23,199,2,249,22,156,8,2,47,249, +22,155,8,200,43,28,249,22,177,16,2,84,23,199,2,249,22,156,8,2,47, +249,22,155,8,200,43,28,249,22,177,16,0,14,35,114,120,34,94,92,92,92, +92,92,92,92,92,34,23,199,2,249,22,156,8,5,4,85,78,67,92,249,22, +155,8,200,41,28,249,22,177,16,0,12,35,114,120,34,94,91,97,45,122,93, +58,34,198,249,22,156,8,250,22,155,8,201,39,40,249,22,155,8,200,41,12, +198,12,32,86,88,148,8,36,42,56,11,72,102,111,117,110,100,45,101,120,101, +99,222,33,89,32,87,88,148,8,36,43,61,11,66,110,101,120,116,222,33,88, +27,248,22,143,16,23,196,2,28,249,22,173,9,23,195,2,23,197,1,11,28, +248,22,139,16,23,194,2,27,249,22,134,16,23,197,1,23,196,1,28,23,197, +2,90,144,42,11,89,146,42,39,11,248,22,137,16,23,197,2,86,95,23,195, +1,23,194,1,27,28,23,202,2,27,248,22,143,16,23,199,2,28,249,22,173, +9,23,195,2,23,200,2,11,28,248,22,139,16,23,194,2,250,2,86,23,205, +2,23,206,2,249,22,134,16,23,200,2,23,198,1,250,2,86,23,205,2,23, +206,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,180, +15,23,196,2,27,249,22,134,16,23,198,2,23,205,2,28,28,248,22,129,16, +193,10,248,22,128,16,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28, +23,203,2,11,27,248,22,143,16,23,200,2,28,249,22,173,9,194,23,201,1, +11,28,248,22,139,16,193,250,2,86,205,206,249,22,134,16,200,197,250,2,86, +205,206,195,192,86,94,23,194,1,28,23,196,2,90,144,42,11,89,146,42,39, +11,248,22,137,16,23,197,2,86,95,23,195,1,23,194,1,27,28,23,201,2, +27,248,22,143,16,23,199,2,28,249,22,173,9,23,195,2,23,200,2,11,28, +248,22,139,16,23,194,2,250,2,86,23,204,2,23,205,2,249,22,134,16,23, +200,2,23,198,1,250,2,86,23,204,2,23,205,2,23,196,1,11,28,23,193, +2,192,86,94,23,193,1,27,28,248,22,180,15,23,196,2,27,249,22,134,16, +23,198,2,23,204,2,28,28,248,22,129,16,193,10,248,22,128,16,193,192,11, +11,28,23,193,2,192,86,94,23,193,1,28,23,202,2,11,27,248,22,143,16, +23,200,2,28,249,22,173,9,194,23,201,1,11,28,248,22,139,16,193,250,2, +86,204,205,249,22,134,16,200,197,250,2,86,204,205,195,192,28,23,193,2,90, +144,42,11,89,146,42,39,11,248,22,137,16,23,199,2,86,95,23,195,1,23, +194,1,27,28,23,198,2,251,2,87,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,180,15,195,27,249, +22,134,16,197,200,28,28,248,22,129,16,193,10,248,22,128,16,193,192,11,11, +28,192,192,28,198,11,251,2,87,198,203,201,202,194,32,90,88,148,8,36,43, +60,11,2,50,222,33,91,28,248,22,90,23,197,2,11,27,249,22,134,16,248, +22,142,16,248,22,83,23,201,2,23,196,2,28,248,22,128,16,23,194,2,250, +2,86,197,198,195,86,94,23,193,1,27,248,22,172,20,23,199,1,28,248,22, +90,23,194,2,11,27,249,22,134,16,248,22,142,16,248,22,83,23,198,2,23, +198,2,28,248,22,128,16,23,194,2,250,2,86,199,200,195,86,94,23,193,1, +27,248,22,172,20,23,196,1,28,248,22,90,23,194,2,11,27,249,22,134,16, +248,22,142,16,248,22,83,23,198,2,23,200,2,28,248,22,128,16,23,194,2, +250,2,86,201,202,195,86,94,23,193,1,27,248,22,172,20,23,196,1,28,248, +22,90,23,194,2,11,27,249,22,134,16,248,22,142,16,248,22,83,197,201,28, +248,22,128,16,193,250,2,86,203,204,195,251,2,90,203,204,205,248,22,172,20, +198,86,95,28,28,248,22,180,15,23,195,2,10,28,248,22,155,7,23,195,2, +28,248,22,139,16,23,195,2,10,248,22,140,16,23,195,2,11,12,250,22,184, +11,2,7,2,48,23,197,2,28,28,23,195,2,28,28,248,22,180,15,23,196, +2,10,28,248,22,155,7,23,196,2,28,248,22,139,16,23,196,2,10,248,22, +140,16,23,196,2,11,248,22,139,16,23,196,2,11,10,12,250,22,184,11,2, +7,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,139,16,23,195,2,90,144, +42,11,89,146,42,39,11,248,22,137,16,23,198,2,249,22,171,9,194,2,49, +11,27,249,22,177,8,247,22,176,8,5,4,80,65,84,72,27,28,23,194,2, +249,80,143,43,44,249,22,167,8,23,198,1,7,63,9,86,94,23,194,1,9, +27,28,249,22,171,9,247,22,182,8,2,43,249,22,82,248,22,189,15,5,1, +46,23,196,1,23,194,1,28,248,22,90,23,194,2,11,27,249,22,134,16,248, +22,142,16,248,22,83,23,198,2,23,200,2,28,248,22,128,16,23,194,2,250, +2,86,201,202,195,86,94,23,193,1,27,248,22,172,20,23,196,1,28,248,22, +90,23,194,2,11,27,249,22,134,16,248,22,142,16,248,22,83,23,198,2,23, +202,2,28,248,22,128,16,23,194,2,250,2,86,203,204,195,86,94,23,193,1, +27,248,22,172,20,23,196,1,28,248,22,90,23,194,2,11,27,249,22,134,16, +248,22,142,16,248,22,83,23,198,2,23,204,2,28,248,22,128,16,23,194,2, +250,2,86,205,206,195,86,94,23,193,1,27,248,22,172,20,23,196,1,28,248, +22,90,23,194,2,11,27,249,22,134,16,248,22,142,16,248,22,83,197,205,28, +248,22,128,16,193,250,2,86,23,15,23,16,195,251,2,90,23,15,23,16,23, +17,248,22,172,20,198,27,248,22,142,16,23,196,1,28,248,22,128,16,193,250, +2,86,198,199,195,11,250,80,144,42,43,42,196,197,11,250,80,144,42,43,42, +196,11,11,32,95,88,148,8,36,42,58,11,2,50,222,33,97,0,8,35,114, +120,35,34,92,34,34,27,249,22,173,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,173,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,95,202,23,204,1,248,22,113,23,199,1,27,28, +249,22,171,9,247,22,182,8,2,43,250,22,185,16,2,96,23,198,1,2,51, +194,28,249,22,152,8,194,2,51,249,22,96,202,195,249,22,82,248,22,189,15, +195,195,86,95,23,199,1,23,193,1,27,28,249,22,171,9,247,22,182,8,2, +43,250,22,185,16,2,96,23,198,1,2,51,194,28,249,22,152,8,194,2,51, +249,22,96,200,9,249,22,82,248,22,189,15,195,9,27,28,249,22,171,9,247, +22,182,8,2,43,250,22,185,16,2,96,23,198,1,2,51,194,28,249,22,152, +8,194,2,51,249,22,96,198,195,249,22,82,248,22,189,15,195,195,86,95,23, +195,1,23,193,1,27,28,249,22,171,9,247,22,182,8,2,43,250,22,185,16, +2,96,23,200,1,2,51,196,28,249,22,152,8,194,2,51,249,22,96,196,9, +249,22,82,248,22,189,15,195,9,86,95,28,28,248,22,144,8,194,10,248,22, +155,7,194,12,250,22,184,11,2,8,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,180,15,196,11,12,250,22,184,11,2,8,6,14,14,40,108,105,115, +116,111,102,32,112,97,116,104,63,41,197,250,2,95,197,195,28,248,22,155,7, +197,248,22,169,8,197,196,28,28,248,22,0,23,195,2,249,22,48,23,196,2, +39,11,20,13,144,80,144,39,46,40,26,35,80,144,8,35,47,40,249,22,31, +11,80,144,8,37,46,40,22,147,15,10,22,148,15,10,22,149,15,10,22,150, +15,11,22,151,15,11,22,155,15,10,22,154,15,11,22,156,15,10,22,153,15, +10,22,157,15,10,22,152,15,11,22,158,15,10,22,159,15,10,22,160,15,10, +22,161,15,11,22,162,15,10,22,145,15,11,247,23,194,1,250,22,184,11,2, +9,2,52,23,197,1,86,94,28,28,248,22,180,15,23,195,2,10,28,248,22, +155,7,23,195,2,28,248,22,139,16,23,195,2,10,248,22,140,16,23,195,2, +11,12,250,22,184,11,23,196,2,2,48,23,197,2,28,248,22,139,16,23,195, +2,12,251,22,186,11,23,197,1,2,53,2,46,23,198,1,86,94,28,28,248, +22,180,15,23,195,2,10,28,248,22,155,7,23,195,2,28,248,22,139,16,23, +195,2,10,248,22,140,16,23,195,2,11,12,250,22,184,11,23,196,2,2,48, +23,197,2,28,248,22,139,16,23,195,2,12,251,22,186,11,23,197,1,2,53, +2,46,23,198,1,86,95,28,28,248,22,180,15,23,195,2,10,28,248,22,155, +7,23,195,2,28,248,22,139,16,23,195,2,10,248,22,140,16,23,195,2,11, +12,250,22,184,11,23,196,2,2,48,23,197,2,28,248,22,139,16,23,195,2, +86,94,23,194,1,12,251,22,186,11,23,197,2,2,53,2,46,23,198,1,249, +22,3,20,20,94,88,148,8,36,40,50,11,9,223,2,33,101,23,195,1,23, +197,1,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12,250,22, +184,11,23,196,1,2,54,23,197,1,86,94,28,28,248,22,180,15,23,194,2, +10,28,248,22,155,7,23,194,2,28,248,22,139,16,23,194,2,10,248,22,140, +16,23,194,2,11,12,250,22,184,11,2,15,2,48,23,196,2,28,248,22,139, +16,23,194,2,12,251,22,186,11,2,15,2,53,2,46,23,197,1,86,97,28, +28,248,22,180,15,23,196,2,10,28,248,22,155,7,23,196,2,28,248,22,139, +16,23,196,2,10,248,22,140,16,23,196,2,11,12,250,22,184,11,2,15,2, +48,23,198,2,28,248,22,139,16,23,196,2,12,251,22,186,11,2,15,2,53, +2,46,23,199,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222,33,104, +23,198,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12,250, +22,184,11,2,15,2,54,23,197,2,252,80,143,44,52,23,199,1,23,200,1, +23,201,1,11,11,86,94,28,28,248,22,180,15,23,194,2,10,28,248,22,155, +7,23,194,2,28,248,22,139,16,23,194,2,10,248,22,140,16,23,194,2,11, +12,250,22,184,11,2,17,2,48,23,196,2,28,248,22,139,16,23,194,2,12, +251,22,186,11,2,17,2,53,2,46,23,197,1,86,99,28,28,248,22,180,15, +23,197,2,10,28,248,22,155,7,23,197,2,28,248,22,139,16,23,197,2,10, +248,22,140,16,23,197,2,11,12,250,22,184,11,2,17,2,48,23,199,2,28, +248,22,139,16,23,197,2,12,251,22,186,11,2,17,2,53,2,46,23,200,2, +28,28,248,22,180,15,23,198,2,10,28,248,22,155,7,23,198,2,28,248,22, +139,16,23,198,2,10,248,22,140,16,23,198,2,11,12,250,22,184,11,2,17, +2,48,23,200,2,28,248,22,139,16,23,198,2,12,251,22,186,11,2,17,2, +53,2,46,23,201,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222,33, +106,23,200,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12, +250,22,184,11,2,17,2,54,23,197,2,252,80,143,44,52,23,199,1,23,202, +1,23,203,1,23,201,1,23,200,1,27,248,22,157,16,2,55,28,248,22,141, +16,23,194,2,248,22,144,16,23,194,1,28,248,22,140,16,23,194,2,90,144, +42,11,89,146,42,39,11,248,22,137,16,249,22,142,16,250,80,144,49,43,42, +248,22,157,16,2,56,11,11,248,22,157,16,2,57,86,95,23,195,1,23,194, +1,248,22,144,16,249,22,142,16,23,199,1,23,196,1,27,250,80,144,44,43, +42,248,22,157,16,2,56,23,197,1,10,28,23,193,2,248,22,144,16,23,194, +1,11,249,80,144,41,55,40,39,80,144,41,8,40,42,27,248,22,157,16,2, +58,28,248,22,141,16,23,194,2,248,22,144,16,23,194,1,28,248,22,140,16, +23,194,2,90,144,42,11,89,146,42,39,11,248,22,137,16,249,22,142,16,250, +80,144,49,43,42,248,22,157,16,2,56,11,11,248,22,157,16,2,57,86,95, +23,195,1,23,194,1,248,22,144,16,249,22,142,16,23,199,1,23,196,1,27, +250,80,144,44,43,42,248,22,157,16,2,56,23,197,1,10,28,23,193,2,248, +22,144,16,23,194,1,11,249,80,144,41,55,40,40,80,144,41,8,41,42,27, +20,13,144,80,144,40,46,40,26,35,80,144,8,36,47,40,249,22,31,11,80, +144,8,38,46,40,22,147,15,10,22,148,15,10,22,149,15,10,22,150,15,11, +22,151,15,11,22,155,15,10,22,154,15,11,22,156,15,10,22,153,15,10,22, +157,15,10,22,152,15,11,22,158,15,10,22,159,15,10,22,160,15,10,22,161, +15,11,22,162,15,10,22,145,15,11,247,22,150,6,28,248,22,151,2,193,192, +11,27,28,23,195,2,249,22,134,16,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,128, +16,23,195,2,249,22,142,6,23,196,1,80,144,43,8,42,42,11,11,28,192, +192,21,17,1,0,250,22,160,2,23,196,1,2,59,247,22,173,8,250,22,160, +2,195,2,59,247,22,173,8,28,248,22,155,7,23,195,2,27,248,22,188,15, +23,196,1,28,248,22,141,16,23,194,2,192,249,22,142,16,23,195,1,27,247, +80,144,43,54,42,28,23,193,2,192,86,94,23,193,1,247,22,158,16,28,248, +22,144,8,23,195,2,27,248,22,189,15,23,196,1,28,248,22,141,16,23,194, +2,192,249,22,142,16,23,195,1,27,247,80,144,43,54,42,28,23,193,2,192, +86,94,23,193,1,247,22,158,16,28,248,22,180,15,23,195,2,28,248,22,141, +16,23,195,2,193,249,22,142,16,23,196,1,27,247,80,144,42,54,42,28,23, +193,2,192,86,94,23,193,1,247,22,158,16,193,27,248,22,157,16,2,55,28, +248,22,141,16,23,194,2,248,22,144,16,23,194,1,28,248,22,140,16,23,194, +2,90,144,42,11,89,146,42,39,11,248,22,137,16,249,22,142,16,250,80,144, +49,43,42,248,22,157,16,2,56,11,11,248,22,157,16,2,57,86,95,23,195, +1,23,194,1,248,22,144,16,249,22,142,16,23,199,1,23,196,1,27,250,80, +144,44,43,42,248,22,157,16,2,56,23,197,1,10,28,23,193,2,248,22,144, +16,23,194,1,11,28,248,22,141,16,23,195,2,193,249,22,142,16,23,196,1, +27,249,80,144,44,55,40,39,80,144,44,8,43,42,28,23,193,2,192,86,94, +23,193,1,247,22,158,16,28,248,22,141,16,23,195,2,248,22,144,16,23,195, +1,28,248,22,140,16,23,195,2,90,144,42,11,89,146,42,39,11,248,22,137, +16,249,22,142,16,250,80,144,48,43,42,248,22,157,16,2,56,11,11,248,22, +157,16,2,57,86,95,23,195,1,23,194,1,248,22,144,16,249,22,142,16,23, +200,1,23,196,1,27,250,80,144,43,43,42,248,22,157,16,2,56,23,198,1, +10,28,23,193,2,248,22,144,16,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,171,20,23,199,2,28,248,22, +155,7,23,194,2,27,248,22,188,15,23,195,1,28,248,22,141,16,23,194,2, +192,249,22,142,16,23,195,1,27,247,80,144,46,54,42,28,23,193,2,192,86, +94,23,193,1,247,22,158,16,28,248,22,144,8,23,194,2,27,248,22,189,15, +23,195,1,28,248,22,141,16,23,194,2,192,249,22,142,16,23,195,1,27,247, +80,144,46,54,42,28,23,193,2,192,86,94,23,193,1,247,22,158,16,28,248, +22,180,15,23,194,2,28,248,22,141,16,23,194,2,192,249,22,142,16,23,195, +1,27,247,80,144,45,54,42,28,23,193,2,192,86,94,23,193,1,247,22,158, +16,192,27,248,22,172,20,23,199,1,28,248,22,90,23,194,2,9,28,248,22, +83,23,194,2,249,22,82,248,80,144,45,60,42,248,22,171,20,23,197,2,27, +248,22,172,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23,194, +2,249,22,82,248,80,144,48,60,42,248,22,171,20,23,197,2,249,80,144,49, +8,44,42,23,204,1,248,22,172,20,23,198,1,249,22,96,23,202,2,249,80, +144,49,8,44,42,23,204,1,248,22,172,20,23,198,1,249,22,96,23,199,2, +27,248,22,172,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23, +194,2,249,22,82,248,80,144,48,60,42,248,22,171,20,23,197,2,249,80,144, +49,8,44,42,23,204,1,248,22,172,20,23,198,1,249,22,96,23,202,2,249, +80,144,49,8,44,42,23,204,1,248,22,172,20,23,198,1,249,22,96,23,196, +2,27,248,22,172,20,23,199,1,28,248,22,90,23,194,2,9,28,248,22,83, +23,194,2,249,22,82,248,80,144,45,60,42,248,22,171,20,23,197,2,27,248, +22,172,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23,194,2, +249,22,82,248,80,144,48,60,42,248,22,171,20,23,197,2,249,80,144,49,8, +44,42,23,204,1,248,22,172,20,23,198,1,249,22,96,23,202,2,249,80,144, +49,8,44,42,23,204,1,248,22,172,20,23,198,1,249,22,96,23,199,2,27, +248,22,172,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23,194, +2,249,22,82,248,80,144,48,60,42,248,22,171,20,23,197,2,249,80,144,49, +8,44,42,23,204,1,248,22,172,20,23,198,1,249,22,96,23,202,2,249,80, +144,49,8,44,42,23,204,1,248,22,172,20,23,198,1,27,250,22,160,2,23, +198,1,23,199,1,11,28,192,249,80,144,42,8,44,42,198,194,196,27,248,22, +157,16,2,58,28,248,22,141,16,23,194,2,248,22,144,16,23,194,1,28,248, +22,140,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,137,16,249,22, +142,16,250,80,144,49,43,42,248,22,157,16,2,56,11,11,248,22,157,16,2, +57,86,95,23,195,1,23,194,1,248,22,144,16,249,22,142,16,23,199,1,23, +196,1,27,250,80,144,44,43,42,248,22,157,16,2,56,23,197,1,10,28,23, +193,2,248,22,144,16,23,194,1,11,27,248,80,144,41,58,42,249,80,144,43, +55,40,40,80,144,43,8,45,42,27,27,250,22,160,2,23,198,2,72,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,134,16,27,250,22,160,2,23,202,2,71,115,104,97,114,101,45,100, +105,114,11,28,192,192,249,22,134,16,64,117,112,6,5,5,115,104,97,114,101, +2,60,28,248,22,155,7,23,194,2,27,248,22,188,15,23,195,1,28,248,22, +141,16,23,194,2,192,249,22,142,16,23,195,1,27,247,80,144,47,54,42,28, +23,193,2,192,86,94,23,193,1,247,22,158,16,28,248,22,144,8,23,194,2, +27,248,22,189,15,23,195,1,28,248,22,141,16,23,194,2,192,249,22,142,16, +23,195,1,27,247,80,144,47,54,42,28,23,193,2,192,86,94,23,193,1,247, +22,158,16,28,248,22,180,15,23,194,2,28,248,22,141,16,23,194,2,192,249, +22,142,16,23,195,1,27,247,80,144,46,54,42,28,23,193,2,192,86,94,23, +193,1,247,22,158,16,192,250,22,96,248,22,92,11,28,247,22,165,16,28,247, +22,166,16,248,22,92,250,22,134,16,248,22,157,16,2,61,250,22,160,2,23, +204,2,2,59,247,22,173,8,2,60,9,9,28,247,22,166,16,250,80,144,47, +8,23,42,23,200,1,1,18,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,176,13,23,194,1,249,22, +14,80,144,41,8,26,41,28,248,22,132,13,23,197,2,86,94,23,196,1,32, +0,88,148,8,36,39,44,11,9,222,11,20,20,94,88,148,8,36,39,46,11, +9,223,3,33,124,23,196,1,32,126,88,148,39,40,59,11,2,50,222,33,127, +90,144,42,11,89,146,42,39,11,248,22,137,16,23,197,1,86,95,23,195,1, +23,194,1,28,248,22,180,15,23,194,2,28,248,22,129,16,23,194,2,249,22, +147,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11, +89,146,42,39,11,248,22,137,16,23,197,1,86,95,23,195,1,23,194,1,28, +248,22,180,15,23,194,2,28,248,22,129,16,23,194,2,249,22,147,6,23,195, +1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39, +11,248,22,137,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,180,15, +23,194,2,28,248,22,129,16,23,194,2,249,22,147,6,23,195,1,32,0,88, +148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,137, +16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,180,15,23,194,2,28, +248,22,129,16,23,194,2,249,22,147,6,23,195,1,32,0,88,148,8,36,39, +44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,32,128,2,88,148,8, +36,40,58,11,2,50,222,33,129,2,27,249,22,165,6,8,128,128,23,196,2, +28,248,22,150,7,23,194,2,9,249,22,82,23,195,1,27,249,22,165,6,8, +128,128,23,199,2,28,248,22,150,7,23,194,2,9,249,22,82,23,195,1,27, +249,22,165,6,8,128,128,23,202,2,28,248,22,150,7,23,194,2,9,249,22, +82,23,195,1,27,249,22,165,6,8,128,128,23,205,2,28,248,22,150,7,23, +194,2,9,249,22,82,23,195,1,248,2,128,2,23,206,1,27,249,22,165,6, +8,128,128,23,196,2,28,248,22,144,8,23,194,2,28,249,22,134,4,248,22, +149,8,23,196,2,8,128,128,249,22,1,22,156,8,249,22,82,23,197,1,27, +249,22,165,6,8,128,128,23,201,2,28,248,22,150,7,23,194,2,9,249,22, +82,23,195,1,27,249,22,165,6,8,128,128,23,204,2,28,248,22,150,7,23, +194,2,9,249,22,82,23,195,1,27,249,22,165,6,8,128,128,23,207,2,28, +248,22,150,7,23,194,2,9,249,22,82,23,195,1,27,249,22,165,6,8,128, +128,23,210,2,28,248,22,150,7,23,194,2,9,249,22,82,23,195,1,248,2, +128,2,23,211,1,192,192,248,22,135,6,23,194,1,20,13,144,80,144,40,8, +28,40,80,144,40,8,46,42,27,28,249,22,191,8,248,22,182,8,2,62,41, +90,144,42,11,89,146,42,39,11,248,22,137,16,23,198,2,86,95,23,195,1, +23,194,1,28,248,22,180,15,23,194,2,28,248,22,129,16,23,194,2,249,22, +147,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11, +89,146,42,39,11,248,22,137,16,23,197,1,86,95,23,195,1,23,194,1,28, +248,22,180,15,23,194,2,28,248,22,129,16,23,194,2,249,22,147,6,23,195, +1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39, +11,248,22,137,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,180,15, +23,194,2,28,248,22,129,16,23,194,2,249,22,147,6,23,195,1,32,0,88, +148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,137, +16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,180,15,23,194,2,28, +248,22,129,16,23,194,2,249,22,147,6,23,195,1,32,0,88,148,8,36,39, +44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,11,28,248,22,128,16, +23,195,2,27,28,249,22,191,8,248,22,182,8,2,62,41,249,22,147,6,23, +197,2,32,0,88,148,8,36,39,44,11,9,222,11,11,86,94,28,23,194,2, +248,22,149,6,23,195,1,86,94,23,194,1,12,249,22,82,27,248,22,190,5, +23,199,1,250,22,44,22,35,88,148,39,39,8,24,11,9,223,3,33,130,2, +20,20,94,88,148,8,36,39,46,11,9,223,3,33,131,2,23,196,1,194,249, +22,82,11,194,28,28,23,195,2,28,248,22,84,23,196,2,248,22,169,9,249, +22,178,14,39,248,22,172,20,23,199,2,11,11,194,86,94,23,195,1,249,22, +12,20,20,94,88,148,8,32,39,61,16,4,39,8,128,80,8,240,0,64,0, +0,39,9,224,2,3,33,132,2,23,196,1,80,144,41,8,26,41,27,248,22, +169,9,194,28,192,192,248,22,169,9,248,22,83,195,86,95,28,248,22,153,12, +23,198,2,27,247,22,145,12,28,249,22,135,12,23,195,2,2,63,251,22,141, +12,23,197,1,2,63,250,22,139,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,149,12,23, +206,2,247,22,27,12,12,28,23,193,2,250,22,158,2,80,144,45,8,25,41, +23,198,1,249,22,82,23,198,1,21,17,0,0,86,95,23,195,1,23,193,1, +12,28,248,22,153,12,23,198,2,86,94,23,197,1,248,23,195,1,247,22,140, +2,196,88,148,39,40,58,8,240,0,0,0,2,9,226,0,2,1,3,33,135, +2,20,20,94,248,22,150,6,23,194,2,28,248,22,150,7,248,22,150,6,23, +195,1,12,248,22,180,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, +135,6,23,194,1,28,248,22,91,193,28,28,249,22,130,4,41,248,22,95,195, +10,249,22,130,4,42,248,22,95,195,28,28,248,22,155,7,248,22,83,194,10, +28,249,22,171,9,2,64,248,22,171,20,195,10,249,22,171,9,2,65,248,22, +171,20,195,28,27,248,22,104,194,28,248,22,180,15,193,10,28,248,22,155,7, +193,28,248,22,139,16,193,10,248,22,140,16,193,11,27,248,22,90,248,22,106, +195,28,192,192,248,22,186,16,248,22,113,195,11,11,11,11,28,248,22,129,16, +249,22,134,16,23,196,2,23,198,2,27,248,22,70,248,22,184,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,177,16, +248,22,113,23,198,2,247,22,173,8,27,248,22,144,16,249,22,142,16,248,22, +104,23,200,2,23,198,1,28,249,22,171,9,248,22,171,20,23,199,2,2,65, +86,94,23,196,1,249,22,3,20,20,94,88,148,8,36,40,56,11,9,224,3, +2,33,140,2,23,196,1,248,22,147,16,23,196,1,28,249,22,171,9,248,22, +171,20,23,199,2,2,64,86,94,23,196,1,86,94,28,250,22,160,2,23,197, +2,11,11,12,250,22,158,2,23,197,2,11,9,249,22,166,2,23,196,2,20, +20,95,88,148,8,36,41,53,11,9,224,3,2,33,141,2,23,195,1,23,196, +1,27,248,22,70,248,22,171,20,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,169,9,248,22,83,23,196,2,10,9,27,249,22,190,5,23, +198,2,68,98,105,110,97,114,121,250,22,44,22,35,88,148,8,36,39,47,11, +9,223,3,33,137,2,20,20,94,88,148,8,36,39,46,11,9,223,3,33,138, +2,23,196,1,86,94,28,28,248,22,91,23,194,2,249,22,4,32,0,88,148, +8,36,40,48,11,9,222,33,139,2,23,195,2,11,12,248,22,180,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,42,11,89,146,42,39,11,248,22,137,16,23,201,2,192, +86,96,249,22,3,20,20,94,88,148,8,36,40,57,11,9,224,2,3,33,142, +2,23,195,1,23,197,1,249,22,166,2,195,88,148,8,36,41,51,11,9,223, +3,33,143,2,250,22,158,2,80,144,47,8,25,41,23,200,1,249,22,82,23, +201,1,198,193,20,13,144,80,144,40,8,28,40,250,80,144,43,8,47,42,23, +198,2,23,196,2,11,27,250,22,160,2,80,144,44,8,25,41,23,197,2,21, +143,11,17,0,0,27,248,22,83,23,195,2,27,249,80,144,45,8,27,42,23, +198,2,23,196,2,28,249,22,173,9,23,195,2,23,196,1,248,22,172,20,195, +86,94,23,195,1,20,13,144,80,144,43,8,28,40,250,80,144,46,8,47,42, +23,201,1,23,199,2,23,196,2,27,20,20,95,88,148,8,36,39,55,8,240, +0,0,0,2,9,225,5,4,1,33,144,2,23,194,1,23,197,1,28,249,22, +48,23,195,2,39,20,13,144,80,144,44,46,40,26,35,80,144,8,40,47,40, +249,22,31,11,80,144,8,42,46,40,22,147,15,10,22,148,15,10,22,149,15, +10,22,150,15,11,22,151,15,11,22,155,15,10,22,154,15,11,22,156,15,10, +22,153,15,10,22,157,15,10,22,152,15,11,22,158,15,10,22,159,15,10,22, +160,15,10,22,161,15,11,22,162,15,10,22,145,15,11,247,23,193,1,250,22, +184,11,2,9,2,52,23,196,1,248,22,8,20,20,94,88,148,39,40,8,49, +16,4,8,128,6,8,128,104,8,240,0,128,0,0,39,9,224,1,2,33,145, +2,23,195,1,0,7,35,114,120,34,47,43,34,28,248,22,155,7,23,195,2, +27,249,22,175,16,2,147,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,158,7,23,199,2,249,22,7,250,22, +177,7,23,200,1,39,248,22,103,23,199,1,23,198,1,249,22,7,250,22,177, +7,23,200,2,39,248,22,103,23,199,2,249,22,82,249,22,177,7,23,201,1, +248,22,105,23,200,1,23,200,1,86,94,23,193,1,249,22,7,23,197,1,23, +198,1,90,144,42,11,89,146,42,39,11,248,22,137,16,23,198,1,86,94,23, +195,1,28,249,22,171,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,155,7,23, +195,2,27,249,22,175,16,2,147,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,158,7,23,199,2,249,22,7, +250,22,177,7,23,200,1,39,248,22,103,23,199,1,23,196,1,249,22,7,250, +22,177,7,23,200,2,39,248,22,103,23,199,2,249,22,82,249,22,177,7,23, +201,1,248,22,105,23,200,1,23,198,1,86,94,23,193,1,249,22,7,23,197, +1,23,196,1,90,144,42,11,89,146,42,39,11,248,22,137,16,23,198,1,86, +94,23,195,1,28,249,22,171,9,23,195,2,2,49,86,94,23,193,1,249,22, +7,23,196,1,23,198,1,249,80,144,48,8,31,42,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, +171,20,23,197,2,250,22,96,249,22,2,22,131,2,250,22,160,2,248,22,171, +20,23,204,2,23,202,2,9,250,22,160,2,248,22,171,20,23,202,2,11,9, +27,248,22,172,20,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,171,20,23,195,2,250,22,96,249,22,2,22, +131,2,250,22,160,2,248,22,171,20,23,202,2,23,206,2,9,250,22,160,2, +248,22,171,20,23,200,2,11,9,249,80,144,48,8,48,42,23,203,1,248,22, +172,20,23,199,1,27,248,80,144,45,8,30,42,248,22,171,20,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,49,8,48,42,23,204,1,248,22,172,20,23,200,1,249,22,96, +247,22,161,16,249,80,144,47,8,48,42,23,202,1,248,22,172,20,23,198,1, +27,248,80,144,41,8,30,42,248,22,171,20,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,172, +20,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,171,20,23,195,2,250,22,96,249,22,2,22,131,2,250,22, +160,2,248,22,171,20,23,202,2,23,207,2,9,250,22,160,2,248,22,171,20, +23,200,2,11,9,249,80,144,49,8,48,42,23,204,1,248,22,172,20,23,199, +1,27,248,80,144,46,8,30,42,248,22,171,20,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, +50,8,48,42,23,205,1,248,22,172,20,23,200,1,249,22,96,247,22,161,16, +249,80,144,48,8,48,42,23,203,1,248,22,172,20,23,198,1,249,22,96,247, +22,161,16,27,248,22,172,20,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,171,20,23,195,2,250,22,96,249, +22,2,22,131,2,250,22,160,2,248,22,171,20,23,202,2,23,205,2,9,250, +22,160,2,248,22,171,20,23,200,2,11,9,249,80,144,47,8,48,42,23,202, +1,248,22,172,20,23,199,1,27,248,80,144,44,8,30,42,248,22,171,20,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,48,8,48,42,23,203,1,248,22,172,20,23,200,1, +249,22,96,247,22,161,16,249,80,144,46,8,48,42,23,201,1,248,22,172,20, +23,198,1,32,150,2,88,148,8,36,40,50,11,2,50,222,33,151,2,28,248, +22,90,248,22,84,23,195,2,248,22,92,27,248,22,171,20,195,28,248,22,180, +15,193,248,22,184,15,193,192,250,22,93,27,248,22,171,20,23,198,2,28,248, +22,180,15,193,248,22,184,15,193,192,2,67,248,2,150,2,248,22,172,20,23, +198,1,250,22,139,8,6,7,7,10,32,126,97,32,126,97,6,1,1,32,23, +196,1,249,22,139,8,6,6,6,10,32,32,32,126,97,248,22,134,2,23,196, +1,32,154,2,88,148,39,41,51,11,68,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,171,20,23,197,2,249,2,154,2,23,197,1,248,22,172,20,23,199, +1,249,2,154,2,23,195,1,248,22,172,20,23,197,1,28,248,22,90,23,201, +2,86,95,23,200,1,23,199,1,28,23,201,2,28,197,249,22,134,16,202,199, +200,86,95,23,201,1,23,198,1,27,28,248,22,90,23,198,2,2,66,249,22, +1,22,178,7,248,2,150,2,23,200,2,248,23,199,1,251,22,139,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,203,1,28,248,22,180,15,23, +202,2,248,22,184,15,23,202,1,23,201,1,250,22,178,7,28,248,22,180,15, +23,205,2,248,22,184,15,23,205,1,23,204,1,2,67,23,201,2,249,22,1, +22,178,7,249,22,2,32,0,88,148,8,36,40,48,11,9,222,33,152,2,27, +248,22,95,23,206,2,27,248,22,95,247,22,161,16,28,249,22,131,4,249,22, +186,3,23,198,2,23,197,2,44,23,206,2,249,22,96,247,22,161,16,248,22, +92,249,22,139,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,202,2,250,22,139,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,178,7,249,22,2,32, +0,88,148,8,36,40,48,11,9,222,33,153,2,249,2,154,2,22,133,2,23, +209,1,86,95,23,200,1,23,198,1,2,66,27,248,22,83,23,202,2,27,28, +248,22,180,15,23,195,2,249,22,134,16,23,196,1,23,199,2,248,22,134,2, +23,195,1,28,28,248,22,180,15,248,22,171,20,23,204,2,248,22,129,16,23, +194,2,10,27,250,22,1,22,134,16,23,197,1,23,202,2,28,28,248,22,90, +23,200,2,10,248,22,129,16,23,194,2,28,23,201,2,28,28,250,80,144,45, +8,32,42,195,203,204,10,27,28,248,22,180,15,202,248,22,184,15,202,201,19, +248,22,158,7,23,195,2,27,28,249,22,134,4,23,196,4,43,28,249,22,161, +7,6,4,4,46,114,107,116,249,22,177,7,23,199,2,249,22,186,3,23,200, +4,43,249,22,178,7,250,22,177,7,23,200,1,39,249,22,186,3,23,201,4, +43,6,3,3,46,115,115,86,94,23,195,1,11,86,94,23,195,1,11,28,23, +193,2,250,80,144,48,8,32,42,198,23,196,1,23,15,11,2,28,200,249,22, +134,16,194,202,192,26,8,80,144,50,8,49,42,204,205,206,23,15,23,16,23, +17,248,22,172,20,23,19,28,23,19,23,19,200,192,26,8,80,144,50,8,49, +42,204,205,206,23,15,23,16,23,17,248,22,172,20,23,19,23,19,26,8,80, +144,49,8,49,42,203,204,205,206,23,15,23,16,248,22,172,20,23,18,23,18, +90,144,41,11,89,146,41,39,11,249,80,144,43,8,31,42,23,199,1,23,200, +1,27,248,22,70,28,248,22,180,15,195,248,22,184,15,195,194,27,27,247,22, +162,16,28,248,22,90,23,194,2,9,28,248,22,83,23,194,2,28,248,22,151, +2,248,22,171,20,23,195,2,250,22,96,249,22,2,22,131,2,250,22,160,2, +248,22,171,20,23,202,2,23,203,2,9,250,22,160,2,248,22,171,20,23,200, +2,11,9,249,80,144,49,8,48,42,23,200,1,248,22,172,20,23,199,1,27, +248,80,144,46,8,30,42,248,22,171,20,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,50,8, +48,42,23,201,1,248,22,172,20,23,200,1,249,22,96,247,22,161,16,249,80, +144,48,8,48,42,23,199,1,248,22,172,20,23,198,1,26,8,80,144,51,8, +49,42,200,202,203,205,23,16,23,17,200,11,32,158,2,88,148,8,36,42,59, +11,2,50,222,33,159,2,28,248,22,135,4,23,196,2,86,94,23,195,1,19, +248,22,149,8,23,195,2,19,248,22,149,8,23,196,2,249,22,190,15,27,251, +22,156,8,250,22,155,8,23,205,2,39,23,204,4,2,51,249,22,155,8,23, +204,1,23,202,4,2,68,28,248,22,135,4,248,22,149,8,23,195,2,86,94, +23,193,1,251,22,186,11,2,37,2,69,2,70,202,192,28,248,22,181,15,198, +248,22,182,15,198,247,22,183,15,2,2,27,248,22,184,3,23,197,1,28,249, +22,171,9,8,46,249,22,150,8,23,198,2,23,197,2,27,248,22,183,3,23, +195,2,249,22,190,15,27,251,22,156,8,250,22,155,8,23,205,2,39,23,204, +1,2,71,249,22,155,8,23,204,1,23,202,1,2,68,28,248,22,135,4,248, +22,149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70, +202,192,28,248,22,181,15,198,248,22,182,15,198,247,22,183,15,250,2,158,2, +196,197,195,248,22,128,16,27,250,22,134,16,23,200,1,23,202,1,23,199,1, +28,249,22,171,9,23,197,2,66,115,97,109,101,192,28,248,22,139,16,23,196, +2,249,22,134,16,194,196,249,80,144,46,42,42,23,195,1,23,197,1,249,22, +5,20,20,96,88,148,39,40,54,47,9,226,5,4,2,6,33,160,2,23,199, +1,23,195,1,23,197,1,23,196,1,27,248,22,128,16,249,22,134,16,23,198, +2,23,199,2,28,23,193,2,192,86,94,23,193,1,28,23,197,1,27,90,144, +41,11,89,146,41,39,11,250,80,144,46,8,34,42,23,202,2,2,68,2,37, +27,248,22,186,15,23,196,1,27,250,2,158,2,23,197,2,23,204,1,248,22, +149,8,23,198,1,28,248,22,181,15,195,249,22,134,16,196,194,192,27,247,22, +163,16,249,22,5,20,20,96,88,148,39,40,51,47,9,226,5,6,2,3,33, +161,2,23,196,1,23,195,1,23,199,1,247,22,164,16,11,86,95,28,28,248, +22,181,15,23,194,2,10,28,248,22,180,15,23,194,2,10,28,248,22,155,7, +23,194,2,28,248,22,139,16,23,194,2,10,248,22,140,16,23,194,2,11,12, +252,22,184,11,23,200,2,2,42,39,23,198,2,23,199,2,28,28,248,22,155, +7,23,195,2,10,248,22,144,8,23,195,2,86,94,23,194,1,12,252,22,184, +11,23,200,2,2,72,40,23,198,2,23,199,1,90,144,42,11,89,146,42,39, +11,248,22,137,16,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,187,11,23,201,1,2,73,23,199,1,249,22, +7,23,195,1,23,196,1,32,164,2,88,148,8,36,46,61,11,2,74,222,33, +165,2,249,22,190,15,27,251,22,156,8,250,22,155,8,23,203,2,39,23,207, +1,23,205,1,249,23,203,1,23,202,1,23,208,1,28,248,22,155,7,23,204, +2,249,22,170,8,23,205,1,8,63,23,203,1,28,248,22,135,4,248,22,149, +8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70,201,192, +28,248,22,181,15,197,248,22,182,15,197,247,22,183,15,32,166,2,88,148,8, +36,45,8,24,11,2,50,222,33,167,2,28,248,22,135,4,23,199,2,86,95, +23,198,1,23,194,1,19,248,22,149,8,23,195,2,19,248,22,149,8,23,196, +2,249,22,190,15,27,251,22,156,8,250,22,155,8,23,205,2,39,23,204,4, +2,51,249,23,206,1,23,204,1,23,202,4,28,248,22,155,7,23,207,2,249, +22,170,8,23,208,1,8,63,23,206,1,28,248,22,135,4,248,22,149,8,23, +195,2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70,204,192,28,248, +22,181,15,200,248,22,182,15,200,247,22,183,15,2,2,27,248,22,184,3,23, +200,1,28,249,22,171,9,8,46,249,22,150,8,23,198,2,23,197,2,27,248, +22,183,3,23,195,2,249,22,190,15,27,251,22,156,8,250,22,155,8,23,205, +2,39,23,204,1,23,203,1,249,23,206,1,23,204,1,23,202,1,28,248,22, +155,7,23,207,2,249,22,170,8,23,208,1,8,63,23,206,1,28,248,22,135, +4,248,22,149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2,69, +2,70,204,192,28,248,22,181,15,200,248,22,182,15,200,247,22,183,15,28,248, +22,135,4,23,194,2,86,95,23,195,1,23,193,1,19,248,22,149,8,23,196, +2,19,248,22,149,8,23,197,2,249,22,190,15,27,251,22,156,8,250,22,155, +8,23,206,2,39,23,204,4,2,51,249,23,207,1,23,205,1,23,202,4,28, +248,22,155,7,23,208,2,249,22,170,8,23,209,1,8,63,23,207,1,28,248, +22,135,4,248,22,149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37, +2,69,2,70,205,192,28,248,22,181,15,201,248,22,182,15,201,247,22,183,15, +2,2,27,248,22,184,3,23,195,1,28,249,22,171,9,8,46,249,22,150,8, +23,199,2,23,197,2,27,248,22,183,3,23,195,2,249,22,190,15,27,251,22, +156,8,250,22,155,8,23,206,2,39,23,204,1,23,204,1,249,23,207,1,23, +205,1,23,202,1,28,248,22,155,7,23,208,2,249,22,170,8,23,209,1,8, +63,23,207,1,28,248,22,135,4,248,22,149,8,23,195,2,86,94,23,193,1, +251,22,186,11,2,37,2,69,2,70,205,192,28,248,22,181,15,201,248,22,182, +15,201,247,22,183,15,28,248,22,135,4,193,254,2,164,2,201,203,204,205,248, +22,149,8,202,2,51,248,22,149,8,202,27,248,22,184,3,194,28,249,22,171, +9,8,46,249,22,150,8,199,196,254,2,164,2,202,204,205,206,199,203,248,22, +183,3,200,253,2,166,2,201,202,203,204,205,198,90,144,41,11,89,146,41,39, +11,86,95,28,28,248,22,181,15,23,199,2,10,28,248,22,180,15,23,199,2, +10,28,248,22,155,7,23,199,2,28,248,22,139,16,23,199,2,10,248,22,140, +16,23,199,2,11,12,252,22,184,11,23,200,2,2,42,39,23,203,2,23,204, +2,28,28,248,22,155,7,23,200,2,10,248,22,144,8,23,200,2,12,252,22, +184,11,23,200,2,2,72,40,23,203,2,23,204,2,90,144,42,11,89,146,42, +39,11,248,22,137,16,23,202,2,86,94,23,195,1,86,94,28,192,12,250,22, +187,11,23,201,1,2,73,23,204,2,249,22,7,194,195,27,248,22,186,15,23, +196,1,27,19,248,22,149,8,23,196,2,28,248,22,135,4,23,194,4,86,94, +23,199,1,19,248,22,149,8,23,197,2,19,248,22,149,8,23,198,2,249,22, +190,15,27,251,22,156,8,250,22,155,8,23,207,2,39,23,204,4,2,51,249, +23,211,1,23,206,1,23,202,4,28,248,22,155,7,23,212,2,249,22,170,8, +23,213,1,8,63,23,211,1,28,248,22,135,4,248,22,149,8,23,195,2,86, +94,23,193,1,251,22,186,11,2,37,2,69,2,70,23,17,192,28,248,22,181, +15,205,248,22,182,15,205,247,22,183,15,2,2,27,248,22,184,3,23,195,4, +28,249,22,171,9,8,46,249,22,150,8,23,200,2,23,197,2,27,248,22,183, +3,23,195,2,249,22,190,15,27,251,22,156,8,250,22,155,8,23,207,2,39, +23,204,1,23,208,1,249,23,211,1,23,206,1,23,202,1,28,248,22,155,7, +23,212,2,249,22,170,8,23,213,1,8,63,23,211,1,28,248,22,135,4,248, +22,149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70, +23,17,192,28,248,22,181,15,205,248,22,182,15,205,247,22,183,15,28,248,22, +135,4,23,194,2,86,95,23,200,1,23,193,1,254,2,164,2,23,203,2,23, +208,1,23,209,1,23,210,1,248,22,149,8,23,204,2,2,51,248,22,149,8, +23,204,1,27,248,22,184,3,23,195,1,28,249,22,171,9,8,46,249,22,150, +8,23,201,2,23,197,2,254,2,164,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,166,2,23,203, +1,23,207,1,23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22,181, +15,195,249,22,134,16,196,194,192,32,169,2,88,148,8,36,43,61,11,2,50, +222,33,170,2,28,248,22,135,4,23,197,2,86,94,23,196,1,19,248,22,149, +8,23,195,2,35,248,22,149,8,23,196,2,249,22,190,15,27,251,22,156,8, +250,22,155,8,23,205,1,39,23,204,4,2,51,2,51,28,248,22,155,7,23, +205,2,249,22,170,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248,22, +149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70,202, +192,28,248,22,181,15,198,248,22,182,15,198,247,22,183,15,2,27,248,22,184, +3,23,198,1,28,249,22,171,9,8,46,249,22,150,8,23,198,2,23,197,2, +35,248,22,183,3,23,195,2,249,22,190,15,27,251,22,156,8,250,22,155,8, +23,205,1,39,23,204,1,2,51,2,51,28,248,22,155,7,23,205,2,249,22, +170,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248,22,149,8,23,195, +2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70,202,192,28,248,22, +181,15,198,248,22,182,15,198,247,22,183,15,28,248,22,135,4,23,194,2,86, +94,23,193,1,19,248,22,149,8,23,196,2,35,248,22,149,8,23,197,2,249, +22,190,15,27,251,22,156,8,250,22,155,8,23,206,1,39,23,204,4,2,51, +2,51,28,248,22,155,7,23,206,2,249,22,170,8,23,207,1,8,63,23,205, +1,28,248,22,135,4,248,22,149,8,23,195,2,86,94,23,193,1,251,22,186, +11,2,37,2,69,2,70,203,192,28,248,22,181,15,199,248,22,182,15,199,247, +22,183,15,2,27,248,22,184,3,23,195,1,28,249,22,171,9,8,46,249,22, +150,8,23,199,2,23,197,2,35,248,22,183,3,23,195,2,249,22,190,15,27, +251,22,156,8,250,22,155,8,23,206,1,39,23,204,1,2,51,2,51,28,248, +22,155,7,23,206,2,249,22,170,8,23,207,1,8,63,23,205,1,28,248,22, +135,4,248,22,149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2, +69,2,70,203,192,28,248,22,181,15,199,248,22,182,15,199,247,22,183,15,251, +2,169,2,198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248, +22,181,15,23,196,2,10,28,248,22,180,15,23,196,2,10,28,248,22,155,7, +23,196,2,28,248,22,139,16,23,196,2,10,248,22,140,16,23,196,2,11,12, +252,22,184,11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,155,7, +23,197,2,10,248,22,144,8,23,197,2,12,252,22,184,11,2,37,2,72,40, +23,200,2,23,201,2,90,144,42,11,89,146,42,39,11,248,22,137,16,23,199, +2,86,94,23,195,1,86,94,28,192,12,250,22,187,11,2,37,2,73,23,201, +2,249,22,7,194,195,27,248,22,186,15,23,196,1,27,251,2,169,2,23,198, +2,23,201,1,23,202,1,248,22,149,8,23,199,1,28,248,22,181,15,195,249, +22,134,16,196,194,192,2,51,252,80,144,44,8,35,42,2,37,2,51,32,0, +88,148,8,36,41,46,11,9,222,33,172,2,198,199,32,174,2,88,148,8,36, +43,60,11,2,50,222,33,177,2,32,175,2,88,148,8,36,45,60,11,2,74, +222,33,176,2,249,22,190,15,27,251,22,156,8,250,22,155,8,23,203,2,39, +23,206,1,23,204,1,249,22,155,8,23,202,1,23,207,1,28,248,22,155,7, +23,203,2,249,22,170,8,23,204,1,8,63,23,202,1,28,248,22,135,4,248, +22,149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70, +200,192,28,248,22,181,15,196,248,22,182,15,196,247,22,183,15,28,248,22,135, +4,23,197,2,86,94,23,196,1,19,248,22,149,8,23,195,2,19,248,22,149, +8,23,196,2,249,22,190,15,27,251,22,156,8,250,22,155,8,23,205,2,39, +23,204,4,2,51,249,22,155,8,23,204,1,23,202,4,28,248,22,155,7,23, +205,2,249,22,170,8,23,206,1,8,63,23,204,1,28,248,22,135,4,248,22, +149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37,2,69,2,70,202, +192,28,248,22,181,15,198,248,22,182,15,198,247,22,183,15,2,2,27,248,22, +184,3,23,198,1,28,249,22,171,9,8,46,249,22,150,8,23,198,2,23,197, +2,27,248,22,183,3,23,195,2,249,22,190,15,27,251,22,156,8,250,22,155, +8,23,205,2,39,23,204,1,2,71,249,22,155,8,23,204,1,23,202,1,28, +248,22,155,7,23,205,2,249,22,170,8,23,206,1,8,63,23,204,1,28,248, +22,135,4,248,22,149,8,23,195,2,86,94,23,193,1,251,22,186,11,2,37, +2,69,2,70,202,192,28,248,22,181,15,198,248,22,182,15,198,247,22,183,15, +28,248,22,135,4,193,253,2,175,2,199,200,201,248,22,149,8,200,2,51,248, +22,149,8,200,27,248,22,184,3,194,28,249,22,171,9,8,46,249,22,150,8, +198,196,253,2,175,2,200,201,202,198,2,71,248,22,183,3,199,251,2,174,2, +198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248,22,181,15, +23,196,2,10,28,248,22,180,15,23,196,2,10,28,248,22,155,7,23,196,2, +28,248,22,139,16,23,196,2,10,248,22,140,16,23,196,2,11,12,252,22,184, +11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,155,7,23,197,2, +10,248,22,144,8,23,197,2,12,252,22,184,11,2,37,2,72,40,23,200,2, +23,201,2,90,144,42,11,89,146,42,39,11,248,22,137,16,23,199,2,86,94, +23,195,1,86,94,28,192,12,250,22,187,11,2,37,2,73,23,201,2,249,22, +7,194,195,27,248,22,186,15,23,196,1,27,251,2,174,2,23,198,2,23,201, +1,23,202,1,248,22,149,8,23,199,1,28,248,22,181,15,195,249,22,134,16, +196,194,192,252,80,144,44,8,35,42,2,37,2,71,22,155,8,198,199,249,247, +22,178,5,23,195,1,11,249,247,22,178,5,194,11,28,248,22,90,23,195,2, +9,27,27,248,22,83,23,197,2,28,248,22,141,16,23,194,2,248,22,144,16, +23,194,1,28,248,22,140,16,23,194,2,90,144,42,11,89,146,42,39,11,248, +22,137,16,249,22,142,16,250,80,144,50,43,42,248,22,157,16,2,56,11,11, +248,22,157,16,2,57,86,95,23,195,1,23,194,1,248,22,144,16,249,22,142, +16,23,199,1,23,196,1,27,250,80,144,45,43,42,248,22,157,16,2,56,23, +197,1,10,28,23,193,2,248,22,144,16,23,194,1,11,28,23,193,2,249,22, +82,248,22,144,16,249,22,142,16,23,198,1,247,22,158,16,27,248,22,172,20, +23,199,1,28,248,22,90,23,194,2,9,27,248,80,144,45,56,42,248,22,83, +23,196,2,28,23,193,2,249,22,82,248,22,144,16,249,22,142,16,23,198,1, +247,22,158,16,248,80,144,47,8,50,42,248,22,172,20,23,198,1,86,94,23, +193,1,248,80,144,45,8,50,42,248,22,172,20,23,196,1,86,94,23,193,1, +27,248,22,172,20,23,197,1,28,248,22,90,23,194,2,9,27,248,80,144,43, +56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,144,16,249,22, +142,16,23,198,1,247,22,158,16,248,80,144,45,8,50,42,248,22,172,20,23, +198,1,86,94,23,193,1,248,80,144,43,8,50,42,248,22,172,20,23,196,1, +28,248,22,90,23,195,2,9,27,27,248,22,83,23,197,2,28,248,22,141,16, +23,194,2,248,22,144,16,23,194,1,28,248,22,140,16,23,194,2,90,144,42, +11,89,146,42,39,11,248,22,137,16,249,22,142,16,250,80,144,50,43,42,248, +22,157,16,2,56,11,11,248,22,157,16,2,57,86,95,23,195,1,23,194,1, +248,22,144,16,249,22,142,16,23,199,1,23,196,1,27,250,80,144,45,43,42, +248,22,157,16,2,56,23,197,1,10,28,23,193,2,248,22,144,16,23,194,1, +11,28,23,193,2,249,22,82,248,22,144,16,249,22,142,16,23,198,1,247,22, +158,16,27,248,22,172,20,23,199,1,28,248,22,90,23,194,2,9,27,248,80, +144,45,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,144,16, +249,22,142,16,23,198,1,247,22,158,16,248,80,144,47,8,51,42,248,22,172, +20,23,198,1,86,94,23,193,1,248,80,144,45,8,51,42,248,22,172,20,23, +196,1,86,94,23,193,1,27,248,22,172,20,23,197,1,28,248,22,90,23,194, +2,9,27,248,80,144,43,56,42,248,22,83,23,196,2,28,23,193,2,249,22, +82,248,22,144,16,249,22,142,16,23,198,1,247,22,158,16,248,80,144,45,8, +51,42,248,22,172,20,23,198,1,86,94,23,193,1,248,80,144,43,8,51,42, +248,22,172,20,23,196,1,27,248,22,157,16,2,58,28,248,22,141,16,23,194, +2,248,22,144,16,23,194,1,28,248,22,140,16,23,194,2,90,144,42,11,89, +146,42,39,11,248,22,137,16,249,22,142,16,250,80,144,49,43,42,248,22,157, +16,2,56,11,11,248,22,157,16,2,57,86,95,23,195,1,23,194,1,248,22, +144,16,249,22,142,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248,22, +157,16,2,56,23,197,1,10,28,23,193,2,248,22,144,16,23,194,1,11,28, +248,22,90,23,195,2,9,27,27,248,22,83,23,197,2,28,248,22,141,16,23, +194,2,248,22,144,16,23,194,1,28,248,22,140,16,23,194,2,90,144,42,11, +89,146,42,39,11,248,22,137,16,249,22,142,16,250,80,144,50,43,42,248,22, +157,16,2,56,11,11,248,22,157,16,2,57,86,95,23,195,1,23,194,1,248, +22,144,16,249,22,142,16,23,199,1,23,196,1,27,250,80,144,45,43,42,248, +22,157,16,2,56,23,197,1,10,28,23,193,2,248,22,144,16,23,194,1,11, +28,23,193,2,249,22,82,248,22,144,16,249,22,142,16,23,198,1,247,22,158, +16,27,248,22,172,20,23,199,1,28,248,22,90,23,194,2,9,27,27,248,22, +83,23,196,2,28,248,22,141,16,23,194,2,248,22,144,16,23,194,1,28,248, +22,140,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,137,16,249,22, +142,16,250,80,144,54,43,42,248,22,157,16,2,56,11,11,248,22,157,16,2, +57,86,95,23,195,1,23,194,1,248,22,144,16,249,22,142,16,23,199,1,23, +196,1,27,250,80,144,49,43,42,248,22,157,16,2,56,23,197,1,10,28,23, +193,2,248,22,144,16,23,194,1,11,28,23,193,2,249,22,82,248,22,144,16, +249,22,142,16,23,198,1,247,22,158,16,27,248,22,172,20,23,198,1,28,248, +22,90,23,194,2,9,27,248,80,144,49,56,42,248,22,83,23,196,2,28,23, +193,2,249,22,82,248,22,144,16,249,22,142,16,23,198,1,247,22,158,16,248, +80,144,51,8,53,42,248,22,172,20,23,198,1,86,94,23,193,1,248,80,144, +49,8,53,42,248,22,172,20,23,196,1,86,94,23,193,1,27,248,22,172,20, +23,196,1,28,248,22,90,23,194,2,9,27,248,80,144,47,56,42,248,22,83, +23,196,2,28,23,193,2,249,22,82,248,22,144,16,249,22,142,16,23,198,1, +247,22,158,16,248,80,144,49,8,53,42,248,22,172,20,23,198,1,86,94,23, +193,1,248,80,144,47,8,53,42,248,22,172,20,23,196,1,86,94,23,193,1, +27,248,22,172,20,23,197,1,28,248,22,90,23,194,2,9,27,27,248,22,83, +23,196,2,28,248,22,141,16,23,194,2,248,22,144,16,23,194,1,28,248,22, +140,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,137,16,249,22,142, +16,250,80,144,52,43,42,248,22,157,16,2,56,11,11,248,22,157,16,2,57, +86,95,23,195,1,23,194,1,248,22,144,16,249,22,142,16,23,199,1,23,196, +1,27,250,80,144,47,43,42,248,22,157,16,2,56,23,197,1,10,28,23,193, +2,248,22,144,16,23,194,1,11,28,23,193,2,249,22,82,248,22,144,16,249, +22,142,16,23,198,1,247,22,158,16,27,248,22,172,20,23,198,1,28,248,22, +90,23,194,2,9,27,248,80,144,47,56,42,248,22,83,23,196,2,28,23,193, +2,249,22,82,248,22,144,16,249,22,142,16,23,198,1,247,22,158,16,248,80, +144,49,8,53,42,248,22,172,20,23,198,1,86,94,23,193,1,248,80,144,47, +8,53,42,248,22,172,20,23,196,1,86,94,23,193,1,27,248,22,172,20,23, +196,1,28,248,22,90,23,194,2,9,27,248,80,144,45,56,42,248,22,83,23, +196,2,28,23,193,2,249,22,82,248,22,144,16,249,22,142,16,23,198,1,247, +22,158,16,248,80,144,47,8,53,42,248,22,172,20,23,198,1,86,94,23,193, +1,248,80,144,45,8,53,42,248,22,172,20,23,196,1,27,247,22,165,16,27, +248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43,44,41,28,23,196, +2,27,249,22,177,8,247,22,176,8,2,75,28,192,249,22,167,8,194,7,63, +2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200,1, +250,22,134,16,248,22,157,16,2,61,250,22,160,2,23,205,1,2,59,247,22, +173,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8,50,42,250,22,96, +9,248,22,92,248,22,157,16,2,55,9,28,193,249,22,82,195,194,192,27,247, +22,165,16,27,248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43,44, +41,28,23,196,2,27,249,22,177,8,247,22,176,8,2,75,28,192,249,22,167, +8,194,7,63,2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76,27, +28,23,200,1,250,22,134,16,248,22,157,16,2,61,250,22,160,2,23,205,1, +2,59,247,22,173,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8,51, +42,250,22,96,23,207,1,248,22,92,248,22,157,16,2,55,9,28,193,249,22, +82,195,194,192,27,247,22,165,16,27,248,80,144,42,58,42,249,80,144,44,55, +40,40,80,144,44,8,52,42,249,80,144,43,44,41,28,23,196,2,27,249,22, +177,8,247,22,176,8,2,75,28,192,249,22,167,8,194,7,63,2,66,2,66, +250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200,1,250,22,134,16, +248,22,157,16,2,61,250,22,160,2,23,205,1,2,59,247,22,173,8,2,77, +86,94,23,199,1,11,27,27,250,22,96,23,207,1,248,22,92,248,22,157,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,141,16,23,194,2,248,22,144,16,23,194,1,28,248,22,140,16,23, +194,2,90,144,42,11,89,146,42,39,11,248,22,137,16,249,22,142,16,250,80, +144,60,43,42,248,22,157,16,2,56,11,11,248,22,157,16,2,57,86,95,23, +195,1,23,194,1,248,22,144,16,249,22,142,16,23,199,1,23,196,1,27,250, +80,144,55,43,42,248,22,157,16,2,56,23,197,1,10,28,23,193,2,248,22, +144,16,23,194,1,11,28,23,193,2,249,22,82,248,22,144,16,249,22,142,16, +23,198,1,247,22,158,16,27,248,22,172,20,23,198,1,28,248,22,90,23,194, +2,9,27,248,80,144,55,56,42,248,22,83,23,196,2,28,23,193,2,249,22, +82,248,22,144,16,249,22,142,16,23,198,1,247,22,158,16,248,80,144,57,8, +53,42,248,22,172,20,23,198,1,86,94,23,193,1,248,80,144,55,8,53,42, +248,22,172,20,23,196,1,86,94,23,193,1,27,248,22,172,20,23,196,1,28, +248,22,90,23,194,2,9,27,248,80,144,53,56,42,248,22,83,23,196,2,28, +23,193,2,249,22,82,248,22,144,16,249,22,142,16,23,198,1,247,22,158,16, +248,80,144,55,8,53,42,248,22,172,20,23,198,1,86,94,23,193,1,248,80, +144,53,8,53,42,248,22,172,20,23,196,1,28,193,249,22,82,195,194,192,27, +20,13,144,80,144,40,46,40,26,9,80,144,49,47,40,249,22,31,11,80,144, +51,46,40,22,154,15,10,22,161,15,10,22,162,15,10,22,163,15,10,248,22, +150,6,23,196,2,28,248,22,150,7,23,194,2,12,86,94,248,22,179,9,23, +194,1,27,20,13,144,80,144,41,46,40,26,9,80,144,50,47,40,249,22,31, +11,80,144,52,46,40,22,154,15,10,22,161,15,10,22,162,15,10,22,163,15, +10,248,22,150,6,23,197,2,28,248,22,150,7,23,194,2,12,86,94,248,22, +179,9,23,194,1,27,20,13,144,80,144,42,46,40,26,9,80,144,51,47,40, +249,22,31,11,80,144,53,46,40,22,154,15,10,22,161,15,10,22,162,15,10, +22,163,15,10,248,22,150,6,23,198,2,28,248,22,150,7,23,194,2,12,86, +94,248,22,179,9,23,194,1,248,80,144,43,8,54,42,197,86,94,249,22,141, +7,247,22,174,5,23,196,2,248,22,165,6,249,22,138,4,39,249,22,186,3, +28,23,198,2,23,198,1,86,94,23,198,1,39,23,199,1,27,248,22,191,5, +28,23,198,2,86,95,23,197,1,23,196,1,23,198,1,86,94,23,198,1,27, +250,80,144,45,43,42,248,22,157,16,2,56,11,11,27,248,22,141,4,23,199, +1,27,28,23,194,2,23,194,1,86,94,23,194,1,39,27,248,22,141,4,23, +202,1,249,22,142,6,23,198,1,20,20,95,88,148,8,36,39,51,11,9,224, +3,2,33,190,2,23,195,1,23,196,1,248,80,144,41,8,54,42,193,145,39, +9,20,121,145,2,1,39,16,1,11,16,0,20,27,15,56,9,2,2,2,2, +29,11,11,11,11,11,11,11,9,9,11,11,11,10,46,80,143,39,39,20,121, +145,2,1,54,16,40,2,3,2,4,2,5,2,6,2,7,2,8,2,9,30, +2,11,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45, +107,101,121,11,6,30,2,11,1,23,101,120,116,101,110,100,45,112,97,114,97, +109,101,116,101,114,105,122,97,116,105,111,110,11,4,2,12,2,13,2,14,2, +15,2,16,2,17,2,18,30,2,11,1,19,99,97,99,104,101,45,99,111,110, +102,105,103,117,114,97,116,105,111,110,11,1,2,19,2,20,2,21,2,22,2, +23,2,24,2,25,2,26,2,27,2,28,2,29,30,2,11,1,21,101,120,99, +101,112,116,105,111,110,45,104,97,110,100,108,101,114,45,107,101,121,11,3,2, +30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,2,39,2,40, +16,0,40,42,39,16,0,39,16,19,2,13,2,14,2,12,2,25,2,4,2, +35,2,23,2,24,2,19,2,29,2,33,2,21,2,22,2,31,2,27,2,30, +2,32,2,36,2,28,58,11,11,11,16,17,2,9,2,17,2,15,2,40,2, +16,2,7,2,26,2,39,2,18,2,20,2,38,2,5,2,34,2,8,2,37, +2,3,2,6,16,17,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, +11,11,16,17,2,9,2,17,2,15,2,40,2,16,2,7,2,26,2,39,2, +18,2,20,2,38,2,5,2,34,2,8,2,37,2,3,2,6,56,56,40,12, +11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39, +39,16,51,20,15,16,2,32,0,88,148,8,36,40,48,11,2,3,222,33,78, +80,144,39,39,40,20,15,16,2,249,22,157,7,7,92,7,92,80,144,39,40, +40,20,15,16,2,88,148,8,36,40,57,41,2,5,223,0,33,83,80,144,39, +41,40,20,15,16,2,88,148,8,36,41,61,41,2,6,223,0,33,85,80,144, +39,42,40,20,15,16,2,20,26,96,2,7,88,148,8,36,42,8,24,8,32, +9,223,0,33,92,88,148,8,36,41,50,55,9,223,0,33,93,88,148,8,36, +40,49,55,9,223,0,33,94,80,144,39,43,40,20,15,16,2,27,248,22,169, +16,248,22,169,8,27,28,249,22,171,9,247,22,182,8,2,43,6,1,1,59, +6,1,1,58,250,22,139,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,41,51,11,2,8,223,0, +33,98,80,144,39,44,40,20,15,16,2,88,148,39,40,8,44,8,128,6,2, +9,223,0,33,99,80,144,39,45,40,20,15,16,2,32,0,88,148,8,36,41, +50,11,2,12,222,33,100,80,144,39,48,40,20,15,16,2,32,0,88,148,8, +36,42,51,11,2,13,222,33,102,80,144,39,49,40,20,15,16,2,32,0,88, +148,8,36,41,49,11,2,14,222,33,103,80,144,39,50,40,20,15,16,2,88, +148,39,42,53,8,128,128,2,15,223,0,33,105,80,144,39,51,40,20,15,16, +2,88,148,39,44,55,8,128,128,2,17,223,0,33,107,80,144,39,53,40,20, +15,16,2,88,148,39,39,56,55,9,223,0,33,108,80,144,39,8,40,42,20, +15,16,2,88,148,39,39,47,16,4,39,40,8,128,4,39,2,18,223,0,33, +109,80,144,39,54,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,110, +80,144,39,8,41,42,20,15,16,2,88,148,39,39,47,16,4,39,40,8,128, +8,39,2,20,223,0,33,111,80,144,39,57,40,20,15,16,2,88,148,8,36, +39,8,44,8,128,6,9,223,0,33,112,80,144,39,8,42,42,20,15,16,2, +88,148,8,36,40,50,16,4,39,39,8,128,16,39,2,21,223,0,33,113,80, +144,39,58,40,20,15,16,2,20,28,143,32,0,88,148,39,40,48,11,2,22, +222,33,114,32,0,88,148,39,40,48,11,2,22,222,33,115,80,144,39,59,40, +20,15,16,2,88,148,8,36,40,50,8,240,0,128,0,0,2,23,223,0,33, +116,80,144,39,60,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,117, +80,144,39,8,43,42,20,15,16,2,88,148,8,36,40,51,16,4,39,40,8, +128,32,39,2,24,223,0,33,118,80,144,39,61,40,20,15,16,2,88,148,39, +40,56,55,2,19,223,0,33,119,80,144,39,56,40,20,15,16,2,88,148,8, +36,41,58,16,4,8,240,0,128,0,0,8,32,8,128,64,39,2,50,223,0, +33,120,80,144,39,8,44,42,20,15,16,2,88,148,8,36,42,52,16,4,39, +39,8,128,64,39,2,25,223,0,33,121,80,144,39,8,23,40,20,15,16,2, +88,148,39,39,56,55,9,223,0,33,122,80,144,39,8,45,42,20,15,16,2, +88,148,8,36,39,57,16,4,8,240,0,128,0,0,8,137,2,8,128,128,39, +2,26,223,0,33,123,80,144,39,8,24,40,20,15,16,2,247,22,142,2,80, +144,39,8,25,40,20,15,16,2,248,22,16,67,115,116,97,109,112,80,144,39, +8,26,40,20,15,16,2,88,148,39,40,49,8,240,0,0,0,4,9,223,0, +33,125,80,144,39,8,46,42,20,15,16,2,88,148,39,41,51,16,4,39,8, +128,80,8,240,0,64,0,0,39,2,29,223,0,33,133,2,80,144,39,8,27, +40,20,15,16,2,32,0,88,148,8,36,40,48,11,2,30,222,33,134,2,80, +144,39,8,29,40,20,15,16,2,88,148,8,36,42,48,8,240,0,0,0,2, +74,109,97,107,101,45,104,97,110,100,108,101,114,223,0,33,136,2,80,144,39, +8,47,42,20,15,16,2,88,148,39,40,47,16,4,8,128,6,8,128,104,8, +240,0,128,0,0,39,2,31,223,0,33,146,2,80,144,39,8,30,40,20,15, +16,2,88,148,39,41,59,16,2,39,8,240,0,128,0,0,2,32,223,0,33, +148,2,80,144,39,8,31,40,20,15,16,2,88,148,8,36,41,61,16,4,39, +8,240,0,64,0,0,39,40,2,50,223,0,33,149,2,80,144,39,8,48,42, +20,15,16,2,88,148,39,47,8,33,16,4,39,39,40,41,67,99,108,111,111, +112,223,0,33,156,2,80,144,39,8,49,42,20,15,16,2,88,148,39,44,8, +25,16,4,39,8,240,0,192,0,0,39,42,2,16,223,0,33,157,2,80,144, +39,52,40,20,15,16,2,88,148,39,42,58,16,4,47,39,43,39,2,33,223, +0,33,162,2,80,144,39,8,32,40,20,15,16,2,32,0,88,148,39,42,53, +11,2,35,222,33,163,2,80,144,39,8,34,40,20,15,16,2,32,0,88,148, +8,36,44,8,27,11,2,36,222,33,168,2,80,144,39,8,35,40,20,15,16, +2,20,28,143,32,0,88,148,8,36,41,55,11,2,37,222,33,171,2,88,148, +8,100,41,52,16,4,39,39,47,39,2,37,223,0,33,173,2,80,144,39,8, +36,40,20,15,16,2,20,28,143,32,0,88,148,8,36,41,55,11,2,34,222, +33,178,2,88,148,8,100,41,52,16,4,39,39,47,39,2,34,223,0,33,179, +2,80,144,39,8,33,40,20,15,16,2,20,28,143,32,0,88,148,39,40,47, +11,2,38,222,33,180,2,32,0,88,148,39,40,47,11,2,38,222,33,181,2, +80,144,39,8,37,40,20,15,16,2,88,148,8,36,40,58,16,4,55,41,39, +43,2,50,223,0,33,182,2,80,144,39,8,50,42,20,15,16,2,88,148,8, +36,40,58,16,4,55,41,39,47,2,50,223,0,33,183,2,80,144,39,8,51, +42,20,15,16,2,88,148,39,39,56,55,9,223,0,33,184,2,80,144,39,8, +52,42,20,15,16,2,88,148,8,36,40,8,23,16,4,55,41,39,8,32,2, +50,223,0,33,185,2,80,144,39,8,53,42,20,15,16,2,20,26,96,2,39, +88,148,39,39,60,16,4,8,32,8,140,2,39,43,9,223,0,33,186,2,88, +148,39,40,61,16,4,8,32,8,140,2,39,47,9,223,0,33,187,2,88,148, +39,41,8,30,16,4,8,48,8,139,2,39,8,48,9,223,0,33,188,2,80, +144,39,8,38,40,20,15,16,2,88,148,8,36,40,60,16,4,8,128,6,39, +39,8,64,2,50,223,0,33,189,2,80,144,39,8,54,42,20,15,16,2,88, +148,8,36,42,56,16,4,55,39,39,8,64,2,40,223,0,33,191,2,80,144, +39,8,39,40,95,29,94,2,10,70,35,37,107,101,114,110,101,108,11,29,94, +2,10,71,35,37,109,105,110,45,115,116,120,11,2,11,9,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 19823); + } + { + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,8,0,23,0, +48,0,65,0,83,0,105,0,128,0,149,0,171,0,180,0,189,0,196,0,205, +0,212,0,0,0,248,1,0,0,3,1,5,105,110,115,112,48,76,35,37,112, +108,97,99,101,45,115,116,114,117,99,116,1,23,115,116,114,117,99,116,58,84, +72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,78,84,72,45,112,108, +97,99,101,45,99,104,97,110,110,101,108,79,84,72,45,112,108,97,99,101,45, +99,104,97,110,110,101,108,63,1,20,84,72,45,112,108,97,99,101,45,99,104, +97,110,110,101,108,45,114,101,102,1,21,84,72,45,112,108,97,99,101,45,99, +104,97,110,110,101,108,45,115,101,116,33,1,19,84,72,45,112,108,97,99,101, +45,99,104,97,110,110,101,108,45,105,110,1,20,84,72,45,112,108,97,99,101, +45,99,104,97,110,110,101,108,45,111,117,116,249,80,143,41,42,23,196,1,39, +249,80,143,41,42,23,196,1,39,249,80,143,41,42,195,39,249,80,143,41,42, +23,196,1,40,249,80,143,41,42,195,40,145,39,9,20,121,145,2,1,39,16, +1,11,16,0,20,27,15,56,9,2,2,2,2,29,11,11,11,11,11,11,11, +9,9,11,11,11,10,48,80,143,39,39,20,121,145,2,1,39,16,7,2,3, +2,4,2,5,2,6,2,7,2,8,2,9,16,0,40,42,39,16,0,39,16, +2,2,6,2,7,41,11,11,11,16,5,2,4,2,8,2,9,2,5,2,3, +16,5,11,11,11,11,11,16,5,2,4,2,8,2,9,2,5,2,3,44,44, +40,12,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0,16, +0,39,39,16,3,20,15,16,6,253,22,128,11,2,4,11,41,39,11,248,22, +92,249,22,82,22,177,10,88,148,39,40,48,47,9,223,9,33,10,80,144,39, +39,40,80,144,39,40,40,80,144,39,41,40,80,144,39,42,40,80,144,39,43, +40,20,15,16,2,20,28,143,88,148,39,40,48,47,9,223,0,33,11,88,148, +39,40,48,47,9,223,0,33,12,80,144,39,44,40,20,15,16,2,20,28,143, +88,148,39,40,48,47,9,223,0,33,13,88,148,39,40,48,47,9,223,0,33, +14,80,144,39,45,40,93,29,94,67,113,117,111,116,101,70,35,37,107,101,114, +110,101,108,11,9,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 576); + } + { + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,100,0,0,0,1,0,0,8,0,15,0, +26,0,53,0,59,0,73,0,86,0,112,0,129,0,151,0,159,0,171,0,186, +0,202,0,220,0,241,0,253,0,13,1,36,1,60,1,72,1,103,1,108,1, +113,1,131,1,137,1,142,1,151,1,156,1,162,1,167,1,171,1,186,1,193, +1,198,1,202,1,207,1,214,1,225,1,232,1,240,1,87,2,122,2,225,2, +4,3,98,3,133,3,227,3,6,4,29,11,59,11,110,11,185,11,201,11,217, +11,231,11,247,11,66,12,82,12,98,12,114,12,189,12,96,13,112,13,187,13, +182,14,62,15,137,15,44,16,57,16,210,16,138,17,181,17,7,18,140,18,201, +18,209,18,220,18,254,19,101,20,129,20,142,20,63,21,70,21,230,21,250,21, +94,22,116,22,126,22,140,22,178,22,21,23,25,23,32,23,238,23,157,32,210, +32,234,32,2,33,0,0,51,37,0,0,3,1,5,105,110,115,112,48,68,35, +37,98,111,111,116,72,100,108,108,45,115,117,102,102,105,120,1,25,100,101,102, +97,117,108,116,45,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101, +100,67,113,117,111,116,101,29,94,2,5,70,35,37,112,97,114,97,109,122,11, +29,94,2,5,69,35,37,117,116,105,108,115,11,1,24,45,109,111,100,117,108, +101,45,104,97,115,104,45,116,97,98,108,101,45,116,97,98,108,101,78,114,101, +103,105,115,116,101,114,45,122,111,45,112,97,116,104,1,20,100,101,102,97,117, +108,116,45,114,101,97,100,101,114,45,103,117,97,114,100,69,67,65,67,72,69, +45,78,73,45,112,97,116,104,45,99,97,99,104,101,76,112,97,116,104,45,99, +97,99,104,101,45,103,101,116,77,112,97,116,104,45,99,97,99,104,101,45,115, +101,116,33,79,45,108,111,97,100,105,110,103,45,102,105,108,101,110,97,109,101, +1,19,45,108,111,97,100,105,110,103,45,112,114,111,109,112,116,45,116,97,103, +73,45,112,114,101,118,45,114,101,108,116,111,77,45,112,114,101,118,45,114,101, +108,116,111,45,100,105,114,1,21,115,112,108,105,116,45,114,101,108,97,116,105, +118,101,45,115,116,114,105,110,103,1,22,102,111,114,109,97,116,45,115,111,117, +114,99,101,45,108,111,99,97,116,105,111,110,73,111,114,105,103,45,112,97,114, +97,109,122,1,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,66,98,111,111,116,66,115,101, +97,108,79,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,5, +4,46,114,107,116,66,115,97,109,101,6,6,6,110,97,116,105,118,101,5,3, +46,122,111,67,105,108,111,111,112,66,108,111,111,112,65,108,105,98,6,12,12, +109,111,100,117,108,101,45,112,97,116,104,63,68,115,117,98,109,111,100,6,2, +2,46,46,6,1,1,46,66,102,105,108,101,68,112,108,97,110,101,116,6,8, +8,109,97,105,110,46,114,107,116,6,4,4,46,114,107,116,69,105,103,110,111, +114,101,100,27,252,22,134,16,28,249,22,171,9,23,201,2,2,27,86,94,23, +199,1,23,200,1,28,248,22,139,16,23,200,2,249,22,134,16,23,202,1,23, +201,1,249,80,144,50,45,42,23,202,1,23,201,1,23,203,1,2,28,247,22, +183,8,249,80,144,50,46,42,23,203,1,80,144,50,39,41,27,250,22,152,16, +196,11,32,0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,82,195,194, +11,249,22,5,20,20,96,88,148,8,36,40,57,8,129,3,9,226,5,4,3, +6,33,42,23,199,1,23,196,1,23,197,1,23,195,1,27,252,22,134,16,28, +249,22,171,9,23,201,2,2,27,86,94,23,199,1,23,200,1,28,248,22,139, +16,23,200,2,249,22,134,16,23,202,1,23,201,1,249,80,144,50,45,42,23, +202,1,23,201,1,23,203,1,2,28,247,22,183,8,249,80,144,50,46,42,23, +203,1,80,144,50,39,41,27,250,22,152,16,196,11,32,0,88,148,8,36,39, +44,11,9,222,11,28,192,249,22,82,195,194,11,249,22,5,20,20,96,88,148, +8,36,40,57,8,129,3,9,226,5,4,3,6,33,44,23,199,1,23,196,1, +23,197,1,23,195,1,27,250,22,134,16,28,249,22,171,9,23,199,2,2,27, +86,94,23,197,1,23,198,1,28,248,22,139,16,23,198,2,249,22,134,16,23, +200,1,23,199,1,249,80,144,48,45,42,23,200,1,23,199,1,23,201,1,249, +80,144,48,46,42,23,201,1,2,29,27,250,22,152,16,196,11,32,0,88,148, +8,36,39,44,11,9,222,11,28,192,249,22,82,195,194,11,249,22,5,20,20, +96,88,148,8,36,40,55,8,128,3,9,226,5,4,3,6,33,46,23,199,1, +23,196,1,23,197,1,23,195,1,27,250,22,134,16,28,249,22,171,9,23,199, +2,2,27,86,94,23,197,1,23,198,1,28,248,22,139,16,23,198,2,249,22, +134,16,23,200,1,23,199,1,249,80,144,48,45,42,23,200,1,23,199,1,23, +201,1,249,80,144,48,46,42,23,201,1,2,29,27,250,22,152,16,196,11,32, +0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,82,195,194,11,249,22, +5,20,20,96,88,148,8,36,40,55,8,128,3,9,226,5,4,3,6,33,48, +23,199,1,23,196,1,23,197,1,23,195,1,86,95,28,248,80,144,40,43,42, +23,195,2,12,250,22,184,11,2,25,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,40,28,28,248, +22,66,248,22,83,23,197,2,10,248,22,169,9,248,22,171,20,23,197,2,249, +22,4,22,66,248,22,172,20,23,198,2,11,11,11,10,12,250,22,184,11,2, +25,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,129,5,11,27,28,23,194,2,250,22,160,2,80,143,44,44,248,22,134,17, +247,22,147,14,11,11,27,28,23,194,2,250,22,160,2,248,22,84,23,198,2, +23,198,2,11,11,28,23,193,2,86,96,23,197,1,23,195,1,23,194,1,20, +13,144,80,144,42,41,40,250,80,144,45,42,40,249,22,31,11,80,144,47,41, +40,22,130,5,248,22,104,23,197,2,27,248,22,113,23,195,2,20,13,144,80, +144,43,41,40,250,80,144,46,42,40,249,22,31,11,80,144,48,41,40,22,179, +5,28,248,22,180,15,23,197,2,23,196,1,86,94,23,196,1,247,22,158,16, +249,247,22,177,5,248,22,171,20,23,197,1,23,201,1,86,94,23,193,1,27, +28,248,22,141,16,23,199,2,23,198,2,27,247,22,179,5,28,192,249,22,142, +16,23,201,2,194,23,199,2,90,144,42,11,89,146,42,39,11,248,22,137,16, +23,202,1,86,94,23,195,1,90,144,41,11,89,146,41,39,11,28,23,204,2, +27,248,22,185,15,23,198,2,19,248,22,149,8,194,28,28,249,22,134,4,23, +195,4,43,249,22,152,8,2,26,249,22,155,8,197,249,22,186,3,23,199,4, +43,11,249,22,7,23,200,2,248,22,189,15,249,22,156,8,250,22,155,8,201, +39,249,22,186,3,23,203,4,43,5,3,46,115,115,249,22,7,23,200,2,11, +2,249,22,7,23,198,2,11,27,28,249,22,171,9,23,196,2,23,199,2,23, +199,2,249,22,134,16,23,198,2,23,196,2,27,28,23,196,2,28,249,22,171, +9,23,198,2,23,200,1,23,200,1,86,94,23,200,1,249,22,134,16,23,199, +2,23,198,2,86,95,23,200,1,23,198,1,11,27,28,249,22,171,9,23,200, +2,70,114,101,108,97,116,105,118,101,86,94,23,198,1,2,27,23,198,1,27, +247,22,163,16,27,247,22,164,16,27,250,22,152,16,23,201,2,11,32,0,88, +148,8,36,39,44,11,9,222,11,27,28,23,194,2,249,22,82,23,201,2,23, +196,1,86,94,23,194,1,11,27,28,23,199,2,28,23,194,2,11,27,250,22, +152,16,23,203,2,11,32,0,88,148,8,36,39,44,11,9,222,11,28,192,249, +22,82,23,202,2,194,11,11,27,28,23,195,2,23,195,2,23,194,2,27,28, +23,196,2,23,196,2,248,22,169,9,23,196,2,27,28,23,205,2,28,23,196, +2,86,94,23,197,1,23,196,2,248,22,169,9,23,198,1,86,94,23,197,1, +11,27,28,23,195,2,27,249,22,5,88,148,39,40,51,8,129,3,9,226,24, +15,12,11,33,43,23,203,2,27,28,23,198,2,11,193,28,192,192,28,193,28, +23,198,2,28,249,22,134,4,248,22,84,196,248,22,84,23,201,2,193,11,11, +11,11,28,23,193,2,86,105,23,213,1,23,212,1,23,206,1,23,205,1,23, +204,1,23,203,1,23,201,1,23,200,1,23,197,1,23,196,1,23,195,1,23, +194,1,20,13,144,80,144,60,41,40,250,80,144,8,24,42,40,249,22,31,11, +80,144,8,26,41,40,22,130,5,11,20,13,144,80,144,60,41,40,250,80,144, +8,24,42,40,249,22,31,11,80,144,8,26,41,40,22,179,5,28,248,22,180, +15,23,206,2,23,205,1,86,94,23,205,1,247,22,158,16,249,247,22,168,16, +248,22,83,23,196,1,23,218,1,86,94,23,193,1,27,28,23,195,2,27,249, +22,5,88,148,39,40,51,8,129,3,9,226,25,17,13,12,33,45,23,204,2, +27,28,23,200,2,11,193,28,192,192,28,193,28,199,28,249,22,134,4,248,22, +84,196,248,22,84,202,193,11,11,11,86,94,23,198,1,11,28,23,193,2,86, +103,23,214,1,23,213,1,23,207,1,23,206,1,23,205,1,23,202,1,23,201, +1,23,197,1,23,196,1,23,195,1,20,13,144,80,144,61,41,40,250,80,144, +8,25,42,40,249,22,31,11,80,144,8,27,41,40,22,130,5,23,207,1,20, +13,144,80,144,61,41,40,250,80,144,8,25,42,40,249,22,31,11,80,144,8, +27,41,40,22,179,5,28,248,22,180,15,23,207,2,23,206,1,86,94,23,206, +1,247,22,158,16,249,247,22,168,16,248,22,83,23,196,1,23,219,1,86,94, +23,193,1,27,28,23,197,2,27,249,22,5,20,20,94,88,148,39,40,51,8, +128,3,9,226,26,17,14,13,33,47,23,210,1,23,205,2,27,28,23,200,2, +11,193,28,192,192,28,193,28,23,200,2,28,249,22,134,4,248,22,84,196,248, +22,84,23,203,2,193,11,11,11,86,94,23,207,1,11,28,23,193,2,86,101, +23,208,1,23,206,1,23,205,1,23,203,1,23,202,1,23,198,1,23,197,1, +23,196,1,86,94,27,248,22,83,23,195,2,28,23,215,2,250,22,158,2,248, +22,84,23,219,1,23,219,1,250,22,92,23,199,1,11,23,211,2,12,20,13, +144,80,144,8,23,41,40,250,80,144,8,26,42,40,249,22,31,11,80,144,8, +28,41,40,22,130,5,11,20,13,144,80,144,8,23,41,40,250,80,144,8,26, +42,40,249,22,31,11,80,144,8,28,41,40,22,179,5,28,248,22,180,15,23, +208,2,23,207,1,86,94,23,207,1,247,22,158,16,249,247,22,177,5,248,22, +171,20,23,196,1,23,220,1,86,94,23,193,1,27,28,23,197,1,27,249,22, +5,20,20,95,88,148,39,40,51,8,128,3,9,226,27,19,15,14,33,49,23, +207,1,23,212,1,23,206,1,27,28,23,201,2,11,193,28,192,192,28,193,28, +200,28,249,22,134,4,248,22,84,196,248,22,84,203,193,11,11,11,86,97,23, +209,1,23,204,1,23,203,1,23,199,1,11,28,23,193,2,86,95,23,207,1, +23,198,1,86,94,27,248,22,83,23,195,2,28,23,216,2,250,22,158,2,248, +22,84,23,220,1,23,220,1,250,22,92,23,199,1,23,213,2,23,212,2,12, +20,13,144,80,144,8,24,41,40,250,80,144,8,27,42,40,249,22,31,11,80, +144,8,29,41,40,22,130,5,23,209,1,20,13,144,80,144,8,24,41,40,250, +80,144,8,27,42,40,249,22,31,11,80,144,8,29,41,40,22,179,5,28,248, +22,180,15,23,209,2,23,208,1,86,94,23,208,1,247,22,158,16,249,247,22, +177,5,248,22,171,20,23,196,1,23,221,1,86,96,23,216,1,23,215,1,23, +193,1,28,28,248,22,80,23,220,2,248,22,171,20,23,220,2,10,27,28,23, +199,2,86,94,23,207,1,23,208,1,86,94,23,208,1,23,207,1,28,28,248, +22,80,23,221,2,248,22,169,9,248,22,128,16,23,195,2,11,12,20,13,144, +80,144,8,25,41,40,250,80,144,8,28,42,40,249,22,31,11,80,144,8,30, +41,40,22,130,5,28,23,223,2,28,23,202,1,11,23,196,2,86,94,23,202, +1,11,20,13,144,80,144,8,25,41,40,250,80,144,8,28,42,40,249,22,31, +11,80,144,8,30,41,40,22,179,5,28,248,22,180,15,23,210,2,23,209,1, +86,94,23,209,1,247,22,158,16,249,247,22,177,5,23,195,1,23,222,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,191,8,80,144,42,50,41,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,191,8, +80,144,43,50,41,23,196,2,250,22,128,9,80,144,44,50,41,23,197,1,248, +22,177,2,249,22,82,249,22,82,23,204,1,23,205,1,27,28,23,200,2,248, +22,178,2,200,11,28,192,192,9,32,54,88,149,8,38,42,54,11,2,30,39, +223,3,33,69,32,55,88,149,8,38,42,53,11,2,30,39,223,3,33,68,32, +56,88,148,8,36,40,53,11,2,31,222,33,67,32,57,88,149,8,38,42,53, +11,2,30,39,223,3,33,58,28,249,22,130,4,23,197,2,23,195,4,248,22, +92,194,28,249,22,138,9,7,47,249,22,159,7,23,198,2,23,199,2,249,22, +82,250,22,177,7,23,199,2,39,23,200,2,248,2,56,249,22,177,7,23,199, +1,248,22,183,3,23,201,1,250,2,57,23,196,4,196,248,22,183,3,198,32, +59,88,149,8,38,42,55,11,2,30,39,223,3,33,66,32,60,88,149,8,38, +42,54,11,2,30,39,223,3,33,63,32,61,88,149,8,38,42,53,11,2,30, +39,223,3,33,62,28,249,22,130,4,23,197,2,23,195,4,248,22,92,194,28, +249,22,138,9,7,47,249,22,159,7,23,198,2,23,199,2,249,22,82,250,22, +177,7,23,199,2,39,23,200,2,248,2,56,249,22,177,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,138,9,7,47,249,22,159, +7,23,198,2,23,199,2,249,22,82,250,22,177,7,23,199,2,39,23,200,2, +27,249,22,177,7,23,199,1,248,22,183,3,23,201,1,19,248,22,158,7,23, +195,2,250,2,61,23,196,4,23,197,1,39,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,138,9,7, +47,249,22,159,7,23,199,2,23,197,2,249,22,82,250,22,177,7,23,200,2, +39,23,198,2,248,2,56,249,22,177,7,23,200,1,248,22,183,3,23,199,1, +250,2,60,23,197,4,197,248,22,183,3,196,32,64,88,149,8,38,42,53,11, +2,30,39,223,3,33,65,28,249,22,130,4,23,197,2,23,195,4,248,22,92, +194,28,249,22,138,9,7,47,249,22,159,7,23,198,2,23,199,2,249,22,82, +250,22,177,7,23,199,2,39,23,200,2,248,2,56,249,22,177,7,23,199,1, +248,22,183,3,23,201,1,250,2,64,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,138,9,7,47,249, +22,159,7,23,198,2,23,199,2,249,22,82,250,22,177,7,23,199,2,39,23, +200,2,27,249,22,177,7,23,199,1,248,22,183,3,23,201,1,19,248,22,158, +7,23,195,2,250,2,60,23,196,4,23,197,1,39,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,138, +9,7,47,249,22,159,7,23,199,2,23,197,2,249,22,82,250,22,177,7,23, +200,2,39,23,198,2,27,249,22,177,7,23,200,1,248,22,183,3,23,199,1, +19,248,22,158,7,23,195,2,250,2,64,23,196,4,23,197,1,39,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,138,9,7,47,249,22,159,7,23,200,2,23,197,2,249,22,82,250, +22,177,7,23,201,2,39,23,198,2,248,2,56,249,22,177,7,23,201,1,248, +22,183,3,23,199,1,250,2,59,23,198,4,198,248,22,183,3,196,19,248,22, +158,7,23,195,2,28,249,22,130,4,39,23,195,4,248,22,92,194,28,249,22, +138,9,7,47,249,22,159,7,23,198,2,39,249,22,82,250,22,177,7,23,199, +2,39,39,27,249,22,177,7,23,199,1,40,19,248,22,158,7,23,195,2,250, +2,57,23,196,4,23,197,1,39,2,28,249,22,130,4,40,23,195,4,248,22, +92,194,28,249,22,138,9,7,47,249,22,159,7,23,198,2,40,249,22,82,250, +22,177,7,23,199,2,39,40,248,2,56,249,22,177,7,23,199,1,41,250,2, +59,23,196,4,196,41,2,28,249,22,130,4,23,197,2,23,195,4,248,22,92, +194,28,249,22,138,9,7,47,249,22,159,7,23,198,2,23,199,2,249,22,82, +250,22,177,7,23,199,2,39,23,200,2,248,2,56,249,22,177,7,23,199,1, +248,22,183,3,23,201,1,250,2,55,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,138,9,7,47,249, +22,159,7,23,198,2,23,199,2,249,22,82,250,22,177,7,23,199,2,39,23, +200,2,27,249,22,177,7,23,199,1,248,22,183,3,23,201,1,19,248,22,158, +7,23,195,2,250,2,55,23,196,4,23,197,1,39,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,138, +9,7,47,249,22,159,7,23,199,2,23,197,2,249,22,82,250,22,177,7,23, +200,2,39,23,198,2,248,2,56,249,22,177,7,23,200,1,248,22,183,3,23, +199,1,250,2,54,23,197,4,197,248,22,183,3,196,32,70,88,148,39,40,58, +11,2,31,222,33,71,28,248,22,90,248,22,84,23,195,2,249,22,7,9,248, +22,171,20,23,196,1,90,144,41,11,89,146,41,39,11,27,248,22,172,20,23, +197,2,28,248,22,90,248,22,84,23,195,2,249,22,7,9,248,22,171,20,195, +90,144,41,11,89,146,41,39,11,27,248,22,172,20,196,28,248,22,90,248,22, +84,23,195,2,249,22,7,9,248,22,171,20,195,90,144,41,11,89,146,41,39, +11,248,2,70,248,22,172,20,196,249,22,7,249,22,82,248,22,171,20,199,196, +195,249,22,7,249,22,82,248,22,171,20,199,196,195,249,22,7,249,22,82,248, +22,171,20,23,200,1,23,197,1,23,196,1,27,19,248,22,158,7,23,196,2, +250,2,54,23,196,4,23,198,1,39,2,28,23,195,1,192,28,248,22,90,248, +22,84,23,195,2,249,22,7,9,248,22,171,20,23,196,1,27,248,22,172,20, +23,195,2,90,144,41,11,89,146,41,39,11,28,248,22,90,248,22,84,23,197, +2,249,22,7,9,248,22,171,20,23,198,1,27,248,22,172,20,23,197,2,90, +144,41,11,89,146,41,39,11,28,248,22,90,248,22,84,23,197,2,249,22,7, +9,248,22,171,20,197,90,144,41,11,89,146,41,39,11,248,2,70,248,22,172, +20,198,249,22,7,249,22,82,248,22,171,20,201,196,195,249,22,7,249,22,82, +248,22,171,20,23,203,1,196,195,249,22,7,249,22,82,248,22,171,20,23,201, +1,23,197,1,23,196,1,248,22,146,12,252,22,164,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,39,41,40, +80,143,39,59,89,146,40,40,10,249,22,132,5,21,94,2,32,6,19,19,112, +108,97,110,101,116,47,114,101,115,111,108,118,101,114,46,114,107,116,1,27,112, +108,97,110,101,116,45,109,111,100,117,108,101,45,110,97,109,101,45,114,101,115, +111,108,118,101,114,12,27,28,23,195,2,28,249,22,171,9,23,197,2,80,143, +42,55,86,94,23,195,1,80,143,40,56,27,248,22,155,5,23,197,2,27,28, +248,22,80,23,195,2,248,22,171,20,23,195,1,23,194,1,28,248,22,180,15, +23,194,2,90,144,42,11,89,146,42,39,11,248,22,137,16,23,197,1,86,95, +20,18,144,11,80,143,45,55,199,20,18,144,11,80,143,45,56,192,192,11,86, +94,23,195,1,11,28,23,193,2,192,86,94,23,193,1,27,247,22,179,5,28, +23,193,2,192,86,94,23,193,1,247,22,158,16,90,144,42,11,89,146,42,39, +11,248,22,137,16,23,198,2,86,95,23,195,1,23,193,1,28,249,22,173,16, +0,11,35,114,120,34,91,46,93,115,115,36,34,248,22,185,15,23,197,1,249, +80,144,44,61,42,23,199,1,2,26,196,249,80,144,41,57,42,195,10,249,22, +12,23,196,1,80,144,41,54,41,86,96,28,248,22,153,5,23,196,2,12,250, +22,184,11,2,22,6,21,21,114,101,115,111,108,118,101,100,45,109,111,100,117, +108,101,45,112,97,116,104,63,23,198,2,28,28,23,196,2,248,22,148,14,23, +197,2,10,12,250,22,184,11,2,22,6,20,20,40,111,114,47,99,32,35,102, +32,110,97,109,101,115,112,97,99,101,63,41,23,199,2,28,24,193,2,248,24, +194,1,23,196,2,86,94,23,193,1,12,27,250,22,160,2,80,144,44,44,41, +248,22,134,17,247,22,147,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, +46,44,41,248,22,134,17,247,22,147,14,195,192,86,94,250,22,158,2,248,22, +83,23,197,2,23,200,2,70,100,101,99,108,97,114,101,100,28,23,198,2,27, +28,248,22,80,248,22,155,5,23,200,2,248,22,154,5,248,22,83,248,22,155, +5,23,201,1,23,198,1,27,250,22,160,2,80,144,47,44,41,248,22,134,17, +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,172,20,23,200,1,23,198,1,23, +196,1,12,12,12,86,94,251,22,141,12,247,22,145,12,67,101,114,114,111,114, +6,69,69,100,101,102,97,117,108,116,32,109,111,100,117,108,101,32,110,97,109, +101,32,114,101,115,111,108,118,101,114,32,99,97,108,108,101,100,32,119,105,116, +104,32,116,104,114,101,101,32,97,114,103,117,109,101,110,116,115,32,40,100,101, +112,114,101,99,97,116,101,100,41,11,251,24,197,1,23,198,1,23,199,1,23, +200,1,10,32,81,88,148,39,41,50,11,78,102,108,97,116,116,101,110,45,115, +117,98,45,112,97,116,104,222,33,84,32,82,88,148,39,43,57,11,2,31,222, +33,83,28,248,22,90,23,197,2,28,248,22,90,195,192,249,22,82,194,248,22, +97,197,28,249,22,173,9,248,22,83,23,199,2,2,35,28,248,22,90,23,196, +2,86,95,23,196,1,23,195,1,250,22,180,11,2,22,6,37,37,116,111,111, +32,109,97,110,121,32,34,46,46,34,115,32,105,110,32,115,117,98,109,111,100, +117,108,101,32,112,97,116,104,58,32,126,46,115,250,22,93,2,34,28,249,22, +173,9,23,201,2,2,36,23,199,1,28,248,22,180,15,23,200,2,23,199,1, +249,22,92,28,248,22,66,23,202,2,2,5,2,37,23,201,1,23,200,1,251, +2,82,196,197,248,22,84,199,248,22,172,20,200,251,2,82,196,197,249,22,82, +248,22,171,20,202,200,248,22,172,20,200,251,2,82,196,197,9,197,27,250,22, +178,7,27,28,23,199,2,28,247,22,133,12,248,80,144,47,58,42,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,184,16,0,7,35,114,120,34,92,110,34,23,203,1,249,22,139,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,176,13,28,23,196,2,251,22,184,12,23,198, +1,247,22,27,248,22,92,23,201,1,23,199,1,86,94,23,196,1,250,22,147, +13,23,197,1,247,22,27,23,198,1,32,86,88,148,8,36,40,53,11,69,115, +115,45,62,114,107,116,222,33,87,19,248,22,158,7,194,28,249,22,134,4,23, +195,4,42,28,249,22,171,9,7,46,249,22,159,7,197,249,22,186,3,23,199, +4,42,28,28,249,22,171,9,7,115,249,22,159,7,197,249,22,186,3,23,199, +4,41,249,22,171,9,7,115,249,22,159,7,197,249,22,186,3,23,199,4,40, +11,249,22,178,7,250,22,177,7,198,39,249,22,186,3,23,200,4,42,2,40, +193,193,193,2,28,249,22,161,7,194,2,36,2,27,28,249,22,161,7,194,2, +35,64,117,112,192,0,8,35,114,120,34,91,46,93,34,32,90,88,148,8,36, +40,50,11,2,31,222,33,91,28,248,22,90,23,194,2,9,250,22,93,6,4, +4,10,32,32,32,248,22,184,15,248,22,105,23,198,2,248,2,90,248,22,172, +20,23,198,1,28,249,22,173,9,248,22,84,23,200,2,23,197,1,28,249,22, +171,9,248,22,171,20,23,200,1,23,196,1,251,22,180,11,2,22,6,41,41, +99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,10,32,32,97,116, +32,112,97,116,104,58,32,126,97,10,32,32,112,97,116,104,115,58,126,97,23, +200,1,249,22,1,22,178,7,248,2,90,248,22,97,23,201,1,12,12,247,23, +193,1,250,22,159,4,11,196,195,20,13,144,80,144,49,53,41,249,22,82,249, +22,82,23,198,1,23,202,1,23,195,1,20,13,144,80,144,49,41,40,252,80, +144,54,42,40,249,22,31,11,80,144,56,41,40,22,129,5,23,201,2,22,131, +5,248,28,23,208,2,20,20,94,88,148,8,36,40,49,11,9,223,15,33,94, +23,208,1,86,94,23,208,1,22,7,28,248,22,66,23,207,2,23,206,1,28, +28,248,22,80,23,207,2,249,22,171,9,248,22,171,20,23,209,2,2,32,11, +23,206,1,86,94,23,206,1,28,248,22,153,5,23,203,2,27,248,22,155,5, +23,204,2,28,248,22,66,193,249,22,92,2,5,194,192,23,202,2,249,247,22, +178,5,23,201,1,27,248,22,70,248,22,184,15,23,202,1,28,23,204,2,28, +250,22,160,2,248,22,171,20,23,202,1,23,202,1,11,249,22,82,11,205,249, +22,82,194,205,192,86,96,28,248,22,163,5,23,196,2,12,28,248,22,157,4, +23,198,2,250,22,182,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,184,11,2,22,2,33,23,198,2,28,28, +23,196,2,248,22,153,5,23,197,2,10,12,250,22,184,11,2,22,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,184,11,2,22,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,171,9,248,22,171,20,23,198,2,2,5,11,86,97,23,198,1,23, +197,1,23,196,1,23,193,1,248,22,154,5,248,22,104,23,197,1,28,28,248, +22,80,23,196,2,28,249,22,171,9,248,22,171,20,23,198,2,2,34,28,248, +22,80,248,22,104,23,197,2,249,22,171,9,248,22,108,23,198,2,2,5,11, +11,11,86,97,23,198,1,23,197,1,23,196,1,23,193,1,248,22,154,5,249, +2,81,248,22,121,23,199,2,248,22,106,23,199,1,28,28,248,22,80,23,196, +2,28,249,22,171,9,248,22,171,20,23,198,2,2,34,28,28,249,22,173,9, +248,22,104,23,198,2,2,36,10,249,22,173,9,248,22,104,23,198,2,2,35, +28,23,196,2,27,248,22,155,5,23,198,2,28,248,22,66,193,10,28,248,22, +80,193,248,22,66,248,22,171,20,194,11,11,11,11,11,86,96,23,198,1,23, +197,1,23,193,1,27,248,22,155,5,23,198,1,248,22,154,5,249,2,81,28, +248,22,80,23,197,2,248,22,171,20,23,197,2,23,196,2,27,28,249,22,173, +9,248,22,104,23,203,2,2,35,248,22,172,20,200,248,22,106,200,28,248,22, +80,23,198,2,249,22,96,248,22,172,20,199,194,192,28,28,248,22,80,23,196, +2,249,22,171,9,248,22,171,20,23,198,2,2,38,11,86,94,248,80,144,41, +8,28,42,23,194,2,253,24,199,1,23,201,1,23,202,1,23,203,1,23,204, +1,11,80,143,46,59,28,28,248,22,80,23,196,2,28,249,22,171,9,248,22, +171,20,23,198,2,2,34,28,248,22,80,248,22,104,23,197,2,249,22,171,9, +248,22,108,23,198,2,2,38,11,11,11,86,94,248,80,144,41,8,28,42,23, +194,2,253,24,199,1,248,22,104,23,202,2,23,202,1,23,203,1,23,204,1, +248,22,106,23,202,1,80,143,46,59,86,94,23,193,1,27,88,148,8,36,40, +57,8,240,0,0,8,0,1,19,115,104,111,119,45,99,111,108,108,101,99,116, +105,111,110,45,101,114,114,225,2,5,3,33,85,27,28,248,22,80,23,198,2, +28,249,22,171,9,2,34,248,22,171,20,23,200,2,27,248,22,104,23,199,2, +28,28,249,22,173,9,23,195,2,2,36,10,249,22,173,9,23,195,2,2,35, +86,94,23,193,1,28,23,199,2,27,248,22,155,5,23,201,2,28,248,22,80, +193,248,22,171,20,193,192,250,22,180,11,2,22,6,45,45,110,111,32,98,97, +115,101,32,112,97,116,104,32,102,111,114,32,114,101,108,97,116,105,118,101,32, +115,117,98,109,111,100,117,108,101,32,112,97,116,104,58,32,126,46,115,23,201, +2,192,23,197,2,23,197,2,27,28,248,22,80,23,199,2,28,249,22,171,9, +2,34,248,22,171,20,23,201,2,27,28,28,28,249,22,173,9,248,22,104,23, +202,2,2,36,10,249,22,173,9,248,22,104,23,202,2,2,35,23,200,2,11, +27,248,22,155,5,23,202,2,27,28,249,22,173,9,248,22,104,23,204,2,2, +35,248,22,172,20,23,202,1,248,22,106,23,202,1,28,248,22,80,23,195,2, +249,2,81,248,22,171,20,23,197,2,249,22,96,248,22,172,20,23,199,1,23, +197,1,249,2,81,23,196,1,23,195,1,249,2,81,2,36,28,249,22,173,9, +248,22,104,23,204,2,2,35,248,22,172,20,23,202,1,248,22,106,23,202,1, +28,248,22,80,193,248,22,172,20,193,11,86,94,23,198,1,11,86,94,23,198, +1,11,27,28,248,22,66,23,196,2,27,248,80,144,46,51,42,249,22,82,23, +199,2,248,22,134,17,247,22,147,14,28,23,193,2,192,86,94,23,193,1,90, +144,41,11,89,146,41,39,11,249,80,144,49,57,42,248,22,73,23,201,2,11, +27,28,248,22,90,23,195,2,2,39,249,22,178,7,23,197,2,2,40,252,80, +144,53,8,23,42,23,205,1,28,248,22,90,23,200,2,23,200,1,86,94,23, +200,1,248,22,83,23,200,2,28,248,22,90,23,200,2,86,94,23,199,1,9, +248,22,84,23,200,1,23,198,1,10,28,248,22,155,7,23,196,2,86,94,23, +196,1,27,248,80,144,46,8,29,42,23,202,2,27,248,80,144,47,51,42,249, +22,82,23,200,2,23,197,2,28,23,193,2,192,86,94,23,193,1,90,144,41, +11,89,146,41,39,11,249,80,144,50,57,42,23,201,2,11,28,248,22,90,23, +194,2,86,94,23,193,1,249,22,134,16,23,198,1,248,2,86,23,197,1,250, +22,1,22,134,16,23,199,1,249,22,96,249,22,2,32,0,88,148,8,36,40, +47,11,9,222,33,88,23,200,1,248,22,92,248,2,86,23,201,1,28,248,22, +180,15,23,196,2,86,94,23,196,1,248,80,144,45,8,30,42,248,22,144,16, +28,248,22,141,16,23,198,2,23,197,2,249,22,142,16,23,199,2,248,80,144, +49,8,29,42,23,205,2,28,249,22,171,9,248,22,83,23,198,2,2,32,27, +248,80,144,46,51,42,249,22,82,23,199,2,248,22,134,17,247,22,147,14,28, +23,193,2,192,86,94,23,193,1,90,144,41,11,89,146,41,39,11,249,80,144, +49,57,42,248,22,104,23,201,2,11,27,28,248,22,90,248,22,106,23,201,2, +28,248,22,90,23,195,2,249,22,177,16,2,89,23,197,2,11,10,27,28,23, +194,2,248,2,86,23,197,2,28,248,22,90,23,196,2,2,39,28,249,22,177, +16,2,89,23,198,2,248,2,86,23,197,2,249,22,178,7,23,198,2,2,40, +27,28,23,195,1,86,94,23,197,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,56,8,31,42,248,22,106,23,208,2,23,198,1,28,248,22,90,23,197,2, +86,94,23,196,1,248,22,92,23,198,1,86,94,23,197,1,23,196,1,252,80, +144,55,8,23,42,23,207,1,248,22,83,23,199,2,248,22,172,20,23,199,1, +23,199,1,10,86,94,23,196,1,28,249,22,171,9,248,22,171,20,23,198,2, +2,37,248,80,144,45,8,30,42,248,22,144,16,249,22,142,16,248,22,146,16, +248,22,104,23,201,2,248,80,144,49,8,29,42,23,205,2,12,86,94,28,28, +248,22,180,15,23,194,2,10,248,22,186,8,23,194,2,12,28,23,201,2,250, +22,182,11,69,114,101,113,117,105,114,101,249,22,139,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,184,11,2,22,2,33,23,198,2,27, +28,248,22,186,8,23,195,2,249,22,191,8,23,196,2,39,249,22,144,16,248, +22,145,16,23,197,2,11,27,28,248,22,186,8,23,196,2,249,22,191,8,23, +197,2,40,248,80,144,47,8,24,42,23,195,2,90,144,42,11,89,146,42,39, +11,28,248,22,186,8,23,199,2,250,22,7,2,41,249,22,191,8,23,203,2, +41,2,41,248,22,137,16,23,198,2,86,95,23,195,1,23,193,1,27,28,248, +22,186,8,23,200,2,249,22,191,8,23,201,2,42,249,80,144,52,61,42,23, +197,2,5,0,27,28,248,22,186,8,23,201,2,249,22,191,8,23,202,2,43, +248,22,154,5,23,200,2,27,250,22,160,2,80,144,55,44,41,248,22,134,17, +247,22,147,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,57,44,41,248, +22,134,17,247,22,147,14,195,192,27,28,23,204,2,248,22,154,5,249,22,82, +248,22,155,5,23,200,2,23,207,2,23,196,2,86,95,28,23,212,2,28,250, +22,160,2,248,22,83,23,198,2,195,11,86,96,23,211,1,23,204,1,23,194, +1,12,27,251,22,31,11,80,144,59,53,41,9,28,248,22,15,80,144,60,54, +41,80,144,59,54,41,247,22,17,27,248,22,134,17,247,22,147,14,86,94,249, +22,3,88,148,8,36,40,57,11,9,226,13,12,2,3,33,92,23,196,2,248, +28,248,22,15,80,144,58,54,41,32,0,88,148,39,40,45,11,9,222,33,93, +80,144,57,8,32,42,20,20,98,88,148,39,39,8,25,8,240,12,64,0,0, +9,233,18,21,14,15,12,11,7,6,4,1,2,33,95,23,195,1,23,194,1, +23,197,1,23,207,1,23,214,1,86,96,23,211,1,23,204,1,23,194,1,12, +28,28,248,22,186,8,23,204,1,86,94,23,212,1,11,28,23,212,1,28,248, +22,155,7,23,206,2,10,28,248,22,66,23,206,2,10,28,248,22,80,23,206, +2,249,22,171,9,248,22,171,20,23,208,2,2,32,11,11,249,80,144,56,52, +42,28,248,22,155,7,23,208,2,249,22,82,23,209,1,248,80,144,59,8,29, +42,23,215,1,86,94,23,212,1,249,22,82,23,209,1,248,22,134,17,247,22, +147,14,252,22,188,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,39,59,248,80,144,40,8,27,40,249,22, +31,11,80,144,42,41,40,248,22,128,5,80,144,40,60,41,248,22,178,5,80, +144,40,40,42,248,22,146,15,80,144,40,48,42,20,18,144,11,80,143,39,59, +248,80,144,40,8,27,40,249,22,31,11,80,144,42,41,40,20,18,144,11,80, +143,39,59,248,80,144,40,8,27,40,249,22,31,11,80,144,42,41,40,145,39, +9,20,121,145,2,1,39,16,1,11,16,0,20,27,15,56,9,2,2,2,2, +29,11,11,11,11,11,11,11,9,9,11,11,11,10,41,80,143,39,39,20,121, +145,2,1,44,16,28,2,3,2,4,30,2,6,1,20,112,97,114,97,109,101, +116,101,114,105,122,97,116,105,111,110,45,107,101,121,11,6,30,2,6,1,23, +101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105, +111,110,11,4,30,2,7,74,112,97,116,104,45,115,116,114,105,110,103,63,42, +196,15,2,8,30,2,7,73,114,101,114,111,111,116,45,112,97,116,104,44,196, +16,30,2,7,77,112,97,116,104,45,97,100,100,45,115,117,102,102,105,120,44, +196,12,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2, +18,2,19,2,20,2,21,2,22,30,2,7,1,19,112,97,116,104,45,114,101, +112,108,97,99,101,45,115,117,102,102,105,120,44,196,14,30,2,7,75,102,105, +110,100,45,99,111,108,45,102,105,108,101,49,196,4,30,2,7,78,110,111,114, +109,97,108,45,99,97,115,101,45,112,97,116,104,42,196,11,2,23,2,24,30, +2,6,76,114,101,112,97,114,97,109,101,116,101,114,105,122,101,11,7,16,0, +40,42,39,16,0,39,16,16,2,15,2,16,2,8,2,12,2,17,2,18,2, +11,2,4,2,10,2,3,2,20,2,13,2,14,2,9,2,19,2,22,55,11, +11,11,16,3,2,23,2,21,2,24,16,3,11,11,11,16,3,2,23,2,21, +2,24,42,42,40,12,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16, +0,16,0,16,0,39,39,16,24,20,15,16,2,248,22,182,8,71,115,111,45, +115,117,102,102,105,120,80,144,39,39,40,20,15,16,2,88,148,39,41,8,39, +8,189,3,2,4,223,0,33,50,80,144,39,40,40,20,15,16,2,32,0,88, +148,8,36,44,55,11,2,9,222,33,51,80,144,39,47,40,20,15,16,2,20, +28,143,32,0,88,148,8,36,40,45,11,2,10,222,192,32,0,88,148,8,36, +40,45,11,2,10,222,192,80,144,39,48,40,20,15,16,2,247,22,143,2,80, +144,39,44,40,20,15,16,2,8,128,8,80,144,39,49,40,20,15,16,2,249, +22,187,8,8,128,8,11,80,144,39,50,40,20,15,16,2,88,148,8,36,40, +53,8,128,32,2,13,223,0,33,52,80,144,39,51,40,20,15,16,2,88,148, +8,36,41,57,8,128,32,2,14,223,0,33,53,80,144,39,52,40,20,15,16, +2,247,22,78,80,144,39,53,40,20,15,16,2,248,22,16,76,109,111,100,117, +108,101,45,108,111,97,100,105,110,103,80,144,39,54,40,20,15,16,2,11,80, +143,39,55,20,15,16,2,11,80,143,39,56,20,15,16,2,32,0,88,148,39, +41,60,11,2,19,222,33,72,80,144,39,57,40,20,15,16,2,32,0,88,148, +8,36,40,52,11,2,20,222,33,73,80,144,39,58,40,20,15,16,2,11,80, +143,39,59,20,15,16,2,88,149,8,34,40,48,8,240,4,0,16,0,1,21, +112,114,101,112,45,112,108,97,110,101,116,45,114,101,115,111,108,118,101,114,33, +40,224,1,0,33,74,80,144,39,8,28,42,20,15,16,2,88,148,39,40,53, +8,240,0,0,3,0,69,103,101,116,45,100,105,114,223,0,33,75,80,144,39, +8,29,42,20,15,16,2,88,148,39,40,52,8,240,0,0,64,0,74,112,97, +116,104,45,115,115,45,62,114,107,116,223,0,33,76,80,144,39,8,30,42,20, +15,16,2,88,148,8,36,40,48,8,240,0,0,4,0,9,223,0,33,77,80, +144,39,8,31,42,20,15,16,2,88,148,39,40,48,8,240,0,128,0,0,9, +223,0,33,78,80,144,39,8,32,42,20,15,16,2,27,11,20,19,143,39,90, +144,40,10,89,146,40,39,10,20,26,96,2,22,88,148,8,36,41,57,8,32, +9,224,2,1,33,79,88,148,39,42,52,11,9,223,0,33,80,88,148,39,43, +8,32,16,4,8,240,44,240,0,0,8,240,220,241,0,0,40,39,9,224,2, +1,33,96,207,80,144,39,60,40,20,15,16,2,88,148,39,39,48,16,2,8, +134,8,8,176,32,2,23,223,0,33,97,80,144,39,8,25,40,20,15,16,2, +20,28,143,88,148,8,36,39,48,16,2,43,8,144,32,2,24,223,0,33,98, +88,148,8,36,39,48,16,2,43,8,144,32,2,24,223,0,33,99,80,144,39, +8,26,40,96,29,94,2,5,70,35,37,107,101,114,110,101,108,11,29,94,2, +5,71,35,37,109,105,110,45,115,116,120,11,2,7,2,6,9,9,9,39,9, 0}; - EVAL_ONE_SIZED_STR((char *)expr, 19824); + EVAL_ONE_SIZED_STR((char *)expr, 9765); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,54,46,51,46,48,46,49,48,84,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,8,0,23, -0,48,0,65,0,83,0,105,0,128,0,149,0,171,0,180,0,189,0,196,0, -205,0,212,0,0,0,248,1,0,0,3,1,5,105,110,115,112,48,76,35,37, -112,108,97,99,101,45,115,116,114,117,99,116,1,23,115,116,114,117,99,116,58, -84,72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,78,84,72,45,112, -108,97,99,101,45,99,104,97,110,110,101,108,79,84,72,45,112,108,97,99,101, -45,99,104,97,110,110,101,108,63,1,20,84,72,45,112,108,97,99,101,45,99, -104,97,110,110,101,108,45,114,101,102,1,21,84,72,45,112,108,97,99,101,45, -99,104,97,110,110,101,108,45,115,101,116,33,1,19,84,72,45,112,108,97,99, -101,45,99,104,97,110,110,101,108,45,105,110,1,20,84,72,45,112,108,97,99, -101,45,99,104,97,110,110,101,108,45,111,117,116,249,80,143,41,42,23,196,1, -39,249,80,143,41,42,23,196,1,39,249,80,143,41,42,195,39,249,80,143,41, -42,23,196,1,40,249,80,143,41,42,195,40,145,39,9,20,121,145,2,1,39, -16,1,11,16,0,20,27,15,56,9,2,2,2,2,29,11,11,11,11,11,11, -11,9,9,11,11,11,10,48,80,143,39,39,20,121,145,2,1,39,16,7,2, -3,2,4,2,5,2,6,2,7,2,8,2,9,16,0,40,42,39,16,0,39, -16,2,2,6,2,7,41,11,11,11,16,5,2,4,2,8,2,9,2,5,2, -3,16,5,11,11,11,11,11,16,5,2,4,2,8,2,9,2,5,2,3,44, -44,40,12,11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0, -16,0,39,39,16,3,20,15,16,6,253,22,191,10,2,4,11,41,39,11,248, -22,91,249,22,81,22,176,10,88,148,39,40,48,47,9,223,9,33,10,80,144, -39,39,40,80,144,39,40,40,80,144,39,41,40,80,144,39,42,40,80,144,39, -43,40,20,15,16,2,20,28,143,88,148,39,40,48,47,9,223,0,33,11,88, -148,39,40,48,47,9,223,0,33,12,80,144,39,44,40,20,15,16,2,20,28, -143,88,148,39,40,48,47,9,223,0,33,13,88,148,39,40,48,47,9,223,0, -33,14,80,144,39,45,40,93,29,94,67,113,117,111,116,101,70,35,37,107,101, -114,110,101,108,11,9,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 577); - } - { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,54,46,51,46,48,46,49,48,84,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,1,0,0,8,0,15, -0,26,0,53,0,59,0,73,0,86,0,112,0,129,0,151,0,159,0,171,0, -186,0,202,0,220,0,241,0,253,0,13,1,36,1,60,1,72,1,103,1,108, -1,113,1,131,1,137,1,142,1,151,1,156,1,162,1,167,1,171,1,186,1, -193,1,198,1,202,1,207,1,214,1,225,1,232,1,240,1,87,2,122,2,225, -2,4,3,98,3,133,3,227,3,6,4,29,11,59,11,110,11,185,11,201,11, -217,11,231,11,247,11,66,12,82,12,98,12,114,12,189,12,96,13,112,13,187, -13,182,14,62,15,137,15,44,16,57,16,210,16,138,17,181,17,7,18,140,18, -201,18,209,18,220,18,254,19,101,20,129,20,142,20,63,21,70,21,230,21,250, -21,94,22,116,22,126,22,140,22,178,22,21,23,25,23,32,23,238,23,157,32, -210,32,234,32,2,33,0,0,51,37,0,0,3,1,5,105,110,115,112,48,68, -35,37,98,111,111,116,72,100,108,108,45,115,117,102,102,105,120,1,25,100,101, -102,97,117,108,116,45,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108, -101,100,67,113,117,111,116,101,29,94,2,5,70,35,37,112,97,114,97,109,122, -11,29,94,2,5,69,35,37,117,116,105,108,115,11,1,24,45,109,111,100,117, -108,101,45,104,97,115,104,45,116,97,98,108,101,45,116,97,98,108,101,78,114, -101,103,105,115,116,101,114,45,122,111,45,112,97,116,104,1,20,100,101,102,97, -117,108,116,45,114,101,97,100,101,114,45,103,117,97,114,100,69,67,65,67,72, -69,45,78,73,45,112,97,116,104,45,99,97,99,104,101,76,112,97,116,104,45, -99,97,99,104,101,45,103,101,116,77,112,97,116,104,45,99,97,99,104,101,45, -115,101,116,33,79,45,108,111,97,100,105,110,103,45,102,105,108,101,110,97,109, -101,1,19,45,108,111,97,100,105,110,103,45,112,114,111,109,112,116,45,116,97, -103,73,45,112,114,101,118,45,114,101,108,116,111,77,45,112,114,101,118,45,114, -101,108,116,111,45,100,105,114,1,21,115,112,108,105,116,45,114,101,108,97,116, -105,118,101,45,115,116,114,105,110,103,1,22,102,111,114,109,97,116,45,115,111, -117,114,99,101,45,108,111,99,97,116,105,111,110,73,111,114,105,103,45,112,97, -114,97,109,122,1,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,66,98,111,111,116,66,115, -101,97,108,79,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100, -5,4,46,114,107,116,66,115,97,109,101,6,6,6,110,97,116,105,118,101,5, -3,46,122,111,67,105,108,111,111,112,66,108,111,111,112,65,108,105,98,6,12, -12,109,111,100,117,108,101,45,112,97,116,104,63,68,115,117,98,109,111,100,6, -2,2,46,46,6,1,1,46,66,102,105,108,101,68,112,108,97,110,101,116,6, -8,8,109,97,105,110,46,114,107,116,6,4,4,46,114,107,116,69,105,103,110, -111,114,101,100,27,252,22,133,16,28,249,22,170,9,23,201,2,2,27,86,94, -23,199,1,23,200,1,28,248,22,138,16,23,200,2,249,22,133,16,23,202,1, -23,201,1,249,80,144,50,45,42,23,202,1,23,201,1,23,203,1,2,28,247, -22,182,8,249,80,144,50,46,42,23,203,1,80,144,50,39,41,27,250,22,151, -16,196,11,32,0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,81,195, -194,11,249,22,5,20,20,96,88,148,8,36,40,57,8,129,3,9,226,5,4, -3,6,33,42,23,199,1,23,196,1,23,197,1,23,195,1,27,252,22,133,16, -28,249,22,170,9,23,201,2,2,27,86,94,23,199,1,23,200,1,28,248,22, -138,16,23,200,2,249,22,133,16,23,202,1,23,201,1,249,80,144,50,45,42, -23,202,1,23,201,1,23,203,1,2,28,247,22,182,8,249,80,144,50,46,42, -23,203,1,80,144,50,39,41,27,250,22,151,16,196,11,32,0,88,148,8,36, -39,44,11,9,222,11,28,192,249,22,81,195,194,11,249,22,5,20,20,96,88, -148,8,36,40,57,8,129,3,9,226,5,4,3,6,33,44,23,199,1,23,196, -1,23,197,1,23,195,1,27,250,22,133,16,28,249,22,170,9,23,199,2,2, -27,86,94,23,197,1,23,198,1,28,248,22,138,16,23,198,2,249,22,133,16, -23,200,1,23,199,1,249,80,144,48,45,42,23,200,1,23,199,1,23,201,1, -249,80,144,48,46,42,23,201,1,2,29,27,250,22,151,16,196,11,32,0,88, -148,8,36,39,44,11,9,222,11,28,192,249,22,81,195,194,11,249,22,5,20, -20,96,88,148,8,36,40,55,8,128,3,9,226,5,4,3,6,33,46,23,199, -1,23,196,1,23,197,1,23,195,1,27,250,22,133,16,28,249,22,170,9,23, -199,2,2,27,86,94,23,197,1,23,198,1,28,248,22,138,16,23,198,2,249, -22,133,16,23,200,1,23,199,1,249,80,144,48,45,42,23,200,1,23,199,1, -23,201,1,249,80,144,48,46,42,23,201,1,2,29,27,250,22,151,16,196,11, -32,0,88,148,8,36,39,44,11,9,222,11,28,192,249,22,81,195,194,11,249, -22,5,20,20,96,88,148,8,36,40,55,8,128,3,9,226,5,4,3,6,33, -48,23,199,1,23,196,1,23,197,1,23,195,1,86,95,28,248,80,144,40,43, -42,23,195,2,12,250,22,183,11,2,25,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,65,23,196,2,10, -28,248,22,90,23,196,2,28,249,22,131,4,248,22,94,23,198,2,40,28,28, -248,22,65,248,22,82,23,197,2,10,248,22,168,9,248,22,170,20,23,197,2, -249,22,4,22,65,248,22,171,20,23,198,2,11,11,11,10,12,250,22,183,11, -2,25,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,159,2,80,143,44,44,248,22,133, -17,247,22,146,14,11,11,27,28,23,194,2,250,22,159,2,248,22,83,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,42,41,40,250,80,144,45,42,40,249,22,31,11,80,144,47, -41,40,22,129,5,248,22,103,23,197,2,27,248,22,112,23,195,2,20,13,144, -80,144,43,41,40,250,80,144,46,42,40,249,22,31,11,80,144,48,41,40,22, -178,5,28,248,22,179,15,23,197,2,23,196,1,86,94,23,196,1,247,22,157, -16,249,247,22,176,5,248,22,170,20,23,197,1,23,201,1,86,94,23,193,1, -27,28,248,22,140,16,23,199,2,23,198,2,27,247,22,178,5,28,192,249,22, -141,16,23,201,2,194,23,199,2,90,144,42,11,89,146,42,39,11,248,22,136, -16,23,202,1,86,94,23,195,1,90,144,41,11,89,146,41,39,11,28,23,204, -2,27,248,22,184,15,23,198,2,19,248,22,148,8,194,28,28,249,22,133,4, -23,195,4,43,249,22,151,8,2,26,249,22,154,8,197,249,22,185,3,23,199, -4,43,11,249,22,7,23,200,2,248,22,188,15,249,22,155,8,250,22,154,8, -201,39,249,22,185,3,23,203,4,43,5,3,46,115,115,249,22,7,23,200,2, -11,2,249,22,7,23,198,2,11,27,28,249,22,170,9,23,196,2,23,199,2, -23,199,2,249,22,133,16,23,198,2,23,196,2,27,28,23,196,2,28,249,22, -170,9,23,198,2,23,200,1,23,200,1,86,94,23,200,1,249,22,133,16,23, -199,2,23,198,2,86,95,23,200,1,23,198,1,11,27,28,249,22,170,9,23, -200,2,70,114,101,108,97,116,105,118,101,86,94,23,198,1,2,27,23,198,1, -27,247,22,162,16,27,247,22,163,16,27,250,22,151,16,23,201,2,11,32,0, -88,148,8,36,39,44,11,9,222,11,27,28,23,194,2,249,22,81,23,201,2, -23,196,1,86,94,23,194,1,11,27,28,23,199,2,28,23,194,2,11,27,250, -22,151,16,23,203,2,11,32,0,88,148,8,36,39,44,11,9,222,11,28,192, -249,22,81,23,202,2,194,11,11,27,28,23,195,2,23,195,2,23,194,2,27, -28,23,196,2,23,196,2,248,22,168,9,23,196,2,27,28,23,205,2,28,23, -196,2,86,94,23,197,1,23,196,2,248,22,168,9,23,198,1,86,94,23,197, -1,11,27,28,23,195,2,27,249,22,5,88,148,39,40,51,8,129,3,9,226, -24,15,12,11,33,43,23,203,2,27,28,23,198,2,11,193,28,192,192,28,193, -28,23,198,2,28,249,22,133,4,248,22,83,196,248,22,83,23,201,2,193,11, -11,11,11,28,23,193,2,86,105,23,213,1,23,212,1,23,206,1,23,205,1, -23,204,1,23,203,1,23,201,1,23,200,1,23,197,1,23,196,1,23,195,1, -23,194,1,20,13,144,80,144,60,41,40,250,80,144,8,24,42,40,249,22,31, -11,80,144,8,26,41,40,22,129,5,11,20,13,144,80,144,60,41,40,250,80, -144,8,24,42,40,249,22,31,11,80,144,8,26,41,40,22,178,5,28,248,22, -179,15,23,206,2,23,205,1,86,94,23,205,1,247,22,157,16,249,247,22,167, -16,248,22,82,23,196,1,23,218,1,86,94,23,193,1,27,28,23,195,2,27, -249,22,5,88,148,39,40,51,8,129,3,9,226,25,17,13,12,33,45,23,204, -2,27,28,23,200,2,11,193,28,192,192,28,193,28,199,28,249,22,133,4,248, -22,83,196,248,22,83,202,193,11,11,11,86,94,23,198,1,11,28,23,193,2, -86,103,23,214,1,23,213,1,23,207,1,23,206,1,23,205,1,23,202,1,23, -201,1,23,197,1,23,196,1,23,195,1,20,13,144,80,144,61,41,40,250,80, -144,8,25,42,40,249,22,31,11,80,144,8,27,41,40,22,129,5,23,207,1, -20,13,144,80,144,61,41,40,250,80,144,8,25,42,40,249,22,31,11,80,144, -8,27,41,40,22,178,5,28,248,22,179,15,23,207,2,23,206,1,86,94,23, -206,1,247,22,157,16,249,247,22,167,16,248,22,82,23,196,1,23,219,1,86, -94,23,193,1,27,28,23,197,2,27,249,22,5,20,20,94,88,148,39,40,51, -8,128,3,9,226,26,17,14,13,33,47,23,210,1,23,205,2,27,28,23,200, -2,11,193,28,192,192,28,193,28,23,200,2,28,249,22,133,4,248,22,83,196, -248,22,83,23,203,2,193,11,11,11,86,94,23,207,1,11,28,23,193,2,86, -101,23,208,1,23,206,1,23,205,1,23,203,1,23,202,1,23,198,1,23,197, -1,23,196,1,86,94,27,248,22,82,23,195,2,28,23,215,2,250,22,157,2, -248,22,83,23,219,1,23,219,1,250,22,91,23,199,1,11,23,211,2,12,20, -13,144,80,144,8,23,41,40,250,80,144,8,26,42,40,249,22,31,11,80,144, -8,28,41,40,22,129,5,11,20,13,144,80,144,8,23,41,40,250,80,144,8, -26,42,40,249,22,31,11,80,144,8,28,41,40,22,178,5,28,248,22,179,15, -23,208,2,23,207,1,86,94,23,207,1,247,22,157,16,249,247,22,176,5,248, -22,170,20,23,196,1,23,220,1,86,94,23,193,1,27,28,23,197,1,27,249, -22,5,20,20,95,88,148,39,40,51,8,128,3,9,226,27,19,15,14,33,49, -23,207,1,23,212,1,23,206,1,27,28,23,201,2,11,193,28,192,192,28,193, -28,200,28,249,22,133,4,248,22,83,196,248,22,83,203,193,11,11,11,86,97, -23,209,1,23,204,1,23,203,1,23,199,1,11,28,23,193,2,86,95,23,207, -1,23,198,1,86,94,27,248,22,82,23,195,2,28,23,216,2,250,22,157,2, -248,22,83,23,220,1,23,220,1,250,22,91,23,199,1,23,213,2,23,212,2, -12,20,13,144,80,144,8,24,41,40,250,80,144,8,27,42,40,249,22,31,11, -80,144,8,29,41,40,22,129,5,23,209,1,20,13,144,80,144,8,24,41,40, -250,80,144,8,27,42,40,249,22,31,11,80,144,8,29,41,40,22,178,5,28, -248,22,179,15,23,209,2,23,208,1,86,94,23,208,1,247,22,157,16,249,247, -22,176,5,248,22,170,20,23,196,1,23,221,1,86,96,23,216,1,23,215,1, -23,193,1,28,28,248,22,79,23,220,2,248,22,170,20,23,220,2,10,27,28, -23,199,2,86,94,23,207,1,23,208,1,86,94,23,208,1,23,207,1,28,28, -248,22,79,23,221,2,248,22,168,9,248,22,191,15,23,195,2,11,12,20,13, -144,80,144,8,25,41,40,250,80,144,8,28,42,40,249,22,31,11,80,144,8, -30,41,40,22,129,5,28,23,223,2,28,23,202,1,11,23,196,2,86,94,23, -202,1,11,20,13,144,80,144,8,25,41,40,250,80,144,8,28,42,40,249,22, -31,11,80,144,8,30,41,40,22,178,5,28,248,22,179,15,23,210,2,23,209, -1,86,94,23,209,1,247,22,157,16,249,247,22,176,5,23,195,1,23,222,1, -12,28,23,194,2,250,22,157,2,248,22,83,23,198,1,23,196,1,250,22,91, -23,201,1,23,202,1,23,203,1,12,27,249,22,190,8,80,144,42,50,41,249, -22,128,4,248,22,188,3,248,22,174,2,200,8,128,8,27,28,193,248,22,177, -2,194,11,28,192,27,249,22,101,198,195,28,192,248,22,83,193,11,11,27,249, -22,128,4,248,22,188,3,248,22,174,2,23,199,2,8,128,8,27,249,22,190, -8,80,144,43,50,41,23,196,2,250,22,191,8,80,144,44,50,41,23,197,1, -248,22,176,2,249,22,81,249,22,81,23,204,1,23,205,1,27,28,23,200,2, -248,22,177,2,200,11,28,192,192,9,32,54,88,149,8,38,42,54,11,2,30, -39,223,3,33,69,32,55,88,149,8,38,42,53,11,2,30,39,223,3,33,68, -32,56,88,148,8,36,40,53,11,2,31,222,33,67,32,57,88,149,8,38,42, -53,11,2,30,39,223,3,33,58,28,249,22,129,4,23,197,2,23,195,4,248, -22,91,194,28,249,22,137,9,7,47,249,22,158,7,23,198,2,23,199,2,249, -22,81,250,22,176,7,23,199,2,39,23,200,2,248,2,56,249,22,176,7,23, -199,1,248,22,182,3,23,201,1,250,2,57,23,196,4,196,248,22,182,3,198, -32,59,88,149,8,38,42,55,11,2,30,39,223,3,33,66,32,60,88,149,8, -38,42,54,11,2,30,39,223,3,33,63,32,61,88,149,8,38,42,53,11,2, -30,39,223,3,33,62,28,249,22,129,4,23,197,2,23,195,4,248,22,91,194, -28,249,22,137,9,7,47,249,22,158,7,23,198,2,23,199,2,249,22,81,250, -22,176,7,23,199,2,39,23,200,2,248,2,56,249,22,176,7,23,199,1,248, -22,182,3,23,201,1,250,2,61,23,196,4,196,248,22,182,3,198,28,249,22, -129,4,23,197,2,23,195,4,248,22,91,194,28,249,22,137,9,7,47,249,22, -158,7,23,198,2,23,199,2,249,22,81,250,22,176,7,23,199,2,39,23,200, -2,27,249,22,176,7,23,199,1,248,22,182,3,23,201,1,19,248,22,157,7, -23,195,2,250,2,61,23,196,4,23,197,1,39,2,27,248,22,182,3,23,197, -1,28,249,22,129,4,23,195,2,23,196,4,248,22,91,195,28,249,22,137,9, -7,47,249,22,158,7,23,199,2,23,197,2,249,22,81,250,22,176,7,23,200, -2,39,23,198,2,248,2,56,249,22,176,7,23,200,1,248,22,182,3,23,199, -1,250,2,60,23,197,4,197,248,22,182,3,196,32,64,88,149,8,38,42,53, -11,2,30,39,223,3,33,65,28,249,22,129,4,23,197,2,23,195,4,248,22, -91,194,28,249,22,137,9,7,47,249,22,158,7,23,198,2,23,199,2,249,22, -81,250,22,176,7,23,199,2,39,23,200,2,248,2,56,249,22,176,7,23,199, -1,248,22,182,3,23,201,1,250,2,64,23,196,4,196,248,22,182,3,198,28, -249,22,129,4,23,197,2,23,195,4,248,22,91,194,28,249,22,137,9,7,47, -249,22,158,7,23,198,2,23,199,2,249,22,81,250,22,176,7,23,199,2,39, -23,200,2,27,249,22,176,7,23,199,1,248,22,182,3,23,201,1,19,248,22, -157,7,23,195,2,250,2,60,23,196,4,23,197,1,39,2,27,248,22,182,3, -23,197,1,28,249,22,129,4,23,195,2,23,196,4,248,22,91,195,28,249,22, -137,9,7,47,249,22,158,7,23,199,2,23,197,2,249,22,81,250,22,176,7, -23,200,2,39,23,198,2,27,249,22,176,7,23,200,1,248,22,182,3,23,199, -1,19,248,22,157,7,23,195,2,250,2,64,23,196,4,23,197,1,39,2,27, -248,22,182,3,23,195,1,28,249,22,129,4,23,195,2,23,197,4,248,22,91, -196,28,249,22,137,9,7,47,249,22,158,7,23,200,2,23,197,2,249,22,81, -250,22,176,7,23,201,2,39,23,198,2,248,2,56,249,22,176,7,23,201,1, -248,22,182,3,23,199,1,250,2,59,23,198,4,198,248,22,182,3,196,19,248, -22,157,7,23,195,2,28,249,22,129,4,39,23,195,4,248,22,91,194,28,249, -22,137,9,7,47,249,22,158,7,23,198,2,39,249,22,81,250,22,176,7,23, -199,2,39,39,27,249,22,176,7,23,199,1,40,19,248,22,157,7,23,195,2, -250,2,57,23,196,4,23,197,1,39,2,28,249,22,129,4,40,23,195,4,248, -22,91,194,28,249,22,137,9,7,47,249,22,158,7,23,198,2,40,249,22,81, -250,22,176,7,23,199,2,39,40,248,2,56,249,22,176,7,23,199,1,41,250, -2,59,23,196,4,196,41,2,28,249,22,129,4,23,197,2,23,195,4,248,22, -91,194,28,249,22,137,9,7,47,249,22,158,7,23,198,2,23,199,2,249,22, -81,250,22,176,7,23,199,2,39,23,200,2,248,2,56,249,22,176,7,23,199, -1,248,22,182,3,23,201,1,250,2,55,23,196,4,196,248,22,182,3,198,28, -249,22,129,4,23,197,2,23,195,4,248,22,91,194,28,249,22,137,9,7,47, -249,22,158,7,23,198,2,23,199,2,249,22,81,250,22,176,7,23,199,2,39, -23,200,2,27,249,22,176,7,23,199,1,248,22,182,3,23,201,1,19,248,22, -157,7,23,195,2,250,2,55,23,196,4,23,197,1,39,2,27,248,22,182,3, -23,197,1,28,249,22,129,4,23,195,2,23,196,4,248,22,91,195,28,249,22, -137,9,7,47,249,22,158,7,23,199,2,23,197,2,249,22,81,250,22,176,7, -23,200,2,39,23,198,2,248,2,56,249,22,176,7,23,200,1,248,22,182,3, -23,199,1,250,2,54,23,197,4,197,248,22,182,3,196,32,70,88,148,39,40, -58,11,2,31,222,33,71,28,248,22,89,248,22,83,23,195,2,249,22,7,9, -248,22,170,20,23,196,1,90,144,41,11,89,146,41,39,11,27,248,22,171,20, -23,197,2,28,248,22,89,248,22,83,23,195,2,249,22,7,9,248,22,170,20, -195,90,144,41,11,89,146,41,39,11,27,248,22,171,20,196,28,248,22,89,248, -22,83,23,195,2,249,22,7,9,248,22,170,20,195,90,144,41,11,89,146,41, -39,11,248,2,70,248,22,171,20,196,249,22,7,249,22,81,248,22,170,20,199, -196,195,249,22,7,249,22,81,248,22,170,20,199,196,195,249,22,7,249,22,81, -248,22,170,20,23,200,1,23,197,1,23,196,1,27,19,248,22,157,7,23,196, -2,250,2,54,23,196,4,23,198,1,39,2,28,23,195,1,192,28,248,22,89, -248,22,83,23,195,2,249,22,7,9,248,22,170,20,23,196,1,27,248,22,171, -20,23,195,2,90,144,41,11,89,146,41,39,11,28,248,22,89,248,22,83,23, -197,2,249,22,7,9,248,22,170,20,23,198,1,27,248,22,171,20,23,197,2, -90,144,41,11,89,146,41,39,11,28,248,22,89,248,22,83,23,197,2,249,22, -7,9,248,22,170,20,197,90,144,41,11,89,146,41,39,11,248,2,70,248,22, -171,20,198,249,22,7,249,22,81,248,22,170,20,201,196,195,249,22,7,249,22, -81,248,22,170,20,23,203,1,196,195,249,22,7,249,22,81,248,22,170,20,23, -201,1,23,197,1,23,196,1,248,22,145,12,252,22,163,10,248,22,164,4,23, -200,2,248,22,160,4,23,200,2,248,22,161,4,23,200,2,248,22,162,4,23, -200,2,248,22,163,4,23,200,1,28,24,194,2,12,20,13,144,80,144,39,41, -40,80,143,39,59,89,146,40,40,10,249,22,131,5,21,94,2,32,6,19,19, -112,108,97,110,101,116,47,114,101,115,111,108,118,101,114,46,114,107,116,1,27, -112,108,97,110,101,116,45,109,111,100,117,108,101,45,110,97,109,101,45,114,101, -115,111,108,118,101,114,12,27,28,23,195,2,28,249,22,170,9,23,197,2,80, -143,42,55,86,94,23,195,1,80,143,40,56,27,248,22,154,5,23,197,2,27, -28,248,22,79,23,195,2,248,22,170,20,23,195,1,23,194,1,28,248,22,179, -15,23,194,2,90,144,42,11,89,146,42,39,11,248,22,136,16,23,197,1,86, -95,20,18,144,11,80,143,45,55,199,20,18,144,11,80,143,45,56,192,192,11, -86,94,23,195,1,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,157,16,90,144,42,11,89,146,42, -39,11,248,22,136,16,23,198,2,86,95,23,195,1,23,193,1,28,249,22,172, -16,0,11,35,114,120,34,91,46,93,115,115,36,34,248,22,184,15,23,197,1, -249,80,144,44,61,42,23,199,1,2,26,196,249,80,144,41,57,42,195,10,249, -22,12,23,196,1,80,144,41,54,41,86,96,28,248,22,152,5,23,196,2,12, -250,22,183,11,2,22,6,21,21,114,101,115,111,108,118,101,100,45,109,111,100, -117,108,101,45,112,97,116,104,63,23,198,2,28,28,23,196,2,248,22,147,14, -23,197,2,10,12,250,22,183,11,2,22,6,20,20,40,111,114,47,99,32,35, -102,32,110,97,109,101,115,112,97,99,101,63,41,23,199,2,28,24,193,2,248, -24,194,1,23,196,2,86,94,23,193,1,12,27,250,22,159,2,80,144,44,44, -41,248,22,133,17,247,22,146,14,11,27,28,23,194,2,23,194,1,86,94,23, -194,1,27,249,22,81,247,22,139,2,247,22,139,2,86,94,250,22,157,2,80, -144,46,44,41,248,22,133,17,247,22,146,14,195,192,86,94,250,22,157,2,248, -22,82,23,197,2,23,200,2,70,100,101,99,108,97,114,101,100,28,23,198,2, -27,28,248,22,79,248,22,154,5,23,200,2,248,22,153,5,248,22,82,248,22, -154,5,23,201,1,23,198,1,27,250,22,159,2,80,144,47,44,41,248,22,133, -17,23,204,1,11,28,23,193,2,27,250,22,159,2,248,22,83,23,198,1,23, -198,2,11,28,23,193,2,250,22,157,2,248,22,171,20,23,200,1,23,198,1, -23,196,1,12,12,12,86,94,251,22,140,12,247,22,144,12,67,101,114,114,111, -114,6,69,69,100,101,102,97,117,108,116,32,109,111,100,117,108,101,32,110,97, -109,101,32,114,101,115,111,108,118,101,114,32,99,97,108,108,101,100,32,119,105, -116,104,32,116,104,114,101,101,32,97,114,103,117,109,101,110,116,115,32,40,100, -101,112,114,101,99,97,116,101,100,41,11,251,24,197,1,23,198,1,23,199,1, -23,200,1,10,32,81,88,148,39,41,50,11,78,102,108,97,116,116,101,110,45, -115,117,98,45,112,97,116,104,222,33,84,32,82,88,148,39,43,57,11,2,31, -222,33,83,28,248,22,89,23,197,2,28,248,22,89,195,192,249,22,81,194,248, -22,96,197,28,249,22,172,9,248,22,82,23,199,2,2,35,28,248,22,89,23, -196,2,86,95,23,196,1,23,195,1,250,22,179,11,2,22,6,37,37,116,111, -111,32,109,97,110,121,32,34,46,46,34,115,32,105,110,32,115,117,98,109,111, -100,117,108,101,32,112,97,116,104,58,32,126,46,115,250,22,92,2,34,28,249, -22,172,9,23,201,2,2,36,23,199,1,28,248,22,179,15,23,200,2,23,199, -1,249,22,91,28,248,22,65,23,202,2,2,5,2,37,23,201,1,23,200,1, -251,2,82,196,197,248,22,83,199,248,22,171,20,200,251,2,82,196,197,249,22, -81,248,22,170,20,202,200,248,22,171,20,200,251,2,82,196,197,9,197,27,250, -22,177,7,27,28,23,199,2,28,247,22,132,12,248,80,144,47,58,42,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,183,16,0,7,35,114,120,34,92,110,34,23,203,1,249,22,138,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,175,13,28,23,196,2,251,22,183,12,23, -198,1,247,22,27,248,22,91,23,201,1,23,199,1,86,94,23,196,1,250,22, -146,13,23,197,1,247,22,27,23,198,1,32,86,88,148,8,36,40,53,11,69, -115,115,45,62,114,107,116,222,33,87,19,248,22,157,7,194,28,249,22,133,4, -23,195,4,42,28,249,22,170,9,7,46,249,22,158,7,197,249,22,185,3,23, -199,4,42,28,28,249,22,170,9,7,115,249,22,158,7,197,249,22,185,3,23, -199,4,41,249,22,170,9,7,115,249,22,158,7,197,249,22,185,3,23,199,4, -40,11,249,22,177,7,250,22,176,7,198,39,249,22,185,3,23,200,4,42,2, -40,193,193,193,2,28,249,22,160,7,194,2,36,2,27,28,249,22,160,7,194, -2,35,64,117,112,192,0,8,35,114,120,34,91,46,93,34,32,90,88,148,8, -36,40,50,11,2,31,222,33,91,28,248,22,89,23,194,2,9,250,22,92,6, -4,4,10,32,32,32,248,22,183,15,248,22,104,23,198,2,248,2,90,248,22, -171,20,23,198,1,28,249,22,172,9,248,22,83,23,200,2,23,197,1,28,249, -22,170,9,248,22,170,20,23,200,1,23,196,1,251,22,179,11,2,22,6,41, -41,99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,10,32,32,97, -116,32,112,97,116,104,58,32,126,97,10,32,32,112,97,116,104,115,58,126,97, -23,200,1,249,22,1,22,177,7,248,2,90,248,22,96,23,201,1,12,12,247, -23,193,1,250,22,158,4,11,196,195,20,13,144,80,144,49,53,41,249,22,81, -249,22,81,23,198,1,23,202,1,23,195,1,20,13,144,80,144,49,41,40,252, -80,144,54,42,40,249,22,31,11,80,144,56,41,40,22,128,5,23,201,2,22, -130,5,248,28,23,208,2,20,20,94,88,148,8,36,40,49,11,9,223,15,33, -94,23,208,1,86,94,23,208,1,22,7,28,248,22,65,23,207,2,23,206,1, -28,28,248,22,79,23,207,2,249,22,170,9,248,22,170,20,23,209,2,2,32, -11,23,206,1,86,94,23,206,1,28,248,22,152,5,23,203,2,27,248,22,154, -5,23,204,2,28,248,22,65,193,249,22,91,2,5,194,192,23,202,2,249,247, -22,177,5,23,201,1,27,248,22,69,248,22,183,15,23,202,1,28,23,204,2, -28,250,22,159,2,248,22,170,20,23,202,1,23,202,1,11,249,22,81,11,205, -249,22,81,194,205,192,86,96,28,248,22,162,5,23,196,2,12,28,248,22,156, -4,23,198,2,250,22,181,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,183,11,2,22,2,33,23,198,2,28, -28,23,196,2,248,22,152,5,23,197,2,10,12,250,22,183,11,2,22,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, -156,4,23,198,2,10,12,250,22,183,11,2,22,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,79,23, -196,2,249,22,170,9,248,22,170,20,23,198,2,2,5,11,86,97,23,198,1, -23,197,1,23,196,1,23,193,1,248,22,153,5,248,22,103,23,197,1,28,28, -248,22,79,23,196,2,28,249,22,170,9,248,22,170,20,23,198,2,2,34,28, -248,22,79,248,22,103,23,197,2,249,22,170,9,248,22,107,23,198,2,2,5, -11,11,11,86,97,23,198,1,23,197,1,23,196,1,23,193,1,248,22,153,5, -249,2,81,248,22,120,23,199,2,248,22,105,23,199,1,28,28,248,22,79,23, -196,2,28,249,22,170,9,248,22,170,20,23,198,2,2,34,28,28,249,22,172, -9,248,22,103,23,198,2,2,36,10,249,22,172,9,248,22,103,23,198,2,2, -35,28,23,196,2,27,248,22,154,5,23,198,2,28,248,22,65,193,10,28,248, -22,79,193,248,22,65,248,22,170,20,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,81, -28,248,22,79,23,197,2,248,22,170,20,23,197,2,23,196,2,27,28,249,22, -172,9,248,22,103,23,203,2,2,35,248,22,171,20,200,248,22,105,200,28,248, -22,79,23,198,2,249,22,95,248,22,171,20,199,194,192,28,28,248,22,79,23, -196,2,249,22,170,9,248,22,170,20,23,198,2,2,38,11,86,94,248,80,144, -41,8,28,42,23,194,2,253,24,199,1,23,201,1,23,202,1,23,203,1,23, -204,1,11,80,143,46,59,28,28,248,22,79,23,196,2,28,249,22,170,9,248, -22,170,20,23,198,2,2,34,28,248,22,79,248,22,103,23,197,2,249,22,170, -9,248,22,107,23,198,2,2,38,11,11,11,86,94,248,80,144,41,8,28,42, -23,194,2,253,24,199,1,248,22,103,23,202,2,23,202,1,23,203,1,23,204, -1,248,22,105,23,202,1,80,143,46,59,86,94,23,193,1,27,88,148,8,36, -40,57,8,240,0,0,8,0,1,19,115,104,111,119,45,99,111,108,108,101,99, -116,105,111,110,45,101,114,114,225,2,5,3,33,85,27,28,248,22,79,23,198, -2,28,249,22,170,9,2,34,248,22,170,20,23,200,2,27,248,22,103,23,199, -2,28,28,249,22,172,9,23,195,2,2,36,10,249,22,172,9,23,195,2,2, -35,86,94,23,193,1,28,23,199,2,27,248,22,154,5,23,201,2,28,248,22, -79,193,248,22,170,20,193,192,250,22,179,11,2,22,6,45,45,110,111,32,98, -97,115,101,32,112,97,116,104,32,102,111,114,32,114,101,108,97,116,105,118,101, -32,115,117,98,109,111,100,117,108,101,32,112,97,116,104,58,32,126,46,115,23, -201,2,192,23,197,2,23,197,2,27,28,248,22,79,23,199,2,28,249,22,170, -9,2,34,248,22,170,20,23,201,2,27,28,28,28,249,22,172,9,248,22,103, -23,202,2,2,36,10,249,22,172,9,248,22,103,23,202,2,2,35,23,200,2, -11,27,248,22,154,5,23,202,2,27,28,249,22,172,9,248,22,103,23,204,2, -2,35,248,22,171,20,23,202,1,248,22,105,23,202,1,28,248,22,79,23,195, -2,249,2,81,248,22,170,20,23,197,2,249,22,95,248,22,171,20,23,199,1, -23,197,1,249,2,81,23,196,1,23,195,1,249,2,81,2,36,28,249,22,172, -9,248,22,103,23,204,2,2,35,248,22,171,20,23,202,1,248,22,105,23,202, -1,28,248,22,79,193,248,22,171,20,193,11,86,94,23,198,1,11,86,94,23, -198,1,11,27,28,248,22,65,23,196,2,27,248,80,144,46,51,42,249,22,81, -23,199,2,248,22,133,17,247,22,146,14,28,23,193,2,192,86,94,23,193,1, -90,144,41,11,89,146,41,39,11,249,80,144,49,57,42,248,22,72,23,201,2, -11,27,28,248,22,89,23,195,2,2,39,249,22,177,7,23,197,2,2,40,252, -80,144,53,8,23,42,23,205,1,28,248,22,89,23,200,2,23,200,1,86,94, -23,200,1,248,22,82,23,200,2,28,248,22,89,23,200,2,86,94,23,199,1, -9,248,22,83,23,200,1,23,198,1,10,28,248,22,154,7,23,196,2,86,94, -23,196,1,27,248,80,144,46,8,29,42,23,202,2,27,248,80,144,47,51,42, -249,22,81,23,200,2,23,197,2,28,23,193,2,192,86,94,23,193,1,90,144, -41,11,89,146,41,39,11,249,80,144,50,57,42,23,201,2,11,28,248,22,89, -23,194,2,86,94,23,193,1,249,22,133,16,23,198,1,248,2,86,23,197,1, -250,22,1,22,133,16,23,199,1,249,22,95,249,22,2,32,0,88,148,8,36, -40,47,11,9,222,33,88,23,200,1,248,22,91,248,2,86,23,201,1,28,248, -22,179,15,23,196,2,86,94,23,196,1,248,80,144,45,8,30,42,248,22,143, -16,28,248,22,140,16,23,198,2,23,197,2,249,22,141,16,23,199,2,248,80, -144,49,8,29,42,23,205,2,28,249,22,170,9,248,22,82,23,198,2,2,32, -27,248,80,144,46,51,42,249,22,81,23,199,2,248,22,133,17,247,22,146,14, -28,23,193,2,192,86,94,23,193,1,90,144,41,11,89,146,41,39,11,249,80, -144,49,57,42,248,22,103,23,201,2,11,27,28,248,22,89,248,22,105,23,201, -2,28,248,22,89,23,195,2,249,22,176,16,2,89,23,197,2,11,10,27,28, -23,194,2,248,2,86,23,197,2,28,248,22,89,23,196,2,2,39,28,249,22, -176,16,2,89,23,198,2,248,2,86,23,197,2,249,22,177,7,23,198,2,2, -40,27,28,23,195,1,86,94,23,197,1,249,22,95,28,248,22,89,248,22,105, -23,205,2,21,93,6,5,5,109,122,108,105,98,249,22,1,22,95,249,22,2, -80,144,56,8,31,42,248,22,105,23,208,2,23,198,1,28,248,22,89,23,197, -2,86,94,23,196,1,248,22,91,23,198,1,86,94,23,197,1,23,196,1,252, -80,144,55,8,23,42,23,207,1,248,22,82,23,199,2,248,22,171,20,23,199, -1,23,199,1,10,86,94,23,196,1,28,249,22,170,9,248,22,170,20,23,198, -2,2,37,248,80,144,45,8,30,42,248,22,143,16,249,22,141,16,248,22,145, -16,248,22,103,23,201,2,248,80,144,49,8,29,42,23,205,2,12,86,94,28, -28,248,22,179,15,23,194,2,10,248,22,185,8,23,194,2,12,28,23,201,2, -250,22,181,11,69,114,101,113,117,105,114,101,249,22,138,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, -82,23,199,2,6,0,0,23,204,2,250,22,183,11,2,22,2,33,23,198,2, -27,28,248,22,185,8,23,195,2,249,22,190,8,23,196,2,39,249,22,143,16, -248,22,144,16,23,197,2,11,27,28,248,22,185,8,23,196,2,249,22,190,8, -23,197,2,40,248,80,144,47,8,24,42,23,195,2,90,144,42,11,89,146,42, -39,11,28,248,22,185,8,23,199,2,250,22,7,2,41,249,22,190,8,23,203, -2,41,2,41,248,22,136,16,23,198,2,86,95,23,195,1,23,193,1,27,28, -248,22,185,8,23,200,2,249,22,190,8,23,201,2,42,249,80,144,52,61,42, -23,197,2,5,0,27,28,248,22,185,8,23,201,2,249,22,190,8,23,202,2, -43,248,22,153,5,23,200,2,27,250,22,159,2,80,144,55,44,41,248,22,133, -17,247,22,146,14,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,249, -22,81,247,22,139,2,247,22,139,2,86,94,250,22,157,2,80,144,57,44,41, -248,22,133,17,247,22,146,14,195,192,27,28,23,204,2,248,22,153,5,249,22, -81,248,22,154,5,23,200,2,23,207,2,23,196,2,86,95,28,23,212,2,28, -250,22,159,2,248,22,82,23,198,2,195,11,86,96,23,211,1,23,204,1,23, -194,1,12,27,251,22,31,11,80,144,59,53,41,9,28,248,22,15,80,144,60, -54,41,80,144,59,54,41,247,22,17,27,248,22,133,17,247,22,146,14,86,94, -249,22,3,88,148,8,36,40,57,11,9,226,13,12,2,3,33,92,23,196,2, -248,28,248,22,15,80,144,58,54,41,32,0,88,148,39,40,45,11,9,222,33, -93,80,144,57,8,32,42,20,20,98,88,148,39,39,8,25,8,240,12,64,0, -0,9,233,18,21,14,15,12,11,7,6,4,1,2,33,95,23,195,1,23,194, -1,23,197,1,23,207,1,23,214,1,86,96,23,211,1,23,204,1,23,194,1, -12,28,28,248,22,185,8,23,204,1,86,94,23,212,1,11,28,23,212,1,28, -248,22,154,7,23,206,2,10,28,248,22,65,23,206,2,10,28,248,22,79,23, -206,2,249,22,170,9,248,22,170,20,23,208,2,2,32,11,11,249,80,144,56, -52,42,28,248,22,154,7,23,208,2,249,22,81,23,209,1,248,80,144,59,8, -29,42,23,215,1,86,94,23,212,1,249,22,81,23,209,1,248,22,133,17,247, -22,146,14,252,22,187,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,39,59,248,80,144,40,8,27,40,249, -22,31,11,80,144,42,41,40,248,22,191,4,80,144,40,60,41,248,22,177,5, -80,144,40,40,42,248,22,145,15,80,144,40,48,42,20,18,144,11,80,143,39, -59,248,80,144,40,8,27,40,249,22,31,11,80,144,42,41,40,20,18,144,11, -80,143,39,59,248,80,144,40,8,27,40,249,22,31,11,80,144,42,41,40,145, -39,9,20,121,145,2,1,39,16,1,11,16,0,20,27,15,56,9,2,2,2, -2,29,11,11,11,11,11,11,11,9,9,11,11,11,10,41,80,143,39,39,20, -121,145,2,1,44,16,28,2,3,2,4,30,2,6,1,20,112,97,114,97,109, -101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,11,6,30,2,6,1, -23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116, -105,111,110,11,4,30,2,7,74,112,97,116,104,45,115,116,114,105,110,103,63, -42,196,15,2,8,30,2,7,73,114,101,114,111,111,116,45,112,97,116,104,44, -196,16,30,2,7,77,112,97,116,104,45,97,100,100,45,115,117,102,102,105,120, -44,196,12,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17, -2,18,2,19,2,20,2,21,2,22,30,2,7,1,19,112,97,116,104,45,114, -101,112,108,97,99,101,45,115,117,102,102,105,120,44,196,14,30,2,7,75,102, -105,110,100,45,99,111,108,45,102,105,108,101,49,196,4,30,2,7,78,110,111, -114,109,97,108,45,99,97,115,101,45,112,97,116,104,42,196,11,2,23,2,24, -30,2,6,76,114,101,112,97,114,97,109,101,116,101,114,105,122,101,11,7,16, -0,40,42,39,16,0,39,16,16,2,15,2,16,2,8,2,12,2,17,2,18, -2,11,2,4,2,10,2,3,2,20,2,13,2,14,2,9,2,19,2,22,55, -11,11,11,16,3,2,23,2,21,2,24,16,3,11,11,11,16,3,2,23,2, -21,2,24,42,42,40,12,11,11,16,0,16,0,16,0,39,39,11,12,11,11, -16,0,16,0,16,0,39,39,16,24,20,15,16,2,248,22,181,8,71,115,111, -45,115,117,102,102,105,120,80,144,39,39,40,20,15,16,2,88,148,39,41,8, -39,8,189,3,2,4,223,0,33,50,80,144,39,40,40,20,15,16,2,32,0, -88,148,8,36,44,55,11,2,9,222,33,51,80,144,39,47,40,20,15,16,2, -20,28,143,32,0,88,148,8,36,40,45,11,2,10,222,192,32,0,88,148,8, -36,40,45,11,2,10,222,192,80,144,39,48,40,20,15,16,2,247,22,142,2, -80,144,39,44,40,20,15,16,2,8,128,8,80,144,39,49,40,20,15,16,2, -249,22,186,8,8,128,8,11,80,144,39,50,40,20,15,16,2,88,148,8,36, -40,53,8,128,32,2,13,223,0,33,52,80,144,39,51,40,20,15,16,2,88, -148,8,36,41,57,8,128,32,2,14,223,0,33,53,80,144,39,52,40,20,15, -16,2,247,22,77,80,144,39,53,40,20,15,16,2,248,22,16,76,109,111,100, -117,108,101,45,108,111,97,100,105,110,103,80,144,39,54,40,20,15,16,2,11, -80,143,39,55,20,15,16,2,11,80,143,39,56,20,15,16,2,32,0,88,148, -39,41,60,11,2,19,222,33,72,80,144,39,57,40,20,15,16,2,32,0,88, -148,8,36,40,52,11,2,20,222,33,73,80,144,39,58,40,20,15,16,2,11, -80,143,39,59,20,15,16,2,88,149,8,34,40,48,8,240,4,0,16,0,1, -21,112,114,101,112,45,112,108,97,110,101,116,45,114,101,115,111,108,118,101,114, -33,40,224,1,0,33,74,80,144,39,8,28,42,20,15,16,2,88,148,39,40, -53,8,240,0,0,3,0,69,103,101,116,45,100,105,114,223,0,33,75,80,144, -39,8,29,42,20,15,16,2,88,148,39,40,52,8,240,0,0,64,0,74,112, -97,116,104,45,115,115,45,62,114,107,116,223,0,33,76,80,144,39,8,30,42, -20,15,16,2,88,148,8,36,40,48,8,240,0,0,4,0,9,223,0,33,77, -80,144,39,8,31,42,20,15,16,2,88,148,39,40,48,8,240,0,128,0,0, -9,223,0,33,78,80,144,39,8,32,42,20,15,16,2,27,11,20,19,143,39, -90,144,40,10,89,146,40,39,10,20,26,96,2,22,88,148,8,36,41,57,8, -32,9,224,2,1,33,79,88,148,39,42,52,11,9,223,0,33,80,88,148,39, -43,8,32,16,4,8,240,44,240,0,0,8,240,220,241,0,0,40,39,9,224, -2,1,33,96,207,80,144,39,60,40,20,15,16,2,88,148,39,39,48,16,2, -8,134,8,8,176,32,2,23,223,0,33,97,80,144,39,8,25,40,20,15,16, -2,20,28,143,88,148,8,36,39,48,16,2,43,8,144,32,2,24,223,0,33, -98,88,148,8,36,39,48,16,2,43,8,144,32,2,24,223,0,33,99,80,144, -39,8,26,40,96,29,94,2,5,70,35,37,107,101,114,110,101,108,11,29,94, -2,5,71,35,37,109,105,110,45,115,116,120,11,2,7,2,6,9,9,9,39, -9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 9766); - } - { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,54,46,51,46,48,46,49,48,84,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,1,0,0,8,0,18, -0,24,0,38,0,52,0,64,0,84,0,98,0,113,0,126,0,131,0,135,0, -147,0,231,0,238,0,8,1,0,0,199,1,0,0,3,1,5,105,110,115,112, -48,71,35,37,98,117,105,108,116,105,110,67,113,117,111,116,101,29,94,2,3, -70,35,37,107,101,114,110,101,108,11,29,94,2,3,70,35,37,101,120,112,111, -98,115,11,29,94,2,3,68,35,37,98,111,111,116,11,29,94,2,3,76,35, -37,112,108,97,99,101,45,115,116,114,117,99,116,11,29,94,2,3,70,35,37, -112,97,114,97,109,122,11,29,94,2,3,71,35,37,110,101,116,119,111,114,107, -11,29,94,2,3,69,35,37,117,116,105,108,115,11,38,11,93,2,12,36,12, -0,39,38,13,93,143,16,3,39,2,14,2,2,39,36,14,1,150,40,143,2, -15,16,4,2,4,39,39,2,1,143,2,15,16,4,2,5,39,39,2,1,143, -2,15,16,4,2,6,39,39,2,1,143,2,15,16,4,2,7,39,39,2,1, -143,2,15,16,4,2,8,39,39,2,1,143,2,15,16,4,2,9,39,39,2, -1,143,2,15,16,4,2,10,39,39,2,1,16,0,38,15,143,2,14,2,11, -18,143,16,2,143,10,16,3,9,2,11,2,13,143,11,16,3,9,9,2,13, -16,3,9,9,9,145,39,9,20,121,145,2,1,39,16,1,11,16,0,20,27, -15,56,9,2,2,2,2,29,11,11,11,11,11,11,11,9,9,11,11,11,33, -16,39,80,143,39,39,20,121,145,2,1,39,16,0,16,0,40,42,39,16,0, -39,16,0,39,11,11,11,16,0,16,0,16,0,39,39,40,12,11,11,16,0, -16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,0,104, -2,4,2,5,29,94,2,3,71,35,37,102,111,114,101,105,103,110,11,29,94, -2,3,70,35,37,117,110,115,97,102,101,11,29,94,2,3,71,35,37,102,108, -102,120,110,117,109,11,2,6,2,7,2,8,2,9,2,10,29,94,2,3,69, -35,37,112,108,97,99,101,11,29,94,2,3,71,35,37,102,117,116,117,114,101, -115,11,9,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 532); + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,17,0,0,0,1,0,0,8,0,18,0, +24,0,38,0,52,0,64,0,84,0,98,0,113,0,126,0,131,0,135,0,147, +0,231,0,238,0,8,1,0,0,199,1,0,0,3,1,5,105,110,115,112,48, +71,35,37,98,117,105,108,116,105,110,67,113,117,111,116,101,29,94,2,3,70, +35,37,107,101,114,110,101,108,11,29,94,2,3,70,35,37,101,120,112,111,98, +115,11,29,94,2,3,68,35,37,98,111,111,116,11,29,94,2,3,76,35,37, +112,108,97,99,101,45,115,116,114,117,99,116,11,29,94,2,3,70,35,37,112, +97,114,97,109,122,11,29,94,2,3,71,35,37,110,101,116,119,111,114,107,11, +29,94,2,3,69,35,37,117,116,105,108,115,11,38,11,93,2,12,36,12,0, +39,38,13,93,143,16,3,39,2,14,2,2,39,36,14,1,150,40,143,2,15, +16,4,2,4,39,39,2,1,143,2,15,16,4,2,5,39,39,2,1,143,2, +15,16,4,2,6,39,39,2,1,143,2,15,16,4,2,7,39,39,2,1,143, +2,15,16,4,2,8,39,39,2,1,143,2,15,16,4,2,9,39,39,2,1, +143,2,15,16,4,2,10,39,39,2,1,16,0,38,15,143,2,14,2,11,18, +143,16,2,143,10,16,3,9,2,11,2,13,143,11,16,3,9,9,2,13,16, +3,9,9,9,145,39,9,20,121,145,2,1,39,16,1,11,16,0,20,27,15, +56,9,2,2,2,2,29,11,11,11,11,11,11,11,9,9,11,11,11,33,16, +39,80,143,39,39,20,121,145,2,1,39,16,0,16,0,40,42,39,16,0,39, +16,0,39,11,11,11,16,0,16,0,16,0,39,39,40,12,11,11,16,0,16, +0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,0,104,2, +4,2,5,29,94,2,3,71,35,37,102,111,114,101,105,103,110,11,29,94,2, +3,70,35,37,117,110,115,97,102,101,11,29,94,2,3,71,35,37,102,108,102, +120,110,117,109,11,2,6,2,7,2,8,2,9,2,10,29,94,2,3,69,35, +37,112,108,97,99,101,11,29,94,2,3,71,35,37,102,117,116,117,114,101,115, +11,9,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 531); } diff --git a/racket/src/racket/src/fun.c b/racket/src/racket/src/fun.c index 889cc2008e..abbcf8e0d5 100644 --- a/racket/src/racket/src/fun.c +++ b/racket/src/racket/src/fun.c @@ -182,12 +182,15 @@ static Scheme_Object *procedure_to_method(int argc, Scheme_Object *argv[]); static Scheme_Object *procedure_equal_closure_p(int argc, Scheme_Object *argv[]); static Scheme_Object *procedure_specialize(int argc, Scheme_Object *argv[]); static Scheme_Object *chaperone_procedure(int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_chaperone_procedure(int argc, Scheme_Object *argv[]); static Scheme_Object *impersonate_procedure(int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_impersonate_procedure(int argc, Scheme_Object *argv[]); static Scheme_Object *chaperone_procedure_star(int argc, Scheme_Object *argv[]); static Scheme_Object *impersonate_procedure_star(int argc, Scheme_Object *argv[]); static Scheme_Object *primitive_p(int argc, Scheme_Object *argv[]); static Scheme_Object *primitive_closure_p(int argc, Scheme_Object *argv[]); static Scheme_Object *primitive_result_arity (int argc, Scheme_Object *argv[]); +static Scheme_Object *procedure_result_arity (int argc, Scheme_Object *argv[]); static Scheme_Object *call_with_values(int argc, Scheme_Object *argv[]); Scheme_Object *scheme_values(int argc, Scheme_Object *argv[]); static Scheme_Object *current_print(int argc, Scheme_Object **argv); @@ -641,6 +644,12 @@ scheme_init_fun (Scheme_Env *env) 1, 1, 1), env); + scheme_add_global_constant("procedure-result-arity", + scheme_make_folding_prim(procedure_result_arity, + "procedure-result-arity", + 1, 1, 1), + env); + scheme_add_global_constant("current-print", scheme_register_parameter(current_print, "current-print", @@ -744,6 +753,17 @@ scheme_init_unsafe_fun (Scheme_Env *env) o = scheme_make_prim_w_arity(chaperone_unsafe_undefined, "chaperone-struct-unsafe-undefined", 1, 1); scheme_add_global_constant("chaperone-struct-unsafe-undefined", o, env); + + scheme_add_global_constant("unsafe-chaperone-procedure", + scheme_make_prim_w_arity(unsafe_chaperone_procedure, + "unsafe-chaperone-procedure", + 2, -1), + env); + scheme_add_global_constant("unsafe-impersonate-procedure", + scheme_make_prim_w_arity(unsafe_impersonate_procedure, + "unsafe-impersonate-procedure", + 2, -1), + env); } void @@ -2873,13 +2893,61 @@ static Scheme_Object *primitive_result_arity(int argc, Scheme_Object *argv[]) return scheme_make_arity(p->minr, p->maxr); } } else { - scheme_wrong_contract("primitive-result_arity", "primitive?", 0, argc, argv); + scheme_wrong_contract("primitive-result-arity", "primitive?", 0, argc, argv); return NULL; } - return scheme_make_integer(1); } +static Scheme_Object *procedure_result_arity(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o, *orig_o; + + orig_o = argv[0]; + o = orig_o; + + if (SCHEME_CHAPERONEP(o)) + o = SCHEME_CHAPERONE_VAL(o); + + /* Struct procedures could be keyword-accepting and that + requires additional complication; defer for now */ + if (SAME_TYPE(SCHEME_TYPE(o), scheme_proc_struct_type)) { + return scheme_false; + } + + if (SAME_TYPE(SCHEME_TYPE(o), scheme_closure_type)) { + if ((SCHEME_CLOSURE_DATA_FLAGS(SCHEME_COMPILED_CLOS_CODE(o)) & CLOS_SINGLE_RESULT)) { + return scheme_make_integer(1); + } +#ifdef MZ_USE_JIT + } else if (SAME_TYPE(SCHEME_TYPE(o), scheme_native_closure_type)) { + if (scheme_native_closure_is_single_result(o)) + return scheme_make_integer(1); +#endif + } else if (SAME_TYPE(SCHEME_TYPE(o), scheme_case_closure_type)) { + Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)o; + int i; + + for (i = cl->count; i--; ) { + if (!(SCHEME_CLOSURE_DATA_FLAGS(SCHEME_COMPILED_CLOS_CODE(cl->array[i])) & CLOS_SINGLE_RESULT)) + break; + } + + if (i < 0) + return scheme_make_integer(1); + } else if (SCHEME_PRIMP(o)) { + if (((Scheme_Primitive_Proc *)o)->pp.flags & SCHEME_PRIM_IS_MULTI_RESULT) { + Scheme_Prim_W_Result_Arity *p = (Scheme_Prim_W_Result_Arity *)o; + return scheme_make_arity(p->minr, p->maxr); + } + return scheme_make_integer(1); + } else if (!SCHEME_PROCP(o)) { + scheme_wrong_contract("procedure-result-arity", "procedure?", 0, argc, argv); + return NULL; + } + return scheme_false; +} + Scheme_Object *scheme_object_name(Scheme_Object *a) { Scheme_Object *v; @@ -3465,9 +3533,9 @@ static Scheme_Object *procedure_specialize(int argc, Scheme_Object *argv[]) static Scheme_Object *do_chaperone_procedure(const char *name, const char *whating, int is_impersonator, int pass_self, - int argc, Scheme_Object *argv[]) + int argc, Scheme_Object *argv[], int is_unsafe) { - Scheme_Chaperone *px; + Scheme_Chaperone *px, *px2; Scheme_Object *val = argv[0], *orig, *naya, *r, *app_mark; Scheme_Hash_Tree *props; @@ -3476,8 +3544,13 @@ static Scheme_Object *do_chaperone_procedure(const char *name, const char *whati if (!SCHEME_PROCP(val)) scheme_wrong_contract(name, "procedure?", 0, argc, argv); - if (!SCHEME_FALSEP(argv[1]) && !SCHEME_PROCP(argv[1])) - scheme_wrong_contract(name, "(or/c procedure? #f)", 1, argc, argv); + if (is_unsafe) { + if (!SCHEME_PROCP(argv[1])) + scheme_wrong_contract(name, "procedure?", 1, argc, argv); + } else { + if (!SCHEME_FALSEP(argv[1]) && !SCHEME_PROCP(argv[1])) + scheme_wrong_contract(name, "(or/c procedure? #f)", 1, argc, argv); + } orig = get_or_check_arity(val, -1, NULL, 1); if (SCHEME_FALSEP(argv[1])) @@ -3524,42 +3597,79 @@ static Scheme_Object *do_chaperone_procedure(const char *name, const char *whati px->props = props; /* Put the procedure along with known-good arity (to speed checking; - initialized to -1) in a vector. An odd-sized vector makes the - chaperone recognized as a procedure chaperone, and a size of 5 - (instead of 3) indicates that the wrapper procedure accepts a - "self" argument: */ + initialized to -1) in a vector. + + Vector of odd size for redirects means a procedure chaperone, + vector with even slots means a structure chaperone. + A size of 5 (instead of 3) indicates that the wrapper + procedure accepts a "self" argument. An immutable vector + means that it wraps a chaperone that wants the "self" + argument. + + If the known-good arity is #f, this means the chaperone + wrapper defers directly to SCHEME_VEC_ELES(r)[0] and no + arity check is needed. + */ r = scheme_make_vector((pass_self ? 5 : 3), scheme_make_integer(-1)); - SCHEME_VEC_ELS(r)[0] = argv[1]; + + if (SCHEME_FALSEP(argv[1])) + SCHEME_VEC_ELS(r)[0] = argv[0]; + else + SCHEME_VEC_ELS(r)[0] = argv[1]; + if (SCHEME_FALSEP(argv[1])) + SCHEME_VEC_ELS(r)[1] = scheme_false; SCHEME_VEC_ELS(r)[2] = app_mark; - /* Vector of odd size for redirects means a procedure chaperone, - vector with even slots means a structure chaperone. */ px->redirects = r; if (is_impersonator) SCHEME_CHAPERONE_FLAGS(px) |= SCHEME_CHAPERONE_IS_IMPERSONATOR; + if (is_unsafe || SCHEME_FALSEP(argv[1])) + SCHEME_CHAPERONE_FLAGS(px) |= SCHEME_PROC_CHAPERONE_CALL_DIRECT; + + /* If there's a `pass_self` chaperone in px->prev, then we'll need + to pass the self proc along. */ + for (val = px->prev; SCHEME_P_CHAPERONEP(val); val = ((Scheme_Chaperone *)val)->prev) { + px2 = (Scheme_Chaperone *)val; + if (SCHEME_VECTORP(px2->redirects) && (SCHEME_VEC_SIZE(px2->redirects) & 0x1)) { + if ((SCHEME_VEC_SIZE(px2->redirects) > 3) + || SCHEME_IMMUTABLEP(px2->redirects)) + SCHEME_SET_IMMUTABLE(px->redirects); + break; + } + } return (Scheme_Object *)px; } static Scheme_Object *chaperone_procedure(int argc, Scheme_Object *argv[]) { - return do_chaperone_procedure("chaperone-procedure", "chaperoning", 0, 0, argc, argv); + return do_chaperone_procedure("chaperone-procedure", "chaperoning", 0, 0, argc, argv, 0); +} + +static Scheme_Object *unsafe_chaperone_procedure(int argc, Scheme_Object *argv[]) +{ + return do_chaperone_procedure("unsafe-chaperone-procedure", "chaperoning", 0, 0, argc, argv, 1); } static Scheme_Object *impersonate_procedure(int argc, Scheme_Object *argv[]) { - return do_chaperone_procedure("impersonate-procedure", "impersonating", 1, 0, argc, argv); + return do_chaperone_procedure("impersonate-procedure", "impersonating", 1, 0, argc, argv, 0); +} + +static Scheme_Object *unsafe_impersonate_procedure(int argc, Scheme_Object *argv[]) +{ + return do_chaperone_procedure("unsafe-impersonate-procedure", "impersonating", 1, 0, argc, argv, 1); } static Scheme_Object *chaperone_procedure_star(int argc, Scheme_Object *argv[]) { - return do_chaperone_procedure("chaperone-procedure*", "chaperoning", 0, 1, argc, argv); + return do_chaperone_procedure("chaperone-procedure*", "chaperoning", 0, 1, argc, argv, 0); } static Scheme_Object *impersonate_procedure_star(int argc, Scheme_Object *argv[]) { - return do_chaperone_procedure("impersonate-procedure*", "impersonating", 1, 1, argc, argv); + return do_chaperone_procedure("impersonate-procedure*", "impersonating", 1, 1, argc, argv, 0); } static Scheme_Object *apply_chaperone_k(void) @@ -3741,7 +3851,7 @@ Scheme_Object *scheme_apply_chaperone(Scheme_Object *o, int argc, Scheme_Object checks & 0x2 => no tail; checks == 0x3 => no tail or multiple */ { Scheme_Chaperone *px; - Scheme_Object *v, *a[1], *a2[MAX_QUICK_CHAP_ARGV], **argv2, *post, *result_v, *orig_obj, *app_mark, *self_proc; + Scheme_Object *v, *a[1], *a2[MAX_QUICK_CHAP_ARGV], **argv2, *post, *result_v, *orig_obj, *app_mark, *self_proc, *simple_call; int c, i, need_restore = 0; int need_pop_mark; Scheme_Cont_Frame_Data cframe; @@ -3767,9 +3877,28 @@ Scheme_Object *scheme_apply_chaperone(Scheme_Object *o, int argc, Scheme_Object self_proc = o; } - if (SCHEME_FALSEP(SCHEME_VEC_ELS(px->redirects)[0])) { + /* Ensure that the original procedure accepts `argc' arguments: */ + if (!SCHEME_FALSEP(SCHEME_VEC_ELS(px->redirects)[1]) /* check not needed for props-only mode */ + && (argc != SCHEME_INT_VAL(SCHEME_VEC_ELS(px->redirects)[1]))) { + a[0] = px->prev; + if (!scheme_check_proc_arity(NULL, argc, 0, 0, a)) { + /* Apply the original procedure, in case the chaperone would accept + `argc' arguments (in addition to the original procedure's arity) + in case the methodness of the original procedure is different + from the chaperone, or in case the procedures have different names. */ + (void)_scheme_apply_multi(px->prev, argc, argv); + scheme_signal_error("internal error: unexpected success applying chaperoned/proxied procedure"); + return NULL; + } + /* record that argc is ok, on the grounds that the function is likely + to be applied to argc arguments again */ + SCHEME_VEC_ELS(px->redirects)[1] = scheme_make_integer(argc); + } + + if (SCHEME_CHAPERONE_FLAGS(px) & SCHEME_PROC_CHAPERONE_CALL_DIRECT) { + simple_call = SCHEME_VEC_ELS(px->redirects)[0]; /* no redirection procedure */ - if (SCHEME_CHAPERONEP(px->prev)) { + if (SCHEME_IMMUTABLEP(px->redirects)) { /* communicate `self_proc` to the next layer: */ scheme_current_thread->self_for_proc_chaperone = self_proc; } @@ -3777,16 +3906,16 @@ Scheme_Object *scheme_apply_chaperone(Scheme_Object *o, int argc, Scheme_Object /* cannot return a tail call */ MZ_CONT_MARK_POS -= 2; if (checks & 0x1) { - v = _scheme_apply(px->prev, argc, argv); - } else if (SAME_TYPE(SCHEME_TYPE(px->prev), scheme_native_closure_type)) { - v = _apply_native(px->prev, argc, argv); + v = _scheme_apply(simple_call, argc, argv); + } else if (SAME_TYPE(SCHEME_TYPE(simple_call), scheme_native_closure_type)) { + v = _apply_native(simple_call, argc, argv); } else { - v = _scheme_apply_multi(px->prev, argc, argv); + v = _scheme_apply_multi(simple_call, argc, argv); } MZ_CONT_MARK_POS += 2; return v; } else - return _scheme_tail_apply(px->prev, argc, argv); + return _scheme_tail_apply(simple_call, argc, argv); } if (argv == MZ_RUNSTACK) { @@ -3804,23 +3933,6 @@ Scheme_Object *scheme_apply_chaperone(Scheme_Object *o, int argc, Scheme_Object } } - /* Ensure that the original procedure accepts `argc' arguments: */ - if (argc != SCHEME_INT_VAL(SCHEME_VEC_ELS(px->redirects)[1])) { - a[0] = px->prev; - if (!scheme_check_proc_arity(NULL, argc, 0, 0, a)) { - /* Apply the original procedure, in case the chaperone would accept - `argc' arguments (in addition to the original procedure's arity) - in case the methodness of the original procedure is different - from the chaperone, or in case the procedures have different names. */ - (void)_scheme_apply_multi(px->prev, argc, argv); - scheme_signal_error("internal error: unexpected success applying chaperoned/proxied procedure"); - return NULL; - } - /* record that argc is ok, on the grounds that the function is likely - to be applied to argc arguments again */ - SCHEME_VEC_ELS(px->redirects)[1] = scheme_make_integer(argc); - } - app_mark = SCHEME_VEC_ELS(px->redirects)[2]; if (SCHEME_FALSEP(app_mark)) app_mark = NULL; @@ -3940,7 +4052,7 @@ Scheme_Object *scheme_apply_chaperone(Scheme_Object *o, int argc, Scheme_Object /* No filter for the result, so tail call: */ if (app_mark) scheme_set_cont_mark(SCHEME_CAR(app_mark), SCHEME_CDR(app_mark)); - if (SCHEME_CHAPERONEP(px->prev)) { + if (SCHEME_IMMUTABLEP(px->redirects)) { /* commuincate `self_proc` to the next layer: */ scheme_current_thread->self_for_proc_chaperone = self_proc; } @@ -3982,7 +4094,7 @@ Scheme_Object *scheme_apply_chaperone(Scheme_Object *o, int argc, Scheme_Object if (need_pop_mark) MZ_CONT_MARK_POS -= 2; - if (SCHEME_CHAPERONEP(px->prev)) { + if (SCHEME_IMMUTABLEP(px->redirects)) { /* commuincate `self_proc` to the next layer: */ scheme_current_thread->self_for_proc_chaperone = self_proc; } diff --git a/racket/src/racket/src/jit.c b/racket/src/racket/src/jit.c index 8282905d7d..bfae0ff5ce 100644 --- a/racket/src/racket/src/jit.c +++ b/racket/src/racket/src/jit.c @@ -453,8 +453,33 @@ Scheme_Object *scheme_extract_global(Scheme_Object *o, Scheme_Native_Closure *nc return globs->a[pos]; } +static Scheme_Object *extract_syntax(Scheme_Quote_Syntax *qs, Scheme_Native_Closure *nc) +{ + /* GLOBAL ASSUMPTION: we assume that globals are the last thing + in the closure; grep for "GLOBAL ASSUMPTION" in fun.c. */ + Scheme_Prefix *globs; + int i, pos; + Scheme_Object *v; + + globs = (Scheme_Prefix *)nc->vals[nc->code->u2.orig_code->closure_size - 1]; + + i = qs->position; + pos = qs->midpoint; + + v = globs->a[i+pos+1]; + if (!v) { + v = globs->a[pos]; + v = scheme_delayed_shift((Scheme_Object **)v, i); + globs->a[i+pos+1] = v; + } + + return v; +} + static Scheme_Object *extract_closure_local(int pos, mz_jit_state *jitter, int get_constant) { + if (PAST_LIMIT()) return NULL; + if (pos >= jitter->self_pos - jitter->self_to_closure_delta) { pos -= (jitter->self_pos - jitter->self_to_closure_delta); if (pos < jitter->nc->code->u2.orig_code->closure_size) { @@ -490,6 +515,8 @@ Scheme_Object *scheme_specialize_to_constant(Scheme_Object *obj, mz_jit_state *j { Scheme_Object *c; + if (PAST_LIMIT()) return obj; + if (SCHEME_NATIVE_CLOSURE_DATA_FLAGS(jitter->nc->code) & NATIVE_SPECIALIZED) { if (SAME_TYPE(SCHEME_TYPE(obj), scheme_local_type)) { c = scheme_extract_closure_local(obj, jitter, extra_push, 1); @@ -928,17 +955,21 @@ int scheme_needs_only_target_register(Scheme_Object *obj, int and_can_reorder) return (t >= _scheme_compiled_values_types_); } +int scheme_native_closure_is_single_result(Scheme_Object *rator) +{ + Scheme_Native_Closure *nc = (Scheme_Native_Closure *)rator; + if (nc->code->start_code == scheme_on_demand_jit_code) + return (SCHEME_CLOSURE_DATA_FLAGS(nc->code->u2.orig_code) & CLOS_SINGLE_RESULT); + else + return (SCHEME_NATIVE_CLOSURE_DATA_FLAGS(nc->code) & NATIVE_IS_SINGLE_RESULT); +} + static int produces_single_value(Scheme_Object *rator, int num_args, mz_jit_state *jitter) { rator = scheme_specialize_to_constant(rator, jitter, num_args); - if (SAME_TYPE(SCHEME_TYPE(rator), scheme_native_closure_type)) { - Scheme_Native_Closure *nc = (Scheme_Native_Closure *)rator; - if (nc->code->start_code == scheme_on_demand_jit_code) - return (SCHEME_CLOSURE_DATA_FLAGS(nc->code->u2.orig_code) & CLOS_SINGLE_RESULT); - else - return (SCHEME_NATIVE_CLOSURE_DATA_FLAGS(nc->code) & NATIVE_IS_SINGLE_RESULT); - } + if (SAME_TYPE(SCHEME_TYPE(rator), scheme_native_closure_type)) + return scheme_native_closure_is_single_result(rator); if (SCHEME_PRIMP(rator)) { int opt; @@ -3273,14 +3304,21 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w mz_rs_sync(); - jit_movi_i(JIT_R0, WORDS_TO_BYTES(c)); - jit_movi_i(JIT_R1, (int)(intptr_t)&(((Scheme_Prefix *)0x0)->a[i + p + 1])); - jit_movi_i(JIT_R2, (int)(intptr_t)&(((Scheme_Prefix *)0x0)->a[p])); - (void)jit_calli(sjc.quote_syntax_code); + if (SCHEME_NATIVE_CLOSURE_DATA_FLAGS(jitter->nc->code) & NATIVE_SPECIALIZED) { + Scheme_Object *stx; + stx = extract_syntax(qs, jitter->nc); + scheme_mz_load_retained(jitter, target, stx); + CHECK_LIMIT(); + } else { + jit_movi_i(JIT_R0, WORDS_TO_BYTES(c)); + jit_movi_i(JIT_R1, (int)(intptr_t)&(((Scheme_Prefix *)0x0)->a[i + p + 1])); + jit_movi_i(JIT_R2, (int)(intptr_t)&(((Scheme_Prefix *)0x0)->a[p])); + (void)jit_calli(sjc.quote_syntax_code); + CHECK_LIMIT(); - CHECK_LIMIT(); - if (target != JIT_R0) - jit_movr_p(target, JIT_R0); + if (target != JIT_R0) + jit_movr_p(target, JIT_R0); + } } END_JIT_DATA(10); @@ -4278,7 +4316,7 @@ static void generate_case_lambda(Scheme_Case_Lambda *c, Scheme_Native_Closure_Da Generate_Case_Dispatch_Data gdata; Scheme_Closure_Data *data; Scheme_Object *o; - int i, cnt, num_params, has_rest; + int i, cnt, num_params, has_rest, single_result = 1; mzshort *arities; gdata.c = c; @@ -4302,6 +4340,8 @@ static void generate_case_lambda(Scheme_Case_Lambda *c, Scheme_Native_Closure_Da has_rest = ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) ? 1 : 0); if (has_rest && num_params) --num_params; + if (!(SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_SINGLE_RESULT)) + single_result = 0; if (!has_rest) arities[i] = num_params; @@ -4309,6 +4349,9 @@ static void generate_case_lambda(Scheme_Case_Lambda *c, Scheme_Native_Closure_Da arities[i] = -(num_params+1); } ndata->u.arities = arities; + + if (single_result) + SCHEME_NATIVE_CLOSURE_DATA_FLAGS(ndata) |= NATIVE_IS_SINGLE_RESULT; } /*========================================================================*/ diff --git a/racket/src/racket/src/jitcall.c b/racket/src/racket/src/jitcall.c index ffeabfd26c..66fcd11fe2 100644 --- a/racket/src/racket/src/jitcall.c +++ b/racket/src/racket/src/jitcall.c @@ -65,13 +65,24 @@ static Scheme_Object *clear_runstack(Scheme_Object **rs, intptr_t amt, Scheme_Ob static jit_insn *generate_proc_struct_retry(mz_jit_state *jitter, int num_rands, GC_CAN_IGNORE jit_insn *refagain) { - GC_CAN_IGNORE jit_insn *ref2, *refz1, *refz2, *refz3, *refz4, *refz5; - GC_CAN_IGNORE jit_insn *refz6, *refz7, *refz8; + GC_CAN_IGNORE jit_insn *ref2, *ref3, *refz1, *refz2, *refz3, *refz4, *refz5; + GC_CAN_IGNORE jit_insn *refz6, *refz7, *refz8, *refz9, *ref9, *ref10; ref2 = jit_bnei_i(jit_forward(), JIT_R1, scheme_proc_struct_type); + + /* This is an applicable struct. But if it's for reducing arity, + then we can't just apply the struct's procedure. */ jit_ldxi_p(JIT_R1, JIT_V1, &((Scheme_Structure *)0x0)->stype); jit_ldi_p(JIT_R2, &scheme_reduced_procedure_struct); - refz3 = jit_beqr_p(jit_forward(), JIT_R1, JIT_R2); + ref3 = jit_bner_p(jit_forward(), JIT_R1, JIT_R2); + + /* Matches reduced arity in a simple way? */ + jit_ldxi_p(JIT_R2, JIT_V1, &((Scheme_Structure *)0x0)->slots[1]); + refz3 = jit_bnei_p(jit_forward(), JIT_R2, scheme_make_integer(num_rands)); + + mz_patch_branch(ref3); + /* It's an applicable struct that is not an arity reduce or the + arity matches. We can extract the procedure if it's in a field: */ jit_ldxi_p(JIT_R1, JIT_R1, &((Scheme_Struct_Type *)0x0)->proc_attr); refz1 = jit_bmci_i(jit_forward(), JIT_R1, 0x1); CHECK_LIMIT(); @@ -81,6 +92,7 @@ static jit_insn *generate_proc_struct_retry(mz_jit_state *jitter, int num_rands, jit_lshi_ul(JIT_R1, JIT_R1, JIT_LOG_WORD_SIZE); jit_addi_p(JIT_R1, JIT_R1, &((Scheme_Structure *)0x0)->slots); jit_ldxr_p(JIT_R1, JIT_V1, JIT_R1); + CHECK_LIMIT(); /* JIT_R1 now has the wrapped procedure */ refz4 = jit_bmsi_i(jit_forward(), JIT_R1, 0x1); @@ -111,17 +123,43 @@ static jit_insn *generate_proc_struct_retry(mz_jit_state *jitter, int num_rands, CHECK_LIMIT(); mz_patch_branch(ref2); - /* check for a procedure impersonator that just keeps properties */ + /* check for a procedure impersonator that just keeps properties + or is the result of unsafe-{impersonate,chaperone}-procedure */ ref2 = jit_bnei_i(jit_forward(), JIT_R1, scheme_proc_chaperone_type); jit_ldxi_p(JIT_R1, JIT_V1, &((Scheme_Chaperone *)0x0)->redirects); refz6 = mz_bnei_t(jit_forward(), JIT_R1, scheme_vector_type, JIT_R2); (void)jit_ldxi_l(JIT_R2, JIT_R1, &SCHEME_VEC_SIZE(0x0)); refz7 = jit_bmci_i(jit_forward(), JIT_R2, 0x1); - (void)jit_ldxi_l(JIT_R2, JIT_R1, &(SCHEME_VEC_ELS(0x0)[0])); - refz8 = jit_bnei_p(jit_forward(), JIT_R2, scheme_false); - /* Can extract the impersonated function and use it directly */ - jit_ldxi_p(JIT_V1, JIT_V1, &((Scheme_Chaperone *)0x0)->prev); + /* Flag is set for a property-only or unsafe chaperone: */ + jit_ldxi_s(JIT_R2, JIT_V1, &SCHEME_CHAPERONE_FLAGS(((Scheme_Chaperone *)0x0))); + refz8 = jit_bmci_ul(jit_forward(), JIT_R2, SCHEME_PROC_CHAPERONE_CALL_DIRECT); + /* In the case of an unsafe chaperone, we can only make a direct + call if the arity-check will succeed, otherwise the error message + will use the wrong name. */ + jit_ldxi_p(JIT_R2, JIT_R1, &(SCHEME_VEC_ELS(0x0)[1])); + ref9 = jit_beqi_p(jit_forward(), JIT_R2, scheme_false); + refz9 = jit_bnei_p(jit_forward(), JIT_R2, scheme_make_integer(num_rands)); + mz_patch_branch(ref9); + CHECK_LIMIT(); + /* If the vector is immutable, we need to provide the self proc, + if it's not provided already. The self proc is supplied through + a side channel in the thread record. */ + jit_ldxi_s(JIT_R2, JIT_R1, &MZ_OPT_HASH_KEY((Scheme_Inclhash_Object *)(0x0))); + ref9 = jit_bmci_i(jit_forward(), JIT_R2, 0x1); + (void)mz_tl_ldi_p(JIT_R2, tl_scheme_current_thread); + jit_ldxi_l(JIT_R1, JIT_R2, &((Scheme_Thread *)0x0)->self_for_proc_chaperone); + ref10 = jit_bnei_p(jit_forward(), JIT_R1, NULL); + jit_stxi_l(&((Scheme_Thread *)0x0)->self_for_proc_chaperone, JIT_R2, JIT_V1); + mz_patch_branch(ref10); + jit_ldxi_p(JIT_R1, JIT_V1, &((Scheme_Chaperone *)0x0)->redirects); + mz_patch_branch(ref9); + /* Position [0] in SCHEME_VEC_ELS contains either the + unwrapped function (if chaperone-procedure got #f + for the proc argument) or the unsafe-chaperone + replacement-proc argument; either way, just call it */ + jit_ldxi_p(JIT_V1, JIT_R1, &(SCHEME_VEC_ELS(0x0)[0])); (void)jit_jmpi(refagain); + CHECK_LIMIT(); mz_patch_branch(refz1); mz_patch_branch(refz2); @@ -131,6 +169,7 @@ static jit_insn *generate_proc_struct_retry(mz_jit_state *jitter, int num_rands, mz_patch_branch(refz6); mz_patch_branch(refz7); mz_patch_branch(refz8); + mz_patch_branch(refz9); return ref2; } diff --git a/racket/src/racket/src/schminc.h b/racket/src/racket/src/schminc.h index 2c50dd4b5c..fdbd084952 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 1141 -#define EXPECTED_UNSAFE_COUNT 106 +#define EXPECTED_PRIM_COUNT 1142 +#define EXPECTED_UNSAFE_COUNT 108 #define EXPECTED_FLFXNUM_COUNT 69 #define EXPECTED_EXTFL_COUNT 45 #define EXPECTED_FUTURES_COUNT 15 diff --git a/racket/src/racket/src/schnapp.inc b/racket/src/racket/src/schnapp.inc index c0d1e7f26e..2f9cc44d9e 100644 --- a/racket/src/racket/src/schnapp.inc +++ b/racket/src/racket/src/schnapp.inc @@ -62,10 +62,17 @@ Scheme_Object *PRIM_APPLY_NAME(Scheme_Object *rator, if ((t == scheme_proc_chaperone_type) && SCHEME_VECTORP(((Scheme_Chaperone *)rator)->redirects) - && (SCHEME_VEC_SIZE(((Scheme_Chaperone *)rator)->redirects) & 0x1)) { - if (SCHEME_FALSEP(SCHEME_VEC_ELS(((Scheme_Chaperone *)rator)->redirects)[0])) { - /* No redirection proc (i.e, chaperone is just for properties) */ - rator = ((Scheme_Chaperone *)rator)->prev; + && (SCHEME_VEC_SIZE(((Scheme_Chaperone *)rator)->redirects) & 0x1) + && (SCHEME_CHAPERONE_FLAGS((Scheme_Chaperone *)rator) == SCHEME_PROC_CHAPERONE_CALL_DIRECT)) { + if (SCHEME_FALSEP(SCHEME_VEC_ELS(((Scheme_Chaperone *)rator)->redirects)[1]) + || SCHEME_INT_VAL(SCHEME_VEC_ELS(((Scheme_Chaperone *)rator)->redirects)[1]) == argc) { + /* No redirection proc, i.e, chaperone is just for + properties or produced by unsafe-chaperone-procedure result -- and in the + latter case, the arity is right. */ + GC_CAN_IGNORE Scheme_Thread *p = scheme_current_thread; + if (SCHEME_IMMUTABLEP(((Scheme_Chaperone *)rator)->redirects) && !p->self_for_proc_chaperone) + p->self_for_proc_chaperone = rator; + rator = SCHEME_VEC_ELS(((Scheme_Chaperone *)rator)->redirects)[0]; t = _SCHEME_TYPE(rator); } else return scheme_apply_chaperone(rator, argc, argv, NULL, PRIM_CHECK_MULTI | (PRIM_CHECK_VALUE << 1)); diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index 22aa6fa1e9..a567e89c9f 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -1063,6 +1063,7 @@ typedef struct Scheme_Chaperone { #define SCHEME_CHAPERONE_FLAGS(c) MZ_OPT_HASH_KEY(&(c)->iso) #define SCHEME_CHAPERONE_IS_IMPERSONATOR 0x1 +#define SCHEME_PROC_CHAPERONE_CALL_DIRECT 0x2 #define SCHEME_CHAPERONE_VAL(obj) (((Scheme_Chaperone *)obj)->val) @@ -3332,6 +3333,7 @@ int scheme_check_structure_shape(Scheme_Object *e, Scheme_Object *expected); int scheme_decode_struct_shape(Scheme_Object *shape, intptr_t *_v); int scheme_closure_preserves_marks(Scheme_Object *p); int scheme_native_closure_preserves_marks(Scheme_Object *p); +int scheme_native_closure_is_single_result(Scheme_Object *rator); int scheme_is_env_variable_boxed(Scheme_Comp_Env *env, int which); diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index 9e553a66fd..267d5f8c17 100644 --- a/racket/src/racket/src/schvers.h +++ b/racket/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "6.4.0.1" +#define MZSCHEME_VERSION "6.4.0.4" #define MZSCHEME_VERSION_X 6 #define MZSCHEME_VERSION_Y 4 #define MZSCHEME_VERSION_Z 0 -#define MZSCHEME_VERSION_W 1 +#define MZSCHEME_VERSION_W 4 #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 979d9238ee..f05f09a7d6 100644 --- a/racket/src/racket/src/struct.c +++ b/racket/src/racket/src/struct.c @@ -2428,9 +2428,9 @@ int scheme_is_noninterposing_chaperone(Scheme_Object *o) if (SCHEME_VEC_SIZE(px->redirects) & 1) { /* procedure chaperone */ - if (SCHEME_TRUEP(SCHEME_VEC_ELS(px->redirects)[0])) - return 0; - return 1; + if (SCHEME_FALSEP(SCHEME_VEC_ELS(px->redirects)[1])) + return 1; + return 0; } if (SCHEME_TRUEP(SCHEME_VEC_ELS(px->redirects)[0]))