packages feed

MicroHs (empty) → 0.8

raw patch · 158 files changed

+29208/−0 lines, 158 filesdep +basedep +containersdep +deepseq

Dependencies added: base, containers, deepseq, directory, ghc-prim, mtl, pretty, process, time

Files

+ Example.hs view
@@ -0,0 +1,13 @@+module Example(main) where+import Prelude++fac :: Int -> Int+fac 0 = 1+fac n = n * fac(n - 1)++main :: IO ()+main = do+  let+    rs = map fac [1,2,3,10]+  putStrLn "Some factorials"+  print rs
+ LICENSE view
@@ -0,0 +1,13 @@+Copyright 2023 Lennart Augustsson++Licensed under the Apache License, Version 2.0 (the "License");+you may not use this file except in compliance with the License.+You may obtain a copy of the License at++     http://www.apache.org/licenses/LICENSE-2.0++Unless required by applicable law or agreed to in writing, software+distributed under the License is distributed on an "AS IS" BASIS,+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+See the License for the specific language governing permissions and+limitations under the License.
+ Makefile view
@@ -0,0 +1,109 @@+# installation prefix+PREFIX=/usr/local+#+CCWARNS= -Wall -Wno-deprecated-declarations+CCOPTS= -O3+CCLIBS= -lm+CCEVAL= $(CC) $(CCWARNS) $(CCOPTS) src/runtime/eval.c $(CCLIBS)+#+GHC= ghc+GHCINCS= -ighc -isrc+GHCWARNS= -Wall -Wno-unrecognised-warning-flags -Wno-x-partial+GHCOPTS= -O+GHCEXTS= -XScopedTypeVariables -XPatternGuards -XTupleSections -XTypeSynonymInstances -XFlexibleInstances+GHCPKGS= #-package mtl -package pretty -package temporary -package process+GHCTOOL= -F -pgmF Tools/convertX.sh+GHCOUTDIR= ghc-out+GHCOUT= -outputdir $(GHCOUTDIR)+GHCPROF= # -prof -fprof-late #-prof -fprof-auto+GHCFLAGS= $(GHCEXTS) $(GHCINCS) $(GHCWARNS) $(GHCOPTS) $(GHCTOOL) $(GHCPKGS) $(GHCOUT) $(GHCPROF)+#+.PHONY:	clean bootstrap install ghcgen newmhs cacheprelude++all:	bin/gmhs++newmhs:	ghcgen+	$(CCEVAL) generated/mhs.c -o bin/mhs+	$(CC) $(CCWARNS) -g src/runtime/eval.c $(CCLIBS) generated/mhs.c -o bin/mhsgdb++# Compile mhs from distribution, with C compiler+bin/mhs:	src/runtime/eval.c src/runtime/config*.h #generated/mhs.c+	@mkdir -p bin+	$(CCEVAL) generated/mhs.c -o bin/mhs++# Compile combinator evaluator+bin/mhseval:	src/runtime/eval.c src/runtime/config*.h src/runtime/comb.c+	@mkdir -p bin+	$(CCEVAL) src/runtime/comb.c -o bin/mhseval++# Compile mhs with ghc+bin/gmhs:	src/*/*.hs Tools/convertX.sh+	@mkdir -p bin+	$(GHC) $(GHCFLAGS) src/MicroHs/Main.hs -main-is MicroHs.Main -o bin/gmhs++# Generate distribution C file+generated/mhs.c:	bin/mhs src/*/*.hs+	@mkdir -p generated+	bin/mhs -ilib -isrc MicroHs.Main -ogenerated/mhs.c++# Make sure boottrapping works+bootstrap:	bin/mhs-stage2+	@echo "*** copy stage2 to bin/mhs"+	cp bin/mhs-stage2 bin/mhs+	cp generated/mhs-stage2.c generated/mhs.c ++ghcgen:	bin/gmhs src/*/*.hs lib/*.hs lib/*/*.hs lib/*/*/*.hs+	bin/gmhs -ilib -isrc MicroHs.Main -ogenerated/mhs.c++# Build stage1 compiler with existing compiler+bin/mhs-stage1:	bin/mhs src/*/*.hs+	@mkdir -p generated+	@echo "*** Build stage1 compiler, using bin/mhs"+	bin/mhs -ilib -isrc MicroHs.Main -ogenerated/mhs-stage1.c+	$(CCEVAL) generated/mhs-stage1.c -o bin/mhs-stage1++# Build stage2 compiler with stage1 compiler, and compare+bin/mhs-stage2:	bin/mhs-stage1 src/*/*.hs+	@mkdir -p generated+	@echo "*** Build stage2 compiler, with stage1 compiler"+	bin/mhs-stage1 -ilib -isrc MicroHs.Main -ogenerated/mhs-stage2.c+	cmp generated/mhs-stage1.c generated/mhs-stage2.c+	@echo "*** stage2 equal to stage1"+	$(CCEVAL) generated/mhs-stage2.c -o bin/mhs-stage2++# Run test examples with ghc-compiled compiler+runtest:	bin/mhseval bin/gmhs tests/*.hs+	cd tests; make alltest++# Compress the binary (broken on MacOS)+bin/umhs: bin/mhs+	rm -f bin/umhs+	upx -q -q -obin/umhs bin/mhs++#+cacheprelude:+	@mkdir -p cache+	bin/mhs -c Prelude -ocache/Prelude.comb++#+clean:+	rm -rf src/*/*.hi src/*/*.o *.comb *.tmp *~ bin/* a.out $(GHCOUTDIR) tmp/* Tools/*.o Tools/*.hi dist-newstyle generated/*-stage* cache+	cd tests; make clean++install:+	mkdir -p $(PREFIX)/bin+	cp bin/mhs $(PREFIX)/bin+	mkdir -p $(PREFIX)/lib/mhs/src/runtime+	cp -r lib $(PREFIX)/lib/mhs+	cp src/runtime/* $(PREFIX)/lib/mhs/src/runtime+	@echo "***"+	@echo "*** Installation complete"+	@echo "*** Set environment variable MHSDIR to $(PREFIX)/lib/mhs"+	@echo "***"++everytest:	runtest bootcombtest++bootcombtest:	bin/gmhs bin/mhseval+	bin/gmhs -ilib -isrc -ogmhs.comb  MicroHs.Main+	bin/mhseval +RTS -v -rgmhs.comb -RTS -ilib -isrc -omhs.comb MicroHs.Main+	cmp gmhs.comb mhs.comb
+ MicroHs.cabal view
@@ -0,0 +1,72 @@+cabal-version:       3.0+name:                MicroHs+version:             0.8+synopsis:            A compiler for a subset of Haskell+license:             Apache-2.0+license-file:        LICENSE+copyright:           2023 Lennart Augustsson+category:            language+author:              lennart@augustsson.net+maintainer:          lennart@augustsson.net+stability:           experimental+description:         A compiler for a subset of Haskell.+                     The compiler translates to combinators and can compile itself.+build-type:          Simple++extra-source-files:+      LICENSE+      Example.hs+      Makefile+      README.md+      Tools/convertX.sh+      Tools/Addcombs.hs+      Tools/Compress.hs+      generated/mhs.c+      ghc/**/*.hs+      lib/**/*.hs+      src/runtime/eval.c+      src/runtime/*.h+      tests/Makefile+      tests/*.hs+      tests/*.ref++source-repository head+    type:     git+    location: https://github.com/augustss/MicroHs++executable mhs+  default-language:    Haskell98+  hs-source-dirs:      src ghc+  ghc-options:         -Wall -Wno-unrecognised-warning-flags -Wno-x-partial -F -pgmF ./Tools/convertX.sh -main-is MicroHs.Main+  main-is:             MicroHs/Main.hs+  default-extensions:  ScopedTypeVariables PatternGuards TupleSections TypeSynonymInstances FlexibleInstances+  other-modules:       MicroHs.Compile+                       MicroHs.Desugar+                       MicroHs.Exp+                       MicroHs.Expr+                       MicroHs.Graph+                       MicroHs.Ident+                       MicroHs.IdentMap+                       MicroHs.Interactive+                       MicroHs.Lex+                       MicroHs.MakeCArray+                       MicroHs.Parse+                       MicroHs.StateIO+                       MicroHs.TCMonad+                       MicroHs.Translate+                       MicroHs.TypeCheck+                       Text.ParserComb+                       System.Console.SimpleReadline+                       Control.Alternative+                       Data.Double+                       Compat+                       PrimTable+  build-depends:       base         >= 4.10 && < 4.20,+                       containers   >= 0.5 && < 0.8,+                       deepseq      >= 1.1 && < 1.6,+                       ghc-prim     >= 0.5 && < 0.12,+                       mtl          >= 2.0 && < 2.4,+                       time         >= 1.1 && < 1.15,+                       pretty       >= 1.0 && < 1.2,+                       process      >= 1.6 && < 1.8,+                       directory    >= 1.2 && < 1.5
+ README.md view
@@ -0,0 +1,250 @@+# Micro Haskell+This directory contains an implementation of a small subset of Haskell.+It uses combinators for the runtime execution.++The compiler can compile itself.++## Compiling MicroHs+There are two different ways to compile MicroHs+* Using GHC with standard `Prelude` and libraries. `Makefile` target `bin/gmhs`+* Using the included combinator file and runtime.  `Makefile` target `bin/mhs`++These different ways of compiling need slightly different imports etc.+To accomodate this each source file is preprocessed for the first target.+When compiling with GHC the string `--X` is removed from the source file.+This way anything special needed with GHC is just treated as comments by mhs.++Compiling MicroHs is really best done using `make`, but there is also a `MicroHs.cabal` file+for use with `cabal`.  This only builds what corresponds to the first target.++Also note that there is no need to have a Haskell compiler to run MicroHs.+All you need is a C compiler, and MicroHs can bootstrap, given the included combinator file.++To install `mhs` use `make install`.  You also need to set the environment variable `MHSDIR`.++## Language+The language is an extended subset of Haskell-98.++Differences:+ * Top level definitions must have a type signature.+ * Type variables need an explicit `forall`.+ * Type variables without a kind annotation are assumed to have kind `Type`.+ * There is no prefix negation.+ * There is no `Read` class.+ * There is no deriving.+ * The `Prelude` has to be imported explicitly.+ * Polymorphic types are never inferred; use a type signature if you need it.+ * A module must have an export list.+ * Always enabled extension:+   * ConstraintKinds+   * EmptyDataDecls+   * ExtendedDefaultRules+   * FlexibleContexts+   * FlexibleInstance+   * ForeignFunctionInterface+   * IncoherentInstances+   * KindSignatures+   * MonoLocalBinds+   * MultiParamTypeClasses+   * NegativeLiterals+   * NoMonomorphismRestriction+   * OverlappingInstances+   * RankNTypes+   * QualifiedDo+   * ScopedTypeVariables+   * StarIsType+   * TupleSections+   * TypeSynonymInstances+   * UndecidableInstances+   * UndecidableSuperClasses+ * In the works+   * FunctionalDependencies+   * ExistentialQuantification+ * `main` in the top module given to `mhs` serves at the program entry point.+ * Many things that should be an error (but which are mostly harmless) are not reported.+ * More differences that I don't remember right now.++## Example+The file `Example.hs` contains the following:+```Haskell+module Example(main) where+import Prelude++fac :: Int -> Int+fac 0 = 1+fac n = n * fac(n-1)++main :: IO ()+main = do+  let+    rs = map fac [1,2,3,10]+  putStrLn "Some factorials"+  print rs+```++First, make sure the compiler is built by doing `make`.+Then compile the file by `bin/mhs Example -oEx` which produces `Ex`.+Finally, run the binary file by `./Ex`.+This should produce+```+Some factorials+[1,2,6,3628800]+```++## Libraries+There are a number of libraries that have some of the standard Haskell functions.+But in general, the `Prelude` contains less.++## Types+There are some primitive data types, e.g `Int`, `IO`, `Ptr`, and `Double`.+These are known by the runtime system and various primitive operations work on them.+The function type, `->`, is (of course) also built in.++All other types are defined with the language.  They are converted to lambda terms using+the Scott encoding.   The runtime system knows how lists and booleans are encoded.+++## Compiler+The compiler is written in Micro Haskell.+It takes a name of a module and compiles to a target (see below).+This module should contain the function `main` of type `IO ()` and+it will be the entry point to the program.++### Compiler flags+* `-iDIR` add `DIR` to search path for modules+* `-oFILE` output file.  If the `FILE` ends in `.comb` it will produce a textual combinator file.  If `FILE` ends in `.c` it will produce a C file with the combinators.  For all other `FILE` it will compiler the combinators together with the runtime system to produce a regular executable.+* `-r` run directly (does not work if compiled with GHC)+* `-v` be more verbose, flag can be repeated++With the `-v` flag the processing time for each module is reported.+E.g.+  ```+  importing done MicroHs.Exp, 284ms (91 + 193)+  ```+which means that processing the module `MicroHs.Exp` took 284ms,+with parsing taking 91ms and typecheck&desugar taking 193ms.++### Environment variables+* `MHSDIR` the directory where `lib/` and `src/` are expected to be.  Defaults to `./`.+* `MHSCC` command use to compile C file to produce binaries.  Look at the source for more information.++### Compiler modules++* `Compile`, top level compiler.  Maintains a cache of already compiled modules.+* `Desugar`, desugar full expressions to simple expressions.+* `Exp`, simple expression type, combinator abstraction and optimization.+* `Expr`, parsed expression type.+* `Graph`, strongly connected component algorithm.+* `Ident`, identifiers and related types.+* `IdentMap`, map from identifiers to something.+* `Interactive`, top level for the interactive REPL.+* `Lex`, lexical analysis and indentation processing.+* `Main`, the main module.  Decodes flags, compiles, and writes result.+* `MakeCArray`, generate a C version of the combinator file.+* `Parse`, parse and build and abstract syntax tree.+* `StateIO`, state + IO monad.+* `TCMonad`, type checking monad.+* `Translate`, convert an expression tree to its value.+* `TypeCheck`, type checker.++## Interactive mode+If no module name is given the compiler enters interactive mode.+You can enter expressions to be evaluated, or top level definitions (including `import`).+Simple line editing is available.++All definitions are saved in the file `Interactive.hs` and all input+lines as saved in `.mhsi`.  The latter file is read on startup so+the command history is persisted.++Available commands:++* `:quit` Quit the interactive system+* `:clear` Get back to start state+* `:del STR` Delete all definitions that begin with `STR`+* `:reload` Reload all modules+* `expr` Evaluate expression.+* `defn` Add definition (can also be an `import`)++***NOTE*** When you `import` a module it is cached.+If the file changes and you import it again it will not reload.+You can use `:clear` (or `:reload`) to get back to an empty cache.+This is a bug.++## Runtime+The runtime system is written in C and is in `src/runtime/eval.c`.+It uses combinators for handling variables, and has primitive operations+for built in types and for executing IO operations.+There is a also a simple mark-scan garbage collector.+The runtime system is written in a reasonably portable C code.++### Runtime flags+Runtime flags are given between the flags `+RTS` and `-RTS`.+Between those the runtime decodes the flags, everything else is available to+the running program.++* `-HSIZE` set heap size to `SIZE` cells, can be suffixed by `k`, `M`, or `G`, default is `50M`+* `-KSIZE` set stack size to `SIZE` entries, can be suffixed by `k`, `M`, or `G`, default is`100k`+* `-rFILE` read combinators from `FILE`, instead of `out.comb`+* `-v` be more verbose, flag can be repeated++For example, `bin/mhseval +RTS -H1M -v -RTS hello` runs `out.comb` and the program gets the argument `hello`,+whereas the runtime system sets the heap to 1M cells and is verbose.++### FFI+MicroHs supports calling C functions, but all such functions must be in a table in the runtime system.++### Features+The runtime system can serialize and deserialize any expression+and keep its graph structure (sharing and cycles).+The only exceptions to this are C pointers file handles, which cannot be serialized (except for `stdin`, `stdout`, and `stderr`).++### Memory layout+Memory allocation is based on cells.  Each cell has room for two pointers (i.e., two words, typically 16 bytes),+so it can represent an application node.  One bit is used to indicate if+the cell is an application or something else.  If it is something else one+word is a tag indicating what it is, e.g., a combinator or an integer.+The second word is then used to store any payload, e.g., the number itself for an integer node.++Memory allocation has a bitmap with one bit per cell.+Allocating a cell consists of finding the next free cell using the bitmap,+and then marking it as used.  The garbage collector first clears the bitmap+and then (recursively) marks every used cell in the bitmap.+There is no explicit scan phase since that is baked into the allocation.+Allocation is fast assuming the CPU has some kind of FindFirstSet instruction.++It is possible to use smaller cells by using 32 bit "pointers" instead of 64 bit pointers.+This has a performance penalty, though.++### Portability+The C code for the evaluator does not use any special features, and should be+portable to many platforms.  It has mostly been test with MacOS and Linux,+and somewhat with Windows.++The code has only been tested on 64 bit platforms, so again, there are lurking problems+with other word sizes, but they should be easy to fix.++The `src/runtime/` directory contains configuration files for different platform.+Edit `src/runtime/eval.c` to `#include` the right one.++## Bootstrapping+The compiler can compile itself.  To replace `bin/mhs` with a new version,+do `make bootstrap`.  This will recompile the compiler twice and compare+the outputs to make sure the new compiler still works.+++# FAQ+* +  * Q: When will it get _insert feature_?+  * A: Maybe some time, maybe never.+* +  * Q: Why are the error messages so bad?+  * A: Error messages are boring.+* +  * Q: Why is the so much source code?+  * A: I wonder this myself.  7000+ lines of Haskell seems excessive.+       2500+ lines of C is also more than I'd like for such a simple system.+* +  * Q: Why are the binaries so big?+  * A: The combinator file is rather verbose.  The combinator file+       for the compiler shrinks from 350kB to 75kB when compressed with upx.+       The evaluator alone is about 70kB (26kB compressed with upx).
+ Tools/Addcombs.hs view
@@ -0,0 +1,30 @@+module Addcombs(main) where+import Prelude+import Data.Char+import System.Environment++chunkify :: Int -> [Char] -> [[Char]]+chunkify n [] = []+chunkify n xs =+  let (as, bs) = splitAt n xs+  in  as : chunkify n bs++showChunk :: [Char] -> String+showChunk = concatMap (\ c -> show (ord c) ++ ",")++main :: IO ()+main = do+{-+  args <- getArgs+  let fn = case args of { [a] -> a; _ -> error "Usage: Addcombs file" }+  file <- readFile fn+-}+  hSetBinaryMode stdin True+  file <- hGetContents stdin+  let size = length file+      chunks = chunkify 20 file+  putStrLn $ "unsigned char combexprdata[] = {"+  mapM_ (putStrLn . showChunk) chunks+  putStrLn "0 };"+  putStrLn "unsigned char *combexpr = combexprdata;"+  putStrLn $ "int combexprlen = " ++ show size ++ ";"
+ Tools/Compress.hs view
@@ -0,0 +1,71 @@+module Compress(main) where+import Prelude+import Data.Map as M+import Data.Char+import System.IO+--import Debug.Trace++--+-- A simple LZW compressor+-- It uses a dictionary of maximum size 4096.+-- The 12 bit code words are encoded with 2 code words in 3 bytes.+-- It can only compress input of printable ASCII + '\n'++type Table = M.Map [Char] Int++-- Don't change this lightly.+-- It needs to be coordinated with the decompressor transducer in eval.c+maxDict :: Int+maxDict = 4096++toChar :: Int -> Char+toChar i = chr (i + 32)++(!) :: Table -> [Char] -> Int+(!) t s =+  case M.lookupBy compare s t of+    Nothing -> undefined -- error $ "(!): " ++ showString s+    Just i -> i++compress :: Table -> [Char] -> [Char] -> [Int]+compress t [] p = [ t ! p ]+compress t (c:cs) p =+  let p' = p ++ [c]+      s = M.size t+      t' = if s < maxDict then M.insertBy compare p' s t else t+  in+--      trace ("compress " ++ showString p') $+--      trace show (M.toList t)) $+      case M.lookupBy compare p' t of+        Just _ ->+--          trace "found" $+          compress t cs p'+        Nothing ->+--          trace ("not found p=" ++ show p ++ " " ++ show (M.lookupBy compare p t)) $+          (t ! p) : compress t' cs [c]++-- Initial table is ' ' .. '~', and '\n'+initTable :: Table+initTable = M.fromListBy compare $ [([toChar c], c) | c <- [0..94] ] ++ [("\n", 95)]++toBytes :: [Int] -> [Int]+toBytes [] = []+toBytes [i] = [i `rem` 256, i `quot` 256, 0]+toBytes (i1:i2:is) =+  let i = i1 + 4096*i2+      b1 = i `rem` 256+      b2 = (i `quot` 256) `rem` 256+      b3 = i `quot` (256*256)+  in  b1 : b2 : b3 : toBytes is++bad :: Char -> Bool+bad c = not (isPrint c || c == '\n')++main :: IO ()+main = do+  f <- hGetContents stdin+  when (any bad f) $+    error "Non-printable ASCII in input"+  let bs = compress initTable f []+  hSetBinaryMode stdout True+  putStr $ 'Z' : (map chr $ toBytes bs)
+ Tools/convertX.sh view
@@ -0,0 +1,2 @@+#!/bin/sh+( echo "{-# LINE 1 \"$1\" #-}" ; sed -e 's/--[XW]//' $2 ) > $3
+ generated/mhs.c view
@@ -0,0 +1,14056 @@+static unsigned char data[] = {+118,53,46,49,10,49,54,49,52,10,40,40,65,32,58,48,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,32,40,40,65,32,58,49,32,40,85,32,40,90,+32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,40,65,32,58,50,+32,40,85,32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+40,40,65,32,58,51,32,40,85,32,40,75,32,40,75,32,40,90,32,75,+41,41,41,41,41,32,40,40,65,32,58,52,32,40,85,32,40,75,32,40,+75,32,40,75,32,75,41,41,41,41,41,32,40,40,65,32,58,53,32,40,+85,32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,32,40,40,+65,32,58,54,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+65,108,116,101,114,110,97,116,105,118,101,46,101,109,112,116,121,34,41,41,+41,32,40,40,65,32,58,55,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,65,108,116,101,114,110,97,116,105,118,101,46,60,124,62,34,+41,41,41,32,40,40,65,32,58,56,32,40,40,83,32,40,40,40,83,39,+32,83,39,41,32,40,40,66,32,95,49,52,41,32,95,49,41,41,32,40,+40,40,67,39,32,95,50,55,54,41,32,40,40,66,32,95,49,50,41,32,+95,49,41,41,32,95,52,54,50,41,41,41,32,95,53,41,41,32,40,40,+65,32,58,57,32,40,40,83,32,40,40,40,83,39,32,67,39,41,32,95,+51,41,32,95,52,41,41,32,40,40,40,67,39,32,95,49,51,41,32,95,+49,41,32,95,52,54,49,41,41,41,32,40,40,65,32,58,49,48,32,40,+40,40,83,39,32,80,41,32,95,50,41,32,40,40,40,67,39,32,95,49,+51,41,32,95,49,41,32,95,49,51,52,49,41,41,41,32,40,40,65,32,+58,49,49,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,41,32,40,40,65,32,58,+49,50,32,40,85,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,32,40,40,65,32,58,49,51,32,40,85,32,40,75,32,40,90,32,40,+90,32,75,41,41,41,41,41,32,40,40,65,32,58,49,52,32,40,85,32,+40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,32,40,40,65,32,+58,49,53,32,40,85,32,40,75,32,40,75,32,40,75,32,75,41,41,41,+41,41,32,40,40,65,32,58,49,54,32,40,85,32,40,75,32,40,75,32,+40,75,32,65,41,41,41,41,41,32,40,40,65,32,58,49,55,32,40,75,+32,40,110,111,68,101,102,97,117,108,116,32,34,65,112,112,108,105,99,97,+116,105,118,101,46,112,117,114,101,34,41,41,41,32,40,40,65,32,58,49,+56,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,65,112,112,+108,105,99,97,116,105,118,101,46,60,42,62,34,41,41,41,32,40,40,65,+32,58,49,57,32,40,40,40,83,39,32,66,41,32,95,49,52,41,32,40,+40,40,67,39,32,95,50,55,51,41,32,95,49,50,41,32,95,50,54,52,+41,41,41,32,40,40,65,32,58,50,48,32,40,40,40,83,39,32,66,41,+32,95,49,52,41,32,40,40,40,67,39,32,95,50,55,54,41,32,95,49,+50,41,32,95,50,54,53,41,41,41,32,40,40,65,32,58,50,49,32,95,+49,52,49,51,41,32,40,40,65,32,58,50,50,32,40,40,66,32,95,49,+52,56,49,41,32,95,50,49,41,41,32,40,40,65,32,58,50,51,32,40,+40,40,83,39,32,95,49,52,56,49,41,32,95,50,49,41,32,73,41,41,+32,40,40,65,32,58,50,52,32,95,49,51,57,55,41,32,40,40,65,32,+58,50,53,32,40,95,50,52,32,34,117,110,100,101,102,105,110,101,100,34,+41,41,32,40,40,65,32,58,50,54,32,73,41,32,40,40,65,32,58,50,+55,32,40,40,40,67,39,32,66,41,32,95,49,52,49,50,41,32,40,40,+67,32,95,50,54,51,41,32,95,50,54,41,41,41,32,40,40,65,32,58,+50,56,32,40,40,40,67,39,32,95,50,55,41,32,40,40,95,50,55,50,+32,95,49,52,53,48,41,32,95,49,55,53,41,41,32,40,40,95,50,54,+51,32,40,95,51,52,32,95,49,52,53,50,41,41,32,95,49,55,52,41,+41,41,32,40,40,65,32,58,50,57,32,40,40,66,32,40,40,83,32,95,+49,52,56,49,41,32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,+95,50,52,41,41,32,40,40,65,32,58,51,48,32,40,40,66,32,40,66,+32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+80,41,41,41,32,40,40,65,32,58,51,49,32,40,85,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,40,65,32,58,51,50,32,40,85,32,40,+75,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,51,51,32,40,+85,32,40,75,32,40,75,32,75,41,41,41,41,32,40,40,65,32,58,51,+52,32,40,85,32,40,75,32,40,75,32,65,41,41,41,41,32,40,40,65,+32,58,51,53,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+77,111,110,97,100,46,62,62,61,34,41,41,41,32,40,40,65,32,58,51,+54,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,51,50,41,+32,75,41,41,32,40,40,65,32,58,51,55,32,40,40,66,32,95,49,51,+41,32,95,51,49,41,41,32,40,40,65,32,58,51,56,32,40,40,40,83,+39,32,40,67,39,32,66,41,41,32,95,51,50,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,95,51,50,41,32,40,66,39,32,95,51,+52,41,41,41,41,32,40,40,65,32,58,51,57,32,80,41,32,40,40,65,+32,58,52,48,32,40,85,32,75,41,41,32,40,40,65,32,58,52,49,32,+40,85,32,65,41,41,32,40,40,65,32,58,52,50,32,40,75,32,95,50,+52,41,41,32,40,40,65,32,58,52,51,32,40,40,66,32,40,66,32,89,+41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,+80,41,32,40,40,67,32,95,51,52,41,32,95,52,54,49,41,41,41,41,+32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,66,41,41,41,32,40,66,39,32,95,51,50,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,41,41,41,+32,40,66,39,32,95,51,50,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,95,51,52,41,41,32,95,52,54,50,41,41,41,41,41,41,+32,40,40,65,32,58,52,52,32,40,40,66,32,40,66,32,89,41,41,32,+40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,80,41,32,+40,40,67,32,95,51,52,41,32,95,49,51,52,49,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,67,39,32,66,41,41,41,32,40,66,39,32,95,51,50,41,41,41,32,+90,41,41,41,41,32,40,40,65,32,58,52,53,32,40,40,66,32,85,41,+32,40,40,67,32,95,51,52,41,32,95,49,51,52,49,41,41,41,32,40,+40,65,32,58,52,54,32,40,40,67,32,95,52,51,41,32,95,50,54,52,+41,41,32,40,40,65,32,58,52,55,32,40,40,66,32,95,50,54,54,41,+32,95,51,50,41,41,32,40,40,65,32,58,52,56,32,40,40,66,32,67,+41,32,40,40,66,32,67,39,41,32,95,51,50,41,41,41,32,40,40,65,+32,58,52,57,32,40,40,66,32,95,50,54,54,41,32,95,52,56,41,41,+32,40,40,65,32,58,53,48,32,40,40,66,32,89,41,32,40,40,40,83,+39,32,66,41,32,40,66,39,32,40,40,66,32,80,41,32,40,40,67,32,+95,51,52,41,32,95,52,54,49,41,41,41,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,40,83,39,32,40,83,39,32,66,41,41,41,32,+40,66,39,32,95,51,50,41,41,41,32,40,40,40,83,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,39,32,66,41,41,41,41,32,40,66,39,32,40,66,39,32,95,51,+50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,66,32,95,50,54,49,41,32,95,51,52,41,41,41,41,+32,40,40,66,32,40,67,32,83,41,41,32,95,52,54,50,41,41,41,41,+41,41,41,32,40,40,65,32,58,53,49,32,40,40,66,32,89,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,80,41,32,40,+40,67,32,95,51,52,41,32,40,40,80,32,95,52,54,49,41,32,95,52,+54,49,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,+32,40,83,39,32,40,83,39,32,66,41,41,41,32,40,66,39,32,95,51,+50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,66,41,+41,41,41,32,40,66,39,32,40,66,39,32,95,51,50,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,+95,50,54,49,41,32,95,51,52,41,41,41,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,39,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,95,52,+54,50,41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,+50,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,50,32,40,+40,95,50,55,49,32,95,50,54,51,41,32,40,95,50,55,53,32,95,53,+50,41,41,41,32,40,40,65,32,58,53,51,32,40,40,40,40,40,95,49,+49,32,95,53,50,41,32,95,50,54,53,41,32,83,41,32,40,95,49,57,+32,95,53,51,41,41,32,40,95,50,48,32,95,53,51,41,41,41,32,40,+40,65,32,58,53,52,32,40,40,40,40,95,51,48,32,95,53,51,41,32,+40,40,40,67,39,32,67,41,32,40,67,32,83,39,41,41,32,73,41,41,+32,40,95,51,54,32,95,53,52,41,41,32,40,95,51,55,32,95,53,52,+41,41,41,32,40,40,65,32,58,53,53,32,85,41,32,40,40,65,32,58,+53,54,32,40,40,95,50,55,49,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,53,53,41,41,41,32,40,40,66,32,40,40,67,39,32,67,+41,32,95,53,57,41,41,32,40,66,32,80,41,41,41,41,32,40,95,50,+55,53,32,95,53,54,41,41,41,32,40,40,65,32,58,53,55,32,40,40,+40,40,40,95,49,49,32,95,53,54,41,32,40,40,66,32,40,95,50,54,+49,32,95,53,53,41,41,32,80,41,41,32,40,95,51,56,32,95,53,56,+41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,53,53,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,95,+53,57,41,41,32,40,90,32,95,53,57,41,41,41,41,32,40,95,50,48,+32,95,53,55,41,41,41,32,40,40,65,32,58,53,56,32,40,40,40,40,+95,51,48,32,95,53,55,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,95,53,53,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,95,53,57,41,41,32,40,66,32,95,53,57,41,41,41,+41,32,40,95,49,53,32,95,53,55,41,41,32,40,95,49,51,32,95,53,+55,41,41,41,32,40,40,65,32,58,53,57,32,40,85,32,73,41,41,32,+40,40,65,32,58,54,48,32,40,40,66,32,40,95,50,54,51,32,95,53,+54,53,41,41,32,95,53,57,41,41,32,40,40,65,32,58,54,49,32,40,+40,66,32,40,95,50,54,49,32,95,53,53,41,41,32,40,66,32,40,80,+32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,58,54,50,32,40,+40,66,32,40,95,50,54,49,32,95,53,53,41,41,32,40,90,32,40,80,+32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,58,54,51,32,40,+40,95,50,54,49,32,95,53,53,41,32,40,40,83,32,80,41,32,73,41,+41,41,32,40,40,65,32,58,54,52,32,40,40,66,32,40,95,50,54,49,+32,95,53,53,41,41,32,40,40,67,32,40,83,39,32,80,41,41,32,73,+41,41,41,32,40,40,65,32,58,54,53,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+54,54,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,54,55,32,40,85,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,54,56,32,40,85,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,54,57,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+55,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,49,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,55,50,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,55,51,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+55,52,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,53,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,55,54,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,55,55,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+55,56,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,57,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,56,48,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,56,49,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+56,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,56,51,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,56,52,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,56,53,32,40,85,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+56,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,56,55,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,65,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,56,56,32,40,75,32,40,110,111,68,+101,102,97,117,108,116,32,34,66,105,116,115,46,46,38,46,34,41,41,41,+32,40,40,65,32,58,56,57,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,66,105,116,115,46,46,124,46,34,41,41,41,32,40,40,65,+32,58,57,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+66,105,116,115,46,120,111,114,34,41,41,41,32,40,40,65,32,58,57,49,+32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,66,105,116,115,+46,99,111,109,112,108,101,109,101,110,116,34,41,41,41,32,40,40,65,32,+58,57,50,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,+66,32,40,66,32,40,83,32,40,40,67,32,40,95,52,57,55,32,95,50,+56,50,41,41,32,35,48,41,41,41,41,32,40,40,66,32,40,40,83,39,+32,83,41,32,40,67,32,40,40,67,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,35,48,41,41,41,41,32,95,55,57,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,95,56,49,41,32,40,95,52,+56,50,32,95,50,55,55,41,41,41,41,32,40,40,65,32,58,57,51,32,+40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,66,32,40,66,+32,40,83,32,40,40,67,32,40,95,52,57,55,32,95,50,56,50,41,41,+32,35,48,41,41,41,41,32,40,40,66,32,40,40,83,39,32,83,41,32,+40,67,32,40,40,67,32,40,95,52,57,57,32,95,50,56,50,41,41,32,+35,48,41,41,41,41,32,95,56,51,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,95,56,52,41,32,40,95,52,56,50,32,95,+50,55,55,41,41,41,41,32,40,40,65,32,58,57,52,32,40,40,67,32,+40,40,83,32,95,55,54,41,32,40,40,67,32,95,55,52,41,32,35,48,+41,41,41,32,35,48,41,41,32,40,40,65,32,58,57,53,32,40,75,32,+40,110,111,68,101,102,97,117,108,116,32,34,66,105,116,115,46,98,105,116,+34,41,41,41,32,40,40,65,32,58,57,54,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,95,54,56,41,32,95,55,52,41,41,32,40,40,+65,32,58,57,55,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+95,54,55,41,32,40,40,40,83,39,32,66,41,32,95,55,48,41,32,95,+55,52,41,41,41,32,40,40,65,32,58,57,56,32,40,40,40,83,39,32,+40,67,39,32,66,41,41,32,95,54,57,41,32,95,55,52,41,41,32,40,+40,65,32,58,57,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,+32,34,66,105,116,115,46,116,101,115,116,66,105,116,34,41,41,41,32,40,+40,65,32,58,49,48,48,32,95,55,49,41,32,40,40,65,32,58,49,48,+49,32,95,55,57,41,32,40,40,65,32,58,49,48,50,32,40,40,40,67,+39,32,40,67,39,32,66,41,41,32,95,55,49,41,32,40,95,52,56,50,+32,95,50,55,55,41,41,41,32,40,40,65,32,58,49,48,51,32,95,56,+49,41,32,40,40,65,32,58,49,48,52,32,95,55,50,41,32,40,40,65,+32,58,49,48,53,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+95,55,50,41,32,40,95,52,56,50,32,95,50,55,55,41,41,41,32,40,+40,65,32,58,49,48,54,32,40,75,32,40,110,111,68,101,102,97,117,108,+116,32,34,66,105,116,115,46,112,111,112,67,111,117,110,116,34,41,41,41,+32,40,40,65,32,58,49,48,55,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,66,105,116,115,46,98,105,116,83,105,122,101,77,97,121,+98,101,34,41,41,41,32,40,40,65,32,58,49,48,56,32,40,40,66,32,+40,66,32,40,95,52,55,49,32,40,95,50,52,32,34,98,105,116,83,105,+122,101,32,105,115,32,117,110,100,101,102,105,110,101,100,34,41,41,41,41,+32,95,56,54,41,41,32,40,40,65,32,58,49,48,57,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,32,40,40,65,32,58,49,49,48,32,40,85,32,40,+90,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,49,49,49,32,+40,85,32,40,75,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,+49,49,50,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+40,65,32,58,49,49,51,32,40,85,32,40,75,32,40,75,32,65,41,41,+41,41,32,40,40,65,32,58,49,49,52,32,40,75,32,40,110,111,68,101,+102,97,117,108,116,32,34,70,105,110,105,116,101,66,105,116,115,46,102,105,+110,105,116,101,66,105,116,83,105,122,101,34,41,41,41,32,40,40,65,32,+58,49,49,53,32,40,40,40,83,39,32,40,83,39,32,40,40,83,39,32,+40,95,52,56,48,32,95,50,55,55,41,41,32,40,40,67,32,40,95,52,+56,48,32,95,50,55,55,41,41,32,35,49,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,89,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,+52,57,55,32,95,50,56,50,41,41,32,40,40,95,52,56,53,32,95,50,+55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+83,41,41,32,40,40,66,32,95,55,56,41,32,95,49,49,48,41,41,41,+32,40,40,67,32,66,41,32,40,40,67,32,40,95,52,56,48,32,95,50,+55,55,41,41,32,35,49,41,41,41,41,32,73,41,41,41,32,73,41,41,+41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,+49,41,41,41,32,95,49,49,49,41,41,32,40,40,65,32,58,49,49,54,+32,40,40,40,67,39,32,40,67,39,32,89,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,83,39,32,+40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,40,95,53,48,48,32,95,50,56,50,41,+41,41,41,32,95,49,49,49,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,83,41,41,32,40,40,66,32,+95,55,56,41,32,95,49,49,48,41,41,41,32,40,40,67,32,66,41,32,+40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,+41,41,41,32,73,41,41,41,32,73,41,41,32,35,48,41,41,32,40,40,+65,32,58,49,49,55,32,40,40,95,50,48,49,32,40,40,67,32,40,40,+67,32,83,39,41,32,95,49,50,50,41,41,32,73,41,41,32,40,95,50,+48,53,32,95,49,49,55,41,41,41,32,40,40,65,32,58,49,49,56,32,+40,40,40,95,49,53,56,56,32,40,75,32,40,40,80,32,40,95,49,53,+57,55,32,34,70,97,108,115,101,34,41,41,32,40,95,49,53,57,55,32,+34,84,114,117,101,34,41,41,41,41,32,40,95,49,53,57,51,32,95,49,+49,56,41,41,32,40,95,49,53,57,52,32,95,49,49,56,41,41,41,32,+40,40,65,32,58,49,49,57,32,40,40,95,49,50,54,32,95,49,50,52,+41,32,95,49,50,53,41,41,32,40,40,65,32,58,49,50,48,32,40,82,+32,95,49,50,53,41,41,32,40,40,65,32,58,49,50,49,32,40,85,32,+95,49,50,52,41,41,32,40,40,65,32,58,49,50,50,32,40,40,80,32,+95,49,50,53,41,32,95,49,50,52,41,41,32,40,40,65,32,58,49,50,+51,32,95,49,50,53,41,32,40,40,65,32,58,49,50,52,32,75,41,32,+40,40,65,32,58,49,50,53,32,65,41,32,40,40,65,32,58,49,50,54,+32,80,41,32,40,40,65,32,58,49,50,55,32,40,85,32,75,41,41,32,+40,40,65,32,58,49,50,56,32,40,85,32,65,41,41,32,40,40,65,32,+58,49,50,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+66,111,117,110,100,101,100,46,109,105,110,66,111,117,110,100,34,41,41,41,+32,40,40,65,32,58,49,51,48,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,66,111,117,110,100,101,100,46,109,97,120,66,111,117,110,+100,34,41,41,41,32,40,40,65,32,58,49,51,49,32,40,40,95,50,48,+49,32,95,49,51,57,49,41,32,95,49,51,57,50,41,41,32,40,40,65,+32,58,49,51,50,32,40,40,40,40,40,40,40,40,95,52,57,52,32,95,+49,51,49,41,32,95,49,52,48,48,41,32,95,49,51,57,51,41,32,95,+49,51,57,52,41,32,95,49,51,57,53,41,32,95,49,51,57,54,41,32,+40,95,53,48,56,32,95,49,51,50,41,41,32,40,95,53,48,57,32,95,+49,51,50,41,41,41,32,40,40,65,32,58,49,51,51,32,40,40,95,50,+48,49,32,95,49,52,48,49,41,32,40,95,50,48,53,32,95,49,51,51,+41,41,41,32,40,40,65,32,58,49,51,52,32,40,40,40,40,40,40,40,+40,95,52,57,52,32,95,49,51,51,41,32,95,49,52,48,48,41,32,40,+40,40,67,39,32,40,67,39,32,40,95,50,48,50,32,95,53,49,48,41,+41,41,32,95,49,52,48,48,41,32,95,53,49,52,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,95,50,48,51,32,95,53,49,48,41,41,41,+32,95,49,52,48,48,41,32,95,53,49,54,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,95,50,48,50,32,95,53,49,48,41,41,41,32,95,+49,52,48,48,41,32,95,53,49,54,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,95,50,48,51,32,95,53,49,48,41,41,41,32,95,49,52,+48,48,41,32,95,53,49,52,41,41,32,40,95,53,48,56,32,95,49,51,+52,41,41,32,40,95,53,48,57,32,95,49,51,52,41,41,41,32,40,40,+65,32,58,49,51,53,32,40,40,95,49,50,54,32,40,95,49,51,54,32,+35,48,41,41,32,40,95,49,51,54,32,35,49,50,55,41,41,41,32,40,+40,65,32,58,49,51,54,32,95,49,52,48,50,41,32,40,40,65,32,58,+49,51,55,32,95,49,52,48,51,41,32,40,40,65,32,58,49,51,56,32,+40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,+57,55,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,49,50,50,+41,41,41,32,40,40,65,32,58,49,51,57,32,40,40,40,83,39,32,95,+49,50,49,41,32,40,95,49,51,57,52,32,35,54,53,41,41,32,40,40,+67,32,95,49,51,57,52,41,32,35,57,48,41,41,41,32,40,40,65,32,+58,49,52,48,32,40,40,40,83,39,32,95,49,50,48,41,32,95,49,51,+56,41,32,95,49,51,57,41,41,32,40,40,65,32,58,49,52,49,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,52,+56,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,53,55,41,41,+41,32,40,40,65,32,58,49,52,50,32,40,40,40,83,39,32,95,49,50,+48,41,32,95,49,52,49,41,32,40,40,40,83,39,32,95,49,50,48,41,+32,40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,+35,57,55,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,49,48,+50,41,41,41,32,40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,+51,57,52,32,35,55,48,41,41,32,40,40,67,32,95,49,51,57,52,41,+32,35,55,48,41,41,41,41,41,32,40,40,65,32,58,49,52,51,32,40,+40,40,83,39,32,95,49,50,48,41,32,95,49,52,48,41,32,95,49,52,+49,41,41,32,40,40,65,32,58,49,52,52,32,40,40,40,83,39,32,95,+49,50,49,41,32,40,95,49,51,57,52,32,35,51,50,41,41,32,40,40,+67,32,95,49,51,57,52,41,32,35,49,50,54,41,41,41,32,40,40,65,+32,58,49,52,53,32,40,40,40,83,39,32,95,49,50,48,41,32,40,40,+67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,51,50,41,41,+32,40,40,40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,95,50,+48,50,32,95,49,51,49,41,41,32,35,57,41,41,32,40,40,67,32,40,+95,50,48,50,32,95,49,51,49,41,41,32,35,49,48,41,41,41,41,32,+40,40,65,32,58,49,52,54,32,40,40,83,32,40,40,83,32,40,40,40,+83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,52,56,41,+41,32,40,40,67,32,95,49,51,57,52,41,32,35,53,55,41,41,41,32,+40,40,83,32,40,40,83,32,40,40,40,83,39,32,95,49,50,49,41,32,+40,95,49,51,57,52,32,35,57,55,41,41,32,40,40,67,32,95,49,51,+57,52,41,32,35,49,48,50,41,41,41,32,40,40,83,32,40,40,67,32,+40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,+54,53,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,55,48,41,+41,41,32,40,95,50,52,32,34,100,105,103,105,116,84,111,73,110,116,34,+41,41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,+41,41,32,95,49,51,55,41,32,40,40,40,95,52,56,48,32,95,50,55,+55,41,32,40,95,49,51,55,32,35,54,53,41,41,32,35,49,48,41,41,+41,41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,+41,41,32,95,49,51,55,41,32,40,40,40,95,52,56,48,32,95,50,55,+55,41,32,40,95,49,51,55,32,35,57,55,41,41,32,35,49,48,41,41,+41,41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,+41,41,32,95,49,51,55,41,32,40,95,49,51,55,32,35,52,56,41,41,+41,41,32,40,40,65,32,58,49,52,55,32,40,40,83,32,40,40,83,32,+40,40,40,83,39,32,95,49,50,49,41,32,40,95,49,51,57,52,32,35,+54,53,41,41,32,40,40,67,32,95,49,51,57,52,41,32,35,57,48,41,+41,41,32,40,95,49,50,53,32,40,40,40,110,111,77,97,116,99,104,32,+34,46,47,108,105,98,47,68,97,116,97,47,67,104,97,114,46,104,115,34,+41,32,35,56,51,41,32,35,49,41,41,41,41,32,40,40,66,32,95,49,+51,54,41,32,40,40,40,67,39,32,40,95,52,55,57,32,95,50,55,55,+41,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,+41,32,95,49,51,55,41,32,40,95,49,51,55,32,35,54,53,41,41,41,+32,40,95,49,51,55,32,35,57,55,41,41,41,41,41,32,40,40,65,32,+58,49,52,56,32,40,40,83,32,40,40,83,32,40,40,40,83,39,32,95,+49,50,49,41,32,40,95,49,51,57,52,32,35,57,55,41,41,32,40,40,+67,32,95,49,51,57,52,41,32,35,57,55,41,41,41,32,40,95,49,50,+53,32,40,40,40,110,111,77,97,116,99,104,32,34,46,47,108,105,98,47,+68,97,116,97,47,67,104,97,114,46,104,115,34,41,32,35,56,55,41,32,+35,49,41,41,41,41,32,40,40,66,32,95,49,51,54,41,32,40,40,40,+67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,40,67,+39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,49,51,55,41,+32,40,95,49,51,55,32,35,57,55,41,41,41,32,40,95,49,51,55,32,+35,54,53,41,41,41,41,41,32,40,40,65,32,58,49,52,57,32,40,40,+40,95,49,53,56,56,32,40,75,32,40,40,67,32,40,40,83,32,40,40,+67,32,61,61,41,32,35,51,57,41,41,32,40,40,66,32,40,95,50,54,+51,32,40,95,49,53,57,54,32,35,51,57,41,41,41,32,40,40,40,67,+39,32,95,50,54,51,41,32,40,40,66,32,95,49,53,57,55,41,32,95,+49,53,48,41,41,32,40,95,49,53,57,54,32,35,51,57,41,41,41,41,+41,32,40,95,49,53,57,55,32,34,39,92,57,50,38,39,39,34,41,41,+41,41,32,40,95,49,53,57,51,32,95,49,52,57,41,41,32,40,40,66,+32,40,95,50,54,51,32,40,95,49,53,57,54,32,35,51,52,41,41,41,+32,40,89,32,40,40,66,32,40,80,32,40,95,49,53,57,54,32,35,51,+52,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,40,+83,39,32,83,39,41,32,40,40,67,32,40,95,50,48,50,32,95,49,51,+49,41,41,32,35,51,52,41,41,41,32,40,40,67,39,32,66,41,32,40,+40,66,32,95,50,54,51,41,32,40,40,66,32,95,49,53,57,55,41,32,+95,49,53,48,41,41,41,41,41,32,40,66,32,40,95,50,54,51,32,40,+95,49,53,57,55,32,34,92,57,50,38,92,51,52,38,34,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,53,48,32,40,40,40,67,39,+32,89,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,80,41,32,+40,40,83,32,40,40,83,32,95,49,52,52,41,32,40,40,66,32,40,95,+52,54,51,32,34,39,92,57,50,38,34,41,41,32,40,40,40,67,39,32,+95,52,54,51,41,32,40,40,66,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,32,95,49,51,55,41,41,32,40,40,79,32,35,51,57,41,32,+75,41,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,+40,40,66,32,40,66,32,40,67,32,66,41,41,41,32,40,66,39,32,40,+40,66,32,67,41,32,40,67,32,40,95,50,48,50,32,95,49,51,49,41,+41,41,41,41,41,41,32,40,40,79,32,40,40,80,32,35,49,48,41,32,+34,92,57,50,38,110,34,41,41,32,40,40,79,32,40,40,80,32,35,49,+51,41,32,34,92,57,50,38,114,34,41,41,32,40,40,79,32,40,40,80,+32,35,57,41,32,34,92,57,50,38,116,34,41,41,32,40,40,79,32,40,+40,80,32,35,56,41,32,34,92,57,50,38,98,34,41,41,32,40,40,79,+32,40,40,80,32,35,57,50,41,32,34,92,57,50,38,92,57,50,38,34,+41,41,32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,49,+32,40,40,40,40,40,40,40,95,52,55,56,32,95,49,51,52,57,41,32,+95,49,51,53,48,41,32,95,49,51,53,49,41,32,95,49,51,53,51,41,+32,40,40,83,32,40,40,83,32,40,40,67,32,40,95,52,57,55,32,95,+49,53,52,41,41,32,38,48,46,48,41,41,32,73,41,41,32,40,95,52,+56,50,32,95,49,53,49,41,41,41,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,95,52,57,54,32,95,49,53,52,41,41,32,+38,48,46,48,41,41,32,38,45,49,46,48,41,41,32,38,48,46,48,41,+41,32,38,49,46,48,41,41,32,95,51,54,51,41,41,32,40,40,65,32,+58,49,53,50,32,40,40,40,40,95,50,53,50,32,95,49,53,49,41,32,+95,49,51,53,50,41,32,40,95,50,53,56,32,95,49,53,50,41,41,32,+40,40,40,83,39,32,95,49,51,53,50,41,32,40,40,66,32,40,95,52,+56,53,32,95,49,53,49,41,41,32,95,53,50,54,41,41,32,40,40,66,+32,40,95,52,56,53,32,95,49,53,49,41,41,32,95,53,50,55,41,41,+41,41,32,40,40,65,32,58,49,53,51,32,40,40,95,50,48,49,32,95,+49,51,53,52,41,32,95,49,51,53,53,41,41,32,40,40,65,32,58,49,+53,52,32,40,40,40,40,40,40,40,40,95,52,57,52,32,95,49,53,51,+41,32,40,95,53,48,51,32,95,49,53,52,41,41,32,95,49,51,53,54,+41,32,95,49,51,53,55,41,32,95,49,51,53,56,41,32,95,49,51,53,+57,41,32,40,95,53,48,56,32,95,49,53,52,41,41,32,40,95,53,48,+57,32,95,49,53,52,41,41,41,32,40,40,65,32,58,49,53,53,32,40,+40,40,95,49,53,56,56,32,40,95,49,53,57,50,32,95,49,53,53,41,+41,32,95,49,51,54,48,41,32,40,95,49,53,57,52,32,95,49,53,53,+41,41,41,32,40,40,65,32,58,49,53,54,32,40,95,53,51,49,32,40,+40,66,32,40,40,40,83,39,32,40,95,52,56,49,32,40,95,53,49,57,+32,95,51,48,57,41,41,41,32,40,40,66,32,40,95,53,51,50,32,95,+51,49,48,41,41,32,40,85,32,75,41,41,41,32,40,40,66,32,40,40,+95,50,54,48,32,40,40,67,32,40,40,80,32,40,95,53,50,48,32,40,+40,80,32,95,51,48,57,41,32,95,51,48,54,41,41,41,32,95,50,55,+56,41,41,32,95,50,56,50,41,41,32,40,40,95,52,56,53,32,40,95,+53,49,57,32,95,51,48,57,41,41,32,40,95,51,53,57,32,35,50,41,+41,41,41,32,40,85,32,65,41,41,41,41,32,95,49,54,56,41,41,41,+32,40,40,65,32,58,49,53,55,32,40,40,40,40,40,40,40,40,40,40,+40,40,40,40,40,40,40,40,40,40,40,40,40,95,50,48,54,32,95,49,+53,50,41,32,40,40,95,50,53,54,32,95,49,53,50,41,32,40,40,95,+53,51,48,32,40,95,51,53,57,32,35,51,49,52,49,53,57,50,54,53,+51,53,56,57,55,57,51,41,41,32,40,95,51,53,57,32,35,49,48,48,+48,48,48,48,48,48,48,48,48,48,48,48,48,41,41,41,41,32,40,40,+66,32,95,49,52,49,48,41,32,95,49,53,57,41,41,32,40,40,66,32,+95,49,52,49,48,41,32,95,49,53,56,41,41,32,40,40,66,32,95,49,+52,49,48,41,32,95,49,54,48,41,41,32,40,95,50,51,52,32,95,49,+53,55,41,41,32,40,95,50,51,53,32,95,49,53,55,41,41,32,40,40,+66,32,95,49,52,49,48,41,32,95,49,54,49,41,41,32,40,40,66,32,+95,49,52,49,48,41,32,95,49,54,50,41,41,32,40,40,66,32,95,49,+52,49,48,41,32,95,49,54,51,41,41,32,40,40,66,32,95,49,52,49,+48,41,32,95,49,54,52,41,41,32,40,40,66,32,95,49,52,49,48,41,+32,95,49,54,53,41,41,32,40,40,66,32,95,49,52,49,48,41,32,95,+49,54,54,41,41,32,40,95,50,52,50,32,95,49,53,55,41,41,32,40,+95,50,52,51,32,95,49,53,55,41,41,32,40,95,50,52,52,32,95,49,+53,55,41,41,32,40,95,50,52,53,32,95,49,53,55,41,41,32,40,95,+50,52,54,32,95,49,53,55,41,41,32,40,95,50,52,55,32,95,49,53,+55,41,41,32,40,95,50,52,56,32,95,49,53,55,41,41,32,40,95,50,+52,57,32,95,49,53,55,41,41,32,40,95,50,53,48,32,95,49,53,55,+41,41,32,40,95,50,53,49,32,95,49,53,55,41,41,41,32,40,40,65,+32,58,49,53,56,32,94,108,111,103,41,32,40,40,65,32,58,49,53,57,+32,94,101,120,112,41,32,40,40,65,32,58,49,54,48,32,94,115,113,114,+116,41,32,40,40,65,32,58,49,54,49,32,94,115,105,110,41,32,40,40,+65,32,58,49,54,50,32,94,99,111,115,41,32,40,40,65,32,58,49,54,+51,32,94,116,97,110,41,32,40,40,65,32,58,49,54,52,32,94,97,115,+105,110,41,32,40,40,65,32,58,49,54,53,32,94,97,99,111,115,41,32,+40,40,65,32,58,49,54,54,32,94,97,116,97,110,41,32,40,40,65,32,+58,49,54,55,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,+95,53,51,52,32,40,40,67,32,40,40,80,32,95,49,53,50,41,32,95,+49,53,52,41,41,32,95,49,53,55,41,41,32,40,75,32,40,95,51,53,+57,32,35,50,41,41,41,32,40,75,32,35,53,51,41,41,32,40,75,32,+40,40,80,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,+53,57,32,35,45,49,48,50,49,41,41,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,49,48,50,52,41,41,41,+41,41,32,95,49,54,56,41,32,95,49,55,51,41,32,40,95,53,53,53,+32,95,49,54,55,41,41,32,40,95,53,53,54,32,95,49,54,55,41,41,+32,40,95,53,53,55,32,95,49,54,55,41,41,32,95,49,54,57,41,32,+95,49,55,48,41,32,95,49,55,49,41,32,95,49,55,50,41,32,40,75,+32,95,49,50,53,41,41,32,40,95,53,54,51,32,95,49,54,55,41,41,+41,32,40,40,65,32,58,49,54,56,32,40,40,66,32,40,40,83,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,41,32,+40,40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,66,+32,40,83,32,40,40,67,32,40,95,50,48,50,32,95,53,56,51,41,41,+32,35,48,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,50,48,+50,32,95,53,56,51,41,41,32,35,50,48,52,55,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+80,41,41,32,40,40,67,32,66,41,32,40,40,66,32,95,51,54,49,41,+32,40,40,67,32,40,95,54,56,32,95,53,56,54,41,41,32,35,52,53,+48,51,53,57,57,54,50,55,51,55,48,52,57,54,41,41,41,41,41,32,+40,40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,40,+40,40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,49,+51,56,57,41,32,35,49,48,50,51,41,41,32,35,53,50,41,41,41,41,+32,40,40,80,32,40,40,95,52,56,53,32,95,51,48,56,41,32,40,95,+51,53,57,32,35,48,41,41,41,32,40,40,95,52,56,53,32,95,50,55,+55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,80,41,41,32,40,40,67,32,66,41,32,95,+51,54,49,41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,+95,51,53,57,32,35,48,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,95,56,49,32,95,53,56,54,41,41,32,40,40,67,32,40,95,54,55,+32,95,53,56,54,41,41,32,35,57,50,50,51,51,55,50,48,51,54,56,+53,52,55,55,53,56,48,55,41,41,32,35,53,50,41,41,41,32,40,40,+67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,52,53,48,51,53,+57,57,54,50,55,51,55,48,52,57,53,41,41,41,32,40,40,67,32,40,+40,67,32,40,40,40,67,39,32,40,95,50,48,51,32,95,53,56,51,41,+41,32,40,40,67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,45,+57,50,50,51,51,55,50,48,51,54,56,53,52,55,55,53,56,48,56,41,+41,32,35,48,41,41,32,95,50,54,52,41,41,32,40,95,52,56,50,32,+95,51,48,56,41,41,41,41,32,95,49,51,55,54,41,41,32,40,40,65,+32,58,49,54,57,32,40,40,66,32,40,40,40,83,39,32,95,49,50,49,+41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,53,56,51,41,41,+32,40,40,40,67,39,32,40,95,56,49,32,95,53,56,54,41,41,32,40,+40,67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,57,50,50,51,+51,55,50,48,51,54,56,53,52,55,55,53,56,48,55,41,41,32,35,53,+50,41,41,32,35,50,48,52,55,41,41,32,40,40,40,67,39,32,40,95,+50,48,51,32,95,53,56,51,41,41,32,40,40,67,32,40,95,54,55,32,+95,53,56,54,41,41,32,35,52,53,48,51,53,57,57,54,50,55,51,55,+48,52,57,53,41,41,32,35,48,41,41,41,32,95,49,51,55,54,41,41,+32,40,40,65,32,58,49,55,48,32,40,40,66,32,40,40,40,83,39,32,+95,49,50,49,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,53,+56,51,41,41,32,40,40,40,67,39,32,40,95,56,49,32,95,53,56,54,+41,41,32,40,40,67,32,40,95,54,55,32,95,53,56,54,41,41,32,35,+57,50,50,51,51,55,50,48,51,54,56,53,52,55,55,53,56,48,55,41,+41,32,35,53,50,41,41,32,35,50,48,52,55,41,41,32,40,40,40,67,+39,32,40,95,50,48,50,32,95,53,56,51,41,41,32,40,40,67,32,40,+95,54,55,32,95,53,56,54,41,41,32,35,52,53,48,51,53,57,57,54,+50,55,51,55,48,52,57,53,41,41,32,35,48,41,41,41,32,95,49,51,+55,54,41,41,32,40,40,65,32,58,49,55,49,32,40,40,66,32,40,40,+40,83,39,32,95,49,50,49,41,32,40,40,40,67,39,32,40,95,50,48,+50,32,95,53,56,51,41,41,32,40,40,40,67,39,32,40,95,56,49,32,+95,53,56,54,41,41,32,40,40,67,32,40,95,54,55,32,95,53,56,54,+41,41,32,35,57,50,50,51,51,55,50,48,51,54,56,53,52,55,55,53,+56,48,55,41,41,32,35,53,50,41,41,32,35,48,41,41,32,40,40,40,+67,39,32,40,95,50,48,51,32,95,53,56,51,41,41,32,40,40,67,32,+40,95,54,55,32,95,53,56,54,41,41,32,35,52,53,48,51,53,57,57,+54,50,55,51,55,48,52,57,53,41,41,32,35,48,41,41,41,32,95,49,+51,55,54,41,41,32,40,40,65,32,58,49,55,50,32,40,40,66,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,40,40,67,39,32,40,95,50,+48,51,32,95,53,56,51,41,41,32,40,40,67,32,40,95,54,55,32,95,+53,56,54,41,41,32,35,45,57,50,50,51,51,55,50,48,51,54,56,53,+52,55,55,53,56,48,56,41,41,32,35,48,41,41,32,40,40,40,67,39,+32,40,95,50,48,50,32,95,53,56,51,41,41,32,40,40,67,32,40,95,+54,55,32,95,53,56,54,41,41,32,35,57,50,50,51,51,55,50,48,51,+54,56,53,52,55,55,53,56,48,55,41,41,32,35,48,41,41,41,32,95,+49,51,55,54,41,41,32,40,40,65,32,58,49,55,51,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,52,56,49,32,95,49,53,49,41,+41,32,40,95,52,56,53,32,95,49,53,49,41,41,41,32,40,40,95,50,+54,48,32,40,40,67,32,40,40,80,32,95,49,53,50,41,32,95,50,55,+56,41,41,32,95,50,56,50,41,41,32,40,40,95,52,56,53,32,95,49,+53,49,41,32,40,95,51,53,57,32,35,50,41,41,41,41,41,32,40,40,+65,32,58,49,55,52,32,40,40,66,32,90,41,32,85,41,41,32,40,40,+65,32,58,49,55,53,32,40,90,32,85,41,41,32,40,40,65,32,58,49,+55,54,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,66,+32,95,50,48,50,41,32,40,85,32,75,41,41,41,41,32,40,75,32,95,+49,50,52,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,85,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,66,32,95,+50,48,50,41,32,40,85,32,65,41,41,41,41,41,32,40,40,66,32,95,+50,48,53,41,32,40,40,66,32,95,49,55,54,41,32,40,40,40,83,39,+32,80,41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,41,41,+41,32,40,40,65,32,58,49,55,55,32,80,41,32,40,40,65,32,58,49,+55,56,32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,56,41,32,+40,40,40,83,39,32,40,83,39,32,80,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,57,56,41,32,40,40,67,+32,40,95,53,48,48,32,95,50,56,50,41,41,32,95,49,54,48,49,41,+41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,32,40,95,49,+53,57,55,32,34,76,101,102,116,32,34,41,41,41,41,32,40,40,40,67,+39,32,95,49,53,56,57,41,32,40,85,32,75,41,41,32,95,49,54,48,+49,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,53,57,56,41,32,40,40,67,32,40,95,53,48,48,32,95,+50,56,50,41,41,32,95,49,54,48,49,41,41,41,41,32,40,40,66,32,+40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,34,82,105,103,+104,116,32,34,41,41,41,41,32,40,40,40,67,39,32,95,49,53,56,57,+41,32,40,85,32,65,41,41,32,95,49,54,48,49,41,41,41,41,41,32,+40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,49,55,56,41,+32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,32,40,85,32,+65,41,41,41,41,41,41,32,40,40,66,32,95,49,53,57,52,41,32,40,+40,66,32,95,49,55,56,41,32,40,40,40,83,39,32,80,41,32,40,85,+32,75,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,40,65,32,+58,49,55,57,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,48,32,40,85,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,49,32,40,85,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,50,32,40,85,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,51,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,52,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,53,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,54,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,55,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,56,56,32,40,40,40,83,39,32,95,50,54,51,41,+32,95,49,56,50,41,32,40,40,66,32,40,95,50,54,51,32,40,40,67,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,95,52,56,53,+32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,+32,95,49,56,51,41,41,41,32,40,40,65,32,58,49,56,57,32,40,40,+40,83,39,32,95,50,54,51,41,32,95,49,56,50,41,32,40,40,66,32,+40,95,50,54,51,32,40,40,95,52,57,51,32,95,50,55,55,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,+41,41,41,41,41,32,95,49,56,51,41,41,41,32,40,40,65,32,58,49,+57,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,69,110,+117,109,46,116,111,69,110,117,109,34,41,41,41,32,40,40,65,32,58,49,+57,49,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,69,110,+117,109,46,102,114,111,109,69,110,117,109,34,41,41,41,32,40,40,65,32,+58,49,57,50,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,51,+57,53,41,32,95,49,56,50,41,41,32,40,40,66,32,40,66,32,40,95,+49,56,52,32,95,49,57,56,41,41,41,32,95,49,56,51,41,41,41,32,+40,40,65,32,58,49,57,51,32,40,40,40,83,39,32,66,41,32,40,66,+39,32,40,40,66,32,95,51,57,53,41,32,95,49,56,50,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,49,56,53,32,95,49,57,56,41,41,41,32,95,49,56,51,41,+41,32,95,49,56,51,41,41,41,32,40,40,65,32,58,49,57,52,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,51,57,53,+41,32,95,49,56,50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,40,95,49,56,54,32,95,49,57,+56,41,41,41,32,95,49,56,51,41,41,32,95,49,56,51,41,41,41,32,+40,40,65,32,58,49,57,53,32,40,40,40,83,39,32,66,41,32,40,66,+39,32,40,66,39,32,40,40,66,32,95,51,57,53,41,32,95,49,56,50,+41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,95,49,56,55,32,95,49,57,56,41,41,41,32,95,+49,56,51,41,41,32,95,49,56,51,41,41,32,95,49,56,51,41,41,41,+32,40,40,65,32,58,49,57,54,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,95,51,57,53,41,32,40,40,66,32,95,49,56,50,41,32,40,+85,32,75,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,95,+49,56,54,32,95,49,57,56,41,41,41,32,40,40,66,32,95,49,56,51,+41,32,40,85,32,75,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,95,49,56,51,41,32,40,85,32,75,41,41,41,32,40,40,66,+32,95,50,55,48,41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,+65,41,41,41,41,41,41,41,32,40,40,65,32,58,49,57,55,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,40,83,39,32,40,83,+39,32,67,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+83,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,83,41,32,+40,95,53,48,48,32,95,50,56,50,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,51,57,53,+41,32,40,40,66,32,95,49,56,50,41,32,40,85,32,75,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,+32,40,95,49,56,55,32,95,49,57,56,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,40,66,32,95,49,56,51,41,32,40,85,32,75,+41,41,41,32,40,40,66,32,95,50,55,48,41,32,40,40,66,32,95,49,+50,55,41,32,40,85,32,65,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,51,+57,53,41,32,40,40,66,32,95,49,56,50,41,32,40,85,32,75,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,+40,67,32,40,95,49,56,55,32,95,49,57,56,41,41,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,95,49,56,51,41,32,40,85,+32,75,41,41,41,32,40,40,66,32,95,50,55,48,41,32,40,40,66,32,+95,49,50,56,41,32,40,85,32,65,41,41,41,41,41,41,41,41,32,40,+40,66,32,95,49,56,51,41,32,40,85,32,75,41,41,41,41,32,40,40,+66,32,95,49,56,51,41,32,40,85,32,75,41,41,41,41,32,40,40,65,+32,58,49,57,56,32,40,40,40,40,40,40,40,40,95,49,55,57,32,40,+40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,+41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,+41,41,41,41,32,73,41,32,73,41,32,40,40,83,32,95,52,54,50,41,+32,40,40,66,32,40,95,49,56,52,32,95,49,57,56,41,41,32,40,40,+67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,89,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,83,32,95,52,54,50,41,41,41,41,32,40,40,+66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,32,40,67,+32,40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,73,41,+41,32,40,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,+40,95,52,57,56,32,95,50,56,50,41,41,41,41,32,40,95,49,56,52,+32,95,49,57,56,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,+40,83,39,32,40,83,39,32,83,39,41,41,32,40,67,32,40,95,52,57,+57,32,95,50,56,50,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,95,52,50,52,41,32,40,67,32,40,95,53,48,48,32,95,50,56,+50,41,41,41,41,41,32,40,95,49,56,53,32,95,49,57,56,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,52,50,52,41,32,+40,67,32,40,95,52,57,56,32,95,50,56,50,41,41,41,41,41,32,40,+95,49,56,53,32,95,49,57,56,41,41,41,41,41,32,40,40,65,32,58,+49,57,57,32,40,40,40,40,40,40,40,40,95,49,55,57,32,40,95,49,+56,56,32,95,49,57,57,41,41,32,40,95,49,56,57,32,95,49,57,57,+41,41,32,40,40,67,32,40,40,83,32,40,40,67,32,61,61,41,32,35,+48,41,41,32,40,40,67,32,40,40,67,32,40,40,67,32,61,61,41,32,+35,49,41,41,32,40,95,50,52,32,34,69,110,117,109,46,66,111,111,108,+46,116,111,69,110,117,109,58,32,98,97,100,32,97,114,103,34,41,41,41,+32,95,49,50,53,41,41,41,32,95,49,50,52,41,41,32,40,40,80,32,+35,48,41,32,35,49,41,41,32,40,95,49,57,50,32,95,49,57,57,41,+41,32,40,95,49,57,51,32,95,49,57,57,41,41,32,40,95,49,57,52,+32,95,49,57,57,41,41,32,40,95,49,57,53,32,95,49,57,57,41,41,+41,32,40,40,65,32,58,50,48,48,32,40,40,40,40,40,40,40,40,95,+49,55,57,32,40,95,49,56,56,32,95,50,48,48,41,41,32,40,95,49,+56,57,32,95,50,48,48,41,41,32,95,49,52,48,50,41,32,95,49,52,+48,51,41,32,40,95,49,57,50,32,95,50,48,48,41,41,32,40,95,49,+57,51,32,95,50,48,48,41,41,32,40,95,49,57,52,32,95,50,48,48,+41,41,32,40,95,49,57,53,32,95,50,48,48,41,41,41,32,40,40,65,+32,58,50,48,49,32,80,41,32,40,40,65,32,58,50,48,50,32,40,85,+32,75,41,41,32,40,40,65,32,58,50,48,51,32,40,85,32,65,41,41,+32,40,40,65,32,58,50,48,52,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,69,113,46,61,61,34,41,41,41,32,40,40,65,32,58,+50,48,53,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,95,50,48,50,41,32,95,49,+50,53,41,41,32,95,49,50,52,41,41,32,40,40,65,32,58,50,48,54,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,48,55,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,48,56,32,40,85,32,40,75,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,48,57,32,40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,49,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,51,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,52,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,53,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,55,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,56,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,49,57,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,49,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,51,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,52,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,53,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,55,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,56,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,50,57,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,50,51,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+70,108,111,97,116,105,110,103,46,112,105,34,41,41,41,32,40,40,65,32,+58,50,51,49,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+70,108,111,97,116,105,110,103,46,101,120,112,34,41,41,41,32,40,40,65,+32,58,50,51,50,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,+34,70,108,111,97,116,105,110,103,46,108,111,103,34,41,41,41,32,40,40,+65,32,58,50,51,51,32,40,40,40,83,39,32,67,41,32,95,50,49,50,+41,32,40,40,83,32,40,40,40,83,39,32,95,50,53,52,41,32,95,50,+48,55,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,+95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,35,+49,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,+66,32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,+32,35,50,41,41,41,41,41,32,40,40,65,32,58,50,51,52,32,40,40,+40,83,39,32,66,41,32,40,66,39,32,95,50,48,57,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,95,50,49,48,41,+41,41,32,40,40,65,32,58,50,51,53,32,40,40,40,83,39,32,66,41,+32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,95,50,53,52,41,+32,95,50,48,55,41,41,32,95,50,49,48,41,41,32,95,50,49,48,41,+41,32,40,40,65,32,58,50,51,54,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,70,108,111,97,116,105,110,103,46,115,105,110,34,41,+41,41,32,40,40,65,32,58,50,51,55,32,40,75,32,40,110,111,68,101,+102,97,117,108,116,32,34,70,108,111,97,116,105,110,103,46,99,111,115,34,+41,41,41,32,40,40,65,32,58,50,51,56,32,40,40,83,32,40,40,40,+83,39,32,83,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,+55,41,41,32,95,50,49,52,41,41,32,95,50,49,53,41,41,32,40,40,+65,32,58,50,51,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,+32,34,70,108,111,97,116,105,110,103,46,97,115,105,110,34,41,41,41,32,+40,40,65,32,58,50,52,48,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,70,108,111,97,116,105,110,103,46,97,99,111,115,34,41,41,+41,32,40,40,65,32,58,50,52,49,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,70,108,111,97,116,105,110,103,46,97,116,97,110,34,+41,41,41,32,40,40,65,32,58,50,52,50,32,40,40,83,32,40,40,40,+83,39,32,67,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,+55,41,41,32,40,40,83,32,40,40,40,83,39,32,83,39,41,32,40,40,+66,32,95,52,56,48,41,32,40,40,66,32,95,50,53,51,41,32,95,50,+48,55,41,41,41,32,95,50,48,57,41,41,32,40,40,40,83,39,32,66,+41,32,95,50,48,57,41,32,40,40,66,32,95,52,56,50,41,32,40,40,+66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,+32,95,50,48,55,41,41,32,40,95,51,53,57,32,35,50,41,41,41,41,+32,40,40,65,32,58,50,52,51,32,40,40,83,32,40,40,40,83,39,32,+67,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,55,41,41,+32,40,40,83,32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,95,+52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,+41,41,32,95,50,48,57,41,41,32,40,40,40,83,39,32,66,41,32,95,+50,48,57,41,32,40,40,66,32,95,52,56,50,41,32,40,40,66,32,95,+50,53,51,41,32,95,50,48,55,41,41,41,41,41,41,32,40,40,40,67,+39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,95,50,+48,55,41,41,32,40,95,51,53,57,32,35,50,41,41,41,41,32,40,40,+65,32,58,50,52,52,32,40,40,83,32,40,40,40,83,39,32,83,39,41,+32,40,40,66,32,95,50,53,52,41,32,95,50,48,55,41,41,32,95,50,+50,48,41,41,32,95,50,50,49,41,41,32,40,40,65,32,58,50,52,53,+32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,32,40,40,40,83,+39,32,83,41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,95,+50,53,51,41,32,95,50,48,55,41,41,41,32,40,40,40,83,39,32,66,+41,32,95,50,49,49,41,32,40,40,83,32,40,40,40,83,39,32,67,39,+41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,+41,32,95,50,48,55,41,41,41,32,40,40,40,67,39,32,83,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,95,50,53,51,41,32,95,+50,48,55,41,41,41,32,73,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,+32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,41,32,40,40,65,+32,58,50,52,54,32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,+32,40,40,40,83,39,32,83,41,32,40,40,66,32,95,52,55,57,41,32,+40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,40,40,+40,83,39,32,66,41,32,95,50,49,49,41,32,40,40,83,32,40,40,40,+83,39,32,67,39,41,32,40,40,66,32,95,52,56,48,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,40,40,40,67,39,+32,83,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,32,95,50,+53,51,41,32,95,50,48,55,41,41,41,32,73,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,95,+50,48,55,41,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,+41,32,40,40,65,32,58,50,52,55,32,40,40,83,32,40,40,40,83,39,+32,67,39,41,32,40,40,66,32,95,50,53,52,41,32,95,50,48,55,41,+41,32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,32,40,40,83,+32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,95,50,53,52,41,+32,95,50,48,55,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,+55,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,+35,49,41,41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,52,56,48,41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,+55,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,+35,49,41,41,41,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,+41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,+95,51,53,57,32,35,50,41,41,41,41,32,40,40,65,32,58,50,52,56,+32,40,40,40,83,39,32,66,41,32,95,50,49,48,41,32,40,40,40,83,+39,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,95,50,+48,55,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,32,+35,49,41,41,41,41,41,32,40,40,65,32,58,50,52,57,32,40,40,83,+32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,95,52,56,48,41,+32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,95,+50,48,57,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,+66,32,95,50,53,51,41,32,95,50,48,55,41,41,32,40,95,51,53,57,+32,35,49,41,41,41,41,32,40,40,65,32,58,50,53,48,32,40,40,40,+83,39,32,66,41,32,95,50,50,54,41,32,95,50,48,57,41,41,32,40,+40,65,32,58,50,53,49,32,40,40,40,83,39,32,66,41,32,95,50,50,+54,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,52,56,50,+41,32,40,40,66,32,95,50,53,51,41,32,95,50,48,55,41,41,41,32,+95,50,48,57,41,41,41,32,40,40,65,32,58,50,53,50,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,32,40,40,65,32,58,50,53,51,32,40,85,32,+40,90,32,40,90,32,75,41,41,41,41,32,40,40,65,32,58,50,53,52,+32,40,85,32,40,75,32,40,90,32,75,41,41,41,41,32,40,40,65,32,+58,50,53,53,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,32,+40,40,65,32,58,50,53,54,32,40,85,32,40,75,32,40,75,32,65,41,+41,41,41,32,40,40,65,32,58,50,53,55,32,40,75,32,40,110,111,68,+101,102,97,117,108,116,32,34,70,114,97,99,116,105,111,110,97,108,46,47,+34,41,41,41,32,40,40,65,32,58,50,53,56,32,40,40,83,32,95,50,+53,52,41,32,40,40,40,67,39,32,95,52,56,53,41,32,95,50,53,51,+41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,40,40,65,32,58,+50,53,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,70,+114,97,99,116,105,111,110,97,108,46,102,114,111,109,82,97,116,105,111,110,+97,108,34,41,41,41,32,40,40,65,32,58,50,54,48,32,40,40,40,83,+39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,+53,48,48,41,32,40,85,32,40,75,32,65,41,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,+40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,32,75,41,41,41,+41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,53,53,41,32,+40,85,32,40,90,32,75,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,95,51,56,52,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,+50,53,51,41,32,40,85,32,40,90,32,75,41,41,41,41,32,40,85,32,+40,75,32,75,41,41,41,41,32,40,85,32,40,75,32,65,41,41,41,41,+41,32,40,40,66,32,95,52,56,50,41,32,40,40,66,32,40,85,32,65,+41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,32,75,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,95,51,56,52,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,+66,32,95,50,53,51,41,32,40,85,32,40,90,32,75,41,41,41,41,32,+40,85,32,40,75,32,75,41,41,41,41,32,40,85,32,40,75,32,65,41,+41,41,41,41,41,32,40,40,65,32,58,50,54,49,32,73,41,32,40,40,+65,32,58,50,54,50,32,40,83,32,95,49,51,57,57,41,41,32,40,40,+65,32,58,50,54,51,32,66,41,32,40,40,65,32,58,50,54,52,32,73,+41,32,40,40,65,32,58,50,54,53,32,75,41,32,40,40,65,32,58,50,+54,54,32,67,41,32,40,40,65,32,58,50,54,55,32,95,49,51,57,56,+41,32,40,40,65,32,58,50,54,56,32,85,41,32,40,40,65,32,58,50,+54,57,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,66,41,41,+41,32,66,41,32,73,41,41,32,40,40,65,32,58,50,55,48,32,95,50,+54,53,41,32,40,40,65,32,58,50,55,49,32,80,41,32,40,40,65,32,+58,50,55,50,32,40,85,32,75,41,41,32,40,40,65,32,58,50,55,51,+32,40,85,32,65,41,41,32,40,40,65,32,58,50,55,52,32,40,75,32,+40,110,111,68,101,102,97,117,108,116,32,34,70,117,110,99,116,111,114,46,+102,109,97,112,34,41,41,41,32,40,40,65,32,58,50,55,53,32,40,40,+40,67,39,32,95,50,54,51,41,32,95,50,55,50,41,32,95,50,54,53,+41,41,32,40,40,65,32,58,50,55,54,32,95,50,55,50,41,32,40,40,+65,32,58,50,55,55,32,40,40,40,40,40,40,40,95,52,55,56,32,95,+49,51,52,50,41,32,95,49,51,52,51,41,32,95,49,51,52,52,41,32,+95,49,51,52,56,41,32,40,40,83,32,40,40,83,32,40,40,67,32,40,+95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,73,41,41,+32,40,95,52,56,50,32,95,50,55,55,41,41,41,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,95,52,57,54,32,95,50,56,+50,41,41,32,35,48,41,41,32,35,45,49,41,41,32,35,48,41,41,32,+35,49,41,41,32,95,51,54,48,41,41,32,40,40,65,32,58,50,55,56,+32,40,40,40,40,40,40,40,40,95,51,54,52,32,40,40,80,32,95,50,+56,49,41,32,95,50,55,55,41,41,32,95,49,51,52,53,41,32,95,49,+51,52,54,41,32,40,95,51,55,53,32,95,50,55,56,41,41,32,40,95,+51,55,54,32,95,50,55,56,41,41,32,40,95,51,55,55,32,95,50,55,+56,41,41,32,40,95,51,55,56,32,95,50,55,56,41,41,32,95,51,53,+57,41,41,32,40,40,65,32,58,50,55,57,32,40,40,95,49,50,54,32,+40,40,40,95,52,55,57,32,95,50,55,55,41,32,40,95,49,51,56,57,+32,40,40,95,49,51,54,54,32,35,45,49,41,32,35,50,41,41,41,32,+35,49,41,41,32,40,95,49,51,56,57,32,40,40,95,49,51,54,54,32,+35,45,49,41,32,35,50,41,41,41,41,32,40,40,65,32,58,50,56,48,+32,40,95,53,51,49,32,40,40,66,32,95,53,50,57,41,32,95,51,53,+57,41,41,41,32,40,40,65,32,58,50,56,49,32,40,40,95,50,48,49,+32,95,49,51,55,55,41,32,95,49,51,55,56,41,41,32,40,40,65,32,+58,50,56,50,32,40,40,40,40,40,40,40,40,95,52,57,52,32,95,50,+56,49,41,32,95,49,52,48,48,41,32,95,49,51,55,57,41,32,95,49,+51,56,48,41,32,95,49,51,56,49,41,32,95,49,51,56,50,41,32,40,+95,53,48,56,32,95,50,56,50,41,41,32,40,95,53,48,57,32,95,50,+56,50,41,41,41,32,40,40,65,32,58,50,56,51,32,40,40,40,95,49,+53,56,56,32,40,95,49,53,57,50,32,95,50,56,51,41,41,32,95,50,+56,52,41,32,40,95,49,53,57,52,32,95,50,56,51,41,41,41,32,40,+40,65,32,58,50,56,52,32,40,40,83,32,40,40,83,32,40,40,67,32,+40,95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,+66,32,95,50,56,53,41,32,40,95,52,56,50,32,95,50,55,55,41,41,+41,41,32,40,40,66,32,40,95,52,54,50,32,35,52,53,41,41,32,95,+50,56,53,41,41,41,32,40,40,65,32,58,50,56,53,32,40,40,83,32,+40,40,67,32,40,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,+52,57,57,32,95,50,56,50,41,41,32,35,45,49,48,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,+32,95,50,56,53,41,32,40,40,67,32,40,95,51,54,54,32,95,50,55,+56,41,41,32,35,49,48,41,41,41,41,32,40,40,67,32,79,41,32,75,+41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,40,40,66,+32,95,49,52,48,50,41,32,40,40,66,32,40,40,95,52,56,48,32,95,+50,55,55,41,32,40,95,49,52,48,51,32,35,52,56,41,41,41,32,40,+40,67,32,40,95,51,54,55,32,95,50,55,56,41,41,32,35,49,48,41,+41,41,41,41,32,40,40,65,32,58,50,56,54,32,40,90,32,75,41,41,+32,40,40,65,32,58,50,56,55,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,80,41,41,41,32,40,40,65,32,58,50,56,+56,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,+41,41,41,41,32,40,40,65,32,58,50,56,57,32,40,40,40,83,39,32,+83,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,83,39,32,83,39,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,49,50,48,41,32,40,40,67,32,40,95,53,48,+48,32,95,50,56,50,41,41,32,35,48,41,41,41,32,40,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,80,41,32,40,40,67,32,40,95,+52,56,48,32,95,50,55,55,41,41,32,35,49,41,41,41,41,32,40,67,+32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,41,32,40,67,32,+80,41,41,41,32,40,95,51,54,54,32,95,50,55,56,41,41,41,32,40,+95,51,54,55,32,95,50,55,56,41,41,41,32,40,40,65,32,58,50,57,+48,32,95,50,56,54,41,32,40,40,65,32,58,50,57,49,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,40,80,32,95,52,55,54,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,+67,41,32,40,95,50,48,50,32,95,50,56,49,41,41,32,95,52,55,54,+41,41,32,95,52,55,55,41,41,41,32,40,40,66,32,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,+32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,32,35,49,41,41,41,41,32,40,+40,66,32,40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,+83,39,41,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,+32,35,50,41,41,41,32,40,67,32,95,50,57,49,41,41,41,41,32,40,+67,32,95,50,57,49,41,41,41,41,41,32,40,67,32,95,50,57,49,41,+41,41,41,41,32,40,67,32,95,50,57,49,41,41,41,41,32,40,85,32,+75,41,41,41,32,40,85,32,65,41,41,41,41,32,40,40,67,32,95,50,+56,57,41,32,35,52,41,41,41,41,32,40,40,65,32,58,50,57,50,32,+40,95,50,57,56,32,95,50,54,53,41,41,32,40,40,65,32,58,50,57,+51,32,40,40,95,51,57,55,32,40,95,50,54,56,32,95,50,57,50,41,+41,32,95,50,57,48,41,41,32,40,40,65,32,58,50,57,52,32,40,40,+67,32,40,40,40,67,39,32,66,41,32,40,40,80,32,95,52,54,49,41,+32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+95,50,57,53,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,50,+57,53,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,50,57,53,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,51,57,53,41,32,40,85,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,32,95,50,57,52,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,51,57,53,41,32,40,85,32,35,49,41,41,41,32,95,+50,57,52,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,51,57,53,41,32,40,85,32,35,50,41,41,41,32,95,50,57,52,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,51,+57,53,41,32,40,85,32,35,51,41,41,41,32,95,50,57,52,41,41,41,+41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,80,41,41,32,+40,40,67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,+67,32,40,95,52,56,49,32,95,50,55,55,41,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,52,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,50,57,53,32,40,40,66,32,89,41,+32,40,40,40,83,39,32,66,41,32,83,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,83,41,32,85,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,67,+32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,83,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,32,66,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,66,39,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,66,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,40,95,52,57,+55,32,95,50,56,50,41,41,41,41,41,32,40,40,67,39,32,66,41,32,+95,52,54,50,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,95,52,54,50,41,41,32,40,67,32,95,50,57,53,41,41,41,+41,41,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,+46,47,108,105,98,47,68,97,116,97,47,73,110,116,77,97,112,46,104,115,+34,41,32,35,54,53,41,32,35,49,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,50,57,54,32,40,40,95,50,54,51,32,40,95,51,+57,53,32,95,53,54,53,41,41,32,95,50,57,52,41,41,32,40,40,65,+32,58,50,57,55,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,67,32,95,50,57,49,41,41,32,40,95,50,52,32,34,+68,97,116,97,46,73,110,116,77,97,112,46,33,34,41,41,41,32,73,41,+41,32,40,40,65,32,58,50,57,56,32,40,40,66,32,40,67,39,32,89,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,+40,66,32,40,83,39,32,80,41,41,32,40,67,32,95,50,56,55,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,83,39,41,41,+32,40,95,50,48,50,32,95,50,56,49,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,66,32,+95,50,54,49,41,41,41,32,40,40,40,67,39,32,40,67,39,32,95,50,+54,49,41,41,32,95,50,57,50,41,32,40,40,40,40,95,50,56,56,32,+95,50,56,54,41,32,95,50,56,54,41,32,95,50,56,54,41,32,95,50,+56,54,41,41,41,41,41,41,41,32,40,66,32,40,40,67,39,32,66,41,+32,95,50,56,55,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,83,39,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,50,+48,50,32,95,50,56,49,41,41,32,35,48,41,41,41,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,+39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,+50,48,50,32,95,50,56,49,41,41,32,35,49,41,41,41,41,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,+83,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,40,67,39,32,83,39,41,32,40,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,32,35,50,41,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,95,50,56,56,+41,41,41,32,67,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,67,39,41,41,32,95,50,+56,56,41,41,41,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,67,39,41,32,95,50,56,56,41,41,41,32,67,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,95,50,56,56,41,41,41,32,67,+41,41,41,41,41,41,32,40,85,32,75,41,41,41,32,40,85,32,65,41,+41,41,41,32,40,40,67,32,95,50,56,57,41,32,35,52,41,41,41,41,+41,32,40,40,65,32,58,50,57,57,32,73,41,32,40,40,65,32,58,51,+48,48,32,40,95,50,57,57,32,95,50,57,48,41,41,32,40,40,65,32,+58,51,48,49,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,95,50,57,49,41,32,95,49,50,52,41,41,32,40,75,32,95,+49,50,53,41,41,41,32,40,40,65,32,58,51,48,50,32,40,40,66,32,+40,66,32,95,50,57,57,41,41,32,40,40,67,32,95,50,57,50,41,32,+95,49,51,52,49,41,41,41,32,40,40,65,32,58,51,48,51,32,40,40,+66,32,95,50,57,57,41,32,40,40,66,32,95,50,57,51,41,32,40,40,+67,32,95,52,49,50,41,32,40,95,52,52,55,32,95,49,51,52,49,41,+41,41,41,41,32,40,40,65,32,58,51,48,52,32,40,40,66,32,40,95,+51,57,53,32,95,53,54,53,41,41,32,95,50,57,52,41,41,32,40,40,+65,32,58,51,48,53,32,40,40,95,50,48,49,32,95,51,52,55,41,32,+95,51,52,56,41,41,32,40,40,65,32,58,51,48,54,32,40,40,40,40,+40,40,40,40,95,52,57,52,32,95,51,48,53,41,32,40,95,53,48,51,+32,95,51,48,54,41,41,32,95,51,52,57,41,32,95,51,53,48,41,32,+95,51,53,49,41,32,95,51,53,50,41,32,40,95,53,48,56,32,95,51,+48,54,41,41,32,40,95,53,48,57,32,95,51,48,54,41,41,41,32,40,+40,65,32,58,51,48,55,32,40,40,40,95,49,53,56,56,32,40,95,49,+53,57,50,32,95,51,48,55,41,41,32,95,51,52,51,41,32,40,95,49,+53,57,52,32,95,51,48,55,41,41,41,32,40,40,65,32,58,51,48,56,+32,40,40,40,40,40,40,40,95,52,55,56,32,95,51,49,54,41,32,95,+51,49,57,41,32,95,51,50,56,41,32,95,51,49,55,41,32,95,51,49,+56,41,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+95,52,57,54,32,95,51,48,54,41,41,32,95,51,51,56,41,41,32,95,+51,52,50,41,41,32,95,51,51,56,41,41,32,95,51,51,57,41,41,32,+73,41,41,32,40,40,65,32,58,51,48,57,32,40,40,40,40,40,40,40,+40,95,51,54,52,32,40,40,80,32,95,51,48,53,41,32,95,51,48,56,+41,41,32,40,95,51,55,51,32,95,51,48,57,41,41,32,40,95,51,55,+52,32,95,51,48,57,41,41,32,40,95,51,55,53,32,95,51,48,57,41,+41,32,40,95,51,55,54,32,95,51,48,57,41,41,32,95,51,51,50,41,+32,40,95,51,55,56,32,95,51,48,57,41,41,32,73,41,41,32,40,40,+65,32,58,51,49,48,32,40,95,53,51,49,32,95,53,50,57,41,41,32,+40,40,65,32,58,51,49,49,32,40,40,40,40,40,40,40,40,95,49,55,+57,32,40,40,67,32,40,95,52,55,57,32,95,51,48,56,41,41,32,40,+40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,32,35,49,+41,41,41,41,32,40,40,67,32,40,95,52,56,48,32,95,51,48,56,41,+41,32,40,40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,+32,35,49,41,41,41,41,32,95,51,53,57,41,32,95,51,54,48,41,32,+40,40,83,32,95,52,54,50,41,32,40,40,66,32,40,95,49,56,52,32,+95,51,49,49,41,41,32,40,40,67,32,40,95,52,55,57,32,95,51,48,+56,41,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,89,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,83,32,95,52,54,50,41,41,41,41,32,40,40,66,32,40,66,+32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,+95,52,55,57,32,95,51,48,56,41,41,41,41,32,40,67,32,40,95,52,+56,48,32,95,51,48,56,41,41,41,41,41,41,32,73,41,41,32,40,40,+66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,40,95,52,57,+56,32,95,51,48,54,41,41,41,41,32,40,95,49,56,52,32,95,51,49,+49,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,83,39,32,+40,83,39,32,83,39,41,41,32,40,67,32,40,95,52,57,57,32,95,51,+48,54,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,52,+50,52,41,32,40,67,32,40,95,53,48,48,32,95,51,48,54,41,41,41,+41,41,32,40,95,49,56,53,32,95,51,49,49,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,40,+95,52,57,56,32,95,51,48,54,41,41,41,41,41,32,40,95,49,56,53,+32,95,51,49,49,41,41,41,41,41,32,40,40,65,32,58,51,49,50,32,+40,85,32,40,75,32,95,51,57,50,41,41,41,32,40,40,65,32,58,51,+49,51,32,40,40,95,50,48,49,32,40,40,67,32,40,40,67,32,83,39,+41,32,40,40,80,32,95,49,50,53,41,32,95,49,50,52,41,41,41,32,+40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,41,32,40,95,+50,48,53,32,95,51,49,51,41,41,41,32,40,40,65,32,58,51,49,52,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,32,40,85,32,+40,40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,41,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,95,51,53,53,+41,41,41,41,32,95,51,50,54,41,41,32,40,40,65,32,58,51,49,53,+32,35,48,41,32,40,40,65,32,58,51,49,54,32,40,40,67,32,40,40,+40,67,39,32,67,39,41,32,66,41,32,40,40,40,83,39,32,40,83,39,+32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,+32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,66,32,40,40,83,+39,32,67,41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,66,+32,40,66,32,40,95,51,53,53,32,95,51,53,54,41,41,41,32,95,51,+50,48,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,83,41,41,+32,40,40,66,32,40,40,83,39,32,83,41,32,95,51,50,55,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,95,49,50,53,41,41,32,+40,40,66,32,40,66,32,40,95,51,49,52,32,95,51,53,54,41,41,41,+32,95,51,50,51,41,41,41,41,32,40,40,66,32,40,66,32,40,95,51,+49,52,32,95,51,53,55,41,41,41,32,40,67,32,95,51,50,51,41,41,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,40,67,39,+32,83,39,41,32,66,41,32,40,40,40,67,39,32,40,83,39,32,67,41,+41,32,40,40,66,32,40,66,32,40,67,32,67,39,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,83,41,32,40,67,32,95,51,50,55,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,95,49,50,53,41,41,32,40,40,+66,32,40,66,32,40,95,51,49,52,32,95,51,53,54,41,41,41,32,40,+67,32,95,51,50,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+95,51,49,52,32,95,51,53,55,41,41,41,32,95,51,50,51,41,41,41,+41,32,73,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,+85,41,41,32,40,40,66,32,40,66,32,40,95,51,53,53,32,95,51,53,+55,41,41,41,32,95,51,50,48,41,41,41,41,41,41,41,32,40,40,40,+110,111,77,97,116,99,104,32,34,46,47,108,105,98,47,68,97,116,97,47,+73,110,116,101,103,101,114,46,104,115,34,41,32,35,49,50,50,41,32,35,+49,41,41,41,32,40,40,65,32,58,51,49,55,32,40,40,83,32,73,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,85,41,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,67,32,40,+40,67,32,83,39,41,32,40,95,51,53,53,32,95,51,53,55,41,41,41,+32,40,95,51,53,53,32,95,51,53,54,41,41,41,41,41,41,41,32,40,+40,65,32,58,51,49,56,32,40,85,32,40,75,32,40,95,51,53,53,32,+95,51,53,54,41,41,41,41,32,40,40,65,32,58,51,49,57,32,40,40,+40,67,39,32,66,41,32,95,51,49,54,41,32,95,51,49,55,41,41,32,+40,40,65,32,58,51,50,48,32,40,95,51,50,49,32,95,51,49,53,41,+41,32,40,40,65,32,58,51,50,49,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,40,67,32,83,39,41,41,32,40,40,40,83,39,32,80,41,+32,40,40,67,32,40,40,83,32,40,40,67,32,40,95,50,48,50,32,95,+50,56,49,41,41,32,95,51,49,53,41,41,32,40,40,67,32,79,41,32,+75,41,41,41,32,95,52,54,49,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,40,40,83,39,32,95,52,54,50,41,32,40,85,32,65,41,+41,41,32,40,67,32,40,40,40,67,39,32,95,51,50,49,41,32,40,85,+32,75,41,41,32,95,52,54,49,41,41,41,41,41,32,40,40,67,32,95,+51,50,50,41,32,95,51,49,53,41,41,41,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,39,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,40,83,39,32,95,+52,54,50,41,32,40,85,32,65,41,41,41,32,40,40,40,67,39,32,67,+41,32,40,40,67,39,32,95,51,50,49,41,32,40,85,32,75,41,41,41,+32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,67,41,32,95,+51,50,50,41,32,95,51,49,53,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,40,83,+39,32,95,52,54,50,41,32,40,85,32,65,41,41,41,41,32,40,40,66,+32,67,41,32,40,40,67,39,32,95,51,50,49,41,32,40,85,32,75,41,+41,41,41,41,41,41,32,95,51,50,50,41,41,41,41,32,40,40,65,32,+58,51,50,50,32,40,40,66,32,40,66,32,40,66,32,40,40,40,83,39,+32,80,41,32,40,40,67,32,40,95,51,54,54,32,95,50,55,56,41,41,+32,95,51,53,56,41,41,32,40,40,67,32,40,95,51,54,55,32,95,50,+55,56,41,41,32,95,51,53,56,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,95,52,55,57,32,95,50,55,55,41,41,41,32,40,95,52,55,+57,32,95,50,55,55,41,41,41,41,32,40,40,65,32,58,51,50,51,32,+40,95,51,50,52,32,95,51,49,53,41,41,32,40,40,65,32,58,51,50,+52,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,83,32,83,39,+41,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,83,41,32,40,40,67,32,61,61,41,32,+35,48,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,83,39,41,32,40,40,40,67,39,32,66,41,32,40,85,32,95,52,54,+49,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+41,32,40,40,80,32,95,50,53,41,32,40,75,32,40,75,32,40,40,40,+110,111,77,97,116,99,104,32,34,46,47,108,105,98,47,68,97,116,97,47,+73,110,116,101,103,101,114,46,104,115,34,41,32,35,49,53,56,41,32,35,+49,41,41,41,41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,+66,32,40,40,67,39,32,83,39,41,32,83,39,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,40,40,83,39,32,95,52,54,50,41,32,40,+85,32,65,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,67,39,+32,95,51,50,52,41,32,40,85,32,75,41,41,41,32,95,52,54,49,41,+41,41,41,32,40,40,40,67,39,32,67,41,32,95,51,50,53,41,32,95,+51,49,53,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,40,83,39,32,95,52,54,50,+41,32,40,85,32,65,41,41,41,41,32,40,40,66,32,67,41,32,40,40,+67,39,32,95,51,50,52,41,32,40,85,32,75,41,41,41,41,41,41,41,+32,95,51,50,53,41,41,41,41,32,40,40,65,32,58,51,50,53,32,40,+40,66,32,40,66,32,40,66,32,40,40,83,32,40,40,83,32,40,40,67,+32,40,95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,40,+40,40,83,39,32,80,41,32,40,40,67,32,40,95,51,54,54,32,95,50,+55,56,41,41,32,95,51,53,56,41,41,32,40,40,67,32,40,95,51,54,+55,32,95,50,55,56,41,41,32,95,51,53,56,41,41,41,41,32,40,40,+40,83,39,32,80,41,32,40,40,40,67,39,32,40,95,52,56,48,32,95,+50,55,55,41,41,32,40,40,67,32,40,95,51,54,54,32,95,50,55,56,+41,41,32,95,51,53,56,41,41,32,35,49,41,41,32,40,40,40,67,39,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,67,32,40,95,+51,54,55,32,95,50,55,56,41,41,32,95,51,53,56,41,41,32,95,51,+53,56,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,+52,55,57,32,95,50,55,55,41,41,41,32,40,95,52,56,48,32,95,50,+55,55,41,41,41,41,32,40,40,65,32,58,51,50,54,32,40,40,95,50,+54,51,32,95,52,50,51,41,32,40,40,95,50,54,51,32,40,95,52,50,+53,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,+48,41,41,41,32,95,52,50,51,41,41,41,32,40,40,65,32,58,51,50,+55,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,32,40,67,39,+32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,83,39,+32,95,49,50,48,41,41,32,40,67,32,40,95,52,57,55,32,95,50,56,+50,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+67,39,32,95,49,50,49,41,41,32,40,67,32,40,95,50,48,50,32,95,+50,56,49,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,89,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,66,32,40,67,32,40,40,40,67,39,32,83,39,41,32,83,39,41,32,+40,40,40,67,39,32,66,41,32,40,85,32,95,49,50,52,41,41,32,40,+90,32,75,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,66,39,41,41,32,40,40,66,32,40,40,83,39,32,+66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,49,50,48,41,41,32,40,95,52,57,55,32,95,50,56,50,41,+41,41,41,41,32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,40,+95,50,48,50,32,95,50,56,49,41,41,41,41,41,41,41,41,32,40,95,+50,52,32,34,108,116,87,46,99,109,112,34,41,41,41,41,32,95,52,50,+51,41,41,32,95,52,50,51,41,41,41,41,32,95,52,49,49,41,41,32,+95,52,49,49,41,41,32,40,40,65,32,58,51,50,56,32,40,40,83,32,+66,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,80,32,+40,40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,41,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+40,83,32,73,41,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,+32,40,80,32,40,40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,+49,41,41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,67,32,66,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,+32,40,40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,+32,80,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,51,53,53,41,41,32,95,51,50,57,41,41,41,+32,40,67,32,40,95,51,51,48,32,95,51,49,53,41,41,41,41,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,83,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,80,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,51,53,53,41,41,32,95,51,50,57,41,41,+41,32,40,95,51,51,48,32,95,51,49,53,41,41,41,41,32,40,90,32,+75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,51,53,53,41,41,+32,95,51,50,57,41,41,41,32,95,51,51,49,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,50,57,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,95,50,+48,50,32,95,51,49,51,41,41,32,95,51,53,55,41,41,32,95,51,53,+54,41,41,32,40,40,65,32,58,51,51,48,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,85,41,32,40,40,67,32,40,40,+83,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,+48,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,95,52,54,49,+41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,40,83,39,32,95,52,54,50,41,32,40,40,67,32,40,+95,51,54,55,32,95,50,55,56,41,41,32,95,51,53,56,41,41,41,41,+32,40,40,67,39,32,67,41,32,40,40,67,39,32,95,51,51,48,41,32,+40,40,67,32,40,95,51,54,54,32,95,50,55,56,41,41,32,95,51,53,+56,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,52,+55,57,32,95,50,55,55,41,41,41,32,40,67,32,40,95,52,56,49,32,+95,50,55,55,41,41,41,41,41,41,32,40,40,65,32,58,51,51,49,32,+40,40,66,32,40,66,32,40,95,52,48,48,32,95,51,50,48,41,41,41,+32,40,40,66,32,40,66,32,40,40,95,52,49,51,32,95,52,54,51,41,+32,40,40,95,51,57,53,32,40,40,67,32,95,52,52,54,41,32,35,48,+41,41,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,48,41,41,+41,41,41,32,40,40,66,32,95,51,57,53,41,32,40,95,51,51,48,32,+95,51,49,53,41,41,41,41,41,32,40,40,65,32,58,51,51,50,32,40,+40,66,32,40,83,32,73,41,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,40,80,32,40,95,50,52,32,34,73,110,116,101,103,101,114,+58,32,100,105,118,105,115,105,111,110,32,98,121,32,48,34,41,41,41,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,67,32,66,+41,32,40,40,66,32,40,66,32,40,83,32,40,85,32,40,40,80,32,40,+40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,32,40,+40,95,51,53,53,32,95,51,53,54,41,32,95,52,54,49,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,40,83,39,32,66,41,32,66,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,95,52,48,56,32,+40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,95,+51,51,51,41,41,32,95,51,51,54,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,83,41,32,40,40,66,32,40,40,67,39,+32,95,51,51,53,41,32,40,85,32,65,41,41,41,32,95,52,53,53,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,40,66,32,66,39,41,32,95,51,51,51,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,40,+66,32,95,52,54,51,41,32,40,85,32,75,41,41,41,41,41,41,41,32,+40,40,67,39,32,95,52,50,50,41,32,95,52,49,49,41,41,41,32,95,+52,53,54,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,51,51,51,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,80,41,41,41,32,40,40,66,32,40,66,32,95,51,49,+52,41,41,32,95,51,50,57,41,41,41,32,95,51,49,52,41,41,41,32,+40,40,65,32,58,51,51,52,32,40,40,40,67,39,32,67,41,32,95,51,+51,50,41,32,75,41,41,32,40,40,65,32,58,51,51,53,32,40,40,40,+67,39,32,67,41,32,40,40,66,32,40,67,32,40,40,40,67,39,32,89,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,67,41,32,40,40,66,+32,40,67,32,83,39,41,41,32,40,40,66,32,40,67,32,80,41,41,32,+40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,+66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,67,32,67,39,41,+41,32,40,67,32,40,95,51,54,55,32,95,50,55,56,41,41,41,41,41,+32,40,40,66,32,40,67,39,32,95,52,54,50,41,41,32,40,67,32,40,+95,51,54,54,32,95,50,55,56,41,41,41,41,41,41,41,32,40,40,66,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,67,32,40,95,+52,56,49,32,95,50,55,55,41,41,32,95,51,53,56,41,41,41,41,41,+32,95,51,49,53,41,41,41,32,95,52,50,51,41,41,32,95,52,54,49,+41,41,32,40,40,65,32,58,51,51,54,32,40,40,66,32,40,67,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,41,32,+40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,40,+83,39,32,83,41,32,40,40,66,32,40,40,83,39,32,83,41,32,40,40,+66,32,40,83,32,40,40,67,32,95,51,52,57,41,32,95,51,51,56,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,95,+51,51,55,41,41,32,95,51,51,55,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,40,66,32,95,51,+51,55,41,32,40,40,67,32,95,51,49,57,41,32,95,51,51,57,41,41,+41,41,41,32,40,40,66,32,40,66,32,95,51,51,55,41,41,32,40,67,+32,95,51,49,54,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,95,51,49,57,41,41,32,40,67,32,95,51,50,56,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,40,67,39,32,40,83,39,32,89,41,41,41,32,40,40,66,+32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,40,83,39,+32,67,41,41,32,40,40,66,32,67,41,32,40,40,67,39,32,95,51,53,+50,41,32,95,51,49,56,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+67,41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,83,39,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,95,51,51,52,41,+41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,95,51,49,54,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,51,49,54,41,41,+32,40,67,32,95,51,51,52,41,41,41,41,32,95,51,52,48,41,41,41,+32,73,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+95,51,49,57,41,41,32,40,67,32,95,51,50,56,41,41,41,41,41,32,+95,51,51,52,41,41,32,40,40,67,32,95,51,49,54,41,32,95,51,51,+57,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,40,95,51,+53,53,32,95,51,53,54,41,41,41,32,40,40,40,83,39,32,95,52,54,+51,41,32,40,40,40,67,39,32,95,52,52,54,41,32,40,40,40,67,39,+32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,41,32,+35,49,41,41,32,35,48,41,41,32,40,40,40,67,39,32,79,41,32,95,+52,53,53,41,32,75,41,41,41,41,41,32,40,95,51,53,53,32,95,51,+53,54,41,41,41,41,32,40,95,51,53,53,32,95,51,53,54,41,41,41,+32,40,40,65,32,58,51,51,55,32,40,85,32,65,41,41,32,40,40,65,+32,58,51,51,56,32,40,40,95,51,53,53,32,95,51,53,54,41,32,95,+52,54,49,41,41,32,40,40,65,32,58,51,51,57,32,40,40,95,51,53,+53,32,95,51,53,54,41,32,40,40,79,32,35,49,41,32,75,41,41,41,+32,40,40,65,32,58,51,52,48,32,40,40,95,51,53,53,32,95,51,53,+54,41,32,40,40,79,32,35,50,41,32,75,41,41,41,32,40,40,65,32,+58,51,52,49,32,40,40,95,51,53,53,32,95,51,53,54,41,32,40,40,+79,32,35,49,48,41,32,75,41,41,41,32,40,40,65,32,58,51,52,50,+32,40,40,95,51,53,53,32,95,51,53,55,41,32,40,40,79,32,35,49,+41,32,75,41,41,41,32,40,40,65,32,58,51,52,51,32,40,85,32,40,+40,66,32,40,83,32,40,85,32,40,40,79,32,35,52,56,41,32,75,41,+41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+67,32,40,40,67,32,83,39,41,32,95,51,52,52,41,41,32,40,40,66,+32,40,95,52,54,50,32,35,52,53,41,41,32,95,51,52,52,41,41,41,+41,41,41,41,32,40,40,65,32,58,51,52,52,32,40,40,83,32,40,85,+32,75,41,41,32,40,90,32,40,90,32,40,40,66,32,40,40,40,83,39,+32,95,52,54,51,41,32,40,40,66,32,95,51,52,52,41,32,40,40,66,+32,95,51,50,54,41,32,40,40,67,32,40,40,67,32,66,41,32,40,40,+40,83,39,32,66,41,32,80,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,67,32,80,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,+40,40,110,111,77,97,116,99,104,32,75,41,32,35,48,41,32,35,48,41,+41,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,66,32,95,49,+51,54,41,32,40,40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,+32,40,95,49,51,55,32,35,52,56,41,41,41,32,40,40,67,32,40,40,+67,32,66,41,32,40,90,32,40,40,83,32,80,41,32,40,40,66,32,40,+67,32,80,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,40,40,+110,111,77,97,116,99,104,32,75,41,32,35,48,41,32,35,48,41,41,41,+41,41,32,75,41,41,41,32,40,40,67,32,95,51,51,53,41,32,35,49,+48,41,41,41,41,41,41,32,40,40,65,32,58,51,52,53,32,40,40,83,+32,40,40,67,32,83,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,41,32,+40,40,66,32,40,95,52,56,50,32,95,51,48,56,41,41,32,95,51,52,+54,41,41,41,41,32,95,51,52,54,41,41,32,40,40,65,32,58,51,52,+54,32,40,40,95,51,57,57,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,95,52,55,57,32,95,51,48,56,41,41,32,40,40,67,32,40,+95,52,56,49,32,95,51,48,56,41,41,32,95,51,52,49,41,41,41,32,+40,40,66,32,95,51,53,57,41,32,40,40,40,67,39,32,40,95,52,56,+48,32,95,50,55,55,41,41,32,95,49,51,55,41,32,40,95,49,51,55,+32,35,52,56,41,41,41,41,41,32,95,51,51,56,41,41,32,40,40,65,+32,58,51,52,55,32,40,40,67,32,66,41,32,40,40,40,67,39,32,66,+41,32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,+40,95,50,48,50,32,95,51,49,51,41,41,41,41,32,40,95,50,48,50,+32,40,95,51,56,54,32,95,50,56,49,41,41,41,41,41,41,32,40,40,+65,32,58,51,52,56,32,40,40,66,32,40,66,32,95,49,50,50,41,41,+32,95,51,52,55,41,41,32,40,40,65,32,58,51,52,57,32,40,40,67,+32,66,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,67,32,+83,39,41,41,32,40,40,67,32,66,41,32,40,40,40,67,39,32,67,41,+32,40,40,66,32,40,67,32,67,39,41,41,32,95,51,50,55,41,41,32,+95,49,50,52,41,41,41,41,32,40,40,67,32,66,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,85,32,95,49,50,53,41,41,41,32,40,+67,32,95,51,50,55,41,41,41,41,41,41,32,40,40,65,32,58,51,53,+48,32,40,40,66,32,40,66,32,95,49,50,50,41,41,32,40,67,32,95,+51,52,57,41,41,41,32,40,40,65,32,58,51,53,49,32,40,67,32,95,+51,52,57,41,41,32,40,40,65,32,58,51,53,50,32,40,40,66,32,40,+66,32,95,49,50,50,41,41,32,95,51,52,57,41,41,32,40,40,65,32,+58,51,53,51,32,40,85,32,40,40,67,32,83,41,32,40,95,52,54,50,+32,35,45,49,41,41,41,41,32,40,40,65,32,58,51,53,52,32,40,40,+83,32,40,40,67,32,83,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,45,49,41,41,41,+32,40,95,51,53,53,32,95,51,53,55,41,41,41,41,32,40,95,51,53,+53,32,95,51,53,54,41,41,41,32,40,40,65,32,58,51,53,53,32,80,+41,32,40,40,65,32,58,51,53,54,32,75,41,32,40,40,65,32,58,51,+53,55,32,65,41,32,40,40,65,32,58,51,53,56,32,35,50,49,52,55,+52,56,51,54,52,56,41,32,40,40,65,32,58,51,53,57,32,40,40,83,+32,40,40,40,67,39,32,67,41,32,40,40,83,32,40,40,40,83,39,32,+67,39,41,32,40,40,66,32,83,39,41,32,40,40,67,32,95,49,51,56,+50,41,32,35,48,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,40,83,39,32,67,39,41,41,32,95,49,51,55,55,41,32,+40,40,66,32,40,66,32,40,95,49,50,53,32,40,40,40,110,111,77,97,+116,99,104,32,34,46,47,108,105,98,47,68,97,116,97,47,73,110,116,101,+103,101,114,95,84,121,112,101,46,104,115,34,41,32,35,49,56,41,32,35,+49,41,41,41,41,32,40,40,66,32,40,66,32,40,95,51,53,53,32,95,+51,53,55,41,41,41,32,85,41,41,41,41,32,40,40,95,51,53,53,32,+95,51,53,55,41,32,40,40,79,32,35,48,41,32,40,40,79,32,35,48,+41,32,40,40,79,32,35,50,41,32,75,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,51,53,53,32,95,51,53,54,41,41,41,32,+85,41,41,41,32,40,89,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,83,32,40,40,67,32,61,61,41,32,35,48,41,41,41,32,40,40,+66,32,40,40,83,39,32,95,52,54,50,41,32,40,40,67,32,95,49,51,+52,54,41,32,95,51,53,56,41,41,41,32,40,40,67,32,66,41,32,40,+40,67,32,95,49,51,52,53,41,32,95,51,53,56,41,41,41,41,41,32,+95,52,54,49,41,41,41,41,32,40,95,49,51,52,51,32,35,48,41,41,+41,32,40,40,65,32,58,51,54,48,32,40,85,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,51,52,52,41,32,40,40,80,32,35,49,+41,32,40,40,95,49,51,52,51,32,35,48,41,32,35,49,41,41,41,41,+32,40,40,80,32,35,48,41,32,40,40,83,32,80,41,32,40,40,40,83,+39,32,40,83,39,32,80,41,41,32,40,40,40,67,39,32,66,41,32,95,+49,51,52,50,41,32,40,95,49,51,52,52,32,95,51,53,56,41,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,95,49,51,52,50,41,41,32,40,40,66,32,40,66,32,+40,95,49,51,52,52,32,95,51,53,56,41,41,41,32,40,40,40,67,39,+32,66,41,32,95,49,51,52,50,41,32,40,95,49,51,52,52,32,95,51,+53,56,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,+54,49,32,40,40,66,32,40,95,51,53,53,32,95,51,53,54,41,41,32,+40,89,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,83,32,40,+40,67,32,95,49,51,56,51,41,32,35,48,41,41,41,32,40,40,66,32,+40,40,83,39,32,95,52,54,50,41,32,40,40,66,32,95,49,51,56,57,+41,32,40,40,67,32,95,49,51,54,55,41,32,40,95,49,51,57,48,32,+95,51,53,56,41,41,41,41,41,32,40,40,67,32,66,41,32,40,40,67,+32,95,49,51,54,54,41,32,40,95,49,51,57,48,32,95,51,53,56,41,+41,41,41,41,41,32,95,52,54,49,41,41,41,41,32,40,40,65,32,58,+51,54,50,32,40,40,66,32,95,49,51,57,48,41,32,95,51,54,48,41,+41,32,40,40,65,32,58,51,54,51,32,40,85,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,51,53,49,41,32,40,40,80,32,38,49,+46,48,41,32,40,40,95,49,51,53,48,32,38,48,46,48,41,32,38,49,+46,48,41,41,41,41,32,40,89,32,40,40,66,32,40,80,32,38,48,46,+48,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,51,52,57,41,32,95,49,51,54,50,41,41,41,32,40,66,32,40,+95,49,51,53,49,32,40,95,49,51,54,50,32,95,51,53,56,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,51,54,52,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,53,32,+40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,54,32,+40,85,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,55,32,+40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,56,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,54,57,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,48,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,49,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,50,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,51,55,51,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,95,51,55,48,41,32,+75,41,41,32,40,40,65,32,58,51,55,52,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,95,51,55,48,41,32,65,41,41,32,40,40,65,+32,58,51,55,53,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+95,51,55,49,41,32,75,41,41,32,40,40,65,32,58,51,55,54,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,95,51,55,49,41,32,65,+41,41,32,40,40,65,32,58,51,55,55,32,40,40,40,83,39,32,40,83,+39,32,40,83,39,32,80,41,41,41,32,95,51,54,54,41,32,95,51,54,+55,41,41,32,40,40,65,32,58,51,55,56,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,40,83,+39,32,67,39,41,32,40,40,66,32,95,50,48,50,41,32,40,40,66,32,+40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,40,40,66,32,95,+52,56,52,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,52,+56,50,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,+41,41,32,40,40,66,32,95,52,56,52,41,32,40,40,66,32,40,85,32,+65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,40,83,32,73,+41,32,40,90,32,75,41,41,41,41,32,40,40,40,83,39,32,66,41,32,+40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,+41,41,32,40,40,83,32,40,40,40,67,39,32,67,39,41,32,40,40,66,+32,95,52,56,48,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,41,32,40,85,32,75,41,41,41,32,40,40,40,67,39,32,+95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,+53,41,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,32,40,+40,66,32,67,41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,+40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,85,+32,65,41,41,41,41,32,95,51,55,48,41,41,32,40,40,65,32,58,51,+55,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,73,110,+116,101,103,114,97,108,46,116,111,73,110,116,101,103,101,114,34,41,41,41,+32,40,40,65,32,58,51,56,48,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,89,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,83,41,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,40,40,+66,32,40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,+95,51,54,53,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,83,41,41,32,95,51,+54,55,41,41,41,32,73,41,41,41,32,40,40,66,32,95,52,56,51,41,+32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,+32,40,40,66,32,95,52,56,51,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,41,41,32,40,40,65,32,58,51,56,49,32,+40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,+83,41,32,40,40,40,83,39,32,40,67,39,32,83,39,41,41,32,40,40,+66,32,40,66,32,95,49,50,48,41,41,32,40,40,40,83,39,32,67,41,+32,40,40,66,32,95,50,48,50,41,32,40,40,66,32,40,85,32,75,41,+41,32,95,51,54,53,41,41,41,32,40,40,40,67,39,32,95,52,56,53,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,+67,41,32,40,40,66,32,95,50,48,50,41,32,40,40,66,32,40,85,32,+75,41,41,32,95,51,54,53,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,+41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,66,39,32,40,40,66,32,95,52,56,51,41,32,40,+40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,32,40,+40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,83,39,41,+32,40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,66,41,41,32,95,51,54,54,41,32,95,51,56,48,41,41,41,32,73,+41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,+32,40,85,32,65,41,41,32,95,51,54,53,41,41,32,40,95,51,53,57,+32,35,48,41,41,41,41,32,40,40,65,32,58,51,56,50,32,40,40,83,+32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,95,50,48,50,41,+32,40,40,66,32,40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,+40,40,40,83,39,32,67,41,32,95,51,54,55,41,32,40,40,40,67,39,+32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,32,40,95,51,53,57,32,35,50,41,41,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,32,40,40,65,32,58,51,56,51,32,40,40,66,32,40,66,32,95,49,+50,50,41,41,32,95,51,56,50,41,41,32,40,40,65,32,58,51,56,52,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,83,41,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,95,52,57,55,41,32,40,85,32,40,75,32,65,41,41,41,+41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,+32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,+32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+41,32,40,40,66,32,89,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,+32,40,40,66,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,50,48,50,41,32,40,40,66,32,40,85,32,75,41,41,32,40,40,+66,32,95,51,54,53,41,32,40,85,32,40,75,32,75,41,41,41,41,41,+41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,+32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,40,75,+32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,83,+41,32,40,40,66,32,95,51,56,50,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+83,39,32,66,41,41,32,40,40,66,32,95,52,56,49,41,32,40,85,32,+40,90,32,75,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,+40,40,40,67,39,32,83,41,32,40,40,66,32,95,52,56,49,41,32,40,+85,32,40,90,32,75,41,41,41,41,32,73,41,41,41,32,40,40,40,83,+39,32,67,41,32,40,40,66,32,95,51,54,54,41,32,40,85,32,40,75,+32,75,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,40,75,32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,+50,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,+40,40,67,39,32,83,41,32,40,40,66,32,95,52,56,49,41,32,40,85,+32,40,90,32,75,41,41,41,41,32,73,41,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,95,51,54,54,41,32,40,85,32,40,75,32,+75,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,+66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,+85,32,40,75,32,75,41,41,41,41,41,32,40,95,51,53,57,32,35,50,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,+40,85,32,40,90,32,75,41,41,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,41,41,32,40,95,50,52,32,34,68,97,116,97,46,73,110,116,+101,103,114,97,108,46,94,58,32,110,101,103,97,116,105,118,101,32,101,120,+112,111,110,101,110,116,34,41,41,41,32,40,40,65,32,58,51,56,53,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,95,52,56,53,41,32,40,+85,32,65,41,41,41,32,40,40,66,32,95,51,55,50,41,32,40,85,32,+75,41,41,41,41,32,40,40,65,32,58,51,56,54,32,40,40,40,83,39,+32,95,50,48,49,41,32,40,40,66,32,40,67,32,40,40,67,32,83,39,+41,32,40,40,80,32,95,49,50,53,41,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,40,66,39,32,40,85,32,95,49,50,52,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,+49,41,41,41,32,95,50,48,50,41,41,41,32,40,40,66,32,95,50,48,+50,41,32,95,51,56,54,41,41,41,41,41,32,40,40,66,32,95,50,48,+53,41,32,95,51,56,54,41,41,41,32,40,40,65,32,58,51,56,55,32,+40,40,95,50,55,49,32,95,51,57,53,41,32,40,95,50,55,53,32,95,+51,56,55,41,41,41,32,40,40,65,32,58,51,56,56,32,40,40,40,40,+40,95,49,49,32,95,51,56,55,41,32,40,40,67,32,79,41,32,75,41,+41,32,40,95,51,56,32,95,51,56,57,41,41,32,40,95,49,57,32,95,+51,56,56,41,41,32,40,95,50,48,32,95,51,56,56,41,41,41,32,40,+40,65,32,58,51,56,57,32,40,40,40,40,95,51,48,32,95,51,56,56,+41,32,40,95,50,54,54,32,95,51,57,52,41,41,32,40,95,51,54,32,+95,51,56,57,41,41,32,40,95,51,55,32,95,51,56,57,41,41,41,32,+40,40,65,32,58,51,57,48,32,40,40,95,51,57,32,95,51,56,57,41,+32,40,75,32,95,52,54,49,41,41,41,32,40,40,65,32,58,51,57,49,+32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,56,41,32,40,90,+32,95,49,53,57,49,41,41,32,40,40,66,32,95,49,53,57,51,41,32,+95,51,57,49,41,41,41,32,40,40,66,32,95,49,53,57,52,41,32,95,+51,57,49,41,41,41,32,40,40,65,32,58,51,57,50,32,40,40,80,32,+95,49,50,53,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,40,65,32,58,51,57,51,32,40,40,95,51,57,55,32,95,52,54,+51,41,32,95,52,54,49,41,41,32,40,40,65,32,58,51,57,52,32,40,+40,66,32,40,95,50,54,51,32,95,51,57,51,41,41,32,95,51,57,53,+41,41,32,40,40,65,32,58,51,57,53,32,40,40,66,32,89,41,32,40,+40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,66,+32,40,67,39,32,66,41,41,32,40,66,32,95,52,54,50,41,41,41,41,+41,32,40,40,65,32,58,51,57,54,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,40,67,+39,32,40,83,39,32,83,41,41,32,40,67,39,32,83,39,41,41,32,40,+40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,+32,58,51,57,55,32,40,40,66,32,40,66,32,89,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,80,41,41,32,40,67,39,32,66,41,41,+41,41,32,40,40,65,32,58,51,57,56,32,40,40,66,32,40,80,32,40,+95,50,52,32,34,102,111,108,100,114,49,34,41,41,41,32,95,51,57,55,+41,41,32,40,40,65,32,58,51,57,57,32,40,40,66,32,89,41,32,40,+40,66,32,40,66,32,40,83,32,80,41,41,41,32,40,40,67,39,32,66,+41,32,66,41,41,41,41,32,40,40,65,32,58,52,48,48,32,40,40,66,+32,40,80,32,40,95,50,52,32,34,102,111,108,100,108,49,34,41,41,41,+32,95,51,57,57,41,41,32,40,40,65,32,58,52,48,49,32,40,40,66,+32,40,80,32,40,95,50,52,32,34,109,105,110,105,109,117,109,34,41,41,+41,32,40,40,66,32,95,51,57,55,41,32,40,40,40,67,39,32,40,83,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+95,52,57,55,41,32,73,41,41,32,73,41,41,41,41,32,40,40,65,32,+58,52,48,50,32,40,40,66,32,40,80,32,40,95,50,52,32,34,109,97,+120,105,109,117,109,34,41,41,41,32,40,40,66,32,95,51,57,55,41,32,+40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,95,52,57,57,41,32,73,41,41,32,73,41,+41,41,41,32,40,40,65,32,58,52,48,51,32,40,40,40,83,39,32,95,+51,57,55,41,32,95,52,55,57,41,32,40,40,67,32,95,52,56,53,41,+32,40,95,51,53,57,32,35,48,41,41,41,41,32,40,40,65,32,58,52,+48,52,32,40,40,40,83,39,32,95,51,57,55,41,32,95,52,56,49,41,+32,40,40,67,32,95,52,56,53,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,32,40,40,65,32,58,52,48,53,32,40,40,95,51,57,55,32,+95,49,50,49,41,32,95,49,50,53,41,41,32,40,40,65,32,58,52,48,+54,32,40,40,95,51,57,55,32,95,49,50,48,41,32,95,49,50,52,41,+41,32,40,40,65,32,58,52,48,55,32,40,40,66,32,40,95,50,54,51,+32,95,52,48,54,41,41,32,95,51,57,53,41,41,32,40,40,65,32,58,+52,48,56,32,40,40,66,32,40,95,50,54,51,32,95,52,48,53,41,41,+32,95,51,57,53,41,41,32,40,40,65,32,58,52,48,57,32,40,40,67,+32,40,40,40,83,39,32,67,39,41,32,40,40,67,32,40,95,52,57,56,+32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,66,32,40,80,32,+95,52,54,49,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,+52,54,50,41,41,32,40,40,66,32,95,52,48,57,41,32,40,40,67,32,+40,95,52,56,48,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,+41,32,95,52,54,49,41,41,32,40,40,65,32,58,52,49,48,32,40,40,+67,32,40,40,40,83,39,32,83,39,41,32,40,40,67,32,40,95,52,57,+56,32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,66,32,40,80,+32,95,52,54,49,41,41,32,40,90,32,40,40,66,32,95,52,49,48,41,+32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,49,+41,41,41,41,41,41,32,73,41,41,32,40,40,65,32,58,52,49,49,32,+40,40,89,32,40,40,66,32,40,83,32,80,41,41,32,40,40,66,32,90,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,+83,32,95,49,51,57,57,41,41,41,32,67,41,41,32,40,40,67,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,32,+35,48,41,41,32,40,40,65,32,58,52,49,50,32,40,95,52,49,51,32,+80,41,41,32,40,40,65,32,58,52,49,51,32,40,40,66,32,89,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,85,32,95,52,+54,49,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,+41,32,40,66,39,32,40,85,32,95,52,54,49,41,41,41,41,41,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,66,32,40,66,32,95,52,54,50,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,52,49,52,32,40,40,80,32,40,+40,80,32,95,52,54,49,41,32,95,52,54,49,41,41,32,40,40,67,32,+66,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,52,49,52,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,50,41,+41,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,32,58,52,49,+53,32,40,40,80,32,40,40,67,32,40,40,80,32,95,52,54,49,41,32,+95,52,54,49,41,41,32,95,52,54,49,41,41,32,40,40,67,32,66,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,52,+49,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,50,41,41,41,32,+95,52,54,50,41,41,41,41,32,95,52,54,50,41,41,41,41,41,32,40,+40,65,32,58,52,49,54,32,40,40,66,32,95,52,49,55,41,32,95,50,+48,50,41,41,32,40,40,65,32,58,52,49,55,32,40,40,66,32,89,41,+32,40,40,66,32,40,66,32,40,67,32,40,40,67,32,83,39,41,32,95,+52,55,55,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+66,41,32,40,66,39,32,40,85,32,95,52,55,54,41,41,41,41,41,32,+40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+67,39,32,66,41,41,41,32,40,40,67,32,40,67,39,32,67,41,41,32,+95,52,55,54,41,41,41,41,41,41,41,32,40,40,65,32,58,52,49,56,+32,40,40,66,32,95,52,49,57,41,32,95,50,48,50,41,41,32,40,40,+65,32,58,52,49,57,32,40,40,66,32,89,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,40,85,32,95,49,50,53,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,+40,85,32,95,49,50,52,41,41,41,41,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,+32,40,66,32,40,66,32,95,49,50,49,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,52,50,48,32,40,40,66,32,95,52,50,49,41,32,95,+50,48,50,41,41,32,40,40,65,32,58,52,50,49,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,66,41,32,95,52,+49,57,41,32,95,52,50,51,41,41,32,95,52,50,51,41,41,32,40,40,+65,32,58,52,50,50,32,40,40,40,83,39,32,40,83,39,32,80,41,41,+32,95,52,48,57,41,32,95,52,49,48,41,41,32,40,40,65,32,58,52,+50,51,32,40,40,89,32,40,40,66,32,40,83,32,80,41,41,32,40,40,+40,67,39,32,66,41,32,66,41,32,40,67,32,95,52,54,50,41,41,41,+41,32,95,52,54,49,41,41,32,40,40,65,32,58,52,50,52,32,40,40,+66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,52,54,49,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,+66,41,41,32,40,82,32,95,52,54,49,41,41,41,32,40,40,67,39,32,+66,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,32,58,52,50,+53,32,40,40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,+52,54,49,41,41,41,32,40,40,66,32,67,41,32,40,40,67,32,40,83,+39,32,83,39,41,41,32,95,52,54,50,41,41,41,41,41,32,40,40,65,+32,58,52,50,54,32,40,40,40,67,39,32,89,41,32,40,40,66,32,40,+66,32,40,40,83,39,32,80,41,32,40,40,40,67,39,32,80,41,32,95,+52,50,51,41,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,66,41,32,40,83,39,32,83,39,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,80,41,32,95,52,50,51,41,41,41,+32,95,52,54,50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,+41,32,40,67,32,95,52,54,50,41,41,41,41,41,32,95,52,54,49,41,+41,32,40,40,65,32,58,52,50,55,32,40,40,40,67,39,32,89,41,32,+40,40,66,32,40,66,32,40,40,83,39,32,80,41,32,40,40,40,67,39,+32,80,41,32,95,52,50,51,41,32,95,52,54,49,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,+40,40,40,67,39,32,66,41,32,40,83,39,32,83,39,41,41,32,40,40,+66,32,40,66,32,80,41,41,32,40,40,66,32,40,66,32,95,52,50,51,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,66,41,32,40,67,32,95,52,54,50,41,41,41,41,+41,32,95,52,54,49,41,41,32,40,40,65,32,58,52,50,56,32,40,40,+80,32,40,95,50,52,32,34,104,101,97,100,34,41,41,32,75,41,41,32,+40,40,65,32,58,52,50,57,32,40,40,80,32,40,95,50,52,32,34,116,+97,105,108,34,41,41,32,65,41,41,32,40,40,65,32,58,52,51,48,32,+40,40,66,32,40,80,32,95,52,54,49,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,95,52,54,50,41,41,32,40,40,66,32,89,41,32,+40,40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,52,54,50,41,+41,41,32,40,40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,41,+41,41,32,40,40,65,32,58,52,51,49,32,40,40,66,32,40,66,32,95,+51,57,51,41,41,32,95,52,51,48,41,41,32,40,40,65,32,58,52,51,+50,32,40,40,66,32,95,52,51,52,41,32,95,50,48,50,41,41,32,40,+40,65,32,58,52,51,51,32,40,40,66,32,40,66,32,40,66,32,95,49,+50,50,41,41,41,32,95,52,51,50,41,41,32,40,40,65,32,58,52,51,+52,32,40,66,32,95,52,48,55,41,41,32,40,40,65,32,58,52,51,53,+32,40,40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,52,+55,54,41,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,67,39,32,67,39,41,41,32,95,52,55,55,41,41,41,41,32,40,40,+65,32,58,52,51,54,32,40,40,66,32,95,52,51,55,41,32,95,50,48,+50,41,41,32,40,40,65,32,58,52,51,55,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,66,32,40,66,32,95,52,51,53,41,41,32,40,40,67,32,40,+67,39,32,95,50,54,51,41,41,32,95,53,54,53,41,41,41,32,95,52,+55,54,41,41,32,40,85,32,40,75,32,95,52,55,55,41,41,41,41,32,+40,40,65,32,58,52,51,56,32,40,40,66,32,95,52,51,57,41,32,95,+50,48,50,41,41,32,40,40,65,32,58,52,51,57,32,40,40,66,32,40,+40,83,39,32,66,41,32,95,52,54,51,41,41,32,40,40,40,83,39,32,+67,39,41,32,40,40,66,32,95,51,57,57,41,32,40,40,66,32,95,50,+54,54,41,32,95,52,52,50,41,41,41,32,95,52,52,53,41,41,41,32,+40,40,65,32,58,52,52,48,32,40,40,66,32,95,52,52,49,41,32,95,+50,48,50,41,41,32,40,40,65,32,58,52,52,49,32,40,40,66,32,40,+67,39,32,95,51,57,54,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,49,50,50,41,41,41,32,40,40,66,32,67,41,32,95,52,51,52,41,+41,41,41,32,40,40,65,32,58,52,52,50,32,40,40,66,32,89,41,32,+40,40,66,32,40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,83,39,32,40,83,39,32,83,39,+41,41,41,32,40,66,32,40,40,67,39,32,66,41,32,95,52,54,50,41,+41,41,41,32,73,41,41,41,41,32,40,40,65,32,58,52,52,51,32,40,+40,66,32,89,41,32,40,40,66,32,40,66,32,40,66,32,40,80,32,95,+52,54,49,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,+39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,83,39,32,+40,83,39,32,83,39,41,41,41,32,40,66,32,40,40,67,39,32,66,41,+32,95,52,54,50,41,41,41,41,32,73,41,41,41,41,32,40,40,65,32,+58,52,52,52,32,40,40,66,32,95,52,52,53,41,32,95,50,48,50,41,+41,32,40,40,65,32,58,52,52,53,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,40,66,32,+40,66,32,40,40,83,39,32,66,41,32,95,52,54,50,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,66,32,40,+66,32,95,51,57,54,41,41,32,40,66,32,40,66,32,95,49,50,50,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,52,52,54,32,40,40,40,+67,39,32,66,41,32,95,52,48,57,41,32,95,52,52,55,41,41,32,40,+40,65,32,58,52,52,55,32,40,40,66,32,89,41,32,95,52,54,50,41,+41,32,40,40,65,32,58,52,52,56,32,40,40,66,32,95,52,52,57,41,+32,95,50,48,50,41,41,32,40,40,65,32,58,52,52,57,32,40,40,66,+32,95,51,57,57,41,32,40,40,66,32,95,50,54,54,41,32,95,52,52,+50,41,41,41,32,40,40,65,32,58,52,53,48,32,40,40,66,32,95,51,+57,57,41,32,40,40,66,32,95,50,54,54,41,32,95,52,52,51,41,41,+41,32,40,40,65,32,58,52,53,49,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,83,32,40,40,67,32,40,95,52,57,55,32,95,50,56,+50,41,41,32,35,48,41,41,41,32,40,67,32,40,89,32,40,40,66,32,+40,66,32,40,80,32,40,95,50,52,32,34,33,33,58,32,101,109,112,116,+121,34,41,41,41,41,32,40,40,66,32,40,40,83,39,32,67,39,41,32,+40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,35,48,41,+41,41,32,40,40,67,32,66,41,32,40,40,67,32,40,95,52,56,48,32,+95,50,55,55,41,41,32,35,49,41,41,41,41,41,41,41,41,32,40,95,+50,52,32,34,33,33,58,32,60,48,34,41,41,41,32,40,40,65,32,58,+52,53,50,32,40,40,40,83,39,32,40,83,39,32,80,41,41,32,95,51,+57,54,41,32,40,40,66,32,95,51,57,54,41,32,40,95,50,54,51,32,+95,49,50,50,41,41,41,41,32,40,40,65,32,58,52,53,51,32,40,40,+66,32,95,52,53,52,41,32,95,52,57,56,41,41,32,40,40,65,32,58,+52,53,52,32,40,40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,+32,95,52,54,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,83,39,32,67,41,41,32,40,66,32,95,52,53,50,41,41,41,+32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,67,39,32,95,52,+54,51,41,41,41,32,40,40,67,39,32,66,41,32,95,52,54,50,41,41,+41,41,41,41,32,40,40,65,32,58,52,53,53,32,40,40,80,32,40,95,+50,52,32,34,108,97,115,116,58,32,91,93,34,41,41,32,40,40,40,67,+39,32,83,41,32,85,41,32,40,90,32,40,90,32,95,52,53,53,41,41,+41,41,41,32,40,40,65,32,58,52,53,54,32,40,40,80,32,40,95,50,+52,32,34,105,110,105,116,58,32,91,93,34,41,41,32,40,40,66,32,40,+83,32,40,85,32,95,52,54,49,41,41,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,+41,32,95,52,53,54,41,41,41,41,41,41,32,40,40,65,32,58,52,53,+55,32,40,40,66,32,95,52,53,56,41,32,95,50,48,50,41,41,32,40,+40,65,32,58,52,53,56,32,40,40,66,32,89,41,32,40,40,66,32,40,+66,32,40,80,32,95,49,50,52,41,41,41,32,40,40,66,32,40,67,39,+32,40,83,39,32,95,49,50,48,41,41,41,32,95,52,51,52,41,41,41,+41,32,40,40,65,32,58,52,53,57,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,83,32,95,52,54,50,41,41,41,32,40,67,32,66,+41,41,41,41,32,40,40,65,32,58,52,54,48,32,40,40,66,32,89,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,40,85,32,+95,52,54,49,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,67,39,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,67,39,41,41,41,32,95,52,49,54,41,41,41,41,32,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,+41,32,40,66,32,40,40,83,39,32,66,41,32,95,52,54,51,41,41,41,+41,41,41,32,40,40,65,32,58,52,54,49,32,75,41,32,40,40,65,32,+58,52,54,50,32,79,41,32,40,40,65,32,58,52,54,51,32,40,40,67,+32,83,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,52,54,50,+41,41,32,40,67,32,95,52,54,51,41,41,41,41,32,40,40,65,32,58,+52,54,52,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,66,32,+40,67,32,40,40,67,32,83,39,41,32,40,40,80,32,95,49,50,53,41,+32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,85,32,95,49,50,52,41,41,41,32,95,50,48,+50,41,41,41,32,40,40,66,32,95,50,48,53,41,32,95,52,54,52,41,+41,41,32,40,40,65,32,58,52,54,53,32,40,40,83,32,40,40,40,83,+39,32,95,49,53,56,56,41,32,40,40,66,32,40,66,32,40,80,32,40,+95,49,53,57,55,32,34,78,111,116,104,105,110,103,34,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,57,+56,41,32,40,40,67,32,40,95,53,48,48,32,95,50,56,50,41,41,32,+35,49,49,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,+32,40,95,49,53,57,55,32,34,74,117,115,116,32,34,41,41,41,41,32,+40,40,67,32,95,49,53,56,57,41,32,35,49,49,41,41,41,41,41,32,+40,40,66,32,95,49,53,57,51,41,32,95,52,54,53,41,41,41,32,40,+40,66,32,95,49,53,57,52,41,32,95,52,54,53,41,41,41,32,40,40,+65,32,58,52,54,54,32,40,40,95,50,55,49,32,40,40,66,32,40,80,+32,95,52,55,54,41,41,32,40,66,32,95,52,55,55,41,41,41,32,40,+95,50,55,53,32,95,52,54,54,41,41,41,32,40,40,65,32,58,52,54,+55,32,40,40,40,40,40,95,49,49,32,95,52,54,54,41,32,95,52,55,+55,41,32,40,40,40,67,39,32,66,41,32,40,85,32,95,52,55,54,41,+41,32,40,40,40,67,39,32,66,41,32,40,85,32,95,52,55,54,41,41,+32,40,66,32,95,52,55,55,41,41,41,41,32,40,95,49,57,32,95,52,+54,55,41,41,32,40,95,50,48,32,95,52,54,55,41,41,41,32,40,40,+65,32,58,52,54,56,32,40,40,40,40,95,51,48,32,95,52,54,55,41,+32,40,85,32,95,52,55,54,41,41,32,40,95,51,54,32,95,52,54,56,+41,41,32,40,95,49,51,32,95,52,54,55,41,41,41,32,40,40,65,32,+58,52,54,57,32,40,40,95,51,57,32,95,52,54,56,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,40,65,32,58,52,55,48,32,80,41,32,+40,40,65,32,58,52,55,49,32,40,40,67,32,80,41,32,73,41,41,32,+40,40,65,32,58,52,55,50,32,40,95,51,57,52,32,40,40,80,32,75,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,65,32,58,+52,55,51,32,40,40,80,32,95,49,50,52,41,32,40,75,32,95,49,50,+53,41,41,41,32,40,40,65,32,58,52,55,52,32,40,40,66,32,89,41,+32,40,40,66,32,40,66,32,40,80,32,95,52,54,49,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,67,41,41,32,40,67,39,32,83,39,41,+41,32,40,66,32,40,67,32,95,52,54,50,41,41,41,41,41,41,32,40,+40,65,32,58,52,55,53,32,40,40,80,32,95,52,54,49,41,32,40,40,+67,32,79,41,32,75,41,41,41,32,40,40,65,32,58,52,55,54,32,75,+41,32,40,40,65,32,58,52,55,55,32,40,90,32,85,41,41,32,40,40,+65,32,58,52,55,56,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,41,41,32,40,40,65,32,58,52,55,57,32,40,+85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,52,56,48,32,40,85,32,40,75,+32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,+41,32,40,40,65,32,58,52,56,49,32,40,85,32,40,75,32,40,75,32,+40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,40,+65,32,58,52,56,50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,+90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,52,+56,51,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,52,56,52,32,40,+85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,52,56,53,32,40,85,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,65,41,41,41,41,41,41,+41,32,40,40,65,32,58,52,56,54,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,78,117,109,46,43,34,41,41,41,32,40,40,65,32,+58,52,56,55,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+78,117,109,46,45,34,41,41,41,32,40,40,65,32,58,52,56,56,32,40,+75,32,40,110,111,68,101,102,97,117,108,116,32,34,78,117,109,46,42,34,+41,41,41,32,40,40,65,32,58,52,56,57,32,40,40,83,32,95,52,56,+48,41,32,40,40,67,32,95,52,56,53,41,32,40,95,51,53,57,32,35,+48,41,41,41,41,32,40,40,65,32,58,52,57,48,32,40,75,32,40,110,+111,68,101,102,97,117,108,116,32,34,78,117,109,46,97,98,115,34,41,41,+41,32,40,40,65,32,58,52,57,49,32,40,75,32,40,110,111,68,101,102,+97,117,108,116,32,34,78,117,109,46,115,105,103,110,117,109,34,41,41,41,+32,40,40,65,32,58,52,57,50,32,40,75,32,40,110,111,68,101,102,97,+117,108,116,32,34,78,117,109,46,102,114,111,109,73,110,116,101,103,101,114,+34,41,41,41,32,40,40,65,32,58,52,57,51,32,40,40,66,32,67,41,+32,95,52,56,48,41,41,32,40,40,65,32,58,52,57,52,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,53,+32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,54,+32,40,85,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,55,+32,40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,56,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,52,57,57,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,48,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,49,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,50,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,48,51,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,95,52,57,56,41,32,95,53,49,54,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,66,32,67,41,32,95,52,57,+56,41,41,32,95,53,49,52,41,41,32,95,53,49,53,41,41,41,32,40,+40,65,32,58,53,48,52,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,+67,41,32,95,52,57,56,41,41,32,95,49,50,53,41,41,32,95,49,50,+52,41,41,32,40,40,65,32,58,53,48,53,32,40,75,32,40,110,111,68,+101,102,97,117,108,116,32,34,79,114,100,46,60,61,34,41,41,41,32,40,+40,65,32,58,53,48,54,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,95,52,57,56,+41,32,95,49,50,53,41,41,32,95,49,50,52,41,41,32,40,40,65,32,+58,53,48,55,32,95,52,57,56,41,32,40,40,65,32,58,53,48,56,32,+40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+40,83,39,32,67,41,41,32,95,52,57,56,41,32,73,41,41,32,73,41,+41,32,40,40,65,32,58,53,48,57,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,95,+52,57,56,41,32,73,41,41,32,73,41,41,32,40,40,65,32,58,53,49,+48,32,40,40,95,50,48,49,32,40,40,40,67,39,32,83,41,32,40,40,+67,32,40,40,67,32,83,39,41,32,40,40,67,32,40,40,80,32,95,49,+50,53,41,32,95,49,50,52,41,41,32,95,49,50,52,41,41,41,32,40,+40,67,32,40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,32,+95,49,50,52,41,41,41,32,40,40,67,32,40,40,80,32,95,49,50,52,+41,32,95,49,50,52,41,41,32,95,49,50,53,41,41,41,32,40,95,50,+48,53,32,95,53,49,48,41,41,41,32,40,40,65,32,58,53,49,49,32,+40,40,67,32,40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,+32,95,49,50,52,41,41,32,40,40,65,32,58,53,49,50,32,40,40,40,+95,49,53,56,56,32,40,75,32,40,40,67,32,40,40,80,32,40,95,49,+53,57,55,32,34,76,84,34,41,41,32,40,95,49,53,57,55,32,34,69,+81,34,41,41,41,32,40,95,49,53,57,55,32,34,71,84,34,41,41,41,+41,32,40,95,49,53,57,51,32,95,53,49,50,41,41,32,40,95,49,53,+57,52,32,95,53,49,50,41,41,41,32,40,40,65,32,58,53,49,51,32,+40,40,95,49,50,54,32,95,53,49,52,41,32,95,53,49,54,41,41,32,+40,40,65,32,58,53,49,52,32,40,90,32,75,41,41,32,40,40,65,32,+58,53,49,53,32,40,75,32,75,41,41,32,40,40,65,32,58,53,49,54,+32,40,75,32,65,41,41,32,40,40,65,32,58,53,49,55,32,40,40,40,+83,39,32,95,50,48,49,41,32,40,40,66,32,40,67,32,66,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,83,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,+32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,+41,41,41,32,95,50,48,50,41,41,41,32,95,50,48,50,41,41,41,41,+32,40,40,66,32,95,50,48,53,41,32,95,53,49,55,41,41,41,32,40,+40,65,32,58,53,49,56,32,40,40,83,32,40,40,83,32,40,40,83,32,+40,40,83,32,40,40,83,32,40,40,83,32,40,40,40,83,39,32,95,52,+57,52,41,32,40,40,66,32,95,53,49,55,41,32,40,40,66,32,40,85,+32,75,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,+41,41,41,41,32,40,40,66,32,95,53,48,51,41,32,40,40,66,32,95,+53,49,56,41,32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,+32,40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,40,67,32,66,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,40,40,+66,32,95,52,57,55,41,32,40,85,32,65,41,41,41,41,32,40,40,66,+32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,40,40,+66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,41,32,+40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,+32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,+32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,67,32,+66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,+41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,95,52,57,56,41,32,40,85,32,65,41,41,41,41,32,40,40,+66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,40,+40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,41,+32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,40,40,+66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,+85,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,67,+32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,+32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,+40,40,66,32,95,52,57,57,41,32,40,85,32,65,41,41,41,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,+40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,+41,32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,+41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+66,39,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,95,53,48,48,41,32,40,85,32,65,41,41,41,41,32,+40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,+32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,+41,41,32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,41,32,+40,40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,+32,40,85,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+95,53,48,56,41,32,40,40,66,32,95,53,49,56,41,32,40,40,40,83,+39,32,80,41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,41,+41,41,32,40,40,66,32,95,53,48,57,41,32,40,40,66,32,95,53,49,+56,41,32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,32,40,+85,32,65,41,41,41,41,41,41,32,40,40,65,32,58,53,49,57,32,40,+40,83,32,40,40,83,32,40,40,83,32,40,40,83,32,40,40,83,32,40,+40,40,83,39,32,95,52,55,56,41,32,40,40,66,32,40,67,32,66,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,+83,32,40,40,40,83,39,32,67,39,41,32,40,40,66,32,83,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,95,53,50,53,+41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,66,39,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,95,52,55,57,41,32,40,40,66,32,40,85,+32,65,41,41,32,95,51,54,53,41,41,41,41,32,40,40,66,32,95,52,+56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,+41,41,41,41,32,40,40,66,32,67,41,32,40,40,66,32,95,52,56,49,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+41,41,41,32,40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,+32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,+41,41,32,40,40,83,32,40,40,40,83,39,32,67,39,41,32,40,40,66,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,+32,95,53,50,53,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,66,39,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,95,52,56,48,41,32,40,+40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,+95,51,54,53,41,41,41,41,41,32,40,40,66,32,67,41,32,40,40,66,+32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,41,41,41,41,32,40,40,66,32,95,52,56,49,41,32,40,+40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,+41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,66,41,41,32,40,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,95,53,50,53,41,41,32,40,+40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,+95,51,54,53,41,41,41,41,41,32,40,40,66,32,95,52,56,49,41,32,+40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,41,41,+41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,95,53,50,+56,41,41,32,40,40,66,32,95,52,56,50,41,32,40,40,66,32,40,85,+32,65,41,41,32,95,51,54,53,41,41,41,41,41,41,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,95,53,50,56,41,41,32,40,40,66,+32,95,52,56,51,41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,+54,53,41,41,41,41,41,41,32,40,40,66,32,85,41,32,40,40,66,32,+90,41,32,40,40,40,83,39,32,40,67,39,32,95,53,50,56,41,41,32,+40,40,66,32,95,52,56,52,41,32,40,40,66,32,40,85,32,65,41,41,+32,95,51,54,53,41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,+32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,32,40,+95,51,53,57,32,35,49,41,41,41,41,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,95,53,50,56,41,41,32,40,40,66,32,95,52,56,53,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,+65,41,41,32,95,51,54,53,41,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,41,32,40,40,65,32,58,53,50,48,32,40,40,83,32,40,40,+83,32,40,40,40,83,39,32,95,50,53,50,41,32,40,40,66,32,95,53,+49,57,41,32,40,85,32,75,41,41,41,32,40,40,66,32,40,67,32,66,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,40,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,39,41,32,40,40,+66,32,95,53,50,52,41,32,40,85,32,75,41,41,41,41,32,40,40,66,+32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,32,40,40,+66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,41,41,32,+40,40,66,32,95,52,56,49,41,32,40,40,66,32,40,85,32,65,41,41,+32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,+41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,+32,40,40,66,32,40,85,32,75,41,41,32,40,40,66,32,95,51,54,53,+41,32,40,85,32,75,41,41,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,+51,54,53,41,32,40,85,32,75,41,41,41,41,32,40,95,51,53,57,32,+35,48,41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,+67,39,32,40,83,39,32,83,39,41,41,32,40,40,40,83,39,32,67,41,+32,40,40,66,32,95,52,57,55,41,32,40,85,32,65,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,+41,32,40,40,66,32,95,51,54,53,41,32,40,85,32,75,41,41,41,41,+32,40,95,51,53,57,32,35,48,41,41,41,41,32,40,67,32,95,53,50,+56,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,+39,32,95,53,50,56,41,41,32,40,40,66,32,95,52,56,50,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,75,41,41,41,41,41,41,32,40,40,66,32,95,52,56,50,41,+32,40,40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,+41,32,40,85,32,75,41,41,41,41,41,41,41,41,32,40,95,50,52,32,+34,68,97,116,97,46,82,97,116,105,111,46,114,101,99,105,112,58,32,100,+105,118,105,115,105,111,110,32,98,121,32,48,34,41,41,41,41,41,32,40,+40,66,32,85,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,95,53,50,52,41,32,40,+85,32,75,41,41,41,32,40,40,66,32,95,52,56,53,41,32,40,40,66,+32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,40,85,+32,75,41,41,41,41,41,41,32,40,40,66,32,95,52,56,53,41,32,40,+40,66,32,40,85,32,65,41,41,32,40,40,66,32,95,51,54,53,41,32,+40,85,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,50,+49,32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,56,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,40,40,66,32,+95,49,53,57,56,41,32,40,40,67,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,35,55,41,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,50,54,51,41,41,+32,40,40,67,32,95,49,53,56,57,41,32,35,56,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,34,32,+37,32,34,41,41,41,41,32,40,40,67,32,95,49,53,56,57,41,32,35,+56,41,41,41,41,41,41,32,40,40,66,32,95,49,53,57,51,41,32,95,+53,50,49,41,41,41,32,40,40,66,32,95,49,53,57,52,41,32,95,53,+50,49,41,41,41,32,40,40,65,32,58,53,50,50,32,40,40,95,53,50,+56,32,40,40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,+32,35,49,41,41,41,32,40,40,95,52,56,53,32,95,51,48,56,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,32,40,40,65,32,58,53,50,+51,32,40,40,95,53,50,56,32,40,40,95,52,56,53,32,95,51,48,56,+41,32,40,95,51,53,57,32,35,48,41,41,41,32,40,40,95,52,56,53,+32,95,51,48,56,41,32,40,95,51,53,57,32,35,48,41,41,41,41,32,+40,40,65,32,58,53,50,52,32,40,40,83,32,40,40,40,83,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,95,53,50,53,41,41,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,95,52,56,49,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+32,40,40,66,32,95,52,56,52,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,41,41,41,32,40,40,66,32,95,52,56,51,+41,32,40,40,66,32,40,85,32,65,41,41,32,95,51,54,53,41,41,41,+41,32,40,40,65,32,58,53,50,53,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,+32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,+40,40,66,32,40,85,32,75,41,41,32,95,51,54,53,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,40,85,32,65,41,+41,32,95,51,54,53,41,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,83,39,32,40,67,+39,32,83,39,41,41,32,40,40,66,32,40,66,32,40,83,39,32,95,53,+50,56,41,41,41,32,95,51,54,54,41,41,32,95,51,54,54,41,41,32,+95,51,56,48,41,41,41,32,40,95,50,52,32,34,68,97,116,97,46,82,+97,116,105,111,46,37,58,32,48,32,100,101,110,111,109,105,110,97,116,111,+114,34,41,41,41,32,40,40,65,32,58,53,50,54,32,40,85,32,75,41,+41,32,40,40,65,32,58,53,50,55,32,40,85,32,65,41,41,32,40,40,+65,32,58,53,50,56,32,40,40,40,83,39,32,66,41,32,115,101,113,41,+32,40,40,66,32,40,83,32,115,101,113,41,41,32,80,41,41,41,32,40,+40,65,32,58,53,50,57,32,40,40,67,32,95,53,50,56,41,32,40,95,+51,53,57,32,35,49,41,41,41,32,40,40,65,32,58,53,51,48,32,95,+53,50,56,41,32,40,40,65,32,58,53,51,49,32,85,41,32,40,40,65,+32,58,53,51,50,32,40,85,32,73,41,41,32,40,40,65,32,58,53,51,+51,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,101,97,+108,46,116,111,82,97,116,105,111,110,97,108,34,41,41,41,32,40,40,65,+32,58,53,51,52,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,+32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,51,53,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,53,51,54,32,40,85,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,51,+55,32,40,85,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,53,51,56,32,40,85,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,51,57,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,52,48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,53,52,49,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,+50,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,53,52,51,32,40,85,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,52,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,52,53,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,53,52,54,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,+55,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,53,52,56,32,40,85,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,52,57,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+65,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,53,48,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,+34,82,101,97,108,70,108,111,97,116,46,102,108,111,97,116,82,97,100,105,+120,34,41,41,41,32,40,40,65,32,58,53,53,49,32,40,75,32,40,110,+111,68,101,102,97,117,108,116,32,34,82,101,97,108,70,108,111,97,116,46,+102,108,111,97,116,68,105,103,105,116,115,34,41,41,41,32,40,40,65,32,+58,53,53,50,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,+82,101,97,108,70,108,111,97,116,46,102,108,111,97,116,82,97,110,103,101,+34,41,41,41,32,40,40,65,32,58,53,53,51,32,40,75,32,40,110,111,+68,101,102,97,117,108,116,32,34,82,101,97,108,70,108,111,97,116,46,100,+101,99,111,100,101,70,108,111,97,116,34,41,41,41,32,40,40,65,32,58,+53,53,52,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,+101,97,108,70,108,111,97,116,46,101,110,99,111,100,101,70,108,111,97,116,+34,41,41,41,32,40,40,65,32,58,53,53,53,32,40,40,40,83,39,32,+83,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,+32,40,66,32,40,83,32,40,40,40,67,39,32,40,95,50,48,50,32,95,+51,48,53,41,41,32,40,85,32,75,41,41,32,40,95,51,53,57,32,35,+48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,40,85,32,65,41,41,41,41,+32,95,53,51,55,41,41,41,32,35,48,41,41,32,95,53,51,57,41,41,+32,40,40,65,32,58,53,53,54,32,40,40,83,32,40,40,40,83,39,32,+83,39,41,32,95,53,52,48,41,32,40,40,40,67,39,32,67,41,32,95,+53,51,57,41,32,75,41,41,41,32,40,40,66,32,40,66,32,40,95,52,+56,50,32,95,50,55,55,41,41,41,32,95,53,51,55,41,41,41,32,40,+40,65,32,58,53,53,55,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,40,83,39,32,83,39,41,32,40,40,67,32,61,61,41,32,35,48,+41,41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,41,32,40,40,+40,83,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,+40,40,66,32,40,83,39,32,67,39,41,41,32,40,40,66,32,40,66,32,+67,39,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,50,48,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,+32,40,40,66,32,95,52,57,53,41,32,40,40,66,32,40,85,32,40,75,+32,75,41,41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,+32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,+32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,95,49,50,48,41,41,32,95,53,52,52,41,32,95,53,52,53,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,40,67,39,32,83,39,41,32,95,53,52,48,41,32,40,+85,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,+40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,40,67,39,32,40,+67,39,32,95,53,54,52,41,41,41,32,40,40,66,32,40,66,32,40,40,+67,39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,40,83,+39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,40,85,32,65,41,+41,32,40,85,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,95,52,56,49,32,95,50,55,55,41,32,40,40,95,52,56,53,32,95,+50,55,55,41,32,40,95,51,53,57,32,35,52,41,41,41,41,41,32,95,+53,51,55,41,41,41,41,41,41,41,32,73,41,41,32,95,53,51,57,41,+41,32,95,53,51,56,41,41,41,32,73,41,41,32,40,40,65,32,58,53,+53,56,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,101,+97,108,70,108,111,97,116,46,105,115,78,97,78,34,41,41,41,32,40,40,+65,32,58,53,53,57,32,40,75,32,40,110,111,68,101,102,97,117,108,116,+32,34,82,101,97,108,70,108,111,97,116,46,105,115,73,110,102,105,110,105,+116,101,34,41,41,41,32,40,40,65,32,58,53,54,48,32,40,75,32,40,+110,111,68,101,102,97,117,108,116,32,34,82,101,97,108,70,108,111,97,116,+46,105,115,68,101,110,111,114,109,97,108,105,122,101,100,34,41,41,41,32,+40,40,65,32,58,53,54,49,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,82,101,97,108,70,108,111,97,116,46,105,115,78,101,103,97,+116,105,118,101,90,101,114,111,34,41,41,41,32,40,40,65,32,58,53,54,+50,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,82,101,97,+108,70,108,111,97,116,46,105,115,73,69,69,69,34,41,41,41,32,40,40,+65,32,58,53,54,51,32,40,40,40,83,39,32,40,83,39,32,83,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,95,52,57,57,41,32,40,40,66,32,+40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,+40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,+32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,+41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,83,+39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+67,39,32,95,49,50,49,41,41,32,40,40,40,83,39,32,67,41,32,40,+40,66,32,95,50,48,50,41,32,40,40,66,32,95,52,57,53,41,32,40,+40,66,32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,+41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,+50,53,51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,+95,53,51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,95,52,57,57,41,+32,40,40,66,32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,+41,41,41,32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,+95,50,53,51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,+32,95,53,51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,+83,39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,32,66,41,32,+40,40,66,32,40,67,39,32,95,49,50,49,41,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,95,52,57,55,41,32,40,40,66,32,40,85,+32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,40,+67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,+40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,+41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,+39,32,67,41,32,40,40,66,32,95,52,57,57,41,32,40,40,66,32,40,+85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,+40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,+40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,+41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,32,40,83,39,+32,83,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,95,+49,50,48,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,95,49,50,49,41,41,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,95,52,57,56,41,32,40,40,66,32,40,85,32,40,75,32,+75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,40,67,39,32,95,+52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,+85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,+51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,67,41,+32,40,40,66,32,95,52,57,55,41,32,40,40,66,32,40,85,32,40,75,+32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,40,40,67,39,32,+95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,+40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,+95,51,53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,40,83,39,32,95,49,50,48,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,40,67,39,32,95,49,50,49,41,41,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,95,52,57,55,41,32,40,40,+66,32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,+32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,+51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,+51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,+95,53,52,55,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,95,49,50,49,41,41,32,95,53,52,55,41,41,32,95,53,+52,55,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,+32,40,40,40,83,39,32,83,41,32,40,40,40,83,39,32,40,67,39,32,+83,39,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,40,+40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,40,40,+66,32,95,52,57,53,41,32,40,40,66,32,40,85,32,40,75,32,75,41,+41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,32,95,52,+56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,85,+32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,51,+53,57,32,35,48,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,95,49,50,48,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,52,57,55,41,32,40,40,66,32,40,85,32,40,75,32,75,41,41,+41,32,95,53,51,53,41,41,41,32,40,40,40,67,39,32,95,52,56,53,+41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,85,32,40,+90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,51,53,57,+32,35,48,41,41,41,41,32,95,53,52,55,41,41,41,32,40,40,40,67,+39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,+32,95,49,50,49,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,+32,95,50,48,50,41,32,40,40,66,32,95,52,57,53,41,32,40,40,66,+32,40,85,32,40,75,32,75,41,41,41,32,95,53,51,53,41,41,41,41,+32,40,40,40,67,39,32,95,52,56,53,41,32,40,40,66,32,95,50,53,+51,41,32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,+51,53,41,41,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,+40,40,40,83,39,32,67,41,32,40,40,66,32,95,50,48,50,41,32,40,+40,66,32,95,52,57,53,41,32,40,40,66,32,40,85,32,40,75,32,75,+41,41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,32,95,+52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,32,40,+85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,40,95,+51,53,57,32,35,48,41,41,41,41,41,32,40,40,66,32,67,41,32,40,+40,66,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,32,40,+40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,+41,41,41,41,32,73,41,41,41,32,40,40,66,32,95,50,48,56,41,32,+40,40,66,32,40,85,32,40,75,32,65,41,41,41,32,95,53,51,53,41,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,+66,32,95,52,56,50,41,32,40,40,66,32,95,50,53,51,41,32,40,40,+66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,+41,41,32,40,40,40,83,39,32,66,41,32,95,53,52,57,41,32,40,40,+66,32,95,52,56,50,41,32,40,40,66,32,95,50,53,51,41,32,40,40,+66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,40,83,39,32,95,52,55,57,41,32,40,40,66,32,95,50,53,51,41,+32,40,40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,+41,41,41,32,40,40,66,32,95,50,48,56,41,32,40,40,66,32,40,85,+32,40,75,32,65,41,41,41,32,95,53,51,53,41,41,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,49,57,+41,32,40,40,66,32,40,85,32,40,75,32,65,41,41,41,32,95,53,51,+53,41,41,41,41,32,40,40,66,32,95,50,53,52,41,32,40,40,66,32,+40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,41,41,+41,41,32,40,40,83,32,40,40,40,83,39,32,95,50,53,52,41,32,40,+40,66,32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,+32,40,40,66,32,95,50,48,56,41,32,40,40,66,32,40,85,32,40,75,+32,65,41,41,41,32,95,53,51,53,41,41,41,41,32,40,40,40,67,39,+32,95,52,56,53,41,32,40,40,66,32,95,50,53,51,41,32,40,40,66,+32,40,85,32,40,90,32,75,41,41,41,32,95,53,51,53,41,41,41,32,+40,95,51,53,57,32,35,50,41,41,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,40,40,66,32,95,50,49,57,41,32,40,40,+66,32,40,85,32,40,75,32,65,41,41,41,32,95,53,51,53,41,41,41,+41,32,40,40,66,32,95,50,53,52,41,32,40,40,66,32,40,85,32,40,+90,32,75,41,41,41,32,95,53,51,53,41,41,41,41,41,32,40,40,65,+32,58,53,54,52,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+95,53,48,49,32,95,50,56,50,41,41,32,40,95,52,56,50,32,95,50,+55,55,41,41,41,32,40,95,53,48,50,32,95,50,56,50,41,41,41,32,+40,40,65,32,58,53,54,53,32,40,85,32,75,41,41,32,40,40,65,32,+58,53,54,54,32,40,85,32,65,41,41,32,40,40,65,32,58,53,54,55,+32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,66,32,40,67,32,+66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,49,50,49,41,41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,+32,75,41,41,41,41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,+32,65,41,41,41,41,41,41,32,40,40,66,32,95,50,48,53,41,32,40,+40,66,32,95,53,54,55,41,32,40,40,40,83,39,32,80,41,32,40,85,+32,75,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,40,65,32,+58,53,54,56,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,66,+32,40,67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,66,39,32,66,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+40,66,32,40,66,32,40,66,32,95,49,50,49,41,41,41,32,40,40,66,+32,95,50,48,50,41,32,40,85,32,40,90,32,75,41,41,41,41,41,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,49,50,49,41,41,41,32,40,40,66,32,95,50,48,50,41,+32,40,85,32,40,75,32,75,41,41,41,41,41,41,32,40,40,66,32,95,+50,48,50,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,41,+32,40,40,66,32,95,50,48,53,41,32,40,40,66,32,95,53,54,56,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+85,32,40,90,32,75,41,41,41,32,40,85,32,40,75,32,75,41,41,41,+41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,54,57,32,40,40,40,83,39,32,95,50,48,49,41,32,40,40,+66,32,40,67,32,66,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,40,66,39,32,40,66,39,32,66,41,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,+32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,41,+41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,41,+41,41,32,40,40,66,32,95,50,48,50,41,32,40,85,32,40,75,32,40,+90,32,75,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,50,49,41,41,41,+32,40,40,66,32,95,50,48,50,41,32,40,85,32,40,75,32,40,75,32,+75,41,41,41,41,41,41,41,32,40,40,66,32,95,50,48,50,41,32,40,+85,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,95,50,48,53,41,32,40,40,66,32,95,53,54,57,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,80,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,85,32,40,75,32,40,90,32,75,41,41,41,41,41,32,40,85,+32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,85,32,40,75,32,+40,75,32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,55,+48,32,40,40,40,95,49,53,56,56,32,40,75,32,40,85,32,40,95,49,+53,57,55,32,34,40,41,34,41,41,41,41,32,40,95,49,53,57,51,32,+95,53,55,48,41,41,32,40,95,49,53,57,52,32,95,53,55,48,41,41,+41,32,40,40,65,32,58,53,55,49,32,40,40,83,32,40,40,40,83,39,+32,95,49,53,56,56,41,32,40,90,32,40,40,66,32,85,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,49,53,57,56,32,95,49,50,53,41,+41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,+53,56,57,41,32,40,85,32,75,41,41,32,35,48,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,40,40,+79,32,35,52,52,41,32,75,41,41,41,41,41,32,40,40,40,67,39,32,+95,49,53,56,57,41,32,40,85,32,65,41,41,32,35,48,41,41,41,41,+41,41,41,32,40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,+53,55,49,41,32,40,40,40,83,39,32,80,41,32,40,85,32,75,41,41,+32,40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,95,49,53,57,+52,41,32,40,40,66,32,95,53,55,49,41,32,40,40,40,83,39,32,80,+41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,41,41,41,32,+40,40,65,32,58,53,55,50,32,40,40,83,32,40,40,40,83,39,32,95,+49,53,56,56,41,32,40,90,32,40,40,66,32,85,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,49,53,57,56,32,95,49,50,53,+41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,50,54,51,41,+41,32,40,40,40,67,39,32,95,49,53,56,57,41,32,40,85,32,40,90,+32,75,41,41,41,32,35,48,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,40,40,79,32,+35,52,52,41,32,75,41,41,41,41,41,41,32,40,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,50,54,51,41,41,+32,40,40,40,67,39,32,95,49,53,56,57,41,32,40,85,32,40,75,32,+75,41,41,41,32,35,48,41,41,41,32,40,40,66,32,40,66,32,40,95,+50,54,51,32,40,95,49,53,57,55,32,40,40,79,32,35,52,52,41,32,+75,41,41,41,41,41,32,40,40,40,67,39,32,95,49,53,56,57,41,32,+40,85,32,40,75,32,65,41,41,41,32,35,48,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,53,+55,50,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,+41,32,40,85,32,40,90,32,75,41,41,41,32,40,85,32,40,75,32,75,+41,41,41,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,+40,40,66,32,95,49,53,57,52,41,32,40,40,66,32,95,53,55,50,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+85,32,40,90,32,75,41,41,41,32,40,85,32,40,75,32,75,41,41,41,+41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,40,40,65,+32,58,53,55,51,32,40,40,83,32,40,40,40,83,39,32,95,49,53,56,+56,41,32,40,90,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,49,53,57,56,32,95,49,50,53,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,40,66,32,95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,53,+56,57,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,41,32,35,+48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,95,50,54,51,32,40,95,49,53,57,55,32,40,40,79,32,35,52,52,+41,32,75,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,+95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,53,56,57,41,32,+40,85,32,40,75,32,40,90,32,75,41,41,41,41,32,35,48,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,51,32,40,95,+49,53,57,55,32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,50,54,51,41,41,32,40,40,40,67,39,32,95,49,53,56,+57,41,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,32,35,48,+41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,32,40,95,49,+53,57,55,32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,41,32,+40,40,40,67,39,32,95,49,53,56,57,41,32,40,85,32,40,75,32,40,+75,32,65,41,41,41,41,32,35,48,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,95,49,53,57,51,41,32,40,40,66,32,95,53,55,+51,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,80,41,32,40,85,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,85,32,40,75,32,40,90,32,75,41,41,41,41,41,+32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,85,32,+40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,32,40,40,66,32,+95,49,53,57,52,41,32,40,40,66,32,95,53,55,51,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,80,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,41,32,40,+85,32,40,75,32,40,90,32,75,41,41,41,41,41,32,40,85,32,40,75,+32,40,75,32,75,41,41,41,41,41,32,40,85,32,40,75,32,40,75,32,+65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,53,55,52,32,40,+40,95,49,50,54,32,95,49,51,52,49,41,32,95,49,51,52,49,41,41,+32,40,40,65,32,58,53,55,53,32,40,40,40,83,39,32,95,49,50,54,+41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,49,50,55,41,+32,40,85,32,75,41,41,41,32,40,40,66,32,95,49,50,55,41,32,40,+85,32,65,41,41,41,41,32,40,40,40,83,39,32,80,41,32,40,40,66,+32,95,49,50,56,41,32,40,85,32,75,41,41,41,32,40,40,66,32,95,+49,50,56,41,32,40,85,32,65,41,41,41,41,41,32,40,40,65,32,58,+53,55,54,32,40,40,40,83,39,32,95,49,50,54,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,49,+50,55,41,32,40,85,32,40,90,32,75,41,41,41,41,32,40,40,66,32,+95,49,50,55,41,32,40,85,32,40,75,32,75,41,41,41,41,41,32,40,+40,66,32,95,49,50,55,41,32,40,85,32,40,75,32,65,41,41,41,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,+40,40,66,32,95,49,50,56,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,40,75,+32,65,41,41,41,41,41,41,32,40,40,65,32,58,53,55,55,32,40,40,+40,83,39,32,95,49,50,54,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,40,66,+32,95,49,50,55,41,32,40,85,32,40,90,32,40,90,32,75,41,41,41,+41,41,32,40,40,66,32,95,49,50,55,41,32,40,85,32,40,75,32,40,+90,32,75,41,41,41,41,41,41,32,40,40,66,32,95,49,50,55,41,32,+40,85,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,40,66,+32,95,49,50,55,41,32,40,85,32,40,75,32,40,75,32,65,41,41,41,+41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,95,49,50,56,41,+32,40,85,32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,40,66,+32,95,49,50,56,41,32,40,85,32,40,75,32,40,90,32,75,41,41,41,+41,41,41,32,40,40,66,32,95,49,50,56,41,32,40,85,32,40,75,32,+40,75,32,75,41,41,41,41,41,41,32,40,40,66,32,95,49,50,56,41,+32,40,85,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,32,40,+40,65,32,58,53,55,56,32,40,40,40,40,40,40,40,95,52,55,56,32,+95,49,51,54,51,41,32,95,49,51,54,52,41,32,95,49,51,54,53,41,+32,40,95,52,56,57,32,95,53,55,56,41,41,32,73,41,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,95,50,48,50,32,95,53,56,51,41,+41,32,35,48,41,41,32,35,49,41,41,32,35,48,41,41,32,40,40,66,+32,95,49,51,57,48,41,32,95,51,54,48,41,41,41,32,40,40,65,32,+58,53,55,57,32,40,40,40,40,40,40,40,40,95,51,54,52,32,40,40,+80,32,95,53,56,51,41,32,95,53,55,56,41,41,32,95,49,51,54,54,+41,32,95,49,51,54,55,41,32,40,95,51,55,53,32,95,53,55,57,41,+41,32,40,95,51,55,54,32,95,53,55,57,41,41,32,40,95,51,55,55,+32,95,53,55,57,41,41,32,40,95,51,55,56,32,95,53,55,57,41,41,+32,95,51,54,49,41,41,32,40,40,65,32,58,53,56,48,32,40,40,95,+49,50,54,32,35,48,41,32,35,45,49,41,41,32,40,40,65,32,58,53,+56,49,32,40,95,53,51,49,32,40,40,66,32,95,53,50,57,41,32,95,+51,54,49,41,41,41,32,40,40,65,32,58,53,56,50,32,40,40,40,40,+40,40,40,40,95,49,55,57,32,40,40,67,32,40,95,52,55,57,32,95,+53,55,56,41,41,32,40,40,95,52,56,53,32,95,53,55,56,41,32,40,+95,51,53,57,32,35,49,41,41,41,41,32,40,40,67,32,40,95,52,56,+48,32,95,53,55,56,41,41,32,40,40,95,52,56,53,32,95,53,55,56,+41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,95,49,51,57,48,+41,32,95,49,51,56,57,41,32,40,40,83,32,95,52,54,50,41,32,40,+40,66,32,40,95,49,56,52,32,95,53,56,53,41,41,32,40,40,67,32,+40,95,52,55,57,32,95,53,55,56,41,41,32,35,49,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,89,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,83,32,95,52,54,50,41,41,41,41,32,40,40,66,32,+40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,40,95,52,55,57,32,95,53,55,56,41,41,41,41,32,40,67,32,40,+95,52,56,48,32,95,53,55,56,41,41,41,41,41,41,32,73,41,41,32,+40,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,32,40,95,+52,57,56,32,95,53,56,52,41,41,41,41,32,40,95,49,56,52,32,95,+53,56,53,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,40,83,+39,32,40,83,39,32,83,39,41,41,32,40,67,32,40,95,52,57,57,32,+95,53,56,52,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+95,52,50,52,41,32,40,67,32,40,95,53,48,48,32,95,53,56,52,41,+41,41,41,41,32,40,95,49,56,53,32,95,53,56,53,41,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,95,52,50,52,41,32,40,67,+32,40,95,52,57,56,32,95,53,56,52,41,41,41,41,41,32,40,95,49,+56,53,32,95,53,56,53,41,41,41,41,41,32,40,40,65,32,58,53,56,+51,32,40,40,95,50,48,49,32,95,49,51,56,51,41,32,95,49,51,56,+52,41,41,32,40,40,65,32,58,53,56,52,32,40,40,40,40,40,40,40,+40,95,52,57,52,32,95,53,56,51,41,32,40,95,53,48,51,32,95,53,+56,52,41,41,32,95,49,51,56,53,41,32,95,49,51,56,54,41,32,95,+49,51,56,55,41,32,95,49,51,56,56,41,32,40,95,53,48,56,32,95,+53,56,52,41,41,32,40,95,53,48,57,32,95,53,56,52,41,41,41,32,+40,40,65,32,58,53,56,53,32,40,40,40,40,40,40,40,40,95,49,55,+57,32,40,95,49,56,56,32,95,53,56,53,41,41,32,40,95,49,56,57,+32,95,53,56,53,41,41,32,95,49,51,57,48,41,32,95,49,51,56,57,+41,32,40,95,49,57,50,32,95,53,56,53,41,41,32,40,95,49,57,51,+32,95,53,56,53,41,41,32,40,95,49,57,52,32,95,53,56,53,41,41,+32,40,95,49,57,53,32,95,53,56,53,41,41,41,32,40,40,65,32,58,+53,56,54,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,+40,40,40,40,40,40,95,54,53,32,95,53,56,51,41,32,95,49,51,54,+56,41,32,95,49,51,54,57,41,32,95,49,51,55,48,41,32,95,49,51,+55,52,41,32,40,95,57,50,32,95,53,56,54,41,41,32,40,95,57,51,+32,95,53,56,54,41,41,32,35,48,41,32,40,95,49,51,55,49,32,35,+49,41,41,32,40,95,57,54,32,95,53,56,54,41,41,32,40,95,57,55,+32,95,53,56,54,41,41,32,40,95,57,56,32,95,53,56,54,41,41,32,+40,95,57,57,32,95,53,56,54,41,41,32,95,49,51,55,49,41,32,40,+95,49,48,49,32,95,53,56,54,41,41,32,95,49,51,55,50,41,32,40,+95,49,48,51,32,95,53,56,54,41,41,32,40,95,49,48,52,32,95,53,+56,54,41,41,32,40,95,49,48,53,32,95,53,56,54,41,41,32,40,95,+49,48,54,32,95,53,56,54,41,41,32,40,95,49,48,55,32,95,53,56,+54,41,41,32,40,75,32,35,54,52,41,41,41,32,40,40,65,32,58,53,+56,55,32,40,40,40,95,49,53,56,56,32,40,95,49,53,57,50,32,95,+53,56,55,41,41,32,40,89,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,67,41,32,40,40,66,32,40,40,83,39,32,83,39,41,32,+40,40,67,32,40,95,52,57,55,32,95,53,56,52,41,41,32,35,49,48,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,52,54,51,41,41,32,40,40,67,32,66,41,32,40,+40,67,32,40,95,51,54,54,32,95,53,55,57,41,41,32,35,49,48,41,+41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,67,+32,79,41,32,75,41,41,41,32,40,40,66,32,95,49,51,54,41,32,40,+40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,95,49,51,+55,32,35,52,56,41,41,41,32,40,40,66,32,95,49,51,56,57,41,32,+40,40,67,32,40,95,51,54,55,32,95,53,55,57,41,41,32,35,49,48,+41,41,41,41,41,41,41,32,40,95,49,53,57,52,32,95,53,56,55,41,+41,41,32,40,40,65,32,58,53,56,56,32,40,40,66,32,40,66,32,73,+79,46,112,101,114,102,111,114,109,73,79,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,+95,49,52,55,50,41,41,32,40,95,51,52,32,95,49,52,53,50,41,41,+41,41,32,40,40,65,32,58,53,56,57,32,40,40,66,32,40,67,32,95,+53,56,56,41,41,32,40,40,67,32,95,51,52,41,32,95,49,51,52,49,+41,41,41,32,40,40,65,32,58,53,57,48,32,95,49,52,49,53,41,32,+40,40,65,32,58,53,57,49,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,52,48,53,41,32,95,53,57,48,41,41,32,40,40,67,32,+40,83,39,32,95,49,52,48,53,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,52,48,54,41,32,95,53,57,52,41,41,32,95,+49,52,48,55,41,41,41,41,32,40,40,65,32,58,53,57,50,32,95,49,+52,49,54,41,32,40,40,65,32,58,53,57,51,32,94,102,114,101,101,41,+32,40,40,65,32,58,53,57,52,32,95,53,57,51,41,32,40,40,65,32,+58,53,57,53,32,94,109,97,108,108,111,99,41,32,40,40,65,32,58,53,+57,54,32,95,53,57,53,41,32,40,40,65,32,58,53,57,55,32,40,40,+95,50,48,49,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+50,48,50,32,95,53,56,51,41,41,32,95,49,52,49,56,41,41,32,95,+49,52,49,56,41,41,32,40,95,50,48,53,32,95,53,57,55,41,41,41,+32,40,40,65,32,58,53,57,56,32,40,40,40,95,49,53,56,56,32,40,+75,32,40,40,66,32,40,95,50,54,51,32,40,95,49,53,57,55,32,34,+80,84,82,35,34,41,41,41,32,40,40,66,32,40,40,95,49,53,56,57,+32,95,53,56,55,41,32,35,48,41,41,32,95,49,52,49,56,41,41,41,+41,32,40,95,49,53,57,51,32,95,53,57,56,41,41,32,40,95,49,53,+57,52,32,95,53,57,56,41,41,41,32,40,40,65,32,58,53,57,57,32,+40,95,49,52,49,55,32,35,48,41,41,32,40,40,65,32,58,54,48,48,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,32,40,40,65,32,+58,54,48,49,32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,32,40,40,65,32,58,54,48,50,32,40,85,32,+40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,+40,40,65,32,58,54,48,51,32,40,85,32,40,75,32,40,75,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,32,40,40,65,32,58,54,48,52,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,+41,41,41,32,40,40,65,32,58,54,48,53,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,40,65,32,+58,54,48,54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,+65,41,41,41,41,41,41,32,40,40,65,32,58,54,48,55,32,80,41,32,+40,40,65,32,58,54,48,56,32,40,85,32,75,41,41,32,40,40,65,32,+58,54,48,57,32,40,40,66,32,85,41,32,40,90,32,95,54,48,55,41,+41,41,32,40,40,65,32,58,54,49,48,32,40,85,32,65,41,41,32,40,+40,65,32,58,54,49,49,32,40,40,95,54,48,55,32,95,52,54,49,41,+32,95,57,50,48,41,41,32,40,40,65,32,58,54,49,50,32,40,40,66,+32,85,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,54,48,55,+41,41,32,95,57,51,49,41,41,41,32,40,40,65,32,58,54,49,51,32,+40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,95,51,50,32,95,+49,52,53,50,41,41,41,41,32,95,54,49,54,41,32,40,40,66,32,85,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,+52,53,50,41,32,95,49,52,55,57,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,40,83,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,66,32,40,95,+51,52,32,95,49,52,53,50,41,41,32,95,50,49,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,+52,53,50,41,32,95,49,52,55,57,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,53,50,+41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,+41,32,95,54,48,49,41,32,35,48,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,41,32,40,40,+66,32,40,66,32,40,95,52,54,51,32,34,99,111,109,98,105,110,97,116,+111,114,32,99,111,110,118,101,114,115,105,111,110,32,34,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,95,52,54,51,41,41,32,40,40,66,32,+40,66,32,40,95,49,54,49,48,32,35,54,41,41,41,32,40,40,66,32,+40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,32,40,67,+32,40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,32,34,109,115,+34,41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,83,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,+40,66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,40,67,+39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,41,+32,35,51,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,+52,55,50,41,41,32,40,40,66,32,40,95,52,54,51,32,34,99,111,109,+98,105,110,97,116,111,114,115,58,92,49,48,38,34,41,41,32,95,54,53,+48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,+49,52,53,50,41,41,41,32,40,67,32,80,41,41,41,41,41,41,41,41,+32,40,95,51,57,52,32,40,85,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,40,40,67,39,32,66,41,32,80,41,32,95,55,48,51,+41,41,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,54,49,+52,32,40,40,40,67,39,32,40,95,49,50,50,32,95,49,51,51,57,41,+41,32,40,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,40,+40,95,49,52,54,51,32,34,99,97,99,104,101,47,80,114,101,108,117,100,+101,46,99,111,109,98,34,41,32,95,49,52,52,54,41,41,41,32,40,40,+66,32,40,80,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,54,+49,49,41,41,41,32,40,40,66,32,40,40,83,39,32,40,95,51,50,32,+95,49,52,53,50,41,41,32,95,49,52,53,53,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,+53,50,41,41,32,95,49,52,53,57,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,+40,40,40,67,39,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,+32,95,49,52,53,50,41,41,32,95,54,48,53,41,41,32,40,95,49,52,+55,50,32,34,108,111,97,100,101,100,32,99,97,99,104,101,100,32,80,114,+101,108,117,100,101,34,41,41,41,41,32,40,95,51,52,32,95,49,52,53,+50,41,41,41,41,41,41,41,32,40,40,95,51,52,32,95,49,52,53,50,+41,32,95,54,49,49,41,41,41,32,40,40,65,32,58,54,49,53,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,+53,50,41,41,32,95,54,49,52,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,95,50,55,54,32,95,49,52,53,48,41,32,95,53,54,53,+41,41,41,41,32,95,54,49,51,41,41,41,32,40,40,65,32,58,54,49,+54,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,95,51,50,+32,95,49,52,53,50,41,41,41,41,32,40,40,66,32,40,66,32,95,49,+48,56,57,41,41,32,95,54,49,55,41,41,32,40,40,66,32,85,41,32,+40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,90,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,95,51,51,32,+95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,+53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,116,111,116,97,108,32,105,109,112,111,114,116,32,116,+105,109,101,32,32,32,32,32,34,41,41,32,40,40,40,67,39,32,95,52,+54,51,41,32,40,40,66,32,40,95,49,54,49,48,32,35,54,41,41,32,+40,95,49,53,57,48,32,95,50,56,51,41,41,41,32,34,109,115,34,41,+41,41,41,41,41,32,40,40,66,32,40,95,51,52,32,95,49,52,53,50,+41,41,32,40,40,40,83,39,32,80,41,32,40,40,66,32,40,95,50,54,+49,32,40,95,51,57,52,32,95,49,49,49,54,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,57,50,50,41,41,32,95,54,49,48,41,41,+41,32,73,41,41,41,41,41,41,41,41,32,40,40,65,32,58,54,49,55,+32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,+32,40,95,49,48,57,52,32,95,54,49,48,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,40,83,39,32,+67,41,32,95,57,50,56,41,41,32,40,40,66,32,40,66,32,40,40,95,+51,50,32,95,49,48,57,50,41,32,40,95,49,48,57,52,32,95,54,48,+56,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,40,+95,51,51,32,95,49,48,57,50,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,95,50,54,49,41,41,32,40,40,66,32,40,66,32,40,95,52,+53,32,95,49,48,57,50,41,41,41,32,40,95,52,51,50,32,95,56,57,+50,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,50,+52,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,114,+101,99,117,114,115,105,118,101,32,109,111,100,117,108,101,58,32,34,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,32,40,40,66,32,40,95,52,54,51,32,34,44,+32,105,109,112,111,114,116,32,99,104,97,105,110,58,32,34,41,41,32,40,+40,66,32,95,49,54,48,57,41,32,40,95,51,57,53,32,95,57,48,50,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+95,51,51,32,95,49,48,57,50,41,41,32,40,40,66,32,40,95,50,54,+49,32,95,49,48,57,53,41,41,32,40,40,40,67,39,32,40,83,39,32,+95,54,48,57,41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,+41,32,95,54,48,56,41,41,32,73,41,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,95,51,51,32,95,49,48,57,50,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,+66,32,40,95,52,53,32,95,49,48,57,50,41,41,32,40,40,40,67,39,+32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,41,32,+35,48,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,+57,56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,+41,41,32,40,40,66,32,40,95,52,54,51,32,34,105,109,112,111,114,116,+105,110,103,32,34,41,41,32,95,57,48,50,41,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,95,51,50,32,95,49,48,57,50,41,41,+41,32,95,54,49,56,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,40,83,39,32,66,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,95,51,51,32,95,49,48,57,50,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,+49,48,57,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,48,+57,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,+54,49,32,95,49,52,55,50,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,95,52,54,51,32,34,105,109,112,111,114,116,105,110,103,32,+100,111,110,101,32,34,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,95,52,54,51,41,32,95,57,48,50,41,41,+41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,44,32,34,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,95,52,54,51,41,41,32,+40,40,66,32,40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,41,+41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,32,40,40,66,32,+40,66,32,40,95,52,54,51,32,34,109,115,32,40,34,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,+49,53,57,48,32,95,50,56,51,41,41,41,32,40,40,66,32,40,95,52,+54,51,32,34,32,43,32,34,41,41,32,40,40,40,67,39,32,95,52,54,+51,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,32,40,40,79,+32,35,52,49,41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,40,95,51,51,32,95,49,48,57,50,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,95,50,54,49,41,41,32,40,+40,66,32,40,66,32,40,95,52,53,32,95,49,48,57,50,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,49,41,32,95,+54,48,53,41,41,32,40,40,67,32,40,95,50,48,51,32,95,56,57,50,+41,41,32,40,95,56,57,55,32,34,73,110,116,101,114,97,99,116,105,118,+101,34,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,+48,57,56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,+50,41,41,32,40,40,66,32,40,95,52,54,51,32,34,108,111,97,100,101,+100,32,34,41,41,32,95,57,48,50,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,+50,32,95,49,48,57,50,41,32,95,49,48,57,55,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,67,+39,32,40,95,51,51,32,95,49,48,57,50,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,48,57,54,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,95,54,48,55,41,+32,40,40,66,32,95,52,50,57,41,32,95,54,48,56,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,57,50,57,41,32,+95,54,49,48,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,80,41,+41,41,32,40,40,66,32,40,66,32,40,95,52,55,57,32,95,50,55,55,+41,41,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,95,49,48,+57,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,48,57,50,41,+41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,+32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,32,40,95,+50,54,49,32,95,49,48,57,56,41,41,32,40,40,66,32,40,95,50,54,+49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,95,52,54,51,32,+34,105,109,112,111,114,116,105,110,103,32,99,97,99,104,101,100,32,34,41,+41,32,95,57,48,50,41,41,41,41,41,41,32,40,40,66,32,40,95,51,+52,32,95,49,48,57,50,41,41,32,40,40,67,32,80,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,54,49,56,32,40,40,66,32,+40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,32,40,95,49,48,+57,56,32,95,49,52,55,57,41,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,+49,48,57,50,41,41,41,32,40,40,66,32,40,66,32,95,49,48,57,56,+41,41,32,40,40,40,67,39,32,83,41,32,40,40,66,32,40,40,67,39,+32,95,54,49,57,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,+32,95,54,48,51,41,41,32,40,40,40,67,39,32,95,52,54,51,41,32,+40,40,66,32,40,95,51,57,53,32,40,40,67,32,40,40,83,32,40,40,+67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,54,41,41,+32,73,41,41,32,35,52,55,41,41,41,32,95,57,48,48,41,41,32,34,+46,104,115,34,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+85,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,40,40,+66,32,83,39,41,32,40,40,66,32,40,67,39,32,40,95,51,51,32,95,+49,48,57,50,41,41,41,32,40,40,40,83,39,32,40,83,39,32,95,50,+54,49,41,41,32,40,40,66,32,40,66,32,40,95,52,53,32,95,49,48,+57,50,41,41,41,32,40,95,50,48,51,32,95,56,57,50,41,41,41,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,95,50,52,41,41,41,32,+40,40,66,32,40,66,32,40,95,52,54,51,32,34,109,111,100,117,108,101,+32,110,97,109,101,32,100,111,101,115,32,110,111,116,32,97,103,114,101,101,+32,119,105,116,104,32,102,105,108,101,32,110,97,109,101,58,32,34,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,+79,32,35,51,50,41,32,75,41,41,41,32,95,57,48,50,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,32,40,95,49,48,+57,56,32,95,49,52,55,57,41,41,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,95,51,50,32,95,49,48,57,50,41,41,41,+32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,40,95,50,55,50,+32,95,49,48,57,48,41,32,95,52,49,52,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,52,51,32,95,49,48,57,50,+41,41,32,95,54,49,55,41,41,32,40,95,51,57,52,32,40,85,32,40,+75,32,40,90,32,40,90,32,40,40,67,32,79,41,32,75,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,85,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,49,48,57,50,41,32,40,95,49,48,57,56,32,95,49,52,55,57,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,67,+39,32,66,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,+40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+40,83,39,32,40,95,51,51,32,95,49,48,57,50,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,66,+32,40,95,52,53,32,95,49,48,57,50,41,41,32,40,40,40,67,39,32,+40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,41,32,35,+50,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,+56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,+41,32,40,40,66,32,40,95,52,54,51,32,34,116,121,112,101,32,99,104,+101,99,107,101,100,58,92,49,48,38,34,41,41,32,40,40,40,67,39,32,+95,52,54,51,41,32,40,95,49,51,48,52,32,95,56,51,57,41,41,32,+34,45,45,45,45,45,92,49,48,38,34,41,41,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,40,95,51,50,32,95,49,48,+57,50,41,41,32,40,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,49,48,57,50,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,+50,49,41,41,32,95,49,49,49,54,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,85,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,95,51,50,32,95,49,48,57,50,41,32,40,95,+49,48,57,56,32,95,49,52,55,57,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,+40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+95,51,51,32,95,49,48,57,50,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,+32,95,49,48,57,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,+32,95,50,56,50,41,41,32,95,54,48,49,41,32,35,51,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,40,+40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,+32,40,95,52,54,51,32,34,100,101,115,117,103,97,114,101,100,58,92,49,+48,38,34,41,41,32,40,95,49,51,48,52,32,95,54,53,48,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,80,41,41,41,32,40,67,32,40,95,52,56,48,32,95,50,55,55,41,+41,41,41,41,41,32,40,67,32,40,95,52,56,48,32,95,50,55,55,41,+41,41,41,41,32,40,95,52,48,51,32,95,50,55,55,41,41,41,41,41,+41,41,41,32,95,54,50,49,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,67,39,32,95,49,49,50,51,41,41,32,95,52,49,50,41,+41,32,40,40,83,32,73,41,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,95,51,57,52,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,+75,32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,40,67,32,79,+41,32,75,41,41,41,32,40,75,32,40,75,32,40,75,32,75,41,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,40,75,+32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,75,41,+41,41,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,32,40,85,+32,40,90,32,75,41,41,41,41,41,32,40,95,57,57,54,32,95,57,57,+57,41,41,41,41,41,41,32,40,40,65,32,58,54,49,57,32,40,40,66,+32,40,40,83,39,32,40,83,39,32,40,95,51,50,32,95,49,52,53,50,+41,41,41,32,95,54,50,48,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,80,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+66,39,32,40,40,66,32,95,50,54,49,41,32,95,56,51,54,41,41,41,+32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,70,105,108,101,32,+110,111,116,32,102,111,117,110,100,58,32,34,41,41,41,32,40,40,66,32,+40,40,67,39,32,95,52,54,51,41,32,40,95,49,53,57,48,32,40,95,+51,57,49,32,95,49,52,57,41,41,41,41,32,40,40,66,32,40,95,52,+54,51,32,34,92,49,48,38,112,97,116,104,61,34,41,41,32,40,95,49,+53,57,48,32,40,95,51,57,49,32,40,95,51,57,49,32,95,49,52,57,+41,41,41,41,41,41,41,41,32,40,85,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,52,55,54,41,+41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,52,53,50,41,+41,41,32,80,41,41,41,41,41,41,32,40,40,65,32,58,54,50,48,32,+40,40,40,67,39,32,66,41,32,40,85,32,40,40,95,51,52,32,95,49,+52,53,50,41,32,95,52,55,54,41,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,40,83,39,32,40,95,51,50,32,+95,49,52,53,50,41,41,32,40,40,67,32,95,49,52,54,51,41,32,95,+49,52,52,54,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,80,41,41,32,40,67,32,95,54,50,+48,41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,52,+53,50,41,41,41,32,40,40,66,32,40,66,32,95,52,55,55,41,41,32,+80,41,41,41,41,41,32,40,40,66,32,40,67,32,95,52,54,51,41,41,+32,40,95,52,54,51,32,40,40,79,32,35,52,55,41,32,75,41,41,41,+41,41,41,32,40,40,65,32,58,54,50,49,32,40,85,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,50,54,+49,41,41,41,41,41,41,41,32,95,49,49,49,53,41,41,32,40,40,66,+32,40,66,32,40,95,50,54,49,32,40,95,51,57,53,32,95,54,55,52,+41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,54,+55,51,41,41,41,32,40,40,66,32,95,51,57,52,41,32,95,54,50,50,+41,41,41,41,41,41,32,40,40,65,32,58,54,50,50,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+83,39,32,80,41,32,40,90,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,95,52,49,51,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,67,39,32,66,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,67,39,32,83,39,41,41,32,40,40,66,32,66,39,41,32,40,40,+66,32,40,66,32,80,41,41,32,95,57,48,53,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,95,50,+54,49,41,32,95,54,52,54,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,40,83,39,32,95,50,54,49,41,41,32,+40,89,32,40,40,66,32,40,40,67,39,32,66,41,32,83,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,67,32,83,39,41,41,41,41,32,40,40,+66,32,40,67,32,40,83,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,+40,67,32,40,83,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,54,55,54,41,32,+40,40,66,32,40,95,54,55,54,32,40,95,54,55,56,32,40,95,55,56,+49,32,34,115,101,113,34,41,41,41,41,32,95,54,55,53,41,41,41,41,+41,41,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,95,50,54,49,41,41,32,40,40,66,32,40,+66,32,95,54,52,54,41,41,32,40,40,66,32,40,40,67,39,32,95,51,+57,52,41,32,40,40,66,32,85,41,32,40,40,66,32,90,41,32,40,40,+67,32,40,67,39,32,79,41,41,32,75,41,41,41,41,41,32,40,95,52,+49,50,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,48,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,54,52,55,41,41,32,40,66,32,95,54,55,+53,41,41,41,32,40,95,51,57,53,32,95,54,55,53,41,41,41,41,41,+41,41,32,40,40,66,32,40,95,51,57,52,32,40,85,32,40,90,32,40,+40,40,67,39,32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,40,+66,32,40,95,52,54,51,32,34,36,120,34,41,41,32,40,95,49,53,57,+48,32,95,50,56,51,41,41,41,41,32,75,41,41,41,41,41,32,40,95,+52,49,50,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,48,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,40,40,67,32,40,40,67,32,95,51,57,50,41,32,40,+40,79,32,95,49,50,52,41,32,75,41,41,41,32,95,52,54,49,41,41,+41,32,40,40,66,32,40,95,51,57,53,32,95,53,54,53,41,41,32,40,+40,95,49,55,55,32,95,50,54,52,41,32,40,95,51,57,53,32,95,53,+54,54,41,41,41,41,41,41,41,41,32,40,40,95,49,56,52,32,95,49,+57,56,41,32,35,48,41,41,41,32,73,41,41,32,40,40,66,32,95,56,+57,55,41,32,40,40,66,32,40,95,52,54,51,32,34,36,102,34,41,41,+32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,32,40,+90,32,40,40,66,32,85,41,32,40,90,32,40,90,32,40,40,66,32,90,+41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,+39,32,40,67,39,32,80,41,41,32,95,57,48,53,41,32,40,95,54,55,+56,32,40,95,55,56,49,32,40,40,79,32,35,55,51,41,32,75,41,41,+41,41,41,32,75,41,41,41,41,41,41,41,41,32,40,75,32,40,75,32,+95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,40,40,83,39,32,66,41,32,80,41,32,40,40,66,32,95,+54,50,53,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,32,+75,41,41,41,32,40,75,32,40,75,32,95,52,54,49,41,41,41,41,32,+40,75,32,95,52,54,49,41,41,41,32,40,40,66,32,90,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,67,32,80,+41,41,32,40,40,66,32,40,95,50,54,49,32,95,54,55,56,41,41,32,+95,55,56,50,41,41,41,32,75,41,41,41,41,32,40,75,32,40,75,32,+95,52,54,49,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,90,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,83,39,32,40,83,39,32,95,52,54,50,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,40,66,32,80,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,57,48,53,41,+41,32,95,49,50,53,49,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,95,50,54,49,41,32,95,54,52,54,41,41,32,40,40,+66,32,40,40,83,39,32,95,50,54,49,41,32,95,54,55,55,41,41,32,+40,40,66,32,40,40,67,39,32,95,54,52,55,41,32,95,54,55,53,41,+41,32,40,95,51,57,53,32,95,54,55,53,41,41,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+83,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,40,67,39,32,40,67,39,32,95,52,49,51,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,80,41,+32,95,57,48,54,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,54,55,55,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,54,55,54,+41,32,95,54,55,53,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,50,54,49,41,32,95,54,52,54,41,41,32,95,54,55,53,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,52,54,51,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,95,51,57,52,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,57,48,53,41,41,+41,32,95,49,51,49,56,41,41,32,75,41,41,41,32,40,40,66,32,40,+40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,+50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,95,52,+49,49,41,41,41,41,41,32,73,41,41,41,32,40,95,56,57,55,32,34,+36,102,34,41,41,41,32,40,40,66,32,40,66,32,40,95,51,57,52,32,+40,40,40,67,39,32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,+40,66,32,40,95,52,54,51,32,34,36,120,34,41,41,32,40,95,49,53,+57,48,32,95,50,56,51,41,41,41,41,32,75,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,+95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,41,32,95,52,+49,49,41,41,41,41,41,41,32,40,40,66,32,95,51,57,52,41,32,40,+40,66,32,40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,+32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,40,66,32,90,41,+32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,95,57,48,53,41,+32,75,41,41,41,41,41,41,41,41,41,41,32,40,75,32,40,75,32,40,+75,32,40,75,32,95,52,54,49,41,41,41,41,41,41,32,40,75,32,95,+52,54,49,41,41,41,32,40,40,65,32,58,54,50,51,32,40,40,40,67,+39,32,95,55,57,49,41,32,40,40,40,67,39,32,79,41,32,40,80,32,+95,52,54,49,41,41,32,75,41,41,32,95,52,54,49,41,41,32,40,40,+65,32,58,54,50,52,32,40,40,40,67,39,32,67,41,32,40,40,66,32,+40,80,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,+83,39,32,66,41,32,80,41,32,40,40,66,32,95,54,50,53,41,32,40,+95,56,48,53,32,95,56,48,55,41,41,41,41,32,75,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,95,52,54,50,+41,41,32,40,40,40,67,39,32,66,41,32,80,41,32,95,54,51,55,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,95,51,57,52,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,+40,66,32,40,66,32,40,83,32,80,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,95,54,51,55,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,40,40,66,32,95,55,52,56,41,32,95,55,52,51,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,+67,39,32,66,41,32,80,41,32,40,40,66,32,40,95,50,54,49,32,95,+54,50,51,41,41,32,95,55,52,51,41,41,41,32,75,41,41,41,41,41,+32,75,41,41,32,95,55,57,52,41,41,41,41,32,40,75,32,40,75,32,+95,52,54,49,41,41,41,41,32,40,40,65,32,58,54,50,53,32,40,40,+66,32,40,83,32,40,85,32,95,49,51,48,50,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,40,67,39,32,67,39,41,41,32,40,40,66,32,40,66,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+83,39,32,40,95,51,57,55,32,95,54,55,55,41,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,+40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,83,39,+41,32,95,54,53,53,41,41,32,95,52,54,51,41,41,32,40,95,51,57,+53,32,95,54,55,53,41,41,41,41,32,40,95,51,57,53,32,40,85,32,+40,40,66,32,40,67,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,66,32,40,67,32,80,41,41,32,95,54,50,56,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,48,41,32,95,54,+50,54,41,41,32,40,95,52,48,55,32,95,54,50,55,41,41,41,41,41,+32,40,95,51,57,53,32,95,54,52,48,41,41,41,41,41,41,32,73,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,40,40,66,32,95,52,48,57,41,32,95,52,49,49,41,41,41,32,+40,95,54,52,56,32,34,36,113,34,41,41,41,41,32,40,40,66,32,40,+95,50,54,49,32,95,56,50,53,41,41,32,40,95,55,56,55,32,40,95,+56,57,55,32,75,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+54,50,54,32,40,85,32,40,90,32,40,40,80,32,95,49,50,53,41,32,+40,40,67,32,66,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,+80,41,32,40,40,80,32,95,49,50,52,41,32,40,75,32,40,75,32,95,+49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,54,50,55,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,49,50,48,41,32,95,54,50,55,41,41,+32,95,54,50,55,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,+40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,+49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,54,50,55,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,+50,52,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,40,65,32,58,54,50,56,32,40,85,32,40,40,66,32,40,40,+67,39,32,95,50,54,51,41,32,95,54,51,49,41,41,32,95,54,50,57,+41,41,41,32,40,40,65,32,58,54,50,57,32,40,40,67,32,83,41,32,+40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,40,83,39,32,+40,83,39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,40,67,39,32,67,39,41,32,83,39,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,67,32,66,41,32,95,54,51,55,+41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,83,41,32,40,67,32,95,54,54,56,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,50,54,49,32,95,54,51,55,41,41,41,+41,32,40,40,66,32,67,41,32,40,40,67,39,32,95,54,51,48,41,32,+95,55,52,51,41,41,41,41,41,32,40,40,66,32,95,54,52,57,41,32,+95,55,50,50,41,41,41,41,41,32,40,67,32,95,54,50,57,41,41,41,+41,41,41,32,40,40,65,32,58,54,51,48,32,40,40,66,32,89,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,+40,66,32,40,66,32,40,67,32,40,83,39,32,66,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,67,32,95,55,52,56,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,79,+41,41,41,32,40,40,66,32,40,66,32,40,67,32,80,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,95,55,57,49,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,40,67,32,80,41,41,32,75,41,41,+32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,55,52,51,32,95,57,49,52,41,41,41,32,+95,54,50,51,41,41,32,75,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,80,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,+40,66,32,67,41,32,40,67,32,40,95,57,48,52,32,34,68,97,116,97,+46,66,111,111,108,46,111,116,104,101,114,119,105,115,101,34,41,41,41,41,+41,41,32,67,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,41,32,75,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,83,39,41,41,32,40,40,66,32,+85,41,32,40,90,32,75,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,32,95,55,53,53,41,41,41,41,32,67,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,67,32,95,55,52,57,41,41,41,+41,32,67,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,+115,114,99,47,77,105,99,114,111,72,115,47,68,101,115,117,103,97,114,46,+104,115,34,41,32,35,49,50,52,41,32,35,49,41,41,41,41,41,32,40,+40,65,32,58,54,51,49,32,40,40,83,32,83,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,40,83,39,32,67,41,32,40,40,+66,32,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,89,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,40,+40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,67,32,83,39,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,95,+50,54,49,41,41,32,95,54,51,50,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,67,32,83,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,67,32,66,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,67,39,41,32,67,39,41,41,41,41,32,40,66,+32,40,66,32,40,40,67,39,32,40,67,39,32,95,50,54,49,41,41,32,+95,54,51,51,41,41,41,41,41,41,32,40,90,32,75,41,41,41,41,41,+32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,83,41,32,40,40,67,39,32,95,54,51,52,41,32,40,+40,80,32,40,40,40,110,111,77,97,116,99,104,32,75,41,32,35,48,41,+32,35,48,41,41,32,75,41,41,41,41,41,32,40,40,67,32,67,39,41,+32,40,40,80,32,40,40,40,110,111,77,97,116,99,104,32,75,41,32,35,+48,41,32,35,48,41,41,32,65,41,41,41,41,41,41,41,41,41,32,40,+95,54,52,56,32,34,36,109,34,41,41,41,41,32,40,40,66,32,40,66,+32,40,95,56,55,53,32,40,95,52,57,56,32,95,56,57,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,57,53,+32,40,40,83,32,73,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,32,95,55,50,+49,41,41,41,41,41,41,32,40,40,66,32,40,66,32,95,54,55,51,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,51,57,51,41,+41,41,32,40,40,67,39,32,40,95,52,49,51,32,95,54,50,52,41,41,+32,40,95,54,52,56,32,34,36,112,34,41,41,41,41,41,41,41,41,32,+40,95,51,57,52,32,95,56,50,53,41,41,41,41,41,41,32,40,40,65,+32,58,54,51,50,32,95,54,54,56,41,32,40,40,65,32,58,54,51,51,+32,40,40,40,83,39,32,66,41,32,95,54,51,50,41,32,40,40,66,32,+40,66,32,40,95,54,55,54,32,40,95,54,55,56,32,40,95,55,56,49,+32,40,40,79,32,35,56,57,41,32,75,41,41,41,41,41,41,32,95,54,+55,55,41,41,41,32,40,40,65,32,58,54,51,52,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,83,39,32,95,50,54,49,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,95,54,51,51,41,41,32,40,40,66,32,40,67,32,+95,50,54,49,41,41,32,40,40,66,32,95,54,51,56,41,32,40,85,32,+65,41,41,41,41,41,41,32,85,41,41,32,40,40,66,32,40,66,32,40,+95,50,54,49,32,40,40,95,51,57,55,32,95,50,54,51,41,32,95,50,+54,52,41,41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,40,67,39,32,95,52,49,51,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,67,32,95,54,51,50,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,67,41,32,40,40,66,32,40,67,32,95,54,51,57,41,41,+32,95,52,49,49,41,41,41,32,95,54,55,53,41,41,41,32,40,40,95,+49,56,52,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,50,55,+55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,41,32,73,41,41,+41,41,32,40,85,32,75,41,41,41,41,32,95,52,49,52,41,41,32,40,+40,65,32,58,54,51,53,32,40,40,83,32,40,40,83,32,40,40,40,83,+39,32,95,49,50,49,41,32,40,40,95,52,57,56,32,95,51,48,54,41,+32,40,40,95,51,55,50,32,95,50,55,56,41,32,40,95,49,50,55,32,+95,50,55,57,41,41,41,41,32,40,40,67,32,40,95,52,57,55,32,95,+51,48,54,41,41,32,40,40,95,51,55,50,32,95,50,55,56,41,32,40,+95,49,50,56,32,95,50,55,57,41,41,41,41,41,32,40,40,66,32,40,+95,54,55,54,32,40,95,54,55,53,32,40,95,56,57,55,32,34,68,97,+116,97,46,73,110,116,101,103,101,114,46,95,105,110,116,76,105,115,116,84,+111,73,110,116,101,103,101,114,34,41,41,41,41,32,40,40,66,32,95,55,+48,50,41,32,40,40,66,32,40,95,51,57,53,32,40,40,95,50,54,51,+32,95,54,55,56,41,32,95,55,55,53,41,41,41,32,95,51,53,51,41,+41,41,41,41,32,40,40,66,32,40,95,54,55,54,32,40,95,54,55,53,+32,40,95,56,57,55,32,34,68,97,116,97,46,73,110,116,101,103,101,114,+95,84,121,112,101,46,95,105,110,116,84,111,73,110,116,101,103,101,114,34,+41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,40,40,66,32,95,+55,55,53,41,32,95,51,54,48,41,41,41,41,41,32,40,40,65,32,58,+54,51,54,32,40,40,40,83,39,32,95,54,55,54,41,32,40,40,66,32,+40,95,54,55,54,32,40,95,54,55,53,32,40,95,56,57,55,32,34,68,+97,116,97,46,82,97,116,105,111,95,84,121,112,101,46,95,109,107,82,97,+116,105,111,110,97,108,34,41,41,41,41,32,40,40,66,32,95,54,51,53,+41,32,95,53,50,54,41,41,41,32,40,40,66,32,95,54,51,53,41,32,+95,53,50,55,41,41,41,32,40,40,65,32,58,54,51,55,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,40,67,+32,40,40,67,32,40,40,83,32,40,40,67,32,40,40,83,32,40,40,67,+32,40,40,80,32,95,54,55,53,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,54,55,54,41,32,95,54,51,55,41,41,32,95,54,51,+55,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+32,40,40,66,32,95,54,50,53,41,32,40,95,56,48,53,32,95,56,48,+56,41,41,41,41,32,40,75,32,40,40,83,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,67,39,41,32,75,+41,41,32,95,54,51,53,41,41,32,75,41,41,32,95,54,51,54,41,41,+32,40,40,66,32,95,54,55,56,41,32,40,40,66,32,95,55,55,53,41,+32,95,49,51,55,41,41,41,41,32,75,41,41,32,75,41,41,32,75,41,+41,32,95,54,55,56,41,41,41,41,32,40,40,66,32,95,54,53,50,41,+32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,95,54,51,49,41,32,95,54,51,55,41,41,41,32,40,+40,66,32,40,95,50,54,49,32,40,95,54,55,55,32,40,95,56,57,55,+32,34,36,102,34,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,+40,40,95,51,57,57,32,95,54,55,54,41,32,40,40,95,50,54,49,32,+95,54,55,53,41,32,40,95,56,57,55,32,34,36,102,34,41,41,41,41,+41,32,40,95,51,57,53,32,95,54,51,55,41,41,41,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,80,+32,40,40,66,32,40,95,50,54,49,32,95,55,48,50,41,41,32,40,95,+51,57,53,32,95,54,51,55,41,41,41,41,32,40,40,66,32,40,40,83,+39,32,80,41,32,40,40,66,32,95,54,51,55,41,32,40,40,66,32,95,+55,53,49,41,32,40,40,66,32,95,55,54,54,41,32,40,40,67,32,79,+41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,32,40,+40,66,32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,39,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,67,39,32,40,95,54,57,48,32,40,95,54,55,+53,32,40,95,56,57,55,32,34,68,97,116,97,46,76,105,115,116,46,99,+111,110,99,97,116,77,97,112,34,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,95,54,51,55,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,40,83,39,32,95,55,54,49,41,32,+40,40,40,67,39,32,79,41,32,95,55,52,51,41,32,75,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,55,52,+56,41,32,95,55,52,51,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,80,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+54,50,51,41,41,41,32,40,40,66,32,40,66,32,95,55,53,49,41,41,+32,95,55,54,55,41,41,41,41,32,40,40,79,32,40,40,80,32,40,95,+55,52,51,32,95,57,49,52,41,41,32,40,40,95,50,54,49,32,95,54,+50,51,41,32,40,95,55,53,49,32,40,95,55,54,54,32,95,52,54,49,+41,41,41,41,41,32,75,41,41,41,41,41,41,41,32,95,54,51,55,41,+41,41,32,40,40,66,32,95,54,52,57,41,32,95,56,51,48,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,95,54,51,55,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,+32,40,67,32,95,55,53,53,41,41,41,32,40,40,66,32,40,66,32,95,+55,53,49,41,41,32,95,55,54,55,41,41,41,32,40,95,55,53,49,32,+40,95,55,54,54,32,95,52,54,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,95,54,51,55,41,41,41,32,40,40,66,32,40,+66,32,40,67,32,95,55,52,57,41,41,41,32,40,40,66,32,40,66,32,+95,55,53,49,41,41,32,95,55,54,55,41,41,41,41,41,41,41,32,40,+75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,54,57,48,41,+32,95,54,51,55,41,41,32,95,54,51,55,41,41,32,95,54,51,55,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,+51,48,50,41,41,41,32,40,40,67,32,40,40,40,83,39,32,95,56,48,+50,41,32,95,55,55,50,41,32,40,40,66,32,95,54,55,53,41,32,95,+55,55,50,41,41,41,32,40,40,66,32,40,40,40,83,39,32,40,95,51,+57,55,32,95,54,55,55,41,41,32,40,40,66,32,40,95,50,54,49,32,+95,54,51,56,41,41,32,40,95,51,57,53,32,95,54,55,53,41,41,41,+32,73,41,41,32,40,40,66,32,40,95,51,57,52,32,40,40,40,67,39,+32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,40,66,32,40,95,+52,54,51,32,40,40,79,32,35,49,50,48,41,32,75,41,41,41,32,40,+95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,75,41,41,41,32,+40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+40,65,32,58,54,51,56,32,40,40,95,50,54,51,32,40,95,54,55,55,+32,40,95,56,57,55,32,34,36,102,34,41,41,41,32,40,40,95,51,57,+57,32,95,54,55,54,41,32,40,95,54,55,53,32,40,95,56,57,55,32,+34,36,102,34,41,41,41,41,41,32,40,40,65,32,58,54,51,57,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,95,54,55,54,41,41,32,40,40,40,67,39,32,+40,83,39,32,40,95,51,57,55,32,95,54,55,55,41,41,41,32,40,40,+66,32,40,66,32,95,54,55,53,41,41,32,40,67,32,95,52,53,49,41,+41,41,32,73,41,41,41,41,32,40,40,66,32,40,95,51,57,52,32,40,+40,40,67,39,32,79,41,32,40,40,66,32,95,56,57,55,41,32,40,40,+66,32,40,95,52,54,51,32,40,40,79,32,35,49,50,48,41,32,75,41,+41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,75,+41,41,41,32,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,+41,41,41,41,32,40,40,65,32,58,54,52,48,32,40,40,67,32,40,40,+83,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,40,+67,32,40,40,67,32,40,40,83,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,83,32,73,41,32,75,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,55,52,52,41,32,95,54,52,48,41,41,32,95,+54,52,48,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,+41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,75,41,32,75,41,+41,32,75,41,41,32,75,41,41,32,75,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,83,41,32,40,67,32,40,40,40,67,39,32,+40,95,52,57,55,32,95,50,56,50,41,41,32,95,52,49,49,41,32,35,+50,41,41,41,41,32,40,40,66,32,40,66,32,95,54,52,48,41,41,32,+40,40,66,32,40,66,32,95,55,53,49,41,41,32,40,40,66,32,40,66,+32,95,55,54,54,41,41,32,40,40,66,32,95,51,57,53,41,32,40,40,+40,67,39,32,95,50,54,51,41,32,95,55,52,55,41,32,95,55,55,57,+41,41,41,41,41,41,41,41,32,75,41,41,32,75,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,54,52,48,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,95,51,57,57,32,95,55,52,52,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,54,52,53,41,32,40,95,56,48,53,32,+95,56,48,56,41,41,41,32,95,52,49,49,41,41,32,73,41,41,41,41,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,+32,40,40,66,32,40,95,50,54,49,32,95,54,52,48,41,41,32,40,40,+95,51,57,55,32,40,40,66,32,95,55,52,52,41,32,40,95,55,52,52,+32,95,54,52,51,41,41,41,32,95,54,52,52,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,+50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,95,55,53,55,41,32,95,54,52,+48,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,75,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,40,65,+32,58,54,52,49,32,40,40,95,50,54,49,32,95,56,57,55,41,32,40,+40,95,52,54,51,32,95,49,49,48,54,41,32,34,91,93,34,41,41,41,+32,40,40,65,32,58,54,52,50,32,40,40,95,50,54,49,32,95,56,57,+55,41,32,40,40,95,52,54,51,32,95,49,49,48,54,41,32,40,40,79,+32,35,53,56,41,32,75,41,41,41,41,32,40,40,65,32,58,54,52,51,+32,40,40,95,50,54,49,32,95,55,53,57,41,32,40,40,95,55,54,51,+32,40,40,79,32,40,40,80,32,95,54,52,49,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,41,+32,40,40,79,32,40,40,80,32,95,54,52,50,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,41,+32,75,41,41,41,32,95,54,52,50,41,41,41,32,40,40,65,32,58,54,+52,52,32,40,40,95,50,54,49,32,95,55,53,57,41,32,40,40,95,55,+54,51,32,40,40,79,32,40,40,80,32,95,54,52,49,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,+41,41,32,40,40,79,32,40,40,80,32,95,54,52,50,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,+41,41,32,75,41,41,41,32,95,54,52,49,41,41,41,32,40,40,65,32,+58,54,52,53,32,40,40,66,32,40,40,83,39,32,40,66,32,40,95,50,+54,49,32,95,55,53,57,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,95,55,54,51,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,+41,32,40,67,32,80,41,41,32,75,41,41,32,73,41,41,41,32,95,56,+48,49,41,41,32,40,40,65,32,58,54,52,54,32,40,67,32,40,95,51,+57,55,32,95,54,55,55,41,41,41,32,40,40,65,32,58,54,52,55,32,+40,95,51,57,57,32,95,54,55,54,41,41,32,40,40,65,32,58,54,52,+56,32,40,40,66,32,40,95,52,53,48,32,40,95,50,48,50,32,95,56,+57,50,41,41,41,32,40,40,40,67,39,32,95,51,57,52,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,95,+56,57,55,41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,51,41,+32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,75,41,41,+32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,49,41,41,41,41,+32,40,40,65,32,58,54,52,57,32,40,40,95,50,54,51,32,95,52,50,+56,41,32,40,95,54,52,56,32,34,36,113,34,41,41,41,32,40,40,65,+32,58,54,53,48,32,40,40,95,50,54,51,32,95,49,54,48,55,41,32,+40,95,51,57,53,32,95,54,53,49,41,41,41,32,40,40,65,32,58,54,+53,49,32,40,85,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,95,57,48,50,41,41,32,40,40,66,32,40,95,52,54,+51,32,34,32,61,32,34,41,41,32,40,95,49,53,57,48,32,95,55,49,+56,41,41,41,41,41,32,40,40,65,32,58,54,53,50,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,67,32,40,40,40,67,39,32,+83,39,41,32,40,40,66,32,67,39,41,32,95,54,53,53,41,41,32,40,+40,66,32,40,66,32,95,56,51,48,41,41,32,95,55,52,56,41,41,41,+32,40,40,40,67,39,32,79,41,32,95,54,51,55,41,32,75,41,41,41,+32,40,95,51,57,53,32,40,85,32,40,40,66,32,40,67,32,40,40,40,+83,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,40,67,39,32,+80,41,32,40,40,67,32,79,41,32,75,41,41,41,32,95,54,50,56,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,48,41,+32,95,54,50,54,41,41,32,95,54,50,55,41,41,41,41,32,95,54,52,+48,41,41,41,41,41,32,40,40,65,32,58,54,53,51,32,40,40,66,32,+40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,32,40,+40,66,32,40,66,32,95,54,50,41,41,32,95,52,49,48,41,41,32,40,+40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,95,52,+48,57,41,41,41,41,32,40,40,65,32,58,54,53,52,32,40,40,40,95,+51,50,32,95,53,56,41,32,95,54,51,41,32,40,40,40,83,39,32,40,+95,51,51,32,95,53,56,41,41,32,40,40,66,32,95,54,50,41,32,95,+52,50,57,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,+32,95,52,50,56,41,41,41,41,32,40,40,65,32,58,54,53,53,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,+95,54,48,41,41,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,+40,67,39,32,89,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,40,83,39,32,80,41,41,41,32,40,40,+40,67,39,32,67,39,41,32,40,40,66,32,95,54,53,55,41,32,95,54,+53,56,41,41,32,95,52,50,51,41,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,+66,32,95,54,53,57,41,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,+52,54,50,41,41,41,41,41,32,95,52,54,49,41,41,41,41,32,40,95,+54,52,56,32,34,36,120,34,41,41,41,32,40,40,65,32,58,54,53,54,+32,80,41,32,40,40,65,32,58,54,53,55,32,40,40,66,32,89,41,32,+40,40,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,83,32,95,51,57,50,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,+32,40,67,32,83,39,41,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,67,32,40,40,+80,32,40,40,40,110,111,77,97,116,99,104,32,75,41,32,35,48,41,32,+35,48,41,41,32,40,90,32,40,85,32,40,75,32,75,41,41,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,40,83,39,32,66,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,95,50,54,49,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,54,53,57,41,41,41,32,40,40,67,32,40,67,39,+32,66,41,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,67,39,32,95,50,54,49,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,54,53,57,+41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,67,32,95,54,53,55,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,51,57,53,41,32,40,40,40,67,39,+32,67,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,+85,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,67,32,67,39,41,41,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,66,41,32,80,41,41,41,32,40,40,66,32,+40,67,39,32,95,50,54,51,41,41,32,40,67,32,95,54,54,55,41,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,+115,114,99,47,77,105,99,114,111,72,115,47,68,101,115,117,103,97,114,46,+104,115,34,41,32,35,51,54,49,41,32,35,50,57,41,41,41,41,32,40,+85,32,40,75,32,75,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+83,39,41,32,95,51,57,50,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,67,39,32,40,95,52,51,32,95,53,56,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,+40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,+95,54,53,51,41,32,95,55,55,51,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,83,39,32,40,95,+51,50,32,95,53,56,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,40,67,39,32,67,+39,41,32,95,54,53,55,41,41,32,40,40,67,39,32,95,52,54,51,41,+32,40,95,51,57,53,32,95,54,55,53,41,41,41,41,41,32,40,40,66,+32,95,51,57,53,41,32,40,40,66,32,89,41,32,40,40,66,32,40,66,+32,85,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,+40,66,39,32,40,85,32,95,49,51,48,50,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,+39,32,40,66,39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,80,41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,32,40,+40,66,32,40,67,39,32,95,50,54,51,41,41,32,40,67,32,95,54,54,+55,41,41,41,41,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,67,39,32,40,67,39,32,80,41,41,32,40,40,66,32,95,+52,54,51,41,32,95,54,55,48,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,54,53,54,41,+41,41,41,32,40,40,66,32,95,54,54,57,41,32,40,40,67,32,40,40,+67,32,83,41,32,40,40,66,32,90,41,32,40,40,66,32,85,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,67,32,80,41,32,+75,41,41,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,+75,41,32,35,48,41,32,35,48,41,41,41,41,41,41,32,40,95,54,55,+49,32,40,40,95,50,54,57,32,40,95,50,48,50,32,95,55,55,52,41,+41,32,40,85,32,40,90,32,40,90,32,40,40,80,32,95,49,51,48,50,+41,32,40,90,32,95,54,54,57,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,53,56,41,41,41,41,41,32,40,40,66,32,67,41,32,95,54,54,52,+41,41,41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,+40,85,32,40,90,32,75,41,41,41,41,41,32,95,54,54,54,41,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,65,32,58,+54,53,56,32,40,85,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,95,54,55,54,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,54,55,54,41,32,40,40,66,32,40,95,+54,55,54,32,40,95,54,55,56,32,40,95,55,56,49,32,34,110,111,77,+97,116,99,104,34,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,+95,55,56,48,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,95,+55,55,53,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,95,55,+55,53,41,41,41,41,32,40,40,65,32,58,54,53,57,32,40,40,40,67,+39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,83,+39,32,83,41,32,40,40,66,32,40,83,32,95,54,54,48,41,41,32,40,+40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,53,+52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,+39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,40,67,32,66,41,+32,95,54,55,53,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+67,32,95,54,54,56,41,41,41,41,41,41,32,73,41,41,41,32,40,40,+65,32,58,54,54,48,32,40,40,67,32,40,40,67,32,40,40,80,32,40,+75,32,95,49,50,53,41,41,32,40,75,32,40,75,32,95,49,50,52,41,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,95,49,50,53,41,41,41,32,40,40,65,32,58,54,54,49,32,40,+95,54,55,56,32,40,95,55,56,49,32,34,61,61,34,41,41,41,32,40,+40,65,32,58,54,54,50,32,40,95,54,55,56,32,40,95,55,56,49,32,+34,61,61,34,41,41,41,32,40,40,65,32,58,54,54,51,32,40,95,54,+55,56,32,40,95,55,56,49,32,34,101,113,117,97,108,34,41,41,41,32,+40,40,65,32,58,54,54,52,32,40,40,66,32,89,41,32,40,40,66,32,+40,66,32,40,83,32,83,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,67,32,66,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,67,32,66,41,41,41,41,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,+39,32,40,83,39,32,40,83,39,32,67,41,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,+39,32,67,39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,54,54,53,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,95,51,+57,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,83,39,41,32,40,40,66,32,+83,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,80,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,54,53,54,41,41,32,95,55,54,51,41,41,32,40,85,32,+75,41,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,52,50,56,41,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,+66,32,40,67,39,32,95,52,54,51,41,41,32,40,40,67,39,32,95,51,+57,52,41,32,40,40,66,32,85,41,32,40,40,66,32,40,67,32,66,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,+66,32,40,67,32,67,39,41,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,95,50,48,50,32,95,56,57,+50,41,41,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,67,32,80,41,41,32,75,41,41,41,41,41,32,40,75,+32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,67,+39,32,80,41,32,40,40,40,67,39,32,95,52,52,54,41,32,40,85,32,+65,41,41,32,95,57,49,52,41,41,41,32,75,41,41,41,41,41,32,40,+85,32,75,41,41,41,32,73,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,80,32,95,49,51,48,50,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,80,41,41,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,+67,39,41,41,32,40,40,66,32,67,41,32,40,67,32,95,54,54,56,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,40,+67,39,32,95,54,57,48,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,83,39,32,83,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,83,32,+73,41,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,+40,95,54,57,48,32,95,54,54,49,41,41,32,95,54,55,56,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,51,+48,50,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,95,54,57,48,32,95,54,54,50,41,41,32,+40,40,66,32,95,54,55,56,41,32,40,40,66,32,95,55,55,53,41,32,+95,49,51,55,41,41,41,41,41,32,40,40,66,32,90,41,32,40,40,40,+67,39,32,66,41,32,40,95,54,57,48,32,95,54,54,51,41,41,32,95,+54,55,56,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,41,32,67,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,54,54,53,32,40,40,40,67,39,+32,66,41,32,95,54,52,55,41,32,40,95,51,57,52,32,40,85,32,40,+40,67,32,66,41,32,40,90,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,67,32,95,54,52,54,41,41,32,75,41,41,41,41,41,41,+41,32,40,40,65,32,58,54,54,54,32,40,40,66,32,40,40,83,32,40,+40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,80,41,32,40,85,32,75,41,41,41,32,40,85,32,+75,41,41,41,32,40,85,32,65,41,41,41,32,40,40,66,32,40,40,89,+32,40,40,66,32,40,40,83,39,32,83,41,32,40,40,66,32,85,41,32,+40,40,40,67,39,32,80,41,32,95,52,50,51,41,32,95,52,54,49,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,32,66,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,85,32,95,49,51,48,50,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,49,50,50,41,32,+95,55,57,50,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,80,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,66,41,32,40,67,32,95,52,54,50,41,41,41,32,40,40,+66,32,40,66,32,80,41,41,32,40,40,66,32,40,66,32,95,52,50,51,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,41,32,40,40,+66,32,80,41,32,95,52,50,51,41,41,41,41,41,41,41,41,32,95,52,+54,49,41,41,32,40,85,32,65,41,41,41,41,32,40,95,52,50,54,32,+40,85,32,40,90,32,40,90,32,40,40,80,32,95,49,51,48,50,41,32,+40,90,32,40,40,66,32,95,49,50,50,41,32,95,55,57,50,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,54,54,55,32,40,40,67,32,+40,40,40,83,39,32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,+67,32,40,95,50,48,50,32,95,56,57,50,41,41,32,95,57,49,52,41,+41,41,32,95,55,50,48,41,41,32,73,41,41,32,40,40,65,32,58,54,+54,56,32,40,40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,66,+32,83,39,41,32,40,40,67,32,40,95,50,48,50,32,95,56,57,50,41,+41,32,95,57,49,52,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,+40,66,32,40,67,32,83,39,41,41,41,32,40,40,66,32,40,67,39,32,+67,41,41,32,40,40,66,32,67,41,32,40,95,50,48,50,32,95,56,57,+50,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+83,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,+32,95,51,57,54,41,32,40,67,32,40,95,50,48,50,32,95,56,57,50,+41,41,41,41,32,95,55,50,49,41,41,32,73,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,+39,32,80,41,41,41,32,95,55,50,48,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+67,39,32,95,54,55,54,41,41,32,95,54,55,55,41,41,41,41,41,41,+41,41,41,32,73,41,41,32,40,40,65,32,58,54,54,57,32,40,40,83,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,+32,40,40,80,32,40,75,32,95,50,53,41,41,32,40,90,32,95,54,54,+57,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,95,55,54,+53,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,+41,41,41,32,40,90,32,75,41,41,41,32,40,75,32,95,54,54,57,41,+41,41,32,75,41,41,32,73,41,41,32,40,90,32,75,41,41,41,32,40,+95,49,51,48,51,32,40,40,80,32,95,56,51,55,41,32,95,56,48,56,+41,41,41,41,32,40,40,65,32,58,54,55,48,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+80,32,40,75,32,95,49,51,48,50,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,52,54,51,41,32,95,54,55,48,41,41,32,40,+40,67,32,79,41,32,75,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,40,75,32,95,52,54,49,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,+75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,95,52,54,49,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,40,65,32,58,54,55,49,32,40,+40,66,32,89,41,32,40,40,66,32,40,66,32,40,80,32,95,52,54,49,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,+32,67,41,41,32,40,66,32,95,52,53,50,41,41,41,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,52,54,50,+41,41,32,95,52,54,50,41,41,41,41,41,41,32,40,40,65,32,58,54,+55,50,32,40,40,66,32,40,95,50,54,51,32,40,95,51,57,54,32,40,+40,95,50,54,51,32,40,40,67,32,40,95,52,57,57,32,95,50,56,50,+41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,+57,32,35,49,41,41,41,41,32,95,52,49,49,41,41,41,41,32,95,54,+55,49,41,41,32,40,40,65,32,58,54,55,51,32,40,40,67,32,40,40,+40,67,39,32,66,41,32,40,40,40,83,39,32,40,95,54,55,50,32,40,+95,50,48,50,32,95,56,57,50,41,41,41,32,40,40,66,32,40,95,50,+54,49,32,40,95,51,57,54,32,40,40,67,32,40,95,50,48,51,32,95,+56,57,50,41,41,32,95,57,49,52,41,41,41,41,32,40,95,51,57,53,+32,95,53,54,53,41,41,41,32,73,41,41,32,40,40,66,32,90,41,32,+40,40,83,32,80,41,32,40,40,40,67,39,32,66,41,32,80,41,32,40,+90,32,40,90,32,40,40,40,83,39,32,95,50,54,49,41,32,40,40,66,+32,95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,100,117,112,108,105,99,97,116,+101,32,100,101,102,105,110,105,116,105,111,110,32,34,41,41,32,95,57,48,+50,41,41,41,41,41,41,41,41,41,32,40,95,50,52,32,34,99,104,101,+99,107,68,117,112,34,41,41,41,32,40,40,65,32,58,54,55,52,32,40,+40,83,32,73,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,83,+39,32,80,41,32,75,41,32,40,90,32,75,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,40,40,40,83,+39,32,80,41,32,75,41,32,40,90,32,75,41,41,41,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,83,39,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,95,53,57,41,41,41,41,+32,40,40,66,32,40,66,32,40,67,39,32,89,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,67,+32,40,40,83,32,73,41,32,40,90,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,39,+32,83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,83,39,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,+39,32,83,39,41,32,67,39,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,67,39,41,41,+32,40,40,66,32,40,66,32,95,49,50,49,41,41,32,40,67,32,40,95,+50,48,50,32,95,56,57,50,41,41,41,41,41,32,40,67,32,40,95,50,+48,50,32,95,56,57,50,41,41,41,41,41,41,32,40,40,66,32,40,40,+95,51,51,32,95,53,56,41,32,40,95,54,50,32,95,49,50,53,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+95,49,52,32,95,53,55,41,41,41,32,40,66,32,40,40,95,50,55,54,+32,95,53,54,41,32,95,54,55,54,41,41,41,41,32,73,41,41,41,41,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,+53,54,41,41,32,95,54,55,55,41,41,41,41,32,40,90,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,32,95,49,50,52,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,+39,32,40,66,39,32,40,66,39,32,80,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,+66,39,32,80,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,95,50,54,49,41,+32,95,54,55,55,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+67,39,41,32,95,54,51,51,41,41,32,95,54,55,55,41,41,41,41,41,+41,32,95,54,55,53,41,41,32,40,40,67,32,95,57,48,55,41,32,40,+40,79,32,35,54,52,41,32,75,41,41,41,41,41,32,75,41,41,41,32,+75,41,41,41,32,40,40,65,32,58,54,55,53,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,+32,40,40,65,32,58,54,55,54,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,+41,41,41,41,32,40,40,65,32,58,54,55,55,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,80,+41,41,41,41,32,40,40,65,32,58,54,55,56,32,40,90,32,40,90,32,+40,90,32,85,41,41,41,41,32,40,40,65,32,58,54,55,57,32,40,40,+95,50,48,49,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,+32,67,39,41,32,40,95,50,48,50,32,95,56,57,50,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,+95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,32,40,+40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,85,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+95,49,50,49,41,41,32,40,95,50,48,50,32,95,54,55,57,41,41,41,+41,32,40,95,50,48,50,32,95,54,55,57,41,41,41,41,32,40,75,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,+41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,+66,32,67,39,41,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,95,49,50,49,41,41,32,40,95,50,48,50,32,95,56,57,+50,41,41,41,41,32,40,95,50,48,50,32,95,54,55,57,41,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,95,50,48,50,32,95,55,56,51,+41,41,41,41,32,40,95,50,48,53,32,95,54,55,57,41,41,41,32,40,+40,65,32,58,54,56,48,32,75,41,32,40,40,65,32,58,54,56,49,32,+79,41,32,40,40,65,32,58,54,56,50,32,40,40,67,32,40,40,67,32,+40,40,80,32,40,75,32,95,54,56,48,41,41,32,95,54,56,49,41,41,+32,40,75,32,40,75,32,95,54,56,48,41,41,41,41,32,40,75,32,95,+54,56,48,41,41,41,32,40,40,65,32,58,54,56,51,32,40,40,66,32,+40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,41,32,40,40,40,67,39,32,67,41,+32,40,40,66,32,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,95,50,48,50,32,+95,49,51,51,41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,+40,40,65,32,58,54,56,52,32,40,95,54,56,51,32,40,40,79,32,35,+55,53,41,32,75,41,41,41,32,40,40,65,32,58,54,56,53,32,40,95,+54,56,51,32,40,40,79,32,35,55,51,41,32,75,41,41,41,32,40,40,+65,32,58,54,56,54,32,40,95,54,56,51,32,40,40,79,32,35,54,54,+41,32,75,41,41,41,32,40,40,65,32,58,54,56,55,32,40,95,54,56,+51,32,40,40,79,32,35,54,55,41,32,75,41,41,41,32,40,40,65,32,+58,54,56,56,32,40,95,54,56,51,32,40,40,79,32,35,56,57,41,32,+75,41,41,41,32,40,40,65,32,58,54,56,57,32,40,95,54,56,51,32,+40,40,79,32,35,56,48,41,32,75,41,41,41,32,40,40,65,32,58,54,+57,48,32,40,40,66,32,40,66,32,95,54,55,54,41,41,32,95,54,55,+54,41,41,32,40,40,65,32,58,54,57,49,32,40,40,66,32,40,66,32,+40,66,32,95,54,55,54,41,41,41,32,95,54,57,48,41,41,32,40,40,+65,32,58,54,57,50,32,40,95,54,55,56,32,40,95,55,56,49,32,40,+40,79,32,35,55,57,41,32,75,41,41,41,41,32,40,40,65,32,58,54,+57,51,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,+55,53,41,32,75,41,41,41,41,32,40,40,65,32,58,54,57,52,32,40,+95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,54,55,41,32,+75,41,41,41,41,32,40,40,65,32,58,54,57,53,32,40,95,54,55,56,+32,40,95,55,56,49,32,40,40,79,32,35,55,51,41,32,75,41,41,41,+41,32,40,40,65,32,58,54,57,54,32,40,95,54,55,56,32,40,95,55,+56,49,32,40,40,79,32,35,55,53,41,32,75,41,41,41,41,32,40,40,+65,32,58,54,57,55,32,40,95,54,55,56,32,40,95,55,56,49,32,40,+40,79,32,35,56,51,41,32,75,41,41,41,41,32,40,40,65,32,58,54,+57,56,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,+56,48,41,32,75,41,41,41,41,32,40,40,65,32,58,54,57,57,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,32,40,40,66,32,40,66,32,40,95,50,54,51,+32,40,95,52,54,51,32,40,40,79,32,35,52,48,41,32,75,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,51,+41,32,95,54,57,57,41,41,32,40,40,66,32,40,95,50,54,51,32,40,+95,52,54,51,32,40,40,79,32,35,51,50,41,32,75,41,41,41,41,32,+40,40,40,67,39,32,95,50,54,51,41,32,95,54,57,57,41,32,40,95,+52,54,51,32,40,40,79,32,35,52,49,41,32,75,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,51,+41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,32,40,95,52,54,+51,32,34,40,92,57,50,38,34,41,41,32,40,40,40,67,39,32,95,52,+54,51,41,32,95,57,48,50,41,32,40,40,79,32,35,51,50,41,32,75,+41,41,41,41,41,41,32,40,40,40,67,39,32,95,50,54,51,41,32,95,+54,57,57,41,32,40,95,52,54,51,32,40,40,79,32,35,52,49,41,32,+75,41,41,41,41,41,41,32,40,40,83,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,83,41,32,40,40,67,32,40,40,67,32,67,39,41,32,75,41,+41,32,40,75,32,95,50,53,41,41,41,32,75,41,41,32,40,75,32,95,+50,53,41,41,41,32,75,41,41,32,40,40,83,32,40,40,83,32,40,40,+40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,52,49,+49,41,32,35,49,41,41,32,40,40,66,32,95,54,57,57,41,32,95,55,+48,49,41,41,41,32,40,40,66,32,95,52,54,51,41,32,95,55,48,48,+41,41,41,41,32,75,41,41,32,75,41,41,32,40,40,66,32,95,52,54,+51,41,32,95,56,54,50,41,41,41,41,32,40,40,65,32,58,55,48,48,+32,40,40,66,32,40,95,52,54,50,32,35,51,52,41,41,32,40,40,40,+67,39,32,95,52,54,51,41,32,40,95,51,57,52,32,40,40,83,32,40,+40,83,32,40,40,40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,+95,50,48,50,32,95,49,51,49,41,41,32,35,51,52,41,41,32,40,40,+40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,95,50,48,50,32,+95,49,51,49,41,41,32,35,57,50,41,41,32,40,40,40,83,39,32,95,+49,50,48,41,32,40,40,67,32,40,95,52,57,55,32,95,49,51,50,41,+41,32,35,51,50,41,41,32,40,40,67,32,40,95,52,57,57,32,95,49,+51,50,41,41,32,35,49,50,54,41,41,41,41,41,32,40,40,67,32,79,+41,32,75,41,41,41,32,40,40,66,32,40,95,52,54,50,32,35,57,50,+41,41,32,40,40,40,67,39,32,95,52,54,51,41,32,40,40,66,32,40,+95,49,53,57,48,32,95,50,56,51,41,41,32,95,49,51,55,41,41,32,+40,40,79,32,35,51,56,41,32,75,41,41,41,41,41,41,32,40,40,79,+32,35,51,52,41,32,75,41,41,41,41,32,40,40,65,32,58,55,48,49,+32,40,40,95,50,54,51,32,95,55,48,50,41,32,40,95,51,57,53,32,+40,40,95,50,54,51,32,95,54,55,56,41,32,40,40,95,50,54,51,32,+95,55,55,53,41,32,95,49,51,55,41,41,41,41,41,32,40,40,65,32,+58,55,48,50,32,40,40,95,51,57,55,32,40,95,54,57,48,32,95,54,+57,50,41,41,32,95,54,57,51,41,41,32,40,40,65,32,58,55,48,51,+32,40,40,95,50,54,51,32,95,55,49,55,41,32,95,55,48,52,41,41,+32,40,40,65,32,58,55,48,52,32,40,40,83,32,40,40,67,32,40,40,+67,32,40,40,83,32,73,41,32,75,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,54,55,54,41,32,95,55,48,52,41,41,32,95,+55,48,52,41,41,41,32,95,55,48,53,41,41,32,75,41,41,32,40,40,+65,32,58,55,48,53,32,40,40,66,32,89,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,95,50,48,+50,32,95,56,57,50,41,41,32,40,40,66,32,95,55,48,54,41,32,95,+54,55,53,41,41,41,32,95,54,57,53,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,66,32,95,55,48,55,41,41,32,73,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,50,54,+49,41,41,32,95,55,48,53,41,41,41,32,40,90,32,95,55,48,54,41,+41,41,41,32,40,40,65,32,58,55,48,54,32,40,95,54,55,54,32,95,+54,57,54,41,41,32,40,40,65,32,58,55,48,55,32,40,40,67,32,40,+40,40,83,39,32,67,39,41,32,95,54,56,52,41,32,40,40,83,32,40,+40,40,67,39,32,83,39,41,32,40,40,66,32,83,41,32,95,54,56,50,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,67,32,95,54,56,52,41,41,41,32,40,40,83,32,40,40,40,83,39,+32,83,39,41,32,95,54,56,50,41,32,40,40,67,32,40,40,40,83,39,+32,83,39,41,32,95,54,56,53,41,32,40,67,32,95,55,49,50,41,41,+41,32,73,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,+32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,32,95,54,56,52,+41,41,41,32,40,67,32,95,55,49,50,41,41,41,32,40,40,66,32,40,+66,32,95,55,48,54,41,41,32,95,54,55,54,41,41,41,41,41,41,32,+95,55,48,56,41,41,41,32,95,54,57,53,41,41,32,40,40,65,32,58,+55,48,56,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,83,32,+95,54,56,50,41,41,32,95,55,48,57,41,41,32,40,40,40,83,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,67,32,95,54,56,52,41,41,41,32,95,55,48,57,41,41,32,95,55,+49,48,41,41,41,32,40,40,65,32,58,55,48,57,32,40,40,83,32,40,+40,40,67,39,32,83,39,41,32,40,40,66,32,83,41,32,95,54,56,50,+41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,67,32,95,54,56,50,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,67,32,95,54,+56,54,41,41,41,41,32,40,40,67,39,32,67,41,32,40,67,32,95,55,+49,53,41,41,41,41,41,41,32,40,95,54,57,48,32,95,54,57,55,41,+41,41,32,40,40,65,32,58,55,49,48,32,40,40,83,32,40,40,40,67,+39,32,83,39,41,32,40,40,66,32,83,41,32,95,54,56,50,41,41,32,+40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,+95,54,56,50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,+39,32,83,39,41,32,95,54,56,54,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,+67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,49,50,49,+41,32,95,54,56,55,41,41,32,95,54,56,53,41,41,41,41,41,32,40,+67,32,40,95,54,57,48,32,95,54,57,56,41,41,41,41,41,32,40,40,+67,39,32,67,41,32,40,67,32,95,55,49,54,41,41,41,41,41,41,32,+95,55,49,49,41,41,32,40,40,65,32,58,55,49,49,32,40,95,54,57,+48,32,95,54,57,52,41,41,32,40,40,65,32,58,55,49,50,32,40,40,+83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,83,41,32,95,+54,56,50,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,32,40,40,66,32,67,41,32,40,40,66,32,40,40,67,39,+32,67,39,41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,54,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,49,50,49,41,32,95,54,+56,52,41,41,32,95,54,56,57,41,41,41,41,32,40,95,54,55,56,32,+40,95,55,56,49,32,40,40,79,32,35,55,57,41,32,75,41,41,41,41,+41,41,32,95,55,49,51,41,41,32,40,40,65,32,58,55,49,51,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,40,67,39,32,83,41,32,+95,54,56,50,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,95,54,56,+50,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,+41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,55,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,49,41,32,95,+54,56,55,41,41,32,95,54,56,53,41,41,41,32,95,54,57,56,41,41,+41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+95,49,50,49,41,32,95,54,56,56,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,54,41,41,32,+95,54,56,52,41,41,41,41,41,41,32,95,55,49,52,41,41,32,40,40,+65,32,58,55,49,52,32,40,40,67,32,40,40,40,83,39,32,83,39,41,+32,95,54,56,53,41,32,40,95,54,57,48,32,40,95,54,55,56,32,40,+95,55,56,49,32,40,40,79,32,35,54,54,41,32,75,41,41,41,41,41,+41,32,73,41,41,32,40,40,65,32,58,55,49,53,32,40,95,54,57,49,+32,40,95,54,55,56,32,40,95,55,56,49,32,34,83,39,34,41,41,41,+41,32,40,40,65,32,58,55,49,54,32,40,95,54,57,49,32,40,95,54,+55,56,32,40,95,55,56,49,32,34,67,39,34,41,41,41,41,32,40,40,+65,32,58,55,49,55,32,40,40,67,32,40,40,83,32,95,54,56,50,41,+32,73,41,41,32,40,40,66,32,40,40,67,39,32,40,67,32,40,40,40,+67,39,32,67,41,32,40,40,83,32,40,40,40,67,39,32,83,39,41,32,+40,40,66,32,95,49,50,49,41,32,95,54,56,52,41,41,32,95,54,56,+53,41,41,32,40,40,40,67,39,32,67,41,32,40,40,83,32,40,40,40,+67,39,32,83,39,41,32,40,40,66,32,95,49,50,49,41,32,95,54,56,+54,41,41,32,95,54,56,52,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,95,49,+50,49,41,32,95,54,56,55,41,41,32,95,54,56,53,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,83,32,40,40,40,67,39,32,83,39,41,+32,40,40,66,32,95,49,50,49,41,32,95,54,56,54,41,41,32,95,54,+56,54,41,41,32,40,40,40,67,39,32,67,41,32,40,40,83,32,40,40,+40,67,39,32,83,39,41,32,40,40,66,32,95,49,50,49,41,32,95,54,+56,55,41,41,32,95,54,56,55,41,41,32,40,40,40,83,39,32,83,41,+32,40,40,66,32,40,83,32,95,54,56,50,41,41,32,95,54,55,54,41,+41,32,40,40,40,83,39,32,66,41,32,40,40,40,67,39,32,67,39,41,+32,40,40,66,32,95,49,50,49,41,32,95,54,56,56,41,41,32,95,54,+56,52,41,41,32,95,54,55,54,41,41,41,41,32,40,95,54,55,56,32,+40,95,55,56,49,32,40,40,79,32,35,56,50,41,32,75,41,41,41,41,+41,41,32,40,95,54,55,56,32,40,95,55,56,49,32,34,66,39,34,41,+41,41,41,41,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,+32,35,56,53,41,32,75,41,41,41,41,41,41,32,40,95,54,55,56,32,+40,95,55,56,49,32,40,40,79,32,35,57,48,41,32,75,41,41,41,41,+41,41,32,40,95,54,55,56,32,40,95,55,56,49,32,40,40,79,32,35,+54,53,41,32,75,41,41,41,41,41,41,32,95,55,49,55,41,41,32,95,+55,49,55,41,41,41,32,40,40,65,32,58,55,49,56,32,40,40,40,95,+49,53,56,56,32,40,95,49,53,57,50,32,95,55,49,56,41,41,32,40,+40,95,50,54,51,32,95,49,53,56,48,41,32,95,55,49,57,41,41,32,+40,95,49,53,57,52,32,95,55,49,56,41,41,41,32,40,40,65,32,58,+55,49,57,32,40,40,67,32,40,40,67,32,40,40,80,32,95,57,48,51,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,95,55,49,57,41,41,32,95,55,49,57,41,41,41,41,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,+41,32,40,40,40,67,39,32,95,49,53,54,53,41,32,40,40,66,32,40,+95,49,53,54,53,32,40,95,49,53,51,53,32,40,40,79,32,35,57,50,+41,32,75,41,41,41,41,32,95,57,48,51,41,41,32,40,95,49,53,51,+53,32,40,40,79,32,35,52,54,41,32,75,41,41,41,41,41,32,95,55,+49,57,41,41,41,41,32,40,40,66,32,95,49,53,51,53,41,32,95,56,+54,50,41,41,41,32,40,40,65,32,58,55,50,48,32,40,40,66,32,89,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,67,41,41,+32,40,40,66,32,40,66,32,40,83,32,73,41,41,41,32,40,40,66,32,+40,67,39,32,67,41,41,32,40,40,66,32,67,41,32,40,67,32,40,95,+50,48,50,32,95,56,57,50,41,41,41,41,41,41,41,32,40,40,40,83,+39,32,40,83,39,32,40,67,39,32,66,41,41,41,32,40,66,32,40,66,+32,95,54,55,54,41,41,41,32,73,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,83,39,32,67,39,41,41,32,40,95,50,48,50,+32,95,56,57,50,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,83,39,41,+41,32,40,40,66,32,40,67,32,40,95,52,51,50,32,95,56,57,50,41,+41,41,32,95,55,50,49,41,41,41,32,40,66,32,40,40,67,39,32,66,+41,32,95,54,55,55,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,40,83,39,32,40,83,32,95,54,55,55,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+66,39,41,32,66,39,41,41,32,40,40,40,67,39,32,67,39,41,32,95,+55,50,48,41,32,95,54,55,53,41,41,41,32,40,40,66,32,40,66,32,+95,52,50,56,41,41,32,40,40,40,67,39,32,40,67,39,32,95,51,57,+52,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,83,41,32,40,40,40,67,39,32,+40,67,39,32,95,49,50,50,41,41,32,40,40,66,32,40,67,32,40,95,+52,51,50,32,95,56,57,50,41,41,41,32,95,55,50,50,41,41,32,75,+41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,+67,39,32,95,49,50,50,41,41,32,40,40,66,32,40,67,32,40,95,52,+51,50,32,95,56,57,50,41,41,41,32,95,55,50,50,41,41,32,75,41,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,66,32,95,+56,57,55,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,+57,55,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,51,+41,41,41,41,41,32,40,40,95,49,56,52,32,95,49,57,56,41,32,35,+48,41,41,41,41,41,41,41,41,41,32,75,41,41,41,32,40,40,65,32,+58,55,50,49,32,40,40,67,32,40,40,67,32,40,40,80,32,40,40,67,+32,79,41,32,75,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,52,54,51,41,32,95,55,50,49,41,41,32,95,55,50,49,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,95,52,52,51,32,40,95,50,+48,50,32,95,56,57,50,41,41,41,32,95,55,50,49,41,41,41,32,40,+75,32,95,52,54,49,41,41,41,32,40,40,65,32,58,55,50,50,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,40,67,32,79,41,32,75,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,55,50,50,41,41,32,95,55,50,50,41,41,41,32,40,40,40,67,+39,32,66,41,32,95,52,54,50,41,32,95,55,50,50,41,41,41,32,40,+75,32,95,52,54,49,41,41,41,32,40,40,65,32,58,55,50,51,32,40,+40,66,32,40,66,32,67,41,41,32,80,41,41,32,40,40,65,32,58,55,+50,52,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,85,41,41,41,41,32,40,40,65,32,58,55,50,53,32,40,+90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,+41,32,40,40,65,32,58,55,50,54,32,40,90,32,40,90,32,40,40,66,+32,90,41,32,85,41,41,41,41,32,40,40,65,32,58,55,50,55,32,40,+90,32,40,90,32,40,90,32,85,41,41,41,41,32,40,40,65,32,58,55,+50,56,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,50,57,32,40,40,66,32,90,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+51,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,51,49,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,51,50,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+51,51,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,51,52,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,51,53,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,51,54,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,51,55,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,55,51,56,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,85,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+51,57,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,32,40,40,65,32,58,55,+52,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,+41,32,40,40,65,32,58,55,52,49,32,40,90,32,40,40,66,32,90,41,+32,85,41,41,41,32,40,40,65,32,58,55,52,50,32,40,90,32,40,90,+32,85,41,41,41,32,40,40,65,32,58,55,52,51,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+52,52,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,52,53,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+52,54,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,52,55,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,52,56,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,52,57,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,53,48,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,55,53,49,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,50,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,51,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,53,52,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,55,53,53,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,53,54,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,55,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,+53,56,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,55,53,57,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,54,48,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,79,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,55,54,49,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,95,55,52,54,41,41,41,32,95,55,54,50,+41,41,32,40,40,65,32,58,55,54,50,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,40,40,40,67,39,32,66,41,32,95,55,57,48,41,+32,40,40,40,67,39,32,95,55,57,49,41,32,40,40,40,67,39,32,79,+41,32,40,80,32,95,52,54,49,41,41,32,75,41,41,32,95,52,54,49,+41,41,41,32,75,41,41,32,40,40,65,32,58,55,54,51,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,+41,41,41,32,40,40,65,32,58,55,54,52,32,40,90,32,40,40,66,32,+90,41,32,85,41,41,41,32,40,40,65,32,58,55,54,53,32,40,40,66,+32,90,41,32,79,41,41,32,40,40,65,32,58,55,54,54,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,41,32,+40,40,65,32,58,55,54,55,32,40,40,66,32,90,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+80,41,41,41,41,41,41,32,40,40,65,32,58,55,54,56,32,40,90,32,+40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,85,41,41,41,41,41,41,32,40,40,65,32,58,55,54,57,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,80,41,41,41,41,41,41,32,40,40,65,32,58,55,55,48,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,+80,41,41,41,41,41,41,32,40,40,65,32,58,55,55,49,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,55,55,50,+32,40,40,67,32,40,40,80,32,65,41,32,73,41,41,32,40,75,32,40,+75,32,40,95,50,52,32,34,99,111,110,73,100,101,110,116,34,41,41,41,+41,41,32,40,40,65,32,58,55,55,51,32,40,40,67,32,40,40,80,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,52,55,49,32,40,+95,50,52,32,34,99,111,110,65,114,105,116,121,34,41,41,41,41,41,32,+40,67,32,40,95,52,51,54,32,95,56,57,50,41,41,41,41,32,40,75,+32,35,49,41,41,41,32,40,75,32,40,75,32,35,48,41,41,41,41,32,+40,40,65,32,58,55,55,52,32,40,40,95,50,48,49,32,40,40,40,67,+39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,90,32,+40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,32,67,39,41,+32,40,90,32,40,95,50,48,50,32,95,56,57,50,41,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,+41,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,40,85,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+95,50,48,50,32,95,56,57,50,41,41,41,32,40,75,32,40,75,32,95,+49,50,52,41,41,41,41,41,32,40,90,32,40,40,40,67,39,32,66,41,+32,40,40,80,32,40,75,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,90,32,40,95,50,48,50,32,95,+55,56,51,41,41,41,41,41,41,32,40,95,50,48,53,32,95,55,55,52,+41,41,41,32,40,40,65,32,58,55,55,53,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,55,54,+32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,55,55,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,55,56,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,55,57,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,41,41,41,+41,41,41,32,40,40,65,32,58,55,56,48,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,+41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,58,55,56,49,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+40,66,32,90,41,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,56,50,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,85,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,55,56,51,32,40,40,95,50,48,49,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,32,+67,39,41,32,40,95,50,48,50,32,95,50,56,49,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,85,32,40,75,+32,95,49,50,52,41,41,41,32,40,95,50,48,50,32,95,51,48,53,41,+41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,+49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,+40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,95,50,48,50,32,95,49,53,51,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,+41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,67,32,+40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,95,50,48,+50,32,40,95,53,49,55,32,95,51,48,53,41,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,67,32,40,40,+67,32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,+49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,95,50,48,50,32,95,49,51,49,41,+41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,+67,39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,+49,50,52,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,95,50,48,50,32,95,49,51,51,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,+50,52,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,+32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,50,52,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,+50,52,41,41,41,32,40,95,50,48,50,32,95,49,51,51,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,95,49,50,52,41,41,32,40,75,32,95,49,+50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,+75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,95,50,48,50,32,95,49,51,51,41,41,41,41,32,40,95,50,48,+53,32,95,55,56,51,41,41,41,32,40,40,65,32,58,55,56,52,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,32,40,40,65,32,58,55,56,53,32,40,90,32,40,40,+66,32,90,41,32,85,41,41,41,32,40,40,65,32,58,55,56,54,32,40,+90,32,40,90,32,85,41,41,41,32,40,40,65,32,58,55,56,55,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,80,41,41,41,32,40,40,65,32,58,55,56,56,32,40,40,66,32,90,+41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,32,40,40,+65,32,58,55,56,57,32,40,40,66,32,90,41,32,79,41,41,32,40,40,+65,32,58,55,57,48,32,80,41,32,40,40,65,32,58,55,57,49,32,80,+41,32,40,40,65,32,58,55,57,50,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,+40,66,32,95,49,50,50,41,32,95,57,49,48,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,+95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,40,65,32,58,+55,57,51,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,80,32,95,57,49,48,41,32,40,90,+32,95,55,57,51,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,+41,41,41,32,40,75,32,95,49,50,53,41,41,41,32,40,75,32,40,75,+32,95,49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,+41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,32,+40,75,32,95,49,50,53,41,41,41,32,40,75,32,95,49,50,53,41,41,+41,32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,40,75,32,95,49,+50,53,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,50,53,+41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,53,41,41,41,41,32,40,75,32,95,+49,50,53,41,41,41,32,40,75,32,95,49,50,53,41,41,41,32,40,75,+32,40,75,32,95,49,50,53,41,41,41,41,32,40,40,65,32,58,55,57,+52,32,40,40,95,50,54,51,32,40,95,51,57,54,32,40,40,40,83,39,+32,95,49,50,49,41,32,40,40,66,32,95,49,50,50,41,32,95,57,49,+48,41,41,32,40,40,66,32,95,49,50,50,41,32,95,57,49,53,41,41,+41,41,32,95,56,51,48,41,41,32,40,40,65,32,58,55,57,53,32,40,+40,66,32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,+32,67,41,41,32,80,41,41,41,32,40,40,65,32,58,55,57,54,32,80,+41,32,40,40,65,32,58,55,57,55,32,40,40,40,95,49,53,56,56,32,+40,95,49,53,57,50,32,95,55,57,55,41,41,32,40,85,32,40,40,66,+32,40,66,32,40,95,52,54,51,32,40,40,79,32,35,52,48,41,32,75,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,+54,51,41,32,40,95,49,53,57,48,32,95,56,57,52,41,41,41,32,40,+40,66,32,40,95,52,54,51,32,34,58,58,34,41,41,32,40,40,40,67,+39,32,95,52,54,51,41,32,40,95,49,53,57,48,32,95,56,51,55,41,+41,32,40,40,79,32,35,52,49,41,32,75,41,41,41,41,41,41,41,32,+40,95,49,53,57,52,32,95,55,57,55,41,41,41,32,40,40,65,32,58,+55,57,56,32,40,85,32,75,41,41,32,40,40,65,32,58,55,57,57,32,+40,95,55,52,51,32,40,40,95,56,57,49,32,95,56,57,53,41,32,34,+80,114,105,109,105,116,105,118,101,115,46,84,121,112,101,34,41,41,41,32,+40,40,65,32,58,56,48,48,32,40,95,55,52,51,32,40,40,95,56,57,+49,32,95,56,57,53,41,32,34,80,114,105,109,105,116,105,118,101,115,46,+67,111,110,115,116,114,97,105,110,116,34,41,41,41,32,40,40,65,32,58,+56,48,49,32,40,40,40,67,39,32,66,41,32,95,56,57,56,41,32,40,+40,40,67,39,32,95,52,52,54,41,32,40,40,67,32,40,95,52,56,48,+32,95,50,55,55,41,41,32,35,49,41,41,32,35,52,52,41,41,41,32,+40,40,65,32,58,56,48,50,32,40,40,67,32,40,40,67,32,95,57,48,+48,41,32,95,52,55,54,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,67,32,40,40,67,32,61,61,41,32,35,52,52,41,41,32,95,52,55,+54,41,41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,67,39,32,+40,95,52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,32,35,+50,41,41,41,41,41,32,40,40,65,32,58,56,48,51,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,95,+55,54,49,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,55,53,48,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,95,51,57,52,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,79,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,+54,49,32,95,55,52,51,41,41,41,41,32,40,40,66,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,67,32,40,95,50,48,50,32,95,50,56,+49,41,41,41,32,95,57,49,52,41,41,41,41,32,75,41,41,41,32,40,+40,66,32,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,+49,41,41,41,41,41,32,75,41,41,32,95,55,52,51,41,41,32,40,95,+56,57,55,32,34,36,120,34,41,41,41,32,40,40,65,32,58,56,48,52,+32,85,41,32,40,40,65,32,58,56,48,53,32,40,85,32,73,41,41,32,+40,40,65,32,58,56,48,54,32,40,75,32,40,110,111,68,101,102,97,117,+108,116,32,34,72,97,115,76,111,99,46,103,101,116,83,76,111,99,34,41,+41,41,32,40,40,65,32,58,56,48,55,32,40,95,56,48,52,32,40,85,+32,75,41,41,41,32,40,40,65,32,58,56,48,56,32,40,95,56,48,52,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,80,32,40,95,56,48,53,32,95,56,48,55,41,+41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,+40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,95,+56,48,53,32,40,95,56,48,57,32,95,56,49,53,41,41,41,41,32,75,+41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,+32,40,90,32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,52,+41,41,41,41,41,32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,+48,56,41,41,41,41,32,40,95,56,48,53,32,95,56,49,50,41,41,41,+32,40,40,67,32,40,40,67,32,67,39,41,32,40,95,56,48,53,32,40,+95,56,48,57,32,95,56,49,51,41,41,41,41,32,40,95,56,48,53,32,+95,56,48,55,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,+48,56,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,55,+41,41,41,41,32,40,90,32,40,90,32,40,95,56,48,53,32,95,56,48,+56,41,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,+41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,41,+41,41,32,40,75,32,40,95,50,52,32,34,103,101,116,83,76,111,99,32,+69,85,86,97,114,34,41,41,41,41,32,40,95,56,48,53,32,95,56,49,+49,41,41,41,32,40,40,83,32,40,40,67,32,67,39,41,32,40,95,56,+48,53,32,95,56,48,56,41,41,41,32,40,90,32,40,90,32,40,95,56,+48,53,32,40,95,56,48,57,32,95,56,49,48,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,56,48,57,32,40,40,66,32,95,56,48,52,41,+32,40,40,66,32,40,80,32,40,95,50,52,32,34,103,101,116,83,76,111,+99,32,91,93,34,41,41,41,32,40,40,66,32,90,41,32,95,56,48,53,+41,41,41,41,32,40,40,65,32,58,56,49,48,32,40,95,56,48,52,32,+40,85,32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,+41,32,40,40,65,32,58,56,49,49,32,40,95,56,48,52,32,40,40,67,+32,40,40,80,32,40,75,32,40,95,56,48,53,32,95,56,48,55,41,41,+41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,32,75,41,41,41,+32,40,40,65,32,58,56,49,50,32,40,95,56,48,52,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,95,56,48,+53,32,40,95,56,48,57,32,95,56,48,56,41,41,41,32,40,90,32,40,+95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,95,56,48,53,32,+95,56,48,56,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,+56,41,41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,+41,41,41,32,40,90,32,40,90,32,40,95,56,48,53,32,95,56,48,56,+41,41,41,41,41,41,32,40,40,65,32,58,56,49,51,32,40,95,56,48,+52,32,40,40,67,32,40,40,80,32,40,90,32,40,95,56,48,53,32,95,+56,48,56,41,41,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,52,41,41,41,+41,41,32,40,40,65,32,58,56,49,52,32,40,95,56,48,52,32,40,40,+67,32,40,40,80,32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,+41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,+32,40,90,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,41,32,+40,40,65,32,58,56,49,53,32,40,95,56,48,52,32,40,85,32,40,40,+67,32,40,40,67,32,67,39,41,32,40,95,56,48,53,32,95,56,49,54,+41,41,41,32,40,90,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+41,41,41,32,40,40,65,32,58,56,49,54,32,40,95,56,48,52,32,40,+85,32,40,90,32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,+55,41,41,41,41,41,41,32,40,40,65,32,58,56,49,55,32,40,95,56,+48,52,32,40,85,32,40,40,83,32,40,40,67,32,67,39,41,32,40,95,+56,48,53,32,95,56,48,56,41,41,41,32,40,90,32,40,90,32,40,95,+56,48,53,32,40,95,56,48,57,32,95,56,49,51,41,41,41,41,41,41,+41,41,32,40,40,65,32,58,56,49,56,32,40,90,32,75,41,41,32,40,+40,65,32,58,56,49,57,32,40,75,32,75,41,41,32,40,40,65,32,58,+56,50,48,32,40,75,32,65,41,41,32,40,40,65,32,58,56,50,49,32,+40,40,95,50,48,49,32,40,40,40,67,39,32,83,41,32,40,40,67,32,+40,40,67,32,83,39,41,32,40,40,67,32,40,40,80,32,95,49,50,53,+41,32,95,49,50,52,41,41,32,95,49,50,52,41,41,41,32,40,40,67,+32,40,40,80,32,95,49,50,52,41,32,95,49,50,53,41,41,32,95,49,+50,52,41,41,41,32,40,40,67,32,40,40,80,32,95,49,50,52,41,32,+95,49,50,52,41,41,32,95,49,50,53,41,41,41,32,40,95,50,48,53,+32,95,56,50,49,41,41,41,32,40,40,65,32,58,56,50,50,32,40,40,+83,32,40,85,32,95,50,54,52,41,41,32,40,90,32,40,90,32,40,40,+66,32,89,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,+83,32,73,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,95,52,55,49,41,41,41,32,40,67,32,40,+95,52,51,54,32,95,56,57,50,41,41,41,41,41,41,32,40,40,40,83,+39,32,40,67,39,32,66,41,41,32,40,66,32,95,55,52,52,41,41,32,+73,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,66,32,95,55,53,54,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,40,66,32,40,40,83,39,+32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,41,+41,32,40,40,66,32,40,66,32,95,56,50,50,41,41,32,40,40,67,39,+32,95,51,57,52,41,32,40,40,66,32,40,83,32,73,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,67,39,32,40,67,39,32,95,49,50,50,41,+41,32,40,40,66,32,40,67,32,40,95,52,51,50,32,95,56,57,50,41,+41,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,32,75,41,41,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,41,32,+40,95,50,52,32,34,115,117,98,115,116,32,117,110,105,109,112,108,101,109,+101,110,116,101,100,34,41,41,41,41,41,41,41,32,40,40,65,32,58,56,+50,51,32,95,56,50,52,41,32,40,40,65,32,58,56,50,52,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+67,32,40,40,67,32,67,39,41,32,40,95,50,48,50,32,95,56,57,50,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,+50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,32,40,40,+40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,85,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,+49,50,49,41,41,32,95,56,50,52,41,41,41,32,95,56,50,52,41,41,+41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,+32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,+41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,+41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,+95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,+41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,75,32,95,+49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,+32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,+41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,50,52,41,41,+41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,+75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,+52,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,40,65,32,58,56,50,53,32,+40,40,67,32,40,40,80,32,40,40,40,67,39,32,66,41,32,95,52,54,+50,41,32,40,95,51,57,52,32,95,56,50,54,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,50,57,+41,41,32,95,56,51,48,41,41,41,32,40,90,32,40,40,67,32,79,41,+32,75,41,41,41,41,32,40,40,65,32,58,56,50,54,32,40,85,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,+51,57,52,32,95,56,50,57,41,41,41,32,95,56,50,55,41,41,41,32,+40,40,65,32,58,56,50,55,32,40,85,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,52,54,51,41,32,40,95,51,57,52,32,95,56,50,+56,41,41,41,32,40,95,51,57,52,32,95,56,50,53,41,41,41,41,32,+40,40,65,32,58,56,50,56,32,40,85,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,52,54,51,41,32,40,95,51,57,52,32,95,56,51,+51,41,41,41,32,95,56,51,48,41,41,41,32,40,40,65,32,58,56,50,+57,32,95,56,51,48,41,32,40,40,65,32,58,56,51,48,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,40,67,32,79,41,32,75,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,+41,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,32,40,95,51,57,+52,32,40,85,32,40,40,40,67,39,32,66,41,32,95,52,54,50,41,32,+95,56,51,48,41,41,41,41,41,41,32,40,95,51,57,52,32,95,56,50,+54,41,41,41,32,40,75,32,40,75,32,95,52,54,49,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,+56,51,48,41,41,32,40,95,51,57,52,32,95,56,51,50,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,+40,95,51,57,52,32,95,56,50,53,41,41,41,32,95,56,51,48,41,41,+41,32,40,95,51,57,52,32,95,56,51,48,41,41,41,32,40,40,83,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,+32,40,85,32,40,95,51,57,52,32,95,56,51,48,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,95,56,+51,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,40,40,95,52,55,48,32,95,52,54,49,41,32,40,40,+67,32,95,52,54,50,41,32,95,52,54,49,41,41,41,41,32,40,95,51,+57,52,32,95,56,51,51,41,41,41,41,32,40,40,66,32,40,67,32,95,+52,54,50,41,41,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,+66,41,32,95,52,54,50,41,32,95,56,51,48,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,52,54,51,41,32,+95,56,51,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,52,54,51,41,32,95,56,51,48,41,41,32,95,56,51,48,41,41,+41,41,32,40,90,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,+66,41,32,95,52,54,50,41,32,95,56,51,48,41,41,41,32,40,75,32,+95,52,54,49,41,41,41,32,40,40,40,67,39,32,79,41,32,95,55,55,+50,41,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,95,52,54,51,41,32,40,95,51,57,53,32,40,85,32,75,41,41,41,+41,32,95,56,51,48,41,41,41,32,40,40,65,32,58,56,51,49,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,+95,51,57,52,32,95,56,51,48,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,32,40,95,+51,57,52,32,95,56,51,51,41,41,41,41,32,95,56,51,48,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,+56,51,48,41,41,32,95,56,51,48,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,32,+95,56,51,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,40,66,32,95,52,54,51,41,32,95,56,51,48,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,+51,48,41,41,32,95,56,51,48,41,41,41,41,32,40,40,65,32,58,56,+51,50,32,40,85,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+52,54,51,41,32,95,56,50,57,41,41,32,95,56,50,55,41,41,41,32,+40,40,65,32,58,56,51,51,32,40,40,67,32,40,40,80,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,56,50,57,+41,41,32,95,56,51,48,41,41,32,95,56,51,48,41,41,32,40,95,51,+57,52,32,95,56,50,53,41,41,41,32,40,40,65,32,58,56,51,52,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,39,+41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,95,55,52,+51,41,41,32,95,57,48,49,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,95,55,52,55,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,40,66,32,40,66,32,95,55,53,57,41,41,32,95,56,51,+53,41,41,41,32,40,90,32,75,41,41,41,32,40,95,50,52,32,34,115,+101,116,83,76,111,99,69,120,112,114,34,41,41,41,32,40,40,65,32,58,+56,51,53,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,32,80,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,55,54,51,41,41,+32,95,57,48,49,41,41,32,40,40,66,32,40,66,32,95,55,54,52,41,+41,32,95,57,48,49,41,41,41,32,40,90,32,75,41,41,41,32,40,40,+65,32,58,56,51,54,32,40,40,66,32,40,66,32,40,95,50,54,49,32,+95,50,52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,52,54,51,41,32,95,57,49,54,41,41,32,40,95,52,54,51,32,34,+58,32,34,41,41,41,41,32,40,40,65,32,58,56,51,55,32,40,40,40,+95,49,53,56,56,32,40,95,49,53,57,50,32,95,56,51,55,41,41,32,+95,56,51,56,41,32,40,95,49,53,57,52,32,95,56,51,55,41,41,41,+32,40,40,65,32,58,56,51,56,32,40,40,95,50,54,51,32,95,49,53,+56,48,41,32,95,56,53,55,41,41,32,40,40,65,32,58,56,51,57,32,+40,40,95,50,54,51,32,95,49,53,56,48,41,32,95,56,53,50,41,41,+32,40,40,65,32,58,56,52,48,32,40,40,95,50,54,51,32,95,49,53,+56,48,41,32,95,56,54,52,41,41,32,40,40,65,32,58,56,52,49,32,+40,40,95,50,54,51,32,95,49,53,56,48,41,32,40,40,95,50,54,51,+32,95,49,53,52,48,41,32,40,95,51,57,53,32,95,56,54,52,41,41,+41,41,32,40,40,65,32,58,56,52,50,32,40,40,95,50,54,51,32,95,+49,53,56,48,41,32,95,56,54,55,41,41,32,40,40,65,32,58,56,52,+51,32,40,40,67,32,40,40,80,32,40,40,40,67,39,32,95,49,53,54,+53,41,32,95,57,48,51,41,32,40,95,49,53,51,53,32,34,40,46,46,+41,34,41,41,41,32,95,57,48,51,41,41,32,95,57,48,51,41,41,32,+40,40,65,32,58,56,52,52,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,80,32,40,40,40,83,39,32,83,41,32,40,40,+66,32,85,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,49,53,+51,53,32,34,100,97,116,97,34,41,41,41,32,95,56,53,48,41,41,41,+32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,40,67,39,+32,95,49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,32,40,+95,49,53,51,53,32,34,100,97,116,97,34,41,41,41,32,95,56,53,48,+41,41,32,40,95,49,53,51,53,32,40,40,79,32,35,54,49,41,32,75,+41,41,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,40,40,66,+32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,32,124,34,41,+41,41,32,40,95,51,57,53,32,95,56,52,56,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,+41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,40,40,66,32,40,+95,49,53,54,54,32,40,95,49,53,51,53,32,34,110,101,119,116,121,112,+101,34,41,41,41,32,95,56,53,48,41,41,32,40,95,49,53,51,53,32,+40,40,79,32,35,54,49,41,32,75,41,41,41,41,41,32,95,56,52,56,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,40,40,66,+32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,116,121,112,101,+34,41,41,41,32,95,56,53,48,41,41,32,40,95,49,53,51,53,32,40,+40,79,32,35,54,49,41,32,75,41,41,41,41,41,32,95,56,54,55,41,+41,41,32,40,40,40,67,39,32,95,56,52,55,41,32,95,57,48,51,41,+32,40,95,49,53,51,53,32,40,40,79,32,35,54,49,41,32,75,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,95,57,48,+51,41,32,40,95,49,53,51,53,32,34,58,58,34,41,41,41,41,32,95,+56,54,55,41,41,41,32,40,85,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,+49,53,54,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,95,49,53,54,53,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,66,+32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,105,109,112,111,+114,116,34,41,41,41,32,40,40,80,32,95,49,53,51,54,41,32,40,95,+49,53,51,53,32,34,113,117,97,108,105,102,105,101,100,34,41,41,41,41,+41,32,95,57,48,51,41,41,41,32,40,40,66,32,95,49,53,51,53,41,+32,40,40,95,52,55,48,32,75,41,32,40,40,95,50,54,51,32,40,95,+52,54,51,32,34,32,97,115,32,34,41,41,32,95,57,48,48,41,41,41,+41,41,41,32,40,40,80,32,95,49,53,51,54,41,32,40,85,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,53,41,32,40,40,+66,32,95,49,53,51,53,41,32,40,40,80,32,75,41,32,34,32,104,105,+100,105,110,103,34,41,41,41,41,32,40,40,66,32,95,49,53,52,53,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,32,40,+40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,44,32,+34,41,41,41,32,40,95,51,57,53,32,95,56,52,51,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,95,49,53,54,54,41,41,32,40,40,40,67,+39,32,40,67,39,32,95,49,53,54,54,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,66,32,95,49,+53,51,53,41,32,40,40,66,32,40,95,52,54,51,32,34,102,111,114,101,+105,103,110,32,105,109,112,111,114,116,32,99,99,97,108,108,32,34,41,41,+32,40,95,49,53,57,48,32,40,95,51,57,49,32,95,49,52,57,41,41,+41,41,41,41,32,95,57,48,51,41,41,32,40,95,49,53,51,53,32,34,+58,58,34,41,41,41,41,32,95,56,54,55,41,41,41,32,40,40,67,32,+66,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,95,49,53,54,+54,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,+54,54,41,32,40,40,66,32,95,49,53,51,53,41,32,40,40,66,32,40,+95,52,54,51,32,34,105,110,102,105,120,34,41,41,32,40,40,67,32,40,+40,80,32,40,40,79,32,35,49,48,56,41,32,75,41,41,32,40,40,79,+32,35,49,49,52,41,32,75,41,41,41,32,75,41,41,41,41,41,32,40,+40,66,32,95,49,53,51,53,41,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,40,40,+66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,44,32,34,+41,41,41,32,40,95,51,57,53,32,95,57,48,51,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,95,56,53,52,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,95,49,53,54,54,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,32,+40,95,49,53,51,53,32,34,99,108,97,115,115,34,41,41,41,32,95,56,+52,53,41,41,41,32,95,56,53,48,41,41,41,32,95,56,52,54,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,95,56,53,52,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,49,53,54,54,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,+32,40,95,49,53,51,53,32,34,105,110,115,116,97,110,99,101,34,41,41,+41,32,95,56,53,57,41,41,41,32,95,56,52,53,41,41,41,32,95,56,+54,55,41,41,41,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,+49,53,51,53,32,34,100,101,102,97,117,108,116,34,41,41,41,32,40,40,+66,32,95,49,53,52,53,41,32,40,40,66,32,95,49,53,51,57,41,32,+40,40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,34,44,+32,34,41,41,41,32,40,95,51,57,53,32,95,56,54,55,41,41,41,41,+41,41,41,32,40,40,65,32,58,56,52,53,32,40,40,83,32,40,85,32,+95,49,53,51,54,41,41,32,40,90,32,40,90,32,40,40,40,67,39,32,+95,49,53,54,54,41,32,40,40,66,32,95,56,54,55,41,32,95,55,53,+48,41,41,32,40,95,49,53,51,53,32,34,61,62,34,41,41,41,41,41,+41,32,40,40,65,32,58,56,52,54,32,40,40,83,32,40,85,32,95,49,+53,51,54,41,41,32,40,90,32,40,90,32,40,40,66,32,40,95,49,53,+54,54,32,40,95,49,53,51,53,32,40,40,79,32,35,49,50,52,41,32,+75,41,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,40,40,66,+32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,40,40,79,32,35,+52,52,41,32,75,41,41,41,41,32,40,95,51,57,53,32,40,85,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,+40,40,67,39,32,95,49,53,54,54,41,32,40,40,66,32,95,49,53,51,+57,41,32,40,95,51,57,53,32,95,57,48,51,41,41,41,32,40,95,49,+53,51,53,32,40,40,79,32,35,52,53,41,32,75,41,41,41,41,41,32,+40,40,66,32,95,49,53,51,57,41,32,40,95,51,57,53,32,95,57,48,+51,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,56,+52,55,32,40,40,66,32,40,66,32,40,95,50,54,51,32,95,49,53,52,+48,41,41,41,32,40,40,66,32,40,66,32,95,51,57,53,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,95,49,53,55,48,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,79,41,41,32,40,40,40,67,39,32,66,41,32,95,49,53,54,54,41,+32,40,40,66,32,95,49,53,51,57,41,32,40,95,51,57,53,32,95,56,+54,54,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,95,56,53,51,41,32,75,41,41,41,41,41,41,41,32,40,40,+65,32,58,56,52,56,32,40,85,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,+49,53,54,54,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,95,49,53,54,54,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,95,56,53,+57,41,41,32,95,56,52,53,41,41,41,32,95,57,48,51,41,41,41,32,+40,40,80,32,40,40,66,32,95,49,53,51,57,41,32,40,95,51,57,53,+32,95,56,52,57,41,41,41,32,40,40,66,32,95,49,53,52,54,41,32,+40,40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,32,40,95,+51,57,53,32,40,85,32,40,40,40,67,39,32,40,67,39,32,95,49,53,+54,53,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,+53,54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,95,57,+48,51,41,32,40,95,49,53,51,53,32,34,58,58,34,41,41,41,41,32,+95,56,52,57,41,41,32,40,95,49,53,51,53,32,40,40,79,32,35,52,+52,41,32,75,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,56,52,57,32,40,85,32,40,40,67,32,40,40,67,32,83,39,41,32,+95,56,54,55,41,41,32,40,40,66,32,40,95,49,53,54,53,32,40,95,+49,53,51,53,32,40,40,79,32,35,51,51,41,32,75,41,41,41,41,32,+95,56,54,55,41,41,41,41,32,40,40,65,32,58,56,53,48,32,40,85,+32,40,40,66,32,40,66,32,95,49,53,51,57,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,50,41,32,95,57,48,51,41,+41,32,40,95,51,57,53,32,95,56,53,49,41,41,41,41,41,32,40,40,+65,32,58,56,53,49,32,40,85,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,49,53,52,53,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,53,54,53,41,32,40,40,40,67,39,32,95,49,+53,54,53,41,32,95,57,48,51,41,32,40,95,49,53,51,53,32,34,58,+58,34,41,41,41,41,32,95,56,54,56,41,41,41,41,32,40,40,65,32,+58,56,53,50,32,40,40,66,32,95,49,53,52,48,41,32,40,95,51,57,+53,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,95,56,52,+52,41,41,41,41,32,40,90,32,95,56,52,52,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,40,90,32,75,41,41,41,41,41,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,32,75,41,41,32,40,40,40,67,39,32,95,+49,53,54,48,41,32,95,56,52,52,41,32,40,95,49,53,51,53,32,75,+41,41,41,41,41,41,32,40,40,65,32,58,56,53,51,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,95,56,53,52,41,41,32,95,56,53,+53,41,41,41,32,40,40,65,32,58,56,53,52,32,40,40,40,83,39,32,+83,41,32,85,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,48,41,32,+40,40,67,32,95,49,53,54,54,41,32,40,95,49,53,51,53,32,34,119,+104,101,114,101,34,41,41,41,41,32,40,40,66,32,40,95,49,53,52,49,+32,35,50,41,41,32,40,40,66,32,95,49,53,52,48,41,32,40,95,51,+57,53,32,95,56,54,52,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,56,53,53,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,67,+32,83,41,41,32,40,40,66,32,40,66,32,40,67,32,66,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,+67,32,67,39,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,53,54,54,41,32,40,95,49,53,54,54,32,40,95,49,53,51,53,+32,75,41,41,41,41,32,95,56,53,55,41,41,41,41,32,40,90,32,75,+41,41,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,32,40,+66,32,95,49,53,52,48,41,41,32,40,40,66,32,95,51,57,53,41,32,+95,56,53,54,41,41,41,41,32,40,40,65,32,58,56,53,54,32,40,40,+66,32,85,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,49,53,54,54,41,41,32,40,40,67,39,32,95,+49,53,54,54,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,49,+53,51,53,32,34,32,124,34,41,41,41,32,40,40,66,32,95,49,53,51,+57,41,32,40,40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,+32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,32,40,95,51,57,+53,32,95,56,54,51,41,41,41,41,41,41,41,32,95,56,53,55,41,41,+41,32,40,40,65,32,58,56,53,55,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,+85,32,40,40,66,32,40,40,83,32,40,40,40,83,39,32,95,57,49,49,+41,32,95,52,50,56,41,32,95,49,53,51,53,41,41,32,40,40,66,32,+95,49,53,52,53,41,32,95,49,53,51,53,41,41,41,32,40,40,66,32,+95,57,48,48,41,32,95,57,48,57,41,41,41,41,32,40,90,32,40,90,+32,40,95,56,53,56,32,95,52,54,49,41,41,41,41,41,32,40,40,66,+32,40,66,32,95,56,53,55,41,41,32,40,95,51,57,57,32,40,40,66,+32,85,41,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,+67,39,32,95,55,52,52,41,32,95,55,52,51,41,41,41,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,32,40,+40,66,32,40,95,49,53,54,53,32,40,95,49,53,51,53,32,40,40,79,+32,35,57,50,41,32,75,41,41,41,41,32,40,40,95,56,52,55,32,95,+49,53,51,54,41,32,40,95,49,53,51,53,32,34,45,62,34,41,41,41,+41,41,41,32,40,75,32,40,40,66,32,95,49,53,51,53,41,32,95,56,+54,50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,53,53,57,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,+40,40,66,32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,99,+97,115,101,34,41,41,41,32,95,56,53,55,41,41,32,40,95,49,53,51,+53,32,34,111,102,34,41,41,41,41,32,40,40,66,32,40,95,49,53,52,+49,32,35,50,41,41,32,40,40,66,32,95,49,53,52,48,41,32,40,95,+51,57,53,32,95,56,54,53,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,49,53,53,57,41,32,40,40,66,32,40,+95,49,53,53,57,32,40,95,49,53,51,53,32,34,108,101,116,34,41,41,+41,32,40,40,66,32,40,95,49,53,52,49,32,35,50,41,41,32,40,40,+66,32,95,49,53,52,48,41,32,40,95,51,57,53,32,95,56,54,52,41,+41,41,41,41,41,32,40,40,66,32,40,95,49,53,54,54,32,40,95,49,+53,51,53,32,34,105,110,34,41,41,41,32,95,56,53,55,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,32,40,+40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,32,40,40,66,+32,40,95,49,53,52,51,32,40,95,49,53,51,53,32,40,40,79,32,35,+52,52,41,32,75,41,41,41,41,32,40,95,51,57,53,32,95,56,53,55,+41,41,41,41,41,41,32,40,40,83,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+67,32,40,40,40,67,39,32,83,39,41,32,40,85,32,40,95,56,54,57,+32,95,56,53,55,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,32,95,56,54,48,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,53,57,41,32,40,40,95,+52,55,48,32,40,95,49,53,51,53,32,34,100,111,34,41,41,32,40,40,+40,67,39,32,95,49,53,54,53,41,32,95,57,48,51,41,32,40,95,49,+53,51,53,32,34,46,100,111,34,41,41,41,41,41,32,40,40,66,32,40,+95,49,53,52,49,32,35,50,41,41,32,40,40,66,32,95,49,53,52,48,+41,32,40,95,51,57,53,32,95,56,54,51,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,+32,95,56,53,55,41,41,32,95,57,48,51,41,41,41,41,32,40,40,66,+32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,95,+57,48,51,41,41,32,95,56,53,55,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,53,55,48,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,79,41,32,+40,40,66,32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,105,+102,34,41,41,41,32,95,56,53,55,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,79,41,32,40,40,66,32,40,95,49,53,54,+54,32,40,95,49,53,51,53,32,34,116,104,101,110,34,41,41,41,32,95,+56,53,55,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,66,32,+40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,101,108,115,101,34,+41,41,41,32,95,56,53,55,41,41,32,75,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,+40,40,40,67,39,32,95,49,53,54,54,41,32,95,56,53,55,41,32,40,+95,49,53,51,53,32,34,58,58,34,41,41,41,41,32,95,56,54,55,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,53,54,+53,41,32,40,40,40,67,39,32,95,49,53,54,53,41,32,95,57,48,51,+41,32,40,95,49,53,51,53,32,40,40,79,32,35,54,52,41,32,75,41,+41,41,41,41,32,95,56,53,55,41,41,41,32,40,40,66,32,95,49,53,+51,53,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,57,+55,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,+41,41,41,41,32,95,56,54,49,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,53,54,54,41,32,95,56,53,57,41,41,32,95,+56,54,55,41,41,41,32,40,40,65,32,58,56,53,56,32,40,40,40,83,+39,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,67,41,32,40,40,+66,32,40,67,32,67,39,41,41,32,40,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,83,41,32,95,57,49,49,41,41,+41,32,40,40,40,67,39,32,66,41,32,83,41,32,40,40,66,32,40,40,+83,39,32,66,41,32,80,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,40,67,39,32,40,67,39,32,80,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,49,53,54,54,41,41,32,40,40,66,32,40,40,67,39,32,+95,49,53,54,54,41,32,95,56,53,55,41,41,32,95,49,53,51,53,41,+41,41,32,95,56,53,55,41,41,41,41,32,40,90,32,75,41,41,41,41,+41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,83,39,+32,83,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,83,41,32,+95,57,49,49,41,41,41,32,40,40,40,67,39,32,66,41,32,83,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,80,41,41,+32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,53,52,53,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,49,53,54,54,41,32,95,+56,53,55,41,41,32,95,49,53,51,53,41,41,41,41,32,40,90,32,75,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,+40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,52,41,+41,41,41,41,32,40,40,66,32,67,41,32,40,40,66,32,40,40,67,39,+32,83,41,32,40,40,67,32,40,95,50,48,50,32,95,49,51,51,41,41,+32,34,91,93,34,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,67,39,32,40,95,50,48,50,32,95,50,56,49,41,41,32,95,52,49,+49,41,32,35,49,41,41,32,40,40,66,32,95,56,53,55,41,32,40,40,+66,32,95,55,53,49,41,32,95,55,54,54,41,41,41,41,41,41,41,32,+40,40,66,32,95,56,53,55,41,32,95,55,53,48,41,41,41,41,41,32,+95,52,50,56,41,41,32,40,40,66,32,95,57,48,48,41,32,95,57,48,+57,41,41,41,41,32,40,40,66,32,40,67,39,32,95,56,53,56,41,41,+32,40,67,32,95,52,54,50,41,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,+53,52,53,41,41,41,32,40,40,66,32,40,66,32,95,49,53,51,57,41,+41,32,40,40,66,32,40,66,32,40,95,51,57,53,32,95,56,53,55,41,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,32,40,40,65,+32,58,56,53,57,32,40,40,40,67,39,32,95,49,53,54,54,41,32,40,+40,66,32,40,95,49,53,54,54,32,40,95,49,53,51,53,32,34,102,111,+114,97,108,108,34,41,41,41,32,40,40,66,32,95,49,53,51,57,41,32,+40,95,51,57,53,32,95,56,53,49,41,41,41,41,32,40,95,49,53,51,+53,32,40,40,79,32,35,52,54,41,32,75,41,41,41,41,32,40,40,65,+32,58,56,54,48,32,40,75,32,40,95,49,53,51,53,32,34,60,60,76,+105,115,116,105,115,104,62,62,34,41,41,41,32,40,40,65,32,58,56,54,+49,32,40,40,67,32,40,40,80,32,40,75,32,95,57,48,51,41,41,32,+95,57,48,51,41,41,32,40,75,32,40,40,66,32,95,49,53,51,53,41,+32,95,56,54,50,41,41,41,41,32,40,40,65,32,58,56,54,50,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,80,32,40,40,66,32,40,95,52,54,50,32,35,51,53,+41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,32,40,40,+66,32,40,95,52,54,50,32,35,51,53,41,41,32,40,40,66,32,40,95,+52,54,50,32,35,51,53,41,41,32,40,95,49,53,57,48,32,95,51,48,+55,41,41,41,41,41,32,40,40,66,32,40,95,52,54,50,32,35,51,56,+41,41,32,40,95,49,53,57,48,32,95,49,53,53,41,41,41,41,32,40,+40,66,32,40,95,52,54,50,32,35,51,55,41,41,32,40,95,49,53,57,+48,32,40,95,53,50,49,32,95,51,48,55,41,41,41,41,41,32,40,95,+49,53,57,48,32,95,49,52,57,41,41,41,32,40,95,49,53,57,48,32,+40,95,51,57,49,32,95,49,52,57,41,41,41,41,32,73,41,41,32,40,+95,52,54,50,32,35,57,52,41,41,41,32,40,40,65,32,58,56,54,51,+32,40,40,67,32,40,40,80,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,49,53,54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,+41,32,95,56,54,54,41,32,40,95,49,53,51,53,32,34,60,45,34,41,+41,41,41,32,95,56,53,55,41,41,32,95,56,53,55,41,41,32,40,40,+66,32,40,95,49,53,53,57,32,40,95,49,53,51,53,32,34,108,101,116,+34,41,41,41,32,40,40,66,32,40,95,49,53,52,49,32,35,50,41,41,+32,40,40,66,32,95,49,53,52,48,41,32,40,95,51,57,53,32,95,56,+54,52,41,41,41,41,41,41,32,40,40,65,32,58,56,54,52,32,40,40,+67,32,40,40,80,32,40,40,66,32,40,66,32,95,56,52,52,41,41,32,+95,55,51,49,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,49,53,54,54,41,32,40,40,40,67,39,32,95,49,53,54,54,41,32,+95,56,54,54,41,32,40,95,49,53,51,53,32,40,40,79,32,35,54,49,+41,32,75,41,41,41,41,41,32,95,56,53,55,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,49,53,54,54,41,32,40,40,40,+67,39,32,95,49,53,54,54,41,32,95,57,48,51,41,32,40,95,49,53,+51,53,32,34,58,58,34,41,41,41,41,32,95,56,54,55,41,41,41,32,+40,40,65,32,58,56,54,53,32,40,85,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,53,54,53,41,32,95,56,54,54,41,41,32,40,+95,56,53,51,32,40,95,49,53,51,53,32,34,45,62,34,41,41,41,41,+41,32,40,40,65,32,58,56,54,54,32,95,56,53,55,41,32,40,40,65,+32,58,56,54,55,32,95,56,53,55,41,32,40,40,65,32,58,56,54,56,+32,95,56,54,55,41,32,40,40,65,32,58,56,54,57,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,53,52,55,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,95,49,53,51,57,41,41,41,32,+40,40,66,32,40,66,32,40,95,49,53,52,51,32,40,95,49,53,51,53,+32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,41,32,95,51,57,+53,41,41,41,41,32,40,40,65,32,58,56,55,48,32,40,40,67,32,40,+40,80,32,40,90,32,40,40,67,32,79,41,32,75,41,41,41,32,40,90,+32,95,55,57,52,41,41,41,32,40,75,32,40,75,32,95,52,54,49,41,+41,41,41,32,40,40,65,32,58,56,55,49,32,40,95,51,57,52,32,95,+56,55,48,41,41,32,40,40,65,32,58,56,55,50,32,80,41,32,40,40,+65,32,58,56,55,51,32,40,40,66,32,90,41,32,85,41,41,32,40,40,+65,32,58,56,55,52,32,40,90,32,85,41,41,32,40,40,65,32,58,56,+55,53,32,40,40,66,32,40,66,32,40,95,51,57,53,32,40,40,80,32,+40,85,32,40,90,32,40,90,32,95,56,55,51,41,41,41,41,32,40,40,+66,32,95,56,55,52,41,32,40,95,51,57,52,32,40,85,32,40,90,32,+40,90,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,41,+41,32,95,56,55,54,41,41,32,40,40,65,32,58,56,55,54,32,40,40,+66,32,40,83,32,40,85,32,95,52,54,49,41,41,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,40,40,+83,39,32,40,67,32,40,40,40,67,39,32,40,83,39,32,95,51,57,53,+41,41,32,40,40,66,32,40,66,32,40,83,32,73,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+67,39,32,80,41,41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,+41,32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,66,32,40,83,+32,40,95,52,51,52,32,40,95,50,48,50,32,95,50,56,49,41,41,41,+41,32,95,50,57,55,41,41,41,32,40,66,32,95,56,55,51,41,41,41,+32,40,40,66,32,40,66,32,95,56,55,52,41,41,32,40,40,67,32,40,+67,39,32,79,41,41,32,75,41,41,41,41,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,95,56,55,52,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,40,67,39,32,66,41,41,32,40,66,+32,95,52,54,50,41,41,41,41,32,95,51,57,55,41,41,41,41,32,95,+52,54,49,41,41,41,41,41,41,41,32,95,56,56,56,41,41,41,32,40,+85,32,75,41,41,32,40,85,32,65,41,41,41,41,32,95,56,56,50,41,+41,41,41,41,32,40,40,65,32,58,56,55,55,32,95,50,57,54,41,32,+40,40,65,32,58,56,55,56,32,40,40,40,83,39,32,95,51,57,52,41,+32,40,40,66,32,40,40,83,39,32,95,51,57,52,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,41,41,32,95,50,+57,55,41,41,32,95,56,55,55,41,41,32,40,40,65,32,58,56,55,57,+32,40,40,66,32,40,95,51,57,55,32,40,85,32,40,40,40,67,39,32,+66,41,32,40,95,50,57,56,32,95,52,54,51,41,41,32,40,40,67,32,+79,41,32,75,41,41,41,41,41,32,40,40,66,32,95,50,57,51,41,32,+40,40,67,32,95,52,49,50,41,32,40,95,52,52,55,32,95,52,54,49,+41,41,41,41,41,32,40,40,65,32,58,56,56,48,32,40,40,40,83,39,+32,95,56,55,57,41,32,95,56,55,55,41,32,95,56,56,49,41,41,32,+40,40,65,32,58,56,56,49,32,40,40,66,32,40,95,51,57,52,32,40,+85,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,67,32,80,+41,41,32,75,41,41,41,41,32,95,56,55,56,41,41,32,40,40,65,32,+58,56,56,50,32,40,40,40,83,39,32,83,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,80,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,50,57,51,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,95,51,57,52,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,85,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,79,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,80,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,52,55,52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,89,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,83,41,32,40,95,+52,57,57,32,95,50,56,50,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,83,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,66,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,40,83,39,32,83,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,66,32,67,41,41,+41,41,32,40,40,67,32,67,39,41,32,40,40,67,32,40,95,52,55,57,+32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,+66,32,67,41,41,32,67,41,41,41,41,32,40,40,67,32,40,67,39,32,+66,41,41,32,40,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,+32,35,49,41,41,41,41,32,95,52,55,55,41,41,41,41,32,40,40,66,+32,95,50,57,55,41,32,40,40,66,32,95,50,57,51,41,32,40,95,51,+57,52,32,40,85,32,40,40,66,32,85,41,32,40,90,32,40,40,66,32,+90,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,32,+75,41,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,95,51,54,54,32,95,50,55,56,41,41,41,32,40,67,+32,40,95,52,56,48,32,95,50,55,55,41,41,41,32,40,40,95,52,56,+53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,41,+41,41,41,32,95,52,55,54,41,41,32,35,48,41,41,41,32,40,40,40,+67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,+41,32,35,49,41,41,41,41,41,32,75,41,41,41,41,41,41,32,73,41,+41,41,32,40,40,66,32,95,50,57,55,41,32,95,50,57,51,41,41,41,+32,40,40,66,32,40,66,32,40,95,52,49,50,32,40,40,95,49,56,52,+32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,+40,95,51,53,57,32,35,48,41,41,41,41,41,41,32,40,40,66,32,95,+52,53,52,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,+90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,67,+32,66,41,41,32,40,40,66,32,90,41,32,40,66,32,90,41,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,56,56,51,32,40,40,83,32,+95,56,56,52,41,32,95,56,55,55,41,41,32,40,40,65,32,58,56,56,+52,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,53,54,54,41,+41,41,32,40,40,40,67,39,32,89,41,32,40,40,66,32,40,66,32,40,+40,83,39,32,80,41,32,40,40,67,32,80,41,32,95,52,54,49,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,67,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,83,39,32,83,39,+41,41,32,40,67,32,95,51,48,49,41,41,41,41,32,40,40,66,32,40,+40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,32,40,40,+67,39,32,67,39,41,32,40,40,66,32,40,83,39,32,40,40,83,39,32,+80,41,32,40,85,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,95,52,54,50,41,41,32,+40,40,40,67,39,32,66,41,32,95,56,55,50,41,32,40,85,32,65,41,+41,41,41,32,40,85,32,65,41,41,41,41,41,32,40,40,67,32,67,39,+41,32,40,85,32,75,41,41,41,41,41,41,32,40,40,66,32,40,67,32,+40,40,40,67,39,32,67,39,41,32,83,39,41,32,40,67,32,95,51,48,+50,41,41,41,41,32,95,50,57,55,41,41,41,41,32,73,41,41,41,32,+95,51,48,48,41,41,41,32,40,40,65,32,58,56,56,53,32,40,85,32,+40,40,66,32,40,40,67,39,32,95,50,54,51,41,32,95,56,56,54,41,+41,32,95,52,54,50,41,41,41,32,40,40,65,32,58,56,56,54,32,40,+40,66,32,40,95,50,54,49,32,40,40,95,51,57,55,32,95,50,54,51,+41,32,95,50,54,52,41,41,41,32,40,95,51,57,53,32,95,56,56,53,+41,41,41,32,40,40,65,32,58,56,56,55,32,40,40,40,67,39,32,95,+56,56,54,41,32,95,56,56,51,41,32,95,52,54,49,41,41,32,40,40,+65,32,58,56,56,56,32,40,40,83,32,95,56,56,52,41,32,40,40,66,+32,95,52,50,51,41,32,40,40,66,32,95,56,56,55,41,32,95,56,56,+48,41,41,41,41,32,40,40,65,32,58,56,56,57,32,40,40,40,83,39,+32,66,41,32,40,66,39,32,115,101,113,41,41,32,40,40,66,32,40,40,+83,39,32,66,41,32,115,101,113,41,41,32,40,40,66,32,40,66,32,40,+83,32,115,101,113,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+80,41,41,41,41,41,32,40,40,65,32,58,56,57,48,32,40,40,40,95,+49,53,56,56,32,40,95,49,53,57,50,32,95,56,57,48,41,41,32,40,+85,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,+52,54,51,41,32,40,95,49,53,57,48,32,40,95,51,57,49,32,95,49,+52,57,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,+32,40,40,79,32,35,52,52,41,32,75,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,49,53,57,+48,32,95,50,56,51,41,41,41,32,40,40,66,32,40,95,52,54,51,32,+40,40,79,32,35,53,56,41,32,75,41,41,41,32,40,95,49,53,57,48,+32,95,50,56,51,41,41,41,41,41,41,41,32,40,95,49,53,57,52,32,+95,56,57,48,41,41,41,32,40,40,65,32,58,56,57,49,32,40,40,40,+83,39,32,66,41,32,115,101,113,41,32,80,41,41,32,40,40,65,32,58,+56,57,50,32,40,40,95,50,48,49,32,40,40,67,32,66,41,32,40,90,+32,40,40,67,32,66,41,32,40,90,32,40,95,50,48,50,32,95,49,51,+51,41,41,41,41,41,41,32,40,95,50,48,53,32,95,56,57,50,41,41,+41,32,40,40,65,32,58,56,57,51,32,40,40,40,40,40,40,40,40,95,+52,57,52,32,95,56,57,50,41,32,40,40,67,32,66,41,32,40,90,32,+40,40,67,32,66,41,32,40,90,32,40,95,52,57,54,32,95,49,51,52,+41,41,41,41,41,41,32,40,40,67,32,66,41,32,40,90,32,40,40,67,+32,66,41,32,40,90,32,40,95,52,57,55,32,95,49,51,52,41,41,41,+41,41,41,32,40,40,67,32,66,41,32,40,90,32,40,40,67,32,66,41,+32,40,90,32,40,95,52,57,56,32,95,49,51,52,41,41,41,41,41,41,+32,40,40,67,32,66,41,32,40,90,32,40,40,67,32,66,41,32,40,90,+32,40,95,52,57,57,32,95,49,51,52,41,41,41,41,41,41,32,40,40,+67,32,66,41,32,40,90,32,40,40,67,32,66,41,32,40,90,32,40,95,+53,48,48,32,95,49,51,52,41,41,41,41,41,41,32,40,95,53,48,56,+32,95,56,57,51,41,41,32,40,95,53,48,57,32,95,56,57,51,41,41,+41,32,40,40,65,32,58,56,57,52,32,40,40,40,95,49,53,56,56,32,+40,95,49,53,57,50,32,95,56,57,52,41,41,32,95,57,48,50,41,32,+40,95,49,53,57,52,32,95,56,57,52,41,41,41,32,40,40,65,32,58,+56,57,53,32,40,40,40,95,56,56,57,32,75,41,32,35,48,41,32,35,+48,41,41,32,40,40,65,32,58,56,57,54,32,40,85,32,40,75,32,40,+40,40,67,39,32,66,41,32,40,40,67,32,40,40,67,32,61,61,41,32,+35,48,41,41,32,95,49,50,52,41,41,32,40,40,67,32,40,40,67,32,+40,40,67,32,61,61,41,32,35,48,41,41,32,95,49,50,52,41,41,32,+95,49,50,53,41,41,41,41,41,32,40,40,65,32,58,56,57,55,32,40,+95,56,57,49,32,95,56,57,53,41,41,32,40,40,65,32,58,56,57,56,+32,95,56,57,49,41,32,40,40,65,32,58,56,57,57,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,40,67,39,32,40,67,39,32,95,+56,57,49,41,41,41,32,95,56,56,57,41,41,41,32,40,40,65,32,58,+57,48,48,32,40,85,32,65,41,41,32,40,40,65,32,58,57,48,49,32,+40,40,66,32,85,41,32,40,90,32,95,56,57,49,41,41,41,32,40,40,+65,32,58,57,48,50,32,40,85,32,65,41,41,32,40,40,65,32,58,57,+48,51,32,40,85,32,40,75,32,95,49,53,51,53,41,41,41,32,40,40,+65,32,58,57,48,52,32,40,40,66,32,85,41,32,40,90,32,40,95,50,+48,50,32,95,49,51,51,41,41,41,41,32,40,40,65,32,58,57,48,53,+32,40,40,67,32,66,41,32,40,90,32,40,40,67,32,66,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,95,56,57,49,41,41,32,40,40,40,+67,39,32,66,41,32,95,52,54,51,41,32,40,95,52,54,51,32,40,40,+79,32,35,52,54,41,32,75,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,57,48,54,32,73,41,32,40,40,65,32,58,57,48,55,32,40,40,+67,32,66,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,56,57,+49,41,41,32,40,67,32,95,52,54,51,41,41,41,41,32,40,40,65,32,+58,57,48,56,32,40,40,83,32,40,85,32,75,41,41,32,40,40,66,32,+90,41,32,40,40,40,83,39,32,67,41,32,40,67,32,95,57,49,50,41,+41,32,40,40,67,32,40,40,83,32,40,95,52,50,53,32,40,40,67,32,+40,95,50,48,51,32,95,49,51,49,41,41,32,35,52,54,41,41,41,32,+73,41,41,32,40,40,40,67,39,32,66,41,32,40,40,67,32,40,40,67,+32,61,61,41,32,35,52,54,41,41,32,95,50,53,41,41,32,95,57,48,+56,41,41,41,41,41,41,32,40,40,65,32,58,57,48,57,32,40,85,32,+40,40,40,67,39,32,66,41,32,95,56,57,49,41,32,95,57,48,56,41,+41,41,32,40,40,65,32,58,57,49,48,32,40,85,32,40,75,32,40,40,+40,83,39,32,40,40,83,39,32,95,49,50,48,41,32,95,49,51,57,41,+41,32,40,40,66,32,40,40,83,39,32,95,49,50,48,41,32,40,40,67,+32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,53,56,41,41,41,+32,40,40,66,32,40,40,67,39,32,95,49,50,48,41,32,40,40,67,32,+40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,52,41,41,41,32,+40,40,40,83,39,32,95,49,50,48,41,32,40,40,67,32,40,95,50,48,+50,32,95,49,51,51,41,41,32,34,91,93,34,41,41,32,40,40,67,32,+40,95,50,48,50,32,95,49,51,51,41,41,32,34,40,41,34,41,41,41,+41,41,32,95,52,50,56,41,41,41,41,32,40,40,65,32,58,57,49,49,+32,40,40,67,32,40,95,52,51,50,32,95,49,51,49,41,41,32,34,64,+92,57,50,38,61,43,45,58,60,62,46,33,35,36,37,94,38,42,47,124,+126,63,34,41,41,32,40,40,65,32,58,57,49,50,32,40,40,40,83,39,+32,95,49,50,48,41,32,95,57,49,51,41,32,40,40,40,83,39,32,95,+49,50,48,41,32,95,49,51,57,41,32,40,40,40,83,39,32,95,49,50,+48,41,32,95,49,52,49,41,32,40,40,67,32,40,95,50,48,50,32,95,+49,51,49,41,41,32,35,51,57,41,41,41,41,41,32,40,40,65,32,58,+57,49,51,32,40,40,40,83,39,32,95,49,50,48,41,32,95,49,51,56,+41,32,40,40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,+57,53,41,41,41,32,40,40,65,32,58,57,49,52,32,40,95,56,57,55,+32,40,40,79,32,35,57,53,41,32,75,41,41,41,32,40,40,65,32,58,+57,49,53,32,40,85,32,40,75,32,40,40,80,32,95,49,50,52,41,32,+40,40,40,67,39,32,66,41,32,40,40,67,32,40,40,67,32,61,61,41,+32,35,57,53,41,41,32,95,49,50,52,41,41,32,40,40,80,32,95,49,+50,53,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,41,+41,41,32,40,40,65,32,58,57,49,54,32,40,85,32,40,40,67,32,40,+40,40,83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,95,51,57,+50,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,+32,95,52,54,51,41,32,40,95,49,53,57,48,32,40,95,51,57,49,32,+95,49,52,57,41,41,41,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,95,49,50,+49,41,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,41,41,32,+35,48,41,41,41,32,40,40,67,32,40,95,50,48,50,32,95,50,56,49,+41,41,32,35,48,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,34,58,32,108,105,110,101,32,34,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,49,53,57,48,+32,95,50,56,51,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,+44,32,99,111,108,32,34,41,41,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,41,41,41,41,32,75,41,41,41,41,32,34,110,111,32,108,111,+99,97,116,105,111,110,34,41,41,41,32,40,40,65,32,58,57,49,55,32,+40,90,32,75,41,41,32,40,40,65,32,58,57,49,56,32,40,40,66,32,+90,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,32,40,+40,65,32,58,57,49,57,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,32,40,+40,65,32,58,57,50,48,32,95,57,49,55,41,32,40,40,65,32,58,57,+50,49,32,95,57,49,56,41,32,40,40,65,32,58,57,50,50,32,40,40,+95,50,54,51,32,40,95,51,57,53,32,95,53,54,54,41,41,32,95,57,+50,51,41,41,32,40,40,65,32,58,57,50,51,32,40,40,67,32,40,89,+32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,67,32,83,41,32,+40,40,67,39,32,40,67,39,32,95,52,54,50,41,41,32,80,41,41,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,+41,32,66,39,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,52,54,50,41,+41,32,80,41,41,41,41,32,67,41,41,41,41,41,41,32,95,52,54,49,+41,41,32,40,40,65,32,58,57,50,52,32,40,95,57,50,53,32,95,50,+54,53,41,41,32,40,40,65,32,58,57,50,53,32,40,40,40,67,39,32,+95,51,57,55,41,32,40,40,66,32,95,50,54,56,41,32,95,57,51,48,+41,41,32,95,57,50,48,41,41,32,40,40,65,32,58,57,50,54,32,40,+40,67,32,40,40,80,32,35,48,41,32,40,75,32,40,75,32,35,49,41,+41,41,41,32,40,75,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+40,40,65,32,58,57,50,55,32,40,40,40,83,39,32,40,83,39,32,40,+83,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,41,32,40,40,67,32,40,40,40,67,+39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,+41,32,83,39,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,+41,32,40,40,66,32,40,66,32,85,41,41,32,95,57,49,56,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,40,90,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,40,83,39,32,67,39,41,32,95,57,49,+57,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,52,55,+57,32,95,50,55,55,41,41,32,40,40,40,67,39,32,40,95,52,55,57,+32,95,50,55,55,41,41,32,95,57,50,54,41,32,35,49,41,41,41,32,+95,57,50,54,41,41,41,41,32,73,41,41,41,32,40,40,65,32,58,57,+50,56,32,40,40,66,32,89,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,67,41,32,40,40,66,32,40,80,32,95,52,55,54,41,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,67,+39,41,41,32,40,40,40,67,39,32,67,41,32,40,95,52,57,54,32,95,+56,57,51,41,41,32,95,52,55,54,41,41,32,95,52,55,55,41,41,32,+95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,41,32,40,66,39,32,40,40,66,+32,67,41,32,40,95,52,57,54,32,95,56,57,51,41,41,41,41,32,95,+52,55,55,41,41,32,73,41,41,41,41,41,32,40,40,65,32,58,57,50,+57,32,40,95,57,51,48,32,95,50,54,53,41,41,32,40,40,65,32,58,+57,51,48,32,40,40,66,32,40,66,32,40,66,32,89,41,41,41,32,40,+40,66,32,40,40,83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,80,41,41,32,95,57,49,56,41,41,32,40,40,40,67,39,32,66,+41,32,66,41,32,40,40,40,67,39,32,67,41,32,40,40,95,57,49,57,+32,95,57,49,55,41,32,35,49,41,41,32,95,57,49,55,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,41,41,41,41,32,+40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,+40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,83,39,32,83,39,41,41,32,40,40,66,32,40,+66,32,83,39,41,41,32,40,95,52,57,54,32,95,56,57,51,41,41,41,+41,41,32,40,66,32,95,57,51,55,41,41,41,41,41,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,67,32,95,+57,50,55,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,95,57,51,55,41,41,41,41,41,41,32,40,40,+65,32,58,57,51,49,32,40,40,66,32,89,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,83,32,40,85,32,+95,57,49,55,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,67,41,32,+40,40,40,67,39,32,40,67,39,32,40,95,50,48,50,32,95,53,49,48,+41,41,41,32,40,95,52,57,54,32,95,56,57,51,41,41,32,95,53,49,+53,41,41,41,32,95,57,49,55,41,41,41,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,83,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,67,39,41,41,32,+40,40,66,32,40,66,32,83,39,41,41,32,40,95,52,57,54,32,95,56,+57,51,41,41,41,41,41,32,40,66,32,95,57,51,55,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,67,+32,40,67,39,32,83,39,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,+40,83,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,40,67,39,32,83,39,41,41,32,85,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+41,32,40,40,40,83,39,32,83,41,32,40,40,83,32,40,40,40,67,39,+32,83,39,41,32,40,40,66,32,40,95,52,57,57,32,95,50,56,50,41,+41,32,95,57,50,54,41,41,32,95,57,50,54,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,+40,67,39,32,83,39,41,32,95,57,50,55,41,32,40,85,32,40,90,32,+75,41,41,41,41,32,40,85,32,40,75,32,75,41,41,41,41,32,40,85,+32,40,75,32,65,41,41,41,41,32,95,57,51,50,41,41,41,32,40,40,+66,32,40,67,32,40,67,32,40,40,83,32,40,40,40,83,39,32,95,57,+50,55,41,32,40,85,32,40,75,32,65,41,41,41,32,40,85,32,40,90,+32,75,41,41,41,41,32,40,85,32,40,75,32,75,41,41,41,41,41,41,+32,95,57,51,51,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,32,95,57,51,55,41,41,41,41,41,41,+32,40,40,65,32,58,57,51,50,32,40,40,67,32,40,40,80,32,95,50,+53,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,80,41,32,+95,57,49,55,41,41,41,32,40,90,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,66,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,+32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,66,39,32,95,57,51,50,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,41,32,40,+67,32,95,57,51,55,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,57,51,51,32,40,40,67,32,40,40,80,32,95,50,53,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,80,41,32,95,57,49,55,41,+41,41,32,40,90,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,40,67,39,32,40,67,39,32,67,41,41,32,80,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,32,95,57,51,51,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,67,41,41,32,80,41,41,41,41,41,32,95,57,51,55,41,41,41,+41,41,41,32,40,40,65,32,58,57,51,52,32,35,51,41,32,40,40,65,+32,58,57,51,53,32,35,50,41,32,40,40,65,32,58,57,51,54,32,35,+48,41,32,40,40,65,32,58,57,51,55,32,40,40,66,32,89,41,32,40,+40,40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,+41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,+40,40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,40,95,52,+57,56,32,95,50,56,50,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,52,55,57,32,95,50,55,55,41,41,32,95,57,50,+54,41,41,32,95,57,50,54,41,41,32,35,49,41,41,41,41,41,32,40,+40,40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,40,83,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,66,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,+40,67,39,32,40,67,39,32,95,57,51,55,41,41,32,40,40,40,67,39,+32,67,41,32,40,40,95,57,49,57,32,95,57,49,55,41,32,35,49,41,+41,32,95,57,49,55,41,41,41,41,41,41,32,40,90,32,40,90,32,40,+90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,82,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,66,32,66,39,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,95,57,49,57,32,95,57,+49,55,41,32,35,49,41,41,32,95,57,49,55,41,41,41,41,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,83,41,32,40,40,+66,32,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,+95,57,50,54,41,41,32,40,40,40,67,39,32,40,95,52,55,57,32,95,+50,55,55,41,41,32,40,40,66,32,40,40,95,52,56,49,32,95,50,55,+55,41,32,95,57,51,52,41,41,32,95,57,50,54,41,41,32,95,57,51,+54,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,83,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,40,67,39,32,83,39,41,32,40,40,66,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,57,50,54,41,41,32,40,40,40,67,39,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,40,40,66,32,40,40,95,52,+56,49,32,95,50,55,55,41,32,95,57,51,52,41,41,32,95,57,50,54,+41,41,32,95,57,51,54,41,41,41,41,32,95,57,50,55,41,41,32,40,+40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,80,32,+95,50,53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,40,95,52,+57,55,32,95,50,56,50,41,41,32,95,57,50,54,41,41,32,40,40,66,+32,40,40,95,52,56,49,32,95,50,55,55,41,32,95,57,51,53,41,41,+32,95,57,50,54,41,41,41,41,41,41,41,32,95,57,52,49,41,41,32,+95,57,51,57,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,83,32,40,40,80,32,95,50,53,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,90,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,+83,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,67,32,40,40,40,67,39,32,+67,39,41,32,40,40,66,32,40,95,52,57,55,32,95,50,56,50,41,41,+32,95,57,50,54,41,41,32,40,40,66,32,40,40,95,52,56,49,32,95,+50,55,55,41,32,95,57,51,53,41,41,32,95,57,50,54,41,41,41,41,+41,41,41,32,95,57,52,48,41,41,32,95,57,51,56,41,41,41,41,41,+41,41,41,41,41,32,95,57,50,55,41,41,41,32,40,40,65,32,58,57,+51,56,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,40,80,32,+95,50,53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,95,57,50,55,41,41,41,41,32,95,+57,50,55,41,41,41,41,32,40,40,65,32,58,57,51,57,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,80,32,95,50,+53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,95,57,50,55,41,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,40,40,66,32,67,41,32,40,67,32,95,57,50,55,41,41,41,41,+41,41,41,32,40,40,65,32,58,57,52,48,32,40,40,66,32,40,66,32,+40,66,32,40,67,32,40,40,80,32,95,50,53,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,83,39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,83,39,41,+32,40,85,32,95,50,53,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,66,39,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,67,39,32,67,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,95,57,50,55,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,95,57,50,55,41,32,95,57,49,55,+41,41,41,41,41,41,32,40,95,57,50,55,32,95,57,49,55,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,+40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,57,50,55,41,+41,41,41,32,95,57,50,55,41,41,41,41,41,32,40,40,66,32,40,66,+32,67,41,41,32,40,40,66,32,67,41,32,40,67,32,95,57,50,55,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,52,49,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,80,32,95,+50,53,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,80,32,95,50,53,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,57,50,55,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,95,57,50,55,41,32,95,57,49,55,41,41,41,+41,41,41,32,40,95,57,50,55,32,95,57,49,55,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,95,57,50,55,41,41,41,41,32,95,57,50,55,41,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,41,32,40,+67,32,95,57,50,55,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,57,52,50,32,40,85,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,95,51,51,32,95,49,52,53,50,41,32,40,40,95,50,54,49,32,40,+40,95,52,53,32,95,49,52,53,50,41,32,40,95,49,50,50,32,95,49,+51,51,57,41,41,41,32,40,95,50,52,32,34,73,110,116,101,114,97,99,+116,105,118,101,32,109,104,115,32,110,111,116,32,97,118,97,105,108,97,98,+108,101,32,119,104,101,110,32,99,111,109,112,105,108,101,100,32,119,105,116,+104,32,103,104,99,34,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,49,52,+53,50,41,32,40,95,49,52,55,50,32,34,87,101,108,99,111,109,101,32,+116,111,32,105,110,116,101,114,97,99,116,105,118,101,32,77,105,99,114,111,+72,115,33,34,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,40,40,83,39,32,40,95,51,50,32,95,+49,52,53,50,41,41,32,95,54,49,52,41,32,40,40,40,67,39,32,40,+67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,40,40,66,+32,40,66,32,40,95,49,48,56,57,32,95,57,52,52,41,41,41,32,40,+40,66,32,67,41,32,40,80,32,95,57,52,51,41,41,41,41,32,40,75,+32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,49,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,95,54,48,48,41,32,95,49,50,53,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,52,51,32,40,40,95,52,54,+51,32,34,109,111,100,117,108,101,32,34,41,32,40,40,95,52,54,51,32,+95,57,53,49,41,32,40,40,95,52,54,51,32,34,40,109,111,100,117,108,+101,32,34,41,32,40,40,95,52,54,51,32,95,57,53,49,41,32,34,41,+32,119,104,101,114,101,92,49,48,38,105,109,112,111,114,116,32,80,114,101,+108,117,100,101,92,49,48,38,100,101,102,97,117,108,116,32,40,73,110,116,+101,103,101,114,44,32,68,111,117,98,108,101,41,92,49,48,38,34,41,41,+41,41,41,32,40,40,65,32,58,57,52,52,32,40,40,40,95,51,51,32,+95,49,48,57,50,41,32,95,57,52,56,41,32,40,40,40,95,51,51,32,+95,49,48,57,50,41,32,40,40,95,50,54,49,32,95,49,48,57,56,41,+32,40,95,49,52,55,50,32,34,84,121,112,101,32,39,58,113,117,105,116,+39,32,116,111,32,113,117,105,116,44,32,39,58,104,101,108,112,39,32,102,+111,114,32,104,101,108,112,34,41,41,41,32,95,57,52,53,41,41,41,32,+40,40,65,32,58,57,52,53,32,40,40,40,95,51,50,32,95,49,48,57,+50,41,32,40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,40,95,+49,52,50,49,32,34,46,109,104,115,105,34,41,32,34,62,32,34,41,41,+41,32,40,40,80,32,95,57,52,53,41,32,40,40,83,32,40,85,32,95,+57,52,53,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,67,32,40,40,67,32,61,61,41,32,35,53,56,41,41,+41,32,40,40,40,67,39,32,40,95,51,51,32,95,49,48,57,50,41,41,+32,95,57,53,53,41,32,95,57,52,53,41,41,41,32,40,40,40,67,39,+32,40,95,51,50,32,95,49,48,57,50,41,41,32,95,57,52,54,41,32,+40,40,80,32,40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,95,+49,52,55,50,32,34,66,121,101,34,41,41,41,32,95,57,52,53,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,52,54,32,40,40,67,32,40,+40,67,32,95,49,54,48,56,41,32,40,40,95,51,52,32,95,49,48,57,+50,41,32,95,49,50,53,41,41,41,32,40,40,66,32,40,40,67,39,32,+40,83,32,40,85,32,40,40,40,95,51,51,32,95,49,48,57,50,41,32,+40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,95,49,52,55,50,+32,34,85,110,114,101,99,111,103,110,105,122,101,100,32,99,111,109,109,97,+110,100,34,41,41,41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,+95,49,50,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,+66,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,67,32,67,+39,41,41,32,40,40,66,32,85,41,32,95,49,54,48,57,41,41,41,41,+32,40,90,32,40,90,32,40,40,40,67,39,32,40,95,51,51,32,95,49,+48,57,50,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,+56,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,+41,32,40,40,66,32,40,95,52,54,51,32,34,65,109,98,105,103,117,111,+117,115,32,99,111,109,109,97,110,100,58,32,34,41,41,32,40,40,66,32,+95,49,54,48,57,41,32,40,95,51,57,53,32,95,53,54,53,41,41,41,+41,41,41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,95,49,50,+53,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,95,51,57,+54,41,32,40,40,40,67,39,32,95,50,54,51,41,32,40,95,52,49,56,+32,95,49,51,49,41,41,32,95,53,54,53,41,41,32,95,57,52,55,41,+41,41,41,32,40,40,65,32,58,57,52,55,32,40,40,79,32,40,40,80,+32,34,113,117,105,116,34,41,32,40,40,95,50,54,49,32,95,50,54,53,+41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,95,49,50,52,41,+41,41,41,32,40,40,79,32,40,40,80,32,34,99,108,101,97,114,34,41,+32,40,40,95,50,54,49,32,95,50,54,53,41,32,40,40,40,95,51,51,+32,95,49,48,57,50,41,32,40,95,57,53,48,32,40,95,50,54,53,32,+95,57,52,51,41,41,41,32,40,40,40,95,51,51,32,95,49,48,57,50,+41,32,40,40,95,50,54,49,32,95,49,48,57,53,41,32,40,85,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+80,41,32,95,54,49,49,41,41,41,41,41,32,40,40,95,51,52,32,95,+49,48,57,50,41,32,95,49,50,53,41,41,41,41,41,41,32,40,40,79,+32,40,40,80,32,34,114,101,108,111,97,100,34,41,32,40,40,95,50,54,+49,32,95,50,54,53,41,32,40,40,40,95,51,51,32,95,49,48,57,50,+41,32,40,40,95,50,54,49,32,95,49,48,57,53,41,32,40,85,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+80,41,32,95,54,49,49,41,41,41,41,41,32,40,40,40,95,51,51,32,+95,49,48,57,50,41,32,95,57,52,56,41,32,40,40,95,51,52,32,95,+49,48,57,50,41,32,95,49,50,53,41,41,41,41,41,41,32,40,40,79,+32,40,40,80,32,34,100,101,108,101,116,101,34,41,32,40,40,40,67,39,+32,40,95,51,51,32,95,49,48,57,50,41,41,32,40,40,66,32,95,57,+53,48,41,32,40,40,66,32,40,95,50,54,51,32,95,49,54,48,55,41,+41,32,40,40,40,67,39,32,95,50,54,51,41,32,40,40,66,32,95,51,+57,54,41,32,40,40,66,32,40,95,50,54,51,32,95,49,50,50,41,41,+32,40,95,52,49,56,32,95,49,51,49,41,41,41,41,32,95,49,54,48,+54,41,41,41,41,32,40,40,95,51,52,32,95,49,48,57,50,41,32,95,+49,50,53,41,41,41,41,32,40,40,79,32,40,40,80,32,34,104,101,108,+112,34,41,32,40,75,32,40,40,40,95,51,51,32,95,49,48,57,50,41,+32,40,40,95,50,54,49,32,95,49,48,57,56,41,32,40,95,49,52,55,+50,32,95,57,52,57,41,41,41,32,40,40,95,51,52,32,95,49,48,57,+50,41,32,95,49,50,53,41,41,41,41,41,32,75,41,41,41,41,41,41,+32,40,40,65,32,58,57,52,56,32,40,40,40,95,51,50,32,95,49,48,+57,50,41,32,95,49,48,57,55,41,32,40,85,32,40,90,32,40,90,32,+40,40,40,67,39,32,40,95,51,50,32,95,49,48,57,50,41,41,32,95,+57,53,54,41,32,40,40,80,32,40,40,66,32,40,95,50,54,49,32,95,+49,48,57,56,41,41,32,95,57,53,52,41,41,32,40,75,32,40,40,95,+51,52,32,95,49,48,57,50,41,32,95,49,51,52,49,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,57,52,57,32,34,67,111,109,109,97,+110,100,115,58,92,49,48,38,32,32,58,113,117,105,116,32,32,32,32,32,+32,113,117,105,116,32,77,105,99,114,111,72,115,92,49,48,38,32,32,58,+114,101,108,111,97,100,32,32,32,32,114,101,108,111,97,100,32,109,111,100,+117,108,101,115,92,49,48,38,32,32,58,99,108,101,97,114,32,32,32,32,+32,99,108,101,97,114,32,97,108,108,32,100,101,102,105,110,105,116,105,111,+110,115,92,49,48,38,32,32,58,100,101,108,101,116,101,32,100,32,32,100,+101,108,101,116,101,32,100,101,102,105,110,105,116,105,111,110,40,115,41,32,+100,92,49,48,38,32,32,58,104,101,108,112,32,32,32,32,32,32,116,104,+105,115,32,116,101,120,116,92,49,48,38,32,32,101,120,112,114,32,32,32,+32,32,32,32,101,118,97,108,117,97,116,101,32,101,120,112,114,101,115,115,+105,111,110,92,49,48,38,32,32,100,101,102,110,32,32,32,32,32,32,32,+97,100,100,32,116,111,112,32,108,101,118,101,108,32,100,101,102,105,110,105,+116,105,111,110,92,49,48,38,34,41,32,40,40,65,32,58,57,53,48,32,+40,40,66,32,40,95,50,54,49,32,95,49,48,57,53,41,41,32,40,40,+66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,41,32,+40,66,32,80,41,41,41,41,41,32,40,40,65,32,58,57,53,49,32,34,+73,110,116,101,114,97,99,116,105,118,101,34,41,32,40,40,65,32,58,57,+53,50,32,34,95,105,116,34,41,32,40,40,65,32,58,57,53,51,32,40,+40,66,32,40,95,52,54,51,32,95,57,53,50,41,41,32,40,40,66,32,+40,95,52,54,51,32,34,32,58,58,32,73,79,32,40,41,92,49,48,38,+34,41,41,32,40,40,66,32,40,95,52,54,51,32,95,57,53,50,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,32,61,32,112,114,105,110,116,+79,114,82,117,110,32,40,34,41,41,32,40,40,67,32,95,52,54,51,41,+32,34,41,92,49,48,38,34,41,41,41,41,41,41,32,40,40,65,32,58,+57,53,52,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,+41,32,40,95,52,54,51,32,34,69,114,114,111,114,58,32,34,41,41,41,+32,40,40,65,32,58,57,53,53,32,40,40,66,32,40,40,95,51,50,32,+95,49,48,57,50,41,32,95,49,48,57,55,41,41,32,40,40,66,32,85,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,40,83,+39,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,40,40,95,57,57,55,32,95,57,57,57,+41,32,75,41,41,41,41,32,40,40,66,32,90,41,32,40,40,40,83,39,+32,66,41,32,40,40,67,32,40,40,95,57,57,55,32,95,49,48,48,48,+41,32,75,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,48,57,+56,41,41,32,40,40,66,32,95,57,53,52,41,32,95,50,54,41,41,41,+41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,40,+95,51,50,32,95,49,48,57,50,41,41,41,32,40,40,66,32,40,66,32,+95,57,53,54,41,41,32,40,40,66,32,40,67,32,95,52,54,51,41,41,+32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,49,48,41,32,+75,41,41,41,32,95,57,53,51,41,41,41,41,32,40,40,80,32,40,40,+66,32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,95,57,53,52,+41,41,32,95,57,53,55,41,41,41,41,41,41,41,32,40,90,32,40,40,+40,83,39,32,40,95,51,50,32,95,49,48,57,50,41,41,32,95,57,53,+54,41,32,40,40,66,32,40,80,32,40,40,66,32,40,95,50,54,49,32,+95,49,48,57,56,41,41,32,95,57,53,52,41,41,41,32,40,90,32,40,+40,66,32,95,57,53,48,41,32,95,50,54,53,41,41,41,41,41,41,41,+32,40,40,66,32,40,67,32,95,52,54,51,41,41,32,40,40,67,32,95,+52,54,51,41,32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,57,53,54,32,40,40,66,32,40,40,+95,51,50,32,95,49,48,57,50,41,32,95,49,48,57,55,41,41,32,40,+40,66,32,85,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,66,39,32,+40,40,66,32,40,95,51,51,32,95,49,48,57,50,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,40,95,49,52,55,+52,32,40,40,95,52,54,51,32,95,57,53,49,41,32,34,46,104,115,34,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,+39,32,40,83,39,32,40,95,51,50,32,95,49,48,57,50,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,48,+57,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,+54,49,32,95,50,56,41,41,41,41,32,40,40,66,32,67,41,32,95,54,+49,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,80,+32,40,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,32,95,49,+55,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,40,95,51,51,+32,95,49,48,57,50,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,95,49,48,57,54,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,+32,40,66,32,67,41,41,32,80,41,41,41,32,95,54,49,50,41,41,41,+41,32,40,40,66,32,40,95,51,52,32,95,49,48,57,50,41,41,32,95,+49,55,53,41,41,41,41,41,41,41,32,40,95,56,57,55,32,95,57,53,+49,41,41,41,41,41,32,40,40,65,32,58,57,53,55,32,40,40,66,32,+40,40,40,67,39,32,40,95,51,50,32,95,49,48,57,50,41,41,32,40,+40,66,32,40,95,50,54,49,32,95,49,48,57,56,41,41,32,40,40,66,+32,95,50,56,41,32,40,40,83,32,95,49,52,56,49,41,32,40,95,51,+52,32,95,49,52,53,50,41,41,41,41,41,32,40,40,66,32,40,95,50,+54,49,32,95,49,48,57,56,41,41,32,40,40,80,32,95,57,53,52,41,+32,40,40,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,+95,50,56,41,32,40,40,80,32,95,57,53,52,41,32,40,75,32,40,40,+95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,49,41,41,41,41,+41,41,41,41,32,40,40,66,32,95,49,54,49,51,41,32,40,40,66,32,+95,49,49,48,50,41,32,40,80,32,40,95,56,57,55,32,40,40,95,52,+54,51,32,95,57,53,49,41,32,40,40,95,52,54,51,32,40,40,79,32,+35,52,54,41,32,75,41,41,32,95,57,53,50,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,57,53,56,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,80,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,+53,57,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,57,54,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,57,54,49,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,+54,50,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,54,51,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,+54,52,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,57,54,53,32,40,90,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,40,66,32,90,41,32,85,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,54,54,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,85,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,54,55,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,40,66,32,40,66,+32,40,95,52,51,49,32,40,40,79,32,35,52,54,41,32,75,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,40,67,+32,79,41,32,75,41,41,41,41,41,32,40,75,32,40,95,49,53,57,48,+32,40,95,51,57,49,32,95,49,52,57,41,41,41,41,41,32,40,75,32,+40,95,49,53,57,48,32,95,49,52,57,41,41,41,41,32,40,75,32,40,+95,49,53,57,48,32,95,51,48,55,41,41,41,41,32,40,75,32,40,95,+49,53,57,48,32,40,95,53,50,49,32,95,51,48,55,41,41,41,41,41,+32,40,75,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,75,32,+40,95,52,54,51,32,34,69,82,82,79,82,32,34,41,41,41,41,32,40,+75,32,34,84,66,114,97,99,101,34,41,41,41,32,40,75,32,34,84,73,+110,100,101,110,116,34,41,41,41,32,40,40,65,32,58,57,54,56,32,40,+85,32,40,90,32,40,40,40,67,39,32,80,41,32,40,40,67,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,+41,41,41,32,40,40,65,32,58,57,54,57,32,40,40,67,32,66,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,67,32,40,+95,52,55,57,32,95,50,55,55,41,41,41,41,41,32,40,40,65,32,58,+57,55,48,32,80,41,32,40,40,65,32,58,57,55,49,32,40,85,32,65,+41,41,32,40,40,65,32,58,57,55,50,32,40,40,95,50,54,51,32,40,+95,57,56,53,32,95,52,54,49,41,41,32,40,95,57,55,51,32,40,40,+95,57,55,48,32,35,49,41,32,35,49,41,41,41,41,32,40,40,65,32,+58,57,55,51,32,40,40,66,32,89,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,+40,67,32,61,61,41,32,35,51,50,41,41,41,41,32,40,40,66,32,95,+57,55,51,41,32,40,40,67,32,95,57,54,57,41,32,35,49,41,41,41,+41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,+40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,+49,48,41,41,41,41,32,40,40,66,32,40,66,32,95,57,55,56,41,41,+32,40,40,66,32,95,57,55,51,41,32,95,57,54,56,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,66,32,40,67,+32,83,41,41,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,+32,40,40,67,32,61,61,41,32,35,49,51,41,41,41,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,+40,67,32,61,61,41,32,35,49,50,51,41,41,41,41,32,40,40,66,32,+40,83,32,80,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,+41,41,32,40,40,40,67,39,32,95,57,55,54,41,32,40,40,67,32,95,+57,54,57,41,32,35,50,41,41,32,35,49,41,41,41,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,+40,67,32,61,61,41,32,35,52,53,41,41,41,41,32,40,40,66,32,40,+83,32,80,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,+83,39,41,32,40,40,66,32,83,41,32,40,40,67,39,32,40,40,80,32,+95,49,50,53,41,32,40,90,32,40,40,66,32,95,49,50,50,41,32,95,+57,49,49,41,41,41,41,32,40,85,32,65,41,41,41,41,41,32,40,40,+66,32,40,67,39,32,95,57,55,55,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,57,54,57,41,41,32,40,+40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,+41,32,40,40,66,32,95,52,49,49,41,32,40,85,32,75,41,41,41,41,+41,41,41,32,40,95,52,50,54,32,40,40,67,32,40,95,50,48,50,32,+95,49,51,49,41,41,32,35,52,53,41,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,+40,66,32,40,40,67,39,32,40,83,39,32,66,41,41,32,40,67,32,95,+57,49,51,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,95,52,+50,54,32,95,57,49,50,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,83,39,32,66,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,67,32,95,57,56,51,41,32,95,52,54,49,41,41,+41,32,95,52,54,50,41,41,32,40,40,66,32,40,66,32,95,57,55,51,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,95,57,54,57,41,41,32,40,40,66,32,40,40,95,52,55,57,32,+95,50,55,55,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,+95,51,53,57,32,35,49,41,41,41,41,32,95,52,49,49,41,41,41,41,+41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,83,+32,83,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,32,95,49,+51,57,41,41,41,41,32,40,40,67,32,40,40,83,32,95,57,56,50,41,+32,73,41,41,32,95,52,54,49,41,41,41,41,41,32,40,40,40,83,39,+32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,+40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,+61,41,32,35,52,56,41,41,41,41,32,40,40,66,32,40,83,32,80,41,+41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+67,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,41,+32,95,49,52,55,41,32,35,49,50,48,41,41,41,41,32,95,57,55,52,+41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,+67,32,83,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,52,53,41,41,41,+41,32,40,40,66,32,40,40,83,39,32,83,41,32,85,41,41,32,40,40,+66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,40,66,32,67,41,32,40,67,32,95,49,52,49,41,+41,41,41,32,40,40,67,32,95,57,55,53,41,32,40,40,79,32,35,52,+53,41,32,75,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,83,+41,32,40,40,66,32,40,83,32,83,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+67,41,32,40,67,32,95,49,52,49,41,41,41,41,32,40,40,67,32,95,+57,55,53,41,32,75,41,41,41,41,41,32,40,40,40,83,39,32,83,41,+32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,+32,40,83,39,32,66,41,41,32,40,67,32,95,57,49,49,41,41,41,32,+40,40,66,32,40,66,32,40,67,32,40,95,52,50,54,32,95,57,49,49,+41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,54,50,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,67,32,95,+57,53,56,41,32,95,52,54,49,41,41,41,32,95,52,54,50,41,41,41,+32,40,40,66,32,40,66,32,95,57,55,51,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,57,54,57,41,41,+32,40,40,66,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,+95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,+41,41,41,32,95,52,49,49,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,+32,40,40,67,39,32,40,83,39,32,66,41,41,32,40,67,32,95,57,56,+49,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,52,54,50,41,41,32,95,57,54,51,41,41,32,+40,40,66,32,95,57,55,51,41,32,40,40,67,32,95,57,54,57,41,32,+35,49,41,41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,40,+66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,51,52,+41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,83,32,95,57,55,57,41,32,95,57,53,57,+41,41,32,35,51,52,41,41,32,35,48,41,41,32,95,52,54,49,41,41,+32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,95,52,54,+50,41,41,41,32,40,40,66,32,40,66,32,95,57,55,51,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,57,+54,57,41,41,32,40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,+95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,+41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,83,41,32,40,+40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,51,+57,41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,83,32,95,57,55,57,41,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,80,41,41,32,95,57,+54,48,41,41,32,40,90,32,75,41,41,41,41,32,40,40,67,32,95,57,+54,52,41,32,34,73,108,108,101,103,97,108,32,67,104,97,114,32,108,105,+116,101,114,97,108,34,41,41,41,41,32,35,51,57,41,41,32,35,48,41,+41,32,95,52,54,49,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,40,66,39,32,95,52,54,50,41,41,41,32,40,40,66,32,40,66,32,+95,57,55,51,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,50,54,49,41,32,95,57,54,57,41,41,32,40,40,95,52,55,57,32,+95,50,55,55,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,+95,51,53,57,32,35,50,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,80,32,95,52,54,49,41,41,32,40,40,66,32,90,41,32,40,+40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,57,54,52,41,41,32,40,+40,66,32,40,95,52,54,51,32,34,85,110,114,101,99,111,103,110,105,122,+101,100,32,105,110,112,117,116,58,32,34,41,41,32,40,95,49,53,57,48,+32,95,49,52,57,41,41,41,41,32,75,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,55,52,32,+40,40,66,32,40,67,32,40,95,52,50,54,32,95,49,52,50,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,52,54,50,41,41,32,40,40,40,67,39,32,66,41,32,95,57,+54,49,41,32,95,57,56,54,41,41,41,32,40,40,66,32,40,66,32,95,+57,55,51,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+50,54,49,41,32,95,57,54,57,41,41,32,40,40,40,67,39,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,32,35,50,41,+41,41,41,41,41,32,40,40,65,32,58,57,55,53,32,40,40,66,32,40,+66,32,40,67,32,40,95,52,50,54,32,95,49,52,49,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,83,32,40,40,40,83,39,32,95,49,+50,48,41,32,95,51,57,50,41,32,40,40,40,83,39,32,95,49,50,48,+41,32,40,40,66,32,95,49,50,50,41,32,40,40,40,67,39,32,40,95,+50,48,50,32,95,49,51,49,41,41,32,95,52,50,56,41,32,35,52,54,+41,41,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,51,+41,41,32,40,95,52,48,57,32,35,50,41,41,32,34,46,46,34,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,40,95,52,50,54,32,95,49,52,49,41,41,32,95,52,50,57,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,+40,40,66,32,67,41,32,40,40,66,32,40,40,67,39,32,67,41,32,40,+40,67,32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,83,39,41,+32,40,40,80,32,95,52,55,54,41,32,40,40,40,83,39,32,83,41,32,+40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,83,39,32,+40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,+52,53,41,41,41,41,32,40,40,66,32,40,40,83,39,32,83,41,32,85,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,49,50,49,+41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,41,+32,95,49,52,55,41,32,35,49,48,49,41,41,41,32,95,49,52,49,41,+41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,83,39,32,80,41,+32,40,40,66,32,40,95,52,54,50,32,35,49,48,49,41,41,32,40,40,+66,32,40,95,52,54,50,32,35,52,53,41,41,32,40,85,32,75,41,41,+41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,95,52,50,54,32,+95,49,52,49,41,41,41,41,41,41,41,32,40,40,40,83,39,32,83,41,+32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,+35,52,51,41,41,41,41,32,40,40,66,32,40,40,83,39,32,83,41,32,+85,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,+41,41,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,95,49,50,+49,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,+41,32,95,49,52,55,41,32,35,49,48,49,41,41,41,32,95,49,52,49,+41,41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,83,39,32,80,+41,32,40,40,66,32,40,95,52,54,50,32,35,49,48,49,41,41,32,40,+40,66,32,40,95,52,54,50,32,35,52,51,41,41,32,40,85,32,75,41,+41,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,95,52,50,54,+32,95,49,52,49,41,41,41,41,41,41,41,32,40,40,66,32,40,83,32,+40,85,32,95,52,55,54,41,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,67,32,40,40,40,67,+39,32,67,39,41,32,40,40,66,32,95,49,50,49,41,32,40,40,40,67,+39,32,40,95,50,48,50,32,95,49,51,49,41,41,32,95,49,52,55,41,+32,35,49,48,49,41,41,41,32,95,49,52,49,41,41,32,95,52,55,54,+41,41,32,40,40,66,32,95,52,55,55,41,32,40,40,40,83,39,32,80,+41,32,40,40,66,32,40,95,52,54,50,32,35,49,48,49,41,41,32,40,+85,32,75,41,41,41,32,40,85,32,65,41,41,41,41,41,41,32,40,95,+52,50,54,32,95,49,52,49,41,41,41,41,41,41,41,41,41,32,40,67,+32,80,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,67,32,66,41,41,32,95,52,54,51,41,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,95,+52,54,50,41,41,32,40,40,40,67,39,32,66,41,32,95,57,54,50,41,+32,95,49,54,49,50,41,41,41,32,40,40,66,32,40,66,32,95,57,55,+51,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,+49,41,32,95,57,54,57,41,41,32,95,52,49,49,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,52,54,51,+41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,95,+52,54,50,32,35,52,54,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,40,83,39,32,67,39,41,32,40,40,+66,32,40,83,39,32,95,52,54,50,41,41,32,40,40,40,67,39,32,66,+41,32,95,57,54,49,41,32,95,51,52,53,41,41,41,32,40,40,66,32,+40,67,39,32,95,57,55,51,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,95,57,54,57,41,41,32,95,52,49,+49,41,41,41,41,41,32,95,52,54,51,41,41,41,41,32,40,40,65,32,+58,57,55,54,32,40,40,66,32,89,41,32,40,40,40,83,39,32,40,67,+39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,83,39,+41,32,40,40,67,32,61,61,41,32,35,48,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,32,40,40,+66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,66,32,40,66,32,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,+61,61,41,32,35,49,50,51,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,83,32,80,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,+35,52,53,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,57,55,54,41,32,40,40,67,32,95,57,54,57,41,32,35,50,+41,41,41,32,40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,+32,35,49,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,40,66,32,40,83,39,32,83,41,41,32,40,40,66,32,40,66,32,+40,67,32,83,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,+52,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,83,32,80,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,53,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,57,55,+54,41,32,40,40,67,32,95,57,54,57,41,32,35,50,41,41,41,32,40,+40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,32,35,49,41,41,+41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,83,39,32,83,41,41,32,40,40,66,32,40,66,32,40,67,32,83,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,48,41,41,41,+41,41,32,40,40,66,32,95,57,55,54,41,32,95,57,54,56,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,83,39,32,83,41,41,32,+40,40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,66,32,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,+41,32,35,49,51,41,41,41,41,41,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,80,41,32,40,40,40,67,39,32,79,41,32,40,40,+67,32,95,57,54,52,41,32,34,85,110,99,108,111,115,101,100,32,123,45,+32,99,111,109,109,101,110,116,34,41,41,32,75,41,41,41,32,40,40,66,+32,90,41,32,40,40,66,32,95,57,55,54,41,32,40,40,67,32,95,57,+54,57,41,32,35,49,41,41,41,41,41,41,41,41,41,41,32,95,57,55,+51,41,41,41,32,40,40,65,32,58,57,55,55,32,40,40,66,32,89,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,+32,40,83,32,83,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,+32,40,40,67,32,61,61,41,32,35,49,48,41,41,41,41,41,32,95,57,+55,51,41,41,41,41,41,32,40,40,66,32,40,80,32,95,52,54,49,41,+41,32,75,41,41,41,41,32,40,40,65,32,58,57,55,56,32,40,40,83,+32,40,40,83,32,83,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,40,67,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,75,41,+41,41,41,32,40,40,40,83,39,32,95,52,54,50,41,32,40,40,66,32,+95,57,54,54,41,32,95,57,56,52,41,41,32,73,41,41,41,32,40,40,+65,32,58,57,55,57,32,40,40,66,32,89,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,40,83,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,83,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,+80,41,41,32,40,40,40,67,39,32,66,41,32,95,57,54,52,41,32,40,+40,66,32,40,95,52,54,51,32,34,85,110,109,97,116,99,104,101,100,32,+34,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,32,95,52,+54,49,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,67,32,40,40,67,32,61,61,41,32,35,57,+50,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,83,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,67,32,83,41,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,67,41,32,+40,95,50,48,50,32,95,49,51,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,67,39,32,+80,41,41,32,40,40,67,32,66,41,32,95,52,50,51,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+80,32,40,40,40,110,111,77,97,116,99,104,32,34,115,114,99,47,77,105,+99,114,111,72,115,47,76,101,120,46,104,115,34,41,32,35,49,53,56,41,+32,35,49,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,66,39,41,41,41,32,40,40,67,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,67,32,40,95,52,55,57,32,95,50,+55,55,41,41,32,35,49,41,41,41,41,32,40,67,32,95,52,54,50,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,95,57,56,48,41,+32,40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+66,32,40,66,32,67,41,41,41,41,32,40,67,32,95,52,54,50,41,41,+41,41,41,41,41,32,40,40,65,32,58,57,56,48,32,40,40,40,83,39,+32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,+61,41,32,35,49,49,48,41,41,41,41,32,40,40,66,32,67,41,32,40,+40,66,32,40,80,32,35,49,48,41,41,32,40,40,67,32,40,95,52,55,+57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,41,32,40,40,+40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,+67,32,61,61,41,32,35,49,49,52,41,41,41,41,32,40,40,66,32,67,+41,32,40,40,66,32,40,80,32,35,49,51,41,41,32,40,40,67,32,40,+95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,41,+32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,41,41,+32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,+32,40,40,67,32,61,61,41,32,35,49,49,54,41,41,41,41,32,40,40,+66,32,67,41,32,40,40,66,32,40,80,32,35,57,41,41,32,40,40,67,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,+41,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,67,32,83,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,67,32,40,40,67,32,61,61,41,32,35,57,56,41,41,41,41,32,40,+40,66,32,67,41,32,40,40,66,32,40,80,32,35,56,41,41,32,40,40,+67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,+41,41,41,32,40,40,40,83,39,32,80,41,32,40,40,40,67,39,32,67,+41,32,40,80,32,35,56,56,41,41,32,95,52,54,49,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,40,40,66,32,40,67,32,80,41,41,32,+40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,57,56,49,32,40,40,+67,32,40,95,52,51,50,32,95,49,51,49,41,41,32,34,40,41,91,93,+44,123,125,96,59,34,41,41,32,40,40,65,32,58,57,56,50,32,40,40,+66,32,40,66,32,40,66,32,40,67,32,40,95,52,50,54,32,95,57,49,+50,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,40,83,39,32,83,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,67,32,83,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,67,32,40,40,67,32,61,61,41,32,35,52,54,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,+83,41,32,85,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,+83,39,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,+40,66,32,40,40,83,39,32,67,39,41,32,95,49,51,57,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,66,32,40,40,83,39,32,83,39,41,+32,95,49,51,56,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,67,32,95,57,49,49,41,41,32,40,85,32,95,57,49,49,41,+41,41,41,32,40,85,32,95,57,49,50,41,41,41,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,83,41,41,32,40,40,66,32,40,67,39,32,95,57,56,50,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,+95,57,54,57,41,41,32,40,40,66,32,40,40,95,52,55,57,32,95,50,+55,55,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,+53,57,32,35,49,41,41,41,41,32,95,52,49,49,41,41,41,41,41,32,+40,67,32,95,52,54,50,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,67,39,32,67,41,32,40,67,32,95,52,50,54,+41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,83,39,32,66,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,95,57,56,51,41,41,32,40,40,66,32,40,66,+32,95,52,50,51,41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,57,55,51,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,95,57,54,57,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,66,32,+40,40,95,52,55,57,32,95,50,55,55,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,32,95,+52,49,49,41,41,41,32,95,52,49,49,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,83,39,32,+66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,54,50,41,+41,41,32,40,40,40,67,39,32,66,41,32,95,57,53,56,41,32,95,52,+50,51,41,41,41,41,32,40,40,66,32,40,66,32,95,57,55,51,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,+95,57,54,57,41,41,32,95,52,49,49,41,41,41,41,41,41,32,40,40,+65,32,58,57,56,51,32,40,40,66,32,40,66,32,40,40,83,39,32,67,+41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,+83,39,41,32,40,40,67,32,40,95,52,51,50,32,95,49,51,51,41,41,+32,40,40,79,32,34,108,101,116,34,41,32,40,40,79,32,34,119,104,101,+114,101,34,41,32,40,40,79,32,34,100,111,34,41,32,40,40,79,32,34,+111,102,34,41,32,75,41,41,41,41,41,41,41,32,40,67,32,95,52,54,+50,41,41,41,32,40,40,66,32,40,67,32,95,52,54,50,41,41,32,40,+40,83,32,40,40,83,32,83,41,32,40,40,40,83,39,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,66,+32,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,41,32,40,40,66,32,90,41,32,40,40,67,39,+32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,51,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,+66,32,90,41,32,40,40,40,67,39,32,83,41,32,40,40,66,32,40,67,+32,83,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,+39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,+67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+66,32,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,66,32,90,41,32,40,40,67,+39,32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,51,+41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,+41,41,41,41,32,40,40,40,83,39,32,95,52,54,50,41,32,40,40,66,+32,95,57,54,53,41,32,95,57,56,52,41,41,32,73,41,41,41,41,41,+41,32,40,40,40,83,39,32,95,52,54,50,41,32,40,40,66,32,95,57,+54,53,41,32,95,57,56,52,41,41,32,73,41,41,41,41,41,41,41,32,+95,57,53,56,41,41,32,40,40,65,32,58,57,56,52,32,40,40,80,32,+40,40,95,57,55,48,32,35,48,41,32,35,49,41,41,32,40,90,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,80,32,40,90,32,75,41,41,32,75,41,+41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,+41,32,73,41,41,32,73,41,41,41,41,32,40,40,65,32,58,57,56,53,+32,40,40,66,32,89,41,32,40,40,40,83,39,32,40,83,39,32,83,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,66,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,66,39,32,83,41,41,32,40,40,+66,32,40,40,83,39,32,40,83,39,32,66,41,41,32,66,39,41,41,32,+40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,+67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,40,66,39,32,40,40,66,32,83,41,32,40,67,32,40,95,50,48,+50,32,95,50,56,49,41,41,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,+40,66,32,40,66,32,67,41,41,32,40,40,67,39,32,67,41,32,40,67,+32,40,95,52,57,55,32,95,50,56,50,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,95,52,54,50,41,32,40,40,40,+67,39,32,95,57,54,51,41,32,95,57,56,52,41,32,35,49,50,53,41,+41,41,41,32,40,67,32,95,57,56,53,41,41,41,41,41,41,32,40,40,+83,39,32,95,52,54,50,41,32,40,40,40,67,39,32,95,57,54,51,41,+32,95,57,56,52,41,32,35,53,57,41,41,41,41,32,95,57,55,49,41,+41,41,41,41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,41,32,+90,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,+41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,83,32,+40,40,40,67,39,32,83,39,41,32,83,39,41,32,40,40,67,32,83,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,40,67,39,32,+67,39,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+90,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,83,41,32,40,67,32,40,40,67,32,40,95,52,57,57,+32,95,50,56,50,41,41,32,35,48,41,41,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,95,52,54,50,41,32,40,40,40,67,39,32,+95,57,54,51,41,32,95,57,56,52,41,32,35,49,50,51,41,41,41,32,+40,40,67,39,32,95,57,56,53,41,32,40,40,67,32,79,41,32,75,41,+41,41,41,41,32,95,57,55,49,41,41,41,32,75,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,66,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,67,39,32,+67,39,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,40,+90,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,83,41,41,32,40,40,66,32,67,41,32,40,+67,32,40,95,52,57,57,32,95,50,56,50,41,41,41,41,41,41,32,40,+40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,95,52,54,50,41,+32,40,40,40,67,39,32,95,57,54,51,41,32,95,57,56,52,41,32,35,+49,50,51,41,41,41,41,32,40,40,66,32,40,67,39,32,95,57,56,53,+41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,32,95,57,55,49,+41,41,41,32,75,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,41,32,35,48,+41,41,41,41,32,40,40,67,32,40,83,39,32,66,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,+66,32,40,83,39,32,67,39,41,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,41,+32,35,49,50,53,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,66,41,32,95,52,54,50,41,41,32,95,57,56,53,41,41,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,41,41,41,41,+32,40,40,67,32,83,41,32,40,40,66,32,90,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,49,50,+53,41,41,41,41,32,40,40,40,67,39,32,95,52,54,50,41,32,40,40,+67,32,95,57,54,52,41,32,34,108,97,121,111,117,116,32,101,114,114,111,+114,32,125,34,41,41,32,95,52,54,49,41,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,40,66,32,83,41,32,40,40,66,32,40,67,32,83,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,66,32,40,+40,83,39,32,40,83,39,32,67,39,41,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,80,41,32,40,90,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,+41,32,35,49,50,51,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,95,52,54,50,41,41,32,40,40,66,32,95,57,56,53,+41,32,40,95,52,54,50,32,40,40,95,52,56,53,32,95,50,55,55,41,+32,40,95,51,53,57,32,35,48,41,41,41,41,41,41,41,41,41,32,40,+90,32,75,41,41,41,32,75,41,41,32,75,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,83,32,+73,41,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,40,+67,39,32,83,39,41,32,83,39,41,32,40,40,40,67,39,32,66,41,32,+40,85,32,95,52,54,49,41,41,32,40,90,32,75,41,41,41,41,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,40,40,67,32,67,+39,41,32,40,40,66,32,40,95,52,54,50,32,40,40,95,57,54,51,32,+40,40,95,57,55,48,32,35,48,41,32,35,48,41,41,32,35,49,50,53,+41,41,41,32,40,40,67,32,95,57,56,53,41,32,95,52,54,49,41,41,+41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,40,110,111,77,97,+116,99,104,32,34,115,114,99,47,77,105,99,114,111,72,115,47,76,101,120,+46,104,115,34,41,32,35,50,49,57,41,32,35,49,41,41,41,41,41,32,+40,40,67,39,32,66,41,32,95,52,54,50,41,41,41,41,41,41,41,32,+40,40,65,32,58,57,56,54,32,40,40,95,51,57,57,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,52,55,57,32,95,51,48,56,41,+41,32,40,40,67,32,40,95,52,56,49,32,95,51,48,56,41,41,32,40,+40,95,52,56,53,32,95,51,48,56,41,32,40,95,51,53,57,32,35,49,+54,41,41,41,41,41,32,40,40,66,32,40,95,51,55,50,32,95,50,55,+56,41,41,32,95,49,52,54,41,41,41,32,40,95,51,53,57,32,35,48,+41,41,41,32,40,40,65,32,58,57,56,55,32,34,118,53,46,49,92,49,+48,38,34,41,32,40,40,65,32,58,57,56,56,32,34,48,46,56,34,41,+32,40,40,65,32,58,57,56,57,32,40,40,40,95,51,50,32,95,49,52,+53,50,41,32,95,49,52,50,54,41,32,40,40,66,32,40,40,95,51,50,+32,95,49,52,53,50,41,32,40,95,49,52,50,57,32,34,77,72,83,68,+73,82,34,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,32,40,40,40,83,39,32,83,41,32,40,40,40,67,39,32,67,41,+32,40,40,66,32,40,40,83,39,32,67,39,41,32,40,40,95,52,51,50,+32,95,49,51,51,41,32,34,45,45,118,101,114,115,105,111,110,34,41,41,+41,32,40,40,66,32,40,67,32,40,40,40,67,39,32,83,39,41,32,40,+95,51,57,54,32,40,40,95,50,54,51,32,40,40,67,32,40,95,50,48,+51,32,95,49,51,51,41,41,32,40,40,79,32,35,52,53,41,32,75,41,+41,41,32,40,95,52,48,57,32,35,49,41,41,41,41,32,95,57,52,50,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,80,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,57,57,+48,41,32,40,95,56,57,56,32,40,40,40,95,56,56,57,32,34,99,111,+109,109,97,110,100,45,108,105,110,101,34,41,32,35,48,41,32,35,48,41,+41,41,41,32,40,75,32,40,75,32,40,95,50,52,32,34,85,115,97,103,+101,58,32,109,104,115,32,91,45,118,93,32,91,45,108,93,32,91,45,114,+93,32,91,45,99,93,32,91,45,105,80,65,84,72,93,32,91,45,111,70,+73,76,69,93,32,91,77,111,100,117,108,101,78,97,109,101,93,34,41,41,+41,41,41,41,41,32,40,40,95,50,54,49,32,95,49,52,55,50,41,32,+40,40,95,52,54,51,32,34,77,105,99,114,111,72,115,44,32,118,101,114,+115,105,111,110,32,34,41,32,40,40,95,52,54,51,32,95,57,56,56,41,+32,40,40,95,52,54,51,32,34,44,32,99,111,109,98,105,110,97,116,111,+114,32,102,105,108,101,32,118,101,114,115,105,111,110,32,34,41,32,95,57,+56,55,41,41,41,41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,66,32,+40,83,32,40,40,40,83,39,32,95,54,48,48,41,32,40,40,66,32,95,+52,49,49,41,32,40,95,51,57,54,32,40,40,67,32,40,95,50,48,50,+32,95,49,51,51,41,41,32,34,45,118,34,41,41,41,41,32,40,40,95,+52,51,50,32,95,49,51,51,41,32,34,45,114,34,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,52,54,50,32,40,40,79,32,35,52,54,41,+32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+95,52,54,50,41,32,40,40,67,32,95,52,54,51,41,32,34,47,108,105,+98,34,41,41,41,32,40,40,66,32,95,52,55,50,41,32,40,95,51,57,+53,32,40,40,95,52,49,54,32,95,49,51,49,41,32,34,45,105,34,41,+41,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,52,50,+56,41,41,32,40,40,40,67,39,32,95,52,54,51,41,32,40,40,66,32,+95,52,55,50,41,32,40,95,51,57,53,32,40,40,95,52,49,54,32,95,+49,51,49,41,32,34,45,111,34,41,41,41,41,32,40,40,79,32,34,111,+117,116,46,99,111,109,98,34,41,32,75,41,41,41,41,41,32,40,40,95,+52,51,50,32,95,49,51,51,41,32,34,45,108,34,41,41,41,32,40,40,+95,52,51,50,32,95,49,51,51,41,32,34,45,99,34,41,41,41,41,41,+32,40,95,52,50,52,32,40,40,67,32,40,95,50,48,51,32,95,49,51,+51,41,41,32,34,45,45,34,41,41,41,41,32,40,95,52,55,49,32,40,+40,79,32,35,52,54,41,32,75,41,41,41,41,41,41,32,40,40,65,32,+58,57,57,48,32,40,40,40,67,39,32,83,41,32,40,40,66,32,40,40,+83,39,32,83,39,41,32,95,54,48,54,41,41,32,40,40,66,32,40,40,+83,39,32,40,83,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,+32,95,54,49,53,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,49,52,55,57,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,39,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,66,32,+40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,+40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,+95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,+53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,+50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,116,111,112,32,108,101,118,101,108,32,100,101,102,110,+115,58,32,34,41,41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,+39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,95,51,+51,32,95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,+49,52,53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,54,48,49,41,32,35,49,41,41,41,41,32,40,+40,95,52,52,32,95,49,52,53,50,41,32,40,85,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,57,48,50,+41,41,32,40,40,66,32,40,95,52,54,51,32,34,32,61,32,34,41,41,+32,40,40,67,32,95,54,57,57,41,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,+40,83,39,32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,+95,54,48,50,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,+32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,+40,95,51,51,32,95,49,52,53,50,41,41,32,40,40,40,67,39,32,95,+49,52,56,49,41,32,95,52,49,49,41,32,40,40,95,51,52,32,95,49,+52,53,50,41,32,95,49,51,52,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,+50,41,32,95,49,52,55,57,41,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,+40,40,66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,40,+67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,32,95,54,48,49,+41,32,35,48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,95,49,52,55,50,41,41,41,32,40,40,66,32,40,66,32,40,+95,52,54,51,32,34,102,105,110,97,108,32,112,97,115,115,32,32,32,32,+32,32,32,32,32,32,32,32,34,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,95,52,54,51,41,41,32,40,40,66,32,40,66,32,40,95,49,+54,49,48,32,35,54,41,41,41,32,40,40,66,32,40,66,32,40,95,49,+53,57,48,32,95,50,56,51,41,41,41,32,40,67,32,40,95,52,56,48,+32,95,50,55,55,41,41,41,41,41,32,34,109,115,34,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,83,32,40,40,95,52,50,48,32,95,49,51,49,+41,32,34,46,99,111,109,98,34,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,83,32,40,40,95,52,50,48,32,95,49,51,49,41,32,+34,46,99,34,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,40,95,49,52,+56,52,32,34,109,104,115,99,46,99,34,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+40,83,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,+66,32,40,40,67,39,32,95,50,54,49,41,32,95,49,52,55,49,41,41,+32,95,57,57,52,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,67,39,32,40,95,51,51,32,95,49,52,53,50,+41,41,32,95,49,52,53,57,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,+95,49,52,55,57,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,+40,95,49,52,50,57,32,34,77,72,83,67,67,34,41,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,83,+39,32,40,67,39,32,66,41,41,41,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,83,39,32,40,95,51,51,32,95,49,52,+53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,53,50,41,+41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,50,56,50,41,41,+32,95,54,48,49,41,32,35,48,41,41,41,41,32,40,40,66,32,40,95,+50,54,49,32,95,49,52,55,50,41,41,32,40,40,66,32,40,95,52,54,+51,32,34,69,120,101,99,117,116,101,58,32,34,41,41,32,40,95,49,53,+57,48,32,40,95,51,57,49,32,95,49,52,57,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,95,51,+51,32,95,49,52,53,50,41,41,32,95,49,52,57,49,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,+32,95,49,52,53,50,41,41,32,95,49,52,50,53,41,41,41,32,40,40,+66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,49,+52,55,57,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,+49,52,53,50,41,41,32,40,40,40,67,39,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,95,54,48,49,41,32,35,48,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,55,50,41,41,+41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,67,32,99,111,+109,112,105,108,97,116,105,111,110,32,32,32,32,32,32,32,32,32,34,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,95,52,54,51,41,41,32,+40,40,66,32,40,66,32,40,95,49,54,49,48,32,35,54,41,41,41,32,+40,40,66,32,40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,41,+41,32,40,67,32,40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,+32,34,109,115,34,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,40,40,95,52,54,48,32,95,49,51,49,41,32,34,36,73,78,34,+41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+95,52,54,48,32,95,49,51,49,41,32,34,36,79,85,84,34,41,41,41,+32,40,40,66,32,95,52,55,49,41,32,40,40,66,32,40,95,52,54,51,+32,34,99,99,32,45,119,32,45,87,97,108,108,32,45,79,51,32,34,41,+41,32,40,40,67,32,95,52,54,51,41,32,34,47,115,114,99,47,114,117,+110,116,105,109,101,47,101,118,97,108,46,99,32,36,73,78,32,45,108,109,+32,45,111,32,36,79,85,84,34,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,95,50,54,49,41,32,95,+49,52,55,52,41,41,32,95,57,57,52,41,41,41,41,32,40,67,32,95,+49,52,55,52,41,41,41,32,95,54,48,52,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,52,54,51,32,+95,57,56,55,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,95,49,53,57,+48,32,95,50,56,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,95,52,54,51,32,40,40,79,32,35,49,48,41,32,75,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,40,67,39,32,67,41,32,40,40,66,32,40,40,83,39,32,95,+51,57,55,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,+40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,+32,95,50,54,51,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,+32,40,95,52,54,51,32,34,40,40,65,32,58,34,41,41,32,40,40,40,+67,39,32,95,52,54,51,41,32,40,95,49,53,57,48,32,95,50,56,51,+41,41,32,40,40,79,32,35,51,50,41,32,75,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,+50,54,51,41,41,32,40,40,66,32,40,66,32,95,54,57,57,41,41,32,+40,40,66,32,89,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,66,41,32,80,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,+32,40,66,32,95,54,55,54,41,41,32,73,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,41,41,41,32,40,40,66,32,40,95,50,54,51,+32,40,95,52,54,51,32,34,41,32,34,41,41,41,32,40,40,67,32,95,+50,54,51,41,32,40,95,52,54,51,32,40,40,79,32,35,52,49,41,32,+75,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+95,54,57,57,41,41,32,85,41,41,41,41,32,40,40,67,32,95,52,49,+50,41,32,40,40,95,49,56,52,32,95,49,57,56,41,32,40,40,95,52,+56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,41,41,41,+41,41,41,32,75,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+95,49,49,48,49,41,41,32,40,67,32,80,41,41,41,41,41,41,41,32,+40,40,66,32,40,40,83,39,32,95,50,54,49,41,32,40,40,66,32,95,+52,55,49,41,32,40,40,66,32,40,95,50,54,49,32,95,50,52,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,109,97,105,110,58,32,102,105,+110,100,73,100,101,110,116,58,32,34,41,41,32,95,57,48,50,41,41,41,+41,41,32,40,67,32,95,57,50,56,41,41,41,41,32,95,57,50,54,41,+41,32,40,40,66,32,95,57,50,52,41,32,40,40,66,32,40,95,51,57,+52,32,40,85,32,40,40,67,32,66,41,32,40,40,66,32,90,41,32,40,+40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,67,32,+80,41,41,32,40,40,66,32,40,95,50,54,49,32,95,54,55,53,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,56,57,55,41,41,32,40,40,+66,32,40,95,52,54,51,32,40,40,79,32,35,57,53,41,32,75,41,41,+41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,32,+75,41,41,41,41,41,41,32,40,40,67,32,95,52,49,50,41,32,40,40,+95,49,56,52,32,95,49,57,56,41,32,35,48,41,41,41,41,41,41,41,+32,40,40,67,32,95,57,48,53,41,32,40,95,56,57,55,32,34,109,97,+105,110,34,41,41,41,41,41,41,41,32,95,57,57,49,41,41,32,40,40,+65,32,58,57,57,49,32,40,40,40,83,39,32,40,67,39,32,40,95,51,+50,32,95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,67,41,32,+95,54,49,51,41,32,95,54,49,49,41,41,32,40,40,66,32,85,41,32,+40,90,32,40,40,66,32,40,40,83,39,32,40,95,51,50,32,95,49,52,+53,50,41,41,32,40,40,40,67,39,32,95,49,52,56,49,41,32,95,50,+49,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,+49,41,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,53,50,+41,41,32,40,40,40,67,39,32,95,49,52,54,52,41,32,95,54,48,52,+41,32,95,49,52,52,55,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,67,32,95,49,+52,53,52,41,41,32,95,49,52,53,57,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,57,57,50,32,40,40,66,32,89,41,32,40,40,66,32,+40,66,32,40,83,32,40,85,32,95,52,54,49,41,41,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,40,83,39,+32,95,52,54,50,41,32,40,85,32,75,41,41,41,32,40,40,67,32,66,+41,32,40,85,32,65,41,41,41,41,41,32,95,52,50,50,41,41,41,41,+41,41,32,40,40,65,32,58,57,57,51,32,40,95,51,57,52,32,40,40,+40,67,39,32,95,52,54,51,41,32,40,40,66,32,40,95,49,53,57,48,+32,95,50,56,51,41,41,32,95,49,51,55,41,41,32,40,40,79,32,35,+52,52,41,32,75,41,41,41,41,32,40,40,65,32,58,57,57,52,32,40,+40,66,32,40,95,50,54,49,32,95,49,54,48,55,41,41,32,40,40,66,+32,40,95,52,54,51,32,40,40,79,32,34,115,116,97,116,105,99,32,117,+110,115,105,103,110,101,100,32,99,104,97,114,32,100,97,116,97,91,93,32,+61,32,123,34,41,32,75,41,41,41,32,40,40,40,83,39,32,95,52,54,+51,41,32,40,40,66,32,40,95,51,57,53,32,95,57,57,51,41,41,32,+40,95,57,57,50,32,35,50,48,41,41,41,32,40,40,66,32,40,79,32,+34,125,59,34,41,41,32,40,40,66,32,40,79,32,34,117,110,115,105,103,+110,101,100,32,99,104,97,114,32,42,99,111,109,98,101,120,112,114,32,61,+32,100,97,116,97,59,34,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,95,52,54,51,32,34,105,110,116,32,99,111,109,98,101,120,+112,114,108,101,110,32,61,32,34,41,41,32,40,40,40,67,39,32,95,52,+54,51,41,32,40,40,66,32,40,95,49,53,57,48,32,95,50,56,51,41,+41,32,95,52,49,49,41,41,32,40,40,79,32,35,53,57,41,32,75,41,+41,41,41,32,75,41,41,41,41,41,41,41,32,40,40,65,32,58,57,57,+53,32,95,49,53,48,53,41,32,40,40,65,32,58,57,57,54,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,95,57,57,55,41,32,95,50,52,41,41,32,73,41,+41,32,40,40,65,32,58,57,57,55,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,83,39,32,83,41,41,32,40,67,32,95,49,53,49,+51,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,+95,49,55,52,41,41,41,41,32,95,49,48,56,55,41,41,41,32,40,40,+67,32,40,40,67,32,83,41,32,40,40,66,32,40,67,32,66,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,67,32,40,40,+67,32,67,39,41,32,95,49,55,53,41,41,41,32,40,90,32,75,41,41,+41,41,41,41,32,40,40,95,50,54,49,32,95,49,55,52,41,32,34,65,+109,98,105,103,117,111,117,115,58,34,41,41,41,41,32,95,57,55,50,41,+41,32,40,40,65,32,58,57,57,56,32,40,40,40,95,51,50,32,95,49,+53,48,50,41,32,95,49,53,50,48,41,32,40,40,66,32,40,95,49,51,+32,95,49,53,48,49,41,41,32,40,40,66,32,95,57,56,52,41,32,40,+40,67,32,79,41,32,75,41,41,41,41,41,32,40,40,65,32,58,57,57,+57,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,48,+49,41,32,95,49,53,49,55,41,41,32,40,40,65,32,58,49,48,48,48,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,54,55,+41,32,95,49,53,49,55,41,41,32,40,40,65,32,58,49,48,48,49,32,+40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,50,51,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,109,111,100,117,108,101,34,41,41,+32,95,49,48,48,55,41,41,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,49,51,32,35,52,48,41,41,32,40,40,95,49,53,50,53,32,95,+49,48,51,50,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,+32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,32,40,40,40,95,+49,53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,119,104,+101,114,101,34,41,41,32,40,95,49,48,51,52,32,95,49,48,51,53,41,+41,41,41,32,40,40,65,32,58,49,48,48,50,32,40,40,40,95,51,50,+32,95,49,53,48,50,41,32,95,57,57,53,41,32,40,40,66,32,40,95,+49,53,49,54,32,34,81,73,100,101,110,116,34,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,80,41,32,40,40,66,32,40,66,32,40,66,32,40,83,+32,40,40,40,67,39,32,95,49,48,56,53,41,32,95,52,50,56,41,32,+95,52,55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,95,52,55,55,41,41,41,41,32,95,49,48,56,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,+49,48,48,51,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,+57,57,53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,85,73,100,+101,110,116,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,67,32,67,39,41,41,41,32,40,40,66,32,40,66,32,40,83,32,40,+40,40,67,39,32,95,49,51,57,41,32,95,52,50,56,41,32,95,52,55,+54,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,55,55,+41,41,41,32,95,56,57,57,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,41,+41,32,40,40,65,32,58,49,48,48,52,32,40,40,95,49,53,48,56,32,+95,49,48,48,51,41,32,95,49,48,48,54,41,41,32,40,40,65,32,58,+49,48,48,53,32,40,40,95,49,53,48,56,32,95,49,48,48,52,41,32,+40,95,49,48,50,57,32,95,49,48,50,48,41,41,41,32,40,40,65,32,+58,49,48,48,54,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,+95,57,57,53,41,32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,+50,41,32,95,57,57,56,41,41,32,40,40,66,32,40,66,32,40,40,40,+83,39,32,95,49,53,48,56,41,32,40,40,40,83,39,32,95,49,53,48,+56,41,32,40,40,40,67,39,32,40,95,50,55,54,32,95,49,53,48,48,+41,41,32,40,40,67,32,95,50,54,51,41,32,40,95,51,57,53,32,40,+95,50,54,53,32,35,52,52,41,41,41,41,32,40,40,40,95,49,54,32,+95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,95,49,53,49,49,+32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,32,40,95,49,48,+49,51,32,35,52,49,41,41,41,41,32,40,40,40,67,39,32,40,95,50,+55,51,32,95,49,53,48,48,41,41,32,40,85,32,34,40,41,34,41,41,+32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,+51,32,35,52,48,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,+41,41,41,32,40,40,40,67,39,32,40,95,50,55,51,32,95,49,53,48,+48,41,41,32,40,85,32,34,91,93,34,41,41,32,40,40,40,95,49,53,+32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,41,+32,40,95,49,48,49,51,32,35,57,51,41,41,41,41,41,41,32,95,56,+57,57,41,41,41,41,32,40,40,65,32,58,49,48,48,55,32,40,40,40,+95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,32,40,40,66,+32,40,95,49,53,49,54,32,34,85,81,73,100,101,110,116,34,41,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,80,41,32,40,40,66,32,40,66,32,40,+66,32,40,83,32,40,40,40,67,39,32,95,49,51,57,41,32,95,52,50,+56,41,32,95,52,55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,95,52,55,55,41,41,41,41,32,95,49,48,56,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,+54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,+65,32,58,49,48,48,56,32,40,40,95,49,53,48,56,32,95,49,48,48,+55,41,32,95,49,48,48,54,41,41,32,40,40,65,32,58,49,48,48,57,+32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,+32,40,40,66,32,40,95,49,53,49,54,32,34,76,73,100,101,110,116,34,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,67,+39,41,41,41,32,40,40,66,32,40,66,32,40,83,32,40,40,67,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,40,66,32,95,57,49,51,41,+32,95,52,50,56,41,41,32,40,40,66,32,95,49,50,50,41,32,40,40,+67,32,40,95,52,51,50,32,95,49,51,51,41,41,32,95,49,48,49,50,+41,41,41,41,32,95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,95,52,55,55,41,41,41,32,95,56,57,57,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,49,48,49,48,32,+40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,32,+40,40,66,32,40,95,49,53,49,54,32,34,76,81,73,100,101,110,116,34,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,66,32,40,+66,32,40,66,32,40,83,32,40,40,67,32,40,40,40,83,39,32,95,49,+50,49,41,32,40,40,66,32,95,57,49,51,41,32,95,52,50,56,41,41,+32,40,40,66,32,95,49,50,50,41,32,40,40,67,32,40,95,52,51,50,+32,95,49,51,51,41,41,32,95,49,48,49,50,41,41,41,41,32,95,52,+55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,95,52,55,55,41,41,41,41,32,95,49,48,56,54,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,49,48,+49,49,32,40,40,95,49,53,48,56,32,95,49,48,48,52,41,32,40,95,+49,48,50,57,32,95,49,48,49,55,41,41,41,32,40,40,65,32,58,49,+48,49,50,32,40,40,79,32,34,99,97,115,101,34,41,32,40,40,79,32,+34,99,108,97,115,115,34,41,32,40,40,79,32,34,100,97,116,97,34,41,+32,40,40,79,32,34,100,101,102,97,117,108,116,34,41,32,40,40,79,32,+34,100,111,34,41,32,40,40,79,32,34,101,108,115,101,34,41,32,40,40,+79,32,34,102,111,114,97,108,108,34,41,32,40,40,79,32,34,102,111,114,+101,105,103,110,34,41,32,40,40,79,32,34,105,102,34,41,32,40,40,79,+32,34,105,109,112,111,114,116,34,41,32,40,40,79,32,34,105,110,34,41,+32,40,40,79,32,34,105,110,102,105,120,34,41,32,40,40,79,32,34,105,+110,102,105,120,108,34,41,32,40,40,79,32,34,105,110,102,105,120,114,34,+41,32,40,40,79,32,34,105,110,115,116,97,110,99,101,34,41,32,40,40,+79,32,34,108,101,116,34,41,32,40,40,79,32,34,109,111,100,117,108,101,+34,41,32,40,40,79,32,34,110,101,119,116,121,112,101,34,41,32,40,40,+79,32,34,111,102,34,41,32,40,40,79,32,34,112,114,105,109,105,116,105,+118,101,34,41,32,40,40,79,32,34,116,104,101,110,34,41,32,40,40,79,+32,34,116,121,112,101,34,41,32,40,40,79,32,34,119,104,101,114,101,34,+41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,48,49,51,32,40,40,+66,32,40,40,95,50,55,51,32,95,49,53,48,48,41,32,95,49,51,52,+49,41,41,32,40,40,40,83,39,32,95,49,53,49,53,41,32,40,40,67,+32,79,41,32,75,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,90,32,+40,95,50,48,50,32,95,49,51,49,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,40,65,32,58,49,+48,49,52,32,40,40,66,32,40,40,95,50,55,51,32,95,49,53,48,48,+41,32,95,49,51,52,49,41,41,32,40,40,83,32,95,49,53,49,53,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,80,41,32,40,90,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,67,32,+40,95,50,48,50,32,95,49,51,51,41,41,41,41,32,40,75,32,40,75,+32,95,49,50,52,41,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,95,49,50,52,41,+41,41,41,41,32,40,40,65,32,58,49,48,49,53,32,40,40,95,49,53,+48,56,32,95,49,48,49,54,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,49,51,32,35,57,54,41,41,32,95,49,48,48,50,41,41,32,40,+95,49,48,49,51,32,35,57,54,41,41,41,41,32,40,40,65,32,58,49,+48,49,54,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,+57,53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,81,83,121,109,+79,112,101,114,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,+40,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,40,40,+83,39,32,95,49,50,49,41,32,40,40,66,32,95,49,50,50,41,32,40,+40,66,32,95,49,48,56,53,41,32,95,52,50,56,41,41,41,32,40,40,+66,32,95,49,50,50,41,32,40,40,67,32,40,95,52,51,50,32,95,49,+51,51,41,41,32,95,49,48,50,53,41,41,41,41,32,95,52,55,54,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,+55,55,41,41,41,41,32,95,49,48,56,54,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,41,41,32,40,40,65,32,58,49,48,49,55,32,+40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,53,41,32,+40,40,66,32,40,95,49,53,49,54,32,34,83,121,109,79,112,101,114,34,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,67,+39,41,41,41,32,40,40,66,32,40,66,32,40,83,32,40,40,67,32,40,+40,40,83,39,32,95,49,50,49,41,32,40,40,66,32,95,49,50,50,41,+32,40,40,66,32,95,49,48,56,53,41,32,95,52,50,56,41,41,41,32,+40,40,66,32,95,49,50,50,41,32,40,40,67,32,40,95,52,51,50,32,+95,49,51,51,41,41,32,95,49,48,50,53,41,41,41,41,32,95,52,55,+54,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,55,55,+41,41,41,32,95,56,57,57,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,41,+41,32,40,40,65,32,58,49,48,49,56,32,40,40,40,95,51,50,32,95,+49,53,48,50,41,32,95,49,48,49,54,41,32,40,40,40,83,39,32,40,+95,51,51,32,95,49,53,48,50,41,41,32,40,40,66,32,40,95,49,48,+32,95,49,53,48,52,41,41,32,95,49,48,49,57,41,41,32,40,95,49,+51,32,95,49,53,48,49,41,41,41,41,32,40,40,65,32,58,49,48,49,+57,32,40,40,95,50,54,51,32,40,40,67,32,40,95,50,48,50,32,95,+49,51,49,41,41,32,35,53,56,41,41,32,40,40,95,50,54,51,32,95,+52,50,56,41,32,95,57,48,48,41,41,41,32,40,40,65,32,58,49,48,+50,48,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,+49,55,41,32,40,40,40,83,39,32,40,95,51,51,32,95,49,53,48,50,+41,41,32,40,40,66,32,40,95,49,48,32,95,49,53,48,52,41,41,32,+95,49,48,49,57,41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,+41,41,32,40,40,65,32,58,49,48,50,49,32,40,40,40,95,51,50,32,+95,49,53,48,50,41,32,95,49,48,49,54,41,32,40,40,40,83,39,32,+40,95,51,51,32,95,49,53,48,50,41,41,32,40,40,66,32,40,95,49,+48,32,95,49,53,48,52,41,41,32,40,40,66,32,95,49,50,50,41,32,+95,49,48,49,57,41,41,41,32,40,95,49,51,32,95,49,53,48,49,41,+41,41,41,32,40,40,65,32,58,49,48,50,50,32,40,40,95,49,53,48,+56,32,95,49,48,50,49,41,32,95,49,48,50,51,41,41,32,40,40,65,+32,58,49,48,50,51,32,40,40,40,95,51,50,32,95,49,53,48,50,41,+32,95,57,57,53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,45,+62,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,41,32,40,40,66,+32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,40,67,32,101,113,+117,97,108,41,32,34,45,62,34,41,41,32,95,52,55,54,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,55,41,+41,41,41,32,95,49,48,56,54,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,+54,41,41,41,41,41,32,40,40,65,32,58,49,48,50,52,32,40,40,40,+95,51,50,32,95,49,53,48,50,41,32,95,49,48,49,55,41,32,40,40,+40,83,39,32,40,95,51,51,32,95,49,53,48,50,41,41,32,40,40,66,+32,40,95,49,48,32,95,49,53,48,52,41,41,32,40,40,66,32,95,49,+50,50,41,32,95,49,48,49,57,41,41,41,32,40,95,49,51,32,95,49,+53,48,49,41,41,41,41,32,40,40,65,32,58,49,48,50,53,32,40,40,+79,32,40,40,79,32,35,54,49,41,32,75,41,41,32,40,40,79,32,40,+40,79,32,35,49,50,52,41,32,75,41,41,32,40,40,79,32,34,58,58,+34,41,32,40,40,79,32,34,60,45,34,41,32,40,40,79,32,40,40,79,+32,35,54,52,41,32,75,41,41,32,40,40,79,32,34,46,46,34,41,32,+40,40,79,32,34,45,62,34,41,32,75,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,48,50,54,32,40,40,95,49,53,48,56,32,95,49,+48,48,56,41,32,40,95,49,48,50,57,32,95,49,48,49,56,41,41,41,+32,40,40,65,32,58,49,48,50,55,32,40,40,95,49,53,48,56,32,95,+49,48,49,48,41,32,40,95,49,48,50,57,32,95,49,48,50,50,41,41,+41,32,40,40,65,32,58,49,48,50,56,32,40,40,95,49,53,48,56,32,+95,49,48,48,57,41,32,40,95,49,48,50,57,32,95,49,48,50,52,41,+41,41,32,40,40,65,32,58,49,48,50,57,32,40,40,40,67,39,32,40,+95,49,54,32,95,49,53,48,49,41,41,32,40,40,95,49,53,32,95,49,+53,48,49,41,32,40,95,49,48,49,51,32,35,52,48,41,41,41,32,40,+95,49,48,49,51,32,35,52,49,41,41,41,32,40,40,65,32,58,49,48,+51,48,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,57,57,+53,41,32,40,40,66,32,40,95,49,53,49,54,32,34,108,105,116,101,114,+97,108,34,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,66,32,40,80,32,40,75,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,40,66,32,40,+67,32,66,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,+52,55,55,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,+57,41,41,32,95,55,56,48,41,41,41,41,41,32,40,40,66,32,40,67,+32,66,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,+55,55,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,57,+41,41,32,95,55,55,57,41,41,41,41,41,32,40,40,66,32,40,67,32,+66,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,+55,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,57,41,+41,32,95,55,55,54,41,41,41,41,41,32,40,40,66,32,40,67,32,66,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,55,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,40,67,39,32,95,55,52,55,41,41,41,32,95,56,56,57,41,41,+32,95,55,55,56,41,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,+41,41,41,41,32,40,40,65,32,58,49,48,51,49,32,40,40,95,49,53,+49,54,32,34,115,116,114,105,110,103,34,41,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,55,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,40,65,32,58,49,48,51,+50,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,+95,49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,50,52,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,109,111,100,117,108,101,34,41,41,32,95,+49,48,48,56,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,50,53,41,32,40,40,40,95,49,54,32,95,49,53,48,+49,41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,+95,49,54,32,95,49,53,48,49,41,32,95,49,48,50,54,41,32,40,95,+49,48,49,51,32,35,52,48,41,41,41,32,40,95,49,48,49,52,32,34,+46,46,34,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,+41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,+50,54,41,32,95,49,48,50,54,41,41,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,95,55,50,55,41,32,95,49,48,50,55,41,+41,41,32,40,40,65,32,58,49,48,51,51,32,40,40,66,32,40,40,95,+50,55,51,32,95,49,53,48,48,41,32,95,49,51,52,49,41,41,32,40,+40,83,32,95,49,53,49,53,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,80,+41,32,40,90,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,67,+32,67,39,41,41,32,40,95,50,48,50,32,95,49,51,51,41,41,41,32,+40,75,32,40,75,32,95,49,50,52,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,+32,40,75,32,40,75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,+75,32,95,49,50,52,41,41,41,41,32,40,75,32,40,75,32,95,49,50,+52,41,41,41,41,32,40,75,32,95,49,50,52,41,41,41,32,40,75,32,+95,49,50,52,41,41,41,41,41,32,40,40,65,32,58,49,48,51,52,32,+40,40,66,32,40,40,95,51,51,32,95,49,53,48,50,41,32,40,95,49,+48,49,51,32,35,49,50,51,41,41,41,32,40,40,40,67,39,32,40,95,+51,50,32,95,49,53,48,50,41,41,32,40,40,67,32,95,49,53,50,52,+41,32,40,95,49,48,49,51,32,35,53,57,41,41,41,32,40,40,66,32,+40,40,95,51,51,32,95,49,53,48,50,41,32,40,95,49,53,49,50,32,+40,95,49,48,49,51,32,35,53,57,41,41,41,41,32,40,40,66,32,40,+40,95,51,51,32,95,49,53,48,50,41,32,40,95,49,48,49,51,32,35,+49,50,53,41,41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,41,+41,41,41,32,40,40,65,32,58,49,48,51,53,32,40,40,95,49,53,48,+56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,+95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,+56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,+95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,50,56,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,100,97,116,97,34,41,41,32,95,+49,48,52,50,41,41,41,32,40,40,95,49,53,48,56,32,40,40,40,95,+49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,52,32,40,40,79,+32,35,54,49,41,32,75,41,41,41,32,40,40,95,49,53,50,51,32,95,+49,48,51,55,41,32,40,95,49,48,49,52,32,40,40,79,32,35,49,50,+52,41,32,75,41,41,41,41,41,32,40,40,95,49,51,32,95,49,53,48,+49,41,32,95,52,54,49,41,41,41,41,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,50,57,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,110,101,119,116,121,112,101,34,41,41,32,+95,49,48,52,50,41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,49,52,32,40,40,79,32,35,54,49,41,32,75,+41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,95,55,57,53,32,+95,52,54,49,41,32,95,52,54,49,41,41,32,95,49,48,48,53,41,41,+32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,51,56,+41,32,40,40,40,83,39,32,40,95,51,51,32,95,49,53,48,50,41,41,+32,40,40,66,32,40,95,50,54,49,32,40,95,49,48,32,95,49,53,48,+52,41,41,41,32,40,40,40,67,39,32,40,95,50,48,50,32,95,50,56,+49,41,41,32,40,40,95,49,55,55,32,95,52,49,49,41,32,95,52,49,+49,41,41,32,35,49,41,41,41,32,40,95,49,51,32,95,49,53,48,49,+41,41,41,41,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,+49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,+51,48,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,51,51,32,34,116,121,112,101,34,41,41,32,95,49,48,52,50,41,+41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,49,52,32,40,40,79,32,35,54,49,41,32,75,41,41,41,32,95,49,+48,52,55,41,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,40,95,50,54,56,32,95,55,51,49,41,41,32,95,49,48,54,+48,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,50,41,32,+40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,50,56,41,+32,40,95,49,48,49,52,32,34,58,58,34,41,41,41,41,32,95,49,48,+52,55,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,51,51,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,105,109,112,111,114,116,34,41,41,32,95,+49,48,52,51,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,+49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,+95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,52,41,32,40,40,+40,95,49,53,32,95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,+49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,+40,95,49,48,51,51,32,34,102,111,114,101,105,103,110,34,41,41,32,40,+95,49,48,51,51,32,34,105,109,112,111,114,116,34,41,41,41,32,40,95,+49,48,51,51,32,34,99,99,97,108,108,34,41,41,41,32,95,49,48,51,+49,41,41,41,32,95,49,48,48,57,41,41,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,+32,95,49,48,52,55,41,41,41,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+95,55,51,53,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,80,41,32,40,40,+95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,95,56,49,56,41,32,40,95,49,48,51,+51,32,34,105,110,102,105,120,108,34,41,41,41,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,95,56,49,57,41,32,40,95,49,48,51,+51,32,34,105,110,102,105,120,114,34,41,41,41,41,32,40,40,40,95,50,+55,51,32,95,49,53,48,48,41,32,95,56,50,48,41,32,40,95,49,48,+51,51,32,34,105,110,102,105,120,34,41,41,41,41,41,32,40,40,95,49,+53,49,54,32,34,100,105,103,105,116,34,41,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,80,32,40,75,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,40,66,32,+40,40,83,32,40,40,67,32,40,40,40,83,39,32,95,49,50,49,41,32,+40,40,95,52,57,56,32,95,50,56,50,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,45,50,41,41,41,41,32,+40,40,67,32,40,95,52,57,56,32,95,50,56,50,41,41,32,35,57,41,+41,41,32,95,52,55,54,41,41,32,95,52,55,55,41,41,32,95,51,54,+48,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,41,41,41,32,40,40,95,49,+53,50,51,32,95,49,48,53,48,41,32,40,95,49,48,49,51,32,35,52,+52,41,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,+32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,+52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,95,55,51,54,41,32,40,40,40,95,49,53,32,95,49,53,+48,49,41,32,40,95,49,48,51,51,32,34,99,108,97,115,115,34,41,41,+32,95,49,48,51,54,41,41,41,32,95,49,48,52,50,41,41,32,40,40,+95,49,53,48,56,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,+40,95,49,48,49,52,32,40,40,79,32,35,49,50,52,41,32,75,41,41,+41,32,40,40,95,49,53,50,51,32,40,40,40,95,49,52,32,95,49,53,+48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,80,+41,32,40,95,49,53,49,49,32,95,49,48,48,57,41,41,41,32,40,40,+40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,+45,62,34,41,41,32,40,95,49,53,49,49,32,95,49,48,48,57,41,41,+41,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,32,40,40,+95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,41,41,41,41,32,+40,95,49,48,54,53,32,95,49,48,56,51,41,41,41,41,32,40,40,40,+95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,55,41,32,+40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,+32,34,105,110,115,116,97,110,99,101,34,41,41,32,95,49,48,52,56,41,+41,41,32,95,49,48,51,54,41,41,32,95,49,48,53,50,41,41,32,40,+95,49,48,54,53,32,95,49,48,56,51,41,41,41,41,32,40,40,40,95,+50,55,54,32,95,49,53,48,48,41,32,95,55,51,56,41,32,40,40,40,+95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,100,+101,102,97,117,108,116,34,41,41,32,40,95,49,48,50,57,32,40,40,95,+49,53,50,52,32,95,49,48,52,55,41,32,40,95,49,48,49,51,32,35,+52,52,41,41,41,41,41,41,41,32,40,40,65,32,58,49,48,51,54,32,+40,40,95,49,53,48,56,32,40,40,40,95,49,54,32,95,49,53,48,49,+41,32,40,40,95,49,53,48,56,32,40,95,49,48,50,57,32,40,95,49,+53,49,48,32,95,49,48,52,55,41,41,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,40,40,67,32,95,52,54,50,41,32,95,52,+54,49,41,41,32,95,49,48,53,50,41,41,41,32,40,95,49,48,49,52,+32,34,61,62,34,41,41,41,32,40,40,95,49,51,32,95,49,53,48,49,+41,32,95,52,54,49,41,41,41,32,40,40,65,32,58,49,48,51,55,32,+40,40,95,49,53,48,56,32,40,40,40,95,49,52,32,95,49,53,48,49,+41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,+49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,+53,48,48,41,32,95,55,57,53,41,32,95,49,48,52,56,41,41,32,95,+49,48,51,54,41,41,32,95,49,48,48,53,41,41,32,95,49,48,51,56,+41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,+95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,+41,41,41,32,95,55,57,53,41,41,32,40,40,66,32,40,66,32,95,49,+55,52,41,41,32,40,40,40,67,39,32,66,41,32,79,41,32,40,40,67,+32,79,41,32,75,41,41,41,41,41,32,95,49,48,52,56,41,41,32,95,+49,48,51,54,41,41,32,95,49,48,51,57,41,41,32,95,49,48,50,48,+41,41,32,95,49,48,51,57,41,41,41,32,40,40,65,32,58,49,48,51,+56,32,40,40,95,49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,+53,48,48,41,32,95,49,55,52,41,32,40,95,49,53,49,48,32,95,49,+48,51,57,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,+41,32,95,49,55,53,41,32,40,40,40,95,49,54,32,95,49,53,48,49,+41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,+49,51,32,35,49,50,51,41,41,32,40,40,95,49,53,50,52,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,80,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,95,49,48,50,56,41,32,40,95,49,48,49,52,32,34,58,+58,34,41,41,41,41,32,95,49,48,52,48,41,41,32,40,95,49,48,49,+51,32,35,52,52,41,41,41,41,32,40,95,49,48,49,51,32,35,49,50,+53,41,41,41,41,41,32,40,40,65,32,58,49,48,51,57,32,40,40,40,+95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,80,41,32,95,49,48,52,49,41,41,32,95,49,48,+53,51,41,41,32,40,40,65,32,58,49,48,52,48,32,40,40,40,95,49,+52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,80,41,32,95,49,48,52,49,41,41,32,95,49,48,52,55,+41,41,32,40,40,65,32,58,49,48,52,49,32,40,40,95,49,53,48,56,+32,40,40,40,95,50,55,51,32,95,49,53,48,48,41,32,95,49,50,53,+41,32,40,95,49,48,49,52,32,40,40,79,32,35,51,51,41,32,75,41,+41,41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,49,50,+52,41,41,41,32,40,40,65,32,58,49,48,52,50,32,40,40,95,49,53,+48,56,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,+95,50,55,54,32,95,49,53,48,48,41,32,80,41,32,95,49,48,49,49,+41,41,32,40,95,49,53,49,48,32,95,49,48,52,53,41,41,41,32,40,+40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,+95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,40,+40,67,39,32,66,41,32,79,41,32,40,40,67,32,79,41,32,75,41,41,+41,41,32,95,49,48,52,53,41,41,32,95,49,48,49,55,41,41,32,95,+49,48,52,53,41,41,41,32,40,40,65,32,58,49,48,52,51,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,51,57,41,+32,40,40,95,49,53,48,56,32,40,40,40,95,50,55,51,32,95,49,53,+48,48,41,32,95,49,50,53,41,32,40,95,49,48,51,51,32,34,113,117,+97,108,105,102,105,101,100,34,41,41,41,32,40,40,95,49,51,32,95,49,+53,48,49,41,32,95,49,50,52,41,41,41,41,32,95,49,48,48,55,41,+41,32,40,95,49,53,49,50,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,97,115,34,41,41,32,95,49,48,+48,56,41,41,41,41,32,40,95,49,53,49,50,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,80,41,32,40,40,40,95,51,32,95,49,53,48,52,41,32,40,+40,40,95,50,55,51,32,95,49,53,48,48,41,32,95,49,50,53,41,32,+40,95,49,48,51,51,32,34,104,105,100,105,110,103,34,41,41,41,32,40,+40,95,49,51,32,95,49,53,48,49,41,32,95,49,50,52,41,41,41,41,+32,40,95,49,48,50,57,32,40,40,95,49,53,50,53,32,95,49,48,52,+52,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,48,52,52,32,40,40,95,49,53,48,56,32,40,+40,95,49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,+41,32,95,55,52,48,41,32,40,40,40,95,49,54,32,95,49,53,48,49,+41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,+49,54,32,95,49,53,48,49,41,32,95,49,48,50,54,41,32,40,95,49,+48,49,51,32,35,52,48,41,41,41,32,40,95,49,48,49,52,32,34,46,+46,34,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,+32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,52,49,+41,32,95,49,48,50,54,41,41,41,32,40,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,95,55,52,50,41,32,95,49,48,50,55,41,41,41,+32,40,40,65,32,58,49,48,52,53,32,40,40,95,49,53,48,56,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,67,32,95,55,+57,54,41,32,95,55,57,57,41,41,32,95,49,48,50,56,41,41,32,40,+95,49,48,50,57,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,57,54,41,+32,95,49,48,50,56,41,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,32,95,49,48,+52,54,41,41,41,41,41,32,40,40,65,32,58,49,48,52,54,32,95,49,+48,52,55,41,32,40,40,65,32,58,49,48,52,55,32,40,40,40,95,51,+50,32,95,49,53,48,50,41,32,95,49,48,52,56,41,32,40,40,66,32,+40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,52,57,41,41,+32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,49,51,32,95,+49,53,48,49,41,41,41,41,32,40,40,67,32,40,40,40,83,39,32,83,+39,41,32,95,51,57,50,41,32,95,55,54,48,41,41,32,73,41,41,41,+41,41,32,40,40,65,32,58,49,48,52,56,32,40,40,95,49,53,48,56,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,102,111,114,+97,108,108,34,41,41,32,40,95,49,53,49,49,32,95,49,48,52,53,41,+41,41,32,40,95,49,48,49,52,32,40,40,79,32,35,52,54,41,32,75,+41,41,41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,+54,49,41,41,41,32,40,40,65,32,58,49,48,52,57,32,40,40,95,49,+48,56,49,32,95,49,48,53,48,41,32,95,49,48,53,49,41,41,32,40,+40,65,32,58,49,48,53,48,32,40,40,95,49,53,48,56,32,40,40,95,+49,53,48,56,32,95,49,48,49,53,41,32,40,40,40,95,50,55,51,32,+95,49,53,48,48,41,32,40,95,56,57,55,32,34,45,62,34,41,41,32,+40,95,49,48,49,52,32,34,45,62,34,41,41,41,41,32,40,40,40,95,+50,55,51,32,95,49,53,48,48,41,32,40,95,56,57,55,32,34,61,62,+34,41,41,32,40,95,49,48,49,52,32,34,61,62,34,41,41,41,41,32,+40,40,65,32,58,49,48,53,49,32,95,49,48,53,50,41,32,40,40,65,+32,58,49,48,53,50,32,40,40,40,95,51,50,32,95,49,53,48,50,41,+32,95,49,48,53,51,41,32,40,40,66,32,40,40,95,51,50,32,95,49,+53,48,50,41,32,40,95,49,53,49,48,32,95,49,48,53,51,41,41,41,+32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,49,53,48,50,41,+32,40,95,49,53,49,50,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,32,95,49,48,52,+55,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+66,32,40,95,50,54,49,32,40,95,49,51,32,95,49,53,48,49,41,41,+41,41,32,40,67,32,40,40,83,32,95,52,55,48,41,32,95,55,53,54,+41,41,41,41,41,32,40,95,51,57,57,32,95,55,52,52,41,41,41,41,+41,41,32,40,40,65,32,58,49,48,53,51,32,40,40,95,49,53,48,56,+32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,+49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+95,55,52,51,41,32,95,49,48,50,55,41,41,32,40,40,40,95,50,55,+54,32,95,49,53,48,48,41,32,95,55,52,51,41,32,95,49,48,50,54,+41,41,41,32,95,49,48,51,48,41,41,32,40,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,95,49,48,56,52,41,32,40,40,40,95,49,54,+32,95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,40,95,49,53,+50,51,32,95,49,48,52,55,41,32,40,95,49,48,49,51,32,35,52,52,+41,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,41,+32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,95,50,+54,51,32,95,55,53,49,41,32,40,40,95,50,54,51,32,95,55,54,54,+41,32,40,40,67,32,95,52,54,50,41,32,95,52,54,49,41,41,41,41,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,+41,32,95,49,48,52,55,41,41,32,40,95,49,48,49,51,32,35,57,51,+41,41,41,41,41,32,40,40,65,32,58,49,48,53,52,32,40,40,95,49,+53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,+40,40,95,49,53,48,56,32,40,40,40,95,51,50,32,95,49,53,48,50,+41,32,95,49,48,50,56,41,32,40,40,40,83,39,32,95,49,53,48,56,+41,32,40,40,40,67,39,32,40,95,50,55,54,32,95,49,53,48,48,41,+41,32,95,55,53,55,41,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,52,32,40,40,79,32,35,54,52,41,32,75,41,+41,41,32,95,49,48,53,52,41,41,41,32,40,40,66,32,40,95,49,51,+32,95,49,53,48,49,41,41,32,95,55,52,51,41,41,41,41,32,40,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,52,51,41,32,95,+49,48,50,54,41,41,41,32,95,49,48,51,48,41,41,32,40,40,40,95,+50,55,54,32,95,49,53,48,48,41,32,95,49,48,56,52,41,32,40,40,+40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,+49,53,48,49,41,32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,+40,95,49,53,50,51,32,95,49,48,53,53,41,32,40,95,49,48,49,51,+32,35,52,52,41,41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,+41,41,41,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+40,40,95,50,54,51,32,95,55,53,49,41,32,95,55,54,54,41,41,32,+40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,53,+32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,41,+32,40,40,95,49,53,50,51,32,95,49,48,53,53,41,32,40,95,49,48,+49,51,32,35,52,52,41,41,41,41,32,40,95,49,48,49,51,32,35,57,+51,41,41,41,41,41,32,40,40,65,32,58,49,48,53,53,32,95,49,48,+53,54,41,32,40,40,65,32,58,49,48,53,54,32,40,40,95,49,48,56,+49,32,95,49,48,49,53,41,32,95,49,48,53,55,41,41,32,40,40,65,+32,58,49,48,53,55,32,95,49,48,53,56,41,32,40,40,65,32,58,49,+48,53,56,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,+48,53,52,41,32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,50,+41,32,40,95,49,53,49,48,32,95,49,48,53,52,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,95,51,51,32,95,49,53,48,50,41,41,+41,32,40,40,66,32,40,66,32,40,95,49,48,32,95,49,53,48,52,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,49,50,48,41,32,95,51,+57,50,41,41,32,95,55,57,51,41,41,41,32,40,40,66,32,40,66,32,+40,95,50,54,49,32,40,95,49,51,32,95,49,53,48,49,41,41,41,41,+32,40,95,51,57,57,32,95,55,52,52,41,41,41,41,41,41,32,40,40,+65,32,58,49,48,53,57,32,40,40,40,95,51,50,32,95,49,53,48,50,+41,32,95,49,48,53,53,41,32,40,40,40,83,39,32,40,95,51,51,32,+95,49,53,48,50,41,41,32,40,40,66,32,40,95,49,48,32,95,49,53,+48,52,41,41,32,40,40,66,32,95,49,50,50,41,32,95,55,57,50,41,+41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,41,41,32,40,40,+65,32,58,49,48,54,48,32,40,40,40,95,51,50,32,95,49,53,48,50,+41,32,40,95,49,48,54,49,32,40,75,32,40,75,32,95,49,50,53,41,+41,41,41,32,40,85,32,40,40,66,32,40,83,32,73,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,80,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,32,+40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,85,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,80,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,80,41,41,32,40,40,66,32,40,66,32,40,95,49,51,32,95,49,53,+48,49,41,41,41,32,40,40,40,67,39,32,66,41,32,80,41,32,40,40,+67,32,79,41,32,75,41,41,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,41,41,41,41,32,40,90,32,75,41,41,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,40,95,+51,50,32,95,49,53,48,50,41,41,41,32,40,40,66,32,40,66,32,95,+49,53,49,48,41,41,32,40,40,66,32,40,66,32,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,53,57,41,41,41,+41,32,40,40,66,32,40,66,32,95,49,48,54,49,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,49,50,49,41,41,32,40,67,32,40,95,50,48,50,+32,95,56,57,50,41,41,41,41,41,32,40,40,66,32,40,67,32,40,95,+50,48,50,32,95,50,56,49,41,41,41,32,95,52,49,49,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,49,51,32,95,+49,53,48,49,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,80,41,41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,41,+32,40,95,51,57,53,32,95,53,54,54,41,41,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,49,48,54,49,32,40,40,66,32,40,40,95,51,+50,32,95,49,53,48,50,41,32,95,49,48,54,50,41,41,32,40,40,66,+32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,49,53,48,50,41,32,40,95,49,48,54,51,32,40,95,49,48,49,52,+32,40,40,79,32,35,54,49,41,32,75,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,83,39,32,66,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,51,51,32,95,49,53,48,50,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,49,48,32,95,49,+53,48,52,41,41,41,41,32,40,40,67,32,40,67,39,32,66,41,41,32,+95,52,49,49,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,49,51,32,95,49,53,48,49,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,80,41,41,32,95,55,57,48,41,41,41,41,41,+41,41,32,40,40,65,32,58,49,48,54,50,32,40,40,40,40,83,39,32,+95,49,53,48,56,41,32,40,40,95,51,32,95,49,53,48,52,41,32,40,+40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,80,41,32,95,49,48,50,56,41,41,32,40,+95,49,53,49,48,32,95,49,48,53,52,41,41,41,41,32,40,40,40,67,+39,32,40,95,49,52,32,95,49,53,48,49,41,41,32,40,40,66,32,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,67,32,66,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,40,67,32,95,+52,54,51,41,41,41,41,41,32,95,49,48,50,57,41,41,32,40,95,49,+53,49,48,32,95,49,48,53,52,41,41,41,32,40,40,40,95,49,52,32,+95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,+32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,80,41,41,32,40,40,40,67,39,32,66,41,+32,79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,95,49,48,+53,56,41,41,32,40,40,40,95,51,50,32,95,49,53,48,50,41,32,95,+49,48,49,53,41,32,40,40,40,83,39,32,40,95,51,51,32,95,49,53,+48,50,41,41,32,40,40,66,32,40,95,49,48,32,95,49,53,48,52,41,+41,32,40,40,66,32,95,49,50,50,41,32,95,57,49,48,41,41,41,32,+40,95,49,51,32,95,49,53,48,49,41,41,41,41,41,32,95,49,48,53,+56,41,41,41,32,40,40,65,32,58,49,48,54,51,32,40,40,40,67,39,+32,40,95,51,50,32,95,49,53,48,50,41,41,32,95,49,48,54,52,41,+32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,50,41,32,40,95,+49,48,54,53,32,95,49,48,56,50,41,41,41,32,40,40,66,32,40,66,+32,40,95,49,51,32,95,49,53,48,49,41,41,41,32,95,55,57,49,41,+41,41,41,32,40,40,65,32,58,49,48,54,52,32,40,40,40,83,39,32,+95,49,53,48,56,41,32,40,40,66,32,95,49,53,49,49,41,32,40,40,+66,32,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,+55,54,32,95,49,53,48,48,41,32,80,41,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,40,40,79,32,35,49,+50,52,41,32,75,41,41,41,32,40,40,95,49,53,50,51,32,95,49,48,+54,54,41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,41,41,+32,40,40,67,32,40,95,49,53,32,95,49,53,48,49,41,41,32,95,49,+48,54,55,41,41,41,41,32,40,40,66,32,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,52,+54,49,41,41,32,75,41,41,41,32,40,40,67,32,40,95,49,53,32,95,+49,53,48,49,41,41,32,95,49,48,54,55,41,41,41,41,32,40,40,65,+32,58,49,48,54,53,32,40,40,40,67,39,32,95,49,53,48,56,41,32,+40,40,66,32,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,51,51,32,34,119,104,101,114,101,34,41,41,41,32,95,49,48,51,52,+41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,+41,41,41,32,40,40,65,32,58,49,48,54,54,32,40,40,95,49,53,48,+56,32,40,40,95,49,53,48,56,32,40,40,40,95,49,52,32,95,49,53,+48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,+55,56,52,41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,+49,48,53,53,41,32,40,95,49,48,49,52,32,34,60,45,34,41,41,41,+41,32,95,49,48,54,55,41,41,32,40,40,40,95,50,55,54,32,95,49,+53,48,48,41,32,95,55,56,54,41,32,40,40,40,95,49,53,32,95,49,+53,48,49,41,32,40,95,49,48,51,51,32,34,108,101,116,34,41,41,32,+40,95,49,48,51,52,32,95,49,48,56,50,41,41,41,41,41,32,40,40,+40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,56,53,41,32,95,+49,48,54,55,41,41,41,32,40,40,65,32,58,49,48,54,55,32,95,49,+48,56,48,41,32,40,40,65,32,58,49,48,54,56,32,40,40,95,49,53,+48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,+40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,95,49,48,54,57,+41,32,95,49,48,55,48,41,41,32,95,49,48,55,49,41,41,32,95,49,+48,55,51,41,41,32,95,49,48,55,53,41,41,32,95,49,48,55,52,41,+41,32,40,40,65,32,58,49,48,54,57,32,40,40,40,95,51,50,32,95,+49,53,48,50,41,32,95,49,48,55,56,41,32,40,40,66,32,40,40,95,+51,50,32,95,49,53,48,50,41,32,40,95,49,53,49,48,32,95,49,48,+55,56,41,41,41,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,+49,53,48,50,41,32,40,95,49,53,49,50,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,58,58,34,41,41,+32,95,49,48,52,55,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,40,66,32,40,95,50,54,49,32,40,95,49,51,32,95,49,+53,48,49,41,41,41,41,32,40,67,32,40,40,83,32,95,52,55,48,41,+32,95,55,53,54,41,41,41,41,41,32,40,95,51,57,57,32,95,55,52,+52,41,41,41,41,41,41,32,40,40,65,32,58,49,48,55,48,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,95,55,54,49,41,32,40,40,40,95,49,53,32,+95,49,53,48,49,41,32,40,95,49,48,49,52,32,40,40,79,32,35,57,+50,41,32,75,41,41,41,32,40,95,49,53,49,49,32,95,49,48,53,52,+41,41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,+95,49,48,49,52,32,34,45,62,34,41,41,32,95,49,48,54,55,41,41,+41,32,40,40,65,32,58,49,48,55,49,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,52,56,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,99,97,115,101,34,41,41,32,95,49,48,+54,55,41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,+40,95,49,48,51,51,32,34,111,102,34,41,41,32,40,95,49,48,51,52,+32,95,49,48,55,50,41,41,41,41,32,40,40,65,32,58,49,48,55,50,+32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,50,+55,54,32,95,49,53,48,48,41,32,80,41,32,95,49,48,53,53,41,41,+32,40,95,49,48,54,51,32,40,95,49,48,49,52,32,34,45,62,34,41,+41,41,41,32,40,40,65,32,58,49,48,55,51,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,52,57,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,51,51,32,34,108,101,116,34,41,41,32,40,95,+49,48,51,52,32,95,49,48,56,50,41,41,41,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,51,51,32,34,105,110,34,+41,41,32,95,49,48,54,55,41,41,41,32,40,40,65,32,58,49,48,55,+52,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,+50,55,54,32,95,49,53,48,48,41,32,95,55,53,50,41,32,40,40,95,+49,53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,+95,52,55,55,41,32,95,49,48,55,54,41,41,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,95,52,55,54,41,32,40,95,49,48,51,+51,32,34,100,111,34,41,41,41,41,41,32,40,95,49,48,51,52,32,95,+49,48,54,54,41,41,41,32,40,40,65,32,58,49,48,55,53,32,40,40,+40,95,49,52,32,95,49,53,48,49,41,32,40,40,40,95,49,52,32,95,+49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,95,55,53,53,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,51,51,32,34,105,102,34,41,41,32,95,49,48,54,55,+41,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,51,51,32,34,116,104,101,110,34,41,41,32,95,49,48,54,55,41,+41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,51,51,32,34,101,108,115,101,34,41,41,32,95,49,48,54,55,41,41,+41,32,40,40,65,32,58,49,48,55,54,32,40,40,40,95,51,50,32,95,+49,53,48,50,41,32,95,57,57,53,41,32,40,40,66,32,40,95,49,53,+49,54,32,34,81,117,97,108,68,111,34,41,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,80,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,40,85,32,95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,40,67,32,+40,40,67,32,101,113,117,97,108,41,32,34,100,111,34,41,41,32,95,52,+55,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,+55,55,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+95,56,57,57,41,32,40,95,52,51,49,32,40,40,79,32,35,52,54,41,+32,75,41,41,41,41,41,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,41,41,32,40,40,65,32,58,49,48,55,55,32,40,40,95,49,+53,48,56,32,95,49,48,49,53,41,32,40,40,40,95,49,52,32,95,49,+53,48,49,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,56,57,57,41,32,+95,57,57,53,41,41,32,95,57,57,56,41,41,32,40,40,40,95,50,55,+51,32,95,49,53,48,48,41,32,40,40,79,32,35,52,52,41,32,75,41,+41,32,40,95,49,48,49,51,32,35,52,52,41,41,41,41,41,32,40,40,+65,32,58,49,48,55,56,32,40,40,95,49,53,48,56,32,40,40,95,49,+53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,+40,40,95,49,53,48,56,32,40,40,95,49,53,48,56,32,40,40,95,49,+53,48,56,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,+55,52,51,41,32,95,49,48,50,55,41,41,32,40,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,95,55,52,51,41,32,95,49,48,50,54,41,+41,41,32,95,49,48,51,48,41,41,32,40,40,40,95,50,55,54,32,95,+49,53,48,48,41,32,95,49,48,56,52,41,32,40,40,40,95,49,54,32,+95,49,53,48,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,+32,40,95,49,48,49,51,32,35,52,48,41,41,32,40,40,95,49,53,50,+51,32,95,49,48,54,55,41,32,40,95,49,48,49,51,32,35,52,52,41,+41,41,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,53,49,41,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,40,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,57,49,41,+41,32,95,49,48,55,57,41,41,32,40,95,49,48,49,51,32,35,57,51,+41,41,41,41,41,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,53,51,41,+32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,+51,32,35,52,48,41,41,32,95,49,48,54,56,41,41,41,32,40,40,40,+95,49,54,32,95,49,53,48,49,41,32,95,49,48,55,55,41,32,40,95,+49,48,49,51,32,35,52,49,41,41,41,41,41,32,40,40,40,95,49,52,+32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,48,+48,41,32,95,55,53,52,41,32,40,40,40,95,49,53,32,95,49,53,48,+49,41,32,40,95,49,48,49,51,32,35,52,48,41,41,32,95,49,48,55,+55,41,41,41,32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,+49,48,54,56,41,32,40,95,49,48,49,51,32,35,52,49,41,41,41,41,+41,32,40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,95,+50,54,51,32,40,95,55,52,55,32,95,56,57,53,41,41,32,95,55,56,+49,41,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,+49,48,51,51,32,34,112,114,105,109,105,116,105,118,101,34,41,41,32,95,+49,48,51,49,41,41,41,41,32,40,40,65,32,58,49,48,55,57,32,40,+40,40,95,51,50,32,95,49,53,48,50,41,32,95,49,48,54,55,41,32,+40,40,40,83,39,32,95,49,53,48,56,41,32,40,40,40,83,39,32,95,+49,53,48,56,41,32,40,40,40,83,39,32,95,49,53,48,56,41,32,40,+40,40,83,39,32,95,49,53,48,56,41,32,40,40,66,32,40,40,95,49,+53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,32,35,52,52,41,+41,41,32,40,40,66,32,40,40,95,51,50,32,95,49,53,48,50,41,32,+95,49,48,54,55,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,+53,48,56,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,53,48,+56,41,41,32,40,40,40,83,39,32,40,83,39,32,95,49,53,48,56,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,95,50,55,54,32,95,49,+53,48,48,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,55,54,+54,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,52,+54,50,41,41,32,95,52,54,50,41,41,41,32,40,95,49,53,49,49,32,+40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,51,+32,35,52,52,41,41,32,95,49,48,54,55,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,95,50,55,54,32,95,49,53,48,48,41,41,+41,32,95,55,55,49,41,32,40,40,40,95,49,53,32,95,49,53,48,49,+41,32,40,95,49,48,49,52,32,34,46,46,34,41,41,32,95,49,48,54,+55,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,95,50,55,+51,32,95,49,53,48,48,41,41,41,32,95,55,55,48,41,32,40,95,49,+48,49,52,32,34,46,46,34,41,41,41,41,32,40,40,66,32,40,66,32,+40,95,49,51,32,95,49,53,48,49,41,41,41,32,40,40,66,32,40,66,+32,95,55,54,54,41,41,32,40,40,40,67,39,32,66,41,32,79,41,32,+40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,95,50,55,54,32,95,49,53,48,48,41,41,32,95,55,54,+55,41,32,40,40,40,95,49,53,32,95,49,53,48,49,41,32,40,95,49,+48,49,52,32,40,40,79,32,35,49,50,52,41,32,75,41,41,41,32,40,+40,95,49,53,50,51,32,95,49,48,54,54,41,32,40,95,49,48,49,51,+32,35,52,52,41,41,41,41,41,41,32,40,40,40,67,39,32,40,95,50,+55,54,32,95,49,53,48,48,41,41,32,95,55,54,57,41,32,40,40,40,+95,49,53,32,95,49,53,48,49,41,32,40,95,49,48,49,52,32,34,46,+46,34,41,41,32,95,49,48,54,55,41,41,41,41,32,40,40,40,67,39,+32,40,95,50,55,51,32,95,49,53,48,48,41,41,32,95,55,54,56,41,+32,40,95,49,48,49,52,32,34,46,46,34,41,41,41,41,32,40,40,66,+32,40,95,49,51,32,95,49,53,48,49,41,41,32,40,40,66,32,95,55,+54,54,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,40,+40,65,32,58,49,48,56,48,32,40,40,95,49,48,56,49,32,95,49,48,+49,53,41,32,95,49,48,54,56,41,41,32,40,40,65,32,58,49,48,56,+49,32,40,40,66,32,40,40,83,39,32,40,95,49,52,32,95,49,53,48,+49,41,41,32,40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,40,+40,83,39,32,83,41,32,85,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,95,55,52,53,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,95,49,53,49,48,41,41,32,40,40,66,32,40,95,49,52,32,95,+49,53,48,49,41,41,32,40,40,95,50,55,54,32,95,49,53,48,48,41,+32,80,41,41,41,41,41,32,40,40,65,32,58,49,48,56,50,32,40,40,+95,49,53,48,56,32,40,40,40,95,49,52,32,95,49,53,48,49,41,32,+40,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,55,56,56,41,+32,40,40,40,95,49,54,32,95,49,53,48,49,41,32,95,49,48,53,57,+41,32,40,95,49,48,49,52,32,40,40,79,32,35,54,49,41,32,75,41,+41,41,41,41,32,95,49,48,54,55,41,41,32,95,49,48,56,51,41,41,+32,40,40,65,32,58,49,48,56,51,32,40,40,95,49,53,48,56,32,40,+40,40,95,50,55,54,32,95,49,53,48,48,41,32,40,95,50,54,56,32,+95,55,56,55,41,41,32,95,49,48,54,48,41,41,32,40,40,40,95,49,+52,32,95,49,53,48,49,41,32,40,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,95,55,56,57,41,32,40,40,40,95,49,54,32,95,49,53,+48,49,41,32,95,49,48,50,56,41,32,40,95,49,48,49,52,32,34,58,+58,34,41,41,41,41,32,95,49,48,52,55,41,41,41,32,40,40,65,32,+58,49,48,56,52,32,40,40,83,32,40,85,32,40,95,50,52,32,34,101,+84,117,112,108,101,34,41,41,41,32,40,40,66,32,40,67,32,80,41,41,+32,40,90,32,40,90,32,95,55,53,48,41,41,41,41,41,32,40,40,65,+32,58,49,48,56,53,32,40,40,40,83,39,32,95,49,50,48,41,32,95,+57,49,51,41,32,95,49,51,57,41,41,32,40,40,65,32,58,49,48,56,+54,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+66,39,41,32,95,56,57,57,41,41,32,40,40,66,32,40,66,32,40,95,+52,51,49,32,40,40,79,32,35,52,54,41,32,75,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,40,67,32,79,41,+32,75,41,41,41,41,41,32,40,40,65,32,58,49,48,56,55,32,40,90,+32,40,40,66,32,85,41,32,40,90,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,40,67,39,+32,95,52,54,51,41,41,32,40,40,66,32,40,66,32,95,57,49,54,41,+41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,95,56,56,57,+41,32,40,85,32,75,41,41,41,32,40,85,32,65,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,58,92,49,48,38,+34,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,34,32,+32,102,111,117,110,100,58,32,32,32,32,34,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,32,95,+52,50,56,41,32,40,40,40,67,39,32,95,52,54,51,41,32,40,95,51,+57,53,32,95,57,54,55,41,41,32,40,40,79,32,34,69,79,70,34,41,+32,75,41,41,41,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,+79,32,35,49,48,41,32,75,41,41,41,32,40,40,66,32,40,95,52,54,+51,32,34,32,32,101,120,112,101,99,116,101,100,58,32,34,41,41,32,40,+40,66,32,95,49,54,48,57,41,32,40,95,52,52,52,32,95,49,51,51,+41,41,41,41,41,41,41,41,41,32,95,57,56,52,41,41,41,41,41,32,+40,40,65,32,58,49,48,56,56,32,85,41,32,40,40,65,32,58,49,48,+56,57,32,40,85,32,73,41,41,32,40,40,65,32,58,49,48,57,48,32,+40,40,95,50,55,49,32,40,40,66,32,40,66,32,40,95,50,54,49,32,+95,49,48,56,56,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,49,48,56,+57,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,+32,40,95,51,52,32,95,49,52,53,50,41,41,41,41,32,40,66,32,80,+41,41,41,41,41,41,32,40,95,50,55,53,32,95,49,48,57,48,41,41,+41,32,40,40,65,32,58,49,48,57,49,32,40,40,40,40,40,95,49,49,+32,95,49,48,57,48,41,32,40,40,66,32,40,95,50,54,49,32,95,49,+48,56,56,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,+52,53,50,41,41,41,32,80,41,41,41,32,40,95,51,56,32,95,49,48,+57,50,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,+48,56,56,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,49,+48,56,57,41,41,32,40,40,66,32,85,41,32,40,90,32,95,49,48,56,+57,41,41,41,41,41,32,40,95,50,48,32,95,49,48,57,49,41,41,41,+32,40,40,65,32,58,49,48,57,50,32,40,40,40,40,95,51,48,32,95,+49,48,57,49,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+49,48,56,56,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,+49,48,56,57,41,41,32,40,40,66,32,85,41,32,40,66,32,95,49,48,+56,57,41,41,41,41,41,32,40,95,49,53,32,95,49,48,57,49,41,41,+32,40,95,51,55,32,95,49,48,57,50,41,41,41,32,40,40,65,32,58,+49,48,57,51,32,40,40,95,51,57,32,95,49,48,57,50,41,32,95,50,+52,41,41,32,40,40,65,32,58,49,48,57,52,32,40,40,66,32,40,95,+50,54,49,32,95,49,48,56,56,41,41,32,40,40,66,32,40,66,32,40,+95,51,52,32,95,49,52,53,50,41,41,41,32,40,40,67,32,40,83,39,+32,80,41,41,32,73,41,41,41,41,32,40,40,65,32,58,49,48,57,53,+32,40,40,66,32,40,95,50,54,49,32,95,49,48,56,56,41,41,32,40,+40,66,32,40,66,32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,+40,66,32,40,80,32,95,49,51,52,49,41,41,41,41,41,32,40,40,65,+32,58,49,48,57,54,32,40,40,66,32,40,95,50,54,49,32,95,49,48,+56,56,41,41,32,40,90,32,40,40,66,32,40,95,51,52,32,95,49,52,+53,50,41,41,32,40,80,32,95,49,51,52,49,41,41,41,41,41,32,40,+40,65,32,58,49,48,57,55,32,40,40,95,50,54,49,32,95,49,48,56,+56,41,32,40,40,66,32,40,95,51,52,32,95,49,52,53,50,41,41,32,+40,40,83,32,80,41,32,73,41,41,41,41,32,40,40,65,32,58,49,48,+57,56,32,40,40,66,32,40,95,50,54,49,32,95,49,48,56,56,41,41,+32,40,40,40,67,39,32,66,41,32,40,95,51,50,32,95,49,52,53,50,+41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,49,52,53,50,+41,41,41,32,40,67,32,80,41,41,41,41,41,32,40,40,65,32,58,49,+48,57,57,32,95,53,57,41,32,40,40,65,32,58,49,49,48,48,32,95,+56,51,54,41,32,40,40,65,32,58,49,49,48,49,32,40,40,66,32,40,+40,95,51,50,32,95,49,52,53,50,41,32,95,49,52,50,54,41,41,32,+40,40,66,32,40,40,67,39,32,95,49,52,50,55,41,32,40,40,40,67,+39,32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,66,32,95,+52,49,49,41,32,40,95,52,50,52,32,40,40,67,32,40,95,50,48,51,+32,95,49,51,51,41,41,32,34,45,45,34,41,41,41,41,32,35,49,41,+41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,54,49,51,41,41,+32,95,49,49,48,50,41,41,41,41,32,40,40,65,32,58,49,49,48,50,+32,40,85,32,40,40,40,67,39,32,67,41,32,40,40,67,39,32,67,41,+32,40,40,66,32,40,83,32,73,41,41,32,40,40,66,32,40,66,32,89,+41,41,32,40,40,66,32,40,66,32,40,66,32,95,57,50,52,41,41,41,+32,40,40,67,39,32,40,67,39,32,95,51,57,52,41,41,32,40,40,66,+32,40,66,32,85,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,80,41,41,41,32,40,66,32,95,49,49,48,51,+41,41,41,32,75,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,95,50,54,49,41,32,40,40,66,32,95,52,55,49,41,32,40,+40,66,32,40,95,50,54,49,32,95,50,52,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,116,114,97,110,115,108,97,116,101,58,32,110,111,116,+32,102,111,117,110,100,32,34,41,41,32,95,57,48,50,41,41,41,41,41,+32,40,67,32,95,57,50,56,41,41,41,41,41,32,40,40,65,32,58,49,+49,48,51,32,40,40,66,32,89,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,32,40,+40,40,67,39,32,66,41,32,80,41,32,40,40,40,83,39,32,40,67,39,+32,66,41,41,32,40,66,32,95,49,54,49,51,41,41,32,73,41,41,41,+32,40,90,32,75,41,41,41,32,40,40,40,83,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+83,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,80,32,95,49,54,+49,51,41,41,32,40,40,67,32,66,41,32,95,54,51,53,41,41,41,32,+95,49,54,49,51,41,41,41,32,75,41,41,32,75,41,41,32,40,40,67,+32,66,41,32,95,55,48,49,41,41,41,32,40,40,40,83,39,32,95,50,+54,49,41,32,40,40,66,32,95,52,55,49,41,32,40,40,66,32,40,95,+50,54,49,32,95,50,52,41,41,32,40,95,52,54,51,32,34,116,114,97,+110,115,58,32,110,111,32,112,114,105,109,111,112,32,34,41,41,41,41,32,+40,40,67,32,40,95,52,51,54,32,95,49,51,51,41,41,32,95,49,49,+48,52,41,41,41,41,32,40,40,67,32,66,41,32,40,40,66,32,40,95,+54,55,54,32,40,95,54,55,56,32,40,95,55,56,49,32,34,100,121,110,+115,121,109,34,41,41,41,41,32,40,40,66,32,95,54,55,56,41,32,95,+55,56,48,41,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,+95,50,52,41,41,32,40,40,66,32,40,95,52,54,51,32,34,116,114,97,+110,115,58,32,105,109,112,111,115,115,105,98,108,101,58,32,34,41,41,32,+40,95,49,53,57,48,32,95,55,49,56,41,41,41,41,41,41,32,40,40,+65,32,58,49,49,48,52,32,40,40,79,32,40,40,80,32,40,40,79,32,+35,54,54,41,32,75,41,41,32,66,41,41,32,40,40,79,32,40,40,80,+32,40,40,79,32,35,55,57,41,32,75,41,41,32,79,41,41,32,40,40,+79,32,40,40,80,32,40,40,79,32,35,55,53,41,32,75,41,41,32,75,+41,41,32,40,40,79,32,40,40,80,32,34,67,39,34,41,32,67,39,41,+41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,54,55,41,32,75,+41,41,32,67,41,41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,+54,53,41,32,75,41,41,32,65,41,41,32,40,40,79,32,40,40,80,32,+34,83,39,34,41,32,83,39,41,41,32,40,40,79,32,40,40,80,32,40,+40,79,32,35,56,48,41,32,75,41,41,32,80,41,41,32,40,40,79,32,+40,40,80,32,40,40,79,32,35,55,51,41,32,75,41,41,32,73,41,41,+32,40,40,79,32,40,40,80,32,40,40,79,32,35,56,51,41,32,75,41,+41,32,83,41,41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,56,+53,41,32,75,41,41,32,85,41,41,32,40,40,79,32,40,40,80,32,40,+40,79,32,35,56,57,41,32,75,41,41,32,89,41,41,32,40,40,79,32,+40,40,80,32,34,66,39,34,41,32,66,39,41,41,32,40,40,79,32,40,+40,80,32,40,40,79,32,35,57,48,41,32,75,41,41,32,90,41,41,32,+40,40,79,32,40,40,80,32,40,40,79,32,35,56,50,41,32,75,41,41,+32,82,41,41,32,40,40,79,32,40,40,80,32,40,40,79,32,35,52,51,+41,32,75,41,41,32,43,41,41,32,40,40,79,32,40,40,80,32,40,40,+79,32,35,52,53,41,32,75,41,41,32,45,41,41,32,40,40,79,32,40,+40,80,32,40,40,79,32,35,52,50,41,32,75,41,41,32,42,41,41,32,+40,40,79,32,40,40,80,32,34,113,117,111,116,34,41,32,113,117,111,116,+41,41,32,40,40,79,32,40,40,80,32,34,114,101,109,34,41,32,114,101,+109,41,41,32,40,40,79,32,40,40,80,32,34,117,113,117,111,116,34,41,+32,117,113,117,111,116,41,41,32,40,40,79,32,40,40,80,32,34,117,114,+101,109,34,41,32,117,114,101,109,41,41,32,40,40,79,32,40,40,80,32,+34,110,101,103,34,41,32,110,101,103,41,41,32,40,40,79,32,40,40,80,+32,34,97,110,100,34,41,32,97,110,100,41,41,32,40,40,79,32,40,40,+80,32,34,111,114,34,41,32,111,114,41,41,32,40,40,79,32,40,40,80,+32,34,120,111,114,34,41,32,120,111,114,41,41,32,40,40,79,32,40,40,+80,32,34,105,110,118,34,41,32,105,110,118,41,41,32,40,40,79,32,40,+40,80,32,34,115,104,108,34,41,32,115,104,108,41,41,32,40,40,79,32,+40,40,80,32,34,115,104,114,34,41,32,115,104,114,41,41,32,40,40,79,+32,40,40,80,32,34,97,115,104,114,34,41,32,97,115,104,114,41,41,32,+40,40,79,32,40,40,80,32,34,115,117,98,116,114,97,99,116,34,41,32,+115,117,98,116,114,97,99,116,41,41,32,40,40,79,32,40,40,80,32,34,+61,61,34,41,32,61,61,41,41,32,40,40,79,32,40,40,80,32,34,47,+61,34,41,32,47,61,41,41,32,40,40,79,32,40,40,80,32,40,40,79,+32,35,54,48,41,32,75,41,41,32,60,41,41,32,40,40,79,32,40,40,+80,32,34,60,61,34,41,32,60,61,41,41,32,40,40,79,32,40,40,80,+32,40,40,79,32,35,54,50,41,32,75,41,41,32,62,41,41,32,40,40,+79,32,40,40,80,32,34,62,61,34,41,32,62,61,41,41,32,40,40,79,+32,40,40,80,32,34,117,60,34,41,32,117,60,41,41,32,40,40,79,32,+40,40,80,32,34,117,60,61,34,41,32,117,60,61,41,41,32,40,40,79,+32,40,40,80,32,34,117,62,34,41,32,117,62,41,41,32,40,40,79,32,+40,40,80,32,34,117,62,61,34,41,32,117,62,61,41,41,32,40,40,79,+32,40,40,80,32,34,102,97,100,100,34,41,32,102,97,100,100,41,41,32,+40,40,79,32,40,40,80,32,34,102,115,117,98,34,41,32,102,115,117,98,+41,41,32,40,40,79,32,40,40,80,32,34,102,109,117,108,34,41,32,102,+109,117,108,41,41,32,40,40,79,32,40,40,80,32,34,102,100,105,118,34,+41,32,102,100,105,118,41,41,32,40,40,79,32,40,40,80,32,34,102,101,+113,34,41,32,102,101,113,41,41,32,40,40,79,32,40,40,80,32,34,102,+110,101,34,41,32,102,110,101,41,41,32,40,40,79,32,40,40,80,32,34,+102,108,116,34,41,32,102,108,116,41,41,32,40,40,79,32,40,40,80,32,+34,102,108,101,34,41,32,102,108,101,41,41,32,40,40,79,32,40,40,80,+32,34,102,103,116,34,41,32,102,103,116,41,41,32,40,40,79,32,40,40,+80,32,34,102,103,101,34,41,32,102,103,101,41,41,32,40,40,79,32,40,+40,80,32,34,102,110,101,103,34,41,32,102,110,101,103,41,41,32,40,40,+79,32,40,40,80,32,34,102,115,104,111,119,34,41,32,102,115,104,111,119,+41,41,32,40,40,79,32,40,40,80,32,34,102,114,101,97,100,34,41,32,+102,114,101,97,100,41,41,32,40,40,79,32,40,40,80,32,34,105,116,111,+102,34,41,32,105,116,111,102,41,41,32,40,40,79,32,40,40,80,32,34,+115,101,113,34,41,32,115,101,113,41,41,32,40,40,79,32,40,40,80,32,+34,101,114,114,111,114,34,41,32,101,114,114,111,114,41,41,32,40,40,79,+32,40,40,80,32,34,101,113,117,97,108,34,41,32,101,113,117,97,108,41,+41,32,40,40,79,32,40,40,80,32,34,99,111,109,112,97,114,101,34,41,+32,99,111,109,112,97,114,101,41,41,32,40,40,79,32,40,40,80,32,34,+114,110,102,34,41,32,114,110,102,41,41,32,40,40,79,32,40,40,80,32,+34,110,111,77,97,116,99,104,34,41,32,110,111,77,97,116,99,104,41,41,+32,40,40,79,32,40,40,80,32,34,110,111,68,101,102,97,117,108,116,34,+41,32,110,111,68,101,102,97,117,108,116,41,41,32,40,40,79,32,40,40,+80,32,34,73,79,46,62,62,61,34,41,32,73,79,46,62,62,61,41,41,+32,40,40,79,32,40,40,80,32,34,73,79,46,62,62,34,41,32,73,79,+46,62,62,41,41,32,40,40,79,32,40,40,80,32,34,73,79,46,114,101,+116,117,114,110,34,41,32,73,79,46,114,101,116,117,114,110,41,41,32,40,+40,79,32,40,40,80,32,34,73,79,46,112,114,105,110,116,34,41,32,73,+79,46,112,114,105,110,116,41,41,32,40,40,79,32,40,40,80,32,34,73,+79,46,115,101,114,105,97,108,105,122,101,34,41,32,73,79,46,115,101,114,+105,97,108,105,122,101,41,41,32,40,40,79,32,40,40,80,32,34,73,79,+46,100,101,115,101,114,105,97,108,105,122,101,34,41,32,73,79,46,100,101,+115,101,114,105,97,108,105,122,101,41,41,32,40,40,79,32,40,40,80,32,+34,73,79,46,115,116,100,105,110,34,41,32,73,79,46,115,116,100,105,110,+41,41,32,40,40,79,32,40,40,80,32,34,73,79,46,115,116,100,111,117,+116,34,41,32,73,79,46,115,116,100,111,117,116,41,41,32,40,40,79,32,+40,40,80,32,34,73,79,46,115,116,100,101,114,114,34,41,32,73,79,46,+115,116,100,101,114,114,41,41,32,40,40,79,32,40,40,80,32,34,73,79,+46,103,101,116,65,114,103,115,34,41,32,73,79,46,103,101,116,65,114,103,+115,41,41,32,40,40,79,32,40,40,80,32,34,73,79,46,100,114,111,112,+65,114,103,115,34,41,32,73,79,46,100,114,111,112,65,114,103,115,41,41,+32,40,40,79,32,40,40,80,32,34,73,79,46,112,101,114,102,111,114,109,+73,79,34,41,32,73,79,46,112,101,114,102,111,114,109,73,79,41,41,32,+40,40,79,32,40,40,80,32,34,73,79,46,99,97,116,99,104,34,41,32,+73,79,46,99,97,116,99,104,41,41,32,40,40,79,32,40,40,80,32,34,+100,121,110,115,121,109,34,41,32,100,121,110,115,121,109,41,41,32,40,40,+79,32,40,40,80,32,34,110,101,119,67,65,83,116,114,105,110,103,34,41,+32,110,101,119,67,65,83,116,114,105,110,103,41,41,32,40,40,79,32,40,+40,80,32,34,112,101,101,107,67,65,83,116,114,105,110,103,34,41,32,112,+101,101,107,67,65,83,116,114,105,110,103,41,41,32,40,40,79,32,40,40,+80,32,34,116,111,73,110,116,34,41,32,116,111,73,110,116,41,41,32,40,+40,79,32,40,40,80,32,34,116,111,80,116,114,34,41,32,116,111,80,116,+114,41,41,32,40,40,79,32,40,40,80,32,34,116,111,68,98,108,34,41,+32,116,111,68,98,108,41,41,32,75,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,+48,53,32,34,68,97,116,97,46,66,111,111,108,95,84,121,112,101,46,34,+41,32,40,40,65,32,58,49,49,48,54,32,34,68,97,116,97,46,76,105,+115,116,95,84,121,112,101,46,34,41,32,40,40,65,32,58,49,49,48,55,+32,34,80,114,105,109,105,116,105,118,101,115,46,73,110,116,34,41,32,40,+40,65,32,58,49,49,48,56,32,34,80,114,105,109,105,116,105,118,101,115,+46,87,111,114,100,34,41,32,40,40,65,32,58,49,49,48,57,32,34,80,+114,105,109,105,116,105,118,101,115,46,68,111,117,98,108,101,34,41,32,40,+40,65,32,58,49,49,49,48,32,34,80,114,105,109,105,116,105,118,101,115,+46,67,104,97,114,34,41,32,40,40,65,32,58,49,49,49,49,32,34,68,+97,116,97,46,73,110,116,101,103,101,114,95,84,121,112,101,46,73,110,116,+101,103,101,114,34,41,32,40,40,65,32,58,49,49,49,50,32,34,80,114,+105,109,105,116,105,118,101,115,46,126,34,41,32,40,40,65,32,58,49,49,+49,51,32,34,80,114,105,109,105,116,105,118,101,115,46,61,62,34,41,32,+40,40,65,32,58,49,49,49,52,32,34,80,114,105,109,105,116,105,118,101,+115,46,45,62,34,41,32,40,40,65,32,58,49,49,49,53,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,49,+54,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,65,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,+49,55,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,32,40,40,+65,32,58,49,49,49,56,32,80,41,32,40,40,65,32,58,49,49,49,57,+32,80,41,32,40,40,65,32,58,49,49,50,48,32,40,40,95,50,48,49,+32,40,40,67,32,66,41,32,40,40,66,32,90,41,32,40,40,67,32,66,+41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,95,50,48,50,32,95,56,57,50,41,41,32,95,49,49,51,54,+41,41,32,95,49,49,51,54,41,41,41,41,41,41,32,40,95,50,48,53,+32,95,49,49,50,48,41,41,41,32,40,40,65,32,58,49,49,50,49,32,+40,85,32,65,41,41,32,40,40,65,32,58,49,49,50,50,32,40,40,66,+32,40,66,32,67,41,41,32,80,41,41,32,40,40,65,32,58,49,49,50,+51,32,40,40,66,32,85,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,83,39,41,+41,32,40,40,66,32,40,40,67,39,32,67,39,41,32,40,40,66,32,95,+49,48,57,57,41,32,95,49,50,50,52,41,41,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,67,32,40,40,40,67,39,32,83,39,41,32,95,49,49,55,51,41,+32,40,85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,+41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,90,32,40,90,+32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,32,40,85,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,32,40,85,32,40,75,32,40,75,32,40,75,32,40,90,32,+40,90,32,75,41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,41,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,66,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,67,39,32,40,67,39,32,67,39,41,41,32,+40,40,40,67,39,32,66,41,32,95,49,49,50,52,41,32,40,40,66,32,+40,95,52,52,53,32,40,40,95,50,54,57,32,40,95,50,48,50,32,95,+56,57,50,41,41,32,95,53,54,53,41,41,41,32,40,40,66,32,95,51,+57,51,41,32,40,40,66,32,40,95,51,57,52,32,40,85,32,40,75,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,40,+67,32,79,41,32,75,41,41,41,41,41,41,41,41,41,41,41,32,95,57,+50,50,41,41,41,41,41,32,40,40,66,32,95,51,57,51,41,32,40,85,+32,40,90,32,75,41,41,41,41,41,41,32,40,40,66,32,95,57,50,51,+41,32,95,49,49,52,51,41,41,41,32,40,40,66,32,95,51,57,51,41,+32,40,85,32,40,75,32,75,41,41,41,41,41,32,40,40,66,32,95,57,+50,51,41,32,95,49,49,53,48,41,41,41,32,40,40,66,32,95,51,57,+51,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,52,49,53,41,41,+41,41,32,40,40,67,39,32,40,67,39,32,95,51,57,53,41,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,66,32,40,67,32,95,49,49,50,54,41,41,+32,95,49,49,52,49,41,41,32,95,49,49,52,50,41,41,32,95,49,49,+52,53,41,41,32,95,49,49,52,56,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,95,57,50,52,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,95,51,57,52,32,40,85,+32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,67,39,32,95,52,54,50,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,80,41,41,32,95,49,49,51,50,41,41,+41,32,40,95,51,57,52,32,40,85,32,40,40,67,32,66,41,32,40,90,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,67,39,32,40,67,39,32,+80,41,41,32,95,52,55,49,41,41,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,32,95,49,49,51,52,41,41,41,32,40,95,51,57,53,32,+95,49,49,50,53,41,41,41,41,32,40,40,65,32,58,49,49,50,52,32,+40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,+66,32,95,49,52,56,49,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,49,52,56,49,41,32,40,89,32,40,40,66,32,40,80,32,+95,49,51,52,49,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,+40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,66,32,+40,67,32,95,49,52,56,49,41,41,41,41,41,41,41,41,41,32,40,89,+32,40,40,66,32,40,80,32,95,49,51,52,49,41,41,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,90,41,32,40,66,32,40,67,32,+95,49,52,56,49,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+95,49,49,49,53,41,41,32,40,40,65,32,58,49,49,50,53,32,40,40,+83,32,73,41,32,40,40,66,32,40,83,32,66,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,80,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,41,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,83,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,66,39,32,80,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,83,39,32,67,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,67,39,32,67,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,39,32,67,+41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,67,39,41,41,32,40,40,66,32,+40,66,32,67,39,41,41,32,95,49,49,49,53,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,83,39,32,40,83,39,32,95,50,54,49,41,41,+32,40,40,66,32,40,66,32,95,51,57,53,41,41,32,40,40,66,32,40,+66,32,40,83,32,73,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,90,41,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,39,41,41,41,32,+67,41,32,40,40,40,67,39,32,67,41,32,95,49,49,49,55,41,32,95,+52,54,49,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,67,39,+32,40,67,39,32,95,51,57,54,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,67,41,41,32,40,40,66,32,95,52,+54,51,41,32,40,95,51,57,52,32,40,40,67,32,40,40,80,32,40,75,+32,75,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,40,75,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,67,39,32,95,51,57,54,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,82,41,+32,40,95,51,57,52,32,40,40,67,32,40,40,80,32,40,75,32,75,41,+41,32,40,75,32,75,41,41,41,32,40,40,67,32,79,41,32,75,41,41,+41,41,41,41,41,41,41,41,41,32,40,95,51,57,52,32,40,40,67,32,+40,40,80,32,40,40,67,32,79,41,32,75,41,41,32,40,75,32,75,41,+41,41,32,40,75,32,75,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,95,50,48,51,32,95,49,49,55,41,41,41,32,40,95,52,+51,50,32,95,56,57,50,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,49,50,54,32,40,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,66,39,32,40,40,66,32,80,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,67,32,95,57,50,+56,41,41,32,40,40,40,83,39,32,95,50,54,49,41,32,40,40,66,32,+95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,32,+40,40,66,32,40,95,52,54,51,32,34,117,110,100,101,102,105,110,101,100,+32,109,111,100,117,108,101,58,32,34,41,41,32,95,57,48,50,41,41,41,+41,32,40,85,32,40,75,32,40,75,32,40,90,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,+67,39,32,40,67,39,32,40,83,39,32,80,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+79,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+67,39,32,66,41,41,32,95,49,49,49,55,41,41,41,32,95,49,49,51,+51,41,41,32,75,41,41,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,67,41,32,40,67,32,95,57,50,56,41,41,32,95,52,54,+49,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,41,+32,75,41,41,41,41,32,95,52,54,49,41,41,32,95,49,49,50,56,41,+41,41,32,40,67,32,95,49,49,50,55,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,80,41,41,32,40,40,40,67,39,32,+40,67,39,32,79,41,41,32,40,40,40,67,39,32,67,41,32,95,49,49,+49,55,41,32,95,52,54,49,41,41,32,75,41,41,41,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,67,32,95,57,+50,56,41,41,32,95,52,54,49,41,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,80,41,32,75,41,41,41,41,32,95,52,54,49,41,+41,32,95,49,49,50,56,41,41,41,32,40,67,32,95,49,49,50,55,41,+41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,40,80,32,95,52,+54,49,41,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,79,41,41,32,40,40,66,32,40,83,32,95,49,49,49,56,41,+41,32,40,67,32,95,49,49,50,55,41,41,41,32,75,41,41,41,41,32,+40,40,65,32,58,49,49,50,55,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,95,50,54,49,41,32,40,40,40,67,39,32,95,49,55,55,41,+32,40,40,66,32,95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,+55,41,41,41,32,95,50,54,52,41,41,41,32,40,95,49,51,51,51,32,+34,101,120,112,111,114,116,34,41,41,41,32,40,40,65,32,58,49,49,50,+56,32,40,40,67,32,40,40,67,32,66,41,32,40,40,66,32,90,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,80,32,73,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,41,32,40,95,50,+52,32,34,116,121,81,73,100,101,110,116,34,41,41,41,32,40,40,65,32,+58,49,49,50,57,32,40,40,66,32,40,95,50,54,51,32,95,55,52,51,+41,41,32,95,56,57,56,41,41,32,40,40,65,32,58,49,49,51,48,32,+40,40,67,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,32,+83,39,41,32,40,40,80,32,73,41,32,40,90,32,95,49,49,51,48,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,95,50,52,32,+34,103,101,116,65,112,112,67,111,110,34,41,41,41,32,40,40,65,32,58,+49,49,51,49,32,40,40,89,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,+41,41,32,40,40,66,32,40,40,83,39,32,80,41,32,40,67,32,80,41,+41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,+52,54,50,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,95,50,52,32,34,103,101,116,65,112,112,34,41,41,41,32,95,52,54,+49,41,41,32,40,40,65,32,58,49,49,51,50,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,40,83,39,32,83,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,39,32,+83,41,32,40,40,40,83,39,32,40,67,39,32,67,39,41,41,32,40,40,+66,32,40,66,32,67,39,41,41,32,40,40,66,32,40,83,32,95,49,49,+49,53,41,41,32,40,40,67,39,32,95,51,57,52,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,66,32,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,+75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,+40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,+32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,75,41,41,41,+32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,95,51,57,52,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,67,39,32,80,+41,41,32,95,57,48,53,41,41,32,75,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,75,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,95,52,54,51,41,41,41,32,40,40,67,39,32,40,67,39,32,95,51,+57,52,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,80,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,85,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,+32,83,41,32,40,83,32,95,49,49,49,55,41,41,41,32,75,41,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,75,32,75,41,41,41,41,32,40,40,40,83,+39,32,40,83,39,32,40,83,39,32,95,52,54,51,41,41,41,32,40,40,+67,39,32,40,67,39,32,95,51,57,52,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,66,32,40,66,32,40,80,32,40,75,32,40,75,32,75,41,41,41,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,85,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,83,+41,32,40,83,32,95,49,49,49,55,41,41,41,32,75,41,41,41,41,41,+41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,+75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,+32,75,41,41,41,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,40,75,32,75,41,41,41,41,41,41,32,40,75,32,75,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,40,67,39,32,95,52,54,+51,41,41,41,32,40,40,67,39,32,40,67,39,32,95,51,57,52,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,+32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,+41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,+75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,32,+40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,+41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+85,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,83,41,+32,40,83,32,95,49,49,49,55,41,41,41,32,75,41,41,41,41,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,41,32,40,75,32,75,41,41,41,41,32,40,40,67,39,32,95,51,57,+52,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,+67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,32,+40,75,32,75,41,41,41,41,41,32,40,40,66,32,90,41,32,40,40,66,+32,85,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,+32,79,41,41,32,40,40,40,67,39,32,67,41,32,40,83,32,95,49,49,+49,55,41,41,32,95,52,54,49,41,41,32,75,41,41,41,41,41,41,32,+40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,+41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,32,40,75,+32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,41,32,+40,75,32,75,41,41,41,41,41,41,41,41,32,40,40,67,39,32,95,51,+57,52,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,+40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,+32,40,75,32,75,41,41,41,41,41,32,40,40,66,32,40,67,32,66,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+79,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,57,+48,53,41,41,41,32,40,67,32,95,55,54,48,41,41,41,32,75,41,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,+32,40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,+41,41,32,40,75,32,75,41,41,41,41,41,41,32,40,40,66,32,95,57,+50,51,41,32,95,49,49,52,56,41,41,41,32,40,40,66,32,95,57,50,+51,41,32,95,49,49,53,48,41,41,41,32,40,40,67,39,32,95,51,57,+52,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,66,+32,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,+75,32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,+41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,95,49,49,49,56,+41,41,32,40,40,66,32,40,66,32,95,49,49,49,57,41,41,32,40,40,+66,32,40,66,32,95,55,52,51,41,41,32,95,57,48,53,41,41,41,41,+32,75,41,41,41,32,40,75,32,75,41,41,41,32,40,75,32,40,75,32,+40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,+41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,+41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,41,41,+41,32,40,75,32,75,41,41,41,41,41,32,95,49,51,48,50,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,40,83,39,32,95,+49,49,51,51,41,32,95,49,49,52,50,41,32,95,49,49,52,53,41,41,+41,32,95,57,48,53,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,40,95,49,51,51,51,32,75,41,+41,41,32,95,57,48,53,41,41,32,95,49,49,52,49,41,41,32,40,75,+32,95,49,51,48,50,41,41,41,32,73,41,41,41,32,95,49,49,52,55,+41,41,32,40,40,65,32,58,49,49,51,51,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,95,51,57,53,41,32,40,40,66,32,+40,40,83,39,32,95,49,49,49,56,41,32,95,57,48,57,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,67,32,+40,95,49,51,51,51,32,75,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,73,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,+50,54,49,32,40,95,52,55,49,32,95,52,54,49,41,41,41,41,32,40,+67,32,95,57,50,56,41,41,41,41,32,40,40,65,32,58,49,49,51,52,+32,40,40,67,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,+40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,+67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,+32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,80,41,32,40,40,66,32,95,57,50,52,41,+32,40,95,51,57,52,32,40,85,32,40,75,32,40,85,32,40,75,32,40,+90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,49,51,51,52,32,40,95,52,51,56,32,95,49,49,50,48,+41,41,41,41,41,32,40,40,67,39,32,95,51,57,52,41,32,40,40,66,+32,85,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,90,41,41,41,41,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,95,51,57,52,41,32,40,40,40,67,39,32,40,+67,39,32,79,41,41,32,40,40,66,32,40,67,32,80,41,41,32,40,40,+67,32,79,41,32,75,41,41,41,32,75,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,95,57,50,52,+41,32,40,95,51,57,52,32,40,85,32,40,75,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,95,50,54,49,32,+95,57,50,52,41,41,32,40,95,51,57,52,32,40,85,32,40,75,32,40,+85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+95,50,54,49,32,40,95,57,50,53,32,95,49,49,51,53,41,41,41,32,+40,95,51,57,52,32,40,85,32,40,75,32,40,85,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,+32,40,95,49,51,51,52,32,40,95,52,51,56,32,95,49,49,50,48,41,+41,41,41,41,32,40,40,67,39,32,95,51,57,52,41,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,66,41,41,41,+32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,67,39,32,95,52,54,51,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,95,51,57,52,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,85,41,41,41,32,40,66,32,40,66,32,40,66,32,40,40,+67,39,32,95,51,57,52,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,40,66,32,40,67,32,80,41,41,32,40,40,67,32,79,41,+32,75,41,41,41,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,52,54,51,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,85,41,41,41,32,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,95,51,57,52,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,40,40,66,32,40,67,32,80,41,41,32,40,40,67,+32,79,41,32,75,41,41,41,32,75,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,95,51,57,52,32,40,85,32,40,40,66,32,85,41,32,+40,90,32,40,90,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,40,67,32,40,40,40,67,39,32,40,67,39,32,79,41,41,+32,40,40,66,32,40,83,32,80,41,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,40,40,67,39,32,95,49,49,49,57,41,32,95,55,+52,51,41,41,32,75,41,41,41,32,75,41,41,41,32,95,49,50,53,49,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,95,50,54,49,32,95,57,50,52,41,41,32,40,95,+51,57,52,32,40,85,32,40,40,67,32,66,41,32,40,90,32,40,90,32,+40,40,66,32,90,41,32,40,40,67,32,66,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,40,67,32,40,40,67,39,32,95,51,57,52,41,32,40,40,66,+32,85,41,32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,79,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,57,48,53,41,+41,32,40,40,66,32,95,51,57,52,41,32,40,40,66,32,85,41,32,40,+40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+95,57,48,53,41,32,75,41,41,41,41,41,41,32,75,41,41,41,41,41,+41,41,32,40,67,32,95,52,55,49,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,+66,32,90,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,67,32,+83,39,41,41,32,40,40,40,83,39,32,66,41,32,79,41,32,40,40,40,+67,39,32,40,67,39,32,79,41,41,32,40,67,32,95,57,48,53,41,41,+32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,+32,40,67,32,95,57,48,53,41,41,32,75,41,41,41,41,32,95,52,55,+49,41,41,41,41,41,41,32,40,40,65,32,58,49,49,51,53,32,40,40,+67,32,66,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,66,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,67,39,41,41,32,40,40,66,32,40,66,+32,95,49,49,50,50,41,41,32,40,40,66,32,40,67,32,40,95,51,57,+55,32,40,40,95,50,54,49,32,95,50,54,56,41,32,40,95,57,51,48,+32,75,41,41,41,41,41,32,95,57,50,51,41,41,41,41,32,40,95,52,+51,57,32,95,49,49,51,55,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,49,51,54,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,73,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,+32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,+50,41,41,41,32,95,55,55,50,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,40,65,32,58,49,49,51,55,32,40,40,+67,32,66,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,67,32,66,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+95,56,50,52,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,51,+56,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,67,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,80,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,49,51,57,32,75,41,32,40,40,65,32,58,49,49,52,48,32,+65,41,32,40,40,65,32,58,49,49,52,49,32,40,85,32,40,75,32,40,+75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,49,52,50,32,40,85,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,49,52,51,32,40,85,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,+90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,49,52,52,32,40,85,32,40,+75,32,40,75,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,53,32,40,85,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,54,32,40,85,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,55,32,40,+85,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,+40,90,32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,56,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,52,57,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,90,32,40,90,32,40,90,32,75,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,+48,32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,90,32,40,90,+32,40,85,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,49,53,49,32,40,85,32,40,75,32,40,75,32,+40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,90,32,40,90,32,40,85,32,65,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,50,32,+40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,75,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,51,+32,40,85,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,+75,32,40,75,32,40,75,32,40,75,32,40,75,32,40,75,32,65,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,53,+52,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,+41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,32,95,49,49,51,56,41,41,+41,41,41,41,32,40,40,65,32,58,49,49,53,53,32,40,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,66,32,+85,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,+50,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,+40,67,39,32,67,41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,+40,40,65,32,58,49,49,53,54,32,40,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,+41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,95,49,49,51,56,41,41,41,+41,41,41,32,40,40,65,32,58,49,49,53,55,32,40,40,66,32,40,40,+95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,66,32,85,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,90,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,58,+49,49,53,56,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,58,+49,49,53,57,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,67,39,32,66,41,32,66,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,39,41,+41,41,41,41,41,41,41,41,41,32,95,49,49,51,56,41,41,32,80,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,54,48,32,40,40,+66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,+40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,90,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,39,41,41,41,41,+41,41,41,41,41,41,32,95,49,49,51,56,41,41,32,40,67,32,80,41,+41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,54,49,32,40,+40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,32,+40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,+41,41,41,32,95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,+58,49,49,54,50,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,+32,95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,32,+95,49,49,51,56,41,41,41,41,41,41,32,40,40,65,32,58,49,49,54,+51,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,57,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,53,56,+41,41,32,95,49,49,53,56,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,49,49,53,+56,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,+40,65,32,58,49,49,54,52,32,40,40,66,32,40,40,95,51,50,32,95,+53,56,41,32,95,54,51,41,41,32,40,40,66,32,85,41,32,40,40,66,+32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,95,51,51,32,95,53,+56,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,41,41,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,95,49,49,+51,56,41,32,95,49,49,56,49,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,+40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,41,+32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,90,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,95,51,51,32,95,53,56,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,41,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,67,41,41,41,32,95,49,49,51,56,41,41,41,41,41,+32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,49,54,53,32,40,40,66,32,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,95,54,51,41,41,41,32,40,40,66,32,40,+66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,54,+50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,32,95,49,+49,51,56,41,41,41,32,95,57,50,57,41,41,41,41,41,32,40,40,65,+32,58,49,49,54,54,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,54,51,41,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,54,50,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,41,41,41,41,41,41,32,95,49,49,51,56,41,41,41,32,95,+57,50,57,41,41,41,41,41,32,40,40,65,32,58,49,49,54,55,32,40,+40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,95,52,+51,32,95,53,56,41,32,40,85,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,49,57,54,41,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,40,83,39,32,66,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,39,41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,+32,95,49,49,51,49,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+66,39,32,40,40,66,32,40,83,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,66,32,40,66,32,40,40,67,39,32,67,39,41,32,40,40,66,32,67,+39,41,32,83,39,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,39,41,32,+83,39,41,41,41,32,40,40,66,32,40,66,32,40,67,32,66,41,41,41,+32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,80,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,+67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,32,67,39,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,80,41,41,41,32,40,40,66,+32,67,41,32,40,40,40,67,39,32,40,67,39,32,95,49,49,50,50,41,+41,32,40,67,32,95,57,50,49,41,41,32,95,52,54,49,41,41,41,41,+41,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,90,32,75,+41,41,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,40,66,39,32,80,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,67,39,32,40,67,39,32,40,95,49,49,50,50,32,+95,57,50,48,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,79,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,67,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,+32,40,40,67,39,32,95,51,57,53,41,32,95,56,50,50,41,41,41,41,+32,40,40,67,39,32,95,51,57,53,41,32,95,56,50,50,41,41,41,32,+75,41,41,41,41,41,32,40,40,67,32,40,95,52,49,51,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,80,41,32,95,55,57,56,41,41,32,+95,55,53,56,41,41,41,32,40,40,40,95,49,56,53,32,95,49,57,56,+41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,+32,35,45,49,41,41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,+32,40,95,51,53,57,32,35,45,50,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,+54,52,32,95,49,49,53,48,41,41,41,32,40,40,66,32,40,66,32,40,+95,50,54,49,32,95,49,49,53,57,41,41,41,32,40,67,32,40,95,51,+57,55,32,40,40,95,50,54,49,32,95,50,54,56,41,32,40,95,57,51,+48,32,95,49,49,51,53,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,49,54,56,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,49,57,54,41,41,32,40,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,+49,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,+41,41,41,41,41,41,32,95,49,49,51,56,41,41,41,32,40,40,66,32,+40,66,32,95,52,54,50,41,41,32,80,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,49,54,57,32,40,40,67,32,83,41,32,40,40,66,32,+40,67,32,66,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,+67,39,32,95,50,54,49,41,41,32,95,49,49,55,48,41,41,41,32,40,+67,32,95,49,49,54,57,41,41,41,41,41,32,40,40,65,32,58,49,49,+55,48,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,+95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,40,95,51,50,+32,95,53,56,41,41,32,95,49,49,57,54,41,32,95,49,49,57,55,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,51,+32,95,53,56,41,41,32,40,40,40,67,39,32,95,50,54,49,41,32,40,+40,66,32,40,95,52,53,32,95,53,56,41,41,32,40,40,66,32,95,49,+50,50,41,32,40,40,66,32,95,51,57,50,41,32,40,40,66,32,95,49,+51,49,50,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,+95,49,51,48,50,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,40,+67,32,83,39,41,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,40,+83,39,32,40,67,39,32,67,39,41,41,32,40,40,66,32,85,41,32,75,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+67,41,32,40,67,32,40,40,67,32,40,95,50,48,50,32,95,56,57,50,+41,41,32,40,95,56,57,55,32,95,49,49,49,50,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,67,+41,32,95,49,49,55,50,41,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,+40,66,32,67,41,32,95,49,49,55,49,41,41,41,41,41,32,40,40,65,+32,58,49,49,55,49,32,40,40,66,32,40,66,32,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,53,48,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,+56,41,41,41,32,40,40,66,32,95,49,51,49,55,41,32,95,55,52,51,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,51,+51,32,95,53,56,41,41,32,95,49,49,54,55,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,+32,95,49,49,53,57,41,41,32,40,95,51,52,32,95,53,56,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,49,55,50,32,40,75,32,40,40,+66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,+95,54,52,32,95,49,49,53,49,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,+40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,49,49,54,48,41,41,41,32,95,49,51,51,48,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,+53,56,41,41,32,95,49,49,54,48,41,41,32,40,95,51,52,32,95,53,+56,41,41,41,41,41,41,41,32,40,40,65,32,58,49,49,55,51,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,67,39,32,67,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,67,32,95,49,+49,51,56,41,32,35,49,41,41,32,40,40,67,32,40,95,51,57,55,32,+40,95,50,54,56,32,95,49,51,51,56,41,41,41,32,95,49,49,56,50,+41,41,41,32,40,40,67,32,40,95,51,57,55,32,40,95,50,54,56,32,+95,49,51,51,56,41,41,41,32,95,49,49,56,51,41,41,41,32,95,50,+57,48,41,41,32,95,49,49,51,57,41,41,41,41,32,40,40,67,32,80,+41,32,95,52,54,49,41,41,41,32,95,52,54,49,41,41,32,95,52,54,+49,41,41,32,40,40,65,32,58,49,49,55,52,32,95,55,57,57,41,32,+40,40,65,32,58,49,49,55,53,32,40,40,95,49,49,57,48,32,95,55,+57,57,41,32,95,55,57,57,41,41,32,40,40,65,32,58,49,49,55,54,+32,40,40,95,50,54,49,32,40,95,49,49,57,48,32,95,55,57,57,41,+41,32,40,40,95,49,49,57,48,32,95,55,57,57,41,32,95,55,57,57,+41,41,41,32,40,40,65,32,58,49,49,55,55,32,40,40,95,50,54,49,+32,40,95,49,49,57,48,32,95,56,48,48,41,41,32,40,40,95,49,49,+57,48,32,95,55,57,57,41,32,95,55,57,57,41,41,41,32,40,40,65,+32,58,49,49,55,56,32,40,40,95,49,49,57,48,32,95,55,57,57,41,+32,40,40,95,49,49,57,48,32,95,55,57,57,41,32,95,56,48,48,41,+41,41,32,40,40,65,32,58,49,49,55,57,32,40,40,40,95,56,56,57,+32,34,98,117,105,108,116,105,110,34,41,32,35,48,41,32,35,48,41,41,+32,40,40,65,32,58,49,49,56,48,32,40,95,56,57,56,32,95,49,49,+55,57,41,41,32,40,40,65,32,58,49,49,56,49,32,40,40,40,66,32,+95,49,51,51,53,41,32,40,40,40,83,39,32,79,41,32,40,40,66,32,+40,80,32,40,95,49,49,56,48,32,34,80,114,105,109,105,116,105,118,101,+115,46,84,121,112,101,34,41,41,41,32,40,40,40,67,39,32,79,41,32,+40,40,80,32,34,80,114,105,109,105,116,105,118,101,115,46,84,121,112,101,+34,41,32,95,49,49,55,52,41,41,32,75,41,41,41,32,40,40,40,83,+39,32,79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,32,34,+84,121,112,101,34,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,+80,32,34,80,114,105,109,105,116,105,118,101,115,46,84,121,112,101,34,41,+32,95,49,49,55,52,41,41,32,75,41,41,41,32,40,40,40,83,39,32,+79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,32,34,67,111,+110,115,116,114,97,105,110,116,34,41,41,41,32,40,40,40,67,39,32,79,+41,32,40,40,80,32,34,80,114,105,109,105,116,105,118,101,115,46,67,111,+110,115,116,114,97,105,110,116,34,41,32,95,49,49,55,52,41,41,32,75,+41,41,41,32,40,40,40,83,39,32,79,41,32,40,40,66,32,40,80,32,+40,95,49,49,56,48,32,34,80,114,105,109,105,116,105,118,101,115,46,67,+111,110,115,116,114,97,105,110,116,34,41,41,41,32,40,40,40,67,39,32,+79,41,32,40,40,80,32,34,80,114,105,109,105,116,105,118,101,115,46,67,+111,110,115,116,114,97,105,110,116,34,41,32,95,49,49,55,52,41,41,32,+75,41,41,41,32,40,40,40,83,39,32,79,41,32,40,40,66,32,40,80,+32,40,95,49,49,56,48,32,95,49,49,49,52,41,41,41,32,40,40,40,+67,39,32,79,41,32,40,40,80,32,95,49,49,49,52,41,32,95,49,49,+55,54,41,41,32,75,41,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,49,49,56,48,32,34,45,62,34,41,41,41,+32,40,40,40,67,39,32,79,41,32,40,40,80,32,95,49,49,49,52,41,+32,95,49,49,55,54,41,41,32,75,41,41,41,32,75,41,41,41,41,41,+41,41,32,40,40,66,32,95,49,49,49,57,41,32,40,40,66,32,95,55,+52,51,41,32,95,49,49,56,48,41,41,41,41,32,40,40,65,32,58,49,+49,56,50,32,40,40,40,83,32,40,40,40,67,39,32,40,67,39,32,40,+40,83,39,32,95,52,54,51,41,32,40,40,40,83,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,49,49,56,48,32,34,45,62,34,41,41,41,+32,40,40,40,67,39,32,79,41,32,40,40,80,32,95,49,49,49,52,41,+32,95,49,49,55,54,41,41,32,75,41,41,41,32,40,40,40,83,39,32,+79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,32,34,61,62,+34,41,41,41,32,40,40,40,67,39,32,79,41,32,40,40,80,32,95,49,+49,49,51,41,32,95,49,49,55,55,41,41,32,75,41,41,41,32,40,40,+40,83,39,32,79,41,32,40,40,66,32,40,80,32,40,95,49,49,56,48,+32,40,40,79,32,35,49,50,54,41,32,75,41,41,41,41,32,40,40,40,+67,39,32,79,41,32,40,40,80,32,95,49,49,49,50,41,32,95,49,49,+55,56,41,41,32,75,41,41,41,32,40,40,40,67,39,32,79,41,32,40,+40,66,32,40,80,32,40,95,49,49,56,48,32,40,40,95,52,54,51,32,+95,49,49,48,54,41,32,34,91,93,34,41,41,41,41,32,40,40,40,67,+39,32,79,41,32,40,40,80,32,40,40,95,52,54,51,32,95,49,49,48,+54,41,32,34,91,93,34,41,41,32,95,49,49,55,53,41,41,32,75,41,+41,41,32,75,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,95,51,57,53,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,83,39,32,40,83,32,80,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,79,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,50,54,49,41,41,+32,40,40,67,32,66,41,32,95,57,48,48,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,+32,40,40,66,32,95,55,54,48,41,32,40,40,40,67,39,32,79,41,32,+40,40,67,32,95,55,57,54,41,32,95,49,49,55,52,41,41,32,75,41,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,95,51,57,55,32,+95,49,49,57,48,41,41,32,40,67,32,95,52,52,54,41,41,41,41,41,+32,75,41,41,32,40,95,56,48,49,32,95,49,49,55,57,41,41,41,32,+40,40,40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,+32,95,50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,+48,41,41,41,41,41,32,40,40,66,32,95,49,49,49,57,41,32,40,40,+66,32,95,55,52,51,41,32,95,49,49,56,48,41,41,41,41,32,95,55,+52,51,41,32,40,95,56,57,55,32,40,40,79,32,35,49,48,55,41,32,+75,41,41,41,41,32,40,40,65,32,58,49,49,56,51,32,40,40,95,51,+57,53,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,40,83,32,80,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+40,83,39,32,95,50,54,49,41,41,32,40,40,66,32,40,66,32,95,49,+49,49,57,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+55,53,57,41,41,41,32,40,40,40,67,39,32,40,83,39,32,95,55,54,+51,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,67,+32,80,41,41,32,75,41,41,32,73,41,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,+95,55,54,48,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,95,+51,57,55,32,95,49,49,56,56,41,41,41,32,40,67,32,95,49,49,56,+55,41,41,32,73,41,41,41,41,32,75,41,41,32,40,95,56,48,49,32,+95,49,49,55,57,41,41,41,32,40,95,51,57,53,32,95,49,49,56,53,+41,41,41,32,40,40,66,32,40,95,51,57,52,32,40,40,40,67,39,32,+79,41,32,40,40,40,67,39,32,95,55,57,54,41,32,40,40,66,32,95,+56,57,55,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,+57,55,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,51,+41,41,41,41,32,95,55,57,57,41,41,32,75,41,41,41,32,40,40,95,+49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,50,55,+55,41,32,40,95,51,53,57,32,35,49,41,41,41,41,41,41,32,40,40,+40,95,49,56,54,32,95,49,57,56,41,32,40,40,95,52,56,53,32,95,+50,55,55,41,32,40,95,51,53,57,32,35,50,41,41,41,32,40,40,95,+52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,49,48,41,+41,41,41,41,32,40,40,65,32,58,49,49,56,52,32,95,55,52,51,41,+32,40,40,65,32,58,49,49,56,53,32,40,85,32,40,90,32,95,55,52,+51,41,41,41,32,40,40,65,32,58,49,49,56,54,32,95,55,52,52,41,+32,40,40,65,32,58,49,49,56,55,32,40,40,66,32,40,95,51,57,57,+32,95,49,49,56,54,41,41,32,95,49,49,56,52,41,41,32,40,40,65,+32,58,49,49,56,56,32,40,40,66,32,95,49,49,56,54,41,32,40,95,+49,49,56,54,32,40,40,95,49,50,57,56,32,95,49,49,55,57,41,32,+34,80,114,105,109,105,116,105,118,101,115,46,45,62,34,41,41,41,41,32,+40,40,65,32,58,49,49,56,57,32,40,40,66,32,95,49,49,56,54,41,+32,40,95,49,49,56,54,32,40,40,95,49,50,57,56,32,95,49,49,55,+57,41,32,34,80,114,105,109,105,116,105,118,101,115,46,61,62,34,41,41,+41,41,32,40,40,65,32,58,49,49,57,48,32,95,49,49,56,56,41,32,+40,40,65,32,58,49,49,57,49,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,+32,95,52,55,54,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,85,32,+40,75,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,66,32,+40,66,32,40,67,32,40,40,67,32,40,40,40,83,39,32,95,49,50,48,+41,32,40,95,57,48,52,32,34,45,62,34,41,41,32,40,95,57,48,52,+32,34,80,114,105,109,105,116,105,118,101,115,46,45,62,34,41,41,41,32,+95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,95,52,55,55,+41,41,32,40,67,32,80,41,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,+40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,+40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,+52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,40,65,32,58,49,49,57,50,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,32,+40,75,32,95,52,55,54,41,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,+85,32,40,75,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,+66,32,40,66,32,40,67,32,40,40,67,32,40,40,40,83,39,32,95,49,+50,48,41,32,40,95,57,48,52,32,34,61,62,34,41,41,32,40,95,57,+48,52,32,34,80,114,105,109,105,116,105,118,101,115,46,61,62,34,41,41,+41,32,95,52,55,54,41,41,41,41,32,40,40,66,32,40,66,32,95,52,+55,55,41,41,32,40,67,32,80,41,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,+40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,40,65,32,58,49,49,57,51,32,40,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,95,54,51,41,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,54,50,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,41,32,+95,49,49,51,56,41,41,41,32,95,50,57,50,41,41,41,41,41,32,40,+40,65,32,58,49,49,57,52,32,40,40,66,32,95,54,52,41,32,40,40,+40,67,39,32,95,50,54,51,41,32,95,50,57,49,41,32,95,49,49,52,+54,41,41,41,32,40,40,65,32,58,49,49,57,53,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,66,32,+67,41,32,95,49,50,54,52,41,41,41,32,40,40,66,32,67,41,32,95,+49,49,57,57,41,41,41,32,40,40,65,32,58,49,49,57,54,32,40,40,+89,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,66,32,40,40,83,39,32,67,41,32,40,40,+66,32,40,83,32,73,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,51,+41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,+67,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,+95,57,50,56,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,+32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,67,32,40,95,51,+57,57,32,95,49,49,56,54,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,80,32,40,75,32,95,49,51,48,50,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,+51,48,50,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,+83,39,32,40,83,39,32,67,39,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,50,48,51,32,95,50,56,49,41,41,32,95,52,49,49,41,41,+32,95,52,49,49,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+50,54,49,32,95,49,49,57,54,41,41,41,41,32,40,40,66,32,40,66,+32,95,56,50,50,41,41,32,40,40,67,39,32,95,52,49,50,41,32,40,+95,51,57,53,32,95,55,57,56,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,95,50,54,49,41,32,40,40,66,32,95,49,49,48,48,41,32,+40,95,56,48,53,32,95,56,48,55,41,41,41,32,34,98,97,100,32,115,+121,110,111,110,121,109,32,117,115,101,34,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,49,57,54,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,67,39,41,32,40,67,32,95,52,54,50,41,41,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,51,48,50,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,+49,51,48,50,41,41,41,41,41,32,40,90,32,95,49,49,57,54,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,40,+66,32,90,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,+51,52,32,95,53,56,41,41,41,41,32,40,67,32,40,95,51,57,57,32,+95,49,49,56,54,41,41,41,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,67,+32,95,51,57,50,41,32,95,49,51,48,50,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,+32,95,55,54,48,41,41,32,95,49,49,57,54,41,41,41,41,32,95,52,+54,49,41,41,32,40,40,65,32,58,49,49,57,55,32,40,40,67,32,40,+40,67,32,40,40,83,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,83,32,73,41,32,40,90,32,40,95,51,52,32,95,53,+56,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+95,51,50,32,95,53,56,41,41,32,95,49,49,57,55,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,+41,32,95,49,49,57,55,41,41,32,40,40,66,32,40,66,32,40,95,50,+54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,32,95,55,52,52,+41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,49,51,+48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,40,95,50,55,54,32,95,53,54,41,41,32,40,95,50,54,54,+32,95,55,53,54,41,41,41,32,95,49,49,57,55,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,40,66,32,40,40,+83,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,52,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,95,+51,52,32,95,53,56,41,41,41,32,40,40,66,32,40,40,67,39,32,40,+95,51,50,32,95,53,56,41,41,32,95,49,49,57,55,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,32,+95,49,49,57,51,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,+95,55,54,48,41,41,32,95,49,49,57,55,41,41,41,32,40,40,65,32,+58,49,49,57,56,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,+53,56,41,32,40,95,54,52,32,95,49,49,52,57,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,95,49,49,48,48,41,41,41,32,40,40,66,32,40,40,67,39,32,+95,52,54,51,41,32,40,40,80,32,34,116,121,112,101,34,41,32,34,107,+105,110,100,34,41,41,41,32,40,95,52,54,51,32,34,32,101,114,114,111,+114,58,32,34,41,41,41,41,41,32,40,40,65,32,58,49,49,57,57,32,+40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,+32,95,53,56,41,41,32,95,49,49,57,54,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,49,57,54,41,41,41,32,95,49,50,48,48,41,41,41,+32,40,40,65,32,58,49,50,48,48,32,40,40,66,32,89,41,32,40,40,+66,32,40,66,32,40,40,83,39,32,83,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,67,+32,40,40,40,67,39,32,67,39,41,32,83,39,41,32,40,40,40,67,39,+32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,+40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,+83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,+32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,+67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,40,83,39,+32,67,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,+40,67,32,40,40,40,67,39,32,83,39,41,32,67,39,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,67,39,32,67,41,32,40,+95,50,48,50,32,95,56,57,50,41,41,41,32,40,40,95,51,52,32,95,+53,56,41,32,95,49,51,52,49,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,+32,40,40,67,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,40,40,67,32,83,39,41,32,75,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,66,+32,40,40,67,39,32,40,67,39,32,67,39,41,41,32,40,40,66,32,40,+66,32,67,39,41,41,32,40,40,67,32,66,41,32,75,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,66,41,41,41,32,40,66,32,40,66,32,40,95,51,51,+32,95,53,56,41,41,41,41,41,32,73,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,40,83,39,32,67,39,41,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,67,32,40,40,67,32,83,39,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,39,32,67,41,+32,40,95,50,48,50,32,95,50,56,49,41,41,41,32,40,40,95,51,52,+32,95,53,56,41,32,95,49,51,52,49,41,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,41,41,32,40,40,66,32,67,41,32,95,+49,50,48,49,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,41,41,32,40,40,66,32,67,41,32,95,49,50,48,49,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,52,57,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,80,41,41,41,32,95,49,51,50,55,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,+95,49,49,57,56,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,34,99,97,110,110,111,116,32,117,110,105,102,121,32,34,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,+95,56,51,56,41,41,32,40,40,66,32,40,95,52,54,51,32,34,32,97,+110,100,32,34,41,41,32,95,56,51,56,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,50,48,49,32,40,40,66,32,40,40,+83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,49,57,52,41,41,41,32,40,40,40,83,39,32,40,67,39,32,+40,83,39,32,80,41,41,41,32,95,49,50,48,50,41,32,40,40,66,32,+67,41,32,95,49,49,57,57,41,41,41,41,32,40,40,65,32,58,49,50,+48,50,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,+66,32,40,40,83,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,52,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,80,41,+41,32,95,49,49,57,51,41,41,32,40,40,40,67,39,32,66,41,32,95,+49,49,57,57,41,32,95,55,53,56,41,41,41,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,95,49,51,48,54,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,32,40,40,66,32,+40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,67,41,32,40,95,52,51,52,32,40,95,50,48,50,+32,95,50,56,49,41,41,41,41,32,95,49,49,57,51,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,95,49,49,57,56,41,41,41,32,40,40,66,32,40,66,32,40,95,+52,54,51,32,34,99,121,99,108,105,99,32,34,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,40,40,66,32,+95,56,51,56,41,32,95,55,53,56,41,41,41,32,40,40,66,32,40,95,+52,54,51,32,34,32,61,32,34,41,41,32,95,56,51,56,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,50,48,51,32,40,40,40,95,51,+50,32,95,53,56,41,32,95,54,51,41,32,40,85,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,+54,50,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,41,41,32,95,49,49,51,56,41,32,95,50,57,48,+41,41,41,41,41,41,32,40,40,65,32,58,49,50,48,52,32,40,40,40,+95,50,55,54,32,95,53,54,41,32,95,55,53,56,41,32,95,49,50,48,+53,41,41,32,40,40,65,32,58,49,50,48,53,32,40,40,40,95,51,50,+32,95,53,56,41,32,95,54,51,41,32,40,85,32,40,40,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+95,51,51,32,95,53,56,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,+32,95,50,54,49,41,32,95,49,52,56,49,41,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+67,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,67,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,+67,41,32,95,49,49,51,56,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,67,32,+40,95,52,55,57,32,95,50,55,55,41,41,32,35,49,41,41,41,41,41,+32,40,40,65,32,58,49,50,48,54,32,40,40,66,32,40,66,32,40,40,+95,51,50,32,95,53,56,41,32,95,49,50,48,53,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,+53,56,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,40,66,32,95,50,54,49,41,32,95,56,57,56,41,41,41,32,40,+40,40,67,39,32,66,41,32,95,52,54,51,41,32,40,40,66,32,40,95,+52,54,51,32,40,40,79,32,35,51,54,41,32,75,41,41,41,32,40,95,+49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,50,48,55,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,52,50,41,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,+40,83,39,32,67,41,41,32,95,49,51,51,51,41,32,40,40,66,32,95,+49,49,48,48,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,41,+32,40,40,66,32,85,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,80,41,+41,32,40,40,66,32,95,56,51,52,41,32,40,95,56,48,53,32,95,56,+48,55,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,50,48,56,+32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,+32,95,49,49,52,57,41,41,41,32,40,40,67,39,32,95,49,50,48,55,+41,32,40,40,80,32,34,118,97,108,117,101,34,41,32,34,116,121,112,101,+34,41,41,41,41,32,40,40,65,32,58,49,50,48,57,32,40,40,83,32,+73,41,32,40,40,66,32,40,40,83,39,32,83,41,32,40,40,66,32,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,67,32,40,40,67,32,83,39,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,75,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,32,95,49,+50,49,48,41,32,95,49,50,48,57,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,67,41,32,40,40,66,32,40,67,32,95,49,+49,57,50,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,+40,66,32,85,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,+95,49,50,48,54,41,32,40,95,56,48,53,32,95,56,48,56,41,41,32,+34,100,105,99,116,34,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,40,40,66,32,40,83,39,32,40,95,51,51,32,95,53,56,41,+41,41,32,40,67,32,95,49,49,54,56,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,95,49,50,48,57,41,41,41,32,40,40,66,32,40,+67,39,32,80,41,41,32,40,40,40,67,39,32,66,41,32,95,55,52,52,+41,32,95,55,52,51,41,41,41,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,50,49,48,32,40,40,40,83,39,32,67,41,32,40,40,66,32,+40,40,83,39,32,83,39,41,32,95,51,57,50,41,41,32,40,40,66,32,+40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,95,52,51,32,95,53,56,41,32,40,95,50,54,53,32,+95,49,50,48,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,80,41,41,41,32,+40,40,66,32,40,67,39,32,95,56,50,50,41,41,32,40,40,66,32,95,+52,49,50,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,80,41,41,41,32,40,40,65,32,58,49,50,49,49,32,40,40,+83,32,40,40,67,32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,+32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,+40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,80,41,32,75,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,+75,41,41,41,32,95,49,50,49,48,41,41,41,32,40,95,51,52,32,95,+53,56,41,41,41,32,40,40,65,32,58,49,50,49,50,32,40,40,66,32,+40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,+52,32,95,49,49,52,50,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,95,49,49,53,52,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,95,49,51,51,55,41,41,32,40,67,32,+95,49,49,49,57,41,41,41,41,41,32,40,40,65,32,58,49,50,49,51,+32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,+41,32,40,95,54,52,32,95,49,49,52,55,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,+41,32,40,95,54,52,32,95,49,49,52,50,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,95,49,49,53,52,+41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,95,49,51,51,56,41,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,67,32,95,49,49,49,57,+41,41,32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,67,39,32,95,49,51,51,56,41,41,32,40,67,+32,95,57,48,53,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,67,32,95,49,49,49,57,41,41,32,75,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,50,49,52,32,40,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,+52,55,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,+32,95,49,50,49,51,41,32,40,40,66,32,40,66,32,95,55,52,51,41,+41,32,40,67,32,95,57,48,53,41,41,41,41,41,32,40,40,65,32,58,+49,50,49,53,32,40,40,40,83,39,32,40,67,39,32,95,50,54,49,41,+41,32,95,49,50,49,50,41,32,95,55,52,51,41,41,32,40,40,65,32,+58,49,50,49,54,32,40,40,95,52,52,32,95,53,56,41,32,40,95,50,+54,56,32,95,49,50,49,53,41,41,41,32,40,40,65,32,58,49,50,49,+55,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,49,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,49,49,53,53,41,41,41,32,40,40,40,83,39,32,+66,41,32,95,49,51,51,55,41,32,40,40,66,32,95,49,49,49,57,41,+32,95,55,52,51,41,41,41,41,41,32,40,40,65,32,58,49,50,49,56,+32,40,40,95,52,52,32,95,53,56,41,32,40,95,50,54,56,32,95,49,+50,49,55,41,41,41,32,40,40,65,32,58,49,50,49,57,32,40,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,52,51,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,49,49,53,54,41,41,41,32,95,57,50,57,41,41,41,32,40,40,65,+32,58,49,50,50,48,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,54,51,41,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,+49,32,95,54,50,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,+41,32,95,49,49,51,56,41,41,41,32,95,57,50,57,41,41,41,32,40,+40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,41,41,+32,40,40,65,32,58,49,50,50,49,32,40,40,66,32,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,+52,50,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,95,51,+51,32,95,53,56,41,41,41,32,95,49,50,49,53,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,95,51,50,32,95,53,56,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,+41,32,95,49,49,53,52,41,41,32,40,95,51,52,32,95,53,56,41,41,+41,41,41,41,32,40,40,65,32,58,49,50,50,50,32,40,40,66,32,40,+66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,+49,52,50,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,+32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,49,50,49,+54,41,41,41,32,40,40,40,67,39,32,66,41,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+51,51,32,95,53,56,41,41,32,95,49,49,53,52,41,41,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,41,32,40,40,65,32,58,49,50,50,+51,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,49,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,53,56,+41,41,32,40,40,66,32,95,49,50,49,56,41,32,40,95,51,57,53,32,+40,85,32,80,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,49,49,53,53,+41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,40,+65,32,58,49,50,50,52,32,40,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,50,+54,41,41,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,50,50,55,41,32,40,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,51,+53,41,41,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,50,50,56,41,32,40,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,95,49,50,50,53,41,32,95,49,50,52,56,41,41,41,+41,41,41,32,40,40,65,32,58,49,50,50,53,32,40,40,66,32,40,95,+50,54,49,32,95,49,49,54,50,41,41,32,40,40,66,32,40,95,50,54,+49,32,95,52,53,53,41,41,32,40,40,66,32,40,95,52,54,50,32,95,+52,54,49,41,41,32,40,95,51,57,52,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,+75,32,40,75,32,75,41,41,41,41,32,40,75,32,75,41,41,41,32,40,+75,32,40,75,32,40,75,32,75,41,41,41,41,41,32,40,75,32,40,75,+32,75,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,75,32,40,75,32,40,75,32,40,75,32,75,+41,41,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,+41,41,32,40,40,65,32,58,49,50,50,54,32,40,40,67,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+67,32,40,40,67,32,83,39,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,40,66,32,40,66,32,40,40,95,51,50,32,95,+53,56,41,32,40,95,54,52,32,95,49,49,52,55,41,41,41,41,32,40,+40,66,32,40,67,39,32,40,95,52,52,32,95,53,56,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,49,50,50,48,41,41,32,95,57,48,53,+41,41,41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,+41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,75,41,+41,32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,+41,32,40,40,65,32,58,49,50,50,55,32,40,40,66,32,40,95,50,54,+49,32,95,49,49,54,52,41,41,32,40,40,40,67,39,32,40,95,51,50,+32,95,53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,+50,50,57,41,41,32,40,40,40,83,39,32,40,95,51,51,32,95,53,56,+41,41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,51,49,41,+41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,50,51,54,41,41,+41,41,41,32,40,40,65,32,58,49,50,50,56,32,40,40,66,32,40,95,+50,54,49,32,95,49,49,54,52,41,41,32,40,40,40,67,39,32,40,95,+51,50,32,95,53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,+95,49,50,52,48,41,41,32,40,40,40,67,39,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,66,32,40,40,95,52,51,32,95,53,56,41,32,+95,49,50,52,54,41,41,32,95,51,57,51,41,41,32,40,40,66,32,40,+95,51,52,32,95,53,56,41,41,32,95,51,57,51,41,41,41,41,41,32,+40,40,65,32,58,49,50,50,57,32,40,40,66,32,40,40,95,51,51,32,+95,53,56,41,32,95,49,50,48,51,41,41,32,40,40,83,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,40,67,32,40,40,80,32,40,40,67,32,66,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,40,40,+67,32,95,49,50,51,48,41,32,95,55,57,57,41,41,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,55,50,56,41,41,32,80,41,41,41,41,+41,41,32,40,40,67,32,66,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,95,50,54,49,41,32,40,40,67,32,95,49,50,51,48,41,32,95,+55,57,57,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,53,56,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,95,55,+50,57,41,41,32,80,41,41,41,41,41,41,41,32,40,40,67,32,66,41,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,67,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,50,54,49,+41,41,32,95,49,50,51,48,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,55,51,48,41,41,+32,80,41,41,41,32,95,55,53,54,41,41,41,41,41,32,40,90,32,75,+41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,40,40,+67,32,95,49,50,51,48,41,32,95,55,57,57,41,41,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,55,51,48,41,41,32,80,41,41,41,41,+41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,66,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,+50,54,49,41,32,40,40,67,32,95,49,50,51,48,41,32,95,56,48,48,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+90,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,95,55,+51,54,41,41,32,80,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,50,54,49,+41,32,40,40,67,32,95,49,50,51,48,41,32,95,56,48,48,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,41,32,40,40,66,32,40,66,32,67,+41,41,32,40,40,66,32,67,41,32,40,67,32,95,55,51,55,41,41,41,+41,41,41,41,41,32,75,41,41,32,40,95,51,52,32,95,53,56,41,41,+41,41,32,40,40,65,32,58,49,50,51,48,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,+53,56,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,+49,49,54,52,41,41,41,32,40,67,32,40,40,40,67,39,32,89,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,80,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,+53,56,41,41,32,95,49,50,53,52,41,41,32,40,40,66,32,40,66,32,+40,95,51,52,32,95,53,56,41,41,41,32,40,40,66,32,80,41,32,95,+52,50,51,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,67,+39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,53,52,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,40,+83,39,32,95,50,54,49,41,41,32,95,49,50,50,49,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,67,39,41,32,67,39,41,+41,32,40,40,67,39,32,40,67,39,32,95,52,54,50,41,41,32,95,55,+57,54,41,41,41,41,41,41,41,32,95,52,54,49,41,41,41,41,41,32,+85,41,41,32,40,40,65,32,58,49,50,51,49,32,40,40,67,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,39,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,83,39,41,+32,40,40,66,32,40,66,32,40,83,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,40,95,+51,51,32,95,53,56,41,41,32,40,40,67,32,95,49,50,51,51,41,32,+95,55,57,57,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+66,41,32,67,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,+40,95,52,52,52,32,95,56,57,50,41,41,41,41,32,95,51,57,52,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,83,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,40,40,67,32,95,+49,50,51,51,41,32,95,55,57,57,41,41,41,41,41,41,32,40,40,67,+39,32,66,41,32,67,41,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,95,49,50,51,51,41,32,95,49,50,51,50,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,40,66,32,90,41,32,40,40,66,32,40,83,32,66,41,41,32,40,+40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,+53,56,41,41,32,40,40,67,32,95,49,50,51,51,41,32,95,56,48,48,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,67,41,32,40,95,+51,57,52,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,75,41,+41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,90,32,40,40,+66,32,40,95,51,57,52,32,40,40,67,32,79,41,32,75,41,41,41,32,+40,40,83,32,79,41,32,40,40,40,67,39,32,79,41,32,95,49,50,52,+51,41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,75,41,41,32,40,+40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,32,40,+40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,+52,32,95,49,49,52,55,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,83,39,32,95,49,49,54,53,41,41,32,40,67,32,+95,57,48,53,41,41,41,32,40,40,67,39,32,95,51,57,53,41,32,95,+57,48,53,41,41,41,41,41,32,40,85,32,40,75,32,40,75,32,40,40,+40,83,39,32,80,41,32,40,90,32,40,40,67,32,79,41,32,75,41,41,+41,32,40,40,40,67,39,32,66,41,32,95,52,54,50,41,32,40,95,51,+57,53,32,95,53,54,53,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,50,51,50,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,55,57,+57,41,41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,+75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,95,55,57,+57,41,41,41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,+40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,40,75,+32,95,55,57,57,41,41,41,41,32,40,75,32,95,55,57,57,41,41,41,+32,40,75,32,95,55,57,57,41,41,41,32,40,75,32,40,75,32,95,55,+57,57,41,41,41,41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,+41,32,40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,55,57,57,41,41,41,41,41,32,65,41,41,32,+40,75,32,40,75,32,95,55,57,57,41,41,41,41,32,40,75,32,95,55,+57,57,41,41,41,32,40,75,32,95,55,57,57,41,41,41,32,40,75,32,+40,75,32,95,55,57,57,41,41,41,41,32,40,40,65,32,58,49,50,51,+51,32,40,40,67,32,66,41,32,40,40,66,32,40,40,67,39,32,66,41,+32,95,49,50,49,52,41,41,32,40,67,32,95,49,50,51,52,41,41,41,+41,32,40,40,65,32,58,49,50,51,52,32,40,67,32,40,95,51,57,55,+32,40,85,32,40,75,32,95,49,49,57,48,41,41,41,41,41,32,40,40,+65,32,58,49,50,51,53,32,40,40,67,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,+32,83,39,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,40,67,32,66,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,40,40,83,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,+41,32,95,49,50,49,57,41,32,40,40,66,32,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,55,41,41,41,+41,32,40,40,66,32,40,67,39,32,95,49,50,49,57,41,41,32,40,67,+32,95,57,48,53,41,41,41,41,41,41,32,40,67,32,95,55,54,48,41,+41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,+32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,75,41,41,+32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,+32,40,40,65,32,58,49,50,51,54,32,40,40,66,32,40,40,95,51,51,+32,95,53,56,41,32,95,49,50,48,51,41,41,32,40,40,83,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,+39,32,67,39,41,32,40,40,67,32,40,40,80,32,40,40,83,32,66,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,40,67,39,32,+95,50,54,49,41,32,95,49,50,51,56,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,+95,55,50,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,+50,51,57,41,41,41,41,41,41,32,40,40,83,32,66,41,32,40,40,66,+32,90,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,+41,32,95,49,50,51,56,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,95,55,50,57,+41,41,32,95,49,50,51,57,41,41,41,41,41,41,32,40,40,83,32,66,+41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,95,50,54,49,41,32,95,49,50,51,56,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,+32,95,55,51,48,41,41,32,95,49,50,53,52,41,41,41,41,41,41,32,+40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,50,55,54,32,95,53,54,41,41,32,95,55,51,50,41,41,32,+40,95,49,50,53,51,32,95,55,57,57,41,41,41,41,32,75,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,50,55,54,32,95,53,54,41,41,41,32,95,55,51,52,41,41,+32,40,95,49,50,53,51,32,95,55,57,57,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,66,41,41,+32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,+95,49,50,51,56,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,95,49,52,32,95,53,55,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,49,52,32,95,+53,55,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+95,49,52,32,95,53,55,41,41,32,40,40,66,32,40,40,95,50,55,54,+32,95,53,54,41,32,95,55,51,54,41,41,32,95,49,50,51,55,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,95,52,51,+32,95,53,56,41,32,40,85,32,40,40,67,32,40,40,40,67,39,32,67,+39,41,32,40,40,66,32,40,83,39,32,40,95,49,52,32,95,53,55,41,+41,41,32,40,40,66,32,40,66,32,40,40,95,50,55,54,32,95,53,54,+41,32,80,41,41,41,32,40,67,32,40,95,52,51,32,95,53,56,41,41,+41,41,41,32,40,67,32,40,95,52,51,32,95,53,56,41,41,41,41,32,+40,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,40,95,49,+50,48,55,32,34,102,117,110,100,101,112,34,41,41,32,40,90,32,40,95,+51,52,32,95,53,56,41,41,41,41,41,41,41,41,41,32,40,40,95,52,+51,32,95,53,56,41,32,40,40,83,32,40,40,40,67,39,32,67,41,32,+40,40,67,32,40,40,67,32,83,39,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,50,55,54,32,95,53,54,41,41,32,95,55,56,57,41,41,32,+40,95,49,50,53,53,32,40,95,49,50,53,56,32,95,55,57,57,41,41,+41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+40,66,32,95,50,54,49,41,32,95,49,50,51,56,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,95,49,52,32,95,53,55,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,49,52,32,95,53,55,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,41,41,32,95,+55,51,55,41,41,32,95,49,50,51,55,41,41,41,32,40,95,49,50,53,+51,32,95,56,48,48,41,41,41,41,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,32,40,40,66,32,40,40,95,50,55,54,32,95,53,54,41,+32,95,55,51,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,40,+95,49,50,53,51,32,95,55,57,57,41,41,41,41,41,32,40,95,51,52,+32,95,53,56,41,41,41,41,32,40,40,65,32,58,49,50,51,55,32,40,+40,95,52,51,32,95,53,56,41,32,40,95,49,50,53,51,32,95,56,48,+48,41,41,41,32,40,40,65,32,58,49,50,51,56,32,40,40,67,32,83,+41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,40,67,39,32,95,50,54,49,41,41,32,95,49,50,50,+49,41,41,41,32,40,67,32,95,49,50,51,56,41,41,41,41,41,32,40,+40,65,32,58,49,50,51,57,32,40,85,32,40,40,40,83,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,+49,50,51,56,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+49,52,32,95,53,55,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,95,49,52,32,95,53,55,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,50,+55,54,32,95,53,54,41,41,32,95,55,57,53,41,41,32,95,49,50,51,+55,41,41,41,32,40,95,49,51,32,95,53,55,41,41,41,41,32,40,40,+95,49,55,55,32,40,40,66,32,40,40,95,50,55,54,32,95,53,54,41,+32,95,49,55,52,41,41,32,40,40,95,52,51,32,95,53,56,41,32,40,+85,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,50,55,54,+32,95,53,54,41,41,32,80,41,41,32,40,95,49,50,53,53,32,40,95,+49,50,53,56,32,95,55,57,57,41,41,41,41,41,41,41,32,40,40,66,+32,40,40,95,50,55,54,32,95,53,54,41,32,95,49,55,53,41,41,32,+40,40,95,52,51,32,95,53,56,41,32,40,85,32,40,40,66,32,85,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,50,55,54,32,95,53,54,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,95,50,54,51,41,32,80,41,41,32,80,41,+41,41,32,40,95,49,50,53,53,32,40,95,49,50,53,56,32,95,55,57,+57,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,+50,52,48,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,+66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,52,55,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,49,+49,54,54,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,40,67,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,67,32,80,41,41,32,40,95,55,53,56,32,35,48,+41,41,41,41,32,40,95,51,57,53,32,40,40,67,32,40,40,40,67,39,+32,67,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,90,32,75,+41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,40,110,+111,77,97,116,99,104,32,34,115,114,99,47,77,105,99,114,111,72,115,47,+84,121,112,101,67,104,101,99,107,46,104,115,34,41,32,35,49,49,53,55,+41,32,35,50,53,41,41,41,41,41,41,32,40,40,67,39,32,95,49,50,+52,49,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,41,41,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,+32,40,66,39,32,40,66,39,32,95,52,54,50,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,95,51,57,52,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,40,40,80,+32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,+32,40,83,39,32,79,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,32,95,55,51,50,+41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,66,+39,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,49,56,57,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,49,49,+56,55,41,41,32,40,67,32,95,57,48,53,41,41,41,32,40,95,51,57,+53,32,40,40,95,50,54,51,32,95,55,52,51,41,32,95,55,57,56,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,79,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,40,83,39,32,40,67,39,32,95,50,54,49,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,80,41,41,41,32,40,40,66,+32,40,66,32,40,67,32,95,55,51,49,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,40,95,55,57,48,32,95,52,54,49,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,95,55,57,49,41,41,32,40,40,40,67,39,32,+40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,40,80,32,95,52,+54,49,41,41,41,32,40,40,66,32,40,66,32,40,95,55,52,52,32,95,+49,50,52,50,41,41,41,32,40,40,66,32,40,66,32,40,95,55,52,55,+32,95,56,57,53,41,41,41,32,40,40,66,32,40,66,32,95,55,56,48,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,+41,32,95,57,48,48,41,41,32,40,40,66,32,40,95,52,54,51,32,40,+40,79,32,35,52,54,41,32,75,41,41,41,32,95,57,48,48,41,41,41,+41,41,41,41,32,75,41,41,32,95,52,54,49,41,41,41,32,75,41,41,+41,32,95,55,51,49,41,41,41,32,40,40,66,32,40,67,32,40,95,52,+51,54,32,95,56,57,50,41,41,41,32,40,95,51,57,52,32,40,40,67,+32,40,40,80,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,80,+41,32,75,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,75,+32,40,75,32,75,41,41,41,41,41,41,41,32,75,41,41,41,32,95,49,+50,52,51,41,41,41,41,41,41,41,32,40,95,51,57,52,32,40,40,83,+32,40,40,80,32,40,75,32,40,75,32,75,41,41,41,32,40,75,32,40,+75,32,75,41,41,41,41,32,40,90,32,40,90,32,40,40,67,32,79,41,+32,75,41,41,41,41,41,41,41,41,41,41,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,32,75,41,41,32,40,40,66,32,40,95,51,+52,32,95,53,56,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,+32,40,40,65,32,58,49,50,52,49,32,40,40,40,83,39,32,83,41,32,+40,40,66,32,85,41,32,40,40,40,67,39,32,79,41,32,40,40,40,83,+39,32,80,41,32,40,95,51,57,53,32,40,95,50,54,53,32,95,49,50,+53,41,41,41,32,40,95,51,57,53,32,40,95,50,54,53,32,95,49,50,+52,41,41,41,41,32,75,41,41,41,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,95,51,57,53,41,32,40,40,66,32,85,+41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,80,41,41,32,40,40,67,39,32,95,51,57,53,41,32,40,67,+32,40,95,52,51,50,32,95,56,57,50,41,41,41,41,41,32,40,40,67,+39,32,95,51,57,53,41,32,40,67,32,40,95,52,51,50,32,95,56,57,+50,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,50,52,+50,32,40,40,95,50,54,49,32,40,95,55,52,55,32,95,56,57,53,41,+41,32,40,95,55,56,49,32,34,110,111,68,101,102,97,117,108,116,34,41,+41,41,32,40,40,65,32,58,49,50,52,51,32,40,40,67,32,95,57,48,+55,41,32,34,36,100,102,108,116,34,41,41,32,40,40,65,32,58,49,50,+52,52,32,40,40,83,32,83,41,32,40,40,66,32,90,41,32,40,40,66,+32,90,41,32,40,40,66,32,95,49,49,56,57,41,32,95,49,50,52,53,+41,41,41,41,41,32,40,40,65,32,58,49,50,52,53,32,40,40,83,32,+40,85,32,40,95,50,52,32,34,116,117,112,108,101,67,111,110,115,116,114,+97,105,110,116,115,34,41,41,41,32,40,40,66,32,40,67,32,80,41,41,+32,40,90,32,40,90,32,40,40,40,83,39,32,95,49,49,56,55,41,32,+40,40,66,32,40,95,56,48,49,32,95,56,57,53,41,41,32,95,52,49,+49,41,41,32,73,41,41,41,41,41,41,32,40,40,65,32,58,49,50,52,+54,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,40,40,83,39,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,67,32,95,49,50,48,54,41,32,34,105,110,115,+116,34,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,56,41,41,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,+32,66,41,32,40,40,66,32,67,41,32,95,57,50,56,41,41,32,40,40,+66,32,40,40,67,39,32,95,50,54,49,41,32,95,49,49,48,48,41,41,+32,40,40,66,32,40,95,52,54,51,32,34,110,111,116,32,97,32,99,108,+97,115,115,32,34,41,41,32,95,57,48,50,41,41,41,41,32,40,95,51,+52,32,95,53,56,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+85,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,+32,40,95,54,52,32,95,49,49,52,55,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,40,83,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,83,39,32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,66,39,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,95,49,49,54,55,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,40,67,39,32,40,67,39,32,+80,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,55,52,+51,41,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,41,32,+75,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,66,39,32,40,66,39,32,40,66,39,32,40,+66,39,32,79,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+66,39,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,83,39,32,66,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,66,39,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,79,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,32,95,55,51,50,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,49,50,+52,55,41,41,41,32,95,49,50,52,52,41,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,+95,50,54,49,41,32,95,55,51,49,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,+95,55,54,50,32,95,52,54,49,41,41,41,41,41,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,95,51,57,57,32,95,55,52,52,41,41,32,40,40,66,32,40,95,+50,54,49,32,95,55,52,51,41,41,32,95,49,50,53,49,41,41,41,41,+41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,52,54,51,41,41,32,40,40,66,32,95,51,+57,53,41,32,40,40,66,32,95,50,54,53,41,32,40,40,66,32,40,95,+50,54,49,32,95,55,52,51,41,41,32,40,40,67,32,95,56,57,56,41,+32,34,100,105,99,116,36,34,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,95,51,57,53,41,41,32,40,40,66,32,40,40,67,39,32,40,+83,39,32,95,50,54,49,41,41,32,40,40,66,32,40,66,32,95,52,55,+49,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,55,52,+51,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,+54,49,41,32,95,57,48,49,41,41,32,95,49,50,52,51,41,41,41,41,+41,32,40,40,66,32,40,67,32,40,95,52,51,54,32,95,56,57,50,41,+41,41,32,40,95,51,57,52,32,40,40,67,32,40,40,80,32,40,40,40,+67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,39,32,66,41,32,+80,41,32,95,55,52,54,41,41,32,75,41,41,32,40,75,32,40,75,32,+75,41,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,41,41,41,+41,41,41,41,41,32,75,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,95,56,48,53,32,95,56,48,56,41,41,41,32,95,49,49,51,48,41,+41,41,32,75,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,+41,32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,65,32,58,+49,50,52,55,32,40,40,83,32,83,41,32,40,40,66,32,90,41,32,40,+40,66,32,90,41,32,95,55,54,48,41,41,41,41,32,40,40,65,32,58,+49,50,52,56,32,40,40,40,83,39,32,40,95,51,51,32,95,53,56,41,+41,32,40,40,95,52,52,32,95,53,56,41,32,95,49,50,52,57,41,41,+32,40,40,95,52,51,32,95,53,56,41,32,40,40,66,32,40,40,95,51,+51,32,95,53,56,41,32,95,49,50,48,51,41,41,32,95,49,50,53,50,+41,41,41,41,32,40,40,65,32,58,49,50,52,57,32,40,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,55,+41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,40,67,39,32,83,39,41,41,32,40,40,67,32,40,+40,67,32,83,39,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,95,52,52,+32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,85,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,+66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,67,39,41,32,95,49,50,49,51,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,55,+54,48,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,+52,52,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,+57,55,32,40,40,95,50,54,51,32,95,49,49,56,56,41,32,95,53,54,+54,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,40,95,51,57,57,32,95,49,49,56,54,41,+41,41,32,40,40,66,32,40,66,32,95,49,49,56,52,41,41,32,95,57,+48,53,41,41,41,32,40,95,51,57,53,32,95,49,49,56,53,41,41,41,+41,32,40,40,95,49,55,55,32,95,50,54,52,41,32,40,95,51,57,53,+32,95,53,54,54,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,95,50,54,49,32,95,55,53,57,41,41,41,41,32,+40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,95,55,54,51,41,41,32,40,40,66,32,95,51,57,52,41,32,40,40,+66,32,85,41,32,40,90,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,79,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+80,41,41,32,95,57,48,53,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,52,55,57,32,95,50,55,55,41,41,32,40,40,95,49,55,55,+32,95,52,49,49,41,32,95,52,49,49,41,41,41,32,40,40,67,32,40,+40,67,32,95,51,57,50,41,32,35,49,41,41,32,35,48,41,41,41,41,+32,75,41,41,41,41,41,41,32,95,57,48,53,41,41,41,41,41,32,73,+41,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,32,40,40,66,32,40,66,32,90,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,40,83,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,40,67,39,32,67,39,41,32,95,49,50,49,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,40,66,+32,95,50,54,49,41,32,95,55,54,48,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,55,54,48,+32,95,52,54,49,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,95,49,49,56,56,41,32,40,40,66,32,40,95,+50,54,49,32,95,53,54,54,41,41,32,40,40,66,32,40,95,50,54,49,+32,95,52,50,56,41,41,32,40,40,95,49,55,55,32,95,50,54,52,41,+32,40,95,51,57,53,32,95,53,54,54,41,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,51,57,57,32,95,49,49,56,54,41,41,41,32,40,40,66,32,+40,66,32,95,49,49,56,52,41,41,32,95,57,48,53,41,41,41,32,40,+95,51,57,53,32,95,49,49,56,53,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,95,55,53,57,41,41,41,32,40,+40,66,32,40,66,32,95,55,54,52,41,41,32,95,57,48,53,41,41,41,+41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,95,49,50,49,52,41,41,32,75,41,41,32,40,75,32,95,49,+50,49,52,41,41,41,32,40,90,32,75,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,95,+49,50,53,48,41,41,41,41,41,32,40,90,32,40,90,32,40,90,32,75,+41,41,41,41,41,32,75,41,41,32,40,40,95,51,52,32,95,53,56,41,+32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,58,49,50,53,48,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,55,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,83,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,67,39,32,40,83,39,32,40,67,39,32,+40,95,51,51,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,83,41,32,40,67,32,95,49,50,49,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,55,+53,57,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,+32,95,55,54,51,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,79,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,80,41,41,32,95,57,48,53,41,41,32,95,52,49,49,+41,41,32,75,41,41,32,95,57,48,53,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,83,39,32,40,83,39,32,66,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,51,32,95,53,56,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,52,52,32,95,53,56,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,40,40,+80,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,83,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,67,39,41,32,95,49,50,49,51,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,+50,54,49,41,32,95,55,54,48,41,41,41,32,40,40,66,32,40,66,32,+95,49,49,56,57,41,41,32,40,40,66,32,40,67,32,95,49,49,56,55,+41,41,32,40,95,51,57,53,32,40,40,95,50,54,51,32,95,55,52,51,+41,32,95,55,57,56,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,95,55,52,51,41,41,41,32,95,57,48,53,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,40,66,39,32,95,49,49,54,54,41,41,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,67,+32,80,41,41,41,41,32,40,95,51,57,53,32,40,40,67,32,40,40,40,+67,39,32,67,41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,+40,110,111,77,97,116,99,104,32,34,115,114,99,47,77,105,99,114,111,72,+115,47,84,121,112,101,67,104,101,99,107,46,104,115,34,41,32,35,49,50,+54,57,41,32,35,50,53,41,41,41,41,41,41,32,40,40,66,32,95,49,+50,52,49,41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,+41,41,41,32,95,49,50,53,49,41,41,32,40,40,40,83,39,32,66,41,+32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,55,54,48,41,+41,41,32,40,40,66,32,40,66,32,40,95,51,57,55,32,95,49,49,56,+56,41,41,41,32,40,40,66,32,40,67,32,95,49,49,56,55,41,41,32,+40,95,51,57,53,32,95,49,49,56,53,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,95,52,54,51,41,32,40,95,51,57,53,32,40,+40,67,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,67,32,+83,39,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,+65,41,41,32,40,40,40,110,111,77,97,116,99,104,32,34,115,114,99,47,+77,105,99,114,111,72,115,47,84,121,112,101,67,104,101,99,107,46,104,115,+34,41,32,35,49,50,54,56,41,32,35,50,53,41,41,41,41,41,41,41,+32,40,95,51,57,52,32,40,40,83,32,40,40,80,32,40,75,32,40,75,+32,75,41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,90,+32,40,90,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,32,+40,67,32,95,57,48,53,41,41,41,41,32,40,40,65,32,58,49,50,53,+49,32,40,40,67,32,95,57,48,55,41,32,34,36,67,34,41,41,32,40,+40,65,32,58,49,50,53,50,32,40,40,83,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,+67,32,83,39,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,95,49,50,48,55,+32,34,116,121,112,101,32,115,105,103,110,97,116,117,114,101,34,41,41,41,+32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,90,41,32,40,+40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,55,41,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,95,51,50,32,95,53,56,41,41,41,32,40,67,32,40,95,49,50,55,+54,32,95,49,50,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,95,51,51,32,95,53,56,41,32,95,49,51,50,54,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,+95,51,52,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,66,32,+95,55,51,49,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,+95,54,52,32,95,49,49,52,55,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,39,41,32,95,+55,51,52,41,41,32,40,67,32,95,57,48,53,41,41,41,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,+41,41,41,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+75,41,41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,65,32,+58,49,50,53,51,32,40,95,49,50,54,48,32,95,49,50,53,53,41,41,+32,40,40,65,32,58,49,50,53,52,32,40,40,66,32,40,40,95,50,55,+54,32,95,53,54,41,32,95,53,54,53,41,41,32,40,95,49,50,53,57,+32,95,49,50,53,53,41,41,41,32,40,40,65,32,58,49,50,53,53,32,+40,40,66,32,40,66,32,40,95,49,49,54,51,32,95,49,49,52,48,41,+41,41,32,40,40,40,67,39,32,66,41,32,95,49,50,54,54,41,32,95,+49,50,57,55,41,41,41,32,40,40,65,32,58,49,50,53,54,32,40,40,+66,32,40,95,50,54,51,32,95,49,49,54,52,41,41,32,95,49,50,53,+53,41,41,32,40,40,65,32,58,49,50,53,55,32,40,40,66,32,90,41,+32,85,41,41,32,40,40,65,32,58,49,50,53,56,32,40,90,32,85,41,+41,32,40,40,65,32,58,49,50,53,57,32,40,40,66,32,40,66,32,40,+40,95,51,50,32,95,53,56,41,32,95,49,50,48,53,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,32,40,40,67,32,67,39,41,32,95,49,50,53,55,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,50,54,51,41,41,32,40,40,66,32,40,66,+32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,41,32,+40,40,65,32,58,49,50,54,48,32,40,40,67,32,66,41,32,95,49,50,+53,56,41,41,32,40,40,65,32,58,49,50,54,49,32,40,95,49,50,53,+57,32,95,49,50,54,54,41,41,32,40,40,65,32,58,49,50,54,50,32,+40,40,67,32,40,40,40,83,39,32,67,39,41,32,95,49,49,57,50,41,+32,40,95,49,50,54,48,32,95,49,50,54,54,41,41,41,32,40,85,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,41,32,40,40,65,32,58,+49,50,54,51,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+40,95,54,52,32,95,49,49,52,54,41,41,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,83,39,32,67,41,32,95,50,57,49,41,32,40,40,+66,32,40,95,51,52,32,95,53,56,41,41,32,95,55,53,56,41,41,41,+32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,65,32,58,49,+50,54,52,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,52,54,41,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,83,41,32,95,50,57,49,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,49,53,55,41,41,41,32,+95,50,57,50,41,41,41,41,32,40,40,66,32,67,41,32,95,49,49,57,+57,41,41,41,41,32,40,40,65,32,58,49,50,54,53,32,40,40,80,32,+95,49,50,54,51,41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,+40,65,32,58,49,50,54,54,32,40,40,40,67,39,32,40,67,39,32,40,+95,51,50,32,95,53,56,41,41,41,32,95,49,50,54,55,41,32,40,95,+51,52,32,95,53,56,41,41,41,32,40,40,65,32,58,49,50,54,55,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,83,39,32,67,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,39,41,41,41,32,40,40,40,83,39,+32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,67,39,32,83,+41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,41,32,40,40,40,+83,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,+32,83,41,41,32,40,40,40,83,39,32,40,67,39,32,83,41,41,32,40,+40,40,83,39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,+67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,83,39,+32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,+41,41,32,40,40,40,83,39,32,67,41,32,40,40,66,32,40,83,32,83,+39,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,32,40,95,57,48,+52,32,34,100,105,99,116,36,34,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,+40,66,32,40,83,32,95,57,49,53,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,+48,56,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,83,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,83,39,32,67,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,+39,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,50,55,50,32,95,53,54,41,41,32,95,52,55,49,+41,41,32,95,49,49,57,52,41,41,41,32,75,41,41,32,40,90,32,75,+41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,+40,67,39,32,40,67,39,32,67,41,41,32,95,49,51,49,54,41,41,41,+41,41,41,41,32,40,95,49,51,48,51,32,40,40,80,32,95,56,51,55,+41,32,95,56,48,56,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,95,49,+50,48,54,41,32,40,95,56,48,53,32,95,56,48,55,41,41,32,34,100,+105,99,116,36,34,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,+95,51,51,32,95,53,56,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,85,32,40,75,32,95,49,51,48,50,41,41,41,32,95,49,49,54,56,+41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,32,95,55,+52,51,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,50,54,49,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,+41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,+40,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,+95,49,50,55,50,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,85,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,51,49,51,+41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,39,41,+32,95,49,51,49,54,41,41,32,95,55,52,52,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,95,51,50,+32,95,53,56,41,41,41,32,95,49,50,55,49,41,41,32,95,49,50,54,+54,41,41,41,32,95,49,50,55,53,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,67,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+40,67,39,32,40,83,39,32,67,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,40,83,39,32,66,41,32,40,40,67,32,67,39,41,32,75,+41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,+40,66,39,32,40,66,39,32,40,40,66,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,85,+41,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,+40,40,66,32,40,83,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,83,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,50,+48,50,32,95,56,57,50,41,41,32,40,95,56,57,55,32,95,49,49,48,+55,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,40,40,+67,32,40,95,50,48,50,32,95,56,57,50,41,41,32,40,95,56,57,55,+32,95,49,49,48,56,41,41,41,41,41,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,83,32,40,40,67,32,40,95,50,48,50,32,+95,56,57,50,41,41,32,40,95,56,57,55,32,95,49,49,48,57,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,67,41,32,40,67,32,40,40,67,32,40,95,50,48,50,32,95,56,57,+50,41,41,32,40,95,56,57,55,32,95,49,49,49,49,41,41,41,41,41,+41,41,32,95,49,50,54,57,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,95,49,50,54,57,41,32,40,40,66,32,95,55,+55,55,41,32,95,51,54,51,41,41,41,41,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,40,67,39,32,67,39,41,41,32,95,49,+50,55,48,41,32,40,40,66,32,95,55,55,53,41,32,95,51,54,48,41,+41,41,32,40,40,67,32,95,49,50,57,56,41,32,95,49,49,48,56,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,+49,50,54,57,41,32,40,40,66,32,95,55,55,53,41,32,95,51,54,48,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,95,49,+50,54,49,41,32,40,40,66,32,95,55,52,51,41,32,40,40,67,32,95,+56,57,56,41,32,34,102,114,111,109,73,110,116,101,103,101,114,34,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,+32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,+50,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,85,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,95,49,51,49,54,41,41,32,40,67,+32,95,55,52,52,41,41,41,41,41,41,41,41,41,41,41,41,32,75,41,+41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,+51,50,32,95,53,56,41,41,41,32,85,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,66,39,32,40,40,66,32,40,83,39,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,+83,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,67,41,32,40,67,32,40,40,67,32,40,95,50,48,50,32,95,56,57,+50,41,41,32,40,95,56,57,55,32,95,49,49,48,57,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,49,50,+54,57,41,32,40,40,66,32,95,55,55,55,41,32,40,95,50,53,54,32,+95,49,53,50,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,66,32,95,49,50,54,49,41,32,40,40,66,32,95,55,52,51,41,32,+40,40,67,32,95,56,57,56,41,32,34,102,114,111,109,82,97,116,105,111,+110,97,108,34,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,85,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+41,32,95,49,50,55,50,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,90,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,49,51,49,+54,41,41,32,40,67,32,95,55,52,52,41,41,41,41,41,41,41,41,41,+41,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,+95,49,50,54,57,41,41,32,40,40,80,32,40,75,32,40,40,95,49,51,+32,95,53,55,41,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,32,95,49,49,57,55,41,32,95,49,49,57,54,+41,41,32,40,40,67,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,85,32,40,+40,66,32,40,95,49,51,32,95,53,55,41,41,32,95,52,55,55,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,40,95,49,51,32,95,53,55,41,32,95,52,55,54,41,41,41,+41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,54,49,41,41,41,+32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,+56,41,41,32,95,49,50,54,53,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,52,+51,32,95,53,56,41,41,41,32,40,67,32,95,49,50,56,51,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,+32,95,55,52,56,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,57,52,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,+54,54,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,+41,41,41,32,95,55,52,57,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,66,+32,40,40,95,50,55,50,32,95,53,54,41,32,95,52,49,52,41,41,32,+40,40,95,52,51,32,95,53,56,41,32,95,49,50,54,49,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,+41,41,41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,40,+66,32,66,39,41,32,40,67,32,95,49,49,57,53,41,41,41,32,40,40,+66,32,40,66,32,95,49,49,56,55,41,41,32,40,40,40,67,39,32,66,+41,32,95,56,48,49,41,32,95,52,49,49,41,41,41,41,41,32,40,40,+66,32,40,95,51,52,32,95,53,56,41,41,32,95,55,53,48,41,41,41,+41,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,83,+39,32,67,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,+40,40,40,83,39,32,40,83,39,32,80,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,49,50,48,52,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,83,39,32,40,95,51,51,32,95,53,56,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,66,41,41,32,40,67,32,+95,49,49,57,53,41,41,32,40,40,66,32,95,49,49,56,54,41,32,95,+49,51,48,48,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+95,51,50,32,95,53,56,41,41,41,32,40,40,67,39,32,40,95,52,51,+32,95,53,56,41,41,32,95,49,50,54,50,41,41,32,40,40,66,32,40,+95,51,52,32,95,53,56,41,41,32,40,40,66,32,95,55,53,49,41,32,+95,55,54,54,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,+40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,89,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,80,41,41,32,40,+40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,50,54,49,41,41,32,40,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,32,40,40,66,32,80,41,32,95,52,50,+51,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,+39,32,40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,67,32,83,39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,+32,95,49,50,48,52,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,40,+67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,41,32,+40,40,66,32,40,67,39,32,95,49,50,56,52,41,41,32,40,40,66,32,+95,49,49,56,54,41,32,95,49,51,48,48,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,95,50,54,49,41,41,32,40,67,32,+95,49,50,56,56,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,67,39,41,32,67,39,41,41,32,40,40,67,39,32,40,+67,39,32,95,52,54,50,41,41,32,40,67,32,95,55,56,52,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,53,56,41,41,32,40,40,40,83,39,32,95,49,+50,56,52,41,32,40,40,66,32,95,49,51,48,49,41,32,40,95,56,48,+53,32,95,56,48,56,41,41,41,32,73,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,67,39,41,32,40,40,67,39,32,95,52,54,50,41,+32,95,55,56,53,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,95,50,54,49,41,32,95,49,50,57,52,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,40,67,39,32,+95,52,54,50,41,32,95,55,56,54,41,41,41,41,41,41,32,95,52,54,+49,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,+40,66,32,40,66,32,85,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,66,41,41,32,40,67,32,95,49,49,57,53,41,+41,32,40,40,66,32,95,49,49,56,54,41,32,95,49,51,48,48,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,40,40,66,32,40,66,32,95,55,53,49,41,41,32,40,67,32,+95,55,54,55,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,95,49,50,54,54,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,67,32,95,49,50,54,56,41,32,34,70,114,111,109,+34,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,95,49,50,54,54,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,67,+32,95,49,50,54,56,41,32,34,70,114,111,109,84,111,34,41,41,41,32,+40,40,40,67,39,32,66,41,32,79,41,32,40,40,67,32,79,41,32,75,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,66,39,32,95,49,50,54,54,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,67,32,95,49,50,54,56,41,32,34,70,114,+111,109,84,104,101,110,34,41,41,41,32,40,40,40,67,39,32,66,41,32,+79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,95,+49,50,54,54,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,+39,32,40,66,39,32,40,40,67,32,95,49,50,54,56,41,32,34,70,114,+111,109,84,104,101,110,84,111,34,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,79,41,41,32,40,40,40,67,39,32,66,41,32,+79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,80,32,95,49,51,48,50,41,41,+41,41,32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,83,39,32,83,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+66,32,40,67,32,40,40,67,32,67,39,41,32,40,90,32,75,41,41,41,+41,32,95,49,50,54,54,41,41,32,75,41,41,41,32,40,40,40,67,39,+32,95,50,54,49,41,32,95,49,49,48,48,41,32,34,98,97,100,32,102,+105,110,97,108,32,100,111,32,115,116,97,116,101,109,101,110,116,34,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,+41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+83,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,+67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,83,39,+41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,+39,32,40,66,39,32,40,66,39,32,95,49,50,54,54,41,41,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,66,32,40,66,32,40,67,39,32,95,55,52,52,41,41,+41,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,66,32,+40,66,32,95,55,52,51,41,41,32,40,40,40,83,39,32,95,52,55,48,+41,32,40,40,67,32,95,56,57,56,41,32,34,62,62,61,34,41,41,32,+40,40,66,32,40,67,32,95,57,48,53,41,41,32,40,40,67,32,95,56,+57,56,41,32,34,62,62,61,34,41,41,41,41,41,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,95,+55,54,49,41,32,40,40,40,67,39,32,79,41,32,40,40,67,32,95,49,+49,50,57,41,32,34,36,120,34,41,41,32,75,41,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,+95,55,52,56,41,32,40,40,67,32,95,49,49,50,57,41,32,34,36,120,+34,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,32,40,40,66,32,40,66,32,40,67,32,80,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,95,55,57,49,41,41,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,66,32,40,66,32,40,+80,32,95,52,54,49,41,41,41,32,95,55,53,50,41,41,32,75,41,41,+32,95,52,54,49,41,41,41,32,75,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,95,+49,50,54,54,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,95,55,52,52,41,41,+41,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,66,32,+40,66,32,95,55,52,51,41,41,32,40,40,40,83,39,32,95,52,55,48,+41,32,40,40,67,32,95,56,57,56,41,32,34,62,62,34,41,41,32,40,+40,66,32,40,67,32,95,57,48,53,41,41,32,40,40,67,32,95,56,57,+56,41,32,34,62,62,34,41,41,41,41,41,41,41,32,95,55,53,50,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,+32,95,49,50,54,54,41,41,41,32,40,40,66,32,40,66,32,40,67,32,+95,55,52,57,41,41,41,32,95,55,53,50,41,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,95,49,50,54,54,+41,41,32,40,40,67,39,32,95,55,52,52,41,32,95,55,52,51,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,40,67,39,32,67,39,+41,32,40,40,66,32,67,39,41,32,40,66,39,32,95,49,50,54,54,41,+41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,95,55,54,49,41,+32,40,40,67,32,79,41,32,75,41,41,41,41,32,40,40,66,32,40,67,+39,32,95,55,52,52,41,41,32,40,40,66,32,95,55,52,52,41,32,95,+55,52,51,41,41,41,41,41,32,40,40,67,32,95,49,49,50,57,41,32,+34,36,120,34,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,40,83,39,32,95,49,50,54,50,41,32,40,40,66,32,+95,49,51,48,49,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+32,73,41,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,83,39,41,32,83,+39,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,+95,49,50,54,49,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,40,95,+51,50,32,95,53,56,41,41,32,95,49,50,54,49,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,+41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,+32,40,67,39,32,40,83,39,32,66,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,41,+41,32,95,49,50,56,55,41,41,41,41,32,40,40,40,83,39,32,66,41,+32,40,66,39,32,40,40,66,32,40,83,39,32,40,67,39,32,40,67,39,+32,66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,95,51,50,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,67,+39,32,67,41,41,32,95,49,50,56,55,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,95,51,51,32,95,53,56,41,41,41,41,32,95,49,+50,54,52,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,41,32,95,55,53,53,41,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,32,95,+49,51,49,51,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,+32,95,53,56,41,41,41,32,95,49,51,49,51,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,32,+95,55,53,53,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,95,+49,50,53,54,32,40,95,49,50,53,56,32,95,55,57,57,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,95,51,50,32,95,53,56,41,41,41,41,41,32,40,40,67,39,32,+40,67,39,32,67,41,41,32,95,49,51,49,54,41,41,32,40,67,32,95,+49,51,49,51,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,+66,32,95,50,54,49,41,32,40,40,67,32,95,49,50,51,48,41,32,95,+55,57,57,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,95,49,50,51,+56,41,41,41,32,95,49,50,54,54,41,41,32,40,40,66,32,40,66,32,+40,95,51,52,32,95,53,56,41,41,41,32,95,55,54,48,41,41,41,41,+41,41,32,40,40,66,32,40,95,50,54,49,32,95,50,52,41,41,32,40,+40,66,32,40,95,52,54,51,32,34,116,99,69,120,112,114,58,32,34,41,+41,32,40,40,40,83,39,32,95,52,54,51,41,32,40,40,66,32,40,95,+49,53,57,48,32,95,56,57,48,41,41,32,40,95,56,48,53,32,95,56,+48,56,41,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,+35,51,50,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,56,51,+55,41,41,41,41,41,41,41,32,40,95,56,48,53,32,95,56,48,56,41,+41,41,32,40,40,65,32,58,49,50,54,56,32,40,40,66,32,40,66,32,+40,95,51,57,57,32,95,55,52,52,41,41,41,32,40,40,66,32,40,66,+32,95,55,52,51,41,41,32,40,40,40,67,39,32,66,41,32,95,56,57,+56,41,32,40,95,52,54,51,32,34,101,110,117,109,34,41,41,41,41,41,+32,40,40,65,32,58,49,50,54,57,32,40,40,40,83,39,32,40,83,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,67,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,+40,67,32,83,39,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,+41,41,32,75,41,41,32,75,41,41,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,49,50,48,52,41,41,41,41,32,95,49,50,55,48,+41,41,41,41,32,75,41,41,32,40,40,40,67,39,32,40,83,39,32,83,+41,41,32,95,49,50,55,48,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,80,41,32,40,90,32,40,40,67,32,+95,49,50,57,56,41,32,95,49,49,48,55,41,41,41,32,40,90,32,40,+40,67,32,95,49,50,57,56,41,32,95,49,49,49,49,41,41,41,41,32,+40,90,32,40,40,67,32,95,49,50,57,56,41,32,95,49,49,48,57,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,90,32,40,+40,67,32,95,49,50,57,56,41,32,95,49,49,49,48,41,41,41,41,32,+40,90,32,40,40,40,83,39,32,95,49,49,56,54,41,32,95,49,51,48,+48,41,32,40,40,67,32,95,49,50,57,56,41,32,95,49,49,49,48,41,+41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,+95,49,51,48,50,41,41,41,41,41,32,40,40,65,32,58,49,50,55,48,+32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,+66,41,32,95,49,51,49,54,41,32,95,55,52,55,41,41,41,32,40,40,+65,32,58,49,50,55,49,32,40,40,66,32,40,66,32,40,40,95,51,50,+32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,52,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,+53,56,41,41,41,32,40,40,67,39,32,40,95,52,51,32,95,53,56,41,+41,32,40,40,66,32,85,41,32,40,40,66,32,40,40,83,39,32,66,41,+32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,48,+56,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,67,39,32,80,41,41,41,32,40,40,+66,32,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,95,55,52,+51,41,41,41,32,40,40,40,67,39,32,66,41,32,95,49,50,55,51,41,+32,95,49,49,51,54,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,40,67,39,32,40,40,89,32,40,40,40,83,39,32,+40,67,32,40,40,40,83,39,32,40,67,39,32,80,41,41,32,40,40,66,+32,40,66,32,40,83,32,40,40,40,67,39,32,83,39,41,32,40,40,66,+32,83,39,41,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+83,39,32,40,67,39,32,80,41,41,41,41,32,40,40,67,32,40,40,40,+67,39,32,67,39,41,32,40,40,66,32,83,39,41,32,67,39,41,41,32,+40,40,40,67,39,32,66,41,32,67,41,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,41,41,41,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,40,83,39,32,83,41,41,+32,40,40,66,32,40,66,32,40,67,32,83,39,41,41,41,32,40,40,66,+32,40,66,32,40,80,32,95,49,51,48,50,41,41,41,32,40,40,66,32,+40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,52,54,+50,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,+32,66,41,41,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,83,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,40,83,39,+32,40,83,39,32,66,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+40,67,39,32,66,41,32,66,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,66,32,67,41,41,32,95,52,+54,49,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,90,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,85,32,95,49,51,+48,50,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,67,32,66,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,83,32,66,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,85,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,41,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,40,83,39,32,66,41,41,32,40,40,66,32,66,39,41,32,+40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,83,39,32,83,+41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,95,49,50,49,41,41,32,40,67,32,40,95,50,48,50,32,+95,50,56,49,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+95,49,50,48,41,41,32,40,67,32,40,95,50,48,51,32,95,56,50,49,+41,41,41,32,40,40,67,32,40,95,50,48,50,32,95,56,50,49,41,41,+32,95,56,50,48,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,40,67,39,+32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,+66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,32,+40,67,39,32,67,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,+32,40,83,39,32,95,49,50,48,41,41,32,40,67,32,40,95,52,57,55,+32,95,50,56,50,41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,49,50,49,41,32,40,40,67,32,40,95,50,48,+50,32,95,56,50,49,41,41,32,95,56,49,56,41,41,41,41,32,40,67,+32,40,95,50,48,50,32,95,50,56,49,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,+32,95,52,54,50,41,41,41,41,32,40,67,32,95,52,54,50,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,32,40,66,32,67,41,41,41,41,41,41,32,40,40,40,67,39,32,+95,56,51,54,41,32,40,95,56,48,53,32,95,56,48,56,41,41,32,34,+97,109,98,105,103,117,111,117,115,32,111,112,101,114,97,116,111,114,32,101,+120,112,114,101,115,115,105,111,110,34,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,+32,40,66,39,32,40,85,32,95,49,51,48,50,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,80,32,95,49,+51,48,50,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,+67,39,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,52,54,50,+41,41,41,32,40,40,66,32,40,67,39,32,95,55,52,52,41,41,32,95,+55,52,52,41,41,41,41,41,41,41,41,41,32,40,85,32,65,41,41,32,+40,85,32,75,41,41,41,32,75,41,41,32,40,40,67,32,79,41,32,75,+41,41,32,95,52,54,49,41,41,41,41,41,32,40,40,65,32,58,49,50,+55,50,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,83,32,95,+49,49,57,49,41,41,32,40,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,49,50,48,52,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,95,49,50,48,52,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,+83,39,32,40,95,51,51,32,95,53,56,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,95,+49,49,57,57,41,41,32,95,49,49,56,56,41,41,32,40,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,65,32,58,49,+50,55,51,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,95,52,+55,49,32,40,40,80,32,95,56,49,56,41,32,40,40,95,52,56,53,32,+95,50,55,55,41,32,40,95,51,53,57,32,35,57,41,41,41,41,41,41,+41,32,40,67,32,95,57,50,56,41,41,41,32,40,40,65,32,58,49,50,+55,52,32,40,40,67,32,95,49,50,48,54,41,32,34,97,100,105,99,116,+34,41,41,32,40,40,65,32,58,49,50,55,53,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,+50,54,53,41,41,32,40,40,66,32,40,66,32,40,40,95,50,55,54,32,+95,53,54,41,32,95,55,52,54,41,41,41,32,40,67,32,40,95,49,50,+55,54,32,95,49,50,52,41,41,41,41,41,32,40,40,65,32,58,49,50,+55,54,32,40,40,66,32,89,41,32,40,40,66,32,40,40,83,39,32,83,+41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,40,40,66,32,67,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,+32,40,40,67,32,83,39,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,+32,75,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,50,51,41,41,41,+41,32,67,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,40,66,32,40,40,83,39,32,83,39,41,32,95,49,49,+57,50,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,+50,32,95,53,56,41,41,32,40,40,40,67,39,32,95,49,50,48,54,41,+32,40,95,56,48,53,32,40,95,56,48,57,32,95,56,49,53,41,41,41,+32,34,102,99,110,83,34,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,95,51,50,32,95,53,56,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,95,50,54,49,41,32,95,49,51,+50,48,41,41,41,32,40,40,66,32,40,95,52,51,32,95,53,56,41,41,+32,95,49,50,55,55,41,41,41,41,32,40,40,66,32,85,41,32,40,40,+66,32,40,40,83,39,32,83,41,32,40,40,66,32,85,41,32,40,95,51,+52,32,95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,95,50,54,49,32,40,95,55,57,48,32,95,52,54,49,+41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,+40,66,32,95,55,57,49,41,32,40,40,40,67,39,32,79,41,32,40,40,+66,32,40,80,32,95,52,54,49,41,41,32,95,55,52,51,41,41,32,75,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,52,54,+51,41,32,95,49,50,56,53,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,79,41,41,32,95,55,56,55,41,32,75,41,41,41,41,41,32,75,+41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,+55,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,+56,41,41,32,40,40,67,32,95,49,50,48,54,41,32,34,102,99,110,68,+34,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,83,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,50,54,49,41,41,32,40,67,32,95,49,49,55,48,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,41,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,79,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,+41,32,40,40,66,32,40,67,32,83,41,41,32,40,40,66,32,40,66,32,+40,67,32,66,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,+39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,+67,39,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+67,41,32,40,40,66,32,40,67,32,67,39,41,41,32,40,40,66,32,95,+55,57,48,41,32,40,40,40,67,39,32,79,41,32,95,55,52,51,41,32,+75,41,41,41,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,95,50,54,49,41,32,40,40,66,32,95,55,57,48,41,32,+40,40,40,67,39,32,79,41,32,95,55,52,51,41,32,75,41,41,41,41,+41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,95,55,57,49,41,+32,40,40,40,67,39,32,79,41,32,40,40,66,32,40,80,32,95,52,54,+49,41,41,32,95,55,52,51,41,41,32,75,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,95,55,56,55,41,32,75,41,41,41,+41,41,32,75,41,41,41,41,41,41,32,40,95,56,48,53,32,40,95,56,+48,57,32,95,56,49,53,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,50,55,55,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,50,54,49,41,41,+32,95,49,50,55,56,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,+41,32,40,67,32,95,49,50,55,57,41,41,41,32,40,40,66,32,40,66,+32,40,95,51,52,32,95,53,56,41,41,41,32,95,55,57,48,41,41,41,+41,41,32,40,40,65,32,58,49,50,55,56,32,40,40,40,83,39,32,67,+41,32,40,40,66,32,40,67,32,83,39,41,41,32,40,40,67,32,80,41,+32,95,52,54,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,40,83,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,+50,32,95,53,56,41,41,41,32,40,40,67,39,32,95,49,50,55,50,41,+32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,85,41,41,41,32,40,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,95,50,54,49,41,41,32,40,67,32,95,49,50,56,56,41,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,+32,40,40,66,32,40,66,32,95,50,54,49,41,41,32,40,67,32,95,49,+50,55,56,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,67,39,+32,66,41,41,32,95,52,54,50,41,41,41,41,41,41,41,32,40,40,65,+32,58,49,50,55,57,32,40,40,66,32,85,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,95,50,54,49,41,32,95,49,50,57,52,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,51,50,32,95,53,56,41,41,41,32,40,40,66,32,40,95,+52,51,32,95,53,56,41,41,32,95,49,50,56,48,41,41,41,32,40,40,+66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,40,67,32,+95,55,57,49,41,41,41,41,41,41,32,40,40,65,32,58,49,50,56,48,+32,40,40,66,32,85,41,32,40,40,66,32,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,95,49,50,56,49,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,56,52,41,41,32,+40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,+41,41,41,41,41,32,40,40,65,32,58,49,50,56,49,32,40,40,67,32,+40,40,67,32,83,39,41,32,40,85,32,95,52,54,49,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,+32,95,49,50,56,50,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,49,50,56,49,41,41,41,+32,40,40,40,67,39,32,66,41,32,66,41,32,95,52,54,50,41,41,41,+41,41,32,40,40,65,32,58,49,50,56,50,32,40,40,40,67,39,32,83,+41,32,40,40,67,32,40,40,67,32,83,39,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,+54,49,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,95,50,54,+49,41,41,32,40,67,32,95,49,50,56,56,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,66,41,32,40,67,32,95,55,56,52,41,41,41,41,+41,41,41,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,+56,41,41,32,40,40,40,83,39,32,95,49,50,56,52,41,32,40,40,66,+32,95,49,51,48,49,41,32,40,95,56,48,53,32,95,56,48,56,41,41,+41,32,73,41,41,41,32,40,40,67,32,66,41,32,95,55,56,53,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,95,50,54,49,41,32,95,49,+50,57,52,41,41,32,40,40,67,32,66,41,32,95,55,56,54,41,41,41,+41,32,40,40,65,32,58,49,50,56,51,32,40,40,66,32,40,66,32,85,+41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,95,50,54,49,41,41,32,95,49,50,56,56,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,+57,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,80,41,41,41,41,41,32,40,40,65,32,58,49,50,56,52,32,+40,40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,51,49,57,+41,41,41,32,95,49,50,54,50,41,41,32,40,85,32,40,40,40,83,39,+32,67,41,32,40,40,66,32,40,83,32,95,51,57,50,41,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,67,39,32,95,55,52,57,41,32,95,49,50,56,53,+41,41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,+40,65,32,58,49,50,56,53,32,40,95,51,57,52,32,40,85,32,40,40,+40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,67,39,32,66,41,+32,95,55,56,55,41,32,40,40,40,67,39,32,79,41,32,40,40,66,32,+40,95,55,57,48,32,95,52,54,49,41,41,32,40,40,40,67,39,32,95,+55,57,49,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,52,54,+49,41,41,32,75,41,41,32,95,52,54,49,41,41,41,32,75,41,41,41,+32,75,41,41,41,41,32,40,40,65,32,58,49,50,56,54,32,40,40,40,+83,39,32,40,83,39,32,80,41,41,32,40,40,66,32,67,41,32,95,49,+50,54,52,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,95,51,50,32,95,53,56,41,41,41,41,32,40,40,66,32,67,41,32,+40,40,67,32,95,49,50,56,55,41,32,95,50,53,41,41,41,32,40,75,+32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,+41,41,32,40,40,65,32,58,49,50,56,55,32,40,40,66,32,40,66,32,+40,66,32,40,40,83,39,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,51,48,57,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,85,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,41,32,95,49,51,49,52,41,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,+32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,+40,40,66,32,40,66,32,95,49,51,48,53,41,41,32,40,40,40,67,39,+32,66,41,32,79,41,32,40,40,67,32,79,41,32,75,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,67,39,32,95,50,54,49,41,41,+32,40,40,66,32,40,66,32,40,95,52,53,32,95,53,56,41,41,41,32,+40,40,66,32,40,66,32,95,49,50,50,41,41,32,40,40,66,32,40,66,+32,95,51,57,50,41,41,32,40,40,67,39,32,95,51,57,54,41,32,40,+67,32,40,95,52,51,50,32,95,56,57,50,41,41,41,41,41,41,41,41,+32,40,40,67,32,95,49,49,57,56,41,32,34,83,117,98,115,117,109,112,+116,105,111,110,32,99,104,101,99,107,32,102,97,105,108,101,100,34,41,41,+41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,50,56,56,32,40,40,40,83,39,32,40,83,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,+40,40,83,39,32,67,39,41,32,83,39,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,67,39,32,83,41,32,40,40,67,39,32,95,49,50,+50,41,32,95,57,49,48,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,40,66,32,40,67,39,32,95,50,54,49,41,41,+32,40,40,66,32,40,66,32,95,49,50,50,50,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,40,67,32,80,41,41,32,75,41,41,+41,41,41,32,85,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,67,39,32,40,40,83,39,32,40,95,51,51,32,95,53,56,41,41,32,+95,49,50,57,50,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,95,52,+51,32,95,53,56,41,32,40,40,40,67,39,32,40,95,50,55,54,32,95,+53,54,41,41,32,80,41,32,95,49,50,48,52,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,+32,95,49,50,50,50,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,+41,41,41,32,95,49,50,56,57,41,41,32,40,40,66,32,85,41,32,40,+90,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,50,32,95,+53,56,41,41,32,40,95,49,50,57,51,32,35,48,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,40,67,39,32,66,+41,32,40,40,66,32,95,50,54,49,41,32,95,49,49,54,57,41,41,41,+41,41,41,41,41,41,41,32,95,55,57,52,41,41,41,32,40,40,65,32,+58,49,50,56,57,32,40,95,49,50,54,48,32,95,49,50,57,49,41,41,+32,40,40,65,32,58,49,50,57,48,32,40,95,49,50,53,57,32,95,49,+50,57,49,41,41,32,40,40,65,32,58,49,50,57,49,32,40,40,66,32,+89,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,67,+39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,40,83,39,32,83,41,41,41,41,32,40,40,40,83,+39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,39,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,40,83,39,32,67,+41,32,40,40,66,32,40,83,32,83,39,41,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,40,+66,32,40,83,32,95,57,49,53,41,41,41,32,40,40,40,83,39,32,40,+83,39,32,83,41,41,32,40,40,66,32,40,66,32,40,83,32,95,57,49,+48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,40,+66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,54,53,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,40,95,+51,50,32,95,53,56,41,41,32,95,49,50,48,56,41,41,41,32,40,40,+66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,+66,32,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,80,+32,40,75,32,95,49,51,48,50,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,95,+49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,41,41,32,40,40,66,32,67,41,32,95,49,50,+54,52,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,32,40,+95,51,52,32,95,53,56,41,41,32,40,67,32,40,40,80,32,95,52,54,+49,41,32,95,52,54,49,41,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,+95,49,50,48,56,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,+32,40,95,51,51,32,95,53,56,41,41,32,40,85,32,40,75,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,80,32,40,75,32,95,50,53,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,40,75,32,95,+50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,+53,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,50,53,41,+41,41,32,40,75,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,+67,32,40,40,67,32,40,40,67,32,40,40,80,32,40,75,32,95,50,53,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,50,53,41,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,+41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,50,53,41,41,41,+41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,+40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,+32,40,75,32,95,50,53,41,41,41,32,40,75,32,40,75,32,40,40,95,+51,52,32,95,53,56,41,32,95,49,51,52,49,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,32,95,49,50,49,49,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,+32,66,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,+32,40,40,66,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,+83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,+32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,+40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,+40,83,39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,+39,32,67,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,80,41,32,75,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,+32,95,49,51,48,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,85,41,41,41,41,32,40,40,66,32,40,40,83,39,32,40,+67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,41,41,32,+40,40,66,32,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,66,+32,40,66,32,40,67,32,95,49,49,57,50,41,41,41,32,40,40,66,32,+40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,40,40,66,32,67,+41,32,40,80,32,95,52,54,49,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,85,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,50,55,52,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,83,39,32,80,41,41,32,40,40,40,67,39,32,40,67,39,32,79,+41,41,32,40,67,32,80,41,41,32,75,41,41,41,32,40,40,40,67,39,+32,66,41,32,95,55,52,52,41,32,95,55,52,51,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,+41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,41,41,41,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,40,66,32,83,39,41,32,83,39,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,+95,51,51,32,95,53,56,41,41,41,41,32,40,40,66,32,67,41,32,95,+49,50,54,52,41,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,+32,40,40,66,32,40,66,32,67,41,41,32,95,49,50,56,55,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,+56,41,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,+41,41,41,41,41,41,41,41,32,40,40,40,110,111,77,97,116,99,104,32,+34,115,114,99,47,77,105,99,114,111,72,115,47,84,121,112,101,67,104,101,+99,107,46,104,115,34,41,32,35,49,56,49,52,41,32,35,49,55,41,41,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,54,53,41,41,32,+40,90,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,32,40,67,+32,40,40,80,32,95,52,54,49,41,32,95,52,54,49,41,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,+40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,50,57,48,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,32,66,41,41,41,41,32,40,40,+66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,+66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,+55,50,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,85,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,+51,50,32,95,53,56,41,41,41,32,40,67,32,95,49,50,56,57,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,85,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,+66,39,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,41,32,+40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,66,+39,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,40,40,67,39,32,67,41,32,95,49,50,56,54,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,40,67,39,32,40,67,39,32,66,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,80,41,41,32,95,52,54,51,41,41,41,32,95,52,+54,51,41,41,41,41,32,95,55,52,52,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,+53,56,41,41,41,32,95,49,50,55,49,41,41,41,32,75,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,+56,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,67,32,40,40,67,32,67,39,41,32,75,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,95,49,50,54,57,41,32,40,+40,66,32,95,55,55,53,41,32,95,51,54,48,41,41,41,41,32,75,41,+41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,41,32,75,41,+41,32,95,49,50,54,57,41,41,32,40,40,66,32,40,95,51,52,32,95,+53,56,41,41,32,40,67,32,40,40,80,32,95,52,54,49,41,32,95,52,+54,49,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,+50,32,95,53,56,41,41,32,40,40,66,32,40,40,95,50,55,50,32,95,+53,54,41,32,95,52,49,52,41,41,32,40,40,95,52,51,32,95,53,56,+41,32,95,49,50,57,48,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,85,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+95,51,51,32,95,53,56,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,67,32,95,49,+49,57,53,41,41,41,32,40,40,66,32,40,66,32,95,49,49,56,55,41,+41,32,40,40,40,67,39,32,66,41,32,95,56,48,49,41,32,95,52,49,+49,41,41,41,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,+40,40,66,32,95,51,57,51,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,40,66,32,95,51,57,51,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,32,40,40,66,32,95,55,53,48,41,32,40,85,32,40,75,+32,65,41,41,41,41,41,41,41,41,32,95,52,49,53,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,+56,41,32,95,49,50,48,52,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,40,95,+51,51,32,95,53,56,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,66,41,41,32,40,67,32,95,49,49,57,53,41,41,32,40,40,66,32,+95,49,49,56,54,41,32,95,49,51,48,48,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,+40,67,39,32,40,95,52,51,32,95,53,56,41,41,32,95,49,50,56,57,+41,41,32,40,40,66,32,40,40,66,32,40,95,51,52,32,95,53,56,41,+41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,80,41,32,+40,40,66,32,95,51,57,51,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,40,66,32,95,51,57,51,41,32,40,85,32,40,75,32,75,41,+41,41,41,41,32,40,40,66,32,95,55,53,49,41,32,40,40,66,32,95,+55,54,54,41,32,40,85,32,40,75,32,65,41,41,41,41,41,41,41,32,+95,52,49,53,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,+90,32,40,90,32,75,41,41,41,41,41,32,40,90,32,75,41,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,95,49,50,53,54,+32,40,95,49,50,53,56,32,95,55,57,57,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,+40,83,39,32,40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,67,+39,32,67,41,32,95,49,50,56,54,41,41,41,32,40,67,32,95,49,50,+56,57,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+83,39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,+32,95,49,50,48,56,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,85,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,90,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,66,39,32,40,40,66,32,40,67,39,32,66,41,+41,32,40,66,32,40,95,51,50,32,95,53,56,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,40,+40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,+40,66,39,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,+41,41,32,95,49,50,54,53,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,+32,66,39,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,+40,67,39,32,40,95,51,51,32,95,53,56,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,40,67,39,32,67,39,41,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,+32,40,40,67,32,40,40,80,32,40,75,32,95,49,51,48,50,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,+41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,+32,67,41,32,95,49,50,54,52,41,41,41,32,40,75,32,95,49,51,48,+50,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,+51,52,32,95,53,56,41,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,67,41,41,32,+80,41,41,41,32,95,55,53,55,41,41,41,41,41,41,41,41,41,41,41,+32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,40,66,+32,40,95,50,54,49,32,95,50,52,41,41,32,40,40,66,32,40,95,52,+54,51,32,34,116,99,80,97,116,58,32,34,41,41,32,40,40,40,83,39,+32,95,52,54,51,41,32,40,40,66,32,40,95,49,53,57,48,32,95,56,+57,48,41,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,32,40,+40,66,32,40,95,52,54,51,32,40,40,79,32,35,51,50,41,32,75,41,+41,41,32,40,95,49,53,57,48,32,95,56,51,55,41,41,41,41,41,41,+41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,41,32,40,40,65,+32,58,49,50,57,50,32,40,40,40,83,39,32,95,50,54,49,41,32,40,+40,66,32,40,95,52,53,32,95,53,56,41,41,32,40,95,52,53,55,32,+95,56,57,50,41,41,41,32,40,40,66,32,40,40,40,83,39,32,95,50,+54,49,41,32,40,40,66,32,95,49,49,48,48,41,32,40,95,56,48,53,+32,95,56,48,55,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,+77,117,108,116,105,112,108,121,32,100,101,102,105,110,101,100,58,32,34,41,+41,32,95,57,48,50,41,41,41,32,95,52,50,56,41,41,41,32,40,40,+65,32,58,49,50,57,51,32,40,40,66,32,89,41,32,40,40,40,83,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,+39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,66,32,40,67,32,40,40,67,32,67,39,41,32,75,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,+32,40,95,51,51,32,95,53,56,41,41,41,32,40,40,66,32,95,49,50,+57,51,41,32,40,40,67,32,40,95,52,55,57,32,95,50,55,55,41,41,+32,35,49,41,41,41,41,32,40,95,49,50,57,51,32,35,48,41,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,41,32,90,41,41,32,75,41,41,32,75,41,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,+40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,95,52,57,55,32,+95,50,56,50,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,+52,49,41,41,41,41,32,40,40,40,67,39,32,95,49,49,48,48,41,32,+40,95,56,48,53,32,95,56,49,49,41,41,32,34,116,111,111,32,109,97,+110,121,32,97,114,103,117,109,101,110,116,115,34,41,41,41,41,32,40,40,+40,67,39,32,95,49,49,48,48,41,32,40,95,56,48,53,32,95,56,49,+49,41,41,32,34,116,111,111,32,102,101,119,32,97,114,103,117,109,101,110,+116,115,34,41,41,41,32,95,55,55,51,41,41,41,32,40,90,32,75,41,+41,41,32,40,40,66,32,40,83,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,67,32,40,40,+67,32,67,39,41,32,75,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,90,32,75,41,41,+41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,32,75,41,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+80,41,32,75,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,+41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,+95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,50,+41,41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,+32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,+75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,67,+32,40,40,67,32,40,95,50,48,51,32,95,50,56,49,41,41,32,35,48,+41,41,32,40,40,95,51,52,32,95,53,56,41,32,95,49,51,52,49,41,+41,41,32,40,40,40,67,39,32,95,49,49,48,48,41,32,40,95,56,48,+53,32,95,56,48,56,41,41,32,34,66,97,100,32,112,97,116,116,101,114,+110,34,41,41,41,41,41,41,32,40,40,65,32,58,49,50,57,52,32,40,+40,40,83,39,32,40,67,39,32,40,40,83,39,32,40,95,51,51,32,95,+53,56,41,41,32,95,49,50,57,50,41,41,41,32,40,40,40,83,39,32,+66,41,32,40,40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,+41,41,32,40,40,66,32,40,95,52,51,32,95,53,56,41,41,32,40,40,+66,32,95,49,50,57,53,41,32,40,40,66,32,95,57,50,52,41,32,40,+95,51,57,52,32,40,40,67,32,40,40,80,32,40,75,32,40,75,32,75,+41,41,41,32,40,75,32,40,75,32,75,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,79,41,41,32,80,41,32,75,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,95,50,54,49,41,+32,95,49,50,50,50,41,41,41,32,40,40,66,32,40,95,51,50,32,95,+53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,50,57,+54,41,41,41,41,41,32,95,56,55,49,41,41,32,40,40,65,32,58,49,+50,57,53,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,67,32,95,57,50,56,41,41,32,40,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,95,49,50,48,52,41,41,32,40,40,66,32,40,+66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,+40,40,66,32,40,95,50,54,49,32,95,49,49,54,52,41,41,32,40,95,+49,50,53,53,32,40,95,49,50,53,56,32,95,55,57,57,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,+32,80,41,41,41,41,32,40,40,65,32,58,49,50,57,54,32,40,40,83,+32,40,40,80,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,95,+51,50,32,95,53,56,41,41,32,95,49,50,48,56,41,41,32,40,40,66,+32,40,66,32,85,41,41,32,40,40,66,32,90,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,+40,67,32,40,95,49,50,55,54,32,95,49,50,52,41,41,41,41,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,95,53,56,+41,41,41,41,32,95,55,56,55,41,41,41,41,41,41,32,40,40,40,83,+39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,+95,49,50,57,48,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,66,39,32,40,40,66,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,+95,50,54,49,41,41,32,40,40,66,32,40,66,32,40,95,52,53,32,95,+53,56,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+49,50,48,41,32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,+41,41,32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,41,41,+41,41,32,40,40,40,67,39,32,95,49,49,48,48,41,32,40,95,56,48,+53,32,95,56,48,56,41,41,32,34,101,120,105,115,116,101,110,116,105,97,+108,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,112,97,+116,116,101,114,110,32,98,105,110,100,105,110,103,34,41,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,40,95,51,50,32,95,53,56,41,41,41,32,40,67,32,95,49,50,+56,52,41,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,40,+95,51,52,32,95,53,56,41,41,41,41,32,95,55,56,56,41,41,41,41,+41,41,41,41,32,40,90,32,40,90,32,40,95,51,52,32,95,53,56,41,+41,41,41,41,32,40,40,65,32,58,49,50,57,55,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,83,32,40,40,83,32,40,+40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,+40,67,32,40,40,83,32,73,41,32,75,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,95,55,52,52,41,32,95,49,50,57,55,41,41,+32,95,49,50,57,55,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+40,66,32,95,55,52,53,41,32,95,49,50,57,55,41,41,32,40,95,51,+57,52,32,40,85,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+40,40,40,67,39,32,66,41,32,80,41,32,95,49,50,57,55,41,41,32,+75,41,41,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,95,49,+49,56,55,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,+56,48,49,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,32,95,+52,49,49,41,41,32,40,95,51,57,53,32,95,49,50,57,55,41,41,41,+41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,80,41,32,40,40,66,32,40,80,32,95,49,51,48,50,41,+41,32,40,40,40,67,39,32,40,67,39,32,80,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,95,49,49,56,54,41,32,40,40,66,32,+95,49,51,48,48,41,32,40,95,56,48,53,32,95,56,48,56,41,41,41,+41,32,95,49,50,57,55,41,41,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,+48,50,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,49,51,48,+50,41,41,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,40,40,66,32,+95,55,53,54,41,32,95,49,50,57,55,41,41,41,32,40,75,32,40,75,+32,95,49,51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,+41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,40,40,40,67,39,+32,66,41,32,95,55,54,48,41,32,95,49,50,57,55,41,41,41,32,40,+40,65,32,58,49,50,57,56,32,40,40,66,32,40,95,50,54,51,32,95,+49,49,56,52,41,41,32,95,56,57,56,41,41,32,40,40,65,32,58,49,+50,57,57,32,40,40,40,67,39,32,95,50,54,49,41,32,95,56,57,56,+41,32,40,40,95,52,54,51,32,95,49,49,48,54,41,32,34,91,93,34,+41,41,41,32,40,40,65,32,58,49,51,48,48,32,40,40,95,50,54,51,+32,95,49,49,56,52,41,32,95,49,50,57,57,41,41,32,40,40,65,32,+58,49,51,48,49,32,40,40,40,67,39,32,95,50,54,49,41,32,95,49,+50,57,56,41,32,40,40,95,52,54,51,32,95,49,49,48,53,41,32,34,+66,111,111,108,34,41,41,41,32,40,40,65,32,58,49,51,48,50,32,40,+95,50,52,32,34,105,109,112,111,115,115,105,98,108,101,34,41,41,32,40,+40,65,32,58,49,51,48,51,32,40,40,66,32,40,66,32,40,95,50,54,+49,32,95,50,52,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,34,105,109,112,111,115,115,105,98,108,101,58,32,34,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,95,52,54,51,41,41,32,40,40,66,+32,40,66,32,40,95,49,53,57,48,32,95,56,57,48,41,41,41,32,40,+40,66,32,95,56,48,53,41,32,40,85,32,65,41,41,41,41,32,40,40,+66,32,40,66,32,40,95,52,54,51,32,40,40,79,32,35,51,50,41,32,+75,41,41,41,41,32,40,40,66,32,95,49,53,57,48,41,32,40,85,32,+75,41,41,41,41,41,41,41,32,40,40,65,32,58,49,51,48,52,32,40,+40,66,32,85,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,40,66,32,40,95,+52,54,51,32,34,84,109,111,100,117,108,101,32,34,41,41,41,41,32,40,+40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,+32,95,57,48,50,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,+51,32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,32,40,40,67,+32,40,67,39,32,95,52,54,51,41,41,32,40,40,79,32,35,49,48,41,+32,75,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,51,48,53,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,+41,41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,49,57,55,41,+41,32,40,40,66,32,40,95,51,52,32,95,53,56,41,41,32,95,49,51,+49,49,41,41,41,32,40,40,65,32,58,49,51,48,54,32,40,40,40,67,+39,32,40,95,51,50,32,95,53,56,41,41,32,40,40,95,52,51,32,95,+53,56,41,32,95,49,49,57,55,41,41,32,40,40,66,32,40,95,51,52,+32,95,53,56,41,41,32,95,49,51,49,50,41,41,41,32,40,40,65,32,+58,49,51,48,55,32,40,95,54,52,32,40,40,95,50,54,51,32,40,95,+51,57,53,32,95,49,49,50,49,41,41,32,40,40,95,50,54,51,32,95,+49,51,51,54,41,32,95,49,49,52,50,41,41,41,41,32,40,40,65,32,+58,49,51,48,56,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,+95,51,50,32,95,53,56,41,41,32,40,40,95,52,51,32,95,53,56,41,+32,40,40,95,50,54,51,32,95,49,51,49,48,41,32,95,55,57,56,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,32,40,40,66,32,40,66,32,40,83,32,80,41,41,+41,32,40,40,66,32,40,67,39,32,95,56,50,50,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,52,49,50,41,32,40,95,51,57,+53,32,95,55,57,56,41,41,41,32,40,95,51,57,53,32,95,55,52,51,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,51,48,57,32,40,40,+83,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,83,32,40,40,67,32,67,39,41,32,75,41,+41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,95,49,49,57,49,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,49,51,48,+57,41,41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,95,+49,51,48,57,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,+54,51,41,41,41,32,95,55,52,52,41,41,41,41,41,41,41,41,32,40,+85,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,+41,32,95,49,51,48,57,41,41,32,40,40,66,32,85,41,32,40,40,66,+32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,41,41,41,32,+40,40,66,32,40,40,67,39,32,66,41,32,80,41,41,32,95,49,49,56,+56,41,41,41,41,41,41,41,41,32,40,90,32,75,41,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,51,48,+56,41,32,40,85,32,40,40,66,32,40,40,67,39,32,40,95,51,50,32,+95,53,56,41,41,32,95,49,51,48,57,41,41,32,40,40,66,32,85,41,+32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,51,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,95,51,52,32,95,53,56,+41,41,32,40,80,32,95,52,54,49,41,41,41,41,32,40,40,65,32,58,+49,51,49,48,32,40,40,66,32,40,40,95,51,50,32,95,53,56,41,32,+95,49,50,48,53,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,+95,53,56,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+95,56,57,56,41,32,40,95,56,48,53,32,95,56,48,55,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,+57,48,48,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,+35,51,53,41,32,75,41,41,41,32,40,95,49,53,57,48,32,95,50,56,+51,41,41,41,41,41,41,41,32,40,40,65,32,58,49,51,49,49,32,40,+40,95,51,57,55,32,40,40,89,32,40,40,66,32,40,40,83,39,32,40,+83,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,39,41,41,41,32,40,40,66,32,40,67,32,66,41,41,32,40,40,40,+67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,83,41,32,40,67,32,40,95,52,51,50,32,95,56,57,50,+41,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,83,39,32,+83,41,32,40,67,32,40,95,52,51,50,32,95,56,57,50,41,41,41,32,+40,40,40,83,39,32,67,41,32,40,40,66,32,40,83,32,95,57,49,48,+41,41,32,40,67,32,95,52,54,50,41,41,41,32,73,41,41,41,32,73,+41,41,41,32,73,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,67,39,41,32,40,85,32,40,75,32,95,50,53,41,41,41,41,41,32,+40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,66,32,40,67,39,+32,66,41,41,41,32,40,66,32,67,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,+75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,+50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,+32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,50,53,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,95,50,53,41,41,41,41,41,+32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,+32,95,50,53,41,41,41,41,32,75,41,41,32,40,75,32,95,50,53,41,+41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,+40,40,67,39,32,66,41,32,66,41,32,40,40,67,39,32,95,52,54,51,+41,32,40,95,51,57,53,32,95,55,57,56,41,41,41,41,41,41,41,32,+95,52,54,49,41,41,32,95,52,54,49,41,41,32,40,40,65,32,58,49,+51,49,50,32,40,40,95,51,57,55,32,40,89,32,40,40,40,83,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,67,32,40,40,67,32,83,39,41,32,75,41,41,41,32,40,40,+40,83,39,32,66,41,32,40,67,39,32,66,41,41,32,67,41,41,41,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,95,50,53,+41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,+32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,95,50,+53,41,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,75,32,95,+50,53,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,75,32,40,75,32,+95,50,53,41,41,41,41,32,40,75,32,40,75,32,40,75,32,95,50,53,+41,41,41,41,41,32,40,75,32,40,75,32,95,50,53,41,41,41,41,32,+40,75,32,40,75,32,95,50,53,41,41,41,41,32,40,40,40,83,39,32,+67,41,32,40,40,40,83,39,32,83,41,32,40,67,32,40,95,52,51,50,+32,95,50,56,49,41,41,41,32,40,67,32,95,52,54,50,41,41,41,32,+73,41,41,41,32,40,75,32,95,50,53,41,41,41,32,40,40,66,32,90,+41,32,67,41,41,41,41,32,95,52,54,49,41,41,32,40,40,65,32,58,+49,51,49,51,32,40,40,66,32,40,40,83,39,32,40,95,51,50,32,95,+53,56,41,41,32,95,49,51,48,57,41,41,32,40,40,66,32,40,66,32,+85,41,41,32,40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,+32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,67,32,+95,49,50,54,50,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,+95,51,57,50,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,40,40,95,51,50,32,95,53,56,41,32,95,49,51,48,55,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,+40,66,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,+40,66,32,40,66,32,95,49,51,48,53,41,41,32,95,52,54,50,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,+39,32,40,95,51,51,32,95,53,56,41,41,41,32,40,40,66,32,40,40,+83,39,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,53,+56,41,41,32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,+41,32,40,40,66,32,95,49,49,57,56,41,32,40,95,56,48,53,32,95,+56,48,56,41,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,110,+111,116,32,112,111,108,121,109,111,114,112,104,105,99,32,101,110,111,117,103,+104,58,32,34,41,41,32,40,40,66,32,95,49,54,48,57,41,32,40,95,+51,57,53,32,95,57,48,50,41,41,41,41,41,41,41,32,40,95,51,52,+32,95,53,56,41,41,41,41,32,40,40,67,39,32,95,51,57,54,41,32,+40,67,32,40,95,52,51,50,32,95,56,57,50,41,41,41,41,41,41,41,+41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,41,32,40,40,65,+32,58,49,51,49,52,32,40,40,66,32,89,41,32,40,40,66,32,40,40,+67,39,32,40,83,39,32,83,41,41,32,40,40,66,32,40,66,32,40,40,+83,39,32,83,39,41,32,40,40,66,32,67,41,32,40,40,40,67,39,32,+83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,67,32,83,39,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,+53,56,41,41,41,32,40,40,66,32,40,66,32,95,49,50,48,57,41,41,+32,80,41,41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,67,+39,32,67,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,83,32,95,49,49,57,49,41,41,41,41,32,40,40,40,83,39,32,+40,83,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,+83,39,41,32,95,49,49,57,49,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,95,51,51,32,95,+53,56,41,41,41,41,32,95,49,49,57,57,41,41,32,40,95,51,52,32,+95,53,56,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,85,41,+41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,32,+66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,40,+95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,50,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,32,+95,49,51,49,53,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,85,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,40,40,66,32,+40,66,32,40,95,51,50,32,95,53,56,41,41,41,32,95,49,50,55,50,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,85,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,+95,49,51,49,53,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,+49,51,49,53,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,50,32,95,53,56,+41,41,41,41,32,40,40,66,32,67,41,32,40,40,67,32,95,49,50,56,+55,41,32,95,50,53,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,90,41,41,41,32,95,49,51,49,52,41,41,41,32,40,40,65,+32,58,49,51,49,54,32,40,40,40,83,39,32,40,83,39,32,40,83,39,+32,80,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,95,51,50,32,95,53,56,41,41,+41,32,40,40,66,32,40,66,32,95,49,50,48,57,41,41,32,80,41,41,+41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,+95,51,51,32,95,53,56,41,41,41,41,32,95,49,50,54,52,41,41,32,+40,95,51,52,32,95,53,56,41,41,41,41,41,32,95,49,51,49,52,41,+41,32,40,40,65,32,58,49,51,49,55,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,54,41,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,40,67,39,32,83,39,41,41,32,40,40,66,32,40,66,32,+67,41,41,32,40,40,40,83,39,32,40,67,39,32,67,41,41,32,40,40,+66,32,40,66,32,40,40,83,39,32,83,39,41,32,95,56,48,50,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,+32,95,53,56,41,32,40,95,54,52,32,95,49,49,52,56,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,66,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,67,39,32,40,67,39,32,40,83,39,32,40,95,51,50,32,95,53,56,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,95,50,55,54,32,95,53,54,41,32,95,51,57,51,41,41,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,+39,41,32,40,40,66,32,40,66,32,40,95,52,51,32,95,53,56,41,41,+41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,+40,66,32,95,49,51,49,55,41,41,41,32,40,40,67,39,32,40,67,39,+32,95,55,52,52,41,41,32,40,40,66,32,40,66,32,95,55,52,51,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,57,48,54,41,+41,41,32,95,49,51,49,56,41,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,95,52,49,50,32,40,40,95,49,56,52,32,95,49,57,+56,41,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,+57,32,35,49,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,95,51,57,53,41,41,32,40,40,66,32,40,66,32,95,56,50,50,41,+41,32,40,40,67,39,32,95,52,49,50,41,32,40,40,66,32,40,95,51,+57,53,32,95,55,57,56,41,41,32,40,85,32,40,90,32,40,90,32,40,+90,32,75,41,41,41,41,41,41,41,41,32,40,85,32,40,75,32,40,90,+32,40,90,32,75,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,40,95,51,52,32,+95,53,56,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+95,52,54,50,41,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,41,32,+40,40,40,67,39,32,67,41,32,40,40,67,32,80,41,32,95,52,54,49,+41,41,32,95,52,54,49,41,41,41,41,32,40,85,32,40,75,32,40,75,+32,40,75,32,65,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,95,50,54,49,32,40,95,52,55,49,32,95,49,51,48,50,41,+41,41,41,32,95,57,50,56,41,41,41,41,41,32,40,40,66,32,90,41,+32,40,40,66,32,40,66,32,40,40,95,50,55,54,32,95,53,54,41,32,+95,51,57,51,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,95,+52,51,32,95,53,56,41,41,41,32,40,40,66,32,40,66,32,85,41,41,+32,40,40,66,32,40,66,32,40,66,32,95,49,51,49,55,41,41,41,32,+40,40,67,39,32,40,67,39,32,95,55,52,52,41,41,32,40,40,66,32,+40,67,32,95,56,48,51,41,41,32,95,52,49,49,41,41,41,41,41,32,+40,95,52,49,50,32,40,40,95,49,56,52,32,95,49,57,56,41,32,40,+40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,57,32,35,48,+41,41,41,41,41,41,41,41,41,41,32,40,85,32,65,41,41,41,32,40,+85,32,75,41,41,41,32,95,49,49,51,49,41,41,41,32,40,40,65,32,+58,49,51,49,56,32,40,40,40,67,39,32,66,41,32,95,57,48,55,41,+32,40,40,66,32,40,95,52,54,51,32,34,36,115,117,112,101,114,34,41,+41,32,40,95,49,53,57,48,32,95,50,56,51,41,41,41,41,32,40,40,+65,32,58,49,51,49,57,32,40,40,66,32,40,40,95,51,50,32,95,53,+56,41,32,40,95,54,52,32,95,49,49,53,50,41,41,41,32,40,40,66,+32,40,66,32,40,40,95,51,51,32,95,53,56,41,32,40,95,49,49,54,+49,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,95,51,50,32,95,53,56,41,41,32,40,40,66,32,40,66,32,40,40,+95,51,50,32,95,53,56,41,32,95,49,51,50,51,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,+95,54,52,32,95,49,49,53,50,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,40,40,66,32,40,67,39,32,40,95,51,51,+32,95,53,56,41,41,41,32,40,40,66,32,40,66,32,95,49,49,54,49,+41,41,32,40,67,32,95,52,54,51,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,51,50,48,32,40,40,67,32,40,+40,67,32,83,39,41,32,95,49,51,49,57,41,41,32,40,40,67,32,40,+95,51,50,32,95,53,56,41,41,32,40,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,95,49,51,50,51,41,41,32,40,40,66,32,40,66,32,+40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,53,+50,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,+51,50,32,95,53,56,41,41,32,40,40,66,32,95,49,51,48,54,41,32,+40,95,51,57,53,32,95,53,54,54,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,66,32,40,40,95,50,55,54,32,95,53,54,41,32,95,51,57,51,41,+41,32,40,40,95,52,51,32,95,53,56,41,32,95,49,51,50,50,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+80,41,41,32,95,52,54,51,41,41,41,41,41,41,41,41,41,32,40,40,+65,32,58,49,51,50,49,32,40,40,66,32,85,41,32,40,90,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,50,55,54,32,95,53,54,+41,41,32,40,95,52,51,50,32,95,50,56,49,41,41,41,32,40,40,66,+32,95,49,51,48,54,41,32,40,40,67,32,79,41,32,75,41,41,41,41,+41,41,32,40,40,65,32,58,49,51,50,50,32,40,40,66,32,40,40,95,+51,50,32,95,53,56,41,32,95,54,51,41,41,32,40,40,40,83,39,32,+40,83,39,32,40,95,51,50,32,95,53,56,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,53,49,32,95,53,56,41,41,32,+95,49,51,50,49,41,41,32,95,49,49,53,50,41,41,32,40,40,66,32,+40,66,32,85,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,+32,40,67,39,32,89,41,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,80,32,40,40,95,51,52,32,95,53,56,41,+32,95,52,54,49,41,41,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,95,53,+56,41,41,41,32,95,49,49,57,51,41,41,41,41,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,95,51,51,32,95,53,56,41,41,32,95,49,49,54,49,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,+50,32,95,53,56,41,32,95,49,51,50,51,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,53,50,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,+40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,32,95,51,57,+50,41,41,41,41,32,40,66,39,32,40,40,66,32,40,95,51,51,32,95,+53,56,41,41,32,95,54,50,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,41,32,95,+49,49,54,49,41,41,32,40,95,51,52,32,95,53,56,41,41,41,41,41,+41,41,41,41,32,95,49,49,53,51,41,41,41,41,41,32,40,40,65,32,+58,49,51,50,51,32,40,40,40,95,51,50,32,95,53,56,41,32,40,95,+54,52,32,95,49,49,53,50,41,41,32,40,40,67,32,40,40,83,32,95,+51,57,50,41,32,40,40,40,67,39,32,40,95,51,50,32,95,53,56,41,+41,32,40,40,95,52,51,32,95,53,56,41,32,40,85,32,40,40,66,32,+40,40,67,39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,+55,41,41,32,40,40,66,32,40,66,32,40,95,51,52,32,95,53,56,41,+41,41,32,80,41,41,41,41,41,32,40,40,66,32,40,40,95,51,50,32,+95,53,56,41,32,40,95,54,52,32,95,49,49,53,48,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,95,51,50,32,95,53,56,41,41,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+67,32,40,40,40,67,39,32,89,41,32,40,40,40,67,39,32,83,41,32,+40,40,40,67,39,32,40,83,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,+80,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+67,32,40,40,40,67,39,32,83,39,41,32,83,39,41,32,40,40,66,32,+40,66,32,40,95,51,52,32,95,53,56,41,41,41,32,80,41,41,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,83,32,66,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,39,41,+41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,+41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,+39,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,67,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,+32,40,67,39,32,40,83,39,32,66,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,83,39,32,67,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,95,56,48,50,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,83,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,67,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,83,39,41,32,40,40,67,+32,40,95,50,48,50,32,95,56,57,50,41,41,32,40,95,56,57,55,32,+95,49,49,49,50,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,+39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,67,39,32,66,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,40,66,32,67,41,32,40,67,32,95,57,50,+56,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,+67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,67,41,+41,32,40,67,32,95,52,54,50,41,41,41,41,41,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,85,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,+83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,+83,39,32,67,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,83,39,41,32,83,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,32,67,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,67,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,67,32,67,39,41,41,41,41,41,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,67,39,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,39,32,+40,83,39,32,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,+32,40,67,32,95,57,50,56,41,41,41,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,41,41,32,40,40,66,32,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,+66,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,66,32,67,41,+41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,32,40,40,66,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,+32,67,41,32,40,85,32,40,75,32,40,75,32,75,41,41,41,41,41,41,+41,41,41,41,41,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,40,90,32,75,41,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,75,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,+40,66,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,41,41,41,32,40,40,66,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,66,32,67,41,41,41,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,67,39,32,67,+41,41,32,40,85,32,40,75,32,40,75,32,65,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,90,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,41,32,40,40,66,32,40,95,52,51,32,95,53,+56,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,+50,32,95,53,56,41,41,32,40,40,67,32,95,49,50,48,54,41,32,34,+100,105,99,116,34,41,41,41,32,40,40,66,32,40,66,32,40,95,51,52,+32,95,53,56,41,41,41,32,40,67,32,80,41,41,41,41,41,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,83,41,41,41,32,40,40,40,67,39,32,67,39,41,32,67,39,+41,32,40,67,32,95,52,54,51,41,41,41,41,41,32,40,40,67,39,32,+40,67,39,32,95,52,54,50,41,41,32,40,40,40,67,39,32,66,41,32,+80,41,32,40,40,66,32,95,55,53,48,41,32,40,95,51,57,53,32,40,+40,95,50,54,51,32,95,55,52,51,41,32,95,53,54,53,41,41,41,41,+41,41,41,41,41,41,41,32,40,85,32,65,41,41,41,32,40,85,32,75,+41,41,41,41,32,95,49,49,51,49,41,41,32,40,95,56,48,53,32,95,+56,48,55,41,41,41,41,41,32,40,40,66,32,90,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,66,41,+41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,67,+39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,66,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,83,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,40,66,+32,40,67,39,32,40,95,50,54,49,32,95,49,51,50,53,41,41,41,32,+40,40,40,67,39,32,66,41,32,95,49,51,50,52,41,32,40,40,67,32,+95,49,49,51,49,41,32,65,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,67,39,32,66,41,41,32,95,52,54,50,41,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,67,32,66,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,67,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+40,67,39,32,67,39,41,32,67,39,41,41,41,41,41,41,41,32,40,40,+40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,67,41,41,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+83,32,95,51,57,50,41,41,41,41,41,41,41,41,32,40,40,66,32,40,+40,67,39,32,66,41,32,40,66,39,32,40,66,39,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,+41,32,40,40,67,32,95,49,50,48,54,41,32,34,100,105,99,116,34,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,+40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,67,39,41,32,67,39,41,41,32,40,40,67,39,32,40,+67,39,32,95,52,54,50,41,41,32,40,40,66,32,40,67,32,80,41,41,+32,95,49,50,52,53,41,41,41,41,41,41,41,32,40,40,67,39,32,40,+67,39,32,40,67,39,32,95,52,54,50,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,66,39,32,80,41,41,32,40,40,40,67,39,32,66,41,+32,95,55,52,52,41,32,95,55,52,51,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,+66,32,40,66,32,66,39,41,41,32,40,66,32,66,39,41,41,41,32,40,+40,67,39,32,40,67,39,32,95,52,54,50,41,41,32,80,41,41,41,41,+41,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,49,49,48,+48,41,41,32,40,40,66,32,40,95,52,54,51,32,34,77,117,108,116,105,+112,108,101,32,99,111,110,115,116,114,97,105,110,116,32,115,111,108,117,116,+105,111,110,115,32,102,111,114,58,32,34,41,41,32,95,56,52,50,41,41,+41,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,66,41,32,40,66,39,32,66,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,66,32,40,66,32,90,41,41,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,66,32,66,39,41,41,41,32,40,40,66,32,40,67,39,+32,95,52,54,50,41,41,32,40,67,32,80,41,41,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,+66,39,32,40,66,39,32,40,85,32,95,49,51,48,50,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,40,80,32,95,49,51,48,50,41,41,41,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,80,41,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,66,39,32,66,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,90,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,+32,40,66,32,40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,+95,49,49,53,49,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,39,32,40,83,+39,32,40,83,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,66,32,67,41,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,66,32,67,41,32,40,67,32,95,49,51,50,57,41,41,+41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,67,39,32,+66,41,41,32,95,52,54,50,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,66,32,40,66,32,40,66,32,85,41,41,41,41,41,41,+32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,40,66,39,+32,40,66,39,32,40,66,39,32,40,40,66,32,40,67,39,32,40,95,51,+50,32,95,53,56,41,41,41,32,40,40,66,32,40,95,52,51,32,95,53,+56,41,41,32,40,40,66,32,85,41,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,67,32,95,49,50,48,54,41,32,34,100,105,99,116,34,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,51,52,32,95,+53,56,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,67,+32,80,41,41,41,41,32,95,49,51,50,56,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,40,40,66,32,40,66,32,66,39,41,41,32,40,40,66,32,+40,66,32,66,39,41,41,32,40,40,66,32,40,66,32,40,66,32,67,41,+41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,40,67,32,95,+52,54,51,41,41,41,41,41,41,32,40,40,67,39,32,40,67,39,32,95,+52,54,50,41,41,32,80,41,41,41,41,41,41,41,41,41,32,40,75,32,+40,75,32,95,49,51,48,50,41,41,41,41,41,41,41,32,40,85,32,40,+75,32,40,90,32,75,41,41,41,41,41,32,40,85,32,40,90,32,40,90,+32,75,41,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,41,+32,95,52,54,49,41,41,32,95,52,54,49,41,41,32,40,85,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,53,56,41,+41,32,95,49,49,54,49,41,41,32,40,95,51,52,32,95,53,56,41,41,+41,41,41,41,41,41,32,40,40,95,51,52,32,95,53,56,41,32,95,52,+54,49,41,41,41,41,32,40,40,65,32,58,49,51,50,52,32,40,40,67,+39,32,95,51,57,52,41,32,40,40,66,32,85,41,32,40,40,66,32,40,+40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,+51,57,52,41,41,32,40,40,66,32,40,66,32,40,80,32,75,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,+40,40,66,32,40,66,32,40,40,83,39,32,80,41,32,95,52,49,49,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,+40,40,67,39,32,95,51,57,53,41,32,40,89,32,40,40,66,32,40,83,+32,83,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,+40,66,32,90,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,+32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,+41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,+67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,67,+32,40,40,83,32,73,41,32,75,41,41,41,41,32,40,40,40,83,39,32,+40,83,39,32,40,67,39,32,66,41,41,41,32,40,66,32,40,66,32,95,+55,52,52,41,41,41,32,73,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,95,49,51,48,50,41,41,41,32,+40,75,32,95,49,51,48,50,41,41,41,32,40,75,32,40,75,32,95,49,+51,48,50,41,41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,+41,41,41,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,+40,75,32,40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,41,32,+40,75,32,40,75,32,95,49,51,48,50,41,41,41,41,32,40,75,32,40,+75,32,95,49,51,48,50,41,41,41,41,32,40,40,66,32,40,40,67,39,+32,66,41,32,40,40,66,32,95,50,54,49,41,32,95,52,55,49,41,41,+41,32,40,67,32,40,95,52,51,54,32,95,50,56,49,41,41,41,41,41,+32,40,75,32,95,49,51,48,50,41,41,41,32,40,66,32,40,40,67,39,+32,66,41,32,95,55,54,48,41,41,41,41,41,41,41,41,41,41,41,32,+75,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,+32,40,67,32,40,40,89,32,40,40,40,67,39,32,40,83,39,32,67,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,39,41,32,83,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,+41,41,32,66,39,41,41,41,32,40,40,66,32,40,40,67,39,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,40,67,39,32,66,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,89,32,40,+40,66,32,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,32,+40,40,40,67,39,32,67,41,32,40,40,66,32,40,40,67,39,32,67,39,+41,32,83,39,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,40,67,39,32,83,39,41,32,67,39,41,41,32,40,40,+66,32,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,67,39,32,+67,41,32,40,95,50,48,50,32,95,56,57,50,41,41,41,41,32,95,52,+55,55,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,41,+41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,90,+32,75,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,75,41,41,32,75,41,41,32,40,+90,32,75,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,32,+83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,+39,41,32,40,85,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,40,67,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,85,32,+40,75,32,95,52,55,54,41,41,41,41,41,41,32,40,40,40,83,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,+40,66,32,40,67,39,32,66,41,41,41,41,32,40,40,67,32,40,67,39,+32,40,67,39,32,67,41,41,41,32,95,52,55,54,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,67,41,41,41,41,32,40,75,32,40,75,+32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,+54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,+95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,54,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,+40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,+55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,+32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,67,32,+40,95,52,51,54,32,95,50,56,49,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,95,52,55,55,41,41,41,32,40,40,67,39,32,40,67,+39,32,95,52,54,50,41,41,32,40,67,32,80,41,41,41,41,41,32,40,+40,66,32,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,+95,56,50,51,41,32,95,52,55,54,41,41,41,32,95,52,55,55,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,41,41,32,95,52,55,54,41,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,67,41,41,41,41,41,32,95,52,+55,55,41,41,32,95,52,54,49,41,41,41,32,75,41,41,41,41,41,32,+40,40,65,32,58,49,51,50,53,32,40,40,83,32,40,85,32,95,52,54,+49,41,41,32,40,90,32,40,90,32,40,40,40,83,39,32,95,51,57,52,+41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,40,67,32,40,+95,50,48,50,32,95,50,56,49,41,41,41,32,40,40,66,32,40,95,52,+48,49,32,95,50,56,50,41,41,32,40,95,51,57,53,32,95,53,54,53,+41,41,41,41,32,75,41,41,32,40,40,67,32,79,41,32,75,41,41,41,+41,32,73,41,41,41,41,41,32,40,40,65,32,58,49,51,50,54,32,40,+40,40,95,51,50,32,95,53,56,41,32,40,95,54,52,32,95,49,49,53,+50,41,41,32,40,40,80,32,40,40,95,51,52,32,95,53,56,41,32,95,+49,51,52,49,41,41,32,40,90,32,40,85,32,40,40,66,32,40,40,67,+39,32,40,95,51,50,32,95,53,56,41,41,32,95,49,49,57,55,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,+40,40,66,32,95,49,49,48,48,41,32,40,95,56,48,53,32,95,56,48,+55,41,41,41,41,32,40,40,66,32,40,95,52,54,51,32,34,67,97,110,+110,111,116,32,115,97,116,105,115,102,121,32,99,111,110,115,116,114,97,105,+110,116,58,32,34,41,41,32,95,56,51,56,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,51,50,55,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,95,51,50,32,95,53,56,41,41,32,40,+40,67,32,95,49,50,48,54,41,32,34,100,105,99,116,34,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,67,32,95,49,49,54,56,41,+41,41,41,32,95,49,51,50,56,41,41,41,32,40,40,65,32,58,49,51,+50,56,32,40,40,66,32,40,66,32,95,55,52,52,41,41,32,40,40,66,+32,95,55,52,52,41,32,40,40,66,32,95,55,52,51,41,32,40,40,67,+32,95,56,57,56,41,32,95,49,49,49,50,41,41,41,41,41,32,40,40,+65,32,58,49,51,50,57,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,66,32,40,40,83,39,32,83,41,32,95,56,50,51,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,83,39,32,83,41,41,32,40,40,67,39,32,40,67,39,32,40,95,+52,51,52,32,95,49,51,51,49,41,41,41,32,80,41,41,32,40,40,40,+67,39,32,67,41,32,80,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,+67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,+67,39,32,67,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,67,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,85,+32,40,75,32,95,52,55,54,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,+40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,32,+40,67,39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,67,41,+41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,85,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,66,32,95,52,55,55,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,80,32,40,95,55,+53,48,32,95,52,54,49,41,41,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,40,66,32,40,+66,32,79,41,41,32,80,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,79,41,41,32,80,41,32,75,41,41,41,41,41,41,32,40,75,32,40,+75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,+55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,+32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,95,52,55,+54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,+32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,+52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,+41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,+40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,+41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,+95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,+41,41,41,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,32,40,+75,32,40,75,32,40,75,32,95,52,55,54,41,41,41,41,41,32,40,75,+32,40,75,32,95,52,55,54,41,41,41,41,32,40,75,32,40,75,32,95,+52,55,54,41,41,41,41,32,40,75,32,95,52,55,54,41,41,41,32,40,+75,32,95,52,55,54,41,41,41,32,40,75,32,40,75,32,95,52,55,54,+41,41,41,41,41,41,32,40,95,52,55,55,32,40,40,80,32,40,95,55,+53,48,32,95,52,54,49,41,41,32,95,52,54,49,41,41,41,41,41,32,+40,95,52,55,55,32,40,40,80,32,40,95,55,53,48,32,95,52,54,49,+41,41,32,95,52,54,49,41,41,41,41,32,40,40,65,32,58,49,51,51,+48,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,40,83,39,32,40,83,39,32,+40,83,39,32,67,39,41,41,41,32,40,40,40,83,39,32,40,83,39,32,+66,41,41,32,40,40,66,32,40,66,32,95,49,50,48,41,41,32,95,56,+50,51,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,95,+49,50,48,41,41,41,32,40,40,66,32,40,66,32,40,95,52,51,52,32,+95,49,51,51,49,41,41,41,32,80,41,41,32,40,40,66,32,40,66,32,+40,95,52,51,52,32,95,49,51,51,49,41,41,41,32,40,67,32,80,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,40,+40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,52,54,50,41,41,+32,80,41,41,41,32,40,40,40,83,39,32,40,83,39,32,66,41,41,32,+40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,52,54,50,41,+41,32,40,67,32,80,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,40,83,39,32,95,52,54,51,41,41,41,41,32,40,40,+66,32,40,66,32,67,41,41,32,80,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,83,39,32,40,67,39,32,95,52,54,51,41,41,41,41,32,+40,40,66,32,40,66,32,67,41,41,32,40,67,32,80,41,41,41,32,73,+41,41,41,41,41,41,32,73,41,41,32,40,40,66,32,40,66,32,95,51,+57,52,41,41,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,67,+41,32,95,56,50,51,41,32,75,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,79,41,41,32,80,41,32,75,41,41,41,41,41,41,32,40,40,+65,32,58,49,51,51,49,32,40,40,67,32,66,41,32,40,40,40,67,39,+32,66,41,32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,+40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,95,49,50,49,41,+41,32,95,56,50,51,41,41,41,32,95,56,50,51,41,41,41,41,32,40,+40,65,32,58,49,51,51,50,32,80,41,32,40,40,65,32,58,49,51,51,+51,32,40,40,66,32,40,66,32,85,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,40,83,39,+32,66,41,32,40,40,66,32,67,41,32,40,95,52,51,54,32,95,56,57,+50,41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,67,41,41,32,+40,40,66,32,40,40,83,39,32,67,41,32,95,57,50,56,41,41,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,55,52,41,41,41,32,+40,40,66,32,40,66,32,40,95,52,54,51,32,34,117,110,100,101,102,105,+110,101,100,32,34,41,41,41,32,40,40,40,67,39,32,66,41,32,95,52,+54,51,41,32,40,40,66,32,40,95,52,54,51,32,34,58,32,34,41,41,+32,95,57,48,50,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+83,32,40,40,67,32,83,41,32,40,40,66,32,40,40,67,39,32,80,41,+32,95,49,55,53,41,41,32,40,90,32,75,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,95,50,54,49,32,95,49,55,52,41,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,95,52,54,51,32,+34,97,109,98,105,103,117,111,117,115,32,34,41,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,66,39,32,95,52,54,51,41,41,32,40,40,66,+32,40,66,32,40,95,52,54,51,32,34,58,32,34,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,95,52,54,51,41,32,95,57,48,+50,41,41,32,40,40,66,32,40,95,52,54,51,32,40,40,79,32,35,51,+50,41,32,75,41,41,41,32,40,40,66,32,40,95,49,54,48,52,32,40,+40,95,50,54,51,32,95,57,48,50,41,32,95,49,49,51,48,41,41,41,+32,40,95,51,57,52,32,40,85,32,40,90,32,40,40,67,32,79,41,32,+75,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,32,95,49,55,+53,41,41,41,32,40,40,65,32,58,49,51,51,52,32,40,40,40,67,39,+32,40,67,39,32,95,49,51,51,50,41,41,32,95,57,50,53,41,32,95,+52,54,49,41,41,32,40,40,65,32,58,49,51,51,53,32,40,40,40,67,+39,32,95,49,51,51,50,41,32,95,57,50,52,41,32,95,52,54,49,41,+41,32,40,40,65,32,58,49,51,51,54,32,40,85,32,40,75,32,40,95,+51,57,53,32,95,53,54,54,41,41,41,41,32,40,40,65,32,58,49,51,+51,55,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,66,41,32,95,49,51,51,50,41,41,41,32,40,40,+66,32,40,66,32,95,52,54,50,41,41,32,80,41,41,41,41,32,40,40,+65,32,58,49,51,51,56,32,40,40,66,32,40,66,32,85,41,41,32,40,+40,66,32,40,66,32,40,66,32,95,49,51,51,50,41,41,41,32,95,57,+50,57,41,41,41,32,40,40,65,32,58,49,51,51,57,32,95,49,50,53,+41,32,40,40,65,32,58,49,51,52,48,32,73,41,32,40,40,65,32,58,+49,51,52,49,32,73,41,32,40,40,65,32,58,49,51,52,50,32,43,41,+32,40,40,65,32,58,49,51,52,51,32,45,41,32,40,40,65,32,58,49,+51,52,52,32,42,41,32,40,40,65,32,58,49,51,52,53,32,113,117,111,+116,41,32,40,40,65,32,58,49,51,52,54,32,114,101,109,41,32,40,40,+65,32,58,49,51,52,55,32,115,117,98,116,114,97,99,116,41,32,40,40,+65,32,58,49,51,52,56,32,110,101,103,41,32,40,40,65,32,58,49,51,+52,57,32,102,97,100,100,41,32,40,40,65,32,58,49,51,53,48,32,102,+115,117,98,41,32,40,40,65,32,58,49,51,53,49,32,102,109,117,108,41,+32,40,40,65,32,58,49,51,53,50,32,102,100,105,118,41,32,40,40,65,+32,58,49,51,53,51,32,102,110,101,103,41,32,40,40,65,32,58,49,51,+53,52,32,102,101,113,41,32,40,40,65,32,58,49,51,53,53,32,102,110,+101,41,32,40,40,65,32,58,49,51,53,54,32,102,108,116,41,32,40,40,+65,32,58,49,51,53,55,32,102,108,101,41,32,40,40,65,32,58,49,51,+53,56,32,102,103,116,41,32,40,40,65,32,58,49,51,53,57,32,102,103,+101,41,32,40,40,65,32,58,49,51,54,48,32,102,115,104,111,119,41,32,+40,40,65,32,58,49,51,54,49,32,102,114,101,97,100,41,32,40,40,65,+32,58,49,51,54,50,32,105,116,111,102,41,32,40,40,65,32,58,49,51,+54,51,32,43,41,32,40,40,65,32,58,49,51,54,52,32,45,41,32,40,+40,65,32,58,49,51,54,53,32,42,41,32,40,40,65,32,58,49,51,54,+54,32,117,113,117,111,116,41,32,40,40,65,32,58,49,51,54,55,32,117,+114,101,109,41,32,40,40,65,32,58,49,51,54,56,32,97,110,100,41,32,+40,40,65,32,58,49,51,54,57,32,111,114,41,32,40,40,65,32,58,49,+51,55,48,32,120,111,114,41,32,40,40,65,32,58,49,51,55,49,32,115,+104,108,41,32,40,40,65,32,58,49,51,55,50,32,115,104,114,41,32,40,+40,65,32,58,49,51,55,51,32,97,115,104,114,41,32,40,40,65,32,58,+49,51,55,52,32,105,110,118,41,32,40,40,65,32,58,49,51,55,53,32,+116,111,68,98,108,41,32,40,40,65,32,58,49,51,55,54,32,116,111,73,+110,116,41,32,40,40,65,32,58,49,51,55,55,32,61,61,41,32,40,40,+65,32,58,49,51,55,56,32,47,61,41,32,40,40,65,32,58,49,51,55,+57,32,60,41,32,40,40,65,32,58,49,51,56,48,32,60,61,41,32,40,+40,65,32,58,49,51,56,49,32,62,41,32,40,40,65,32,58,49,51,56,+50,32,62,61,41,32,40,40,65,32,58,49,51,56,51,32,61,61,41,32,+40,40,65,32,58,49,51,56,52,32,47,61,41,32,40,40,65,32,58,49,+51,56,53,32,117,60,41,32,40,40,65,32,58,49,51,56,54,32,60,61,+41,32,40,40,65,32,58,49,51,56,55,32,62,41,32,40,40,65,32,58,+49,51,56,56,32,62,61,41,32,40,40,65,32,58,49,51,56,57,32,73,+41,32,40,40,65,32,58,49,51,57,48,32,73,41,32,40,40,65,32,58,+49,51,57,49,32,61,61,41,32,40,40,65,32,58,49,51,57,50,32,47,+61,41,32,40,40,65,32,58,49,51,57,51,32,60,41,32,40,40,65,32,+58,49,51,57,52,32,60,61,41,32,40,40,65,32,58,49,51,57,53,32,+62,41,32,40,40,65,32,58,49,51,57,54,32,62,61,41,32,40,40,65,+32,58,49,51,57,55,32,101,114,114,111,114,41,32,40,40,65,32,58,49,+51,57,56,32,89,41,32,40,40,65,32,58,49,51,57,57,32,115,101,113,+41,32,40,40,65,32,58,49,52,48,48,32,99,111,109,112,97,114,101,41,+32,40,40,65,32,58,49,52,48,49,32,101,113,117,97,108,41,32,40,40,+65,32,58,49,52,48,50,32,73,41,32,40,40,65,32,58,49,52,48,51,+32,73,41,32,40,40,65,32,58,49,52,48,52,32,73,41,32,40,40,65,+32,58,49,52,48,53,32,73,79,46,62,62,61,41,32,40,40,65,32,58,+49,52,48,54,32,73,79,46,62,62,41,32,40,40,65,32,58,49,52,48,+55,32,73,79,46,114,101,116,117,114,110,41,32,40,40,65,32,58,49,52,+48,56,32,73,79,46,103,101,116,65,114,103,115,41,32,40,40,65,32,58,+49,52,48,57,32,73,79,46,100,114,111,112,65,114,103,115,41,32,40,40,+65,32,58,49,52,49,48,32,73,79,46,112,101,114,102,111,114,109,73,79,+41,32,40,40,65,32,58,49,52,49,49,32,40,40,66,32,95,49,52,48,+54,41,32,95,49,52,48,57,41,41,32,40,40,65,32,58,49,52,49,50,+32,73,79,46,99,97,116,99,104,41,32,40,40,65,32,58,49,52,49,51,+32,40,114,110,102,32,35,48,41,41,32,40,40,65,32,58,49,52,49,52,+32,40,114,110,102,32,35,49,41,41,32,40,40,65,32,58,49,52,49,53,+32,110,101,119,67,65,83,116,114,105,110,103,41,32,40,40,65,32,58,49,+52,49,54,32,112,101,101,107,67,65,83,116,114,105,110,103,41,32,40,40,+65,32,58,49,52,49,55,32,116,111,80,116,114,41,32,40,40,65,32,58,+49,52,49,56,32,116,111,73,110,116,41,32,40,40,65,32,58,49,52,49,+57,32,94,103,101,116,82,97,119,41,32,40,40,65,32,58,49,52,50,48,+32,40,75,32,40,40,40,95,51,50,32,95,49,52,53,50,41,32,40,40,+40,95,49,52,50,51,32,40,40,80,32,95,52,54,49,41,32,95,52,54,+49,41,41,32,75,41,32,75,41,41,32,40,85,32,40,75,32,40,95,51,+52,32,95,49,52,53,50,41,41,41,41,41,41,32,40,40,65,32,58,49,+52,50,49,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,+50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,49,52,54,51,41,+32,95,49,52,52,54,41,41,41,32,40,40,66,32,40,66,32,40,40,67,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,80,32,40,+40,95,51,52,32,95,49,52,53,50,41,32,95,52,54,49,41,41,32,40,+40,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,+52,55,54,41,32,40,40,66,32,40,40,40,83,39,32,95,49,52,56,49,+41,32,95,52,49,49,41,32,40,95,51,52,32,95,49,52,53,50,41,41,+41,32,95,49,54,48,54,41,41,41,41,41,41,32,40,40,66,32,40,40,+67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,+41,41,32,95,49,52,55,48,41,41,41,32,40,40,66,32,40,40,67,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,40,40,+40,67,39,32,95,49,52,50,51,41,32,40,40,40,67,39,32,80,41,32,+95,52,50,51,41,32,95,52,54,49,41,41,32,75,41,41,32,75,41,41,+41,32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,67,39,32,66,+41,41,32,40,40,66,32,40,66,32,40,95,51,51,32,95,49,52,53,50,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,50,54,+49,41,32,95,49,52,55,52,41,41,32,95,49,54,48,55,41,41,41,32,+40,95,51,52,32,95,49,52,53,50,41,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,52,50,50,32,40,40,40,95,51,50,32,95,49,52,53,+50,41,32,95,49,52,49,57,41,32,40,40,40,83,39,32,40,95,51,51,+32,95,49,52,53,50,41,41,32,40,40,40,67,39,32,95,50,54,49,41,+32,40,40,66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,+67,32,40,95,52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,41,+32,40,95,50,52,32,34,103,101,116,82,97,119,32,102,97,105,108,101,100,+34,41,41,41,32,40,95,51,52,32,95,49,52,53,50,41,41,41,41,32,+40,40,65,32,58,49,52,50,51,32,40,40,66,32,89,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,49,52,53,+50,41,32,40,95,49,52,54,48,32,95,49,52,53,55,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,50,+32,95,49,52,53,50,41,32,95,49,52,50,50,41,41,41,41,41,32,40,+40,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,+32,40,67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,83,+39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,40,+67,39,32,67,41,41,41,41,41,41,41,41,32,40,40,66,32,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,+39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,67,41,41,41,41,41,41,41,41,32,40,40,40,67,+39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,83,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,+32,40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,40,67,39,32,+40,83,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,40,83,39,32,67,41,41,41,41,41,41,41,41,41,41,41,+41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,+66,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,32,35,52,41,+41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,67,32,61,+61,41,32,35,50,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,+32,83,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,67,32,61,61,41,32,35,54,41,41,41,41,41,41,41,41,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,40,83,39,32,67,+41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,67,32,61,61,41,32,35,49,41,41,41,+41,41,41,41,41,41,41,41,41,41,32,40,40,40,83,39,32,40,83,39,+32,40,83,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,40,83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,+32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,+32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,+32,35,53,41,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,67,39,41,32,40,+40,67,32,61,61,41,32,35,56,41,41,41,41,41,41,41,41,41,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,40,66,39,32,40,66,39,32,40,66,39,32,40,66,39,32,40,66,39,+32,40,66,39,32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,+32,35,49,50,55,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,61,41,32,+35,49,51,41,41,41,41,41,41,41,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,66,+39,32,40,66,39,32,40,66,39,32,40,40,66,32,67,39,41,32,40,40,+66,32,67,39,41,32,40,40,67,32,61,61,41,32,35,49,48,41,41,41,+41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,+83,39,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,+61,41,32,35,49,52,41,41,41,41,41,41,41,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,83,39,41,32,+40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,+67,39,41,32,40,40,67,32,61,61,41,32,35,49,53,41,41,41,41,41,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,+66,39,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,+61,41,32,35,50,49,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,66,32,67,+39,41,32,40,40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,+40,66,32,67,39,41,32,40,40,66,32,67,39,41,32,40,40,67,32,61,+61,41,32,35,49,49,41,41,41,41,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,66,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,66,+39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,66,+39,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,67,39,32,66,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,67,32,+61,61,41,32,35,50,55,41,41,41,41,41,41,32,40,40,66,32,40,66,+32,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,40,+83,39,32,95,49,50,49,41,32,40,40,67,32,40,95,53,48,48,32,95,+50,56,50,41,41,32,35,51,50,41,41,32,40,40,67,32,40,95,52,57,+55,32,95,50,56,50,41,41,32,35,49,50,55,41,41,41,41,41,41,32,+40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,67,39,32,40,40,83,39,32,40,95,+51,51,32,95,49,52,53,50,41,41,32,95,49,52,54,53,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,66,39,+32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,+52,55,48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,+32,40,67,39,32,66,41,41,32,40,40,66,32,40,66,32,40,95,51,51,+32,95,49,52,53,50,41,41,41,32,40,40,66,32,85,41,32,95,52,49,+49,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,67,39,41,32,+40,67,32,95,52,54,50,41,41,41,41,41,41,32,95,49,51,54,41,41,+41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,+66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,49,52,50,50,+41,41,41,41,41,41,32,40,40,40,83,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,66,32,40,67,32,40,40,67,32,40,+95,50,48,51,32,95,50,56,49,41,41,32,40,95,49,51,55,32,35,57,+49,41,41,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,66,32,40,40,95,51,50,32,95,49,52,53,50,41,32,95,+49,52,50,50,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,41,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,83,32,40,40,67,+32,61,61,41,32,35,54,53,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,40,83,32,40,40,67,32,61,61,41,32,35,54,54,41,41,41,41,41,+32,40,40,66,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,+40,83,32,40,40,67,32,61,61,41,32,35,54,55,41,41,41,41,32,40,+40,66,32,67,41,32,40,67,32,40,40,67,32,61,61,41,32,35,54,56,+41,41,41,41,41,41,41,41,41,41,32,95,49,51,54,41,41,41,41,32,+73,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,+95,51,51,32,95,49,52,53,50,41,41,32,95,49,52,55,48,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,40,95,51,51,32,95,49,+52,53,50,41,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,55,+48,41,41,32,40,40,66,32,40,95,50,54,49,32,95,51,57,51,41,41,+32,40,40,40,67,39,32,95,52,52,54,41,32,95,52,49,49,41,32,34,+92,56,38,32,92,56,38,34,41,41,41,41,41,41,32,40,82,32,75,41,+41,41,41,41,41,32,40,40,66,32,40,67,32,40,95,51,51,32,95,49,+52,53,50,41,41,41,32,40,40,80,32,75,41,32,75,41,41,41,41,41,+32,73,41,41,41,32,73,41,41,41,41,32,73,41,41,41,41,32,73,41,+41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,40,95,51,51,32,+95,49,52,53,50,41,41,32,95,49,52,55,48,41,41,41,32,40,40,67,+32,40,40,40,67,39,32,67,39,41,32,67,39,41,32,40,40,67,39,32,+95,52,54,51,41,32,95,52,50,51,41,41,41,32,75,41,41,41,41,41,+32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,67,39,+32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,66,32,85,+41,32,95,52,49,49,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,40,85,32,75,41,41,41,32,40,40,66,32,95,52,54,51,+41,32,95,52,50,51,41,41,41,41,41,41,32,73,41,41,41,32,73,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,66,41,41,+41,32,40,40,66,32,40,40,83,39,32,40,83,39,32,67,39,41,41,32,+40,40,66,32,40,66,32,67,39,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,95,49,50,49,41,32,95,51,57,50,41,41,32,95,51,+57,50,41,41,41,41,32,40,40,66,32,40,66,32,40,67,32,40,67,39,+32,66,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,40,66,32,40,40,83,39,32,40,95,51,51,32,95,49,+52,53,50,41,41,32,95,49,52,55,48,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,49,52,53,50,+41,32,40,95,49,52,54,53,32,35,51,50,41,41,41,41,41,41,32,40,+66,32,40,40,67,39,32,40,83,39,32,40,95,51,51,32,95,49,52,53,+50,41,41,41,32,40,40,67,32,66,41,32,40,40,40,67,39,32,40,95,+52,55,57,32,95,50,55,55,41,41,32,95,52,49,49,41,32,35,49,41,+41,41,41,41,41,41,41,41,41,32,40,85,32,95,52,55,54,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,66,+39,32,40,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,32,40,+85,32,35,49,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,66,39,32,67,41,41,32,40,67,32,95,52,54,50,41,41,41,41,41,+41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,67,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,+32,40,40,83,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,+52,53,50,41,41,32,40,85,32,35,49,41,41,41,41,41,32,40,40,66,+32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,40,95,51,+51,32,95,49,52,53,50,41,41,32,95,49,52,55,48,41,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,66,32,40,40,95,51,51,32,95,+49,52,53,50,41,32,40,95,49,52,54,53,32,35,51,50,41,41,41,41,+41,41,32,40,40,66,32,40,40,83,39,32,40,67,39,32,66,41,41,32,+40,40,66,32,40,66,32,40,95,51,51,32,95,49,52,53,50,41,41,41,+32,40,40,66,32,85,41,32,40,40,40,67,39,32,40,95,52,55,57,32,+95,50,55,55,41,41,32,95,52,49,49,41,32,35,49,41,41,41,41,41,+32,67,41,41,41,41,41,41,41,41,32,40,40,66,32,95,49,52,55,48,+41,32,40,40,67,32,95,52,52,54,41,32,35,56,41,41,41,41,32,40,+40,66,32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,95,52,55,+55,41,41,32,40,40,66,32,95,52,54,51,41,32,95,52,50,51,41,41,+41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,+40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,40,40,67,32,40,+40,40,67,39,32,67,39,41,32,40,40,66,32,83,39,41,32,67,39,41,+41,32,40,40,66,32,40,66,32,80,41,41,32,40,67,32,95,52,54,50,+41,41,41,41,32,73,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,66,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,66,41,41,32,85,41,41,32,40,40,67,32,40,40,40,67,39,32,67,+39,41,32,40,40,66,32,83,39,41,32,67,39,41,41,32,40,40,66,32,+40,66,32,40,67,32,80,41,41,41,32,40,67,32,95,52,54,50,41,41,+41,41,32,73,41,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,+66,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,66,+32,40,40,83,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,+49,52,55,48,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,+32,95,49,52,50,51,41,32,95,52,50,51,41,41,32,75,41,41,41,41,+41,32,40,40,66,32,40,40,83,39,32,40,95,51,51,32,95,49,52,53,+50,41,41,32,95,49,52,55,48,41,41,32,40,40,66,32,40,66,32,40,+95,50,54,49,32,95,49,52,55,48,41,41,41,32,40,40,66,32,40,66,+32,40,95,50,54,49,32,95,51,57,51,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,95,52,52,54,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,95,52,55,57,32,95,50,55,55,41,41,32,95,52,+49,49,41,41,32,95,52,49,49,41,41,32,34,92,56,38,32,92,56,38,+34,41,41,41,41,41,41,32,40,40,66,32,40,66,32,82,41,41,32,40,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,40,95,+51,51,32,95,49,52,53,50,41,41,32,95,49,52,54,53,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,66,41,32,40,67,32,95,52,54,50,+41,41,41,41,41,41,32,73,41,41,32,40,40,66,32,40,66,32,40,40,+95,51,51,32,95,49,52,53,50,41,32,40,95,49,52,54,53,32,35,49,+48,41,41,41,41,32,40,40,66,32,40,66,32,40,40,95,51,51,32,95,+49,52,53,50,41,32,40,95,49,52,54,48,32,95,49,52,53,55,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,66,32,40,95,51,52,32,+95,49,52,53,50,41,41,41,32,40,40,40,83,39,32,40,67,39,32,80,+41,41,32,40,40,66,32,40,83,32,95,52,54,51,41,41,32,40,40,40,+67,39,32,66,41,32,40,85,32,95,52,54,49,41,41,32,40,40,66,32,+40,83,32,40,85,32,95,52,54,49,41,41,41,32,40,40,66,32,90,41,+32,40,40,66,32,90,41,32,40,40,40,67,39,32,67,41,32,40,40,67,+32,40,40,40,83,39,32,83,39,41,32,40,40,66,32,95,49,50,49,41,+32,40,40,66,32,95,49,50,50,41,32,95,51,57,50,41,41,41,32,40,+40,66,32,40,67,32,40,95,50,48,50,32,95,49,51,51,41,41,41,32,+95,52,53,53,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,32,+95,52,54,49,41,41,41,41,41,41,41,32,73,41,41,41,32,40,40,40,+83,39,32,95,52,54,51,41,32,40,40,66,32,95,52,50,51,41,32,95,+53,54,53,41,41,32,95,53,54,54,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,52,50,52,32,94,117,110,108,105,110,107,41,32,40,+40,65,32,58,49,52,50,53,32,40,40,40,67,39,32,40,95,51,50,32,+95,49,52,53,50,41,41,32,40,40,67,32,95,53,57,49,41,32,95,49,+52,50,52,41,41,32,40,40,40,67,39,32,95,50,54,49,41,32,40,40,+66,32,40,95,52,53,32,95,49,52,53,50,41,41,32,40,40,67,32,40,+95,50,48,51,32,95,50,56,49,41,41,32,35,48,41,41,41,32,40,95,+50,52,32,34,114,101,109,111,118,101,70,105,108,101,32,102,97,105,108,101,+100,34,41,41,41,41,32,40,40,65,32,58,49,52,50,54,32,95,49,52,+48,56,41,32,40,40,65,32,58,49,52,50,55,32,95,49,52,49,49,41,+32,40,40,65,32,58,49,52,50,56,32,94,103,101,116,101,110,118,41,32,+40,40,65,32,58,49,52,50,57,32,40,40,40,67,39,32,40,95,51,50,+32,95,49,52,53,50,41,41,32,40,40,67,32,95,53,57,49,41,32,95,+49,52,50,56,41,41,32,40,40,67,32,40,40,83,32,40,40,67,32,40,+95,50,48,50,32,95,53,57,55,41,41,32,95,53,57,57,41,41,32,40,+40,66,32,40,40,95,50,55,54,32,95,49,52,53,48,41,32,95,52,55,+55,41,41,32,95,53,57,50,41,41,41,32,40,40,95,51,52,32,95,49,+52,53,50,41,32,95,52,55,54,41,41,41,41,32,40,40,65,32,58,49,+52,51,48,32,73,41,32,40,40,65,32,58,49,52,51,49,32,73,79,46,+115,101,114,105,97,108,105,122,101,41,32,40,40,65,32,58,49,52,51,50,+32,73,79,46,112,114,105,110,116,41,32,40,40,65,32,58,49,52,51,51,+32,73,79,46,100,101,115,101,114,105,97,108,105,122,101,41,32,40,40,65,+32,58,49,52,51,52,32,73,79,46,115,116,100,105,110,41,32,40,40,65,+32,58,49,52,51,53,32,73,79,46,115,116,100,111,117,116,41,32,40,40,+65,32,58,49,52,51,54,32,73,79,46,115,116,100,101,114,114,41,32,40,+40,65,32,58,49,52,51,55,32,94,102,111,112,101,110,41,32,40,40,65,+32,58,49,52,51,56,32,94,102,99,108,111,115,101,41,32,40,40,65,32,+58,49,52,51,57,32,94,102,102,108,117,115,104,41,32,40,40,65,32,58,+49,52,52,48,32,94,102,103,101,116,99,41,32,40,40,65,32,58,49,52,+52,49,32,94,102,112,117,116,99,41,32,40,40,65,32,58,49,52,52,50,+32,94,103,101,116,84,105,109,101,77,105,108,108,105,41,32,40,40,65,32,+58,49,52,52,51,32,40,40,95,50,48,49,32,40,95,50,48,50,32,95,+53,57,55,41,41,32,40,95,50,48,53,32,95,49,52,52,51,41,41,41,+32,40,40,65,32,58,49,52,52,52,32,40,40,40,95,49,53,56,56,32,+40,95,49,53,57,50,32,95,49,52,52,52,41,41,32,40,40,66,32,40,+95,52,54,51,32,34,72,97,110,100,108,101,45,34,41,41,32,40,95,49,+53,57,48,32,95,53,57,56,41,41,41,32,40,95,49,53,57,52,32,95,+49,52,52,52,41,41,41,32,40,40,65,32,58,49,52,52,53,32,40,95,+49,52,51,48,32,95,53,57,57,41,41,32,40,40,65,32,58,49,52,52,+54,32,40,90,32,40,90,32,75,41,41,41,32,40,40,65,32,58,49,52,+52,55,32,40,75,32,40,90,32,75,41,41,41,32,40,40,65,32,58,49,+52,52,56,32,40,75,32,40,75,32,75,41,41,41,32,40,40,65,32,58,+49,52,52,57,32,40,75,32,40,75,32,65,41,41,41,32,40,40,65,32,+58,49,52,53,48,32,40,40,95,50,55,49,32,40,40,66,32,40,67,32,+95,49,52,48,53,41,41,32,40,66,32,95,49,52,48,55,41,41,41,32,+40,95,50,55,53,32,95,49,52,53,48,41,41,41,32,40,40,65,32,58,+49,52,53,49,32,40,40,40,40,40,95,49,49,32,95,49,52,53,48,41,+32,95,49,52,48,55,41,32,40,95,51,56,32,95,49,52,53,50,41,41,+32,40,95,49,57,32,95,49,52,53,49,41,41,32,40,95,50,48,32,95,+49,52,53,49,41,41,41,32,40,40,65,32,58,49,52,53,50,32,40,40,+40,40,95,51,48,32,95,49,52,53,49,41,32,95,49,52,48,53,41,32,+95,49,52,48,54,41,32,95,49,52,48,55,41,41,32,40,40,65,32,58,+49,52,53,51,32,40,40,95,51,57,32,95,49,52,53,50,41,32,95,50,+52,41,41,32,40,40,65,32,58,49,52,53,52,32,95,49,52,51,49,41,+32,40,40,65,32,58,49,52,53,53,32,95,49,52,51,51,41,32,40,40,+65,32,58,49,52,53,54,32,95,49,52,51,52,41,32,40,40,65,32,58,+49,52,53,55,32,95,49,52,51,53,41,32,40,40,65,32,58,49,52,53,+56,32,95,49,52,51,54,41,32,40,40,65,32,58,49,52,53,57,32,40,+40,40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,+52,51,56,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,+51,52,49,41,41,41,32,40,40,65,32,58,49,52,54,48,32,40,40,40,+67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,52,51,+57,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,95,49,51,52,+49,41,41,41,32,40,40,65,32,58,49,52,54,49,32,40,40,40,67,39,+32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,52,52,48,41,+32,40,40,67,32,40,40,83,32,40,40,67,32,40,95,50,48,50,32,95,+50,56,49,41,41,32,35,45,49,41,41,32,40,40,66,32,40,95,51,52,+32,95,49,52,53,50,41,41,32,95,49,51,54,41,41,41,32,40,95,50,+52,32,34,104,71,101,116,67,104,97,114,58,32,69,79,70,34,41,41,41,+41,32,40,40,65,32,58,49,52,54,50,32,40,40,40,67,39,32,40,67,+39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,32,40,40,67,39,+32,95,49,52,52,49,41,32,95,49,51,55,41,41,32,40,40,95,51,52,+32,95,49,52,53,50,41,32,95,49,51,52,49,41,41,41,32,40,40,65,+32,58,49,52,54,51,32,40,40,40,67,39,32,40,67,39,32,40,95,51,+50,32,95,49,52,53,50,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,95,50,54,49,41,32,95,53,57,49,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,66,32,95,50,54,49,41,32,40,40,66,32,+95,53,57,49,41,32,40,40,67,32,40,40,67,32,40,40,80,32,40,40,+79,32,35,49,49,52,41,32,75,41,41,32,40,40,79,32,35,49,49,57,+41,32,75,41,41,41,32,40,40,79,32,35,57,55,41,32,75,41,41,41,+32,34,119,43,34,41,41,41,41,32,95,49,52,51,55,41,41,41,32,40,+40,67,32,40,40,83,32,40,40,67,32,40,95,50,48,50,32,95,49,52,+52,51,41,41,32,95,49,52,52,53,41,41,32,40,40,66,32,40,95,51,+52,32,95,49,52,53,50,41,41,32,95,52,55,55,41,41,41,32,40,40,+95,51,52,32,95,49,52,53,50,41,32,95,52,55,54,41,41,41,41,32,+40,40,65,32,58,49,52,54,52,32,40,40,40,83,39,32,40,67,39,32,+40,95,51,50,32,95,49,52,53,50,41,41,41,32,95,49,52,54,51,41,+32,40,40,40,67,39,32,80,41,32,40,40,66,32,95,50,52,41,32,40,+95,52,54,51,32,34,111,112,101,110,70,105,108,101,58,32,99,97,110,110,+111,116,32,111,112,101,110,32,34,41,41,41,32,40,95,51,52,32,95,49,+52,53,50,41,41,41,41,32,40,40,65,32,58,49,52,54,53,32,40,95,+49,52,54,50,32,95,49,52,53,55,41,41,32,40,40,65,32,58,49,52,+54,54,32,40,95,49,52,54,49,32,95,49,52,53,54,41,41,32,40,40,+65,32,58,49,52,54,55,32,40,40,40,83,39,32,95,49,52,56,49,41,+32,95,49,52,49,52,41,32,40,95,49,52,51,50,32,95,49,52,53,55,+41,41,41,32,40,40,65,32,58,49,52,54,56,32,40,95,49,52,51,50,+32,95,49,52,53,55,41,41,32,40,40,65,32,58,49,52,54,57,32,40,+40,66,32,40,66,32,95,49,52,55,50,41,41,32,95,49,53,57,48,41,+41,32,40,40,65,32,58,49,52,55,48,32,40,95,49,52,55,49,32,95,+49,52,53,55,41,41,32,40,40,65,32,58,49,52,55,49,32,40,40,66,+32,40,95,52,52,32,95,49,52,53,50,41,41,32,95,49,52,54,50,41,+41,32,40,40,65,32,58,49,52,55,50,32,40,95,49,52,55,51,32,95,+49,52,53,55,41,41,32,40,40,65,32,58,49,52,55,51,32,40,40,40,+83,39,32,40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,41,+32,95,49,52,55,49,41,32,40,40,67,32,95,49,52,54,50,41,32,35,+49,48,41,41,41,32,40,40,65,32,58,49,52,55,52,32,40,40,40,67,+39,32,66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,53,50,41,+41,32,40,40,67,32,95,49,52,54,52,41,32,95,49,52,52,55,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,95,51,51,32,95,49,52,+53,50,41,41,41,32,40,67,32,95,49,52,55,49,41,41,32,95,49,52,+53,57,41,41,41,32,40,40,65,32,58,49,52,55,53,32,40,40,40,67,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,+49,52,54,52,41,32,95,49,52,52,54,41,41,32,40,40,40,67,39,32,+40,95,51,50,32,95,49,52,53,50,41,41,32,95,49,52,55,54,41,32,+40,95,51,52,32,95,49,52,53,50,41,41,41,41,32,40,40,65,32,58,+49,52,55,54,32,40,40,40,83,39,32,40,95,51,50,32,95,49,52,53,+50,41,41,32,95,49,52,52,48,41,32,40,40,40,83,39,32,67,41,32,+40,40,66,32,40,83,32,40,40,67,32,40,95,50,48,50,32,95,50,56,+49,41,41,32,35,45,49,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,66,+32,95,49,52,56,48,41,32,95,49,52,55,54,41,41,41,32,40,40,66,+32,40,66,32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,40,40,+66,32,95,52,54,50,41,32,95,49,51,54,41,41,41,41,41,32,40,40,+40,67,39,32,40,95,51,51,32,95,49,52,53,50,41,41,32,95,49,52,+53,57,41,32,40,40,95,51,52,32,95,49,52,53,50,41,32,75,41,41,+41,41,41,32,40,40,65,32,58,49,52,55,55,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,95,51,50,32,95,49,52,53,50,41,41,32,+40,40,67,32,95,49,52,54,52,41,32,95,49,52,52,55,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,95,51,51,32,95,49,52,53,50,+41,41,41,32,40,67,32,95,49,52,53,52,41,41,32,95,49,52,53,57,+41,41,41,32,40,40,65,32,58,49,52,55,56,32,40,40,40,67,39,32,+40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,49,52,+54,52,41,32,95,49,52,52,54,41,41,32,40,40,40,83,39,32,40,95,+51,50,32,95,49,52,53,50,41,41,32,95,49,52,53,53,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,32,95,49,52,53,+50,41,41,32,95,49,52,53,57,41,41,32,40,95,51,52,32,95,49,52,+53,50,41,41,41,41,41,32,40,40,65,32,58,49,52,55,57,32,95,49,+52,52,50,41,32,40,40,65,32,58,49,52,56,48,32,40,40,66,32,40,+95,51,52,32,95,49,52,53,50,41,41,32,95,49,52,49,48,41,41,32,+40,40,65,32,58,49,52,56,49,32,95,49,51,57,57,41,32,40,40,65,+32,58,49,52,56,50,32,40,75,32,40,75,32,40,40,95,51,52,32,95,+49,52,53,50,41,32,95,49,51,52,49,41,41,41,41,32,40,40,65,32,+58,49,52,56,51,32,94,116,109,112,110,97,109,101,41,32,40,40,65,32,+58,49,52,56,52,32,40,40,66,32,40,40,40,67,39,32,40,95,51,50,+32,95,49,52,53,50,41,41,32,40,40,40,83,39,32,95,50,54,49,41,+32,40,40,66,32,95,53,57,49,41,32,40,85,32,75,41,41,41,32,40,+40,40,67,39,32,95,50,54,51,41,32,40,40,66,32,95,53,57,49,41,+32,40,85,32,65,41,41,41,32,95,49,52,56,51,41,41,41,32,40,40,+40,83,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,95,53,57,+50,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,95,51,51,+32,95,49,52,53,50,41,41,32,95,53,57,52,41,41,32,40,40,40,83,+39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,67,32,95,+49,52,54,52,41,32,95,49,52,52,55,41,41,32,40,40,66,32,40,66,+32,40,95,51,52,32,95,49,52,53,50,41,41,41,32,80,41,41,41,41,+41,41,32,40,40,40,83,39,32,40,95,52,50,54,32,40,40,67,32,40,+95,50,48,51,32,95,49,51,49,41,41,32,35,52,54,41,41,41,32,95,+52,50,51,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,80,41,+32,40,40,67,32,80,41,32,75,41,41,41,32,40,90,32,40,40,66,32,+40,40,67,39,32,80,41,32,95,52,50,51,41,41,32,40,40,66,32,40,+95,52,54,50,32,35,52,54,41,41,32,95,52,50,51,41,41,41,41,41,+41,41,32,40,40,65,32,58,49,52,56,53,32,85,41,32,40,40,65,32,+58,49,52,56,54,32,40,85,32,73,41,41,32,40,40,65,32,58,49,52,+56,55,32,40,75,32,40,110,111,68,101,102,97,117,108,116,32,34,80,114,+105,110,116,79,114,82,117,110,46,112,114,105,110,116,79,114,82,117,110,34,+41,41,41,32,40,40,65,32,58,49,52,56,56,32,40,95,49,52,56,53,+32,73,41,41,32,40,40,65,32,58,49,52,56,57,32,40,40,66,32,95,+49,52,56,53,41,32,40,40,66,32,40,66,32,95,49,52,55,50,41,41,+32,95,49,53,57,48,41,41,41,32,40,40,65,32,58,49,52,57,48,32,+94,115,121,115,116,101,109,41,32,40,40,65,32,58,49,52,57,49,32,40,+40,40,67,39,32,40,95,51,50,32,95,49,52,53,50,41,41,32,40,40,+67,32,95,53,57,49,41,32,95,49,52,57,48,41,41,32,40,40,40,83,+39,32,95,50,54,49,41,32,40,40,66,32,40,95,52,53,32,95,49,52,+53,50,41,41,32,40,40,67,32,40,95,50,48,51,32,95,50,56,49,41,+41,32,35,48,41,41,41,32,40,40,66,32,40,95,50,54,49,32,95,50,+52,41,41,32,40,40,66,32,40,95,52,54,51,32,34,99,97,108,108,67,+111,109,109,97,110,100,58,32,102,97,105,108,101,100,32,34,41,41,32,40,+95,49,53,57,48,32,95,50,56,51,41,41,41,41,41,41,32,40,40,65,+32,58,49,52,57,50,32,40,40,66,32,40,66,32,67,41,41,32,80,41,+41,32,40,40,65,32,58,49,52,57,51,32,35,49,48,48,48,48,48,48,+48,48,48,41,32,40,40,65,32,58,49,52,57,52,32,40,40,40,95,49,+52,57,50,32,95,49,52,57,51,41,32,95,52,54,49,41,32,95,52,54,+49,41,41,32,40,40,65,32,58,49,52,57,53,32,40,40,83,32,66,41,+32,40,40,66,32,40,40,83,39,32,66,41,32,40,66,39,32,66,41,41,+41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,66,32,90,41,+41,41,41,41,32,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,+39,32,67,41,41,41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,83,39,32,67,39,41,41,32,40,95,52,+57,55,32,95,50,56,50,41,41,41,41,41,32,40,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,40,40,83,39,32,66,41,32,+40,66,39,32,40,40,66,32,40,67,39,32,67,39,41,41,32,40,67,32,+40,95,52,57,55,32,95,50,56,50,41,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,66,41,41,32,40,40,66,32,66,39,41,32,95,49,+52,57,50,41,41,32,95,52,54,51,41,41,41,41,41,41,41,41,41,32,+40,40,65,32,58,49,52,57,54,32,40,95,52,48,48,32,95,49,52,57,+53,41,41,32,40,40,65,32,58,49,52,57,55,32,80,41,32,40,40,65,+32,58,49,52,57,56,32,85,41,32,40,40,65,32,58,49,52,57,57,32,+40,85,32,73,41,41,32,40,40,65,32,58,49,53,48,48,32,40,40,95,+50,55,49,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,+57,56,41,41,41,32,40,40,66,32,40,40,67,39,32,67,41,32,95,49,+52,57,57,41,41,32,40,40,66,32,40,66,32,95,49,52,57,55,41,41,+32,40,40,66,32,95,51,57,52,41,32,40,40,66,32,85,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,32,40,66,32,+80,41,41,32,75,41,41,41,41,41,41,41,32,40,95,50,55,53,32,95,+49,53,48,48,41,41,41,32,40,40,65,32,58,49,53,48,49,32,40,40,+40,40,40,95,49,49,32,95,49,53,48,48,41,32,40,40,66,32,40,95,+50,54,49,32,95,49,52,57,56,41,41,32,40,40,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,80,41,32,75,41,41,32,95,49,52,57,52,41,41,41,32,+40,95,51,56,32,95,49,53,48,50,41,41,32,40,40,40,67,39,32,66,+41,32,40,95,51,50,32,95,49,53,48,50,41,41,32,75,41,41,32,40,+95,50,48,32,95,49,53,48,49,41,41,41,32,40,40,65,32,58,49,53,+48,50,32,40,40,40,40,95,51,48,32,95,49,53,48,49,41,32,40,40,+66,32,40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,95,49,52,57,+57,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,+66,32,40,66,32,95,52,49,52,41,41,32,40,40,66,32,40,66,32,40,+95,51,57,52,32,40,40,40,67,39,32,79,41,32,40,40,40,83,39,32,+80,41,32,40,85,32,75,41,41,32,40,85,32,65,41,41,41,32,75,41,+41,41,41,32,40,40,66,32,95,51,57,52,41,32,40,40,40,67,39,32,+40,67,39,32,79,41,41,32,40,40,40,67,39,32,40,83,39,32,95,49,+52,57,57,41,41,32,40,40,67,32,66,41,32,40,85,32,75,41,41,41,+32,40,85,32,65,41,41,41,32,75,41,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,40,40,66,32,95,49,52,57,55,41,32,95,+51,57,51,41,41,41,32,40,40,66,32,40,66,32,95,49,52,57,54,41,+41,32,95,52,54,50,41,41,41,41,41,41,32,40,95,51,54,32,95,49,+53,48,50,41,41,32,40,95,49,51,32,95,49,53,48,49,41,41,41,32,+40,40,65,32,58,49,53,48,51,32,40,40,95,51,57,32,95,49,53,48,+50,41,32,40,40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,+32,40,40,66,32,85,41,32,40,40,66,32,90,41,32,40,40,66,32,40,+66,32,40,95,49,52,57,55,32,95,52,54,49,41,41,41,32,40,40,66,+32,40,67,32,40,40,40,83,39,32,95,49,52,57,50,41,32,95,52,49,+49,41,32,40,95,52,48,57,32,35,49,41,41,41,41,32,40,40,67,32,+79,41,32,75,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,+48,52,32,40,40,40,40,40,95,48,32,95,49,53,48,49,41,32,40,40,+95,50,54,49,32,95,49,52,57,56,41,32,40,85,32,40,90,32,40,40,+66,32,40,95,49,52,57,55,32,95,52,54,49,41,41,32,40,40,67,32,+40,40,40,83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,32,40,+95,52,48,57,32,35,49,41,41,41,32,95,52,54,49,41,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,57,56,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,83,41,32,+95,49,52,57,57,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,95,49,52,57,57,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,+40,66,32,40,66,32,95,49,52,57,55,41,41,32,95,52,54,51,41,41,+41,32,95,49,52,57,53,41,41,41,41,41,32,40,95,56,32,95,49,53,+48,52,41,41,32,40,95,57,32,95,49,53,48,52,41,41,41,32,40,40,+65,32,58,49,53,48,53,32,40,40,95,50,54,49,32,95,49,52,57,56,+41,32,40,40,83,32,73,41,32,40,90,32,40,40,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,+79,41,41,32,40,67,32,80,41,41,32,75,41,41,32,95,49,52,57,52,+41,41,41,41,41,32,40,40,65,32,58,49,53,48,54,32,40,40,66,32,+40,95,50,54,49,32,95,49,52,57,56,41,41,32,40,40,66,32,85,41,+32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,95,49,+52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+40,40,66,32,40,66,32,40,80,32,95,49,51,52,49,41,41,41,32,40,+67,32,80,41,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,+41,32,40,40,65,32,58,49,53,48,55,32,40,40,66,32,40,40,95,51,+50,32,95,49,53,48,50,41,32,95,49,53,48,53,41,41,32,40,66,32,+95,49,53,48,54,41,41,41,32,40,40,65,32,58,49,53,48,56,32,40,+40,66,32,40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,+32,40,40,66,32,40,40,67,39,32,40,83,39,32,40,83,32,73,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,66,32,40,66,32,40,67,32,67,39,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,95,49,52,+57,57,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,49,52,57,+55,41,41,32,95,49,52,57,53,41,41,41,41,41,32,40,90,32,75,41,+41,41,41,32,95,49,52,57,57,41,41,41,32,40,40,65,32,58,49,53,+48,57,32,40,40,40,67,39,32,40,95,51,32,95,49,53,48,52,41,41,+32,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,52,55,55,41,+41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,55,54,41,+41,41,32,40,40,65,32,58,49,53,49,48,32,40,40,40,67,39,32,95,+49,53,48,56,41,32,95,49,53,49,49,41,32,40,40,95,49,51,32,95,+49,53,48,49,41,32,95,52,54,49,41,41,41,32,40,40,65,32,58,49,+53,49,49,32,40,40,40,83,39,32,40,95,49,52,32,95,49,53,48,49,+41,41,32,40,40,95,50,55,54,32,95,49,53,48,48,41,32,95,52,54,+50,41,41,32,95,49,53,49,48,41,41,32,40,40,65,32,58,49,53,49,+50,32,40,40,40,67,39,32,95,49,53,48,56,41,32,40,40,95,50,55,+54,32,95,49,53,48,48,41,32,95,52,55,55,41,41,32,40,40,95,49,+51,32,95,49,53,48,49,41,32,95,52,55,54,41,41,41,32,40,40,65,+32,58,49,53,49,51,32,40,40,66,32,40,67,32,66,41,41,32,40,40,+40,67,39,32,40,67,39,32,80,41,41,32,40,67,32,80,41,41,32,40,+40,83,32,40,40,67,32,67,39,41,32,95,49,55,52,41,41,32,40,90,+32,40,90,32,40,40,66,32,95,49,55,53,41,32,40,95,51,57,52,32,+40,85,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,40,40,40,+67,39,32,66,41,32,80,41,32,95,53,54,54,41,41,32,75,41,41,41,+41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,49,52,32,40,40,+83,32,40,85,32,40,95,50,32,95,49,53,48,52,41,41,41,32,40,90,+32,40,90,32,40,95,51,57,56,32,40,95,51,32,95,49,53,48,52,41,+41,41,41,41,41,32,40,40,65,32,58,49,53,49,53,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,32,40,40,+66,32,40,66,32,85,41,41,32,40,40,66,32,40,40,67,39,32,83,41,+32,40,40,66,32,40,40,67,39,32,67,39,41,32,83,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,39,32,66,+41,41,41,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,40,67,39,32,66,+41,32,80,41,41,32,40,67,32,80,41,41,41,32,75,41,41,32,95,49,+52,57,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,49,52,+57,55,32,95,52,54,49,41,41,41,32,40,40,66,32,40,67,32,40,40,+40,83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,32,40,95,52,+48,57,32,35,49,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,53,49,54,32,40,40,66,32,+40,66,32,40,95,50,54,49,32,95,49,52,57,56,41,41,41,32,40,40,+66,32,40,66,32,85,41,41,32,40,40,66,32,40,40,67,39,32,83,41,+32,40,40,66,32,40,40,67,39,32,67,39,41,32,83,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,67,39,32,66,+41,41,41,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,95,49,52,57,55,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,79,41,41,41,32,40,40,66,32,40,66,32,40,67,32,+80,41,41,41,32,40,67,32,80,41,41,41,32,75,41,41,32,95,49,52,+57,52,41,41,41,41,41,32,40,40,66,32,40,66,32,40,95,49,52,57,+55,32,95,52,54,49,41,41,41,32,40,40,66,32,40,67,32,40,40,40,+83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,32,40,95,52,48,+57,32,35,49,41,41,41,41,32,40,40,67,32,79,41,32,75,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,53,49,55,32,40,40,95,50,54,+49,32,95,49,52,57,56,41,32,40,40,83,32,73,41,32,40,40,66,32,+90,41,32,40,40,66,32,40,67,32,40,40,83,32,95,51,57,50,41,32,+40,40,66,32,40,95,49,52,57,55,32,95,52,54,49,41,41,32,40,40,+67,32,40,40,40,83,39,32,95,49,52,57,50,41,32,95,52,49,49,41,+32,40,95,52,48,57,32,35,49,41,41,41,32,40,40,79,32,34,101,111,+102,34,41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,32,95,49,+52,57,55,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,49,51,+52,49,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,49,56,32,40,40,66,32,40,66,32,40,95,+50,54,49,32,95,49,52,57,56,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,67,41,32,95,49,52,57,57,41,41,32,40,40,66,+32,40,66,32,85,41,41,32,40,40,66,32,40,66,32,40,66,32,90,41,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,40,66,39,32,95,+49,52,57,55,41,41,41,32,40,40,66,32,40,40,67,39,32,67,41,32,+95,49,52,57,50,41,41,32,40,40,67,32,79,41,32,75,41,41,41,41,+41,41,41,41,32,40,40,65,32,58,49,53,49,57,32,40,40,66,32,40,+95,50,54,49,32,95,49,52,57,56,41,41,32,40,40,40,67,39,32,83,+41,32,95,49,52,57,57,41,32,40,40,66,32,40,67,32,40,40,67,32,+67,39,41,32,40,85,32,40,40,66,32,40,66,32,40,66,32,40,95,49,+52,57,55,32,95,52,54,49,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,95,49,52,57,50,41,32,40,95,52,48,57,32,35,49,41,41,41,+41,41,41,41,32,40,90,32,40,90,32,40,40,40,67,39,32,95,49,52,+57,55,41,32,40,40,40,67,39,32,79,41,32,40,80,32,95,49,51,52,+49,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,50,48,32,40,40,95,50,54,49,32,95,49,+52,57,56,41,32,40,40,83,32,73,41,32,40,40,66,32,90,41,32,40,+40,66,32,40,67,32,40,40,83,32,73,41,32,40,40,66,32,40,95,49,+52,57,55,32,95,52,54,49,41,41,32,40,40,67,32,40,40,40,67,39,+32,95,49,52,57,50,41,32,95,52,49,49,41,32,95,52,54,49,41,41,+32,40,40,79,32,34,33,101,111,102,34,41,32,75,41,41,41,41,41,41,+32,40,40,66,32,90,41,32,40,40,40,67,39,32,40,67,39,32,95,49,+52,57,55,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,+40,67,32,80,41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,+41,41,41,32,40,40,65,32,58,49,53,50,49,32,40,40,66,32,40,95,+50,54,49,32,95,49,52,57,56,41,41,32,40,40,66,32,85,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,95,49,52,57,55,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,79,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,80,32,95,49,51,52,49,41,+41,41,41,32,40,40,66,32,40,66,32,80,41,41,32,95,52,54,51,41,+41,41,32,75,41,41,32,95,49,52,57,52,41,41,41,41,32,40,40,65,+32,58,49,53,50,50,32,40,40,40,83,39,32,66,41,32,40,40,66,32,+40,95,49,52,32,95,49,53,48,49,41,41,32,40,40,95,50,55,54,32,+95,49,53,48,48,41,32,95,52,54,50,41,41,41,32,40,40,66,32,40,+66,32,40,95,53,32,95,49,53,48,52,41,41,41,32,40,67,32,40,95,+49,53,32,95,49,53,48,49,41,41,41,41,41,32,40,40,65,32,58,49,+53,50,51,32,40,40,40,83,39,32,66,41,32,40,40,66,32,40,95,49,+52,32,95,49,53,48,49,41,41,32,40,40,95,50,55,54,32,95,49,53,+48,48,41,32,95,52,54,50,41,41,41,32,40,40,66,32,40,66,32,95,+49,53,49,48,41,41,32,40,67,32,40,95,49,53,32,95,49,53,48,49,+41,41,41,41,41,32,40,40,65,32,58,49,53,50,52,32,40,40,40,67,+39,32,40,67,39,32,95,49,53,48,56,41,41,32,95,49,53,50,51,41,+32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,41,41,+41,32,40,40,65,32,58,49,53,50,53,32,40,40,40,67,39,32,40,67,+39,32,95,49,53,48,56,41,41,32,95,49,53,50,54,41,32,40,40,95,+49,51,32,95,49,53,48,49,41,32,95,52,54,49,41,41,41,32,40,40,+65,32,58,49,53,50,54,32,40,40,40,83,39,32,66,41,32,40,40,66,+32,40,95,49,52,32,95,49,53,48,49,41,41,32,40,40,95,50,55,54,+32,95,49,53,48,48,41,32,95,52,54,50,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,95,49,53,48,56,41,41,32,40,40,66,32,40,83,+32,40,95,49,53,32,95,49,53,48,49,41,41,41,32,95,49,53,50,53,+41,41,32,40,40,95,49,51,32,95,49,53,48,49,41,32,95,52,54,49,+41,41,41,41,32,40,40,65,32,58,49,53,50,55,32,40,90,32,40,90,+32,40,90,32,40,90,32,40,90,32,40,90,32,75,41,41,41,41,41,41,+41,32,40,40,65,32,58,49,53,50,56,32,40,90,32,40,40,66,32,90,+41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,+90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,85,41,41,+41,41,41,41,41,41,32,40,40,65,32,58,49,53,50,57,32,40,40,66,+32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,53,51,48,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,+40,40,66,32,90,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,+66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,51,49,32,40,40,66,32,90,41,32,40,40,+66,32,90,41,32,40,40,66,32,90,41,32,40,40,66,32,90,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,40,66,32,90,41,41,32,80,41,41,41,41,41,41,41,+41,32,40,40,65,32,58,49,53,51,50,32,40,75,32,40,75,32,40,75,+32,40,75,32,40,75,32,40,90,32,75,41,41,41,41,41,41,41,32,40,+40,65,32,58,49,53,51,51,32,40,40,66,32,40,66,32,90,41,41,32,+40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,+41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,40,66,32,90,41,41,41,32,40,40,66,32,40,66,32,67,41,41,+32,80,41,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,53,51,+52,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,+66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,67,41,41,32,80,41,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,51,53,32,40,40,67,32,95,49,53,50,57,+41,32,95,49,53,50,55,41,41,32,40,40,65,32,58,49,53,51,54,32,+95,49,53,50,55,41,32,40,40,65,32,58,49,53,51,55,32,40,40,67,+32,40,40,67,32,40,40,83,32,40,40,83,32,40,40,83,32,40,40,83,+32,40,40,83,32,40,40,83,32,73,41,32,73,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,73,41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,+41,32,95,49,53,54,56,41,32,95,49,53,51,55,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,66,41,41,32,95,49,53,54,50,41,32,95,+49,53,51,55,41,41,41,32,40,40,65,32,58,49,53,51,56,32,40,40,+95,50,54,51,32,95,53,54,54,41,32,40,40,95,50,54,51,32,95,49,+53,53,50,41,32,40,40,95,51,57,55,32,40,40,67,32,95,49,53,51,+51,41,32,95,49,50,52,41,41,32,95,49,53,51,54,41,41,41,41,32,+40,40,65,32,58,49,53,51,57,32,40,40,95,50,54,51,32,95,53,54,+54,41,32,40,40,95,50,54,51,32,95,49,53,53,50,41,32,40,40,95,+51,57,55,32,40,40,67,32,95,49,53,51,51,41,32,95,49,50,53,41,+41,32,95,49,53,51,54,41,41,41,41,32,40,40,65,32,58,49,53,52,+48,32,40,40,95,50,54,51,32,95,53,54,54,41,32,40,40,95,50,54,+51,32,95,49,53,53,51,41,32,40,40,95,51,57,55,32,40,40,67,32,+95,49,53,51,52,41,32,95,49,50,52,41,41,32,95,49,53,51,54,41,+41,41,41,32,40,40,65,32,58,49,53,52,49,32,40,40,40,67,39,32,+66,41,32,95,49,53,52,56,41,32,95,49,53,51,55,41,41,32,40,40,+65,32,58,49,53,52,50,32,40,40,66,32,40,66,32,40,66,32,95,49,+53,55,48,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+79,41,41,32,40,40,40,67,39,32,40,67,39,32,79,41,41,32,95,49,+53,52,49,41,32,75,41,41,41,41,32,40,40,65,32,58,49,53,52,51,+32,40,40,66,32,40,80,32,95,52,54,49,41,41,32,40,40,66,32,89,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,80,41,32,40,40,67,+32,79,41,32,75,41,41,41,41,32,40,40,66,32,40,67,39,32,66,41,+41,32,40,40,66,32,66,39,41,32,40,40,66,32,40,66,32,95,52,54,+50,41,41,32,40,67,32,95,49,53,54,53,41,41,41,41,41,41,41,41,+32,40,40,65,32,58,49,53,52,52,32,40,40,80,32,95,50,54,52,41,+32,95,49,53,52,53,41,41,32,40,40,65,32,58,49,53,52,53,32,40,+40,40,67,39,32,95,49,53,54,53,41,32,40,95,49,53,54,53,32,40,+95,49,53,51,53,32,40,40,79,32,35,52,48,41,32,75,41,41,41,41,+32,40,95,49,53,51,53,32,40,40,79,32,35,52,49,41,32,75,41,41,+41,41,32,40,40,65,32,58,49,53,52,54,32,40,40,40,67,39,32,95,+49,53,54,53,41,32,40,95,49,53,54,53,32,40,95,49,53,51,53,32,+40,40,79,32,35,49,50,51,41,32,75,41,41,41,41,32,40,95,49,53,+51,53,32,40,40,79,32,35,49,50,53,41,32,75,41,41,41,41,32,40,+40,65,32,58,49,53,52,55,32,40,40,40,67,39,32,95,49,53,54,53,+41,32,40,95,49,53,54,53,32,40,95,49,53,51,53,32,40,40,79,32,+35,57,49,41,32,75,41,41,41,41,32,40,95,49,53,51,53,32,40,40,+79,32,35,57,51,41,32,75,41,41,41,41,32,40,40,65,32,58,49,53,+52,56,32,40,40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,67,+32,95,49,52,56,49,41,32,95,49,50,52,41,41,32,40,40,40,83,39,+32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,+39,32,67,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,66,32,40,40,67,39,32,67,41,32,40,40,67,32,40,40,40,67,+39,32,83,39,41,32,40,85,32,95,49,53,50,55,41,41,32,75,41,41,+32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,95,49,53,+52,56,41,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,32,+40,90,32,75,41,41,41,32,95,49,53,51,50,41,41,32,40,90,32,40,+90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,+40,40,67,32,40,40,40,83,39,32,83,39,41,32,40,40,67,32,61,61,+41,32,35,48,41,41,32,95,49,53,53,55,41,41,32,73,41,41,41,41,+32,95,50,53,41,41,32,40,40,65,32,58,49,53,52,57,32,40,40,40,+83,39,32,66,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,+32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,+41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,40,40,40,67,39,+32,83,39,41,32,40,85,32,95,49,53,50,55,41,41,32,75,41,41,32,+40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,+41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,+40,90,32,40,90,32,75,41,41,41,41,32,95,49,53,53,56,41,41,32,+40,40,65,32,58,49,53,53,48,32,75,41,32,40,40,65,32,58,49,53,+53,49,32,65,41,32,40,40,65,32,58,49,53,53,50,32,40,40,83,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,67,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,+39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,83,41,+32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,73,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,95,49,53,53,52,32,95,49,+53,51,51,41,41,32,40,40,66,32,95,53,54,54,41,32,95,49,53,53,+50,41,41,41,32,95,49,53,53,50,41,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,80,32,95,49,53,53,49,41,41,41,32,40,40,+65,32,58,49,53,53,51,32,40,40,83,32,40,40,40,67,39,32,67,41,+32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,40,+67,39,32,83,41,32,40,40,67,32,83,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,40,66,32,40,95,49,53,53,+52,32,95,49,53,51,52,41,41,32,40,40,66,32,95,53,54,54,41,32,+95,49,53,53,51,41,41,41,32,95,49,53,53,51,41,41,41,32,40,80,+32,95,49,53,53,49,41,41,41,32,40,40,65,32,58,49,53,53,52,32,+40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,+67,32,40,67,39,32,83,39,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,40,+66,32,40,80,32,95,49,53,53,49,41,41,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,85,41,41,41,32,40,40,83,39,32,66,41,32,40,+40,66,32,40,67,39,32,66,41,41,32,85,41,41,41,41,41,41,32,40,+40,65,32,58,49,53,53,53,32,95,49,53,50,56,41,32,40,40,65,32,+58,49,53,53,54,32,95,49,53,50,57,41,32,40,40,65,32,58,49,53,+53,55,32,95,49,53,51,48,41,32,40,40,65,32,58,49,53,53,56,32,+95,49,53,51,49,41,32,40,40,65,32,58,49,53,53,57,32,40,40,67,+32,95,49,53,54,49,41,32,95,49,50,52,41,41,32,40,40,65,32,58,+49,53,54,48,32,40,40,67,32,95,49,53,54,49,41,32,95,49,50,53,+41,41,32,40,40,65,32,58,49,53,54,49,32,40,40,40,83,39,32,66,+41,32,40,40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,+41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,+67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,39,+41,41,32,85,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,41,32,40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,+67,32,40,67,39,32,83,39,41,41,32,75,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,+41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,41,32,95,49,53,51,52,41,41,41,32,40,40,65,+32,58,49,53,54,50,32,40,40,40,83,39,32,40,83,39,32,83,41,41,+32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,67,41,41,41,32,+40,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,+40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,+40,67,39,32,83,41,32,40,40,40,67,39,32,83,41,32,40,40,67,32,+83,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,73,41,41,41,41,32,40,40,66,+32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,40,67,39,32,67,41,32,40,40,66,32,95,49,53,+54,51,41,32,95,49,53,51,55,41,41,32,35,48,41,41,32,95,49,53,+51,55,41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,67,39,+32,40,67,39,32,66,41,41,32,95,49,53,54,50,41,41,41,32,40,40,+66,32,67,41,32,40,67,32,95,49,53,54,50,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,40,40,67,39,32,67,+41,32,95,49,53,54,51,41,32,35,48,41,41,32,95,49,53,51,55,41,+41,41,32,40,40,65,32,58,49,53,54,51,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,67,+39,41,32,40,40,67,32,95,49,52,56,49,41,32,95,49,50,52,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,+40,40,40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,+40,40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,+40,67,39,32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,40,+67,39,32,66,41,32,40,40,40,67,39,32,83,39,41,32,83,39,41,32,+95,49,53,52,56,41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,+32,95,49,53,53,53,41,41,41,41,32,40,40,66,32,40,66,32,67,41,+41,32,40,40,66,32,67,41,32,40,67,32,95,49,53,54,51,41,41,41,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,+32,83,41,41,32,40,40,66,32,40,66,32,40,40,67,39,32,67,39,41,+32,40,66,39,32,95,49,53,50,57,41,41,41,41,32,40,40,40,83,39,+32,40,83,39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,32,40,40,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,+83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,+66,32,40,66,32,40,67,32,66,41,41,41,32,40,40,66,32,67,41,32,+95,49,53,54,52,41,41,41,32,75,41,41,32,40,90,32,75,41,41,41,+32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,73,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,40,66,32,40,67,39,32,67,41,41,32,40,67,32,+95,49,53,54,51,41,41,41,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,+32,95,49,53,53,55,41,41,41,41,32,40,40,66,32,40,66,32,40,67,+39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,+40,40,66,32,67,41,32,40,67,32,95,49,53,54,51,41,41,41,41,32,+40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,49,53,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,40,40,66,32,67,+41,32,40,67,32,95,49,53,54,51,41,41,41,41,41,32,40,40,66,32,+40,66,32,67,41,41,32,40,40,66,32,67,41,32,40,67,32,95,49,53,+54,51,41,41,41,41,41,41,32,95,49,53,51,50,41,41,32,40,75,32,+40,75,32,40,75,32,40,95,50,52,32,34,97,98,111,118,101,78,101,115,+116,32,66,101,115,105,100,101,34,41,41,41,41,41,41,32,40,75,32,40,+75,32,40,75,32,40,95,50,52,32,34,97,98,111,118,101,78,101,115,116,+32,65,98,111,118,101,34,41,41,41,41,41,41,41,32,95,50,53,41,41,+32,40,40,65,32,58,49,53,54,52,32,40,40,66,32,89,41,32,40,40,+40,67,39,32,40,67,39,32,67,41,41,32,40,40,66,32,40,66,32,40,+40,83,39,32,67,39,41,32,40,40,67,32,95,49,52,56,49,41,32,95,+49,50,52,41,41,41,41,32,40,40,66,32,40,40,67,39,32,40,83,39,+32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,+41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,67,41,32,40,40,67,32,+40,40,40,67,39,32,83,39,41,32,40,85,32,95,49,53,50,55,41,41,+32,75,41,41,32,40,90,32,75,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,66,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,+41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,+75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,41,32,40,+40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,83,39,32,83,39,+41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,95,49,50,49,+41,32,95,49,50,50,41,41,32,40,40,67,32,40,95,52,57,57,32,95,+50,56,50,41,41,32,35,48,41,41,41,32,40,40,66,32,40,66,32,95,+49,53,53,53,41,41,32,95,49,53,52,56,41,41,41,32,40,40,66,32,+95,49,53,53,54,41,32,40,40,67,32,95,52,52,54,41,32,35,51,50,+41,41,41,41,41,41,32,95,50,53,41,41,41,32,40,40,65,32,58,49,+53,54,53,32,40,40,67,32,95,49,53,54,55,41,32,95,49,50,52,41,+41,32,40,40,65,32,58,49,53,54,54,32,40,40,67,32,95,49,53,54,+55,41,32,95,49,50,53,41,41,32,40,40,65,32,58,49,53,54,55,32,+40,40,40,83,39,32,66,41,32,40,40,66,32,83,41,32,40,40,40,67,+39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,+83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,+40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,+39,32,83,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,39,+32,40,67,39,32,83,39,41,41,32,85,41,32,75,41,41,32,40,90,32,+75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,+32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,90,32,+40,90,32,75,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,+40,66,32,83,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,+40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,+40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,67,32,40,67,39,32,83,39,41,41,32,75,41,+41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,41,32,40,90,+32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,41,32,95,49,53,51,51,+41,41,41,32,40,40,65,32,58,49,53,54,56,32,40,40,40,83,39,32,+40,83,39,32,83,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,+41,32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,+39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,32,40,83,39,32,+83,41,41,32,40,40,40,67,39,32,40,83,39,32,83,41,41,32,40,40,+40,67,39,32,66,41,32,83,41,32,40,40,66,32,40,66,32,40,66,32,+40,95,50,54,50,32,95,49,53,53,53,41,41,41,41,32,40,40,66,32,+67,41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,32,40,40,66,+32,40,66,32,40,40,67,39,32,66,41,32,95,49,53,50,57,41,41,41,+32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+67,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,83,39,+41,41,41,32,40,40,66,32,40,66,32,85,41,41,32,95,49,53,54,57,+41,41,32,75,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,+41,41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,+40,66,32,67,41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,40,67,39,32,66,41,32,40,40,66,32,+95,50,54,50,41,32,95,49,53,53,55,41,41,41,41,32,40,40,66,32,+67,41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,32,40,40,40,+83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,+40,66,32,40,66,32,95,49,53,53,56,41,41,41,32,40,40,66,32,67,+41,32,40,67,32,95,49,53,54,56,41,41,41,41,32,40,40,66,32,67,+41,32,40,67,32,95,49,53,54,56,41,41,41,41,41,32,95,49,53,51,+50,41,41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,66,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,83,39,32,66,41,41,+41,41,32,40,40,66,32,40,40,83,39,32,66,41,32,40,40,66,32,67,+41,32,40,67,32,40,95,50,48,50,32,95,49,49,55,41,41,41,41,41,+32,40,40,66,32,95,49,53,54,56,41,32,95,49,53,51,55,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,+41,32,40,40,66,32,40,66,32,95,50,54,50,41,41,32,95,49,53,54,+56,41,41,41,41,32,40,40,66,32,67,41,32,40,67,32,95,49,53,54,+56,41,41,41,41,41,41,32,40,40,66,32,40,66,32,90,41,41,32,40,+40,66,32,40,66,32,90,41,41,32,40,40,66,32,40,66,32,90,41,41,+32,40,40,66,32,95,49,53,54,56,41,32,95,49,53,51,55,41,41,41,+41,41,41,32,40,40,65,32,58,49,53,54,57,32,40,40,66,32,89,41,+32,40,40,66,32,40,40,67,39,32,83,41,32,40,40,40,67,39,32,40,+67,39,32,83,41,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,+32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,+32,40,67,39,32,83,41,41,32,40,40,66,32,40,40,67,39,32,67,41,+32,40,40,67,32,40,40,40,67,39,32,83,39,41,32,40,85,32,95,49,+53,50,55,41,41,32,75,41,41,32,40,90,32,75,41,41,41,41,32,75,+41,41,32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,+32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,41,32,+40,40,67,32,83,41,32,40,95,49,53,53,54,32,40,40,79,32,35,51,+50,41,32,75,41,41,41,41,41,41,32,40,40,65,32,58,49,53,55,48,+32,40,95,49,53,55,50,32,95,49,50,53,41,41,32,40,40,65,32,58,+49,53,55,49,32,40,95,49,53,55,50,32,95,49,50,52,41,41,32,40,+40,65,32,58,49,53,55,50,32,40,40,66,32,40,80,32,95,49,53,51,+54,41,41,32,40,40,67,32,40,40,40,67,39,32,67,39,41,32,95,49,+53,55,51,41,32,95,49,53,51,55,41,41,32,35,48,41,41,41,32,40,+40,65,32,58,49,53,55,51,32,40,40,66,32,89,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,40,83,39,32,67,39,41,32,40,40,67,32,95,49,+52,56,49,41,32,95,49,50,52,41,41,41,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,40,67,39,+32,40,83,39,32,83,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,40,+83,39,32,40,67,39,32,40,83,39,32,83,41,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,39,+41,41,32,40,40,66,32,40,40,67,39,32,66,41,32,95,49,53,52,56,+41,41,32,95,49,53,55,50,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,95,49,53,53,53,41,41,41,32,40,40,40,67,39,32,66,41,32,+40,40,66,32,67,41,32,40,67,32,40,40,67,32,95,49,53,54,51,41,+32,95,49,50,52,41,41,41,41,32,40,40,66,32,95,49,53,51,55,41,+32,95,49,53,52,48,41,41,41,41,41,32,40,40,66,32,40,66,32,40,+66,32,40,40,83,39,32,66,41,32,95,49,53,53,54,41,41,41,41,32,+40,40,66,32,40,66,32,40,67,39,32,67,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,95,49,53,55,+52,41,41,41,32,40,40,40,67,39,32,66,41,32,40,95,52,56,48,32,+95,50,55,55,41,41,32,95,52,49,49,41,41,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,49,53,+53,55,41,41,41,41,32,40,40,66,32,40,66,32,40,67,39,32,67,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,66,39,32,67,41,41,32,+40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,49,53,53,56,41,+41,41,41,32,40,40,66,32,40,66,32,67,41,41,32,67,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,40,67,32,40,+40,67,32,95,49,53,54,51,41,32,95,49,50,52,41,41,41,41,32,40,+40,66,32,95,49,53,51,55,41,32,95,49,53,52,48,41,41,41,41,41,+32,95,49,53,51,50,41,41,32,40,75,32,40,75,32,40,75,32,40,95,+50,52,32,34,115,101,112,49,32,66,101,115,105,100,101,34,41,41,41,41,+41,41,32,40,75,32,40,75,32,40,75,32,40,95,50,52,32,34,115,101,+112,49,32,65,98,111,118,101,34,41,41,41,41,41,41,41,32,95,50,53,+41,41,41,32,40,40,65,32,58,49,53,55,52,32,40,40,66,32,89,41,+32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,40,83,39,32,83,+41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,+32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,67,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,32,40,40,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,32,40,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,67,39,32,66,41,+32,40,40,66,32,40,83,39,32,95,49,53,52,57,41,41,32,40,40,66,+32,40,66,32,95,49,53,55,53,41,41,32,40,40,40,83,39,32,66,41,+32,95,49,53,54,57,41,32,40,40,66,32,40,66,32,95,49,53,51,55,+41,41,32,40,40,67,32,40,40,67,32,83,39,41,32,95,49,53,51,56,+41,41,32,95,49,53,51,57,41,41,41,41,41,41,32,40,40,40,67,39,+32,66,41,32,40,95,49,53,54,52,32,95,49,50,52,41,41,32,40,40,+66,32,95,49,53,51,55,41,32,95,49,53,52,48,41,41,41,41,41,32,+75,41,41,32,40,90,32,75,41,41,41,41,32,40,40,66,32,40,66,32,+90,41,41,32,40,40,66,32,40,66,32,67,41,41,32,67,41,41,41,41,+32,40,90,32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,95,49,53,+55,51,41,41,41,32,40,40,65,32,58,49,53,55,53,32,40,40,67,32,+40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,40,40,67,32,+40,40,80,32,95,49,53,50,55,41,32,40,75,32,95,49,53,51,50,41,+41,41,32,40,40,40,67,39,32,66,41,32,95,49,53,53,54,41,32,95,+49,53,55,53,41,41,41,32,40,40,40,67,39,32,66,41,32,95,49,53,+53,55,41,32,95,49,53,55,53,41,41,41,32,40,90,32,95,49,53,55,+53,41,41,41,32,95,49,53,51,50,41,41,32,40,75,32,40,75,32,40,+75,32,40,95,50,52,32,34,111,110,101,76,105,110,101,114,32,66,101,115,+105,100,101,34,41,41,41,41,41,41,32,40,75,32,40,75,32,40,75,32,+40,95,50,52,32,34,111,110,101,76,105,110,101,114,32,65,98,111,118,101,+34,41,41,41,41,41,41,32,40,40,65,32,58,49,53,55,54,32,80,41,+32,40,40,65,32,58,49,53,55,55,32,40,85,32,75,41,41,32,40,40,+65,32,58,49,53,55,56,32,40,85,32,65,41,41,32,40,40,65,32,58,+49,53,55,57,32,40,40,95,49,53,55,54,32,35,49,48,48,41,32,40,+40,80,32,40,40,95,52,56,53,32,95,50,55,55,41,32,40,95,51,53,+57,32,35,51,41,41,41,32,40,40,95,52,56,53,32,95,50,55,55,41,+32,40,95,51,53,57,32,35,50,41,41,41,41,41,32,40,40,65,32,58,+49,53,56,48,32,40,95,49,53,56,49,32,95,49,53,55,57,41,41,32,+40,40,65,32,58,49,53,56,49,32,40,40,67,32,40,40,40,83,39,32,+95,49,53,56,50,41,32,95,49,53,55,55,41,32,95,49,53,55,56,41,+41,32,75,41,41,32,40,40,65,32,58,49,53,56,50,32,40,40,66,32,+40,40,67,39,32,66,41,32,66,41,41,32,40,40,40,83,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,66,39,+41,41,32,40,40,40,83,39,32,40,67,39,32,66,41,41,32,40,40,66,+32,40,66,32,83,41,41,32,40,40,66,32,67,41,32,95,49,53,56,51,+41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,67,41,32,+95,49,53,56,52,41,41,32,95,49,53,51,55,41,41,41,41,32,40,40,+66,32,40,67,39,32,40,95,51,54,54,32,95,50,55,56,41,41,41,32,+40,95,52,56,49,32,95,50,55,55,41,41,41,41,41,32,40,40,65,32,+58,49,53,56,51,32,40,75,32,40,75,32,40,40,67,32,40,40,40,67,+39,32,89,41,32,40,40,40,67,39,32,83,41,32,40,40,40,67,39,32,+40,83,39,32,67,41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,+39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,66,41,41,41,32,40,40,66,32,40,66,32,40,66,+32,80,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,+40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,+39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,+41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,40,83,39,32,+67,41,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,+67,39,32,40,83,39,32,67,41,41,41,32,40,40,40,67,39,32,66,41,+32,40,66,39,32,80,41,41,32,40,66,32,40,66,32,40,95,52,54,51,+32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,41,41,41,32,40,+85,32,40,75,32,75,41,41,41,41,32,40,40,40,67,39,32,66,41,32,+66,41,32,40,95,52,55,57,32,95,50,55,55,41,41,41,41,32,40,90,+32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,52,32,34,+100,105,115,112,108,97,121,32,108,97,121,34,41,41,41,41,32,40,40,66,+32,40,40,83,39,32,66,41,32,40,66,39,32,40,40,66,32,95,52,54,+51,41,32,40,40,67,32,95,52,52,54,41,32,35,51,50,41,41,41,41,+41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,52,54,+51,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,40,40,+67,39,32,66,41,32,40,95,52,55,57,32,95,50,55,55,41,41,32,95,+52,49,49,41,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,41,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,41,41,41,41,41,32,40,40,40,67,39,32,40,67,+39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,32,40,40,40,67,+39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,83,39,+41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,83,39,32,+40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+66,41,41,32,40,40,66,32,40,66,32,40,83,39,32,67,41,41,41,32,+40,40,40,67,39,32,66,41,32,40,66,39,32,80,41,41,32,40,66,32,+40,66,32,40,95,52,54,51,32,40,40,79,32,35,49,48,41,32,75,41,+41,41,41,41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,+41,32,95,52,54,51,41,41,41,32,40,40,40,67,39,32,66,41,32,66,+41,32,40,40,40,67,39,32,66,41,32,40,95,52,55,57,32,95,50,55,+55,41,41,32,95,52,49,49,41,41,41,41,41,32,90,41,41,32,40,90,+32,75,41,41,41,32,73,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,52,32,34,+100,105,115,112,108,97,121,32,108,97,121,50,34,41,41,41,41,32,40,85,+32,40,75,32,65,41,41,41,41,32,40,85,32,40,90,32,75,41,41,41,+41,32,40,90,32,75,41,41,41,32,35,48,41,41,41,41,32,40,40,65,+32,58,49,53,56,52,32,40,67,32,40,40,40,67,39,32,89,41,32,40,+40,67,32,40,40,40,67,39,32,83,39,41,32,40,40,66,32,67,41,32,+40,40,40,83,39,32,40,83,39,32,40,83,39,32,80,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,67,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,40,67,39,32,83,39,41,41,41,41,41,32,40,40,40,+67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,+32,40,40,66,32,40,40,83,39,32,40,67,39,32,40,83,39,32,67,41,+41,41,32,40,40,40,83,39,32,40,67,39,32,40,83,39,32,67,41,41,+41,32,40,40,40,67,39,32,66,41,32,40,40,66,32,40,83,39,32,67,+41,41,32,40,40,66,32,40,66,32,40,80,32,95,49,53,50,55,41,41,+41,32,40,66,32,40,66,32,95,49,53,53,53,41,41,41,41,41,32,40,+40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,49,53,53,54,41,+41,41,32,40,40,67,32,40,67,39,32,66,41,41,32,95,52,49,49,41,+41,41,41,32,40,40,66,32,40,66,32,40,40,83,39,32,66,41,32,95,+49,53,53,55,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,+40,95,52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,40,+67,39,32,40,83,39,32,40,83,39,32,40,67,39,32,66,41,41,41,41,+32,40,40,66,32,40,83,39,32,66,41,41,32,40,67,32,95,49,53,56,+53,41,41,41,32,73,41,41,41,32,95,49,53,51,50,41,41,32,40,90,+32,40,90,32,75,41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,+41,32,40,95,50,52,32,34,98,101,115,116,32,103,101,116,34,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,+67,39,32,67,41,41,41,41,41,32,40,40,40,67,39,32,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,41,41,32,40,+40,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,+32,40,67,39,32,83,39,41,41,41,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,40,67,39,32,40,67,39,32,67,41,41,41,+41,41,32,40,40,66,32,40,40,67,39,32,40,83,39,32,40,83,39,32,+40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,40,83,39,32,+40,83,39,32,40,83,39,32,67,41,41,41,41,32,40,40,40,67,39,32,+66,41,32,40,40,66,32,40,83,39,32,40,83,39,32,67,41,41,41,32,+40,40,66,32,40,66,32,40,66,32,40,80,32,95,49,53,50,55,41,41,+41,41,32,40,40,66,32,40,66,32,40,66,32,40,66,32,95,49,53,53,+53,41,41,41,41,32,40,40,40,67,39,32,66,41,32,66,41,32,40,95,+52,56,48,32,95,50,55,55,41,41,41,41,41,41,32,40,40,66,32,40,+66,32,40,66,32,40,40,83,39,32,66,41,32,95,49,53,53,54,41,41,+41,41,32,40,40,40,67,39,32,40,67,39,32,66,41,41,32,66,39,41,+32,40,40,40,67,39,32,66,41,32,40,95,52,55,57,32,95,50,55,55,+41,41,32,95,52,49,49,41,41,41,41,41,32,40,66,32,90,41,41,41,+41,32,40,40,40,67,39,32,40,83,39,32,40,83,39,32,40,83,39,32,+40,67,39,32,66,41,41,41,41,41,32,40,40,66,32,40,83,39,32,40,+83,39,32,66,41,41,41,32,40,67,32,95,49,53,56,54,41,41,41,32,+73,41,41,41,32,95,49,53,51,50,41,41,32,40,90,32,40,90,32,75,+41,41,41,41,32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,+52,32,34,98,101,115,116,32,103,101,116,49,34,41,41,41,41,41,32,40,+85,32,65,41,41,41,32,40,85,32,75,41,41,41,32,75,41,41,41,32,+40,40,65,32,58,49,53,56,53,32,40,40,40,67,39,32,67,41,32,95,+49,53,56,54,41,32,35,48,41,41,32,40,40,65,32,58,49,53,56,54,+32,40,40,40,67,39,32,40,67,39,32,40,67,39,32,40,83,39,32,67,+41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,95,49,53,56,55,+41,41,41,32,40,40,66,32,40,66,32,40,95,52,56,48,32,95,50,55,+55,41,41,41,32,40,40,40,83,39,32,67,41,32,40,40,40,67,39,32,+83,41,32,40,95,52,57,55,32,95,50,56,50,41,41,32,73,41,41,32,+73,41,41,41,41,32,73,41,41,32,40,40,65,32,58,49,53,56,55,32,+40,40,67,32,40,40,40,83,39,32,67,39,41,32,40,40,67,32,40,95,+52,57,55,32,95,50,56,50,41,41,32,35,48,41,41,32,40,40,40,67,+39,32,67,41,32,40,40,40,67,39,32,40,67,39,32,83,41,41,32,40,+40,40,67,39,32,40,67,39,32,83,41,41,32,40,40,40,67,39,32,40,+67,39,32,67,41,41,32,40,40,40,67,39,32,67,41,32,40,40,40,67,+39,32,40,67,39,32,83,39,41,41,32,40,40,66,32,40,67,32,40,40,+80,32,95,49,50,53,41,32,40,75,32,95,49,50,53,41,41,41,41,32,+40,40,66,32,40,66,32,95,49,53,56,55,41,41,32,40,40,40,67,39,+32,66,41,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,+49,41,41,41,41,32,40,90,32,75,41,41,41,32,40,90,32,75,41,41,+41,32,95,49,50,52,41,41,32,40,90,32,40,90,32,75,41,41,41,41,+32,40,90,32,40,90,32,75,41,41,41,41,32,40,95,50,52,32,34,102,+105,116,115,34,41,41,41,41,32,95,49,50,52,41,41,32,40,40,65,32,+58,49,53,56,56,32,40,40,66,32,40,66,32,67,41,41,32,80,41,41,+32,40,40,65,32,58,49,53,56,57,32,40,85,32,40,90,32,75,41,41,+41,32,40,40,65,32,58,49,53,57,48,32,40,85,32,40,75,32,75,41,+41,41,32,40,40,65,32,58,49,53,57,49,32,40,85,32,40,75,32,65,+41,41,41,32,40,40,65,32,58,49,53,57,50,32,40,90,32,40,40,66,+32,40,66,32,95,52,54,51,41,41,32,95,49,53,57,48,41,41,41,32,+40,40,65,32,58,49,53,57,51,32,40,40,40,67,39,32,67,41,32,40,+40,67,32,95,49,53,56,57,41,32,35,48,41,41,32,75,41,41,32,40,+40,65,32,58,49,53,57,52,32,40,40,66,32,95,49,53,57,57,41,32,+95,49,53,57,53,41,41,32,40,40,65,32,58,49,53,57,53,32,40,40,+67,32,95,49,53,56,57,41,32,35,48,41,41,32,40,40,65,32,58,49,+53,57,54,32,95,52,54,50,41,32,40,40,65,32,58,49,53,57,55,32,+95,52,54,51,41,32,40,40,65,32,58,49,53,57,56,32,40,40,67,32,+83,41,32,40,40,66,32,40,66,32,40,95,52,54,50,32,35,52,48,41,+41,41,32,40,40,67,32,66,41,32,40,95,52,54,50,32,35,52,49,41,+41,41,41,41,32,40,40,65,32,58,49,53,57,57,32,40,40,66,32,40,+67,32,40,40,67,32,83,39,41,32,40,40,66,32,40,95,52,54,50,32,+35,57,49,41,41,32,40,95,52,54,50,32,35,57,51,41,41,41,41,41,+32,40,40,66,32,40,66,32,40,66,32,40,66,32,40,95,52,54,50,32,+35,57,49,41,41,41,41,41,32,40,40,40,83,39,32,66,41,32,40,67,+39,32,66,41,41,32,40,40,66,32,40,66,32,89,41,41,32,40,40,66,+32,40,40,67,39,32,66,41,32,40,40,66,32,80,41,32,40,95,52,54,+50,32,35,57,51,41,41,41,41,32,40,40,66,32,40,66,32,40,66,32,+40,66,32,40,95,52,54,50,32,35,52,52,41,41,41,41,41,32,40,67,+39,32,66,41,41,41,41,41,41,41,41,32,40,40,65,32,58,49,54,48,+48,32,35,49,48,41,32,40,40,65,32,58,49,54,48,49,32,35,49,49,+41,32,40,40,65,32,58,49,54,48,50,32,40,40,67,32,40,40,83,32,+40,40,40,83,39,32,83,39,41,32,40,40,40,67,39,32,40,95,50,48,+50,32,95,49,51,49,41,41,32,95,52,50,56,41,32,35,52,53,41,41,+32,85,41,41,32,40,40,66,32,40,66,32,40,40,95,52,56,48,32,95,+50,55,55,41,32,35,48,41,41,41,32,40,40,66,32,85,41,32,95,52,+50,57,41,41,41,41,32,40,40,95,51,57,57,32,40,40,40,67,39,32,+40,67,39,32,40,95,52,56,48,32,95,50,55,55,41,41,41,32,40,40,+40,67,39,32,66,41,32,40,40,66,32,40,95,52,55,57,32,95,50,55,+55,41,41,32,40,40,67,32,40,95,52,56,49,32,95,50,55,55,41,41,+32,35,49,48,41,41,41,32,95,49,51,55,41,41,32,40,95,49,51,55,+32,35,52,56,41,41,41,32,35,48,41,41,41,32,40,40,65,32,58,49,+54,48,51,32,95,49,51,54,49,41,32,40,40,65,32,58,49,54,48,52,+32,40,40,40,67,39,32,67,41,32,40,40,66,32,95,49,53,57,57,41,+32,40,66,32,95,52,54,51,41,41,41,32,75,41,41,32,40,40,65,32,+58,49,54,48,53,32,40,40,66,32,40,66,32,85,41,41,32,40,40,66,+32,40,66,32,40,66,32,40,66,32,40,95,52,54,51,32,40,40,79,32,+35,52,48,41,32,75,41,41,41,41,41,41,32,40,40,40,67,39,32,66,+41,32,40,40,66,32,40,67,39,32,66,41,41,32,40,66,32,95,52,54,+51,41,41,41,32,40,40,66,32,40,66,32,40,95,52,54,51,32,40,40,+79,32,35,52,52,41,32,75,41,41,41,41,32,40,40,67,32,40,67,39,+32,95,52,54,51,41,41,32,40,40,79,32,35,52,49,41,32,75,41,41,+41,41,41,41,41,32,40,40,65,32,58,49,54,48,54,32,40,40,83,32,+40,85,32,95,52,54,49,41,41,32,40,90,32,40,90,32,40,40,67,32,+40,95,52,50,54,32,40,40,95,50,54,51,32,95,49,50,50,41,32,40,+40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,49,48,41,+41,41,41,32,40,40,40,83,39,32,80,41,32,40,40,67,32,79,41,32,+75,41,41,32,40,90,32,40,40,40,67,39,32,66,41,32,95,52,54,50,+41,32,95,49,54,48,54,41,41,41,41,41,41,41,41,32,40,40,65,32,+58,49,54,48,55,32,40,95,51,57,52,32,40,40,67,32,95,52,54,51,+41,32,40,40,79,32,35,49,48,41,32,75,41,41,41,41,32,40,40,65,+32,58,49,54,48,56,32,40,40,66,32,40,40,83,32,40,85,32,95,52,+54,49,41,41,32,40,90,32,40,90,32,40,40,66,32,40,40,40,83,39,+32,95,52,54,50,41,32,40,85,32,75,41,41,32,40,40,66,32,95,49,+54,48,56,41,32,40,85,32,65,41,41,41,41,32,40,95,52,50,54,32,+40,40,95,50,54,51,32,95,49,50,50,41,32,95,49,52,53,41,41,41,+41,41,41,41,32,40,95,52,50,53,32,95,49,52,53,41,41,41,32,40,+40,65,32,58,49,54,48,57,32,40,95,52,51,49,32,40,40,79,32,35,+51,50,41,32,75,41,41,41,32,40,40,65,32,58,49,54,49,48,32,40,+40,40,67,39,32,40,83,39,32,95,52,54,51,41,41,32,40,40,40,67,+39,32,40,67,39,32,95,52,52,54,41,41,32,40,40,40,67,39,32,66,+41,32,40,95,52,56,48,32,95,50,55,55,41,41,32,95,52,49,49,41,+41,32,35,51,50,41,41,32,73,41,41,32,40,40,65,32,58,49,54,49,+49,32,40,40,80,32,95,49,51,52,49,41,32,40,40,40,67,39,32,66,+41,32,95,49,51,57,57,41,32,95,49,54,49,49,41,41,41,32,40,40,+65,32,58,49,54,49,50,32,40,40,83,32,40,85,32,40,40,40,110,111,+77,97,116,99,104,32,34,46,47,108,105,98,47,84,101,120,116,47,83,116,+114,105,110,103,46,104,115,34,41,32,35,54,54,41,32,35,49,41,41,41,+32,40,40,40,67,39,32,40,67,39,32,67,41,41,32,40,40,40,67,39,+32,40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,40,67,39,32,+40,67,39,32,40,67,39,32,66,41,41,41,32,40,40,40,67,39,32,40,+67,39,32,66,41,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,+40,40,67,32,40,95,50,48,50,32,95,49,51,49,41,41,32,35,52,53,+41,41,41,32,85,41,41,32,40,40,66,32,40,66,32,40,95,50,54,49,+32,40,95,52,56,50,32,40,95,53,49,57,32,95,51,48,57,41,41,41,+41,41,32,85,41,41,41,32,40,40,66,32,40,67,32,40,95,52,50,54,+32,95,49,52,49,41,41,41,32,40,40,40,67,39,32,66,41,32,40,40,+66,32,67,41,32,40,40,40,83,39,32,83,41,32,40,40,66,32,40,40,+67,39,32,83,39,41,32,83,41,41,32,40,40,66,32,40,66,32,40,40,+67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,32,61,61,+41,32,35,52,54,41,41,41,41,41,32,40,40,66,32,40,66,32,40,67,+32,40,95,52,50,54,32,95,49,52,49,41,41,41,41,32,40,40,40,67,+39,32,66,41,32,40,66,39,32,40,40,66,32,67,41,32,40,40,40,67,+39,32,67,41,32,40,40,66,32,40,40,67,39,32,83,39,41,32,83,41,+41,32,40,66,32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,+32,40,40,40,67,39,32,40,95,50,48,50,32,95,49,51,49,41,41,32,+95,49,52,55,41,32,35,49,48,49,41,41,41,41,41,41,32,73,41,41,+41,41,32,40,40,40,67,39,32,66,41,32,40,95,52,55,57,32,40,95,+53,49,57,32,95,51,48,57,41,41,41,32,40,40,40,83,39,32,40,95,+52,56,49,32,40,95,53,49,57,32,95,51,48,57,41,41,41,32,40,40,+66,32,40,95,53,51,50,32,95,51,49,48,41,41,32,95,51,52,53,41,+41,32,40,40,66,32,40,40,95,50,54,48,32,40,40,67,32,40,40,80,+32,40,95,53,50,48,32,40,40,80,32,95,51,48,57,41,32,95,51,48,+54,41,41,41,32,95,50,55,56,41,41,32,95,50,56,50,41,41,32,40,+40,95,52,56,53,32,40,95,53,49,57,32,95,51,48,57,41,41,32,40,+95,51,53,57,32,35,49,48,41,41,41,41,32,40,40,66,32,40,95,50,+54,49,32,40,95,52,56,50,32,95,50,55,55,41,41,41,32,95,52,49,+49,41,41,41,41,41,41,41,41,41,32,40,40,40,67,39,32,67,41,32,+40,40,66,32,40,40,67,39,32,83,39,41,32,83,41,41,32,40,66,32,+40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,40,67,+39,32,40,95,50,48,50,32,95,49,51,49,41,41,32,95,49,52,55,41,+32,35,49,48,49,41,41,41,41,41,41,32,73,41,41,41,41,32,40,40,+66,32,40,95,53,51,50,32,95,51,49,48,41,41,32,95,51,52,53,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,+32,61,61,41,32,35,52,51,41,41,41,41,41,32,40,40,67,39,32,66,+41,32,40,95,52,56,49,32,40,95,53,49,57,32,95,51,48,57,41,41,+41,41,41,41,32,40,40,40,83,39,32,40,83,39,32,83,41,41,32,40,+40,66,32,40,66,32,40,67,32,83,41,41,41,32,40,40,66,32,40,66,+32,40,40,67,39,32,40,67,39,32,66,41,41,32,40,67,32,40,40,67,+32,61,61,41,32,35,52,53,41,41,41,41,41,32,40,40,67,39,32,66,+41,32,40,95,50,53,52,32,40,95,53,50,48,32,40,40,80,32,95,51,+48,57,41,32,95,51,48,54,41,41,41,41,41,41,41,32,40,40,67,39,+32,66,41,32,40,95,52,56,49,32,40,95,53,49,57,32,95,51,48,57,+41,41,41,41,41,41,41,32,40,40,66,32,40,40,95,51,56,52,32,40,+40,67,32,40,40,80,32,40,95,53,49,57,32,95,51,48,57,41,41,32,+95,51,48,57,41,41,32,95,51,48,54,41,41,32,40,40,95,52,56,53,+32,40,95,53,49,57,32,95,51,48,57,41,41,32,40,95,51,53,57,32,+35,49,48,41,41,41,41,32,95,51,52,53,41,41,41,41,32,40,40,65,+32,58,49,54,49,51,32,95,49,52,48,52,41,32,95,57,56,57,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,+41,41,41,41,41,41,41,41,41,41,41,41,+};+unsigned char *combexpr = data;+int combexprlen = 281032;
+ ghc/Compat.hs view
@@ -0,0 +1,153 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+-- Functions for GHC that are defined in the UHS libs.+module Compat(module Compat) where+--import Control.Exception+import Data.Char+import Data.Maybe+import Data.Time+import Data.Time.Clock.POSIX+--import qualified Control.Monad as M+import Control.Exception+import Data.List+import System.Environment+import System.IO++------- Int --------++_integerToInt :: Integer -> Int+_integerToInt = fromInteger++_integerToDouble :: Integer -> Double+_integerToDouble = fromIntegral++-- Same as in Data.Integer+_integerToIntList :: Integer -> [Int]+_integerToIntList i | i < 0 = -1 : to (-i)+                    | otherwise =  to i+  where to 0 = []+        to n = fromInteger r : to q  where (q, r) = quotRem n 2147483648++------- List --------++elemBy :: (a -> a -> Bool) -> a -> [a] -> Bool+elemBy eq a = any (eq a)++-- A simple "quicksort" for now.+sortLE :: forall a . (a -> a -> Bool) -> [a] -> [a]+sortLE _  [] = []+sortLE le (x:xs) = sortLE le lt ++ (x : sortLE le ge)+  where (ge, lt) = partition (le x) xs++showListS :: (a -> String) -> [a] -> String+showListS sa arg =+  let+    showRest as =+      case as of+        [] -> "]"+        x : xs -> "," ++ sa x ++ showRest xs+  in+    case arg of+      [] -> "[]"+      a : as -> "[" ++ sa a ++ showRest as++anySame :: (Eq a) => [a] -> Bool+anySame = anySameBy (==)++anySameBy :: (a -> a -> Bool) -> [a] -> Bool+anySameBy _ [] = False+anySameBy eq (x:xs) = elemBy eq x xs || anySameBy eq xs++deleteAllBy :: forall a . (a -> a -> Bool) -> a -> [a] -> [a]+deleteAllBy _ _ [] = []+deleteAllBy eq x (y:ys) = if eq x y then deleteAllBy eq x ys else y : deleteAllBy eq x ys++deleteAllsBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+deleteAllsBy eq = foldl (flip (deleteAllBy eq))++padLeft :: Int -> String -> String+padLeft n s = replicate (n - length s) ' ' ++ s++------- Exception --------++newtype Exn = Exn String+  deriving (Show)+instance Exception Exn++------- IO --------++openFileM :: FilePath -> IOMode -> IO (Maybe Handle)+openFileM path m = do+  r <- (try $ openFile path m) :: IO (Either IOError Handle)+  case r of+    Left _ -> return Nothing+    Right h -> return (Just h)++getTimeMilli :: IO Int+getTimeMilli  = floor . (1000 *) . nominalDiffTimeToSeconds . utcTimeToPOSIXSeconds <$> getCurrentTime++-- A hack until we have a real withArgs+withDropArgs :: Int -> IO a -> IO a+withDropArgs i ioa = do+  as <- getArgs+  withArgs (drop i as) ioa++------- Read --------++readInteger :: String -> Integer+readInteger = read++-- Convert string in scientific notation to a rational number.+readRational :: String -> Rational+readRational "" = undefined+readRational acs@(sgn:as) | sgn == '-' = negate $ rat1 as+                          | otherwise  =          rat1 acs+  where+    rat1 s1 =+      case span isDigit s1 of+        (ds1, cr1) | ('.':r1) <- cr1                   -> rat2 f1 r1+                   | (c:r1)   <- cr1, toLower c == 'e' -> rat3 f1 r1+                   | otherwise                         -> f1+          where f1 = toRational (readInteger ds1)++    rat2 f1 s2 =+      case span isDigit s2 of+        (ds2, cr2) | (c:r2) <- cr2, toLower c == 'e' -> rat3 f2 r2+                   | otherwise                       -> f2+          where f2 = f1 + toRational (readInteger ds2) * 10 ^^ (negate $ length ds2)++    rat3 f2 ('+':s) = f2 * expo s+    rat3 f2 ('-':s) = f2 / expo s+    rat3 f2      s  = f2 * expo s++    expo s = 10 ^ readInteger s++partitionM :: Monad m => (a -> m Bool) -> [a] -> m ([a], [a])+partitionM _ [] = return ([], [])+partitionM p (x:xs) = do+  b <- p x+  (ts,fs) <- partitionM p xs+  return $ if b then (x:ts, fs) else (ts, x:fs)++substString :: forall a . Eq a => [a] -> [a] -> [a] -> [a]+substString _ _ [] = []+substString from to xs@(c:cs) | Just rs <- stripPrefix from xs = to ++ substString from to rs+                              | otherwise = c : substString from to cs++openTmpFile :: String -> IO (String, Handle)+openTmpFile tmplt = do+  mtmp <- lookupEnv "TMPDIR"+  let tmp = fromMaybe "/tmp" mtmp+  res <- try $ openTempFile tmp tmplt+  case res of+    Right x -> return x+    Left (_::SomeException) -> openTempFile "" tmplt++hSerialize :: Handle -> a -> IO ()+hSerialize _ _ = error "ghc: hSerialize"++hDeserialize :: Handle -> IO a+hDeserialize _ = error "ghc: hDeserialize"++usingMhs :: Bool+usingMhs = False
+ ghc/Control/Alternative.hs view
@@ -0,0 +1,6 @@+module Control.Alternative(+  Alternative(..),+  guard,+  ) where+import Control.Applicative+import Control.Monad
+ ghc/Data/Double.hs view
@@ -0,0 +1,1 @@+module Data.Double(Double) where
+ ghc/PrimTable.hs view
@@ -0,0 +1,91 @@+module PrimTable(module PrimTable) where+import Data.Char+import Data.Maybe+import System.IO+import Unsafe.Coerce+import GHC.Types(Any)++primitive :: String -> Any+primitive s = fromMaybe (error $ "primitive: " ++ s) $ lookup s primOps++newtype DIO a = DIO { unDIO :: IO a }++primOps :: [(String, Any)]+primOps =+  [ comb "S" (\ f g x -> f x (g x))+  , comb "S'" (\ k f g x -> k f x (g x))+  , comb "K" (\ x _y -> x)+  , comb "A" (\ _x y -> y)+  , comb "T" (\ x y -> y x)+  , comb "I" (\ x -> x)+  , comb "Y" (\ f -> let r = f r in r)+  , comb "B" (\ f g x -> f (g x))+  , comb "B'" (\ k f g x -> k f (g x))+  , comb "BK" (\ f g _x -> f g)+  , comb "C" (\ f g x -> f x g)+  , comb "C'" (\ k f g x -> k f x g)+  , comb "P" (\ x y f -> f x y)+  , comb "O" (\ x y _g f -> f x y)++  , arith "+" (+)+  , arith "-" (-)+  , arith "*" (*)+  , arith "quot" quot+  , arith "rem" rem+  , arith "subtract" subtract+  , farith "fadd" (+)+  , farith "fsub" (-)+  , farith "fmul" (*)+  , cmp "feq" (==)+  , cmp "fne" (/=)+  , cmp "flt" (<)+  , cmp "fle" (<=)+  , cmp "fgt" (>)+  , cmp "fge" (>=)+  , comb "fshow" (show :: Double -> String)+  , cmp "==" (==)+  , cmp "/=" (/=)+  , cmp "<"  (<)+  , cmp "<=" (<=)+  , cmp ">"  (>)+  , cmp ">=" (>=)+  , cmp "error" err+  , comb "ord" ord+  , comb "chr" chr+  , comb "IO.>>=" iobind+  , comb "IO.>>" iothen+  , comb "IO.return" ioret+--  , comb "IO.getChar" getc+  , comb "IO.putChar" putc+  , comb "IO.stdin" stdin+  , comb "IO.stdout" stdout+  , comb "IO.stderr" stderr+  ]+  where+    comb n f = (n, unsafeCoerce f)+    arith :: String -> (Int -> Int -> Int) -> (String, Any)+    arith = comb+    farith :: String -> (Double -> Double -> Double) -> (String, Any)+    farith = comb+    cmp :: String -> (Int -> Int -> Bool) -> (String, Any)+    cmp n f = comb n (\ x y -> if f x y then cTrue else cFalse)+    cTrue _x y = y+    cFalse x _y = x+    iobind :: DIO a -> (a -> DIO b) -> DIO b+    iobind a k = DIO (unDIO a >>= \ x -> unDIO (k x))+    iothen :: DIO a -> DIO b -> DIO b+    iothen a b = DIO (unDIO a >> unDIO b)+    ioret :: a -> DIO a+    ioret a = DIO (return a)+--    getc h = undefined -- fromEnum <$> hGetChar h  -- XXX+    putc :: Handle -> Int -> DIO ()+    putc h c = DIO $ do+--      let h = unsafeCoerce hh :: Handle+--          c = unsafeCoerce cc :: Int+--      print (h, c)+      hPutChar h (toEnum c)+--    open = undefined+--    close = undefined+--    isnull = undefined++    err _ = error "ERROR"
+ ghc/System/Console/SimpleReadline.hs view
@@ -0,0 +1,10 @@+module System.Console.SimpleReadline(+  getInputLine,+  getInputLineHist+  ) where++getInputLine :: String -> IO (Maybe String)+getInputLine _ = error "No getInputLine for ghc"++getInputLineHist :: FilePath -> String -> IO (Maybe String)+getInputLineHist _ _ = error "No getInputLineHist for ghc"
+ lib/Control/Alternative.hs view
@@ -0,0 +1,21 @@+module Control.Alternative(module Control.Alternative) where+import Primitives+import Control.Applicative+import Data.Bool_Type+import Data.Functor+import Data.List++infixl 3 <|>++class Applicative f => Alternative (f :: Type -> Type) where+    empty :: forall a . f a+    (<|>) :: forall a . f a -> f a -> f a++    some :: forall a . f a -> f [a]+    some a = (:) <$> a <*> many a++    many :: forall a . f a -> f [a]+    many a = some a <|> pure []++guard :: forall (f :: Type -> Type) a . Alternative f => Bool -> f ()+guard b = if b then pure () else empty
+ lib/Control/Applicative.hs view
@@ -0,0 +1,16 @@+module Control.Applicative(module Control.Applicative) where+import Primitives  -- for fixity+import Data.Functor+import Data.Function++infixl 4 <*>+infixl 4 *>+infixl 4 <*++class Functor f => Applicative (f :: Type -> Type) where+  pure  :: forall a . a -> f a+  (<*>) :: forall a b . f (a -> b) -> f a -> f b+  (*>)  :: forall a b . f a -> f b -> f b+  (<*)  :: forall a b . f a -> f b -> f a+  a1 *> a2 = (id <$ a1) <*> a2+  a1 <* a2 = (const <$> a1) <*> a2
+ lib/Control/DeepSeq.hs view
@@ -0,0 +1,12 @@+module Control.DeepSeq(module Control.DeepSeq) where+import Primitives+import Prelude++rnf :: forall a . a -> ()+rnf = primRnfErr++deepseq :: forall a b . a -> b -> b+deepseq a b = rnf a `seq` b++force :: forall a . a -> a+force x = rnf x `seq` x
+ lib/Control/Error.hs view
@@ -0,0 +1,11 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Control.Error(module Control.Error) where+import Primitives+import Data.Char_Type++error :: forall a . String -> a+error = primError++undefined :: forall a . a+undefined = error "undefined"
+ lib/Control/Exception.hs view
@@ -0,0 +1,20 @@+module Control.Exception(+  catch, try,+  throwIO,+  Exn(..)+  ) where+import Primitives+import Prelude++newtype Exn = Exn String++catch :: forall a . IO a -> (Exn -> IO a) -> IO a+catch ioa hdl = primCatch ioa (hdl . Exn)++try :: forall a . IO a -> IO (Either Exn a)+try ioa = catch (fmap Right ioa) (return . Left)++throwIO :: forall a . Exn -> IO a+throwIO (Exn s) =+  let e = error s+  in  seq e (return e)
+ lib/Control/Monad.hs view
@@ -0,0 +1,114 @@+module Control.Monad(module Control.Monad) where+import Primitives  -- for fixity+import Control.Applicative+import Control.Error+import Data.Bool+import Data.Char_Type+import Data.Function+import Data.Functor+import Data.List_Type+--import Data.Maybe++infixl 1 >>+infixl 1 >>=++class (Applicative m) => Monad (m :: Type -> Type) where+  (>>=)  :: forall a b . m a -> (a -> m b) -> m b+  (>>)   :: forall a b . m a -> m b -> m b+  ma >> mb = ma >>= \ _ -> mb++  -- Maybe remove this+  return :: forall a . a -> m a+  return = pure++ap :: forall (m :: Type -> Type) a b . Monad m => m (a -> b) -> m a -> m b+ap f a = do+  f' <- f+  a' <- a+  return (f' a')++class Monad m => MonadFail (m :: Type -> Type) where+  fail :: forall a . String -> m a+  fail = error++mapM :: forall (m :: Type -> Type) a b . Monad m => (a -> m b) -> [a] -> m [b]+mapM f =+  let+    rec arg =+      case arg of+        [] -> return []+        a : as -> do+          b <- f a+          bs <- rec as+          return (b : bs)+  in rec++mapM_ :: forall (m :: Type -> Type) a b . Monad m => (a -> m b) -> [a] -> m ()+mapM_ f =+  let+    rec arg =+      case arg of+        [] -> return ()+        a : as -> do+          _ <- f a+          rec as+  in rec++when :: forall (m :: Type -> Type) . Monad m => Bool -> m () -> m ()+when False _ = return ()+when True ma = ma++sequence :: forall (m :: Type -> Type) a . Monad m => [m a] -> m [a]+sequence = mapM id++(=<<) :: forall (m :: Type -> Type) a b . Monad m => (a -> m b) -> m a -> m b+(=<<) = flip (>>=)++infixr 1 <=<+(<=<) :: forall (m :: Type -> Type) a b c . Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)+f <=< g = \ a -> do+  b <- g a+  f b++infixr 1 >=>+(>=>) :: forall (m :: Type -> Type) a b c . Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)+(>=>) = flip (<=<)++filterM :: forall (m :: Type -> Type) a . Monad m => (a -> m Bool) -> [a] -> m [a]+filterM _ [] = return []+filterM p (x:xs) = do+  b <- p x+  ts <- filterM p xs+  return $ if b then x : ts else ts++partitionM :: forall (m :: Type -> Type) a . Monad m => (a -> m Bool) -> [a] -> m ([a], [a])+partitionM _ [] = return ([], [])+partitionM p (x:xs) = do+  b <- p x+  (ts,fs) <- partitionM p xs+  return $ if b then (x:ts, fs) else (ts, x:fs)++instance forall a . Functor ((->) a) where+  fmap = (.)++instance forall a . Applicative ((->) a) where+  pure = const+  f <*> g = \ a -> f a (g a)++instance forall a . Monad ((->) a) where+  x >>= y = \ z -> y (x z) z++{-+-- Same for Maybe+instance Functor Maybe where+  fmap _ Nothing = Nothing+  fmap f (Just a) = Just (f a)++instance Applicative Maybe where+  pure a = Just a+  (<*>) = ap++instance Monad Maybe where+  Nothing >>= _ = Nothing+  Just a  >>= f = f a+-}
+ lib/Control/Monad/State/Strict.hs view
@@ -0,0 +1,110 @@+{-# LANGUAGE QualifiedDo #-}+module Control.Monad.State.Strict(+  module Control.Monad.State.Strict,+  module Control.Monad,+  ) where+import Prelude+import Control.Monad++data State s a = S (s -> (a, s))++instance forall s . Functor (State s) where+  fmap f sa = S $ \ s ->+    case runState sa s of+      (a, ss) -> (f a, ss)++instance forall s . Applicative (State s) where+  pure a = S $ \ s -> (a, s)+  (<*>) = ap+  (*>) m k = S $ \ s ->+    case runState m s of+      (_, ss) -> runState k ss++instance forall s . Monad (State s) where+  (>>=) m k = S $ \ s ->+    case runState m s of+      (a, ss) -> runState (k a) ss+  (>>) = (*>)+  return = pure++runState :: forall s a . State s a -> (s -> (a,s))+runState (S x) = x++evalState :: forall s a . State s a -> (s -> a)+evalState sa = fst . runState sa++{-+(>>=) :: forall s a b . State s a -> (a -> State s b) -> State s b+(>>=) m k = S $ \ s ->+  case runState m s of+    (a, ss) -> runState (k a) ss++(>>) :: forall s a b . State s a -> State s b -> State s b+(>>) m k = S $ \ s ->+  case runState m s of+    (_, ss) -> runState k ss++return :: forall s a . a -> State s a+return a = S $ \ s -> (a, s)++fmap :: forall s a b . (a -> b) -> State s a -> State s b+fmap f sa = S $ \ s ->+  case runState sa s of+    (a, ss) -> (f a, ss)++(<$>) :: forall s a b . (a -> b) -> State s a -> State s b+(<$>) = Control.Monad.State.Strict.fmap++(<*>) :: forall s a b . State s (a -> b) -> State s a -> State s b+(<*>) sf sa = Control.Monad.State.Strict.do+  f <- sf+  a <- sa+  Control.Monad.State.Strict.return (f a)+-}++modify :: forall s . (s -> s) -> State s ()+modify f = S $ \ s -> ((), f s)++put :: forall s . s -> State s ()+put s = S $ \ _ -> ((), s)++get :: forall s . State s s+get = S $ \ s -> (s, s)++gets :: forall s a . (s -> a) -> State s a+gets f = S $ \ s -> (f s, s)++{-+mapM :: forall s a b . (a -> State s b) -> [a] -> State s [b]+mapM f =+  let+    rec arg =+      case arg of+        [] -> Control.Monad.State.Strict.return []+        a : as -> Control.Monad.State.Strict.do+          b <- f a+          bs <- rec as+          Control.Monad.State.Strict.return (b : bs)+  in rec++mapM_ :: forall s a b . (a -> State s b) -> [a] -> State s ()+mapM_ f =+  let+    rec arg =+      case arg of+        [] -> Control.Monad.State.Strict.return ()+        a : as -> Control.Monad.State.Strict.do+          f a+          rec as+  in rec++fail :: forall s a . String -> State s a+fail = error++when :: forall s . Bool -> State s () -> State s ()+when True  s = s+when False _ = Control.Monad.State.Strict.return ()++sequence :: forall s a . [State s a] -> State s [a]+sequence = Control.Monad.State.Strict.mapM id+-}
+ lib/Data/Bits.hs view
@@ -0,0 +1,93 @@+module Data.Bits(module Data.Bits) where+import Primitives+import Control.Error+import Data.Bool+import Data.Eq+import Data.Int()+import Data.Maybe+import Data.Ord+import Data.Num++infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`+infixl 7 .&.+infixl 6 `xor`+infixl 5 .|.++class Eq a => Bits a where+  (.&.)             :: a -> a -> a+  (.|.)             :: a -> a -> a+  xor               :: a -> a -> a+  complement        :: a -> a+  shift             :: a -> Int -> a+  rotate            :: a -> Int -> a+  zeroBits          :: a+  bit               :: Int -> a+  setBit            :: a -> Int -> a+  clearBit          :: a -> Int -> a+  complementBit     :: a -> Int -> a+  testBit           :: a -> Int -> Bool+  shiftL            :: a -> Int -> a+  unsafeShiftL      :: a -> Int -> a+  shiftR            :: a -> Int -> a+  unsafeShiftR      :: a -> Int -> a+  rotateL           :: a -> Int -> a+  rotateR           :: a -> Int -> a+  popCount          :: a -> Int+  bitSizeMaybe      :: a -> Maybe Int+  bitSize           :: a -> Int++  x `shift`   i | i<0       = x `shiftR` (negate i)+                | i>0       = x `shiftL` i+                | otherwise = x+++  x `rotate`  i | i<0       = x `rotateR` (negate i)+                | i>0       = x `rotateL` i+                | otherwise = x++  {-+  x `rotate`  i | i<0 && isSigned x && x<0+                       = let left = i+bitSize x in+                         ((x `shift` i) .&. complement ((-1) `shift` left))+                         .|. (x `shift` left)+                | i<0  = (x `shift` i) .|. (x `shift` (i+bitSize x))+                | i==0 = x+                | i>0  = (x `shift` i) .|. (x `shift` (i-bitSize x))+  -}++  zeroBits            = clearBit (bit 0) 0+  bitSize b           = fromMaybe (error "bitSize is undefined") (bitSizeMaybe b)+  x `setBit` i        = x .|. bit i+  x `clearBit` i      = x .&. complement (bit i)+  x `complementBit` i = x `xor` bit i++  x `shiftL`  i       = x `shift`  i+  x `unsafeShiftL` i  = x `shiftL` i+  x `shiftR`  i       = x `shift`  (negate i)+  x `unsafeShiftR` i  = x `shiftR` i++  x `rotateL` i       = x `rotate` i++  x `rotateR` i       = x `rotate` (negate i)+++class Bits b => FiniteBits b where+  finiteBitSize :: b -> Int+  countLeadingZeros :: b -> Int+  countTrailingZeros :: b -> Int++  countLeadingZeros x = (w - 1) - go (w - 1)+    where+      go i | i < 0       = i -- no bit set+           | testBit x i = i+           | otherwise   = go (i - 1)++      w = finiteBitSize x++  countTrailingZeros x = go 0+    where+      go i | i >= w      = i+           | testBit x i = i+           | otherwise   = go (i + 1)++      w = finiteBitSize x
+ lib/Data/Bool.hs view
@@ -0,0 +1,40 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Bool(+  module Data.Bool,+  module Data.Bool_Type+  ) where+import Primitives+import Data.Bool_Type+import Data.Bounded+import Data.Eq+import Text.Show++instance Eq Bool where+  False == x  =  not x+  True  == x  =  x++instance Show Bool where+  showsPrec _ False = showString "False"+  showsPrec _ True  = showString "True"++instance Bounded Bool where+  minBound = False+  maxBound = True++infixr 2 ||+(||) :: Bool -> Bool -> Bool+(||) False y = y+(||) True  _ = True++infixr 3 &&+(&&) :: Bool -> Bool -> Bool+(&&) False _ = False+(&&) True  y = y++not :: Bool -> Bool+not False = True+not True  = False++otherwise :: Bool+otherwise = True
+ lib/Data/Bool_Type.hs view
@@ -0,0 +1,4 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Bool_Type(module Data.Bool_Type) where+data Bool = False | True
+ lib/Data/Bounded.hs view
@@ -0,0 +1,6 @@+module Data.Bounded(module Data.Bounded) where+import Primitives++class Bounded a where+  minBound :: a+  maxBound :: a
+ lib/Data/Char.hs view
@@ -0,0 +1,107 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Char(+  module Data.Char,+  module Data.Char_Type   -- exports Char and String+  ) where+import Primitives+import Control.Error+import Data.Bool+import Data.Bounded+import Data.Char_Type+import Data.Eq+import Data.Function+import Data.Int+import Data.List_Type+import Data.Num+import Data.Ord+import Text.Show++instance Eq Char where+  (==) = primCharEQ+  (/=) = primCharNE++instance Ord Char where+  compare = primCompare+  (<)  = primCharLT+  (<=) = primCharLE+  (>)  = primCharGT+  (>=) = primCharGE++instance Eq String where+  (==) = primStringEQ++instance Ord String where+  compare = primCompare+  x <  y  =  primCompare x y == LT+  x <= y  =  primCompare x y /= GT+  x >  y  =  primCompare x y == GT+  x >= y  =  primCompare x y /= LT++-- ASCII only for now+instance Bounded Char where+  minBound = chr 0+  maxBound = chr 127++chr :: Int -> Char+chr = primChr++ord :: Char -> Int+ord = primOrd++isLower :: Char -> Bool+isLower c = (primCharLE 'a' c) && (primCharLE c 'z')++isUpper :: Char -> Bool+isUpper c = (primCharLE 'A' c) && (primCharLE c 'Z')++isAlpha :: Char -> Bool+isAlpha c = isLower c || isUpper c++isDigit :: Char -> Bool+isDigit c = (primCharLE '0' c) && (primCharLE c '9')++isHexDigit :: Char -> Bool+isHexDigit c = isDigit c || (primCharLE 'a' c && primCharLE c 'f') || (primCharLE 'F' c && primCharLE c 'F') ++isAlphaNum :: Char -> Bool+isAlphaNum c = isAlpha c || isDigit c++isPrint :: Char -> Bool+isPrint c = primCharLE ' ' c && primCharLE c '~'++isSpace :: Char -> Bool+isSpace c = c == ' ' || c == '\t' || c == '\n'++digitToInt :: Char -> Int+digitToInt c | (primCharLE '0' c) && (primCharLE c '9') = ord c - ord '0'+             | (primCharLE 'a' c) && (primCharLE c 'f') = ord c - (ord 'a' - 10)+             | (primCharLE 'A' c) && (primCharLE c 'F') = ord c - (ord 'A' - 10)+             | otherwise                                = error "digitToInt"++toLower :: Char -> Char+toLower c | primCharLE 'A' c && primCharLE c 'Z' = chr (ord c - ord 'A' + ord 'a')+          | True = c++toUpper :: Char -> Char+toUpper c | primCharLE 'a' c && primCharLE c 'a' = chr (ord c - ord 'a' + ord 'A')+          | True = c++instance Show Char where+  showsPrec _ '\'' = showString "'\\''"+  showsPrec _ c = showChar '\'' . showString (encodeChar c) . showChar '\''+  showList    s = showChar '"'  . f s+    where f [] = showChar '"'+          f (c:cs) =+            if c == '"' then showString "\\\"" . f cs+            else showString (encodeChar c) . f cs++-- XXX should not export this+encodeChar :: Char -> String+encodeChar c =+  let+    spec = [('\n', "\\n"), ('\r', "\\r"), ('\t', "\\t"), ('\b', "\\b"),+            ('\\', "\\\\")]+    look [] = if isPrint c then [c] else "'\\" ++ show (ord c) ++ "'"+    look ((d,s):xs) = if d == c then s else look xs+  in look spec
+ lib/Data/Char_Type.hs view
@@ -0,0 +1,5 @@+module Data.Char_Type(Char, String) where+import Primitives+import Data.List_Type++type String = [Char]
+ lib/Data/Complex.hs view
@@ -0,0 +1,137 @@+module Data.Complex(module Data.Complex) where+import Prelude++infix 6 :+++data Complex a = !a :+ !a++instance forall a . Eq a => Eq (Complex a) where+  (:+) x y == (:+) x' y'  =  x == x' && y == y'   -- parser bug++instance forall a . Show a => Show (Complex a) where+  show (x :+ y) = show x ++ " :+ " ++ show y++realPart :: forall a . Complex a -> a+realPart (x :+ _) =  x++imagPart :: forall a . Complex a -> a+imagPart (_ :+ y) =  y++conjugate        :: forall a . Num a => Complex a -> Complex a+conjugate (x:+y) =  x :+ (negate y)++mkPolar          :: forall a . Floating a => a -> a -> Complex a+mkPolar r theta  =  r * cos theta :+ r * sin theta++cis              :: forall a . Floating a => a -> Complex a+cis theta        =  cos theta :+ sin theta++polar            :: forall a . (RealFloat a) => Complex a -> (a,a)+polar z          =  (magnitude z, phase z)++magnitude :: forall a . (RealFloat a) => Complex a -> a+magnitude (x:+y) = sqrt (x*x + y*y)+{-+                   scaleFloat k+                     (sqrt (sqr (scaleFloat mk x) + sqr (scaleFloat mk y)))+                    where k  = max (exponent x) (exponent y)+                          mk = negate k+                          sqr z = z * z+-}++phase :: forall a . (RealFloat a) => Complex a -> a+-- XXX phase (0 :+ 0)   = 0+phase (x:+y) | x==0 && y==0 = 0+             | otherwise    = atan2 y x+++instance forall a . (RealFloat a) => Num (Complex a)  where+    (x:+y) + (x':+y')   =  (x+x') :+ (y+y')+    (x:+y) - (x':+y')   =  (x-x') :+ (y-y')+    (x:+y) * (x':+y')   =  (x*x'-y*y') :+ (x*y'+y*x')+    negate (x:+y)       =  negate x :+ negate y+    abs z               =  magnitude z :+ 0+--    signum (0:+0)       =  0+    signum z@(x:+y) | x==0 && y==0 = 0+                    | otherwise    =  x/r :+ y/r  where r = magnitude z+    fromInteger n       =  fromInteger n :+ 0++instance forall a . (RealFloat a) => Fractional (Complex a)  where+    (x:+y) / (x':+y')   =  (x*x''+y*y'') / d :+ (y*x''-x*y'') / d+                           where x'' = scaleFloat k x'+                                 y'' = scaleFloat k y'+                                 k   = negate $ max (exponent x') (exponent y')+                                 d   = x'*x'' + y'*y''++    fromRational a      =  fromRational a :+ 0++instance forall a . (RealFloat a) => Floating (Complex a) where+    pi             =  pi :+ 0+    exp (x:+y)     =  expx * cos y :+ expx * sin y+                      where expx = exp x+    log z          =  log (magnitude z) :+ phase z+{-+    x ** y = case (x,y) of+ {- XXX+     (_ , (0:+0))  -> 1 :+ 0+      ((0:+0), (exp_re:+_)) -> case compare exp_re 0 of+                 GT -> 0 :+ 0+                 LT -> inf :+ 0+                 EQ -> nan :+ nan+-}+      ((re:+im), (exp_re:+_))+        | (isInfinite re || isInfinite im) -> case compare exp_re 0 of+                 GT -> inf :+ 0+                 LT -> 0 :+ 0+                 EQ -> nan :+ nan+        | otherwise -> exp (log x * y)+     where+        inf = 1/0+        nan = 0/0+-}+    sqrt z@(x:+y) | x==0 && y==0 = 0+                  | otherwise    =  u :+ (if y < 0 then negate v else v)+                      where (u,v) = if x < 0 then (v',u') else (u',v')+                            v'    = abs y / (u'*2)+                            u'    = sqrt ((magnitude z + abs x) / 2)++    sin (x:+y)     =  sin x * cosh y :+ cos x * sinh y+    cos (x:+y)     =  cos x * cosh y :+ (negate (sin x) * sinh y)+    tan (x:+y)     =  (sinx*coshy:+cosx*sinhy)/(cosx*coshy:+(negate sinx*sinhy))+                      where sinx  = sin x+                            cosx  = cos x+                            sinhy = sinh y+                            coshy = cosh y++    sinh (x:+y)    =  cos y * sinh x :+ sin  y * cosh x+    cosh (x:+y)    =  cos y * cosh x :+ sin y * sinh x+    tanh (x:+y)    =  (cosy*sinhx:+siny*coshx)/(cosy*coshx:+siny*sinhx)+                      where siny  = sin y+                            cosy  = cos y+                            sinhx = sinh x+                            coshx = cosh x++    asin z@(x:+y)  =  y':+(negate x')+                      where  (x':+y') = log (((negate y):+x) + sqrt (1 - z*z))+    acos z         =  y'':+(negate x'')+                      where (x'':+y'') = log (z + ((negate y'):+x'))+                            (x':+y')   = sqrt (1 - z*z)+    atan z@(x:+y)  =  y':+(negate x')+                      where (x':+y') = log (((1 - y):+x) / sqrt (1+z*z))++    asinh z        =  log (z + sqrt (1+z*z))++    acosh z        =  log (z + (sqrt $ z+1) * (sqrt $ z - 1))+    atanh z        =  0.5 * log ((1.0+z) / (1.0-z))++    log1p x@(a :+ b)+      | abs a < 0.5 && abs b < 0.5+      , u <- 2*a + a*a + b*b = log1p (u/(1 + sqrt(u+1))) :+ atan2 (1 + a) b+      | otherwise = log (1 + x)++    expm1 x@(a :+ b)+      | a*a + b*b < 1+      , u <- expm1 a+      , v <- sin (b/2)+      , w <- -2*v*v = (u*w + u + w) :+ (u+1)*sin b+      | otherwise = exp x - 1
+ lib/Data/Double.hs view
@@ -0,0 +1,144 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Double(Double) where+import Primitives+import Control.Error+import Data.Bits+import Data.Bool+import Data.Eq+import Data.Floating+import Data.Fractional+import Data.Function+import Data.Integer+import Data.Ord+import Data.Ratio+import Data.Real+import Data.RealFloat+import Data.Num+import Data.Word+import Text.Show++instance Num Double where+  (+)  = primDoubleAdd+  (-)  = primDoubleSub+  (*)  = primDoubleMul+  negate = primDoubleNeg+  abs x = if x < 0.0 then negate x else x+  signum x =+    case compare x 0.0 of+      LT -> -1.0+      EQ ->  0.0+      GT ->  1.0+  fromInteger = _integerToDouble++instance Fractional Double where+  (/) = primDoubleDiv+  -- This version of fromRational can go horribly wrong+  -- if the integers are bigger than can be represented in a Double.+  -- It'll do for now.+  fromRational x = fromInteger (numerator x) `primDoubleDiv` fromInteger (denominator x)++instance Eq Double where+  (==) = primDoubleEQ+  (/=) = primDoubleNE++instance Ord Double where+  (<)  = primDoubleLT+  (<=) = primDoubleLE+  (>)  = primDoubleGT+  (>=) = primDoubleGE+  +-- For now, cheat and call C+instance Show Double where+  show = primDoubleShow++instance Real Double where+  toRational x =+    let (m, e) = decodeDouble x+    in  toRational m * 2^^e++instance Floating Double where+  pi     = 3.141592653589793+  log  x = primPerformIO (clog x)+  exp  x = primPerformIO (cexp x)+  sqrt x = primPerformIO (csqrt x)+  sin  x = primPerformIO (csin x)+  cos  x = primPerformIO (ccos x)+  tan  x = primPerformIO (ctan x)+  asin x = primPerformIO (casin x)+  acos x = primPerformIO (cacos x)+  atan x = primPerformIO (catan x)++foreign import ccall "log"  clog  :: Double -> IO Double+foreign import ccall "exp"  cexp  :: Double -> IO Double+foreign import ccall "sqrt" csqrt :: Double -> IO Double+foreign import ccall "sin"  csin  :: Double -> IO Double+foreign import ccall "cos"  ccos  :: Double -> IO Double+foreign import ccall "tan"  ctan  :: Double -> IO Double+foreign import ccall "asin" casin :: Double -> IO Double+foreign import ccall "acos" cacos :: Double -> IO Double+foreign import ccall "atan" catan :: Double -> IO Double++-- Assumes 64 bit floats+instance RealFloat Double where+  floatRadix     _ = 2+  floatDigits    _ = 53+  floatRange     _ = (-1021,1024)+  decodeFloat      = decodeDouble+  encodeFloat      = encodeDouble+  isNaN            = isNaNDouble+  isInfinite       = isInfDouble+  isDenormalized   = isDenDouble+  isNegativeZero   = isNegZeroDouble+  isIEEE         _ = True++decodeDouble :: Double -> (Integer, Int)+decodeDouble x =+  let xw   = primWordFromDoubleRaw x+      sign =  xw .&. 0x8000000000000000+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+      neg  = if sign /= 0 then negate else id+  in  if expn == 0 then+        -- subnormal or 0+        (neg (_wordToInteger mant), 0)+      else if expn == 0x7ff then+        -- infinity or NaN+        (0, 0)+      else+        -- ordinary number, add hidden bit+        -- mant is offset-1023, and assumes scaled mantissa (thus -52)+        (neg (_wordToInteger (mant .|. 0x0010000000000000)),+         primWordToInt expn - 1023 - 52)++isNaNDouble :: Double -> Bool+isNaNDouble x =+  let xw   = primWordFromDoubleRaw x+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+  in  expn == 0x7ff && mant /= 0++isInfDouble :: Double -> Bool+isInfDouble x =+  let xw   = primWordFromDoubleRaw x+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+  in  expn == 0x7ff && mant == 0++isDenDouble :: Double -> Bool+isDenDouble x =+  let xw   = primWordFromDoubleRaw x+      expn = (xw .&. 0x7fffffffffffffff) `shiftR` 52+      mant =  xw .&. 0x000fffffffffffff+  in  expn == 0 && mant /= 0++isNegZeroDouble :: Double -> Bool+isNegZeroDouble x =+  let xw   = primWordFromDoubleRaw x+      sign = xw .&. 0x8000000000000000+      rest = xw .&. 0x7fffffffffffffff+  in  sign /= 0 && rest == 0++-- Simple (and sometimes wrong) encoder+encodeDouble :: Integer -> Int -> Double+encodeDouble mant expn = fromInteger mant * 2^^expn
+ lib/Data/Either.hs view
@@ -0,0 +1,25 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Either(module Data.Either) where+import Primitives+import Data.Bool+import Data.Eq+import Data.Function+import Data.Int+import Data.Ord+import Text.Show++data Either a b = Left a | Right b++instance forall a b . (Eq a, Eq b) => Eq (Either a b) where+  Left  a == Left  a'  =  a == a'+  Right b == Right b'  =  b == b'+  _       == _         =  False++either :: forall a b r . (a -> r) -> (b -> r) -> Either a b -> r+either f _ (Left  a) = f a+either _ f (Right b) = f b++instance forall a b . (Show a, Show b) => Show (Either a b) where+  showsPrec p (Left  a) = showParen (p>=appPrec1) (showString "Left "  . showsPrec appPrec1 a)+  showsPrec p (Right b) = showParen (p>=appPrec1) (showString "Right " . showsPrec appPrec1 b)
+ lib/Data/Enum.hs view
@@ -0,0 +1,70 @@+module Data.Enum(module Data.Enum) where+import Primitives+import Control.Error+import Data.Bool+import Data.Char_Type+import Data.Bounded+import Data.Function+import Data.Int+import Data.List+import Data.Num+import Data.Ord++class Enum a where+  succ           :: a -> a+  pred           :: a -> a+  toEnum         :: Int -> a+  fromEnum       :: a -> Int++  enumFrom       :: a -> [a]+  enumFromThen   :: a -> a -> [a]+  enumFromTo     :: a -> a -> [a]+  enumFromThenTo :: a -> a -> a -> [a]++  succ                   = toEnum . (+ 1) . fromEnum+  pred                   = toEnum . (subtract 1) . fromEnum+  enumFrom x             = map toEnum [fromEnum x ..]+  enumFromThen x y       = map toEnum [fromEnum x, fromEnum y ..]+  enumFromTo x y         = map toEnum [fromEnum x .. fromEnum y]+  enumFromThenTo x1 x2 y = map toEnum [fromEnum x1, fromEnum x2 .. fromEnum y]++boundedEnumFrom :: forall a . (Enum a, Bounded a) => a -> [a]+boundedEnumFrom n = map toEnum [fromEnum n .. fromEnum (maxBound `asTypeOf` n)]++boundedEnumFromThen :: forall a . (Enum a, Bounded a) => a -> a -> [a]+boundedEnumFromThen n1 n2+  | i_n2 >= i_n1  = map toEnum [i_n1, i_n2 .. fromEnum (maxBound `asTypeOf` n1)]+  | otherwise     = map toEnum [i_n1, i_n2 .. fromEnum (minBound `asTypeOf` n1)]+  where+    i_n1 = fromEnum n1+    i_n2 = fromEnum n2++-- This instance is difficult to put in Data.Int,+-- so it gets to live here.+instance Enum Int where+  succ x = x + 1+  pred x = x - 1+  toEnum x = x+  fromEnum x = x+  enumFrom n = n : enumFrom (n+1)+  enumFromThen n m = from n+    where d = m - n+          from i = i : from (i+d)+  enumFromTo l h = takeWhile (<= h) (enumFrom l)+  enumFromThenTo l m h =+    if m > l then+      takeWhile (<= h) (enumFromThen l m)+    else+      takeWhile (>= h) (enumFromThen l m)++-- Likewise for Bool+instance Enum Bool where+  fromEnum False = 0+  fromEnum True  = 1+  toEnum 0 = False+  toEnum 1 = True+  toEnum _ = error "Enum.Bool.toEnum: bad arg"++instance Enum Char where+  fromEnum = primOrd+  toEnum   = primChr
+ lib/Data/Eq.hs view
@@ -0,0 +1,13 @@+module Data.Eq(+  module Data.Eq+  ) where+import Primitives+import Data.Bool_Type++infix 4 ==,/=++class Eq a where+  (==) :: a -> a -> Bool+  (/=) :: a -> a -> Bool+  x /= y = if x == y then False else True+
+ lib/Data/Floating.hs view
@@ -0,0 +1,45 @@+module Data.Floating(module Data.Floating) where+import Primitives+import Data.Fractional+import Data.Num++infixr 8 **++class (Fractional a) => Floating a  where+  pi       :: a+  exp      :: a -> a+  log      :: a -> a+  sqrt     :: a -> a+  (**)     :: a -> a -> a+  logBase  :: a -> a -> a+  sin      :: a -> a+  cos      :: a -> a+  tan      :: a -> a+  asin     :: a -> a+  acos     :: a -> a+  atan     :: a -> a+  sinh     :: a -> a+  cosh     :: a -> a+  tanh     :: a -> a+  asinh    :: a -> a+  acosh    :: a -> a+  atanh    :: a -> a+  log1p    :: a -> a+  expm1    :: a -> a+  log1pexp :: a -> a+  log1mexp :: a -> a++  x ** y              = exp (log x * y)+  logBase x y         = log y / log x+  sqrt x              = x ** (1/2)+  tan  x              = sin  x / cos  x+  sinh x              = (exp x - exp (negate x)) / 2+  cosh x              = (exp x + exp (negate x)) / 2+  tanh x              = sinh x / cosh x+  asinh x             = log (x + sqrt (x*x + 1))+  acosh x             = log (x + sqrt (x*x - 1))+  atanh x             = log ((x + 1) / (x - 1)) / 2+  log1p x             = log (1 + x)+  expm1 x             = exp x - 1+  log1pexp x          = log1p (exp x)+  log1mexp x          = log1p (negate (exp x))
+ lib/Data/Fractional.hs view
@@ -0,0 +1,19 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Fractional(module Data.Fractional) where+import Primitives+import Data.Integral+import Data.Num+import Data.Ord+import Data.Ratio_Type++class Num a => Fractional a where+  (/) :: a -> a -> a+  recip :: a -> a+  fromRational :: Rational -> a++  recip x = 1 / x++infixr 8 ^^+(^^) :: forall a b . (Fractional a, Integral b, Ord b) => a -> b -> a+x ^^ n = if n >= 0 then x^n else recip (x^(negate n))
+ lib/Data/Function.hs view
@@ -0,0 +1,39 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Function(module Data.Function) where+import Primitives+--import Data.Tuple++infixr 0 $+($) :: forall a b . (a -> b) -> a -> b+($) f x = f x++infixr 0 $!+($!) :: forall a b . (a -> b) -> a -> b+($!) f x = x `primSeq` f x++infixr 9 .+(.) :: forall a b c . (b -> c) -> (a -> b) -> (a -> c)+(.) f g x = f (g x)++id :: forall a . a -> a+id x = x++const :: forall a b . a -> b -> a+const x _ = x++flip :: forall a b c . (b -> a -> c) -> a -> b -> c+flip f a b = f b a++fix :: forall a . (a -> a) -> a+fix = primFix++uncurry :: forall a b c . (a -> b -> c) -> (a, b) -> c+uncurry f (a, b) = f a b  -- XXX not lazy++infixl 0 `on`+on :: forall a b c . (a -> a -> b) -> (c -> a) -> (c -> c -> b)+on op sel x y = op (sel x) (sel y)++asTypeOf :: forall a . a -> a -> a+asTypeOf = const
+ lib/Data/Functor.hs view
@@ -0,0 +1,15 @@+module Data.Functor(module Data.Functor) where+import Primitives  -- for fixity+import Data.Function++class Functor (f :: Type -> Type) where+  fmap :: forall a b . (a -> b) -> f a -> f b+  (<$) :: forall a b . a -> f b -> f a+  (<$) =  fmap . const++infixl 4 <$>+(<$>) :: forall (f :: Type -> Type) a b . Functor f => (a -> b) -> f a -> f b+(<$>) = fmap++--void :: forall f a . Functor f => f a -> f ()+--void = fmap (const ())
+ lib/Data/Identity.hs view
@@ -0,0 +1,24 @@+module Data.Identity(Data.Identity) where+import Primitives+import Control.Applicative+import Control.Monad+import Data.Function+import Data.Functor+import Data.Int+import Data.Ord+import Text.Show++newtype Identity a = Identity a++instance Functor Identity where+  fmap f (Identity a) = Identity (f a)++instance Applicative Identity where+  pure a = Identity a+  Identity f <*> Identity a = Identity (f a)++instance Monad Identity where+  Identity a >>= f = f a++instance forall a . (Show a) => Show (Identity a) where+  showsPrec p (Identity a) = showParen (p >= 11) (showString "Identity " . showsPrec 11 a)
+ lib/Data/Int.hs view
@@ -0,0 +1,78 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Int(module Data.Int, Int) where+import Primitives+import Data.Bool_Type+import Data.Bounded+import Data.Char_Type+import Data.Eq+import Data.Integer_Type+import Data.Integral+import Data.List_Type+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import Text.Show++instance Num Int where+  (+)  = primIntAdd+  (-)  = primIntSub+  (*)  = primIntMul+  negate x = primIntNeg x+  abs x = if x < 0 then negate x else x+  signum x =+    case compare x 0 of+      LT -> -1+      EQ ->  0+      GT ->  1+  fromInteger = _integerToInt++instance Integral Int where+  quot = primIntQuot+  rem  = primIntRem+  toInteger = _intToInteger++instance Bounded Int where+  minBound = primWordToInt ((-1::Word) `primWordQuot` 2) + 1+  maxBound = primWordToInt ((-1::Word) `primWordQuot` 2)++instance Real Int where+  toRational i = _integerToRational (_intToInteger i)++--------------------------------++instance Eq Int where+  (==) = primIntEQ+  (/=) = primIntNE++instance Ord Int where+  compare = primCompare+  (<)  = primIntLT+  (<=) = primIntLE+  (>)  = primIntGT+  (>=) = primIntGE++--------------------------------++instance Show Int where+  show = showInt_++-- XXX these should not be exported+showInt_ :: Int -> String+showInt_ n =+  if n < 0 then+    '-' : _showUnsignedNegInt n+  else+    _showUnsignedNegInt (negate n)++-- Some trickery to show minBound correctly.+-- To print the number n, pass -n.+_showUnsignedNegInt :: Int -> String+_showUnsignedNegInt n =+  let+    c = primChr (primOrd '0' - rem n 10)+  in  if n > -10 then+        [c]+      else+        _showUnsignedNegInt (quot n 10) ++ [c]
+ lib/Data/IntMap.hs view
@@ -0,0 +1,96 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.IntMap(+  IntMap,+  empty, lookup, insert, fromList, toList, insertWith, (!), keys+  ) where+import Prelude hiding(lookup)++data IntMap a+  = Empty+  | Leaf Int a+  | Node (IntMap a) (IntMap a) (IntMap a) (IntMap a)+  --Xderiving (Show)++-- This works for y>0+divModX :: Int -> Int -> (Int, Int)+divModX x y =+  let+    q = quot x y+    r = rem x y+  in+    if x >= 0 || r == 0 then+      (q, r)+    else+      (q - 1, r + y)++empty :: forall a . IntMap a+empty = Empty++lookup :: forall a . Int -> IntMap a -> Maybe a+lookup k am =+  case am of+    Empty -> Nothing+    Leaf i a -> if k == i then Just a else Nothing+    Node m0 m1 m2 m3 ->+      let+        (d, m) = divModX k 4+      in      if m == 0 then lookup d m0+         else if m == 1 then lookup d m1+         else if m == 2 then lookup d m2+         else                lookup d m3++insert :: forall a . Int -> a -> IntMap a -> IntMap a+insert = insertWith const++fromList :: forall a . [(Int, a)] -> IntMap a+fromList = foldr (uncurry insert) empty++-- XXX There must be a better way+toList :: forall a . IntMap a -> [(Int, a)]+toList am =+  let+    f o (k, a) = (k*4 + o, a)+  in+    case am of+      Empty -> []+      Leaf l a -> [(l, a)]+      Node m0 m1 m2 m3 ->+        map (f 0) (toList m0) `merge`+        map (f 1) (toList m1) `merge`+        map (f 2) (toList m2) `merge`+        map (f 3) (toList m3)++merge :: forall a . [(Int, a)] -> [(Int, a)] -> [(Int, a)]+merge [] ys = ys+merge xs [] = xs+merge xxs@(xa@(x,_):xs) yys@(yb@(y,b):ys) = if x < y then xa : merge xs yys else yb : merge xxs ys++keys :: forall a . IntMap a -> [Int]+keys = map fst . toList++(!) :: forall a . IntMap a -> Int -> a+(!) m k =+  case lookup k m of+    Just i -> i+    Nothing -> error "Data.IntMap.!"++insertWith :: forall a . (a -> a -> a) -> Int -> a -> IntMap a -> IntMap a+insertWith comb ak a =+  let+    ins k am =+      case am of+        Empty -> Leaf k a+        Leaf i b ->+          if k == i then+            Leaf k (comb a b)+          else+            ins k $ insert i b $ Node Empty Empty Empty Empty+        Node m0 m1 m2 m3 ->+          let+            (d, m) = divModX k 4+          in      if m == 0 then Node (ins d m0) m1 m2 m3+             else if m == 1 then Node m0 (ins d m1) m2 m3+             else if m == 2 then Node m0 m1 (ins d m2) m3+             else                Node m0 m1 m2 (ins d m3)+  in ins ak
+ lib/Data/IntSet.hs view
@@ -0,0 +1,29 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.IntSet(+  IntSet,+  empty, member, insert, fromList, toList+  ) where+import Prelude+import qualified Data.IntMap as M++newtype IntSet = I (M.IntMap ())++empty :: IntSet+empty = I M.empty++member :: Int -> IntSet -> Bool+member k (I m) =+  case M.lookup k m of+    Nothing -> False+    Just _  -> True++insert :: Int -> IntSet -> IntSet+insert k (I m) = I (M.insert k () m)++fromList :: [Int] -> IntSet+fromList is = I (M.fromList (zip is (repeat ())))++toList :: IntSet -> [Int]+toList (I m) = map fst (M.toList m)+
+ lib/Data/Integer.hs view
@@ -0,0 +1,488 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Integer(+  Integer,+  readInteger,+  _intToInteger,+  _integerToInt,+  _wordToInteger,+  _integerToWord,+  _integerToDouble,+  _integerToRational,+  _integerToIntList,+  _intListToInteger,+  ) where+import Primitives+import Control.Error+import Data.Bool+import Data.Char+import Data.Enum+import Data.Eq+import Data.Function+import Data.Int+import Data.Integer_Type+import Data.Integral+import Data.List+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Data.Real+import Text.Show++--+-- The Integer is stored in sign-magniture format with digits in base maxD (2^31)+-- It has the following invariants:+--  * each digit is >= 0 and < maxD+--  * least signification digits first, most significant last+--  * no trailing 0s in the digits+--  * 0 is positive+{- These definitions are in Integer_Type+data Integer = I Sign [Digit]+  --deriving Show++type Digit = Int++maxD :: Digit+maxD = 2147483648  -- 2^31, this is used so multiplication of two digit doesn't overflow a 64 bit Int++data Sign = Plus | Minus+  --deriving Show+-}++instance Eq Integer where+  (==) = eqI+  (/=) = neI++instance Ord Integer where+  (<)  = ltI+  (<=) = leI+  (>)  = gtI+  (>=) = geI++instance Show Integer where+  show i = showInteger i++instance Num Integer where+  (+) = addI+  (-) = subI+  (*) = mulI+  negate = negateI+  abs = absI+  signum x =+    case compare x zeroI of+      LT -> negOneI+      EQ -> zeroI+      GT -> oneI+  fromInteger x = x++instance Integral Integer where+  quotRem = quotRemI+  toInteger x = x++instance Real Integer where+  toRational i = _integerToRational i++instance Enum Integer where+  succ x = x + 1+  pred x = x - 1+  toEnum x = _intToInteger x+  fromEnum x = _integerToInt x+  enumFrom n = n : enumFrom (n+1)+  enumFromThen n m = from n+    where d = m - n+          from i = i : from (i+d)+  enumFromTo l h = takeWhile (<= h) (enumFrom l)+  enumFromThenTo l m h =+    if m > l then+      takeWhile (<= h) (enumFromThen l m)+    else+      takeWhile (>= h) (enumFromThen l m)++------------------------------------------------++isZero :: Integer -> Bool+isZero (I _ ds) = null ds++instance Eq Sign where+  (==) Plus Plus = True+  (==) Minus Minus = True+  (==) _ _ = False++-- Trim off 0s and make an Integer+sI :: Sign -> [Digit] -> Integer+sI s ds =+  case trim0 ds of+    []  -> I Plus []+    ds' -> I s    ds'++zeroD :: Digit+zeroD = 0++addI :: Integer -> Integer -> Integer+addI (I Plus  xs) (I Plus  ys)             =  I Plus  (add xs ys)+addI (I Plus  xs) (I Minus ys) | ltW xs ys = sI Minus (sub ys xs)+                               | True      = sI Plus  (sub xs ys)+addI (I Minus xs) (I Plus  ys) | ltW ys xs = sI Minus (sub xs ys)+                               | True      = sI Plus  (sub ys xs)+addI (I Minus xs) (I Minus ys)             =  I Minus (add xs ys)++negateI :: Integer -> Integer+negateI i@(I _    []) = i+negateI   (I Plus  x) = I Minus x+negateI   (I Minus x) = I Plus  x++absI :: Integer -> Integer+absI (I _ x) = I Plus x++subI :: Integer -> Integer -> Integer+subI x y = addI x (negateI y)++add :: [Digit] -> [Digit] -> [Digit]+add = add' zeroD++add' :: Digit -> [Digit] -> [Digit] -> [Digit]+add' ci (x : xs) (y : ys) = s : add' co xs ys  where (co, s) = addD ci x y+add' ci (x : xs) []       = s : add' co xs []  where (co, s) = addD ci x zeroD+add' ci []       (y : ys) = s : add' co [] ys  where (co, s) = addD ci zeroD y+add' ci []       []       = if ci == zeroD then [] else [ci]++-- Add 3 digits with carry+addD :: Digit -> Digit -> Digit -> (Digit, Digit)+addD x y z = (quot s maxD, rem s maxD)  where s = x + y + z++-- Invariant: xs >= ys, so result is always >= 0+sub :: [Digit] -> [Digit] -> [Digit]+sub xs ys = sub' zeroD xs ys++sub' :: Digit -> [Digit] -> [Digit] -> [Digit]+sub' bi (x : xs) (y : ys) = d : sub' bo xs ys  where (bo, d) = subW bi x y+sub' bi (x : xs) []       = d : sub' bo xs []  where (bo, d) = subW bi x zeroD+sub' 0  []       []       = []+sub' _  []       _        = undefined++-- Subtract with borrow+subW :: Digit -> Digit -> Digit -> (Digit, Digit)+subW b x y =+  let d = x - y + b+  in  if d < 0 then+        (quot d maxD - 1, rem d maxD + maxD)+      else+        (quot d maxD, rem d maxD)++-- Remove trailing 0s+trim0 :: [Digit] -> [Digit]+trim0 = reverse . dropWhile (== (0::Int)) . reverse++-- Is axs < ays?+ltW :: [Digit] -> [Digit] -> Bool+ltW axs ays = lxs < lys || lxs == lys && cmp (reverse axs) (reverse ays)+  where+    lxs = length axs+    lys = length ays+    cmp (x:xs) (y:ys) = x < y || x == y && cmp xs ys+    cmp []     []     = False+    cmp _      _      = error "ltW.cmp"+    +mulI :: Integer -> Integer -> Integer+mulI (I _ []) _ = I Plus []         -- 0 * x = 0+mulI _ (I _ []) = I Plus []         -- x * 0 = 0+mulI (I sx [x]) (I sy ys)  = I (mulSign sx sy) (mulD zeroD ys x)+mulI (I sx xs)  (I sy [y]) = I (mulSign sx sy) (mulD zeroD xs y)+mulI (I sx xs)  (I sy ys)  = I (mulSign sx sy) (mulM xs ys)++mulSign :: Sign -> Sign -> Sign+mulSign s t = if s == t then Plus else Minus++-- Multiply with a single digit, and add carry.+mulD :: Digit -> [Digit] -> Digit -> [Digit]+mulD ci [] _ = if ci == 0 then [] else [ci]+mulD ci (x:xs) y = r : mulD q xs y+  where+    xy = x * y + ci+    q = quot xy maxD+    r = rem  xy maxD++mulM :: [Digit] -> [Digit] -> [Digit]+mulM xs ys =+  let rs = map (mulD zeroD xs) ys+      ss = zipWith (++) (map (`replicate` (0::Int)) [0::Int ..]) rs+  in  foldl1 add ss++-- Signs:+--  + +  -> (+,+)+--  + -  -> (-,+)+--  - +  -> (-,-)+--  - -  -> (+,-)+quotRemI :: Integer -> Integer -> (Integer, Integer)+quotRemI _         (I _  [])  = error "Integer: division by 0" -- n / 0+quotRemI (I _  [])          _ = (I Plus [], I Plus [])         -- 0 / n+quotRemI (I sx xs) (I sy ys) | all (== (0::Int)) ys' =+  -- All but the MSD are 0.  Scale numerator accordingly and divide.+  -- Then add back (the ++) the remainder we scaled off.+    case quotRemD xs' y of+      (q, r) -> qrRes sx sy (q, rs ++ r)+  where ys'       = init ys+        y         = last ys+        n         = length ys'+        (rs, xs') = splitAt n xs  -- xs' is the scaled number+quotRemI (I sx xs) (I sy ys)  = qrRes sx sy (quotRemB xs ys)++qrRes :: Sign -> Sign -> ([Digit], [Digit]) -> (Integer, Integer)+qrRes sx sy (ds, rs) = (sI (mulSign sx sy) ds, sI sx rs)++quotI :: Integer -> Integer -> Integer+quotI x y =+  case quotRemI x y of+    (q, _) -> q++-- Divide by a single digit.+-- Does not return normalized numbers.+quotRemD :: [Digit] -> Digit -> ([Digit], [Digit])+quotRemD axs y = qr zeroD (reverse axs) []+  where+    qr ci []     res = (res, [ci])+    qr ci (x:xs) res = qr r xs (q:res)+      where+        cx = ci * maxD + x+        q = quot cx y+        r = rem cx y++-- Simple iterative long division.+quotRemB :: [Digit] -> [Digit] -> ([Digit], [Digit])+quotRemB xs ys =+  let n  = I Plus xs+      d  = I Plus ys+      a  = I Plus $ replicate (length ys - (1::Int)) (0::Int) ++ [last ys]  -- only MSD of ys+      aq = quotI n a+      ar = addI d oneI+      loop q r =+        if absI r `geI` d then+          let r' = n `subI` (q `mulI` d)+              qn = q `addI` (r' `quotI` a)+              q' = (q `addI` qn) `quotI` twoI+          in  loop q' r'+        else+          q+      q' = loop aq ar+      r = n `subI` (q' `mulI` d)+  in  if r `ltI` zeroI then+        (digits (q' `subI` oneI), digits (r `addI` d))+      else+        (digits q', digits r)++digits :: Integer -> [Digit]+digits (I _ ds) = ds++zeroI :: Integer+zeroI = I Plus []++oneI :: Integer+oneI = I Plus [1]++twoI :: Integer+twoI = I Plus [2]++tenI :: Integer+tenI = I Plus [10]++negOneI :: Integer+negOneI = I Minus [1]++--------------++showInteger :: Integer -> String+showInteger (I _     []) = "0"+showInteger (I Minus xs) = '-' : showInteger' xs+showInteger (I Plus  xs) =       showInteger' xs++showInteger' :: [Digit] -> String+showInteger' [] = ""+showInteger' xs = showInteger' (trim0 xs') ++ [chr (ord '0' + d)]+  where+    (xs', [d]) = quotRemD xs 10++readInteger :: String -> Integer+readInteger ('-':ds) = negate (readUnsignedInteger ds)+readInteger ds       =         readUnsignedInteger ds++readUnsignedInteger :: String -> Integer+readUnsignedInteger = foldl (\ r c -> r * tenI + _intToInteger (ord c - ord '0')) zeroI++eqI :: Integer -> Integer -> Bool+eqI (I sx xs) (I sy ys) = sx == sy && xs == ys++neI :: Integer -> Integer -> Bool+neI x y = not (eqI x y)++ltI :: Integer -> Integer -> Bool+ltI (I Plus  xs) (I Plus  ys) = ltW xs ys+ltI (I Minus  _) (I Plus   _) = True+ltI (I Plus   _) (I Minus  _) = False+ltI (I Minus xs) (I Minus ys) = ltW ys xs++leI :: Integer -> Integer -> Bool+leI x y = not (ltI y x)++gtI :: Integer -> Integer -> Bool+gtI x y = ltI y x++geI :: Integer -> Integer -> Bool+geI x y = not (ltI x y)++-- These two functions return an (opaque) representation of an+-- Integer as [Int].+-- This is used by the compiler to generate Integer literals.+-- First _integerToIntList is used in the compiler to get a list of+-- Int, and the generated code will have a call to _intListToInteger.+_integerToIntList :: Integer -> [Int]+_integerToIntList (I Plus  ds) = ds+_integerToIntList (I Minus ds) = (-1::Int) : ds++_intListToInteger :: [Int] -> Integer+_intListToInteger (-1 : ds) = I Minus ds+_intListToInteger ds        = I Plus  ds++---------------------------------+{-+pIntegerToInteger :: P.Integer -> Integer+pIntegerToInteger i | i >= 0        = I Plus  (f i)+                    | otherwise     = I Minus (f (negate i))+  where+    f 0 = []+    f x = fromInteger (rem x (toInteger maxD)) : f (quot x (toInteger maxD))++integerToPInteger :: Integer -> P.Integer+integerToPInteger (I s xs) =+  let r = foldr (\ d r -> r * toInteger maxD + toInteger d) 0 xs+  in  case s of+        Plus  -> r+        Minus -> negate r++instance Num Integer where+  (+) = addI+  (-) = subI+  (*) = mulI+  abs x = if x < 0 then -x else x+  signum x = if x > 0 then 1 else if x < 0 then -1 else 0+  fromInteger = pIntegerToInteger++instance Enum Integer where+  fromEnum = fromEnum . integerToPInteger+  toEnum = _intToInteger++instance Real Integer where+  toRational = toRational . toInteger++instance Integral Integer where+  quotRem = quotRemI+  toInteger = integerToPInteger++--instance Show Integer where+--  show = showInteger++instance Eq Integer where+  (==) = eqI++instance Ord Integer where+  x <  y = x `ltI` y+  x <= y = x == y || x `ltI` y+  x >  y = y `ltI` x+  x >= y = x == y || y `ltI` x++instance Arbitrary Integer where+  arbitrary = do+    ndig <- frequency+      [(5,  pure 0)+      ,(25, pure 1)+      ,(20, pure 2)+      ,(10, pure 3)+      ,(10, pure 4)+      ,(2,  pure 5)+      ,(2,  pure 6)+      ]+    digits <- vectorOf ndig (chooseInt (0, maxD - 1))+    sign <- elements [Plus, Minus]+    pure $ if null digits then I Plus [] else I sign digits++{-+newtype SmallInteger = SmallInteger Integer+  deriving Show++instance Arbitrary SmallInteger where+  arbitrary = do+    ndig <- frequency+      [(25, pure 1)+      ,(20, pure 2)+      ,(10, pure 3)+      ,(10, pure 4)+      ]+    digit <- chooseInt (1, maxD - 1)+    sign <- elements [Plus, Minus]+    pure $ SmallInteger $ I sign (replicate (ndig - 1) 0 ++ [digit])+-}+{-+sanity :: HasCallStack => Integer -> Integer+sanity (I Minus []) = undefined+sanity (I _ ds) | any (< 0) ds = undefined+sanity (I _ ds) | length ds > 1 && last ds == 0 = undefined+sanity i = i+-}++prop_roundtrip1 :: Integer -> Bool+prop_roundtrip1 i = fromInteger (toInteger i) == i++prop_negate :: Integer -> Bool+prop_negate i = toInteger (negate i) == negate (toInteger i)++prop_abs :: Integer -> Bool+prop_abs i = toInteger (abs i) == abs (toInteger i)++prop_add :: Integer -> Integer -> Bool+prop_add x y = toInteger (addI x y) == toInteger x + toInteger y++prop_sub :: Integer -> Integer -> Bool+prop_sub x y = toInteger (subI x y) == toInteger x - toInteger y++prop_mul :: Integer -> Integer -> Bool+prop_mul x y = toInteger (mulI x y) == toInteger x * toInteger y++prop_div :: Integer -> NonZero Integer -> Bool+prop_div x (NonZero y) =+  to (quotRemI x y) == toInteger x `quotRem` toInteger y+  where to (a, b) = (toInteger a, toInteger b)+  +prop_muldiv :: Integer -> NonZero Integer -> Bool+prop_muldiv x (NonZero y) =+  let (q, r) = quotRemI x y+  in  q*y + r == x++prop_eq :: Integer -> Integer -> Bool+prop_eq x y = (eqI x y) == (toInteger x == toInteger y)++prop_ne :: Integer -> Integer -> Bool+prop_ne x y = (neI x y) == (toInteger x /= toInteger y)++prop_lt :: Integer -> Integer -> Bool+prop_lt x y = (ltI x y) == (toInteger x < toInteger y)++prop_gt :: Integer -> Integer -> Bool+prop_gt x y = (gtI x y) == (toInteger x > toInteger y)++prop_le :: Integer -> Integer -> Bool+prop_le x y = (leI x y) == (toInteger x <= toInteger y)++prop_ge :: Integer -> Integer -> Bool+prop_ge x y = (geI x y) == (toInteger x >= toInteger y)++prop_show :: Integer -> Bool+prop_show x = showInteger x == show (toInteger x)++checkAll :: IO ()+checkAll = do+  let qc p = quickCheck (withMaxSuccess 100000 p)+  mapM_ qc [prop_roundtrip1, prop_negate, prop_abs, prop_show]+  mapM_ qc [prop_add, prop_sub, prop_mul,+            prop_eq, prop_ne, prop_lt, prop_gt, prop_le, prop_ge]+  mapM_ qc [prop_div, prop_muldiv]+  +-}
+ lib/Data/Integer_Type.hs view
@@ -0,0 +1,58 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Integer_Type(module Data.Integer_Type) where+import Primitives+import Data.Bool_Type+import Data.List_Type++data Integer = I Sign [Digit]++data Sign = Plus | Minus++type Digit = Int++maxD :: Digit+maxD = 2147483648  -- 2^31, this is used so multiplication of two digit doesn't overflow a 64 bit Int++_intToInteger :: Int -> Integer+_intToInteger i | i `primIntGE` 0  = I Plus  (f i)+                | i `primIntEQ` ni = I Minus [0::Int,0::Int,2::Int]  -- we are at minBound::Int.+                | True             = I Minus (f ni)+  where+    ni = (0::Int) `primIntSub` i+    f :: Int -> [Int]+    f 0 = []+    f x = primIntRem x maxD : f (primIntQuot x maxD)++_integerToInt :: Integer -> Int+_integerToInt (I sign ds) = s `primIntMul` i+  where+    i =+      case ds of+        []         -> 0::Int+        [d1]       -> d1+        [d1,d2]    -> d1 `primIntAdd` (maxD `primIntMul` d2)+        d1:d2:d3:_ -> d1 `primIntAdd` (maxD `primIntMul` (d2 `primIntAdd` (maxD `primIntMul` d3)))+    s =+      case sign of+        Plus  -> 1::Int+        Minus -> 0 `primIntSub` 1++_wordToInteger :: Word -> Integer+_wordToInteger i = I Plus  (f i)+  where+    f :: Word -> [Int]+    f x = if x `primWordEQ` (0::Word) then [] else primWordToInt (primWordRem x (primIntToWord maxD)) : f (primWordQuot x (primIntToWord maxD))++_integerToWord :: Integer -> Word+_integerToWord x = primIntToWord (_integerToInt x)++_integerToDouble :: Integer -> Double+_integerToDouble (I sign ds) = s `primDoubleMul` loop ds+  where+    loop [] = 0.0::Double+    loop (i : is) = primDoubleFromInt i `primDoubleAdd` (primDoubleFromInt maxD `primDoubleMul` loop is)+    s =+      case sign of+        Plus  -> 1.0::Double+        Minus -> 0.0 `primDoubleSub` 1.0
+ lib/Data/Integral.hs view
@@ -0,0 +1,58 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Integral(module Data.Integral) where+import Primitives+import Control.Error+import Data.Bool+import Data.Eq+import Data.Integer_Type+import Data.Num+import Data.Ord++infixl 7 `quot`,`rem`++class {-(Real a, Enum a) => -} (Eq a, Num a) => Integral a where+  quot      :: a -> a -> a+  rem       :: a -> a -> a+  div       :: a -> a -> a+  mod       :: a -> a -> a+  quotRem   :: a -> a -> (a, a)+  divMod    :: a -> a -> (a, a)+  toInteger :: a -> Integer++  n `quot` d       =  q  where (q,r) = quotRem n d+  n `rem` d        =  r  where (q,r) = quotRem n d+  n `div` d        =  q  where (q,r) = divMod n d+  n `mod` d        =  r  where (q,r) = divMod n d+  divMod n d       =  if signum r == negate (signum d) then (q - 1, r + d) else qr+                        where qr@(q,r) = quotRem n d+  quotRem n d      = (quot n d, rem n d)++gcd :: forall a . (Integral a) => a -> a -> a+gcd x y = gcd' (abs x) (abs y)+  where gcd' a b = if b == 0 then a else gcd' b (a `rem` b)++lcm :: forall a . (Integral a) => a -> a -> a+lcm x y =+  if x == 0 || y == 0 then+    0+  else+    abs ((x `quot` (gcd x y)) * y)++even :: forall a . (Integral a) => a -> Bool+even n = n `rem` 2 == 0++odd :: forall a . (Integral a) => a -> Bool+odd n = not (even n)++infixr 8 ^+(^) :: forall a b . (Num a, Integral b, Ord b) => a -> b -> a+x0 ^ y0 | y0 < 0    = error "Data.Integral.^: negative exponent"+        | otherwise = pow x0 y0+  -- This does not do the minimal number of multiplications, but it's simple.+  where pow x y | y == 0    = 1+                | even y    =     pow (x * x) (y `quot` 2)+                | otherwise = x * pow (x * x) (y `quot` 2)++fromIntegral :: forall a b . (Integral a, Num b) => a -> b+fromIntegral x = fromInteger (toInteger x)
+ lib/Data/List.hs view
@@ -0,0 +1,363 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.List(+  module Data.List,+  module Data.List_Type+  ) where+import Primitives+import Control.Applicative+import Control.Error+import Control.Monad+import Data.Bool+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.List_Type+import Data.Num+import Data.Ord+import Data.Maybe_Type+import Data.Tuple+import Text.Show++instance {-# OVERLAPPABLE #-} forall a . Eq a => Eq [a] where+  []     == []      =  True+  (x:xs) == (y:ys)  =  x == y && xs == ys+  _      == _       =  False++instance Functor [] where+  fmap = map++instance Applicative [] where+  pure a = [a]+  (<*>) = ap++instance Monad [] where+  (>>=) = flip concatMap++instance MonadFail [] where+  fail _ = []++instance forall a . Show a => Show [a] where+  showsPrec _ = showList++null :: forall a . [a] -> Bool+null [] = True+null _  = False++concat :: forall a . [[a]] -> [a]+concat = foldr (++) []++concatMap :: forall a b . (a -> [b]) -> [a] -> [b]+concatMap f = concat . map f++map :: forall a b . (a -> b) -> [a] -> [b]+map f =+  let+    rec [] = []+    rec (a : as) = f a : rec as+  in rec++filter :: forall a . (a -> Bool) -> [a] -> [a]+filter p =+  let+    rec [] = []+    rec (x : xs) = if p x then x : rec xs else rec xs+  in rec++foldr :: forall a b . (a -> b -> b) -> b -> [a] -> b+foldr f z =+  let+    rec [] = z+    rec (x : xs) = f x (rec xs)+  in rec++foldr1 :: forall a . (a -> a -> a) -> [a] -> a+foldr1 _ [] = error "foldr1"+foldr1 f (x : xs) = foldr f x xs++foldl :: forall a b . (b -> a -> b) -> b -> [a] -> b+foldl _ z [] = z+foldl f z (x : xs) = foldl f (f z x) xs++foldl1 :: forall a . (a -> a -> a) -> [a] -> a+foldl1 _ [] = error "foldl1"+foldl1 f (x : xs) = foldl f x xs++minimum :: forall a . Ord a => [a] -> a+minimum [] = error "minimum"+minimum (x:ys) = foldr (\ y m -> if y < m then y else m) x ys++maximum :: forall a . Ord a => [a] -> a+maximum [] = error "maximum"+maximum (x:ys) = foldr (\ y m -> if y > m then y else m) x ys++sum :: forall a . Num a => [a] -> a+sum = foldr (+) 0++product :: forall a . Num a => [a] -> a+product = foldr (*) 1++and :: [Bool] -> Bool+and = foldr (&&) True++or :: [Bool] -> Bool+or = foldr (||) False++any :: forall a . (a -> Bool) -> [a] -> Bool+any p = or . map p++all :: forall a . (a -> Bool) -> [a] -> Bool+all p = and . map p++take :: forall a . Int -> [a] -> [a]+take n arg =+  if n <= (0::Int) then+    []+  else+    case arg of+      [] -> []+      x : xs -> x : take (n - (1::Int)) xs++drop :: forall a . Int -> [a] -> [a]+drop n arg =+  if n <= (0::Int) then+    arg+  else+    case arg of+      [] -> []+      _ : xs -> drop (n - (1::Int)) xs++length :: forall a . [a] -> Int+length =+  -- Make it tail recursive and strict+  let+    rec r [] = r+    rec r (_:xs) =+          let r' = r + (1::Int)+          in  r' `primSeq` rec r' xs+  in rec (0::Int)++zip :: forall a b . [a] -> [b] -> [(a, b)]+zip = zipWith (\ x y -> (x, y))++zipWith :: forall a b c . (a -> b -> c) -> [a] -> [b] -> [c]+zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys+zipWith _ _ _ = []++-- XXX not as lazy as it could be+unzip :: forall a b . [(a, b)] -> ([a], [b])+unzip axys =+  case axys of+    [] -> ([], [])+    (x,y) : xys ->+      case unzip xys of+        (xs, ys) -> (x:xs, y:ys)++-- XXX not as lazy as it could be+unzip3 :: forall a b c . [(a, b, c)] -> ([a], [b], [c])+unzip3 axyzs =+  case axyzs of+    [] -> ([], [], [])+    (x, y, z) : xyzs ->+      case unzip3 xyzs of+        (xs, ys, zs) -> (x:xs, y:ys, z:zs)++stripPrefix :: forall a . Eq a => [a] -> [a] -> Maybe [a]+stripPrefix = stripPrefixBy (==)++stripPrefixBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> Maybe [a]+stripPrefixBy eq [] s = Just s+stripPrefixBy eq (c:cs) [] = Nothing+stripPrefixBy eq (c:cs) (d:ds) | eq c d = stripPrefixBy eq cs ds+                               | otherwise = Nothing++isPrefixOf :: forall a . Eq a => [a] -> [a] -> Bool+isPrefixOf = isPrefixOfBy (==)++isPrefixOfBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> Bool+isPrefixOfBy eq (c:cs) (d:ds) = eq c d && isPrefixOfBy eq cs ds+isPrefixOfBy _ [] _ = True+isPrefixOfBy _ _  _ = False++isSuffixOf :: forall a . Eq a => [a] -> [a] -> Bool+isSuffixOf = isSuffixOfBy (==)++isSuffixOfBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> Bool+isSuffixOfBy eq n h = isPrefixOfBy eq (reverse n) (reverse h)++splitAt :: forall a . Int -> [a] -> ([a], [a])+splitAt n xs = (take n xs, drop n xs)++reverse :: forall a . [a] -> [a]+reverse =+  let+    rev r [] = r+    rev r (x:xs) = rev (x:r) xs+  in  rev []++takeWhile :: forall a . (a -> Bool) -> [a] -> [a]+takeWhile _ [] = []+takeWhile p (x:xs) =+  if p x then+    x : takeWhile p xs+  else+    []++dropWhile :: forall a . (a -> Bool) -> [a] -> [a]+dropWhile _ [] = []+dropWhile p (x:xs) =+  if p x then+    dropWhile p xs+  else+    x : xs++span :: forall a . (a -> Bool) -> [a] -> ([a], [a])+span p =+  let+    rec r [] = (reverse r, [])+    rec r (x:xs) = if p x then rec (x:r) xs else (reverse r, x:xs)+  in rec []++spanUntil :: forall a . (a -> Bool) -> [a] -> ([a], [a])+spanUntil p =+  let+    rec r [] = (reverse r, [])+    rec r (x:xs) = if p x then rec (x:r) xs else (reverse (x:r), xs)+  in rec []++head :: forall a . [a] -> a+head [] = error "head"+head (x:_) = x++tail :: forall a . [a] -> [a]+tail [] = error "tail"+tail (_:ys) = ys++intersperse :: forall a . a -> [a] -> [a]+intersperse _ [] = []+intersperse sep (a:as) = a : prepend as+  where+    prepend [] = []+    prepend (x:xs) = sep : x : prepend xs++intercalate :: forall a . [a] -> [[a]] -> [a]+intercalate xs xss = concat (intersperse xs xss)++elem :: forall a . (Eq a) => a -> [a] -> Bool+elem = elemBy (==)++notElem :: forall a . (Eq a) => a -> [a] -> Bool+notElem a as = not (elem a as)++elemBy :: forall a . (a -> a -> Bool) -> a -> [a] -> Bool+elemBy eq a = any (eq a)++find :: forall a . (a -> Bool) -> [a] -> Maybe a+find p [] = Nothing+find p (x:xs) = if p x then Just x else find p xs++lookup :: forall a b . Eq a => a -> [(a, b)] -> Maybe b+lookup = lookupBy (==)++lookupBy :: forall a b . (a -> a -> Bool) -> a -> [(a, b)] -> Maybe b+lookupBy eq x xys =+  case find (eq x . fst) xys of+    Nothing -> Nothing+    Just (_, b) -> Just b++union :: forall a . Eq a => [a] -> [a] -> [a]+union = unionBy (==)++unionBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+unionBy eq xs ys =  xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs++intersect :: forall a . Eq a => [a] -> [a] -> [a]+intersect = intersectBy (==)++intersectBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+intersectBy eq xs ys = filter (\ x -> not (elemBy eq x ys)) xs++deleteBy :: forall a . (a -> a -> Bool) -> a -> [a] -> [a]+deleteBy _ _ [] = []+deleteBy eq x (y:ys) = if eq x y then ys else y : deleteBy eq x ys++deleteAllBy :: forall a . (a -> a -> Bool) -> a -> [a] -> [a]+deleteAllBy _ _ [] = []+deleteAllBy eq x (y:ys) = if eq x y then deleteAllBy eq x ys else y : deleteAllBy eq x ys++nub :: forall a . Eq a => [a] -> [a]+nub = nubBy (==)++nubBy :: forall a . (a -> a -> Bool) -> [a] -> [a]+nubBy _ [] = []+nubBy eq (x:xs) = x : nubBy eq (filter (\ y -> not (eq x y)) xs)++replicate :: forall a . Int -> a -> [a]+replicate n x = take n (repeat x)++repeat :: forall a . a -> [a]+repeat x =+  let+    xs = x:xs+  in xs++infix 5 \\+(\\) :: forall a . Eq a => [a] -> [a] -> [a]+(\\) = deleteFirstsBy (==)++deleteFirstsBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+deleteFirstsBy eq = foldl (flip (deleteBy eq))++-- Delete all from the second argument from the first argument+deleteAllsBy :: forall a . (a -> a -> Bool) -> [a] -> [a] -> [a]+deleteAllsBy eq = foldl (flip (deleteAllBy eq))++infixl 9 !!+(!!) :: forall a . [a] -> Int -> a+(!!) axs i =+  if i < (0::Int) then+    error "!!: <0"+  else+    let+      nth _ [] = error "!!: empty"+      nth n (x:xs) = if n == (0::Int) then x else nth (n - (1::Int)) xs+    in nth i axs++partition :: forall a . (a -> Bool) -> [a] -> ([a], [a])+partition p xs = (filter p xs, filter (not . p) xs)++sort :: forall a . Ord a => [a] -> [a]+sort = sortLE (<=)++-- A simple "quicksort" for now.+sortLE :: forall a . (a -> a -> Bool) -> [a] -> [a]+sortLE _  [] = []+sortLE le (x:xs) =+  case partition (le x) xs of+    (ge, lt) -> sortLE le lt ++ (x : sortLE le ge)++last :: forall a . [a] -> a+last [] = error "last: []"+last [x] = x+last (_:xs) = last xs++init :: forall a . [a] -> [a]+init [] = error "init: []"+init [_] = []+init (x:xs) = x : init xs++anySame :: forall a . Eq a => [a] -> Bool+anySame = anySameBy (==)++anySameBy :: forall a . (a -> a -> Bool) -> [a] -> Bool+anySameBy _ [] = False+anySameBy eq (x:xs) = elemBy eq x xs || anySameBy eq xs++iterate :: forall a . (a -> a) -> a -> [a]+iterate f x = x : iterate f (f x)++substString :: forall a . Eq a => [a] -> [a] -> [a] -> [a]+substString _ _ [] = []+substString from to xs@(c:cs) | Just rs <- stripPrefix from xs = to ++ substString from to rs+                              | otherwise = c : substString from to cs
+ lib/Data/List_Type.hs view
@@ -0,0 +1,12 @@+module Data.List_Type(module Data.List_Type) where+import Primitives++infixr 5 :+data [] a = [] | (:) a [a]  -- Parser hacks makes this acceptable++-- This does not really belong here, but it makes the module structure+-- much simpler.+infixr 5 +++(++) :: forall a . [a] -> [a] -> [a]+(++) [] ys = ys+(++) (x : xs) ys = x : xs ++ ys 
+ lib/Data/Map.hs view
@@ -0,0 +1,155 @@+--+-- Balanced binary trees+-- Similar to Data.Map+-- Based on https://ufal.mff.cuni.cz/~straka/papers/2011-bbtree.pdf+--+module Data.Map(+  Map,+  insertBy, insertByWith, fromListByWith, fromListBy, lookupBy, empty, elems, size, toList, deleteBy,+  ) where+import Prelude hiding (lookupBy, deleteBy)++data Map k a+  = Nil           -- empty tree+  | One k a       -- singleton+  | Node          -- tree node+    (Map k a)      -- left subtree+    Int            -- size of this tree+    k              -- key stored in the node+    a              -- element stored in the node+    (Map k a)      -- right subtree+  --Xderiving(Show)++empty :: forall k a . Map k a+empty = Nil++elems :: forall k v . Map k v -> [v]+elems = map snd . toList++toList :: forall k v . Map k v -> [(k, v)]+toList t = to t []+  where+    to Nil q = q+    to (One k v) q = (k, v):q+    to (Node l _ k v r) q = to l ((k, v) : to r q)++fromListBy :: forall k v . (k -> k -> Ordering) -> [(k, v)] -> Map k v+fromListBy cmp = fromListByWith cmp const++fromListByWith :: forall k v . (k -> k -> Ordering) -> (v -> v -> v) -> [(k, v)] -> Map k v+fromListByWith cmp comb = foldr (uncurry (insertByWith cmp comb)) empty++size :: forall k a . Map k a -> Int+size Nil = 0+size (One _ _) = 1+size (Node _ s _ _ _) = s++node :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+node Nil  key val Nil   = One key val+node left key val right = Node left (size left + 1 + size right) key val right++lookupBy :: forall k a . (k -> k -> Ordering) -> k -> Map k a -> Maybe a+lookupBy cmp k = look+  where+    look Nil = Nothing+    look (One key val) | isEQ (cmp k key) = Just val+                       | otherwise = Nothing+    look (Node left _ key val right) =+      case k `cmp` key of+        LT -> look left+        EQ -> Just val+        GT -> look right++insertBy :: forall k a . (k -> k -> Ordering) -> k -> a -> Map k a -> Map k a+insertBy cmp = insertByWith cmp const++insertByWith :: forall k a . (k -> k -> Ordering) -> (a -> a -> a) -> k -> a -> Map k a -> Map k a+insertByWith cmp comb k v = ins+  where+    ins Nil = One k v+    ins (One a v) = ins (Node Nil 1 a v Nil)+    ins (Node left _ key val right) =+      case k `cmp` key of+        LT -> balance (ins left) key val right+        EQ -> node left k (comb v val) right+        GT -> balance left key val (ins right)++deleteBy :: forall k a . (k -> k -> Ordering) -> k -> Map k a -> Map k a+deleteBy cmp k = del+  where+    del Nil = Nil+    del t@(One a _) | isEQ (k `cmp` a) = Nil+                    | otherwise        = t+    del (Node left _ key val right) =+      case k `cmp` key of+        LT -> balance (del left) key val right+        EQ -> glue left right+        GT -> balance left key val (del right)+      where+        glue Nil right = right+        glue left Nil = left+        glue left right+          | size left > size right =+            let (key', val', left') = extractMax left+            in node left' key' val' right+          | otherwise =+            let (key', val', right') = extractMin right+            in node left key' val' right'+extractMin :: forall k a . Map k a -> (k, a, Map k a)+extractMin Nil = undefined+extractMin (One key val) = (key, val, Nil)+extractMin (Node Nil _ key val right) = (key, val, right)+extractMin (Node left _ key val right) =+  case extractMin left of+    (min, vmin, left') -> (min, vmin, balance left' key val right)++extractMax :: forall k a . Map k a -> (k, a, Map k a)+extractMax Nil = undefined+extractMax (One key val) = (key, val, Nil)+extractMax (Node left _ key val Nil) = (key, val, left)+extractMax (Node left _ key val right) =+  case extractMax right of+    (max, vmax, right') -> (max, vmax, balance left key val right')++omega :: Int+omega = 3+alpha :: Int+alpha = 2+delta :: Int+delta = 0++balance :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+balance left key val right+  | size left + size right <= 1 = node left key val right+balance (One k v) key val right = balance (Node Nil 1 k v Nil) key val right+balance left key val (One k v)  = balance left key val (Node Nil 1 k v Nil)+balance left key val right+  | size right > omega * size left + delta =+      case right of+        (Node rl _ _ _ rr) | size rl < alpha*size rr -> singleL left key val right+                           | otherwise -> doubleL left key val right+        _ -> undefined+  | size left > omega * size right + delta =+      case left of+        (Node ll _ _ _ lr) | size lr < alpha*size ll -> singleR left key val right+                           | otherwise -> doubleR left key val right+        _ -> undefined+  | otherwise = node left key val right++singleL :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+singleL l k v (Node rl _ rk rv rr) = node (node l k v rl) rk rv rr+singleL _ _ _ _ = undefined++singleR :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+singleR (Node ll _ lk lv lr) k v r = node ll lk lv (node lr k v r)+singleR _ _ _ _ = undefined++doubleL :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+doubleL l k v (Node (Node rll _ rlk rlv rlr) _ rk rv rr) = node (node l k v rll) rlk rlv (node rlr rk rv rr)+doubleL l k v (Node (One        rlk rlv    ) _ rk rv rr) = node (node l k v Nil) rlk rlv (node Nil rk rv rr)+doubleL _ _ _ _ = undefined++doubleR :: forall k a . Map k a -> k -> a -> Map k a -> Map k a+doubleR (Node ll _ lk lv (Node lrl _ lrk lrv lrr)) k v r = node (node ll lk lv lrl) lrk lrv (node lrr k v r)+doubleR (Node ll _ lk lv (One        lrk lrv    )) k v r = node (node ll lk lv Nil) lrk lrv (node Nil k v r)+doubleR _ _ _ _ = undefined
+ lib/Data/Maybe.hs view
@@ -0,0 +1,69 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Maybe(module Data.Maybe, module Data.Maybe_Type) where+import Primitives+import Control.Applicative+import Control.Monad+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.List+import Data.Maybe_Type+import Data.Ord+import Text.Show++instance forall a . Eq a => Eq (Maybe a) where+  Nothing == Nothing  =  True+  Just x  == Just x'  =  x == x'+  _       == _        =  False++instance forall a . (Show a) => Show (Maybe a) where+  showsPrec _ Nothing  = showString "Nothing"+  showsPrec p (Just a) = showParen (p >= 11) (showString "Just " . showsPrec 11 a)++instance Functor Maybe where+  fmap _ Nothing  = Nothing+  fmap f (Just a) = Just (f a)++instance Applicative Maybe where+  pure = Just+  Just f <*> Just a = Just (f a)+  _      <*> _      = Nothing++instance Monad Maybe where+  return = pure+  Nothing >>= _ = Nothing+  Just a  >>= f = f a++instance MonadFail Maybe where+  fail _ = Nothing++maybe :: forall a r . r -> (a -> r) -> Maybe a -> r+maybe r _ Nothing = r+maybe _ f (Just a) = f a++fromMaybe :: forall a . a -> Maybe a -> a+fromMaybe a Nothing = a+fromMaybe _ (Just a) = a++catMaybes :: forall a . [Maybe a] -> [a]+catMaybes mxs = [ x | Just x <- mxs ]++isJust :: forall a . Maybe a -> Bool+isJust Nothing = False+isJust (Just _) = True++mapMaybe :: forall a b . (a -> Maybe b) -> [a] -> [b]+mapMaybe _ [] = []+mapMaybe f (a:as) =+  case f a of+    Nothing -> mapMaybe f as+    Just b -> b : mapMaybe f as++maybeToList :: forall a . Maybe a -> [a]+maybeToList Nothing = []+maybeToList (Just a) = [a]+
+ lib/Data/Maybe_Type.hs view
@@ -0,0 +1,5 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Maybe_Type(module Data.Maybe_Type) where++data Maybe a = Nothing | Just a
+ lib/Data/Monoid.hs view
@@ -0,0 +1,8 @@+module Data.Monoid(module Data.Monoid) where+import Primitives+import Data.Semigroup++class Semigroup a => Monoid a where+  mempty :: a+  mappend :: a -> a -> a+  mappend = (<>)
+ lib/Data/Num.hs view
@@ -0,0 +1,21 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Num(module Data.Num) where+import Primitives+import Data.Integer_Type++infixl 6 +,-+infixl 7 *++class Num a where+  (+) :: a -> a -> a+  (-) :: a -> a -> a+  (*) :: a -> a -> a+  negate :: a -> a+  abs :: a -> a+  signum :: a -> a+  fromInteger :: Integer -> a+  negate x = 0 - x++subtract :: forall a . Num a => a -> a -> a+subtract x y = y - x
+ lib/Data/Ord.hs view
@@ -0,0 +1,48 @@+module Data.Ord(+  module Data.Ord,+  module Data.Ordering_Type,+  ) where+import Primitives+import Data.Bool_Type+import Data.Bounded+import Data.Ordering_Type+import Data.Eq+import Text.Show++infix 4 <,<=,>,>=++class Eq a => Ord a where+  compare :: a -> a -> Ordering+  (<) :: a -> a -> Bool+  (<=) :: a -> a -> Bool+  (>) :: a -> a -> Bool+  (>=) :: a -> a -> Bool+  max :: a -> a -> a+  min :: a -> a -> a+  -- XXX Check with the Haskell report+  compare x y = if x <= y then (if y <= x then EQ else LT) else GT+  x < y   = if y <= x then False else True+  x > y   = if x <= y then False else True+  x >= y  = x <= y+  min x y = if x <= y then x else y+  max x y = if x <= y then y else x++instance Eq Ordering where+  LT == LT  =  True+  EQ == EQ  =  True+  GT == GT  =  True+  _  == _   =  False++isEQ :: Ordering -> Bool+isEQ EQ = True+isEQ _  = False++instance Show Ordering where+  showsPrec _ LT = showString "LT"+  showsPrec _ EQ = showString "EQ"+  showsPrec _ GT = showString "GT"++instance Bounded Ordering where+  minBound = LT+  maxBound = GT+
+ lib/Data/Ordering_Type.hs view
@@ -0,0 +1,2 @@+module Data.Ordering_Type(Ordering(..)) where+data Ordering = LT | EQ | GT
+ lib/Data/Ratio.hs view
@@ -0,0 +1,83 @@+module Data.Ratio(+  Ratio, Rational,+  (%),+  numerator, denominator,+  rationalInfinity,+  rationalNaN,+  Rational,+  ) where+import Primitives+import Control.Error+import Data.Bool+import Data.Eq+import Data.Fractional+import Data.Function+--import Data.Int+import Data.Integer+import Data.Integral+import Data.Num+import Data.Ord+import Data.Ratio_Type+import Text.Show++{- in Data.Ratio_Type+data Ratio a = (:%) a a   -- XXX should be strict++type Rational = Ratio Integer+-}++instance forall a . Eq a => Eq (Ratio a) where+  (x :% y) == (x' :% y')  =  x == x' && y == y'++instance forall a . (Integral a, Ord a) => Ord (Ratio a) where+  (x :% y) <= (x' :% y')  =  x * y' <= x' * y+  (x :% y) <  (x' :% y')  =  x * y' <  x' * y+  (x :% y) >= (x' :% y')  =  x * y' >= x' * y+  (x :% y) >  (x' :% y')  =  x * y' >  x' * y++instance forall a . (Integral a) => Num (Ratio a) where+  (x:%y) + (x':%y')   =  reduce (x*y' + x'*y) (y*y')+  (x:%y) - (x':%y')   =  reduce (x*y' - x'*y) (y*y')+  (x:%y) * (x':%y')   =  reduce (x * x') (y * y')+  negate (x:%y)       =  (negate x) :% y+  abs (x:%y)          =  abs x :% y+  signum (x:%_)       =  signum x :% 1+  fromInteger x       =  fromInteger x :% 1++instance forall a . (Integral a, Ord a) => Fractional (Ratio a) where+  (x:%y) / (x':%y')   = (x*y') % (y*x')+  recip (x:%y)+    | y == 0        = error "Data.Ratio.recip: division by 0"+    | x < 0         = negate y :% negate x+    | otherwise     = y :% x+  fromRational (x:%y) =  fromInteger x % fromInteger y++instance forall a . (Show a) => Show (Ratio a)  where+  showsPrec p (x:%y) = showParen (p > 7) $+                       showsPrec 8 x .+                       showString " % " .+                       showsPrec 8 y++rationalInfinity :: Rational+rationalInfinity = 1 :% 0++rationalNaN :: Rational+rationalNaN = 0 :% 0++infixl 7 %+(%) :: forall a . (Integral a) => a -> a -> Ratio a+x % y = reduce (x * signum y) (abs y)++reduce :: forall a . (Integral a) => a -> a -> Ratio a+reduce x y =+  if y == 0 then+    error "Data.Ratio.%: 0 denominator"+  else+    let d = gcd x y+    in  (x `quot` d) :% (y `quot` d)++numerator :: forall a . Ratio a -> a+numerator (x :% _) = x++denominator :: forall a . Ratio a -> a+denominator (_ :% y) = y
+ lib/Data/Ratio_Type.hs view
@@ -0,0 +1,13 @@+module Data.Ratio_Type(module Data.Ratio_Type) where+import Primitives+import Data.Integer_Type++data Ratio a = !a :% !a++type Rational = Ratio Integer++_integerToRational :: Integer -> Rational+_integerToRational x = x :% (1::Integer)++_mkRational :: Integer -> Integer -> Rational+_mkRational = (:%)
+ lib/Data/Real.hs view
@@ -0,0 +1,6 @@+module Data.Real(module Data.Real) where+import Primitives+import Data.Ratio_Type++class Real a where+  toRational :: a -> Rational
+ lib/Data/RealFloat.hs view
@@ -0,0 +1,68 @@+module Data.RealFloat(+  RealFloat(..),+  ) where+import Primitives+import Data.Bool+import Data.Eq+import Data.Floating+import Data.Fractional+import Data.Int+import Data.Integer+import Data.Num+import Data.Ord++class (Fractional a, Ord a, Floating a) => RealFloat a  where+  floatRadix          :: a -> Integer+  floatDigits         :: a -> Int+  floatRange          :: a -> (Int,Int)+  decodeFloat         :: a -> (Integer,Int)+  encodeFloat         :: Integer -> Int -> a+  exponent            :: a -> Int+  significand         :: a -> a+  scaleFloat          :: Int -> a -> a+  isNaN               :: a -> Bool+  isInfinite          :: a -> Bool+  isDenormalized      :: a -> Bool+  isNegativeZero      :: a -> Bool+  isIEEE              :: a -> Bool+  atan2               :: a -> a -> a++  exponent x          =  if m == 0 then 0 else n + floatDigits x+                         where (m,n) = decodeFloat x++  significand x       =  encodeFloat m (negate (floatDigits x))+                         where (m,_) = decodeFloat x++  scaleFloat 0 x      =  x+  scaleFloat k x+    | isFix           =  x+    | otherwise       =  encodeFloat m (n + clamp b k)+                         where (m,n) = decodeFloat x+                               (l,h) = floatRange x+                               d     = floatDigits x+                               b     = h - l + 4*d+                               -- n+k may overflow, which would lead+                               -- to wrong results, hence we clamp the+                               -- scaling parameter.+                               -- If n + k would be larger than h,+                               -- n + clamp b k must be too, similar+                               -- for smaller than l - d.+                               -- Add a little extra to keep clear+                               -- from the boundary cases.+                               isFix = x == 0 || isNaN x || isInfinite x++  atan2 y x+    | x > 0            =  atan (y/x)+    | x == 0 && y > 0  =  pi/2+    | x <  0 && y > 0  =  pi + atan (y/x)+    |(x <= 0 && y < 0)            ||+     (x <  0 && isNegativeZero y) ||+     (isNegativeZero x && isNegativeZero y)+                       = negate (atan2 (negate y) x)+    | y == 0 && (x < 0 || isNegativeZero x)+                        =  pi    -- must be after the previous test on zero y+    | x==0 && y==0      =  y     -- must be after the other double zero tests+    | otherwise         =  x + y -- x or y is a NaN, return a NaN (via +)++clamp :: Int -> Int -> Int+clamp bd k = max (negate bd) (min bd k)
+ lib/Data/Semigroup.hs view
@@ -0,0 +1,6 @@+module Data.Semigroup(Data.Semigroup) where+import Primitive++infixr 6 <>+class Semigroup a where+  (<>) :: a -> a -> a
+ lib/Data/Tuple.hs view
@@ -0,0 +1,60 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Tuple(+  module Data.Tuple,+  ()(..)+  ) where+import Primitives  -- for ()+import Data.Bool+import Data.Bounded+import Data.Eq+import Data.Function+import Text.Show++--data (a,b) = (a,b)  -- all tuples are built in+--data (a,b,c) = (a,b,c)+-- etc++fst :: forall a b . (a, b) -> a+fst (a, _) = a++snd :: forall a b . (a, b) -> b+snd (_, b) = b++instance forall a b . (Eq a, Eq b) => Eq (a, b) where+  (a1, b1) == (a2, b2)  =  a1 == a2 && b1 == b2++instance forall a b c . (Eq a, Eq b, Eq c) => Eq (a, b, c) where+  (a1, b1, c1) == (a2, b2, c2)  =  a1 == a2 && b1 == b2 && c1 == c2++instance forall a b c d . (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d) where+  (a1, b1, c1, d1) == (a2, b2, c2, d2)  =  a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2++instance Show () where+  showsPrec _ () = showString "()"++instance forall a b . (Show a, Show b) => Show (a, b) where+  showsPrec _ (a, b) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b)++instance forall a b c . (Show a, Show b, Show c) => Show (a, b, c) where+  showsPrec _ (a, b, c) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b . showString "," . showsPrec 0 c)++instance forall a b c d . (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where+  showsPrec _ (a, b, c, d) = showParen True (showsPrec 0 a . showString "," . showsPrec 0 b . showString "," . showsPrec 0 c .+                                             showString "," . showsPrec 0 d)++instance Bounded () where+  minBound = ()+  maxBound = ()++instance forall a b . (Bounded a, Bounded b) => Bounded (a, b) where+  minBound = (minBound, minBound)+  maxBound = (maxBound, maxBound)++instance forall a b c . (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c) where+  minBound = (minBound, minBound, minBound)+  maxBound = (maxBound, maxBound, maxBound)++instance forall a b c d . (Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a, b, c, d) where+  minBound = (minBound, minBound, minBound, minBound)+  maxBound = (maxBound, maxBound, maxBound, maxBound)
+ lib/Data/Word.hs view
@@ -0,0 +1,99 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Data.Word(module Data.Word, Word) where+import Primitives+import Data.Bits+import Data.Bool_Type+import Data.Bounded+import Data.Char+import Data.Enum+import Data.Eq+import Data.Int()  -- instances only+import Data.Integer+import Data.Integral+import Data.List+import Data.Num+import Data.Ord+import Data.Real+import Text.Show++instance Num Word where+  (+)  = primWordAdd+  (-)  = primWordSub+  (*)  = primWordMul+  abs x = x+  signum x = if x == 0 then 0 else 1+  fromInteger x = primIntToWord (_integerToInt x)++instance Integral Word where+  quot = primWordQuot+  rem  = primWordRem+  toInteger = _wordToInteger++instance Bounded Word where+  minBound = 0::Word+  maxBound = (-1::Word)++instance Real Word where+  toRational i = _integerToRational (_wordToInteger i)++--------------------------------++instance Enum Word where+  succ x = x + 1+  pred x = x - 1+  toEnum = primIntToWord+  fromEnum = primWordToInt+  enumFrom n = n : enumFrom (n+1)+  enumFromThen n m = from n+    where d = m - n+          from i = i : from (i+d)+  enumFromTo l h = takeWhile (<= h) (enumFrom l)+  enumFromThenTo l m h =+    if m > l then+      takeWhile (<= h) (enumFromThen l m)+    else+      takeWhile (>= h) (enumFromThen l m)++--------------------------------++instance Eq Word where+  (==) = primWordEQ+  (/=) = primWordNE++instance Ord Word where+  (<)  = primWordLT+  (<=) = primWordLE+  (>)  = primWordGT+  (>=) = primWordGE++instance Enum Word where+  toEnum = primIntToWord+  fromEnum = primWordToInt++--------------------------------++instance Bits Word where+  (.&.) = primWordAnd+  (.|.) = primWordOr+  xor   = primWordXor+  complement = primWordInv+  shiftL = primWordShl+  shiftR = primWordShr+--  bitSizeMaybe _ = Just 64   -- XXX+  bitSize _ = 64+  bit n = primWordShl 1 n+  zeroBits = 0++--------------------------------++instance Show Word where+  show = showWord+    where+      showWord :: Word -> String+      showWord n =+        let+          c = chr (ord '0' + primWordToInt (rem n (10::Word)))+        in  case n < (10::Word) of+              False -> showWord (quot n (10::Word)) ++ [c]+              True  -> [c]
+ lib/Debug/Trace.hs view
@@ -0,0 +1,13 @@+module Debug.Trace(module Debug.Trace) where+import Prelude+import Primitives++trace :: forall a . String -> a -> a+trace msg a = primitive "IO.performIO" (+  do+    putStrLn msg+    return a+  )++traceM :: forall (m :: Type -> Type) a . Monad m => String -> m ()+traceM s = trace s (return ())
+ lib/Foreign/C/String.hs view
@@ -0,0 +1,24 @@+module Foreign.C.String(+  CChar, CString,+  newCAString, withCAString,+  peekCAString,+  ) where+import Primitives+import Data.Char_Type+import Foreign.Marshal.Alloc++type CChar = Char+type CString = Ptr CChar++newCAString :: String -> IO CString+newCAString = primNewCAString++withCAString :: forall a . String -> (CString -> IO a) -> IO a+withCAString s io =+  newCAString s `primBind` \ cs ->+  io cs `primBind` \ a ->+  free cs `primThen`+  primReturn a++peekCAString :: CString -> IO String+peekCAString = primPeekCAString
+ lib/Foreign/Marshal/Alloc.hs view
@@ -0,0 +1,15 @@+module Foreign.Marshal.Alloc(+  free,+  mallocBytes,+  ) where+import Primitives++foreign import ccall "free" c_free :: forall a . Ptr a -> IO ()++free :: forall a . Ptr a -> IO ()+free = c_free++foreign import ccall "malloc" c_malloc :: forall a . Int -> IO (Ptr a)++mallocBytes :: forall a . Int -> IO (Ptr a)+mallocBytes = c_malloc
+ lib/Foreign/Ptr.hs view
@@ -0,0 +1,15 @@+module Foreign.Ptr(Ptr, nullPtr) where+import Primitives+import Data.Word+import Data.Eq+import Data.Function+import Text.Show++instance forall a . Eq (Ptr a) where+  p == q  =  primPtrToWord p == primPtrToWord q++instance forall a . Show (Ptr a) where+  showsPrec _ p = showString "PTR#" . showsPrec 0 (primPtrToWord p)++nullPtr :: forall a . Ptr a+nullPtr = primWordToPtr 0
+ lib/Prelude.hs view
@@ -0,0 +1,65 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Prelude(+  module Control.Applicative,+  module Control.Error,+  module Control.Monad,+  module Data.Bool,+  module Data.Bounded,+  module Data.Char,+  module Data.Double,+  module Data.Either,+  module Data.Enum,+  module Data.Eq,+  module Data.Floating,+  module Data.Fractional,+  module Data.Function,+  module Data.Functor,+  module Data.Int,+  module Data.Integer,+  module Data.Integral,+  module Data.List,+  module Data.Maybe,+  module Data.Num,+  module Data.Ord,+  module Data.Ratio,+  module Data.Real,+  module Data.RealFloat,+  module Data.Tuple,+  module System.IO,+  module Text.Show,+  module Text.String,+  usingMhs,+  ) where+import Control.Applicative+import Control.Error+import Control.Monad+import Data.Bool+import Data.Bounded+import Data.Char+import Data.Double+import Data.Either+import Data.Enum+import Data.Eq+import Data.Floating+import Data.Fractional+import Data.Function+import Data.Functor+import Data.Int+import Data.Integer+import Data.Integral+import Data.List+import Data.Maybe+import Data.Num+import Data.Ord+import Data.Ratio(Rational)+import Data.Real+import Data.RealFloat+import Data.Tuple+import System.IO+import Text.Show+import Text.String++-- So we can detect mhs vs ghc+usingMhs :: Bool+usingMhs = True
+ lib/Primitives.hs view
@@ -0,0 +1,206 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Primitives(module Primitives) where+import Data.Bool_Type+--import Data.List_Type+import Data.Ordering_Type++infixr -1 ->+infixr -2 =>+infix   4 ~++data Any+data Char+data Handle+data Int+data Double+data IO a+data Word+data Ptr a++-- Type equality as a constraint.+class a ~ b {-x | a -> b, b -> a-}++data () = ()   -- Parser hacks allows () to be used++primIntAdd :: Int -> Int -> Int+primIntAdd  = primitive "+"+primIntSub :: Int -> Int -> Int+primIntSub  = primitive "-"+primIntMul :: Int -> Int -> Int+primIntMul  = primitive "*"+primIntQuot :: Int -> Int -> Int+primIntQuot = primitive "quot"+primIntRem :: Int -> Int -> Int+primIntRem  = primitive "rem"+primIntSubR :: Int -> Int -> Int+primIntSubR = primitive "subtract"+primIntNeg :: Int -> Int+primIntNeg = primitive "neg"++primDoubleAdd :: Double -> Double -> Double+primDoubleAdd  = primitive "fadd"+primDoubleSub :: Double -> Double -> Double+primDoubleSub  = primitive "fsub"+primDoubleMul :: Double -> Double -> Double+primDoubleMul  = primitive "fmul"+primDoubleDiv :: Double -> Double -> Double+primDoubleDiv = primitive "fdiv"+primDoubleNeg :: Double -> Double+primDoubleNeg = primitive "fneg"+primDoubleEQ :: Double -> Double -> Bool+primDoubleEQ = primitive "feq"+primDoubleNE :: Double -> Double -> Bool+primDoubleNE = primitive "fne"+primDoubleLT :: Double -> Double -> Bool+primDoubleLT = primitive "flt"+primDoubleLE :: Double -> Double -> Bool+primDoubleLE = primitive "fle"+primDoubleGT :: Double -> Double -> Bool+primDoubleGT = primitive "fgt"+primDoubleGE :: Double -> Double -> Bool+primDoubleGE = primitive "fge"+primDoubleShow :: Double -> [Char]+primDoubleShow = primitive "fshow"+primDoubleRead :: [Char] -> Double+primDoubleRead = primitive "fread"+primDoubleFromInt :: Int -> Double+primDoubleFromInt = primitive "itof"++primWordAdd :: Word -> Word -> Word+primWordAdd  = primitive "+"+primWordSub :: Word -> Word -> Word+primWordSub  = primitive "-"+primWordMul :: Word -> Word -> Word+primWordMul  = primitive "*"+primWordQuot :: Word -> Word -> Word+primWordQuot = primitive "uquot"+primWordRem :: Word -> Word -> Word+primWordRem  = primitive "urem"+primWordAnd :: Word -> Word -> Word+primWordAnd  = primitive "and"+primWordOr :: Word -> Word -> Word+primWordOr  = primitive "or"+primWordXor :: Word -> Word -> Word+primWordXor  = primitive "xor"+primWordShl :: Word -> Int -> Word+primWordShl  = primitive "shl"+primWordShr :: Word -> Int -> Word+primWordShr  = primitive "shr"+primWordAshr :: Word -> Int -> Word+primWordAshr  = primitive "ashr"+primWordInv :: Word -> Word+primWordInv  = primitive "inv"+primWordToDoubleRaw :: Word -> Double+primWordToDoubleRaw = primitive "toDbl"+primWordFromDoubleRaw :: Double -> Word+primWordFromDoubleRaw = primitive "toInt"++primIntEQ   :: Int -> Int -> Bool+primIntEQ   = primitive "=="+primIntNE   :: Int -> Int -> Bool+primIntNE   = primitive "/="+primIntLT   :: Int -> Int -> Bool+primIntLT   = primitive "<"+primIntLE   :: Int -> Int -> Bool+primIntLE   = primitive "<="+primIntGT   :: Int -> Int -> Bool+primIntGT   = primitive ">"+primIntGE   :: Int -> Int -> Bool+primIntGE   = primitive ">="++primWordEQ  :: Word -> Word -> Bool+primWordEQ  = primitive "=="+primWordNE  :: Word -> Word -> Bool+primWordNE  = primitive "/="+primWordLT  :: Word -> Word -> Bool+primWordLT  = primitive "u<"+primWordLE   :: Word -> Word -> Bool+primWordLE   = primitive "<="+primWordGT   :: Word -> Word -> Bool+primWordGT   = primitive ">"+primWordGE   :: Word -> Word -> Bool+primWordGE   = primitive ">="++primWordToInt :: Word -> Int+primWordToInt = primitive "I"+primIntToWord :: Int -> Word+primIntToWord = primitive "I"++primCharEQ :: Char -> Char -> Bool+primCharEQ  = primitive "=="+primCharNE :: Char -> Char -> Bool+primCharNE  = primitive "/="+primCharLT :: Char -> Char -> Bool+primCharLT  = primitive "<"+primCharLE :: Char -> Char -> Bool+primCharLE  = primitive "<="+primCharGT :: Char -> Char -> Bool+primCharGT  = primitive ">"+primCharGE :: Char -> Char -> Bool+primCharGE  = primitive ">="++primError  :: forall a . [Char] -> a+primError  = primitive "error"++primFix    :: forall a . (a -> a) -> a+primFix    = primitive "Y"++primSeq    :: forall a b . a -> b -> b+primSeq    = primitive "seq"++--primEqual  :: forall a . a -> a -> Bool+--primEqual  = primitive "equal"++-- Works for Int, Char, String+primCompare :: forall a . a -> a -> Ordering+primCompare  = primitive "compare"++primStringEQ  :: [Char] -> [Char] -> Bool+primStringEQ  = primitive "equal"++primChr :: Int -> Char+primChr = primitive "I"+primOrd :: Char -> Int+primOrd = primitive "I"++primUnsafeCoerce :: forall a b . a -> b+primUnsafeCoerce = primitive "I"++primBind         :: forall a b . IO a -> (a -> IO b) -> IO b+primBind          = primitive "IO.>>="+primThen         :: forall a b . IO a -> IO b -> IO b+primThen          = primitive "IO.>>"+primReturn       :: forall a . a -> IO a+primReturn        = primitive "IO.return"+primGetArgs      :: IO [[Char]]+primGetArgs       = primitive "IO.getArgs"+primDropArgs     :: Int -> IO ()+primDropArgs      = primitive "IO.dropArgs"+primPerformIO    :: forall a . IO a -> a+primPerformIO     = primitive "IO.performIO"++primWithDropArgs :: forall a . Int -> IO a -> IO a+primWithDropArgs i ioa = primThen (primDropArgs i) ioa++-- Use string for the exception until we can do better.+primCatch        :: forall a . IO a -> ([Char] -> IO a) -> IO a+primCatch         = primitive "IO.catch"++primRnfErr       :: forall a . a -> ()+primRnfErr        = primitive "rnf" (0::Int)++primRnfNoErr     :: forall a . a -> ()+primRnfNoErr      = primitive "rnf" (1::Int)++primNewCAString :: [Char] -> IO (Ptr Char)+primNewCAString = primitive "newCAString"++primPeekCAString :: Ptr Char -> IO [Char]+primPeekCAString = primitive "peekCAString"++primWordToPtr :: forall a . Word -> Ptr a+primWordToPtr = primitive "toPtr"++primPtrToWord :: forall a . Ptr a -> Word+primPtrToWord = primitive "toInt"
+ lib/System/Console/SimpleReadline.hs view
@@ -0,0 +1,174 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+--+-- Simple readline with line editing and history.+-- Only assumes the terminal is capable of (sane) backspace.+module System.Console.SimpleReadline(+  getInputLine,+  getInputLineHist+  ) where+import Prelude+import Control.Monad+import Data.Char+import System.IO+--Ximport Compat++foreign import ccall "getRaw" c_getRaw :: IO Int+++-- Get an input line with editing.+-- Return Nothing if the input is ^D, otherwise the typed string.+getInputLine :: String -> IO (Maybe String)+getInputLine prompt = do+  (_, r) <- loop ([],[]) "" ""+  return r+++-- Get an input line with editing.+-- Return Nothing if the input is ^D, otherwise the typed string.+-- The FilePath gives the name of a file that stores the history.+getInputLineHist :: FilePath -> String -> IO (Maybe String)+getInputLineHist hfn prompt = do+  mhdl <- openFileM hfn ReadMode+  hist <-+    case mhdl of+      Nothing -> return []+      Just hdl -> do+        file <- hGetContents hdl+        let h = lines file+        seq (length h) (return h)   -- force file to be read+  putStr prompt+  (hist', r) <- loop (reverse hist, []) "" ""+--  putStrLn $ "done: " ++ hfn ++ "\n" ++ unlines hist'+  writeFile hfn $ unlines hist'+  return r   -- XXX no type error++getRaw :: IO Int+getRaw = do+  i <- c_getRaw+  when (i < 0) $+    error "getRaw failed"+  return i++type Hist = ([String], [String])++loop :: Hist -> String -> String -> IO ([String], Maybe String)+loop hist before after = do+  hFlush stdout+  i <- getRaw+  let+    cur = reverse before ++ after+    back n = putStr (replicate n '\b')++    add c = do+      putChar c+      putStr after+      back (length after)+      loop hist (c:before) after+    backward =+      case before of+        [] -> noop+        c:cs -> do+          back 1+          loop hist cs (c:after)+    forward =+      case after of+        [] -> noop+        c:cs -> do+          putChar c+          loop hist (c:before) cs+    bol = do+      back (length before)+      loop hist "" (reverse before ++ after)+    eol = do+      putStr after+      loop hist (reverse after ++ before) ""+    bs = do+      case before of+        [] -> noop+        _:cs -> do+          back 1+          putStr after+          putChar ' '+          back (length after + 1)+          loop hist cs after+    del = do+      case after of+        [] -> noop+        _:cs -> do+          putStr cs+          putChar ' '+          back (length cs + 1)+          loop hist before cs+    send =+      ret (Just cur)+    ret ms = do+      putChar '\n'+      hFlush stdout+      let+        o = reverse (fst hist) ++ snd hist+        l =+          case ms of+            Nothing -> []+            Just "" -> []+            Just s  | not (null o) && s == last o -> []+                    | otherwise -> [s]+        h = o ++ l+      return (h, ms)+    erase = do+      eraseLine+      loop hist "" ""+    noop = loop hist before after+    kill = do+      putStr after+      putStr $ concat $ replicate (length after) "\b \b"+      loop hist before ""++    next =+      case hist of+        (_, []) -> noop+        (p, l:n) -> setLine (l:p, n) l+    previous =+      case hist of+        ([], _) -> noop+        (l:p, n) -> setLine (p, l:n) l+    setLine h s = do+      eraseLine+      putStr s+      loop h (reverse s) ""++    eraseLine = do+      putStr after+      putStr $ concat $ replicate (length before + length after) "\b \b"++  case i of+    4 ->                     -- CTL-D, EOF+      if null before && null after then+        ret Nothing+      else+        del+    2  -> backward           -- CTL-B, backwards+    6  -> forward            -- CTL-F, forwards+    1  -> bol                -- CTL-A, beginning of line+    5  -> eol                -- CTL-E, end of line+    8  -> bs                 -- BS, backspace+    127 -> bs                -- DEL, backspace+    13 -> send               -- CR, return+    10 -> send               -- LF, return+    14 -> next               -- CTL-N, next line+    15 -> previous           -- CTL-P, previous line+    21 -> erase              -- CTL-U, erase line+    11 -> kill               -- CTL-K, kill to eol+    27 -> do                 -- ESC+      b <- getRaw+      if b /= ord '[' then+        noop+       else do+        c <- getRaw+        case chr c of+          'A' -> previous+          'B' -> next+          'C' -> forward+          'D' -> backward+          _ -> noop+    _ -> if i >= 32 && i < 127 then add (chr i) else noop
+ lib/System/Directory.hs view
@@ -0,0 +1,12 @@+module System.Directory(removeFile) where+import Prelude+import Foreign.C.String+import Foreign.Ptr++foreign import ccall "unlink" c_unlink :: CString -> IO Int++removeFile :: FilePath -> IO ()+removeFile fn = do+  r <- withCAString fn c_unlink+  when (r /= 0) $+    error "removeFile failed"
+ lib/System/Environment.hs view
@@ -0,0 +1,23 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module System.Environment(module System.Environment) where+import Prelude+import Primitives+import Foreign.C.String+import Foreign.Ptr++getArgs :: IO [String]+getArgs = primGetArgs++withDropArgs :: forall a . Int -> IO a -> IO a+withDropArgs = primWithDropArgs++foreign import ccall "getenv" c_getenv :: CString -> IO CString++lookupEnv :: String -> IO (Maybe String)+lookupEnv var = do+  cptr <- withCAString var c_getenv+  if cptr == nullPtr then+    return Nothing+   else+    Just <$> peekCAString cptr
+ lib/System/IO.hs view
@@ -0,0 +1,236 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module System.IO(+  module System.IO, Handle, IO,+  module Data.Functor,+  module Control.Applicative,+  module Control.Monad,+  ) where+import Primitives+import Control.Applicative+import Control.Error+import Control.Monad+import Data.Bool+import Data.Char+import Data.Eq+import Data.Function+import Data.Functor+import Data.Int+import Data.List+import Data.Maybe+import Data.Num+import Data.Tuple+import Text.Show+import Foreign.C.String+import Foreign.Marshal.Alloc+import Foreign.Ptr++data FILE+newtype Handle = Handle (Ptr FILE)++primHSerialize   :: forall a . Handle -> a -> IO ()+primHSerialize    = primitive "IO.serialize"+primHPrint       :: forall a . Handle -> a -> IO ()+primHPrint        = primitive "IO.print"+primHDeserialize :: forall a . Handle -> IO a+primHDeserialize  = primitive "IO.deserialize"+primStdin        :: Handle+primStdin         = primitive "IO.stdin"+primStdout       :: Handle+primStdout        = primitive "IO.stdout"+primStderr       :: Handle+primStderr        = primitive "IO.stderr"++foreign import ccall "fopen"        c_fopen        :: CString -> CString -> IO Handle+foreign import ccall "fclose"       c_fclose       :: Handle             -> IO Int+foreign import ccall "fflush"       c_fflush       :: Handle             -> IO Int+foreign import ccall "fgetc"        c_fgetc        :: Handle             -> IO Int+foreign import ccall "fputc"        c_fputc        :: Int ->     Handle  -> IO Int+foreign import ccall "getTimeMilli" c_getTimeMilli ::                       IO Int++----------------------------------------------------------++instance Eq Handle where+  Handle p == Handle q  =  p == q++instance Show Handle where+  show (Handle p) = "Handle-" ++ show p++nullHandle :: Handle+nullHandle = Handle nullPtr++type FilePath = String++data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode++instance Functor IO where+  fmap f ioa   = ioa `primBind` \ a -> primReturn (f a)+instance Applicative IO where+  pure         = primReturn+  (<*>)        = ap+instance Monad IO where+  (>>=)        = primBind+  (>>)         = primThen+  return       = primReturn+instance MonadFail IO where+  fail         = error++hSerialize   :: forall a . Handle -> a -> IO ()+hSerialize   = primHSerialize++hDeserialize :: forall a . Handle -> IO a+hDeserialize = primHDeserialize++stdin        :: Handle+stdin        = primStdin+stdout       :: Handle+stdout       = primStdout+stderr       :: Handle+stderr       = primStderr++hClose       :: Handle -> IO ()+hClose h     = do { c_fclose h; return () }  -- ignore error code++hFlush       :: Handle -> IO ()+hFlush h     = do { c_fflush h; return () }  -- ignore error code++hGetChar :: Handle -> IO Char+hGetChar h = do+  c <- c_fgetc h+  if c == (-1::Int) then+    error "hGetChar: EOF"+   else+    return (chr c)++hPutChar :: Handle -> Char -> IO ()+hPutChar h c = do { c_fputc (ord c) h; return () }  -- ignore error code++openFileM :: FilePath -> IOMode -> IO (Maybe Handle)+openFileM p m = do+  let+    ms = case m of+          ReadMode -> "r"+          WriteMode -> "w"+          AppendMode -> "a"+          ReadWriteMode -> "w+"+  h <- withCAString p $ \cp -> withCAString ms $ \ cm -> c_fopen cp cm+  if h == nullHandle then+    return Nothing+   else+    return (Just h)++openFile :: String -> IOMode -> IO Handle+openFile p m = do+  mh <- openFileM p m+  case mh of+    Nothing -> error ("openFile: cannot open " ++ p)+    Just h -> return h++putChar :: Char -> IO ()+putChar = hPutChar stdout++getChar :: IO Char+getChar = hGetChar stdin++cprint :: forall a . a -> IO ()+cprint a = primRnfNoErr a `seq` primHPrint stdout a++cuprint :: forall a . a -> IO ()+cuprint = primHPrint stdout++print :: forall a . (Show a) => a -> IO ()+print a = putStrLn (show a)++putStr :: String -> IO ()+putStr = hPutStr stdout++hPutStr :: Handle -> String -> IO ()+hPutStr h = mapM_ (hPutChar h)++putStrLn :: String -> IO ()+putStrLn = hPutStrLn stdout++hPutStrLn :: Handle -> String -> IO ()+hPutStrLn h s = hPutStr h s >> hPutChar h '\n'++writeFile :: FilePath -> String -> IO ()+writeFile p s = do+  h <- openFile p WriteMode+  hPutStr h s+  hClose h++-- Lazy readFile+readFile :: FilePath -> IO String+readFile p = do+  h <- openFile p ReadMode+  cs <- hGetContents h+  --hClose h  can't close with lazy hGetContents+  return cs++-- Lazy hGetContents+hGetContents :: Handle -> IO String+hGetContents h = do+  c <- c_fgetc h+  if c == (-1::Int) then do+    hClose h   -- EOF, so close the handle+    return ""+   else do+    cs <- unsafeInterleaveIO (hGetContents h)+    return (chr c : cs)+  +writeSerialized :: forall a . FilePath -> a -> IO ()+writeSerialized p s = do+  h <- openFile p WriteMode+  hSerialize h s+  hClose h++readSerialized :: forall a . FilePath -> IO a+readSerialized p = do+  h <- openFile p ReadMode+  a <- hDeserialize h+  hClose h+  return a++getTimeMilli :: IO Int+getTimeMilli = c_getTimeMilli++unsafeInterleaveIO :: forall a . IO a -> IO a+unsafeInterleaveIO ioa = return (primPerformIO ioa)++seq :: forall a b . a -> b -> b+seq = primSeq++-- MicroHs is always in binary mode+hSetBinaryMode :: Handle -> Bool -> IO ()+hSetBinaryMode _ _ = return ()++--------++-- Create a temporary file, take a prefix and a suffix+-- and returns a malloc()ed string.+foreign import ccall "tmpname" c_tmpname :: CString -> CString -> IO CString++-- Create and open a temporary file.+openTmpFile :: String -> IO (String, Handle)+openTmpFile tmpl = do+  let (pre, suf) =+        case span (/= '.') (reverse tmpl) of+          (rsuf, "") -> (tmpl, "")+          (rsuf, _:rpre) -> (reverse rpre, '.':reverse rsuf)+  ctmp <- withCAString pre $ withCAString suf . c_tmpname+  tmp <- peekCAString ctmp+  free ctmp+  h <- openFile tmp WriteMode+  return (tmp, h)++--------++-- Helper for interactive system+class PrintOrRun a where+  printOrRun :: a -> IO ()++instance PrintOrRun (IO ()) where+  printOrRun a = a++instance forall a . Show a => PrintOrRun a where+  printOrRun a = putStrLn (show a)
+ lib/System/Process.hs view
@@ -0,0 +1,11 @@+module System.Process(callCommand) where+import Prelude+import Foreign.C.String++foreign import ccall "system" systemc :: CString -> IO Int++callCommand :: String -> IO ()+callCommand cmd = do+  r <- withCAString cmd systemc+  when (r /= 0) $+    error $ "callCommand: failed " ++ show r
+ lib/Text/PrettyPrint/HughesPJ.hs view
@@ -0,0 +1,368 @@+--  Based on the pretty-printer outlined in the paper+-- 'The Design of a Pretty-printing Library' by+-- John Hughes in Advanced Functional Programming, 1995.+-- With inspiration and code from the from the Hackage package pretty.+module Text.PrettyPrint.HughesPJ(+  Doc,+  text, empty,+  (<>), (<+>), ($$), ($+$),+  hcat, hsep,+  vcat,+  sep, cat,+  nest, hang,+  punctuate,+  parens, brackets, braces,+  maybeParens,+  Style,+  render, renderStyle,+  ) where+import Prelude++infixl 6 <>, <+>+infixl 5 $$, $+$++data Doc+  = Empty                                            -- ^ An empty span, see 'empty'.+  | NilAbove Doc                                     -- ^ @text "" $$ x@.+  | TextBeside String Doc                            -- ^ @text s <> x@.+  | Nest Int Doc                                     -- ^ @nest k x@.+  | Union Doc Doc                                    -- ^ @ul `union` ur@.+  | NoDoc                                            -- ^ The empty set of documents.+  | Beside Doc Bool Doc                              -- ^ True <=> space between.+  | Above Doc Bool Doc                               -- ^ True <=> never overlap.++type RDoc = Doc++text :: String -> Doc+text s = TextBeside s Empty++empty :: Doc+empty = Empty++reduceDoc :: Doc -> RDoc+reduceDoc (Beside p g q) = beside p g (reduceDoc q)+reduceDoc (Above  p g q) = above  p g (reduceDoc q)+reduceDoc p              = p++hcat :: [Doc] -> Doc+hcat = snd . reduceHoriz . foldr (\p q -> Beside p False q) empty++hsep :: [Doc] -> Doc+hsep = snd . reduceHoriz . foldr (\p q -> Beside p True q)  empty++vcat :: [Doc] -> Doc+vcat = snd . reduceVert . foldr (\p q -> Above p False q) empty++nest :: Int -> Doc -> Doc+nest k p = mkNest k (reduceDoc p)++-- | @hang d1 n d2 = sep [d1, nest n d2]@+hang :: Doc -> Int -> Doc -> Doc+hang d1 n d2 = sep [d1, nest n d2]++punctuate :: Doc -> [Doc] -> [Doc]+punctuate _ []     = []+punctuate p (x:xs) = go x xs+                   where go y []     = [y]+                         go y (z:zs) = (y <> p) : go z zs++maybeParens :: Bool -> Doc -> Doc+maybeParens False = id+maybeParens True = parens++parens :: Doc -> Doc+parens p = text "(" <> p <> text ")"+braces :: Doc -> Doc+braces p = text "{" <> p <> text "}"+brackets :: Doc -> Doc+brackets p = text "[" <> p <> text "]"++-- mkNest checks for Nest's invariant that it doesn't have an Empty inside it+mkNest :: Int -> Doc -> Doc+mkNest k _ | k `seq` False = undefined+mkNest k (Nest k1 p)       = mkNest (k + k1) p+mkNest _ NoDoc             = NoDoc+mkNest _ Empty             = Empty+mkNest 0 p                 = p+mkNest k p                 = nest_ k p++-- mkUnion checks for an empty document+mkUnion :: Doc -> Doc -> Doc+mkUnion Empty _ = Empty+mkUnion p q     = p `union_` q++data IsEmpty = IsEmpty | NotEmpty++reduceHoriz :: Doc -> (IsEmpty, Doc)+reduceHoriz (Beside p g q) = eliminateEmpty Beside (snd (reduceHoriz p)) g (reduceHoriz q)+reduceHoriz doc            = (NotEmpty, doc)++reduceVert :: Doc -> (IsEmpty, Doc)+reduceVert (Above  p g q) = eliminateEmpty Above  (snd (reduceVert p)) g (reduceVert q)+reduceVert doc            = (NotEmpty, doc)++eliminateEmpty ::+  (Doc -> Bool -> Doc -> Doc) ->+  Doc -> Bool -> (IsEmpty, Doc) -> (IsEmpty, Doc)+eliminateEmpty _    Empty _ q          = q+eliminateEmpty cons p     g q          =+  (NotEmpty,+   case q of+     (NotEmpty, q') -> cons p g q'+     (IsEmpty, _) -> p+  )++nilAbove_ :: RDoc -> RDoc+nilAbove_ = NilAbove++-- | Arg of a TextBeside is always an RDoc.+textBeside_ :: String -> RDoc -> RDoc+textBeside_  = TextBeside++nest_ :: Int -> RDoc -> RDoc+nest_ = Nest++union_ :: RDoc -> RDoc -> RDoc+union_ = Union++($$) :: Doc -> Doc -> Doc+p $$  q = above_ p False q++-- | Above, with no overlapping.+-- '$+$' is associative, with identity 'empty'.+($+$) :: Doc -> Doc -> Doc+p $+$ q = above_ p True q++above_ :: Doc -> Bool -> Doc -> Doc+above_ p _ Empty = p+above_ Empty _ q = q+above_ p g q     = Above p g q++above :: Doc -> Bool -> RDoc -> RDoc+above (Above p g1 q1)  g2 q2 = above p g1 (above q1 g2 q2)+above p@(Beside _ _ _) g  q  = aboveNest (reduceDoc p) g 0 (reduceDoc q)+above p g q                  = aboveNest p             g 0 (reduceDoc q)++-- Specfication: aboveNest p g k q = p $g$ (nest k q)+aboveNest :: RDoc -> Bool -> Int -> RDoc -> RDoc+aboveNest _                   _ k _ | k `seq` False = undefined+aboveNest NoDoc               _ _ _ = NoDoc+aboveNest (p1 `Union` p2)     g k q = aboveNest p1 g k q `union_`+                                      aboveNest p2 g k q++aboveNest Empty               _ k q = mkNest k q+aboveNest (Nest k1 p)         g k q = nest_ k1 (aboveNest p g (k - k1) q)+                                  -- p can't be Empty, so no need for mkNest++aboveNest (NilAbove p)        g k q = nilAbove_ (aboveNest p g k q)+aboveNest (TextBeside s p)    g k q = TextBeside s rest+                                    where+                                      k1  = k - length s+                                      rest = case p of+                                                Empty -> nilAboveNest g k1 q+                                                _     -> aboveNest  p g k1 q++aboveNest (Above  _ _ _)      _ _ _ = error "aboveNest Above"+aboveNest (Beside _ _ _)      _ _ _ = error "aboveNest Beside"++-- Specification: text s <> nilaboveNest g k q+--              = text s <> (text "" $g$ nest k q)+nilAboveNest :: Bool -> Int -> RDoc -> RDoc+nilAboveNest _ k _           | k `seq` False = undefined+nilAboveNest _ _ Empty       = Empty+                               -- Here's why the "text s <>" is in the spec!+nilAboveNest g k (Nest k1 q) = nilAboveNest g (k + k1) q+nilAboveNest g k q           | not g && k > 0      -- No newline if no overlap+                             = textBeside_ (replicate k ' ') q+                             | otherwise           -- Put them really above+                             = nilAbove_ (mkNest k q)++(<>) :: Doc -> Doc -> Doc+p <>  q = beside_ p False q++-- | Beside, separated by space, unless one of the arguments is 'empty'.+-- '<+>' is associative, with identity 'empty'.+(<+>) :: Doc -> Doc -> Doc+p <+> q = beside_ p True  q++beside_ :: Doc -> Bool -> Doc -> Doc+beside_ p _ Empty = p+beside_ Empty _ q = q+beside_ p g q     = Beside p g q++-- Specification: beside g p q = p <g> q+beside :: Doc -> Bool -> RDoc -> RDoc+beside NoDoc               _ _   = NoDoc+beside (p1 `Union` p2)     g q   = beside p1 g q `union_` beside p2 g q+beside Empty               _ q   = q+beside (Nest k p)          g q   = nest_ k $! beside p g q+beside p@(Beside p1 g1 q1) g2 q2+         | g1 == g2              = beside p1 g1 $! beside q1 g2 q2+         | otherwise             = beside (reduceDoc p) g2 q2+beside p@(Above _ _ _)     g q   = let { d = reduceDoc p } in beside d g q+beside (NilAbove p)        g q   = nilAbove_ $! beside p g q+beside (TextBeside t p)    g q   = TextBeside t rest+                               where+                                  rest = case p of+                                           Empty -> nilBeside g q+                                           _     -> beside p g q++-- Specification: text "" <> nilBeside g p+--              = text "" <g> p+nilBeside :: Bool -> RDoc -> RDoc+nilBeside _ Empty         = Empty -- Hence the text "" in the spec+nilBeside g (Nest _ p)    = nilBeside g p+nilBeside g p | g         = textBeside_ " " p+              | otherwise = p++sep  :: [Doc] -> Doc+sep = sepX True   -- Separate with spaces++-- | Either 'hcat' or 'vcat'.+cat :: [Doc] -> Doc+cat = sepX False  -- Don't++sepX :: Bool -> [Doc] -> Doc+sepX _ []     = empty+sepX x (p:ps) = sep1 x (reduceDoc p) 0 ps+++-- Specification: sep1 g k ys = sep (x : map (nest k) ys)+--                            = oneLiner (x <g> nest k (hsep ys))+--                              `union` x $$ nest k (vcat ys)+sep1 :: Bool -> RDoc -> Int -> [Doc] -> RDoc+sep1 _ _                   k _  | k `seq` False = undefined+sep1 _ NoDoc               _ _  = NoDoc+sep1 g (p `Union` q)       k ys = sep1 g p k ys `union_`+                                  aboveNest q False k (reduceDoc (vcat ys))++sep1 g Empty               k ys = mkNest k (sepX g ys)+sep1 g (Nest n p)          k ys = nest_ n (sep1 g p (k - n) ys)++sep1 _ (NilAbove p)        k ys = nilAbove_+                                  (aboveNest p False k (reduceDoc (vcat ys)))+sep1 g (TextBeside s p) k ys    = textBeside_ s (sepNB g p (k - length s) ys)+sep1 _ (Above _ _ _)       _ _  = error "sep1 Above"+sep1 _ (Beside _ _ _)      _ _  = error "sep1 Beside"++sepNB :: Bool -> Doc -> Int -> [Doc] -> Doc+sepNB g (Nest _ p) k ys+  = sepNB g p k ys+sepNB g Empty k ys+  = oneLiner (nilBeside g (reduceDoc rest)) `mkUnion`+    nilAboveNest False k (reduceDoc (vcat ys))+  where+    rest | g         = hsep ys+         | otherwise = hcat ys+sepNB g p k ys+  = sep1 g p k ys++oneLiner :: Doc -> Doc+oneLiner NoDoc               = NoDoc+oneLiner Empty               = Empty+oneLiner (NilAbove _)        = NoDoc+oneLiner (TextBeside s p)    = textBeside_ s (oneLiner p)+oneLiner (Nest k p)          = nest_ k (oneLiner p)+oneLiner (p `Union` _)       = oneLiner p+oneLiner (Above _ _ _)       = error "oneLiner Above"+oneLiner (Beside _ _ _)      = error "oneLiner Beside"++-- ---------------------------------------------------------------------------+-- Rendering++-- | A rendering style. Allows us to specify constraints to choose among the+-- many different rendering options.+data Style = Style Int Rat+lineLength :: Style -> Int+lineLength (Style l _) = l+ribbonsPerLine :: Style -> Rat+ribbonsPerLine (Style _ r) = r++type Rat = (Int, Int)++style :: Style+style = Style 100 (3, 2)++-- | Render the @Doc@ to a String using the default @Style@ (see 'style').+render :: Doc -> String+render = renderStyle style++-- | Render the @Doc@ to a String using the given @Style@.+renderStyle :: Style -> Doc -> String+renderStyle s = fullRender (lineLength s) (ribbonsPerLine s) ""++-- | The general rendering interface. Please refer to the @Style@ and @Mode@+-- types for a description of rendering mode, line length and ribbons.+fullRender :: Int                     -- ^ Line length.+           -> Rat                     -- ^ Ribbons per line.+           -> String                  -- ^ What to do at the end.+           -> Doc                     -- ^ The document.+           -> String                  -- ^ Result.+fullRender lineLen (num, den) rest doc+  = display lineLen ribbonLen rest doc'+  where+    doc' = best bestLineLen ribbonLen (reduceDoc doc)++    ribbonLen   = (lineLen * den) `quot` num+    bestLineLen = lineLen+                    +display :: Int -> Int -> String -> Doc -> String+display _page_width _ribbon_width end doc+  = let lay :: Int -> Doc -> String+        lay k (Nest k1 p)  = lay (k + k1) p+        lay _ Empty        = end+        lay k (NilAbove p) = "\n" ++ lay k p+        lay k (TextBeside s p) = lay1 k s p+        lay _ _            = error "display lay"++        lay1 k s p        = let r = k + length s+                            in replicate k ' ' ++ (s ++ lay2 r p)++        lay2 :: Int -> Doc -> String+        lay2 k (NilAbove p)        = "\n" ++ lay k p+        lay2 k (TextBeside s p)    = s ++ lay2 (k + length s) p+        lay2 k (Nest _ p)          = lay2 k p+        lay2 _ Empty               = end+        lay2 _ _                   = error "display lay2"+    in  lay 0 doc++best :: Int   -- Line length.+     -> Int   -- Ribbon length.+     -> RDoc+     -> RDoc  -- No unions in here!.+best w0 r = get w0+  where+    get _ Empty               = Empty+    get _ NoDoc               = NoDoc+    get w (NilAbove p)        = nilAbove_ (get w p)+    get w (TextBeside s p)    = textBeside_ s (get1 w (length s) p)+    get w (Nest k p)          = nest_ k (get (w - k) p)+    get w (p `Union` q)       = nicest w r (get w p) (get w q)+    get _ _                   = error "best get"++    get1 _ _  Empty               = Empty+    get1 _ _  NoDoc               = NoDoc+    get1 w sl (NilAbove p)        = nilAbove_ (get (w - sl) p)+    get1 w sl (TextBeside s p)    = textBeside_ s (get1 w (sl + length s) p)+    get1 w sl (Nest _ p)          = get1 w sl p+    get1 w sl (p `Union` q)       = nicest1 w r sl (get1 w sl p)+                                                   (get1 w sl q)+    get1 _ _  _                   = error "best get1"++nicest :: Int -> Int -> Doc -> Doc -> Doc+nicest w r = nicest1 w r 0++nicest1 :: Int -> Int -> Int -> Doc -> Doc -> Doc+nicest1 w r sl p q | fits (minWR - sl) p = p+                   | otherwise           = q+  where minWR = if w < r then w else r++fits :: Int  -- Space available+     -> Doc+     -> Bool -- True if *first line* of Doc fits in space available+fits n _ | n < 0           = False+fits _ NoDoc               = False+fits _ Empty               = True+fits _ (NilAbove _)        = True+fits n (TextBeside s p)    = fits (n - length s) p+fits _ _                   = error "fits"
+ lib/Text/Show.hs view
@@ -0,0 +1,41 @@+module Text.Show(module Text.Show) where+import Primitives+import Data.Bool_Type+import Data.Char_Type+import Data.List_Type++type ShowS = String -> String++class Show a where+  showsPrec :: Int -> a -> ShowS+  show      :: a -> String+  showList  :: [a] -> ShowS++  showsPrec _ x s = show x ++ s+  show x          = showsPrec 0 x ""+  showList        = showListWith shows++shows :: forall a . Show a => a -> ShowS+shows = showsPrec 0++showChar :: Char -> ShowS+showChar = (:)++showString :: String -> ShowS+showString = (++)++showParen :: Bool -> ShowS -> ShowS+showParen False sh = sh+showParen True  sh = \ x -> '(' : sh (')' : x)++showListWith :: forall a . (a -> ShowS) -> [a] -> ShowS+showListWith _  []     s = '[' : ']' : s+showListWith sh (x:xs) s = '[' : sh x (shl xs)+  where+    shl []     = ']' : s+    shl (y:ys) = ',' : sh y (shl ys)++appPrec :: Int+appPrec = 10+appPrec1 :: Int+appPrec1 = 11
+ lib/Text/String.hs view
@@ -0,0 +1,86 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module Text.String(module Text.String) where+import Primitives+import Data.Bool+import Data.Char+import Data.Either+import Data.Eq+import Data.Fractional+import Data.Function+import Data.Int+import Data.Integer+import Data.Integral+import Data.List+import Data.Maybe+import Data.Num+import Data.Ord+import Data.Ratio+import Data.Real+import Data.Tuple+import Text.Show++readInt :: String -> Int+readInt cs =+  let+    rd = foldl (\ a c -> a * (10::Int) + ord c - ord '0') (0::Int)+  in if head cs == '-' then (0::Int) - rd (tail cs) else rd cs++readDouble :: String -> Double+readDouble = primDoubleRead++showListS :: forall a . (a -> String) -> [a] -> String+showListS sa as = showListWith (\ a s -> sa a ++ s) as ""++showPairS :: forall a b . (a -> String) -> (b -> String) -> (a, b) -> String+showPairS sa sb (a, b) = "(" ++ sa a ++ "," ++ sb b ++ ")"++lines :: String -> [String]+lines "" = []+lines s =+  case span (not . (== '\n')) s of+    (l, s') -> case s' of { [] -> [l]; _:s'' -> l : lines s'' }++unlines :: [String] -> String+unlines = concatMap (++ "\n")++words :: String -> [String]+words s =+  case dropWhile isSpace s of+    "" -> []+    s' -> w : words s''+      where (w, s'') = span (not . isSpace) s'++unwords :: [String] -> String+unwords ss = intercalate " " ss++padLeft :: Int -> String -> String+padLeft n s = replicate (n - length s) ' ' ++ s++forceString :: String -> ()+forceString [] = ()+forceString (c:cs) = c `primSeq` forceString cs++-- Convert string in scientific notation to a rational number.+readRational :: String -> Rational+readRational acs@(sgn:as) | sgn == '-' = negate $ rat1 as+                          | otherwise  =          rat1 acs+  where+    rat1 s1 =+      case span isDigit s1 of+        (ds1, cr1) | ('.':r1) <- cr1                   -> rat2 f1 r1+                   | (c:r1)   <- cr1, toLower c == 'e' -> rat3 f1 r1+                   | otherwise                         -> f1+          where f1 = toRational (readInteger ds1)++    rat2 f1 s2 =+      case span isDigit s2 of+        (ds2, cr2) | (c:r2) <- cr2, toLower c == 'e' -> rat3 f2 r2+                   | otherwise                       -> f2+          where f2 = f1 + toRational (readInteger ds2) * 10 ^^ (negate $ length ds2)++    rat3 f2 ('+':s) = f2 * expo s+    rat3 f2 ('-':s) = f2 / expo s+    rat3 f2      s  = f2 * expo s++    expo s = 10 ^ readInteger s
+ lib/Unsafe/Coerce.hs view
@@ -0,0 +1,5 @@+module Unsafe.Coerce(module Unsafe.Coerce, Any) where+import Primitives++unsafeCoerce :: forall a b . a -> b+unsafeCoerce = primUnsafeCoerce
+ src/MicroHs/Compile.hs view
@@ -0,0 +1,197 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Compile(+  compileTop,+  Flags(..), verbose, runIt, output, compileOnly,+  compileCacheTop, getCachedPrelude,+  Cache, emptyCache, deleteFromCache,+  ) where+import Prelude+import System.IO+import Control.DeepSeq+import qualified MicroHs.IdentMap as M+import MicroHs.StateIO+import MicroHs.Desugar+import MicroHs.Exp+import MicroHs.Expr+import MicroHs.Ident+import MicroHs.Parse+import MicroHs.TypeCheck+--Ximport Compat++data Flags = Flags+  Int        -- verbosity level+  Bool       -- run instead of compile+  [String]   -- module search path+  String     -- output file+  Bool       -- show loading message+  Bool       -- separate compilation+  --Xderiving (Show)++type Time = Int++verbose :: Flags -> Int+verbose (Flags x _ _ _ _ _) = x++runIt :: Flags -> Bool+runIt (Flags _ x _ _ _ _) = x++paths :: Flags -> [String]+paths (Flags _ _ x _ _ _) = x++output :: Flags -> String+output (Flags _ _ _ x _ _) = x++loading :: Flags -> Bool+loading (Flags _ _ _ _ x _) = x++compileOnly :: Flags -> Bool+compileOnly (Flags _ _ _ _ _ x) = x++-----------------++type CModule = TModule [LDef]+data Cache = Cache [IdentModule] (M.Map CModule)+  --Xderiving (Show)++--Xinstance NFData Cache where rnf _ = ()  -- dummy instance++working :: Cache -> [IdentModule]+working (Cache x _) = x++updWorking :: [IdentModule] -> Cache -> Cache+updWorking w (Cache _ m) = Cache w m++cache :: Cache -> M.Map CModule+cache (Cache _ x) = x++emptyCache :: Cache+emptyCache = Cache [] M.empty++deleteFromCache :: Ident -> Cache -> Cache+deleteFromCache mn (Cache is m) = Cache is (M.delete mn m)++-----------------++-- Compile the module with the given name, starting with the given cache.+-- Return the "compiled module" and the resulting cache.+compileCacheTop :: Flags -> IdentModule -> Cache -> IO ([(Ident, Exp)], Cache)+compileCacheTop flags mn ch = do+  (ds, ch') <- compile flags mn ch+  t1 <- getTimeMilli+  let+    dsn = [ (n, compileOpt e) | (n, e) <- ds ]+  () <- return (rnf dsn)+  t2 <- getTimeMilli+  when (verbose flags > 0) $+    putStrLn $ "combinator conversion " ++ padLeft 6 (show (t2-t1)) ++ "ms"+  when (verbose flags > 3) $+    putStrLn $ "combinators:\n" ++ showLDefs dsn+  return (dsn, ch')++getCachedPrelude :: Flags -> IO Cache+getCachedPrelude _ | not usingMhs = return emptyCache+getCachedPrelude flags = do+  mhin <- openFileM "cache/Prelude.comb" ReadMode+  case mhin of+    Nothing -> return emptyCache+    Just hin -> do+--      putStrLn "deserialize cache"+      cach <- hDeserialize hin+      hClose hin+      when (loading flags) $+        putStrLn "loaded cached Prelude"+      return cach++--compileTop :: Flags -> IdentModule -> IO [LDef]+compileTop :: Flags -> Ident -> IO [(Ident, Exp)]+compileTop flags mn = do+  cach <- getCachedPrelude flags+  fst <$> compileCacheTop flags mn cach++compile :: Flags -> IdentModule -> Cache -> IO ([LDef], Cache)+compile flags nm ach = do+  ((_, t), ch) <- runStateIO (compileModuleCached flags nm) ach+  when (verbose flags > 0) $+    putStrLn $ "total import time     " ++ padLeft 6 (show t) ++ "ms"+  return (concatMap bindingsOf $ M.elems $ cache ch, ch)++-- Compile a module with the given name.+-- If the module has already been compiled, return the cached result.+compileModuleCached :: Flags -> IdentModule -> StateIO Cache (CModule, Time)+compileModuleCached flags mn = do+  ch <- gets cache+  case M.lookup mn ch of+    Nothing -> do+      ws <- gets working+      when (elem mn ws) $+        error $ "recursive module: " ++ showIdent mn ++ ", import chain: " ++ unwords (map showIdent ws)+      modify $ \ c -> updWorking (mn : working c) c+      when (verbose flags > 0) $+        liftIO $ putStrLn $ "importing " ++ showIdent mn+      (cm, tp, tt, ts) <- compileModule flags mn+      when (verbose flags > 0) $+        liftIO $ putStrLn $ "importing done " ++ showIdent mn ++ ", " ++ show (tp + tt) +++                 "ms (" ++ show tp ++ " + " ++ show tt ++ ")"+      when (loading flags && mn /= mkIdent "Interactive") $+        liftIO $ putStrLn $ "loaded " ++ showIdent mn+      c <- get+      put $ Cache (tail (working c)) (M.insert mn cm (cache c))+      return (cm, tp + tt + ts)+    Just cm -> do+      when (verbose flags > 0) $+        liftIO $ putStrLn $ "importing cached " ++ showIdent mn+      return (cm, 0)++-- Find and compile a module with the given name.+-- The times are (parsing, typecheck+desugar, imported modules)+compileModule :: Flags -> IdentModule -> StateIO Cache (CModule, Time, Time, Time)+compileModule flags nm = do+  t1 <- liftIO getTimeMilli+  let+    fn = map (\ c -> if c == '.' then '/' else c) (unIdent nm) ++ ".hs"+  (pathfn, file) <- liftIO (readFilePath (getSLoc nm) (paths flags) fn)+  let mdl@(EModule nmn _ defs) = parseDie pTop pathfn file+  -- liftIO $ putStrLn $ showEModule mdl+  -- liftIO $ putStrLn $ showEDefs defs+  when (nm /= nmn) $+    error $ "module name does not agree with file name: " ++ showIdent nm ++ " " ++ showIdent nmn+  let+    specs = [ s | Import s <- defs ]+  t2 <- liftIO getTimeMilli+  (impMdls, ts) <- fmap unzip $ mapM (compileModuleCached flags) [ m | ImportSpec _ m _ _ <- specs ]+  t3 <- liftIO getTimeMilli+  let+    tmdl = typeCheck (zip specs impMdls) mdl+  when (verbose flags > 2) $+    liftIO $ putStrLn $ "type checked:\n" ++ showTModule showEDefs tmdl ++ "-----\n"+  let+    dmdl = desugar tmdl+  () <- return $ rnf $ bindingsOf dmdl+  t4 <- liftIO getTimeMilli+  when (verbose flags > 3) $+    (liftIO $ putStrLn $ "desugared:\n" ++ showTModule showLDefs dmdl)+  return (dmdl, t2-t1, t4-t3, sum ts)++------------------++readFilePath :: SLoc -> [FilePath] -> FilePath -> IO (FilePath, String)+readFilePath loc path name = do+  mh <- openFilePath path name+  case mh of+    Nothing -> errorMessage loc $ "File not found: " ++ show name ++ "\npath=" ++ show path+    Just (fn, h) -> do+      file <- hGetContents h+      return (fn, file)++openFilePath :: [FilePath] -> FilePath -> IO (Maybe (FilePath, Handle))+openFilePath adirs fileName =+  case adirs of+    [] -> return Nothing+    dir:dirs -> do+      let+        path = dir ++ "/" ++ fileName+      mh <- openFileM path ReadMode+      case mh of+        Nothing -> openFilePath dirs fileName -- If opening failed, try the next directory+        Just hdl -> return (Just (path, hdl))
+ src/MicroHs/Desugar.hs view
@@ -0,0 +1,556 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-imports -Wno-dodgy-imports #-}+module MicroHs.Desugar(+  desugar,+  LDef, showLDefs,+  encodeInteger,+  ) where+import Prelude+import Data.Char+import Data.Function+import Data.List+import Data.Maybe+import Data.Ratio+import Control.Monad.State.Strict as S --Xhiding(ap)+--Ximport Control.Monad as S hiding(ap)+--Ximport Compat+--Ximport GHC.Stack+import Debug.Trace++import MicroHs.Expr+import MicroHs.Exp+import MicroHs.Graph+import MicroHs.Ident+import MicroHs.TypeCheck++type LDef = (Ident, Exp)++desugar :: TModule [EDef] -> TModule [LDef]+desugar atm =+  case atm of+    TModule mn fxs tys syns clss insts vals ds ->+      TModule mn fxs tys syns clss insts vals $ map lazier $ checkDup $ concatMap (dsDef mn) ds++dsDef :: IdentModule -> EDef -> [LDef]+dsDef mn adef =+  case adef of+    Data _ cs ->+      let+        f i = mkIdent ("$f" ++ show i)+        fs = [f i | (i, _) <- zip [0::Int ..] cs]+        dsConstr i (Constr _ ctx c ets) =+          let+            ss = (if null ctx then [] else [False]) +++                 map fst (either id (map snd) ets)   -- strict flags+            xs = [mkIdent ("$x" ++ show j) | (j, _) <- zip [0::Int ..] ss]+            strict (False:ys) (_:is) e = strict ys is e+            strict (True:ys)  (x:is) e = App (App (Lit (LPrim "seq")) (Var x)) (strict ys is e)+            strict _ _ e = e+          in (qualIdent mn c, lams xs $ strict ss xs $ lams fs $ apps (Var (f i)) (map Var xs))+      in  zipWith dsConstr [0::Int ..] cs+    Newtype _ (Constr _ _ c _) -> [ (qualIdent mn c, Lit (LPrim "I")) ]+    Type _ _ -> []+    Fcn f eqns -> [(f, dsEqns (getSLoc f) eqns)]+    Sign _ _ -> []+    Import _ -> []+    ForImp ie i _ -> [(i, Lit $ LForImp ie)]+    Infix _ _ -> []+    Class ctx (c, _) _ bs ->+      let f = mkIdent "$f"+          meths :: [Ident]+          meths = [ qualIdent mn i | (BSign i _) <- bs ]+          supers :: [Ident]+          supers = [ qualIdent mn $ mkSuperSel c i | i <- [1 .. length ctx] ]+          xs = [ mkIdent ("$x" ++ show j) | j <- [ 1 .. length ctx + length meths ] ]+      in  (qualIdent mn $ mkClassConstructor c, lams xs $ Lam f $ apps (Var f) (map Var xs)) :+          zipWith (\ i x -> (expectQualified i, Lam f $ App (Var f) (lams xs $ Var x))) (supers ++ meths) xs+    Instance _ _ _ _ -> []+    Default _ -> []++oneAlt :: Expr -> EAlts+oneAlt e = EAlts [([], e)] []++dsBind :: Ident -> EBind -> [LDef]+dsBind v abind =+  case abind of+    BFcn f eqns -> [(f, dsEqns (getSLoc f) eqns)]+    BPat p e ->+      let+        de = (v, dsExpr e)+        ds = [ (i, dsExpr (ECase (EVar v) [(p, oneAlt $ EVar i)])) | i <- patVars p ]+      in  de : ds+    BSign _ _ -> []++dsEqns :: SLoc -> [Eqn] -> Exp+dsEqns loc eqns =+  case eqns of+    Eqn aps _ : _ ->+      let+        vs = allVarsBind $ BFcn (mkIdent "") eqns+        xs = take (length aps) $ newVars "$q" vs+        mkArm (Eqn ps alts) =+          let ps' = map dsPat ps+          in  (ps', dsAlts alts, hasGuards alts || any hasLit ps')+        ex = runS loc (vs ++ xs) (map Var xs) (map mkArm eqns)+      in foldr Lam ex xs+    _ -> impossible++hasGuards :: EAlts -> Bool+hasGuards (EAlts [([], _)] _) = False+hasGuards _ = True++hasLit :: EPat -> Bool+hasLit (ELit _ _) = True+hasLit (EVar _) = False+hasLit (ECon _) = False+hasLit (EApp f a) = hasLit f || hasLit a+hasLit (EAt _ p) = hasLit p+hasLit _ = impossible++dsAlts :: EAlts -> (Exp -> Exp)+dsAlts (EAlts alts bs) = dsBinds bs . dsAltsL alts++dsAltsL :: [EAlt] -> (Exp -> Exp)+dsAltsL []                 dflt = dflt+dsAltsL [([], e)]             _ = dsExpr e  -- fast special case+dsAltsL ((ss, rhs) : alts) dflt =+  let+    erest = dsAltsL alts dflt+    x = newVar (allVarsExp erest)+  in eLet x erest (dsExpr $ dsAlt (EVar x) ss rhs)++dsAlt :: Expr -> [EStmt] -> Expr -> Expr+dsAlt _ [] rhs = rhs+dsAlt dflt (SBind p e : ss) rhs = ECase e [(p, EAlts [(ss, rhs)] []), (EVar dummyIdent, oneAlt dflt)]+dsAlt dflt (SThen (EVar i) : ss) rhs | isIdent "Data.Bool.otherwise" i = dsAlt dflt ss rhs+dsAlt dflt (SThen e   : ss) rhs = EIf e (dsAlt dflt ss rhs) dflt+dsAlt dflt (SLet bs   : ss) rhs = ELet bs (dsAlt dflt ss rhs)++dsBinds :: [EBind] -> Exp -> Exp+dsBinds [] ret = ret+dsBinds ads ret =+  let+    avs = concatMap allVarsBind ads+    pvs = newVars "$p" avs+    mvs = newVars "$m" avs+    ds = concat $ zipWith dsBind pvs ads+    node ie@(i, e) = (ie, i, freeVars e)+    gr = map node $ checkDup ds+    asccs = stronglyConnComp (<=) gr+    loop _ [] = ret+    loop vs (AcyclicSCC (i, e) : sccs) =+      letE i e $ loop vs sccs+    loop vs (CyclicSCC [(i, e)] : sccs) =+      letRecE i e $ loop vs sccs+    loop vvs (CyclicSCC ies : sccs) =+      let (v:vs) = vvs+      in mutualRec v ies (loop vs sccs)+  in loop mvs asccs++letE :: Ident -> Exp -> Exp -> Exp+letE i e b = eLet i e b          -- do some minor optimizations+             --App (Lam i b) e++letRecE :: Ident -> Exp -> Exp -> Exp+letRecE i e b = letE i (App (Lit (LPrim "Y")) (Lam i e)) b++-- Do mutual recursion by tupling up all the definitions.+--  let f = ... g ...+--      g = ... f ...+--  in  body+-- turns into+--  letrec v =+--        let f = sel_0_2 v+--            g = sel_1_2 v+--        in  (... g ..., ... f ...)+--  in+--    let f = sel_0_2 v+--        g = sel_1_2 v+--    in  body+mutualRec :: Ident -> [LDef] -> Exp -> Exp+mutualRec v ies body =+  let (is, es) = unzip ies+      n = length is+      ev = Var v+      one m i = letE i (mkTupleSelE m n ev)+      bnds = foldr (.) id $ zipWith one [0..] is+  in  letRecE v (bnds $ mkTupleE es) $+      bnds body++encodeInteger :: Integer -> Exp+encodeInteger i | toInteger (minBound::Int) <= i && i < toInteger (maxBound::Int) =+--  trace ("*** small integer " ++ show i) $+  App (Var (mkIdent "Data.Integer_Type._intToInteger")) (Lit (LInt (_integerToInt i)))+                | otherwise =+--  trace ("*** large integer " ++ show i) $+  App (Var (mkIdent "Data.Integer._intListToInteger")) (encodeList (map (Lit . LInt) (_integerToIntList i)))++encodeRational :: Rational -> Exp+encodeRational r =+  App (App (Var (mkIdent "Data.Ratio_Type._mkRational")) (encodeInteger (numerator r))) (encodeInteger (denominator r))++dsExpr :: Expr -> Exp+dsExpr aexpr =+  case aexpr of+    EVar i -> Var i+    EApp f a -> App (dsExpr f) (dsExpr a)+    ELam qs -> dsEqns (getSLoc aexpr) qs+    ELit _ (LChar c) -> Lit (LInt (ord c))+    ELit _ (LInteger i) -> encodeInteger i+    ELit _ (LRat i) -> encodeRational i+    ELit _ l -> Lit l+    ECase e as -> dsCase (getSLoc aexpr) e as+    ELet ads e -> dsBinds ads (dsExpr e)+    ETuple es -> Lam (mkIdent "$f") $ foldl App (Var $ mkIdent "$f") $ map dsExpr es+    EIf e1 e2 e3 ->+      app2 (dsExpr e1) (dsExpr e3) (dsExpr e2)+    EListish (LList es) -> encodeList $ map dsExpr es+    EListish (LCompr e astmts) ->+      case astmts of+        [] -> dsExpr (EListish (LList [e]))+        stmt : stmts ->+          case stmt of+            SBind p b ->+              let+                nv = newVar (allVarsExpr aexpr)+                body = ECase (EVar nv) [(p, oneAlt $ EListish (LCompr e stmts)), (EVar dummyIdent, oneAlt $ EListish (LList []))]+              in app2 (Var (mkIdent "Data.List.concatMap")) (dsExpr (eLam [EVar nv] body)) (dsExpr b)+            SThen c ->+              dsExpr (EIf c (EListish (LCompr e stmts)) (EListish (LList [])))+            SLet ds ->+              dsExpr (ELet ds (EListish (LCompr e stmts)))+    ECon c ->+      let+        ci = conIdent c+      in+        case getTupleConstr ci of+          Just n ->+            let+              xs = [mkIdent ("x" ++ show i) | i <- [1 .. n] ]+              body = mkTupleE $ map Var xs+            in foldr Lam body xs+          Nothing -> Var (conIdent c)+    _ -> impossible++-- Use tuple encoding to make a tuple+mkTupleE :: [Exp] -> Exp+mkTupleE = Lam (mkIdent "$f") . foldl App (Var (mkIdent "$f"))++-- Select component m from an n-tuple+mkTupleSelE :: Int -> Int -> Exp -> Exp+mkTupleSelE m n tup =+  let+    xs = [mkIdent ("x" ++ show i) | i <- [1 .. n] ]+  in App tup (foldr Lam (Var (xs !! m)) xs)++-- Handle special syntax for lists and tuples+dsPat :: --XHasCallStack =>+         EPat -> EPat+dsPat ap =+  case ap of+    EVar _ -> ap+    ECon _ -> ap+    EApp f a -> EApp (dsPat f) (dsPat a)+    EListish (LList ps) -> dsPat $ foldr (\ x xs -> EApp (EApp consCon x) xs) nilCon ps+    ETuple ps -> dsPat $ foldl EApp (tupleCon (getSLoc ap) (length ps)) ps+    EAt i p -> EAt i (dsPat p)+    ELit loc (LStr cs) | length cs < 2 -> dsPat (EListish (LList (map (ELit loc . LChar) cs)))+    ELit _ _ -> ap+    _ -> impossible++iNil :: Ident+iNil = mkIdent $ listPrefix ++ "[]"++iCons :: Ident+iCons = mkIdent $ listPrefix ++ ":"++consCon :: EPat+consCon = ECon $ ConData [(iNil, 0), (iCons, 2)] iCons++nilCon :: EPat+nilCon = ECon $ ConData [(iNil, 0), (iCons, 2)] iNil++tupleCon :: SLoc -> Int -> EPat+tupleCon loc n =+  let+    c = tupleConstr loc n+  in ECon $ ConData [(c, n)] c++lams :: [Ident] -> Exp -> Exp+lams xs e = foldr Lam e xs++apps :: Exp -> [Exp] -> Exp+apps f = foldl App f++newVars :: String -> [Ident] -> [Ident]+newVars s is = deleteAllsBy (==) [ mkIdent (s ++ show i) | i <- [1::Int ..] ] is++newVar :: [Ident] -> Ident+newVar = head . newVars "$q"++showLDefs :: [LDef] -> String+showLDefs = unlines . map showLDef++showLDef :: LDef -> String+showLDef a =+  case a of+    (i, e) -> showIdent i ++ " = " ++ show e++----------------++dsCase :: SLoc -> Expr -> [ECaseArm] -> Exp+dsCase loc ae as =+  runS loc (allVarsExpr (ECase ae as)) [dsExpr ae] (map mkArm as)+  where+    mkArm (p, alts) =+      let p' = dsPat p+      in  ([p'], dsAlts alts, hasGuards alts || hasLit p')++type MState = [Ident]  -- supply of unused variables.++type M a = State MState a+type Arm = ([EPat], Exp -> Exp, Bool)  -- boolean indicates that the arm has guards+type Matrix = [Arm]++--showArm :: Arm -> String+--showArm (ps, _, b) = showListS showExpr ps ++ "," ++ show b++newIdents :: Int -> M [Ident]+newIdents n = do+  is <- get+  put (drop n is)+  return (take n is)++newIdent :: M Ident+newIdent = do+  is <- get+  put (tail is)+  return (head is)++runS :: SLoc -> [Ident] -> [Exp] -> Matrix -> Exp+runS loc used ss mtrx =+  let+    supply = newVars "$x" used+    ds xs aes =+      case aes of+        []   -> dsMatrix (eMatchErr loc) (reverse xs) mtrx+        e:es -> letBind (return e) $ \ x -> ds (x:xs) es+  in evalState (ds [] ss) supply++data SPat = SPat Con [Ident]    -- simple pattern+  --Xderiving(Show, Eq)++-- Desugar a pattern matrix.+-- The input is a (usually identifier) vector e1, ..., en+-- and patterns matrix p11, ..., p1n   -> e1+--                     p21, ..., p2n+--                     pm1, ..., pmn   -> em+-- Note that the RHSs are of type Exp.+dsMatrix :: --XHasCallStack =>+            Exp -> [Exp] -> Matrix -> M Exp+dsMatrix dflt iis aarms =+ if null aarms then+   return dflt+ else+ case iis of+ [] -> let { (_, f, _) : _ = aarms } in return $ f dflt+ i:is -> do+  let+    (arms, darms, rarms) = splitArms aarms+    ndarms = map (\ (EVar x : ps, ed, g) -> (ps, substAlpha x i . ed, g) ) darms+--  traceM ("split " ++ show (arms, darms, rarms))+  letBind (dsMatrix dflt iis rarms) $ \ drest ->+    letBind (dsMatrix drest is ndarms) $ \ ndflt ->+     if null arms then+       return ndflt+     else do+      let+        idOf (p:_, _, _) = pConOf p+        idOf _ = impossible+        grps = groupEq (on (==) idOf) arms+        oneGroup grp = do+          let+            (pat:_, _, _) : _ = grp+            con = pConOf pat+          xs <- newIdents (conArity con)+          let+            one arg =+              case arg of+                (p : ps, e, g) ->+                  case p of+                    EAt a pp -> one (pp:ps, substAlpha a i . e, g)+                    _        -> (pArgs p ++ ps, e, g)+                _ -> impossible+          cexp <- dsMatrix ndflt (map Var xs ++ is) (map one grp)+          return (SPat con xs, cexp)+--      traceM $ "grps " ++ show grps+      narms <- mapM oneGroup grps+      return $ mkCase i narms ndflt++eMatchErr :: SLoc -> Exp+eMatchErr (SLoc fn l c) =+  App (App (App (Lit (LPrim "noMatch")) (Lit (LStr fn))) (Lit (LInt l))) (Lit (LInt c))++-- If the first expression isn't a variable/literal, then use+-- a let binding and pass variable to f.+letBind :: M Exp -> (Exp -> M Exp) -> M Exp+letBind me f = do+  e <- me+  if cheap e then+    f e+   else do+    x <- newIdent+    r <- f (Var x)+    return $ eLet x e r++cheap :: Exp -> Bool+cheap ae =+  case ae of+    Var _ -> True+    Lit _ -> True+    _ -> False++eEqInt :: Exp+eEqInt = Lit (LPrim "==")++eEqChar :: Exp+eEqChar = Lit (LPrim "==")++eEqStr :: Exp+eEqStr = Lit (LPrim "equal")++mkCase :: Exp -> [(SPat, Exp)] -> Exp -> Exp+mkCase var pes dflt =+  --trace ("mkCase " ++ show pes) $+  case pes of+    [] -> dflt+    [(SPat (ConNew _) [x], arhs)] -> eLet x var arhs+    (SPat (ConLit _ l) _,   arhs) : rpes -> +      let+        cond =+          case l of+            LInt  _ -> app2 eEqInt  var (Lit l)+            LChar c -> app2 eEqChar var (Lit (LInt (ord c)))+            LStr  _ -> app2 eEqStr  var (Lit l)+            _ -> impossible+      in app2 cond (mkCase var rpes dflt) arhs+    (SPat (ConData cs _) _, _) : _ ->+      let+        arm ck =+          let+            (c, k) = ck+            (vs, rhs) = head $ [ (xs, e) | (SPat (ConData _ i) xs, e) <- pes, c == i ] +++                               [ (replicate k dummyIdent, dflt) ]+          in (SPat (ConData cs c) vs, rhs)+      in  eCase var (map arm cs)+    _ -> impossible++eCase :: Exp -> [(SPat, Exp)] -> Exp+eCase e as =+--  trace ("eCase " ++ show e ++ "\n" +++--         unlines [ unwords (map showIdent (conIdent c : xs)) ++ " -> " ++ show r | (SPat c xs, r) <- as ]) $+  apps e [lams xs r | (SPat _ xs, r) <- as ]++-- Split the matrix into segments so each first column has initially patterns -- followed by variables, followed by the rest.+splitArms :: Matrix -> (Matrix, Matrix, Matrix)+splitArms am =+  let+    isConPat (p:_, _, _) = not (isPVar p)+    isConPat _ = impossible+    (ps, nps) = span isConPat am+    loop xs [] = (reverse xs, [])+    loop xs pps@(pg@(p:_, _, g) : rps) | not (isPVar p) = (reverse xs, pps)+                                       | otherwise = if g then (reverse (pg:xs), rps)+                                                          else loop (pg:xs) rps+    loop _ _ = impossible+    (ds, rs)  = loop [] nps+  in (ps, ds, rs)++-- Change from x to y inside e.+substAlpha :: Ident -> Exp -> Exp -> Exp+substAlpha x y e =+  if x == dummyIdent then+    e+  else+    substExp x y e++eLet :: Ident -> Exp -> Exp -> Exp+eLet i e b =+  if i == dummyIdent then+    b+  else+    case b of+      Var j | i == j -> e+      _ ->+        case filter (== i) (freeVars b) of+          []  -> b                -- no occurences, no need to bind+          [_] -> substExp i e b   -- single occurrence, substitute  XXX could be worse if under lambda+          _   -> App (Lam i b) e  -- just use a beta redex++pConOf :: --XHasCallStack =>+          EPat -> Con+pConOf ap =+  case ap of+    ECon c -> c+    EAt _ p -> pConOf p+    EApp p _ -> pConOf p+    ELit loc l -> ConLit loc l+    EVar _ -> undefined+    _ -> impossibleShow ap++pArgs :: EPat -> [EPat]+pArgs ap =+  case ap of+    ECon _ -> []+    EApp f a -> pArgs f ++ [a]+    ELit _ _ -> []+    _ -> impossible++-- XXX quadratic+groupEq :: forall a . (a -> a -> Bool) -> [a] -> [[a]]+groupEq eq axs =+  case axs of+    [] -> []+    x:xs ->+      case partition (eq x) xs of+        (es, ns) -> (x:es) : groupEq eq ns++getDups :: forall a . (a -> a -> Bool) -> [a] -> [[a]]+getDups eq = filter ((> 1) . length) . groupEq eq++checkDup :: [LDef] -> [LDef]+checkDup ds =+  case getDups (==) (filter (/= dummyIdent) $ map fst ds) of+    [] -> ds+    (i1:_i2:_) : _ ->+      errorMessage (getSLoc i1) $ "duplicate definition " ++ showIdent i1+        -- XXX mysteriously the location for i2 is the same as i1+        -- ++ ", also at " ++ showSLoc (getSLoc i2)+    _ -> error "checkDup"++-- Make recursive definitions lazier.+-- The idea is that we have+--  f x y = ... (f x) ...+-- we turn this into+--  f x = letrec f' y = ... f' ... in f'+-- thus avoiding the extra argument passing.+-- XXX should generalize for an arbitrary length prefix of variables.+-- This gives a small speedup with overloading.+lazier :: LDef -> LDef+lazier def@(fcn, Lam x (Lam y body)) =+  let fcn' = addIdentSuffix fcn "@"+      vfcn' = Var fcn'+      repl :: Exp -> State Bool Exp+      repl (Lam i e) = Lam i <$> repl e+      repl (App (Var af) (Var ax)) | af == fcn && ax == x = do+        put True+        return vfcn'+      repl (App f a) = App <$> repl f <*> repl a+      repl e@(Var _) = return e+      repl e@(Lit _) = return e+  in  case runState (repl body) False of+        (_, False) -> def+        (e', True) -> (fcn, Lam x $ letRecE fcn' (Lam y e') vfcn')++lazier def = def
+ src/MicroHs/Exp.hs view
@@ -0,0 +1,543 @@+{-# OPTIONS_GHC -Wno-unused-imports #-}+{-# LANGUAGE PatternSynonyms #-}+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Exp(+  compileOpt,+--  compileOptX,+  substExp,+  Exp(..), toStringP,+  PrimOp,+  encodeString,+  app2, cCons, cNil, cFlip,+  allVarsExp, freeVars,+  encodeList,+  ) where+import Prelude --Xhiding((<>))+import Data.Char+import Data.List+import MicroHs.Ident+import MicroHs.Expr(Lit(..), showLit)+import Text.PrettyPrint.HughesPJ+--Ximport Control.DeepSeq+--Ximport Compat+import Debug.Trace++type PrimOp = String++--+-- Used combinators+--   * indicates that the implementation uses an indirection+--   A indicates allocation in the implementation+-- S  x y z   = x z (y z)             A+-- K  x y     = x                     *+-- I  x       = x                     *+-- B  x y z   = x (y z)               A+-- C  x y z   = x z y                 A+-- S' x y z w = x (y w) (z w)         A+-- B' x y z w = x y (z w)             A+-- C' x y z w = x (y w) z             A+-- A  x y     = y                     *+-- T  x y     = y x+-- n@(Y x)    = x n+-- Z x y z   = x y+-- P  x y z   = z x y                 A+-- R  x y z   = y z x                 A+-- O  x y z w = w x y                 A+--++data Exp+  = Var Ident+  | App Exp Exp+  | Lam Ident Exp+  | Lit Lit++--Xinstance NFData Exp where rnf (Var i) = rnf i; rnf (App f a) = rnf f `seq` rnf a; rnf (Lam i e) = rnf i `seq` rnf e; rnf (Lit l) = rnf l++instance Eq Exp where+  (==) (Var i1)    (Var i2)    = i1 == i2+  (==) (App f1 a1) (App f2 a2) = f1 == f2 && a1 == a2+  (==) (Lam i1 e1) (Lam i2 e2) = i1 == i2 && e1 == e2+  (==) (Lit l1)    (Lit l2)    = l1 == l2+  (==) _           _           = False++data MaybeApp = NotApp | IsApp Exp Exp++getApp :: Exp -> MaybeApp+getApp ae =+  case ae of+    App f a -> IsApp f a+    _       -> NotApp++isPrim :: String -> Exp -> Bool+isPrim s ae =+  case ae of+    Lit (LPrim ss) -> s == ss+    _       -> False++isK :: Exp -> Bool+isK = isPrim "K"++isI :: Exp -> Bool+isI = isPrim "I"++isB :: Exp -> Bool+isB = isPrim "B"++isC :: Exp -> Bool+isC = isPrim "C"++isY :: Exp -> Bool+isY = isPrim "Y"++isP :: Exp -> Bool+isP = isPrim "P"++app2 :: Exp -> Exp -> Exp -> Exp+app2 f a1 a2 = App (App f a1) a2++app3 :: Exp -> Exp -> Exp -> Exp -> Exp+app3 f a1 a2 a3 = App (app2 f a1 a2) a3++cCons :: Exp+cCons = Lit (LPrim "O")++cNil :: Exp+cNil = Lit (LPrim "K")++cFlip :: Exp+cFlip = Lit (LPrim "C")++cId :: Exp+cId = Lit (LPrim "I")++cConst :: Exp+cConst = Lit (LPrim "K")++cSpread :: Exp+cSpread = Lit (LPrim "S")++cP :: Exp+cP = Lit (LPrim "P")++--cR :: Exp+--cR = Lit (LPrim "R")++-- Avoid quadratic concatenation by using difference lists,+-- turning concatenation into function composition.+toStringP :: Exp -> (String -> String)+toStringP ae =+  case ae of+    Var x   -> (showIdent x ++)+    Lit (LStr s) ->+      -- Encode very short string directly as combinators.+      if length s > 1 then+        (quoteString s ++)+      else+        toStringP (encodeString s)+    Lit (LInteger _) -> undefined+    Lit (LRat _) -> undefined+    Lit l   -> (showLit l ++)+    Lam x e -> (("(\\" ++ showIdent x ++ " ") ++) . toStringP e . (")" ++)+    App f a -> ("(" ++) . toStringP f . (" " ++) . toStringP a . (")" ++)++quoteString :: String -> String+quoteString s =+  let+    achar c =+      if c == '"' || c == '\\' || c < ' ' || c > '~' then+        '\\' : show (ord c) ++ ['&']+      else+        [c]+  in '"' : concatMap achar s ++ ['"']++encodeString :: String -> Exp+encodeString = encodeList . map (Lit . LInt . ord)++encodeList :: [Exp] -> Exp+encodeList = foldr (app2 cCons) cNil++compileOpt :: Exp -> Exp+compileOpt = improveT . compileExp++compileExp :: Exp -> Exp+compileExp ae =+  case ae of+    App f a -> App (compileExp f) (compileExp a)+    Lam x a -> abstract x a+    _       -> ae++abstract :: Ident -> Exp -> Exp+abstract x ae =+  case ae of+    Var y  -> if x == y then cId else cK (Var y)+    App f a -> cS (abstract x f) (abstract x a)+    Lam y e -> abstract x $ abstract y e+    Lit _ -> cK ae++cK :: Exp -> Exp+cK e  = App cConst e++cS :: Exp -> Exp -> Exp+cS a1 a2 =+ if isK a1 then cId else+  let+    r = cS2 a1 a2+  in+    case getApp a1 of+      NotApp -> r+      IsApp k1 e1 ->+        if isK k1 then+          case getApp a2 of+            IsApp k2 e2 ->+              if isK k2 then+                cK (App e1 e2)+              else+                cB e1 a2+            NotApp ->+              if isI a2 then+                e1+              else+                cB e1 a2+        else+          r+cS2 :: Exp -> Exp -> Exp+cS2 a1 a2 =+  case getApp a2 of+    NotApp -> cS3 a1 a2+    IsApp k2 e2 ->+      if isK k2 then+        cC a1 e2+      else+        cS3 a1 a2++cS3 :: Exp -> Exp -> Exp+cS3 a1 a2 =+  let+    r = app2 cSpread a1 a2+  in+    case getApp a1 of+      NotApp -> r+      IsApp be1 e2 ->+        case getApp be1 of+          NotApp -> r+          IsApp b1 e1 ->+            if isB b1 then+              cSS e1 e2 a2+            else+              r++{-+--cS e1 e2 | trace ("S (" ++ toString e1 ++ ") (" ++ toString e2 ++ ")") False = undefined+cS CK              _           = CI                -- S K e           = I+cS (App CK e1)     (App CK e2) = cK (App e1 e2)    -- S (K e1) (K e2) = K (e1 e2)+cS (App CK e1)     CI          = e1                -- S (K e1) I      = e1+cS (App CK e1)     e2          = cB e1 e2          -- S (K e1) e2     = B e1 e2+cS e1              (App CK e2) = cC e1 e2          -- S e1     (K e2) = C e1 e2+cS (App (App CB e1) e2) e3     = cSS e1 e2 e3      -- S (B e1 e2) e3  = S' e1 e2 e3+cS e1 e2                       = App2 CS e1 e2+-}++cC :: Exp -> Exp -> Exp+cC a1 e3 =+  let+    r = cC2 a1 e3+  in+    case getApp a1 of+      NotApp -> r+      IsApp x1 e2 ->+        case getApp x1 of+          NotApp -> r+          IsApp bc e1 ->+            if isB bc then+              cCC e1 e2 e3+            else if isC bc && isI e1 then+              app2 cP e2 e3+--            else if isC bc && isC e1 then+--              app2 cR e2 e3+            else+              r++cC2 :: Exp -> Exp -> Exp+cC2 a1 a2 = app2 cFlip a1 a2++{-+cC (App (App CB e1) e2) e3          = cCC e1 e2 e3      -- C (B e1 e2) e3  = C' e1 e2 e3+cC (Var op)             e2 | Just op' <- lookup op flipOps = App (Var op') e2 -- C op e = flip-op e+cC (App (App CC CI) e2) e3          = app2 CP e2 e3+cC (App (App CC CC) e2) e3          = app2 CR e2 e3+cC e1                   e2          = app2 CC e1 e2+-}++cB :: Exp -> Exp -> Exp+cB a1 a2 =+  let+    r = cB2 a1 a2+  in+    case getApp a1 of+      NotApp -> r+      IsApp cb ck ->+        if isB cb && isK ck && isP a2 then+          Lit (LPrim "O")+        else+          r++cB2 :: Exp -> Exp -> Exp+cB2 a1 a2 =+  let+    r = cB3 a1 a2+  in+    case getApp a2 of+      IsApp x1 x2 ->+        case getApp x1 of+          IsApp cb ck ->+            if isY a1 && isB cb && isK ck then+              x2+            else+              r+          NotApp ->+            if isC a1 && isC x1 && isI x2 then+              cP+            else+              r+      NotApp -> r++cB3 :: Exp -> Exp -> Exp+cB3 a1 a2 =+  if isI a1 then+    a2+  else+    app2 (Lit (LPrim "B")) a1 a2++{-+cB (App CB CK) CP             = CO -- Cons+cB CY          (App (App CB CK) e) = e  -- B Y (B K e) = e+cB CC          (App CC CI)    = CP -- Pair+cB CI          e              = e  -- B I e = e+cB e1          e2             = app2 CB e1 e2+-}++cSS :: Exp -> Exp -> Exp -> Exp+cSS e1 e2 e3 = app3 (Lit (LPrim "S'")) e1 e2 e3++cCC :: Exp -> Exp -> Exp -> Exp+cCC e1 e2 e3 = app3 (Lit (LPrim "C'")) e1 e2 e3++improveT :: Exp -> Exp+improveT ae =+  case getApp ae of+    NotApp -> ae+    IsApp f a ->+      let+        ff = improveT f+        aa = improveT a+      in+        if isK ff && isI aa then+          Lit (LPrim "A")+{- Using I x --> x does not improve things.+        else if isI ff then+          aa+-}+        else if isB ff && isK aa then+          Lit (LPrim "Z")+        else if isC ff && isI aa then+          Lit (LPrim "U")+        else if isB ff && isB aa then+          Lit (LPrim "B'")+        else if isC ff && isC aa then+          Lit (LPrim "R")+        else+          let+            def =+              case getApp aa of+                IsApp ck e ->+                  if isY ff && isK ck then+                    e+                  else+                    App ff aa+                NotApp -> App ff aa+          in+            def+{-+            case getApp ff of+              IsApp xf xa ->+                if isK xf then+                  xa+                else+                  def+              NotApp -> def+-}+            +{-+-- K I      -->  A+-- C I      -->  T+-- B B      -->  B'+-- Y (K e)  -->  e+-- K x y    -->  x+improveT (App f a) =+  case (improveT f, improveT a) of+    (CK,                     CI) -> CA+--    (CI,                      e) -> e+    (CY,               App CK e) -> e+--    (App CK e1,              e2) -> e1+    (e1,                     e2) -> App e1 e2+improveT e = e+-}++instance Show Exp where+  show = render . ppExp++ppExp :: Exp -> Doc+ppExp ae =+  case ae of+--    Let i e b -> sep [ text "let" <+> ppIdent i <+> text "=" <+> ppExp e, text "in" <+> ppExp b ]+    Var i -> ppIdent i+    App f a -> parens $ ppExp f <+> ppExp a+    Lam i e -> parens $ text "\\" <> ppIdent i <> text "." <+> ppExp e+    Lit l -> text (showLit l)++substExp :: Ident -> Exp -> Exp -> Exp+substExp si se ae =+  case ae of+    Var i -> if i == si then se else ae+    App f a -> App (substExp si se f) (substExp si se a)+    Lam i e -> if si == i then+                 ae+               else if elem i (freeVars se) then+                 let+                   fe = allVarsExp e+                   ase = allVarsExp se+                   j = head [ v | n <- enumFrom (0::Int), let { v = mkIdent ("a" ++ show n) }, not (elem v ase), not (elem v fe) ]+                 in+                   --trace ("substExp " ++ unwords [si, i, j]) $+                   Lam j (substExp si se (substExp i (Var j) e))+               else+                   Lam i (substExp si se e)+    Lit _ -> ae++freeVars :: Exp -> [Ident]+freeVars ae =+  case ae of+    Var i -> [i]+    App f a -> freeVars f ++ freeVars a+    Lam i e -> deleteAllBy (==) i (freeVars e)+    Lit _ -> []++allVarsExp :: Exp -> [Ident]+allVarsExp ae =+  case ae of+    Var i -> [i]+    App f a -> allVarsExp f ++ allVarsExp a+    Lam i e -> i : allVarsExp e+    Lit _ -> []++--------+-- Possible additions+--+-- Added:+--  R = C C+--  R x y z = (C C x y) z = C y x z = y z x+--+--  Q = C I+--  Q x y z = (C I x y) z = I y x z = y x z+--+-- Added:+--  Z = B K+--  Z x y z = B K x y z = K (x y) z = x y+--+--  ZK = Z K+--  ZK x y z = Z K x y z = (K x) z = x+--+--  C'B = C' B+--  C'B x y z w = C' B x y z w = B (x z) y w = x z (y w)++--  B (B e) x y z = B e (x y) z = e (x y z)+--+--  B' :: (a -> b -> c) -> a -> (d -> b) -> d -> c+--  B' k f g x = k f (g x)+--+-- Common:+--  817: C' B+--  616: B Z+--  531: C' C+--  352: Z K+--  305: C' S+--+--  BZ = B Z+--  BZ x y z w = B Z x y z w = Z (x y) z w = x y z+--+--  C'C = C' C+--  C'C x y z w = C' C x y z w = C (x z) y w = x z w y+++---------------------------------------------------------------++{-+-- Oleg's abstraction algorithm++data Peano = S Peano | Z+  --Xderiving (Show)+data DB = N Peano | L DB | A DB DB | Free Ident | K Lit+  --Xderiving (Show)++index :: Ident -> [Ident] -> Maybe Peano+index x xs = lookupBy eqIdent x $ zip xs $ iterate S Z++deBruijn :: Exp -> DB+deBruijn = go [] where+  go binds e =+    case e of+      Var x -> maybe (Free x) N $ index x binds+      App t u -> A (go binds t) (go binds u)+      Lam x t -> L $ go (x:binds) t+      Lit l -> K l++type CL = Exp+type BCL = ([Bool], CL)++com :: String -> Exp+com s = Lit (LPrim s)+(@@) :: Exp -> Exp -> Exp+(@@) f a = App f a++convertBool :: (BCL -> BCL -> CL) -> DB -> BCL+convertBool (#) ee =+  case ee of+    N Z -> (True:[], com "I")+    N (S e) -> (False:g, d) where (g, d) = rec $ N e+    L e -> case rec e of+             ([], d) -> ([], com "K" @@ d)+             (False:g, d) -> (g, ([], com "K") # (g, d))+             (True:g, d) -> (g, d)+    A e1 e2 -> (zipWithDefault False (||) g1 g2, t1 # t2) where+      t1@(g1, _) = rec e1+      t2@(g2, _) = rec e2+    Free s -> ([], Var s)+    K l -> ([], Lit l)+  where rec = convertBool (#)++optEta :: DB -> BCL+optEta = convertBool (#) where+  (#) ([], d1)           {- # -} ([],       d2)      = d1 @@ d2+  (#) ([], d1)           {- # -} (True:[],  Lit (LPrim "I")) = d1+  (#) ([], d1)           {- # -} (True:g2,  d2)      = ([], com "B" @@ d1) # (g2, d2)+  (#) ([], d1)           {- # -} (False:g2, d2)      = ([], d1) # (g2, d2)+  (#) (True:[], Lit (LPrim "I")) {- # -} ([],       d2)      = com "U" @@ d2+  (#) (True:[], Lit (LPrim "I")) {- # -} (False:g2, d2)      = ([], com "U") # (g2, d2)+  (#) (True:g1, d1)      {- # -} ([],       d2)      = ([], com "R" @@ d2) # (g1, d1)+  (#) (True:g1, d1)      {- # -} (True:g2,  d2)      = (g1, ([], com "S") # (g1, d1)) # (g2, d2)+  (#) (True:g1, d1)      {- # -} (False:g2, d2)      = (g1, ([], com "C") # (g1, d1)) # (g2, d2)+  (#) (False:g1, d1)     {- # -} ([],       d2)      = (g1, d1) # ([], d2)+  (#) (False:_g1, d1)    {- # -} (True:[],  Lit (LPrim "I")) = d1+  (#) (False:g1, d1)     {- # -} (True:g2,  d2)      = (g1, ([], com "B") # (g1, d1)) # (g2, d2)+  (#) (False:g1, d1)     {- # -} (False:g2, d2)      = (g1, d1) # (g2, d2)++zipWithDefault :: forall a b . a -> (a -> a -> b) -> [a] -> [a] -> [b]+zipWithDefault d f     []     ys = map (f d) ys+zipWithDefault d f     xs     [] = map (flip f d) xs+zipWithDefault d f (x:xt) (y:yt) = f x y : zipWithDefault d f xt yt++compileOptX :: Exp -> Exp+compileOptX = snd . optEta . deBruijn+-}+
+ src/MicroHs/Expr.hs view
@@ -0,0 +1,653 @@+module MicroHs.Expr(+  IdentModule,+  EModule(..),+  ExportItem(..),+  ImportSpec(..),+  ImportItem(..),+  EDef(..), showEDefs,+  Expr(..), eLam, eEqns, showExpr, eqExpr,+  Listish(..),+  Lit(..), showLit,+  EBind(..), showEBind, showEBinds,+  Eqn(..),+  EStmt(..),+  EAlts(..),+  EAlt,+  ECaseArm,+  FunDep,+  EType, showEType, eqEType,+  EConstraint,+  EPat, patVars, isPVar, isPConApp,+  EKind, kType, kConstraint,+  IdKind(..), idKindIdent,+  LHS,+  Constr(..), ConstrField, SType,+  ConTyInfo,+  Con(..), conIdent, conArity,+  tupleConstr, getTupleConstr,+  mkTupleSel,+  subst,+  allVarsExpr, allVarsBind, allVarsEqn,+  setSLocExpr,+  errorMessage,+  Assoc(..), Fixity,+  getBindsVars,+  HasLoc(..),+  ) where+import Prelude --Xhiding (Monad(..), Applicative(..), MonadFail(..), Functor(..), (<$>), (<>))+import Data.Maybe+import MicroHs.Ident+import Text.PrettyPrint.HughesPJ+--Ximport GHC.Stack+--Ximport Control.DeepSeq++type IdentModule = Ident++----------------------++data EModule = EModule IdentModule [ExportItem] [EDef]+  --Xderiving (Show)++data ExportItem+  = ExpModule IdentModule+  | ExpTypeCon Ident+  | ExpType Ident+  | ExpValue Ident+  --Xderiving (Show)++data EDef+  = Data LHS [Constr]+  | Newtype LHS Constr+  | Type LHS EType+  | Fcn Ident [Eqn]+  | Sign Ident EType+  | Import ImportSpec+  | ForImp String Ident EType+  | Infix Fixity [Ident]+  | Class [EConstraint] LHS [FunDep] [EBind]  -- XXX will probable need initial forall with FD+  | Instance [IdKind] [EConstraint] EConstraint [EBind]  -- no deriving yet+  | Default [EType]+  --Xderiving (Show)++data ImportSpec = ImportSpec Bool Ident (Maybe Ident) (Maybe (Bool, [ImportItem]))  -- first Bool indicates 'qualified', second 'hiding'+  --Xderiving (Show)++data ImportItem+  = ImpTypeCon Ident+  | ImpType Ident+  | ImpValue Ident+  --Xderiving (Show)++data Expr+  = EVar Ident+  | EApp Expr Expr+  | EOper Expr [(Ident, Expr)]+  | ELam [Eqn]+  | ELit SLoc Lit+  | ECase Expr [ECaseArm]+  | ELet [EBind] Expr+  | ETuple [Expr]+  | EListish Listish+  | EDo (Maybe Ident) [EStmt]+  | ESectL Expr Ident+  | ESectR Ident Expr+  | EIf Expr Expr Expr+  | ESign Expr EType+  | EAt Ident Expr  -- only in patterns+  -- Only while type checking+  | EUVar Int+  -- Constructors after type checking+  | ECon Con+  | EForall [IdKind] Expr -- only in types+  --deriving (Show, Eq)++type FunDep = ([Ident], [Ident])++eLam :: [EPat] -> Expr -> Expr+eLam ps e = ELam $ eEqns ps e++eEqns :: [EPat] -> Expr -> [Eqn]+eEqns ps e = [Eqn ps (EAlts [([], e)] [])]++data Con+  = ConData ConTyInfo Ident+  | ConNew Ident+  | ConLit SLoc Lit+  --Xderiving(Show)++data Listish+  = LList [Expr]+  | LCompr Expr [EStmt]+  | LFrom Expr+  | LFromTo Expr Expr+  | LFromThen Expr Expr+  | LFromThenTo Expr Expr Expr+  --deriving(Show, Eq)++conIdent :: --XHasCallStack =>+            Con -> Ident+conIdent (ConData _ i) = i+conIdent (ConNew i) = i+conIdent _ = error "conIdent"++conArity :: Con -> Int+conArity (ConData cs i) = fromMaybe (error "conArity") $ lookup i cs+conArity (ConNew _) = 1+conArity (ConLit _ _) = 0++instance Eq Con where+  (==) (ConData _ i) (ConData _ j) = i == j+  (==) (ConNew    i) (ConNew    j) = i == j+  (==) (ConLit _  l) (ConLit _  k) = l == k+  (==) _             _             = False++data Lit+  = LInt Int+  | LInteger Integer+  | LDouble Double+  | LRat Rational+  | LChar Char+  | LStr String+  | LPrim String+  | LForImp String+  --Xderiving (Show)+--Xinstance NFData Lit where rnf (LInt i) = rnf i; rnf (LInteger i) = rnf i; rnf (LDouble d) = rnf d; rnf (LRat r) = rnf r; rnf (LChar c) = rnf c; rnf (LStr s) = rnf s; rnf (LPrim s) = rnf s; rnf (LForImp s) = rnf s++instance Eq Lit where+  (==) (LInt x)     (LInt  y) = x == y+  (==) (LInteger x) (LInteger  y) = x == y+  (==) (LDouble x)  (LDouble y) = x == y+  (==) (LRat x)     (LRat y) = x == y+  (==) (LChar x)    (LChar y) = x == y+  (==) (LStr  x)    (LStr  y) = x == y+  (==) (LPrim x)    (LPrim y) = x == y+  (==) (LForImp x)  (LForImp y) = x == y+  (==) _         _         = False++type ECaseArm = (EPat, EAlts)++data EStmt = SBind EPat Expr | SThen Expr | SLet [EBind]+  --Xderiving (Show)++data EBind = BFcn Ident [Eqn] | BPat EPat Expr | BSign Ident EType+  --Xderiving (Show)++-- A single equation for a function+data Eqn = Eqn [EPat] EAlts+  --Xderiving (Show)++data EAlts = EAlts [EAlt] [EBind]+  --Xderiving (Show)++type EAlt = ([EStmt], Expr)++type ConTyInfo = [(Ident, Int)]    -- All constructors with their arities++type EPat = Expr++isPVar :: EPat -> Bool+isPVar (EVar i) = not (isConIdent i)+isPVar _ = False    ++isPConApp :: EPat -> Bool+isPConApp (EVar i) = isConIdent i+isPConApp (EApp f _) = isPConApp f+isPConApp _ = True++patVars :: EPat -> [Ident]+patVars = filter isVar . allVarsExpr+  where isVar v = not (isConIdent v) && not (isDummyIdent v)++type LHS = (Ident, [IdKind])++data Constr = Constr+  [IdKind] [EConstraint]          -- existentials: forall vs . ctx =>+  Ident                           -- constructor name+  (Either [SType] [ConstrField])  -- types or named fields+  --Xderiving(Show)++type ConstrField = (Ident, SType)              -- record label and type+type SType = (Bool, EType)                     -- the Bool indicates strict++-- Expr restricted to+--  * after desugaring: EApp and EVar+--  * before desugaring: EApp, EVar, ETuple, EList+type EType = Expr++type EConstraint = EType++data IdKind = IdKind Ident EKind+  --deriving (Show, Eq)++instance Show IdKind where+  show (IdKind i k) = "(" ++ show i ++ "::" ++ show k ++ ")"++idKindIdent :: IdKind -> Ident+idKindIdent (IdKind i _) = i++type EKind = EType++kType :: EKind+kType = EVar (Ident noSLoc "Primitives.Type")++kConstraint :: EKind+kConstraint = EVar (Ident noSLoc "Primitives.Constraint")++tupleConstr :: SLoc -> Int -> Ident+tupleConstr loc n = mkIdentSLoc loc (replicate (n - 1) ',')++-- Check if it is a suple constructor+getTupleConstr :: Ident -> Maybe Int+getTupleConstr i =+  case unIdent i of+    ',':xs -> Just (length xs + 2)  -- "," is 2-tuple+    _ -> Nothing++-- Create a tuple selector, component i (0 based) of n+mkTupleSel :: Int -> Int -> Expr+mkTupleSel i n = eLam [ETuple [ EVar $ if k == i then x else dummyIdent | k <- [0 .. n - 1] ]] (EVar x)+  where x = mkIdent "$x"++---------------------------------++-- Get the location of a syntactic element+class HasLoc a where+  getSLoc :: a -> SLoc++instance HasLoc Ident where+  getSLoc (Ident l _) = l++-- Approximate location; only identifiers and literals carry a location+instance HasLoc Expr where+  getSLoc (EVar i) = getSLoc i+  getSLoc (EApp e _) = getSLoc e+  getSLoc (EOper e _) = getSLoc e+  getSLoc (ELam qs) = getSLoc qs+  getSLoc (ELit l _) = l+  getSLoc (ECase e _) = getSLoc e+  getSLoc (ELet bs _) = getSLoc bs+  getSLoc (ETuple es) = getSLoc es+  getSLoc (EListish l) = getSLoc l+  getSLoc (EDo (Just i) _) = getSLoc i+  getSLoc (EDo _ ss) = getSLoc ss+  getSLoc (ESectL e _) = getSLoc e+  getSLoc (ESectR i _) = getSLoc i+  getSLoc (EIf e _ _) = getSLoc e+  getSLoc (ESign e _) = getSLoc e+  getSLoc (EAt i _) = getSLoc i+  getSLoc (EUVar _) = error "getSLoc EUVar"+  getSLoc (ECon c) = getSLoc c+  getSLoc (EForall [] e) = getSLoc e+  getSLoc (EForall iks _) = getSLoc iks++instance forall a . HasLoc a => HasLoc [a] where+  getSLoc [] = error "getSLoc []"+  getSLoc (a:_) = getSLoc a++instance HasLoc IdKind where+  getSLoc (IdKind i _) = getSLoc i++instance HasLoc Con where+  getSLoc (ConData _ i) = getSLoc i+  getSLoc (ConNew i) = getSLoc i+  getSLoc (ConLit l _) = l++instance HasLoc Listish where+  getSLoc (LList es) = getSLoc es+  getSLoc (LCompr e _) = getSLoc e+  getSLoc (LFrom e) = getSLoc e+  getSLoc (LFromTo e _) = getSLoc e+  getSLoc (LFromThen e _) = getSLoc e+  getSLoc (LFromThenTo e _ _) = getSLoc e++instance HasLoc EStmt where+  getSLoc (SBind p _) = getSLoc p+  getSLoc (SThen e) = getSLoc e+  getSLoc (SLet bs) = getSLoc bs++instance HasLoc EBind where+  getSLoc (BFcn i _) = getSLoc i+  getSLoc (BPat p _) = getSLoc p+  getSLoc (BSign i _) = getSLoc i++instance HasLoc Eqn where+  getSLoc (Eqn [] a) = getSLoc a+  getSLoc (Eqn (p:_) _) = getSLoc p++instance HasLoc EAlts where+  getSLoc (EAlts as _) = getSLoc as++instance HasLoc EAlt where+  getSLoc ([], e) = getSLoc e+  getSLoc (ss, _) = getSLoc ss++---------------------------------++data Assoc = AssocLeft | AssocRight | AssocNone+  --Xderiving (Show)++instance Eq Assoc where+  AssocLeft  == AssocLeft  = True+  AssocRight == AssocRight = True+  AssocNone  == AssocNone  = True+  _          == _          = False++type Fixity = (Assoc, Int)++---------------------------------++-- Enough to handle subsitution in types+subst :: [(Ident, Expr)] -> Expr -> Expr+subst [] = id+subst s =+  let+    sub ae =+      case ae of+        EVar i -> fromMaybe ae $ lookup i s+        EApp f a -> EApp (sub f) (sub a)+        ESign e t -> ESign (sub e) t+        EUVar _ -> ae+        EForall iks t -> EForall iks $ subst [ x | x@(i, _) <- s, not (elem i is) ] t+          where is = map idKindIdent iks+        _ -> error "subst unimplemented"+  in sub++---------------------------------++-- XXX needs more?+eqEType :: EType -> EType -> Bool+eqEType = eqExpr++-- Very partial implementation of Expr equality.+-- It is only used to compare instances, so this suffices.+eqExpr :: --XHasCallStack =>+          Expr -> Expr -> Bool+eqExpr (EVar i) (EVar i') = i == i'+eqExpr (EVar _) (EApp _ _) = False+eqExpr (EApp f a) (EApp f' a') = eqExpr f f' && eqExpr a a'+eqExpr (EApp _ _) (EVar _) = False+eqExpr _ _ = False -- XXX good enough for instances+--eqExpr e1 e2 = error $ "eqExpr: unimplemented " ++ showExpr e1 ++ " == " ++ showExpr e2++---------------------------------++allVarsBind :: EBind -> [Ident]+allVarsBind abind =+  case abind of+    BFcn i eqns -> i : concatMap allVarsEqn eqns+    BPat p e -> allVarsPat p ++ allVarsExpr e+    BSign i _ -> [i]++allVarsEqn :: Eqn -> [Ident]+allVarsEqn eqn =+  case eqn of+    Eqn ps alts -> concatMap allVarsPat ps ++ allVarsAlts alts++allVarsAlts :: EAlts -> [Ident]+allVarsAlts (EAlts alts bs) = concatMap allVarsAlt alts ++ concatMap allVarsBind bs++allVarsAlt :: EAlt -> [Ident]+allVarsAlt (ss, e) = concatMap allVarsStmt ss ++ allVarsExpr e++allVarsPat :: EPat -> [Ident]+allVarsPat = allVarsExpr++allVarsExpr :: Expr -> [Ident]+allVarsExpr aexpr =+  case aexpr of+    EVar i -> [i]+    EApp e1 e2 -> allVarsExpr e1 ++ allVarsExpr e2+    EOper e1 ies -> allVarsExpr e1 ++ concatMap (\ (i,e2) -> i : allVarsExpr e2) ies+    ELam qs -> concatMap allVarsEqn qs+    ELit _ _ -> []+    ECase e as -> allVarsExpr e ++ concatMap allVarsCaseArm as+    ELet bs e -> concatMap allVarsBind bs ++ allVarsExpr e+    ETuple es -> concatMap allVarsExpr es+    EListish (LList es) -> concatMap allVarsExpr es+    EDo mi ss -> maybe [] (:[]) mi ++ concatMap allVarsStmt ss+    ESectL e i -> i : allVarsExpr e+    ESectR i e -> i : allVarsExpr e+    EIf e1 e2 e3 -> allVarsExpr e1 ++ allVarsExpr e2 ++ allVarsExpr e3+    EListish l -> allVarsListish l+    ESign e _ -> allVarsExpr e+    EAt i e -> i : allVarsExpr e+    EUVar _ -> []+    ECon c -> [conIdent c]+    EForall iks e -> map (\ (IdKind i _) -> i) iks ++ allVarsExpr e++allVarsListish :: Listish -> [Ident]+allVarsListish (LList es) = concatMap allVarsExpr es+allVarsListish (LCompr e ss) = allVarsExpr e ++ concatMap allVarsStmt ss+allVarsListish (LFrom e) = allVarsExpr e+allVarsListish (LFromTo e1 e2) = allVarsExpr e1 ++ allVarsExpr e2+allVarsListish (LFromThen e1 e2) = allVarsExpr e1 ++ allVarsExpr e2+allVarsListish (LFromThenTo e1 e2 e3) = allVarsExpr e1 ++ allVarsExpr e2 ++ allVarsExpr e3++allVarsCaseArm :: ECaseArm -> [Ident]+allVarsCaseArm (p, alts) = allVarsPat p ++ allVarsAlts alts++allVarsStmt :: EStmt -> [Ident]+allVarsStmt astmt =+  case astmt of+    SBind p e -> allVarsPat p ++ allVarsExpr e+    SThen e -> allVarsExpr e+    SLet bs -> concatMap allVarsBind bs++-----------------------------++setSLocExpr :: SLoc -> Expr -> Expr+setSLocExpr l (EVar i) = EVar (setSLocIdent l i)+setSLocExpr l (ECon c) = ECon (setSLocCon l c)+setSLocExpr l (ELit _ k) = ELit l k+setSLocExpr _ _ = error "setSLocExpr"  -- what other cases do we need?++setSLocCon :: SLoc -> Con -> Con+setSLocCon l (ConData ti i) = ConData ti (setSLocIdent l i)+setSLocCon l (ConNew i) = ConNew (setSLocIdent l i)+setSLocCon _ c = c++errorMessage :: --XHasCallStack =>+                forall a . SLoc -> String -> a+errorMessage loc msg = error $ showSLoc loc ++ ": " ++ msg++----------------++instance Show Expr where+  show = showExpr++showExpr :: Expr -> String+showExpr = render . ppExpr++showEDefs :: [EDef] -> String+showEDefs = render . ppEDefs++showEBind :: EBind -> String+showEBind = render . ppEBind++showEBinds :: [EBind] -> String+showEBinds = render . vcat . map ppEBind++showEType :: EType -> String+showEType = render . ppEType++ppImportItem :: ImportItem -> Doc+ppImportItem ae =+  case ae of+    ImpTypeCon i -> ppIdent i <> text "(..)"+    ImpType i -> ppIdent i+    ImpValue i -> ppIdent i++ppEDef :: EDef -> Doc+ppEDef def =+  case def of+    Data lhs [] -> text "data" <+> ppLHS lhs+    Data lhs cs -> text "data" <+> ppLHS lhs <+> text "=" <+> hsep (punctuate (text " |") (map ppConstr cs))+    Newtype lhs c -> text "newtype" <+> ppLHS lhs <+> text "=" <+> ppConstr c+    Type lhs t -> text "type" <+> ppLHS lhs <+> text "=" <+> ppEType t+    Fcn i eqns -> ppEqns (ppIdent i) (text "=") eqns+    Sign i t -> ppIdent i <+> text "::" <+> ppEType t+    Import (ImportSpec q m mm mis) -> text "import" <+> (if q then text "qualified" else empty) <+> ppIdent m <> text (maybe "" ((" as " ++) . unIdent) mm) <>+      case mis of+        Nothing -> empty+        Just (h, is) -> text (if h then " hiding" else "") <> parens (hsep $ punctuate (text ", ") (map ppImportItem is))+    ForImp ie i t -> text ("foreign import ccall " ++ show ie) <+> ppIdent i <+> text "::" <+> ppEType t+    Infix (a, p) is -> text ("infix" ++ f a) <+> text (show p) <+> hsep (punctuate (text ", ") (map ppIdent is))+      where f AssocLeft = "l"; f AssocRight = "r"; f AssocNone = ""+    Class sup lhs fds bs -> ppWhere (text "class" <+> ppCtx sup <+> ppLHS lhs <+> ppFunDeps fds) bs+    Instance vs ct ty bs -> ppWhere (text "instance" <+> ppForall vs <+> ppCtx ct <+> ppEType ty) bs+    Default ts -> text "default" <+> parens (hsep (punctuate (text ", ") (map ppEType ts)))++ppCtx :: [EConstraint] -> Doc+ppCtx [] = empty+ppCtx ts = ppEType (ETuple ts) <+> text "=>"++ppFunDeps :: [FunDep] -> Doc+ppFunDeps [] = empty+ppFunDeps fds =+  text "|" <+> hsep (punctuate (text ",") (map (\ (is, os) -> hsep (map ppIdent is) <+> text "-" <+> hsep (map ppIdent os)) fds))++ppEqns :: Doc -> Doc -> [Eqn] -> Doc+ppEqns name sepr = vcat . map (\ (Eqn ps alts) -> sep [name <+> hsep (map ppEPat ps), ppAlts sepr alts])++ppConstr :: Constr -> Doc+ppConstr (Constr iks ct c cs) = ppForall iks <+> ppCtx ct <+> ppIdent c <+> ppCs cs+  where ppCs (Left  ts) = hsep (map ppSType ts)+        ppCs (Right fs) = braces (hsep $ map f fs)+          where f (i, t) = ppIdent i <+> text "::" <+> ppSType t <> text ","++ppSType :: SType -> Doc+ppSType (False, t) = ppEType t+ppSType (True, t) = text "!" <> ppEType t++ppLHS :: LHS -> Doc+ppLHS (f, vs) = hsep (ppIdent f : map ppIdKind vs)++ppIdKind :: IdKind -> Doc+ppIdKind (IdKind i k) = parens $ ppIdent i <> text "::" <> ppEKind k++ppEDefs :: [EDef] -> Doc+ppEDefs ds = vcat (map pp ds)+  where pp d@(Sign _ _) = ppEDef d+        pp d@(Import _) = ppEDef d+        pp d            = ppEDef d $+$ text ""++ppAlts :: Doc -> EAlts -> Doc+ppAlts asep (EAlts alts bs) = ppWhere (ppAltsL asep alts) bs++ppWhere :: Doc -> [EBind] -> Doc+ppWhere d [] = d+ppWhere d bs = (d <+> text "where") $+$ nest 2 (vcat (map ppEBind bs))++ppAltsL :: Doc -> [EAlt] -> Doc+ppAltsL asep [([], e)] = text "" <+> asep <+> ppExpr e+ppAltsL asep alts = vcat (map (ppAlt asep) alts)++ppAlt :: Doc -> EAlt -> Doc+ppAlt asep (ss, e) = text " |" <+> hsep (punctuate (text ",") (map ppEStmt ss)) <+> asep <+> ppExpr e++ppExpr :: Expr -> Doc+ppExpr ae =+  case ae of+    EVar i | isOperChar cop -> parens (text op)+           | otherwise      -> text op+             where op = unIdent (unQualIdent i)+                   cop = head op+    EApp _ _ -> ppApp [] ae+    EOper e ies -> ppExpr (foldl (\ e1 (i, e2) -> EApp (EApp (EVar i) e1) e2) e ies)+    ELam qs -> parens $ text "\\" <> ppEqns empty (text "->") qs+    ELit _ i -> text (showLit i)+    ECase e as -> text "case" <+> ppExpr e <+> text "of" $$ nest 2 (vcat (map ppCaseArm as))+    ELet bs e -> text "let" $$ nest 2 (vcat (map ppEBind bs)) $$ text "in" <+> ppExpr e+    ETuple es -> parens $ hsep $ punctuate (text ",") (map ppExpr es)+    EListish (LList es) -> ppList ppExpr es+    EDo mn ss -> maybe (text "do") (\ n -> ppIdent n <> text ".do") mn $$ nest 2 (vcat (map ppEStmt ss))+    ESectL e i -> parens $ ppExpr e <+> ppIdent i+    ESectR i e -> parens $ ppIdent i <+> ppExpr e+    EIf e1 e2 e3 -> parens $ sep [text "if" <+> ppExpr e1, text "then" <+> ppExpr e2, text "else" <+> ppExpr e3]+    EListish l -> ppListish l+    ESign e t -> ppExpr e <+> text "::" <+> ppEType t+    EAt i e -> ppIdent i <> text "@" <> ppExpr e+    EUVar i -> text ("a" ++ show i)+    ECon c -> ppCon c+    EForall iks e -> ppForall iks <+> ppEType e+--  where+ppApp :: [Expr] -> Expr -> Doc+ppApp as (EApp f a) = ppApp (a:as) f+ppApp as (EVar i) | isOperChar cop, [a, b] <- as = parens $ ppExpr a <+> text op <+> ppExpr b+                  | isOperChar cop, [a] <- as    = parens $ ppExpr a <+> text op+                  | cop == ','                   = ppExpr (ETuple as)+                  | op == "[]", length as == 1   = ppExpr (EListish (LList as))+                    where op = unIdent (unQualIdent i)+                          cop = head op+ppApp as f = parens $ hsep (map ppExpr (f:as))++ppForall :: [IdKind] -> Doc+--ppForall [] = empty+ppForall iks = text "forall" <+> hsep (map ppIdKind iks) <+> text "."++ppListish :: Listish -> Doc+ppListish _ = text "<<Listish>>"++ppCon :: Con -> Doc+ppCon (ConData _ s) = ppIdent s+ppCon (ConNew s) = ppIdent s+ppCon (ConLit _ l) = text (showLit l)++-- Literals are tagged the way they appear in the combinator file:+--  #   Int+--  %   Double+--  '   Char    (not in file)+--  "   String+--  ^   FFI function+--      primitive+showLit :: Lit -> String+showLit l =+  case l of+    LInt i     -> '#' : show i+    LInteger i -> '#' : '#' : show i+    LDouble d  -> '&' : show d+    LRat r     -> '%' : show r+    LChar c    -> show c+    LStr s     -> show s+    LPrim s    -> s+    LForImp s  -> '^' : s++ppEStmt :: EStmt -> Doc+ppEStmt as =+  case as of+    SBind p e -> ppEPat p <+> text "<-" <+> ppExpr e+    SThen e -> ppExpr e+    SLet bs -> text "let" $$ nest 2 (vcat (map ppEBind bs))++ppEBind :: EBind -> Doc+ppEBind ab =+  case ab of+    BFcn i eqns -> ppEDef (Fcn i eqns)+    BPat p e -> ppEPat p <+> text "=" <+> ppExpr e+    BSign i t -> ppIdent i <+> text "::" <+> ppEType t++ppCaseArm :: ECaseArm -> Doc+ppCaseArm arm =+  case arm of+    (p, alts) -> ppEPat p <> ppAlts (text "->") alts++ppEPat :: EPat -> Doc+ppEPat = ppExpr++ppEType :: EType -> Doc+ppEType = ppExpr++ppEKind :: EKind -> Doc+ppEKind = ppEType++ppList :: forall a . (a -> Doc) -> [a] -> Doc+ppList pp xs = brackets $ hsep $ punctuate (text ",") (map pp xs)+getBindVars :: EBind -> [Ident]+getBindVars abind =+  case abind of+    BFcn i _  -> [i]+    BPat p _  -> patVars p+    BSign _ _ -> []++getBindsVars :: [EBind] -> [Ident]+getBindsVars = concatMap getBindVars
+ src/MicroHs/Graph.hs view
@@ -0,0 +1,158 @@+{-# OPTIONS_GHC -Wno-unused-imports #-}+-----------------------------------------------------------------------------+-- Loosely based on:+--+-- Module      :  Data.Graph+-- Copyright   :  (c) The University of Glasgow 2002+-- License     :  BSD-style (see the file libraries/base/LICENSE)+--+-----------------------------------------------------------------------------++module MicroHs.Graph (+  stronglyConnComp,+  SCC(..)+  ) where+import Prelude+--Ximport Compat++import qualified Data.IntSet as IS+import qualified Data.IntMap as IM++import Data.List+import Data.Maybe++data Tree a = Node a [Tree a]+  --deriving (Eq, Ord, Show)++type Forest a = [Tree a]++-- | Strongly connected component.+data SCC vertex = AcyclicSCC vertex     -- ^ A single vertex that is not+                                        -- in any cycle.+                | CyclicSCC  [vertex]   -- ^ A maximal set of mutually+                                        -- reachable vertices.+  --Xderiving (Show)++stronglyConnComp+        :: forall key node .+           (key -> key -> Bool)+        -> [(node, key, [key])]+                -- ^ The graph: a list of nodes uniquely identified by keys,+                -- with a list of keys of nodes this node has edges to.+                -- The out-list may contain keys that don't correspond to+                -- nodes of the graph; such edges are ignored.+        -> [SCC node]+stronglyConnComp le edges0+  = map get_node (stronglyConnCompR le edges0)+  where+    get_node (AcyclicSCC (n, _, _)) = AcyclicSCC n+    get_node (CyclicSCC triples)    = CyclicSCC [n | (n,_,_) <- triples]++stronglyConnCompR+        :: forall key node .+           (key -> key -> Bool)+        -> [(node, key, [key])]+                -- ^ The graph: a list of nodes uniquely identified by keys,+                -- with a list of keys of nodes this node has edges to.+                -- The out-list may contain keys that don't correspond to+                -- nodes of the graph; such edges are ignored.+        -> [SCC (node, key, [key])]     -- ^ Reverse topologically sorted+stronglyConnCompR _ [] = []+stronglyConnCompR le edges0+  = map decode forest+  where+    (graph, vertex_fn) = graphFromEdges le edges0+    forest             = scc graph+    mentions_itself v = elemBy (==) v (graph IM.! v)+    decode (Node v []) | mentions_itself v = CyclicSCC [vertex_fn v]+                       | otherwise         = AcyclicSCC (vertex_fn v)+    decode other = CyclicSCC (dec other [])+                 where+                   dec (Node v ts) vs = vertex_fn v : foldr dec vs ts++type Vertex = Int+type Graph  = IM.IntMap [Vertex]+type Edge   = (Vertex, Vertex)++vertices :: Graph -> [Vertex]+vertices  = IM.keys++edges  :: Graph -> [Edge]+edges g = [ (v, w) | v <- vertices g, w <- g IM.! v ]++buildG :: [Vertex] -> [Edge] -> Graph+buildG vs es =+  let mt = IM.fromList (zip vs (repeat []))+  in  foldr (\ (v, w) -> IM.insertWith (++) v [w]) mt es++transposeG  :: Graph -> Graph+transposeG g = buildG (vertices g) (reverseE g)++reverseE  :: Graph -> [Edge]+reverseE g = [ (w, v) | (v, w) <- edges g ]++graphFromEdges+        :: forall key node .+           (key -> key -> Bool)+        -> [(node, key, [key])]+        -> (Graph, Vertex -> (node, key, [key]))+graphFromEdges le edges0+  = (graph, \v -> vertex_map IM.! v)+  where+    lek (_,k1,_) (_,k2,_) = le k1 k2++    max_v           = length edges0 - 1+    sorted_edges    = sortLE lek edges0+    edges1          = zip [0..] sorted_edges++    key_map         = IM.fromList [(v, k)                      | (v, (_,    k, _ )) <- edges1]++    -- key_vertex :: key -> Maybe Vertex+    --  returns Nothing for non-interesting vertices+    key_vertex k   = findVertex 0 max_v+                   where+                     findVertex a b | a > b+                              = Nothing+                     findVertex a b =+                         if k `le` m then+                           if m `le` k then+                             Just mid+                           else+                             findVertex a (mid - 1)+                         else+                           findVertex (mid + 1) b+                       where+                         mid = a + (b - a) `quot` 2+                         m = key_map IM.! mid++    graph           = IM.fromList [(v, mapMaybe key_vertex ks) | (v, (_,    _, ks)) <- edges1]+    vertex_map      = IM.fromList edges1++dff   :: Graph -> [Tree Vertex]+dff g = dfs g (vertices g)++dfs :: Graph -> [Vertex] -> Forest Vertex+dfs g vs0 = snd $ go IS.empty vs0+  where+    go :: IS.IntSet -> [Vertex] -> (IS.IntSet, Forest Vertex)+    go done [] = (done, [])+    go done (v:vs) =+      if IS.member v done+      then go done vs+      else+        let (done', as) = go (IS.insert v done) (g IM.! v)+            (done'', bs) = go done' vs+        in  (done'', Node v as : bs)+++postorder :: forall a . Tree a -> [a] -> [a]+postorder (Node a ts) = postorderF ts . (a :)++postorderF :: forall a . [Tree a] -> [a] -> [a]+postorderF ts = foldr (.) id $ map postorder ts++postOrd :: Graph -> [Vertex]+postOrd g = postorderF (dff g) []++scc  :: Graph -> [Tree Vertex]+scc g = dfs g (reverse (postOrd (transposeG g)))
+ src/MicroHs/Ident.hs view
@@ -0,0 +1,144 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Ident(+  Line, Col, Loc,+  Ident(..),+  mkIdent, mkIdentLoc, unIdent, isIdent,+  qualIdent, showIdent, setSLocIdent,+  ppIdent,+  mkIdentSLoc,+  isLower_, isIdentChar, isOperChar, isConIdent,+  dummyIdent, isDummyIdent,+  unQualIdent,+  unQualString,+  addIdentSuffix,+  SLoc(..), noSLoc, isNoSLoc,+  showSLoc,+  expectQualified,+  ) where+import Data.Eq+import Prelude+import Data.Char+import Text.PrettyPrint.HughesPJ+--Ximport Control.DeepSeq+--Ximport GHC.Stack++type Line = Int+type Col  = Int+type Loc  = (Line, Col)++data SLoc = SLoc !FilePath !Line !Col+  --Xderiving (Eq)++instance Show SLoc where+  show (SLoc f l c) = show f ++ "," ++ show l ++ ":" ++ show c++data Ident = Ident !SLoc String+  --deriving (Show)+--Xinstance NFData Ident where rnf (Ident _ s) = rnf s++instance Eq Ident where+  Ident _ i == Ident _ j  =  i == j++instance Ord Ident where+  compare (Ident _ i) (Ident _ j) = compare i j+  Ident _ i <  Ident _ j  =  i <  j+  Ident _ i <= Ident _ j  =  i <= j+  Ident _ i >  Ident _ j  =  i >  j+  Ident _ i >= Ident _ j  =  i >= j++instance Show Ident where+  show = showIdent++noSLoc :: SLoc+noSLoc = SLoc "" 0 0++isNoSLoc :: SLoc -> Bool+isNoSLoc (SLoc _ 0 0) = True+isNoSLoc _ = False++mkIdent :: String -> Ident+mkIdent = Ident noSLoc++mkIdentSLoc :: SLoc -> String -> Ident+mkIdentSLoc = Ident++mkIdentLoc :: FilePath -> Loc -> String -> Ident+mkIdentLoc fn (l, c) s = Ident (SLoc fn l c) s++unIdent :: Ident -> String+unIdent (Ident _ s) = s++setSLocIdent :: SLoc -> Ident -> Ident+setSLocIdent l (Ident _ s) = Ident l s++showIdent :: Ident -> String+showIdent (Ident _ i) = i++ppIdent :: Ident -> Doc+ppIdent (Ident _ i) = text i++isIdent :: String -> Ident -> Bool+isIdent s (Ident _ i) = s == i++qualIdent :: --XHasCallStack =>+             Ident -> Ident -> Ident+--XqualIdent _ (Ident _ i) | isQual i = error $ "already qualified " ++ i+qualIdent (Ident _ qi) (Ident loc i) = Ident loc (qi ++ "." ++ i)++expectQualified :: --XHasCallStack =>+                   Ident -> Ident+--XexpectQualified (Ident _ s) | not (isQual s) = error $ "not qualified " ++ s+expectQualified i = i++--XisQual :: String -> Bool+--XisQual (c:'.':_:_) | isAlphaNum c = True+--XisQual (_:cs) = isQual cs+--XisQual "" = False++addIdentSuffix :: Ident -> String -> Ident+addIdentSuffix (Ident loc i) s = Ident loc (i ++ s)++unQualString :: --XHasCallStack =>+                String -> String+unQualString [] = ""+unQualString s@(c:_) =+  if isIdentChar c then+    case dropWhile (/= '.') s of+      "" -> s+      '.':r -> unQualString r+      _ -> undefined -- This cannot happen, but GHC doesn't know that+  else+    s++unQualIdent :: Ident -> Ident+unQualIdent (Ident l s) = Ident l (unQualString s)++isConIdent :: Ident -> Bool+isConIdent (Ident _ i) =+  let+    c = head i+  in isUpper c || c == ':' || c == ',' || i == "[]"  || i == "()"++isOperChar :: Char -> Bool+isOperChar c = elem c "@\\=+-:<>.!#$%^&*/|~?"++isIdentChar :: Char -> Bool+isIdentChar c = isLower_ c || isUpper c || isDigit c || c == '\''++isLower_ :: Char -> Bool+isLower_ c = isLower c || c == '_'++dummyIdent :: Ident+dummyIdent = mkIdent "_"++isDummyIdent :: Ident -> Bool+isDummyIdent (Ident _ "_") = True+isDummyIdent _ = False++showSLoc :: SLoc -> String+showSLoc (SLoc fn l c) =+  if null fn then "no location" else+  show fn ++ +    if l == 0 && c == 0 then ""+    else ": line " ++ show l ++ ", col " ++ show c
+ src/MicroHs/IdentMap.hs view
@@ -0,0 +1,169 @@+{-# OPTIONS_GHC -Wno-name-shadowing #-}+--+-- Balanced binary trees+-- Similar to Data.Map+-- Based on https://ufal.mff.cuni.cz/~straka/papers/2011-bbtree.pdf+--+module MicroHs.IdentMap(+  Map,+  empty, singleton,+  insertWith, insert,+  fromListWith, fromList,+  delete,+  lookup,+  size,+  toList, elems,+  ) where+import Prelude hiding(lookup)+import MicroHs.Ident++data Map a+  = Nil           -- empty tree+  | One Ident a   -- singleton+  | Node          -- tree node+    (Map a)        -- left subtree+    Int            -- size of this tree+    Ident          -- key stored in the node+    a              -- element stored in the node+    (Map a)        -- right subtree+  --Xderiving(Show)++empty :: forall a . Map a+empty = Nil++singleton :: forall a . Ident -> a -> Map a+singleton i a = One i a++elems :: forall v . Map v -> [v]+elems = map snd . toList++toList :: forall v . Map v -> [(Ident, v)]+toList t = to t []+  where+    to Nil q = q+    to (One k v) q = (k, v):q+    to (Node l _ k v r) q = to l ((k, v) : to r q)++fromList :: forall v . [(Ident, v)] -> Map v+fromList = fromListWith const++fromListWith :: forall v . (v -> v -> v) -> [(Ident, v)] -> Map v+fromListWith comb = foldr (uncurry (insertWith comb)) empty++size :: forall a . Map a -> Int+size Nil = 0+size (One _ _) = 1+size (Node _ s _ _ _) = s++node :: forall a . Map a -> Ident -> a -> Map a -> Map a+node Nil  key val Nil   = One key val+node left key val right = Node left (size left + 1 + size right) key val right++lookup :: forall a . Ident -> Map a -> Maybe a+lookup k = look+  where+    look Nil = Nothing+    look (One key val) =+      case compare k key of+        EQ -> Just val+        _  -> Nothing+    look (Node left _ key val right) =+      case k `compare` key of+        LT -> look left+        EQ -> Just val+        GT -> look right++insert :: forall a . Ident -> a -> Map a -> Map a+insert = insertWith const++insertWith :: forall a . (a -> a -> a) -> Ident -> a -> Map a -> Map a+insertWith comb k v = ins+  where+    ins Nil = One k v+    ins (One a v) = ins (Node Nil 1 a v Nil)+    ins (Node left _ key val right) =+      case k `compare` key of+        LT -> balance (ins left) key val right+        EQ -> node left k (comb v val) right+        GT -> balance left key val (ins right)++delete :: forall a . Ident -> Map a -> Map a+delete k = del+  where+    del Nil = Nil+    del t@(One a _) | (k `compare` a) == EQ = Nil+                    | otherwise        = t+    del (Node left _ key val right) =+      case k `compare` key of+        LT -> balance (del left) key val right+        EQ -> glue left right+        GT -> balance left key val (del right)+      where+        glue Nil right = right+        glue left Nil = left+        glue left right+          | size left > size right =+            let (key', val', left') = extractMax left+            in node left' key' val' right+          | otherwise =+            let (key', val', right') = extractMin right+            in node left key' val' right'++extractMin :: forall a . Map a -> (Ident, a, Map a)+extractMin Nil = undefined+extractMin (One key val) = (key, val, Nil)+extractMin (Node Nil _ key val right) = (key, val, right)+extractMin (Node left _ key val right) =+  case extractMin left of+    (min, vmin, left') -> (min, vmin, balance left' key val right)++extractMax :: forall a . Map a -> (Ident, a, Map a)+extractMax Nil = undefined+extractMax (One key val) = (key, val, Nil)+extractMax (Node left _ key val Nil) = (key, val, left)+extractMax (Node left _ key val right) =+  case extractMax right of+    (max, vmax, right') -> (max, vmax, balance left key val right')++omega :: Int+omega = 3+alpha :: Int+alpha = 2+delta :: Int+delta = 0++balance :: forall a . Map a -> Ident -> a -> Map a -> Map a+balance left key val right+  | size left + size right <= 1 = node left key val right+balance (One k v) key val right = balance (Node Nil 1 k v Nil) key val right+balance left key val (One k v)  = balance left key val (Node Nil 1 k v Nil)+balance left key val right+  | size right > omega * size left + delta =+      case right of+        (Node rl _ _ _ rr) | size rl < alpha*size rr -> singleL left key val right+                           | otherwise -> doubleL left key val right+        _ -> undefined+  | size left > omega * size right + delta =+      case left of+        (Node ll _ _ _ lr) | size lr < alpha*size ll -> singleR left key val right+                           | otherwise -> doubleR left key val right+        _ -> undefined+  | otherwise = node left key val right++singleL :: forall a . Map a -> Ident -> a -> Map a -> Map a+singleL l k v (Node rl _ rk rv rr) = node (node l k v rl) rk rv rr+singleL _ _ _ _ = undefined++singleR :: forall a . Map a -> Ident -> a -> Map a -> Map a+singleR (Node ll _ lk lv lr) k v r = node ll lk lv (node lr k v r)+singleR _ _ _ _ = undefined++doubleL :: forall a . Map a -> Ident -> a -> Map a -> Map a+doubleL l k v (Node (Node rll _ rlk rlv rlr) _ rk rv rr) = node (node l k v rll) rlk rlv (node rlr rk rv rr)+doubleL l k v (Node (One        rlk rlv    ) _ rk rv rr) = node (node l k v Nil) rlk rlv (node Nil rk rv rr)+doubleL _ _ _ _ = undefined++doubleR :: forall a . Map a -> Ident -> a -> Map a -> Map a+doubleR (Node ll _ lk lv (Node lrl _ lrk lrv lrr)) k v r = node (node ll lk lv lrl) lrk lrv (node lrr k v r)+doubleR (Node ll _ lk lv (One        lrk lrv    )) k v r = node (node ll lk lv Nil) lrk lrv (node Nil k v r)+doubleR _ _ _ _ = undefined
+ src/MicroHs/Interactive.hs view
@@ -0,0 +1,170 @@+module MicroHs.Interactive(module MicroHs.Interactive) where+import Prelude+--Ximport Data.List+--import Control.DeepSeq+import Control.Exception+import MicroHs.StateIO+import MicroHs.Compile+import MicroHs.Desugar(LDef)+import MicroHs.Ident(mkIdent)+import MicroHs.Parse+import MicroHs.Translate+import Unsafe.Coerce+import System.Console.SimpleReadline+--Ximport Compat++type IState = (String, Flags, Cache)++type I a = StateIO IState a++mainInteractive :: Flags -> IO ()+mainInteractive (Flags a b c d _ f) = do+  when (not usingMhs) $+    error "Interactive mhs not available when compiled with ghc"+  putStrLn "Welcome to interactive MicroHs!"+  let flags' = Flags a b c d True f+  cach <- getCachedPrelude flags'+  _ <- runStateIO start (preamble, flags', cach)+  return ()++preamble :: String+preamble = "module " ++ interactiveName ++ "(module " ++ interactiveName +++           ") where\nimport Prelude\ndefault (Integer, Double)\n"++start :: I ()+start = do+  reload+  liftIO $ putStrLn "Type ':quit' to quit, ':help' for help"+  repl++repl :: I ()+repl = do+  ms <- liftIO $ getInputLineHist ".mhsi" "> "+  case ms of+    Nothing -> repl+    Just s ->+      case s of+        [] -> repl+        ':':r -> do+          c <- command r+          if c then repl else liftIO $ putStrLn "Bye"+        _ -> do+          oneline s+          repl++command :: String -> I Bool+command s =+  case words s of+    [] -> return True+    c : ws ->+      case filter (isPrefixOf c . fst) commands of+        [] -> do+          liftIO $ putStrLn "Unrecognized command"+          return True+        [(_, cmd)] ->+          cmd (unwords ws)+        xs -> do+          liftIO $ putStrLn $ "Ambiguous command: " ++ unwords (map fst xs)+          return True++commands :: [(String, String -> I Bool)]+commands =+  [ ("quit", const $ return False)+  , ("clear", const $ do+      updateLines (const preamble)+      modify $ \ (ls, flgs, _) -> (ls, flgs, emptyCache)+      return True+    )+  , ("reload", const $ do+      modify $ \ (ls, flgs, _) -> (ls, flgs, emptyCache)+      reload+      return True+    )+  , ("delete", \ del -> do+      updateLines (unlines . filter (not . isPrefixOf del) . lines)+      return True+    )+  , ("help", \ _ -> do+      liftIO $ putStrLn helpText+      return True+    )+  ]++reload :: I ()+reload = do+  (ls, _, _) <- get+  rld <- tryCompile ls   -- reload modules right away+  case rld of+    Left msg -> liftIO $ err msg+    Right _  -> return ()++helpText :: String+helpText = "Commands:\n  :quit      quit MicroHs\n  :reload    reload modules\n  :clear     clear all definitions\n  :delete d  delete definition(s) d\n  :help      this text\n  expr       evaluate expression\n  defn       add top level definition\n"++updateLines :: (String -> String) -> I ()+updateLines f = modify $ \ (ls, flgs, cache) -> (f ls, flgs, cache)++interactiveName :: String+interactiveName = "Interactive"++itName :: String+itName = "_it"++mkIt :: String -> String+mkIt l = itName ++ " :: IO ()\n" ++ itName ++ " = printOrRun (" ++ l ++ ")\n"++err :: Exn -> IO ()+err (Exn s) = putStrLn $ "Error: " ++ s++oneline :: String -> I ()+oneline line = do+  (ls, _, _) <- get+  -- Try adding the line as a definition+  let lls = ls ++ line ++ "\n"+  case parse pTop "" lls of+    Right _ -> do+--      liftIO $ putStrLn "pTop succeeded"+      -- Can parse as a definition, so compile it and report any errors.+      defTest <- tryCompile lls+      case defTest of+        Right _ -> updateLines (const lls)+        Left  e -> liftIO $ err e+    Left  _ -> do+--      liftIO $ putStrLn "pTop failed"+      -- Cannot parse as a definition.+      -- Try parsing it as an expression, and make it a definition+      case parse pExprTop "" line of+        Right _ -> do+--          liftIO $  putStrLn "pExprTop succeeded"+          exprTest <- tryCompile (ls ++ "\n" ++ mkIt line)+          case exprTest of+            Right m -> evalExpr m+            Left  e -> liftIO $ err e+        Left  e -> liftIO $ err (Exn e)++tryCompile :: String -> I (Either Exn [LDef])+tryCompile file = do+  (ls, flgs, cache) <- get+  let+    iid = mkIdent interactiveName+  liftIO $ writeFile (interactiveName ++ ".hs") file+  res <- liftIO $ try $ compileCacheTop flgs iid cache+  case res of+    Left e -> return (Left e)+    Right (m, cache') -> do+      put (ls, flgs, deleteFromCache iid cache')+      return (Right m)++evalExpr :: [LDef] -> I ()+evalExpr cmdl = do+  let ares = translate (mkIdent (interactiveName ++ "." ++ itName), cmdl)+      res = unsafeCoerce ares :: IO ()+  mval <- liftIO $ try (seq res (return res))+  liftIO $+    case mval of+      Left  e -> err e+      Right val -> do+        mio <- try val+        case mio of+          Left  e -> err e+          Right _ -> return ()
+ src/MicroHs/Lex.hs view
@@ -0,0 +1,232 @@+module MicroHs.Lex(+  lexTop,+  Token(..), showToken,+  tokensLoc) where+import Prelude --Xhiding(lex)+import Data.Char+import Data.List+--Ximport Compat+import MicroHs.Ident++data Token+  = TIdent  Loc [String] String+  | TString Loc String+  | TChar   Loc Char+  | TInt    Loc Integer+  | TRat    Loc Rational+  | TSpec   Loc Char+  | TError  Loc String+  | TBrace  Loc+  | TIndent Loc+  --Xderiving (Show)++showToken :: Token -> String+showToken (TIdent _ ss s) = intercalate "." (ss ++ [s])+showToken (TString _ s) = show s+showToken (TChar _ c) = show c+showToken (TInt _ i) = show i+showToken (TRat _ d) = show d+showToken (TSpec _ c) = [c]+showToken (TError _ s) = "ERROR " ++ s+showToken (TBrace _) = "TBrace"+showToken (TIndent _) = "TIndent"++incrLine :: Loc -> Loc+incrLine (l, _) = (l+1, 1)++addCol :: Loc -> Int -> Loc+addCol (l, c) i = (l, c + i)++mkLoc :: Line -> Col -> Loc+mkLoc l c = (l, c)++getCol :: Loc -> Col+getCol (_, c) = c++--getLin :: Loc -> Col+--getLin (l, _) = l++{-  This is slower and allocates more.+    It needs some strictness, probably+type Loc = Int++incrLine :: Loc -> Loc+incrLine l = (quot l 1000000 + 1) * 1000000 + 1++addCol :: Loc -> Int -> Loc+addCol loc i = loc + i++mkLoc :: Line -> Col -> Loc+mkLoc l c = l * 1000000 + c++getCol :: Loc -> Col+getCol loc = rem loc 1000000++getLin :: Loc -> Line+getLin loc = quot loc 1000000+-}++---------++lexTop :: String -> [Token]+lexTop = layout [] .+         lex (mkLoc 1 1)++-- | Take a location and string and produce a list of tokens+lex :: Loc -> String -> [Token]+lex loc (' ':cs)  = lex (addCol loc 1) cs+lex loc ('\n':cs) = tIndent (lex (incrLine loc) cs)+lex loc ('\r':cs) = lex loc cs+lex loc ('{':'-':cs) = skipNest (addCol loc 2) 1 cs+lex loc ('-':'-':cs) | isComm rs = skipLine (addCol loc $ 2+length ds) cs+  where+    (ds, rs) = span (== '-') cs+    isComm [] = True+    isComm (d:_) = not (isOperChar d)+lex loc (d:cs) | isLower_ d =+  case span isIdentChar cs of+    (ds, rs) -> tIdent loc [] (d:ds) (lex (addCol loc $ 1 + length ds) rs)+lex loc cs@(d:_) | isUpper d = upperIdent loc loc [] cs+lex loc ('0':x:cs) | toLower x == 'x' = hexNumber loc cs+lex loc ('-':cs@(d:_)) | isDigit d = number loc "-" cs+lex loc      cs@(d:_)  | isDigit d = number loc ""  cs+lex loc (d:cs) | isOperChar d  =+  case span isOperChar cs of+    (ds, rs) -> TIdent loc [] (d:ds) : lex (addCol loc $ 1 + length ds) rs+lex loc (d:cs) | isSpec d  = TSpec loc d : lex (addCol loc 1) cs+lex loc ('"':cs) =+  case takeChars loc (TString loc) '"' 0 [] cs of+    (t, n, rs) -> t : lex (addCol loc $ 2 + n) rs+lex loc ('\'':cs) =+  let tchar [c] = TChar loc c+      tchar _ = TError loc "Illegal Char literal"+  in  case takeChars loc tchar '\'' 0 [] cs of  -- XXX head of+        (t, n, rs) -> t : lex (addCol loc $ 2 + n) rs+lex loc (d:_) = [TError loc $ "Unrecognized input: " ++ show d]+lex _ [] = []++hexNumber :: Loc -> String -> [Token]+hexNumber loc cs =+  case span isHexDigit cs of+    (ds, rs) -> TInt loc (readHex ds) : lex (addCol loc $ length ds + 2) rs++number :: Loc -> String -> String -> [Token]   -- neg="-" means negative, neg=0 means positive+number loc sign cs =+  case span isDigit cs of+    (ds, rs) | null rs || not (head rs == '.') || (take 2 rs) == ".." ->+               let s = sign ++ ds+                   i = readInteger s+               in  TInt loc i : lex (addCol loc $ length s) rs+             | otherwise ->+               case span isDigit (tail rs) of+                 (ns, rs') ->+                   let s = sign ++ ds ++ '.':ns+                       mkD x r = TRat loc (readRational x) : lex (addCol loc $ length x) r+                   in  case expo rs' of+                         Nothing -> mkD s rs'+                         Just (es, rs'') -> mkD (s ++ es) rs''+  where+    expo (e:'-':xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e':'-':as, bs) where (as, bs) = span isDigit xs+    expo (e:'+':xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e':'+':as, bs) where (as, bs) = span isDigit xs+    expo (e:    xs@(d:_)) | toLower e == 'e' && isDigit d = Just ('e':    as, bs) where (as, bs) = span isDigit xs+    expo _ = Nothing++-- Skip a {- -} style comment+skipNest :: Loc -> Int -> String -> [Token]+skipNest loc 0 cs           = lex loc cs+skipNest loc n ('{':'-':cs) = skipNest (addCol loc 2) (n + 1) cs+skipNest loc n ('-':'}':cs) = skipNest (addCol loc 2) (n - 1) cs+skipNest loc n ('\n':cs)    = skipNest (incrLine loc)  n      cs+skipNest loc n ('\r':cs)    = skipNest loc             n      cs+skipNest loc n (_:cs)       = skipNest (addCol loc 1)  n      cs+skipNest loc _ []           = [TError loc "Unclosed {- comment"]++-- Skip a -- style comment+skipLine :: Loc -> String -> [Token]+skipLine loc cs@('\n':_) = lex loc cs+skipLine loc (_:cs)      = skipLine loc cs+skipLine   _ []          = []++-- | Takes a list of tokens and produces a list of tokens. If the first token in+-- the input list is a TIndent, the input is returned unaltered. Otherwise, a+-- TIndent is prepended to the input list        +tIndent :: [Token] -> [Token]+tIndent ts@(TIndent _ : _) = ts+tIndent ts = TIndent (tokensLoc ts) : ts++takeChars :: Loc -> (String -> Token) -> Char -> Int -> String -> String -> (Token, Int, String)+takeChars loc _ c n _ [] = (TError loc ("Unmatched " ++ [c]), n, [])+takeChars loc fn c n str ('\\':cs) =+  case decodeChar (n+1) cs of+    (d, m, rs) -> takeChars loc fn c m (d:str) rs+takeChars   _ fn c n str (d:cs) | c == d = (fn (reverse str), n, cs)+takeChars loc fn c n str (d:cs) = takeChars loc fn c (n+1) (d:str) cs++decodeChar :: Int -> String -> (Char, Int, String)+decodeChar n ('n':cs) = ('\n', n+1, cs)+decodeChar n ('r':cs) = ('\r', n+1, cs)+decodeChar n ('t':cs) = ('\t', n+1, cs)+decodeChar n ('b':cs) = ('\b', n+1, cs)+decodeChar n (c  :cs) = (c,    n+1, cs)+decodeChar n []       = ('X',  n,   [])++isSpec :: Char -> Bool+isSpec c = elem c "()[],{}`;"++upperIdent :: Loc -> Loc -> [String] -> String -> [Token]+--upperIdent l c qs acs | trace (show (l, c, qs, acs)) False = undefined+upperIdent loc sloc qs acs =+  case span isIdentChar acs of+   (ds, rs) ->+    case rs of+      '.':cs@(d:_) | isUpper d    -> upperIdent (addCol loc $ 1 + length ds) sloc (ds:qs) cs+                   | isLower d    -> ident isIdentChar+                   | isOperChar d -> ident isOperChar+         where {+           ident p =+             case span p cs of+               (xs, ys) -> tIdent sloc (reverse (ds:qs)) xs (lex (addCol loc $ 1 + length ds + length xs) ys)+           }+      _ -> TIdent sloc (reverse qs) ds : lex (addCol loc $ length ds) rs++tIdent :: Loc -> [String] -> String -> [Token] -> [Token]+tIdent loc qs kw ats | elem kw ["let", "where", "do", "of"]+                                 = ti : tBrace ats+                     | otherwise = ti : ats+  where {+    ti = TIdent loc qs kw;++    tBrace ts@(TSpec _ '{' : _) = ts;+    tBrace ts@(TIndent _ : TSpec _ '{' : _) = ts;+    tBrace (TIndent _ : ts) = TBrace (tokensLoc ts) : ts;+    tBrace ts = TBrace (tokensLoc ts) : ts+    }++tokensLoc :: [Token] -> Loc+tokensLoc (TIdent  loc _ _:_) = loc+tokensLoc (TString loc _  :_) = loc+tokensLoc (TChar   loc _  :_) = loc+tokensLoc (TInt    loc _  :_) = loc+tokensLoc (TRat    loc _ : _) = loc+tokensLoc (TSpec   loc _  :_) = loc+tokensLoc (TError  loc _  :_) = loc+tokensLoc (TBrace  loc    :_) = loc+tokensLoc (TIndent loc    :_) = loc+tokensLoc []                  = mkLoc 0 1++-- | This is the magical layout resolver, straight from the Haskell report.+layout :: [Int] -> [Token] -> [Token]+layout mms@(m : ms) tts@(TIndent x       : ts) | n == m = TSpec (tokensLoc ts) ';' : layout    mms  ts+                                               | n <  m = TSpec (tokensLoc ts) '}' : layout     ms tts where {n = getCol x}+layout          ms      (TIndent _       : ts)          =                            layout     ms  ts+layout mms@(m :  _)     (TBrace x        : ts) | n > m  = TSpec (tokensLoc ts) '{' : layout (n:mms) ts where {n = getCol x}+layout          []      (TBrace x        : ts) | n > 0  = TSpec (tokensLoc ts) '{' : layout     [n] ts where {n = getCol x}+layout     (0 : ms)     (t@(TSpec _ '}') : ts)          =                        t : layout     ms  ts +layout           _      (  (TSpec l '}') :  _)          = TError l "layout error }": []+layout          ms      (t@(TSpec _ '{') : ts)          =                        t : layout  (0:ms) ts+layout          ms      (t               : ts)          =                        t : layout     ms  ts+layout     (_ : ms)     []                              = TSpec (mkLoc 0 0) '}'    : layout     ms  []+layout          []      []                              =                            []++readHex :: String -> Integer+readHex = foldl (\ r c -> r * 16 + toInteger (digitToInt c)) 0
+ src/MicroHs/Main.hs view
@@ -0,0 +1,129 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-unused-do-bind #-}+module MicroHs.Main(main) where+import Prelude+--Ximport Data.List+import Control.DeepSeq+import Control.Monad+import Data.Maybe+import System.Environment+import MicroHs.Compile+import MicroHs.Exp+import MicroHs.Ident+import qualified MicroHs.IdentMap as M+import MicroHs.Translate+import MicroHs.Interactive+import MicroHs.MakeCArray+import System.Directory+import System.IO+import System.Process+--Ximport Compat++-- Version number of combinator file.+-- Must match version in eval.c.+combVersion :: String+combVersion = "v5.1\n"++mhsVersion :: String+mhsVersion = "0.8"++main :: IO ()+main = do+  aargs <- getArgs+  mdir <- lookupEnv "MHSDIR"+  let dir = fromMaybe "." mdir+  let+    args = takeWhile (/= "--") aargs+    ss = filter ((/= "-") . take 1) args+    flags = Flags (length (filter (== "-v") args))+                  (elem "-r" args)+                  ("." : (dir ++ "/lib") : catMaybes (map (stripPrefix "-i") args))+                  (head $ catMaybes (map (stripPrefix "-o") args) ++ ["out.comb"])+                  (elem "-l" args)+                  (elem "-c" args)+  if "--version" `elem` args then+    putStrLn $ "MicroHs, version " ++ mhsVersion ++ ", combinator file version " ++ combVersion+   else+    case ss of+      []  -> mainInteractive flags+      [s] -> mainCompile dir flags (mkIdentSLoc (SLoc "command-line" 0 0) s)+      _   -> error "Usage: mhs [-v] [-l] [-r] [-c] [-iPATH] [-oFILE] [ModuleName]"++mainCompile :: FilePath -> Flags -> Ident -> IO ()+mainCompile mhsdir flags mn | compileOnly flags = compileAndSave flags mn+                            | otherwise = do+  ds <- compileTop flags mn+  t1 <- getTimeMilli+  let+    mainName = qualIdent mn (mkIdent "main")+    cmdl = (mainName, ds)+    ref i = Var $ mkIdent $ "_" ++ show i+    defs = M.fromList [ (n, ref i) | ((n, _), i) <- zip ds (enumFrom (0::Int)) ]+    findIdent n = fromMaybe (error $ "main: findIdent: " ++ showIdent n) $+                  M.lookup n defs+    emain = findIdent mainName+    substv aexp =+      case aexp of+        Var n -> findIdent n+        App f a -> App (substv f) (substv a)+        e -> e+    def :: ((Ident, Exp), Int) -> (String -> String) -> (String -> String)+    def ((_, e), i) r =+      (("((A :" ++ show i ++ " ") ++) . toStringP (substv e) . (") " ++) . r . (")" ++)+    res = foldr def (toStringP emain) (zip ds (enumFrom 0)) ""+    numDefs = M.size defs+  when (verbose flags > 0) $+    putStrLn $ "top level defns: " ++ show numDefs+  when (verbose flags > 1) $+    mapM_ (\ (i, e) -> putStrLn $ showIdent i ++ " = " ++ toStringP e "") ds+  if runIt flags then do+    let+      prg = translateAndRun cmdl+--    putStrLn "Run:"+--    writeSerialized "ser.comb" prg+    prg+--    putStrLn "done"+   else do+    let outData = combVersion ++ show numDefs ++ "\n" ++ res+    seq (length outData) (return ())+    t2 <- getTimeMilli+    when (verbose flags > 0) $+      putStrLn $ "final pass            " ++ padLeft 6 (show (t2-t1)) ++ "ms"+    +    -- Decode what to do:+    --  * file ends in .comb: write combinator file+    --  * file ends in .c: write C version of combinator+    --  * otherwise, write C file and compile to a binary with cc+    let outFile = output flags+    if ".comb" `isSuffixOf` outFile then+      writeFile outFile outData+     else if ".c" `isSuffixOf` outFile then+      writeFile outFile $ makeCArray outData+     else do+       (fn, h) <- openTmpFile "mhsc.c"+       hPutStr h $ makeCArray outData+       hClose h+       ct1 <- getTimeMilli+       mcc <- lookupEnv "MHSCC"+       let cc = fromMaybe ("cc -w -Wall -O3 " ++ mhsdir ++ "/src/runtime/eval.c $IN -lm -o $OUT") mcc+           cmd = substString "$IN" fn $ substString "$OUT" outFile cc+       when (verbose flags > 0) $+         putStrLn $ "Execute: " ++ show cmd+       callCommand cmd+       removeFile fn+       ct2 <- getTimeMilli+       when (verbose flags > 0) $+         putStrLn $ "C compilation         " ++ padLeft 6 (show (ct2-ct1)) ++ "ms"++compileAndSave :: Flags -> Ident -> IO ()+compileAndSave flags mn = do+--  putStrLn "Start"+  (_, cache) <- compileCacheTop flags mn emptyCache+--  putStrLn "compile done"+  () <- seq (rnf cache) (return ())+--  putStrLn "rnf done"+  hout <- openFile (output flags) WriteMode+  hSerialize hout cache+--  putStrLn "write done"+  hClose hout
+ src/MicroHs/MakeCArray.hs view
@@ -0,0 +1,24 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.MakeCArray(makeCArray) where+import Prelude+import Data.Char++chunkify :: Int -> String -> [String]+chunkify _ [] = []+chunkify n xs =+  let (as, bs) = splitAt n xs+  in  as : chunkify n bs++showChunk :: [Char] -> String+showChunk = concatMap (\ c -> show (ord c) ++ ",")++makeCArray :: String -> String+makeCArray file =+  let chunks = chunkify 20 file+  in  unlines $ ["static unsigned char data[] = {"] +++                map showChunk chunks +++                ["};",+                 "unsigned char *combexpr = data;",+                 "int combexprlen = " ++ show (length file) ++ ";"+                ]
+ src/MicroHs/Parse.hs view
@@ -0,0 +1,590 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-do-bind #-}+module MicroHs.Parse(pTop, parseDie, parse, pExprTop) where+import Prelude --Xhiding (Monad(..), Applicative(..), MonadFail(..), Functor(..), (<$>))+import Data.Char+import Data.List+import Text.ParserComb as P+import MicroHs.Lex+import MicroHs.Expr+import MicroHs.Ident+--Ximport Compat++type P a = Prsr FilePath Token a++getFileName :: P FilePath+getFileName = get++parseDie :: forall a . --X (Show a) =>+            P a -> FilePath -> String -> a+parseDie p fn file =+  case parse p fn file of+    Left msg -> error msg+    Right a -> a++parse :: forall a . --X (Show a) =>+         P a -> FilePath -> String -> Either String a+parse p fn file =+  let { ts = lexTop file } in+  case runPrsr fn p ts of+    Left lf -> Left $ formatFailed fn ts lf+    Right [(a, _)] -> Right a+    Right as -> Left $ "Ambiguous:"+--X                     ++ unlines (map (show . fst) as)++getLoc :: P Loc+getLoc = do+  t <- nextToken+  pure (tokensLoc [t])++pTop :: P EModule+pTop = pModule <* eof++pExprTop :: P Expr+pExprTop = pExpr <* eof++pModule :: P EModule+pModule = EModule <$> (pKeyword "module" *> pUQIdentA) <*>+                      (pSpec '(' *> esepEndBy pExportItem (pSpec ',') <* pSpec ')') <*>+                      (pKeyword "where" *> pBlock pDef)++pQIdent :: P Ident+pQIdent = do+  fn <- getFileName+  let+    is (TIdent loc qs s) | isAlpha_ (head s) = Just (qualName fn loc qs s)+    is _ = Nothing+  satisfyM "QIdent" is++pUIdentA :: P Ident+pUIdentA = do+  fn <- getFileName+  let+    is (TIdent loc [] s) | isUpper (head s) = Just (mkIdentLoc fn loc s)+    is _ = Nothing+  satisfyM "UIdent" is++pUIdent :: P Ident+pUIdent =+      pUIdentA+  <|< pUIdentSpecial++pUIdentSym :: P Ident+pUIdentSym = pUIdent <|< pParens pUSymOper++pUIdentSpecial :: P Ident+pUIdentSpecial = do+  fn <- getFileName+  loc <- getLoc+  let+    mk = mkIdentLoc fn loc+  +  (mk . map (const ',') <$> (pSpec '(' *> esome (pSpec ',') <* pSpec ')'))+    <|< (mk "()" <$ (pSpec '(' *> pSpec ')'))  -- Allow () as a constructor name+    <|< (mk "[]" <$ (pSpec '[' *> pSpec ']'))  -- Allow [] as a constructor name++pUQIdentA :: P Ident+pUQIdentA = do+  fn <- getFileName+  let+    is (TIdent loc qs s) | isUpper (head s) = Just (qualName fn loc qs s)+    is _ = Nothing+  satisfyM "UQIdent" is++pUQIdent :: P Ident+pUQIdent =+      pUQIdentA+  <|< pUIdentSpecial++pLIdent :: P Ident+pLIdent = do+  fn <- getFileName+  let+    is (TIdent loc [] s) | isLower_ (head s) && not (elem s keywords) = Just (mkIdentLoc fn loc s)+    is _ = Nothing+  satisfyM "LIdent" is++pLQIdent :: P Ident+pLQIdent = do+  fn <- getFileName+  let+    is (TIdent loc qs s) | isLower_ (head s) && not (elem s keywords) = Just (qualName fn loc qs s)+    is _ = Nothing+  satisfyM "LQIdent" is++-- Type names can be any operator+pTypeIdentSym :: P Ident+pTypeIdentSym = pUIdent <|< pParens pSymOper++keywords :: [String]+keywords =+  ["case", "class", "data", "default", "do", "else", "forall", "foreign", "if",+   "import", "in", "infix", "infixl", "infixr", "instance",+   "let", "module", "newtype", "of", "primitive", "then", "type", "where"]++pSpec :: Char -> P ()+pSpec c = () <$ satisfy [c] is+  where+    is (TSpec _ d) = c == d+    is _ = False++pSymbol :: String -> P ()+pSymbol sym = () <$ satisfy sym is+  where+    is (TIdent _ [] s) = s == sym+    is _ = False++pOper :: P Ident+pOper = pQSymOper <|< (pSpec '`' *> pQIdent <* pSpec '`')++pQSymOper :: P Ident+pQSymOper = do+  fn <- getFileName+  let+    is (TIdent loc qs s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (qualName fn loc qs s)+    is _ = Nothing+  satisfyM "QSymOper" is++pSymOper :: P Ident+pSymOper = do+  fn <- getFileName+  let+    is (TIdent loc [] s) | not (isAlpha_ (head s)) && not (elem s reservedOps) = Just (mkIdentLoc fn loc s)+    is _ = Nothing+  satisfyM "SymOper" is++pUQSymOper :: P Ident+pUQSymOper = do+  s <- pQSymOper+  guard (isUOper s)+  pure s++isUOper :: Ident -> Bool+isUOper = (== ':') . head . unIdent++pUSymOper :: P Ident+pUSymOper = do+  s <- pSymOper+  guard (isUOper s)+  pure s++pLQSymOper :: P Ident+pLQSymOper = do+  s <- pQSymOper+  guard (not (isUOper s))+  pure s++-- Allow -> as well+pLQSymOperArr :: P Ident+pLQSymOperArr = pLQSymOper <|< pQArrow++-- Parse ->, possibly qualified+pQArrow :: P Ident+pQArrow = do+  fn <- getFileName+  let+    is (TIdent loc qs s@"->") = Just (qualName fn loc qs s)+    is _ = Nothing+  satisfyM "->" is++pLSymOper :: P Ident+pLSymOper = do+  s <- pSymOper+  guard (not (isUOper s))+  pure s++reservedOps :: [String]+reservedOps = ["=", "|", "::", "<-", "@", "..", "->"]++pUQIdentSym :: P Ident+pUQIdentSym = pUQIdent <|< pParens pUQSymOper++pLQIdentSym :: P Ident+pLQIdentSym = pLQIdent <|< pParens pLQSymOperArr++pLIdentSym :: P Ident+pLIdentSym = pLIdent <|< pParens pLSymOper++pParens :: forall a . P a -> P a+pParens p = pSpec '(' *> p <* pSpec ')'++pLit :: P Expr+pLit = do+  fn <- getFileName+  let+    is (TString (l, c) s) = Just (ELit (SLoc fn l c) (LStr s))+    is (TChar   (l, c) a) = Just (ELit (SLoc fn l c) (LChar a))+    is (TInt    (l, c) i) = Just (ELit (SLoc fn l c) (LInteger i))+    is (TRat    (l, c) d) = Just (ELit (SLoc fn l c) (LRat d))+    is _ = Nothing+  satisfyM "literal" is++pString :: P String+pString = satisfyM "string" is+  where+    is (TString _ s) = Just s+    is _ = Nothing++---------------++pExportItem :: P ExportItem+pExportItem =+      ExpModule <$> (pKeyword "module" *> pUQIdent)+  <|< ExpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')+  <|< ExpType <$> pUQIdentSym+  <|< ExpValue <$> pLQIdentSym++pKeyword :: String -> P ()+pKeyword kw = () <$ satisfy kw is+  where+    is (TIdent _ [] s) = kw == s+    is _ = False++pBlock :: forall a . P a -> P [a]+pBlock p = do+  pSpec '{'+  as <- esepBy p (pSpec ';')+  eoptional (pSpec ';')+  pSpec '}'+  pure as++pDef :: P EDef+pDef =+      Data        <$> (pKeyword "data"    *> pLHS) <*> ((pSymbol "=" *> esepBy1 pConstr (pSymbol "|"))+                                                        <|< pure [])+  <|< Newtype     <$> (pKeyword "newtype" *> pLHS) <*> (pSymbol "=" *> (Constr [] [] <$> pUIdentSym <*> pField))+  <|< Type        <$> (pKeyword "type"    *> pLHS) <*> (pSymbol "=" *> pType)+  <|< uncurry Fcn <$> pEqns+  <|< Sign        <$> (pLIdentSym <* pSymbol "::") <*> pType+  <|< Import      <$> (pKeyword "import"  *> pImportSpec)+  <|< ForImp      <$> (pKeyword "foreign" *> pKeyword "import" *> pKeyword "ccall" *> pString) <*> pLIdent <*> (pSymbol "::" *> pType)+  <|< Infix       <$> ((,) <$> pAssoc <*> pPrec) <*> esepBy1 pTypeOper (pSpec ',')+  <|< Class       <$> (pKeyword "class"    *> pContext) <*> pLHS <*> pFunDeps     <*> pWhere pClsBind+  <|< Instance    <$> (pKeyword "instance" *> pForall)  <*> pContext <*> pTypeApp <*> pWhere pClsBind+  <|< Default     <$> (pKeyword "default"  *> pParens (esepBy pType (pSpec ',')))+  where+    pAssoc = (AssocLeft <$ pKeyword "infixl") <|< (AssocRight <$ pKeyword "infixr") <|< (AssocNone <$ pKeyword "infix")+    dig (TInt _ ii) | -2 <= i && i <= 9 = Just i  where i = _integerToInt ii+    dig _ = Nothing+    pPrec = satisfyM "digit" dig++    pFunDeps = (pSymbol "|" *> esepBy1 pFunDep (pSpec ',')) <|< pure []+    pFunDep = (,) <$> esome pLIdent <*> (pSymbol "->" *> esome pLIdent)+    pField = do+      fs <- pFields+      guard $ either length length fs == 1+      pure fs++pContext :: P [EConstraint]+pContext = (pCtx <* pSymbol "=>") <|< pure []+  where+    pCtx = pParens (emany pType) <|< ((:[]) <$> pTypeApp)++pConstr :: P Constr+pConstr = (Constr <$> pForall <*> pContext <*> pUIdentSym <*> pFields)+      <|< ((\ vs ct t1 c t2 -> Constr vs ct c (Left [t1, t2])) <$>+            pForall <*> pContext <*> pSAType <*> pUSymOper <*> pSAType)++pFields :: P (Either [SType] [(Ident, SType)])+pFields = Left  <$> emany pSAType <|<+          Right <$> (pSpec '{' *> esepBy ((,) <$> (pLIdentSym <* pSymbol "::") <*> pSType) (pSpec ',') <* pSpec '}')++pSAType :: P (Bool, EType)+pSAType = (,) <$> pStrict <*> pAType+pSType :: P (Bool, EType)+pSType  = (,) <$> pStrict <*> pType+pStrict :: P Bool+pStrict = (True <$ pSymbol "!") <|< pure False++pLHS :: P LHS+pLHS = (,) <$> pTypeIdentSym <*> emany pIdKind+    <|< (\ a c b -> (c, [a,b])) <$> pIdKind <*> pSymOper <*> pIdKind++pImportSpec :: P ImportSpec+pImportSpec =+  let+    pQua = (True <$ pKeyword "qualified") <|< pure False+  in  ImportSpec <$> pQua <*> pUQIdentA <*> eoptional (pKeyword "as" *> pUQIdent) <*>+        eoptional ((,) <$> ((True <$ pKeyword "hiding") <|> pure False) <*> pParens (esepEndBy pImportItem (pSpec ',')))++pImportItem :: P ImportItem+pImportItem =+      ImpTypeCon <$> (pUQIdentSym <* pSpec '(' <* pSymbol ".." <* pSpec ')')+  <|< ImpType <$> pUQIdentSym+  <|< ImpValue <$> pLQIdentSym++--------+-- Types++pIdKind :: P IdKind+pIdKind =+      ((\ i -> IdKind i kType) <$> pLIdentSym)+  <|< pParens (IdKind <$> pLIdentSym <*> (pSymbol "::" *> pKind))++pKind :: P EKind+pKind = pType++--+-- Partial copy of pExpr, but that includes '->'.+-- Including '->' in pExprOp interacts poorly with '->'+-- in lambda and 'case'.+pType :: P EType+pType = do+  vs <- pForall+  t <- pTypeOp+  pure $ if null vs then t else EForall vs t++pForall :: P [IdKind]+pForall = (pKeyword "forall" *> esome pIdKind <* pSymbol ".") <|< pure []++pTypeOp :: P EType+pTypeOp = pOperators pTypeOper pTypeArg++pTypeOper :: P Ident+pTypeOper = pOper <|< (mkIdent "->" <$ pSymbol "->") <|< (mkIdent "=>" <$ pSymbol "=>")++pTypeArg :: P EType+pTypeArg = pTypeApp++pTypeApp :: P EType+pTypeApp = do+  f <- pAType+  as <- emany pAType+  mt <- eoptional (pSymbol "::" *> pType)+  let+    r = foldl EApp f as+  pure $ maybe r (ESign r) mt++pAType :: P Expr+pAType =+      (EVar <$> pLQIdentSym)+  <|< (EVar <$> pUQIdentSym)+  <|< pLit+  <|< (eTuple <$> (pSpec '(' *> esepBy1 pType (pSpec ',') <* pSpec ')'))+  <|< (EListish . LList . (:[]) <$> (pSpec '[' *> pType <* pSpec ']'))  -- Unlike expressions, only allow a single element.++-------------+-- Patterns++-- Sadly pattern and expression parsing cannot be joined because the+-- use of '->' in 'case' and lambda makes it weird.+-- Instead this is just a copy of some of the expression rules.+-- XXX This can probably be joined with pExpr again now that pType+-- is separate.+pAPat :: P EPat+pAPat =+      (do+         i <- pLIdentSym+         (EAt i <$> (pSymbol "@" *> pAPat)) <|< pure (EVar i)+      )+  <|< (EVar <$> pUQIdentSym)+  <|< pLit+  <|< (eTuple <$> (pSpec '(' *> esepBy1 pPat (pSpec ',') <* pSpec ')'))+  <|< (EListish . LList <$> (pSpec '[' *> esepBy1 pPat (pSpec ',') <* pSpec ']'))++pPat :: P EPat+pPat = pPatOp++pPatOp :: P EPat+pPatOp = pOperators pOper pPatArg++pPatArg :: P EPat+pPatArg = pPatApp++pPatApp :: P EPat+pPatApp = do+  f <- pAPat+  as <- emany pAPat+  guard (null as || isPConApp f)+  pure $ foldl EApp f as++pPatNotVar :: P EPat+pPatNotVar = do+  p <- pPat+  guard (not (isPVar p))+  pure p++-------------++pEqns :: P (Ident, [Eqn])+pEqns = do+  (name, eqn@(Eqn ps alts)) <- pEqn (\ _ _ -> True)+  case (ps, alts) of+    ([], EAlts [_] []) ->+      -- don't collect equations when of the form 'i = e'+      pure (name, [eqn])+    _ -> do+      neqns <- emany (pSpec ';' *> pEqn (\ n l -> n == name && l == length ps))+      pure (name, eqn : map snd neqns)++pEqn :: (Ident -> Int -> Bool) -> P (Ident, Eqn)+pEqn test = do+  (name, pats) <- pEqnLHS+  alts <- pAlts (pSymbol "=")+  guard (test name (length pats))+  pure (name, Eqn pats alts)++pEqnLHS :: P (Ident, [EPat])+pEqnLHS =+  ((,) <$> pLIdentSym <*> emany pAPat)+  <|>   -- XXX this <|> causes a slowdown, but is necessary+  pOpLHS+  <|<+  ((\ (i, ps1) ps2 -> (i, ps1 ++ ps2)) <$> pParens pOpLHS <*> emany pAPat)+  where+    pOpLHS = (\ p1 i p2 -> (i, [p1,p2])) <$> pPatApp <*> pLOper <*> pPatApp+    pLOper = do+      i <- pOper+      guard (not (isConIdent i))+      pure i++pAlts :: P () -> P EAlts+pAlts sep = do+  alts <- pAltsL sep+  bs <- pWhere pBind+  pure (EAlts alts bs)+  +pAltsL :: P () -> P [EAlt]+pAltsL sep =+      esome ((,) <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')) <*> (sep *> pExpr))+  <|< ((\ e -> [([], e)]) <$> (sep *> pExpr))++pWhere :: P EBind -> P [EBind]+pWhere pb =+      (pKeyword "where" *> pBlock pb)+  <|< pure []++-------------+-- Statements++pStmt :: P EStmt+pStmt =+      (SBind <$> (pPat <* pSymbol "<-") <*> pExpr)+  <|< (SLet  <$> (pKeyword "let" *> pBlock pBind))+  <|< (SThen <$> pExpr)++-------------+-- Expressions++pExpr :: P Expr+pExpr = pExprOp++pExprArg :: P Expr+pExprArg = pExprApp <|< pLam <|< pCase <|< pLet <|< pIf <|< pDo++pExprApp :: P Expr+pExprApp = do+  f <- pAExpr+  as <- emany pAExpr+  mt <- eoptional (pSymbol "::" *> pType)+  let+    r = foldl EApp f as+  pure $ maybe r (ESign r) mt++pLam :: P Expr+pLam = eLam <$> (pSymbol "\\" *> esome pAPat) <*> (pSymbol "->" *> pExpr)++pCase :: P Expr+pCase = ECase <$> (pKeyword "case" *> pExpr) <*> (pKeyword "of" *> pBlock pCaseArm)++pCaseArm :: P ECaseArm+pCaseArm = (,) <$> pPat <*> pAlts (pSymbol "->")++pLet :: P Expr+pLet = ELet <$> (pKeyword "let" *> pBlock pBind) <*> (pKeyword "in" *> pExpr)++pDo :: P Expr+pDo = EDo <$> ((Just <$> pQualDo) <|< (Nothing <$ pKeyword "do")) <*> pBlock pStmt++pIf :: P Expr+pIf = EIf <$> (pKeyword "if" *> pExpr) <*> (pKeyword "then" *> pExpr) <*> (pKeyword "else" *> pExpr)++pQualDo :: P Ident+pQualDo = do+  fn <- getFileName+  let+    is (TIdent loc qs@(_:_) "do") = Just (mkIdentLoc fn loc (intercalate "." qs))+    is _ = Nothing+  satisfyM "QualDo" is++pOperComma :: P Ident+pOperComma = pOper <|< pComma+  where+    pComma = mkIdentLoc <$> getFileName <*> getLoc <*> ("," <$ pSpec ',')++pAExpr :: P Expr+pAExpr = (+      (EVar   <$> pLQIdentSym)+  <|< (EVar   <$> pUQIdentSym)+  <|< pLit+  <|< (eTuple <$> (pSpec '(' *> esepBy1 pExpr (pSpec ',') <* pSpec ')'))+  <|< EListish <$> (pSpec '[' *> pListish <* pSpec ']')+  <|< (ESectL <$> (pSpec '(' *> pExprArg) <*> (pOperComma <* pSpec ')'))+  <|< (ESectR <$> (pSpec '(' *> pOperComma) <*> (pExprArg <* pSpec ')'))+  <|< (ELit noSLoc . LPrim <$> (pKeyword "primitive" *> pString))+  )+  -- This weirdly slows down parsing+  -- <?> "aexpr"++pListish :: P Listish+pListish = do+  e1 <- pExpr+  let+    pMore = do+      e2 <- pExpr+      ((\ es -> LList (e1:e2:es)) <$> esome (pSpec ',' *> pExpr))+       <|< (LFromThenTo e1 e2 <$> (pSymbol ".." *> pExpr))+       <|< (LFromThen e1 e2 <$ pSymbol "..")+       <|< pure (LList [e1,e2])+  (pSpec ',' *> pMore)+   <|< (LCompr e1 <$> (pSymbol "|" *> esepBy1 pStmt (pSpec ',')))+   <|< (LFromTo e1 <$> (pSymbol ".." *> pExpr))+   <|< (LFrom e1 <$ pSymbol "..")+   <|< pure (LList [e1])++pExprOp :: P Expr+pExprOp = pOperators pOper pExprArg++pOperators :: P Ident -> P Expr -> P Expr+pOperators oper one = eOper <$> one <*> emany ((,) <$> oper <*> one)+  where eOper e [] = e+        eOper e ies = EOper e ies++-------------+-- Bindings++pBind :: P EBind+pBind = +      BPat         <$> (pPatNotVar <* pSymbol "=") <*> pExpr+  <|< pClsBind++pClsBind :: P EBind+pClsBind = +      uncurry BFcn <$> pEqns+  <|< BSign        <$> (pLIdentSym <* pSymbol "::") <*> pType++-------------++eTuple :: [Expr] -> Expr+eTuple [] = error "eTuple"+eTuple [e] = e+eTuple es = ETuple es++isAlpha_ :: Char -> Bool+isAlpha_ c = isLower_ c || isUpper c++qualName :: FilePath -> Loc -> [String] -> String -> Ident+qualName fn loc qs s = mkIdentLoc fn loc (intercalate "." (qs ++ [s]))++-------------++formatFailed :: String -> [Token] -> LastFail Token -> String+formatFailed fn _fs (LastFail _ ts msgs) =+  let+    (line, col) = tokensLoc ts+    sloc = SLoc fn line col+  in+    showSLoc sloc ++ ":\n"+      ++ "  found:    " ++ head (map showToken ts ++ ["EOF"]) ++ "\n"+      ++ "  expected: " ++ unwords (nub msgs)
+ src/MicroHs/StateIO.hs view
@@ -0,0 +1,67 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-unused-imports -Wno-dodgy-imports #-}+-- State monad over IO+module MicroHs.StateIO(+  module MicroHs.StateIO,+  module Control.Applicative,+  module Control.Monad,+  module Data.Functor,+  ) where+import Prelude+import Control.Applicative+import Control.Monad+import Data.Functor --Xhiding(unzip)++data StateIO s a = S (s -> IO (a,s))++runStateIO :: forall s a . StateIO s a -> (s -> IO (a,s))+runStateIO sa =+  case sa of+    S x -> x++{-+execStateIO :: forall s a . StateIO s a -> s -> IO s+execStateIO sa s = do+  as <- runStateIO sa s+  case as of+    (_, ss) -> return ss+-}++instance forall s . Functor (StateIO s) where+  fmap f sa = S $ \ s -> do+    (a, ss) <- runStateIO sa s+    return (f a, ss)++instance forall s . Applicative (StateIO s) where+  pure a = S $ \ s -> return (a, s)+  (<*>) = ap+  (*>) m k = S $ \ s -> do+    (_, ss) <- runStateIO m s+    runStateIO k ss++instance forall s . Monad (StateIO s) where+  (>>=) m k = S $ \ s -> do+    (a, ss) <- runStateIO m s+    runStateIO (k a) ss+  (>>) = (*>)++instance forall s . MonadFail (StateIO s) where+  fail = error++gets :: forall s a . (s -> a) -> StateIO s a+gets f = S $ \ s -> return (f s, s)++modify :: forall s . (s -> s) -> StateIO s ()+modify f = S $ \ s -> return ((), f s)++put :: forall s . s -> StateIO s ()+put s = S $ \ _ -> return ((), s)++get :: forall s . StateIO s s+get = S $ \ s -> return (s, s)++liftIO :: forall s a . IO a -> StateIO s a+liftIO io = S $ \ s -> do+  a <- io+  return (a, s)
+ src/MicroHs/TCMonad.hs view
@@ -0,0 +1,31 @@+{-# OPTIONS_GHC -Wno-orphans -Wno-dodgy-imports -Wno-unused-imports #-}+module MicroHs.TCMonad(+  TC, tcRun,+  fmap, (<$>), (<*>),+  (>>=), (>>), return, fail,+  get, put, gets,+  mapM, mapM_,+  sequence,+  when,+  tcError+  ) where+--Ximport Control.Monad hiding(ap)+--Ximport Data.Functor.Identity+--Ximport GHC.Stack+import Data.Char  -- for String+import Control.Applicative+import Control.Monad.State.Strict --Xhiding(ap)+import Data.Functor+import MicroHs.Ident+import MicroHs.Expr++type TC s a = State s a++tcRun :: forall s a . TC s a -> s -> (a, s)+tcRun = runState++tcError :: --XHasCallStack =>+           forall s a . SLoc -> String -> TC s a+tcError = errorMessage++--Xinstance MonadFail Identity where fail = error
+ src/MicroHs/Translate.hs view
@@ -0,0 +1,135 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+module MicroHs.Translate(+  translate, translateAndRun+  ) where+import Prelude+import Data.Maybe+import qualified MicroHs.IdentMap as M+import System.Environment+import Unsafe.Coerce+--Ximport GHC.Types+--Ximport Compat+--Ximport PrimTable++import MicroHs.Desugar(LDef, encodeInteger)+import MicroHs.Expr+import MicroHs.Exp+import MicroHs.Ident++translateAndRun :: (Ident, [LDef]) -> IO ()+--translateAndRun :: (Ident, [(Ident, Exp)]) -> IO ()+translateAndRun defs = do+  -- Drop all argument up to '--'+  args <- getArgs+  let prog = unsafeCoerce $ translate defs+  withDropArgs (length (takeWhile (/= "--") args) + 1)+    prog++translate :: (Ident, [LDef]) -> Any+--translate :: (Ident, [(Ident, Exp)]) -> Any+translate (mainName, ds) =+  let+    look m n = fromMaybe (error $ "translate: not found " ++ showIdent n) $ M.lookup n m+    mp = M.fromList [(n, trans (look mp) d) | (n, d) <- ds ]+  in look mp mainName++trans :: (Ident -> Any) -> Exp -> Any+trans r ae =+  case ae of+    Var n -> r n+    App f a -> unsafeCoerce (trans r f) (trans r a)+    Lit (LInt i) -> unsafeCoerce i+    Lit (LDouble i) -> unsafeCoerce i+    Lit (LStr s) -> trans r (encodeString s)+    Lit (LPrim p) -> fromMaybe (error $ "trans: no primop " ++ p) $ lookup p primTable+    Lit (LInteger i) -> trans r (encodeInteger i)+    Lit (LForImp s) -> trans r (App (Lit (LPrim "dynsym")) (Lit (LStr s)))+    _ -> error $ "trans: impossible: " ++ show ae++-- Use linear search in this table.+-- 99% of the hits are among the combinators.+primTable :: [(String, Any)]+primTable = [+  ("B", primitive "B"),+  ("O", primitive "O"),+  ("K", primitive "K"),+  ("C'", primitive "C'"),+  ("C", primitive "C"),+  ("A", primitive "A"),+  ("S'", primitive "S'"),+  ("P", primitive "P"),+  ("I", primitive "I"),+  ("S", primitive "S"),+  ("U", primitive "U"),+  ("Y", primitive "Y"),+  ("B'", primitive "B'"),+  ("Z", primitive "Z"),+  ("R", primitive "R"),+  ("+", primitive "+"),+  ("-", primitive "-"),+  ("*", primitive "*"),+  ("quot", primitive "quot"),+  ("rem", primitive "rem"),+  ("uquot", primitive "uquot"),+  ("urem", primitive "urem"),+  ("neg", primitive "neg"),+  ("and", primitive "and"),+  ("or", primitive "or"),+  ("xor", primitive "xor"),+  ("inv", primitive "inv"),+  ("shl", primitive "shl"),+  ("shr", primitive "shr"),+  ("ashr", primitive "ashr"),+  ("subtract", primitive "subtract"),+  ("==", primitive "=="),+  ("/=", primitive "/="),+  ("<", primitive "<"),+  ("<=", primitive "<="),+  (">", primitive ">"),+  (">=", primitive ">="),+  ("u<", primitive "u<"),+  ("u<=", primitive "u<="),+  ("u>", primitive "u>"),+  ("u>=", primitive "u>="),+  ("fadd", primitive "fadd"),+  ("fsub", primitive "fsub"),+  ("fmul", primitive "fmul"),+  ("fdiv", primitive "fdiv"),+  ("feq", primitive "feq"),+  ("fne", primitive "fne"),+  ("flt", primitive "flt"),+  ("fle", primitive "fle"),+  ("fgt", primitive "fgt"),+  ("fge", primitive "fge"),+  ("fneg", primitive "fneg"),+  ("fshow", primitive "fshow"),+  ("fread", primitive "fread"),+  ("itof", primitive "itof"),+  ("seq", primitive "seq"),+  ("error", primitive "error"),+  ("equal", primitive "equal"),+  ("compare", primitive "compare"),+  ("rnf", primitive "rnf"),+  ("noMatch", primitive "noMatch"),+  ("noDefault", primitive "noDefault"),+  ("IO.>>=", primitive "IO.>>="),+  ("IO.>>", primitive "IO.>>"),+  ("IO.return", primitive "IO.return"),+  ("IO.print", primitive "IO.print"),+  ("IO.serialize", primitive "IO.serialize"),+  ("IO.deserialize", primitive "IO.deserialize"),+  ("IO.stdin", primitive "IO.stdin"),+  ("IO.stdout", primitive "IO.stdout"),+  ("IO.stderr", primitive "IO.stderr"),+  ("IO.getArgs", primitive "IO.getArgs"),+  ("IO.dropArgs", primitive "IO.dropArgs"),+  ("IO.performIO", primitive "IO.performIO"),+  ("IO.catch", primitive "IO.catch"),+  ("dynsym", primitive "dynsym"),+  ("newCAString", primitive "newCAString"),+  ("peekCAString", primitive "peekCAString"),+  ("toInt", primitive "toInt"),+  ("toPtr", primitive "toPtr"),+  ("toDbl", primitive "toDbl")+  ]
+ src/MicroHs/TypeCheck.hs view
@@ -0,0 +1,2498 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns -Wno-unused-imports #-}+{-# LANGUAGE FlexibleContexts #-}+module MicroHs.TypeCheck(+  typeCheck,+  TModule(..), showTModule,+  impossible, impossibleShow,+  mkClassConstructor,+  mkSuperSel,+  bindingsOf,+  boolPrefix,+  listPrefix,+  ) where+import Data.Eq -- XXX why needed?+import Prelude+import Data.Char+import Data.Function+import Data.List+import Data.Maybe+import qualified Data.IntMap as IM+import MicroHs.TCMonad as T+import qualified MicroHs.IdentMap as M+import MicroHs.Ident+import MicroHs.Expr+--Ximport Compat+--Ximport GHC.Stack+--Ximport Debug.Trace++boolPrefix :: String+boolPrefix = "Data.Bool_Type."++listPrefix :: String+listPrefix = "Data.List_Type."++nameInt :: String+nameInt = "Primitives.Int"++nameWord :: String+nameWord = "Primitives.Word"++nameDouble :: String+nameDouble = "Primitives.Double"++nameChar :: String+nameChar = "Primitives.Char"++nameInteger :: String+nameInteger = "Data.Integer_Type.Integer"++nameTypeEq :: String+nameTypeEq = "Primitives.~"++nameImplies :: String+nameImplies = "Primitives.=>"++nameArrow :: String+nameArrow = "Primitives.->"++----------------------++data TModule a = TModule+  IdentModule     -- module names+  [FixDef]        -- all fixities, exported or not+  [TypeExport]    -- exported types+  [SynDef]        -- all type synonyms, exported or not+  [ClsDef]        -- all classes+  [InstDef]       -- all instances+  [ValueExport]   -- exported values (including from T(..))+  a               -- bindings+  --Xderiving (Show)++bindingsOf :: forall a . TModule a -> a+bindingsOf (TModule _ _ _ _ _ _ _ a) = a++data TypeExport = TypeExport+  Ident           -- unqualified name+  Entry           -- symbol table entry+  [ValueExport]   -- associated values, i.e., constructors, selectors, methods+  --Xderiving (Show)++data ValueExport = ValueExport+  Ident           -- unqualified name+  Entry           -- symbol table entry+  --Xderiving (Show)++type FixDef = (Ident, Fixity)+type SynDef = (Ident, EType)+type ClsDef = (Ident, ClassInfo)+type InstDef= (Ident, InstInfo)++type ClassInfo = ([IdKind], [EConstraint], EType, [Ident], [IFunDep])  -- class tyvars, superclasses, class kind, methods, fundeps+type IFunDep = ([Bool], [Bool])           -- the length of the lists is the number of type variables++-- Symbol table entry for symbol i.+data Entry = Entry+  Expr             -- convert (EVar i) to this expression; sometimes just (EVar i)+  EType            -- type/kind of identifier+  --Xderiving(Show)++instance Eq Entry where+  Entry x _ == Entry y _  =  getIdent x == getIdent y+++entryType :: Entry -> EType+entryType (Entry _ t) = t++type ValueTable = SymTab Entry     -- type of value identifiers, used during type checking values+type TypeTable  = SymTab Entry     -- kind of type  identifiers, used during kind checking types+type KindTable  = SymTab Entry     -- sort of kind  identifiers, used during sort checking kinds+type SynTable   = M.Map EType      -- body of type synonyms+type FixTable   = M.Map Fixity     -- precedence and associativity of operators+type AssocTable = M.Map [Ident]    -- maps a type identifier to its associated construcors/selectors/methods+type ClassTable = M.Map ClassInfo  -- maps a class identifier to its associated information+type InstTable  = M.Map InstInfo   -- indexed by class name+type Constraints= [(Ident, EConstraint)]+type Defaults   = [EType]          -- Current defaults++-- To make type checking fast it is essential to solve constraints fast.+-- The naive implementation of InstInfo would be [InstDict], but+-- that is slow.+-- Instead, the data structure is specialized+--  * For single parameter type classes for atomic types, e.g., Eq Int+--    we use the type name (i.e., Int) to index into a map that gives+--    the dictionary directly.  This map is also used for dictionary arguments+--    of type, e.g., Eq a.+--  * NOT IMPLEMENTED: look up by type name of the left-most type+--  * As a last resort, just look through dictionaries.+data InstInfo = InstInfo+       (M.Map Expr)               -- map for direct lookup of atomic types+       [InstDict]                 -- slow path+       [IFunDep]+  --Xderiving (Show)++-- This is the dictionary expression, instance variables, instance context,+-- and instance.+type InstDictC  = (Expr, [IdKind], [EConstraint], EConstraint, [IFunDep])+-- This is the dictionary expression, instance context, and types.+-- An instance (C T1 ... Tn) has the type list [T1,...,Tn]+-- The types and constraint have their type variables normalized to EUVar (-1), EUVar (-2), etc+type InstDict   = (Expr, [EConstraint], [EType])++-- All known type equalities, contains the transitive&commutative closure.+type TypeEqTable = [(EType, EType)]++type Sigma = EType+--type Tau   = EType+type Rho   = EType+type TyVar = Ident++typeCheck :: forall a . [(ImportSpec, TModule a)] -> EModule -> TModule [EDef]+typeCheck aimps (EModule mn exps defs) =+--  trace (unlines $ map (showTModuleExps . snd) aimps) $+  let+    imps = map filterImports aimps+    (fs, ts, ss, cs, is, vs, as) = mkTables imps+  in case tcRun (tcDefs defs) (initTC mn fs ts ss cs is vs as) of+       (tds, tcs) ->+         let+           thisMdl = (mn, mkTModule tds tcs)+           impMdls = [(fromMaybe m mm, tm) | (ImportSpec _ m mm _, tm) <- imps]+           impMap = M.fromList [(i, m) | (i, m) <- thisMdl : impMdls]+           (texps, cexps, vexps) =+             unzip3 $ map (getTVExps impMap (typeTable tcs) (valueTable tcs) (assocTable tcs) (classTable tcs)) exps+           fexps = [ fe | TModule _ fe _ _ _ _ _ _ <- M.elems impMap ]+           sexps = M.toList (synTable tcs)+           iexps = M.toList (instTable tcs)+         in  tModule mn (nubBy ((==) `on` fst) (concat fexps)) (concat texps) sexps (concat cexps) iexps (concat vexps) tds++-- A hack to force evaluation of errors.+-- This should be redone to all happen in the T monad.+tModule :: IdentModule -> [FixDef] -> [TypeExport] -> [SynDef] -> [ClsDef] -> [InstDef] -> [ValueExport] -> [EDef] ->+           TModule [EDef]+tModule mn fs ts ss cs is vs ds =+--  trace ("tmodule " ++ showIdent mn ++ ":\n" ++ show vs) $+  tseq ts `seq` vseq vs `seq` TModule mn fs ts ss cs is vs ds+  where+    tseq [] = ()+    tseq (TypeExport _ e _:xs) = e `seq` tseq xs+    vseq [] = ()+    vseq (ValueExport _ e:xs) = e `seq` vseq xs++filterImports :: forall a . (ImportSpec, TModule a) -> (ImportSpec, TModule a)+filterImports it@(ImportSpec _ _ _ Nothing, _) = it+filterImports (imp@(ImportSpec _ _ _ (Just (hide, is))), TModule mn fx ts ss cs ins vs a) =+  let+    keep x xs = elem x xs /= hide+    ivs = [ i | ImpValue i <- is ]+    vs' = filter (\ (ValueExport i _) -> keep i ivs) vs+    cts = [ i | ImpTypeCon i <- is ]+    its = [ i | ImpType i <- is ] ++ cts+    ts' = map (\ te@(TypeExport i e _) -> if keep i cts then te else TypeExport i e []) $+          filter (\ (TypeExport i _ _) -> keep i its) ts+  in+    --trace (show (ts, vs)) $+    (imp, TModule mn fx ts' ss cs ins vs' a)++-- Type and value exports+getTVExps :: forall a . M.Map (TModule a) -> TypeTable -> ValueTable -> AssocTable -> ClassTable -> ExportItem ->+           ([TypeExport], [ClsDef], [ValueExport])+getTVExps impMap _ _ _ _ (ExpModule m) =+  case M.lookup m impMap of+    Just (TModule _ _ te _ ce _ ve _) -> (te, ce, ve)+    _ -> errorMessage (getSLoc m) $ "undefined module: " ++ showIdent m+getTVExps _ tys vals ast cls (ExpTypeCon i) =+  let+    e = expLookup i tys+    qi = tyQIdent e+    ves = getAssocs vals ast qi+    cl = case M.lookup qi cls of+           Just ci -> [(qi, ci)]+           Nothing -> []+  in ([TypeExport i e ves], cl, [])+getTVExps _ tys _ _ cls (ExpType i) =+  let+    e = expLookup i tys+    qi = tyQIdent e+    cl = case M.lookup qi cls of+           Just ci -> [(qi, ci)]+           Nothing -> []+  in ([TypeExport i e []], cl, [])+getTVExps _ _ vals _ _ (ExpValue i) =+    ([], [], [ValueExport i (expLookup i vals)])++-- Export all fixities and synonyms.+-- The synonyms might be needed, and the fixities are harmless+--getFSExps :: forall a . M.Map (TModule a) -> [([FixDef], [SynDef])]+--getFSExps impMap = [ (fe, se) | TModule _ fe _ se _ _ <- M.elems impMap ]++expLookup :: Ident -> SymTab Entry -> Entry+expLookup i m = either (errorMessage (getSLoc i)) id $ stLookup "export" i m++tyQIdent :: Entry -> Ident+tyQIdent (Entry (EVar qi) _) = qi+tyQIdent _ = error "tyQIdent"++eVarI :: SLoc -> String -> Expr+eVarI loc = EVar . mkIdentSLoc loc++getAppCon :: EType -> Ident+getAppCon (EVar i) = i+getAppCon (EApp f _) = getAppCon f+getAppCon _ = error "getAppCon"++getApp :: EType -> (Ident, [EType])+getApp = loop []+  where loop as (EVar i) = (i, as)+        loop as (EApp f a) = loop (a:as) f+        loop _ _ = error "getApp"++-- Construct a dummy TModule for the currently compiled module.+-- It has all the relevant export tables.+-- The value&type export tables will later be filtered through the export list.+mkTModule :: forall a . [EDef] -> TCState -> TModule a+mkTModule tds tcs =+  let+    mn = moduleName tcs+    tt = typeTable  tcs+    at = assocTable tcs+    vt = valueTable tcs+    ct = classTable tcs+    it = instTable  tcs++    -- Find the Entry for a type.+    tentry i =+      case stLookup "" (qualIdent mn i) tt of+        Right e -> e+        _       -> impossible+    -- Find all value Entry for names associated with a type.+    assoc i = getAssocs vt at (qualIdent mn i)++    -- All top level values possible to export.+    ves = [ ValueExport i (Entry (EVar (qualIdent mn i)) ts) | Sign i ts <- tds ]++    -- All top level types possible to export.+    tes =+      [ TypeExport i (tentry i) (assoc i) | Data    (i, _) _ <- tds ] +++      [ TypeExport i (tentry i) (assoc i) | Newtype (i, _) _ <- tds ] +++      [ TypeExport i (tentry i) (assoc i) | Class _ (i, _) _ _ <- tds ] +++      [ TypeExport i (tentry i) []        | Type    (i, _) _ <- tds ]++    -- All type synonym definitions.+    ses = [ (qualIdent mn i, EForall vs t) | Type (i, vs) t  <- tds ]++    -- All fixity declaration.+    fes = [ (qualIdent mn i, fx) | Infix fx is <- tds, i <- is ]++    -- All classes+    -- XXX only export the locally defined classes+    ces = M.toList ct++    -- All instances+    ies = M.toList it+  in  TModule mn fes tes ses ces ies ves impossible++-- Find all value Entry for names associated with a type.+getAssocs :: ValueTable -> AssocTable -> Ident -> [ValueExport]+getAssocs vt at ai =+  let qis = fromMaybe [] $ M.lookup ai at+      val qi = case stLookup "" qi vt of+                 Right e -> e+                 _       -> impossible+  in  map (\ qi -> ValueExport (unQualIdent qi) (val qi)) qis++mkTables :: forall a . [(ImportSpec, TModule a)] ->+            (FixTable, TypeTable, SynTable, ClassTable, InstTable, ValueTable, AssocTable)+mkTables mdls =+  let+    qns (ImportSpec q _ mas _) mn i =+      let+        m = fromMaybe mn mas+      in  if q then [qualIdent m i] else [i, qualIdent m i]+    allValues :: ValueTable+    allValues =+      let+        syms (is, TModule mn _ tes _ cls _ ves _) =+          [ (v, [e]) | ValueExport i e    <- ves,                        v <- qns is mn i ] +++          [ (v, [e]) | TypeExport  _ _ cs <- tes, ValueExport i e <- cs, v <- qns is mn i ] +++          [ (v, [Entry (EVar v) t]) | (i, (_, _, t, _, _)) <- cls, let { v = mkClassConstructor i } ]+      in  stFromListWith union $ concatMap syms mdls+    allSyns =+      let+        syns (_, TModule _ _ _ ses _ _ _ _) = ses+      in  M.fromList (concatMap syns mdls)+    allTypes :: TypeTable+    allTypes =+      let+        types (is, TModule mn _ tes _ _ _ _ _) = [ (v, [e]) | TypeExport i e _ <- tes, v <- qns is mn i ]+      in stFromListWith union $ concatMap types mdls+    allFixes =+      let+        fixes (_, TModule _ fes _ _ _ _ _ _) = fes+      in M.fromList (concatMap fixes mdls)+    allAssocs :: AssocTable+    allAssocs =+      let+        assocs (ImportSpec _ _ mas _, TModule mn _ tes _ _ _ _ _) =+          let+            m = fromMaybe mn mas+          in  [ (qualIdent m i, [qualIdent m a | ValueExport a _ <- cs]) | TypeExport i _ cs <- tes ]+      in  M.fromList $ concatMap assocs mdls+    allClasses :: ClassTable+    allClasses =+      let+        clss (_, TModule _ _ _ _ ces _ _ _) = ces+      in  --(\ m -> trace ("allClasses: " ++ showListS showIdentClassInfo (M.toList m)) m) $+          M.fromList $ concatMap clss mdls+    allInsts :: InstTable+    allInsts =+      let+        insts (_, TModule _ _ _ _ _ ies _ _) = ies+      in  M.fromListWith mergeInstInfo $ concatMap insts mdls+  in  (allFixes, allTypes, allSyns, allClasses, allInsts, allValues, allAssocs)++mergeInstInfo :: InstInfo -> InstInfo -> InstInfo+mergeInstInfo (InstInfo m1 l1 fds) (InstInfo m2 l2 _) =+  let+    m = foldr (uncurry $ M.insertWith mrg) m2 (M.toList m1)+    mrg e1 _e2 = e1 -- XXX improve this if eqExpr e1 e2 then e1 else errorMessage (getSLoc e1) $ "Multiple instances: " ++ showSLoc (getSLoc e2)+    l = unionBy eqInstDict l1 l2+  in  InstInfo m l fds++getIdent :: Expr -> Ident+getIdent ae =+  case ae of+    EVar i -> i+    ECon c -> conIdent c+    _ -> impossible++-- Approximate equality for dictionaries.+-- The important thing is to avoid exact duplicates in the instance table.+eqInstDict :: InstDict -> InstDict -> Bool+eqInstDict (e, _, _) (e', _, _) = eqExpr e e'++--------------------------++type Typed a = (a, EType)++data TCState = TC+  IdentModule           -- current module name+  Int                   -- unique number+  FixTable              -- fixities, indexed by QIdent+  TypeTable             -- type symbol table+  SynTable              -- synonyms, indexed by QIdent+  ValueTable            -- value symbol table+  AssocTable            -- values associated with a type, indexed by QIdent+  (IM.IntMap EType)     -- mapping from unique id to type+  TCMode                -- pattern, value, or type+  ClassTable            -- class info, indexed by QIdent+  (InstTable,           -- instances+   TypeEqTable)         -- type equalities+  Constraints           -- constraints that have to be solved+  Defaults              -- current defaults+  --Xderiving (Show)++data TCMode = TCExpr | TCType+  --Xderiving (Show)++typeTable :: TCState -> TypeTable+typeTable (TC _ _ _ tt _ _ _ _ _ _ _ _ _) = tt++valueTable :: TCState -> ValueTable+valueTable (TC _ _ _ _ _ vt _ _ _ _ _ _ _) = vt++synTable :: TCState -> SynTable+synTable (TC _ _ _ _ st _ _ _ _ _ _ _ _) = st++fixTable :: TCState -> FixTable+fixTable (TC _ _ ft _ _ _ _ _ _ _ _ _ _) = ft++assocTable :: TCState -> AssocTable+assocTable (TC _ _ _ _ _ _ ast _ _ _ _ _ _) = ast++uvarSubst :: TCState -> IM.IntMap EType+uvarSubst (TC _ _ _ _ _ _ _ sub _ _ _ _ _) = sub++moduleName :: TCState -> IdentModule+moduleName (TC mn _ _ _ _ _ _ _ _ _ _ _ _) = mn++classTable :: TCState -> ClassTable+classTable (TC _ _ _ _ _ _ _ _ _ ct _ _ _) = ct++tcMode :: TCState -> TCMode+tcMode (TC _ _ _ _ _ _ _ _ m _ _ _ _) = m++instTable :: TCState -> InstTable+instTable (TC _ _ _ _ _ _ _ _ _ _ (is, _) _ _) = is++typeEqTable :: TCState -> TypeEqTable+typeEqTable (TC _ _ _ _ _ _ _ _ _ _ (_, es) _ _) = es++constraints :: TCState -> Constraints+constraints (TC _ _ _ _ _ _ _ _ _ _ _ e _) = e++defaults :: TCState -> Defaults+defaults (TC _ _ _ _ _ _ _ _ _ _ _ _ ds) = ds++putValueTable :: ValueTable -> T ()+putValueTable venv = do+  TC mn n fx tenv senv _ ast sub m cs is es ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putTypeTable :: TypeTable -> T ()+putTypeTable tenv = do+  TC mn n fx _ senv venv ast sub m cs is es ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putSynTable :: SynTable -> T ()+putSynTable senv = do+  TC mn n fx tenv _ venv ast sub m cs is es ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putUvarSubst :: IM.IntMap EType -> T ()+putUvarSubst sub = do+  TC mn n fx tenv senv venv ast _ m cs is es ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putTCMode :: TCMode -> T ()+putTCMode m = do+  TC mn n fx tenv senv venv ast sub _ cs is es ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putInstTable :: InstTable -> T ()+putInstTable is = do+  TC mn n fx tenv senv venv ast sub m cs (_,eqs) es ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs (is,eqs) es ds)++putTypeEqTable :: TypeEqTable -> T ()+putTypeEqTable eqs = do+  TC mn n fx tenv senv venv ast sub m cs (is,_) es ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs (is,eqs) es ds)++putConstraints :: Constraints -> T ()+putConstraints es = do+  TC mn n fx tenv senv venv ast sub m cs is _ ds <- get+  put (TC mn n fx tenv senv venv ast sub m cs is es ds)++putDefaults :: Defaults -> T ()+putDefaults ds = do+  TC mn n fx tenv senv venv ast sub m cs is es _ <- get+  put (TC mn n fx tenv senv venv ast sub m cs is es ds)++withTCMode :: forall a . TCMode -> T a -> T a+withTCMode m ta = do+  om <- gets tcMode+  putTCMode m+  a <- ta+  putTCMode om+  return a++-- Use the type table as the value table, and the primKind table as the type table.+withTypeTable :: forall a . T a -> T a+withTypeTable ta = do+  TC mn n fx tt st vt ast sub m cs is es ds <- get+  put (TC mn n fx primKindTable st tt ast sub m cs is es ds)+  a <- ta+  -- Discard kind table, it will not have changed+  TC mnr nr fxr _kr str ttr astr subr mr csr isr esr dsr <- get+  -- Keep everyting, except that the returned value table+  -- becomes the type tables, and the old type table is restored.+  put (TC mnr nr fxr ttr str vt astr subr mr csr isr esr dsr)+  return a++addAssocTable :: Ident -> [Ident] -> T ()+addAssocTable i ids = do+  TC mn n fx tt st vt ast sub m cs is es ds <- get+  put $ TC mn n fx tt st vt (M.insert i ids ast) sub m cs is es ds++addClassTable :: Ident -> ClassInfo -> T ()+addClassTable i x = do+  TC mn n fx tt st vt ast sub m cs is es ds <- get+  put $ TC mn n fx tt st vt ast sub m (M.insert i x cs) is es ds++addInstTable :: [InstDictC] -> T ()+addInstTable ics = do+  let+    -- Change type variable to unique unification variables.+    -- These unification variables will never leak, but as an extra caution+    -- we use negative numbers..+    freshSubst iks =+      zipWith (\ ik j -> (idKindIdent ik, EUVar j)) iks [-1, -2 ..]++    mkInstInfo :: InstDictC -> T (Ident, InstInfo)+    mkInstInfo (e, iks, ctx, ct, fds) = do+      ct' <- expandSyn ct+      case (iks, ctx, getApp ct') of+        ([], [], (c, [EVar i])) -> return $ (c, InstInfo (M.singleton i e) [] fds)+        (_,  _,  (c, ts      )) -> return $ (c, InstInfo M.empty [(e, ctx', ts')] fds)+          where ctx' = map (subst s) ctx+                ts'  = map (subst s) ts+                s    = freshSubst iks+  iis <- mapM mkInstInfo ics+  it <- gets instTable+  putInstTable $ foldr (uncurry $ M.insertWith mergeInstInfo) it iis++addConstraint :: Ident -> EConstraint -> T ()+addConstraint d ctx = do+--  traceM $ "addConstraint: " ++ msg ++ " " ++ showIdent d ++ " :: " ++ showEType ctx+  ctx' <- expandSyn ctx+  TC mn n fx tt st vt ast sub m cs is es ds <- get+  put $ TC mn n fx tt st vt ast sub m cs is ((d, ctx') : es) ds++withDicts :: forall a . [(Ident, EConstraint)] -> T a -> T a+withDicts [] ta = ta+withDicts ((i, c):ds) ta = withDict i c $ withDicts ds ta++withDict :: forall a . Ident -> EConstraint -> T a -> T a+withDict i c ta = do+  c' <- expandSyn c >>= derefUVar+  when (not (null (metaTvs [c']))) $ impossible+  case c' of+    (EApp (EApp (EVar eq) t1) t2) | eq == mkIdent nameTypeEq -> withEqDict i t1 t2 ta+    _ -> withInstDict i c' ta++withInstDict :: forall a . Ident -> EConstraint -> T a -> T a+withInstDict i c ta = do+  is <- gets instTable+  ics <- expandDict (EVar i) c+  addInstTable ics+  a <- ta+  putInstTable is+  return a++withEqDict :: forall a . Ident -> EType -> EType -> T a -> T a+withEqDict _i t1 t2 ta = do+  is <- gets typeEqTable+  putTypeEqTable (addTypeEq t1 t2 is)+  a <- ta+  putTypeEqTable is+  return a++initTC :: IdentModule -> FixTable -> TypeTable -> SynTable -> ClassTable -> InstTable -> ValueTable -> AssocTable -> TCState+initTC mn fs ts ss cs is vs as =+--  trace ("**** initTC " ++ showIdent mn ++ ": " ++ showListS (showPairS showIdent showEType) (M.toList ss)) $+  let+    xts = foldr (uncurry stInsertGlb) ts primTypes+    xvs = foldr (uncurry stInsertGlb) vs primValues+  in TC mn 1 fs xts ss xvs as IM.empty TCExpr cs (is,[]) [] []++kTypeS :: EType+kTypeS = kType++kTypeTypeS :: EType+kTypeTypeS = kArrow kType kType++kTypeTypeTypeS :: EType+kTypeTypeTypeS = kArrow kType $ kArrow kType kType++-- (=>) :: Constraint -> Type -> Type+kConstraintTypeTypeS :: EType+kConstraintTypeTypeS = kArrow kConstraint $ kArrow kType kType++-- (~) :: Type -> Type -> Constraint+kTypeTypeConstraintS :: EType+kTypeTypeConstraintS = kArrow kType (kArrow kType kConstraint)++builtinLoc :: SLoc+builtinLoc = SLoc "builtin" 0 0++mkIdentB :: String -> Ident+mkIdentB = mkIdentSLoc builtinLoc++primKindTable :: KindTable+primKindTable =+  let+    entry i = Entry (EVar (mkIdentB i))+  in stFromList [+       -- The kinds are wired in (for now)+       (mkIdentB "Primitives.Type",       [entry "Primitives.Type" kTypeS]),+       (mkIdentB "Type",                  [entry "Primitives.Type" kTypeS]),+       (mkIdentB "Constraint",            [entry "Primitives.Constraint" kTypeS]),+       (mkIdentB "Primitives.Constraint", [entry "Primitives.Constraint" kTypeS]),+       (mkIdentB nameArrow,               [entry nameArrow   kTypeTypeTypeS]),+       (mkIdentB "->",                    [entry nameArrow   kTypeTypeTypeS])+       ]++primTypes :: [(Ident, [Entry])]+primTypes =+  let+    entry i = Entry (EVar (mkIdentB i))+    k = mkIdent "k"+    kv = EVar k+    kk = IdKind k kTypeS+    tuple n =+      let+        i = tupleConstr builtinLoc n+      in  (i, [entry (unIdent i) $ EForall [kk] $ foldr kArrow kv (replicate n kv)])+  in+      [+       -- The function arrow et al are bothersome to define in Primitives, so keep them here.+       -- But the fixity is defined in Primitives.+       (mkIdentB "->",           [entry nameArrow    kTypeTypeTypeS]),+       (mkIdentB "=>",           [entry nameImplies  kConstraintTypeTypeS]),+       (mkIdentB "~",            [entry nameTypeEq   kTypeTypeConstraintS]),+       -- Primitives.hs uses the type [], and it's annoying to fix that.+       -- XXX should not be needed+       (mkIdentB (listPrefix ++ "[]"), [entry (listPrefix ++ "[]")        kTypeTypeS])+      ] +++      map tuple (enumFromTo 2 10)++primValues :: [(Ident, [Entry])]+primValues =+  let+    tuple n =+      let+        c = tupleConstr builtinLoc n+        vks = [IdKind (mkIdent ("a" ++ show i)) kType | i <- enumFromTo 1 n]+        ts = map tVarK vks+        r = tApps c ts+      in  (c, [Entry (ECon $ ConData [(c, n)] c) $ EForall vks $ foldr tArrow r ts ])+  in  map tuple (enumFromTo 2 10)++type T a = TC TCState a++tCon :: Ident -> EType+tCon = EVar++tVarK :: IdKind -> EType+tVarK (IdKind i _) = EVar i++tApp :: EType -> EType -> EType+tApp = EApp++tApps :: Ident -> [EType] -> EType+tApps i ts = foldl tApp (tCon i) ts++tArrow :: EType -> EType -> EType+tArrow a r = tApp (tApp (tConI builtinLoc "Primitives.->") a) r++tImplies :: EType -> EType -> EType+tImplies a r = tApp (tApp (tConI builtinLoc "Primitives.=>") a) r++kArrow :: EKind -> EKind -> EKind+kArrow = tArrow++{-+isArrow :: EType -> Bool+isArrow = isJust . getArrow+-}++getArrow :: EType -> Maybe (EType, EType)+getArrow (EApp (EApp (EVar n) a) b) =+  if isIdent "->" n || isIdent "Primitives.->" n then Just (a, b) else Nothing+getArrow _ = Nothing++getImplies :: EType -> Maybe (EType, EType)+getImplies (EApp (EApp (EVar n) a) b) =+  if isIdent "=>" n || isIdent "Primitives.=>" n then Just (a, b) else Nothing+getImplies _ = Nothing++{-+getTuple :: Int -> EType -> Maybe [EType]+getTuple n t = loop t []+  where loop (EVar i) r | isTupleConstr n i && length r == n = Just (reverse r)+        loop (EApp f a) r = loop f (a:r)+        loop _ _ = Nothing+-}++setUVar :: TRef -> EType -> T ()+setUVar i t = do+  TC mn n fx tenv senv venv ast sub m cs is es ds <- get+  put (TC mn n fx tenv senv venv ast (IM.insert i t sub) m cs is es ds)++getUVar :: Int -> T (Maybe EType)+getUVar i = gets (IM.lookup i . uvarSubst)++munify :: --XHasCallStack =>+          SLoc -> Expected -> EType -> T ()+munify loc (Infer r) b = tSetRefType loc r b+munify loc (Check a) b = unify loc a b++expandSyn :: --XHasCallStack =>+             EType -> T EType+expandSyn at =+  let+    syn ts t =+      case t of+        EApp f a -> do+          aa <- expandSyn a+          syn (aa:ts) f+        EVar i -> do+          syns <- gets synTable+          case M.lookup i syns of+            Nothing -> return $ foldl tApp t ts+            Just (EForall vks tt) ->+              if length vks /= length ts then tcError (getSLoc i) $ "bad synonym use"+                                                                         --X ++ "\nXX " ++ show (i, vks, ts)+              else expandSyn $ subst (zip (map idKindIdent vks) ts) tt+            Just _ -> impossible+        EUVar _ -> return $ foldl tApp t ts+        ESign a _ -> expandSyn a   -- Throw away signatures, they don't affect unification+        EForall iks tt | null ts -> EForall iks <$> expandSyn tt+        _ -> impossible+  in syn [] at++derefUVar :: EType -> T EType+derefUVar at =+  case at of+    EApp f a -> do+      fx <- derefUVar f+      ax <- derefUVar a+      return $ EApp fx ax+    EUVar i -> do+      mt <- getUVar i+      case mt of+        Nothing -> return at+        Just t -> do+          t' <- derefUVar t+          setUVar i t'+          return t'+    EVar _ -> return at+    ESign t k -> flip ESign k <$> derefUVar t+    EForall iks t -> EForall iks <$> derefUVar t+    _ -> impossible++tcErrorTK :: --XHasCallStack =>+             SLoc -> String -> T ()+tcErrorTK loc msg = do+  tcm <- gets tcMode+  let s = case tcm of+            TCType -> "kind"+            _      -> "type"+  tcError loc $ s ++ " error: " ++ msg++unify :: --XHasCallStack =>+         SLoc -> EType -> EType -> T ()+unify loc a b = do+  aa <- expandSyn a+  bb <- expandSyn b+  unifyR loc aa bb++-- XXX should do occur check+unifyR :: --XHasCallStack =>+          SLoc -> EType -> EType -> T ()+unifyR _   (EVar x1)    (EVar x2)  | x1 == x2      = return ()+unifyR loc (EApp f1 a1) (EApp f2 a2)               = do { unifyR loc f1 f2; unifyR loc a1 a2 }+unifyR _   (EUVar r1)   (EUVar r2) | r1 == r2      = return ()+unifyR loc (EUVar r1)   t2                         = unifyVar loc r1 t2+unifyR loc t1           (EUVar r2)                 = unifyVar loc r2 t1+unifyR loc t1           t2                         = do+  tcm <- gets tcMode+  case tcm of+    TCType -> tcErrorTK loc $ "cannot unify " ++ showExpr t1 ++ " and " ++ showExpr t2+    -- Defer to constraint solver.+    -- XXX needs changing if we have kind equalities.+    _      -> addEqConstraint loc t1 t2++unifyVar :: --XHasCallStack =>+            SLoc -> TRef -> EType -> T ()+unifyVar loc r t = do+  mt <- getUVar r+  case mt of+    Nothing -> unifyUnboundVar loc r t+    Just t' -> unify loc t' t++unifyUnboundVar :: --XHasCallStack =>+                   SLoc -> TRef -> EType -> T ()+unifyUnboundVar loc r1 at2@(EUVar r2) = do+  -- We know r1 /= r2+  mt2 <- getUVar r2+  case mt2 of+    Nothing -> setUVar r1 at2+    Just t2 -> unify loc (EUVar r1) t2+unifyUnboundVar loc r1 t2 = do+  vs <- getMetaTyVars [t2]+  if elemBy (==) r1 vs then+    tcErrorTK loc $ "cyclic " ++ showExpr (EUVar r1) ++ " = " ++ showExpr t2+   else+    setUVar r1 t2++-- Reset unification map+tcReset :: T ()+tcReset = do+  TC mn u fx tenv senv venv ast _ m cs is es ds <- get+  put (TC mn u fx tenv senv venv ast IM.empty m cs is es ds)++newUVar :: T EType+newUVar = EUVar <$> newUniq++type TRef = Int++newUniq :: T TRef+newUniq = do+  TC mn n fx tenv senv venv ast sub m cs is es ds <- get+  let n' = n+1+  put (seq n' $ TC mn n' fx tenv senv venv ast sub m cs is es ds)+  return n++newIdent :: SLoc -> String -> T Ident+newIdent loc s = do+  u <- newUniq+  return $ mkIdentSLoc loc $ s ++ "$" ++ show u++tLookup :: --XHasCallStack =>+           String -> Ident -> T (Expr, EType)+tLookup msg i = do+  env <- gets valueTable+  case stLookup msg i env of+    Right (Entry e s) -> return (setSLocExpr (getSLoc i) e, s)+    Left            e -> do+--      let SymTab m _ = env+--      traceM (showListS showIdent (map fst (M.toList m)))+      tcError (getSLoc i) e++tLookupV :: --XHasCallStack =>+           Ident -> T (Expr, EType)+tLookupV i = do+  tcm <- gets tcMode+  let s = case tcm of+            TCType -> "type"+            _      -> "value"+  tLookup s i++tInst :: (Expr, EType) -> T (Expr, EType)+tInst (ae, EForall vks t) = tInstForall ae vks t >>= tInst+tInst (ae, at) | Just (ctx, t) <- getImplies at = do+  d <- newIdent (getSLoc ae) "dict"+  --traceM $ "tInst: addConstraint: " ++ showIdent d ++ " :: " ++ showEType ctx ++ " " ++ showSLoc loc+  addConstraint d ctx+  tInst (EApp ae (EVar d), t)+tInst at = return at++tInstForall :: Expr -> [IdKind] -> EType -> T (Expr, EType)+tInstForall ae vks t =+  if null vks then+    return (ae, t)+  else do+    let vs = map idKindIdent vks+    us <- mapM (const newUVar) vks+    return (ae, subst (zip vs us) t)++tInst' :: (Expr, EType) -> T (Expr, EType)+tInst' (ae, EForall vks t) = tInstForall ae vks t+tInst' et = return et++extValE :: --XHasCallStack =>+           Ident -> EType -> Expr -> T ()+extValE i t e = do+  venv <- gets valueTable+  putValueTable (stInsertLcl i (Entry e t) venv)++-- Extend the global symbol table with i = e :: t+-- Add both qualified and unqualified versions of i.+extValETop :: --XHasCallStack =>+              Ident -> EType -> Expr -> T ()+extValETop i t e = do+  mn <- gets moduleName+  venv <- gets valueTable+  let qi = qualIdent mn i+      venv'  = stInsertGlb qi [Entry e t] venv+      venv'' = stInsertGlb  i [Entry e t] venv'+  putValueTable venv''++-- Extend symbol table with i::t.+-- The translation for i will be the qualified name.+-- Add both qualified and unqualified versions of i.+extValQTop :: --XHasCallStack =>+              Ident -> EType -> T ()+extValQTop i t = do+  mn <- gets moduleName+  extValETop i t (EVar (qualIdent mn i))++extVal :: --XHasCallStack =>+          Ident -> EType -> T ()+extVal i t = extValE i t $ EVar i++extVals :: --XHasCallStack =>+           [(Ident, EType)] -> T ()+extVals = mapM_ (uncurry extVal)++extTyp :: Ident -> EType -> T ()+extTyp i t = do+  tenv <- gets typeTable+  putTypeTable (stInsertLcl i (Entry (EVar i) t) tenv)++extTyps :: [(Ident, EType)] -> T ()+extTyps = mapM_ (uncurry extTyp)++extSyn :: Ident -> EType -> T ()+extSyn i t = do+  senv <- gets synTable+  putSynTable (M.insert i t senv)++extFix :: Ident -> Fixity -> T ()+extFix i fx = do+  TC mn n fenv tenv senv venv ast sub m cs is es ds <- get+  put $ TC mn n (M.insert i fx fenv) tenv senv venv ast sub m cs is es ds+  return ()++withExtVal :: forall a . --XHasCallStack =>+              Ident -> EType -> T a -> T a+withExtVal i t ta = do+  venv <- gets valueTable+  extVal i t+  a <- ta+  putValueTable venv+  return a++withExtVals :: forall a . --XHasCallStack =>+               [(Ident, EType)] -> T a -> T a+withExtVals env ta = do+  venv <- gets valueTable+  extVals env+  a <- ta+  putValueTable venv+  return a++withExtTyps :: forall a . [IdKind] -> T a -> T a+withExtTyps iks ta = do+  let env = map (\ (IdKind v k) -> (v, k)) iks+  venv <- gets typeTable+  extTyps env+  a <- ta+  putTypeTable venv+  return a++tcDefs :: [EDef] -> T [EDef]+tcDefs ds = do+  mapM_ tcAddInfix ds+  dst <- tcDefsType ds+  mapM_ addTypeSyn dst+  dst' <- tcExpand dst+--  traceM (showEDefs dst')+  setDefault dst'+  tcDefsValue dst'++setDefault :: [EDef] -> T ()+setDefault defs =+  putDefaults $ last $ [] : [ ts | Default ts <- defs ]++tcAddInfix :: EDef -> T ()+tcAddInfix (Infix fx is) = do+  mn <- gets moduleName+  mapM_ (\ i -> extFix (qualIdent mn i) fx) is+tcAddInfix _ = return ()++-- Check type definitions+tcDefsType :: [EDef] -> T [EDef]+tcDefsType ds = withTypeTable $ do+  dsk <- mapM tcDefKind ds                     -- Check&rename kinds in all type definitions+  mapM_ addTypeKind dsk                        -- Add the kind of each type to the environment+  mapM tcDefType dsk                           -- Kind check all type expressions (except local signatures)++-- Expand class and instance definitions (must be done after type synonym processing)+tcExpand :: [EDef] -> T [EDef]+tcExpand dst = withTypeTable $ do+  dsc <- mapM expandClass dst                  -- Expand all class definitions+  dsi <- mapM expandInst (concat dsc)          -- Expand all instance definitions+  return (concat dsi)++-- Make sure that the kind expressions are well formed.+tcDefKind :: EDef -> T EDef+tcDefKind adef = do+  tcReset+  case adef of+    Data    (i, vks) cs  -> withVks vks kType $ \ vvks _  -> return $ Data    (i, vvks) cs+    Newtype (i, vks) c   -> withVks vks kType $ \ vvks _  -> return $ Newtype (i, vvks) c+    Type    (i, vks) at  ->+      case at of+        ESign t k        -> withVks vks k     $ \ vvks kr -> return $ Type    (i, vvks) (ESign t kr)+        _                -> withVks vks kType $ \ vvks _  -> return $ Type    (i, vvks) at+    Class ctx (i, vks) fds ms-> withVks vks kConstraint $ \ vvks _ -> return $ Class ctx (i, vvks) fds ms+    Instance vks ctx t d -> withVks vks kConstraint $ \ vvks _ -> return $ Instance vvks ctx t d+    _                    -> return adef++-- Check&rename the given kinds, apply reconstruction at the end+withVks :: forall a . [IdKind] -> EKind -> ([IdKind] -> EKind -> T a) -> T a+withVks vks kr fun = do+  (nvks, nkr) <-+    withTypeTable $ do+      let+        loop r [] = do+          kkr <- tInferTypeT kr+          return (reverse r, kkr)+        loop r (IdKind i k : iks) = do+          kk <- tInferTypeT k+          withExtVal i kk $ loop (IdKind i kk : r) iks+      loop [] vks+  fun nvks nkr++-- Add symbol table entries (with kind) for all top level typeish definitions+addTypeKind :: EDef -> T ()+addTypeKind adef = do+  let+    addAssoc i is = do+      mn <- gets moduleName+      addAssocTable (qualIdent mn i) (map (qualIdent mn) is)+    assocData (Constr _ _ c (Left _)) = [c]+    assocData (Constr _ _ c (Right its)) = c : map fst its+  case adef of+    Data    lhs@(i, _) cs -> do+      addLHSKind lhs kType+      addAssoc i (nub $ concatMap assocData cs)+    Newtype lhs@(i, _) c  -> do+      addLHSKind lhs kType+      addAssoc i (assocData c)+    Type    lhs t         -> addLHSKind lhs (getTypeKind t)+    Class _ lhs@(i, _) _ ms -> do+      addLHSKind lhs kConstraint+      addAssoc i [ x | BSign m _ <- ms, x <- [m, mkDefaultMethodId m] ]+    _ -> return ()++getTypeKind :: EType -> EKind+getTypeKind (ESign _ k) = k+getTypeKind _ = kType++addLHSKind :: LHS -> EKind -> T ()+addLHSKind (i, vks) kret =+--  trace ("addLHSKind " ++ showIdent i ++ " :: " ++ showExpr (lhsKind vks kret)) $+  extValQTop i (lhsKind vks kret)++lhsKind :: [IdKind] -> EKind -> EKind+lhsKind vks kret = foldr (\ (IdKind _ k) -> kArrow k) kret vks++-- Add type synonyms to the synonym table+addTypeSyn :: EDef -> T ()+addTypeSyn adef =+  case adef of+    Type (i, vs) t -> do+      let t' = EForall vs t+      extSyn i t'+      mn <- gets moduleName+      extSyn (qualIdent mn i) t'+    _ -> return ()++-- Do kind checking of all typeish definitions.+tcDefType :: EDef -> T EDef+tcDefType d = do+  tcReset+  case d of+    Data    lhs@(_, iks) cs     -> withVars iks $ Data    lhs   <$> mapM tcConstr cs+    Newtype lhs@(_, iks) c      -> withVars iks $ Newtype lhs   <$> tcConstr c+    Type    lhs@(_, iks)    t   -> withVars iks $ Type    lhs   <$> tInferTypeT t+    Sign         i          t   ->                Sign    i     <$> tCheckTypeT kType t+    ForImp  ie i            t   ->                ForImp ie i   <$> tCheckTypeT kType t+    Class   ctx lhs@(_, iks) fds ms -> withVars iks $ Class     <$> tcCtx ctx <*> return lhs <*> mapM tcFD fds <*> mapM tcMethod ms+    Instance iks ctx c m        -> withVars iks $ Instance iks  <$> tcCtx ctx <*> tCheckTypeT kConstraint c <*> return m+    Default ts                  ->                Default       <$> mapM (tCheckTypeT kType) ts+    _                           -> return d+ where+   tcMethod (BSign i t) = BSign i <$> tcTypeT (Check kType) t+   tcMethod m = return m+   tcFD (is, os) = (,) <$> mapM tcV is <*> mapM tcV os+     where tcV i = do { _ <- tLookup "fundep" i; return i }++tcCtx :: [EConstraint] -> T [EConstraint]+tcCtx = mapM (tCheckTypeT kConstraint)++withVars :: forall a . [IdKind] -> T a -> T a+withVars aiks ta =+  case aiks of+    [] -> ta+    IdKind i k : iks -> do+      withExtVal i k $ withVars iks ta++tcConstr :: Constr -> T Constr+tcConstr (Constr iks ct c ets) =+  withVars iks $+    Constr iks <$> tcCtx ct <*> pure c <*>+      either (\ x -> Left  <$> mapM (\ (s,t)     ->         (s,)  <$> tcTypeT (Check kType) t) x)+             (\ x -> Right <$> mapM (\ (i,(s,t)) -> ((i,) . (s,)) <$> tcTypeT (Check kType) t) x) ets++-- Expand a class defintion to+--  * a "data" type for the dictionary, with kind Constraint+--  * superclass selectors+--  * method selectors+--  * default methods+-- E.g.+--   class Eq a where+--     (==) :: a -> a -> Bool+--     (/=) :: a -> a -> a+--     x /= y = not (x == y)+-- expands to+--   data Eq a = Eq$ (a -> a -> Bool) (a -> a -> Bool)+--               :: Constraint+--   == :: forall a . Eq a -> (a -> a -> Bool)+--   == (Eq x _) = x+--   /= :: forall a . Eq a -> (a -> a -> Bool)+--   /= (Eq _ x) = x+--   ==$dflt :: forall a . (Eq a) => (a -> a -> Bool)+--   ==$dflt = _noDefault "Eq.=="+--   /=$dflt :: forall a . (Eq a) => (a -> a -> Bool)+--   /=$dflt x y = not (x == y)+--+--   class (Eq a) => Ord a where+--     (<=) :: a -> a -> Bool+-- expands to+--   data Ord a = Ord$ (Eq a) (a -> a -> Bool)+--   Ord$super1 :: forall a . Ord a -> Eq a+--   <= :: forall a . Ord a -> (a -> a -> Bool)+--   <=$dflt = _noDefault "Ord.<="+--+--   instance Eq Int where (==) = primEqInt+-- expands to+--   inst$999 = Eq$ meth$1 meth$2+--     where meth$1 = primEqInt+--           meth$2 = /=$dflt dict$999+--+--   instance Ord Int where (<=) = primLEInt+-- expands to+--   inst$888 = Ord$ dict$ meth$1+--     where meth$1 = primLEInt+-- where dict$ is a special magic identifier that the type checker expands+-- to whatever dictionary is forced by the type.+-- In this case (dict$ :: Eq Int), so it with be inst$999+--+-- The actual definitions for the constructor and methods are added+-- in the desugaring pass.+-- Default methods are added as actual definitions.+-- The constructor and methods are added to the symbol table in addValueType.+-- XXX FunDep+expandClass :: EDef -> T [EDef]+expandClass dcls@(Class ctx (iCls, vks) fds ms) = do+  mn <- gets moduleName+  let+      meths = [ b | b@(BSign _ _) <- ms ]+      methIds = map (\ (BSign i _) -> i) meths+      mdflts = [ (i, eqns) | BFcn i eqns <- ms ]+      tCtx = tApps (qualIdent mn iCls) (map (EVar . idKindIdent) vks)+      mkDflt (BSign methId t) = [ Sign iDflt $ EForall vks $ tCtx `tImplies` t, def $ lookup methId mdflts ]+        where def Nothing = Fcn iDflt [Eqn [] $ EAlts [([], noDflt)] []]+              def (Just eqns) = Fcn iDflt eqns+              iDflt = mkDefaultMethodId methId+              -- XXX This isn't right, "Prelude._nodefault" might not be in scope+              noDflt = EApp noDefaultE (ELit noSLoc (LStr (unIdent iCls ++ "." ++ unIdent methId)))+      mkDflt _ = impossible+      dDflts = concatMap mkDflt meths+  addClassTable (qualIdent mn iCls) (vks, ctx, EUVar 0, methIds, mkIFunDeps (map idKindIdent vks) fds)   -- Initial entry, no type needed.+  return $ dcls : dDflts+expandClass d = return [d]++mkIFunDeps :: [Ident] -> [FunDep] -> [IFunDep]+mkIFunDeps vs [] = [(map (const True) vs, map (const False) vs)]+mkIFunDeps vs fds = map (\ (is, os) -> (map (`elem` is) vs, map (`elem` os) vs)) fds++noDefaultE :: Expr+noDefaultE = ELit noSLoc $ LPrim "noDefault"++-- Turn (unqualified) class and method names into a default method name+mkDefaultMethodId :: Ident -> Ident+mkDefaultMethodId meth = addIdentSuffix meth "$dflt"++{-+clsToDict :: EType -> T EType+clsToDict = do+  -- XXX for now, only allow contexts of the form (C t1 ... tn)+  let usup as (EVar c) | isConIdent c = return (tApps c as)+      usup as (EApp f a) = usup (a:as) f+      usup _ t = tcError (getSLoc t) ("bad context " ++ showEType t)+  usup []+-}++addConstraints :: [EConstraint] -> EType -> EType+addConstraints []  t = t+addConstraints cs  t = tupleConstraints cs `tImplies` t++tupleConstraints :: [EConstraint] -> EConstraint+tupleConstraints []  = error "tupleConstraints"+tupleConstraints [c] = c+tupleConstraints cs  = tApps (tupleConstr noSLoc (length cs)) cs++expandInst :: EDef -> T [EDef]+expandInst dinst@(Instance vks ctx cc bs) = do+  let loc = getSLoc cc+      qiCls = getAppCon cc+  iInst <- newIdent loc "inst"+  let sign = Sign iInst (eForall vks $ addConstraints ctx cc)+--  (e, _) <- tLookupV iCls+  ct <- gets classTable+--  let qiCls = getAppCon e+  (_, supers, _, mis, fds) <-+    case M.lookup qiCls ct of+      Nothing -> tcError loc $ "not a class " ++ showIdent qiCls+      Just x -> return x+  -- XXX this ignores type signatures and other bindings+  -- XXX should tack on signatures with ESign+  let ies = [(i, ELam qs) | BFcn i qs <- bs]+      meth i = fromMaybe (EVar $ setSLocIdent loc $ mkDefaultMethodId i) $ lookup i ies+      meths = map meth mis+      sups = map (const (EVar $ mkIdentSLoc loc "dict$")) supers+      args = sups ++ meths+  let bind = Fcn iInst $ eEqns [] $ foldl EApp (EVar $ mkClassConstructor qiCls) args+  mn <- gets moduleName+  addInstTable [(EVar $ qualIdent mn iInst, vks, ctx, cc, fds)]+  return [dinst, sign, bind]+expandInst d = return [d]++eForall :: [IdKind] -> EType -> EType+eForall [] t = t+eForall vs t = EForall vs t++---------------------++tcDefsValue :: [EDef] -> T [EDef]+tcDefsValue ds = do+  mapM_ addValueType ds+  mapM (\ d -> do { tcReset; tcDefValue d}) ds++addValueType :: EDef -> T ()+addValueType adef = do+  mn <- gets moduleName+  case adef of+    Sign i t -> extValQTop i t+    Data (i, vks) cs -> do+      let+        cti = [ (qualIdent mn c, either length length ets + if null ctx then 0 else 1) | Constr _ ctx c ets <- cs ]+        tret = foldl tApp (tCon (qualIdent mn i)) (map tVarK vks)+        addCon (Constr evks ectx c ets) = do+          let ts = either id (map snd) ets+              cty = EForall vks $ EForall evks $ addConstraints ectx $ foldr (tArrow . snd) tret ts+          extValETop c cty (ECon $ ConData cti (qualIdent mn c))+      mapM_ addCon cs+    Newtype (i, vks) (Constr _ _ c fs) -> do+      let+        t = snd $ head $ either id (map snd) fs+        tret = foldl tApp (tCon (qualIdent mn i)) (map tVarK vks)+      extValETop c (EForall vks $ EForall [] $ tArrow t tret) (ECon $ ConNew (qualIdent mn c))+    ForImp _ i t -> extValQTop i t+    Class ctx (i, vks) fds ms -> addValueClass ctx i vks fds ms+    _ -> return ()++-- XXX FunDep+addValueClass :: [EConstraint] -> Ident -> [IdKind] -> [FunDep] -> [EBind] -> T ()+addValueClass ctx iCls vks fds ms = do+  mn <- gets moduleName+  let+      meths = [ b | b@(BSign _ _) <- ms ]+      methTys = map (\ (BSign _ t) -> t) meths+      methIds = map (\ (BSign i _) -> i) meths+      supTys = ctx  -- XXX should do some checking+      targs = supTys ++ methTys+      qiCls = qualIdent mn iCls+      tret = tApps qiCls (map tVarK vks)+      cti = [ (qualIdent mn iCon, length targs) ]+      iCon = mkClassConstructor iCls+      iConTy = EForall vks $ foldr tArrow tret targs+  extValETop iCon iConTy (ECon $ ConData cti (qualIdent mn iCon))+  let addMethod (BSign i t) = extValETop i (EForall vks $ tApps qiCls (map (EVar . idKindIdent) vks) `tImplies` t) (EVar $ qualIdent mn i)+      addMethod _ = impossible+--  traceM ("addValueClass " ++ showEType (ETuple ctx))+  mapM_ addMethod meths+  -- Update class table, now with actual constructor type.+  addClassTable qiCls (vks, ctx, iConTy, methIds, mkIFunDeps (map idKindIdent vks) fds)++{-+bundleConstraints :: [EConstraint] -> EType -> EType+bundleConstraints []  t = t+bundleConstraints [c] t = tImplies c t+bundleConstraints cs  t = tImplies (ETuple cs) t+-}++mkClassConstructor :: Ident -> Ident+mkClassConstructor i = addIdentSuffix i "$C"++{-+unForall :: EType -> ([IdKind], EType)+unForall (EForall iks t) = (iks, t)+unForall t = ([], t)+-}++tcDefValue :: --XHasCallStack =>+              EDef -> T EDef+tcDefValue adef =+  case adef of+    Fcn i eqns -> do+      (_, tt) <- tLookup "type signature" i+--      traceM $ "tcDefValue: " ++ showIdent i ++ " :: " ++ showExpr tt+--      traceM $ "tcDefValue: def=" ++ showEDefs [adef]+      mn <- gets moduleName+      teqns <- tcEqns True tt eqns+--      traceM ("tcDefValue: after " ++ showEDefs [adef, Fcn i teqns])+      checkConstraints+      return $ Fcn (qualIdent mn i) teqns+    ForImp ie i t -> do+      mn <- gets moduleName+      return (ForImp ie (qualIdent mn i) t)+    _ -> return adef++tCheckTypeT :: EType -> EType -> T EType+tCheckTypeT = tCheck tcTypeT++tInferTypeT :: EType -> T EType+tInferTypeT t = fst <$> tInfer tcTypeT t++-- Kind check a type while already in type checking mode+tcTypeT :: --XHasCallStack =>+           Expected -> EType -> T EType+tcTypeT mk t = withTCMode TCType (tcExpr mk (dsType t))++-- Kind check a type while in value checking mode+tcType :: --XHasCallStack =>+          Expected -> EType -> T EType+tcType mk = withTypeTable . tcTypeT mk++{-+-- Sort check a kind while already in type cheking mode+tcKind :: --XHasCallStack =>+          EKind -> T EKind+tcKind e = fst <$> withTypeTable (tcType (Just kType) e)+-}++-- When inferring the type, the resulting type will+-- be assigned to the TRef (using tSetRefType),+-- and can then be read of (using tGetRefType).+-- When checking, the expected type is simple given.+data Expected = Infer TRef | Check EType+  --Xderiving(Show)++tInfer :: forall a b . --XHasCallStack =>+          (Expected -> a -> T b) -> a -> T (Typed b)+tInfer tc a = do+  ref <- newUniq+  a' <- tc (Infer ref) a+  t <- tGetRefType ref+  return (a', t)++tCheck :: forall a b . (Expected -> a -> T b) -> EType -> a -> T b+tCheck tc t = tc (Check t)++tInferExpr :: --XHasCallStack =>+              Expr -> T (Typed Expr)+tInferExpr = tInfer tcExpr++tCheckExpr :: --XHasCallStack =>+              EType -> Expr -> T Expr+tCheckExpr t _e | Just (_ctx, _t') <- getImplies t = do+  undefined+{-+  _ <- undefined -- XXX+  u <- newUniq+  let d = mkIdentSLoc (getSLoc e) ("adict$" ++ show u)+  e' <- withDict d ctx $ tCheckExpr t' e+  return $ eLam [EVar d] e'+-}+tCheckExpr t e = tCheck tcExpr t e++tGetRefType :: --XHasCallStack =>+               TRef -> T EType+tGetRefType ref = do+  m <- gets uvarSubst+  case IM.lookup ref m of+    Nothing -> return (EUVar ref) -- error "tGetRefType"+    Just t  -> return t++-- Set the type for an Infer+tSetRefType :: --XHasCallStack =>+               SLoc -> TRef -> EType -> T ()+tSetRefType loc ref t = do+  m <- gets uvarSubst+  case IM.lookup ref m of+    Nothing -> putUvarSubst (IM.insert ref t m)+    Just tt -> unify loc tt t++-- Get the type of an already set Expected+tGetExpType :: Expected -> T EType+tGetExpType (Check t) = return t+tGetExpType (Infer r) = tGetRefType r++{-+-- Get the type of a possibly unset Expected+tGetExpTypeSet :: SLoc -> Expected -> T EType+tGetExpTypeSet _   (Check t) = return t+tGetExpTypeSet loc (Infer r) = tGetRefType r {-do+  t <- newUVar+  tSetRefType loc r t+  return t-}+-}++tcExpr :: --XHasCallStack =>+          Expected -> Expr -> T Expr+tcExpr mt ae = do+--  traceM ("tcExpr enter: " ++ showExpr ae)+  r <- tcExprR mt ae+--  traceM ("tcExpr exit: " ++ showExpr r)+  return r+tcExprR :: --XHasCallStack =>+           Expected -> Expr -> T Expr+tcExprR mt ae =+  let { loc = getSLoc ae } in+--  trace ("tcExprR " ++ show ae) $+  case ae of+    EVar i | isIdent "dict$" i -> do+             -- Magic variable that just becomes the dictionary+             d <- newIdent (getSLoc i) "dict$"+             case mt of+               Infer _ -> impossible+               Check t -> addConstraint d t+             return (EVar d)++           | isDummyIdent i -> impossibleShow ae+           | otherwise -> do+             -- Type checking an expression (or type)+             (e, t) <- tLookupV i+             -- Variables bound in patterns start out with an (EUVar ref) type,+             -- which can be instantiated to a polytype.+             -- Dereference such a ref.+             t' <-+               case t of+                 EUVar r -> fmap (fromMaybe t) (getUVar r)+                 _ -> return t+--             traceM ("EVar " ++ showIdent i ++ " :: " ++ showExpr t ++ " = " ++ showExpr t')+             instSigma loc e t' mt++    EApp f a -> do+      (f', ft) <- tInferExpr f+--      traceM $ "EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft+      (at, rt) <- unArrow loc ft+--      traceM ("tcExpr EApp: " ++ showExpr f ++ " :: " ++ showEType ft)+      a' <- checkSigma a at+      instSigma loc (EApp f' a') rt mt++    EOper e ies -> do e' <- tcOper e ies; tcExpr mt e'+    ELam qs -> tcExprLam mt qs+    ELit loc' l -> do+      let getExpected (Infer _) = pure Nothing+          getExpected (Check t) = do+            t' <- derefUVar t >>= expandSyn+            case t' of+              EVar v -> pure (Just v)+              _      -> pure Nothing+      case l of+        LInteger i -> do+          mex <- getExpected mt+          case mex of+            -- Convert to Int in the compiler, that way (99::Int) will never involve fromInteger+            -- (which is not always in scope).+            Just v | v == mkIdent nameInt     -> tcLit  mt loc' (LInt (_integerToInt i))+                   | v == mkIdent nameWord    -> tcLit' mt loc' (LInt (_integerToInt i)) (tConI loc' nameWord)+                   | v == mkIdent nameDouble  -> tcLit  mt loc' (LDouble (_integerToDouble i))+                   | v == mkIdent nameInteger -> tcLit  mt loc' l+            _ -> do+              (f, ft) <- tInferExpr (EVar (mkIdentSLoc loc' "fromInteger"))  -- XXX should have this qualified somehow+              (_at, rt) <- unArrow loc ft+              -- We don't need to check that _at is Integer, it's part of the fromInteger type.+              instSigma loc (EApp f ae) rt mt+        LRat r -> do+          mex <- getExpected mt+          case mex of+            Just v | v == mkIdent nameDouble  -> tcLit  mt loc' (LDouble (fromRational r))+            _ -> do+              (f, ft) <- tInferExpr (EVar (mkIdentSLoc loc' "fromRational"))  -- XXX should have this qualified somehow+              (_at, rt) <- unArrow loc ft+              -- We don't need to check that _at is Rational, it's part of the fromRational type.+              instSigma loc (EApp f ae) rt mt+        -- Not LInteger, LRat+        _ -> tcLit mt loc' l+    ECase a arms -> do+      (ea, ta) <- tInferExpr a+      tt <- tGetExpType mt+      earms <- mapM (tcArm tt ta) arms+      return (ECase ea earms)+    ELet bs a -> tcBinds bs $ \ ebs -> do { ea <- tcExpr mt a; return (ELet ebs ea) }+    ETuple es -> do+      let+        n = length es+      (ees, tes) <- fmap unzip (mapM tInferExpr es)+      let+        ttup = tApps (tupleConstr loc n) tes+      munify loc mt ttup+      return (ETuple ees)+    EDo mmn ass -> do+      case ass of+        [] -> impossible+        [as] ->+          case as of+            SThen a -> tcExpr mt a+            _ -> tcError loc $ "bad final do statement"+        as : ss -> do+          case as of+            SBind p a -> do+              let+                sbind = maybe (mkIdentSLoc loc ">>=") (\ mn -> qualIdent mn (mkIdentSLoc loc ">>=")) mmn+              tcExpr mt (EApp (EApp (EVar sbind) a)+                              (eLam [eVarI loc "$x"] (ECase (eVarI loc "$x") [(p, EAlts [([], EDo mmn ss)] [])])))+            SThen a -> do+              let+                sthen = maybe (mkIdentSLoc loc ">>") (\ mn -> qualIdent mn (mkIdentSLoc loc ">>") ) mmn+              tcExpr mt (EApp (EApp (EVar sthen) a) (EDo mmn ss))+                +            SLet bs ->+              tcExpr mt (ELet bs (EDo mmn ss))++    ESectL e i -> tcExpr mt (EApp (EVar i) e)+    ESectR i e -> do+      let x = eVarI loc "$x"+      tcExpr mt (eLam [x] (EApp (EApp (EVar i) x) e))+    EIf e1 e2 e3 -> do+      e1' <- tCheckExpr (tBool (getSLoc e1)) e1+      case mt of+        Check t -> do+          e2' <- checkSigma e2 t+          e3' <- checkSigma e3 t+          return (EIf e1' e2' e3')+        Infer ref -> do+          (e2', t2) <- tInferExpr e2+          (e3', t3) <- tInferExpr e3+          e2'' <- subsCheck loc e2' t2 t3+          e3'' <- subsCheck loc e3' t3 t2+          tSetRefType loc ref t2+          return (EIf e1' e2'' e3'')++    EListish (LList es) -> do+      te <- newUVar+      munify loc mt (tApp (tList loc) te)+      es' <- mapM (tCheckExpr te) es+      return (EListish (LList es'))+    EListish (LCompr eret ass) -> do+      let+        doStmts :: [EStmt] -> [EStmt] -> T ([EStmt], Typed Expr)+        doStmts rss xs =+          case xs of+            [] -> do+              r <- tInferExpr eret+              return (reverse rss, r)+            as : ss ->+              case as of+                SBind p a -> do+                  v <- newUVar+                  ea <- tCheckExprAndSolve (tApp (tList loc) v) a+                  tCheckPatC v p $ \ ep -> doStmts (SBind ep ea : rss) ss+                SThen a -> do+                  ea <- tCheckExprAndSolve (tBool (getSLoc a)) a+                  doStmts (SThen ea : rss) ss+                SLet bs ->+                  tcBinds bs $ \ ebs ->+                    doStmts (SLet ebs : rss) ss+      (rss, (ea, ta)) <- doStmts [] ass+      let+        tr = tApp (tList loc) ta+      munify loc mt tr+      return (EListish (LCompr ea rss))+    EListish (LFrom       e)        -> tcExpr mt (enum loc "From" [e])+    EListish (LFromTo     e1 e2)    -> tcExpr mt (enum loc "FromTo" [e1, e2])+    EListish (LFromThen   e1 e2)    -> tcExpr mt (enum loc "FromThen" [e1,e2])+    EListish (LFromThenTo e1 e2 e3) -> tcExpr mt (enum loc "FromThenTo" [e1,e2,e3])+    ESign e t -> do+      t' <- tcType (Check kType) t+      e' <- instSigma loc e t' mt+      checkSigma e' t'+    EForall vks t ->+      withVks vks kType $ \ vvks _ -> do+        tt <- withVars vvks (tcExpr mt t)+        return (EForall vvks tt)+    _ -> error $ "tcExpr: " ++ show (getSLoc ae) ++ " " ++ show ae+      -- impossible++enum :: SLoc -> String -> [Expr] -> Expr+enum loc f = foldl EApp (EVar (mkIdentSLoc loc ("enum" ++ f)))++tcLit :: Expected -> SLoc -> Lit -> T Expr+tcLit mt loc l@(LPrim _) = newUVar >>= tcLit' mt loc l+tcLit mt loc l = do+  let t =+        case l of+          LInt _     -> tConI loc nameInt+          LInteger _ -> tConI loc nameInteger+          LDouble _  -> tConI loc nameDouble+          LChar _    -> tConI loc nameChar+          LStr _     -> tApp (tList loc) (tConI loc nameChar)+          _          -> impossible+  tcLit' mt loc l t++tcLit' :: Expected -> SLoc -> Lit -> EType -> T Expr+tcLit' mt loc l t = instSigma loc (ELit loc l) t mt++-- tcOper is in T because it has to look up identifiers, and get the fixity table.+-- But there is no type checking happening here.+tcOper :: --XHasCallStack =>+          Expr -> [(Ident, Expr)] -> T Expr+tcOper ae aies = do+  let+    doOp (e1:e2:es) o os ies =+      let e = EApp (EApp o e2) e1+      in  calc (e:es) os ies+    doOp _ _ _ _ = impossible++    calc :: [Expr] -> [(Expr, Fixity)] -> [((Expr, Fixity), Expr)] -> Expr+    calc [et] [] [] = et+    calc es ((o, _):os) [] = doOp es o os []+    calc es oos@((oy, (ay, py)):os) iies@((oo@(ox, (ax, px)), e) : ies) =+--      traceM (show ((unIdent (getIdent (fst o)), ay, py), (unIdent i, ax, px)))+      if px == py && (ax /= ay || ax == AssocNone) then+        errorMessage (getSLoc ox) "ambiguous operator expression"+       else if px < py || ax == AssocLeft && px == py then+        doOp es oy os iies+       else+        calc (e:es) (oo : oos) ies+    calc es [] ((o, e) : ies) =+      calc (e:es) [o] ies+    calc _ _ _ = impossible++    opfix :: FixTable -> (Ident, Expr) -> T ((Expr, Fixity), Expr)+    opfix fixs (i, e) = do+      (ei, _) <- tLookupV i+      let fx = getFixity fixs (getIdent ei)+      return ((EVar i, fx), e)++  fixs <- gets fixTable+--  traceM $ unlines $ map show [(unIdent i, fx) | (i, fx) <- M.toList fixs]+  ites <- mapM (opfix fixs) aies+  return $ calc [ae] [] ites++unArrow :: --XHasCallStack =>+           SLoc -> EType -> T (EType, EType)+unArrow loc t = do+  case getArrow t of+    Just ar -> return ar+    Nothing -> do+      a <- newUVar+      r <- newUVar+      unify loc t (tArrow a r)+      return (a, r)++getFixity :: FixTable -> Ident -> Fixity+getFixity fixs i = fromMaybe (AssocLeft, 9) $ M.lookup i fixs++newDictIdent :: SLoc -> T Ident+newDictIdent loc = newIdent loc "adict"++tcExprLam :: Expected -> [Eqn] -> T Expr+tcExprLam mt qs = do+  t <- tGetExpType mt+  ELam <$> tcEqns False t qs++tcEqns :: Bool -> EType -> [Eqn] -> T [Eqn]+--tcEqns t eqns | trace ("tcEqns: " ++ showEBind (BFcn dummyIdent eqns) ++ " :: " ++ showEType t) False = undefined+tcEqns top (EForall iks t) eqns = withExtTyps iks $ tcEqns top t eqns+tcEqns top t eqns | Just (ctx, t') <- getImplies t = do+  let loc = getSLoc eqns+  d <- newDictIdent loc+  f <- newIdent loc "fcnD"+  withDict d ctx $ do+    eqns' <- tcEqns top t' eqns+    let eqn =+          case eqns' of+            [Eqn [] alts] -> Eqn [EVar d] alts+            _             -> Eqn [EVar d] $ EAlts [([], EVar f)] [BFcn f eqns']+    return [eqn]+tcEqns top t eqns = do+  let loc = getSLoc eqns+  f <- newIdent loc "fcnS"+  (eqns', ds) <- solveAndDefault top $ mapM (tcEqn t) eqns+  case ds of+    [] -> return eqns'+    _  -> do+      let+        bs = eBinds ds+        eqn = Eqn [] $ EAlts [([], EVar f)] (bs ++ [BFcn f eqns'])+      return [eqn]++tcEqn :: EType -> Eqn -> T Eqn+--tcEqn t _eqn | trace ("tcEqn: " ++ showEType t) False = undefined+tcEqn t eqn =+  case eqn of+    Eqn ps alts -> tcPats t ps $ \ t' ps' -> do+      alts' <- tcAlts t' alts+      return (Eqn ps' alts')++-- Only used above+tcPats :: EType -> [EPat] -> (EType -> [EPat] -> T Eqn) -> T Eqn+tcPats t [] ta = ta t []+tcPats t (p:ps) ta = do+  (tp, tr) <- unArrow (getSLoc p) t+  -- tCheckPatC dicts used in tcAlt solve+  tCheckPatC tp p $ \ p' -> tcPats tr ps $ \ t' ps' -> ta t' (p' : ps')++tcAlts :: EType -> EAlts -> T EAlts+tcAlts t (EAlts alts bs) =+--  trace ("tcAlts: bs in " ++ showEBinds bs) $+  tcBinds bs $ \ bs' -> do+--    traceM ("tcAlts: bs out " ++ showEBinds bbs)+    alts' <- mapM (tcAlt t) alts+    return (EAlts alts' bs')++tcAlt :: EType -> EAlt -> T EAlt+--tcAlt t (_, rhs) | trace ("tcAlt: " ++ showExpr rhs ++ " :: " ++ showEType t) False = undefined+tcAlt t (ss, rhs) = tcGuards ss $ \ ss' -> do+  rhs' <- tCheckExprAndSolve t rhs+  return (ss', rhs')++tcGuards :: [EStmt] -> ([EStmt] -> T EAlt) -> T EAlt+tcGuards [] ta = ta []+tcGuards (s:ss) ta = tcGuard s $ \ rs -> tcGuards ss $ \ rss -> ta (rs:rss)++tcGuard :: EStmt -> (EStmt -> T EAlt) -> T EAlt+tcGuard (SBind p e) ta = do+  (e', tt) <- tInferExpr e+  -- tCheckPatC dicts used in solving in tcAlt+  tCheckPatC tt p $ \ p' -> ta (SBind p' e')+tcGuard (SThen e) ta = do+  e' <- tCheckExprAndSolve (tBool (getSLoc e)) e+  ta (SThen e')+-- XXX do we have solves+tcGuard (SLet bs) ta = tcBinds bs $ \ bs' -> ta (SLet bs')++tcArm :: EType -> EType -> ECaseArm -> T ECaseArm+tcArm t tpat arm =+  case arm of+    -- The dicts introduced by tCheckPatC are+    -- used in the tCheckExprAndSolve in tcAlt.+    (p, alts) -> tCheckPatC tpat p $ \ pp -> do+      alts' <- tcAlts t alts+      return (pp, alts')++tCheckExprAndSolve :: EType -> Expr -> T Expr+tCheckExprAndSolve t e = do+  (e', bs) <- solveLocalConstraints $ tCheckExpr t e+  if null bs then+    return e'+   else+    return $ ELet (eBinds bs) e'++eBinds :: [(Ident, Expr)] -> [EBind]+eBinds ds = [BFcn i [Eqn [] (EAlts [([], e)] [])] | (i, e) <- ds]++instPatSigma :: --XHasCallStack =>+                 SLoc -> Sigma -> Expected -> T ()+instPatSigma loc pt (Infer r) = tSetRefType loc r pt+instPatSigma loc pt (Check t) = do { _ <- subsCheck loc undefined t pt; return () } -- XXX really?++subsCheck :: --XHasCallStack =>+              SLoc -> Expr -> Sigma -> Sigma -> T Expr+-- (subsCheck args off exp) checks that+-- 'off' is at least as polymorphic as 'args -> exp'+subsCheck loc exp1 sigma1 sigma2 = do -- Rule DEEP-SKOL+  (skol_tvs, rho2) <- skolemise sigma2+  exp1' <- subsCheckRho loc exp1 sigma1 rho2+  esc_tvs <- getFreeTyVars [sigma1,sigma2]+  let bad_tvs = filter (\ i -> elem i esc_tvs) skol_tvs+  when (not (null bad_tvs)) $+    tcErrorTK loc "Subsumption check failed"+  return exp1'++tCheckPatC :: forall a . EType -> EPat -> (EPat -> T a) -> T a+tCheckPatC t p@(EVar v) ta | not (isConIdent v) = do  -- simple special case+  withExtVals [(v, t)] $ ta p+tCheckPatC t ap ta = do+--  traceM $ "tCheckPat: " ++ show ap+  let vs = patVars ap+  multCheck vs+  env <- mapM (\ v -> (v,) <$> newUVar) vs+  withExtVals env $ do+    (_sks, ds, pp) <- tCheckPat t ap+    () <- checkArity 0 pp+--    traceM ("tCheckPatC " ++ show ds)+    -- XXX must check for leaking skolems+    withDicts ds $+      ta pp++type EPatRet = ([TyVar], [(Ident, EConstraint)], EPat)  -- skolems, dictionaries, pattern++tCheckPat :: EType -> EPat -> T EPatRet+tCheckPat = tCheck tcPat+tInferPat :: EPat -> T (Typed EPatRet)+tInferPat = tInfer tcPat++-- XXX Has some duplication with tcExpr+tcPat :: Expected -> EPat -> T EPatRet+tcPat mt ae =+  let { loc = getSLoc ae } in+  case ae of+    EVar i | isDummyIdent i -> do+               -- _ can be anything, so just ignore it+               _ <- tGetExpType mt+               return ([], [], ae)++           | isConIdent i -> do+               ipt <- tLookupV i+--               traceM (show ipt)+               case ipt of+                  -- Sanity check+                  (_, EForall _ (EForall _ _)) -> return ()+                  _ -> undefined+               (ap, EForall avs apt) <- tInst' ipt+               (sks, spt) <- shallowSkolemise avs apt+               (d, p, pt) <-+                 case getImplies spt of+                   Nothing -> return ([], ap, apt)+                   Just (ctx, pt') -> do+                     di <- newDictIdent loc+                     return ([(di, ctx)], EApp ap (EVar di), pt')+                   +               -- We will only have an expected type for a non-nullary constructor+               pp <- case mt of+                       Check ext -> subsCheck loc p ext pt+                       Infer r   -> do { tSetRefType loc r pt; return p }+               return (sks, d, pp)++           | otherwise -> do+               -- All pattern variables are in the environment as+               -- type references.  Assign the reference the given type.+               ext <- tGetExpType mt+               (p, t) <- tLookupV i+               case t of+                 EUVar r -> tSetRefType loc r ext+                 _ -> impossible+               return ([], [], p)++    EOper e ies -> do e' <- tcOper e ies; tcPat mt e'++    EApp f a -> do+      ((skf, df, f'), ft) <- tInferPat f+--      traceM $ "tcPat: EApp f=" ++ showExpr f ++ "; e'=" ++ showExpr f' ++ " :: " ++ showEType ft+      (at, rt) <- unArrow loc ft+--      traceM ("tcPat EApp: " ++ showExpr f ++ " :: " ++ showEType ft)+      (ska, da, a') <- tCheckPat at a+      instPatSigma loc rt mt+      return (skf ++ ska, df ++ da, EApp f' a')+           +    ETuple es -> do+      let+        n = length es+      (xs, tes) <- fmap unzip (mapM tInferPat es)+      let+        (sks, ds, ees) = unzip3 xs+        ttup = tApps (tupleConstr loc n) tes+      munify loc mt ttup+      return (concat sks, concat ds, ETuple ees)++    EListish (LList es) -> do+      te <- newUVar+      munify loc mt (tApp (tList loc) te)+      xs <- mapM (tCheckPat te) es+      let (sks, ds, es') = unzip3 xs+      return (concat sks, concat ds, EListish (LList es'))++    ELit loc' l -> do+      -- XXX wrong+      ee <- case l of+              LInteger i -> tcLit mt loc' (LInt (_integerToInt i))+              _          -> tcLit mt loc' l+      return ([], [], ee)++    ESign e t -> do+      t' <- tcType (Check kType) t+      instPatSigma loc t' mt+      tCheckPat t' e++    EAt i e -> do+      (_, ti) <- tLookupV i+      (sk, d, e') <- tcPat mt e+      tt <- tGetExpType mt+      case ti of+        EUVar r -> tSetRefType loc r tt+        _ -> impossible+      return (sk, d, EAt i e')++    _ -> error $ "tcPat: " ++ show (getSLoc ae) ++ " " ++ show ae+         --impossible++multCheck :: [Ident] -> T ()+multCheck vs =+  when (anySame vs) $ do+    let v = head vs+    tcError (getSLoc v) $ "Multiply defined: " ++ showIdent v++checkArity :: Int -> EPat -> T ()+checkArity n (EApp f a) = do+  checkArity (n+1) f+  checkArity 0 a+checkArity n (ECon c) =+  let a = conArity c+  in  if n < a then+        tcError (getSLoc c) "too few arguments"+      else if n > a then+        tcError (getSLoc c) "too many arguments"+      else+        return ()+checkArity n (EAt _ p) = checkArity n p+checkArity n (ESign p _) = checkArity n p+checkArity n p =+  case p of+    ETuple _           -> check0+    EListish (LList _) -> check0+    EVar _             -> check0+    ELit _ _           -> check0+    _ ->+         --Xerror (show p)+         impossible+  where+    check0 = if n /= 0 then tcError (getSLoc p) "Bad pattern" else return ()++tcBinds :: forall a . [EBind] -> ([EBind] -> T a) -> T a+tcBinds xbs ta = do+  let+    tmap = M.fromList [ (i, t) | BSign i t <- xbs ]+    xs = getBindsVars xbs+  multCheck xs+  xts <- mapM (tcBindVarT tmap) xs+  withExtVals xts $ do+    nbs <- mapM tcBind xbs+    ta nbs++tcBindVarT :: M.Map EType -> Ident -> T (Ident, EType)+tcBindVarT tmap x = do+  case M.lookup x tmap of+    Nothing -> do+      t <- newUVar+      return (x, t)+    Just t -> do+      tt <- withTypeTable $ tcTypeT (Check kType) t+      return (x, tt)++tcBind :: EBind -> T EBind+tcBind abind =+  case abind of+    BFcn i eqns -> do+      (_, tt) <- tLookupV i+      teqns <- tcEqns False tt eqns+      return $ BFcn i teqns+    BPat p a -> do+      ((sk, ds, ep), tp) <- tInferPat p  -- pattern variables already bound+      -- This is just to complicated.+      when (not (null sk) || not (null ds)) $+        tcError (getSLoc p) "existentials not allowed in pattern binding"+      ea <- tCheckExprAndSolve tp a+      return $ BPat ep ea+    BSign _ _ -> return abind++-- Desugar [T] and (T,T,...)+dsType :: EType -> EType+dsType at =+  case at of+    EVar _ -> at+    EApp f a -> EApp (dsType f) (dsType a)+    EOper t ies -> EOper (dsType t) [(i, dsType e) | (i, e) <- ies]+    EListish (LList [t]) -> tApp (tList (getSLoc at)) (dsType t)+    ETuple ts -> tApps (tupleConstr (getSLoc at) (length ts)) (map dsType ts)+    ESign t k -> ESign (dsType t) k+    EForall iks t -> EForall iks (dsType t)+    _ -> impossible++tConI :: SLoc -> String -> EType+tConI loc = tCon . mkIdentSLoc loc++tListI :: SLoc -> Ident+tListI loc = mkIdentSLoc loc $ listPrefix ++ "[]"++tList :: SLoc -> EType+tList = tCon . tListI++tBool :: SLoc -> EType+tBool loc = tConI loc $ boolPrefix ++ "Bool"++impossible :: --XHasCallStack =>+              forall a . a+impossible = error "impossible"++impossibleShow :: --XHasCallStack =>+              forall a b . (Show a, HasLoc a) => a -> b+impossibleShow a = error $ "impossible: " ++ show (getSLoc a) ++ " " ++ show a++showTModule :: forall a . (a -> String) -> TModule a -> String+showTModule sh amdl =+  case amdl of+    TModule mn _ _ _ _ _ _ a -> "Tmodule " ++ showIdent mn ++ "\n" ++ sh a ++ "\n"++{-+showValueTable :: ValueTable -> String+showValueTable vt =+  unlines $ take 5 [showIdent i ++ " : " ++ showExpr t | (i, [Entry _ t]) <- M.toList vt]+-}++-----------------------------------------------------++getFreeTyVars :: [EType] -> T [TyVar]+getFreeTyVars tys = do+  tys' <- mapM derefUVar tys+  return (freeTyVars tys')++getMetaTyVars :: [EType] -> T [TRef]+getMetaTyVars tys = do+  tys' <- mapM derefUVar tys+  return (metaTvs tys')++getEnvTypes :: T [EType]+getEnvTypes = gets (map entryType . stElemsLcl . valueTable)++{-+quantify :: [MetaTv] -> Rho -> T Sigma+-- Quantify over the specified type variables (all flexible)+quantify tvs ty = do+   mapM_ bind (tvs `zip` new_bndrs) -- 'bind' is just a cunning way+   ty' <- zonkType ty               -- of doing the substitution+   return (EForall new_bndrs_kind ty')+  where+    used_bndrs = tyVarBndrs ty -- Avoid quantified type variables in use+    new_bndrs = allBinders \\ used_bndrs+    bind (tv, name) = writeTcRef tv (EVar name)+    new_bndrs_kind = map (\ i -> IdKind i undefined) new_bndrs++allBinders :: [Ident] -- a,b,..z, a1, b1,... z1, a2, b2,...+allBinders = [ mkIdent [chr x] | x <- [ord 'a' .. ord 'z'] ] +++             [ mkIdent (chr x : show i) | i <- [1 ..], x <- [ord 'a' .. ord 'z']]+-}++-- Skolemize the given variables+shallowSkolemise :: [IdKind] -> EType -> T ([TyVar], EType)+shallowSkolemise tvs ty = do+  sks <- mapM (newSkolemTyVar . idKindIdent) tvs+  return (sks, subst (zip (map idKindIdent tvs) (map EVar sks)) ty)++skolemise :: --XHasCallStack =>+             Sigma -> T ([TyVar], Rho)+-- Performs deep skolemisation, returning the+-- skolem constants and the skolemised type.+skolemise (EForall tvs ty) = do -- Rule PRPOLY+  (sks1, ty') <- shallowSkolemise tvs ty+  (sks2, ty'') <- skolemise ty'+  return (sks1 ++ sks2, ty'')+skolemise t@(EApp _ _) | Just (arg_ty, res_ty) <- getArrow t = do+  (sks, res_ty') <- skolemise res_ty+  return (sks, arg_ty `tArrow` res_ty')+skolemise (EApp f a) = do+  (sks1, f') <- skolemise f+  (sks2, a') <- skolemise a+  return (sks1 ++ sks2, EApp f' a')+skolemise ty =+  return ([], ty)++-- Skolem tyvars are just identifiers that start with a uniq+newSkolemTyVar :: Ident -> T Ident+newSkolemTyVar tv = do+  uniq <- newUniq+  return (mkIdentSLoc (getSLoc tv) (unIdent tv ++ "#" ++ show uniq))++freeTyVars :: [EType] -> [TyVar]+-- Get the free TyVars from a type; no duplicates in result+freeTyVars = foldr (go []) []+  where+    go :: [TyVar] -- Ignore occurrences of bound type variables+       -> EType   -- Type to look at+       -> [TyVar] -- Accumulates result+       -> [TyVar]+    go bound (EVar tv) acc+      | elem tv bound = acc+      | elem tv acc = acc+      | isConIdent tv = acc+      | otherwise = tv : acc+    go bound (EForall tvs ty) acc = go (map idKindIdent tvs ++ bound) ty acc+    go bound (EApp fun arg) acc = go bound fun (go bound arg acc)+    go _bound (EUVar _) acc = acc+    go _ _ _ = undefined++metaTvs :: [EType] -> [TRef]+-- Get the MetaTvs from a type; no duplicates in result+metaTvs tys = foldr go [] tys+  where+    go (EUVar tv) acc+      | elem tv acc = acc+      | otherwise = tv : acc+    go (EVar _) acc = acc+    go (EForall _ ty) acc = go ty acc+    go (EApp fun arg) acc = go fun (go arg acc)+    go _ _ = undefined++{-+tyVarBndrs :: Rho -> [TyVar]+-- Get all the binders used in ForAlls in the type, so that+-- when quantifying an outer for-all we can avoid these inner ones+tyVarBndrs ty = nub (bndrs ty)+  where+    bndrs (EForall tvs body) = map idKindIdent tvs ++ bndrs body+    bndrs (EApp arg res) = bndrs arg ++ bndrs res+    bndrs (EVar _) = []+    bndrs _ = undefined++inferSigma :: Expr -> T (Expr, Sigma)+inferSigma e = do+  (e', exp_ty) <- inferRho e+  env_tys      <- getEnvTypes+  env_tvs      <- getMetaTyVars env_tys+  res_tvs      <- getMetaTyVars [exp_ty]+  let forall_tvs = res_tvs \\ env_tvs+  (e',) <$> quantify forall_tvs exp_ty+-}++checkSigma :: --XHasCallStack =>+              Expr -> Sigma -> T Expr+checkSigma expr sigma = do+  (skol_tvs, rho) <- skolemise sigma+  expr' <- tCheckExpr rho expr+  if null skol_tvs then+    -- Fast special case+    return expr'+   else do+    env_tys <- getEnvTypes+    esc_tvs <- getFreeTyVars (sigma : env_tys)+    let bad_tvs = filter (\ i -> elem i esc_tvs) skol_tvs+    when (not (null bad_tvs)) $+      tcErrorTK (getSLoc expr) $ "not polymorphic enough: " ++ unwords (map showIdent bad_tvs)+    return expr'++subsCheckRho :: --XHasCallStack =>+                SLoc -> Expr -> Sigma -> Rho -> T Expr+--subsCheckRho _ e1 t1 t2 | trace ("subsCheckRho: " ++ {-showExpr e1 ++ " :: " ++ -} showEType t1 ++ " = " ++ showEType t2) False = undefined+subsCheckRho loc exp1 sigma1@(EForall _ _) rho2 = do -- Rule SPEC+  (exp1', rho1) <- tInst (exp1, sigma1)+  subsCheckRho loc exp1' rho1 rho2+subsCheckRho loc exp1 rho1 rho2 | Just (a2, r2) <- getArrow rho2 = do -- Rule FUN+  (a1, r1) <- unArrow loc rho1+  subsCheckFun loc exp1 a1 r1 a2 r2+subsCheckRho loc exp1 rho1 rho2 | Just (a1, r1) <- getArrow rho1 = do -- Rule FUN+  (a2,r2) <- unArrow loc rho2+  subsCheckFun loc exp1 a1 r1 a2 r2+subsCheckRho loc exp1 tau1 tau2 = do  -- Rule MONO+  unify loc tau1 tau2 -- Revert to ordinary unification+  return exp1++subsCheckFun :: --XHasCallStack =>+                SLoc -> Expr -> Sigma -> Rho -> Sigma -> Rho -> T Expr+subsCheckFun loc e1 a1 r1 a2 r2 = do+  _ <- subsCheck loc undefined a2 a1   -- XXX+  subsCheckRho loc e1 r1 r2++instSigma :: --XHasCallStack =>+             SLoc -> Expr -> Sigma -> Expected -> T Expr+instSigma loc e1 t1 (Check t2) = do+--  traceM ("instSigma: Check " ++ showEType t1 ++ " = " ++ showEType t2)+  subsCheckRho loc e1 t1 t2+instSigma loc e1 t1 (Infer r) = do+  (e1', t1') <- tInst (e1, t1)+--  traceM ("instSigma: Infer " ++ showEType t1 ++ " ==> " ++ showEType t1')+  tSetRefType loc r t1'+  return e1'++-----++-- Given a dictionary of a (constraint type), split it up+--  * name components of a tupled constraint+--  * name superclasses of a constraint+expandDict :: Expr -> EConstraint -> T [InstDictC]+expandDict edict acn = do+  cn <- expandSyn acn+  let+    (iCls, args) = getApp cn+  case getTupleConstr iCls of+    Just _ -> concat <$> mapM (\ (i, a) -> expandDict (mkTupleSel i (length args) `EApp` edict) a) (zip [0..] args)+    Nothing -> do+      ct <- gets classTable+      let (iks, sups, _, _, fds) = fromMaybe impossible $ M.lookup iCls ct+          vs = map idKindIdent iks+          sub = zip vs args+          sups' = map (subst sub) sups+--      mn <- gets moduleName+      insts <- concat <$> mapM (\ (i, sup) -> expandDict (EVar (expectQualified $ mkSuperSel iCls i) `EApp` edict) sup) (zip [1 ..] sups')+      return $ (edict, [], [], cn, fds) : insts++mkSuperSel :: --XHasCallStack =>+              Ident -> Int -> Ident+mkSuperSel c i = addIdentSuffix c ("$super" ++ show i)++---------------------------------++type Solved = (Ident, Expr)++-- Solve constraints generated locally in 'ta'.+-- Keep any unsolved ones for later.+solveLocalConstraints :: forall a . T a -> T (a, [Solved])+solveLocalConstraints ta = do+  cs <- gets constraints           -- old constraints+  putConstraints []                -- start empty+  a <- ta                          -- compute, generating constraints+  ds <- solveConstraints           -- solve those+  un <- gets constraints           -- get remaining unsolved+  putConstraints (un ++ cs)        -- put back unsolved and old constraints+  return (a, ds)++solveAndDefault :: forall a . Bool -> T a -> T (a, [Solved])+solveAndDefault False ta = solveLocalConstraints ta+solveAndDefault True  ta = do+  a <- ta+  ds <- solveConstraints+  cs <- gets constraints+  vs <- getMetaTyVars (map snd cs)    -- These are the type variables that need defaulting+--  traceM $ "solveAndDefault" ++ show vs+  -- XXX may have to iterate this with fundeps+  ds' <- concat <$> mapM defaultOneTyVar vs+  return (a, ds ++ ds')++constraintHasTyVar :: TRef -> (Ident, EConstraint) -> T Bool+constraintHasTyVar tv (_, t) = elem tv <$> getMetaTyVars [t]++defaultOneTyVar :: TRef -> T [Solved]+defaultOneTyVar tv = do+  old <- get             -- get entire old state+  -- split constraints into those with the current tyvar and those without+  (ourcs, othercs) <- partitionM (constraintHasTyVar tv) (constraints old)+  let tryDefaults [] = return []+      tryDefaults (ty:tys) = do+        setUVar tv ty+        putConstraints ourcs+        ds <- solveConstraints+        rcs <- gets constraints+        if null rcs then do+          -- Success, the type variable is gone+          putConstraints othercs   -- put back the other constraints+          return ds+         else do+          -- Not solved, try with the nest type+          put old            -- restore solver state+          tryDefaults tys    -- and try with next type+  tryDefaults (defaults old)++{-+showInstInfo :: InstInfo -> String+showInstInfo (InstInfo m ds fds) = "InstInfo " ++ show (M.toList m) ++ " " ++ showListS showInstDict ds ++ show fds++showInstDict :: InstDict -> String+showInstDict (e, ctx, ts) = showExpr e ++ " :: " ++ show (addConstraints ctx (tApps (mkIdent "CCC") ts))++showInstDef :: InstDef -> String+showInstDef (cls, InstInfo m ds) = "instDef " ++ show cls ++ ": "+            ++ show (M.toList m) ++ ", " ++ showListS showInstDict ds++showConstraint :: (Ident, EConstraint) -> String+showConstraint (i, t) = show i ++ " :: " ++ show t++showMatch :: (Expr, [EConstraint]) -> String+showMatch (e, ts) = show e ++ " " ++ show ts+-}++-- Solve as many constraints as possible.+-- Return bindings for the dictionary witnesses.+-- Unimplemented:+--  instances with a context+solveConstraints :: T [(Ident, Expr)]+solveConstraints = do+  cs <- gets constraints+  if null cs then+    return []+   else do+--    traceM "------------------------------------------\nsolveConstraints"+    cs' <- mapM (\ (i,t) -> do { t' <- derefUVar t; return (i,t') }) cs+--    traceM ("constraints:\n" ++ unlines (map showConstraint cs'))+    it <- gets instTable+--    traceM ("instances:\n" ++ unlines (map showInstDef (M.toList it)))+    let solve :: [(Ident, EType)] -> [(Ident, EType)] -> [(Ident, Expr)] -> T ([(Ident, EType)], [(Ident, Expr)])+        solve [] uns sol = return (uns, sol)+        solve (cns@(di, ct) : cnss) uns sol = do+--          traceM ("trying " ++ showEType ct)+          let loc = getSLoc di+              (iCls, cts) = getApp ct+          case getTupleConstr iCls of+            Just _ -> do+              goals <- mapM (\ c -> do { d <- newIdent loc "dict"; return (d, c) }) cts+--              traceM ("split tuple " ++ showListS showConstraint goals)+              solve (goals ++ cnss) uns ((di, ETuple (map (EVar . fst) goals)) : sol)+            Nothing | iCls == mkIdent nameTypeEq -> solveTypeEq loc cts cns cnss uns sol+                    | otherwise ->+              case M.lookup iCls it of+                Nothing -> do+--                  traceM ("class missing " ++ showIdent iCls)+                  solve cnss (cns : uns) sol   -- no instances, so no chance+                Just (InstInfo atomMap insts fds) ->+                  case cts of+                    [EVar i] -> do+--                      traceM ("solveSimple " ++ showIdent i ++ " -> " ++ showMaybe showExpr (M.lookup i atomMap))+                      case M.lookup i atomMap of+                        Just e  -> solveSimple e cns cnss uns sol+                        -- Not found, but there might be a generic instance+                        Nothing -> solveGen loc fds insts cns cnss uns sol+                    _           -> solveGen loc fds insts cns cnss uns sol++        -- An instance of the form (C T)+        solveSimple e (di, _) cnss uns sol = solve cnss uns ((di, e) : sol)  -- e is the dictionary expression++        -- XXX pass ts instead of cns+        solveGen loc _fds insts cns@(di, ct) cnss uns sol = do+--          traceM ("solveGen " ++ showEType ct)+          let (_, ts) = getApp ct+              matches = getBestMatches $ findMatches insts ts+--          traceM ("matches " ++ showListS showMatch matches)+          case matches of+            []          -> solve cnss (cns : uns) sol+            [(de, ctx)] ->+              if null ctx then+                solve cnss uns ((di, de) : sol)+              else do+                d <- newIdent loc "dict"+--                traceM ("constraint " ++ showIdent di ++ " :: " ++ showEType ct ++ "\n" +++--                        "   turns into " ++ showIdent d ++ " :: " ++ showEType (tupleConstraints ctx) ++ ", " +++--                        showIdent di ++ " = " ++ showExpr (EApp de (EVar d)))+                solve ((d, tupleConstraints ctx) : cnss) uns ((di, EApp de (EVar d)) : sol)+            _           -> tcError loc $ "Multiple constraint solutions for: " ++ showEType ct++        solveTypeEq loc [t1, t2] cns@(di,_) cnss uns sol = do+          eqs <- gets typeEqTable+          case solveEq eqs t1 t2 of+            Nothing -> solve cnss (cns : uns) sol+            Just (de, tts) -> do+              let mkEq (u1, u2) = do+                    i <- newIdent loc "dict"+                    return (i, mkEqType loc u1 u2)+              ncs <- mapM mkEq tts+              solve (ncs ++ cnss) uns ((di, de) : sol)+        solveTypeEq _ _ _ _ _ _ = impossible++    (unsolved, solved) <- solve cs' [] []+    putConstraints unsolved+--    traceM ("solved:\n"   ++ unlines [ showIdent i ++ " = "  ++ showExpr  e | (i, e) <- solved ])+--    traceM ("unsolved:\n" ++ unlines [ showIdent i ++ " :: " ++ showEType t | (i, t) <- unsolved ])+    return solved++type TySubst = [(TRef, EType)]++-- Given some instances and a constraint, find the matching instances.+-- For each matching instance return: (subst-size, (dict-expression, new-constraints))+-- The subst-size is the size of the substitution that made the input instance match.+-- It is a measure of how exact the match is.+findMatches :: [InstDict] -> [EType] -> [(Int, (Expr, [EConstraint]))]+findMatches ds its =+ let rrr =+       [ (length s, (de, map (substEUVar s) ctx))+       | (de, ctx, ts) <- ds, Just s <- [matchTypes [] ts its] ]+ in --trace ("findMatches: " ++ showListS showInstDict ds ++ "; " ++ showListS showEType its ++ "; " ++ show rrr)+    rrr+  where++    -- Length of lists match, because of kind correctness+    matchTypes :: TySubst -> [EType] -> [EType] -> Maybe TySubst+    matchTypes r (t:ts) (t':ts') =+      case matchType r t t' of+        Nothing -> Nothing+        Just r' -> matchTypes r' ts ts'+    matchTypes r _ _ = Just r++    -- Match two types, instantiate variables in the first type.+    matchType r (EVar i) (EVar i') | i == i' = Just r+    matchType r (EApp f a) (EApp f' a') = -- XXX should use Maybe monad+      case matchType r f f' of+        Nothing -> Nothing+        Just r' -> matchType r' a a'+    matchType r (EUVar i) t =+      -- For a variable, check that any previous match is the same.+      case lookup i r of+        Just t' -> if eqEType t t' then Just r else Nothing+        Nothing -> Just ((i, t) : r)+    matchType _ _ _ = Nothing++    -- Do substitution for EUVar.+    -- XXX similar to derefUVar+    substEUVar [] t = t+    substEUVar _ t@(EVar _) = t+    substEUVar s (EApp f a) = EApp (substEUVar s f) (substEUVar s a)+    substEUVar s t@(EUVar i) = fromMaybe t $ lookup i s+    substEUVar s (EForall iks t) = EForall iks (substEUVar s t)+    substEUVar _ _ = impossible+++-- Get the best matches.  These are the matches with the smallest substitution.+getBestMatches :: [(Int, (Expr, [EConstraint]))] -> [(Expr, [EConstraint])]+getBestMatches [] = []+getBestMatches ms =+  let b = minimum (map fst ms)         -- minimum substitution size+  in  [ ec | (s, ec) <- ms, s == b ]   -- pick out the smallest++-- Check that there are no unsolved constraints.+checkConstraints :: T ()+checkConstraints = do+  cs <- gets constraints+  case cs of+    [] -> return ()+    (i, t) : _ -> do+      t' <- derefUVar t+      --is <- gets instTable+      --traceM $ "Cannot satisfy constraint: " ++ unlines (map (\ (i, ii) -> showIdent i ++ ":\n" ++ showInstInfo ii) (M.toList is))+      tcError (getSLoc i) $ "Cannot satisfy constraint: " ++ showExpr t'++-- Add a type equality constraint.+addEqConstraint :: SLoc -> EType -> EType -> T ()+addEqConstraint loc t1 t2 = do+  d <- newIdent loc "dict"+  addConstraint d (mkEqType loc t1 t2)++mkEqType :: SLoc -> EType -> EType -> EConstraint+mkEqType loc t1 t2 = EApp (EApp (EVar (mkIdentSLoc loc nameTypeEq)) t1) t2++-- A quick hack for testing+solveEq :: TypeEqTable -> EType -> EType -> Maybe (Expr, [(EType, EType)])+--solveEq eqs t1 t2 | trace ("solveEq: " ++ show (t1,t2) ++ show eqs) False = undefined+solveEq eqs t1 t2 | t1 `eqEType` t2             = Just (ETuple [], [])+                  | elemBy eqTyTy (t1, t2) eqs = Just (ETuple [], [])+                  | otherwise =+  case (t1, t2) of+    (EApp f1 a1, EApp f2 a2) -> Just (ETuple [], [(f1, f2), (a1, a2)])+    _                         -> Nothing++-- Add the equality t1~t2.+-- The type table is always the symmetric&transitive closure of all equalities.+-- This isn't very efficient, but it's simple.+addTypeEq :: EType -> EType -> TypeEqTable -> TypeEqTable+addTypeEq t1 t2 aeqs | t1 `eqEType` t2 || elemBy eqTyTy (t1, t2) aeqs || elemBy eqTyTy (t2, t1) aeqs = aeqs+                     | otherwise = (t1, t2) : (t2, t1) :                   -- symmetry+                                  trans t1 t2 aeqs ++ trans t2 t1 aeqs ++  -- transitivity+                                  aeqs+  where trans a1 a2 eqs = [ (a1, b2) | (b1, b2) <- eqs, eqEType a2 b1 ]++eqTyTy :: (EType, EType) -> (EType, EType) -> Bool+eqTyTy (t1, t2) (u1, u2) = eqEType t1 u1 && eqEType t2 u2++---------------------++data SymTab a = SymTab (M.Map [a]) [(Ident, a)]+  --Xderiving(Show)+  +stLookup :: --forall a . --XShow a =>+            String -> Ident -> SymTab Entry -> Either String Entry+stLookup msg i (SymTab genv lenv) =+  case lookup i lenv of+    Just e -> Right e+    Nothing ->+      case M.lookup i genv of+        Just [e] -> Right e+        Just es  -> Left $ "ambiguous " ++ msg ++ ": " ++ showIdent i ++ " " ++ showListS (showIdent . getAppCon) [ e | Entry e _ <- es ]+        Nothing  -> Left $ "undefined " ++ msg ++ ": " ++ showIdent i+                           -- ++ "\n" ++ show lenv ++ "\n" ++ show genv++stFromListWith :: forall a . ([a] -> [a] -> [a]) -> [(Ident, [a])] -> SymTab a+stFromListWith comb ias = SymTab (M.fromListWith comb ias) []++stFromList :: forall a . [(Ident, [a])] -> SymTab a+stFromList ias = SymTab (M.fromList ias) []++stElemsLcl :: forall a . SymTab a -> [a]+stElemsLcl (SymTab _genv lenv) = map snd lenv++stInsertLcl :: forall a . Ident -> a -> SymTab a -> SymTab a+stInsertLcl i a (SymTab genv lenv) = SymTab genv ((i,a) : lenv)++-- XXX Use insertWith to follow Haskell semantics.+stInsertGlb :: forall a . Ident -> [a] -> SymTab a -> SymTab a+stInsertGlb i as (SymTab genv lenv) = SymTab (M.insert i as genv) lenv++-----------------------------+{-+showSymTab :: SymTab Entry -> String+showSymTab (SymTab im ies) = showListS showIdent (map fst (M.toList im) ++ map fst ies)++showTModuleExps :: TModule a -> String+showTModuleExps (TModule mn _fxs tys _syns _clss _insts vals _defs) =+  showIdent mn ++ ":\n" +++    unlines (map (("  " ++) . showValueExport) vals) +++    unlines (map (("  " ++) . showTypeExport)  tys)++showValueExport :: ValueExport -> String+showValueExport (ValueExport i (Entry qi t)) =+  showIdent i ++ " = " ++ showExpr qi ++ " :: " ++ showEType t++showTypeExport :: TypeExport -> String+showTypeExport (TypeExport i (Entry qi t) vs) =+  showIdent i ++ " = " ++ showExpr qi ++ " :: " ++ showEType t ++ " assoc=" ++ showListS showValueExport vs++showIdentClassInfo :: (Ident, ClassInfo) -> String+showIdentClassInfo (i, (_vks, _ctx, cc, ms)) =+  showIdent i ++ " :: " ++ showEType cc +++    " has " ++ showListS showIdent ms+-}
+ src/Text/ParserComb.hs view
@@ -0,0 +1,261 @@+-- Copyright 2023 Lennart Augustsson+-- See LICENSE file for full license.+{-# OPTIONS_GHC -Wno-type-defaults #-}+module Text.ParserComb(+  (>>=), (>>), pure,+  (<*), (*>), (<*>), (<$), (<$>),+  (<|>),+  fail, guard,+  get, put, modify,+  Prsr, runPrsr,+  satisfy, satisfyM, eof,+  choice,+  many, emany, optional, eoptional,+  some, esome,+  esepBy, sepBy1, esepBy1,+  esepEndBy, esepEndBy1,+  (<?>), (<|<),+  --notFollowedBy,+  lookAhead,+  inject, nextToken,+  LastFail(..),+  ) where+--Ximport Prelude()+import Prelude+import Control.Alternative+import Control.Monad --Xhiding(guard)++data LastFail t+  = LastFail Int [t] [String]+  --Xderiving (Show)++maxInt :: Int+maxInt = 1000000000++noFail :: forall t . LastFail t+noFail = LastFail maxInt [] []++longest :: forall t . LastFail t -> LastFail t -> LastFail t+longest lf1@(LastFail l1 t1 x1) lf2@(LastFail l2 _ x2) =+  if l1 < l2 then+    lf1+  else if l2 < l1 then+    lf2+  else+    LastFail l1 t1 (x1 ++ x2)++longests :: forall t . [LastFail t] -> LastFail t+longests xs = foldl1 longest xs++data Res s t a = Many [(a, ([t], s))] (LastFail t)+  --deriving (Show)++-- | +data Prsr s t a = P (([t], s) -> Res s t a)+--instance Show (Prsr s t a) where show _ = "<<Prsr>>"++runP :: forall s t a . Prsr s t a -> (([t], s) -> Res s t a)+runP (P p) = p++instance forall s t . Functor (Prsr s t) where+  fmap f p = P $ \ t ->+    case runP p t of+      Many aus lf -> Many [ (f a, u) | (a, u) <- aus ] lf++instance forall s t . Applicative (Prsr s t) where+  pure a = P $ \ t -> Many [(a, t)] noFail+  (<*>) = ap+  (*>) p k = p >>= \ _ -> k++instance forall s t . Monad (Prsr s t) where+  (>>=) p k = P $ \ t ->+    case runP p t of+      Many aus plf ->+        let { xss = [ runP (k a) u | au <- aus, let { (a, u) = au } ] }+        in  case unzip [ (rs, lf) | xs <- xss, let { Many rs lf = xs } ] of+              (rss, lfs) -> Many (concat rss) (longests (plf : lfs))+  return = pure++instance forall s t . MonadFail (Prsr s t) where+  fail m = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [m])++instance forall s t . Alternative (Prsr s t) where+  empty = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [])++  (<|>) p q = P $ \ t ->+    case runP p t of+      Many a lfa ->+        case runP q t of+          Many b lfb -> Many (a ++ b) (longest lfa lfb)++{-+pure :: forall s t a . a -> Prsr s t a+pure a = P $ \ t -> Many [(a, t)] noFail++infixl 1 >>=+(>>=) :: forall s t a b . Prsr s t a -> (a -> Prsr s t b) -> Prsr s t b+(>>=) p k = P $ \ t ->+    case runP p t of+      Many aus plf ->+        let { xss = [ runP (k a) u | au <- aus, let { (a, u) = au } ] }+        in  case unzip [ (rs, lf) | xs <- xss, let { Many rs lf = xs } ] of+              (rss, lfs) -> Many (concat rss) (longests (plf : lfs))++infixl 1 >>+(>>) :: forall s t a b . Prsr s t a -> Prsr s t b -> Prsr s t b+(>>) p k = p >>= \ _ -> k++infixl 4 <*>+(<*>) :: forall s t a b . Prsr s t (a -> b) -> Prsr s t a -> Prsr s t b+(<*>) m1 m2 = m1 >>= \ x1 -> m2 >>= \ x2 -> pure (x1 x2)++infixl 4 <*+(<*) :: forall s t a b . Prsr s t a -> Prsr s t b -> Prsr s t a+(<*) m1 m2 = m1 >>= \ x1 -> m2 >> pure x1++infixl 4 *>+(*>) :: forall s t a b . Prsr s t a -> Prsr s t b -> Prsr s t b+(*>) m1 m2 = m1 >> m2 >>= \ x2 -> pure x2++infixl 4 <$>+(<$>) :: forall s t a b . (a -> b) -> Prsr s t a -> Prsr s t b+(<$>) f p = P $ \ t ->+    case runP p t of+      Many aus lf -> Many [ (f a, u) | (a, u) <- aus ] lf++infixl 4 <$+(<$) :: forall s t a b . a -> Prsr s t b -> Prsr s t a+(<$) a p = p >> pure a++guard :: forall s t . Bool -> Prsr s t ()+guard b = if b then pure () else empty++empty :: forall s t a . Prsr s t a+empty = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [])++infixl 3 <|>+(<|>) :: forall s t a . Prsr s t a -> Prsr s t a -> Prsr s t a+(<|>) p q = P $ \ t ->+    case runP p t of+      Many a lfa ->+        case runP q t of+          Many b lfb -> Many (a ++ b) (longest lfa lfb)++fail :: forall s t a . String -> Prsr s t a+fail m = P $ \ (ts, _) -> Many [] (LastFail (length ts) (take 1 ts) [m])+-}++get :: forall s t . Prsr s t s+get = P $ \ t@(_, s) -> Many [(s, t)] noFail++put :: forall s t . s -> Prsr s t ()+put s = P $ \ (ts, _) -> Many [((), (ts, s))] noFail++modify :: forall s t . (s -> s) -> Prsr s t ()+modify f = get >>= \ s -> put (f s)++-- Left biased choice+infixl 3 <|<+(<|<) :: forall s t a . Prsr s t a -> Prsr s t a -> Prsr s t a+(<|<) p q = P $ \ t ->+  case runP p t of+    Many [] lfa ->+      case runP q t of+         Many b lfb -> Many b (longest lfa lfb)+    r -> r++{-+many :: forall s t a . Prsr s t a -> Prsr s t [a]+many p = some p <|> pure []++some :: forall s t a . Prsr s t a -> Prsr s t [a]+some p = (:) <$> p <*> many p+-}++optional :: forall s t a . Prsr s t a -> Prsr s t (Maybe a)+optional p = (Just <$> p) <|> pure Nothing++emany :: forall s t a . Prsr s t a -> Prsr s t [a]+emany p = esome p <|< pure []++esome :: forall s t a . Prsr s t a -> Prsr s t [a]+esome p = (:) <$> p <*> emany p++eoptional :: forall s t a . Prsr s t a -> Prsr s t (Maybe a)+eoptional p = (Just <$> p) <|< pure Nothing++runPrsr :: forall s t a . --X(Show a, Show s) =>+           s -> Prsr s t a -> [t] -> Either (LastFail t) [(a, s)]+runPrsr s (P p) f =+  case p (f, s) of+    Many [] lf -> Left lf+    Many xs _  -> Right [(a, snd x) | (a, x) <- xs ]++choice :: forall s t a . [Prsr s t a] -> Prsr s t a+choice [] = empty+choice ps = foldr1 (<|>) ps++satisfy :: forall s t . String -> (t -> Bool) -> Prsr s t t+satisfy msg f = P $ \ (acs, s) ->+  case acs of+    c:cs | f c -> Many [(c, (cs, s))] noFail+    _ -> Many [] (LastFail (length acs) (take 1 acs) [msg])++satisfyM :: forall s t a . String -> (t -> Maybe a) -> Prsr s t a+satisfyM msg f = P $ \ (acs, s) ->+  case acs of+    c:cs | Just a <- f c -> Many [(a, (cs, s))] noFail+    _ -> Many [] (LastFail (length acs) (take 1 acs) [msg])++eof :: forall s t . Prsr s t ()+eof = P $ \ t@(cs, _) ->+ if null cs then+   Many [((), t)] noFail+ else+   Many [] (LastFail (length cs) (take 1 cs) ["eof"])++infixl 9 <?>+(<?>) :: forall s t a . Prsr s t a -> String -> Prsr s t a+(<?>) p e = P $ \ t ->+--  trace ("<?> " ++ show e) $+  case runP p t of+    Many rs (LastFail l ts _) ->+      Many rs (LastFail l ts [e])++{-+notFollowedBy :: forall s t a . Prsr s t a -> Prsr s t ()+notFollowedBy p = P $ \ t@(ts,_) ->+  case runP p t of+    Many [] _ -> Many [((), t)] noFail+    _         -> Many [] (LastFail (length ts) (take 1 ts) ["!"])+-}++lookAhead :: forall s t a . Prsr s t a -> Prsr s t ()+lookAhead p = P $ \ t ->+  case runP p t of+    Many [] (LastFail l ts xs) -> Many [] (LastFail l (take 1 ts) xs)+    _                          -> Many [((), t)] noFail++nextToken :: forall s t . Prsr s t t+nextToken = P $ \ t@(cs, _) ->+  case cs of+    [] ->  Many [] (LastFail (length cs) [] ["!eof"])+    c:_ -> Many [(c, t)] noFail++inject :: forall s t . [t] -> Prsr s t ()+inject s = P $ \ (cs, st) -> Many [((), (s ++ cs, st))] noFail++sepBy1 :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+sepBy1 p sep = (:) <$> p <*> many (sep *> p)++esepBy1 :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepBy1 p sep = (:) <$> p <*> emany (sep *> p)++esepBy :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepBy p sep = esepBy1 p sep <|< pure []++esepEndBy :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepEndBy p sep = esepEndBy1 p sep <|< pure []++esepEndBy1 :: forall s t a sep . Prsr s t a -> Prsr s t sep -> Prsr s t [a]+esepEndBy1 p sep = (:) <$> p <*> ((sep *> esepEndBy p sep) <|< pure [])
+ src/runtime/config-micro-64.h view
@@ -0,0 +1,68 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 0++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 0++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 0++/*+ * Number of bits in a word.  Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1.  If no bit is set, it should return 0.+ */+#define FFS ffsl++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ */+/* #define PCOMMA "'" */+++/*+ * Get a raw input character.+ * If undefined, the default always returns -1+ */+/* #define GETRAW */+++/*+ * Get time since some epoch in milliseconds.+ */+/* #define GETTIMEMILLI */+++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s) */+/* #define ERR1(s,a) */++#define GCRED    0              /* do some reductions during GC */+#define FASTTAGS 1              /* compute tag by pointer subtraction */+#define INTTABLE 1              /* use fixed table of small INT nodes */+#define SANITY   0              /* do some sanity checks */+#define STACKOVL 0              /* check for stack overflow */+
+ src/runtime/config-mingw-64.h view
@@ -0,0 +1,53 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 1++/*+ * Number of bits in a word.  Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1.  If no bit is set, it should return 0.+ */+#define FFS __builtin_ffsll++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ */+/* #define PCOMMA "'" */++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s,a) */+/* #define ERR1(s,a) */++#define GCRED    1              /* do some reductions during GC */+#define FASTTAGS 1              /* compute tag by pointer subtraction */+#define INTTABLE 1              /* use fixed table of small INT nodes */+#define SANITY   1              /* do some sanity checks */+#define STACKOVL 1              /* check for stack overflow */
+ src/runtime/config-unix-64.h view
@@ -0,0 +1,140 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 1++/*+ * Number of bits in a word.  Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1.  If no bit is set, it should return 0.+ */+#define FFS ffsl++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ */+/* #define PCOMMA "'" */+++#include <termios.h>+#include <sys/types.h>+#include <unistd.h>+#include <string.h>+#include <stdlib.h>+#include <fcntl.h>++/*+ * Set the terminal in raw mode and read a single character.+ * Return this character, or -1 on any kind of failure.+ */+static int+getraw(void)+{+  struct termios old, new;+  char c;+  int r;+  +  if (tcgetattr(0, &old))+    return -1;+  cfmakeraw(&new);+  if (tcsetattr(0, TCSANOW, &new))+    return -1;+  r = read(0, &c, 1);+  (void)tcsetattr(0, TCSANOW, &old);+  if (r == 1)+    return c;+  else+    return -1;+}+/*+ * Get a raw input character.+ * If undefined, the default always returns -1+ */+#define GETRAW getraw++/*+ * Get time since some epoch in milliseconds.+ */+#include <sys/time.h>+uint64_t+gettimemilli(void)+{+  struct timeval tv;+  (void)gettimeofday(&tv, NULL);+  return tv.tv_sec * 1000 + tv.tv_usec / 1000;+}+#define GETTIMEMILLI gettimemilli++/*+ * Create a unique file name.+ * This is a very dodgy implementation.+ * XXX This functions drags in a lot of functionality.+ */+char*+tmpname(const char* pre, const char* suf)+{+  int pid = (int)getpid();+  char *tmp = getenv("TMPDIR");+  if (!tmp)+    tmp = "/tmp";+  char *s = malloc(strlen(tmp) + 1 + strlen(pre) + 5 + strlen(suf) + 1);+  /* This might loop forever.  See if I care. :) */+  for(;;) {+    strcpy(s, tmp);+    strcat(s, "/");+    strcat(s, pre);+    /* Insert 8 digits of the PID */+    char *p = s + strlen(s) + 10;+    *p-- = 0;+    for(int i = 0; i < 10; i++) {+      *p-- = pid % 10 + '0';+      pid /= 10;+    }+    strcat(s, suf);+    /* The file name is ready, do a quick if check that we can create it */+    int fd = open(s, O_CREAT | O_EXCL, 0600);+    if (fd >= 0) {+      close(fd);                /* Close it again */+      return s;+    }+    pid++;                      /* try with a different pid */+  }+}+#define TMPNAME tmpname++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s) */+/* #define ERR1(s,a) */++#define GCRED    1              /* do some reductions during GC */+#define FASTTAGS 1              /* compute tag by pointer subtraction */+#define INTTABLE 1              /* use fixed table of small INT nodes */+#define SANITY   1              /* do some sanity checks */+#define STACKOVL 1              /* check for stack overflow */
+ src/runtime/config-windows-64.h view
@@ -0,0 +1,101 @@+/*+ * Various platform specific configuration.+ */++/*+ * Include stdio functions.+ * Without this none of the file I/O in System.IO is available.+ */+#define WANT_STDIO 1++/*+ * Include ops for floating point arithmetic.+ * Without this +,-,* etc will not be available for the Double type.+ */+#define WANT_FLOAT 1++/*+ * Include <math.h>+ * Without this, exp,sin, etc are not available.+ */+#define WANT_MATH 1++/*+ * Number of bits in a word.  Only 32 and 64 are supported.+ */+#define WORD_SIZE 64++/*+ * Find First Set+ * This macro must be defined.+ * It return the number of the least significant bit that is set.+ * Numberings starts from 1.  If no bit is set, it should return 0.+ */+#include <intrin.h>+//#pragma warning(disable : 4996)+#pragma intrinsic(_BitScanForward64)+static inline int+FFS(int64_t arg)+{+  unsigned long r;+  if (_BitScanForward64(&r, arg))+    return (int)(r+1);+  else+    return 0;+}++/*+ * This is the character used for comma-separation in printf.+ * Defaults to "'".+ * Windows does not support this.+ */+#define PCOMMA ""++/*+ * Get a raw input character.+ * If undefined, the default always returns -1+ */+/* #define GETRAW getraw */++/*+ * Get time since some epoch in milliseconds.+ * If undefined, return 0.+ */+#define GETTIMEMILLI gettimemilli+#define WIN32_LEAN_AND_MEAN+#include <Windows.h>++uint64_t+gettimemilli(void)+{+    static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL);++    SYSTEMTIME  system_time;+    FILETIME    file_time;+    uint64_t    time, msec;++    GetSystemTime( &system_time );+    SystemTimeToFileTime( &system_time, &file_time );+    time =  ((uint64_t)file_time.dwLowDateTime )      ;+    time += ((uint64_t)file_time.dwHighDateTime) << 32;++    msec = (time - EPOCH) / 10000L;+    //msec = time + system_time.wMilliseconds;+    return msec;+}++/* Make this empty */+#define NORETURN++/*+ * The ERR macro should report an error and exit.+ * If not defined, a generic one will be used.+ */+/* #define ERR(s) */+/* #define ERR1(s,a) */++#define GCRED    1              /* do some reductions during GC */+#define FASTTAGS 1              /* compute tag by pointer subtraction */+#define INTTABLE 1              /* use fixed table of small INT nodes */+#define SANITY   1              /* do some sanity checks */+#define STACKOVL 1              /* check for stack overflow */
+ src/runtime/eval.c view
@@ -0,0 +1,2388 @@+/* Copyright 2023 Lennart Augustsson+ * See LICENSE file for full license.+ */+#include <inttypes.h>++#include "config-unix-64.h"+//#include "config-micro-64.h"++#if WANT_STDIO+#include <stdio.h>+#include <locale.h>+#endif  /* WANT_STDIO */+#include <stdlib.h>+#include <string.h>+#include <ctype.h>+#include <setjmp.h>+#if WANT_MATH+#include <math.h>+#endif  /* WANT_MATH */++#define VERSION "v5.1\n"++typedef intptr_t value_t;       /* Make value the same size as pointers, since they are in a union */+#define PRIvalue PRIdPTR+typedef uintptr_t uvalue_t;     /* Make unsigned value the same size as pointers, since they are in a union */+#define PRIuvalue PRIuPTR+typedef uintptr_t heapoffs_t;   /* Heap offsets */+#define PRIheap PRIuPTR+typedef uintptr_t tag_t;        /* Room for tag, low order bit indicates AP/not-AP */+typedef intptr_t stackptr_t;    /* Index into stack */+/* These types can be changed for 32 bit platforms. */+typedef uint64_t counter_t;     /* Statistics counter, can be smaller since overflow doesn't matter */+#define PRIcounter PRIu64+typedef uint64_t bits_t;        /* One word of bits */++/* We cast all FFI functions to this type.  It's reasonably portable */+typedef void (*funptr_t)(void);++#if !defined(PCOMMA)+#define PCOMMA "'"+#endif  /* !defined(PCOMMA) */++#if !defined(GETRAW)+int GETRAW(void) { return -1; }+#endif  /* !defined(getraw) */++#if !defined(GETTIMEMILLI)+uint64_t GETTIMEMILLI(void) { return 0; }+#endif  /* !define(GETTIMEMILLI) */++#if !defined(TMPNAME)+char* TMPNAME(const char* pre, const char* post) {+  char *s = malloc(strlen(pre) + 3 + strlen(post) + 1);+  strcpy(s, pre);+  strcat(s, "TMP");+  strcat(s, post);+  return s;+}+#endif++#if !defined(INLINE)+#define INLINE inline+#endif  /* !define(INLINE) */++#if !defined(NORETURN)+#define NORETURN __attribute__ ((noreturn))+#endif /* !defined(NORETURN) */++/***************************************/++/* Keep permanent nodes for LOW_INT <= i < HIGH_INT */+#define LOW_INT (-10)+#define HIGH_INT 256++#define HEAP_CELLS 50000000+#define STACK_SIZE 100000++#if !defined(ERR)+#if WANT_STDIO+#define ERR(s)    do { fprintf(stderr,"ERR: "s"\n");   exit(1); } while(0)+#define ERR1(s,a) do { fprintf(stderr,"ERR: "s"\n",a); exit(1); } while(0)+#else  /* WANT_STDIO */+#define ERR(s) exit(1)+#define ERR1(s,a) exit(1)+#endif  /* WANT_STDIO */+#endif  /* !define(ERR) */++enum node_tag { T_FREE, T_IND, T_AP, T_INT, T_DBL, T_PTR, T_BADDYN, T_S, T_K, T_I, T_B, T_C,+                T_A, T_Y, T_SS, T_BB, T_CC, T_P, T_R, T_O, T_U, T_Z,+                T_ADD, T_SUB, T_MUL, T_QUOT, T_REM, T_SUBR, T_UQUOT, T_UREM, T_NEG,+                T_AND, T_OR, T_XOR, T_INV, T_SHL, T_SHR, T_ASHR,+                T_EQ, T_NE, T_LT, T_LE, T_GT, T_GE, T_ULT, T_ULE, T_UGT, T_UGE,+                T_TOPTR, T_TOINT, T_TODBL,+#if WANT_FLOAT+                T_FADD, T_FSUB, T_FMUL, T_FDIV, T_FNEG, T_ITOF,+                T_FEQ, T_FNE, T_FLT, T_FLE, T_FGT, T_FGE, T_FSHOW, T_FREAD,+#endif+                T_ERROR, T_NODEFAULT, T_NOMATCH, T_SEQ, T_EQUAL, T_COMPARE, T_RNF,+                T_IO_BIND, T_IO_THEN, T_IO_RETURN,+                T_IO_SERIALIZE, T_IO_DESERIALIZE,+                T_IO_STDIN, T_IO_STDOUT, T_IO_STDERR, T_IO_GETARGS, T_IO_DROPARGS,+                T_IO_PERFORMIO, T_IO_GETTIMEMILLI, T_IO_PRINT, T_IO_CATCH,+                T_IO_CCALL, T_DYNSYM,+                T_NEWCASTRING, T_PEEKCASTRING,+                T_STR,+                T_LAST_TAG,+};+const char* tag_names[] = {+  "FREE", "IND", "AP", "INT", "DBL", "PTR", "BADDYN", "S", "K", "I", "B", "C",+  "A", "Y", "SS", "BB", "CC", "P", "R", "O", "U", "Z",+  "ADD", "SUB", "MUL", "QUOT", "REM", "SUBR", "UQUOT", "UREM", "NEG",+  "AND", "OR", "XOR", "INV", "SHL", "SHR", "ASHR",+  "EQ", "NE", "LT", "LE", "GT", "GE", "ULT", "ULE", "UGT", "UGE",+  "TOPTR", "TOINT", "TODBL",+#if WANT_FLOAT+  "FADD", "FSUB", "FMUL", "FDIV", "FNEG", "ITOF",+  "FEQ", "FNE", "FLT", "FLE", "FGT", "FGE", "FSHOW", "FREAD",+#endif+  "ERROR", "NODEFAULT", "NOMATCH", "SEQ", "EQUAL", "COMPARE", "RNF",+  "IO_BIND", "IO_THEN", "IO_RETURN",+  "IO_SERIALIZE", "IO_DESERIALIZE",+  "IO_STDIN", "IO_STDOUT", "IO_STDERR", "IO_GETARGS", "IO_DROPARGS",+  "IO_PERFORMIO", "IO_GETTIMEMILLI", "IO_PRINT", "IO_CATCH",+  "IO_CCALL", "DYNSYM",+  "NEWCASTRING", "PEEKCASTRING",+  "STR",+  "LAST_TAG",+};++typedef struct node {+  union {+    struct node *uufun;+    tag_t        uutag;             /* LSB=1 indicates that this is a tag, LSB=0 that this is a T_AP node */+  } ufun;+  union {+    struct node *uuarg;+    value_t      uuvalue;+    double       uudoublevalue;+    const char  *uustring;+    void        *uuptr;+  } uarg;+} node;+typedef struct node* NODEPTR;+#define NIL 0+#define HEAPREF(i) &cells[(i)]+#define GETTAG(p) ((p)->ufun.uutag & 1 ? (int)((p)->ufun.uutag >> 1) : T_AP)+#define SETTAG(p,t) do { if (t != T_AP) (p)->ufun.uutag = ((t) << 1) + 1; } while(0)+#define GETVALUE(p) (p)->uarg.uuvalue+#define GETDBLVALUE(p) (p)->uarg.uudoublevalue+#define SETVALUE(p,v) (p)->uarg.uuvalue = v+#define SETDBLVALUE(p,v) (p)->uarg.uudoublevalue = v+#define FUN(p) (p)->ufun.uufun+#define ARG(p) (p)->uarg.uuarg+#define STR(p) (p)->uarg.uustring+#define PTR(p) (p)->uarg.uuptr+#define INDIR(p) ARG(p)+#define NODE_SIZE sizeof(node)+#define ALLOC_HEAP(n) do { cells = malloc(n * sizeof(node)); memset(cells, 0x55, n * sizeof(node)); } while(0)+#define LABEL(n) ((heapoffs_t)((n) - cells))+node *cells;                 /* All cells */++counter_t num_reductions = 0;+counter_t num_alloc;+counter_t num_gc = 0;+uint64_t gc_mark_time = 0;+uint64_t run_time = 0;++NODEPTR *stack;+stackptr_t stack_ptr = -1;+#if STACKOVL+#define PUSH(x) do { if (stack_ptr >= stack_size-1) ERR("stack overflow"); stack[++stack_ptr] = (x); } while(0)+#else  /* SANITY */+#define PUSH(x) do {                                                        stack[++stack_ptr] = (x); } while(0)+#endif  /* SANITY */+#define TOP(n) stack[stack_ptr - (n)]+#define POP(n) stack_ptr -= (n)+#define GCCHECK(n) gc_check((n))++heapoffs_t heap_size = HEAP_CELLS; /* number of heap cells */+heapoffs_t heap_start;             /* first location in heap that needs GC */+stackptr_t stack_size = STACK_SIZE;++counter_t num_marked;+counter_t max_num_marked = 0;+counter_t num_free;++#define BITS_PER_WORD (sizeof(bits_t) * 8)+bits_t *free_map;             /* 1 bit per node, 0=free, 1=used */+heapoffs_t free_map_nwords;+heapoffs_t next_scan_index;++NORETURN+void+memerr(void)+{+  ERR("Out of memory");+  exit(1);+}++/***************** BFILE *******************/++/* BFILE will have different implementations, they all have these methods */+typedef struct BFILE {+  int (*getb)(struct BFILE*);+  void (*ungetb)(int c, struct BFILE*);+  void (*closeb)(struct BFILE*);+} BFILE;++/*** BFILE from static buffer ***/+struct BFILE_buffer {+  BFILE    mets;+  size_t   b_size;+  size_t   b_pos;+  uint8_t  *b_buffer;+};++int+getb_buf(BFILE *bp)+{+  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;+  if (p->b_pos >= p->b_size)+    return -1;+  return p->b_buffer[p->b_pos++];+}++void+ungetb_buf(int c, BFILE *bp)+{+  struct BFILE_buffer *p = (struct BFILE_buffer *)bp;+  if (p->b_pos == 0)+    ERR("ungetb");+  p->b_buffer[--p->b_pos] = (uint8_t)c;+}++void+closeb_buf(BFILE *bp)+{+  (void)bp;                     /* shut up warning */+}++#if WANT_STDIO+/*** BFILE via FILE ***/+struct BFILE_file {+  BFILE    mets;+  FILE    *file;+};++int+getb_file(BFILE *bp)+{+  struct BFILE_file *p = (struct BFILE_file *)bp;+  return fgetc(p->file);+}++void+ungetb_file(int c, BFILE *bp)+{+  struct BFILE_file *p = (struct BFILE_file *)bp;+  ungetc(c, p->file);+}++void+closeb_file(BFILE *bp)+{+  struct BFILE_file *p = (struct BFILE_file *)bp;+  free(p);+}++BFILE *+openb_FILE(FILE *f)+{+  struct BFILE_file *p = malloc(sizeof (struct BFILE_file));+  if (!p)+    memerr();+  p->mets.getb   = getb_file;+  p->mets.ungetb = ungetb_file;+  p->mets.closeb = closeb_file;+  p->file = f;+  return (BFILE*)p;+}+#endif++/*** BFILE via simple LZW decompression ***/++#define DICTSIZE 4096+#define ASCIISIZE 96            /* ' ' - '~', '\n' */++struct BFILE_lzw {+  BFILE    mets;+  BFILE    *bfile;              /* underlying BFILE */+  int      unget;               /* storage for a single ungetb */+  char     *table[DICTSIZE];    /* dictionary */+  int      table_size;          /* next dictionary slot */+  char     *ptr;                /* pointer into output string */+  int      old;                 /* previous code word */+  int      ch;                  /* previous first character */+  char     buf[DICTSIZE+1];     /* buffer holding output string */+  int      rdstate;             /* state of 3 bytes to 2 codewords transducer */+  int      rdres;               /* saved transducer bits */+};++/* Get a code word.  It's 12 bits, so 2 codewords are spread over 3 bytes.+ * XXX This has 4096 hardcoded.+*/+int+getcode_lzw(struct BFILE_lzw *p)+{+  int r;++  if (p->rdstate == 0) {+    r = p->bfile->getb(p->bfile);+    if (r < 0)+      return -1;+    r |= p->bfile->getb(p->bfile) << 8;+    p->rdres = r >> 12;         /* save 4 bits */+    p->rdstate = 1;+    return r & 0xfff;+  } else {+    r = p->rdres;+    r |= p->bfile->getb(p->bfile) << 4;+    p->rdstate = 0;+    return r;+  }+}++char *+str_lzw(const char *s, int c)+{+  int l = strlen(s);+  char *p = malloc(l + 1 + 1);+  if (!p)+    memerr();+  strcpy(p, s);+  p[l] = c;+  p[l+1] = '\0';+  return p;+}++int+getb_lzw(BFILE *bp)+{+  struct BFILE_lzw *p = (struct BFILE_lzw*)bp;+  char *s;+  int c, n;++  /* Do we have an ungetb character? */+  if (p->unget) {+    c = p->unget;+    p->unget = 0;+    return c;+  }+  /* Are we in the middle of emitting a string? */+  if (p->ptr) {+    c = *p->ptr++;+    if (c) {+      //printf("c='%c'\n", c);+      return c;+    }+    p->ptr = 0;+  }+  n = getcode_lzw(p);+  if (n < 0)+    return -1;+  if (n >= DICTSIZE)+    ERR("getcode_lzw 1");+  s = p->table[n];+  if (!s) {+    char *os = p->table[p->old];+    strcpy(p->buf, os);+    int l = strlen(os);+    p->buf[l++] = p->ch;+    p->buf[l] = '\0';+  } else {+    strcpy(p->buf, s);+  }+  p->ptr = p->buf;+  p->ch = p->buf[0];+  if (p->table_size < DICTSIZE) {+    p->table[p->table_size++] = str_lzw(p->table[p->old], p->ch);+  }+  p->old = n;+  return *p->ptr++;+}++void+ungetb_lzw(int c, BFILE *bp)+{+  struct BFILE_lzw *p = (struct BFILE_lzw*)bp;+  if (p->unget)+    ERR("ungetb_lzw");+  p->unget = c;+}++void+closeb_lzw(BFILE *bp)+{+  struct BFILE_lzw *p = (struct BFILE_lzw*)bp;++  for (int i = 0; i < DICTSIZE; i++) {+    if (p->table[i])+      free(p->table[i]);+  }+  p->bfile->closeb(p->bfile);+  free(p);+}++BFILE *+add_lzw_decompressor(BFILE *file)+{+  struct BFILE_lzw *p = calloc(1, sizeof(struct BFILE_lzw));+  int i;+  +  if (!p)+    memerr();+  p->mets.getb = getb_lzw;+  p->mets.ungetb = ungetb_lzw;+  p->mets.closeb = closeb_lzw;+  p->bfile = file;++  /* initialize dictionary with printable ASCII */+  for(i = 0; i < ASCIISIZE-1; i++) {+    p->table[i] = str_lzw("", i + ' ');+  }+  p->table[i++] = str_lzw("", '\n');+  p->table_size = i;++  /* set up decompressore state */+  p->old = getcode_lzw(p);+  strcpy(p->buf, p->table[p->old]);+  p->ch = p->buf[0];+  p->ptr = p->buf;+  +  return (BFILE *)p;+}++/*****************************************************************************/++struct handler {+  jmp_buf         hdl_buf;      /* env storage */+  struct handler *hdl_old;      /* old handler */+  stackptr_t      hdl_stack;    /* old stack pointer */+  NODEPTR         hdl_exn;      /* used temporarily to pass the exception value */+} *cur_handler = 0;++/* Set FREE bit to 0 */+static INLINE void mark_used(NODEPTR n)+{+  heapoffs_t i = LABEL(n);+  if (i < heap_start)+    return;+#if SANITY+  if (i >= free_map_nwords * BITS_PER_WORD) ERR("mark_used");+#endif+  free_map[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));+}++/* Test if FREE bit is 0 */+static INLINE int is_marked_used(NODEPTR n)+{+  heapoffs_t i = LABEL(n);+  if (i < heap_start)+    return 1;+#if SANITY+  if (i >= free_map_nwords * BITS_PER_WORD) ERR("is_marked_used");;+#endif+  return (free_map[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) == 0;+}++static INLINE void mark_all_free(void)+{+  memset(free_map, ~0, free_map_nwords * sizeof(bits_t));+  next_scan_index = heap_start;+}++int glob_argc;+char **glob_argv;++int verbose = 0;++static INLINE NODEPTR+alloc_node(enum node_tag t)+{+#if SANITY+  if (num_free <= 0)+    ERR("alloc_node");+#endif++  heapoffs_t i = next_scan_index / BITS_PER_WORD;+  int k;                        /* will contain bit pos + 1 */+  for(;;) {+    heapoffs_t word = free_map[i];+    k = FFS(word);+    if (k)+      break;+    i++;+#if SANITY+    if (i >= free_map_nwords)+      ERR("alloc_node free_map");+#endif+  }+  heapoffs_t pos = i * BITS_PER_WORD + k - 1; /* first free node */+  NODEPTR n = HEAPREF(pos);+  mark_used(n);+  next_scan_index = pos;++  SETTAG(n, t);+  num_alloc++;+  num_free--;+  return n;+}++static INLINE NODEPTR+new_ap(NODEPTR f, NODEPTR a)+{+  NODEPTR n = alloc_node(T_AP);+  FUN(n) = f;+  ARG(n) = a;+  return n;+}++/* Needed during reduction */+NODEPTR intTable[HIGH_INT - LOW_INT];+NODEPTR combFalse, combTrue, combUnit, combCons;+NODEPTR combCC, combZ, combIOBIND;+NODEPTR combLT, combEQ, combGT;++/* One node of each kind for primitives, these are never GCd. */+/* We use linear search in this, because almost all lookups+ * are among the combinators.+ */+struct {+  char *name;+  enum node_tag tag;+  NODEPTR node;+} primops[] = {+  /* combinators */+  /* sorted by frequency in a typical program */+  { "B", T_B },+  { "O", T_O },+  { "K", T_K },+  { "C'", T_CC },+  { "C", T_C },+  { "A", T_A },+  { "S'", T_SS },+  { "P", T_P },+  { "R", T_R },+  { "I", T_I },+  { "S", T_S },+  { "U", T_U },+  { "Y", T_Y },+  { "B'", T_BB },+  { "Z", T_Z },+  /* primops */+  { "+", T_ADD },+  { "-", T_SUB },+  { "*", T_MUL },+  { "quot", T_QUOT },+  { "rem", T_REM },+  { "uquot", T_UQUOT },+  { "urem", T_UREM },+  { "subtract", T_SUBR },+  { "neg", T_NEG },+  { "and", T_AND },+  { "or", T_OR },+  { "xor", T_XOR },+  { "inv", T_INV },+  { "shl", T_SHL },+  { "shr", T_SHR },+  { "ashr", T_ASHR },+#if WANT_FLOAT+  { "fadd" , T_FADD},+  { "fsub" , T_FSUB},+  { "fmul" , T_FMUL},+  { "fdiv", T_FDIV},+  { "fneg", T_FNEG},+  { "itof", T_ITOF},+  { "feq", T_FEQ},+  { "fne", T_FNE},+  { "flt", T_FLT},+  { "fle", T_FLE},+  { "fgt", T_FGT},+  { "fge", T_FGE},+  { "fshow", T_FSHOW},+  { "fread", T_FREAD},+#endif  /* WANT_FLOAT */+  { "==", T_EQ },+  { "/=", T_NE },+  { "<", T_LT },+  { "u<", T_ULT },+  { "u<=", T_ULE },+  { "u>", T_UGT },+  { "u>=", T_UGE },+  { "<=", T_LE },+  { ">", T_GT },+  { ">=", T_GE },+  { "seq", T_SEQ },+  { "error", T_ERROR },+  { "noDefault", T_NODEFAULT },+  { "noMatch", T_NOMATCH },+  { "equal", T_EQUAL },+  { "compare", T_COMPARE },+  { "rnf", T_RNF },+  /* IO primops */+  { "IO.>>=", T_IO_BIND },+  { "IO.>>", T_IO_THEN },+  { "IO.return", T_IO_RETURN },+  { "IO.serialize", T_IO_SERIALIZE },+  { "IO.print", T_IO_PRINT },+  { "IO.deserialize", T_IO_DESERIALIZE },+  { "IO.stdin", T_IO_STDIN },+  { "IO.stdout", T_IO_STDOUT },+  { "IO.stderr", T_IO_STDERR },+  { "IO.getArgs", T_IO_GETARGS },+  { "IO.dropArgs", T_IO_DROPARGS },+  { "IO.getTimeMilli", T_IO_GETTIMEMILLI },+  { "IO.performIO", T_IO_PERFORMIO },+  { "IO.catch", T_IO_CATCH },+  { "dynsym", T_DYNSYM },+  { "newCAString", T_NEWCASTRING },+  { "peekCAString", T_PEEKCASTRING },+  { "toPtr", T_TOPTR },+  { "toInt", T_TOINT },+  { "toDbl", T_TODBL },+};++void+init_nodes(void)+{+  ALLOC_HEAP(heap_size);+  free_map_nwords = (heap_size + BITS_PER_WORD - 1) / BITS_PER_WORD; /* bytes needed for free map */+  free_map = malloc(free_map_nwords * sizeof(bits_t));+  if (!free_map)+    memerr();++  /* Set up permanent nodes */+  heap_start = 0;+#if !FASTTAGS+  for (int j = 0; j < sizeof primops / sizeof primops[0];j++) {+    NODEPTR n = HEAPREF(heap_start++);+    primops[j].node = n;+    //MARK(n) = MARKED;+    SETTAG(n, primops[j].tag);+    switch (primops[j].tag) {+    case T_K: combFalse = n; break;+    case T_A: combTrue = n; break;+    case T_I: combUnit = n; break;+    case T_O: combCons = n; break;+    case T_CC: combCC = n; break;+    case T_Z: combZ = n; break;+    case T_IO_BIND: combIOBIND = n; break;+#if WANT_STDIO+    case T_IO_STDIN:  SETTAG(n, T_PTR); PTR(n) = stdin;  break;+    case T_IO_STDOUT: SETTAG(n, T_PTR); PTR(n) = stdout; break;+    case T_IO_STDERR: SETTAG(n, T_PTR); PTR(n) = stderr; break;+#endif  /* WANT_STDIO */+    default:+      break;+    }+  }+#else+  for(enum node_tag t = T_FREE; t < T_LAST_TAG; t++) {+    NODEPTR n = HEAPREF(heap_start++);+    SETTAG(n, t);+    switch (t) {+    case T_K: combFalse = n; break;+    case T_A: combTrue = n; break;+    case T_I: combUnit = n; break;+    case T_O: combCons = n; break;+    case T_CC: combCC = n; break;+    case T_Z: combZ = n; break;+    case T_IO_BIND: combIOBIND = n; break;+#if WANT_STDIO+    case T_IO_STDIN:  SETTAG(n, T_PTR); PTR(n) = stdin;  break;+    case T_IO_STDOUT: SETTAG(n, T_PTR); PTR(n) = stdout; break;+    case T_IO_STDERR: SETTAG(n, T_PTR); PTR(n) = stderr; break;+#endif+    default:+      break;+    }+    for (int j = 0; j < sizeof primops / sizeof primops[0];j++) {+      if (primops[j].tag == t) {+        primops[j].node = n;+      }+    }+  }+#endif++  /* The representation of the constructors of+   *  data Ordering = LT | EQ | GT+   * do not have single constructors.+   * But we can make compound one, since they are irreducible.+   */+#define NEWAP(c, f, a) do { NODEPTR n = HEAPREF(heap_start++); SETTAG(n, T_AP); FUN(n) = (f); ARG(n) = (a); (c) = n;} while(0)+  NEWAP(combLT, combZ,     combFalse);  /* Z B */+  NEWAP(combEQ, combFalse, combFalse);  /* K K */+  NEWAP(combGT, combFalse, combTrue);   /* K A */+#undef NEWAP++#if INTTABLE+  /* Allocate permanent Int nodes */+  for (int i = LOW_INT; i < HIGH_INT; i++) {+    NODEPTR n = HEAPREF(heap_start++);+    intTable[i - LOW_INT] = n;+    SETTAG(n, T_INT);+    SETVALUE(n, i);+  }+#endif++  /* Round up heap_start to the next bitword boundary to avoid the permanent nodes. */+  heap_start = (heap_start + BITS_PER_WORD - 1) / BITS_PER_WORD * BITS_PER_WORD;++  mark_all_free();++  num_free = heap_size - heap_start;+}++#if GCRED+int red_a, red_k, red_i, red_int;+#endif++//counter_t mark_depth;++/* Mark all used nodes reachable from *np */+void+mark(NODEPTR *np)+{+  NODEPTR n;+#if GCRED+  value_t i;+#endif++  //  mark_depth++;+  //  if (mark_depth % 10000 == 0)+  //    printf("mark depth %"PRIcounter"\n", mark_depth);+  top:+  n = *np;+  if (GETTAG(n) == T_IND) {+#if SANITY+    int loop = 0;+    /* Skip indirections, and redirect start pointer */+    while (GETTAG(n) == T_IND) {+      //      printf("*"); fflush(stdout);+      n = INDIR(n);+      if (loop++ > 10000000) {+        //printf("%p %p %p\n", n, INDIR(n), INDIR(INDIR(n)));+        ERR("IND loop");+      }+    }+    //    if (loop)+    //      printf("\n");+#else  /* SANITY */+    while (GETTAG(n) == T_IND) {+      n = INDIR(n);+    }+#endif  /* SANITY */+    *np = n;+  }+  if (is_marked_used(n)) {+    //    mark_depth--;+    return;+  }+  num_marked++;+  mark_used(n);+#if GCRED+  /* This is really only fruitful just after parsing.  It can be removed. */+  if (GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_AP && GETTAG(FUN(FUN(n))) == T_A) {+    /* Do the A x y --> y reduction */+    NODEPTR y = ARG(n);+    SETTAG(n, T_IND);+    INDIR(n) = y;+    red_a++;+    goto top;+  }+#if 0+  /* This never seems to happen */+  if (GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_AP && GETTAG(FUN(FUN(n))) == T_K) {+    /* Do the K x y --> x reduction */+    NODEPTR x = ARG(FUN(n));+    SETTAG(n, T_IND);+    INDIR(n) = x;+    red_k++;+    goto top;+  }+#endif+  if (GETTAG(n) == T_AP && GETTAG(FUN(n)) == T_I) {+    /* Do the I x --> x reduction */+    NODEPTR x = ARG(n);+    SETTAG(n, T_IND);+    INDIR(n) = x;+    red_i++;+    goto top;+  }+#if INTTABLE+  if (GETTAG(n) == T_INT && LOW_INT <= (i = GETVALUE(n)) && i < HIGH_INT) {+    SETTAG(n, T_IND);+    INDIR(n) = intTable[i - LOW_INT];+    red_int++;+    goto top;+  }+#endif  /* INTTABLE */+#endif  /* GCRED */+  if (GETTAG(n) == T_AP) {+#if 1+    mark(&FUN(n));+    //mark(&ARG(n));+    np = &ARG(n);+    goto top;                   /* Avoid tail recursion */+#else+    mark(&ARG(n));+    np = &FUN(n);+    goto top;                   /* Avoid tail recursion */+#endif+  }+}++/* Perform a garbage collection:+   - First mark from all roots; roots are on the stack.+*/+void+gc(void)+{+  num_gc++;+  num_marked = 0;+#if WANT_STDIO+  if (verbose > 1)+    fprintf(stderr, "gc mark\n");+#endif+  gc_mark_time -= GETTIMEMILLI();+  mark_all_free();+  //  mark_depth = 0;+  for (stackptr_t i = 0; i <= stack_ptr; i++)+    mark(&stack[i]);+  gc_mark_time += GETTIMEMILLI();++  if (num_marked > max_num_marked)+    max_num_marked = num_marked;+  num_free = heap_size - heap_start - num_marked;+  if (num_free < heap_size / 50)+    ERR("heap exhausted");+#if WANT_STDIO+  if (verbose > 1)+    fprintf(stderr, "gc done, %"PRIcounter" free\n", num_free);+#endif  /* !WANT_STDIO */+}++/* Check that there are k nodes available, if not then GC. */+static INLINE void+gc_check(size_t k)+{+  if (k < num_free)+    return;+#if WANT_STDIO+  if (verbose > 1)+    fprintf(stderr, "gc_check: %d\n", (int)k);+#endif+  gc();+}++/*+ * Table of FFI callable functions.+ * (For a more flexible solution use dlopen()/dlsym()/dlclose())+ * The table contains the information needed to do the actual call.+ *   V    void+ *   I    value_t+ *   i    int+ *   D    double+ *   P    void*+ * The types are+ *   V    void    name(void)+ *   i    int     name(void)+ *   I    value_t name(voi)+ *   IV   void    name(value_t)+ *   II   value_t name(value_t)+ *   IIV  void    name(value_t, value_t)+ *   III  value_t name(value_t, value_t)+ *   DD   double  name(double)+ *   Pi   int     name(void*)+ *   PI   value_t name(void*)+ *   PP   void*   name(void*)+ *   iPi  int     name(int, void*)+ *   PPI  value_t name(void*, void*)+ *   PPP  void*   name(void*, void*)+ * more can easily be added.+ */+struct {+  const char *ffi_name;+  const funptr_t ffi_fun;+  enum { FFI_V, FFI_I, FFI_IV, FFI_II, FFI_IIV, FFI_III, FFI_DD, FFI_PI,+    FFI_i, FFI_Pi, FFI_iPi,+    FFI_PPI, FFI_PP, FFI_PPP, FFI_IPI, FFI_PV, FFI_IP+  } ffi_how;+} ffi_table[] = {+  { "llabs",    (funptr_t)llabs,   FFI_II },+#if WANT_MATH+  { "log",      (funptr_t)log,     FFI_DD },+  { "exp",      (funptr_t)exp,     FFI_DD },+  { "sqrt",     (funptr_t)sqrt,    FFI_DD },+  { "sin",      (funptr_t)sin,     FFI_DD },+  { "cos",      (funptr_t)cos,     FFI_DD },+  { "tan",      (funptr_t)tan,     FFI_DD },+  { "asin",     (funptr_t)asin,    FFI_DD },+  { "acos",     (funptr_t)acos,    FFI_DD },+  { "atan",     (funptr_t)atan,    FFI_DD },+#endif  /* WANT_MATH */+  { "getenv",   (funptr_t)getenv,  FFI_PP },++  { "getRaw",   (funptr_t)GETRAW,  FFI_i },+#if WANT_STDIO+  { "fgetc",    (funptr_t)fgetc,   FFI_Pi },+  { "fputc",    (funptr_t)fputc,   FFI_iPi },+  //  { "cprint",   (funptr_t)cprint,  FFI_PAV },+  //  { "serialize",(funptr_t)serialize,  FFI_PAV },+  //  { "deserialize",(funptr_t)deserialize,  FFI_PA },+  { "fclose",   (funptr_t)fclose,  FFI_Pi },+  { "fflush",   (funptr_t)fflush,  FFI_Pi },+  { "fopen",    (funptr_t)fopen,   FFI_PPP },+  { "tmpname",  (funptr_t)TMPNAME, FFI_PPP },+  { "unlink",   (funptr_t)unlink,  FFI_Pi },+  { "system",   (funptr_t)system,  FFI_Pi },+#endif  /* WANT_STDIO */+  //  { "getArgs",   (funptr_t)getArgs,  FFI_A },+  { "getTimeMilli",(funptr_t)GETTIMEMILLI,  FFI_I },+  { "free",     (funptr_t)free,    FFI_PV },+  { "malloc",   (funptr_t)malloc,  FFI_IP }, /* The I is really a size_t */+};++/* Look up an FFI function by name */+value_t+lookupFFIname(const char *name)+{+  for(int i = 0; i < sizeof(ffi_table) / sizeof(ffi_table[0]); i++)+    if (strcmp(ffi_table[i].ffi_name, name) == 0)+      return (value_t)i;+  return -1;+}++NODEPTR+ffiNode(const char *buf)+{+  NODEPTR r;+  value_t i = lookupFFIname(buf);+  if (i < 0) {+    /* lookup failed, generate a node that will dynamically generate an error */+    r = alloc_node(T_BADDYN);+    char *fun = malloc(strlen(buf) + 1);+    strcpy(fun, buf);+    STR(r) = fun;+  } else {+    r = alloc_node(T_IO_CCALL);+    SETVALUE(r, i);+  }+  return r;+}++/* If the next input character is c, then consume it, else leave it alone. */+int+gobble(BFILE *f, int c)+{+  int d = f->getb(f);+  if (c == d) {+    return 1;+  } else {+    f->ungetb(d, f);+    return 0;+  }+}++/* Get a non-terminating character.  ' ' and ')' terminate a token. */+int+getNT(BFILE *f)+{+  int c;+  +  c = f->getb(f);+  if (c == ' ' || c == ')') {+    f->ungetb(c, f);+    return 0;+  } else {+    return c;+  }+}++value_t+parse_int(BFILE *f)+{+  value_t i = 0;+  value_t neg = 1;+  int c = f->getb(f);+  if (c == '-') {+    neg = -1;+    c = f->getb(f);+  }+  for(;;) {+    i = i * 10 + c - '0';+    c = f->getb(f);+    if (c < '0' || c > '9') {+      f->ungetb(c, f);+      break;+    }+  }+  return neg * i;+}++double+parse_double(BFILE *f)+{+  // apparently longest float, when rendered, takes up 24 characters. We add one more for a potential+  // minus sign, and another one for the final null terminator.+  // https://stackoverflow.com/questions/1701055/what-is-the-maximum-length-in-chars-needed-to-represent-any-double-value+  char buf[26];+  for(int j = 0; (buf[j] = getNT(f)); j++)+    ;++  return strtod(buf, NULL);;+}++NODEPTR+mkStrNode(const char *str)+{+  NODEPTR n = alloc_node(T_STR);+  STR(n) = str;+  return n;+}++NODEPTR mkInt(value_t i);+NODEPTR mkDbl(double d);+NODEPTR mkPtr(void* p);++/* Table of labelled nodes for sharing during parsing. */+struct shared_entry {+  heapoffs_t label;+  NODEPTR node;                 /* NIL indicates unused */+} *shared_table;+heapoffs_t shared_table_size;++/* Look for the label in the table.+ * If it's found, return the node.+ * If not found, return the first empty entry.+*/+NODEPTR *+find_label(heapoffs_t label)+{+  int hash = (int)(label % shared_table_size);+  for(int i = hash; ; i++) {+    if (shared_table[i].node == NIL) {+      /* The slot is empty, so claim and return it */+      shared_table[i].label = label;+      return &shared_table[i].node;+    } else if (shared_table[i].label == label) {+      /* Found the label, so return it. */+      return &shared_table[i].node;+    }+    /* Not empty and not found, try next. */+  }+}++NODEPTR+parse(BFILE *f)+{+  NODEPTR r;+  NODEPTR *nodep;+  heapoffs_t l;+  value_t i;+  double d;+  int c;+  char buf[80];                 /* store names of primitives. */++  c = f->getb(f);+  if (c < 0) ERR("parse EOF");+  switch (c) {+  case '(' :+    /* application: (f a) */+    r = alloc_node(T_AP);+    FUN(r) = parse(f);+    if (!gobble(f, ' ')) ERR("parse ' '");+    ARG(r) = parse(f);+    if (!gobble(f, ')')) ERR("parse ')'");+    return r;+  case '&':+    d = parse_double(f);+    r = mkDbl(d);+    return r;+  case '#':+    i = parse_int(f);+    r = mkInt(i);+    return r;+#if 0+  case '-':+    c = f->getb(f);+    neg = -1;+    if ('0' <= c && c <= '9') {+      goto number;+    } else {+      ERR("got -");+    }+  case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':+    /* integer [0-9]+*/+    neg = 1;+  number:+    f->ungetb(c, f);+    i = neg * parse_int(f);+    r = mkInt(i);+    return r;+#endif+  case '_' :+    /* Reference to a shared value: _label */+    l = parse_int(f);  /* The label */+    nodep = find_label(l);+    if (*nodep == NIL) {+      /* Not yet defined, so make it an indirection */+      *nodep = alloc_node(T_IND);+      INDIR(*nodep) = NIL;+    }+    return *nodep;+  case ':' :+    /* Define a shared expression: :label e */+    l = parse_int(f);  /* The label */+    if (!gobble(f, ' ')) ERR("parse ' '");+    nodep = find_label(l);+    if (*nodep == NIL) {+      /* not referenced yet, so create a node */+      *nodep = alloc_node(T_IND);+      INDIR(*nodep) = NIL;+    } else {+      /* Sanity check */+      if (INDIR(*nodep) != NIL) ERR("shared != NIL");+    }+    r = parse(f);+    INDIR(*nodep) = r;+    return r;+  case '"' :+    /* Everything up to the next " is a string.+     * Special characters are encoded as \NNN&,+     * where NNN is the decimal value of the character */+    /* XXX assume there are no NULs in the string, and all fit in a char */+    /* XXX allocation is a hack */+    {+      char *buffer = malloc(10000);+      char *p = buffer;+      for(;;) {+        c = f->getb(f);+        if (c == '"')+          break;+        if (c == '\\') {+          *p++ = (char)parse_int(f);+          if (!gobble(f, '&'))+            ERR("parse string");+        } else {+          *p++ = c;+        }+      }+      *p++ = 0;+      r = mkStrNode(realloc(buffer, p - buffer));+      return r;+    }+  case '^':+    /* An FFI name */+    for (int j = 0; (buf[j] = getNT(f)); j++)+      ;+    r = ffiNode(buf);+    return r;+  default:+    buf[0] = c;+    /* A primitive, keep getting char's until end */+    for (int j = 1; (buf[j] = getNT(f)); j++)+      ;+    /* Look up the primop and use the preallocated node. */+    for (int j = 0; j < sizeof primops / sizeof primops[0]; j++) {+      if (strcmp(primops[j].name, buf) == 0) {+        return primops[j].node;+      }+    }+    ERR1("no primop %s", buf);+  }+}++void+checkversion(BFILE *f)+{+  char *p = VERSION;+  int c;++  while ((c = *p++)) {+    if (c != f->getb(f))+      ERR("version mismatch");+  }+  gobble(f, '\r');                 /* allow extra CR */+}++/* Parse a file */+NODEPTR+parse_top(BFILE *f)+{+  checkversion(f);+  heapoffs_t numLabels = parse_int(f);+  if (!gobble(f, '\n'))+    ERR("size parse");+  gobble(f, '\r');                 /* allow extra CR */+  shared_table_size = 3 * numLabels; /* sparsely populated hashtable */+  shared_table = malloc(shared_table_size * sizeof(struct shared_entry));+  if (!shared_table)+    memerr();+  for(heapoffs_t i = 0; i < shared_table_size; i++)+    shared_table[i].node = NIL;+  NODEPTR n = parse(f);+  free(shared_table);+  return n;+}++#if WANT_STDIO+NODEPTR+parse_FILE(FILE *f)+{+  BFILE *p = openb_FILE(f);+  /* And parse it */+  NODEPTR n = parse_top(p);+  p->closeb(p);+  return n;+}++NODEPTR+parse_file(const char *fn, size_t *psize)+{+  FILE *f = fopen(fn, "r");+  if (!f)+    ERR1("file not found %s", fn);++  /* And parse it */+  NODEPTR n = parse_FILE(f);+  *psize = ftell(f);+  return n;+}+#endif  /* WANT_STDIO */++counter_t num_shared;++/* Two bits per node: marked, shared+ * 0, 0   -- not visited+ * 1, 0   -- visited once+ * 1, 1   -- visited more than once+ * 0, 1   -- printed+ */+bits_t *marked_bits;+bits_t *shared_bits;+static INLINE void set_bit(bits_t *bits, NODEPTR n)+{+  heapoffs_t i = LABEL(n);+  bits[i / BITS_PER_WORD] |= (1ULL << (i % BITS_PER_WORD));+}+#if WANT_STDIO+static INLINE void clear_bit(bits_t *bits, NODEPTR n)+{+  heapoffs_t i = LABEL(n);+  bits[i / BITS_PER_WORD] &= ~(1ULL << (i % BITS_PER_WORD));+}+#endif+static INLINE int test_bit(bits_t *bits, NODEPTR n)+{+  heapoffs_t i = LABEL(n);+  return (bits[i / BITS_PER_WORD] & (1ULL << (i % BITS_PER_WORD))) != 0;+}++#if WANT_STDIO+void printrec(FILE *f, NODEPTR n);++/* Mark all reachable nodes, when a marked node is reached, mark it as shared. */+void+find_sharing(NODEPTR n)+{+ top:+  while (GETTAG(n) == T_IND)+    n = INDIR(n);+  //printf("find_sharing %p %llu ", n, LABEL(n));+  if (GETTAG(n) == T_AP) {+    if (test_bit(shared_bits, n)) {+      /* Alread marked as shared */+      //printf("shared\n");+      ;+    } else if (test_bit(marked_bits, n)) {+      /* Already marked, so now mark as shared */+      //printf("marked\n");+      set_bit(shared_bits, n);+      num_shared++;+    } else {+      /* Mark as visited, and recurse */+      //printf("unmarked\n");+      set_bit(marked_bits, n);+      find_sharing(FUN(n));+      n = ARG(n);+      goto top;+    }+  } else {+    /* Not an application, so do nothing */+    //printf("not T_AP\n");+    ;+  }+}++/* Recursively print an expression.+   This assumes that the shared nodes has been marked as such.+*/+void+printrec(FILE *f, NODEPTR n)+{+  if (test_bit(shared_bits, n)) {+    /* The node is shared */+    if (test_bit(marked_bits, n)) {+      /* Not yet printed, so emit a label */+      fprintf(f, ":%"PRIheap" ", LABEL(n));+      clear_bit(marked_bits, n);  /* mark as printed */+    } else {+      /* This node has already been printed, so just use a reference. */+      fprintf(f, "_%"PRIheap, LABEL(n));+      return;+    }+  }++  switch (GETTAG(n)) {+  case T_IND: /*putc('*', f);*/ printrec(f, INDIR(n)); break;+  case T_AP:+    fputc('(', f);+    printrec(f, FUN(n));+    fputc(' ', f);+    printrec(f, ARG(n));+    fputc(')', f);+    break;+  case T_INT: fprintf(f, "#%"PRIvalue, GETVALUE(n)); break;+  case T_DBL: fprintf(f, "&%.16g", GETDBLVALUE(n)); break;+  case T_PTR:+    if (PTR(n) == stdin)+      fprintf(f, "IO.stdin");+    else if (PTR(n) == stdout)+      fprintf(f, "IO.stdout");+    else if (PTR(n) == stderr)+      fprintf(f, "IO.stderr");+    else+      ERR("Cannot serialize pointers");+    break;+  case T_STR:+    {+      const char *p = STR(n);+      int c;+      fputc('"', f);+      while ((c = *p++)) {+        if (c == '"' || c == '\\' || c < ' ' || c > '~') {+          fprintf(f, "\\%d&", c);+        } else {+          fputc(c, f);+        }+      }+      fputc('"', f);+      break;+    }+  case T_BADDYN: fprintf(f, "^%s", STR(n)); break;+  case T_S: fprintf(f, "S"); break;+  case T_K: fprintf(f, "K"); break;+  case T_I: fprintf(f, "I"); break;+  case T_C: fprintf(f, "C"); break;+  case T_B: fprintf(f, "B"); break;+  case T_A: fprintf(f, "A"); break;+  case T_U: fprintf(f, "U"); break;+  case T_Y: fprintf(f, "Y"); break;+  case T_P: fprintf(f, "P"); break;+  case T_R: fprintf(f, "R"); break;+  case T_O: fprintf(f, "O"); break;+  case T_SS: fprintf(f, "S'"); break;+  case T_BB: fprintf(f, "B'"); break;+  case T_Z: fprintf(f, "Z"); break;+  case T_CC: fprintf(f, "C'"); break;+  case T_ADD: fprintf(f, "+"); break;+  case T_SUB: fprintf(f, "-"); break;+  case T_MUL: fprintf(f, "*"); break;+  case T_QUOT: fprintf(f, "quot"); break;+  case T_REM: fprintf(f, "rem"); break;+  case T_UQUOT: fprintf(f, "uquot"); break;+  case T_UREM: fprintf(f, "urem"); break;+  case T_SUBR: fprintf(f, "subtract"); break;+  case T_NEG: fprintf(f, "neg"); break;+  case T_AND: fprintf(f, "and"); break;+  case T_OR: fprintf(f, "or"); break;+  case T_XOR: fprintf(f, "xor"); break;+  case T_INV: fprintf(f, "inv"); break;+  case T_SHL: fprintf(f, "shl"); break;+  case T_SHR: fprintf(f, "shr"); break;+  case T_ASHR: fprintf(f, "ashr"); break;+#if WANT_FLOAT+  case T_FADD: fprintf(f, "fadd"); break;+  case T_FSUB: fprintf(f, "fsub"); break;+  case T_FMUL: fprintf(f, "fmul"); break;+  case T_FDIV: fprintf(f, "fdiv"); break;+  case T_FNEG: fprintf(f, "fneg"); break;+  case T_ITOF: fprintf(f, "itof"); break;+  case T_FEQ: fprintf(f, "feq"); break;+  case T_FNE: fprintf(f, "fne"); break;+  case T_FLT: fprintf(f, "flt"); break;+  case T_FLE: fprintf(f, "fle"); break;+  case T_FGT: fprintf(f, "fgt"); break;+  case T_FGE: fprintf(f, "fge"); break;+  case T_FSHOW: fprintf(f, "fshow"); break;+  case T_FREAD: fprintf(f, "fread"); break;+#endif+  case T_EQ: fprintf(f, "=="); break;+  case T_NE: fprintf(f, "/="); break;+  case T_LT: fprintf(f, "<"); break;+  case T_LE: fprintf(f, "<="); break;+  case T_GT: fprintf(f, ">"); break;+  case T_GE: fprintf(f, ">="); break;+  case T_ULT: fprintf(f, "u<"); break;+  case T_ULE: fprintf(f, "u<="); break;+  case T_UGT: fprintf(f, "u>"); break;+  case T_UGE: fprintf(f, "u>="); break;+  case T_ERROR: fprintf(f, "error"); break;+  case T_NODEFAULT: fprintf(f, "noDefault"); break;+  case T_NOMATCH: fprintf(f, "noMatch"); break;+  case T_EQUAL: fprintf(f, "equal"); break;+  case T_COMPARE: fprintf(f, "compare"); break;+  case T_RNF: fprintf(f, "rnf"); break;+  case T_SEQ: fprintf(f, "seq"); break;+  case T_IO_BIND: fprintf(f, "IO.>>="); break;+  case T_IO_THEN: fprintf(f, "IO.>>"); break;+  case T_IO_RETURN: fprintf(f, "IO.return"); break;+  case T_IO_SERIALIZE: fprintf(f, "IO.serialize"); break;+  case T_IO_PRINT: fprintf(f, "IO.print"); break;+  case T_IO_DESERIALIZE: fprintf(f, "IO.deserialize"); break;+  case T_IO_GETARGS: fprintf(f, "IO.getArgs"); break;+  case T_IO_DROPARGS: fprintf(f, "IO.dropArgs"); break;+  case T_IO_GETTIMEMILLI: fprintf(f, "IO.getTimeMilli"); break;+  case T_IO_PERFORMIO: fprintf(f, "IO.performIO"); break;+  case T_IO_CCALL: fprintf(f, "^%s", ffi_table[GETVALUE(n)].ffi_name); break;+  case T_IO_CATCH: fprintf(f, "IO.catch"); break;+  case T_DYNSYM: fprintf(f, "dynsym"); break;+  case T_NEWCASTRING: fprintf(f, "newCAString"); break;+  case T_PEEKCASTRING: fprintf(f, "peekCAString"); break;+  case T_TOINT: fprintf(f, "toInt"); break;+  case T_TOPTR: fprintf(f, "toPtr"); break;+  case T_TODBL: fprintf(f, "toDbl"); break;+  default: ERR("print tag");+  }+}++/* Serialize a graph to file. */+void+print(FILE *f, NODEPTR n, int header)+{+  num_shared = 0;+  marked_bits = calloc(free_map_nwords, sizeof(bits_t));+  if (!marked_bits)+    memerr();+  shared_bits = calloc(free_map_nwords, sizeof(bits_t));+  if (!shared_bits)+    memerr();+  find_sharing(n);+  if (header)+    fprintf(f, "%s%"PRIcounter"\n", VERSION, num_shared);+  printrec(f, n);+  free(marked_bits);+  free(shared_bits);+}++/* Show a graph. */+void+pp(FILE *f, NODEPTR n)+{+  print(f, n, 0);+  fprintf(f, "\n");+}+#endif  /* WANT_STDIO */++NODEPTR+mkInt(value_t i)+{+#if INTTABLE+  if (LOW_INT <= i && i < HIGH_INT) {+    return intTable[i - LOW_INT];+  }+#endif++  NODEPTR n;+  n = alloc_node(T_INT);+  SETVALUE(n, i);+  return n;+}++NODEPTR+mkDbl(double d)+{+  NODEPTR n;+  n = alloc_node(T_DBL);+  SETDBLVALUE(n, d);+  return n;+}++NODEPTR+mkPtr(void* p)+{+  NODEPTR n;+  n = alloc_node(T_PTR);+  PTR(n) = p;+  return n;+}++static INLINE NODEPTR+mkNil(void)+{+  return combFalse;+}++static INLINE NODEPTR+mkCons(NODEPTR x, NODEPTR xs)+{+  return new_ap(new_ap(combCons, x), xs);+}++size_t+strNodes(size_t len)+{+  /* Each character will need a CHAR node and a CONS node, a CONS uses 2 T_AP nodes */+  len *= (1 + 2);+  /* And each string will need a NIL */+  len += 1;+  return len;+}++/* Turn a C string into a combinator string */+NODEPTR+mkString(const char *str, size_t len)+{+  NODEPTR n, nc;++  n = mkNil();+  for(size_t i = len; i > 0; i--) {+    nc = mkInt(str[i-1]);+    n = mkCons(nc, n);+  }+  return n;+}++NODEPTR+mkStringC(const char *str)+{+  return mkString(str, strlen(str));+}++void eval(NODEPTR n);++/* Evaluate and skip indirections. */+static INLINE NODEPTR+evali(NODEPTR n)+{+  /* Need to push and pop in case GC happens */+  PUSH(n);+  eval(n);+  n = TOP(0);+  POP(1);+  while (GETTAG(n) == T_IND)+    n = INDIR(n);+  return n;+}++/* Follow indirections */+static INLINE NODEPTR+indir(NODEPTR n)+{+  while (GETTAG(n) == T_IND)+    n = INDIR(n);+  return n;+}++/* Evaluate to an INT */+static INLINE value_t+evalint(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_INT) {+    ERR1("evalint, bad tag %d", GETTAG(n));+  }+#endif+  return GETVALUE(n);+}++/* Evaluate to a Double */+static INLINE double+evaldbl(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_DBL) {+    ERR1("evaldbl, bad tag %d", GETTAG(n));+  }+#endif+  return GETDBLVALUE(n);+}++/* Evaluate to a T_PTR */+void *+evalptr(NODEPTR n)+{+  n = evali(n);+#if SANITY+  if (GETTAG(n) != T_PTR) {+    ERR1("evalptr, bad tag %d", GETTAG(n));+  }+#endif+  return PTR(n);+}++/* Evaluate a string, returns a newly allocated buffer. */+/* XXX this is cheating, should use continuations */+char *+evalstring(NODEPTR n)+{+  size_t sz = 10000;+  char *p, *name = malloc(sz);+  value_t c;+  NODEPTR x;++  if (!name)+    memerr();+  for (p = name;;) {+    if (p >= name + sz)+      ERR("evalstring too long");+    n = evali(n);+    if (GETTAG(n) == T_K)            /* Nil */+      break;+    else if (GETTAG(n) == T_AP && GETTAG(x = indir(FUN(n))) == T_AP && GETTAG(indir(FUN(x))) == T_O) { /* Cons */+      c = evalint(ARG(x));+      if (c < 0 || c > 127)+	ERR("invalid char");    /* Only allow ASCII */+      *p++ = (char)c;+      n = ARG(n);+    } else {+      ERR("evalstring not Nil/Cons");+    }+  }+  *p = 0;+  return name;+}++/* Compares anything, but really only works well on strings.+ * if p < q  return -1+ * if p > q  return 1+ * if p == q return 0+ */+int+compare(NODEPTR p, NODEPTR q)+{+  int r;+  value_t x, y;+  void *f, *g;+  + top:+  PUSH(q);                      /* save for GC */+  p = evali(p);+  q = evali(TOP(0));+  POP(1);+  enum node_tag ptag = GETTAG(p);+  enum node_tag qtag = GETTAG(q);+  if (ptag != qtag) {+    /* Hack to make Nil < Cons */+    if (ptag == T_K && qtag == T_AP)+      return -1;+    if (ptag == T_AP && qtag == T_K)+      return 1;+    return ptag < qtag ? -1 : 1;+  }+  switch (ptag) {+  case T_AP:+    PUSH(ARG(p));+    PUSH(ARG(q));+    r = compare(FUN(p), FUN(q));+    if (r != 0) {+      POP(2);+      return r;+    }+    q = TOP(0);+    p = TOP(1);+    POP(2);+    goto top;+  case T_INT:+  case T_IO_CCALL:+    x = GETVALUE(p);+    y = GETVALUE(q);+    return x < y ? -1 : x > y ? 1 : 0;+  case T_PTR:+    f = PTR(p);+    g = PTR(q);+    return f < g ? -1 : f > g ? 1 : 0;+  default:+    return 0;+  }+}++bits_t *rnf_bits;++void+rnf_rec(NODEPTR n)+{+ top:+  if (test_bit(rnf_bits, n))+    return;+  set_bit(rnf_bits, n);+  n = evali(n);+  if (GETTAG(n) == T_AP) {+    PUSH(ARG(n));               /* protect from GC */+    rnf_rec(FUN(n));+    n = TOP(0);+    POP(1);+    goto top;+  }+}++/* This is a yucky hack */+int doing_rnf = 0;++void+rnf(value_t noerr, NODEPTR n)+{+  /* Mark visited nodes to avoid getting stuck in loops. */+  rnf_bits = calloc(free_map_nwords, sizeof(bits_t));+  if (!rnf_bits)+    memerr();+  if (doing_rnf)+    ERR("recursive rnf()");+  doing_rnf = (int)noerr;+  rnf_rec(n);+  doing_rnf = 0;+  free(rnf_bits);+}++NODEPTR execio(NODEPTR n);++/* Evaluate a node, returns when the node is in WHNF. */+void+eval(NODEPTR n)+{+  stackptr_t stk = stack_ptr;+  NODEPTR x, y, z, w;+  value_t xi, yi, r;+#if WANT_FLOAT+  double xd, yd, rd;+#endif  /* WANT_FLOAT */+  char *msg;+  heapoffs_t l;++/* Reset stack pointer and return. */+#define RET do { stack_ptr = stk; return; } while(0)+/* Check that there are at least n arguments, return if not. */+#define CHECK(n) do { if (stack_ptr - stk < (n)) RET; } while(0)++#define SETIND(n, x) do { SETTAG((n), T_IND); INDIR((n)) = (x); } while(0)+#define GOIND(x) do { SETIND(n, (x)); goto ind; } while(0)+#define GOAP(f,a) do { FUN((n)) = (f); ARG((n)) = (a); goto ap; } while(0)+/* CHKARGN checks that there are at least N arguments.+ * It also+ *  - sets n to the "top" node+ *  - set x, y, ... to the arguments+ *  - pops N stack elements+ * NOTE: No GC is allowed after these, since the stack has been popped.+ */+#define CHKARG0 do { } while(0)+#define CHKARG1 do { CHECK(1); POP(1); n = TOP(-1); x = ARG(n); } while(0)+#define CHKARG2 do { CHECK(2); POP(2); n = TOP(-1); y = ARG(n); x = ARG(TOP(-2)); } while(0)+#define CHKARG3 do { CHECK(3); POP(3); n = TOP(-1); z = ARG(n); y = ARG(TOP(-2)); x = ARG(TOP(-3)); } while(0)+#define CHKARG4 do { CHECK(4); POP(4); n = TOP(-1); w = ARG(n); z = ARG(TOP(-2)); y = ARG(TOP(-3)); x = ARG(TOP(-4)); } while(0)++/* Alloc a possible GC action, e, between setting x and popping */+#define CHKARGEV1(e)  do { CHECK(1); x = ARG(TOP(0)); e; POP(1); n = TOP(-1); } while(0)++#define SETINT(n,r)    do { SETTAG((n), T_INT); SETVALUE((n), (r)); } while(0)+#define SETDBL(n,d)    do { SETTAG((n), T_DBL); SETDBLVALUE((n), (d)); } while(0)+#define OPINT1(e)      do { CHECK(1); xi = evalint(ARG(TOP(0)));                            e; POP(1); n = TOP(-1); } while(0);+#define OPINT2(e)      do { CHECK(2); xi = evalint(ARG(TOP(0))); yi = evalint(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);+#define OPDBL1(e)      do { CHECK(1); xd = evaldbl(ARG(TOP(0)));                            e; POP(1); n = TOP(-1); } while(0);+#define OPDBL2(e)      do { CHECK(2); xd = evaldbl(ARG(TOP(0))); yd = evaldbl(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);+#define ARITHUN(op)    do { OPINT1(r = op xi); SETINT(n, r); RET; } while(0)+#define ARITHBIN(op)   do { OPINT2(r = xi op yi); SETINT(n, r); RET; } while(0)+#define ARITHBINU(op)  do { OPINT2(r = (value_t)((uvalue_t)xi op (uvalue_t)yi)); SETINT(n, r); RET; } while(0)+#define FARITHUN(op)   do { OPDBL1(rd = op xd); SETDBL(n, rd); RET; } while(0)+#define FARITHBIN(op)  do { OPDBL2(rd = xd op yd); SETDBL(n, rd); RET; } while(0)+#define CMP(op)        do { OPINT2(r = xi op yi); GOIND(r ? combTrue : combFalse); } while(0)+#define CMPF(op)       do { OPDBL2(r = xd op yd); GOIND(r ? combTrue : combFalse); } while(0)+#define CMPU(op)       do { OPINT2(r = (uvalue_t)xi op (uvalue_t)yi); GOIND(r ? combTrue : combFalse); } while(0)++  for(;;) {+    num_reductions++;+#if FASTTAGS+    l = LABEL(n);+    enum node_tag tag = l < T_IO_BIND ? l : GETTAG(n);+#else   /* FASTTAGS */+    enum node_tag tag = GETTAG(n);+#endif  /* FASTTAGS */+    switch (tag) {+    ind:+      num_reductions++;+    case T_IND:  n = INDIR(n); break;++    ap:+      num_reductions++;+    case T_AP:   PUSH(n); n = FUN(n); break;++    case T_STR:  GCCHECK(strNodes(strlen(STR(n)))); GOIND(mkStringC(STR(n)));+    case T_INT:  RET;+    case T_DBL:  RET;+    case T_PTR:  RET;+    case T_BADDYN: ERR1("FFI unknown %s", STR(n));++    case T_S:    GCCHECK(2); CHKARG3; GOAP(new_ap(x, z), new_ap(y, z));                     /* S x y z = x z (y z) */+    case T_SS:   GCCHECK(3); CHKARG4; GOAP(new_ap(x, new_ap(y, w)), new_ap(z, w));          /* S' x y z w = x (y w) (z w) */+    case T_K:                CHKARG2; GOIND(x);                                             /* K x y = *x */+    case T_A:                CHKARG2; GOIND(y);                                             /* A x y = *y */+    case T_U:                CHKARG2; GOAP(y, x);                                           /* U x y = y x */+    case T_I:                CHKARG1; GOIND(x);                                             /* I x = *x */+    case T_Y:                CHKARG1; GOAP(x, n);                                           /* n@(Y x) = x n */+    case T_B:    GCCHECK(1); CHKARG3; GOAP(x, new_ap(y, z));                                /* B x y z = x (y z) */+    case T_BB:   GCCHECK(2); CHKARG4; GOAP(new_ap(x, y), new_ap(z, w));                     /* B' x y z w = x y (z w) */+    case T_Z:                CHKARG3; GOAP(x, y);                                           /* Z x y z = x y */+    case T_C:    GCCHECK(1); CHKARG3; GOAP(new_ap(x, z), y);                                /* C x y z = x z y */+    case T_CC:   GCCHECK(2); CHKARG4; GOAP(new_ap(x, new_ap(y, w)), z);                     /* C' x y z w = x (y w) z */+    case T_P:    GCCHECK(1); CHKARG3; GOAP(new_ap(z, x), y);                                /* P x y z = z x y */+    case T_R:    GCCHECK(1); CHKARG3; GOAP(new_ap(y, z), x);                                /* R x y z = y z x */+    case T_O:    GCCHECK(1); CHKARG4; GOAP(new_ap(w, x), y);                                /* O x y z w = w x y */++    case T_ADD:  ARITHBIN(+);+    case T_SUB:  ARITHBIN(-);+    case T_MUL:  ARITHBIN(*);+    case T_QUOT: ARITHBIN(/);+    case T_REM:  ARITHBIN(%);+    case T_SUBR: OPINT2(r = yi - xi); SETINT(n, r); RET;+    case T_UQUOT: ARITHBINU(/);+    case T_UREM:  ARITHBINU(%);+    case T_NEG:  ARITHUN(-);+    case T_AND:  ARITHBIN(&);+    case T_OR:   ARITHBIN(|);+    case T_XOR:  ARITHBIN(^);+    case T_INV:  ARITHUN(~);+    case T_SHL:  ARITHBIN(<<);+    case T_SHR:  ARITHBINU(>>);+    case T_ASHR: ARITHBIN(>>);++#if WANT_FLOAT+    case T_FADD: FARITHBIN(+);+    case T_FSUB: FARITHBIN(-);+    case T_FMUL: FARITHBIN(*);+    case T_FDIV: FARITHBIN(/);+    case T_FNEG: FARITHUN(-);+    case T_ITOF: OPINT1(rd = (double)xi); SETDBL(n, rd); RET;+    case T_FEQ: CMPF(==);+    case T_FNE: CMPF(!=);+    case T_FLT: CMPF(<);+    case T_FLE: CMPF(<=);+    case T_FGT: CMPF(>);+    case T_FGE: CMPF(>=);+    case T_FREAD:+      CHECK(1);+      msg = evalstring(ARG(TOP(0)));+      xd = strtod(msg, NULL);+      free(msg);++      POP(1);+      n = TOP(-1);+      +      GOIND(mkDbl(xd));++    case T_FSHOW:+      // check that the double exists+      CHECK(1);+      // evaluate it+      xd = evaldbl(ARG(TOP(0)));+      // turn it into a string+      char str[30];+      /* Using 16 decimals will lose some precision.+       * 17 would keep the precision, but it frequently looks very ugly.+       */+      (void)snprintf(str, 25, "%.16g", xd);+      if (!strchr(str, '.') && !strchr(str, 'e') && !strchr(str, 'E')) {+        /* There is no decimal point and no exponent, so add a decimal point */+        strcat(str, ".0");+      }++      // turn it into a mhs string+      GCCHECK(strNodes(strlen(str)));+      NODEPTR s = mkStringC(str);++      // remove the double from the stack+      POP(1);+      n = TOP(-1);+      // update n to be s+      GOIND(s);+#endif  /* WANT_FLOAT */++    /* Retag a word sized value, keeping the value bits */+#define CONV(t) do { CHECK(1); x = evali(ARG(TOP(0))); GCCHECK(1); y = alloc_node(t); SETVALUE(y, GETVALUE(x)); POP(1); n = TOP(-1); GOIND(y); } while(0)+    case T_TODBL: CONV(T_DBL);+    case T_TOINT: CONV(T_INT);+    case T_TOPTR: CONV(T_PTR);+#undef CONV++    case T_EQ:   CMP(==);+    case T_NE:   CMP(!=);+    case T_LT:   CMP(<);+    case T_LE:   CMP(<=);+    case T_GT:   CMP(>);+    case T_GE:   CMP(>=);+    case T_ULT:  CMPU(<);+    case T_ULE:  CMPU(<=);+    case T_UGT:  CMPU(>);+    case T_UGE:  CMPU(>=);++    case T_NOMATCH:+      if (doing_rnf) RET;+      {+      CHECK(3);+      msg = evalstring(ARG(TOP(0)));+      xi = evalint(ARG(TOP(1)));+      yi = evalint(ARG(TOP(2)));+      int sz = strlen(msg) + 100;+      char *res = malloc(sz);+#if WANT_STDIO+      snprintf(res, sz, "no match at %s, line %"PRIvalue", col %"PRIvalue, msg, xi, yi);+#else  /* WANT_STDIO */+      strcpy(res, "no match");+#endif  /* WANT_STDIO */+      POP(2);+      GCCHECK(strNodes(strlen(res)));+      ARG(TOP(0)) = mkStringC(res);+      free(res);+      free(msg);+      goto err;                 /* XXX not right message if the error is caught */+      }+    case T_NODEFAULT:+      if (doing_rnf) RET;+      {+      CHECK(1);+      msg = evalstring(ARG(TOP(0)));+      int sz = strlen(msg) + 100;+      char *res = malloc(sz);++#if WANT_STDIO+      snprintf(res, sz, "no default for %s", msg);+#else  /* WANT_STDIO */+      strcpy(res, "no default");+#endif  /* WANT_STDIO */+      GCCHECK(strNodes(strlen(res)));+      ARG(TOP(0)) = mkStringC(res);+      free(res);+      free(msg);+      goto err;                 /* XXX not right message if the error is caught */+      }+    case T_ERROR:+      if (doing_rnf) RET;+    err:+      if (cur_handler) {+        /* Pass the string to the handler */+        CHKARG1;+        cur_handler->hdl_exn = x;+        longjmp(cur_handler->hdl_buf, 1);+      } else {+        /* No handler, so just die. */+        CHKARGEV1(msg = evalstring(x));+#if WANT_STDIO+        fprintf(stderr, "mhs: %s\n", msg);+        exit(1);+#else  /* WANT_STDIO */+        ERR1("error: %s", msg);+#endif  /* WANT_STDIO */+      }+    case T_SEQ:  CHECK(2); eval(ARG(TOP(0))); POP(2); n = TOP(-1); y = ARG(n); GOIND(y); /* seq x y = eval(x); y */++    case T_EQUAL:+      CHECK(2); r = compare(ARG(TOP(0)), ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(r==0 ? combTrue : combFalse);+    case T_COMPARE:+      CHECK(2); r = compare(ARG(TOP(0)), ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(r < 0 ? combLT : r > 0 ? combGT : combEQ);++    case T_RNF:+      if (doing_rnf) RET;+      CHECK(2);+      xi = evalint(ARG(TOP(0)));+      rnf(xi, ARG(TOP(1))); POP(2); n = TOP(-1); GOIND(combUnit);++    case T_IO_PERFORMIO:+      if (doing_rnf) RET;+      CHKARGEV1(x = execio(x)); GOIND(x);++    case T_IO_BIND:+    case T_IO_THEN:+    case T_IO_RETURN:+    case T_IO_SERIALIZE:+    case T_IO_PRINT:+    case T_IO_DESERIALIZE:+    case T_IO_GETARGS:+    case T_IO_DROPARGS:+    case T_IO_GETTIMEMILLI:+    case T_IO_CCALL:+    case T_IO_CATCH:+    case T_NEWCASTRING:+    case T_PEEKCASTRING:+      RET;++    case T_DYNSYM:+      /* A dynamic FFI lookup */+      CHECK(1);+      msg = evalstring(ARG(TOP(0)));+      GCCHECK(1);+      x = ffiNode(msg);+      free(msg);+      POP(1);+      n = TOP(-1);+      GOIND(x);++#if 0+    case T_ISINT:+      CHECK(1);+      x = evali(ARG(TOP(0)));+      n = TOP(0);+      POP(1);+      GOIND(GETTAG(x) == T_INT ? combTrue : combFalse);++    case T_ISIO:+      CHECK(1);+      x = evali(ARG(TOP(0)));+      n = TOP(0);+      POP(1);+      l = GETTAG(x);+      GOIND(T_IO_BIND <= l && l <= T_IO_FLUSH ? combTrue : combFalse);+#endif+    default:+      ERR1("eval tag %d", GETTAG(n));+    }+  }+}++/* This is the interpreter for the IO monad operations. */+/* It takes a monadic expression and returns the unwrapped expression (unevaluated). */+NODEPTR+execio(NODEPTR n)+{+  stackptr_t stk = stack_ptr;+  NODEPTR f, x;+  int c;+  char *name;+#if WANT_STDIO+  void *ptr;+  int hdr;+#endif  /* WANT_STDIO */++/* IO operations need all arguments, anything else should not happen. */+#define CHECKIO(n) do { if (stack_ptr - stk != (n+1)) {ERR("CHECKIO");}; } while(0)+#define RETIO(p) do { stack_ptr = stk; return (p); } while(0)+#define GCCHECKSAVE(p, n) do { PUSH(p); GCCHECK(n); (p) = TOP(0); POP(1); } while(0)++ top:+  n = evali(n);+  PUSH(n);+  for(;;) {+    num_reductions++;+    switch (GETTAG(n)) {+    case T_IND:+      n = INDIR(n);+      TOP(0) = n;+      break;+    case T_AP:+      n = FUN(n);+      PUSH(n);+      break;+    case T_IO_BIND:+      CHECKIO(2);+      {+        /* Use associativity to avoid deep execio recursion. */+        /* (m >>= g) >>= h      ===  m >>= (\ x -> g x >>= h) */+        /* BIND ((BIND m) g) h  ===  BIND m (\ x -> BIND (g x) h) == (BIND m) (((C' BIND) g) h)*/+        NODEPTR bm;+        NODEPTR bmg = evali(ARG(TOP(1)));+        GCCHECKSAVE(bmg, 4);+        if (GETTAG(bmg) == T_AP && GETTAG(bm = indir(FUN(bmg))) == T_AP && GETTAG(indir(FUN(bm))) == T_IO_BIND) {+          NODEPTR g = ARG(bmg);+          NODEPTR h = ARG(TOP(2));+          n = new_ap(bm, new_ap(new_ap(new_ap(combCC, combIOBIND), g), h));+          POP(3);+          goto top;+        }+      }++      x = execio(ARG(TOP(1)));  /* first argument, unwrapped */++      /* Do a GC check, make sure we keep the x live */+      GCCHECKSAVE(x, 1);++      f = ARG(TOP(2));          /* second argument, the continuation */+      n = new_ap(f, x);+      POP(3);+      goto top;+    case T_IO_THEN:+      CHECKIO(2);+      (void)execio(ARG(TOP(1))); /* first argument, unwrapped, ignored */+      n = ARG(TOP(2));          /* second argument, the continuation */+      POP(3);+      goto top;+    case T_IO_RETURN:+      CHECKIO(1);+      n = ARG(TOP(1));+      RETIO(n);+#if WANT_STDIO+    case T_IO_PRINT:+      hdr = 0;+      goto ser;+    case T_IO_SERIALIZE:+      hdr = 1;+    ser:+      CHECKIO(2);+      ptr = evalptr(ARG(TOP(1)));+      x = evali(ARG(TOP(2)));+      //x = ARG(TOP(1));+      print(ptr, x, hdr);+      fprintf(ptr, "\n");+      RETIO(combUnit);+    case T_IO_DESERIALIZE:+      CHECKIO(1);+      ptr = evalptr(ARG(TOP(1)));+      gc();                     /* parser runs without GC */+      n = parse_FILE(ptr);+      RETIO(n);+#endif+    case T_IO_GETARGS:+      CHECKIO(0);+      {+      /* compute total number of characters */+        size_t size = 0;+        for(int i = 0; i < glob_argc; i++) {+          size += strNodes(strlen(glob_argv[i]));+        }+        /* The returned list will need a CONS for each string, and a NIL */+        size += glob_argc * 2 + 1;+        GCCHECK(size);+        /*+        printf("total size %d:", size);+        for(int i = 0; i < glob_argc; i++)+          printf(" %s", glob_argv[i]);+        printf("\n");+        */+        n = mkNil();+        for(int i = glob_argc-1; i >= 0; i--) {+          n = mkCons(mkString(glob_argv[i], strlen(glob_argv[i])), n);+        }+      }+      RETIO(n);+    case T_IO_DROPARGS:+      CHECKIO(1);+      c = (int)evalint(ARG(TOP(1)));+      if (c > glob_argc)+        c = glob_argc;+      glob_argc -= c;+      glob_argv += c;+      RETIO(combUnit);+    case T_IO_CCALL:+      {+        int a = (int)GETVALUE(n);+        funptr_t f = ffi_table[a].ffi_fun;+        value_t ri, xi, yi;+        double rd, xd;+        void *xp, *yp, *rp;+#define INTARG(n) evalint(ARG(TOP(n)))+#define PTRARG(n) evalptr(ARG(TOP(n)))+#define DBLARG(n) evaldbl(ARG(TOP(n)))+#define FFIV(n) CHECKIO(n)+#define FFI(n)  CHECKIO(n); GCCHECK(1)+        /* This isn't great, but this is MicroHs, so it's good enough. */+        switch (ffi_table[a].ffi_how) {+        case FFI_V:   FFIV(0);                                      (*                               f)();                     RETIO(combUnit);+        case FFI_I:   FFI (0);                                 ri = (*(value_t (*)(void            ))f)();      n = mkInt(ri); RETIO(n);+        case FFI_i:   FFI (0);                                 ri = (*(int     (*)(void            ))f)();      n = mkInt(ri); RETIO(n);+        case FFI_IV:  FFIV(1); xi = INTARG(1);                      (*(void    (*)(value_t         ))f)(xi);                   RETIO(combUnit);+        case FFI_II:  FFI (1); xi = INTARG(1);                 ri = (*(value_t (*)(value_t         ))f)(xi);    n = mkInt(ri); RETIO(n);+        case FFI_IIV: FFIV(2); xi = INTARG(1); yi = INTARG(2);      (*(void    (*)(value_t, value_t))f)(xi,yi);                RETIO(combUnit);+        case FFI_III: FFI (2); xi = INTARG(1); yi = INTARG(2); ri = (*(value_t (*)(value_t, value_t))f)(xi,yi); n = mkInt(ri); RETIO(n);+        case FFI_DD:  FFI (1); xd = DBLARG(1);                 rd = (*(double  (*)(double          ))f)(xd);    n = mkDbl(rd); RETIO(n);+        case FFI_PI:  FFI (1); xp = PTRARG(1);                 ri = (*(value_t (*)(void*           ))f)(xp);    n = mkInt(ri); RETIO(n);+        case FFI_Pi:  FFI (1); xp = PTRARG(1);                 ri = (*(int     (*)(void*           ))f)(xp);    n = mkInt(ri); RETIO(n);+        case FFI_IP:  FFI (1); xi = INTARG(1);                 rp = (*(void*   (*)(value_t         ))f)(xi);    n = mkPtr(rp); RETIO(n);+        case FFI_PP:  FFI (1); xp = PTRARG(1);                 rp = (*(void*   (*)(void*           ))f)(xp);    n = mkPtr(rp); RETIO(n);+        case FFI_PV:  FFI (1); xp = PTRARG(1);                      (*(void    (*)(void*           ))f)(xp);                   RETIO(combUnit);+        case FFI_PPI: FFI (2); xp = PTRARG(1);yp = PTRARG(2);  ri = (*(value_t (*)(void*, void*    ))f)(xp,yp); n = mkInt(ri); RETIO(n);+        case FFI_PPP: FFI (2); xp = PTRARG(1);yp = PTRARG(2);  rp = (*(void*   (*)(void*, void*    ))f)(xp,yp); n = mkPtr(rp); RETIO(n);+        case FFI_IPI: FFI (2); xi = INTARG(1);yp = PTRARG(2);  ri = (*(value_t (*)(value_t, void*  ))f)(xi,yp); n = mkInt(ri); RETIO(n);+        case FFI_iPi: FFI (2); xi = INTARG(1);yp = PTRARG(2);  ri = (*(int     (*)(int,   void*    ))f)(xi,yp); n = mkInt(ri); RETIO(n);+        default: ERR("T_IO_CCALL");+        }+      }++    case T_IO_CATCH:+      {+        struct handler *h = malloc(sizeof *h);+        if (!h)+          memerr();+        CHECKIO(2);+        h->hdl_old = cur_handler;+        h->hdl_stack = stack_ptr;+        cur_handler = h;+        if (setjmp(h->hdl_buf)) {+          /* An exception occurred: */+          stack_ptr = h->hdl_stack;+          x = h->hdl_exn;       /* exception value */+          GCCHECKSAVE(x, 1);+          f = ARG(TOP(2));      /* second argument, handler */+          n = new_ap(f, x);+          cur_handler = h->hdl_old;+          free(h);+          POP(3);+          goto top;+        } else {+          /* Normal execution: */+          n = execio(ARG(TOP(1))); /* execute first argument */+          cur_handler = h->hdl_old; /* restore old handler */+          free(h);+          RETIO(n);             /* return result */+        }+      }++    case T_NEWCASTRING:+      CHECKIO(1);+      name = evalstring(ARG(TOP(1)));+      GCCHECK(1);+      n = alloc_node(T_PTR);+      PTR(n) = name;+      RETIO(n);++    case T_PEEKCASTRING:+      CHECKIO(1);+      name = evalptr(ARG(TOP(1)));+      GCCHECK(strNodes(strlen(name)));+      RETIO(mkStringC(name));++    default:+      ERR1("execio tag %d", GETTAG(n));+    }+  }+}++heapoffs_t+memsize(const char *p)+{+  heapoffs_t n = atoi(p);+  while (isdigit(*p))+    p++;+  switch (*p) {+  case 'k': case 'K': n *= 1000; break;+  case 'm': case 'M': n *= 1000000; break;+  case 'g': case 'G': n *= 1000000000; break;+  default: break;+  }+  return n;+}++extern uint8_t *combexpr;+extern int combexprlen;++int+main(int argc, char **argv)+{+  char *inname = 0;+  char **av;+  NODEPTR prog;+  int inrts;+#if WANT_STDIO+  char *outname = 0;+  size_t file_size;+#endif+  +#if 0+  /* MINGW doesn't do buffering right */+  setvbuf(stdout, NULL, _IOLBF, BUFSIZ);+  setvbuf(stderr, NULL, _IONBF, BUFSIZ);+#endif++  argc--, argv++;+  glob_argv = argv;+  for (av = argv, inrts = 0; argc--; argv++) {+    char *p = *argv;+    if (inrts) {+      if (strcmp(p, "-RTS") == 0) {+        inrts = 0;+      } else {+        if (strcmp(p, "-v") == 0)+          verbose++;+        else if (strncmp(p, "-H", 2) == 0)+          heap_size = memsize(&p[2]);+        else if (strncmp(p, "-K", 2) == 0)+          stack_size = memsize(&p[2]);+        else if (strncmp(p, "-r", 2) == 0)+          inname = &p[2];+#if WANT_STDIO+        else if (strncmp(p, "-o", 2) == 0)+          outname = &p[2];+#endif  /* WANT_STDIO */+        else+          ERR("Usage: eval [+RTS [-v] [-Hheap-size] [-Kstack-size] [-rFILE] [-oFILE] -RTS] arg ...");+      }+    } else {+      if (strcmp(p, "+RTS") == 0) {+        inrts = 1;+      } else {+        *av++ = p;+      }+    }+  }+  glob_argc = av - glob_argv;++  if (inname == 0)+    inname = "out.comb";++  init_nodes();+  stack = malloc(sizeof(NODEPTR) * stack_size);+  if (!stack)+    memerr();++  if (combexpr) {+    int c;+    struct BFILE_buffer ibf = { { getb_buf, ungetb_buf, closeb_buf }, combexprlen, 0, combexpr };+    BFILE *bf = (BFILE*)&ibf;+    c = bf->getb(bf);+    /* Compressed combinators start with a 'Z', otherwise 'v' (for version) */+    if (c == 'Z') {+      /* add compressor transducer */+      bf = add_lzw_decompressor(bf);+    } else {+      /* put it back, we need it */+      bf->ungetb(c, bf);+    }+    prog = parse_top(bf);+    bf->closeb(bf);+  } else {+#if WANT_STDIO+    prog = parse_file(inname, &file_size);+#else+    ERR("no stdio");+#endif+  }++  PUSH(prog); gc(); prog = TOP(0); POP(1);+#if WANT_STDIO+  heapoffs_t start_size = num_marked;+  if (outname) {+    /* Save GCed file (smaller), and exit. */+    FILE *out = fopen(outname, "w");+    if (!out)+      ERR1("cannot open output file %s", outname);+    print(out, prog, 1);+    fclose(out);+    exit(0);+  }+  if (verbose > 2) {+    //pp(stdout, prog);+    print(stdout, prog, 1);+  }+#endif+  run_time -= GETTIMEMILLI();+  NODEPTR res = execio(prog);+  res = evali(res);+  run_time += GETTIMEMILLI();+#if WANT_STDIO+  if (0) {+    FILE *out = fopen("prog.comb", "w");+    print(out, prog, 1);+    fclose(out);+  }+  if (verbose) {+    if (verbose > 1) {+      printf("\nmain returns ");+      pp(stdout, res);+      printf("node size=%"PRIheap", heap size bytes=%"PRIheap"\n", (heapoffs_t)NODE_SIZE, heap_size * NODE_SIZE);+    }+    setlocale(LC_NUMERIC, "");  /* Make %' work on platforms that support it */+    printf("%"PCOMMA"15"PRIheap" combinator file size\n", (heapoffs_t)file_size);+    printf("%"PCOMMA"15"PRIheap" cells at start\n", start_size);+    printf("%"PCOMMA"15"PRIheap" cells heap size (%"PCOMMA""PRIheap" bytes)\n", heap_size, heap_size * NODE_SIZE);+    printf("%"PCOMMA"15"PRIcounter" cells allocated (%"PCOMMA".1f Mbyte/s)\n", num_alloc, num_alloc * NODE_SIZE / ((double)run_time / 1000) / 1000000);+    printf("%"PCOMMA"15"PRIcounter" GCs\n", num_gc);+    printf("%"PCOMMA"15"PRIcounter" max cells used\n", max_num_marked);+    printf("%"PCOMMA"15"PRIcounter" reductions (%"PCOMMA".1f Mred/s)\n", num_reductions, num_reductions / ((double)run_time / 1000) / 1000000);+    printf("%15.2fs total expired time\n", (double)run_time / 1000);+    printf("%15.2fs total gc time\n", (double)gc_mark_time / 1000);+#if GCRED && 0+    printf(" GC reductions A=%d, K=%d, I=%d, int=%d\n", red_a, red_k, red_i, red_int);+#endif+  }+#endif  /* WANT_STDIO */+  exit(0);+}
+ tests/Arith.hs view
@@ -0,0 +1,8 @@+module Arith(module Arith) where+import Prelude++main :: IO ()+main = do+  putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(+),( - ),(*)] ]+  putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,1,2,5::Int], op <- [quot, rem] ]+  putStrLn $ show [ op x y | x <- [0 - 5,0 - 2,0 - 1,0,1,2,5]::[Int], y <- [0 - 5,0 - 2,0 - 1,0,1,2,5::Int], op <- [(==),(/=),(<),(<=),(>),(>=)] ]
+ tests/Arith.ref view
@@ -0,0 +1,3 @@+[-10,0,25,-7,-3,10,-6,-4,5,-5,-5,0,-4,-6,-5,-3,-7,-10,0,-10,-25,-7,3,10,-4,0,4,-3,-1,2,-2,-2,0,-1,-3,-2,0,-4,-4,3,-7,-10,-6,4,5,-3,1,2,-2,0,1,-1,-1,0,0,-2,-1,1,-3,-2,4,-6,-5,-5,5,0,-2,2,0,-1,1,0,0,0,0,1,-1,0,2,-2,0,5,-5,0,-4,6,-5,-1,3,-2,0,2,-1,1,1,0,2,0,1,3,-1,2,6,-4,5,-3,7,-10,0,4,-4,1,3,-2,2,2,0,3,1,2,4,0,4,7,-3,10,0,10,-25,3,7,-10,4,6,-5,5,5,0,6,4,5,7,3,10,10,0,25]+[1,0,2,-1,5,0,-5,0,-2,-1,-1,0,0,-2,1,0,2,0,-2,0,-1,0,0,-2,0,-1,0,-1,1,0,-1,0,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,-1,0,1,0,0,1,0,1,0,2,-1,0,-2,0,2,0,1,0,0,2,-1,0,-2,1,-5,0,5,0,2,1,1,0]+[True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True]
+ tests/Case.hs view
@@ -0,0 +1,70 @@+module Case(module Case) where+import Prelude++main :: IO ()+main = do+  putStrLn $ show $ f1 False+  putStrLn $ show  $ f2 False+  putStrLn $ show  $ f2 True+--  putStrLn $ showInt  $ f3 False+  putStrLn $ show $ map f4 [R,G,B]+  putStrLn $ show $ f5 [(3::Int,4::Int)]+  --putStrLn $ showInt $ f6 [(3,4)]+  putStrLn $ show $ [ i | Just i <- [Just (1::Int), Nothing, Just 2] ]+  (x,y) <- return (2::Int,3::Int)+  putStrLn $ show $ x + y++f1 :: Bool -> Bool+f1 b =+  case b of+    c -> c++f2 :: Bool -> Int+f2 b =+  case b of+    True -> 1+    _    -> 0++f3 :: Bool -> Int+f3 b =+  case b of+    True -> 1++data RGB = R | G | B++instance Show RGB where+  show = showRGB++showRGB :: RGB -> String+showRGB c =+  case c of+    R -> "R"+    G -> "G"+    B -> "B"++nextRGB :: RGB -> RGB+nextRGB c =+  case c of+    R -> G+    G -> B+    B -> R++f4 :: RGB -> RGB+f4 c =+  case nextRGB c of+    R -> R+    k -> nextRGB k++f5 :: [(Int, Int)] -> Int+f5 arg =+  case arg of+    [] -> 0+    (x,y) : _ -> x+y++{-+f6 :: [(Int, Int)] -> Int+f6 arg =+  case arg of+    [] -> 0+    (x,y) : ((u,v) : _) -> x+y+-}
+ tests/Case.ref view
@@ -0,0 +1,7 @@+False+0+1+[B,R,R]+7+[1,2]+5
+ tests/Catch.hs view
@@ -0,0 +1,22 @@+module Catch(main) where+import Prelude+import Control.Exception++f :: [Int] -> Int+f (_:_) = 99++class C a where+  m :: a -> Int++instance C ()++main :: IO ()+main = do+  x <- catch (return ("o" ++ "k")) (\ _ -> return "what?")+  putStrLn $ show x+  y <- catch (do { error "bang!"; return "yyy" }) (\ (Exn s) -> return s)+  putStrLn $ show y+  z <- catch (do { print (f []); return "zzz" })  (\ (Exn s) -> return s)+  putStrLn $ show z+  w <- catch (do { print (m ()); return "www" })  (\ (Exn s) -> return s)+  putStrLn $ show w
+ tests/Catch.ref view
@@ -0,0 +1,4 @@+"ok"+"bang!"+"no match at ./Catch.hs, line 6, col 1"+"no default for C.m"
+ tests/Class.hs view
@@ -0,0 +1,45 @@+module Class(main) where+import Primitives+import Prelude++class Eqq a where+  (===) :: a -> a -> Bool+  (/==) :: a -> a -> Bool+  x /== y = not (x === y)++instance Eqq Int where+  (===) = primIntEQ++instance Eqq Char where+  (===) = primCharEQ++instance forall a . Eqq a => Eqq [a] where+  []     === []      =  True+  (x:xs) === (y:ys)  =  x === y && xs === ys+  _      === _       =  False++class (Eqq a) => Ordd a where+  (<==) :: a -> a -> Bool++instance Ordd Int where+  (<==) = (<=)++instance forall a b . (Eqq a, Eqq b) => Eqq (a, b) where+  (a, b) === (a', b')  =  a === a' && b === b'++f :: forall a . Eqq a => a -> Bool+f x = x === x++g :: forall a . Ordd a => a -> Bool+g x = x /== x++h :: forall a b . (Eqq a, Eqq b) => a -> b -> Bool+h a b = a === a && b === b++main :: IO ()+main = do+  putStrLn $ show $ f (5::Int)+  putStrLn $ show $ g (5::Int)+  putStrLn $ show $ h (5::Int) 'a'+  putStrLn $ show $ f [88::Int]+  putStrLn $ show $ f (1::Int, 'a')
+ tests/Class.ref view
@@ -0,0 +1,5 @@+True+False+True+True+True
+ tests/Default.hs view
@@ -0,0 +1,9 @@+module Default(main) where+import Prelude+default (Int, Double)++main :: IO ()+main = do+  print 1+  print 1.2+  print []   -- defaults to Int, a little weird
+ tests/Default.ref view
@@ -0,0 +1,3 @@+1+1.2+[]
+ tests/Enum.hs view
@@ -0,0 +1,12 @@+module Enum(main) where+import Prelude++main :: IO ()+main = do+  putStrLn $ show [1::Int .. 5]+  putStrLn $ show [1::Int .. 1]+  putStrLn $ show [1::Int .. 0]+  putStrLn $ show [1,3::Int .. 10]+  putStrLn $ show [1::Int, -1 .. -5]+  putStrLn $ show $ take 5 [1::Int ..]+  putStrLn $ show $ take 5 [1,3::Int ..]
+ tests/Enum.ref view
@@ -0,0 +1,7 @@+[1,2,3,4,5]+[1]+[]+[1,3,5,7,9]+[1,-1,-3,-5]+[1,2,3,4,5]+[1,3,5,7,9]
+ tests/Eq.hs view
@@ -0,0 +1,20 @@+module Eq(main) where+import Prelude+import Data.Double()++main :: IO ()+main = do+  putStrLn $ show [1==(1::Int), 'a'=='a', 1.1==(1.1::Double),+                   True==True, False==False,+                   (Nothing::Maybe Int)==Nothing, Just (1::Int) == Just 1,+                   [1,2,3] == [1,2,3::Int],+                   (1,2) == (1::Int,2::Int),+                   (Left 1 :: Either Int Char) == Left 1, (Right 'a' :: Either Int Char) == Right 'a'+                  ]+  putStrLn $ show [1==(2::Int), 'a'=='b', 1.1==(1.2::Double),+                   True==False, False==True,+                   Nothing==Just (1::Int), Just (1::Int) == Nothing,+                   [1,2,3] == [1,2,4::Int],+                   (1,2) == (1::Int,4::Int),+                   Left (1::Int) == Right 'a', Right 'a' == Left (1::Int)+                  ]
+ tests/Eq.ref view
@@ -0,0 +1,2 @@+[True,True,True,True,True,True,True,True,True,True,True]+[False,False,False,False,False,False,False,False,False,False,False]
+ tests/Exists.hs view
@@ -0,0 +1,42 @@+module Exists(main) where+import Prelude++data E = forall a . Show a => C a++es :: [E]+es = [C True, C 'a', wrap (C (1::Int))]++instance Show E where+  show (C a) = show a++wrap :: E -> E+wrap (C a) = C [a]++eio :: IO E+eio = return (C True)++someE :: E+someE = C (Just 'a')++foo :: E -> String+foo x | C a <- x = show a++bar :: E -> String+bar x =+  case x of+    C a -> show a++data T a = Show a => T a++sh :: forall a . T a -> String+sh (T a) = show a++main :: IO ()+main = do+  print es+  C x <- eio+  print x+  putStrLn (foo someE)+  putStrLn (bar someE)+  putStrLn (sh (T True))+  putStrLn (sh (T 'x'))
+ tests/Exists.ref view
@@ -0,0 +1,6 @@+[True,'a',[1]]+True+Just 'a'+Just 'a'+True+'x'
+ tests/ExistsBug.hs view
@@ -0,0 +1,18 @@+module Exists(main) where+import Prelude++data E = forall a . Show a => C a++es :: [E]+es = [C True, C 'a']++instance Show E where+  show (C a) = show a++xx :: Int+xx =+  let f (C a) = a+  in  length $ map f [C 'a', C True]++main :: IO ()+main = print es
+ tests/FArith.hs view
@@ -0,0 +1,24 @@+module FArith(module FArith) where++import Prelude+import Text.String++list1 :: [Double]+list1 = [-100.343241, -53.3248973, 0.0, 1.0, 1.23453523, 3243534.34534, 999.999]++list2 :: [Double]+list2 = [-100.343241, -53.3248973, 0.0, 1.0, 1.23453523, 3243534.34534, 999.999, 1.2e33]++divide :: Double -> Double -> Double+divide x y = if y == 0.0 then 0.0 else x / y++main :: IO ()+main = do+  putStrLn $ show [ op x y | x <- list1, y <- list2, op <- [(+), (-), (*), divide] ]+  putStrLn $ show [ op x y | x <- list1, y <- list2, op <- [(==), (/=), (<), (<=), (>), (>=)] ]+  putStrLn $ show [ x / y | x <- [2.234983, 1.232, 23.0::Double], y <- [1.0, 5.0, 10.0, 100.0]]+  putStrLn $ show [ x / y | x <- [-2.234983, -1.232, -23.0::Double], y <- [1.0, -5.0, 10.0, -100.0]]+  let str = readDouble "1.576"+  putStrLn $ show str+  putStrLn $ show $ 1.0 + readDouble "2.5"+  putStrLn $ show $ map readDouble ["1.5e42", "1.2e-90"]
+ tests/FArith.ref view
@@ -0,0 +1,7 @@+[-200.686482,0.0,10068.76601438408,1.0,-153.6681383,-47.0183437,5350.79302107415,1.881733413108702,-100.343241,-100.343241,-0.0,0.0,-99.34324100000001,-101.343241,-100.343241,-100.343241,-99.10870577,-101.57777623,-123.8772661068804,-81.28017618419848,3243434.002099,-3243634.688581,-325466748.5062289,-3.093638923360364e-05,899.655759,-1100.342241,-100343.140656759,-0.1003433413433413,1.2e+33,-1.2e+33,-1.204118892e+35,-8.36193675e-32,-153.6681383,47.0183437,5350.79302107415,0.53142490484237,-106.6497946,0.0,2843.544672055548,1.0,-53.3248973,-53.3248973,-0.0,0.0,-52.3248973,-54.3248973,-53.3248973,-53.3248973,-52.09036207,-54.55943253,-65.83146435298188,-43.19430989425875,3243481.0204427,-3243587.6702373,-172961135.8542782,-1.644036770463433e-05,946.6741027,-1053.3238973,-53324.8439751027,-0.05332495062495063,1.2e+33,-1.2e+33,-6.398987676000001e+34,-4.443741441666667e-32,-100.343241,100.343241,-0.0,-0.0,-53.3248973,53.3248973,-0.0,-0.0,0.0,0.0,0.0,0.0,1.0,-1.0,0.0,0.0,1.23453523,-1.23453523,0.0,0.0,3243534.34534,-3243534.34534,0.0,0.0,999.999,-999.999,0.0,0.0,1.2e+33,-1.2e+33,0.0,0.0,-99.34324100000001,101.343241,-100.343241,-0.009965793311380085,-52.3248973,54.3248973,-53.3248973,-0.01875296626215912,1.0,1.0,0.0,0.0,2.0,0.0,1.0,1.0,2.23453523,-0.2345352300000001,1.23453523,0.8100214361642801,3243535.34534,-3243533.34534,3243534.34534,3.083056609024981e-07,1000.999,-998.999,999.999,0.001000001000001,1.2e+33,-1.2e+33,1.2e+33,8.333333333333333e-34,-99.10870577,101.57777623,-123.8772661068804,-0.01230312293779708,-52.09036207,54.55943253,-65.83146435298188,-0.02315119751763685,1.23453523,1.23453523,0.0,0.0,2.23453523,0.2345352300000001,1.23453523,1.23453523,2.46907046,0.0,1.524077234111153,1.0,3243535.57987523,-3243533.11080477,4004257.419037217,3.806141999925675e-07,1001.23353523,-998.76446477,1234.53399546477,0.001234536464536465,1.2e+33,-1.2e+33,1.481442276e+33,1.028779358333333e-33,3243434.002099,3243634.688581,-325466748.5062289,-32324.39288402096,3243481.0204427,3243587.6702373,-172961135.8542782,-60825.89014831539,3243534.34534,3243534.34534,0.0,0.0,3243535.34534,3243533.34534,3243534.34534,3243534.34534,3243535.57987523,3243533.11080477,4004257.419037217,2627332.348660475,6487068.69068,0.0,10520515049400.18,1.0,3244534.34434,3242534.34634,3243531101.805655,3243.537588877589,1.2e+33,-1.2e+33,3.892241214408e+39,2.702945287783333e-27,899.655759,1100.342241,-100343.140656759,-9.965783345586773,946.6741027,1053.3238973,-53324.8439751027,-18.75294750919286,999.999,999.999,0.0,0.0,1000.999,998.999,999.999,999.999,1001.23353523,998.76446477,1234.53399546477,810.020626142844,3244534.34434,-3242534.34634,3243531101.805655,0.0003083053525968371,1999.998,0.0,999998.000001,1.0,1.2e+33,-1.2e+33,1.1999988e+36,8.333325e-31]+[True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,True,True,False,False,False,True,True,True,False,False,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,True,False,False,True,False,True,False,True,False,False,True,True,False,True,True,True,False,False,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,False,False,True,True,False,True,True,True,False,False,True,False,False,True,False,True,False,True,True,True,False,False]+[2.234983,0.4469966,0.2234983,0.02234983,1.232,0.2464,0.1232,0.01232,23.0,4.6,2.3,0.23]+[-2.234983,0.4469966,-0.2234983,0.02234983,-1.232,0.2464,-0.1232,0.01232,-23.0,4.6,-2.3,0.23]+1.576+3.5+[1.5e+42,1.2e-90]
+ tests/Fac.hs view
@@ -0,0 +1,23 @@+-- Simple test+module Fac(module Fac) where+import Prelude++fac :: Int -> Int  -- ignored+fac n =+  case n == 0 of+    False -> n * fac (n - 1)+    True  -> 1++nfib :: Int -> Int   -- ignored+nfib n =+  case n < 2 of+    False -> nfib (n - 1) + nfib (n - 2) + 1+    True  -> 1++res :: (Int, Int)+res = (fac 10, nfib 30)++main :: IO ()+main = do+  print $ fac 6+  print $ fst res + snd res
+ tests/Fac.ref view
@@ -0,0 +1,2 @@+720+6321337
+ tests/Floating.hs view
@@ -0,0 +1,8 @@+module Floating(main) where+import Prelude++main :: IO ()+main = do+  print $ log (1000::Double)+  print $ cos (pi::Double)+  print $ sqrt (4::Double)
+ tests/Floating.ref view
@@ -0,0 +1,3 @@+6.907755278982137+-1.0+2.0
+ tests/Foreign.hs view
@@ -0,0 +1,11 @@+module Foreign(main) where+import Prelude++foreign import ccall "llabs" abs :: Int -> IO Int++main :: IO ()+main = do+  x1 <- abs (3 - 8)+  putStrLn $ show x1+  x2 <- abs (10 - 8)+  putStrLn $ show x2
+ tests/Foreign.ref view
@@ -0,0 +1,2 @@+5+2
+ tests/FunDep.hs view
@@ -0,0 +1,11 @@+module FunDep(main) where++class C a b | a -> b where+  f :: a -> b++--instance C Char Int where+--  f = chr++class Plus a b c | a b -> c, b c -> a, c a -> b where+  plus :: a -> b -> c+
+ tests/Guard.hs view
@@ -0,0 +1,15 @@+module Guard(main) where+import Prelude++f :: [Int] -> Int+f [x] | x < 0 = 0 - x+      | x < 10 = x+1+      | otherwise = 99+f [x,y] = x+y+f xs | l < 4 = 0+     | otherwise = l+   where { l = length xs }++main :: IO ()+main = do+  putStrLn $ show [f [0 - 7], f [5], f [20], f [2,3], f [1,2,3], f[1,2,3,4]]
+ tests/Guard.ref view
@@ -0,0 +1,1 @@+[7,6,99,5,0,4]
+ tests/Hello.hs view
@@ -0,0 +1,5 @@+module Hello(main) where+import Prelude++main :: IO ()+main = putStrLn "hello, world\n"
+ tests/Hello.ref view
@@ -0,0 +1,2 @@+hello, world+
+ tests/IOTest.hs view
@@ -0,0 +1,48 @@+module IOTest(module IOTest) where+import Prelude+import System.IO as IO+import System.Environment+import Debug.Trace++f :: Int -> Int+f x = x*2+1++foo :: IO ()+foo = do+  putStrLn "foo 1"+  putStrLn "foo 2"++main :: IO ()+main = do+  tstart <- getTimeMilli+  putChar 'a'+  putChar 'b'+  c <- getChar+  putStrLn [c,c,c]+  let { p = putStrLn "hello" }+  p+  p+  p+  cprint ((+) :: Int->Int->Int)+  hout <- openFile "test.tmp" WriteMode+  hPutChar hout 'a'+  hPutChar hout 'z'+  hClose hout+  hin <- openFile "test.tmp" ReadMode+  c1 <- hGetChar hin+  c2 <- hGetChar hin+  putStrLn $ show (c1, c2)+  writeFile "test2.tmp" "more\n"+  s <- readFile "test2.tmp"+  putStrLn (show s)+  writeSerialized "f.tmp" f+  g <- readSerialized "f.tmp"+  putStrLn $ show $ (g (5::Int) :: Int)+  foo+  putStrLn $ show $ trace "tracing" (5::Int)+  as <- getArgs+  putStrLn $ show as+  putStrLn $ show $ seq ((1::Int) + (2::Int)) (5::Int)+  putStrLn $ show $ seq ((1::Int) + trace "seq" (2::Int)) (5::Int)+  tend <- getTimeMilli+  putStrLn $ show (tend - tstart) ++ "ms execution time"
+ tests/IOTest.ref view
@@ -0,0 +1,17 @@+abqqq+hello+hello+hello+++('a','z')+"more\n"+11+foo 1+foo 2+tracing+5+["a","bb","ccc"]+5+seq+5+1ms execution time
+ tests/Infix.hs view
@@ -0,0 +1,19 @@+module Infix(main) where+import Prelude++infix 1 ===+infixl 2 ++++infixr 3 &&&++(===) :: Int -> Int -> Bool+x === y = x == y+1++(+++) :: Int -> Int -> Int+a +++ b = a + b + 1++(&&&) :: Int -> Int -> Int+a &&& b = a * (b + 1)++main :: IO ()+main = do+  putStrLn $ show $ 2 +++ 3 &&& 4 === 17
+ tests/Infix.ref view
@@ -0,0 +1,1 @@+True
+ tests/Kind.hs view
@@ -0,0 +1,6 @@+module Kind(main) where++data TypeRep k (a::k) = T++class C k (a :: k) where+  typeRep :: TypeRep k a
+ tests/ListTest.hs view
@@ -0,0 +1,9 @@+module ListTest(module ListTest) where+import Prelude++main :: IO ()+main = do+  putStrLn $ show $ sum [1,2,3::Int]+  putStrLn $ show $ product [1,2,3,4::Int]+  putStrLn $ show $ and [True]+  putStrLn $ show $ and [True, False]
+ tests/ListTest.ref view
@@ -0,0 +1,4 @@+6+24+True+False
+ tests/LitMatch.hs view
@@ -0,0 +1,31 @@+module LitMatch(main) where+import Prelude++f :: Int -> Int+f 0 = 10+f 1 = 20+f n = 0++g :: Int -> Int -> Int+g 1 0 = 10+g 2 0 = 20+g 2 1 = 21+g 1 1 = 11+g _ _ = 99++h :: Char -> Int+h 'a' = 1+h 'b' = 2+h _ = 3++s :: String -> Int+s "apa" = 1+s "foo" = 2+s _ = 3++main :: IO ()+main = do+  putStrLn $ show [f 0, f 1, f 10]+  putStrLn $ show [g 1 0, g 1 1, g 2 0, g 2 1, g 2 2]+  putStrLn $ show [h 'a', h 'b', h 'c']+  putStrLn $ show [s "aaa", s "apa", s "foo"]
+ tests/LitMatch.ref view
@@ -0,0 +1,4 @@+[10,20,0]+[10,11,20,21,99]+[1,2,3]+[3,1,2]
+ tests/LocalPoly.hs view
@@ -0,0 +1,12 @@+module LocalPoly(main) where+import Prelude++main :: IO ()+main = do+  putStrLn $ show $ f 1 "a"++f :: forall b . Int -> b -> ((Int, b), (b, b))+f x b = (i x, i b)+  where+    i :: forall a . a -> (a, b)+    i a = (a, b)
+ tests/LocalPoly.ref view
@@ -0,0 +1,1 @@+((1,"a"),("a","a"))
+ tests/Makefile view
@@ -0,0 +1,45 @@+MHS=../bin/gmhs -i../lib+EVAL=../bin/mhseval+.PHONY: test time clean errtest alltest++alltest:	test errtest++test:+	$(MHS) Hello      && $(EVAL) > Hello.out      && diff Hello.ref Hello.out+	$(MHS) IOTest && (echo q | $(EVAL) a bb ccc | sed 's/^.ms/1ms/' > IOTest.out) && diff IOTest.ref IOTest.out+	$(MHS) StringTest && $(EVAL) > StringTest.out && diff StringTest.ref StringTest.out+	$(MHS) ListTest   && $(EVAL) > ListTest.out   && diff ListTest.ref ListTest.out+	$(MHS) Fac        && $(EVAL) > Fac.out        && diff Fac.ref Fac.out+	$(MHS) Misc       && $(EVAL) > Misc.out       && diff Misc.ref Misc.out+	$(MHS) Case       && $(EVAL) > Case.out       && diff Case.ref Case.out+	$(MHS) Arith      && $(EVAL) > Arith.out      && diff Arith.ref Arith.out+	$(MHS) Guard      && $(EVAL) > Guard.out      && diff Guard.ref Guard.out+	$(MHS) Newtype    && $(EVAL) > Newtype.out    && diff Newtype.ref Newtype.out+	$(MHS) LitMatch   && $(EVAL) > LitMatch.out   && diff LitMatch.ref LitMatch.out+	$(MHS) Word       && $(EVAL) > Word.out       && diff Word.ref Word.out+	$(MHS) Enum       && $(EVAL) > Enum.out       && diff Enum.ref Enum.out+	$(MHS) Foreign    && $(EVAL) > Foreign.out    && diff Foreign.ref Foreign.out+	$(MHS) MutRec     && $(EVAL) > MutRec.out     && diff MutRec.ref MutRec.out+	$(MHS) LocalPoly  && $(EVAL) > LocalPoly.out  && diff LocalPoly.ref LocalPoly.out+	$(MHS) Rank2      && $(EVAL) > Rank2.out      && diff Rank2.ref Rank2.out+	$(MHS) Catch      && $(EVAL) > Catch.out      && diff Catch.ref Catch.out+	$(MHS) FArith     && $(EVAL) > FArith.out     && diff FArith.ref FArith.out+	$(MHS) Infix      && $(EVAL) > Infix.out      && diff Infix.ref Infix.out+	$(MHS) Class      && $(EVAL) > Class.out      && diff Class.ref Class.out+	$(MHS) Eq         && $(EVAL) > Eq.out         && diff Eq.ref Eq.out+	$(MHS) Floating   && $(EVAL) > Floating.out   && diff Floating.ref Floating.out+	$(MHS) Default    && $(EVAL) > Default.out    && diff Default.ref Default.out+	$(MHS) Multi      && $(EVAL) > Multi.out      && diff Multi.ref Multi.out+	$(MHS) Exists     && $(EVAL) > Exists.out     && diff Exists.ref Exists.out+	$(MHS) TypeEq     && $(EVAL) > TypeEq.out     && diff TypeEq.ref TypeEq.out+	$(MHS) Sieve      && $(EVAL) > Sieve.out      && diff Sieve.ref Sieve.out++errtest:+	sh errtester.sh < errmsg.test++time:+	@echo Expect about 10s runtime+	$(MHS) Nfib && time -p $(EVAL)++clean:+	rm -f *.out *.tmp
+ tests/Misc.hs view
@@ -0,0 +1,11 @@+module Misc(module Misc) where+import Prelude++first :: forall a b . (a, b) -> a+first ab =+  let { (a, b) = ab }+  in  a++main :: IO ()+main = do+  print $ first (10::Int,20::Int)
+ tests/Misc.ref view
@@ -0,0 +1,1 @@+10
+ tests/Multi.hs view
@@ -0,0 +1,20 @@+module Multi(main) where+import Prelude++class C a b where+  conv :: a -> b++instance C Int Bool where+  conv x = x /= 0++instance C Int Char where+  conv = chr++instance C Char Int where+  conv = ord++main :: IO ()+main = do+  print (conv (100::Int) :: Bool)+  print (conv (100::Int) :: Char)+  print (conv 'a' :: Int)
+ tests/Multi.ref view
@@ -0,0 +1,3 @@+True+'d'+97
+ tests/MutRec.hs view
@@ -0,0 +1,8 @@+module MutRec(main) where+import Prelude++main :: IO ()+main = do+  let even i = if i == 0 then True  else odd  (i - 1)+      odd  i = if i == 0 then False else even (i - 1)+  putStrLn $ show $ map even [1::Int .. 5] ++ map odd [1 .. 5]
+ tests/MutRec.ref view
@@ -0,0 +1,1 @@+[False,True,False,True,False,True,False,True,False,True]
+ tests/Newtype.hs view
@@ -0,0 +1,19 @@+module Newtype(main) where+import Prelude++newtype N = N Int+newtype M a = M a++f :: N -> Int+f (N x) = x++g :: M (Int, Int) -> M Int+g (M (x, y)) = M x++showM :: forall a . (a -> String) -> M a -> String+showM sh (M x) = "(M " ++ sh x ++ ")"++main :: IO ()+main = do+  putStrLn $ show [f (N 1), f (N 2)]+  putStrLn $ showM show (g (M (3,4)))
+ tests/Newtype.ref view
@@ -0,0 +1,2 @@+[1,2]+(M 3)
+ tests/Nfib.hs view
@@ -0,0 +1,17 @@+module Nfib(main) where+import Prelude++nfib :: Int -> Int+nfib n =+  case n < 2 of+    False -> nfib (n - 1) + nfib (n - 2) + 1+    True  -> 1++main :: IO ()+main = print (nfib 44)++-- Typical nfib/s is 10M+-- mhs+-- 126491971 / 15.68 = 8.07M+-- ghc+-- 126491971 / 0.236 = 535M
+ tests/Rank2.hs view
@@ -0,0 +1,20 @@+module Rank2(main) where+import Prelude++f :: (forall a . a -> a) -> (Int, Bool)+f i = (i (1::Int), i True)++g :: (forall a . a -> Int -> a) -> (Int, Bool)+g c = (c (1::Int) (1::Int), c True (1::Int))++data Id = Id (forall a . a -> a)++iD :: Id+iD = Id (\ x -> x)++main :: IO ()+main = do+  putStrLn $ show $ f id+  putStrLn $ show $ g const+  case iD of+    Id i -> putStrLn $ show (i (1::Int), i True)
+ tests/Rank2.ref view
@@ -0,0 +1,3 @@+(1,True)+(1,True)+(1,True)
+ tests/Readline.hs view
@@ -0,0 +1,16 @@+module Readline(main) where+import Prelude+import System.Console.SimpleReadline++main :: IO ()+main = do+  putStrLn "Type 'quit' to quit."+  loop++loop :: IO ()+loop = do+  s <- getInputLineHist "hist.txt" "% "+  case s of+    Just "quit" -> putStrLn "Bye"+    _ -> do putStrLn $ showMaybe showString s; loop+    
+ tests/Sieve.hs view
@@ -0,0 +1,17 @@+module Sieve(main) where+import Prelude++primes :: [Integer]+primes =+  sieve (from 2)+  where+    from n = n : from (n + 1)+    sieve (p : x) = p : sieve (filter x)+                    where+                      filter (n : x) =+                        if n `rem` p == 0 then filter x+                        else n : filter x++main :: IO ()+main =+  print $ take 100 primes
+ tests/Sieve.ref view
@@ -0,0 +1,1 @@+[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541]
+ tests/StringTest.hs view
@@ -0,0 +1,22 @@+module StringTest(module StringTest) where+import Prelude++main :: IO ()+main = do+  putStrLn $ if (==) "abc" "abc" then "yes" else "no"+  putStrLn $ if (==) "abc" "adc" then "yes" else "no"+  putStrLn $ show (1234::Int)+  putStrLn $ show (0::Int)+  putStrLn $ show (negate (567::Int))+  putStrLn $ show 'x'+  putStrLn $ show '\n'+  putStrLn $ show False+--  putStrLn $ showUnit ()+  putStrLn $ show [1,20,3::Int]+  putStrLn $ show [1::Int]+  putStrLn $ show ([] :: [Int])+  putStrLn $ show (123::Int, 'a')+  putStrLn $ show (Nothing :: Maybe Int)+  putStrLn $ show (Just 890 :: Maybe Int)+  putStrLn $ show (Left   678 :: Either Int Bool)+  putStrLn $ show (Right True :: Either Int Bool)
+ tests/StringTest.ref view
@@ -0,0 +1,16 @@+yes+no+1234+0+-567+'x'+'\n'+False+[1,20,3]+[1]+[]+(123,'a')+Nothing+Just 890+Left 678+Right True
+ tests/TypeEq.hs view
@@ -0,0 +1,25 @@+module TypeEq(main) where+import Prelude++foo :: forall a . (a ~ Bool) => a -> a+foo = not++data Exp a+  = (a ~ Int)  => Int Int+  | (a ~ Int)  => Add (Exp Int) (Exp Int)+  | (a ~ Bool) => Equ (Exp Int) (Exp Int)+  |               Iff (Exp Bool) (Exp a) (Exp a)++eval :: forall a . Exp a -> a+eval (Int i) = i+eval (Add e1 e2) = eval e1 + eval e2+eval (Equ e1 e2) = eval e1 == eval e2+eval (Iff c e1 e2) = if eval c then eval e1 else eval e2++e1 :: Exp Int+e1 = Iff (Add (Int 1) (Int 2) `Equ` Int 3) (Int 1) (Int 999)++main :: IO ()+main = do+  print (foo True)+  print (eval e1)
+ tests/TypeEq.ref view
@@ -0,0 +1,2 @@+False+1
+ tests/Word.hs view
@@ -0,0 +1,13 @@+module Word(main) where+import Prelude+import Data.Word++main :: IO ()+main = do+  putStrLn $ show (4294967295::Int)+  putStrLn $ show (1000::Word)+  putStrLn $ show twoTo32M1+  putStrLn $ show $ (*) twoTo32M1 twoTo32M1++twoTo32M1 :: Word+twoTo32M1 = 4294967295::Word
+ tests/Word.ref view
@@ -0,0 +1,4 @@+4294967295+1000+4294967295+18446744065119617025